flowcraft 1.0.0 → 2.1.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 +37 -134
- package/dist/analysis.d.ts +43 -0
- package/dist/analysis.js +3 -0
- package/dist/chunk-4PELJWF7.js +29 -0
- package/dist/chunk-4PELJWF7.js.map +1 -0
- package/dist/chunk-55J6XMHW.js +3 -0
- package/dist/{chunk-7XUN3OQT.js.map → chunk-55J6XMHW.js.map} +1 -1
- package/dist/chunk-5EHIPX23.js +202 -0
- package/dist/chunk-5EHIPX23.js.map +1 -0
- package/dist/chunk-5QMPFUKA.js +40 -0
- package/dist/chunk-5QMPFUKA.js.map +1 -0
- package/dist/chunk-5ZWYSKMH.js +147 -0
- package/dist/chunk-5ZWYSKMH.js.map +1 -0
- package/dist/chunk-5ZXV3R5D.js +28 -0
- package/dist/chunk-5ZXV3R5D.js.map +1 -0
- package/dist/chunk-CO5BTPKI.js +410 -0
- package/dist/chunk-CO5BTPKI.js.map +1 -0
- package/dist/chunk-CSZ6EOWG.js +61 -0
- package/dist/chunk-CSZ6EOWG.js.map +1 -0
- package/dist/chunk-CYHZ2YVH.js +24 -0
- package/dist/chunk-CYHZ2YVH.js.map +1 -0
- package/dist/chunk-DSYAC4WB.js +27 -0
- package/dist/chunk-DSYAC4WB.js.map +1 -0
- package/dist/chunk-HMR2GEGE.js +3 -0
- package/dist/{chunk-F2RSES6P.js.map → chunk-HMR2GEGE.js.map} +1 -1
- package/dist/chunk-HN72TZY5.js +110 -0
- package/dist/chunk-HN72TZY5.js.map +1 -0
- package/dist/chunk-KWQHFT7E.js +49 -0
- package/dist/chunk-KWQHFT7E.js.map +1 -0
- package/dist/chunk-PH2IYZHV.js +48 -0
- package/dist/chunk-PH2IYZHV.js.map +1 -0
- package/dist/chunk-QRMUKDSP.js +141 -0
- package/dist/chunk-QRMUKDSP.js.map +1 -0
- package/dist/chunk-UETC63DP.js +65 -0
- package/dist/chunk-UETC63DP.js.map +1 -0
- package/dist/chunk-UMXW3TCY.js +165 -0
- package/dist/chunk-UMXW3TCY.js.map +1 -0
- package/dist/context.d.ts +23 -105
- package/dist/context.js +1 -1
- package/dist/errors.d.ts +15 -31
- package/dist/errors.js +1 -1
- package/dist/evaluator.d.ts +30 -0
- package/dist/evaluator.js +3 -0
- package/dist/evaluator.js.map +1 -0
- package/dist/flow.d.ts +55 -0
- package/dist/flow.js +4 -0
- package/dist/flow.js.map +1 -0
- package/dist/index.d.ts +15 -16
- package/dist/index.js +17 -25
- package/dist/linter.d.ts +24 -0
- package/dist/linter.js +4 -0
- package/dist/linter.js.map +1 -0
- package/dist/logger.d.ts +15 -40
- package/dist/logger.js +1 -1
- package/dist/node.d.ts +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/dist/runtime/adapter.d.ts +94 -0
- package/dist/runtime/adapter.js +15 -0
- package/dist/runtime/adapter.js.map +1 -0
- package/dist/runtime/executors.d.ts +26 -0
- package/dist/runtime/executors.js +4 -0
- package/dist/runtime/executors.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.js +16 -0
- package/dist/runtime/runtime.d.ts +34 -0
- package/dist/runtime/runtime.js +14 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/state.d.ts +21 -0
- package/dist/runtime/state.js +4 -0
- package/dist/runtime/state.js.map +1 -0
- package/dist/runtime/traverser.d.ts +25 -0
- package/dist/runtime/traverser.js +5 -0
- package/dist/runtime/traverser.js.map +1 -0
- package/dist/runtime/types.d.ts +15 -0
- package/dist/runtime/types.js +3 -0
- package/dist/sanitizer.d.ts +10 -0
- package/dist/sanitizer.js +3 -0
- package/dist/{utils/sanitize.js.map → sanitizer.js.map} +1 -1
- package/dist/serializer.d.ts +16 -0
- package/dist/serializer.js +3 -0
- package/dist/serializer.js.map +1 -0
- package/dist/types-lG3xCzp_.d.ts +206 -0
- package/dist/types.d.ts +1 -3
- package/dist/types.js +1 -1
- package/package.json +10 -21
- package/LICENSE +0 -21
- package/dist/builder/graph/graph.d.ts +0 -57
- package/dist/builder/graph/graph.js +0 -21
- package/dist/builder/graph/graph.js.map +0 -1
- package/dist/builder/graph/index.d.ts +0 -8
- package/dist/builder/graph/index.js +0 -23
- package/dist/builder/graph/internal-nodes.d.ts +0 -59
- package/dist/builder/graph/internal-nodes.js +0 -20
- package/dist/builder/graph/internal-nodes.js.map +0 -1
- package/dist/builder/graph/runner.d.ts +0 -51
- package/dist/builder/graph/runner.js +0 -21
- package/dist/builder/graph/runner.js.map +0 -1
- package/dist/builder/graph/types.d.ts +0 -3
- package/dist/builder/graph/types.js +0 -3
- package/dist/builder/index.d.ts +0 -8
- package/dist/builder/index.js +0 -24
- package/dist/builder/index.js.map +0 -1
- package/dist/builder/patterns.d.ts +0 -136
- package/dist/builder/patterns.js +0 -19
- package/dist/builder/patterns.js.map +0 -1
- package/dist/chunk-3YMBNZ77.js +0 -441
- package/dist/chunk-3YMBNZ77.js.map +0 -1
- package/dist/chunk-64DNBF5W.js +0 -36
- package/dist/chunk-64DNBF5W.js.map +0 -1
- package/dist/chunk-6QCXIRLA.js +0 -18
- package/dist/chunk-6QCXIRLA.js.map +0 -1
- package/dist/chunk-7XUN3OQT.js +0 -3
- package/dist/chunk-AOHBHYF6.js +0 -7
- package/dist/chunk-AOHBHYF6.js.map +0 -1
- package/dist/chunk-BRFMFLR6.js +0 -85
- package/dist/chunk-BRFMFLR6.js.map +0 -1
- package/dist/chunk-ELEHMJPM.js +0 -13
- package/dist/chunk-ELEHMJPM.js.map +0 -1
- package/dist/chunk-F2RSES6P.js +0 -3
- package/dist/chunk-F6C6J7HK.js +0 -3
- package/dist/chunk-F6C6J7HK.js.map +0 -1
- package/dist/chunk-GMKJ34T2.js +0 -3
- package/dist/chunk-GMKJ34T2.js.map +0 -1
- package/dist/chunk-HEO3XL4Z.js +0 -328
- package/dist/chunk-HEO3XL4Z.js.map +0 -1
- package/dist/chunk-IIKTTIW5.js +0 -56
- package/dist/chunk-IIKTTIW5.js.map +0 -1
- package/dist/chunk-KOBEU2EM.js +0 -3
- package/dist/chunk-KOBEU2EM.js.map +0 -1
- package/dist/chunk-L5PK5VL2.js +0 -178
- package/dist/chunk-L5PK5VL2.js.map +0 -1
- package/dist/chunk-P3RPDZHO.js +0 -36
- package/dist/chunk-P3RPDZHO.js.map +0 -1
- package/dist/chunk-PNWOW52F.js +0 -19
- package/dist/chunk-PNWOW52F.js.map +0 -1
- package/dist/chunk-R27FIYR5.js +0 -62
- package/dist/chunk-R27FIYR5.js.map +0 -1
- package/dist/chunk-S4WFNGQG.js +0 -17
- package/dist/chunk-S4WFNGQG.js.map +0 -1
- package/dist/chunk-TS3M7MWA.js +0 -3
- package/dist/chunk-TS3M7MWA.js.map +0 -1
- package/dist/chunk-UY4PNPBX.js +0 -156
- package/dist/chunk-UY4PNPBX.js.map +0 -1
- package/dist/chunk-VMH2LRM6.js +0 -114
- package/dist/chunk-VMH2LRM6.js.map +0 -1
- package/dist/chunk-VZDHIOCH.js +0 -76
- package/dist/chunk-VZDHIOCH.js.map +0 -1
- package/dist/chunk-WGVHM7DU.js +0 -66
- package/dist/chunk-WGVHM7DU.js.map +0 -1
- package/dist/chunk-WR5PDOPP.js +0 -91
- package/dist/chunk-WR5PDOPP.js.map +0 -1
- package/dist/chunk-YR433ZDA.js +0 -20
- package/dist/chunk-YR433ZDA.js.map +0 -1
- package/dist/executors/in-memory.d.ts +0 -39
- package/dist/executors/in-memory.js +0 -6
- package/dist/executors/in-memory.js.map +0 -1
- package/dist/executors/types.d.ts +0 -3
- package/dist/executors/types.js +0 -3
- package/dist/executors/types.js.map +0 -1
- package/dist/functions.d.ts +0 -88
- package/dist/functions.js +0 -21
- package/dist/functions.js.map +0 -1
- package/dist/types-U76Ukj96.d.ts +0 -609
- package/dist/utils/analysis.d.ts +0 -75
- package/dist/utils/analysis.js +0 -3
- package/dist/utils/index.d.ts +0 -8
- package/dist/utils/index.js +0 -10
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/mermaid.d.ts +0 -46
- package/dist/utils/mermaid.js +0 -4
- package/dist/utils/mermaid.js.map +0 -1
- package/dist/utils/middleware.d.ts +0 -11
- package/dist/utils/middleware.js +0 -3
- package/dist/utils/middleware.js.map +0 -1
- package/dist/utils/sanitize.d.ts +0 -19
- package/dist/utils/sanitize.js +0 -3
- package/dist/utils/sleep.d.ts +0 -9
- package/dist/utils/sleep.js +0 -4
- package/dist/utils/sleep.js.map +0 -1
- package/dist/workflow/AbstractNode.d.ts +0 -3
- package/dist/workflow/AbstractNode.js +0 -4
- package/dist/workflow/AbstractNode.js.map +0 -1
- package/dist/workflow/Flow.d.ts +0 -3
- package/dist/workflow/Flow.js +0 -16
- package/dist/workflow/Flow.js.map +0 -1
- package/dist/workflow/Node.d.ts +0 -3
- package/dist/workflow/Node.js +0 -15
- package/dist/workflow/Node.js.map +0 -1
- package/dist/workflow/index.d.ts +0 -4
- package/dist/workflow/index.js +0 -18
- package/dist/workflow/index.js.map +0 -1
- package/dist/workflow/node-patterns.d.ts +0 -55
- package/dist/workflow/node-patterns.js +0 -16
- package/dist/workflow/node-patterns.js.map +0 -1
- package/dist/workflow/registry.d.ts +0 -17
- package/dist/workflow/registry.js +0 -3
- package/dist/workflow/registry.js.map +0 -1
- /package/dist/{utils/analysis.js.map → analysis.js.map} +0 -0
- /package/dist/{builder/graph → runtime}/index.js.map +0 -0
- /package/dist/{builder/graph → runtime}/types.js.map +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/runtime.ts"],"names":["nodeDef"],"mappings":"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","file":"chunk-CO5BTPKI.js","sourcesContent":["import { analyzeBlueprint } from '../analysis'\nimport { AsyncContextView } from '../context'\nimport { CancelledWorkflowError, FatalNodeExecutionError, NodeExecutionError } from '../errors'\nimport { PropertyEvaluator } from '../evaluator'\nimport { NullLogger } from '../logger'\nimport type { BaseNode } from '../node'\nimport { isNodeClass } from '../node'\nimport { sanitizeBlueprint } from '../sanitizer'\nimport { JsonSerializer } from '../serializer'\nimport type {\n\tContextImplementation,\n\tEdgeDefinition,\n\tIAsyncContext,\n\tIEvaluator,\n\tIEventBus,\n\tILogger,\n\tISerializer,\n\tISyncContext,\n\tMiddleware,\n\tNodeClass,\n\tNodeContext,\n\tNodeDefinition,\n\tNodeFunction,\n\tNodeResult,\n\tRuntimeOptions,\n\tWorkflowBlueprint,\n\tWorkflowResult,\n} from '../types'\nimport type { ExecutionStrategy } from './executors'\nimport { BuiltInNodeExecutor, ClassNodeExecutor, FunctionNodeExecutor } from './executors'\nimport { WorkflowState } from './state'\nimport { GraphTraverser } from './traverser'\nimport type { IRuntime } from './types'\n\nexport class FlowRuntime<TContext extends Record<string, any>, TDependencies extends Record<string, any>>\n\timplements IRuntime<TContext, TDependencies>\n{\n\tprivate registry: Record<string, NodeFunction | NodeClass | typeof BaseNode>\n\tprivate blueprints: Record<string, WorkflowBlueprint>\n\tprivate dependencies: TDependencies\n\tprivate logger: ILogger\n\tprivate eventBus: IEventBus\n\tprivate serializer: ISerializer\n\tprivate middleware: Middleware[]\n\tprivate evaluator: IEvaluator\n\tpublic options: RuntimeOptions<TDependencies>\n\n\tconstructor(options: RuntimeOptions<TDependencies>) {\n\t\tthis.registry = options.registry || {}\n\t\tthis.blueprints = options.blueprints || {}\n\t\tthis.dependencies = options.dependencies || ({} as TDependencies)\n\t\tthis.logger = options.logger || new NullLogger()\n\t\tthis.eventBus = options.eventBus || { emit: () => {} }\n\t\tthis.serializer = options.serializer || new JsonSerializer()\n\t\tthis.middleware = options.middleware || []\n\t\tthis.evaluator = options.evaluator || new PropertyEvaluator()\n\t\tthis.options = options\n\t}\n\n\tasync run(\n\t\tblueprint: WorkflowBlueprint,\n\t\tinitialState: Partial<TContext> | string = {},\n\t\toptions?: {\n\t\t\tfunctionRegistry?: Map<string, any>\n\t\t\tstrict?: boolean\n\t\t\tsignal?: AbortSignal\n\t\t\tconcurrency?: number\n\t\t},\n\t): Promise<WorkflowResult<TContext>> {\n\t\tconst executionId = globalThis.crypto?.randomUUID()\n\t\tconst startTime = Date.now()\n\t\tconst contextData =\n\t\t\ttypeof initialState === 'string' ? (this.serializer.deserialize(initialState) as Partial<TContext>) : initialState\n\t\tblueprint = sanitizeBlueprint(blueprint)\n\t\tconst state = new WorkflowState<TContext>(contextData)\n\n\t\tthis.logger.info(`Starting workflow execution`, {\n\t\t\tblueprintId: blueprint.id,\n\t\t\texecutionId,\n\t\t})\n\n\t\ttry {\n\t\t\tawait this.eventBus.emit('workflow:start', {\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\texecutionId,\n\t\t\t})\n\t\t\tconst analysis = analyzeBlueprint(blueprint)\n\t\t\tif (options?.strict && !analysis.isDag) {\n\t\t\t\tthrow new Error(`Workflow '${blueprint.id}' failed strictness check: Cycles are not allowed.`)\n\t\t\t}\n\t\t\tif (!analysis.isDag) {\n\t\t\t\tthis.logger.warn(`Workflow contains cycles`, {\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst traverser = new GraphTraverser<TContext, TDependencies>(\n\t\t\t\tblueprint,\n\t\t\t\tthis,\n\t\t\t\tstate,\n\t\t\t\toptions?.functionRegistry,\n\t\t\t\texecutionId,\n\t\t\t\toptions?.signal,\n\t\t\t\toptions?.concurrency,\n\t\t\t)\n\t\t\tawait traverser.traverse()\n\t\t\tconst status = state.getStatus(traverser.getAllNodeIds(), traverser.getFallbackNodeIds())\n\t\t\tconst result = state.toResult(this.serializer)\n\t\t\tresult.status = status\n\t\t\tconst duration = Date.now() - startTime\n\t\t\tif (status === 'stalled') {\n\t\t\t\tawait this.eventBus.emit('workflow:stall', {\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\texecutionId,\n\t\t\t\t\tremainingNodes: traverser.getAllNodeIds().size - state.getCompletedNodes().size,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.logger.info(`Workflow execution completed`, {\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\texecutionId,\n\t\t\t\tstatus,\n\t\t\t\tduration,\n\t\t\t\terrors: result.errors?.length || 0,\n\t\t\t})\n\t\t\tawait this.eventBus.emit('workflow:finish', {\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\texecutionId,\n\t\t\t\tstatus,\n\t\t\t\terrors: result.errors,\n\t\t\t})\n\t\t\treturn result\n\t\t} catch (error) {\n\t\t\tconst duration = Date.now() - startTime\n\t\t\tif (error instanceof DOMException ? error.name === 'AbortError' : error instanceof CancelledWorkflowError) {\n\t\t\t\tthis.logger.info(`Workflow execution cancelled`, {\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\texecutionId,\n\t\t\t\t\tduration,\n\t\t\t\t})\n\t\t\t\tawait this.eventBus.emit('workflow:finish', {\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\texecutionId,\n\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t\terror,\n\t\t\t\t})\n\t\t\t\treturn {\n\t\t\t\t\tcontext: {} as TContext,\n\t\t\t\t\tserializedContext: '{}',\n\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.logger.error(`Workflow execution failed`, {\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\texecutionId,\n\t\t\t\tduration,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t})\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync executeNode(\n\t\tblueprint: WorkflowBlueprint,\n\t\tnodeId: string,\n\t\tstate: WorkflowState<TContext>,\n\t\tallPredecessors?: Map<string, Set<string>>,\n\t\tfunctionRegistry?: Map<string, any>,\n\t\texecutionId?: string,\n\t\tsignal?: AbortSignal,\n\t): Promise<NodeResult<any, any>> {\n\t\tconst nodeDef = blueprint.nodes.find((n) => n.id === nodeId)\n\t\tif (!nodeDef) {\n\t\t\tthrow new NodeExecutionError(\n\t\t\t\t`Node '${nodeId}' not found in blueprint.`,\n\t\t\t\tnodeId,\n\t\t\t\tblueprint.id,\n\t\t\t\tundefined,\n\t\t\t\texecutionId,\n\t\t\t)\n\t\t}\n\n\t\tconst contextImpl = state.getContext()\n\t\tconst asyncContext: IAsyncContext<TContext> =\n\t\t\tcontextImpl.type === 'sync'\n\t\t\t\t? new AsyncContextView(contextImpl as ISyncContext<TContext>)\n\t\t\t\t: (contextImpl as IAsyncContext<TContext>)\n\t\tconst nodeContext: NodeContext<TContext, TDependencies, any> = {\n\t\t\tcontext: asyncContext,\n\t\t\tinput: await this._resolveNodeInput(nodeDef, asyncContext, allPredecessors),\n\t\t\tparams: nodeDef.params || {},\n\t\t\tdependencies: { ...this.dependencies, logger: this.logger },\n\t\t\tsignal,\n\t\t}\n\n\t\tconst beforeHooks = this.middleware\n\t\t\t.map((m) => m.beforeNode)\n\t\t\t.filter((hook): hook is NonNullable<Middleware['beforeNode']> => !!hook)\n\t\tconst afterHooks = this.middleware\n\t\t\t.map((m) => m.afterNode)\n\t\t\t.filter((hook): hook is NonNullable<Middleware['afterNode']> => !!hook)\n\t\tconst aroundHooks = this.middleware\n\t\t\t.map((m) => m.aroundNode)\n\t\t\t.filter((hook): hook is NonNullable<Middleware['aroundNode']> => !!hook)\n\n\t\tconst executor = this.getExecutor(nodeDef, functionRegistry)\n\t\tconst coreExecution = async (): Promise<NodeResult> => {\n\t\t\tlet result: NodeResult | undefined\n\t\t\tlet error: Error | undefined\n\t\t\ttry {\n\t\t\t\tfor (const hook of beforeHooks) await hook(nodeContext.context, nodeId)\n\t\t\t\tresult = await this.executeWithFallback(\n\t\t\t\t\tblueprint,\n\t\t\t\t\tnodeDef,\n\t\t\t\t\tnodeContext,\n\t\t\t\t\texecutor,\n\t\t\t\t\texecutionId,\n\t\t\t\t\tsignal,\n\t\t\t\t\tstate,\n\t\t\t\t\tfunctionRegistry,\n\t\t\t\t)\n\t\t\t\treturn result\n\t\t\t} catch (e: any) {\n\t\t\t\terror = e\n\t\t\t\tthrow e\n\t\t\t} finally {\n\t\t\t\tfor (const hook of afterHooks) await hook(nodeContext.context, nodeId, result, error)\n\t\t\t}\n\t\t}\n\n\t\tlet executionChain: () => Promise<NodeResult> = coreExecution\n\t\tfor (let i = aroundHooks.length - 1; i >= 0; i--) {\n\t\t\tconst hook = aroundHooks[i]\n\t\t\tconst next = executionChain\n\t\t\texecutionChain = () => hook(nodeContext.context, nodeId, next)\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.eventBus.emit('node:start', {\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\tnodeId,\n\t\t\t\texecutionId,\n\t\t\t})\n\t\t\tconst result = await executionChain()\n\t\t\tawait this.eventBus.emit('node:finish', {\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\tnodeId,\n\t\t\t\tresult,\n\t\t\t\texecutionId,\n\t\t\t})\n\t\t\treturn result\n\t\t} catch (error: any) {\n\t\t\tawait this.eventBus.emit('node:error', {\n\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\tnodeId,\n\t\t\t\terror,\n\t\t\t\texecutionId,\n\t\t\t})\n\t\t\tif (error instanceof DOMException && error.name === 'AbortError') {\n\t\t\t\tthrow new CancelledWorkflowError('Workflow cancelled')\n\t\t\t}\n\t\t\tthrow error instanceof NodeExecutionError\n\t\t\t\t? error\n\t\t\t\t: new NodeExecutionError(`Node '${nodeId}' failed execution.`, nodeId, blueprint.id, error, executionId)\n\t\t}\n\t}\n\n\tprivate getExecutor(nodeDef: NodeDefinition, functionRegistry?: Map<string, any>): ExecutionStrategy {\n\t\tif (nodeDef.uses.startsWith('batch-') || nodeDef.uses.startsWith('loop-') || nodeDef.uses === 'subflow') {\n\t\t\treturn new BuiltInNodeExecutor((nodeDef, context) => this._executeBuiltInNode(nodeDef, context))\n\t\t}\n\t\tconst implementation = functionRegistry?.get(nodeDef.uses) || this.registry[nodeDef.uses]\n\t\tif (!implementation) {\n\t\t\tthrow new FatalNodeExecutionError(\n\t\t\t\t`Implementation for '${nodeDef.uses}' not found for node '${nodeDef.id}'.`,\n\t\t\t\tnodeDef.id,\n\t\t\t\t'',\n\t\t\t)\n\t\t}\n\t\tconst maxRetries = nodeDef.config?.maxRetries ?? 1\n\t\treturn isNodeClass(implementation)\n\t\t\t? new ClassNodeExecutor(implementation, maxRetries, this.eventBus)\n\t\t\t: new FunctionNodeExecutor(implementation, maxRetries, this.eventBus)\n\t}\n\n\tprivate async executeWithFallback(\n\t\tblueprint: WorkflowBlueprint,\n\t\tnodeDef: NodeDefinition,\n\t\tcontext: NodeContext<TContext, TDependencies, any>,\n\t\texecutor: ExecutionStrategy,\n\t\texecutionId?: string,\n\t\tsignal?: AbortSignal,\n\t\tstate?: WorkflowState<TContext>,\n\t\tfunctionRegistry?: Map<string, any>,\n\t): Promise<NodeResult<any, any>> {\n\t\ttry {\n\t\t\treturn await executor.execute(nodeDef, context, executionId, signal)\n\t\t} catch (error) {\n\t\t\tconst isFatal =\n\t\t\t\terror instanceof FatalNodeExecutionError ||\n\t\t\t\t(error instanceof NodeExecutionError && error.originalError instanceof FatalNodeExecutionError)\n\t\t\tif (isFatal) throw error\n\t\t\tconst fallbackNodeId = nodeDef.config?.fallback\n\t\t\tif (fallbackNodeId && state) {\n\t\t\t\tcontext.dependencies.logger.warn(`Executing fallback for node`, {\n\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\tfallbackNodeId,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\texecutionId,\n\t\t\t\t})\n\t\t\t\tawait this.eventBus.emit('node:fallback', {\n\t\t\t\t\tblueprintId: blueprint.id,\n\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\texecutionId,\n\t\t\t\t\tfallback: fallbackNodeId,\n\t\t\t\t})\n\t\t\t\tconst fallbackNode = blueprint.nodes.find((n: NodeDefinition) => n.id === fallbackNodeId)\n\t\t\t\tif (!fallbackNode) {\n\t\t\t\t\tthrow new NodeExecutionError(\n\t\t\t\t\t\t`Fallback node '${fallbackNodeId}' not found in blueprint.`,\n\t\t\t\t\t\tnodeDef.id,\n\t\t\t\t\t\tblueprint.id,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tconst fallbackExecutor = this.getExecutor(fallbackNode, functionRegistry)\n\t\t\t\tconst fallbackResult = await fallbackExecutor.execute(fallbackNode, context, executionId, signal)\n\t\t\t\tstate.markFallbackExecuted()\n\t\t\t\tstate.addCompletedNode(fallbackNodeId, fallbackResult.output)\n\t\t\t\tcontext.dependencies.logger.info(`Fallback execution completed`, {\n\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\tfallbackNodeId,\n\t\t\t\t\texecutionId,\n\t\t\t\t})\n\t\t\t\treturn { ...fallbackResult, _fallbackExecuted: true }\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync determineNextNodes(\n\t\tblueprint: WorkflowBlueprint,\n\t\tnodeId: string,\n\t\tresult: NodeResult<any, any>,\n\t\tcontext: ContextImplementation<TContext>,\n\t): Promise<{ node: NodeDefinition; edge: EdgeDefinition }[]> {\n\t\tconst outgoingEdges = blueprint.edges.filter((edge) => edge.source === nodeId)\n\t\tconst matched: { node: NodeDefinition; edge: EdgeDefinition }[] = []\n\t\tconst evaluateEdge = async (edge: EdgeDefinition): Promise<boolean> => {\n\t\t\tif (!edge.condition) return true\n\t\t\tconst contextData = context.type === 'sync' ? context.toJSON() : await context.toJSON()\n\t\t\treturn !!this.evaluator.evaluate(edge.condition, {\n\t\t\t\t...contextData,\n\t\t\t\tresult,\n\t\t\t})\n\t\t}\n\t\tif (result.action) {\n\t\t\tconst actionEdges = outgoingEdges.filter((edge) => edge.action === result.action)\n\t\t\tfor (const edge of actionEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (matched.length === 0) {\n\t\t\tconst defaultEdges = outgoingEdges.filter((edge) => !edge.action)\n\t\t\tfor (const edge of defaultEdges) {\n\t\t\t\tif (await evaluateEdge(edge)) {\n\t\t\t\t\tconst targetNode = blueprint.nodes.find((n) => n.id === edge.target)\n\t\t\t\t\tif (targetNode) matched.push({ node: targetNode, edge })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.logger.debug(`Determined next nodes for ${nodeId}`, {\n\t\t\tmatchedNodes: matched.map((m) => m.node.id),\n\t\t\taction: result.action,\n\t\t})\n\t\treturn matched\n\t}\n\n\tpublic async applyEdgeTransform(\n\t\tedge: EdgeDefinition,\n\t\tsourceResult: NodeResult<any, any>,\n\t\ttargetNode: NodeDefinition,\n\t\tcontext: ContextImplementation<TContext>,\n\t\tallPredecessors?: Map<string, Set<string>>,\n\t): Promise<void> {\n\t\tconst asyncContext = context.type === 'sync' ? new AsyncContextView(context) : context\n\t\tconst finalInput = edge.transform\n\t\t\t? this.evaluator.evaluate(edge.transform, {\n\t\t\t\t\tinput: sourceResult.output,\n\t\t\t\t\tcontext: await asyncContext.toJSON(),\n\t\t\t\t})\n\t\t\t: sourceResult.output\n\t\tconst inputKey = `${targetNode.id}_input`\n\t\tawait asyncContext.set(inputKey as any, finalInput)\n\t\tif (targetNode.config?.joinStrategy === 'any') {\n\t\t\ttargetNode.inputs = inputKey\n\t\t} else if (!targetNode.inputs) {\n\t\t\tconst predecessors = allPredecessors?.get(targetNode.id)\n\t\t\tif (!predecessors || predecessors.size === 1) {\n\t\t\t\ttargetNode.inputs = inputKey\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _resolveNodeInput(\n\t\tnodeDef: NodeDefinition,\n\t\tcontext: IAsyncContext<TContext>,\n\t\tallPredecessors?: Map<string, Set<string>>,\n\t): Promise<any> {\n\t\tif (nodeDef.inputs) {\n\t\t\tif (typeof nodeDef.inputs === 'string') return await context.get(nodeDef.inputs as any)\n\t\t\tif (typeof nodeDef.inputs === 'object') {\n\t\t\t\tconst input: Record<string, any> = {}\n\t\t\t\tfor (const key in nodeDef.inputs) {\n\t\t\t\t\tconst contextKey = nodeDef.inputs[key]\n\t\t\t\t\tinput[key] = await context.get(contextKey as any)\n\t\t\t\t}\n\t\t\t\treturn input\n\t\t\t}\n\t\t}\n\t\tif (allPredecessors) {\n\t\t\tconst predecessors = allPredecessors.get(nodeDef.id)\n\t\t\tif (predecessors && predecessors.size === 1) {\n\t\t\t\tconst singlePredecessorId = predecessors.values().next().value\n\t\t\t\treturn await context.get(singlePredecessorId as any)\n\t\t\t}\n\t\t}\n\t\treturn undefined\n\t}\n\n\tprotected async _executeBuiltInNode(\n\t\tnodeDef: NodeDefinition,\n\t\tcontextImpl: ContextImplementation<TContext>,\n\t): Promise<NodeResult<any, any>> {\n\t\tconst context = contextImpl.type === 'sync' ? new AsyncContextView(contextImpl) : contextImpl\n\t\tconst { params = {}, id, inputs } = nodeDef\n\t\tswitch (nodeDef.uses) {\n\t\t\tcase 'batch-scatter': {\n\t\t\t\tconst inputArray = (await context.get(inputs as any)) || []\n\t\t\t\tif (!Array.isArray(inputArray)) throw new Error(`Input for batch-scatter node '${id}' must be an array.`)\n\t\t\t\tconst batchId = globalThis.crypto.randomUUID()\n\t\t\t\tconst dynamicNodes: NodeDefinition[] = []\n\t\t\t\tfor (let i = 0; i < inputArray.length; i++) {\n\t\t\t\t\tconst item = inputArray[i]\n\t\t\t\t\tconst itemInputKey = `${id}_${batchId}_item_${i}`\n\t\t\t\t\tawait context.set(itemInputKey as any, item)\n\t\t\t\t\tdynamicNodes.push({\n\t\t\t\t\t\tid: `${params.workerUsesKey}_${batchId}_${i}`,\n\t\t\t\t\t\tuses: params.workerUsesKey,\n\t\t\t\t\t\tinputs: itemInputKey,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tconst gatherNodeId = params.gatherNodeId\n\t\t\t\treturn { dynamicNodes, output: { gatherNodeId } }\n\t\t\t}\n\t\t\tcase 'batch-gather': {\n\t\t\t\treturn { output: {} }\n\t\t\t}\n\t\t\tcase 'loop-controller': {\n\t\t\t\tconst contextData = await context.toJSON()\n\t\t\t\tconst shouldContinue = !!this.evaluator.evaluate(params.condition, contextData)\n\t\t\t\treturn { action: shouldContinue ? 'continue' : 'break' }\n\t\t\t}\n\t\t\tcase 'subflow': {\n\t\t\t\tconst { blueprintId, inputs: inputMapping, outputs: outputMapping } = params\n\t\t\t\tif (!blueprintId)\n\t\t\t\t\tthrow new FatalNodeExecutionError(`Subflow node '${id}' is missing the 'blueprintId' parameter.`, id, '')\n\n\t\t\t\tconst subBlueprint = this.blueprints[blueprintId]\n\t\t\t\tif (!subBlueprint)\n\t\t\t\t\tthrow new FatalNodeExecutionError(\n\t\t\t\t\t\t`Sub-blueprint with ID '${blueprintId}' not found in runtime registry.`,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t'',\n\t\t\t\t\t)\n\n\t\t\t\tconst subflowInitialContext: Record<string, any> = {}\n\n\t\t\t\tif (inputMapping) {\n\t\t\t\t\tfor (const [targetKey, sourceKey] of Object.entries(inputMapping)) {\n\t\t\t\t\t\tif (await context.has(sourceKey as any)) {\n\t\t\t\t\t\t\tsubflowInitialContext[targetKey] = await context.get(sourceKey as any)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst subflowResult = await this.run(subBlueprint, subflowInitialContext as Partial<TContext>)\n\n\t\t\t\tif (subflowResult.status !== 'completed')\n\t\t\t\t\tthrow new NodeExecutionError(\n\t\t\t\t\t\t`Sub-workflow '${blueprintId}' did not complete successfully. Status: ${subflowResult.status}`,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tsubBlueprint.id,\n\t\t\t\t\t)\n\n\t\t\t\tif (outputMapping) {\n\t\t\t\t\tfor (const [parentKey, subKey] of Object.entries(outputMapping)) {\n\t\t\t\t\t\tconst subflowFinalContext = subflowResult.context as Record<string, any>\n\t\t\t\t\t\tif (Object.hasOwn(subflowFinalContext, subKey as string)) {\n\t\t\t\t\t\t\tawait context.set(parentKey as any, subflowFinalContext[subKey as string])\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn { output: subflowResult.context }\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new FatalNodeExecutionError(`Unknown built-in node type: '${nodeDef.uses}'`, id, '')\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Context } from './chunk-KWQHFT7E.js';
|
|
2
|
+
|
|
3
|
+
// src/runtime/state.ts
|
|
4
|
+
var WorkflowState = class {
|
|
5
|
+
_completedNodes = /* @__PURE__ */ new Set();
|
|
6
|
+
errors = [];
|
|
7
|
+
anyFallbackExecuted = false;
|
|
8
|
+
context;
|
|
9
|
+
constructor(initialData) {
|
|
10
|
+
this.context = new Context(initialData);
|
|
11
|
+
}
|
|
12
|
+
addCompletedNode(nodeId, output) {
|
|
13
|
+
this._completedNodes.add(nodeId);
|
|
14
|
+
this.context.set(nodeId, output);
|
|
15
|
+
}
|
|
16
|
+
addError(nodeId, error) {
|
|
17
|
+
this.errors.push({
|
|
18
|
+
nodeId,
|
|
19
|
+
message: error.message,
|
|
20
|
+
originalError: error,
|
|
21
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
22
|
+
stack: error.stack
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
clearError(nodeId) {
|
|
26
|
+
this.errors = this.errors.filter((err) => err.nodeId !== nodeId);
|
|
27
|
+
}
|
|
28
|
+
markFallbackExecuted() {
|
|
29
|
+
this.anyFallbackExecuted = true;
|
|
30
|
+
}
|
|
31
|
+
getContext() {
|
|
32
|
+
return this.context;
|
|
33
|
+
}
|
|
34
|
+
getCompletedNodes() {
|
|
35
|
+
return new Set(this._completedNodes);
|
|
36
|
+
}
|
|
37
|
+
getErrors() {
|
|
38
|
+
return this.errors;
|
|
39
|
+
}
|
|
40
|
+
getAnyFallbackExecuted() {
|
|
41
|
+
return this.anyFallbackExecuted;
|
|
42
|
+
}
|
|
43
|
+
getStatus(allNodeIds, _fallbackNodeIds) {
|
|
44
|
+
if (this.anyFallbackExecuted) return "completed";
|
|
45
|
+
if (this.errors.length > 0) return "failed";
|
|
46
|
+
return this._completedNodes.size < allNodeIds.size ? "stalled" : "completed";
|
|
47
|
+
}
|
|
48
|
+
toResult(serializer) {
|
|
49
|
+
const contextJSON = this.context.toJSON();
|
|
50
|
+
return {
|
|
51
|
+
context: contextJSON,
|
|
52
|
+
serializedContext: serializer.serialize(contextJSON),
|
|
53
|
+
status: this.getStatus(/* @__PURE__ */ new Set(), /* @__PURE__ */ new Set()),
|
|
54
|
+
errors: this.errors.length > 0 ? this.errors : void 0
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export { WorkflowState };
|
|
60
|
+
//# sourceMappingURL=chunk-CSZ6EOWG.js.map
|
|
61
|
+
//# sourceMappingURL=chunk-CSZ6EOWG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/state.ts"],"names":[],"mappings":";;;AAGO,IAAM,gBAAN,MAA0D;AAAA,EACxD,eAAA,uBAAsB,GAAA,EAAY;AAAA,EAClC,SAA0B,EAAC;AAAA,EAC3B,mBAAA,GAAsB,KAAA;AAAA,EACtB,OAAA;AAAA,EAER,YAAY,WAAA,EAAgC;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAkB,WAAW,CAAA;AAAA,EACjD;AAAA,EAEA,gBAAA,CAAiB,QAAgB,MAAA,EAAa;AAC7C,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAA0B,MAAM,CAAA;AAAA,EAClD;AAAA,EAEA,QAAA,CAAS,QAAgB,KAAA,EAAc;AACtC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK;AAAA,MAChB,MAAA;AAAA,MACA,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,aAAA,EAAe,KAAA;AAAA,MACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,OAAO,KAAA,CAAM;AAAA,KACb,CAAA;AAAA,EACF;AAAA,EAEA,WAAW,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAW,MAAM,CAAA;AAAA,EAChE;AAAA,EAEA,oBAAA,GAAuB;AACtB,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAAA,EAC5B;AAAA,EAEA,UAAA,GAA8C;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACb;AAAA,EAEA,iBAAA,GAAiC;AAChC,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,eAAe,CAAA;AAAA,EACpC;AAAA,EAEA,SAAA,GAA6B;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EAEA,sBAAA,GAAkC;AACjC,IAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,EACb;AAAA,EAEA,SAAA,CAAU,YAAyB,gBAAA,EAAyD;AAC3F,IAAA,IAAI,IAAA,CAAK,qBAAqB,OAAO,WAAA;AACrC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,QAAA;AAEnC,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,GAAO,UAAA,CAAW,OAAO,SAAA,GAAY,WAAA;AAAA,EAClE;AAAA,EAEA,SAAS,UAAA,EAAmD;AAC3D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO;AACxC,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,WAAA;AAAA,MACT,iBAAA,EAAmB,UAAA,CAAW,SAAA,CAAU,WAAW,CAAA;AAAA,MACnD,MAAA,EAAQ,KAAK,SAAA,iBAAU,IAAI,KAAI,kBAAG,IAAI,KAAK,CAAA;AAAA,MAC3C,QAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,KAAK,MAAA,GAAS;AAAA,KAChD;AAAA,EACD;AACD","file":"chunk-CSZ6EOWG.js","sourcesContent":["import { Context } from '../context'\nimport type { ContextImplementation, ISerializer, WorkflowError, WorkflowResult } from '../types'\n\nexport class WorkflowState<TContext extends Record<string, any>> {\n\tprivate _completedNodes = new Set<string>()\n\tprivate errors: WorkflowError[] = []\n\tprivate anyFallbackExecuted = false\n\tprivate context: ContextImplementation<TContext>\n\n\tconstructor(initialData: Partial<TContext>) {\n\t\tthis.context = new Context<TContext>(initialData)\n\t}\n\n\taddCompletedNode(nodeId: string, output: any) {\n\t\tthis._completedNodes.add(nodeId)\n\t\tthis.context.set(nodeId as keyof TContext, output)\n\t}\n\n\taddError(nodeId: string, error: Error) {\n\t\tthis.errors.push({\n\t\t\tnodeId,\n\t\t\tmessage: error.message,\n\t\t\toriginalError: error,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tstack: error.stack,\n\t\t})\n\t}\n\n\tclearError(nodeId: string) {\n\t\tthis.errors = this.errors.filter((err) => err.nodeId !== nodeId)\n\t}\n\n\tmarkFallbackExecuted() {\n\t\tthis.anyFallbackExecuted = true\n\t}\n\n\tgetContext(): ContextImplementation<TContext> {\n\t\treturn this.context\n\t}\n\n\tgetCompletedNodes(): Set<string> {\n\t\treturn new Set(this._completedNodes)\n\t}\n\n\tgetErrors(): WorkflowError[] {\n\t\treturn this.errors\n\t}\n\n\tgetAnyFallbackExecuted(): boolean {\n\t\treturn this.anyFallbackExecuted\n\t}\n\n\tgetStatus(allNodeIds: Set<string>, _fallbackNodeIds: Set<string>): WorkflowResult['status'] {\n\t\tif (this.anyFallbackExecuted) return 'completed'\n\t\tif (this.errors.length > 0) return 'failed'\n\t\t// const _remainingNodes = [...allNodeIds].filter((id) => !this._completedNodes.has(id) && !fallbackNodeIds.has(id))\n\t\treturn this._completedNodes.size < allNodeIds.size ? 'stalled' : 'completed'\n\t}\n\n\ttoResult(serializer: ISerializer): WorkflowResult<TContext> {\n\t\tconst contextJSON = this.context.toJSON() as TContext\n\t\treturn {\n\t\t\tcontext: contextJSON,\n\t\t\tserializedContext: serializer.serialize(contextJSON),\n\t\t\tstatus: this.getStatus(new Set(), new Set()),\n\t\t\terrors: this.errors.length > 0 ? this.errors : undefined,\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// src/serializer.ts
|
|
2
|
+
var JsonSerializer = class {
|
|
3
|
+
hasWarned = false;
|
|
4
|
+
serialize(data) {
|
|
5
|
+
for (const value of Object.values(data)) {
|
|
6
|
+
if (value instanceof Map || value instanceof Set || value instanceof Date) {
|
|
7
|
+
if (!this.hasWarned) {
|
|
8
|
+
console.warn(
|
|
9
|
+
"[Flowcraft] Warning: Default JsonSerializer does not support Map, Set, or Date types. Data may be lost. Consider providing a custom ISerializer (e.g., using superjson)."
|
|
10
|
+
);
|
|
11
|
+
this.hasWarned = true;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return JSON.stringify(data);
|
|
16
|
+
}
|
|
17
|
+
deserialize(text) {
|
|
18
|
+
return JSON.parse(text);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { JsonSerializer };
|
|
23
|
+
//# sourceMappingURL=chunk-CYHZ2YVH.js.map
|
|
24
|
+
//# sourceMappingURL=chunk-CYHZ2YVH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/serializer.ts"],"names":[],"mappings":";AASO,IAAM,iBAAN,MAA4C;AAAA,EAC1C,SAAA,GAAY,KAAA;AAAA,EAEpB,UAAU,IAAA,EAAmC;AAC5C,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACxC,MAAA,IAAI,KAAA,YAAiB,GAAA,IAAO,KAAA,YAAiB,GAAA,IAAO,iBAAiB,IAAA,EAAM;AAC1E,QAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACpB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACP;AAAA,WACD;AACA,UAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,QAClB;AAAA,MACD;AAAA,IACD;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,YAAY,IAAA,EAAmC;AAC9C,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACvB;AACD","file":"chunk-CYHZ2YVH.js","sourcesContent":["import type { ISerializer } from './types'\n\n/**\n * A default serializer using standard JSON.\n *\n * @warning This implementation is lossy and does not handle complex data types\n * like `Date`, `Map`, `Set`, `undefined`, etc. It is recommended to provide a robust\n * serializer like `superjson` if working with complex data types.\n */\nexport class JsonSerializer implements ISerializer {\n\tprivate hasWarned = false\n\n\tserialize(data: Record<string, any>): string {\n\t\tfor (const value of Object.values(data)) {\n\t\t\tif (value instanceof Map || value instanceof Set || value instanceof Date) {\n\t\t\t\tif (!this.hasWarned) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'[Flowcraft] Warning: Default JsonSerializer does not support Map, Set, or Date types. Data may be lost. Consider providing a custom ISerializer (e.g., using superjson).',\n\t\t\t\t\t)\n\t\t\t\t\tthis.hasWarned = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn JSON.stringify(data)\n\t}\n\n\tdeserialize(text: string): Record<string, any> {\n\t\treturn JSON.parse(text)\n\t}\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// src/sanitizer.ts
|
|
2
|
+
function sanitizeBlueprint(raw) {
|
|
3
|
+
const nodes = raw.nodes?.map((node) => ({
|
|
4
|
+
id: node.id,
|
|
5
|
+
uses: node.uses,
|
|
6
|
+
params: node.params,
|
|
7
|
+
inputs: node.inputs,
|
|
8
|
+
config: node.config
|
|
9
|
+
})) || [];
|
|
10
|
+
const edges = raw.edges?.map((edge) => ({
|
|
11
|
+
source: edge.source,
|
|
12
|
+
target: edge.target,
|
|
13
|
+
action: edge.action,
|
|
14
|
+
condition: edge.condition,
|
|
15
|
+
transform: edge.transform
|
|
16
|
+
})) || [];
|
|
17
|
+
return {
|
|
18
|
+
id: raw.id,
|
|
19
|
+
nodes,
|
|
20
|
+
edges,
|
|
21
|
+
metadata: raw.metadata
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { sanitizeBlueprint };
|
|
26
|
+
//# sourceMappingURL=chunk-DSYAC4WB.js.map
|
|
27
|
+
//# sourceMappingURL=chunk-DSYAC4WB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sanitizer.ts"],"names":[],"mappings":";AAOO,SAAS,kBAAkB,GAAA,EAA6B;AAC9D,EAAA,MAAM,KAAA,GACL,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,IAC9B,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK;AAAA,GACd,CAAE,KAAK,EAAC;AAET,EAAA,MAAM,KAAA,GACL,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,IAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAW,IAAA,CAAK;AAAA,GACjB,CAAE,KAAK,EAAC;AAET,EAAA,OAAO;AAAA,IACN,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,KAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,GAAA,CAAI;AAAA,GACf;AACD","file":"chunk-DSYAC4WB.js","sourcesContent":["import type { EdgeDefinition, NodeDefinition, WorkflowBlueprint } from './types'\n\n/**\n * Sanitizes a raw workflow blueprint by removing extra properties\n * added by UI tools (e.g., position, style) and keeping only the\n * properties defined in NodeDefinition and EdgeDefinition.\n */\nexport function sanitizeBlueprint(raw: any): WorkflowBlueprint {\n\tconst nodes: NodeDefinition[] =\n\t\traw.nodes?.map((node: any) => ({\n\t\t\tid: node.id,\n\t\t\tuses: node.uses,\n\t\t\tparams: node.params,\n\t\t\tinputs: node.inputs,\n\t\t\tconfig: node.config,\n\t\t})) || []\n\n\tconst edges: EdgeDefinition[] =\n\t\traw.edges?.map((edge: any) => ({\n\t\t\tsource: edge.source,\n\t\t\ttarget: edge.target,\n\t\t\taction: edge.action,\n\t\t\tcondition: edge.condition,\n\t\t\ttransform: edge.transform,\n\t\t})) || []\n\n\treturn {\n\t\tid: raw.id,\n\t\tnodes,\n\t\tedges,\n\t\tmetadata: raw.metadata,\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-HMR2GEGE.js"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// src/analysis.ts
|
|
2
|
+
function checkForCycles(blueprint) {
|
|
3
|
+
const cycles = [];
|
|
4
|
+
if (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {
|
|
5
|
+
return cycles;
|
|
6
|
+
}
|
|
7
|
+
const allNodeIds = blueprint.nodes.map((node) => node.id);
|
|
8
|
+
const adj = /* @__PURE__ */ new Map();
|
|
9
|
+
for (const id of allNodeIds) {
|
|
10
|
+
adj.set(id, []);
|
|
11
|
+
}
|
|
12
|
+
for (const edge of blueprint.edges) {
|
|
13
|
+
adj.get(edge.source)?.push(edge.target);
|
|
14
|
+
}
|
|
15
|
+
const visited = /* @__PURE__ */ new Set();
|
|
16
|
+
const recursionStack = /* @__PURE__ */ new Set();
|
|
17
|
+
function detectCycleUtil(nodeId, path) {
|
|
18
|
+
visited.add(nodeId);
|
|
19
|
+
recursionStack.add(nodeId);
|
|
20
|
+
path.push(nodeId);
|
|
21
|
+
const neighbors = adj.get(nodeId) || [];
|
|
22
|
+
for (const neighbor of neighbors) {
|
|
23
|
+
if (recursionStack.has(neighbor)) {
|
|
24
|
+
const cycleStartIndex = path.indexOf(neighbor);
|
|
25
|
+
const cycle = path.slice(cycleStartIndex);
|
|
26
|
+
cycles.push([...cycle, neighbor]);
|
|
27
|
+
} else if (!visited.has(neighbor)) {
|
|
28
|
+
detectCycleUtil(neighbor, path);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
recursionStack.delete(nodeId);
|
|
32
|
+
path.pop();
|
|
33
|
+
}
|
|
34
|
+
for (const nodeId of allNodeIds) {
|
|
35
|
+
if (!visited.has(nodeId)) {
|
|
36
|
+
detectCycleUtil(nodeId, []);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return cycles;
|
|
40
|
+
}
|
|
41
|
+
function generateMermaid(blueprint) {
|
|
42
|
+
if (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {
|
|
43
|
+
return "flowchart TD\n empty[Empty Blueprint]";
|
|
44
|
+
}
|
|
45
|
+
let mermaid = "flowchart TD\n";
|
|
46
|
+
for (const node of blueprint.nodes) {
|
|
47
|
+
const paramsString = node.params ? `<br/>params: ${JSON.stringify(node.params)}` : "";
|
|
48
|
+
const nodeLabel = `${node.id}${paramsString}`;
|
|
49
|
+
mermaid += ` ${node.id}["${nodeLabel}"]
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
52
|
+
for (const edge of blueprint.edges || []) {
|
|
53
|
+
const labelParts = [];
|
|
54
|
+
if (edge.action) {
|
|
55
|
+
labelParts.push(edge.action);
|
|
56
|
+
}
|
|
57
|
+
if (edge.condition) {
|
|
58
|
+
labelParts.push(edge.condition);
|
|
59
|
+
}
|
|
60
|
+
if (edge.transform) {
|
|
61
|
+
labelParts.push(edge.transform);
|
|
62
|
+
}
|
|
63
|
+
if (labelParts.length > 0) {
|
|
64
|
+
const edgeLabel = labelParts.join(" | ");
|
|
65
|
+
mermaid += ` ${edge.source} -- "${edgeLabel}" --> ${edge.target}
|
|
66
|
+
`;
|
|
67
|
+
} else {
|
|
68
|
+
mermaid += ` ${edge.source} --> ${edge.target}
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return mermaid;
|
|
73
|
+
}
|
|
74
|
+
function analyzeBlueprint(blueprint) {
|
|
75
|
+
if (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {
|
|
76
|
+
return {
|
|
77
|
+
cycles: [],
|
|
78
|
+
startNodeIds: [],
|
|
79
|
+
terminalNodeIds: [],
|
|
80
|
+
nodeCount: 0,
|
|
81
|
+
edgeCount: 0,
|
|
82
|
+
isDag: true
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const cycles = checkForCycles(blueprint);
|
|
86
|
+
const nodeCount = blueprint.nodes.length;
|
|
87
|
+
const edgeCount = blueprint.edges?.length || 0;
|
|
88
|
+
const nodesWithIncoming = /* @__PURE__ */ new Set();
|
|
89
|
+
for (const edge of blueprint.edges || []) {
|
|
90
|
+
nodesWithIncoming.add(edge.target);
|
|
91
|
+
}
|
|
92
|
+
const startNodeIds = blueprint.nodes.map((node) => node.id).filter((nodeId) => !nodesWithIncoming.has(nodeId));
|
|
93
|
+
const nodesWithOutgoing = /* @__PURE__ */ new Set();
|
|
94
|
+
for (const edge of blueprint.edges || []) {
|
|
95
|
+
nodesWithOutgoing.add(edge.source);
|
|
96
|
+
}
|
|
97
|
+
const terminalNodeIds = blueprint.nodes.map((node) => node.id).filter((nodeId) => !nodesWithOutgoing.has(nodeId));
|
|
98
|
+
return {
|
|
99
|
+
cycles,
|
|
100
|
+
startNodeIds,
|
|
101
|
+
terminalNodeIds,
|
|
102
|
+
nodeCount,
|
|
103
|
+
edgeCount,
|
|
104
|
+
isDag: cycles.length === 0
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export { analyzeBlueprint, checkForCycles, generateMermaid };
|
|
109
|
+
//# sourceMappingURL=chunk-HN72TZY5.js.map
|
|
110
|
+
//# sourceMappingURL=chunk-HN72TZY5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/analysis.ts"],"names":[],"mappings":"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","file":"chunk-HN72TZY5.js","sourcesContent":["import type { WorkflowBlueprint } from './types'\n\n/**\n * A list of cycles found in the graph. Each cycle is an array of node IDs.\n */\nexport type Cycles = string[][]\n\n/**\n * Analysis result for a workflow blueprint\n */\nexport interface BlueprintAnalysis {\n\t/** Cycles found in the graph */\n\tcycles: Cycles\n\t/** Node IDs that have no incoming edges (start nodes) */\n\tstartNodeIds: string[]\n\t/** Node IDs that have no outgoing edges (terminal nodes) */\n\tterminalNodeIds: string[]\n\t/** Total number of nodes */\n\tnodeCount: number\n\t/** Total number of edges */\n\tedgeCount: number\n\t/** Whether the graph is a valid DAG (no cycles) */\n\tisDag: boolean\n}\n\n/**\n * Analyzes a workflow blueprint to detect cycles.\n * @param blueprint The WorkflowBlueprint object containing nodes and edges.\n * @returns An array of cycles found. Each cycle is represented as an array of node IDs.\n */\nexport function checkForCycles(blueprint: WorkflowBlueprint): Cycles {\n\tconst cycles: Cycles = []\n\tif (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {\n\t\treturn cycles\n\t}\n\n\tconst allNodeIds = blueprint.nodes.map((node) => node.id)\n\tconst adj = new Map<string, string[]>()\n\tfor (const id of allNodeIds) {\n\t\tadj.set(id, [])\n\t}\n\tfor (const edge of blueprint.edges) {\n\t\tadj.get(edge.source)?.push(edge.target)\n\t}\n\n\tconst visited = new Set<string>()\n\tconst recursionStack = new Set<string>()\n\n\tfunction detectCycleUtil(nodeId: string, path: string[]) {\n\t\tvisited.add(nodeId)\n\t\trecursionStack.add(nodeId)\n\t\tpath.push(nodeId)\n\n\t\tconst neighbors = adj.get(nodeId) || []\n\t\tfor (const neighbor of neighbors) {\n\t\t\tif (recursionStack.has(neighbor)) {\n\t\t\t\tconst cycleStartIndex = path.indexOf(neighbor)\n\t\t\t\tconst cycle = path.slice(cycleStartIndex)\n\t\t\t\tcycles.push([...cycle, neighbor])\n\t\t\t} else if (!visited.has(neighbor)) {\n\t\t\t\tdetectCycleUtil(neighbor, path)\n\t\t\t}\n\t\t}\n\n\t\trecursionStack.delete(nodeId)\n\t\tpath.pop()\n\t}\n\n\tfor (const nodeId of allNodeIds) {\n\t\tif (!visited.has(nodeId)) {\n\t\t\tdetectCycleUtil(nodeId, [])\n\t\t}\n\t}\n\n\treturn cycles\n}\n\n/**\n * Generates Mermaid diagram syntax from a WorkflowBlueprint\n * @param blueprint The WorkflowBlueprint object containing nodes and edges\n * @returns Mermaid syntax string for the flowchart\n */\nexport function generateMermaid(blueprint: WorkflowBlueprint): string {\n\tif (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {\n\t\treturn 'flowchart TD\\n empty[Empty Blueprint]'\n\t}\n\n\tlet mermaid = 'flowchart TD\\n'\n\n\tfor (const node of blueprint.nodes) {\n\t\t// Using backticks and characters like <br/> for newlines in Mermaid labels\n\t\tconst paramsString = node.params ? `<br/>params: ${JSON.stringify(node.params)}` : ''\n\t\tconst nodeLabel = `${node.id}${paramsString}`\n\t\tmermaid += ` ${node.id}[\"${nodeLabel}\"]\\n`\n\t}\n\n\tfor (const edge of blueprint.edges || []) {\n\t\tconst labelParts: string[] = []\n\n\t\tif (edge.action) {\n\t\t\tlabelParts.push(edge.action)\n\t\t}\n\t\tif (edge.condition) {\n\t\t\tlabelParts.push(edge.condition)\n\t\t}\n\t\tif (edge.transform) {\n\t\t\tlabelParts.push(edge.transform)\n\t\t}\n\n\t\tif (labelParts.length > 0) {\n\t\t\tconst edgeLabel = labelParts.join(' | ')\n\t\t\tmermaid += ` ${edge.source} -- \"${edgeLabel}\" --> ${edge.target}\\n`\n\t\t} else {\n\t\t\tmermaid += ` ${edge.source} --> ${edge.target}\\n`\n\t\t}\n\t}\n\n\treturn mermaid\n}\n\n/**\n * Analyzes a workflow blueprint and returns comprehensive analysis\n * @param blueprint The WorkflowBlueprint object containing nodes and edges\n * @returns Analysis result with cycles, start nodes, terminal nodes, and other metrics\n */\nexport function analyzeBlueprint(blueprint: WorkflowBlueprint): BlueprintAnalysis {\n\tif (!blueprint || !blueprint.nodes || blueprint.nodes.length === 0) {\n\t\treturn {\n\t\t\tcycles: [],\n\t\t\tstartNodeIds: [],\n\t\t\tterminalNodeIds: [],\n\t\t\tnodeCount: 0,\n\t\t\tedgeCount: 0,\n\t\t\tisDag: true,\n\t\t}\n\t}\n\n\tconst cycles = checkForCycles(blueprint)\n\tconst nodeCount = blueprint.nodes.length\n\tconst edgeCount = blueprint.edges?.length || 0\n\n\tconst nodesWithIncoming = new Set<string>()\n\tfor (const edge of blueprint.edges || []) {\n\t\tnodesWithIncoming.add(edge.target)\n\t}\n\n\tconst startNodeIds = blueprint.nodes.map((node) => node.id).filter((nodeId) => !nodesWithIncoming.has(nodeId))\n\n\tconst nodesWithOutgoing = new Set<string>()\n\tfor (const edge of blueprint.edges || []) {\n\t\tnodesWithOutgoing.add(edge.source)\n\t}\n\n\tconst terminalNodeIds = blueprint.nodes.map((node) => node.id).filter((nodeId) => !nodesWithOutgoing.has(nodeId))\n\n\treturn {\n\t\tcycles,\n\t\tstartNodeIds,\n\t\tterminalNodeIds,\n\t\tnodeCount,\n\t\tedgeCount,\n\t\tisDag: cycles.length === 0,\n\t}\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// src/context.ts
|
|
2
|
+
var Context = class {
|
|
3
|
+
type = "sync";
|
|
4
|
+
data;
|
|
5
|
+
constructor(initialData = {}) {
|
|
6
|
+
this.data = new Map(Object.entries(initialData));
|
|
7
|
+
}
|
|
8
|
+
get(key) {
|
|
9
|
+
return this.data.get(String(key));
|
|
10
|
+
}
|
|
11
|
+
set(key, value) {
|
|
12
|
+
this.data.set(String(key), value);
|
|
13
|
+
}
|
|
14
|
+
has(key) {
|
|
15
|
+
return this.data.has(String(key));
|
|
16
|
+
}
|
|
17
|
+
delete(key) {
|
|
18
|
+
return this.data.delete(String(key));
|
|
19
|
+
}
|
|
20
|
+
toJSON() {
|
|
21
|
+
return Object.fromEntries(this.data);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var AsyncContextView = class {
|
|
25
|
+
constructor(syncContext) {
|
|
26
|
+
this.syncContext = syncContext;
|
|
27
|
+
}
|
|
28
|
+
type = "async";
|
|
29
|
+
get(key) {
|
|
30
|
+
return Promise.resolve(this.syncContext.get(key));
|
|
31
|
+
}
|
|
32
|
+
set(key, value) {
|
|
33
|
+
this.syncContext.set(key, value);
|
|
34
|
+
return Promise.resolve();
|
|
35
|
+
}
|
|
36
|
+
has(key) {
|
|
37
|
+
return Promise.resolve(this.syncContext.has(key));
|
|
38
|
+
}
|
|
39
|
+
delete(key) {
|
|
40
|
+
return Promise.resolve(this.syncContext.delete(key));
|
|
41
|
+
}
|
|
42
|
+
toJSON() {
|
|
43
|
+
return Promise.resolve(this.syncContext.toJSON());
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export { AsyncContextView, Context };
|
|
48
|
+
//# sourceMappingURL=chunk-KWQHFT7E.js.map
|
|
49
|
+
//# sourceMappingURL=chunk-KWQHFT7E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context.ts"],"names":[],"mappings":";AAKO,IAAM,UAAN,MAAsF;AAAA,EAC5E,IAAA,GAAO,MAAA;AAAA,EACf,IAAA;AAAA,EAER,WAAA,CAAY,WAAA,GAAiC,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,OAAO,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,IAA8B,GAAA,EAAiC;AAC9D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACjC;AAAA,EAEA,GAAA,CAA8B,KAAQ,KAAA,EAA0B;AAC/D,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAG,GAAG,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,IAA8B,GAAA,EAAiB;AAC9C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACjC;AAAA,EAEA,OAAiC,GAAA,EAAiB;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACpC;AAAA,EAEA,MAAA,GAA8B;AAC7B,IAAA,OAAO,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,EACpC;AACD;AAMO,IAAM,mBAAN,MAAgG;AAAA,EAGtG,YAAoB,WAAA,EAAqC;AAArC,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAAsC;AAAA,EAF1C,IAAA,GAAO,OAAA;AAAA,EAIvB,IAA8B,GAAA,EAA0C;AACvE,IAAA,OAAO,QAAQ,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACjD;AAAA,EAEA,GAAA,CAA8B,KAAQ,KAAA,EAAmC;AACxE,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC/B,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACxB;AAAA,EAEA,IAA8B,GAAA,EAA0B;AACvD,IAAA,OAAO,QAAQ,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACjD;AAAA,EAEA,OAAiC,GAAA,EAA0B;AAC1D,IAAA,OAAO,QAAQ,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACpD;AAAA,EAEA,MAAA,GAAuC;AACtC,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EACjD;AACD","file":"chunk-KWQHFT7E.js","sourcesContent":["import type { IAsyncContext, ISyncContext } from './types'\n\n/**\n * A default, high-performance, in-memory implementation of ISyncContext using a Map.\n */\nexport class Context<TContext extends Record<string, any>> implements ISyncContext<TContext> {\n\tpublic readonly type = 'sync' as const\n\tprivate data: Map<string, any>\n\n\tconstructor(initialData: Partial<TContext> = {}) {\n\t\tthis.data = new Map(Object.entries(initialData))\n\t}\n\n\tget<K extends keyof TContext>(key: K): TContext[K] | undefined {\n\t\treturn this.data.get(String(key))\n\t}\n\n\tset<K extends keyof TContext>(key: K, value: TContext[K]): void {\n\t\tthis.data.set(String(key), value)\n\t}\n\n\thas<K extends keyof TContext>(key: K): boolean {\n\t\treturn this.data.has(String(key))\n\t}\n\n\tdelete<K extends keyof TContext>(key: K): boolean {\n\t\treturn this.data.delete(String(key))\n\t}\n\n\ttoJSON(): Record<string, any> {\n\t\treturn Object.fromEntries(this.data)\n\t}\n}\n\n/**\n * An adapter that provides a consistent, Promise-based view of a synchronous context.\n * This is created by the runtime and is transparent to the node author.\n */\nexport class AsyncContextView<TContext extends Record<string, any>> implements IAsyncContext<TContext> {\n\tpublic readonly type = 'async' as const\n\n\tconstructor(private syncContext: ISyncContext<TContext>) {}\n\n\tget<K extends keyof TContext>(key: K): Promise<TContext[K] | undefined> {\n\t\treturn Promise.resolve(this.syncContext.get(key))\n\t}\n\n\tset<K extends keyof TContext>(key: K, value: TContext[K]): Promise<void> {\n\t\tthis.syncContext.set(key, value)\n\t\treturn Promise.resolve()\n\t}\n\n\thas<K extends keyof TContext>(key: K): Promise<boolean> {\n\t\treturn Promise.resolve(this.syncContext.has(key))\n\t}\n\n\tdelete<K extends keyof TContext>(key: K): Promise<boolean> {\n\t\treturn Promise.resolve(this.syncContext.delete(key))\n\t}\n\n\ttoJSON(): Promise<Record<string, any>> {\n\t\treturn Promise.resolve(this.syncContext.toJSON())\n\t}\n}\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// src/evaluator.ts
|
|
2
|
+
var PropertyEvaluator = class {
|
|
3
|
+
evaluate(expression, context) {
|
|
4
|
+
try {
|
|
5
|
+
if (!/^[a-zA-Z0-9_$.]+$/.test(expression)) {
|
|
6
|
+
console.error(`Error evaluating expression: "${expression}" contains invalid characters.`);
|
|
7
|
+
return void 0;
|
|
8
|
+
}
|
|
9
|
+
const parts = expression.split(".");
|
|
10
|
+
const startKey = parts[0];
|
|
11
|
+
if (!Object.hasOwn(context, startKey)) {
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
let current = context[startKey];
|
|
15
|
+
for (let i = 1; i < parts.length; i++) {
|
|
16
|
+
if (current === null || current === void 0) {
|
|
17
|
+
return void 0;
|
|
18
|
+
}
|
|
19
|
+
current = current[parts[i]];
|
|
20
|
+
}
|
|
21
|
+
return current;
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error(`Error evaluating property expression "${expression}":`, error);
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var UnsafeEvaluator = class {
|
|
29
|
+
evaluate(expression, context) {
|
|
30
|
+
try {
|
|
31
|
+
const validIdentifierRegex = /^[a-z_$][\w$]*$/i;
|
|
32
|
+
const validKeys = Object.keys(context).filter((key) => validIdentifierRegex.test(key));
|
|
33
|
+
const validContext = {};
|
|
34
|
+
for (const key of validKeys) {
|
|
35
|
+
validContext[key] = context[key];
|
|
36
|
+
}
|
|
37
|
+
const sandbox = new Function(...validKeys, `return ${expression}`);
|
|
38
|
+
return sandbox(...validKeys.map((k) => validContext[k]));
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.error(`Error evaluating expression "${expression}":`, error);
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export { PropertyEvaluator, UnsafeEvaluator };
|
|
47
|
+
//# sourceMappingURL=chunk-PH2IYZHV.js.map
|
|
48
|
+
//# sourceMappingURL=chunk-PH2IYZHV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/evaluator.ts"],"names":[],"mappings":";AAWO,IAAM,oBAAN,MAA8C;AAAA,EACpD,QAAA,CAAS,YAAoB,OAAA,EAAmC;AAC/D,IAAA,IAAI;AAEH,MAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,UAAU,CAAA,EAAG;AAC1C,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiC,UAAU,CAAA,8BAAA,CAAgC,CAAA;AACzF,QAAA,OAAO,KAAA,CAAA;AAAA,MACR;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAClC,MAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AAExB,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,QAAQ,CAAA,EAAG;AACtC,QAAA,OAAO,KAAA,CAAA;AAAA,MACR;AAEA,MAAA,IAAI,OAAA,GAAU,QAAQ,QAAQ,CAAA;AAC9B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,KAAA,CAAA,EAAW;AAC9C,UAAA,OAAO,KAAA,CAAA;AAAA,QACR;AACA,QAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,OAAA;AAAA,IACR,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,UAAU,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAC5E,MAAA,OAAO,MAAA;AAAA,IACR;AAAA,EACD;AACD;AAaO,IAAM,kBAAN,MAA4C;AAAA,EAClD,QAAA,CAAS,YAAoB,OAAA,EAAmC;AAC/D,IAAA,IAAI;AAEH,MAAA,MAAM,oBAAA,GAAuB,kBAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,oBAAA,CAAqB,IAAA,CAAK,GAAG,CAAC,CAAA;AACrF,MAAA,MAAM,eAAoC,EAAC;AAC3C,MAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC5B,QAAA,YAAA,CAAa,GAAG,CAAA,GAAI,OAAA,CAAQ,GAAG,CAAA;AAAA,MAChC;AAGA,MAAA,MAAM,UAAU,IAAI,QAAA,CAAS,GAAG,SAAA,EAAW,CAAA,OAAA,EAAU,UAAU,CAAA,CAAE,CAAA;AACjE,MAAA,OAAO,OAAA,CAAQ,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,UAAU,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAEnE,MAAA,OAAO,MAAA;AAAA,IACR;AAAA,EACD;AACD","file":"chunk-PH2IYZHV.js","sourcesContent":["import type { IEvaluator } from './types'\n\n/**\n * A safe evaluator that only allows simple property access.\n * It cannot execute arbitrary code and is secure for untrusted inputs.\n *\n * Example expressions:\n * - \"result.output.status\"\n * - \"context.user.isAdmin\"\n * - \"input.value\"\n */\nexport class PropertyEvaluator implements IEvaluator {\n\tevaluate(expression: string, context: Record<string, any>): any {\n\t\ttry {\n\t\t\t// Basic validation to ensure it's a simple path\n\t\t\tif (!/^[a-zA-Z0-9_$.]+$/.test(expression)) {\n\t\t\t\tconsole.error(`Error evaluating expression: \"${expression}\" contains invalid characters.`)\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\tconst parts = expression.split('.')\n\t\t\tconst startKey = parts[0]\n\n\t\t\tif (!Object.hasOwn(context, startKey)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\n\t\t\tlet current = context[startKey]\n\t\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\t\tif (current === null || current === undefined) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\tcurrent = current[parts[i]]\n\t\t\t}\n\t\t\treturn current\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error evaluating property expression \"${expression}\":`, error)\n\t\t\treturn undefined\n\t\t}\n\t}\n}\n\n/**\n * @warning This evaluator uses `new Function()` and can execute arbitrary\n * JavaScript code. It poses a significant security risk if the expressions\n * are not from a trusted source (e.g., user input).\n *\n * It should only be used in controlled environments where all workflow\n * definitions are static and authored by trusted developers.\n *\n * For safer evaluation, use the default `PropertyEvaluator` or install a\n * sandboxed library like `jsep` to create a custom, secure evaluator.\n */\nexport class UnsafeEvaluator implements IEvaluator {\n\tevaluate(expression: string, context: Record<string, any>): any {\n\t\ttry {\n\t\t\t// filter out keys that aren't valid JavaScript identifiers\n\t\t\tconst validIdentifierRegex = /^[a-z_$][\\w$]*$/i\n\t\t\tconst validKeys = Object.keys(context).filter((key) => validIdentifierRegex.test(key))\n\t\t\tconst validContext: Record<string, any> = {}\n\t\t\tfor (const key of validKeys) {\n\t\t\t\tvalidContext[key] = context[key]\n\t\t\t}\n\n\t\t\t// sandboxed function prevents access to global scope (e.g., `window`, `process`).\n\t\t\tconst sandbox = new Function(...validKeys, `return ${expression}`)\n\t\t\treturn sandbox(...validKeys.map((k) => validContext[k]))\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error evaluating expression \"${expression}\":`, error)\n\t\t\t// default to a \"falsy\" value.\n\t\t\treturn undefined\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { CancelledWorkflowError, FatalNodeExecutionError } from './chunk-5ZXV3R5D.js';
|
|
2
|
+
|
|
3
|
+
// src/runtime/executors.ts
|
|
4
|
+
var FunctionNodeExecutor = class {
|
|
5
|
+
constructor(implementation, maxRetries, eventBus) {
|
|
6
|
+
this.implementation = implementation;
|
|
7
|
+
this.maxRetries = maxRetries;
|
|
8
|
+
this.eventBus = eventBus;
|
|
9
|
+
}
|
|
10
|
+
async execute(nodeDef, context, executionId, signal) {
|
|
11
|
+
let lastError;
|
|
12
|
+
for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
|
|
13
|
+
try {
|
|
14
|
+
signal?.throwIfAborted();
|
|
15
|
+
const result = await this.implementation(context);
|
|
16
|
+
if (attempt > 1) {
|
|
17
|
+
context.dependencies.logger.info(`Node execution succeeded after retry`, {
|
|
18
|
+
nodeId: nodeDef.id,
|
|
19
|
+
attempt,
|
|
20
|
+
executionId
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
} catch (error) {
|
|
25
|
+
lastError = error;
|
|
26
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
27
|
+
throw new CancelledWorkflowError("Workflow cancelled");
|
|
28
|
+
}
|
|
29
|
+
if (error instanceof FatalNodeExecutionError) break;
|
|
30
|
+
if (attempt < this.maxRetries) {
|
|
31
|
+
context.dependencies.logger.warn(`Node execution failed, retrying`, {
|
|
32
|
+
nodeId: nodeDef.id,
|
|
33
|
+
attempt,
|
|
34
|
+
maxRetries: this.maxRetries,
|
|
35
|
+
error: error instanceof Error ? error.message : String(error),
|
|
36
|
+
executionId
|
|
37
|
+
});
|
|
38
|
+
await this.eventBus.emit("node:retry", {
|
|
39
|
+
blueprintId: context.dependencies.blueprint?.id || "",
|
|
40
|
+
nodeId: nodeDef.id,
|
|
41
|
+
attempt,
|
|
42
|
+
executionId
|
|
43
|
+
});
|
|
44
|
+
} else {
|
|
45
|
+
context.dependencies.logger.error(`Node execution failed after all retries`, {
|
|
46
|
+
nodeId: nodeDef.id,
|
|
47
|
+
attempts: this.maxRetries,
|
|
48
|
+
error: error instanceof Error ? error.message : String(error),
|
|
49
|
+
executionId
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw lastError;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var ClassNodeExecutor = class {
|
|
58
|
+
constructor(implementation, maxRetries, eventBus) {
|
|
59
|
+
this.implementation = implementation;
|
|
60
|
+
this.maxRetries = maxRetries;
|
|
61
|
+
this.eventBus = eventBus;
|
|
62
|
+
}
|
|
63
|
+
async execute(nodeDef, context, executionId, signal) {
|
|
64
|
+
const instance = new this.implementation(nodeDef.params || {});
|
|
65
|
+
try {
|
|
66
|
+
signal?.throwIfAborted();
|
|
67
|
+
const prepResult = await instance.prep(context);
|
|
68
|
+
let execResult;
|
|
69
|
+
let lastError;
|
|
70
|
+
for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
|
|
71
|
+
try {
|
|
72
|
+
signal?.throwIfAborted();
|
|
73
|
+
execResult = await instance.exec(prepResult, context);
|
|
74
|
+
lastError = void 0;
|
|
75
|
+
if (attempt > 1) {
|
|
76
|
+
context.dependencies.logger.info(`Node execution succeeded after retry`, {
|
|
77
|
+
nodeId: nodeDef.id,
|
|
78
|
+
attempt,
|
|
79
|
+
executionId
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
} catch (error) {
|
|
84
|
+
lastError = error;
|
|
85
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
86
|
+
throw new CancelledWorkflowError("Workflow cancelled");
|
|
87
|
+
}
|
|
88
|
+
if (error instanceof FatalNodeExecutionError) break;
|
|
89
|
+
if (attempt < this.maxRetries) {
|
|
90
|
+
context.dependencies.logger.warn(`Node execution failed, retrying`, {
|
|
91
|
+
nodeId: nodeDef.id,
|
|
92
|
+
attempt,
|
|
93
|
+
maxRetries: this.maxRetries,
|
|
94
|
+
error: error instanceof Error ? error.message : String(error),
|
|
95
|
+
executionId
|
|
96
|
+
});
|
|
97
|
+
await this.eventBus.emit("node:retry", {
|
|
98
|
+
blueprintId: context.dependencies.blueprint?.id || "",
|
|
99
|
+
nodeId: nodeDef.id,
|
|
100
|
+
attempt,
|
|
101
|
+
executionId
|
|
102
|
+
});
|
|
103
|
+
} else {
|
|
104
|
+
context.dependencies.logger.error(`Node execution failed after all retries`, {
|
|
105
|
+
nodeId: nodeDef.id,
|
|
106
|
+
attempts: this.maxRetries,
|
|
107
|
+
error: error instanceof Error ? error.message : String(error),
|
|
108
|
+
executionId
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (lastError) {
|
|
114
|
+
signal?.throwIfAborted();
|
|
115
|
+
execResult = await instance.fallback(lastError, context);
|
|
116
|
+
}
|
|
117
|
+
signal?.throwIfAborted();
|
|
118
|
+
if (!execResult) {
|
|
119
|
+
throw new Error("Execution failed after all retries");
|
|
120
|
+
}
|
|
121
|
+
return await instance.post(execResult, context);
|
|
122
|
+
} catch (error) {
|
|
123
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
124
|
+
throw new CancelledWorkflowError("Workflow cancelled");
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
var BuiltInNodeExecutor = class {
|
|
131
|
+
constructor(executeBuiltIn) {
|
|
132
|
+
this.executeBuiltIn = executeBuiltIn;
|
|
133
|
+
}
|
|
134
|
+
async execute(nodeDef, context) {
|
|
135
|
+
return this.executeBuiltIn(nodeDef, context.context);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export { BuiltInNodeExecutor, ClassNodeExecutor, FunctionNodeExecutor };
|
|
140
|
+
//# sourceMappingURL=chunk-QRMUKDSP.js.map
|
|
141
|
+
//# sourceMappingURL=chunk-QRMUKDSP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/executors.ts"],"names":[],"mappings":"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","file":"chunk-QRMUKDSP.js","sourcesContent":["import { CancelledWorkflowError, FatalNodeExecutionError } from '../errors'\nimport type {\n\tContextImplementation,\n\tIEventBus,\n\tNodeClass,\n\tNodeContext,\n\tNodeDefinition,\n\tNodeFunction,\n\tNodeResult,\n} from '../types'\n\nexport interface ExecutionStrategy {\n\texecute: (\n\t\tnodeDef: NodeDefinition,\n\t\tcontext: NodeContext<any, any, any>,\n\t\texecutionId?: string,\n\t\tsignal?: AbortSignal,\n\t) => Promise<NodeResult<any, any>>\n}\n\nexport class FunctionNodeExecutor implements ExecutionStrategy {\n\tconstructor(\n\t\tprivate implementation: NodeFunction,\n\t\tprivate maxRetries: number,\n\t\tprivate eventBus: IEventBus,\n\t) {}\n\n\tasync execute(\n\t\tnodeDef: NodeDefinition,\n\t\tcontext: NodeContext<any, any, any>,\n\t\texecutionId?: string,\n\t\tsignal?: AbortSignal,\n\t): Promise<NodeResult<any, any>> {\n\t\tlet lastError: any\n\t\tfor (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n\t\t\ttry {\n\t\t\t\tsignal?.throwIfAborted()\n\t\t\t\tconst result = await this.implementation(context)\n\t\t\t\tif (attempt > 1) {\n\t\t\t\t\tcontext.dependencies.logger.info(`Node execution succeeded after retry`, {\n\t\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\treturn result\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error\n\t\t\t\tif (error instanceof DOMException && error.name === 'AbortError') {\n\t\t\t\t\tthrow new CancelledWorkflowError('Workflow cancelled')\n\t\t\t\t}\n\t\t\t\tif (error instanceof FatalNodeExecutionError) break\n\t\t\t\tif (attempt < this.maxRetries) {\n\t\t\t\t\tcontext.dependencies.logger.warn(`Node execution failed, retrying`, {\n\t\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tmaxRetries: this.maxRetries,\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t})\n\t\t\t\t\tawait this.eventBus.emit('node:retry', {\n\t\t\t\t\t\tblueprintId: context.dependencies.blueprint?.id || '',\n\t\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tcontext.dependencies.logger.error(`Node execution failed after all retries`, {\n\t\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\t\tattempts: this.maxRetries,\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow lastError\n\t}\n}\n\nexport class ClassNodeExecutor implements ExecutionStrategy {\n\tconstructor(\n\t\tprivate implementation: NodeClass,\n\t\tprivate maxRetries: number,\n\t\tprivate eventBus: IEventBus,\n\t) {}\n\n\tasync execute(\n\t\tnodeDef: NodeDefinition,\n\t\tcontext: NodeContext<any, any, any>,\n\t\texecutionId?: string,\n\t\tsignal?: AbortSignal,\n\t): Promise<NodeResult<any, any>> {\n\t\tconst instance = new this.implementation(nodeDef.params || {})\n\t\ttry {\n\t\t\tsignal?.throwIfAborted()\n\t\t\tconst prepResult = await instance.prep(context)\n\t\t\tlet execResult: Omit<NodeResult, 'error'> | undefined\n\t\t\tlet lastError: any\n\t\t\tfor (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n\t\t\t\ttry {\n\t\t\t\t\tsignal?.throwIfAborted()\n\t\t\t\t\texecResult = await instance.exec(prepResult, context)\n\t\t\t\t\tlastError = undefined\n\t\t\t\t\tif (attempt > 1) {\n\t\t\t\t\t\tcontext.dependencies.logger.info(`Node execution succeeded after retry`, {\n\t\t\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error\n\t\t\t\t\tif (error instanceof DOMException && error.name === 'AbortError') {\n\t\t\t\t\t\tthrow new CancelledWorkflowError('Workflow cancelled')\n\t\t\t\t\t}\n\t\t\t\t\tif (error instanceof FatalNodeExecutionError) break\n\t\t\t\t\tif (attempt < this.maxRetries) {\n\t\t\t\t\t\tcontext.dependencies.logger.warn(`Node execution failed, retrying`, {\n\t\t\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\tmaxRetries: this.maxRetries,\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tawait this.eventBus.emit('node:retry', {\n\t\t\t\t\t\t\tblueprintId: context.dependencies.blueprint?.id || '',\n\t\t\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\t\t\tattempt,\n\t\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.dependencies.logger.error(`Node execution failed after all retries`, {\n\t\t\t\t\t\t\tnodeId: nodeDef.id,\n\t\t\t\t\t\t\tattempts: this.maxRetries,\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lastError) {\n\t\t\t\tsignal?.throwIfAborted()\n\t\t\t\texecResult = await instance.fallback(lastError, context)\n\t\t\t}\n\t\t\tsignal?.throwIfAborted()\n\t\t\tif (!execResult) {\n\t\t\t\tthrow new Error('Execution failed after all retries')\n\t\t\t}\n\t\t\treturn await instance.post(execResult, context)\n\t\t} catch (error) {\n\t\t\tif (error instanceof DOMException && error.name === 'AbortError') {\n\t\t\t\tthrow new CancelledWorkflowError('Workflow cancelled')\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n}\n\nexport class BuiltInNodeExecutor implements ExecutionStrategy {\n\tconstructor(\n\t\tprivate executeBuiltIn: (\n\t\t\tnodeDef: NodeDefinition,\n\t\t\tcontext: ContextImplementation<any>,\n\t\t) => Promise<NodeResult<any, any>>,\n\t) {}\n\n\tasync execute(\n\t\tnodeDef: NodeDefinition,\n\t\tcontext: NodeContext<Record<string, unknown>, Record<string, unknown>, any>,\n\t): Promise<NodeResult<any, any>> {\n\t\treturn this.executeBuiltIn(nodeDef, context.context as ContextImplementation<any>)\n\t}\n}\n"]}
|