@bratsos/workflow-engine 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +270 -513
- package/dist/chunk-HL3OJG7W.js +1033 -0
- package/dist/chunk-HL3OJG7W.js.map +1 -0
- package/dist/{chunk-7IITBLFY.js → chunk-NYKMT46J.js} +268 -25
- package/dist/chunk-NYKMT46J.js.map +1 -0
- package/dist/chunk-SPXBCZLB.js +17 -0
- package/dist/chunk-SPXBCZLB.js.map +1 -0
- package/dist/{client-5vz5Vv4A.d.ts → client-D4PoxADF.d.ts} +3 -143
- package/dist/client.d.ts +3 -2
- package/dist/{index-DmR3E8D7.d.ts → index-DAzCfO1R.d.ts} +20 -1
- package/dist/index.d.ts +234 -601
- package/dist/index.js +46 -2034
- package/dist/index.js.map +1 -1
- package/dist/{interface-Cv22wvLG.d.ts → interface-MMqhfQQK.d.ts} +69 -2
- package/dist/kernel/index.d.ts +26 -0
- package/dist/kernel/index.js +3 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/testing/index.d.ts +44 -0
- package/dist/kernel/testing/index.js +85 -0
- package/dist/kernel/testing/index.js.map +1 -0
- package/dist/persistence/index.d.ts +2 -2
- package/dist/persistence/index.js +2 -1
- package/dist/persistence/prisma/index.d.ts +2 -2
- package/dist/persistence/prisma/index.js +2 -1
- package/dist/plugins-BCnDUwIc.d.ts +415 -0
- package/dist/ports-tU3rzPXJ.d.ts +245 -0
- package/dist/stage-BPw7m9Wx.d.ts +144 -0
- package/dist/testing/index.d.ts +23 -1
- package/dist/testing/index.js +156 -13
- package/dist/testing/index.js.map +1 -1
- package/package.json +11 -1
- package/skills/workflow-engine/SKILL.md +234 -348
- package/skills/workflow-engine/references/03-runtime-setup.md +111 -426
- package/skills/workflow-engine/references/05-persistence-setup.md +32 -0
- package/skills/workflow-engine/references/07-testing-patterns.md +141 -474
- package/skills/workflow-engine/references/08-common-patterns.md +118 -431
- package/dist/chunk-7IITBLFY.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/workflow.ts","../src/core/types.ts","../src/core/workflow-event-bus.server.ts","../src/core/executor.ts","../src/core/stage-executor.ts","../src/core/storage-providers/memory-storage.ts","../src/core/storage-providers/prisma-storage.ts","../src/core/storage-factory.ts","../src/runtime/index.ts"],"names":["node","z","logger","EventEmitter","outputData","output"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Workflow Builder - Fluent API for composing type-safe workflows\n *\n * Workflows are composed of stages that are executed sequentially or in parallel.\n * The builder ensures type safety: output of one stage matches input of next stage.\n *\n * ## Type System Features\n *\n * ### Automatic Context Inference\n * The workflow context type is automatically accumulated as you pipe stages.\n * Use `InferWorkflowContext<typeof workflow>` to extract the context type.\n *\n * ```typescript\n * const workflow = new WorkflowBuilder(...)\n * .pipe(stage1)\n * .pipe(stage2)\n * .build();\n *\n * // Auto-generated type\n * type MyContext = InferWorkflowContext<typeof workflow>;\n * // = { \"stage-1\": Stage1Output, \"stage-2\": Stage2Output }\n * ```\n *\n * ### Stage ID Constants\n * Use `workflow.stageIds` for type-safe stage ID references.\n */\n\nimport { z } from \"zod\";\nimport type { Stage } from \"./stage\";\n\n// ============================================================================\n// Stage Node - Represents a stage in the execution plan\n// ============================================================================\n\nexport interface StageNode {\n stage: Stage<any, any, any>;\n executionGroup: number; // For parallel execution grouping\n}\n\n// ============================================================================\n// Workflow - Complete workflow definition\n// ============================================================================\n\nexport class Workflow<\n TInput extends z.ZodTypeAny,\n TOutput extends z.ZodTypeAny,\n TContext extends Record<string, unknown> = {},\n> {\n constructor(\n public readonly id: string,\n public readonly name: string,\n public readonly description: string,\n public readonly inputSchema: TInput,\n public readonly outputSchema: TOutput,\n private readonly stages: StageNode[],\n public readonly contextType?: TContext, // Type-only, for inference\n ) {}\n\n /**\n * Get execution plan as groups of stages\n * Stages in the same group can be executed in parallel\n */\n getExecutionPlan(): StageNode[][] {\n const groups = new Map<number, StageNode[]>();\n\n for (const node of this.stages) {\n const group = groups.get(node.executionGroup) || [];\n group.push(node);\n groups.set(node.executionGroup, group);\n }\n\n // Return groups in order\n const sortedGroups = Array.from(groups.keys()).sort((a, b) => a - b);\n return sortedGroups.map((groupNum) => {\n const group = groups.get(groupNum);\n if (!group) throw new Error(`Group ${groupNum} not found`);\n return group;\n });\n }\n\n /**\n * Get a specific stage by ID\n */\n getStage(stageId: string): Stage<any, any, any> | undefined {\n const node = this.stages.find((n) => n.stage.id === stageId);\n return node?.stage;\n }\n\n /**\n * Get all stages in order\n */\n getAllStages(): StageNode[] {\n return [...this.stages];\n }\n\n /**\n * Get a visual representation of the workflow execution order\n */\n getExecutionOrder(): string {\n const executionPlan = this.getExecutionPlan();\n const lines: string[] = [];\n\n lines.push(`Workflow: ${this.name} (${this.id})`);\n lines.push(`Total stages: ${this.stages.length}`);\n lines.push(`Execution groups: ${executionPlan.length}`);\n lines.push(\"\");\n lines.push(\"Execution Order:\");\n lines.push(\"================\");\n\n for (let i = 0; i < executionPlan.length; i++) {\n const group = executionPlan[i];\n const groupNumber = i + 1;\n\n if (group.length === 1) {\n // Sequential stage\n const stage = group[0].stage;\n lines.push(`${groupNumber}. ${stage.name} (${stage.id})`);\n if (stage.description) {\n lines.push(` ${stage.description}`);\n }\n } else {\n // Parallel stages\n lines.push(`${groupNumber}. [PARALLEL]`);\n for (const node of group) {\n const stage = node.stage;\n lines.push(` - ${stage.name} (${stage.id})`);\n if (stage.description) {\n lines.push(` ${stage.description}`);\n }\n }\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Get all stage IDs in execution order\n *\n * @returns Array of stage IDs\n *\n * @example\n * ```typescript\n * const ids = workflow.getStageIds();\n * // [\"data-extraction\", \"guidelines\", \"generator\"]\n * ```\n */\n getStageIds(): string[] {\n return this.stages.map((node) => node.stage.id);\n }\n\n /**\n * Check if a stage ID exists in this workflow\n *\n * @param stageId - The stage ID to check\n * @returns true if the stage exists\n */\n hasStage(stageId: string): boolean {\n return this.stages.some((node) => node.stage.id === stageId);\n }\n\n /**\n * Validate workflow configuration before execution\n * Checks that all stage configs match their schemas\n *\n * @param config - Configuration object with keys matching stage IDs\n * @returns Validation result with any errors\n */\n validateConfig(config: Record<string, unknown>): {\n valid: boolean;\n errors: Array<{ stageId: string; error: string }>;\n } {\n const errors: Array<{ stageId: string; error: string }> = [];\n\n for (const node of this.stages) {\n const stage = node.stage;\n const stageConfig = config[stage.id] || {};\n\n try {\n stage.configSchema.parse(stageConfig);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errorMessages = error.issues\n .map((e: z.ZodIssue) => `${e.path.join(\".\")}: ${e.message}`)\n .join(\"; \");\n errors.push({\n stageId: stage.id,\n error: `Config validation failed: ${errorMessages}`,\n });\n } else {\n errors.push({\n stageId: stage.id,\n error: String(error),\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Estimate total cost for the workflow\n */\n estimateCost(\n input: z.infer<TInput>,\n config: Record<string, unknown>,\n ): number {\n let totalCost = 0;\n const currentInput = input;\n\n for (const node of this.stages) {\n if (node.stage.estimateCost) {\n const stageConfig = config[node.stage.id] || {};\n totalCost += node.stage.estimateCost(currentInput, stageConfig);\n }\n // Note: We can't accurately propagate input for estimation without execution\n // This is a rough estimate only\n }\n\n return totalCost;\n }\n\n /**\n * Get configuration schemas for all stages in this workflow\n * Returns a map of stageId → { schema, defaults, name, description }\n */\n getStageConfigs(): Record<\n string,\n {\n schema: z.ZodTypeAny;\n defaults: Record<string, unknown>;\n name: string;\n description?: string;\n }\n > {\n const configs: Record<\n string,\n {\n schema: z.ZodTypeAny;\n defaults: Record<string, unknown>;\n name: string;\n description?: string;\n }\n > = {};\n\n for (const node of this.stages) {\n const stage = node.stage;\n\n // Extract defaults from schema\n const defaults: Record<string, unknown> = {};\n\n if (stage.configSchema instanceof z.ZodObject) {\n const shape = stage.configSchema.shape as Record<string, z.ZodTypeAny>;\n for (const [key, fieldSchema] of Object.entries(shape)) {\n let unwrapped = fieldSchema;\n\n // Unwrap ZodOptional if present\n if (unwrapped instanceof z.ZodOptional) {\n unwrapped = (unwrapped._def as any).innerType;\n }\n\n // Check for ZodDefault\n if (unwrapped instanceof z.ZodDefault) {\n const defaultValueFn = (unwrapped._def as any).defaultValue;\n defaults[key] =\n typeof defaultValueFn === \"function\"\n ? defaultValueFn()\n : defaultValueFn;\n }\n }\n }\n\n configs[stage.id] = {\n schema: stage.configSchema,\n defaults,\n name: stage.name,\n description: stage.description,\n };\n }\n\n return configs;\n }\n\n /**\n * Generate default configuration object for all stages\n * Automatically discovers all stage configs - add/remove stages and this updates automatically\n */\n getDefaultConfig(): Record<string, Record<string, unknown>> {\n const stageConfigs = this.getStageConfigs();\n const config: Record<string, Record<string, unknown>> = {};\n\n for (const [stageId, meta] of Object.entries(stageConfigs)) {\n config[stageId] = meta.defaults;\n }\n\n return config;\n }\n /**\n * Get all stages in a specific execution group\n */\n getStagesInExecutionGroup(groupIndex: number): Stage<any, any, any>[] {\n return this.stages\n .filter((node) => node.executionGroup === groupIndex)\n .map((node) => node.stage);\n }\n\n /**\n * Get the sequential index of a stage (0-based)\n */\n getStageIndex(stageId: string): number {\n return this.stages.findIndex((node) => node.stage.id === stageId);\n }\n\n /**\n * Get the execution group index for a stage\n */\n getExecutionGroupIndex(stageId: string): number {\n const node = this.stages.find((node) => node.stage.id === stageId);\n if (!node) throw new Error(`Stage ${stageId} not found in workflow`);\n return node.executionGroup;\n }\n\n /**\n * Get the ID of the stage immediately preceding the given stage\n */\n getPreviousStageId(stageId: string): string | undefined {\n const index = this.getStageIndex(stageId);\n if (index <= 0) return undefined;\n return this.stages[index - 1].stage.id;\n }\n}\n\n// ============================================================================\n// Workflow Builder - Fluent API with Context Accumulation\n// ============================================================================\n\nexport class WorkflowBuilder<\n TInput extends z.ZodTypeAny,\n TCurrentOutput extends z.ZodTypeAny,\n TContext extends Record<string, unknown> = {},\n> {\n private stages: StageNode[] = [];\n private currentExecutionGroup = 0;\n\n constructor(\n private id: string,\n private name: string,\n private description: string,\n private inputSchema: TInput,\n private currentOutputSchema: TCurrentOutput,\n ) {}\n\n /**\n * Add a stage to the workflow (sequential execution)\n *\n * Automatically accumulates the stage's output in the context under its stage ID.\n * This provides type-safe access to all previous stage outputs.\n *\n * Note: This accepts any stage regardless of strict input type matching.\n * This is necessary because stages using passthrough() can accept objects\n * with additional fields beyond what's declared in their input schema.\n * Runtime validation via Zod ensures type safety at execution time.\n *\n * Validates that all declared dependencies exist in the workflow.\n */\n pipe<\n TStageInput extends z.ZodTypeAny,\n TStageOutput extends z.ZodTypeAny,\n TStageConfig extends z.ZodTypeAny,\n TStageContext extends Record<string, unknown>,\n >(\n stage: Stage<TStageInput, TStageOutput, TStageConfig, TStageContext>,\n ): WorkflowBuilder<\n TInput,\n TStageOutput,\n TContext & { [x: string]: z.infer<TStageOutput> }\n > {\n // Validate stage dependencies\n if (stage.dependencies) {\n const existingStageIds = this.stages.map((s) => s.stage.id);\n const missingDeps = stage.dependencies.filter(\n (dep) => !existingStageIds.includes(dep),\n );\n\n if (missingDeps.length > 0) {\n throw new Error(\n `Stage \"${stage.id}\" has missing dependencies: ${missingDeps.join(\", \")}. ` +\n `These stages must be added to the workflow before \"${stage.id}\". ` +\n `Current stages: ${\n existingStageIds.length === 0\n ? \"(none)\"\n : existingStageIds.join(\", \")\n }`,\n );\n }\n }\n\n this.currentExecutionGroup++;\n\n this.stages.push({\n stage: stage as Stage<any, any, any, any>,\n executionGroup: this.currentExecutionGroup,\n });\n\n // Return builder with new output type and accumulated context\n const builder = this as unknown as WorkflowBuilder<\n TInput,\n TStageOutput,\n TContext & { [x: string]: z.infer<TStageOutput> }\n >;\n (builder as any).currentOutputSchema = stage.outputSchema;\n\n return builder;\n }\n\n /**\n * Add a stage with strict input type checking\n *\n * Note: pipeStrict() and pipeLoose() have been removed as they were\n * just aliases for pipe(). Use pipe() for all stage chaining.\n */\n\n /**\n * Add multiple stages that execute in parallel\n *\n * All stages receive the same input (current output)\n * Their outputs are merged into an object by index AND accumulated in context by stage ID.\n *\n * Note: This accepts stages regardless of strict input type matching.\n * This is necessary because stages using passthrough() can accept objects\n * with additional fields. Runtime validation via Zod ensures type safety.\n *\n * Validates that all declared dependencies exist in the workflow.\n */\n parallel<\n TStages extends {\n id: string;\n outputSchema: z.ZodTypeAny;\n dependencies?: string[];\n }[],\n >(\n stages: [...TStages],\n ): WorkflowBuilder<\n TInput,\n z.ZodTypeAny,\n TContext & {\n [K in TStages[number][\"id\"]]: TStages[number] extends {\n outputSchema: infer O;\n }\n ? O extends z.ZodTypeAny\n ? z.infer<O>\n : never\n : never;\n }\n > {\n // Validate dependencies for all parallel stages\n const existingStageIds = this.stages.map((s) => s.stage.id);\n\n for (const stage of stages) {\n if (stage.dependencies) {\n const missingDeps = stage.dependencies.filter(\n (dep) => !existingStageIds.includes(dep),\n );\n\n if (missingDeps.length > 0) {\n throw new Error(\n `Stage \"${stage.id}\" (in parallel group) has missing dependencies: ${missingDeps.join(\n \", \",\n )}. ` +\n `These stages must be added to the workflow before this parallel group. ` +\n `Current stages: ${\n existingStageIds.length === 0\n ? \"(none)\"\n : existingStageIds.join(\", \")\n }`,\n );\n }\n }\n }\n\n this.currentExecutionGroup++;\n\n // Add all stages to same execution group\n for (const stage of stages) {\n this.stages.push({\n stage: stage as Stage<any, any, any, any>,\n executionGroup: this.currentExecutionGroup,\n });\n }\n\n // Create merged output schema\n const mergedSchema = z.object(\n stages.reduce(\n (acc, stage, index) => {\n acc[index] = stage.outputSchema;\n return acc;\n },\n {} as Record<number, z.ZodTypeAny>,\n ),\n ) as any;\n\n const builder = this as unknown as WorkflowBuilder<\n TInput,\n any,\n TContext & {\n [K in TStages[number][\"id\"]]: TStages[number] extends Stage<\n any,\n infer O,\n any\n >\n ? z.infer<O>\n : never;\n }\n >;\n builder.currentOutputSchema = mergedSchema;\n\n return builder as any;\n }\n\n /**\n * Build the final workflow\n */\n build(): Workflow<TInput, TCurrentOutput, TContext> {\n return new Workflow(\n this.id,\n this.name,\n this.description,\n this.inputSchema,\n this.currentOutputSchema,\n this.stages,\n );\n }\n\n /**\n * Get current stage count\n */\n getStageCount(): number {\n return this.stages.length;\n }\n\n /**\n * Get execution group count\n */\n getExecutionGroupCount(): number {\n return this.currentExecutionGroup;\n }\n}\n\n// ============================================================================\n// Type Inference Utilities (Supplementary to Code Generator)\n// ============================================================================\n\n/**\n * NOTE: For most use cases, prefer using the generated types from `__generated__.ts`\n * which are created by running `pnpm generate:workflow-types`.\n *\n * These inference utilities are useful for:\n * - Quick prototyping before running the generator\n * - Dynamic workflows not covered by the generator\n * - Type assertions in tests\n */\n\n/**\n * Extract the workflow context type from a Workflow instance\n *\n * The workflow context type is automatically accumulated as stages are piped.\n * Each stage's output is added to the context under its stage ID.\n *\n * @example\n * ```typescript\n * const workflow = new WorkflowBuilder(...)\n * .pipe(dataExtractionStage) // id: \"data-extraction\"\n * .pipe(guidelinesStage) // id: \"guidelines\"\n * .build();\n *\n * // Extract context type automatically\n * type MyWorkflowContext = InferWorkflowContext<typeof workflow>;\n * // = {\n * // \"data-extraction\": DataExtractionOutput;\n * // \"guidelines\": GuidelinesOutput;\n * // }\n *\n * // Use in stage definitions\n * export const myStage = defineStage<\n * \"none\",\n * typeof OutputSchema,\n * typeof ConfigSchema,\n * MyWorkflowContext\n * >({ ... });\n * ```\n */\nexport type InferWorkflowContext<W> = W extends Workflow<any, any, infer C>\n ? C\n : never;\n\n/**\n * Extract the input type from a Workflow instance\n *\n * @example\n * ```typescript\n * type Input = InferWorkflowInput<typeof myWorkflow>;\n * ```\n */\nexport type InferWorkflowInput<W> = W extends Workflow<infer I, any, any>\n ? z.infer<I>\n : never;\n\n/**\n * Extract the output type from a Workflow instance\n *\n * @example\n * ```typescript\n * type Output = InferWorkflowOutput<typeof myWorkflow>;\n * ```\n */\nexport type InferWorkflowOutput<W> = W extends Workflow<any, infer O, any>\n ? z.infer<O>\n : never;\n\n/**\n * Extract stage IDs as a union type from a Workflow instance\n *\n * Useful for creating type-safe stage ID references.\n *\n * @example\n * ```typescript\n * type StageId = InferWorkflowStageIds<typeof myWorkflow>;\n * // = \"data-extraction\" | \"guidelines\" | \"generator\"\n *\n * function getStageOutput(stageId: StageId) { ... }\n * ```\n */\nexport type InferWorkflowStageIds<W> = W extends Workflow<any, any, infer C>\n ? keyof C & string\n : never;\n\n/**\n * Get the output type for a specific stage ID from a Workflow\n *\n * @example\n * ```typescript\n * type DataOutput = InferStageOutputById<typeof workflow, \"data-extraction\">;\n * ```\n */\nexport type InferStageOutputById<W, K extends string> = W extends Workflow<\n any,\n any,\n infer C\n>\n ? K extends keyof C\n ? C[K]\n : never\n : never;\n","/**\n * Core type definitions for Workflow System v2\n *\n * See WORKFLOW_SYSTEM_PROPOSAL.md for full architectural details\n */\n\nimport { z } from \"zod\";\n\n// ============================================================================\n// Progress & Metrics\n// ============================================================================\n\nexport interface ProgressUpdate {\n stageId: string;\n stageName: string;\n progress: number; // 0-100\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface StageMetrics {\n startTime: number;\n endTime: number;\n duration: number;\n itemsProcessed?: number;\n itemsProduced?: number;\n aiCalls?: number;\n totalTokens?: number;\n totalCost?: number;\n}\n\n// ============================================================================\n// Embedding Support\n// ============================================================================\n\nexport interface EmbeddingResult {\n id: string;\n content: string;\n embedding: number[];\n similarity?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface EmbeddingInfo {\n model: string;\n dimensions: number;\n results: EmbeddingResult[];\n totalProcessed?: number;\n averageSimilarity?: number;\n}\n\n// ============================================================================\n// Stage Results\n// ============================================================================\n\nexport interface StageResult<TOutput> {\n output: TOutput;\n metrics: StageMetrics;\n artifacts?: Record<string, unknown>;\n embeddings?: EmbeddingInfo;\n}\n\n// ============================================================================\n// Suspended State (for async-batch operations)\n// ============================================================================\n\nexport const SuspendedStateSchema = z.object({\n batchId: z.string(),\n statusUrl: z.string().optional(),\n apiKey: z.string().optional(),\n submittedAt: z.string(), // ISO date string\n pollInterval: z.number(), // milliseconds\n maxWaitTime: z.number(), // milliseconds\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport interface SuspendedResult {\n suspended: true;\n state: z.infer<typeof SuspendedStateSchema>;\n pollConfig: {\n pollInterval: number;\n maxWaitTime: number;\n nextPollAt: Date;\n };\n metrics: StageMetrics;\n}\n\n// ============================================================================\n// Completion Check Result (for orchestrator polling)\n// ============================================================================\n\nexport interface CompletionCheckResult<TOutput> {\n ready: boolean;\n output?: TOutput;\n error?: string;\n nextCheckIn?: number; // Optional: override next poll interval\n metrics?: StageMetrics;\n embeddings?: EmbeddingInfo;\n}\n\n// ============================================================================\n// Log Levels\n// ============================================================================\n\nexport type LogLevel = \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\";\n\n// ============================================================================\n// Stage Mode\n// ============================================================================\n\nexport type StageMode =\n | \"sync\" // Execute and return immediately\n | \"async-batch\"; // Start batch job, return suspended state (separate poller handles completion)\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isSuspendedResult<T>(\n result: StageResult<T> | SuspendedResult,\n): result is SuspendedResult {\n return \"suspended\" in result && result.suspended === true;\n}\n\nexport function isStageResult<T>(\n result: StageResult<T> | SuspendedResult,\n): result is StageResult<T> {\n return !isSuspendedResult(result);\n}\n","/**\n * Workflow Event Bus - Global event emitter for workflow events\n *\n * This singleton allows SSE endpoints to subscribe to real-time workflow events\n * emitted by WorkflowExecutor instances running in the same process.\n *\n * Supports cross-process events via PostgreSQL LISTEN/NOTIFY when enabled.\n *\n * Events are namespaced by workflowRunId:\n * - workflow:{runId}:stage:started\n * - workflow:{runId}:stage:completed\n * - workflow:{runId}:log\n * - etc.\n */\n\nimport { EventEmitter } from \"node:events\";\nimport { createLogger } from \"../utils/logger\";\nimport type { WorkflowEventType, WorkflowSSEEvent } from \"./workflow-events\";\n\nconst logger = createLogger(\"WorkflowEventBus\");\n\n// ============================================================================\n// Types for PgNotify integration (to avoid circular dependency)\n// ============================================================================\n\n/**\n * Interface matching PgNotify from @zertai/database\n * Defined here to avoid importing the database package into workflow-engine\n */\nexport interface PgNotifyLike {\n listen(\n channel: string,\n handler: (channel: string, payload: string) => void,\n ): Promise<() => void>;\n notify(channel: string, payload: string): Promise<void>;\n isConnected(): boolean;\n}\n\n// ============================================================================\n// Global Event Bus\n// ============================================================================\n\nclass WorkflowEventBus extends EventEmitter {\n private static instance: WorkflowEventBus;\n private pgNotify: PgNotifyLike | null = null;\n private static readonly PG_CHANNEL = \"workflow_events\";\n private pgListenerUnsubscribe: (() => void) | null = null;\n // PostgreSQL NOTIFY has an 8000 byte limit for payloads\n // We use 7500 to leave room for encoding overhead\n private static readonly MAX_PAYLOAD_SIZE = 7500;\n\n private constructor() {\n super();\n // Allow many listeners (one per SSE connection)\n this.setMaxListeners(1000);\n }\n\n static getInstance(): WorkflowEventBus {\n if (!WorkflowEventBus.instance) {\n WorkflowEventBus.instance = new WorkflowEventBus();\n }\n return WorkflowEventBus.instance;\n }\n\n /**\n * Enable cross-process event publishing via PostgreSQL NOTIFY\n *\n * Call this during process initialization to enable events to propagate\n * across multiple workers and the React Router app.\n *\n * @param pgNotify - A connected PgNotify instance from @zertai/database\n */\n async enablePgNotify(pgNotify: PgNotifyLike): Promise<void> {\n if (this.pgNotify) {\n logger.warn(\"PgNotify already enabled, skipping\");\n return;\n }\n\n this.pgNotify = pgNotify;\n\n // Subscribe to receive events FROM other processes\n this.pgListenerUnsubscribe = await pgNotify.listen(\n WorkflowEventBus.PG_CHANNEL,\n (_channel: string, payload: string) => {\n try {\n const event = JSON.parse(payload) as WorkflowSSEEvent;\n\n // Re-emit to local subscribers WITHOUT triggering another pg notify\n // (to avoid infinite loops)\n this.emitLocally(event);\n } catch (err) {\n logger.error(\"Failed to parse pg notification:\", err);\n }\n },\n );\n\n logger.info(\"Cross-process events enabled via PostgreSQL NOTIFY\");\n }\n\n /**\n * Disable cross-process events (for cleanup)\n */\n disablePgNotify(): void {\n if (this.pgListenerUnsubscribe) {\n this.pgListenerUnsubscribe();\n this.pgListenerUnsubscribe = null;\n }\n this.pgNotify = null;\n }\n\n /**\n * Check if cross-process events are enabled\n */\n isPgNotifyEnabled(): boolean {\n return this.pgNotify !== null && this.pgNotify.isConnected();\n }\n\n /**\n * Truncate event payload to fit within PostgreSQL NOTIFY size limits.\n * Large data fields (like workflow output) are replaced with a truncation marker.\n */\n private truncatePayloadForNotify(event: WorkflowSSEEvent): WorkflowSSEEvent {\n const serialized = JSON.stringify(event);\n\n // If it fits, return as-is\n if (serialized.length <= WorkflowEventBus.MAX_PAYLOAD_SIZE) {\n return event;\n }\n\n // Create a truncated version\n const truncatedData: Record<string, unknown> = {};\n const keysToPreserve = [\n \"workflowRunId\",\n \"stageId\",\n \"stageName\",\n \"stageNumber\",\n \"error\",\n \"level\",\n \"message\",\n \"duration\",\n \"cost\",\n ];\n\n for (const key of keysToPreserve) {\n if (key in event.data) {\n truncatedData[key] = event.data[key];\n }\n }\n\n // Mark that payload was truncated\n truncatedData._truncated = true;\n truncatedData._originalSize = serialized.length;\n\n return {\n ...event,\n data: truncatedData,\n };\n }\n\n /**\n * Emit event locally only (used for re-emitting pg notifications)\n */\n private emitLocally(event: WorkflowSSEEvent): void {\n const eventName = `workflow:${event.workflowRunId}:${event.type}`;\n\n // Emit namespaced event (for specific SSE clients)\n this.emit(eventName, event);\n\n // Emit wildcard event for this workflow\n this.emit(`workflow:${event.workflowRunId}:*`, event);\n\n // Emit global event (for system-wide listeners)\n this.emit(event.type, event);\n }\n\n /**\n * Emit a workflow event with proper namespacing\n *\n * When PgNotify is enabled, also publishes to PostgreSQL for cross-process\n * consumption by other workers and the React Router app.\n */\n emitWorkflowEvent(\n workflowRunId: string,\n eventType: WorkflowEventType,\n payload: Record<string, unknown>,\n ): void {\n const sseEvent: WorkflowSSEEvent = {\n type: eventType,\n workflowRunId,\n timestamp: new Date(),\n data: payload,\n };\n\n // Emit locally\n this.emitLocally(sseEvent);\n\n // Also publish to Postgres for cross-process consumption\n if (this.pgNotify) {\n // Truncate large payloads to fit PostgreSQL NOTIFY limits\n const notifyEvent = this.truncatePayloadForNotify(sseEvent);\n this.pgNotify\n .notify(WorkflowEventBus.PG_CHANNEL, JSON.stringify(notifyEvent))\n .catch((err) => {\n logger.error(\"Pg notify failed:\", err);\n });\n }\n }\n\n /**\n * Subscribe to all events for a specific workflow run\n */\n subscribeToWorkflow(\n workflowRunId: string,\n handler: (event: WorkflowSSEEvent) => void,\n ): () => void {\n const eventName = `workflow:${workflowRunId}:*`;\n this.on(eventName, handler);\n\n // Return unsubscribe function\n return () => {\n this.off(eventName, handler);\n };\n }\n\n /**\n * Subscribe to a specific event type globally (across all workflows)\n */\n subscribeGlobal(\n eventType: WorkflowEventType,\n handler: (event: WorkflowSSEEvent) => void,\n ): () => void {\n this.on(eventType, handler);\n\n return () => {\n this.off(eventType, handler);\n };\n }\n\n /**\n * Subscribe to a specific event type for a workflow\n */\n subscribeToEvent(\n workflowRunId: string,\n eventType: WorkflowEventType,\n handler: (event: WorkflowSSEEvent) => void,\n ): () => void {\n const eventName = `workflow:${workflowRunId}:${eventType}`;\n this.on(eventName, handler);\n\n return () => {\n this.off(eventName, handler);\n };\n }\n}\n\n// Export singleton instance\nexport const workflowEventBus = WorkflowEventBus.getInstance();\n","/**\n * Workflow Executor - Executes workflows with support for resume and suspension\n *\n * Key features:\n * - Sequential and parallel stage execution\n * - Automatic state persistence to R2 and database\n * - Resume from last completed stage\n * - Suspend/resume for long-running batch jobs\n * - Event emission for real-time updates\n *\n * Note: Stages should import createAIHelper directly from ~/lib/ai-helper\n * and create their own AI helper instances with appropriate topics.\n * The executor creates a helper for tracking aggregate stats per stage.\n */\n\nimport { EventEmitter } from \"node:events\";\nimport type {\n AICallLogger,\n LogLevel as PersistenceLogLevel,\n WorkflowPersistence,\n} from \"../persistence\";\nimport { createLogger } from \"../utils/logger\";\nimport type { StageContext, StageStorage } from \"./stage\";\nimport type {\n LogLevel,\n ProgressUpdate,\n StageResult,\n SuspendedResult,\n} from \"./types\";\nimport { isSuspendedResult } from \"./types\";\nimport type { StageNode, Workflow } from \"./workflow\";\nimport { workflowEventBus } from \"./workflow-event-bus.server\";\nimport { type WorkflowEventType } from \"./workflow-events\";\n\nconst logger = createLogger(\"Executor\");\n\n// ============================================================================\n// Executor Events\n// ============================================================================\n\nexport interface ExecutorEvents {\n \"workflow:started\": { workflowRunId: string; workflowName: string };\n \"workflow:completed\": { workflowRunId: string; output: unknown };\n \"workflow:suspended\": { workflowRunId: string; stageId: string };\n \"workflow:cancelled\": { workflowRunId: string; reason: string };\n \"workflow:failed\": { workflowRunId: string; error: string };\n\n \"stage:started\": { stageId: string; stageName: string; stageNumber: number };\n \"stage:progress\": ProgressUpdate;\n \"stage:completed\": { stageId: string; stageName: string; duration: number };\n \"stage:suspended\": { stageId: string; stageName: string; resumeAt: Date };\n \"stage:failed\": { stageId: string; stageName: string; error: string };\n\n log: { level: LogLevel; message: string; meta?: Record<string, unknown> };\n}\n\n// ============================================================================\n// Executor Options\n// ============================================================================\n\nexport interface WorkflowExecutorOptions {\n persistence?: WorkflowPersistence;\n /** Optional AI call logger. If not provided, AI tracking is disabled. */\n aiLogger?: AICallLogger;\n}\n\n// ============================================================================\n// No-Op AI Logger (for workflows without AI tracking)\n// ============================================================================\n\n/**\n * A no-op implementation of AICallLogger for workflows that don't need AI tracking.\n * All methods do nothing but satisfy the interface.\n */\nclass NoOpAICallLogger implements AICallLogger {\n logCall(): void {\n // No-op\n }\n\n async logBatchResults(): Promise<void> {\n // No-op\n }\n\n async getStats(): Promise<{\n totalCalls: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCost: number;\n perModel: Record<string, never>;\n }> {\n return {\n totalCalls: 0,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalCost: 0,\n perModel: {},\n };\n }\n\n async isRecorded(): Promise<boolean> {\n return false;\n }\n}\n\n// ============================================================================\n// Workflow Executor\n// ============================================================================\n\nexport class WorkflowExecutor extends EventEmitter {\n private cancelled = false;\n private persistence: WorkflowPersistence;\n private aiLogger: AICallLogger;\n\n constructor(\n private workflow: Workflow<any, any>,\n private workflowRunId: string,\n private workflowType: string,\n storageProviderOrOptions?: WorkflowExecutorOptions,\n ) {\n super();\n\n // Handle backward-compatible constructor signature\n let persistence: WorkflowPersistence | undefined;\n let aiLogger: AICallLogger | undefined;\n\n if (\n typeof storageProviderOrOptions === \"object\" &&\n storageProviderOrOptions !== null\n ) {\n persistence = storageProviderOrOptions.persistence;\n aiLogger = storageProviderOrOptions.aiLogger;\n }\n\n if (!persistence) {\n throw new Error(\n \"WorkflowExecutor requires persistence to be provided via options. \" +\n \"Create an instance using PrismaWorkflowPersistence or InMemoryWorkflowPersistence.\",\n );\n }\n\n this.persistence = persistence;\n // Use no-op logger if AI tracking is not needed\n this.aiLogger = aiLogger ?? new NoOpAICallLogger();\n }\n\n /**\n * Override emit to also forward events to the global event bus for SSE\n */\n emit(eventName: string | symbol, ...args: any[]): boolean {\n const eventType = String(eventName) as WorkflowEventType;\n if (args[0] && typeof args[0] === \"object\") {\n workflowEventBus.emitWorkflowEvent(\n this.workflowRunId,\n eventType,\n args[0],\n );\n }\n return super.emit(eventName, ...args);\n }\n\n /**\n * Check if the workflow has been interrupted (cancelled or suspended) externally\n * This checks the database status to detect external requests\n */\n private async checkExternalInterruption(): Promise<{\n type: \"cancelled\" | \"suspended\";\n reason?: string;\n } | null> {\n if (this.cancelled) {\n return { type: \"cancelled\", reason: \"Cancelled by local request\" };\n }\n\n try {\n const status = await this.persistence.getRunStatus(this.workflowRunId);\n\n if (status === \"CANCELLED\") {\n this.cancelled = true;\n return { type: \"cancelled\", reason: \"Cancelled by external request\" };\n }\n\n if (status === \"SUSPENDED\") {\n return { type: \"suspended\", reason: \"Suspended by external request\" };\n }\n\n return null;\n } catch (error) {\n logger.error(\"Error checking interruption status:\", error);\n return null;\n }\n }\n\n /**\n * Execute the workflow\n *\n * @param input - Workflow input data\n * @param config - Configuration for each stage (keyed by stage ID)\n * @param options - Execution options (resume, etc.)\n * @returns Final output or 'suspended' if workflow is suspended\n */\n async execute<TInput, TOutput>(\n input: TInput,\n config: Record<string, unknown>,\n options: { resume?: boolean; fromStage?: string } = {},\n ): Promise<TOutput | \"suspended\"> {\n try {\n // Validate config before execution\n const configValidation = this.workflow.validateConfig(config);\n if (!configValidation.valid) {\n const errorMessages = configValidation.errors\n .map((e) => ` - ${e.stageId}: ${e.error}`)\n .join(\"\\n\");\n throw new Error(`Workflow config validation failed:\\n${errorMessages}`);\n }\n\n // Update workflow run status\n await this.persistence.updateRun(this.workflowRunId, {\n status: \"RUNNING\",\n startedAt: new Date(),\n });\n\n this.emit(\"workflow:started\", {\n workflowRunId: this.workflowRunId,\n workflowName: this.workflow.name,\n });\n\n this.log(\"INFO\", `Starting workflow: ${this.workflow.name}`);\n\n // Determine starting point\n let startGroupNumber = 1; // Execution groups start at 1\n let currentOutput: any = input;\n\n // Initialize workflow context for accumulating stage outputs\n let workflowContext: Record<string, unknown> = {};\n\n if (options.resume) {\n const resumeData = await this.loadResumeState();\n if (resumeData) {\n startGroupNumber = resumeData.lastCompletedGroup + 1;\n currentOutput = resumeData.lastOutput;\n\n // Rebuild workflow context from completed stages\n workflowContext = await this.loadWorkflowContext();\n\n this.log(\"INFO\", `Resuming from execution group ${startGroupNumber}`);\n this.log(\n \"INFO\",\n `Loaded ${Object.keys(workflowContext).length} previous stage outputs into context`,\n );\n }\n }\n\n // Handle fromStage option - rerun from a specific stage\n if (options.fromStage) {\n const fromStageData = await this.loadFromStageState(options.fromStage);\n startGroupNumber = fromStageData.executionGroup;\n currentOutput = fromStageData.input;\n workflowContext = fromStageData.workflowContext;\n\n this.log(\n \"INFO\",\n `Rerunning from stage \"${options.fromStage}\" (group ${startGroupNumber})`,\n );\n this.log(\n \"INFO\",\n `Loaded ${Object.keys(workflowContext).length} previous stage outputs into context`,\n );\n }\n\n // Execute stage groups\n const executionPlan = this.workflow.getExecutionPlan();\n\n for (let groupIdx = 0; groupIdx < executionPlan.length; groupIdx++) {\n const group = executionPlan[groupIdx];\n\n // Check for external interruption (cancel/pause) before each group\n const interruption = await this.checkExternalInterruption();\n\n if (interruption) {\n if (interruption.type === \"cancelled\") {\n this.log(\"WARN\", \"Workflow cancelled by external request\");\n this.emit(\"workflow:cancelled\", {\n workflowRunId: this.workflowRunId,\n reason: interruption.reason || \"Cancelled by user\",\n });\n\n // Ensure status is cancelled in DB (might be already, but to be safe/consistent)\n await this.persistence.updateRun(this.workflowRunId, {\n status: \"CANCELLED\",\n completedAt: new Date(),\n });\n\n return \"cancelled\" as any;\n } else if (interruption.type === \"suspended\") {\n this.log(\"WARN\", \"Workflow suspended by external request\");\n\n // No specific event for \"workflow level suspension by user\" currently,\n // but we can reuse stage:suspended logic or just log.\n // Using stage:suspended with a fake \"User Pause\" stage ID for UI feedback might be hacky.\n // Ideally, we just return \"suspended\" and the UI sees the WorkflowRun status.\n\n // Ensure status is verified as suspended (it triggered this block, so it should be)\n return \"suspended\";\n }\n }\n\n // Skip groups that are already completed (when resuming)\n const groupNumber = group[0].executionGroup;\n if (groupNumber < startGroupNumber) {\n this.log(\"INFO\", `Skipping already completed group ${groupNumber}`);\n continue;\n }\n\n if (group.length === 1) {\n // Sequential execution\n const node = group[0];\n const result = await this.executeStage(\n node,\n currentOutput,\n config[node.stage.id] || {},\n node.executionGroup,\n workflowContext,\n );\n\n if (result === \"suspended\") {\n return \"suspended\";\n }\n\n currentOutput = result.output;\n // Accumulate stage output in workflow context\n workflowContext[node.stage.id] = result.output;\n } else {\n // Parallel execution\n const results = await Promise.all(\n group.map((node) =>\n this.executeStage(\n node,\n currentOutput,\n config[node.stage.id] || {},\n node.executionGroup,\n workflowContext,\n ),\n ),\n );\n\n // Check if any stage is suspended\n const suspendedIdx = results.findIndex((r) => r === \"suspended\");\n if (suspendedIdx !== -1) {\n return \"suspended\";\n }\n\n // Merge parallel outputs into object (by index)\n currentOutput = results.reduce(\n (acc, result, idx) => {\n if (result !== \"suspended\") {\n acc[idx] = result.output;\n // Also accumulate in workflowContext by stage ID\n const stageId = group[idx].stage.id;\n workflowContext[stageId] = result.output;\n }\n return acc;\n },\n {} as Record<number, unknown>,\n );\n }\n }\n\n // Workflow completed\n const endTime = new Date();\n const run = await this.persistence.getRun(this.workflowRunId);\n const startTime = run?.startedAt;\n\n const duration = startTime\n ? endTime.getTime() - startTime.getTime()\n : undefined;\n\n // Calculate total cost and tokens\n const aggregatedStats = await this.getAggregatedStats();\n\n await this.persistence.updateRun(this.workflowRunId, {\n status: \"COMPLETED\",\n completedAt: endTime,\n duration,\n output: currentOutput as any,\n totalCost: aggregatedStats.totalCost,\n totalTokens: aggregatedStats.totalTokens,\n });\n\n this.emit(\"workflow:completed\", {\n workflowRunId: this.workflowRunId,\n output: currentOutput,\n });\n\n this.log(\"INFO\", `Workflow completed in ${duration}ms`);\n\n return currentOutput;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n await this.persistence.updateRun(this.workflowRunId, {\n status: \"FAILED\",\n completedAt: new Date(),\n });\n\n this.emit(\"workflow:failed\", {\n workflowRunId: this.workflowRunId,\n error: errorMessage,\n });\n\n this.log(\"ERROR\", `Workflow failed: ${errorMessage}`);\n\n throw error;\n }\n }\n\n /**\n * Execute a single stage\n */\n private async executeStage(\n node: StageNode,\n input: any,\n config: any,\n executionGroup: number,\n workflowContext: Record<string, unknown>,\n ): Promise<StageResult<any> | \"suspended\"> {\n const { stage } = node;\n const startTime = Date.now();\n\n try {\n // Create or get stage record\n const stageRecord = await this.persistence.upsertStage({\n workflowRunId: this.workflowRunId,\n stageId: stage.id,\n create: {\n workflowRunId: this.workflowRunId,\n stageId: stage.id,\n stageName: stage.name,\n stageNumber: executionGroup,\n executionGroup,\n status: \"RUNNING\",\n startedAt: new Date(),\n config: config as any,\n inputData: input as any,\n },\n update: {\n status: \"RUNNING\",\n startedAt: new Date(),\n },\n });\n\n this.emit(\"stage:started\", {\n stageId: stage.id,\n stageName: stage.name,\n stageNumber: executionGroup,\n });\n\n // Check if this stage was previously suspended and has state to resume from\n const isResuming = stageRecord.suspendedState !== null;\n if (isResuming) {\n this.log(\"INFO\", `Resuming suspended stage: ${stage.name}`);\n } else {\n this.log(\"INFO\", `Executing stage: ${stage.name}`);\n }\n\n // Validate input\n const inputStr = JSON.stringify(input);\n logger.debug(`Stage ${stage.name} input`, {\n stageId: stage.id,\n executionGroup,\n isResuming,\n input:\n inputStr.substring(0, 1000) + (inputStr.length > 1000 ? \"...\" : \"\"),\n });\n const validatedInput = stage.inputSchema.parse(input);\n\n // Create stage context\n const logFn = (\n level: LogLevel,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n this.log(level, message, meta);\n // Also save to database (fire and forget)\n this.persistence\n .createLog({\n workflowStageId: stageRecord.id,\n workflowRunId: this.workflowRunId,\n level: level as PersistenceLogLevel,\n message,\n metadata: meta,\n })\n .catch((err) => logger.error(\"Failed to persist log:\", err));\n };\n\n const context: StageContext<any, any> = {\n workflowRunId: this.workflowRunId,\n stageId: stage.id,\n stageNumber: executionGroup,\n stageName: stage.name,\n input: validatedInput,\n config,\n onProgress: (update: ProgressUpdate) => {\n this.emit(\"stage:progress\", update);\n },\n onLog: logFn,\n log: logFn,\n storage: this.createStorageShim(),\n workflowContext: workflowContext,\n // If resuming from suspension, pass the suspended state\n resumeState: isResuming\n ? (stageRecord.suspendedState as any)\n : undefined,\n };\n\n // Execute stage\n const result = await stage.execute(context);\n\n // Check if suspended\n if (isSuspendedResult(result)) {\n const { state, pollConfig, metrics } = result;\n\n // Trace log suspension details\n const stateStr = JSON.stringify(state);\n logger.debug(`Stage ${stage.name} suspended`, {\n stageId: stage.id,\n nextPollAt: pollConfig.nextPollAt.toISOString(),\n pollInterval: pollConfig.pollInterval,\n maxWaitTime: pollConfig.maxWaitTime,\n state:\n stateStr.substring(0, 500) + (stateStr.length > 500 ? \"...\" : \"\"),\n });\n\n // Update stage record\n await this.persistence.updateStage(stageRecord.id, {\n status: \"SUSPENDED\",\n suspendedState: state as any,\n nextPollAt: pollConfig.nextPollAt,\n pollInterval: pollConfig.pollInterval,\n maxWaitUntil: new Date(Date.now() + pollConfig.maxWaitTime),\n metrics: metrics as any,\n });\n\n // Update workflow run status\n await this.persistence.updateRun(this.workflowRunId, {\n status: \"SUSPENDED\",\n });\n\n this.emit(\"stage:suspended\", {\n stageId: stage.id,\n stageName: stage.name,\n resumeAt: pollConfig.nextPollAt,\n });\n\n this.log(\n \"INFO\",\n `Stage suspended: ${stage.name}, next poll at ${pollConfig.nextPollAt.toISOString()}`,\n );\n\n return \"suspended\";\n }\n\n // Validate output\n const validatedOutput = stage.outputSchema.parse(result.output);\n\n // Save output to storage via persistence\n const outputKey = await this.persistence.saveStageOutput(\n this.workflowRunId,\n this.workflowType,\n stage.id,\n validatedOutput,\n );\n\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n // Update stage record - store reference to artifact for backward compatibility\n await this.persistence.updateStage(stageRecord.id, {\n status: \"COMPLETED\",\n completedAt: new Date(),\n duration,\n outputData: { _artifactKey: outputKey },\n metrics: result.metrics as any,\n embeddingInfo: result.embeddings as any,\n });\n\n this.emit(\"stage:completed\", {\n stageId: stage.id,\n stageName: stage.name,\n duration,\n });\n\n // Trace log stage output\n const outputStr = JSON.stringify(validatedOutput);\n logger.debug(`Stage ${stage.name} output`, {\n stageId: stage.id,\n duration,\n output:\n outputStr.substring(0, 1000) + (outputStr.length > 1000 ? \"...\" : \"\"),\n metrics: result.metrics,\n });\n\n this.log(\"INFO\", `Stage completed: ${stage.name} in ${duration}ms`);\n\n return result;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Trace log stage error with full details\n logger.error(`Stage ${stage.name} error`, {\n stageId: stage.id,\n error: errorMessage,\n stack: errorStack,\n duration: Date.now() - startTime,\n });\n\n await this.persistence.updateStageByRunAndStageId(\n this.workflowRunId,\n stage.id,\n {\n status: \"FAILED\",\n completedAt: new Date(),\n errorMessage,\n },\n );\n\n this.emit(\"stage:failed\", {\n stageId: stage.id,\n stageName: stage.name,\n error: errorMessage,\n });\n\n this.log(\"ERROR\", `Stage failed: ${stage.name} - ${errorMessage}`);\n\n throw error;\n }\n }\n\n /**\n * Load resume state from database\n */\n private async loadResumeState(): Promise<{\n lastCompletedGroup: number;\n lastOutput: any;\n } | null> {\n // First check if we have a SUSPENDED stage that's ready to resume\n const suspendedStage =\n await this.persistence.getFirstSuspendedStageReadyToResume(\n this.workflowRunId,\n );\n\n logger.debug(\n `loadResumeState - found suspended stage: ${suspendedStage?.stageId} ${suspendedStage?.status} ${suspendedStage?.nextPollAt} ${suspendedStage?.suspendedState ? \"(has suspendedState)\" : \"(no suspendedState)\"}`,\n );\n\n if (suspendedStage) {\n // Resume from the suspended stage using its stored input\n logger.debug(\n `Resuming from suspended stage ${suspendedStage.stageId}, group ${suspendedStage.executionGroup}`,\n );\n let lastOutput = suspendedStage.inputData;\n\n // Fallback: If inputData is missing, we need to get the proper input for this stage\n if (!lastOutput) {\n if (suspendedStage.executionGroup === 1) {\n // First group: use workflow run input\n logger.warn(\n `Suspended stage ${suspendedStage.stageId} has no inputData. Falling back to workflow run input.`,\n );\n const run = await this.persistence.getRun(this.workflowRunId);\n lastOutput = run?.input as any;\n } else {\n // Later groups: need to load output from the previous stage (the completed one before this)\n logger.warn(\n `Suspended stage ${suspendedStage.stageId} (group ${suspendedStage.executionGroup}) has no inputData. Loading previous stage output.`,\n );\n\n const previousCompleted =\n await this.persistence.getLastCompletedStageBefore(\n this.workflowRunId,\n suspendedStage.executionGroup,\n );\n\n if (previousCompleted) {\n const outputData = previousCompleted.outputData as any;\n\n if (outputData?._artifactKey) {\n lastOutput = await this.persistence.loadArtifact(\n this.workflowRunId,\n outputData._artifactKey,\n );\n logger.debug(\n `Loaded previous stage output from artifact: ${outputData._artifactKey}`,\n );\n } else if (outputData) {\n lastOutput = outputData;\n logger.debug(`Using previous stage outputData directly`);\n }\n }\n\n if (!lastOutput) {\n throw new Error(\n `Cannot resume suspended stage ${suspendedStage.stageId}: no inputData stored and no previous stage output found`,\n );\n }\n }\n }\n\n return {\n lastCompletedGroup: suspendedStage.executionGroup - 1,\n lastOutput,\n };\n }\n\n // Otherwise, find the last completed stage\n logger.debug(`No suspended stage found, looking for last completed stage`);\n\n // Also check if there's a failed stage - we want to resume from AFTER it\n const failedStage = await this.persistence.getFirstFailedStage(\n this.workflowRunId,\n );\n\n if (failedStage) {\n logger.debug(\n `Found failed stage: ${failedStage.stageId} in group ${failedStage.executionGroup}`,\n );\n\n // Find the last COMPLETED stage before the failed one\n const lastCompletedBeforeFailed =\n await this.persistence.getLastCompletedStageBefore(\n this.workflowRunId,\n failedStage.executionGroup,\n );\n\n if (lastCompletedBeforeFailed) {\n logger.debug(\n `Found last completed stage before failure: ${lastCompletedBeforeFailed.stageId}`,\n );\n\n // Load output from last completed stage\n const outputData = lastCompletedBeforeFailed.outputData as any;\n let output: any;\n\n // New: Check if output is stored as artifact\n if (outputData?._artifactKey) {\n output = await this.persistence.loadArtifact(\n this.workflowRunId,\n outputData._artifactKey,\n );\n }\n // Fallback: Use outputData directly (old format)\n else if (outputData) {\n output = outputData;\n } else {\n throw new Error(\n `No output data found for stage ${lastCompletedBeforeFailed.stageId}`,\n );\n }\n\n // Delete the failed stage so it can be re-executed\n await this.persistence.deleteStage(failedStage.id);\n\n logger.debug(\n `Deleted failed stage ${failedStage.stageId} for re-execution`,\n );\n\n return {\n lastCompletedGroup: lastCompletedBeforeFailed.executionGroup,\n lastOutput: output,\n };\n }\n }\n\n // No failed stage or no completed stages before it - look for any completed stages\n const stages = await this.persistence.getStagesByRun(this.workflowRunId, {\n status: \"COMPLETED\",\n orderBy: \"desc\",\n });\n\n if (stages.length === 0) {\n return null;\n }\n\n const lastStage = stages[0];\n logger.debug(`Found last completed stage: ${lastStage.stageId}`);\n\n // Load output - check artifact key (new), R2 key (legacy), or direct data (old)\n const outputData = lastStage.outputData as any;\n\n let output: any;\n // New: Check if output is stored as artifact\n if (outputData?._artifactKey) {\n output = await this.persistence.loadArtifact(\n this.workflowRunId,\n outputData._artifactKey,\n );\n }\n // Fallback: output stored directly in database (old format)\n else if (outputData) {\n output = outputData;\n } else {\n throw new Error(`No output data found for stage ${lastStage.stageId}`);\n }\n\n return {\n lastCompletedGroup: lastStage.executionGroup,\n lastOutput: output,\n };\n }\n\n /**\n * Load workflow context from all completed stages\n * This rebuilds the workflowContext object so resumed stages can access previous outputs\n */\n private async loadWorkflowContext(): Promise<Record<string, unknown>> {\n const completedStages = await this.persistence.getStagesByRun(\n this.workflowRunId,\n {\n status: \"COMPLETED\",\n orderBy: \"asc\",\n },\n );\n\n const workflowContext: Record<string, unknown> = {};\n\n for (const stage of completedStages) {\n // Load output - check artifact key (new), R2 key (legacy), or direct data (old)\n const outputData = stage.outputData as any;\n\n let output: any;\n // New: Check if output is stored as artifact\n if (outputData?._artifactKey) {\n output = await this.persistence.loadArtifact(\n this.workflowRunId,\n outputData._artifactKey,\n );\n }\n // Fallback: output stored directly in database (old format)\n else if (outputData) {\n output = outputData;\n } else {\n logger.warn(\n `No output data found for completed stage ${stage.stageId}`,\n );\n continue;\n }\n\n // Add to workflow context using stageId as key\n workflowContext[stage.stageId] = output;\n logger.debug(\n `Loaded output for stage ${stage.stageId} into workflowContext`,\n );\n }\n\n logger.debug(\n `Rebuilt workflowContext with ${Object.keys(workflowContext).length} stage outputs`,\n );\n\n return workflowContext;\n }\n\n /**\n * Load state for rerunning from a specific stage.\n * Requires that previous stages have already been executed and their outputs persisted.\n *\n * @param stageId - The stage ID to start execution from\n * @returns The execution group, input data, and workflow context\n */\n private async loadFromStageState(stageId: string): Promise<{\n executionGroup: number;\n input: any;\n workflowContext: Record<string, unknown>;\n }> {\n // Find the stage in the workflow definition\n const stage = this.workflow.getStage(stageId);\n if (!stage) {\n throw new Error(\n `Stage \"${stageId}\" not found in workflow \"${this.workflow.id}\"`,\n );\n }\n\n // Find the execution group for this stage\n const executionPlan = this.workflow.getExecutionPlan();\n let executionGroup = -1;\n\n for (const group of executionPlan) {\n const foundInGroup = group.find((node) => node.stage.id === stageId);\n if (foundInGroup) {\n executionGroup = foundInGroup.executionGroup;\n break;\n }\n }\n\n if (executionGroup === -1) {\n throw new Error(\n `Stage \"${stageId}\" not found in execution plan for workflow \"${this.workflow.id}\"`,\n );\n }\n\n logger.debug(\n `loadFromStageState: stage \"${stageId}\" is in execution group ${executionGroup}`,\n );\n\n // Load input for this stage\n let input: any;\n\n if (executionGroup === 1) {\n // First group: use the original workflow input\n const run = await this.persistence.getRun(this.workflowRunId);\n if (!run) {\n throw new Error(`WorkflowRun \"${this.workflowRunId}\" not found`);\n }\n input = run.input;\n logger.debug(`Using workflow input for first group stage`);\n } else {\n // Later groups: load output from the previous group's stage(s)\n const previousGroup = executionGroup - 1;\n\n // Find the last completed stage in the previous group\n const previousCompleted =\n await this.persistence.getLastCompletedStageBefore(\n this.workflowRunId,\n executionGroup,\n );\n\n if (!previousCompleted) {\n throw new Error(\n `Cannot rerun from stage \"${stageId}\": no completed stages found before execution group ${executionGroup}. ` +\n `You must run the workflow from the beginning first.`,\n );\n }\n\n // Load the output from the previous stage\n const outputData = previousCompleted.outputData as any;\n\n if (outputData?._artifactKey) {\n input = await this.persistence.loadArtifact(\n this.workflowRunId,\n outputData._artifactKey,\n );\n logger.debug(`Loaded input from artifact: ${outputData._artifactKey}`);\n } else if (outputData) {\n input = outputData;\n logger.debug(\n `Using outputData directly from stage ${previousCompleted.stageId}`,\n );\n } else {\n throw new Error(\n `Cannot rerun from stage \"${stageId}\": no output data found for previous stage \"${previousCompleted.stageId}\"`,\n );\n }\n }\n\n // Load workflow context from all completed stages before this group\n // But only include stages from groups BEFORE the target group\n const completedStages = await this.persistence.getStagesByRun(\n this.workflowRunId,\n {\n status: \"COMPLETED\",\n orderBy: \"asc\",\n },\n );\n\n const workflowContext: Record<string, unknown> = {};\n\n for (const completedStage of completedStages) {\n // Only include stages from groups before the target group\n if (completedStage.executionGroup >= executionGroup) {\n continue;\n }\n\n const outputData = completedStage.outputData as any;\n let output: any;\n\n if (outputData?._artifactKey) {\n output = await this.persistence.loadArtifact(\n this.workflowRunId,\n outputData._artifactKey,\n );\n } else if (outputData) {\n output = outputData;\n } else {\n logger.warn(\n `No output data found for completed stage ${completedStage.stageId}`,\n );\n continue;\n }\n\n workflowContext[completedStage.stageId] = output;\n logger.debug(\n `Loaded output for stage ${completedStage.stageId} into workflowContext`,\n );\n }\n\n // Delete any existing stage records for this stage and later stages\n // so they can be re-executed fresh\n const stagesToDelete = await this.persistence.getStagesByRun(\n this.workflowRunId,\n {},\n );\n\n for (const stageToDelete of stagesToDelete) {\n if (stageToDelete.executionGroup >= executionGroup) {\n await this.persistence.deleteStage(stageToDelete.id);\n logger.debug(\n `Deleted stage ${stageToDelete.stageId} (group ${stageToDelete.executionGroup}) for re-execution`,\n );\n }\n }\n\n return {\n executionGroup,\n input,\n workflowContext,\n };\n }\n\n /**\n * Create a minimal storage shim for context.storage (for API compatibility).\n * Stage implementations should not rely on this - it may be removed in future.\n */\n private createStorageShim(): StageStorage {\n const persistence = this.persistence;\n const workflowRunId = this.workflowRunId;\n const workflowType = this.workflowType;\n return {\n async save<T>(key: string, data: T): Promise<void> {\n await persistence.saveArtifact({\n workflowRunId,\n key,\n type: \"ARTIFACT\",\n data,\n size: Buffer.byteLength(JSON.stringify(data), \"utf8\"),\n });\n },\n async load<T>(key: string): Promise<T> {\n return persistence.loadArtifact(workflowRunId, key) as Promise<T>;\n },\n async exists(key: string): Promise<boolean> {\n return persistence.hasArtifact(workflowRunId, key);\n },\n async delete(key: string): Promise<void> {\n return persistence.deleteArtifact(workflowRunId, key);\n },\n getStageKey(stageId: string, suffix?: string): string {\n const base = `workflow-v2/${workflowType}/${workflowRunId}/${stageId}`;\n return suffix ? `${base}/${suffix}` : `${base}/output.json`;\n },\n };\n }\n\n /**\n * Get aggregated statistics for the workflow run\n */\n private async getAggregatedStats(): Promise<{\n totalCost: number;\n totalTokens: number;\n }> {\n // Use the AI logger to get stats\n // Topic convention: \"workflow.{workflowRunId}.*\"\n const stats = await this.aiLogger.getStats(\n `workflow.${this.workflowRunId}`,\n );\n\n return {\n totalCost: stats.totalCost,\n totalTokens: stats.totalInputTokens + stats.totalOutputTokens,\n };\n }\n\n /**\n * Log a message with automatic database persistence\n */\n private log(\n level: LogLevel,\n message: string,\n meta?: Record<string, unknown>,\n ) {\n this.emit(\"log\", { level, message, meta });\n\n // Also save to database (async, don't wait)\n this.persistence\n .createLog({\n workflowRunId: this.workflowRunId,\n level: level as PersistenceLogLevel,\n message,\n metadata: meta,\n })\n .catch((err) => logger.error(\"Failed to persist log:\", err));\n }\n}\n","/**\n * Stage Executor - Executes a single stage\n *\n * Unlike WorkflowExecutor which runs entire workflows,\n * this executes exactly ONE stage and returns.\n *\n * Designed for distributed workers.\n */\n\nimport type { WorkflowPersistence } from \"../persistence\";\nimport { createLogger } from \"../utils/logger\";\nimport { type StageContext, type StageStorage } from \"./stage\";\nimport type {\n ProgressUpdate,\n StageMetrics,\n StageResult,\n SuspendedResult,\n} from \"./types\";\nimport { isSuspendedResult } from \"./types\";\nimport type { Workflow } from \"./workflow\";\nimport { workflowEventBus } from \"./workflow-event-bus.server\";\n\nconst logger = createLogger(\"StageExecutor\");\n\nexport interface WorkflowRegistry {\n getWorkflow(id: string): Workflow<any, any> | undefined;\n}\n\nexport interface StageExecutionRequest {\n workflowRunId: string;\n workflowId: string; // Needed to look up registry\n stageId: string;\n config: Record<string, unknown>;\n}\n\nexport interface StageExecutionResult {\n type: \"completed\" | \"suspended\" | \"failed\";\n output?: unknown;\n suspendedState?: unknown;\n nextPollAt?: Date;\n error?: string;\n metrics?: StageMetrics;\n}\n\nexport class StageExecutor {\n private workerId: string;\n\n constructor(\n private registry: WorkflowRegistry,\n private persistence: WorkflowPersistence,\n workerId?: string,\n ) {\n this.workerId = workerId || `stage-executor-${process.pid}`;\n }\n\n /**\n * Execute a single stage\n */\n async execute(request: StageExecutionRequest): Promise<StageExecutionResult> {\n const { workflowRunId, workflowId, stageId, config } = request;\n const startTime = Date.now();\n\n logger.debug(`Executing stage ${stageId} for workflow ${workflowRunId}`);\n\n // 1. Get workflow definition\n const workflow = this.registry.getWorkflow(workflowId);\n if (!workflow) {\n throw new Error(`Workflow ${workflowId} not found in registry`);\n }\n\n // 2. Get stage definition\n const stageDef = workflow.getStage(stageId);\n if (!stageDef) {\n throw new Error(`Stage ${stageId} not found in workflow ${workflowId}`);\n }\n\n // 3. Get workflow run for context (need input/config/workflowType)\n const workflowRun = await this.persistence.getRun(workflowRunId);\n if (!workflowRun) {\n throw new Error(`WorkflowRun ${workflowRunId} not found`);\n }\n\n // 4. Load workflow context (all previous completed stage outputs)\n const workflowContext = await this.loadWorkflowContext(\n workflowRunId,\n workflowRun.workflowType,\n );\n\n // 6. Get or create stage record\n // We upsert because it might already exist if we are retrying or resuming\n const stageRecord = await this.persistence.upsertStage({\n workflowRunId,\n stageId,\n create: {\n workflowRunId,\n stageId,\n stageName: stageDef.name,\n stageNumber: this.getStageNumber(workflow, stageId),\n executionGroup: this.getExecutionGroup(workflow, stageId),\n status: \"RUNNING\",\n startedAt: new Date(),\n config: config as any,\n inputData: undefined, // Will be set later? Or needs to be passed?\n // Note: original local code didn't set inputData in create? Wait, checking local code...\n },\n update: {\n status: \"RUNNING\",\n startedAt: new Date(),\n // errorMessage: null, // Persistence interface might not support partial update of this field easily if not explicit?\n // But upsertStage uses UpdateStageInput.\n },\n });\n\n // 7. Determine input for this stage\n const input = await this.resolveStageInput(\n workflow,\n stageId,\n workflowRun,\n workflowContext,\n );\n\n // Update input data in persistence\n // Wait, local code didn't update input data explicitly after resolving?\n // It passed it to context.\n\n // 8. Emit stage started event\n workflowEventBus.emitWorkflowEvent(workflowRunId, \"stage:started\", {\n stageId,\n stageName: stageDef.name,\n stageNumber: stageRecord.stageNumber,\n });\n\n try {\n // 9. Input Validation\n const validatedInput = stageDef.inputSchema.parse(input) as any;\n\n // 10. Build stage context\n let stageConfig = (config[stageId] || {}) as any;\n\n // Parse config with schema\n try {\n if (stageDef.configSchema) {\n stageConfig = stageDef.configSchema.parse(stageConfig);\n }\n } catch (err) {\n logger.warn(\n `Config parsing failed for ${stageId}, falling back to raw config`,\n );\n }\n\n const logFn = (\n level: any,\n message: string,\n meta?: Record<string, unknown>,\n ) => this.log(workflowRunId, stageRecord.id, level, message, meta);\n\n const context: StageContext<any, any, any> = {\n workflowRunId,\n stageId,\n stageNumber: stageRecord.stageNumber,\n stageName: stageDef.name,\n stageRecordId: stageRecord.id,\n input: validatedInput,\n config: stageConfig,\n resumeState: stageRecord.suspendedState as any,\n\n onProgress: (update: ProgressUpdate) => {\n workflowEventBus.emitWorkflowEvent(\n workflowRunId,\n \"stage:progress\",\n update as unknown as Record<string, unknown>,\n );\n },\n\n onLog: logFn,\n log: logFn,\n\n storage: this.createStorageShim(\n workflowRunId,\n workflowRun.workflowType,\n ),\n workflowContext,\n };\n\n // 11. Execute\n const result = await stageDef.execute(context);\n\n // 12. Handle Result\n if (isSuspendedResult(result)) {\n return await this.handleSuspended(stageRecord.id, result, startTime);\n } else {\n return await this.handleCompleted(\n workflowRunId,\n workflowRun.workflowType,\n stageRecord.id,\n stageId,\n result,\n startTime,\n );\n }\n } catch (error) {\n return await this.handleFailed(stageRecord.id, stageId, error, startTime);\n }\n }\n\n // -- Handlers --\n\n private async handleCompleted(\n workflowRunId: string,\n workflowType: string,\n stageRecordId: string,\n stageId: string,\n result: StageResult<any>,\n startTime: number,\n ): Promise<StageExecutionResult> {\n const duration = Date.now() - startTime;\n\n // Save output to storage via persistence\n const outputKey = await this.persistence.saveStageOutput(\n workflowRunId,\n workflowType,\n stageId,\n result.output,\n );\n\n // Update stage record\n await this.persistence.updateStage(stageRecordId, {\n status: \"COMPLETED\",\n completedAt: new Date(),\n duration,\n outputData: { _artifactKey: outputKey } as any,\n metrics: result.metrics as any,\n embeddingInfo: result.embeddings as any,\n });\n\n return {\n type: \"completed\",\n output: result.output,\n metrics: result.metrics,\n };\n }\n\n private async handleSuspended(\n stageRecordId: string,\n result: SuspendedResult,\n startTime: number,\n ): Promise<StageExecutionResult> {\n const { state, pollConfig, metrics } = result;\n\n const nextPollAt = new Date(\n pollConfig.nextPollAt || Date.now() + (pollConfig.pollInterval || 60000),\n );\n\n // Update stage to SUSPENDED\n await this.persistence.updateStage(stageRecordId, {\n status: \"SUSPENDED\",\n suspendedState: state as any,\n nextPollAt: nextPollAt,\n pollInterval: pollConfig.pollInterval,\n maxWaitUntil: pollConfig.maxWaitTime\n ? new Date(Date.now() + pollConfig.maxWaitTime)\n : undefined,\n metrics: metrics as any,\n });\n\n return {\n type: \"suspended\",\n suspendedState: state,\n nextPollAt: nextPollAt,\n metrics,\n };\n }\n\n private async handleFailed(\n stageRecordId: string,\n stageId: string,\n error: unknown,\n startTime: number,\n ): Promise<StageExecutionResult> {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const duration = Date.now() - startTime;\n\n logger.error(`Stage ${stageId} failed:`, error);\n\n await this.persistence.updateStage(stageRecordId, {\n status: \"FAILED\",\n completedAt: new Date(),\n duration, // Note: updateStage input might not support duration? Check persistence interface. Assuming it does as StageRecord has it.\n // errorMessage: errorMessage // Check if UpdateStageInput supports errorMessage.\n // If not, use updateStageByRunAndStageId pattern or check interface.\n });\n\n // To be safe, if updateStage doesn't support errorMessage (it might be in metadata?),\n // WorkflowExecutor used updateStageByRunAndStageId.\n // I will use that pattern if needed, but updateStage by ID is more direct if supported.\n // For now assuming updateStage maps correctly. If not, I'll fix later.\n // EDIT: WorkflowExecutor used updateStageByRunAndStageId for failure.\n // I'll stick to updateStage if I can, but I'll add a separate log for error.\n\n // Also save log\n await this.log(\n \"\" /* runId? need context */,\n stageRecordId,\n \"ERROR\",\n errorMessage,\n );\n\n return {\n type: \"failed\",\n error: errorMessage,\n };\n }\n\n // -- Helpers --\n\n private async loadWorkflowContext(\n workflowRunId: string,\n workflowType: string,\n ): Promise<Record<string, unknown>> {\n const completedStages = await this.persistence.getStagesByRun(\n workflowRunId,\n {\n status: \"COMPLETED\",\n orderBy: \"asc\",\n },\n );\n\n const context: Record<string, unknown> = {};\n\n for (const stage of completedStages) {\n const outputData = stage.outputData as any;\n if (outputData?._artifactKey) {\n context[stage.stageId] = await this.persistence.loadArtifact(\n workflowRunId,\n outputData._artifactKey,\n );\n } else if (outputData && typeof outputData === \"object\") {\n context[stage.stageId] = outputData;\n }\n }\n\n return context;\n }\n\n /**\n * Create a minimal storage shim for context.storage (for API compatibility).\n * Stage implementations should not rely on this - it may be removed in future.\n */\n private createStorageShim(\n workflowRunId: string,\n workflowType: string,\n ): StageStorage {\n const persistence = this.persistence;\n return {\n async save<T>(key: string, data: T): Promise<void> {\n await persistence.saveArtifact({\n workflowRunId,\n key,\n type: \"ARTIFACT\",\n data,\n size: Buffer.byteLength(JSON.stringify(data), \"utf8\"),\n });\n },\n async load<T>(key: string): Promise<T> {\n return persistence.loadArtifact(workflowRunId, key) as Promise<T>;\n },\n async exists(key: string): Promise<boolean> {\n return persistence.hasArtifact(workflowRunId, key);\n },\n async delete(key: string): Promise<void> {\n return persistence.deleteArtifact(workflowRunId, key);\n },\n getStageKey(stageId: string, suffix?: string): string {\n const base = `workflow-v2/${workflowType}/${workflowRunId}/${stageId}`;\n return suffix ? `${base}/${suffix}` : `${base}/output.json`;\n },\n };\n }\n\n private async resolveStageInput(\n workflow: any,\n stageId: string,\n workflowRun: { input: any },\n workflowContext: Record<string, unknown>,\n ): Promise<unknown> {\n const stageDef = workflow.getStage(stageId);\n if (!stageDef) return {};\n\n const groupIndex = workflow.getExecutionGroupIndex(stageId);\n\n if (groupIndex === 0) {\n return workflowRun.input;\n }\n\n const prevStageId = workflow.getPreviousStageId(stageId);\n if (prevStageId) {\n return workflowContext[prevStageId];\n }\n\n return workflowRun.input;\n }\n\n private getStageNumber(workflow: any, stageId: string): number {\n return workflow.getStageIndex(stageId) + 1;\n }\n\n private getExecutionGroup(workflow: any, stageId: string): number {\n return workflow.getExecutionGroupIndex(stageId);\n }\n\n private async log(\n workflowRunId: string,\n stageRecordId: string,\n level: string,\n message: string,\n meta?: any,\n ) {\n logger.debug(`[${level}] ${message}`);\n await this.persistence\n .createLog({\n workflowRunId,\n workflowStageId: stageRecordId,\n level: level as any,\n message,\n metadata: meta,\n })\n .catch((err) => logger.error(\"Failed to write log:\", err));\n }\n}\n","/**\n * In-memory storage implementation for testing\n *\n * Stores artifacts in memory using a static Map for cross-instance access\n */\n\nimport type { StageStorage } from \"../storage\";\n\nexport class InMemoryStageStorage implements StageStorage {\n readonly providerType = \"memory\" as const;\n\n // Static storage for all workflow runs (for testing across instances)\n private static globalStorage = new Map<string, Map<string, unknown>>();\n\n private storage: Map<string, unknown>;\n\n constructor(\n private workflowRunId: string,\n private workflowType: string,\n ) {\n // Get or create storage for this workflow run\n if (!InMemoryStageStorage.globalStorage.has(workflowRunId)) {\n InMemoryStageStorage.globalStorage.set(workflowRunId, new Map());\n }\n const storage = InMemoryStageStorage.globalStorage.get(workflowRunId);\n if (!storage) {\n throw new Error(\n `Failed to initialize storage for workflow run ${workflowRunId}`,\n );\n }\n this.storage = storage;\n }\n\n /**\n * Generate storage key with consistent pattern:\n * workflow-v2/{type}/{runId}/{stageId}/{suffix|output.json}\n */\n getStageKey(stageId: string, suffix?: string): string {\n const base = `workflow-v2/${this.workflowType}/${this.workflowRunId}/${stageId}`;\n return suffix ? `${base}/${suffix}` : `${base}/output.json`;\n }\n\n /**\n * Save data to memory (deep clone to prevent mutations)\n */\n async save<T>(key: string, data: T): Promise<void> {\n // Deep clone to prevent mutations\n this.storage.set(key, JSON.parse(JSON.stringify(data)));\n }\n\n /**\n * Load data from memory (deep clone to prevent mutations)\n */\n async load<T>(key: string): Promise<T> {\n if (!this.storage.has(key)) {\n throw new Error(`Artifact not found: ${key}`);\n }\n // Deep clone to prevent mutations\n return JSON.parse(JSON.stringify(this.storage.get(key))) as T;\n }\n\n /**\n * Check if key exists in memory\n */\n async exists(key: string): Promise<boolean> {\n return this.storage.has(key);\n }\n\n /**\n * Delete data from memory\n */\n async delete(key: string): Promise<void> {\n this.storage.delete(key);\n }\n\n /**\n * Save stage output with standard key\n */\n async saveStageOutput<T>(stageId: string, output: T): Promise<string> {\n const key = this.getStageKey(stageId);\n await this.save(key, output);\n return key;\n }\n\n /**\n * Load stage output with standard key\n */\n async loadStageOutput<T>(stageId: string): Promise<T> {\n const key = this.getStageKey(stageId);\n return await this.load<T>(key);\n }\n\n /**\n * Save arbitrary artifact for a stage\n */\n async saveArtifact<T>(\n stageId: string,\n artifactName: string,\n data: T,\n ): Promise<string> {\n const key = this.getStageKey(stageId, `artifacts/${artifactName}.json`);\n await this.save(key, data);\n return key;\n }\n\n /**\n * Load arbitrary artifact for a stage\n */\n async loadArtifact<T>(stageId: string, artifactName: string): Promise<T> {\n const key = this.getStageKey(stageId, `artifacts/${artifactName}.json`);\n return await this.load<T>(key);\n }\n\n /**\n * List all artifacts for a workflow run\n */\n async listAllArtifacts(): Promise<\n Array<{ key: string; stageId: string; name: string }>\n > {\n const artifacts: Array<{ key: string; stageId: string; name: string }> = [];\n\n for (const key of this.storage.keys()) {\n // Extract stageId from key: workflow-v2/{type}/{runId}/{stageId}/...\n const keyParts = key.split(\"/\");\n const stageId = keyParts.length >= 4 ? keyParts[3] : \"unknown\";\n\n // Extract name from key (last part)\n const name = keyParts[keyParts.length - 1] || \"unknown\";\n\n artifacts.push({\n key: key,\n stageId: stageId,\n name: name,\n });\n }\n\n return artifacts;\n }\n\n /**\n * Testing helper: Clear all storage or specific workflow run\n */\n static clear(workflowRunId?: string): void {\n if (workflowRunId) {\n InMemoryStageStorage.globalStorage.delete(workflowRunId);\n } else {\n InMemoryStageStorage.globalStorage.clear();\n }\n }\n\n /**\n * Testing helper: Get all data for a workflow run\n */\n static getAll(workflowRunId: string): Map<string, unknown> {\n return InMemoryStageStorage.globalStorage.get(workflowRunId) || new Map();\n }\n}\n","/**\n * Prisma-backed storage implementation\n *\n * Stores artifacts in the database using the WorkflowArtifact table\n * Requires a PrismaClient to be injected via constructor.\n */\n\n// Type alias - actual client should be injected from app layer\ntype PrismaClient = any;\n\nimport type { StageStorage } from \"../storage\";\n\nexport class PrismaStageStorage implements StageStorage {\n readonly providerType = \"prisma\" as const;\n\n constructor(\n private prisma: PrismaClient,\n private workflowRunId: string,\n private workflowType: string,\n ) {}\n\n /**\n * Generate storage key with consistent pattern:\n * workflow-v2/{type}/{runId}/{stageId}/{suffix|output.json}\n */\n getStageKey(stageId: string, suffix?: string): string {\n const base = `workflow-v2/${this.workflowType}/${this.workflowRunId}/${stageId}`;\n return suffix ? `${base}/${suffix}` : `${base}/output.json`;\n }\n\n /**\n * Save data as JSON to database\n */\n async save<T>(key: string, data: T): Promise<void> {\n const json = JSON.stringify(data);\n const size = Buffer.byteLength(json, \"utf8\");\n\n // Determine artifact type based on key pattern\n const type = key.includes(\"/artifacts/\") ? \"ARTIFACT\" : \"STAGE_OUTPUT\";\n\n // Extract stageId from key if possible\n // Key format: workflow-v2/{type}/{runId}/{stageId}/...\n const keyParts = key.split(\"/\");\n const stageId = keyParts.length >= 4 ? keyParts[3] : undefined;\n\n let workflowStageId: string | null = null;\n if (stageId) {\n // Find the WorkflowStage record\n const stage = await this.prisma.workflowStage.findUnique({\n where: {\n workflowRunId_stageId: {\n workflowRunId: this.workflowRunId,\n stageId: stageId,\n },\n },\n select: { id: true },\n });\n workflowStageId = stage?.id ?? null;\n }\n\n await this.prisma.workflowArtifact.upsert({\n where: {\n workflowRunId_key: {\n workflowRunId: this.workflowRunId,\n key: key,\n },\n },\n update: {\n data: data as unknown,\n size: size,\n type: type,\n workflowStageId: workflowStageId,\n },\n create: {\n workflowRunId: this.workflowRunId,\n workflowStageId: workflowStageId,\n key: key,\n type: type,\n data: data as unknown,\n size: size,\n },\n });\n }\n\n /**\n * Load and parse JSON from database\n */\n async load<T>(key: string): Promise<T> {\n const artifact = await this.prisma.workflowArtifact.findUnique({\n where: {\n workflowRunId_key: {\n workflowRunId: this.workflowRunId,\n key: key,\n },\n },\n });\n\n if (!artifact) {\n throw new Error(`Artifact not found: ${key}`);\n }\n\n return artifact.data as T;\n }\n\n /**\n * Check if artifact exists in database\n */\n async exists(key: string): Promise<boolean> {\n const artifact = await this.prisma.workflowArtifact.findUnique({\n where: {\n workflowRunId_key: {\n workflowRunId: this.workflowRunId,\n key: key,\n },\n },\n select: { id: true },\n });\n\n return artifact !== null;\n }\n\n /**\n * Delete artifact from database\n */\n async delete(key: string): Promise<void> {\n await this.prisma.workflowArtifact.delete({\n where: {\n workflowRunId_key: {\n workflowRunId: this.workflowRunId,\n key: key,\n },\n },\n });\n }\n\n /**\n * Save stage output with standard key\n */\n async saveStageOutput<T>(stageId: string, output: T): Promise<string> {\n const key = this.getStageKey(stageId);\n await this.save(key, output);\n return key;\n }\n\n /**\n * Load stage output with standard key\n */\n async loadStageOutput<T>(stageId: string): Promise<T> {\n const key = this.getStageKey(stageId);\n return await this.load<T>(key);\n }\n\n /**\n * Save arbitrary artifact for a stage\n */\n async saveArtifact<T>(\n stageId: string,\n artifactName: string,\n data: T,\n ): Promise<string> {\n const key = this.getStageKey(stageId, `artifacts/${artifactName}.json`);\n await this.save(key, data);\n return key;\n }\n\n /**\n * Load arbitrary artifact for a stage\n */\n async loadArtifact<T>(stageId: string, artifactName: string): Promise<T> {\n const key = this.getStageKey(stageId, `artifacts/${artifactName}.json`);\n return await this.load<T>(key);\n }\n\n /**\n * List all artifacts for a workflow run (for export)\n */\n async listAllArtifacts(): Promise<\n Array<{ key: string; stageId: string; name: string }>\n > {\n const artifacts = await this.prisma.workflowArtifact.findMany({\n where: {\n workflowRunId: this.workflowRunId,\n },\n select: {\n key: true,\n workflowStageId: true,\n },\n });\n\n return artifacts.map(\n (artifact: { key: string; workflowStageId: string | null }) => {\n // Extract stageId from key: workflow-v2/{type}/{runId}/{stageId}/...\n const keyParts = artifact.key.split(\"/\");\n const stageId = keyParts.length >= 4 ? keyParts[3] : \"unknown\";\n\n // Extract name from key (last part)\n const name = keyParts[keyParts.length - 1] || \"unknown\";\n\n return {\n key: artifact.key,\n stageId: stageId,\n name: name,\n };\n },\n );\n }\n}\n\n/**\n * Factory function to create PrismaStageStorage\n */\nexport function createPrismaStageStorage(\n prisma: PrismaClient,\n workflowRunId: string,\n workflowType: string,\n): PrismaStageStorage {\n return new PrismaStageStorage(prisma, workflowRunId, workflowType);\n}\n","/**\n * Factory for creating storage provider instances\n *\n * Prisma storage requires a PrismaClient to be passed via options.\n */\n\nimport type { StageStorage } from \"./storage\";\nimport { InMemoryStageStorage } from \"./storage-providers/memory-storage\";\nimport { PrismaStageStorage } from \"./storage-providers/prisma-storage\";\n\n// Type alias - actual client should be injected from app layer\ntype PrismaClient = any;\n\nexport type StorageProviderType = \"prisma\" | \"memory\";\n\nexport interface StorageFactoryOptions {\n provider: StorageProviderType;\n workflowRunId: string;\n workflowType: string;\n /** Required when provider is \"prisma\" */\n prisma?: PrismaClient;\n}\n\n/**\n * Create a storage instance based on the provider type\n */\nexport function createStorage(options: StorageFactoryOptions): StageStorage {\n const { provider, workflowRunId, workflowType, prisma } = options;\n\n switch (provider) {\n case \"prisma\":\n if (!prisma) {\n throw new Error(\n \"Prisma storage requires a prisma client. \" +\n 'Pass it via options.prisma or use provider: \"memory\" for testing.',\n );\n }\n return new PrismaStageStorage(prisma, workflowRunId, workflowType);\n\n case \"memory\":\n return new InMemoryStageStorage(workflowRunId, workflowType);\n\n default:\n throw new Error(`Unknown storage provider: ${provider}`);\n }\n}\n\n/**\n * Get default provider from environment or config\n * Falls back to 'prisma' for database-backed persistence\n */\nexport function getDefaultStorageProvider(): StorageProviderType {\n const provider = process.env.WORKFLOW_STORAGE_PROVIDER as StorageProviderType;\n\n if (provider && [\"prisma\", \"memory\"].includes(provider)) {\n return provider;\n }\n\n return \"prisma\";\n}\n","/**\n * Workflow Runtime - Unified API for workflow execution\n *\n * The main entry point for the workflow engine. Handles everything:\n * - Creating new workflow runs (with validation)\n * - Polling for pending workflows → enqueuing first stage\n * - Processing jobs from the queue (executing stages)\n * - Polling for suspended stages → resuming execution\n * - Transitioning workflows between stages\n */\n\nimport os from \"node:os\";\nimport {\n type AIHelper,\n createAIHelper as baseCreateAIHelper,\n type LogContext,\n} from \"../ai/ai-helper\";\nimport { WorkflowExecutor } from \"../core/executor\";\nimport type { StageStorage } from \"../core/stage\";\nimport type { WorkflowRegistry } from \"../core/stage-executor\";\nimport { StageExecutor } from \"../core/stage-executor\";\nimport { workflowEventBus } from \"../core/workflow-event-bus.server\";\nimport type {\n AICallLogger,\n JobQueue,\n WorkflowPersistence,\n WorkflowRunRecord,\n} from \"../persistence\";\nimport { createLogger } from \"../utils/logger\";\n\nconst logger = createLogger(\"Runtime\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface WorkflowRuntimeConfig {\n /** Persistence implementation */\n persistence: WorkflowPersistence;\n /** Job queue implementation */\n jobQueue: JobQueue;\n /** Workflow registry */\n registry: WorkflowRegistry;\n /** AI call logger for createAIHelper */\n aiCallLogger?: AICallLogger;\n /** Interval between poll cycles in milliseconds (default: 10000) */\n pollIntervalMs?: number;\n /** Interval between job dequeue attempts in milliseconds (default: 1000) */\n jobPollIntervalMs?: number;\n /** Worker ID (default: auto-generated) */\n workerId?: string;\n /** Stale job threshold in milliseconds (default: 60000) */\n staleJobThresholdMs?: number;\n /** Function to determine workflow priority */\n getWorkflowPriority?: (workflowId: string) => number;\n}\n\nexport interface CreateRunOptions {\n workflowId: string;\n input: Record<string, unknown>;\n config?: Record<string, unknown>;\n priority?: number;\n /** Domain-specific metadata */\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateRunResult {\n workflowRunId: string;\n}\n\n// ============================================================================\n// WorkflowRuntime Class\n// ============================================================================\n\nexport class WorkflowRuntime {\n private isPolling = false;\n private isProcessingJobs = false;\n private isRunning = false;\n private pollIntervalMs: number;\n private jobPollIntervalMs: number;\n private staleJobThresholdMs: number;\n private workerId: string;\n private persistence: WorkflowPersistence;\n private jobQueue: JobQueue;\n private registry: WorkflowRegistry;\n private aiCallLogger?: AICallLogger;\n private getWorkflowPriority?: (workflowId: string) => number;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private stageExecutor: StageExecutor;\n private jobsProcessed = 0;\n\n constructor(config: WorkflowRuntimeConfig) {\n this.pollIntervalMs = config.pollIntervalMs ?? 10000; // 10s default\n this.jobPollIntervalMs = config.jobPollIntervalMs ?? 1000; // 1s default\n this.staleJobThresholdMs = config.staleJobThresholdMs ?? 60000; // 60s default\n this.workerId = config.workerId ?? `worker-${process.pid}-${os.hostname()}`;\n this.persistence = config.persistence;\n this.jobQueue = config.jobQueue;\n this.registry = config.registry;\n this.aiCallLogger = config.aiCallLogger;\n this.getWorkflowPriority = config.getWorkflowPriority;\n this.stageExecutor = new StageExecutor(\n this.registry,\n this.persistence,\n this.workerId,\n );\n }\n\n // ==========================================================================\n // AI Helper Factory\n // ==========================================================================\n\n /**\n * Create an AI helper bound to this runtime's logger\n * @param topic - Topic for logging (e.g., \"workflow.abc123.stage.extraction\")\n * @param logContext - Optional log context for persistence logging in batch operations\n */\n createAIHelper(topic: string, logContext?: LogContext): AIHelper {\n if (!this.aiCallLogger) {\n throw new Error(\n \"[Runtime] AICallLogger not configured. Pass aiCallLogger in config.\",\n );\n }\n return baseCreateAIHelper(topic, this.aiCallLogger, logContext);\n }\n\n /**\n * Create a LogContext for a workflow stage (for use with createAIHelper)\n * This enables batch operations to log to the workflow persistence.\n */\n createLogContext(workflowRunId: string, stageRecordId: string): LogContext {\n const persistence = this.persistence;\n return {\n workflowRunId,\n stageRecordId,\n createLog: (data) => persistence.createLog(data),\n };\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n\n /**\n * Start the runtime as a full worker (processes jobs + polls)\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n logger.debug(\"Already running\");\n return;\n }\n\n logger.info(`Starting worker ${this.workerId}`);\n logger.debug(\n `Poll interval: ${this.pollIntervalMs}ms, Job poll: ${this.jobPollIntervalMs}ms`,\n );\n\n this.isRunning = true;\n\n // Start orchestration polling\n this.pollTimer = setInterval(() => this.poll(), this.pollIntervalMs);\n this.poll(); // Immediate first poll\n\n // Start job processing loop\n this.processJobs();\n\n // Graceful shutdown\n process.on(\"SIGTERM\", () => this.stop());\n process.on(\"SIGINT\", () => this.stop());\n }\n\n /**\n * Stop the runtime\n */\n stop(): void {\n logger.info(`Stopping worker ${this.workerId}...`);\n this.isRunning = false;\n\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n\n logger.info(`Stopped. Processed ${this.jobsProcessed} jobs.`);\n }\n\n // ==========================================================================\n // Create Run - The main API for starting workflows\n // ==========================================================================\n\n /**\n * Create a new workflow run with validation.\n * The runtime will pick it up on the next poll cycle and start execution.\n */\n async createRun(options: CreateRunOptions): Promise<CreateRunResult> {\n const { workflowId, input, config = {}, priority, metadata } = options;\n\n // 1. Get workflow definition from registry\n const workflow = this.registry.getWorkflow(workflowId);\n if (!workflow) {\n throw new Error(`Workflow ${workflowId} not found in registry`);\n }\n\n // 2. Validate input\n try {\n workflow.inputSchema.parse(input);\n } catch (error) {\n throw new Error(`Invalid workflow input: ${error}`);\n }\n\n // 3. Get default config and merge with provided\n const defaultConfig = workflow.getDefaultConfig?.() ?? {};\n const mergedConfig = { ...defaultConfig, ...config };\n\n // 4. Validate config\n const configValidation = workflow.validateConfig(mergedConfig);\n if (!configValidation.valid) {\n const errors = configValidation.errors\n .map((e) => `${e.stageId}: ${e.error}`)\n .join(\", \");\n throw new Error(`Invalid workflow config: ${errors}`);\n }\n\n // 5. Calculate priority\n const effectivePriority =\n priority ?? this.getWorkflowPriority?.(workflowId) ?? 5;\n\n // 6. Create WorkflowRun record (status: PENDING)\n const workflowRun = await this.persistence.createRun({\n workflowId,\n workflowName: workflow.name,\n workflowType: workflowId,\n input,\n config: mergedConfig,\n priority: effectivePriority,\n metadata,\n });\n\n logger.debug(`Created WorkflowRun ${workflowRun.id} for ${workflowId}`);\n\n return {\n workflowRunId: workflowRun.id,\n };\n }\n\n // ==========================================================================\n // Job Processing Loop\n // ==========================================================================\n\n /**\n * Process jobs from the queue\n */\n private async processJobs(): Promise<void> {\n // Clean up stale jobs on startup\n await this.jobQueue.releaseStaleJobs(this.staleJobThresholdMs);\n let lastStaleCheck = Date.now();\n let lastLogTime = Date.now();\n\n while (this.isRunning) {\n try {\n const now = Date.now();\n\n // Periodic stale job cleanup\n if (now - lastStaleCheck > this.staleJobThresholdMs) {\n await this.jobQueue.releaseStaleJobs(this.staleJobThresholdMs);\n lastStaleCheck = now;\n }\n\n // Periodic logging\n if (now - lastLogTime > 10000) {\n logger.debug(\n `Worker ${this.workerId}: processed ${this.jobsProcessed} jobs`,\n );\n lastLogTime = now;\n }\n\n // Dequeue next job\n const job = await this.jobQueue.dequeue();\n if (!job) {\n await new Promise((r) => setTimeout(r, this.jobPollIntervalMs));\n continue;\n }\n\n const { jobId, workflowRunId, stageId, payload } = job;\n const config =\n (payload as { config?: Record<string, unknown> }).config || {};\n\n logger.debug(\n `Processing stage ${stageId} for workflow ${workflowRunId}`,\n );\n\n // Get workflow ID\n const workflowId = await this.getWorkflowId(workflowRunId);\n if (!workflowId) {\n await this.jobQueue.fail(jobId, \"WorkflowRun not found\", false);\n continue;\n }\n\n // Execute stage\n const result = await this.stageExecutor.execute({\n workflowRunId,\n stageId,\n workflowId,\n config,\n });\n\n this.jobsProcessed++;\n\n // Handle result\n if (result.type === \"completed\") {\n logger.debug(`Job completed`, {\n jobId,\n workflowRunId,\n stageId,\n });\n await this.jobQueue.complete(jobId);\n await this.transitionWorkflow(workflowRunId);\n } else if (result.type === \"suspended\") {\n const nextPollAt = result.nextPollAt || new Date(Date.now() + 60000);\n logger.debug(`Job suspended`, {\n jobId,\n workflowRunId,\n stageId,\n nextPollAt: nextPollAt.toISOString(),\n });\n await this.jobQueue.suspend(jobId, nextPollAt);\n } else if (result.type === \"failed\") {\n const canRetry = job.attempt < 3;\n logger.debug(`Job failed`, {\n jobId,\n workflowRunId,\n stageId,\n error: result.error,\n attempt: job.attempt,\n canRetry,\n });\n await this.jobQueue.fail(\n jobId,\n result.error || \"Unknown error\",\n canRetry,\n );\n if (!canRetry) {\n await this.persistence.updateRun(workflowRunId, {\n status: \"FAILED\",\n });\n }\n }\n } catch (error) {\n logger.error(\"Error in job loop:\", error);\n await new Promise((r) => setTimeout(r, 5000));\n }\n }\n }\n\n private async getWorkflowId(runId: string): Promise<string | null> {\n const run = await this.persistence.getRun(runId);\n return run?.workflowId ?? null;\n }\n\n // ==========================================================================\n // Polling - Orchestration\n // ==========================================================================\n\n /**\n * Poll for pending workflows and suspended stages\n */\n private async poll(): Promise<void> {\n if (this.isPolling) return;\n this.isPolling = true;\n\n try {\n await this.pollPendingWorkflows();\n await this.pollSuspendedStages();\n } finally {\n this.isPolling = false;\n }\n }\n\n /**\n * Poll for pending workflows and enqueue their first stage.\n * Uses claimNextPendingRun() for zero-contention claiming with FOR UPDATE SKIP LOCKED.\n */\n private async pollPendingWorkflows(): Promise<void> {\n // Keep claiming workflows until none are left\n // Each worker gets a different workflow - no race conditions\n let claimedCount = 0;\n\n while (true) {\n // Atomically find and claim the next pending workflow\n // Uses FOR UPDATE SKIP LOCKED - workers never contend for the same row\n const run = await this.persistence.claimNextPendingRun();\n if (!run) {\n // No more pending workflows available\n break;\n }\n\n claimedCount++;\n logger.debug(`Claimed workflow ${run.id}`);\n\n try {\n const workflow = this.registry.getWorkflow(run.workflowId);\n if (!workflow) {\n await this.persistence.updateRun(run.id, { status: \"FAILED\" });\n continue;\n }\n\n const firstStages = workflow.getStagesInExecutionGroup(1);\n if (firstStages.length === 0) {\n await this.persistence.updateRun(run.id, { status: \"FAILED\" });\n continue;\n }\n\n await this.enqueueExecutionGroup(run, workflow, 1);\n // Note: status already set to RUNNING by claimNextPendingRun\n logger.debug(`Started workflow ${run.id}`);\n } catch (error) {\n logger.error(`Error starting workflow ${run.id}:`, error);\n await this.persistence.updateRun(run.id, { status: \"FAILED\" });\n }\n }\n\n if (claimedCount > 0) {\n logger.debug(`Processed ${claimedCount} pending workflow(s)`);\n }\n }\n\n /**\n * Poll suspended stages and resume if ready (public for manual triggering)\n */\n async pollSuspendedStages(): Promise<void> {\n const suspendedStages = await this.persistence.getSuspendedStages(\n new Date(),\n );\n if (suspendedStages.length === 0) return;\n\n logger.debug(`Found ${suspendedStages.length} suspended stages`);\n\n for (const stageRecord of suspendedStages) {\n try {\n const workflowRun = await this.persistence.getRun(\n stageRecord.workflowRunId,\n );\n if (!workflowRun) continue;\n await this.checkAndResume({ ...stageRecord, workflowRun });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger.error(`Error checking stage ${stageRecord.stageId}:`, error);\n\n // Check if this is a transient error that should be retried\n const isTransientError =\n errorMessage.includes(\"fetch failed\") ||\n errorMessage.includes(\"ECONNREFUSED\") ||\n errorMessage.includes(\"ETIMEDOUT\") ||\n errorMessage.includes(\"network\") ||\n errorMessage.includes(\"ENOTFOUND\") ||\n errorMessage.includes(\"socket hang up\");\n\n if (isTransientError) {\n // Reschedule the check instead of failing the workflow\n logger.debug(\n `Transient error for stage ${stageRecord.stageId}, will retry on next poll`,\n );\n const nextPollAt = new Date(Date.now() + this.pollIntervalMs);\n await this.persistence\n .updateStage(stageRecord.id, { nextPollAt })\n .catch((err) => logger.error(\"Failed to update stage:\", err));\n } else {\n // Permanent error - mark as failed\n await this.markStageFailed(\n stageRecord.id,\n `Runtime error: ${errorMessage}`,\n ).catch((err) => logger.error(\"Failed to mark stage failed:\", err));\n await this.persistence\n .updateRun(stageRecord.workflowRunId, { status: \"FAILED\" })\n .catch((err) => logger.error(\"Failed to update run:\", err));\n }\n }\n }\n }\n\n /**\n * Transition a workflow to its next state (public for external calls)\n */\n async transitionWorkflow(workflowRunId: string): Promise<void> {\n const workflowRun = await this.persistence.getRun(workflowRunId);\n if (!workflowRun) return;\n\n if ([\"FAILED\", \"CANCELLED\", \"COMPLETED\"].includes(workflowRun.status))\n return;\n\n const workflow = this.registry.getWorkflow(workflowRun.workflowId);\n if (!workflow) return;\n\n const stages = await this.persistence.getStagesByRun(workflowRunId);\n\n if (stages.length === 0) {\n await this.enqueueExecutionGroup(workflowRun, workflow, 1);\n return;\n }\n\n const activeStage = stages.find((s) =>\n [\"RUNNING\", \"PENDING\", \"SUSPENDED\"].includes(s.status),\n );\n if (activeStage) return;\n\n const maxGroup = Math.max(...stages.map((s) => s.executionGroup));\n const nextStages = workflow.getStagesInExecutionGroup(maxGroup + 1);\n\n if (nextStages.length > 0) {\n await this.enqueueExecutionGroup(workflowRun, workflow, maxGroup + 1);\n } else {\n await this.completeWorkflow(workflowRun);\n }\n }\n\n // ==========================================================================\n // Private helpers\n // ==========================================================================\n\n private async checkAndResume(stageRecord: any): Promise<void> {\n const { workflowRun } = stageRecord;\n\n const workflow = this.registry.getWorkflow(workflowRun.workflowId);\n if (!workflow) {\n await this.markStageFailed(\n stageRecord.id,\n \"Workflow definition not found\",\n );\n return;\n }\n\n const stageDef = workflow.getStage(stageRecord.stageId);\n if (!stageDef || !stageDef.checkCompletion) {\n await this.markStageFailed(\n stageRecord.id,\n \"Stage does not support batch completion\",\n );\n return;\n }\n\n const storage = this.createStorageShim(\n workflowRun.id,\n workflowRun.workflowType,\n );\n\n const logFn = async (\n level: \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\",\n message: string,\n ) => {\n await this.persistence\n .createLog({\n workflowRunId: workflowRun.id,\n workflowStageId: stageRecord.id,\n level,\n message: `[Runtime] ${message}`,\n })\n .catch((err) => logger.error(\"Failed to create log:\", err));\n };\n\n const completionResult = await stageDef.checkCompletion(\n stageRecord.suspendedState,\n {\n workflowRunId: workflowRun.id,\n stageId: stageRecord.stageId,\n stageRecordId: stageRecord.id, // For LogContext in AIHelper\n config: stageRecord.config || {},\n log: logFn,\n onLog: logFn,\n storage,\n },\n );\n\n logger.debug(\"Stage completion result\", completionResult);\n\n if (completionResult.ready) {\n if (completionResult.output !== undefined) {\n const validatedOutput = stageDef.outputSchema.parse(\n completionResult.output,\n );\n const outputKey = await this.persistence.saveStageOutput(\n workflowRun.id,\n workflowRun.workflowType,\n stageRecord.stageId,\n validatedOutput,\n );\n\n await this.persistence.updateStage(stageRecord.id, {\n status: \"COMPLETED\",\n completedAt: new Date(),\n duration: Date.now() - new Date(stageRecord.startedAt).getTime(),\n outputData: { _artifactKey: outputKey } as any,\n metrics: completionResult.metrics as any,\n embeddingInfo: completionResult.embeddings as any,\n });\n } else {\n await this.persistence.updateStage(stageRecord.id, {\n nextPollAt: null,\n });\n }\n await this.resumeWorkflow(workflowRun, workflow);\n } else if (completionResult.error) {\n await this.markStageFailed(stageRecord.id, completionResult.error);\n await this.persistence.updateRun(workflowRun.id, { status: \"FAILED\" });\n workflowEventBus.emitWorkflowEvent(workflowRun.id, \"workflow:failed\", {\n workflowRunId: workflowRun.id,\n error: completionResult.error,\n });\n } else {\n const nextPollAt = new Date(\n Date.now() + (completionResult.nextCheckIn || this.pollIntervalMs),\n );\n await this.persistence.updateStage(stageRecord.id, { nextPollAt });\n }\n }\n\n private async resumeWorkflow(workflowRun: any, workflow: any): Promise<void> {\n try {\n await this.persistence.updateRun(workflowRun.id, { status: \"RUNNING\" });\n const executor = new WorkflowExecutor(\n workflow,\n workflowRun.id,\n workflowRun.workflowType,\n {\n persistence: this.persistence,\n aiLogger: this.aiCallLogger,\n },\n );\n await executor.execute(workflowRun.input, workflowRun.config || {}, {\n resume: true,\n });\n } catch (error) {\n await this.persistence.updateRun(workflowRun.id, { status: \"FAILED\" });\n workflowEventBus.emitWorkflowEvent(workflowRun.id, \"workflow:failed\", {\n workflowRunId: workflowRun.id,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Create a minimal storage shim for context.storage (for API compatibility).\n */\n private createStorageShim(\n workflowRunId: string,\n workflowType: string,\n ): StageStorage {\n const persistence = this.persistence;\n return {\n async save<T>(key: string, data: T): Promise<void> {\n await persistence.saveArtifact({\n workflowRunId,\n key,\n type: \"ARTIFACT\",\n data,\n size: Buffer.byteLength(JSON.stringify(data), \"utf8\"),\n });\n },\n async load<T>(key: string): Promise<T> {\n return persistence.loadArtifact(workflowRunId, key) as Promise<T>;\n },\n async exists(key: string): Promise<boolean> {\n return persistence.hasArtifact(workflowRunId, key);\n },\n async delete(key: string): Promise<void> {\n return persistence.deleteArtifact(workflowRunId, key);\n },\n getStageKey(stageId: string, suffix?: string): string {\n const base = `workflow-v2/${workflowType}/${workflowRunId}/${stageId}`;\n return suffix ? `${base}/${suffix}` : `${base}/output.json`;\n },\n };\n }\n\n private async markStageFailed(\n stageId: string,\n errorMessage: string,\n ): Promise<void> {\n await this.persistence.updateStage(stageId, {\n status: \"FAILED\",\n completedAt: new Date(),\n errorMessage,\n });\n }\n\n private async enqueueExecutionGroup(\n workflowRun: any,\n workflow: any,\n groupIndex: number,\n ) {\n const stages = workflow.getStagesInExecutionGroup(groupIndex);\n if (stages.length === 0) return;\n\n for (const stage of stages) {\n await this.persistence.createStage({\n workflowRunId: workflowRun.id,\n stageId: stage.id,\n stageName: stage.name,\n stageNumber: workflow.getStageIndex(stage.id) + 1,\n executionGroup: groupIndex,\n status: \"PENDING\",\n config: (workflowRun.config as any)?.[stage.id] || {},\n });\n }\n\n await this.jobQueue.enqueueParallel(\n stages.map((stage: any) => ({\n workflowRunId: workflowRun.id,\n stageId: stage.id,\n priority: workflowRun.priority,\n payload: { config: workflowRun.config || {} },\n })),\n );\n }\n\n private async completeWorkflow(workflowRun: any) {\n const stages = await this.persistence.getStagesByRun(workflowRun.id);\n\n let totalCost = 0,\n totalTokens = 0;\n for (const stage of stages) {\n const metrics = stage.metrics as any;\n if (metrics) {\n totalCost += metrics.cost || 0;\n totalTokens += (metrics.inputTokens || 0) + (metrics.outputTokens || 0);\n }\n }\n\n await this.persistence.updateRun(workflowRun.id, {\n status: \"COMPLETED\",\n completedAt: new Date(),\n duration: Date.now() - new Date(workflowRun.createdAt).getTime(),\n totalCost,\n totalTokens,\n });\n\n workflowEventBus.emitWorkflowEvent(workflowRun.id, \"workflow:completed\", {\n workflowRunId: workflowRun.id,\n output: workflowRun.output || {},\n duration: Date.now() - new Date(workflowRun.createdAt).getTime(),\n totalCost,\n totalTokens,\n });\n\n logger.debug(`Workflow ${workflowRun.id} completed`);\n }\n}\n\n/**\n * Factory function to create a WorkflowRuntime instance\n */\nexport function createWorkflowRuntime(\n config: WorkflowRuntimeConfig,\n): WorkflowRuntime {\n return new WorkflowRuntime(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/workflow.ts","../src/core/config-presets.ts"],"names":["node","z"],"mappings":";;;;;;;;;AA2CO,IAAM,WAAN,MAIL;AAAA,EACA,YACkB,EAAA,EACA,IAAA,EACA,aACA,WAAA,EACA,YAAA,EACC,QACD,WAAA,EAChB;AAPgB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACD,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMH,gBAAA,GAAkC;AAChC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAE5C,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,MAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,cAAc,KAAK,EAAC;AAClD,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,cAAA,EAAgB,KAAK,CAAA;AAAA,IACvC;AAGA,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACnE,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,QAAA,KAAa;AACpC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACjC,MAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,QAAQ,CAAA,UAAA,CAAY,CAAA;AACzD,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAA,EAAmD;AAC1D,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,EAAA,KAAO,OAAO,CAAA;AAC3D,IAAA,OAAO,IAAA,EAAM,KAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA4B;AAC1B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA4B;AAC1B,IAAA,MAAM,aAAA,GAAgB,KAAK,gBAAA,EAAiB;AAC5C,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAChD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAChD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,aAAA,CAAc,MAAM,CAAA,CAAE,CAAA;AACtD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,IAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAE7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,MAAA,MAAM,cAAc,CAAA,GAAI,CAAA;AAExB,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAEtB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA;AACvB,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,WAAW,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,EAAE,CAAA,CAAA,CAAG,CAAA;AACxD,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AAAA,QACtC;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,YAAA,CAAc,CAAA;AACvC,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,UAAA,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,EAAE,CAAA,CAAA,CAAG,CAAA;AAC7C,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AACA,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,WAAA,GAAwB;AACtB,IAAA,OAAO,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,OAAA,EAA0B;AACjC,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,MAAA,EAGb;AACA,IAAA,MAAM,SAAoD,EAAC;AAE3D,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,EAAE,KAAK,EAAC;AAEzC,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,YAAA,CAAa,MAAM,WAAW,CAAA;AAAA,MACtC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,KAAA,YAAiB,EAAE,QAAA,EAAU;AAC/B,UAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CACzB,IAAI,CAAC,CAAA,KAAkB,GAAG,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAC1D,KAAK,IAAI,CAAA;AACZ,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAS,KAAA,CAAM,EAAA;AAAA,YACf,KAAA,EAAO,6BAA6B,aAAa,CAAA;AAAA,WAClD,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAS,KAAA,CAAM,EAAA;AAAA,YACf,KAAA,EAAO,OAAO,KAAK;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CACE,OACA,MAAA,EACQ;AACR,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,MAAM,YAAA,GAAe,KAAA;AAErB,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,MAAA,IAAI,IAAA,CAAK,MAAM,YAAA,EAAc;AAC3B,QAAA,MAAM,cAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,EAAE,KAAK,EAAC;AAC9C,QAAA,SAAA,IAAa,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,WAAW,CAAA;AAAA,MAChE;AAAA,IAGF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAQE;AACA,IAAA,MAAM,UAQF,EAAC;AAEL,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAGnB,MAAA,MAAM,WAAoC,EAAC;AAE3C,MAAA,IAAI,KAAA,CAAM,YAAA,YAAwB,CAAA,CAAE,SAAA,EAAW;AAC7C,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,KAAA;AACjC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtD,UAAA,IAAI,SAAA,GAAY,WAAA;AAGhB,UAAA,IAAI,SAAA,YAAqB,EAAE,WAAA,EAAa;AACtC,YAAA,SAAA,GAAa,UAAU,IAAA,CAAa,SAAA;AAAA,UACtC;AAGA,UAAA,IAAI,SAAA,YAAqB,EAAE,UAAA,EAAY;AACrC,YAAA,MAAM,cAAA,GAAkB,UAAU,IAAA,CAAa,YAAA;AAC/C,YAAA,QAAA,CAAS,GAAG,CAAA,GACV,OAAO,cAAA,KAAmB,UAAA,GACtB,gBAAe,GACf,cAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,GAAI;AAAA,QAClB,QAAQ,KAAA,CAAM,YAAA;AAAA,QACd,QAAA;AAAA,QACA,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,aAAa,KAAA,CAAM;AAAA,OACrB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAA4D;AAC1D,IAAA,MAAM,YAAA,GAAe,KAAK,eAAA,EAAgB;AAC1C,IAAA,MAAM,SAAkD,EAAC;AAEzD,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC1D,MAAA,MAAA,CAAO,OAAO,IAAI,IAAA,CAAK,QAAA;AAAA,IACzB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAIA,0BAA0B,UAAA,EAA4C;AACpE,IAAA,OAAO,IAAA,CAAK,MAAA,CACT,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,cAAA,KAAmB,UAAU,CAAA,CACnD,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAA,EAAyB;AACrC,IAAA,OAAO,IAAA,CAAK,OAAO,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,OAAA,EAAyB;AAC9C,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA,CAAK,CAACA,KAAAA,KAASA,KAAAA,CAAK,KAAA,CAAM,EAAA,KAAO,OAAO,CAAA;AACjE,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,OAAO,CAAA,sBAAA,CAAwB,CAAA;AACnE,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAA,EAAqC;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AACxC,IAAA,IAAI,KAAA,IAAS,GAAG,OAAO,MAAA;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAC,EAAE,KAAA,CAAM,EAAA;AAAA,EACtC;AACF;AAMO,IAAM,kBAAN,MAIL;AAAA,EAIA,WAAA,CACU,EAAA,EACA,IAAA,EACA,WAAA,EACA,aACA,mBAAA,EACR;AALQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA;AAAA,EACP;AAAA,EATK,SAAsB,EAAC;AAAA,EACvB,qBAAA,GAAwB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBhC,KAME,KAAA,EAKA;AAEA,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,MAAM,gBAAA,GAAmB,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,EAAE,CAAA;AAC1D,MAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,MAAA;AAAA,QACrC,CAAC,GAAA,KAAQ,CAAC,gBAAA,CAAiB,SAAS,GAAG;AAAA,OACzC;AAEA,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,UAAU,KAAA,CAAM,EAAE,+BAA+B,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,qDAAA,EACf,MAAM,EAAE,CAAA,mBAAA,EAE5D,iBAAiB,MAAA,KAAW,CAAA,GACxB,WACA,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAChC,CAAA;AAAA,SACJ;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,qBAAA,EAAA;AAEL,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MACf,KAAA;AAAA,MACA,gBAAgB,IAAA,CAAK;AAAA,KACtB,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,IAAA;AAKhB,IAAC,OAAA,CAAgB,sBAAsB,KAAA,CAAM,YAAA;AAE7C,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,SAOE,MAAA,EAaA;AAEA,IAAA,MAAM,gBAAA,GAAmB,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,EAAE,CAAA;AAE1D,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,MAAA;AAAA,UACrC,CAAC,GAAA,KAAQ,CAAC,gBAAA,CAAiB,SAAS,GAAG;AAAA,SACzC;AAEA,QAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,gDAAA,EAAmD,WAAA,CAAY,IAAA;AAAA,cAC/E;AAAA,aACD,4FAGG,gBAAA,CAAiB,MAAA,KAAW,IACxB,QAAA,GACA,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAChC,CAAA;AAAA,WACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,qBAAA,EAAA;AAGL,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,QACf,KAAA;AAAA,QACA,gBAAgB,IAAA,CAAK;AAAA,OACtB,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,eAAe,CAAA,CAAE,MAAA;AAAA,MACrB,MAAA,CAAO,MAAA;AAAA,QACL,CAAC,GAAA,EAAK,KAAA,EAAO,KAAA,KAAU;AACrB,UAAA,GAAA,CAAI,KAAK,IAAI,KAAA,CAAM,YAAA;AACnB,UAAA,OAAO,GAAA;AAAA,QACT,CAAA;AAAA,QACA;AAAC;AACH,KACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA;AAahB,IAAA,OAAA,CAAQ,mBAAA,GAAsB,YAAA;AAE9B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAoD;AAClD,IAAA,OAAO,IAAI,QAAA;AAAA,MACT,IAAA,CAAK,EAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK,mBAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AACF;AC/eO,IAAM,cAAA,GAAiBC,EAAE,MAAA,CAAO;AAAA;AAAA,EAErC,KAAA,EAAO,QAAA,CAAS,OAAA,CAAQ,kBAAkB,CAAA;AAAA;AAAA,EAE1C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,EAEjD,WAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACnC,CAAC;AAOM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE9C,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAE5C,SAASA,CAAAA,CAAE,MAAA,GAAS,WAAA,EAAY,CAAE,QAAQ,CAAC,CAAA;AAAA;AAAA,EAE3C,YAAYA,CAAAA,CAAE,MAAA,GAAS,WAAA,EAAY,CAAE,QAAQ,CAAC;AAChD,CAAC;AAOM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE/C,YAAA,EAAcA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,EAAE;AAC5D,CAAC;AAOM,IAAM,iBAAA,GAAoBA,EAAE,MAAA,CAAO;AAAA;AAAA,EAExC,OAAA,EAASA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA;AAAA,EAElC,MAAA,EAAQA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK;AACnC,CAAC;AAmBM,SAAS,aAAsC,MAAA,EAAwB;AAC5E,EAAA,OAAO,MAAA,CAAO,MAAM,cAAc,CAAA;AACpC;AAaO,SAAS,gBACd,MAAA,EACA;AACA,EAAA,OAAO,MAAA,CAAO,MAAM,uBAAuB,CAAA;AAC7C;AAaO,SAAS,iBACd,MAAA,EACA;AACA,EAAA,OAAO,MAAA,CAAO,MAAM,wBAAwB,CAAA;AAC9C;AAiCO,SAAS,mBACd,MAAA,EACA;AACA,EAAA,OAAO,MAAA,CACJ,MAAM,cAAc,CAAA,CACpB,MAAM,uBAAuB,CAAA,CAC7B,MAAM,wBAAwB,CAAA;AACnC;AAiDiCA,CAAAA,CAAE,MAAA,CAAO,EAAE;AAKPA,EAAE,MAAA,CAAO;AAAA,EAC5C,KAAA,EAAO,QAAA,CAAS,OAAA,CAAQ,kBAAkB,CAAA;AAAA,EAC1C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAG;AACnD,CAAC","file":"index.js","sourcesContent":["/**\n * Workflow Builder - Fluent API for composing type-safe workflows\n *\n * Workflows are composed of stages that are executed sequentially or in parallel.\n * The builder ensures type safety: output of one stage matches input of next stage.\n *\n * ## Type System Features\n *\n * ### Automatic Context Inference\n * The workflow context type is automatically accumulated as you pipe stages.\n * Use `InferWorkflowContext<typeof workflow>` to extract the context type.\n *\n * ```typescript\n * const workflow = new WorkflowBuilder(...)\n * .pipe(stage1)\n * .pipe(stage2)\n * .build();\n *\n * // Auto-generated type\n * type MyContext = InferWorkflowContext<typeof workflow>;\n * // = { \"stage-1\": Stage1Output, \"stage-2\": Stage2Output }\n * ```\n *\n * ### Stage ID Constants\n * Use `workflow.stageIds` for type-safe stage ID references.\n */\n\nimport { z } from \"zod\";\nimport type { Stage } from \"./stage\";\n\n// ============================================================================\n// Stage Node - Represents a stage in the execution plan\n// ============================================================================\n\nexport interface StageNode {\n stage: Stage<any, any, any>;\n executionGroup: number; // For parallel execution grouping\n}\n\n// ============================================================================\n// Workflow - Complete workflow definition\n// ============================================================================\n\nexport class Workflow<\n TInput extends z.ZodTypeAny,\n TOutput extends z.ZodTypeAny,\n TContext extends Record<string, unknown> = {},\n> {\n constructor(\n public readonly id: string,\n public readonly name: string,\n public readonly description: string,\n public readonly inputSchema: TInput,\n public readonly outputSchema: TOutput,\n private readonly stages: StageNode[],\n public readonly contextType?: TContext, // Type-only, for inference\n ) {}\n\n /**\n * Get execution plan as groups of stages\n * Stages in the same group can be executed in parallel\n */\n getExecutionPlan(): StageNode[][] {\n const groups = new Map<number, StageNode[]>();\n\n for (const node of this.stages) {\n const group = groups.get(node.executionGroup) || [];\n group.push(node);\n groups.set(node.executionGroup, group);\n }\n\n // Return groups in order\n const sortedGroups = Array.from(groups.keys()).sort((a, b) => a - b);\n return sortedGroups.map((groupNum) => {\n const group = groups.get(groupNum);\n if (!group) throw new Error(`Group ${groupNum} not found`);\n return group;\n });\n }\n\n /**\n * Get a specific stage by ID\n */\n getStage(stageId: string): Stage<any, any, any> | undefined {\n const node = this.stages.find((n) => n.stage.id === stageId);\n return node?.stage;\n }\n\n /**\n * Get all stages in order\n */\n getAllStages(): StageNode[] {\n return [...this.stages];\n }\n\n /**\n * Get a visual representation of the workflow execution order\n */\n getExecutionOrder(): string {\n const executionPlan = this.getExecutionPlan();\n const lines: string[] = [];\n\n lines.push(`Workflow: ${this.name} (${this.id})`);\n lines.push(`Total stages: ${this.stages.length}`);\n lines.push(`Execution groups: ${executionPlan.length}`);\n lines.push(\"\");\n lines.push(\"Execution Order:\");\n lines.push(\"================\");\n\n for (let i = 0; i < executionPlan.length; i++) {\n const group = executionPlan[i];\n const groupNumber = i + 1;\n\n if (group.length === 1) {\n // Sequential stage\n const stage = group[0].stage;\n lines.push(`${groupNumber}. ${stage.name} (${stage.id})`);\n if (stage.description) {\n lines.push(` ${stage.description}`);\n }\n } else {\n // Parallel stages\n lines.push(`${groupNumber}. [PARALLEL]`);\n for (const node of group) {\n const stage = node.stage;\n lines.push(` - ${stage.name} (${stage.id})`);\n if (stage.description) {\n lines.push(` ${stage.description}`);\n }\n }\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Get all stage IDs in execution order\n *\n * @returns Array of stage IDs\n *\n * @example\n * ```typescript\n * const ids = workflow.getStageIds();\n * // [\"data-extraction\", \"guidelines\", \"generator\"]\n * ```\n */\n getStageIds(): string[] {\n return this.stages.map((node) => node.stage.id);\n }\n\n /**\n * Check if a stage ID exists in this workflow\n *\n * @param stageId - The stage ID to check\n * @returns true if the stage exists\n */\n hasStage(stageId: string): boolean {\n return this.stages.some((node) => node.stage.id === stageId);\n }\n\n /**\n * Validate workflow configuration before execution\n * Checks that all stage configs match their schemas\n *\n * @param config - Configuration object with keys matching stage IDs\n * @returns Validation result with any errors\n */\n validateConfig(config: Record<string, unknown>): {\n valid: boolean;\n errors: Array<{ stageId: string; error: string }>;\n } {\n const errors: Array<{ stageId: string; error: string }> = [];\n\n for (const node of this.stages) {\n const stage = node.stage;\n const stageConfig = config[stage.id] || {};\n\n try {\n stage.configSchema.parse(stageConfig);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errorMessages = error.issues\n .map((e: z.ZodIssue) => `${e.path.join(\".\")}: ${e.message}`)\n .join(\"; \");\n errors.push({\n stageId: stage.id,\n error: `Config validation failed: ${errorMessages}`,\n });\n } else {\n errors.push({\n stageId: stage.id,\n error: String(error),\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Estimate total cost for the workflow\n */\n estimateCost(\n input: z.infer<TInput>,\n config: Record<string, unknown>,\n ): number {\n let totalCost = 0;\n const currentInput = input;\n\n for (const node of this.stages) {\n if (node.stage.estimateCost) {\n const stageConfig = config[node.stage.id] || {};\n totalCost += node.stage.estimateCost(currentInput, stageConfig);\n }\n // Note: We can't accurately propagate input for estimation without execution\n // This is a rough estimate only\n }\n\n return totalCost;\n }\n\n /**\n * Get configuration schemas for all stages in this workflow\n * Returns a map of stageId → { schema, defaults, name, description }\n */\n getStageConfigs(): Record<\n string,\n {\n schema: z.ZodTypeAny;\n defaults: Record<string, unknown>;\n name: string;\n description?: string;\n }\n > {\n const configs: Record<\n string,\n {\n schema: z.ZodTypeAny;\n defaults: Record<string, unknown>;\n name: string;\n description?: string;\n }\n > = {};\n\n for (const node of this.stages) {\n const stage = node.stage;\n\n // Extract defaults from schema\n const defaults: Record<string, unknown> = {};\n\n if (stage.configSchema instanceof z.ZodObject) {\n const shape = stage.configSchema.shape as Record<string, z.ZodTypeAny>;\n for (const [key, fieldSchema] of Object.entries(shape)) {\n let unwrapped = fieldSchema;\n\n // Unwrap ZodOptional if present\n if (unwrapped instanceof z.ZodOptional) {\n unwrapped = (unwrapped._def as any).innerType;\n }\n\n // Check for ZodDefault\n if (unwrapped instanceof z.ZodDefault) {\n const defaultValueFn = (unwrapped._def as any).defaultValue;\n defaults[key] =\n typeof defaultValueFn === \"function\"\n ? defaultValueFn()\n : defaultValueFn;\n }\n }\n }\n\n configs[stage.id] = {\n schema: stage.configSchema,\n defaults,\n name: stage.name,\n description: stage.description,\n };\n }\n\n return configs;\n }\n\n /**\n * Generate default configuration object for all stages\n * Automatically discovers all stage configs - add/remove stages and this updates automatically\n */\n getDefaultConfig(): Record<string, Record<string, unknown>> {\n const stageConfigs = this.getStageConfigs();\n const config: Record<string, Record<string, unknown>> = {};\n\n for (const [stageId, meta] of Object.entries(stageConfigs)) {\n config[stageId] = meta.defaults;\n }\n\n return config;\n }\n /**\n * Get all stages in a specific execution group\n */\n getStagesInExecutionGroup(groupIndex: number): Stage<any, any, any>[] {\n return this.stages\n .filter((node) => node.executionGroup === groupIndex)\n .map((node) => node.stage);\n }\n\n /**\n * Get the sequential index of a stage (0-based)\n */\n getStageIndex(stageId: string): number {\n return this.stages.findIndex((node) => node.stage.id === stageId);\n }\n\n /**\n * Get the execution group index for a stage\n */\n getExecutionGroupIndex(stageId: string): number {\n const node = this.stages.find((node) => node.stage.id === stageId);\n if (!node) throw new Error(`Stage ${stageId} not found in workflow`);\n return node.executionGroup;\n }\n\n /**\n * Get the ID of the stage immediately preceding the given stage\n */\n getPreviousStageId(stageId: string): string | undefined {\n const index = this.getStageIndex(stageId);\n if (index <= 0) return undefined;\n return this.stages[index - 1].stage.id;\n }\n}\n\n// ============================================================================\n// Workflow Builder - Fluent API with Context Accumulation\n// ============================================================================\n\nexport class WorkflowBuilder<\n TInput extends z.ZodTypeAny,\n TCurrentOutput extends z.ZodTypeAny,\n TContext extends Record<string, unknown> = {},\n> {\n private stages: StageNode[] = [];\n private currentExecutionGroup = 0;\n\n constructor(\n private id: string,\n private name: string,\n private description: string,\n private inputSchema: TInput,\n private currentOutputSchema: TCurrentOutput,\n ) {}\n\n /**\n * Add a stage to the workflow (sequential execution)\n *\n * Automatically accumulates the stage's output in the context under its stage ID.\n * This provides type-safe access to all previous stage outputs.\n *\n * Note: This accepts any stage regardless of strict input type matching.\n * This is necessary because stages using passthrough() can accept objects\n * with additional fields beyond what's declared in their input schema.\n * Runtime validation via Zod ensures type safety at execution time.\n *\n * Validates that all declared dependencies exist in the workflow.\n */\n pipe<\n TStageInput extends z.ZodTypeAny,\n TStageOutput extends z.ZodTypeAny,\n TStageConfig extends z.ZodTypeAny,\n TStageContext extends Record<string, unknown>,\n >(\n stage: Stage<TStageInput, TStageOutput, TStageConfig, TStageContext>,\n ): WorkflowBuilder<\n TInput,\n TStageOutput,\n TContext & { [x: string]: z.infer<TStageOutput> }\n > {\n // Validate stage dependencies\n if (stage.dependencies) {\n const existingStageIds = this.stages.map((s) => s.stage.id);\n const missingDeps = stage.dependencies.filter(\n (dep) => !existingStageIds.includes(dep),\n );\n\n if (missingDeps.length > 0) {\n throw new Error(\n `Stage \"${stage.id}\" has missing dependencies: ${missingDeps.join(\", \")}. ` +\n `These stages must be added to the workflow before \"${stage.id}\". ` +\n `Current stages: ${\n existingStageIds.length === 0\n ? \"(none)\"\n : existingStageIds.join(\", \")\n }`,\n );\n }\n }\n\n this.currentExecutionGroup++;\n\n this.stages.push({\n stage: stage as Stage<any, any, any, any>,\n executionGroup: this.currentExecutionGroup,\n });\n\n // Return builder with new output type and accumulated context\n const builder = this as unknown as WorkflowBuilder<\n TInput,\n TStageOutput,\n TContext & { [x: string]: z.infer<TStageOutput> }\n >;\n (builder as any).currentOutputSchema = stage.outputSchema;\n\n return builder;\n }\n\n /**\n * Add a stage with strict input type checking\n *\n * Note: pipeStrict() and pipeLoose() have been removed as they were\n * just aliases for pipe(). Use pipe() for all stage chaining.\n */\n\n /**\n * Add multiple stages that execute in parallel\n *\n * All stages receive the same input (current output)\n * Their outputs are merged into an object by index AND accumulated in context by stage ID.\n *\n * Note: This accepts stages regardless of strict input type matching.\n * This is necessary because stages using passthrough() can accept objects\n * with additional fields. Runtime validation via Zod ensures type safety.\n *\n * Validates that all declared dependencies exist in the workflow.\n */\n parallel<\n TStages extends {\n id: string;\n outputSchema: z.ZodTypeAny;\n dependencies?: string[];\n }[],\n >(\n stages: [...TStages],\n ): WorkflowBuilder<\n TInput,\n z.ZodTypeAny,\n TContext & {\n [K in TStages[number][\"id\"]]: TStages[number] extends {\n outputSchema: infer O;\n }\n ? O extends z.ZodTypeAny\n ? z.infer<O>\n : never\n : never;\n }\n > {\n // Validate dependencies for all parallel stages\n const existingStageIds = this.stages.map((s) => s.stage.id);\n\n for (const stage of stages) {\n if (stage.dependencies) {\n const missingDeps = stage.dependencies.filter(\n (dep) => !existingStageIds.includes(dep),\n );\n\n if (missingDeps.length > 0) {\n throw new Error(\n `Stage \"${stage.id}\" (in parallel group) has missing dependencies: ${missingDeps.join(\n \", \",\n )}. ` +\n `These stages must be added to the workflow before this parallel group. ` +\n `Current stages: ${\n existingStageIds.length === 0\n ? \"(none)\"\n : existingStageIds.join(\", \")\n }`,\n );\n }\n }\n }\n\n this.currentExecutionGroup++;\n\n // Add all stages to same execution group\n for (const stage of stages) {\n this.stages.push({\n stage: stage as Stage<any, any, any, any>,\n executionGroup: this.currentExecutionGroup,\n });\n }\n\n // Create merged output schema\n const mergedSchema = z.object(\n stages.reduce(\n (acc, stage, index) => {\n acc[index] = stage.outputSchema;\n return acc;\n },\n {} as Record<number, z.ZodTypeAny>,\n ),\n ) as any;\n\n const builder = this as unknown as WorkflowBuilder<\n TInput,\n any,\n TContext & {\n [K in TStages[number][\"id\"]]: TStages[number] extends Stage<\n any,\n infer O,\n any\n >\n ? z.infer<O>\n : never;\n }\n >;\n builder.currentOutputSchema = mergedSchema;\n\n return builder as any;\n }\n\n /**\n * Build the final workflow\n */\n build(): Workflow<TInput, TCurrentOutput, TContext> {\n return new Workflow(\n this.id,\n this.name,\n this.description,\n this.inputSchema,\n this.currentOutputSchema,\n this.stages,\n );\n }\n\n /**\n * Get current stage count\n */\n getStageCount(): number {\n return this.stages.length;\n }\n\n /**\n * Get execution group count\n */\n getExecutionGroupCount(): number {\n return this.currentExecutionGroup;\n }\n}\n\n// ============================================================================\n// Type Inference Utilities (Supplementary to Code Generator)\n// ============================================================================\n\n/**\n * NOTE: For most use cases, prefer using the generated types from `__generated__.ts`\n * which are created by running `pnpm generate:workflow-types`.\n *\n * These inference utilities are useful for:\n * - Quick prototyping before running the generator\n * - Dynamic workflows not covered by the generator\n * - Type assertions in tests\n */\n\n/**\n * Extract the workflow context type from a Workflow instance\n *\n * The workflow context type is automatically accumulated as stages are piped.\n * Each stage's output is added to the context under its stage ID.\n *\n * @example\n * ```typescript\n * const workflow = new WorkflowBuilder(...)\n * .pipe(dataExtractionStage) // id: \"data-extraction\"\n * .pipe(guidelinesStage) // id: \"guidelines\"\n * .build();\n *\n * // Extract context type automatically\n * type MyWorkflowContext = InferWorkflowContext<typeof workflow>;\n * // = {\n * // \"data-extraction\": DataExtractionOutput;\n * // \"guidelines\": GuidelinesOutput;\n * // }\n *\n * // Use in stage definitions\n * export const myStage = defineStage<\n * \"none\",\n * typeof OutputSchema,\n * typeof ConfigSchema,\n * MyWorkflowContext\n * >({ ... });\n * ```\n */\nexport type InferWorkflowContext<W> = W extends Workflow<any, any, infer C>\n ? C\n : never;\n\n/**\n * Extract the input type from a Workflow instance\n *\n * @example\n * ```typescript\n * type Input = InferWorkflowInput<typeof myWorkflow>;\n * ```\n */\nexport type InferWorkflowInput<W> = W extends Workflow<infer I, any, any>\n ? z.infer<I>\n : never;\n\n/**\n * Extract the output type from a Workflow instance\n *\n * @example\n * ```typescript\n * type Output = InferWorkflowOutput<typeof myWorkflow>;\n * ```\n */\nexport type InferWorkflowOutput<W> = W extends Workflow<any, infer O, any>\n ? z.infer<O>\n : never;\n\n/**\n * Extract stage IDs as a union type from a Workflow instance\n *\n * Useful for creating type-safe stage ID references.\n *\n * @example\n * ```typescript\n * type StageId = InferWorkflowStageIds<typeof myWorkflow>;\n * // = \"data-extraction\" | \"guidelines\" | \"generator\"\n *\n * function getStageOutput(stageId: StageId) { ... }\n * ```\n */\nexport type InferWorkflowStageIds<W> = W extends Workflow<any, any, infer C>\n ? keyof C & string\n : never;\n\n/**\n * Get the output type for a specific stage ID from a Workflow\n *\n * @example\n * ```typescript\n * type DataOutput = InferStageOutputById<typeof workflow, \"data-extraction\">;\n * ```\n */\nexport type InferStageOutputById<W, K extends string> = W extends Workflow<\n any,\n any,\n infer C\n>\n ? K extends keyof C\n ? C[K]\n : never\n : never;\n","/**\n * Config Presets - Common configuration patterns for workflow stages\n *\n * These presets provide standardized schemas for common stage configurations,\n * reducing boilerplate and ensuring consistency across stages.\n *\n * @example\n * ```typescript\n * import { defineStage } from \"./stage-factory\";\n * import { withAIConfig, withStandardConfig } from \"./config-presets\";\n *\n * // Use AI-focused config preset\n * const myStage = defineStage({\n * id: \"my-stage\",\n * name: \"My Stage\",\n * schemas: {\n * input: z.object({ data: z.string() }),\n * output: z.object({ result: z.string() }),\n * config: withAIConfig(z.object({\n * customField: z.string(),\n * })),\n * },\n * async execute(ctx) {\n * // ctx.config.model, ctx.config.temperature available\n * // plus ctx.config.customField\n * },\n * });\n *\n * // Use standard config preset (includes AI + concurrency + feature flags)\n * const fullStage = defineStage({\n * id: \"full-stage\",\n * name: \"Full Stage\",\n * schemas: {\n * input: \"none\",\n * output: z.object({ result: z.string() }),\n * config: withStandardConfig(z.object({\n * specificOption: z.boolean().default(true),\n * })),\n * },\n * async execute(ctx) {\n * // All standard config + custom fields available\n * },\n * });\n * ```\n */\n\nimport { z } from \"zod\";\nimport { ModelKey } from \"../ai/model-helper\";\n\n// ============================================================================\n// Base Config Schemas\n// ============================================================================\n\n/**\n * AI/LLM configuration options\n */\nexport const AIConfigSchema = z.object({\n /** The model to use for AI operations */\n model: ModelKey.default(\"gemini-2.5-flash\"),\n /** Temperature for AI generations (0-2) */\n temperature: z.number().min(0).max(2).default(0.7),\n /** Maximum tokens to generate (undefined = model default) */\n maxTokens: z.number().positive().optional(),\n});\n\nexport type AIConfig = z.infer<typeof AIConfigSchema>;\n\n/**\n * Concurrency and rate limiting configuration\n */\nexport const ConcurrencyConfigSchema = z.object({\n /** Maximum concurrent operations (for parallel processing) */\n concurrency: z.number().positive().default(5),\n /** Delay between operations in milliseconds (rate limiting) */\n delayMs: z.number().nonnegative().default(0),\n /** Maximum retries on failure */\n maxRetries: z.number().nonnegative().default(3),\n});\n\nexport type ConcurrencyConfig = z.infer<typeof ConcurrencyConfigSchema>;\n\n/**\n * Feature flag configuration for conditional behavior\n */\nexport const FeatureFlagsConfigSchema = z.object({\n /** Feature flags for conditional stage behavior */\n featureFlags: z.record(z.string(), z.boolean()).default({}),\n});\n\nexport type FeatureFlagsConfig = z.infer<typeof FeatureFlagsConfigSchema>;\n\n/**\n * Logging and debugging configuration\n */\nexport const DebugConfigSchema = z.object({\n /** Enable verbose logging */\n verbose: z.boolean().default(false),\n /** Dry run mode (no side effects) */\n dryRun: z.boolean().default(false),\n});\n\nexport type DebugConfig = z.infer<typeof DebugConfigSchema>;\n\n// ============================================================================\n// Preset Combinators\n// ============================================================================\n\n/**\n * Add AI configuration to any schema\n *\n * @example\n * ```typescript\n * const myConfig = withAIConfig(z.object({\n * customField: z.string(),\n * }));\n * // Result has: model, temperature, maxTokens, customField\n * ```\n */\nexport function withAIConfig<T extends z.ZodRawShape>(schema: z.ZodObject<T>) {\n return schema.merge(AIConfigSchema);\n}\n\n/**\n * Add concurrency configuration to any schema\n *\n * @example\n * ```typescript\n * const myConfig = withConcurrency(z.object({\n * items: z.array(z.string()),\n * }));\n * // Result has: concurrency, delayMs, maxRetries, items\n * ```\n */\nexport function withConcurrency<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n) {\n return schema.merge(ConcurrencyConfigSchema);\n}\n\n/**\n * Add feature flags configuration to any schema\n *\n * @example\n * ```typescript\n * const myConfig = withFeatureFlags(z.object({\n * setting: z.boolean(),\n * }));\n * // Result has: featureFlags, setting\n * ```\n */\nexport function withFeatureFlags<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n) {\n return schema.merge(FeatureFlagsConfigSchema);\n}\n\n/**\n * Add debug configuration to any schema\n *\n * @example\n * ```typescript\n * const myConfig = withDebug(z.object({\n * processType: z.string(),\n * }));\n * // Result has: verbose, dryRun, processType\n * ```\n */\nexport function withDebug<T extends z.ZodRawShape>(schema: z.ZodObject<T>) {\n return schema.merge(DebugConfigSchema);\n}\n\n/**\n * Standard config preset combining AI + Concurrency + Feature Flags\n *\n * This is the recommended preset for most stages that need:\n * - AI/LLM operations\n * - Parallel processing\n * - Feature flagging\n *\n * @example\n * ```typescript\n * const myConfig = withStandardConfig(z.object({\n * customOption: z.boolean().default(true),\n * }));\n * // Result has all standard fields plus customOption\n * ```\n */\nexport function withStandardConfig<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n) {\n return schema\n .merge(AIConfigSchema)\n .merge(ConcurrencyConfigSchema)\n .merge(FeatureFlagsConfigSchema);\n}\n\n/**\n * Full config preset with all available options including debug\n *\n * @example\n * ```typescript\n * const myConfig = withFullConfig(z.object({\n * specificField: z.number(),\n * }));\n * // Result has AI + Concurrency + FeatureFlags + Debug + specificField\n * ```\n */\nexport function withFullConfig<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n) {\n return schema\n .merge(AIConfigSchema)\n .merge(ConcurrencyConfigSchema)\n .merge(FeatureFlagsConfigSchema)\n .merge(DebugConfigSchema);\n}\n\n// ============================================================================\n// Preset Type Helpers\n// ============================================================================\n\n/**\n * Extract the inferred type from a config created with presets\n */\nexport type InferConfig<T extends z.ZodTypeAny> = z.infer<T>;\n\n/**\n * Standard config type (AI + Concurrency + FeatureFlags)\n */\nexport type StandardConfig = AIConfig & ConcurrencyConfig & FeatureFlagsConfig;\n\n/**\n * Full config type (Standard + Debug)\n */\nexport type FullConfig = StandardConfig & DebugConfig;\n\n// ============================================================================\n// Utility Schemas\n// ============================================================================\n\n/**\n * Empty config schema - for stages that don't need configuration\n */\nexport const EmptyConfigSchema = z.object({});\n\n/**\n * Minimal AI config - just model and temperature\n */\nexport const MinimalAIConfigSchema = z.object({\n model: ModelKey.default(\"gemini-2.5-flash\"),\n temperature: z.number().min(0).max(2).default(0.7),\n});\n\nexport type MinimalAIConfig = z.infer<typeof MinimalAIConfigSchema>;\n"]}
|