@codemation/core 0.12.0 → 0.13.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.
Files changed (61) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/{CostCatalogContract-DD7fQ4FF.d.cts → CostCatalogContract-Dxq1BTyi.d.cts} +2 -2
  3. package/dist/{EngineRuntimeRegistration.types-DTV5_7Jw.d.cts → EngineRuntimeRegistration.types-CqcTWexS.d.cts} +3 -3
  4. package/dist/{EngineRuntimeRegistration.types-Dl92Hdoi.d.ts → EngineRuntimeRegistration.types-Cr75cSfL.d.ts} +2 -2
  5. package/dist/{InMemoryRunDataFactory-qMiYjhCK.d.cts → InMemoryRunDataFactory-Csy2evr_.d.cts} +5 -2
  6. package/dist/{ItemsInputNormalizer-Div-fb6a.cjs → ItemsInputNormalizer-57EdA1ad.cjs} +2 -2
  7. package/dist/{ItemsInputNormalizer-Div-fb6a.cjs.map → ItemsInputNormalizer-57EdA1ad.cjs.map} +1 -1
  8. package/dist/{ItemsInputNormalizer-C09a7iFP.d.ts → ItemsInputNormalizer-BWtlwdVI.d.ts} +2 -2
  9. package/dist/{ItemsInputNormalizer-BhuxvZh5.js → ItemsInputNormalizer-BkSvmfAW.js} +2 -2
  10. package/dist/{ItemsInputNormalizer-BhuxvZh5.js.map → ItemsInputNormalizer-BkSvmfAW.js.map} +1 -1
  11. package/dist/{ItemsInputNormalizer-DLaD6rTl.d.cts → ItemsInputNormalizer-pLrWwUAP.d.cts} +3 -3
  12. package/dist/{RunIntentService-CWMMrAP4.d.cts → RunIntentService-BitgkKaT.d.cts} +2 -2
  13. package/dist/{RunIntentService-BOSGwmqn.d.ts → RunIntentService-DYpqfu6D.d.ts} +2 -2
  14. package/dist/{agentMcpTypes-DUmniLOY.d.cts → agentMcpTypes-DGIwk6Ue.d.cts} +20 -2
  15. package/dist/bootstrap/index.cjs +3 -3
  16. package/dist/bootstrap/index.d.cts +5 -5
  17. package/dist/bootstrap/index.d.ts +5 -5
  18. package/dist/bootstrap/index.js +3 -3
  19. package/dist/{bootstrap-D460dCgS.cjs → bootstrap-BEu1fJBM.cjs} +3 -3
  20. package/dist/{bootstrap-D460dCgS.cjs.map → bootstrap-BEu1fJBM.cjs.map} +1 -1
  21. package/dist/{bootstrap-CKTMMNmL.js → bootstrap-CSeInbj1.js} +3 -3
  22. package/dist/{bootstrap-CKTMMNmL.js.map → bootstrap-CSeInbj1.js.map} +1 -1
  23. package/dist/browser.cjs +3 -2
  24. package/dist/browser.d.cts +4 -4
  25. package/dist/browser.d.ts +3 -3
  26. package/dist/browser.js +3 -3
  27. package/dist/contracts.d.cts +5 -5
  28. package/dist/contracts.d.ts +2 -2
  29. package/dist/{di-tO6R7VJV.cjs → di-C-2ep8NZ.cjs} +9 -1
  30. package/dist/di-C-2ep8NZ.cjs.map +1 -0
  31. package/dist/{di-DdsgWfVy.js → di-D9Mv3kF3.js} +4 -2
  32. package/dist/di-D9Mv3kF3.js.map +1 -0
  33. package/dist/{executionPersistenceContracts-DenJJK2T.d.cts → executionPersistenceContracts-CN9d7AnL.d.cts} +2 -2
  34. package/dist/{index-BZDhEQ6W.d.ts → index-CqZeNGAp.d.ts} +71 -5
  35. package/dist/{index-CSKKuK60.d.ts → index-rllWL4r-.d.ts} +20 -2
  36. package/dist/index.cjs +23 -3
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +71 -8
  39. package/dist/index.d.ts +5 -5
  40. package/dist/index.js +22 -4
  41. package/dist/index.js.map +1 -1
  42. package/dist/{params-DqRvku2h.d.cts → params-DRUr0F5v.d.cts} +2 -2
  43. package/dist/{runtime-BPZgnZ9G.js → runtime-6-U2Cou5.js} +81 -4
  44. package/dist/runtime-6-U2Cou5.js.map +1 -0
  45. package/dist/{runtime-CyW9c9XM.cjs → runtime-DjYXgOo0.cjs} +81 -4
  46. package/dist/runtime-DjYXgOo0.cjs.map +1 -0
  47. package/dist/testing.cjs +3 -3
  48. package/dist/testing.d.cts +3 -3
  49. package/dist/testing.d.ts +3 -3
  50. package/dist/testing.js +3 -3
  51. package/package.json +1 -1
  52. package/src/binaries/DefaultExecutionBinaryServiceFactory.ts +27 -2
  53. package/src/binaries/DefaultNodeBinaryAttachmentServiceFactory.ts +14 -0
  54. package/src/binaries/boundedReadBinary.types.ts +90 -0
  55. package/src/contracts/runtimeTypes.ts +19 -0
  56. package/src/contracts/workspaceFileTypes.ts +73 -0
  57. package/src/index.ts +2 -0
  58. package/dist/di-DdsgWfVy.js.map +0 -1
  59. package/dist/di-tO6R7VJV.cjs.map +0 -1
  60. package/dist/runtime-BPZgnZ9G.js.map +0 -1
  61. package/dist/runtime-CyW9c9XM.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-BPZgnZ9G.js","names":["metadata: PersistedRuntimeTypeMetadata","context: DefinedNodeRunContext<TConfig, TBindings>","payload: DefineNodeExecuteArgs<TConfig, TInputJson>","name: string","id?: string","definition: DefinedNode<TKey, TConfig, TInputJson, TOutputJson, TBindings>","node","policy: \"halt\" | \"auto-accept\"","wf: WorkflowBuilder","from: NodeRef","branchPort: OutputPortKey","created: NodeRef[]","prev: NodeRef | null","port: OutputPortKey","wf: WorkflowBuilder","endpoints: ReadonlyArray<ChainCursorEndpoint>","port: OutputPortKey","prev: NodeRef | null","nextEndpoints: ChainCursorEndpoint[]","node","meta: { id: WorkflowId; name: string }","options?: Readonly<Record<string, never>>","entries: NodeIdEntry[]","node","emptyIds: NodeIdEntry[]","duplicateIds: NodeIdEntry[]","lines: string[]","output","eventBus: RunEventBus | undefined","parent: ParentExecutionRef | undefined","eventBus: RunEventBus | undefined","storage: BinaryStorage","workflowId: WorkflowId","runId: RunId","nodeId: NodeId","activationId: NodeActivationId","now: () => Date","storage: BinaryStorage","workflowId: WorkflowId","runId: RunId","now: () => Date","activationScheduler: ActivationSchedulerPort","workflowExecutionRepository: WorkflowExecutionRepository","nodeEventPublisher: NodeEventPublisher","nodeActivationRequestInputPreparer: NodeActivationRequestInputPreparer","pending: PendingNodeExecution","activationIdFactory: ActivationIdFactory","entries: Entry[]","nodeId: NodeId","activationId: NodeActivationId","cause?: unknown","workflowNodeInstanceFactory: WorkflowNodeInstanceFactory","nodeInstance: unknown","single: Extract<NodeActivationRequest, { kind: \"single\" }>","nodeId: NodeId","nodeType: string","credentialSessions: CredentialSessionService","maxAttempts: number","delayMs: number","maxAttempts: number","initialDelayMs: number","multiplier: number","maxDelayMs?: number","jitter?: boolean","noOpNodeExecutionTelemetry: NodeExecutionTelemetry","noOpTelemetrySpanScope: TelemetrySpanScope","binaryStorage: BinaryStorage","telemetryFactory: ExecutionTelemetryFactory","costTrackingFactory: CostTrackingTelemetryFactory","currentDate: () => Date","collections?: CollectionsContext","nodeResolver?: NodeResolver","currentScope: TelemetryScope","costCatalog: CostCatalog","costCatalog: CostCatalog","sleeper: AsyncSleeper","lastError: unknown","out: NodeOutputs","activationIdFactory: ActivationIdFactory","credentialResolverFactory: CredentialResolverFactory","runId: RunId","taskId: string","nodeInstanceFactory: WorkflowNodeInstanceFactory","retryRunner: InProcessRetryRunner","suspensionHandler?: NodeSuspensionHandler","loadRunState?: (runId: RunId) => Promise<PersistedRunState | undefined>","node","single: Extract<NodeActivationRequest, { kind: \"single\" }>","syntheticItem: Item","args: RunnableNodeExecuteArgs","byPort: Partial<Record<string, Item[]>>","raw: unknown","name: string","missingTokenId?: string","name: string","missingTokenId?: string","node","tokenRegistry: PersistedWorkflowTokenRegistryLike","node","fallback: Record<string, unknown>","raw: unknown","rows: Array<Readonly<{ label: string; value: string }>>","out: Record<PropertyKey, unknown>","workflowRepository: WorkflowRepository","tokenRegistry: PersistedWorkflowTokenRegistryLike","codec: WorkflowSnapshotCodec","missingRuntimeFallbacks: MissingRuntimeFallbacks","node","nodeResolver: NodeResolver","workflowExecutionRepository: WorkflowExecutionRepository","runId: RunId","workflowId: WorkflowId","parent: ParentExecutionRef | undefined","publishNodeEvent: (\n kind: \"nodeQueued\" | \"nodeStarted\" | \"nodeCompleted\" | \"nodeFailed\",\n snapshot: NodeExecutionSnapshot,\n ) => Promise<void>","publishConnectionInvocationEvent?: (record: ConnectionInvocationRecord) => Promise<void>","updated: NodeExecutionSnapshot","record: ConnectionInvocationRecord","workflowExecutionRepository: WorkflowExecutionRepository","nodeEventPublisher: NodeEventPublisher","eventBus?: RunEventBus","missingRuntimeExecutionMarker: MissingRuntimeExecutionMarker","node","executionContextFactory: ExecutionContextFactory","credentialResolverFactory: CredentialResolverFactory","defsById: ReadonlyMap<NodeId, NodeDef>","outgoingByNode: ReadonlyMap<NodeId, ReadonlyArray<TopologyOutgoingEdge>>","incomingByNode: ReadonlyMap<NodeId, ReadonlyArray<TopologyIncomingEdge>>","expectedInputsByNode: ReadonlyMap<NodeId, ReadonlyArray<InputPortKey>>","rootNodeIds: ReadonlyArray<NodeId>","order: InputPortKey[]","node","activationIdFactory: ActivationIdFactory","workflowExecutionRepository: WorkflowExecutionRepository","runDataFactory: RunDataFactory","runExecutionContextFactory: WorkflowRunExecutionContextFactory","workflowSnapshotResolver: WorkflowSnapshotResolver","planningFactory: EngineWorkflowPlanningFactory","nodeStatePublisherFactory: NodeRunStateWriterFactory","credentialResolverFactory: CredentialResolverFactory","nodeActivationRequestComposer: NodeActivationRequestComposer","persistedRunStateTerminalBuilder: PersistedRunStateTerminalBuilder","activationEnqueueService: ActivationEnqueueService","nodeEventPublisher: NodeEventPublisher","semantics: RunStateSemantics","waiters: EngineWaiters","policyErrorServices: WorkflowPolicyErrorServices","terminalPersistence: RunTerminalPersistenceCoordinator","executionLimitsPolicy: EngineExecutionLimitsPolicy","result: RunResult","queue: RunQueueEntry[]","next: ReturnType<(typeof planner)[\"nextActivation\"]>","pendingResume: PendingResumeEntry","triggerOutputs: NodeOutputs","topology: WorkflowTopology","queue: RunQueueEntry[]","outputsByNode: Record<NodeId, NodeOutputs>","clearedNodeIds: NodeId[]","preservedPinnedNodeIds: NodeId[]","satisfiedNodeIds: NodeId[]","frontierNodeIds: NodeId[]","received: Record<InputPortKey, Items>","input","output","pendingNodeIds: NodeId[]","runIdFactory: RunIdFactory","workflowExecutionRepository: WorkflowExecutionRepository","runDataFactory: RunDataFactory","workflowSnapshotFactory: WorkflowSnapshotFactory","planningFactory: EngineWorkflowPlanningFactory","nodeStatePublisherFactory: NodeRunStateWriterFactory","runExecutionContextFactory: WorkflowRunExecutionContextFactory","nodeActivationRequestComposer: NodeActivationRequestComposer","activationEnqueueService: ActivationEnqueueService","semantics: RunStateSemantics","waiters: EngineWaiters","workflowPolicyRuntimeDefaults: WorkflowPolicyRuntimeDefaults | undefined","executionLimitsPolicy: EngineExecutionLimitsPolicy","nodeEventPublisher: NodeEventPublisher","persistedRunStateTerminalBuilder: PersistedRunStateTerminalBuilder","planning: Readonly<ReturnType<EngineWorkflowPlanningFactory[\"create\"]>>","initialNodeSnapshotsByNodeId: Record<NodeId, NodeExecutionSnapshot>","queue: RunQueueEntry[]","planningFromState: Readonly<ReturnType<EngineWorkflowPlanningFactory[\"create\"]>>","result: RunResult","offloadPolicy: NodeOffloadPolicy","workerScheduler: NodeExecutionScheduler","inline: InlineDrivingScheduler","workerRequest: NodeExecutionRequest","nodeExecutor: NodeExecutor","receipt: NodeActivationReceipt","ENGINE_EXECUTION_LIMITS_DEFAULTS: EngineExecutionLimitsPolicyConfig","config: EngineExecutionLimitsPolicyConfig","runRepository: WorkflowExecutionRepository","storageEvaluator: WorkflowStoragePolicyEvaluator","nodeResolver: NodeResolver","nodeResolver: NodeResolver","chunks: Uint8Array[]","bytes: Uint8Array","output","out: Record<NodeId, NodeOutputs>","triggerSetupStateRepository: TriggerSetupStateRepository","logger: PollingTriggerLogger","first: TState | undefined","err: unknown","workflowExecutionRepository: WorkflowExecutionRepository","workflowSnapshotResolver: WorkflowSnapshotResolver","runDataFactory: RunDataFactory","runExecutionContextFactory: WorkflowRunExecutionContextFactory","nodeStatePublisherFactory: NodeRunStateWriterFactory","nodeActivationRequestComposer: NodeActivationRequestComposer","nodeExecutor: NodeExecutor","continuation: NodeActivationContinuation","executionLimitsPolicy: EngineExecutionLimitsPolicy","node","resumeContext: ResumeContext | undefined","topology: WorkflowTopology","nodeInstances: ReadonlyMap<NodeId, unknown>","inst","queue: RunQueueEntry[]","input","matches: string[]","workflowNodeInstanceFactory: WorkflowNodeInstanceFactory","node","workflowRepository: WorkflowRepository","workflowActivationPolicy: WorkflowActivationPolicy","runIdFactory: RunIdFactory","runDataFactory: RunDataFactory","executionContextFactory: ExecutionContextFactory","nodeExecutionStatePublisherFactory: NodeRunStateWriterFactory","nodeResolver: NodeResolver","triggerSetupStateRepository: TriggerSetupStateRepository","emitHandler: TriggerEmitHandler","executionLimitsPolicy: EngineExecutionLimitsPolicy","diagnostics: TriggerRuntimeDiagnostics | undefined","pollingTriggerRuntime: PollingTriggerRuntime","pollingTriggerDedupWindow: PollingTriggerDedupWindow","node","nextState: unknown","triggerError: unknown","out: string[]","deps: EngineFacadeDeps","engine: Engine","workflowRepository: WorkflowRepository","engine: Engine","workflowRepository: WorkflowRepository","node","workflowRepository: WorkflowRepository","workflowActivationPolicy: WorkflowActivationPolicy","diagnostics?: WebhookTriggerRoutingDiagnostics","paths: string[]"],"sources":["../src/contracts/humanTaskStoreTypes.ts","../src/contracts/hitlSeamTypes.ts","../src/authoring/DefinedNodeRegistry.ts","../src/runtime-types/persistedRuntimeTypeModelRegistry.ts","../src/runtime-types/PersistedRuntimeTypeNameResolver.ts","../src/runtime-types/StackTraceCallSitePathResolver.ts","../src/runtime-types/PersistedRuntimeTypeMetadataStoreRegistry.ts","../src/runtime-types/InjectableRuntimeDecoratorComposerRegistry.ts","../src/runtime-types/runtimeTypeDecorators.types.ts","../src/authoring/defineNode.types.ts","../src/authoring/defineHumanApprovalNode.types.ts","../src/workflow/dsl/WhenBuilder.ts","../src/workflow/dsl/ChainCursorResolver.ts","../src/workflow/dsl/NodeIdSlugifier.ts","../src/workflow/dsl/WorkflowDefinitionError.ts","../src/workflow/dsl/WorkflowBuilder.ts","../src/workflow/definition/ConnectionInvocationIdFactory.ts","../src/workflow/definition/WorkflowExecutableNodeClassifier.ts","../src/workflow/definition/WorkflowExecutableNodeClassifierFactory.ts","../src/workflow/graph/ExecutableGraph.ts","../src/workflow/graph/DefaultWorkflowGraphFactory.ts","../src/events/ConnectionInvocationEventPublisher.ts","../src/events/NodeEventPublisher.ts","../src/binaries/DefaultNodeBinaryAttachmentServiceFactory.ts","../src/binaries/UnavailableBinaryStorage.ts","../src/binaries/DefaultExecutionBinaryServiceFactory.ts","../src/execution/NodeExecutionSnapshotFactory.ts","../src/execution/NodeInputsByPortFactory.ts","../src/execution/ActivationEnqueueService.ts","../src/execution/ChildExecutionScopeFactory.ts","../src/contracts/itemMeta.ts","../src/execution/FanInMergeByOriginMerger.ts","../src/execution/NodeInputContractError.ts","../src/execution/NodeActivationRequestInputPreparer.ts","../src/execution/NodeInstantiationError.ts","../src/execution/CredentialResolverFactory.ts","../src/execution/DefaultAsyncSleeper.ts","../src/contracts/emitPorts.ts","../src/contracts/NoRetryPolicy.ts","../src/contracts/RetryPolicy.ts","../src/contracts/ExpRetryPolicy.ts","../src/contracts/CostTrackingTelemetryContract.ts","../src/contracts/NoOpCostTrackingTelemetry.ts","../src/contracts/NoOpCostTrackingTelemetryFactory.ts","../src/contracts/NoOpTelemetryArtifactReference.ts","../src/contracts/NoOpTelemetrySpanScope.ts","../src/contracts/NoOpNodeExecutionTelemetry.ts","../src/contracts/NoOpExecutionTelemetry.ts","../src/contracts/NoOpExecutionTelemetryFactory.ts","../src/contracts/workflowActivationPolicy.ts","../src/contracts/CodemationTelemetryAttributeNames.ts","../src/contracts/GenAiTelemetryAttributeNames.ts","../src/contracts/CodemationTelemetryMetricNames.ts","../src/execution/ExecutionTelemetryCostTrackingDecoratorFactory.ts","../src/execution/DefaultExecutionContextFactory.ts","../src/execution/CatalogBackedCostTrackingTelemetry.ts","../src/execution/CatalogBackedCostTrackingTelemetryFactory.ts","../src/execution/InProcessRetryRunner.ts","../src/execution/ItemExprResolver.ts","../src/execution/NodeOutputNormalizer.ts","../src/execution/RunnableOutputBehaviorResolver.ts","../src/execution/InProcessRetryRunnerFactory.ts","../src/execution/NodeActivationRequestComposer.ts","../src/execution/RunSuspendedError.ts","../src/execution/NodeExecutor.ts","../src/execution/NodeExecutorFactory.ts","../src/workflowSnapshots/MissingRuntimeExecutionMarker.ts","../src/workflowSnapshots/MissingRuntimeNodeToken.ts","../src/workflowSnapshots/MissingRuntimeNodeConfig.ts","../src/workflowSnapshots/MissingRuntimeTriggerToken.ts","../src/workflowSnapshots/MissingRuntimeTriggerConfig.ts","../src/workflowSnapshots/MissingRuntimeFallbacksFactory.ts","../src/workflowSnapshots/MissingRuntimeNode.ts","../src/workflowSnapshots/MissingRuntimeTrigger.ts","../src/workflowSnapshots/PersistedRuntimeTypeIdFactory.ts","../src/workflowSnapshots/PersistedWorkflowTokenRegistry.ts","../src/workflowSnapshots/WorkflowSnapshotCodec.ts","../src/workflowSnapshots/WorkflowSnapshotResolver.ts","../src/execution/NodeInstanceFactory.ts","../src/execution/NodeInstanceFactoryFactory.ts","../src/execution/NodeRunStateWriter.ts","../src/execution/NodeRunStateWriterFactory.ts","../src/execution/PersistedRunStateTerminalBuilder.ts","../src/execution/RunStateSemantics.ts","../src/execution/WorkflowRunExecutionContextFactory.ts","../src/execution/StaticCostCatalog.ts","../src/planning/WorkflowTopologyPlanner.ts","../src/orchestration/RunContinuationService.ts","../src/planning/CurrentStateFrontierPlanner.ts","../src/policies/storage/RunPolicySnapshotFactory.ts","../src/orchestration/RunStartService.ts","../src/scheduler/ConfigDrivenOffloadPolicy.ts","../src/scheduler/DefaultDrivingScheduler.ts","../src/scheduler/HintOnlyOffloadPolicy.ts","../src/scheduler/InlineDrivingScheduler.ts","../src/scheduler/LocalOnlyScheduler.ts","../src/policies/executionLimits/EngineExecutionLimitsPolicy.ts","../src/policies/storage/RunTerminalPersistenceCoordinator.ts","../src/policies/WorkflowPolicyErrorServices.ts","../src/policies/storage/WorkflowStoragePolicyEvaluator.ts","../src/runStorage/BinaryBodyBufferReader.ts","../src/runStorage/BinaryBodyReadableStreamFactory.ts","../src/runStorage/InMemoryBinaryStorageRegistry.ts","../src/runStorage/InMemoryRunData.ts","../src/runStorage/InMemoryRunDataFactory.ts","../src/triggers/polling/PollingTriggerDedupWindow.ts","../src/triggers/polling/PollingTriggerRuntime.ts","../src/triggers/polling/PollingTriggerLogger.ts","../src/orchestration/NodeExecutionRequestHandlerService.ts","../src/planning/RunQueuePlanner.ts","../src/planning/EngineWorkflowPlanningFactory.ts","../src/orchestration/TriggerRuntimeService.ts","../src/orchestration/EngineWaiters.ts","../src/orchestration/Engine.ts","../src/runtime/EngineFactory.ts","../src/runtime/EngineWorkflowRunnerService.ts","../src/runtime/EngineWorkflowRunnerServiceFactory.ts","../src/runtime/InMemoryLiveWorkflowRepository.ts","../src/runtime/RunIntentService.ts","../src/runtime/RunIntentServiceFactory.ts","../src/runtime/WorkflowRepositoryWebhookTriggerMatcher.ts","../src/runtime/WorkflowRepositoryWebhookTriggerMatcherFactory.ts"],"sourcesContent":["import type { TypeToken } from \"../di\";\nimport type { HumanTaskActor, HumanTaskSubject } from \"./runtimeTypes\";\nimport type { JsonValue } from \"./workflowTypes\";\n\nexport type HumanTaskStatus = \"pending\" | \"decided\" | \"timed_out\" | \"auto_accepted\" | \"cancelled\";\n\n/** Persisted record for a single HITL task instance. */\nexport interface HumanTaskRecord {\n readonly id: string;\n readonly runId: string;\n readonly workflowId: string;\n readonly workspaceId?: string;\n readonly nodeId: string;\n readonly activationId: string;\n readonly itemIndex: number;\n readonly status: HumanTaskStatus;\n readonly channel: string;\n readonly subject: HumanTaskSubject;\n readonly metadata: Record<string, JsonValue>;\n readonly decisionSchemaJson: string;\n readonly decisionSchemaHash: string;\n readonly onTimeout: \"halt\" | \"auto-accept\";\n readonly deliveryRef?: JsonValue;\n readonly decision?: JsonValue;\n readonly decidedAt?: Date;\n readonly decidedBy?: HumanTaskActor;\n readonly resumeTokenHash: string;\n readonly expiresAt: Date;\n readonly createdAt: Date;\n}\n\nexport interface HumanTaskStore {\n create(record: HumanTaskRecord): Promise<void>;\n findById(taskId: string): Promise<HumanTaskRecord | undefined>;\n findByResumeTokenHash(tokenHash: string): Promise<HumanTaskRecord | undefined>;\n findPendingForWorkspace(workspaceId: string): Promise<ReadonlyArray<HumanTaskRecord>>;\n /** Returns all pending tasks regardless of workspace. Used by the local dev inbox (non-managed mode). */\n findAllPending(): Promise<ReadonlyArray<HumanTaskRecord>>;\n markDecided(args: { taskId: string; decision: JsonValue; decidedBy: HumanTaskActor; decidedAt: Date }): Promise<void>;\n markTimedOut(taskId: string): Promise<void>;\n markAutoAccepted(taskId: string): Promise<void>;\n markCancelled(taskId: string): Promise<void>;\n cancelPendingForRun(runId: string): Promise<void>;\n}\n\nexport const HumanTaskStoreToken = Symbol.for(\"codemation.core.HumanTaskStore\") as TypeToken<\n HumanTaskStore | undefined\n>;\n","import type { TypeToken } from \"../di\";\n\n/**\n * Seam interfaces for HITL collaborators that are implemented in `@codemation/host`\n * and injected into `NodeSuspensionHandler` at runtime. Core defines the interface only —\n * no HTTP, vendor SDK, or Prisma dependencies here.\n */\n\n/** Signs and hashes a HITL resume token. Core only needs the sign and hash operations. */\nexport interface HitlResumeTokenSignerSeam {\n sign(args: { taskId: string; expiresAt: Date; schemaHash: string }): string;\n hashToken(token: string): string;\n}\n\n/** Schedules a delayed BullMQ job that drives the timeout path. */\nexport interface HitlTimeoutJobSchedulerSeam {\n enqueueTimeoutJob(args: { taskId: string; expiresAt: Date }): Promise<void>;\n}\n\nexport const HitlResumeTokenSignerToken = Symbol.for(\"codemation.core.HitlResumeTokenSigner\") as TypeToken<\n HitlResumeTokenSignerSeam | undefined\n>;\n\nexport const HitlTimeoutJobSchedulerToken = Symbol.for(\"codemation.core.HitlTimeoutJobScheduler\") as TypeToken<\n HitlTimeoutJobSchedulerSeam | undefined\n>;\n\n/**\n * Optional workspace ID injected into NodeSuspensionHandler in managed mode (T7 security fix).\n * Allows the handler to stamp the workspaceId on each HumanTaskRecord so HitlCallbackHandler\n * can assert workspace identity independently of the HMAC middleware.\n * Not registered in non-managed mode; NodeSuspensionHandler defaults to null.\n */\nexport const HitlWorkspaceIdToken = Symbol.for(\"codemation.core.HitlWorkspaceId\") as TypeToken<string | undefined>;\n","import type { DefinedNode } from \"./defineNode.types\";\n\nexport class DefinedNodeRegistry {\n private static readonly definitions = new Map<\n string,\n DefinedNode<string, Record<string, unknown>, unknown, unknown>\n >();\n\n static register(definition: DefinedNode<string, Record<string, unknown>, unknown, unknown>): void {\n this.definitions.set(definition.key, definition);\n }\n\n static resolve(key: string): DefinedNode<string, Record<string, unknown>, unknown, unknown> | undefined {\n return this.definitions.get(key);\n }\n}\n","/** Shared metadata key used to attach persisted runtime-type information to decorated classes. */\nexport const persistedRuntimeTypeMetadataKey = Symbol.for(\"codemation.core.persistedRuntimeTypeMetadata\");\n\nexport type DecoratedRuntimeType = Readonly<{ name?: string }> & object;\n\n/** Categories of runtime classes that can be discovered and rehydrated from persisted snapshots. */\nexport type PersistedRuntimeTypeKind = \"node\" | \"tool\" | \"chatModel\";\n\nexport interface PersistedRuntimeTypeDecoratorOptions {\n readonly name?: string;\n readonly packageName?: string;\n readonly moduleUrl?: string;\n}\n\n/** Serialized metadata attached to a decorated runtime type. */\nexport interface PersistedRuntimeTypeMetadata {\n readonly persistedName: string;\n readonly kind: PersistedRuntimeTypeKind;\n readonly packageName: string;\n readonly sourceHint?: string;\n}\n\n/** Normalizes decorator options so persistence metadata has stable defaults. */\nexport class PersistedRuntimeTypeDecoratorDefaults {\n static readonly appPackageName = \"app\";\n\n static apply(options: PersistedRuntimeTypeDecoratorOptions): PersistedRuntimeTypeDecoratorOptions {\n return {\n ...options,\n packageName: options.packageName ?? this.appPackageName,\n };\n }\n}\n","import type { DecoratedRuntimeType } from \"./persistedRuntimeTypeModelRegistry\";\n\n/** Resolves the persisted type name from either an explicit override or the class name itself. */\nexport class PersistedRuntimeTypeNameResolver {\n static resolve(target: DecoratedRuntimeType, override: string | undefined): string {\n const resolved = override ?? target.name;\n if (!resolved) {\n throw new Error(\n \"Persisted runtime token metadata requires a named class or an explicit decorator name override.\",\n );\n }\n return resolved;\n }\n}\n","export class StackTraceCallSitePathResolver {\n static resolve(decoratorFileUrl: string): string | undefined {\n const stack = new Error().stack ?? \"\";\n for (const line of stack.split(\"\\n\")) {\n const candidate = this.extractPath(line.trim());\n if (!candidate) {\n continue;\n }\n if (candidate === decoratorFileUrl || candidate.includes(\"runtimeTypeDecorators\")) {\n continue;\n }\n return candidate;\n }\n return undefined;\n }\n\n private static extractPath(line: string): string | undefined {\n const fileUrlMatch = line.match(/file:\\/\\/[^\\s)]+/);\n if (fileUrlMatch) return fileUrlMatch[0];\n const parenMatch = line.match(/\\((\\/[^)]+)\\)/);\n if (parenMatch) return parenMatch[1];\n const bareMatch = line.match(/at (\\/[^\\s]+)/);\n return bareMatch?.[1];\n }\n}\n","import {\n PersistedRuntimeTypeDecoratorDefaults,\n persistedRuntimeTypeMetadataKey,\n type DecoratedRuntimeType,\n type PersistedRuntimeTypeDecoratorOptions,\n type PersistedRuntimeTypeKind,\n type PersistedRuntimeTypeMetadata,\n} from \"./persistedRuntimeTypeModelRegistry\";\nimport { PersistedRuntimeTypeNameResolver } from \"./PersistedRuntimeTypeNameResolver\";\nimport { StackTraceCallSitePathResolver } from \"./StackTraceCallSitePathResolver\";\n\n/**\n * Defines and retrieves persisted runtime metadata on decorated classes.\n * The metadata is attached as a non-enumerable property so runtime objects stay serializable.\n */\nexport class PersistedRuntimeTypeMetadataStore {\n static define(\n target: DecoratedRuntimeType,\n kind: PersistedRuntimeTypeKind,\n options: PersistedRuntimeTypeDecoratorOptions,\n decoratorFileUrl: string,\n ): void {\n const normalizedOptions = PersistedRuntimeTypeDecoratorDefaults.apply(options);\n const metadata: PersistedRuntimeTypeMetadata = {\n persistedName: PersistedRuntimeTypeNameResolver.resolve(target, normalizedOptions.name),\n kind,\n packageName: normalizedOptions.packageName ?? PersistedRuntimeTypeDecoratorDefaults.appPackageName,\n sourceHint: normalizedOptions.moduleUrl ?? StackTraceCallSitePathResolver.resolve(decoratorFileUrl),\n };\n Object.defineProperty(target, persistedRuntimeTypeMetadataKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: metadata,\n });\n }\n\n static get(target: unknown): PersistedRuntimeTypeMetadata | undefined {\n if (!target || (typeof target !== \"function\" && typeof target !== \"object\")) {\n return undefined;\n }\n return (target as Record<PropertyKey, unknown>)[persistedRuntimeTypeMetadataKey] as\n | PersistedRuntimeTypeMetadata\n | undefined;\n }\n}\n","import { injectable } from \"../di\";\n\nimport { PersistedRuntimeTypeMetadataStore } from \"./PersistedRuntimeTypeMetadataStoreRegistry\";\nimport type {\n DecoratedRuntimeType,\n PersistedRuntimeTypeDecoratorOptions,\n PersistedRuntimeTypeKind,\n} from \"./persistedRuntimeTypeModelRegistry\";\n\n/**\n * Applies both tsyringe injectability and persisted runtime metadata in one decorator.\n * This keeps runtime-type decorators thin while still recording enough data for snapshot hydration.\n */\nexport class InjectableRuntimeDecoratorComposer {\n static compose(\n kind: PersistedRuntimeTypeKind,\n options: PersistedRuntimeTypeDecoratorOptions,\n decoratorFileUrl: string,\n ): ClassDecorator {\n return (target) => {\n injectable()(target as never);\n PersistedRuntimeTypeMetadataStore.define(target as DecoratedRuntimeType, kind, options, decoratorFileUrl);\n };\n }\n}\n","import type {\n PersistedRuntimeTypeDecoratorOptions,\n PersistedRuntimeTypeMetadata,\n} from \"./persistedRuntimeTypeModelRegistry\";\n\nimport { InjectableRuntimeDecoratorComposer } from \"./InjectableRuntimeDecoratorComposerRegistry\";\nimport { PersistedRuntimeTypeMetadataStore } from \"./PersistedRuntimeTypeMetadataStoreRegistry\";\n\n/**\n * Public decorator entry points for runtime-discoverable classes.\n *\n * These exports intentionally stay as plain decorator factory functions because TypeScript's\n * `@decorator()` syntax expects callable values rather than instance methods. The helpers below\n * attach DI metadata and persisted-name metadata in one step so hosts can discover nodes, tools,\n * and chat models without duplicating registration boilerplate.\n */\nexport type {\n PersistedRuntimeTypeDecoratorOptions,\n PersistedRuntimeTypeKind,\n PersistedRuntimeTypeMetadata,\n} from \"./persistedRuntimeTypeModelRegistry\";\n\n/** Reads persisted runtime metadata from a decorated class or object. */\nexport function getPersistedRuntimeTypeMetadata(target: unknown): PersistedRuntimeTypeMetadata | undefined {\n return PersistedRuntimeTypeMetadataStore.get(target);\n}\n\n/** Marks a class as a persisted node runtime type and an injectable tsyringe service. */\nexport function node(options: PersistedRuntimeTypeDecoratorOptions = {}): ClassDecorator {\n return InjectableRuntimeDecoratorComposer.compose(\"node\", options, import.meta.url);\n}\n\n/** Marks a class as a persisted tool runtime type and an injectable tsyringe service. */\nexport function tool(options: PersistedRuntimeTypeDecoratorOptions = {}): ClassDecorator {\n return InjectableRuntimeDecoratorComposer.compose(\"tool\", options, import.meta.url);\n}\n\n/** Marks a class as a persisted chat-model runtime type and an injectable tsyringe service. */\nexport function chatModel(options: PersistedRuntimeTypeDecoratorOptions = {}): ClassDecorator {\n return InjectableRuntimeDecoratorComposer.compose(\"chatModel\", options, import.meta.url);\n}\n\nexport { InjectableRuntimeDecoratorComposer } from \"./InjectableRuntimeDecoratorComposerRegistry\";\nexport { PersistedRuntimeTypeMetadataStore } from \"./PersistedRuntimeTypeMetadataStoreRegistry\";\nexport { PersistedRuntimeTypeNameResolver } from \"./PersistedRuntimeTypeNameResolver\";\nexport { StackTraceCallSitePathResolver } from \"./StackTraceCallSitePathResolver\";\n","import type {\n AnyCredentialType,\n CredentialJsonRecord,\n CredentialRequirement,\n CredentialTypeId,\n} from \"../contracts/credentialTypes\";\nimport type { ParamDeep } from \"../contracts/params\";\nimport type { RunnableNode, RunnableNodeExecuteArgs, NodeExecutionContext } from \"../contracts/runtimeTypes\";\nimport type { Item, Items, NodeInspectorSummaryRow, RunnableNodeConfig } from \"../contracts/workflowTypes\";\nimport type { TypeToken } from \"../di\";\nimport { node as persistedNode } from \"../runtime-types/runtimeTypeDecorators.types\";\nimport type { ZodType } from \"zod\";\nimport { z } from \"zod\";\nimport { DefinedNodeRegistry } from \"./DefinedNodeRegistry\";\n\ntype MaybePromise<TValue> = TValue | Promise<TValue>;\n\ntype ResolvableCredentialType = AnyCredentialType | CredentialTypeId;\n\ntype SessionForCredentialType<TCredential extends ResolvableCredentialType> = TCredential extends AnyCredentialType\n ? Awaited<ReturnType<TCredential[\"createSession\"]>>\n : unknown;\n\nexport type DefinedNodeCredentialBinding =\n | ResolvableCredentialType\n | Readonly<{\n readonly type: ResolvableCredentialType | ReadonlyArray<ResolvableCredentialType>;\n readonly label?: string;\n readonly optional?: true;\n readonly helpText?: string;\n readonly helpUrl?: string;\n }>;\n\nexport type DefinedNodeCredentialBindings = Readonly<Record<string, DefinedNodeCredentialBinding>>;\n\ntype SessionForBinding<TBinding extends DefinedNodeCredentialBinding> =\n TBinding extends Readonly<{ type: infer TType }>\n ? TType extends ReadonlyArray<infer TEntry>\n ? SessionForCredentialType<TEntry & ResolvableCredentialType>\n : SessionForCredentialType<TType & ResolvableCredentialType>\n : SessionForCredentialType<TBinding & ResolvableCredentialType>;\n\nexport type DefinedNodeCredentialAccessors<TBindings extends DefinedNodeCredentialBindings | undefined> =\n TBindings extends DefinedNodeCredentialBindings\n ? Readonly<{\n [TKey in keyof TBindings]: () => Promise<SessionForBinding<TBindings[TKey]>>;\n }>\n : Readonly<Record<string, never>>;\n\nexport interface DefinedNodeRunContext<\n TConfig extends CredentialJsonRecord,\n TBindings extends DefinedNodeCredentialBindings | undefined,\n> {\n readonly config: TConfig;\n readonly credentials: DefinedNodeCredentialAccessors<TBindings>;\n readonly execution: NodeExecutionContext<RunnableNodeConfig<TConfig, unknown>>;\n}\n\n/**\n * Arguments for {@link defineNode} `execute` (engine `ctx` matches {@link RunnableNode.execute};\n * the second callback parameter adds {@link DefinedNodeRunContext} for credential accessors).\n */\nexport type DefineNodeExecuteArgs<TConfig extends CredentialJsonRecord, TInputJson> = Readonly<{\n input: TInputJson;\n item: Item;\n itemIndex: number;\n items: Items;\n ctx: NodeExecutionContext<RunnableNodeConfig<TInputJson, unknown> & Readonly<{ config: TConfig }>>;\n}>;\n\nexport type DefinedNodeConfigInput<TConfigResolved extends CredentialJsonRecord, TItemJson> = ParamDeep<\n TConfigResolved,\n TItemJson\n>;\n\nexport interface DefinedNode<\n TKey extends string,\n TConfig extends CredentialJsonRecord,\n TInputJson,\n TOutputJson,\n _TBindings extends DefinedNodeCredentialBindings | undefined = undefined,\n> {\n readonly kind: \"defined-node\";\n readonly key: TKey;\n readonly title: string;\n readonly description?: string;\n create<TConfigItemJson = TInputJson>(\n config: DefinedNodeConfigInput<TConfig, TConfigItemJson>,\n name?: string,\n id?: string,\n ): RunnableNodeConfig<TInputJson, TOutputJson>;\n register(context: { registerNode<TValue>(token: TypeToken<TValue>, implementation?: TypeToken<TValue>): void }): void;\n}\n\n/**\n * Plugin / DSL-friendly node: per-item `execute` with optional {@link RunnableNodeConfig.inputSchema}.\n */\nexport interface DefineNodeOptions<\n TKey extends string,\n TConfig extends CredentialJsonRecord,\n TInputJson,\n TOutputJson,\n TBindings extends DefinedNodeCredentialBindings | undefined = undefined,\n> {\n readonly key: TKey;\n readonly title: string;\n readonly description?: string;\n /**\n * Canvas icon for this node (same contract as `NodeConfigBase.icon` on runnable configs).\n * The Next host resolves Lucide (`lucide:…`), built-in SVGs (`builtin:…`), Simple Icons (`si:…`), and image URLs (`https:`, `data:`, `/…`).\n */\n readonly icon?: string;\n /** Default values / form hints for **static** node configuration (credentials, retry, IDs), not per-item payload. */\n readonly input?: Readonly<Record<keyof TConfig & string, unknown>>;\n readonly configSchema?: z.ZodType<TConfig>;\n readonly credentials?: TBindings;\n /**\n * Validates **`input`** (engine also accepts `inputSchema` on the node class).\n */\n readonly inputSchema?: ZodType<TInputJson>;\n /** Preserve inbound `item.binary` when `execute` returns plain JSON or item-shaped results without `binary`. */\n readonly keepBinaries?: boolean;\n /**\n * Static configuration summary surfaced in the workflow inspector — see\n * {@link import(\"../contracts/workflowTypes\").NodeConfigBase.inspectorSummary}.\n *\n * Receives the static config; returns 2–6 short label/value pairs (or `undefined` to skip).\n */\n readonly inspectorSummary?: (\n args: Readonly<{ config: TConfig }>,\n ) => ReadonlyArray<NodeInspectorSummaryRow> | undefined;\n execute(\n args: DefineNodeExecuteArgs<TConfig, TInputJson>,\n context: DefinedNodeRunContext<TConfig, TBindings>,\n ): MaybePromise<TOutputJson>;\n}\n\n/**\n * Batch-oriented defined node: `run` receives all item JSON once (last item in activation); emits one output per input row.\n */\nexport interface DefineBatchNodeOptions<\n TKey extends string,\n TConfig extends CredentialJsonRecord,\n TInputJson,\n TOutputJson,\n TBindings extends DefinedNodeCredentialBindings | undefined = undefined,\n> {\n readonly key: TKey;\n readonly title: string;\n readonly description?: string;\n readonly icon?: string;\n readonly input?: Readonly<Record<keyof TConfig & string, unknown>>;\n readonly configSchema?: z.ZodType<TConfig>;\n readonly credentials?: TBindings;\n readonly inspectorSummary?: (\n args: Readonly<{ config: TConfig }>,\n ) => ReadonlyArray<NodeInspectorSummaryRow> | undefined;\n run(\n items: ReadonlyArray<TInputJson>,\n context: DefinedNodeRunContext<TConfig, TBindings>,\n ): MaybePromise<ReadonlyArray<TOutputJson>>;\n}\n\nconst definedNodeCredentialRequirementFactory = {\n create(bindings: DefinedNodeCredentialBindings | undefined): ReadonlyArray<CredentialRequirement> {\n if (!bindings) {\n return [];\n }\n return Object.entries(bindings).map(([slotKey, binding]) => {\n if (typeof binding === \"string\" || this.isCredentialType(binding)) {\n return {\n slotKey,\n label: this.humanize(slotKey),\n acceptedTypes: [this.resolveTypeId(binding)],\n };\n }\n\n const types = Array.isArray(binding.type) ? binding.type : [binding.type];\n return {\n slotKey,\n label: binding.label ?? this.humanize(slotKey),\n acceptedTypes: types.map((entry) => this.resolveTypeId(entry)),\n optional: binding.optional,\n helpText: binding.helpText,\n helpUrl: binding.helpUrl,\n };\n });\n },\n\n isCredentialType(value: unknown): value is AnyCredentialType {\n return (\n Boolean(value) &&\n typeof value === \"object\" &&\n \"definition\" in (value as Record<string, unknown>) &&\n typeof (value as AnyCredentialType).definition?.typeId === \"string\"\n );\n },\n\n resolveTypeId(type: ResolvableCredentialType): string {\n return typeof type === \"string\" ? type : type.definition.typeId;\n },\n\n humanize(key: string): string {\n return key\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_.]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/^./, (character) => character.toUpperCase());\n },\n} as const;\n\nconst definedNodeCredentialAccessorFactory = {\n create<TBindings extends DefinedNodeCredentialBindings | undefined>(\n bindings: TBindings,\n ctx: NodeExecutionContext<RunnableNodeConfig<any, any>>,\n ): DefinedNodeCredentialAccessors<TBindings> {\n if (!bindings) {\n return {} as DefinedNodeCredentialAccessors<TBindings>;\n }\n const entries = Object.keys(bindings).map((slotKey) => [slotKey, () => ctx.getCredential(slotKey)] as const);\n return Object.fromEntries(entries) as DefinedNodeCredentialAccessors<TBindings>;\n },\n} as const;\n\nexport function defineNode<\n TKey extends string,\n TConfig extends CredentialJsonRecord,\n TInputJson,\n TOutputJson,\n TBindings extends DefinedNodeCredentialBindings | undefined = undefined,\n>(\n options: DefineNodeOptions<TKey, TConfig, TInputJson, TOutputJson, TBindings>,\n): DefinedNode<TKey, TConfig, TInputJson, TOutputJson, TBindings> {\n const credentialRequirements = definedNodeCredentialRequirementFactory.create(options.credentials);\n type DefinedRunnableNodeConfigShape = RunnableNodeConfig<TInputJson, TOutputJson> & Readonly<{ config: TConfig }>;\n\n const DefinedNodeRuntime = class implements RunnableNode<DefinedRunnableNodeConfigShape, TInputJson, TOutputJson> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n readonly inputSchema = options.inputSchema;\n\n async execute(\n args: Readonly<RunnableNodeExecuteArgs<DefinedRunnableNodeConfigShape, TInputJson>>,\n ): Promise<unknown> {\n const ctx = args.ctx;\n const context: DefinedNodeRunContext<TConfig, TBindings> = {\n config: ctx.config.config,\n credentials: definedNodeCredentialAccessorFactory.create(\n options.credentials,\n ctx,\n ) as DefinedNodeCredentialAccessors<TBindings>,\n execution: ctx as unknown as NodeExecutionContext<RunnableNodeConfig<TConfig, unknown>>,\n };\n const payload: DefineNodeExecuteArgs<TConfig, TInputJson> = {\n input: args.input,\n item: args.item,\n itemIndex: args.itemIndex,\n items: args.items,\n ctx,\n };\n return await options.execute(payload, context);\n }\n };\n\n persistedNode({ name: options.key })(DefinedNodeRuntime);\n\n const DefinedRunnableNodeConfig = class implements RunnableNodeConfig<TInputJson, TOutputJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = DefinedNodeRuntime;\n readonly icon = options.icon;\n readonly inputSchema = options.inputSchema;\n readonly keepBinaries = options.keepBinaries ?? false;\n\n constructor(\n public readonly name: string,\n config: DefinedNodeConfigInput<TConfig, unknown>,\n public readonly id?: string,\n ) {\n this.config = config as unknown as TConfig;\n }\n\n public readonly config: TConfig;\n\n getCredentialRequirements(): ReadonlyArray<CredentialRequirement> {\n return credentialRequirements;\n }\n\n inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined {\n return options.inspectorSummary?.({ config: this.config });\n }\n };\n\n const definition: DefinedNode<TKey, TConfig, TInputJson, TOutputJson, TBindings> = {\n kind: \"defined-node\",\n key: options.key,\n title: options.title,\n description: options.description,\n create<TConfigItemJson = TInputJson>(\n config: DefinedNodeConfigInput<TConfig, TConfigItemJson>,\n name = options.title,\n id?: string,\n ) {\n return new DefinedRunnableNodeConfig(name, config as DefinedNodeConfigInput<TConfig, unknown>, id);\n },\n register(context) {\n context.registerNode(DefinedNodeRuntime);\n },\n };\n\n DefinedNodeRegistry.register(definition as DefinedNode<string, Record<string, unknown>, unknown, unknown, undefined>);\n\n return definition;\n}\n\nexport function defineBatchNode<\n TKey extends string,\n TConfig extends CredentialJsonRecord,\n TInputJson,\n TOutputJson,\n TBindings extends DefinedNodeCredentialBindings | undefined = undefined,\n>(\n options: DefineBatchNodeOptions<TKey, TConfig, TInputJson, TOutputJson, TBindings>,\n): DefinedNode<TKey, TConfig, TInputJson, TOutputJson, TBindings> {\n const credentialRequirements = definedNodeCredentialRequirementFactory.create(options.credentials);\n type DefinedRunnableNodeConfigShape = RunnableNodeConfig<TInputJson, TOutputJson> & Readonly<{ config: TConfig }>;\n\n const DefinedNodeRuntime = class implements RunnableNode<DefinedRunnableNodeConfigShape, TInputJson, TOutputJson> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async execute(\n args: Readonly<RunnableNodeExecuteArgs<DefinedRunnableNodeConfigShape, TInputJson>>,\n ): Promise<unknown> {\n if (args.itemIndex !== args.items.length - 1) {\n return [];\n }\n const ctx = args.ctx;\n const context: DefinedNodeRunContext<TConfig, TBindings> = {\n config: ctx.config.config,\n credentials: definedNodeCredentialAccessorFactory.create(\n options.credentials,\n ctx,\n ) as DefinedNodeCredentialAccessors<TBindings>,\n execution: ctx as unknown as NodeExecutionContext<RunnableNodeConfig<TConfig, unknown>>,\n };\n const outputs = await options.run(\n args.items.map((item) => item.json as TInputJson),\n context,\n );\n return [...outputs];\n }\n };\n\n persistedNode({ name: options.key })(DefinedNodeRuntime);\n\n const DefinedRunnableNodeConfig = class implements RunnableNodeConfig<TInputJson, TOutputJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = DefinedNodeRuntime;\n readonly icon = options.icon;\n\n constructor(\n public readonly name: string,\n config: DefinedNodeConfigInput<TConfig, unknown>,\n public readonly id?: string,\n ) {\n this.config = config as unknown as TConfig;\n }\n\n public readonly config: TConfig;\n\n getCredentialRequirements(): ReadonlyArray<CredentialRequirement> {\n return credentialRequirements;\n }\n\n inspectorSummary(): ReadonlyArray<NodeInspectorSummaryRow> | undefined {\n return options.inspectorSummary?.({ config: this.config });\n }\n };\n\n const definition: DefinedNode<TKey, TConfig, TInputJson, TOutputJson, TBindings> = {\n kind: \"defined-node\",\n key: options.key,\n title: options.title,\n description: options.description,\n create<TConfigItemJson = TInputJson>(\n config: DefinedNodeConfigInput<TConfig, TConfigItemJson>,\n name = options.title,\n id?: string,\n ) {\n return new DefinedRunnableNodeConfig(name, config as DefinedNodeConfigInput<TConfig, unknown>, id);\n },\n register(context) {\n context.registerNode(DefinedNodeRuntime);\n },\n };\n\n DefinedNodeRegistry.register(definition as DefinedNode<string, Record<string, unknown>, unknown, unknown, undefined>);\n\n return definition;\n}\n","import type {\n Duration,\n ExecutionContext,\n HumanTaskActor,\n HumanTaskHandle,\n HumanTaskSubject,\n NodeExecutionContext,\n ResumeContext,\n} from \"../contracts/runtimeTypes\";\nimport type { Item, JsonValue, NodeInspectorSummaryRow, NodeConfigBase } from \"../contracts/workflowTypes\";\nimport type { CredentialJsonRecord } from \"../contracts/credentialTypes\";\nimport type { ZodObject, ZodType } from \"zod\";\nimport type { DefinedNodeCredentialBindings } from \"./defineNode.types\";\nimport { SuspensionRequest } from \"../contracts/runtimeTypes\";\nimport { defineNode } from \"./defineNode.types\";\nimport type { DefinedNode } from \"./defineNode.types\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * Decision shape merged into `item.json` after a HITL approval task resolves.\n *\n * - `\"approved\"` / `\"rejected\"` — from a human decision (uses `approvedPredicate`).\n * - `\"timed-out\"` — timeout fired with `onTimeout: \"halt\"`.\n * - `\"auto-accepted\"` — timeout fired with `onTimeout: \"auto-accept\"`.\n */\nexport interface HumanApprovalDecisionResult {\n readonly status: \"approved\" | \"rejected\" | \"timed-out\" | \"auto-accepted\";\n /** Identity of the person who decided; absent for automated outcomes. */\n readonly actor?: HumanTaskActor;\n /** ISO 8601 timestamp of the decision. */\n readonly decidedAt?: Date;\n /** Optional free-text note from the reviewer. */\n readonly note?: string;\n /**\n * Full raw decision payload (only present for `\"approved\"` / `\"rejected\"`).\n * Shape is determined by the channel's `decisionSchema`.\n */\n readonly payload?: Record<string, unknown>;\n}\n\n/**\n * Output item shape emitted by a `defineHumanApprovalNode`-based node.\n * Original `item.json` fields are preserved and `decision` is merged in.\n * If the input `item.json` already contained a `decision` key it is **overwritten**.\n */\nexport type HumanApprovalOutputJson<TInputJson extends Record<string, unknown>> = TInputJson & {\n readonly decision: HumanApprovalDecisionResult;\n};\n\n/**\n * Extends {@link DefinedNode} with the `humanApprovalToolBehavior` metadata marker.\n * Story 10 reads this field when attaching the node as an agent tool.\n */\nexport interface DefinedHumanApprovalNode<\n TKey extends string,\n TConfig extends CredentialJsonRecord,\n TInputJson extends Record<string, unknown>,\n TBindings extends DefinedNodeCredentialBindings | undefined = undefined,\n> extends DefinedNode<TKey, TConfig, TInputJson, HumanApprovalOutputJson<TInputJson>, TBindings> {\n /**\n * Behavior hint consumed by the agent runtime (story 10) when this node is attached as a tool.\n * `\"return\"` (default) — return the rejection to the agent as a tool result.\n * `\"halt\"` — halt the agent run on rejection.\n *\n * Standalone DSL usage ignores this field.\n */\n readonly humanApprovalToolBehavior: { onRejected: \"return\" | \"halt\" };\n}\n\n// ---------------------------------------------------------------------------\n// isHumanApprovalNode predicate\n// ---------------------------------------------------------------------------\n\n/**\n * Returns `true` when `node` was created by {@link defineHumanApprovalNode}.\n * Uses the `humanApprovalToolBehavior` typed field as the discriminant.\n */\nexport function isHumanApprovalNode(\n node: unknown,\n): node is DefinedHumanApprovalNode<string, Record<string, unknown>, Record<string, unknown>, undefined> {\n return (\n typeof node === \"object\" &&\n node !== null &&\n \"humanApprovalToolBehavior\" in node &&\n typeof (node as { humanApprovalToolBehavior: unknown }).humanApprovalToolBehavior === \"object\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// defineHumanApprovalNode\n// ---------------------------------------------------------------------------\n\n/**\n * Authoring helper that compiles a HITL approval channel down to a regular\n * {@link defineNode}-backed node with `SuspensionRequest` semantics.\n *\n * **Fast-forward decision semantics:**\n * - On the first `execute` call (no `ctx.resumeContext`): throws a `SuspensionRequest`\n * that calls the author's `deliver`. The engine persists the suspension and continues.\n * - On resume (`ctx.resumeContext` set): calls `onDecision`/`onTimeout` as appropriate,\n * merges a `decision` key into `item.json`, and returns an item with the original\n * `binary` map passed by reference (no copy).\n *\n * **Output shape per item:**\n * ```ts\n * // Input: { json: { invoiceId: 42 }, binary?: {...} }\n * // Output: { json: { invoiceId: 42, decision: { status: \"approved\", actor, decidedAt } }, binary: <unchanged> }\n * ```\n * If `item.json` already has a `decision` key it is **overwritten**. Namespace as\n * needed if your schema reserves that key for another purpose.\n *\n * **Predicate persistence:**\n * The `approvedPredicate` function is NOT serialized to the suspension record (except\n * as an audit-only string via `toString()`). On resume, the workflow definition is\n * reloaded from code at process start and the predicate closure is rebuilt naturally.\n * If a deploy ships a changed predicate between suspend and resume, the *new* predicate\n * runs — document this in your runbook when the predicate carries business logic that\n * may change across deploys.\n *\n * @example\n * ```ts\n * export const slackApprovalNode = defineHumanApprovalNode({\n * key: \"my-plugin.slackApproval\",\n * title: \"Slack Approval\",\n * channel: \"slack\",\n * configSchema: z.object({ channel: z.string(), message: z.string() }),\n * decisionSchema: z.object({ approved: z.boolean(), note: z.string().optional() }),\n *\n * async deliver({ task, config, item }, ctx) {\n * const ts = await postSlackMessage(config.channel, `Approve? <${task.resumeUrl}>`);\n * return { channel: config.channel, ts };\n * },\n *\n * async onDecision({ decision, actor, delivery }, ctx) {\n * await updateSlackMessage(delivery.channel, delivery.ts, decision.approved ? \"✅\" : \"❌\");\n * },\n * });\n * ```\n */\nexport function defineHumanApprovalNode<\n TKey extends string,\n TConfig extends CredentialJsonRecord,\n TInputJson extends Record<string, unknown>,\n TDecision extends Record<string, unknown>,\n TDelivery extends JsonValue,\n TBindings extends DefinedNodeCredentialBindings | undefined = undefined,\n>(opts: {\n key: TKey;\n title: string;\n description?: string;\n icon?: string;\n channel: string;\n\n configSchema: ZodType<TConfig>;\n inputSchema?: ZodType<TInputJson>;\n decisionSchema: ZodType<TDecision>;\n credentials?: TBindings;\n\n /**\n * Custom predicate that decides whether a decision counts as \"approved\".\n * When omitted, the helper checks if `decisionSchema` is a Zod object with an\n * `approved: boolean` field; if so it uses `decision.approved === true`.\n * If neither holds, `defineHumanApprovalNode` throws at **definition time** (not runtime).\n */\n approvedPredicate?: (decision: TDecision) => boolean;\n /** Default suspension timeout. Defaults to `\"24h\"`. */\n defaultTimeout?: Duration;\n /** What to do when the task times out. Defaults to `\"halt\"`. */\n defaultOnTimeout?: \"halt\" | \"auto-accept\";\n\n inspectorSummary?: (config: TConfig) => ReadonlyArray<NodeInspectorSummaryRow> | undefined;\n\n deliver: (\n args: {\n task: HumanTaskHandle;\n config: TConfig;\n input: TInputJson;\n item: Item;\n },\n ctx: ExecutionContext,\n ) => Promise<TDelivery>;\n\n onDecision?: (\n args: {\n decision: TDecision;\n actor: HumanTaskActor;\n task: HumanTaskHandle;\n delivery: TDelivery;\n item: Item;\n },\n ctx: ExecutionContext,\n ) => Promise<void>;\n\n onTimeout?: (\n args: {\n task: HumanTaskHandle;\n delivery: TDelivery;\n item: Item;\n policy: \"halt\" | \"auto-accept\";\n },\n ctx: ExecutionContext,\n ) => Promise<void>;\n}): DefinedHumanApprovalNode<TKey, TConfig, TInputJson, TBindings> {\n // Resolve the approved predicate at definition time so we throw early when\n // the schema is ambiguous.\n const resolvedPredicate = resolveApprovedPredicate(opts.decisionSchema, opts.approvedPredicate);\n\n const timeout = opts.defaultTimeout ?? \"24h\";\n const onTimeout = opts.defaultOnTimeout ?? \"halt\";\n\n // TOutputJson is `unknown` here because `execute` returns an Item-shaped object\n // that the engine's NodeOutputNormalizer converts to the proper output. The public\n // interface's DefinedHumanApprovalNode carries the correct output type for DSL use.\n const inner = defineNode<TKey, TConfig, TInputJson, unknown, TBindings>({\n key: opts.key,\n title: opts.title,\n description: opts.description,\n icon: opts.icon,\n configSchema: opts.configSchema,\n inputSchema: opts.inputSchema,\n credentials: opts.credentials,\n inspectorSummary: opts.inspectorSummary ? ({ config }) => opts.inspectorSummary!(config) : undefined,\n\n async execute(args, { config, execution: ctx }) {\n if (!ctx.resumeContext) {\n // First pass — suspend.\n const subject = buildSubject(opts.title, args.item, ctx);\n throw new SuspensionRequest({\n decisionSchema: opts.decisionSchema,\n timeout,\n onTimeout,\n subject,\n metadata: {\n channel: opts.channel,\n nodeKey: opts.key,\n // Stored for audit only; never re-evaluated. See JSDoc on defineHumanApprovalNode.\n approvedPredicateSource: opts.approvedPredicate?.toString() ?? null,\n },\n deliver: (handle: HumanTaskHandle) =>\n opts.deliver(\n {\n task: handle,\n config,\n input: args.input as TInputJson,\n item: args.item,\n },\n ctx,\n ),\n });\n }\n\n // Resume pass.\n return await handleResume(\n args.item,\n ctx.resumeContext,\n opts.decisionSchema,\n resolvedPredicate,\n opts.onDecision,\n opts.onTimeout,\n ctx,\n );\n },\n });\n\n return Object.assign(inner, {\n humanApprovalToolBehavior: { onRejected: \"return\" as const },\n }) as unknown as DefinedHumanApprovalNode<TKey, TConfig, TInputJson, TBindings>;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers (module-private)\n// ---------------------------------------------------------------------------\n\nfunction resolveApprovedPredicate<TDecision extends Record<string, unknown>>(\n schema: ZodType<TDecision>,\n predicate: ((d: TDecision) => boolean) | undefined,\n): (d: TDecision) => boolean {\n if (predicate) {\n return predicate;\n }\n // Zod 4: ZodObject exposes `.shape` directly as an object (not a function).\n const shape = (schema as unknown as ZodObject<Record<string, ZodType>>).shape;\n if (shape && typeof shape === \"object\" && \"approved\" in shape) {\n return (d) => (d as { approved?: unknown }).approved === true;\n }\n throw new Error(\n `defineHumanApprovalNode: decisionSchema has no \"approved\" field and no approvedPredicate was provided. ` +\n `Either add { approved: z.boolean() } to the decision schema or supply approvedPredicate explicitly.`,\n );\n}\n\nfunction buildSubject(title: string, item: Item, ctx: NodeExecutionContext<NodeConfigBase>): HumanTaskSubject {\n return {\n title,\n summary: \"\",\n attributes: {\n workflowId: ctx.workflowId,\n nodeId: ctx.nodeId,\n item: item.json as JsonValue,\n },\n };\n}\n\nfunction mergeDecision(\n item: Item,\n decision: HumanApprovalDecisionResult,\n): { json: Record<string, unknown>; binary: Item[\"binary\"]; meta: Item[\"meta\"] } {\n return {\n json: { ...(item.json as Record<string, unknown>), decision },\n // binary is passed by reference — no copy. See defineHumanApprovalNode JSDoc.\n binary: item.binary,\n meta: item.meta,\n };\n}\n\nasync function handleResume<TDecision extends Record<string, unknown>, TDelivery extends JsonValue>(\n item: Item,\n resumeContext: ResumeContext,\n decisionSchema: ZodType<TDecision>,\n resolvedPredicate: (d: TDecision) => boolean,\n onDecision:\n | ((\n args: {\n decision: TDecision;\n actor: HumanTaskActor;\n task: HumanTaskHandle;\n delivery: TDelivery;\n item: Item;\n },\n ctx: ExecutionContext,\n ) => Promise<void>)\n | undefined,\n onTimeoutCb:\n | ((\n args: {\n task: HumanTaskHandle;\n delivery: TDelivery;\n item: Item;\n policy: \"halt\" | \"auto-accept\";\n },\n ctx: ExecutionContext,\n ) => Promise<void>)\n | undefined,\n ctx: ExecutionContext,\n): Promise<{ json: Record<string, unknown>; binary: Item[\"binary\"]; meta: Item[\"meta\"] }> {\n const { decision: dec, delivery, task } = resumeContext;\n\n if (dec.kind === \"timed_out\" || dec.kind === \"auto_accepted\") {\n const policy: \"halt\" | \"auto-accept\" = dec.kind === \"auto_accepted\" ? \"auto-accept\" : \"halt\";\n await onTimeoutCb?.({ task, delivery: delivery as TDelivery, item, policy }, ctx);\n const status = dec.kind === \"auto_accepted\" ? \"auto-accepted\" : \"timed-out\";\n return mergeDecision(item, { status, decidedAt: dec.at });\n }\n\n // dec.kind === \"decided\"\n const parsed = decisionSchema.parse(dec.value);\n await onDecision?.(\n {\n decision: parsed,\n actor: dec.actor,\n task,\n delivery: delivery as TDelivery,\n item,\n },\n ctx,\n );\n\n const isApproved = resolvedPredicate(parsed);\n return mergeDecision(item, {\n status: isApproved ? \"approved\" : \"rejected\",\n actor: dec.actor,\n decidedAt: dec.decidedAt,\n note: (parsed as { note?: string }).note,\n payload: parsed,\n });\n}\n","import type { NodeId, NodeRef, OutputPortKey, UpstreamRefPlaceholder, WorkflowDefinition } from \"../../types\";\n\nimport { WorkflowBuilder } from \"./WorkflowBuilder\";\nimport type { AnyRunnableNodeConfig, BooleanWhenOverloads, ValidStepSequence } from \"./workflowBuilderTypes\";\n\nexport class WhenBuilder<TCurrentJson> {\n constructor(\n private readonly wf: WorkflowBuilder,\n private readonly from: NodeRef,\n private readonly branchPort: OutputPortKey,\n ) {}\n\n addBranch<TSteps extends ReadonlyArray<AnyRunnableNodeConfig>>(\n steps: TSteps & ValidStepSequence<TCurrentJson, TSteps>,\n ): this {\n const created: NodeRef[] = [];\n\n let prev: NodeRef | null = null;\n for (const cfg of steps) {\n const ref = (this.wf as any).add(cfg) as NodeRef;\n created.push(ref);\n if (!prev) (this.wf as any).connect(this.from, ref, this.branchPort, \"in\");\n else (this.wf as any).connect(prev, ref, \"main\", \"in\");\n prev = ref;\n }\n\n for (const cfg of steps) {\n const maybe = cfg as unknown as { upstreamRefs?: Array<{ nodeId: NodeId } | UpstreamRefPlaceholder> };\n if (!Array.isArray(maybe.upstreamRefs) || maybe.upstreamRefs.length === 0) continue;\n\n maybe.upstreamRefs = maybe.upstreamRefs.map((r) => {\n if (typeof r !== \"string\") return r;\n const idx = parseInt(r.slice(1), 10);\n const nodeId = created[idx]?.id;\n return nodeId ? { nodeId } : { nodeId: r };\n });\n }\n\n return this;\n }\n\n readonly when: BooleanWhenOverloads<TCurrentJson, WhenBuilder<TCurrentJson>> = (\n branch: boolean,\n steps: ReadonlyArray<AnyRunnableNodeConfig> | AnyRunnableNodeConfig,\n ...more: AnyRunnableNodeConfig[]\n ): WhenBuilder<TCurrentJson> => {\n const list = Array.isArray(steps) ? steps : [steps, ...more];\n const port: OutputPortKey = branch ? \"true\" : \"false\";\n const b = new WhenBuilder<TCurrentJson>(this.wf, this.from, port);\n b.addBranch(list);\n return b;\n };\n\n build(): WorkflowDefinition {\n return this.wf.build();\n }\n}\n","import type {\n InputPortKey,\n NodeRef,\n OutputPortKey,\n RunnableNodeConfig,\n RunnableNodeOutputJson,\n WorkflowDefinition,\n} from \"../../types\";\n\nimport type { DefinedNodeCredentialBindings } from \"../../authoring/defineNode.types\";\nimport type { DefinedHumanApprovalNode, HumanApprovalOutputJson } from \"../../authoring/defineHumanApprovalNode.types\";\nimport { isHumanApprovalNode } from \"../../authoring/defineHumanApprovalNode.types\";\nimport { WorkflowBuilder } from \"./WorkflowBuilder\";\nimport { WhenBuilder } from \"./WhenBuilder\";\nimport type {\n AnyRunnableNodeConfig,\n BooleanWhenOverloads,\n BranchOutputGuard,\n BranchStepsArg,\n StepSequenceOutput,\n} from \"./workflowBuilderTypes\";\n\ntype ChainCursorEndpoint = Readonly<{ node: NodeRef; output: OutputPortKey; inputPortHint?: InputPortKey }>;\n\ntype ChainCursorWhenOverloads<TCurrentJson> = BooleanWhenOverloads<TCurrentJson, WhenBuilder<TCurrentJson>> & {\n <\n TTrueSteps extends ReadonlyArray<AnyRunnableNodeConfig> | undefined,\n TFalseSteps extends ReadonlyArray<AnyRunnableNodeConfig> | undefined,\n >(\n branches: Readonly<{\n true?: TTrueSteps extends ReadonlyArray<AnyRunnableNodeConfig> ? BranchStepsArg<TCurrentJson, TTrueSteps> : never;\n false?: TFalseSteps extends ReadonlyArray<AnyRunnableNodeConfig>\n ? BranchStepsArg<TCurrentJson, TFalseSteps>\n : never;\n }> &\n BranchOutputGuard<TCurrentJson, TTrueSteps, TFalseSteps>,\n ): ChainCursor<StepSequenceOutput<TCurrentJson, TTrueSteps>>;\n};\n\nexport class ChainCursor<TCurrentJson> {\n constructor(\n private readonly wf: WorkflowBuilder,\n private readonly endpoints: ReadonlyArray<ChainCursorEndpoint>,\n ) {}\n\n then<TOutputJson, TConfig extends RunnableNodeConfig<TCurrentJson, TOutputJson>>(\n config: TConfig,\n ): ChainCursor<RunnableNodeOutputJson<TConfig>> {\n const next = (this.wf as any).add(config) as NodeRef;\n const inputPortHint = this.resolveSharedInputPortHint();\n for (const e of this.endpoints) {\n (this.wf as any).connect(e.node, next, e.output);\n }\n return new ChainCursor<RunnableNodeOutputJson<TConfig>>(this.wf, [\n { node: next, output: \"main\", ...(inputPortHint ? { inputPortHint } : {}) },\n ]);\n }\n\n thenIntoInputHints<TOutputJson, TConfig extends RunnableNodeConfig<any, TOutputJson>>(\n config: TConfig,\n ): ChainCursor<RunnableNodeOutputJson<TConfig>> {\n const next = (this.wf as any).add(config) as NodeRef;\n for (const e of this.endpoints) {\n (this.wf as any).connect(e.node, next, e.output, e.inputPortHint ?? \"in\");\n }\n return new ChainCursor<RunnableNodeOutputJson<TConfig>>(this.wf, [{ node: next, output: \"main\" }]);\n }\n\n readonly when: ChainCursorWhenOverloads<TCurrentJson> = ((\n arg1:\n | boolean\n | Readonly<{ true?: ReadonlyArray<AnyRunnableNodeConfig>; false?: ReadonlyArray<AnyRunnableNodeConfig> }>,\n steps?: ReadonlyArray<AnyRunnableNodeConfig> | AnyRunnableNodeConfig,\n ...more: AnyRunnableNodeConfig[]\n ): WhenBuilder<TCurrentJson> | ChainCursor<TCurrentJson> => {\n if (this.endpoints.length !== 1) {\n throw new Error(\"ChainCursor.when(...) is only supported from a single cursor endpoint\");\n }\n const cursor = this.endpoints[0]!.node;\n\n if (typeof arg1 === \"boolean\") {\n const list = Array.isArray(steps) ? steps : steps ? [steps, ...more] : more;\n const port: OutputPortKey = arg1 ? \"true\" : \"false\";\n const b = new WhenBuilder<TCurrentJson>(this.wf, cursor, port);\n b.addBranch(list);\n return b;\n }\n\n const branches = arg1;\n const wfAny = this.wf as any;\n\n const buildBranch = (\n port: OutputPortKey,\n branchSteps: ReadonlyArray<AnyRunnableNodeConfig> | undefined,\n ): Readonly<{ end: NodeRef; endOutput: OutputPortKey; inputPortHint: InputPortKey }> => {\n const list = branchSteps ?? [];\n let prev: NodeRef | null = null;\n for (const cfg of list) {\n const ref = wfAny.add(cfg) as NodeRef;\n if (!prev) wfAny.connect(cursor, ref, port, \"in\");\n else wfAny.connect(prev, ref, \"main\", \"in\");\n prev = ref;\n }\n if (!prev) return { end: cursor, endOutput: port, inputPortHint: port };\n return { end: prev, endOutput: \"main\", inputPortHint: port };\n };\n\n const t = buildBranch(\"true\", branches.true);\n const f = buildBranch(\"false\", branches.false);\n return new ChainCursor<TCurrentJson>(this.wf, [\n { node: t.end, output: t.endOutput, inputPortHint: t.inputPortHint },\n { node: f.end, output: f.endOutput, inputPortHint: f.inputPortHint },\n ]);\n }) as ChainCursorWhenOverloads<TCurrentJson>;\n\n route<TNextJson>(\n branches: Readonly<\n Record<OutputPortKey, (branch: ChainCursor<TCurrentJson>) => ChainCursor<TNextJson> | undefined>\n >,\n ): ChainCursor<TNextJson> {\n if (this.endpoints.length !== 1) {\n throw new Error(\"ChainCursor.route(...) is only supported from a single cursor endpoint\");\n }\n const cursor = this.endpoints[0]!;\n const nextEndpoints: ChainCursorEndpoint[] = [];\n for (const [port, branchFactory] of Object.entries(branches)) {\n if (!branchFactory) {\n continue;\n }\n const branch = new ChainCursor<TCurrentJson>(this.wf, [{ node: cursor.node, output: port, inputPortHint: port }]);\n const builtBranch = branchFactory(branch);\n if (!builtBranch) {\n continue;\n }\n nextEndpoints.push(...builtBranch.endpoints);\n }\n return new ChainCursor<TNextJson>(this.wf, nextEndpoints);\n }\n\n /**\n * Chainable shorthand for `.then(node.create(config, metadata?.name, metadata?.nodeId))`.\n *\n * Signals to readers that this step suspends the run and waits for a human decision.\n * Throws at workflow-build time if `node` was not created via `defineHumanApprovalNode`.\n *\n * @example\n * ```ts\n * workflow\n * .trigger(...)\n * .humanApproval(inboxApproval, { title: \"Approve?\", body: \"...\", priority: \"normal\" })\n * .then(nextStep.create(...))\n * .build();\n * ```\n */\n humanApproval<\n TKey extends string,\n TConfig extends Record<string, unknown>,\n TBindings extends DefinedNodeCredentialBindings | undefined = undefined,\n >(\n node: DefinedHumanApprovalNode<TKey, TConfig, TCurrentJson & Record<string, unknown>, TBindings>,\n config: TConfig,\n metadata?: { name?: string; nodeId?: string },\n ): ChainCursor<HumanApprovalOutputJson<TCurrentJson & Record<string, unknown>>> {\n if (!isHumanApprovalNode(node)) {\n throw new Error(\n `.humanApproval() requires a node created via defineHumanApprovalNode (got '${(node as { key?: string }).key ?? String(node)}').`,\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.then(node.create(config as any, metadata?.name, metadata?.nodeId));\n }\n\n build(): WorkflowDefinition {\n return this.wf.build();\n }\n\n private resolveSharedInputPortHint(): InputPortKey | undefined {\n const first = this.endpoints[0]?.inputPortHint;\n if (!first) {\n return undefined;\n }\n return this.endpoints.every((endpoint) => endpoint.inputPortHint === first) ? first : undefined;\n }\n}\n","/**\n * Converts a human-readable node label into a stable, URL-safe identifier segment.\n *\n * Rules:\n * - Lowercase the entire string.\n * - Replace every run of characters outside `[a-z0-9]` with a single `-`.\n * - Strip any leading or trailing `-` characters.\n * - Return `\"\"` for blank/empty input.\n */\nexport const NodeIdSlugifier = {\n slugify(label: string): string {\n if (!label) return \"\";\n return label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n },\n};\n","/**\n * Thrown by {@link WorkflowBuilder.build} when the workflow definition is structurally invalid.\n *\n * Common causes:\n * - A node has an empty effective id (label is blank and no explicit `id` was given).\n * - Two or more nodes share the same effective id (label slugs collide or explicit ids clash).\n *\n * Fix: provide an explicit `id:` on the offending node configs.\n */\nexport class WorkflowDefinitionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WorkflowDefinitionError\";\n }\n}\n","import type {\n InputPortKey,\n NodeConfigBase,\n NodeDefinition,\n NodeRef,\n OutputPortKey,\n RunnableNodeOutputJson,\n TriggerNodeOutputJson,\n WorkflowDefinition,\n WorkflowId,\n} from \"../../types\";\n\nimport { AgentConfigInspector } from \"../../ai/AgentConfigInspectorFactory\";\nimport { AgentConnectionNodeCollector } from \"../../ai/AgentConnectionNodeCollector\";\nimport { ChainCursor } from \"./ChainCursorResolver\";\nimport { NodeIdSlugifier } from \"./NodeIdSlugifier\";\nimport { WorkflowDefinitionError } from \"./WorkflowDefinitionError\";\nimport type { AnyRunnableNodeConfig, AnyTriggerNodeConfig } from \"./workflowBuilderTypes\";\n\ntype NodeIdEntry = Readonly<{\n nodeId: string;\n tokenName: string;\n label: string;\n}>;\n\nexport class WorkflowBuilder {\n private readonly nodes: NodeDefinition[] = [];\n private readonly edges: WorkflowDefinition[\"edges\"] = [];\n\n constructor(\n private readonly meta: { id: WorkflowId; name: string },\n private readonly options?: Readonly<Record<string, never>>,\n ) {}\n\n private add(config: NodeConfigBase): NodeRef {\n const id = config.id ?? NodeIdSlugifier.slugify(config.name ?? \"\");\n this.nodes.push({ id, kind: config.kind, type: config.type, name: config.name, config });\n return { id, kind: config.kind, name: config.name };\n }\n\n private connect(from: NodeRef, to: NodeRef, fromOutput: OutputPortKey = \"main\", toInput: InputPortKey = \"in\"): void {\n this.edges.push({ from: { nodeId: from.id, output: fromOutput }, to: { nodeId: to.id, input: toInput } });\n }\n\n trigger<TConfig extends AnyTriggerNodeConfig>(config: TConfig): ChainCursor<TriggerNodeOutputJson<TConfig>> {\n const ref = this.add(config);\n return new ChainCursor<TriggerNodeOutputJson<TConfig>>(this, [{ node: ref, output: \"main\" }]);\n }\n\n start<TConfig extends AnyRunnableNodeConfig>(config: TConfig): ChainCursor<RunnableNodeOutputJson<TConfig>> {\n const ref = this.add(config);\n return new ChainCursor<RunnableNodeOutputJson<TConfig>>(this, [{ node: ref, output: \"main\" }]);\n }\n\n build(): WorkflowDefinition {\n this.validateNodeIds();\n return { ...this.meta, nodes: this.nodes, edges: this.edges };\n }\n\n private validateNodeIds(): void {\n const entries: NodeIdEntry[] = [];\n\n for (const node of this.nodes) {\n const tokenName = typeof node.type === \"function\" ? node.type.name : String(node.type);\n entries.push({ nodeId: node.id, tokenName, label: node.name ?? \"\" });\n\n if (AgentConfigInspector.isAgentNodeConfig(node.config)) {\n for (const child of AgentConnectionNodeCollector.collect(node.id, node.config)) {\n entries.push({ nodeId: child.nodeId, tokenName: child.typeName, label: child.name });\n }\n }\n }\n\n const emptyIds: NodeIdEntry[] = [];\n const seenIds = new Map<string, NodeIdEntry>();\n const duplicateIds: NodeIdEntry[] = [];\n\n for (const entry of entries) {\n if (!entry.nodeId) {\n emptyIds.push(entry);\n continue;\n }\n const existing = seenIds.get(entry.nodeId);\n if (existing) {\n if (!duplicateIds.includes(existing)) {\n duplicateIds.push(existing);\n }\n duplicateIds.push(entry);\n } else {\n seenIds.set(entry.nodeId, entry);\n }\n }\n\n if (emptyIds.length === 0 && duplicateIds.length === 0) {\n return;\n }\n\n const lines: string[] = [\"WorkflowBuilder.build() found invalid node ids:\"];\n\n if (emptyIds.length > 0) {\n lines.push(\" Empty ids (label is blank and no explicit id was given):\");\n for (const e of emptyIds) {\n lines.push(` - type \"${e.tokenName}\" label \"${e.label}\"`);\n }\n }\n\n if (duplicateIds.length > 0) {\n lines.push(\" Duplicate ids:\");\n for (const e of duplicateIds) {\n lines.push(` - id \"${e.nodeId}\" type \"${e.tokenName}\" label \"${e.label}\"`);\n }\n }\n\n lines.push(\" Fix: set an explicit `id:` on each offending node config.\");\n\n throw new WorkflowDefinitionError(lines.join(\"\\n\"));\n }\n}\n\nexport { ChainCursor } from \"./ChainCursorResolver\";\nexport { WhenBuilder } from \"./WhenBuilder\";\n","import type { NodeId } from \"../../types\";\n\n/**\n * Unique ids for persisted connection invocation history rows (LLM/tool calls under an owning node).\n *\n * Uses Web Crypto's `randomUUID` so this module is safe in browser-bundle contexts —\n * paired with `NodeIterationIdFactory` which had the same `node:crypto` regression.\n */\nexport class ConnectionInvocationIdFactory {\n static create(): string {\n return `cinv_${globalThis.crypto.randomUUID()}`;\n }\n\n /** Deterministic id for tests when a stable sequence is needed. */\n static createForTest(runId: string, connectionNodeId: NodeId, sequence: number): string {\n return `cinv_${runId}_${connectionNodeId}_${sequence}`;\n }\n}\n","import type { NodeDefinition, NodeId, WorkflowDefinition } from \"../../types\";\n\n/**\n * Derives which workflow nodes participate in the main execution graph vs connection-only children.\n */\nexport class WorkflowExecutableNodeClassifier {\n private readonly connectionOwnedIds: ReadonlySet<NodeId>;\n\n constructor(workflow: WorkflowDefinition) {\n this.connectionOwnedIds = this.collectConnectionOwnedIds(workflow);\n }\n\n isConnectionOwnedNodeId(nodeId: NodeId): boolean {\n return this.connectionOwnedIds.has(nodeId);\n }\n\n isExecutableNodeId(nodeId: NodeId): boolean {\n return !this.connectionOwnedIds.has(nodeId);\n }\n\n filterExecutableNodeDefinitions(nodes: ReadonlyArray<NodeDefinition>): ReadonlyArray<NodeDefinition> {\n return nodes.filter((n) => this.isExecutableNodeId(n.id));\n }\n\n private collectConnectionOwnedIds(workflow: WorkflowDefinition): ReadonlySet<NodeId> {\n const ids = new Set<NodeId>();\n for (const connection of workflow.connections ?? []) {\n for (const childId of connection.childNodeIds) {\n ids.add(childId);\n }\n }\n return ids;\n }\n\n /**\n * Resolves the default start node: first trigger, else first executable node with no incoming edges from executable nodes.\n */\n findDefaultExecutableStartNodeId(workflow: WorkflowDefinition): NodeId {\n const firstTrigger = workflow.nodes.find((n) => n.kind === \"trigger\" && this.isExecutableNodeId(n.id))?.id;\n if (firstTrigger) return firstTrigger;\n\n const incoming = new Map<NodeId, number>();\n for (const n of workflow.nodes) {\n if (this.isExecutableNodeId(n.id)) incoming.set(n.id, 0);\n }\n for (const e of workflow.edges) {\n if (!this.isExecutableNodeId(e.from.nodeId) || !this.isExecutableNodeId(e.to.nodeId)) continue;\n incoming.set(e.to.nodeId, (incoming.get(e.to.nodeId) ?? 0) + 1);\n }\n const start = workflow.nodes.find((n) => this.isExecutableNodeId(n.id) && (incoming.get(n.id) ?? 0) === 0)?.id;\n return (\n start ??\n workflow.nodes.find((n) => this.isExecutableNodeId(n.id))?.id ??\n (() => {\n throw new Error(`Workflow ${workflow.id} has no executable nodes`);\n })()\n );\n }\n\n firstExecutableNodeIdInDefinitionOrder(workflow: WorkflowDefinition): NodeId | undefined {\n return workflow.nodes.find((n) => this.isExecutableNodeId(n.id))?.id;\n }\n\n lastExecutableNodeIdInDefinitionOrder(workflow: WorkflowDefinition): NodeId {\n for (let i = workflow.nodes.length - 1; i >= 0; i--) {\n const n = workflow.nodes[i]!;\n if (this.isExecutableNodeId(n.id)) return n.id;\n }\n throw new Error(`Workflow ${workflow.id} has no executable nodes`);\n }\n}\n","import type { WorkflowDefinition } from \"../../types\";\n\nimport { WorkflowExecutableNodeClassifier } from \"./WorkflowExecutableNodeClassifier\";\n\nexport class WorkflowExecutableNodeClassifierFactory {\n static create(workflow: WorkflowDefinition): WorkflowExecutableNodeClassifier {\n return new WorkflowExecutableNodeClassifier(workflow);\n }\n}\n","import type { InputPortKey, NodeId, OutputPortKey, WorkflowDefinition, WorkflowGraph } from \"../../types\";\n\nexport class ExecutableGraph implements WorkflowGraph {\n private readonly outgoingByNodeAndPort = new Map<\n NodeId,\n Map<OutputPortKey, Array<Readonly<{ nodeId: NodeId; input: InputPortKey }>>>\n >();\n\n constructor(def: WorkflowDefinition) {\n for (const e of def.edges) {\n const byPort =\n this.outgoingByNodeAndPort.get(e.from.nodeId) ??\n new Map<OutputPortKey, Array<Readonly<{ nodeId: NodeId; input: InputPortKey }>>>();\n const next = byPort.get(e.from.output) ?? [];\n next.push({ nodeId: e.to.nodeId, input: e.to.input });\n byPort.set(e.from.output, next);\n this.outgoingByNodeAndPort.set(e.from.nodeId, byPort);\n }\n }\n\n next(nodeId: NodeId, output: OutputPortKey): Array<Readonly<{ nodeId: NodeId; input: InputPortKey }>> {\n return this.outgoingByNodeAndPort.get(nodeId)?.get(output) ?? [];\n }\n}\n","import type { WorkflowDefinition, WorkflowGraph, WorkflowGraphFactory } from \"../../types\";\nimport { ExecutableGraph } from \"./ExecutableGraph\";\n\nexport class DefaultWorkflowGraphFactory implements WorkflowGraphFactory {\n create(def: WorkflowDefinition): WorkflowGraph {\n return new ExecutableGraph(def);\n }\n}\n","import type { ConnectionInvocationRecord } from \"../contracts/runTypes\";\nimport type { ParentExecutionRef } from \"../types\";\nimport type { RunEventBus } from \"./runEvents\";\n\n/**\n * Publishes per-invocation lifecycle records onto the run {@link RunEventBus}.\n *\n * Surgical, per-invocation events let the UI update the right-side inspector\n * timeline as each LLM round / tool call transitions through `running` → `completed`\n * (or `failed`) without depending on a coarse `runSaved` poll.\n */\nexport class ConnectionInvocationEventPublisher {\n constructor(\n private readonly eventBus: RunEventBus | undefined,\n private readonly parent: ParentExecutionRef | undefined,\n ) {}\n\n async publish(record: ConnectionInvocationRecord): Promise<void> {\n if (!this.eventBus) return;\n const kind = this.kindFor(record);\n if (!kind) return;\n await this.eventBus.publish({\n kind,\n runId: record.runId,\n workflowId: record.workflowId,\n parent: this.parent,\n at: record.updatedAt,\n record,\n });\n }\n\n private kindFor(\n record: ConnectionInvocationRecord,\n ): \"connectionInvocationStarted\" | \"connectionInvocationCompleted\" | \"connectionInvocationFailed\" | undefined {\n if (record.status === \"running\" || record.status === \"queued\") {\n return \"connectionInvocationStarted\";\n }\n if (record.status === \"completed\") {\n return \"connectionInvocationCompleted\";\n }\n if (record.status === \"failed\") {\n return \"connectionInvocationFailed\";\n }\n return undefined;\n }\n}\n","import type { RunEventBus } from \"./runEvents\";\nimport type { NodeExecutionSnapshot } from \"../types\";\n\n/** Publishes node lifecycle snapshots onto the run {@link RunEventBus}. */\nexport class NodeEventPublisher {\n constructor(private readonly eventBus: RunEventBus | undefined) {}\n\n async publish(\n kind: \"nodeQueued\" | \"nodeStarted\" | \"nodeCompleted\" | \"nodeFailed\",\n snapshot: NodeExecutionSnapshot,\n ): Promise<void> {\n if (!this.eventBus) return;\n await this.eventBus.publish({\n kind,\n runId: snapshot.runId,\n workflowId: snapshot.workflowId,\n parent: snapshot.parent,\n at: snapshot.updatedAt,\n snapshot,\n });\n }\n}\n","import type { BinaryAttachment, BinaryPreviewKind, Item, NodeActivationId, NodeId, RunId, WorkflowId } from \"../types\";\n\nimport type {\n BinaryAttachmentCreateRequest,\n BinaryStorage,\n BinaryStorageReadResult,\n NodeBinaryAttachmentService,\n} from \"../types\";\n\nexport class DefaultNodeBinaryAttachmentService implements NodeBinaryAttachmentService {\n constructor(\n private readonly storage: BinaryStorage,\n private readonly workflowId: WorkflowId,\n private readonly runId: RunId,\n private readonly nodeId: NodeId,\n private readonly activationId: NodeActivationId,\n private readonly now: () => Date,\n ) {}\n\n async attach(args: BinaryAttachmentCreateRequest): Promise<BinaryAttachment> {\n const attachmentId = this.createAttachmentId();\n const createdAt = this.now().toISOString();\n const storageKey = this.createStorageKey(args, attachmentId);\n const stored = await this.storage.write({\n storageKey,\n body: args.body,\n });\n return {\n id: attachmentId,\n storageKey: stored.storageKey,\n mimeType: args.mimeType,\n size: stored.size,\n storageDriver: this.storage.driverName,\n previewKind: args.previewKind ?? this.resolvePreviewKind(args.mimeType),\n createdAt,\n runId: this.runId,\n workflowId: this.workflowId,\n nodeId: this.nodeId,\n activationId: this.activationId,\n filename: args.filename,\n sha256: stored.sha256,\n };\n }\n\n withAttachment<TJson>(item: Item<TJson>, name: string, attachment: BinaryAttachment): Item<TJson> {\n return {\n ...item,\n binary: {\n ...(item.binary ?? {}),\n [name]: attachment,\n },\n };\n }\n\n forNode(args: { nodeId: NodeId; activationId: NodeActivationId }): NodeBinaryAttachmentService {\n return new DefaultNodeBinaryAttachmentService(\n this.storage,\n this.workflowId,\n this.runId,\n args.nodeId,\n args.activationId,\n this.now,\n );\n }\n\n async openReadStream(attachment: BinaryAttachment): Promise<BinaryStorageReadResult | undefined> {\n return await this.storage.openReadStream(attachment.storageKey);\n }\n\n private createAttachmentId(): string {\n return DefaultNodeBinaryAttachmentService.createAttachmentIdValue(`${this.activationId}-${this.now().getTime()}`);\n }\n\n private static createAttachmentIdValue(fallbackValue: string): string {\n const cryptoObject = globalThis.crypto;\n if (cryptoObject && typeof cryptoObject.randomUUID === \"function\") {\n return cryptoObject.randomUUID();\n }\n return fallbackValue;\n }\n\n private createStorageKey(args: BinaryAttachmentCreateRequest, attachmentId: string): string {\n const safeName = this.sanitizeSegment(args.name);\n const safeFilename = this.sanitizeFilename(args.filename);\n const filenameSuffix = safeFilename ? `-${safeFilename}` : \"\";\n return `${this.sanitizeSegment(this.workflowId)}/${this.sanitizeSegment(this.runId)}/${this.sanitizeSegment(this.nodeId)}/${this.sanitizeSegment(this.activationId)}/${attachmentId}-${safeName}${filenameSuffix}`;\n }\n\n private sanitizeSegment(value: string): string {\n const normalized = value.trim();\n if (!normalized) {\n return \"item\";\n }\n return normalized.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n }\n\n private sanitizeFilename(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const normalized = value.trim().split(\"/\").at(-1)?.split(\"\\\\\").at(-1) ?? value.trim();\n if (!normalized) {\n return undefined;\n }\n return normalized.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n }\n\n private resolvePreviewKind(mimeType: string): BinaryPreviewKind {\n if (mimeType.startsWith(\"image/\")) {\n return \"image\";\n }\n if (mimeType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n if (mimeType.startsWith(\"video/\")) {\n return \"video\";\n }\n return \"download\";\n }\n}\n","import type { BinaryStorage } from \"../types\";\n\nexport class UnavailableBinaryStorage implements BinaryStorage {\n readonly driverName = \"unavailable\";\n\n async write(): Promise<never> {\n throw new Error(\"Binary storage is not configured for this runtime.\");\n }\n\n async openReadStream(): Promise<undefined> {\n return undefined;\n }\n\n async stat(): Promise<{ exists: false }> {\n return { exists: false };\n }\n\n async delete(): Promise<void> {}\n\n async deleteMany(): Promise<void> {}\n\n async listByPrefix(): Promise<ReadonlyArray<string>> {\n return [];\n }\n}\n","import type { BinaryAttachment, NodeActivationId, NodeId, RunId, WorkflowId } from \"../types\";\n\nimport type {\n BinaryStorage,\n BinaryStorageReadResult,\n ExecutionBinaryService,\n NodeBinaryAttachmentService,\n} from \"../types\";\n\nimport { DefaultNodeBinaryAttachmentService } from \"./DefaultNodeBinaryAttachmentServiceFactory\";\n\nexport class DefaultExecutionBinaryService implements ExecutionBinaryService {\n constructor(\n private readonly storage: BinaryStorage,\n private readonly workflowId: WorkflowId,\n private readonly runId: RunId,\n private readonly now: () => Date,\n ) {}\n\n forNode(args: { nodeId: NodeId; activationId: NodeActivationId }): NodeBinaryAttachmentService {\n return new DefaultNodeBinaryAttachmentService(\n this.storage,\n this.workflowId,\n this.runId,\n args.nodeId,\n args.activationId,\n this.now,\n );\n }\n\n async openReadStream(attachment: BinaryAttachment): Promise<BinaryStorageReadResult | undefined> {\n return await this.storage.openReadStream(attachment.storageKey);\n }\n}\n\nexport { DefaultNodeBinaryAttachmentService } from \"./DefaultNodeBinaryAttachmentServiceFactory\";\nexport { UnavailableBinaryStorage } from \"./UnavailableBinaryStorage\";\n","import type {\n JsonValue,\n NodeActivationId,\n NodeExecutionSnapshot,\n NodeExecutionStatus,\n NodeId,\n NodeInputsByPort,\n NodeOutputs,\n ParentExecutionRef,\n RunId,\n WorkflowId,\n} from \"../types\";\n\nexport class NodeExecutionSnapshotFactory {\n static queued(args: {\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n parent?: ParentExecutionRef;\n queuedAt: string;\n inputsByPort: NodeInputsByPort;\n }): NodeExecutionSnapshot {\n return {\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n parent: args.parent,\n status: \"queued\",\n queuedAt: args.queuedAt,\n updatedAt: args.queuedAt,\n inputsByPort: args.inputsByPort,\n };\n }\n\n static running(args: {\n previous?: NodeExecutionSnapshot;\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n parent?: ParentExecutionRef;\n startedAt: string;\n inputsByPort: NodeInputsByPort;\n }): NodeExecutionSnapshot {\n return {\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n parent: args.parent,\n status: \"running\",\n queuedAt: args.previous?.queuedAt,\n startedAt: args.startedAt,\n updatedAt: args.startedAt,\n inputsByPort: args.inputsByPort,\n outputs: args.previous?.outputs,\n error: undefined,\n };\n }\n\n static completed(args: {\n previous?: NodeExecutionSnapshot;\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n parent?: ParentExecutionRef;\n finishedAt: string;\n inputsByPort: NodeInputsByPort;\n outputs: NodeOutputs;\n fromPinnedOutput?: boolean;\n /** Override the terminal status for HITL outcomes (defaults to `\"completed\"`). */\n hitlStatus?: Extract<\n NodeExecutionStatus,\n \"hitl-approved\" | \"hitl-rejected\" | \"hitl-timeout\" | \"hitl-auto-accepted\" | \"hitl-cancelled\"\n >;\n }): NodeExecutionSnapshot {\n const fromPinnedOutput = args.fromPinnedOutput ?? false;\n const startedAt = fromPinnedOutput ? (args.previous?.startedAt ?? args.finishedAt) : args.previous?.startedAt;\n return {\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n parent: args.parent,\n status: args.hitlStatus ?? \"completed\",\n queuedAt: args.previous?.queuedAt,\n startedAt,\n finishedAt: args.finishedAt,\n updatedAt: args.finishedAt,\n inputsByPort: args.inputsByPort,\n outputs: args.outputs,\n usedPinnedOutput: fromPinnedOutput,\n error: undefined,\n ...(args.previous?.childRunId !== undefined ? { childRunId: args.previous.childRunId } : {}),\n };\n }\n\n static skipped(args: {\n previous?: NodeExecutionSnapshot;\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n parent?: ParentExecutionRef;\n finishedAt: string;\n inputsByPort: NodeInputsByPort;\n outputs: NodeOutputs;\n }): NodeExecutionSnapshot {\n return {\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n parent: args.parent,\n status: \"skipped\",\n queuedAt: args.previous?.queuedAt,\n startedAt: args.previous?.startedAt,\n finishedAt: args.finishedAt,\n updatedAt: args.finishedAt,\n inputsByPort: args.inputsByPort,\n outputs: args.outputs,\n error: undefined,\n ...(args.previous?.childRunId !== undefined ? { childRunId: args.previous.childRunId } : {}),\n };\n }\n\n static failed(args: {\n previous?: NodeExecutionSnapshot;\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n parent?: ParentExecutionRef;\n finishedAt: string;\n inputsByPort: NodeInputsByPort;\n error: Error;\n }): NodeExecutionSnapshot {\n return {\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n parent: args.parent,\n status: \"failed\",\n queuedAt: args.previous?.queuedAt,\n startedAt: args.previous?.startedAt,\n finishedAt: args.finishedAt,\n updatedAt: args.finishedAt,\n inputsByPort: args.inputsByPort,\n outputs: undefined,\n error: {\n message: args.error.message,\n name: args.error.name,\n stack: args.error.stack,\n details: (args.error as Error & { details?: JsonValue }).details,\n },\n ...(args.previous?.childRunId !== undefined ? { childRunId: args.previous.childRunId } : {}),\n };\n }\n}\n","import type { NodeActivationRequest, NodeInputsByPort } from \"../types\";\n\nexport class NodeInputsByPortFactory {\n static empty(): NodeInputsByPort {\n return {};\n }\n\n static fromRequest(request: NodeActivationRequest): NodeInputsByPort {\n if (request.kind === \"multi\") {\n return request.inputsByPort;\n }\n return { in: request.input };\n }\n}\n","import type {\n ConnectionInvocationRecord,\n EngineRunCounters,\n PendingResumeEntry,\n PersistedSuspensionEntry,\n PreparedNodeActivationDispatch,\n NodeActivationRequest,\n NodeActivationScheduler,\n NodeExecutionSnapshot,\n NodeId,\n ParentExecutionRef,\n PendingNodeExecution,\n PersistedRunControlState,\n RunDataFactory,\n RunExecutionOptions,\n RunId,\n RunQueueEntry,\n RunResult,\n WorkflowExecutionRepository,\n WorkflowId,\n} from \"../types\";\n\nimport { RunQueuePlanner } from \"../planning/RunQueuePlanner\";\n\nimport { NodeEventPublisher } from \"../events/NodeEventPublisher\";\nimport type { NodeActivationRequestInputPreparer } from \"./NodeActivationRequestInputPreparer\";\nimport { NodeExecutionSnapshotFactory } from \"./NodeExecutionSnapshotFactory\";\nimport { NodeInputsByPortFactory } from \"./NodeInputsByPortFactory\";\n\ntype PersistedRunStateRecord = NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>;\n\ntype ActivationSchedulerPort = Pick<NodeActivationScheduler, \"prepareDispatch\">;\n\nexport type ActivationEnqueueRequest = {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: RunExecutionOptions;\n control: PersistedRunControlState | undefined;\n workflowSnapshot: PersistedRunStateRecord[\"workflowSnapshot\"];\n mutableState: PersistedRunStateRecord[\"mutableState\"];\n policySnapshot: PersistedRunStateRecord[\"policySnapshot\"];\n pendingQueue: RunQueueEntry[];\n request: NodeActivationRequest;\n previousNodeSnapshotsByNodeId: Record<NodeId, NodeExecutionSnapshot>;\n planner: RunQueuePlanner;\n engineCounters?: EngineRunCounters;\n connectionInvocations?: ReadonlyArray<ConnectionInvocationRecord>;\n /**\n * Remaining suspension entries after consuming one for a HITL resume.\n * When provided, saved alongside the new pending state so they survive the enqueue.\n */\n suspension?: ReadonlyArray<PersistedSuspensionEntry>;\n /**\n * Resume context to attach to the re-activated node's execution context.\n * Written here and consumed by `NodeExecutionRequestHandlerService` when building ctx.\n */\n pendingResume?: PendingResumeEntry;\n};\n\nexport class ActivationEnqueueService {\n constructor(\n private readonly activationScheduler: ActivationSchedulerPort,\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n private readonly nodeEventPublisher: NodeEventPublisher,\n private readonly nodeActivationRequestInputPreparer: NodeActivationRequestInputPreparer,\n ) {}\n\n async enqueueActivation(args: ActivationEnqueueRequest): Promise<RunResult> {\n const { result, queuedSnapshot } = await this.enqueueActivationWithSnapshot(args);\n await this.nodeEventPublisher.publish(\"nodeQueued\", queuedSnapshot);\n return result;\n }\n\n async enqueueActivationWithSnapshot(\n args: ActivationEnqueueRequest,\n ): Promise<{ result: RunResult; queuedSnapshot: NodeExecutionSnapshot }> {\n const preparedRequest = await this.nodeActivationRequestInputPreparer.prepare(args.request);\n const preparedDispatch = await this.activationScheduler.prepareDispatch(preparedRequest);\n const inputsByPort = NodeInputsByPortFactory.fromRequest(preparedRequest);\n const itemsIn =\n preparedRequest.kind === \"multi\"\n ? args.planner.sumItemsByPort(preparedRequest.inputsByPort)\n : preparedRequest.input.length;\n const enqueuedAt = new Date().toISOString();\n const pending: PendingNodeExecution = {\n runId: args.runId,\n activationId: args.request.activationId,\n workflowId: args.workflowId,\n nodeId: args.request.nodeId,\n itemsIn,\n inputsByPort,\n receiptId: preparedDispatch.receipt.receiptId,\n queue: preparedDispatch.receipt.queue,\n batchId: args.request.batchId,\n enqueuedAt,\n };\n const queuedSnapshot = NodeExecutionSnapshotFactory.queued({\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId: args.request.nodeId,\n activationId: args.request.activationId,\n parent: args.parent,\n queuedAt: enqueuedAt,\n inputsByPort,\n });\n\n await this.workflowExecutionRepository.save({\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n engineCounters: args.engineCounters,\n connectionInvocations: args.connectionInvocations ? [...args.connectionInvocations] : [],\n status: \"pending\",\n pending,\n queue: args.pendingQueue.map((entry) => ({ ...entry })),\n outputsByNode: (args.request.ctx.data as ReturnType<RunDataFactory[\"create\"]>).dump(),\n nodeSnapshotsByNodeId: {\n ...args.previousNodeSnapshotsByNodeId,\n [args.request.nodeId]: queuedSnapshot,\n },\n // HITL: preserve suspension entries and resume context when re-activating a\n // suspended node. Omit fields when not provided (avoids polluting normal enqueue).\n ...(args.suspension !== undefined ? { suspension: args.suspension } : {}),\n ...(args.pendingResume !== undefined ? { pendingResume: args.pendingResume } : {}),\n });\n await this.dispatchPreparedActivation(preparedDispatch);\n return {\n result: { runId: args.runId, workflowId: args.workflowId, startedAt: args.startedAt, status: \"pending\", pending },\n queuedSnapshot,\n };\n }\n\n private async dispatchPreparedActivation(preparedDispatch: PreparedNodeActivationDispatch): Promise<void> {\n await preparedDispatch.dispatch();\n }\n}\n","import type {\n ActivationIdFactory,\n ConnectionInvocationId,\n NodeExecutionContext,\n NodeId,\n RunnableNodeConfig,\n TelemetrySpanScope,\n} from \"../types\";\n\n/**\n * Builds a re-rooted child execution context for sub-agent (and other deeply-nested) invocations.\n *\n * At the orchestrator's `agent.tool.call` boundary the inner runtime needs a ctx whose:\n * - `nodeId` is the tool's connection node id (so inner LLM/tool connection ids derive correctly),\n * - `activationId` is fresh (so its connection-invocation rows are uniquely identifiable),\n * - `telemetry` parents children under the tool-call span (not the orchestrator's node span),\n * - `binary` is scoped to the new (nodeId, activationId),\n * - `parentInvocationId` points back to the tool-call invocation for downstream lineage.\n *\n * Registered via factory in {@link EngineRuntimeRegistrar} so constructors stay free of parameter\n * decorators (Next/SWC and coverage tooling cannot parse them on in-repo sources).\n */\nexport class ChildExecutionScopeFactory {\n constructor(private readonly activationIdFactory: ActivationIdFactory) {}\n\n forSubAgent<TConfig extends RunnableNodeConfig<any, any>>(\n args: Readonly<{\n parentCtx: NodeExecutionContext<TConfig>;\n childNodeId: NodeId;\n childConfig: TConfig;\n parentInvocationId: ConnectionInvocationId;\n parentSpan: TelemetrySpanScope;\n }>,\n ): NodeExecutionContext<TConfig> {\n const childActivationId = this.activationIdFactory.makeActivationId();\n const childTelemetry = args.parentSpan.asNodeTelemetry({\n nodeId: args.childNodeId,\n activationId: childActivationId,\n });\n const childBinary = args.parentCtx.binary.forNode({\n nodeId: args.childNodeId,\n activationId: childActivationId,\n });\n return {\n ...args.parentCtx,\n nodeId: args.childNodeId,\n activationId: childActivationId,\n config: args.childConfig,\n telemetry: childTelemetry,\n binary: childBinary,\n parentInvocationId: args.parentInvocationId,\n iterationId: undefined,\n };\n }\n}\n","import type { Item } from \"./workflowTypes\";\n\n/**\n * Reads `meta._cm.originIndex` when present (used for fan-in merge-by-origin and Merge routing).\n */\nexport function getOriginIndexFromItem(item: Item): number | undefined {\n const meta = item.meta as Record<string, unknown> | undefined;\n const cm = meta?._cm as Record<string, unknown> | undefined;\n const v = cm?.originIndex;\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n","import type { InputPortKey, Item, Items, NodeInputsByPort } from \"../types\";\n\nimport { getOriginIndexFromItem } from \"../contracts/itemMeta\";\n\n/**\n * Default fan-in: combine multi-port {@link NodeInputsByPort} into one {@link Items} batch for per-item nodes.\n *\n * This is used when a single-input per-item node has multiple inbound edges (for example, branch reconverge\n * after an `If` / `Switch`). The default behavior is **append / union** (preserving item payloads) with a\n * deterministic order:\n *\n * - When router origin metadata exists (`meta._cm.originIndex`), items are sorted by origin index so the\n * downstream batch preserves original ordering across branches.\n * - Otherwise, items are appended by port-key order, preserving each port's local order.\n */\nexport class FanInMergeByOriginMerger {\n merge(inputsByPort: NodeInputsByPort): Items {\n const portKeys = Object.keys(inputsByPort).sort();\n if (portKeys.length === 0) {\n return [];\n }\n if (portKeys.length === 1) {\n const only = portKeys[0]!;\n return [...(inputsByPort[only] ?? [])];\n }\n\n type Entry = Readonly<{\n portKey: InputPortKey;\n portIndex: number;\n item: Item;\n originIndex: number | undefined;\n }>;\n\n const entries: Entry[] = [];\n let anyOrigin = false;\n\n for (let p = 0; p < portKeys.length; p++) {\n const portKey = portKeys[p]!;\n const items = inputsByPort[portKey] ?? [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as Item;\n const originIndex = getOriginIndexFromItem(item);\n if (originIndex !== undefined) {\n anyOrigin = true;\n }\n entries.push({ portKey, portIndex: i, item, originIndex });\n }\n }\n\n if (!anyOrigin) {\n return entries.map((e) => e.item);\n }\n\n const missingOriginRank = Number.MAX_SAFE_INTEGER;\n return entries\n .slice()\n .sort((a, b) => {\n const ao = a.originIndex ?? missingOriginRank;\n const bo = b.originIndex ?? missingOriginRank;\n if (ao !== bo) return ao - bo;\n const pk = a.portKey.localeCompare(b.portKey);\n if (pk !== 0) return pk;\n return a.portIndex - b.portIndex;\n })\n .map((e) => e.item);\n }\n}\n","import type { NodeActivationId, NodeId } from \"../types\";\n\nexport class NodeInputContractError extends Error {\n constructor(\n message: string,\n public readonly nodeId: NodeId,\n public readonly activationId: NodeActivationId,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"NodeInputContractError\";\n }\n}\n","import { z, ZodError } from \"zod\";\n\nimport type { Item, NodeActivationRequest, RunnableNodeConfig, WorkflowNodeInstanceFactory } from \"../types\";\n\nimport { FanInMergeByOriginMerger } from \"./FanInMergeByOriginMerger\";\nimport { NodeInputContractError } from \"./NodeInputContractError\";\n\n/**\n * Validates per-item inputs for {@link RunnableNode} before enqueue persistence (Zod on `item.json`).\n * Does not rewrite `item.json` (wire stays as emitted upstream; engine passes parsed input via `execute` args).\n * Converts multi-input activations into a single-input batch when the node is per-item only (engine fan-in).\n */\nexport class NodeActivationRequestInputPreparer {\n private readonly fanInMerger = new FanInMergeByOriginMerger();\n\n constructor(private readonly workflowNodeInstanceFactory: WorkflowNodeInstanceFactory) {}\n\n async prepare(request: NodeActivationRequest): Promise<NodeActivationRequest> {\n if (request.kind === \"multi\") {\n return await this.prepareMulti(request);\n }\n return await this.prepareSingle(request);\n }\n\n private async prepareMulti(\n request: Extract<NodeActivationRequest, { kind: \"multi\" }>,\n ): Promise<NodeActivationRequest> {\n const nodeInstance: unknown = this.workflowNodeInstanceFactory.createByType(request.ctx.config.type);\n if (\n !this.hasRunnableExecute(nodeInstance) ||\n this.hasExecuteMulti(nodeInstance) ||\n this.isTriggerNode(nodeInstance)\n ) {\n return request;\n }\n const merged = this.fanInMerger.merge(request.inputsByPort);\n const single: Extract<NodeActivationRequest, { kind: \"single\" }> = {\n ...request,\n kind: \"single\",\n input: merged,\n };\n return await this.prepareSingle(single);\n }\n\n private async prepareSingle(\n request: Extract<NodeActivationRequest, { kind: \"single\" }>,\n ): Promise<NodeActivationRequest> {\n const nodeInstance: unknown = this.workflowNodeInstanceFactory.createByType(request.ctx.config.type);\n if (!this.hasRunnableExecute(nodeInstance) || this.isTriggerNode(nodeInstance)) {\n return request;\n }\n const inputSchema = this.resolveInputSchema(nodeInstance, request.ctx.config as RunnableNodeConfig);\n const inputBatch = request.input ?? [];\n for (let i = 0; i < inputBatch.length; i++) {\n const item = inputBatch[i] as Item;\n try {\n if (Array.isArray(item.json)) {\n throw new Error(\"Item JSON must not be a top-level array\");\n }\n inputSchema.parse(item.json);\n } catch (cause) {\n const message = this.formatContractFailure(cause);\n throw new NodeInputContractError(\n `Node ${request.nodeId} activation ${request.activationId}: input contract failed: ${message}`,\n request.nodeId,\n request.activationId,\n cause,\n );\n }\n }\n return request.input === undefined ? { ...request, input: inputBatch } : request;\n }\n\n private isTriggerNode(nodeInstance: unknown): boolean {\n return (\n typeof nodeInstance === \"object\" &&\n nodeInstance !== null &&\n (nodeInstance as { kind?: string }).kind === \"trigger\"\n );\n }\n\n private hasRunnableExecute(nodeInstance: unknown): boolean {\n return (\n typeof nodeInstance === \"object\" &&\n nodeInstance !== null &&\n (nodeInstance as { kind?: string }).kind === \"node\" &&\n typeof (nodeInstance as { execute?: unknown }).execute === \"function\"\n );\n }\n\n private hasExecuteMulti(nodeInstance: unknown): boolean {\n return typeof (nodeInstance as { executeMulti?: unknown }).executeMulti === \"function\";\n }\n\n private resolveInputSchema(\n nodeInstance: unknown,\n config: RunnableNodeConfig,\n ): {\n parse: (data: unknown) => unknown;\n } {\n const fromInstance = (nodeInstance as { inputSchema?: unknown }).inputSchema;\n if (fromInstance && typeof (fromInstance as { parse?: unknown }).parse === \"function\") {\n return fromInstance as { parse: (data: unknown) => unknown };\n }\n const fromConfig = config.inputSchema;\n if (fromConfig && typeof fromConfig.parse === \"function\") {\n return fromConfig as { parse: (data: unknown) => unknown };\n }\n return z.unknown();\n }\n\n private formatContractFailure(cause: unknown): string {\n if (cause instanceof ZodError) {\n return cause.issues.map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`).join(\"; \");\n }\n if (cause instanceof Error) {\n return cause.message;\n }\n return String(cause);\n }\n}\n","import type { NodeId } from \"../types\";\n\nexport class NodeInstantiationError extends Error {\n readonly name = \"NodeInstantiationError\";\n readonly originalError: Error;\n\n constructor(\n readonly nodeId: NodeId,\n readonly nodeType: string,\n originalError: Error,\n ) {\n super(`Failed to instantiate node \"${nodeId}\" (type ${nodeType}): ${originalError.message}`);\n this.originalError = originalError;\n this.stack = originalError.stack;\n }\n}\n","import type { CredentialSessionService, NodeExecutionContext, NodeId, WorkflowId } from \"../types\";\n\nexport class CredentialResolverFactory {\n constructor(private readonly credentialSessions: CredentialSessionService) {}\n\n create(\n workflowId: WorkflowId,\n nodeId: NodeId,\n config?: NodeExecutionContext[\"config\"],\n ): NodeExecutionContext[\"getCredential\"] {\n const acceptedTypesBySlot = new Map<string, ReadonlyArray<string>>();\n for (const requirement of config?.getCredentialRequirements?.() ?? []) {\n acceptedTypesBySlot.set(requirement.slotKey, requirement.acceptedTypes);\n }\n\n return async <TSession = unknown>(slotKey: string): Promise<TSession> => {\n try {\n return await this.credentialSessions.getSession<TSession>({\n workflowId,\n nodeId,\n slotKey,\n });\n } catch (error) {\n const acceptedTypes = acceptedTypesBySlot.get(slotKey) ?? [];\n const message = error instanceof Error ? error.message : String(error);\n const alreadyListsAcceptedTypes =\n message.includes(\"Accepted types:\") ||\n message.includes(\"Accepted credential types:\") ||\n message.includes(\"binding points at an unknown type\");\n const acceptedTypesSuffix =\n acceptedTypes.length > 0 && !alreadyListsAcceptedTypes ? ` Accepted types: ${acceptedTypes.join(\", \")}.` : \"\";\n throw new Error(\n `Failed to resolve credential for workflow ${workflowId} node ${nodeId} slot \"${slotKey}\". ${message}${acceptedTypesSuffix}`,\n { cause: error },\n );\n }\n };\n }\n}\n","import type { AsyncSleeper } from \"./asyncSleeper.types\";\n\nexport class DefaultAsyncSleeper implements AsyncSleeper {\n sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n }\n}\n","import type { Items, JsonNonArray, OutputPortKey } from \"./workflowTypes\";\n\nconst EMIT_PORTS_BRAND = Symbol.for(\"codemation.emitPorts\");\n\nexport type PortsEmission = Readonly<{\n readonly [EMIT_PORTS_BRAND]: true;\n readonly ports: Readonly<Partial<Record<OutputPortKey, Items | ReadonlyArray<JsonNonArray>>>>;\n}>;\n\nexport function emitPorts(\n ports: Readonly<Partial<Record<OutputPortKey, Items | ReadonlyArray<JsonNonArray>>>>,\n): PortsEmission {\n return { [EMIT_PORTS_BRAND]: true, ports };\n}\n\nexport function isPortsEmission(value: unknown): value is PortsEmission {\n return (\n typeof value === \"object\" &&\n value !== null &&\n EMIT_PORTS_BRAND in value &&\n (value as Record<symbol, unknown>)[EMIT_PORTS_BRAND] === true\n );\n}\n\nexport function isUnbrandedPortsEmissionShape(value: unknown): value is Readonly<{ ports: unknown }> {\n return typeof value === \"object\" && value !== null && \"ports\" in value && !isPortsEmission(value);\n}\n","import type { NoneRetryPolicySpec } from \"./retryPolicySpec.types\";\n\nexport class NoRetryPolicy implements NoneRetryPolicySpec {\n readonly kind = \"none\" as const;\n}\n","import type { FixedRetryPolicySpec } from \"./retryPolicySpec.types\";\n\nexport class RetryPolicy implements FixedRetryPolicySpec {\n readonly kind = \"fixed\" as const;\n\n constructor(\n public readonly maxAttempts: number,\n public readonly delayMs: number,\n ) {\n if (!Number.isFinite(maxAttempts) || maxAttempts < 1 || !Number.isInteger(maxAttempts)) {\n throw new Error(`RetryPolicy.maxAttempts must be a positive integer, got ${maxAttempts}`);\n }\n if (!Number.isFinite(delayMs) || delayMs < 0) {\n throw new Error(`RetryPolicy.delayMs must be a non-negative finite number, got ${delayMs}`);\n }\n }\n\n /** Default for HTTP-style transient failures: 3 tries, 1s between attempts. */\n static readonly defaultForHttp: FixedRetryPolicySpec = { kind: \"fixed\", maxAttempts: 3, delayMs: 1000 };\n\n /** Default for LLM / agent calls: 3 tries, 2s fixed backoff. */\n static readonly defaultForAiAgent: FixedRetryPolicySpec = { kind: \"fixed\", maxAttempts: 3, delayMs: 2000 };\n}\n","import type { ExponentialRetryPolicySpec } from \"./retryPolicySpec.types\";\n\nexport class ExpRetryPolicy implements ExponentialRetryPolicySpec {\n readonly kind = \"exponential\" as const;\n\n constructor(\n public readonly maxAttempts: number,\n public readonly initialDelayMs: number,\n public readonly multiplier: number,\n public readonly maxDelayMs?: number,\n public readonly jitter?: boolean,\n ) {\n if (!Number.isFinite(maxAttempts) || maxAttempts < 1 || !Number.isInteger(maxAttempts)) {\n throw new Error(`ExpRetryPolicy.maxAttempts must be a positive integer, got ${maxAttempts}`);\n }\n if (!Number.isFinite(initialDelayMs) || initialDelayMs < 0) {\n throw new Error(`ExpRetryPolicy.initialDelayMs must be a non-negative finite number, got ${initialDelayMs}`);\n }\n if (!Number.isFinite(multiplier) || multiplier < 1) {\n throw new Error(`ExpRetryPolicy.multiplier must be >= 1, got ${multiplier}`);\n }\n }\n}\n","import type { ExecutionTelemetry } from \"./telemetryTypes\";\nimport type { TelemetryAttributes, TelemetryScope } from \"./telemetryTypes\";\n\nexport type CostTrackingComponent = \"chat\" | \"ocr\" | \"rag\";\n\nexport const CostTrackingTelemetryMetricNames = {\n usage: \"codemation.cost.usage\",\n estimatedCost: \"codemation.cost.estimated\",\n} as const;\n\nexport const CostTrackingTelemetryAttributeNames = {\n component: \"cost.component\",\n provider: \"cost.provider\",\n operation: \"cost.operation\",\n pricingKey: \"cost.pricing_key\",\n usageUnit: \"cost.usage_unit\",\n currency: \"cost.currency\",\n currencyScale: \"cost.currency_scale\",\n estimateKind: \"cost.estimate_kind\",\n} as const;\n\nexport interface CostTrackingUsageRecord {\n readonly component: CostTrackingComponent;\n readonly provider: string;\n readonly operation: string;\n readonly pricingKey: string;\n readonly usageUnit: string;\n readonly quantity: number;\n readonly modelName?: string;\n readonly attributes?: TelemetryAttributes;\n}\n\nexport interface CostTrackingPriceQuote {\n readonly currency: string;\n readonly currencyScale: number;\n readonly estimatedAmountMinor: number;\n readonly estimateKind: \"catalog\";\n}\n\nexport interface CostTrackingTelemetry {\n captureUsage(args: CostTrackingUsageRecord): Promise<CostTrackingPriceQuote | undefined>;\n forScope(scope: TelemetryScope): CostTrackingTelemetry;\n}\n\nexport interface CostTrackingTelemetryFactory {\n create(args: Readonly<{ telemetry: ExecutionTelemetry }>): CostTrackingTelemetry;\n}\n","import type {\n CostTrackingPriceQuote,\n CostTrackingTelemetry,\n CostTrackingUsageRecord,\n} from \"./CostTrackingTelemetryContract\";\nimport type { TelemetryScope } from \"./telemetryTypes\";\n\nexport class NoOpCostTrackingTelemetry implements CostTrackingTelemetry {\n async captureUsage(_: CostTrackingUsageRecord): Promise<CostTrackingPriceQuote | undefined> {\n return undefined;\n }\n\n forScope(_: TelemetryScope): CostTrackingTelemetry {\n return this;\n }\n}\n","import type { CostTrackingTelemetry, CostTrackingTelemetryFactory } from \"./CostTrackingTelemetryContract\";\nimport type { ExecutionTelemetry } from \"./telemetryTypes\";\nimport { NoOpCostTrackingTelemetry } from \"./NoOpCostTrackingTelemetry\";\n\nexport class NoOpCostTrackingTelemetryFactory implements CostTrackingTelemetryFactory {\n create(_: Readonly<{ telemetry: ExecutionTelemetry }>): CostTrackingTelemetry {\n return new NoOpCostTrackingTelemetry();\n }\n}\n","import type { TelemetryArtifactReference } from \"./telemetryTypes\";\n\nexport class NoOpTelemetryArtifactReference {\n static readonly value: TelemetryArtifactReference = {\n artifactId: \"telemetry-artifact-noop\",\n traceId: undefined,\n spanId: undefined,\n };\n}\n","import type { NodeActivationId, NodeId } from \"./workflowTypes\";\nimport type {\n NodeExecutionTelemetry,\n TelemetryArtifactAttachment,\n TelemetryArtifactReference,\n TelemetryChildSpanStart,\n TelemetryMetricRecord,\n TelemetrySpanEnd,\n TelemetrySpanEventRecord,\n TelemetrySpanScope,\n} from \"./telemetryTypes\";\nimport { NoOpTelemetryArtifactReference } from \"./NoOpTelemetryArtifactReference\";\n\n/**\n * Standalone no-op {@link NodeExecutionTelemetry} value used as the return for `asNodeTelemetry`.\n *\n * Defined here (instead of in `NoOpNodeExecutionTelemetry.ts`) so that {@link NoOpTelemetrySpanScope}\n * can return it without importing the other module — both no-ops share this leaf.\n */\nconst noOpNodeExecutionTelemetry: NodeExecutionTelemetry = {\n traceId: \"00000000000000000000000000000000\",\n spanId: \"0000000000000000\",\n addSpanEvent(_: TelemetrySpanEventRecord): void {},\n recordMetric(_: TelemetryMetricRecord): void {},\n attachArtifact(_: TelemetryArtifactAttachment): TelemetryArtifactReference {\n return NoOpTelemetryArtifactReference.value;\n },\n end(_: TelemetrySpanEnd = {}): void {},\n asNodeTelemetry(_: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>): NodeExecutionTelemetry {\n return noOpNodeExecutionTelemetry;\n },\n forNode(_: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>): NodeExecutionTelemetry {\n return noOpNodeExecutionTelemetry;\n },\n startChildSpan(_: TelemetryChildSpanStart): TelemetrySpanScope {\n return noOpTelemetrySpanScope;\n },\n};\n\nconst noOpTelemetrySpanScope: TelemetrySpanScope = {\n traceId: \"00000000000000000000000000000000\",\n spanId: \"0000000000000000\",\n addSpanEvent(_: TelemetrySpanEventRecord): void {},\n recordMetric(_: TelemetryMetricRecord): void {},\n attachArtifact(_: TelemetryArtifactAttachment): TelemetryArtifactReference {\n return NoOpTelemetryArtifactReference.value;\n },\n end(_: TelemetrySpanEnd = {}): void {},\n asNodeTelemetry(_: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>): NodeExecutionTelemetry {\n return noOpNodeExecutionTelemetry;\n },\n};\n\nexport class NoOpTelemetrySpanScope {\n static readonly value: TelemetrySpanScope = noOpTelemetrySpanScope;\n /** Internal: the shared no-op {@link NodeExecutionTelemetry} that {@link NoOpNodeExecutionTelemetry} re-exposes. */\n static readonly nodeExecutionTelemetryValue: NodeExecutionTelemetry = noOpNodeExecutionTelemetry;\n}\n","import type { NodeExecutionTelemetry } from \"./telemetryTypes\";\nimport { NoOpTelemetrySpanScope } from \"./NoOpTelemetrySpanScope\";\n\nexport class NoOpNodeExecutionTelemetry {\n static readonly value: NodeExecutionTelemetry = NoOpTelemetrySpanScope.nodeExecutionTelemetryValue;\n}\n","import type {\n ExecutionTelemetry,\n NodeExecutionTelemetry,\n TelemetryArtifactAttachment,\n TelemetryArtifactReference,\n TelemetryMetricRecord,\n TelemetrySpanEventRecord,\n} from \"./telemetryTypes\";\nimport type { NodeActivationId, NodeId } from \"./workflowTypes\";\nimport { NoOpNodeExecutionTelemetry } from \"./NoOpNodeExecutionTelemetry\";\nimport { NoOpTelemetryArtifactReference } from \"./NoOpTelemetryArtifactReference\";\n\nexport class NoOpExecutionTelemetry {\n static readonly value: ExecutionTelemetry = {\n traceId: \"00000000000000000000000000000000\",\n spanId: \"0000000000000000\",\n addSpanEvent(_: TelemetrySpanEventRecord): void {},\n recordMetric(_: TelemetryMetricRecord): void {},\n attachArtifact(_: TelemetryArtifactAttachment): TelemetryArtifactReference {\n return NoOpTelemetryArtifactReference.value;\n },\n forNode(_: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>): NodeExecutionTelemetry {\n return NoOpNodeExecutionTelemetry.value;\n },\n };\n}\n","import type { ParentExecutionRef, PersistedRunPolicySnapshot, RunId, WorkflowId } from \"./workflowTypes\";\nimport type { ExecutionTelemetry, ExecutionTelemetryFactory } from \"./telemetryTypes\";\nimport { NoOpExecutionTelemetry } from \"./NoOpExecutionTelemetry\";\n\nexport class NoOpExecutionTelemetryFactory implements ExecutionTelemetryFactory {\n create(\n _: Readonly<{\n runId: RunId;\n workflowId: WorkflowId;\n parent?: ParentExecutionRef;\n policySnapshot?: PersistedRunPolicySnapshot;\n }>,\n ): ExecutionTelemetry {\n return NoOpExecutionTelemetry.value;\n }\n}\n","import type { WorkflowId } from \"./workflowTypes\";\n\n/**\n * Host-controlled policy: when false, trigger {@link TriggerNode} setup is skipped and webhook routes\n * for that workflow are not registered (see engine trigger runtime + webhook matcher).\n */\nexport interface WorkflowActivationPolicy {\n isActive(workflowId: WorkflowId): boolean;\n}\n\n/** Default for tests and harnesses: every workflow is treated as active (legacy behavior). */\nexport class AllWorkflowsActiveWorkflowActivationPolicy implements WorkflowActivationPolicy {\n isActive(_workflowId: WorkflowId): boolean {\n return true;\n }\n}\n","export class CodemationTelemetryAttributeNames {\n static readonly workflowId = \"codemation.workflow.id\";\n static readonly runId = \"codemation.run.id\";\n static readonly nodeId = \"codemation.node.id\";\n static readonly activationId = \"codemation.activation.id\";\n static readonly nodeType = \"codemation.node.type\";\n static readonly nodeRole = \"codemation.node.role\";\n static readonly workflowFolder = \"codemation.workflow.folder\";\n static readonly connectionInvocationId = \"codemation.connection.invocation_id\";\n static readonly toolName = \"codemation.tool.name\";\n static readonly traceParentRunId = \"codemation.parent.run.id\";\n /** Per-item iteration that emitted this span/metric. Set on spans recorded inside a runnable per-item loop. */\n static readonly iterationId = \"codemation.iteration.id\";\n /** Item index (0-based) of the iteration. */\n static readonly iterationIndex = \"codemation.iteration.index\";\n /** Set when this span/metric was recorded under a sub-agent triggered by an outer LLM/tool call. */\n static readonly parentInvocationId = \"codemation.parent.invocation_id\";\n /** MCP server id on spans created for callTool invocations. */\n static readonly mcpServerId = \"mcp.server_id\";\n /** MCP tool name on spans created for callTool invocations. */\n static readonly mcpToolName = \"mcp.tool_name\";\n /** Terminal node-execution status (e.g. `\"hitl-approved\"`, `\"hitl-rejected\"`) on HITL outcome spans. */\n static readonly nodeExecutionStatus = \"codemation.node.execution_status\";\n /** Populated on run-halted spans; discriminates the halt reason (e.g. `\"hitl-rejected\"`). */\n static readonly runHaltReason = \"codemation.run.halt_reason\";\n /** Human task ID on `hitl.task.*` span events. */\n static readonly hitlTaskId = \"codemation.hitl.task_id\";\n /** HITL channel name (e.g. `\"inbox\"`, `\"control-plane-inbox\"`) on `hitl.task.*` span events. */\n static readonly hitlChannel = \"codemation.hitl.channel\";\n /** Decision outcome (e.g. `\"approved\"`, `\"rejected\"`) on `hitl.task.decided` span events. */\n static readonly hitlDecisionStatus = \"codemation.hitl.decision_status\";\n}\n","export class GenAiTelemetryAttributeNames {\n static readonly operationName = \"gen_ai.operation.name\";\n static readonly requestModel = \"gen_ai.request.model\";\n static readonly usageInputTokens = \"gen_ai.usage.input_tokens\";\n static readonly usageOutputTokens = \"gen_ai.usage.output_tokens\";\n static readonly usageTotalTokens = \"gen_ai.usage.total_tokens\";\n static readonly usageCacheReadInputTokens = \"gen_ai.usage.cache_read.input_tokens\";\n static readonly usageCacheCreationInputTokens = \"gen_ai.usage.cache_creation.input_tokens\";\n static readonly usageReasoningTokens = \"codemation.gen_ai.usage.reasoning_tokens\";\n}\n","export class CodemationTelemetryMetricNames {\n static readonly agentTurns = \"codemation.ai.turns\";\n static readonly agentToolCalls = \"codemation.ai.tool_calls\";\n static readonly gmailMessagesEmitted = \"codemation.gmail.messages_emitted\";\n static readonly gmailAttachments = \"codemation.gmail.attachments\";\n static readonly gmailAttachmentBytes = \"codemation.gmail.attachment_bytes\";\n}\n","import type { CostTrackingTelemetry } from \"../contracts/CostTrackingTelemetryContract\";\nimport type {\n ExecutionTelemetry,\n NodeExecutionTelemetry,\n TelemetryArtifactAttachment,\n TelemetryArtifactReference,\n TelemetryChildSpanStart,\n TelemetryMetricRecord,\n TelemetrySpanEnd,\n TelemetrySpanEventRecord,\n TelemetrySpanScope,\n} from \"../contracts/telemetryTypes\";\nimport type { NodeActivationId, NodeId } from \"../contracts/workflowTypes\";\n\nexport class ExecutionTelemetryCostTrackingDecoratorFactory {\n decorateExecutionTelemetry(args: {\n telemetry: ExecutionTelemetry;\n costTracking: CostTrackingTelemetry;\n }): ExecutionTelemetry {\n return {\n traceId: args.telemetry.traceId,\n spanId: args.telemetry.spanId,\n costTracking: args.costTracking,\n addSpanEvent: (event: TelemetrySpanEventRecord) => args.telemetry.addSpanEvent(event),\n recordMetric: (metric: TelemetryMetricRecord) => args.telemetry.recordMetric(metric),\n attachArtifact: (\n artifact: TelemetryArtifactAttachment,\n ): Promise<TelemetryArtifactReference> | TelemetryArtifactReference => args.telemetry.attachArtifact(artifact),\n forNode: (nodeArgs: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>): NodeExecutionTelemetry => {\n const nodeTelemetry = args.telemetry.forNode(nodeArgs);\n return this.decorateNodeExecutionTelemetry({\n telemetry: nodeTelemetry,\n costTracking: args.costTracking.forScope(nodeTelemetry),\n });\n },\n };\n }\n\n private decorateNodeExecutionTelemetry(args: {\n telemetry: NodeExecutionTelemetry;\n costTracking: CostTrackingTelemetry;\n }): NodeExecutionTelemetry {\n return {\n traceId: args.telemetry.traceId,\n spanId: args.telemetry.spanId,\n costTracking: args.costTracking,\n addSpanEvent: (event: TelemetrySpanEventRecord) => args.telemetry.addSpanEvent(event),\n recordMetric: (metric: TelemetryMetricRecord) => args.telemetry.recordMetric(metric),\n attachArtifact: (\n artifact: TelemetryArtifactAttachment,\n ): Promise<TelemetryArtifactReference> | TelemetryArtifactReference => args.telemetry.attachArtifact(artifact),\n end: (endArgs?: TelemetrySpanEnd) => args.telemetry.end(endArgs),\n startChildSpan: (spanArgs: TelemetryChildSpanStart): TelemetrySpanScope =>\n this.decorateTelemetrySpanScope({\n scope: args.telemetry.startChildSpan(spanArgs),\n costTracking: args.costTracking,\n }),\n forNode: (nodeArgs: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>): NodeExecutionTelemetry => {\n const nodeTelemetry = args.telemetry.forNode(nodeArgs);\n return this.decorateNodeExecutionTelemetry({\n telemetry: nodeTelemetry,\n costTracking: args.costTracking.forScope(nodeTelemetry),\n });\n },\n asNodeTelemetry: (\n rescope: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>,\n ): NodeExecutionTelemetry => {\n const nodeTelemetry = args.telemetry.asNodeTelemetry(rescope);\n return this.decorateNodeExecutionTelemetry({\n telemetry: nodeTelemetry,\n costTracking: args.costTracking.forScope(nodeTelemetry),\n });\n },\n };\n }\n\n private decorateTelemetrySpanScope(args: {\n scope: TelemetrySpanScope;\n costTracking: CostTrackingTelemetry;\n }): TelemetrySpanScope {\n return {\n traceId: args.scope.traceId,\n spanId: args.scope.spanId,\n costTracking: args.costTracking.forScope(args.scope),\n addSpanEvent: (event: TelemetrySpanEventRecord) => args.scope.addSpanEvent(event),\n recordMetric: (metric: TelemetryMetricRecord) => args.scope.recordMetric(metric),\n attachArtifact: (\n artifact: TelemetryArtifactAttachment,\n ): Promise<TelemetryArtifactReference> | TelemetryArtifactReference => args.scope.attachArtifact(artifact),\n end: (endArgs?: TelemetrySpanEnd) => args.scope.end(endArgs),\n asNodeTelemetry: (\n rescope: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>,\n ): NodeExecutionTelemetry => {\n const nodeTelemetry = args.scope.asNodeTelemetry(rescope);\n return this.decorateNodeExecutionTelemetry({\n telemetry: nodeTelemetry,\n costTracking: args.costTracking.forScope(nodeTelemetry),\n });\n },\n };\n }\n}\n","import type {\n BinaryStorage,\n CollectionsContext,\n CostTrackingTelemetryFactory,\n ExecutionContext,\n ExecutionContextFactory,\n ExecutionTelemetryFactory,\n NodeExecutionStatePublisher,\n NodeResolver,\n ParentExecutionRef,\n RunDataSnapshot,\n RunId,\n RunTestContext,\n WorkflowId,\n} from \"../types\";\nimport { NoOpCostTrackingTelemetryFactory, NoOpExecutionTelemetryFactory } from \"../types\";\nimport type { TypeToken } from \"../di\";\n\nimport {\n DefaultExecutionBinaryService,\n UnavailableBinaryStorage,\n} from \"../binaries/DefaultExecutionBinaryServiceFactory\";\nimport { ExecutionTelemetryCostTrackingDecoratorFactory } from \"./ExecutionTelemetryCostTrackingDecoratorFactory\";\n\nexport class DefaultExecutionContextFactory implements ExecutionContextFactory {\n private readonly telemetryDecoratorFactory = new ExecutionTelemetryCostTrackingDecoratorFactory();\n\n constructor(\n private readonly binaryStorage: BinaryStorage = new UnavailableBinaryStorage(),\n private readonly telemetryFactory: ExecutionTelemetryFactory = new NoOpExecutionTelemetryFactory(),\n private readonly costTrackingFactory: CostTrackingTelemetryFactory = new NoOpCostTrackingTelemetryFactory(),\n private readonly currentDate: () => Date = () => new Date(),\n private readonly collections?: CollectionsContext,\n private readonly nodeResolver?: NodeResolver,\n ) {}\n\n create(args: {\n runId: RunId;\n workflowId: WorkflowId;\n parent?: ParentExecutionRef;\n policySnapshot?: import(\"../types\").PersistedRunPolicySnapshot;\n subworkflowDepth: number;\n engineMaxNodeActivations: number;\n engineMaxSubworkflowDepth: number;\n data: RunDataSnapshot;\n nodeState?: NodeExecutionStatePublisher;\n telemetry?: ExecutionContext[\"telemetry\"];\n getCredential<TSession = unknown>(slotKey: string): Promise<TSession>;\n testContext?: RunTestContext;\n }): ExecutionContext {\n const baseTelemetry =\n args.telemetry ??\n this.telemetryFactory.create({\n runId: args.runId,\n workflowId: args.workflowId,\n parent: args.parent,\n policySnapshot: args.policySnapshot,\n });\n const telemetry = this.telemetryDecoratorFactory.decorateExecutionTelemetry({\n telemetry: baseTelemetry,\n costTracking: baseTelemetry.costTracking ?? this.costTrackingFactory.create({ telemetry: baseTelemetry }),\n });\n return {\n runId: args.runId,\n workflowId: args.workflowId,\n parent: args.parent,\n subworkflowDepth: args.subworkflowDepth,\n engineMaxNodeActivations: args.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: args.engineMaxSubworkflowDepth,\n now: this.currentDate,\n data: args.data,\n nodeState: args.nodeState,\n telemetry,\n binary: new DefaultExecutionBinaryService(this.binaryStorage, args.workflowId, args.runId, this.currentDate),\n getCredential: args.getCredential,\n testContext: args.testContext,\n collections: this.collections,\n resolve: <T>(token: TypeToken<T>): T => {\n if (!this.nodeResolver) {\n throw new Error(\n \"ExecutionContext.resolve() is not available: no NodeResolver was provided to DefaultExecutionContextFactory.\",\n );\n }\n return this.nodeResolver.resolve(token);\n },\n };\n }\n}\n","import type { CostCatalog } from \"../contracts/CostCatalogContract\";\nimport {\n CostTrackingTelemetryAttributeNames,\n CostTrackingTelemetryMetricNames,\n type CostTrackingPriceQuote,\n type CostTrackingTelemetry,\n type CostTrackingUsageRecord,\n} from \"../contracts/CostTrackingTelemetryContract\";\nimport type { TelemetryAttributes, TelemetryScope } from \"../types\";\n\nexport class CatalogBackedCostTrackingTelemetry implements CostTrackingTelemetry {\n constructor(\n private readonly currentScope: TelemetryScope,\n private readonly costCatalog: CostCatalog,\n ) {}\n\n async captureUsage(args: CostTrackingUsageRecord): Promise<CostTrackingPriceQuote | undefined> {\n const usageAttributes = this.createUsageAttributes(args);\n await this.currentScope.recordMetric({\n name: CostTrackingTelemetryMetricNames.usage,\n value: args.quantity,\n unit: args.usageUnit,\n attributes: usageAttributes,\n });\n\n const catalogEntry = this.costCatalog.findEntry(args);\n if (!catalogEntry) {\n return undefined;\n }\n\n const estimatedAmountMinor = Math.round(args.quantity * catalogEntry.pricePerUnitMinor);\n const costAttributes = this.createCostAttributes(args, catalogEntry.currency, catalogEntry.currencyScale);\n await this.currentScope.recordMetric({\n name: CostTrackingTelemetryMetricNames.estimatedCost,\n value: estimatedAmountMinor,\n unit: catalogEntry.currency,\n attributes: costAttributes,\n });\n\n return {\n currency: catalogEntry.currency,\n currencyScale: catalogEntry.currencyScale,\n estimatedAmountMinor,\n estimateKind: \"catalog\",\n };\n }\n\n forScope(scope: TelemetryScope): CostTrackingTelemetry {\n // eslint-disable-next-line codemation/no-manual-di-new\n return new CatalogBackedCostTrackingTelemetry(scope, this.costCatalog);\n }\n\n private createUsageAttributes(args: CostTrackingUsageRecord): TelemetryAttributes {\n return {\n ...args.attributes,\n [CostTrackingTelemetryAttributeNames.component]: args.component,\n [CostTrackingTelemetryAttributeNames.provider]: args.provider,\n [CostTrackingTelemetryAttributeNames.operation]: args.operation,\n [CostTrackingTelemetryAttributeNames.pricingKey]: args.pricingKey,\n [CostTrackingTelemetryAttributeNames.usageUnit]: args.usageUnit,\n };\n }\n\n private createCostAttributes(\n args: CostTrackingUsageRecord,\n currency: string,\n currencyScale: number,\n ): TelemetryAttributes {\n return {\n ...args.attributes,\n [CostTrackingTelemetryAttributeNames.component]: args.component,\n [CostTrackingTelemetryAttributeNames.provider]: args.provider,\n [CostTrackingTelemetryAttributeNames.operation]: args.operation,\n [CostTrackingTelemetryAttributeNames.pricingKey]: args.pricingKey,\n [CostTrackingTelemetryAttributeNames.usageUnit]: args.usageUnit,\n [CostTrackingTelemetryAttributeNames.currency]: currency,\n [CostTrackingTelemetryAttributeNames.currencyScale]: currencyScale,\n [CostTrackingTelemetryAttributeNames.estimateKind]: \"catalog\",\n };\n }\n}\n","import type { CostCatalog } from \"../contracts/CostCatalogContract\";\nimport type { CostTrackingTelemetry, CostTrackingTelemetryFactory } from \"../contracts/CostTrackingTelemetryContract\";\nimport type { ExecutionTelemetry } from \"../contracts/telemetryTypes\";\nimport { CatalogBackedCostTrackingTelemetry } from \"./CatalogBackedCostTrackingTelemetry\";\n\nexport class CatalogBackedCostTrackingTelemetryFactory implements CostTrackingTelemetryFactory {\n constructor(private readonly costCatalog: CostCatalog) {}\n\n create(args: Readonly<{ telemetry: ExecutionTelemetry }>): CostTrackingTelemetry {\n return new CatalogBackedCostTrackingTelemetry(args.telemetry, this.costCatalog);\n }\n}\n","import type {\n ExponentialRetryPolicySpec,\n FixedRetryPolicySpec,\n RetryPolicySpec,\n} from \"../contracts/retryPolicySpec.types\";\nimport type { AsyncSleeper } from \"./asyncSleeper.types\";\n\nexport type { AsyncSleeper } from \"./asyncSleeper.types\";\n\n/** Maximum permitted retry attempts — workflow-declared values above this are clamped. */\nconst HARD_MAX_RETRY_ATTEMPTS = 10;\n\ntype NormalizedPolicy =\n | { readonly kind: \"none\"; readonly maxAttempts: 1 }\n | { readonly kind: \"fixed\"; readonly maxAttempts: number; readonly delayMs: number }\n | {\n readonly kind: \"exponential\";\n readonly maxAttempts: number;\n readonly initialDelayMs: number;\n readonly multiplier: number;\n readonly maxDelayMs?: number;\n readonly jitter?: boolean;\n };\n\nexport class InProcessRetryRunner {\n constructor(private readonly sleeper: AsyncSleeper) {}\n\n async run<T>(\n policy: RetryPolicySpec | undefined,\n work: () => Promise<T>,\n shouldRetry?: (error: unknown) => boolean,\n warn?: (message: string) => void,\n ): Promise<T> {\n const spec = InProcessRetryRunner.normalizePolicy(policy, warn);\n let lastError: unknown;\n for (let attempt = 1; attempt <= spec.maxAttempts; attempt++) {\n try {\n return await work();\n } catch (error) {\n lastError = error;\n if (attempt >= spec.maxAttempts) {\n break;\n }\n if (shouldRetry !== undefined && !shouldRetry(error)) {\n break;\n }\n const delayMs = InProcessRetryRunner.delayAfterFailureMs(spec, attempt);\n await this.sleeper.sleep(delayMs);\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n private static delayAfterFailureMs(spec: NormalizedPolicy, failedAttempt: number): number {\n if (spec.kind === \"none\") {\n return 0;\n }\n if (spec.kind === \"fixed\") {\n return spec.delayMs;\n }\n const exponent = failedAttempt - 1;\n let ms = spec.initialDelayMs * Math.pow(spec.multiplier, exponent);\n if (spec.jitter === true) {\n ms *= 1 + Math.random() * 0.2;\n }\n if (spec.maxDelayMs !== undefined && ms > spec.maxDelayMs) {\n ms = spec.maxDelayMs;\n }\n return Math.max(0, Math.floor(ms));\n }\n\n private static normalizePolicy(\n policy: RetryPolicySpec | undefined,\n warn?: (message: string) => void,\n ): NormalizedPolicy {\n if (policy === undefined) {\n return { kind: \"none\", maxAttempts: 1 };\n }\n if (typeof policy !== \"object\" || policy === null) {\n return { kind: \"none\", maxAttempts: 1 };\n }\n const kind = (policy as { kind?: unknown }).kind;\n if (kind === \"none\") {\n return { kind: \"none\", maxAttempts: 1 };\n }\n if (kind === \"fixed\") {\n const p = policy as FixedRetryPolicySpec;\n const raw = InProcessRetryRunner.assertPositiveInt(p.maxAttempts, \"fixed.maxAttempts\");\n const maxAttempts = InProcessRetryRunner.clampMaxAttempts(raw, warn);\n const delayMs = InProcessRetryRunner.assertNonNegativeFinite(p.delayMs, \"fixed.delayMs\");\n return { kind: \"fixed\", maxAttempts, delayMs };\n }\n if (kind === \"exponential\") {\n const p = policy as ExponentialRetryPolicySpec;\n const raw = InProcessRetryRunner.assertPositiveInt(p.maxAttempts, \"exponential.maxAttempts\");\n return {\n kind: \"exponential\",\n maxAttempts: InProcessRetryRunner.clampMaxAttempts(raw, warn),\n initialDelayMs: InProcessRetryRunner.assertNonNegativeFinite(p.initialDelayMs, \"exponential.initialDelayMs\"),\n multiplier: InProcessRetryRunner.assertMultiplier(p.multiplier),\n maxDelayMs:\n p.maxDelayMs === undefined\n ? undefined\n : InProcessRetryRunner.assertNonNegativeFinite(p.maxDelayMs, \"exponential.maxDelayMs\"),\n jitter: p.jitter === true,\n };\n }\n return { kind: \"none\", maxAttempts: 1 };\n }\n\n private static clampMaxAttempts(requested: number, warn?: (message: string) => void): number {\n if (requested > HARD_MAX_RETRY_ATTEMPTS) {\n warn?.(\n `Retry policy maxAttempts (${requested}) exceeds hard ceiling (${HARD_MAX_RETRY_ATTEMPTS}); clamping to ${HARD_MAX_RETRY_ATTEMPTS}.`,\n );\n return HARD_MAX_RETRY_ATTEMPTS;\n }\n return requested;\n }\n\n private static assertPositiveInt(value: unknown, label: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 1 || !Number.isInteger(value)) {\n throw new Error(`Retry policy ${label} must be a positive integer`);\n }\n return value;\n }\n\n private static assertNonNegativeFinite(value: unknown, label: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`Retry policy ${label} must be a non-negative finite number`);\n }\n return value;\n }\n\n private static assertMultiplier(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 1) {\n throw new Error(`Retry policy exponential.multiplier must be >= 1`);\n }\n return value;\n }\n}\n","import { resolveItemExprsForExecution } from \"../contracts/itemExpr\";\nimport type { Item, NodeExecutionContext, RunnableNodeConfig } from \"../types\";\n\n/**\n * Resolves {@link import(\"../contracts/itemExpr\").ItemExpr} leaves on runnable config before {@link RunnableNode.execute}.\n */\nexport class ItemExprResolver {\n async resolveConfigForItem<TConfig extends RunnableNodeConfig<any, any>>(\n ctx: NodeExecutionContext<TConfig>,\n item: Item,\n itemIndex: number,\n items: ReadonlyArray<Item>,\n ): Promise<NodeExecutionContext<TConfig>> {\n if (!ctx) {\n throw new Error(\"ItemExprResolver.resolveConfigForItem: ctx is required\");\n }\n const resolvedConfig = await resolveItemExprsForExecution(ctx.config, ctx, item, itemIndex, items);\n const merged = resolvedConfig !== undefined && resolvedConfig !== null ? resolvedConfig : ctx.config;\n if (merged === undefined || merged === null) {\n return ctx;\n }\n return {\n ...ctx,\n config: merged as TConfig,\n };\n }\n}\n","import { isPortsEmission, isUnbrandedPortsEmissionShape } from \"../contracts/emitPorts\";\nimport type { PortsEmission } from \"../contracts/emitPorts\";\nimport type { Item, Items, JsonNonArray, NodeOutputs, OutputPortKey } from \"../types\";\nimport type { RunnableOutputBehavior } from \"./RunnableOutputBehaviorResolver\";\n\nexport class NodeOutputNormalizer {\n normalizeExecuteResult(\n args: Readonly<{\n baseItem: Item;\n raw: unknown;\n behavior: RunnableOutputBehavior;\n }>,\n ): NodeOutputs {\n const { baseItem, raw, behavior } = args;\n if (isPortsEmission(raw)) {\n return this.emitPortsToOutputs(baseItem, raw, behavior);\n }\n if (isUnbrandedPortsEmissionShape(raw)) {\n throw new Error(\n \"execute() returned an unbranded `{ ports: ... }` object. Use emitPorts(...) for multi-port runnable outputs.\",\n );\n }\n if (Array.isArray(raw)) {\n return this.arrayFanOutToMain(baseItem, raw, behavior);\n }\n if (this.isItemLike(raw)) {\n return { main: [this.applyOutput(baseItem, raw, behavior)] };\n }\n return {\n main: [this.applyOutput(baseItem, { json: raw as JsonNonArray }, behavior)],\n };\n }\n\n private arrayFanOutToMain(baseItem: Item, raw: readonly unknown[], behavior: RunnableOutputBehavior): NodeOutputs {\n for (const el of raw) {\n if (Array.isArray(el)) {\n throw new Error(\n \"execute() fan-out arrays must contain only non-array JSON elements (nested arrays belong inside objects).\",\n );\n }\n }\n const main: Item[] = raw.map((json) => this.applyOutput(baseItem, { json: json as JsonNonArray }, behavior));\n return { main };\n }\n\n private emitPortsToOutputs(baseItem: Item, emission: PortsEmission, behavior: RunnableOutputBehavior): NodeOutputs {\n const out: NodeOutputs = {};\n for (const [port, payload] of Object.entries(emission.ports)) {\n if (payload === undefined) {\n continue;\n }\n out[port as OutputPortKey] = this.normalizePortPayload(baseItem, payload, behavior);\n }\n return out;\n }\n\n private normalizePortPayload(\n baseItem: Item,\n payload: Items | ReadonlyArray<JsonNonArray>,\n behavior: RunnableOutputBehavior,\n ): Items {\n if (payload.length === 0) {\n return [];\n }\n const el0 = payload[0] as unknown;\n if (this.isItemLike(el0)) {\n return (payload as Items).map((it) => this.applyOutput(baseItem, it, behavior));\n }\n return (payload as readonly JsonNonArray[]).map((json) => this.applyOutput(baseItem, { json }, behavior));\n }\n\n private isItemLike(value: unknown): value is Item {\n return typeof value === \"object\" && value !== null && \"json\" in value;\n }\n\n private applyOutput(baseItem: Item, next: Item, behavior: RunnableOutputBehavior): Item {\n const explicitBinary = next.binary;\n return {\n json: next.json,\n ...(explicitBinary !== undefined\n ? { binary: explicitBinary }\n : behavior.keepBinaries && baseItem.binary\n ? { binary: baseItem.binary }\n : {}),\n ...(next.meta ? { meta: next.meta } : {}),\n ...(next.paired ? { paired: next.paired } : {}),\n };\n }\n}\n","import type { RunnableNodeConfig } from \"../types\";\n\ntype BinaryKeepingRunnableNodeConfig = RunnableNodeConfig &\n Readonly<{\n keepBinaries?: boolean;\n }>;\n\nexport type RunnableOutputBehavior = Readonly<{\n keepBinaries: boolean;\n}>;\n\nexport class RunnableOutputBehaviorResolver {\n resolve(config: RunnableNodeConfig): RunnableOutputBehavior {\n return {\n keepBinaries: this.isKeepBinariesEnabled(config),\n };\n }\n\n private isKeepBinariesEnabled(config: RunnableNodeConfig): boolean {\n const candidate = config as BinaryKeepingRunnableNodeConfig;\n return candidate.keepBinaries === true;\n }\n}\n","import { DefaultAsyncSleeper } from \"./DefaultAsyncSleeper\";\nimport { InProcessRetryRunner } from \"./InProcessRetryRunner\";\n\nexport class InProcessRetryRunnerFactory {\n create(defaultAsyncSleeper: DefaultAsyncSleeper): InProcessRetryRunner {\n return new InProcessRetryRunner(defaultAsyncSleeper);\n }\n}\n","import type {\n ActivationIdFactory,\n ExecutionContextFactory,\n Items,\n NodeActivationId,\n NodeActivationRequest,\n NodeExecutionContext,\n NodeId,\n NodeInputsByPort,\n ParentExecutionRef,\n RunDataFactory,\n RunExecutionOptions,\n RunId,\n WorkflowId,\n} from \"../types\";\n\nimport type { PlannedActivation } from \"../planning/RunQueuePlanner\";\n\nimport { CredentialResolverFactory } from \"./CredentialResolverFactory\";\n\ntype NodeExecutionDefinition = Readonly<{ id: NodeId; config: NodeExecutionContext[\"config\"] }>;\n\ntype NodeActivationContextArgs = {\n runId: RunId;\n workflowId: WorkflowId;\n parent?: ParentExecutionRef;\n executionOptions?: RunExecutionOptions;\n base: ReturnType<ExecutionContextFactory[\"create\"]>;\n data: ReturnType<RunDataFactory[\"create\"]>;\n};\n\nexport type SingleDefinitionActivationRequest = NodeActivationContextArgs & {\n definition: NodeExecutionDefinition;\n batchId: string;\n input: Items;\n};\n\nexport type MultiDefinitionActivationRequest = NodeActivationContextArgs & {\n definition: NodeExecutionDefinition;\n batchId: string;\n inputsByPort: NodeInputsByPort;\n};\n\nexport type PlannedNodeActivationRequest = NodeActivationContextArgs & {\n next: PlannedActivation;\n nodeDefinition: NodeExecutionDefinition;\n};\n\n/**\n * Builds {@link NodeActivationRequest} values shared by workflow starters and continuation.\n */\nexport class NodeActivationRequestComposer {\n constructor(\n private readonly activationIdFactory: ActivationIdFactory,\n private readonly credentialResolverFactory: CredentialResolverFactory,\n ) {}\n\n createSingleFromDefinition(\n args: SingleDefinitionActivationRequest,\n ): Extract<NodeActivationRequest, { kind: \"single\" }> {\n return this.createSingleFromDefinitionWithActivation({\n ...args,\n activationId: this.activationIdFactory.makeActivationId(),\n });\n }\n\n createSingleFromDefinitionWithActivation(\n args: SingleDefinitionActivationRequest & Readonly<{ activationId: NodeActivationId }>,\n ): Extract<NodeActivationRequest, { kind: \"single\" }> {\n const ctx = this.createNodeExecutionContext(args, args.definition, args.activationId);\n return {\n kind: \"single\",\n runId: args.runId,\n activationId: args.activationId,\n workflowId: args.workflowId,\n nodeId: args.definition.id,\n parent: args.parent,\n executionOptions: args.executionOptions,\n batchId: args.batchId,\n input: args.input,\n ctx,\n };\n }\n\n createMultiFromDefinitionWithActivation(\n args: MultiDefinitionActivationRequest & Readonly<{ activationId: NodeActivationId }>,\n ): Extract<NodeActivationRequest, { kind: \"multi\" }> {\n const ctx = this.createNodeExecutionContext(args, args.definition, args.activationId);\n return {\n kind: \"multi\",\n runId: args.runId,\n activationId: args.activationId,\n workflowId: args.workflowId,\n nodeId: args.definition.id,\n parent: args.parent,\n executionOptions: args.executionOptions,\n batchId: args.batchId,\n inputsByPort: args.inputsByPort,\n ctx,\n };\n }\n\n createFromPlannedActivation(args: PlannedNodeActivationRequest): NodeActivationRequest {\n const activationId = this.activationIdFactory.makeActivationId();\n const ctx = this.createNodeExecutionContext(args, args.nodeDefinition, activationId);\n if (args.next.kind === \"multi\") {\n return {\n kind: \"multi\",\n runId: args.runId,\n activationId,\n workflowId: args.workflowId,\n nodeId: args.nodeDefinition.id,\n parent: args.parent,\n executionOptions: args.executionOptions,\n batchId: args.next.batchId,\n inputsByPort: args.next.inputsByPort,\n ctx,\n };\n }\n return {\n kind: \"single\",\n runId: args.runId,\n activationId,\n workflowId: args.workflowId,\n nodeId: args.nodeDefinition.id,\n parent: args.parent,\n executionOptions: args.executionOptions,\n batchId: args.next.batchId,\n input: args.next.input,\n ctx,\n };\n }\n\n private createNodeExecutionContext(\n args: NodeActivationContextArgs,\n definition: NodeExecutionDefinition,\n activationId: string,\n ): NodeExecutionContext {\n return {\n ...args.base,\n data: args.data,\n nodeId: definition.id,\n activationId,\n config: definition.config,\n telemetry: args.base.telemetry.forNode({ nodeId: definition.id, activationId }),\n binary: args.base.binary.forNode({ nodeId: definition.id, activationId }),\n getCredential: this.credentialResolverFactory.create(args.workflowId, definition.id, definition.config),\n };\n }\n}\n","import type { RunId } from \"../types\";\n\n/**\n * Internal sentinel thrown by {@link NodeSuspensionHandler} after persisting a suspension\n * entry. `NodeExecutionRequestHandlerService` catches this specifically and returns cleanly —\n * no continuation call, preventing `resumeFromNodeResult` / `resumeFromNodeError` from\n * overwriting the `\"suspended\"` run status.\n *\n * The `Error` suffix satisfies the ESLint `no-manual-di-new` allowlist. This is NOT a\n * user-facing error — it is an engine-internal control-flow primitive and should NOT be\n * exported from the public barrel.\n */\nexport class RunSuspendedError extends Error {\n constructor(\n readonly runId: RunId,\n readonly taskId: string,\n ) {\n super(`RunSuspendedError: run ${runId} suspended on task ${taskId}`);\n this.name = \"RunSuspendedError\";\n }\n}\n","import { z } from \"zod\";\nimport { isPortsEmission, isUnbrandedPortsEmissionShape } from \"../contracts/emitPorts\";\nimport { CredentialUnboundError } from \"../contracts/credentialTypes\";\nimport { SuspensionRequest } from \"../contracts/runtimeTypes\";\n\nimport type {\n Item,\n MultiInputNode,\n NodeActivationRequest,\n NodeExecutionContext,\n NodeOutputs,\n PersistedRunState,\n RunnableNode,\n RunnableNodeConfig,\n RunnableNodeExecuteArgs,\n RunId,\n TriggerNode,\n WorkflowNodeInstanceFactory,\n} from \"../types\";\nimport { NodeIterationIdFactory } from \"../workflow/definition/NodeIterationIdFactory\";\n\nimport { FanInMergeByOriginMerger } from \"./FanInMergeByOriginMerger\";\nimport { ItemExprResolver } from \"./ItemExprResolver\";\nimport { InProcessRetryRunner } from \"./InProcessRetryRunner\";\nimport { NodeOutputNormalizer } from \"./NodeOutputNormalizer\";\nimport { NodeSuspensionHandler } from \"./NodeSuspensionHandler\";\nimport { RunSuspendedError } from \"./RunSuspendedError\";\nimport { RunnableOutputBehaviorResolver } from \"./RunnableOutputBehaviorResolver\";\n\nexport class NodeExecutor {\n private readonly fanInMerger = new FanInMergeByOriginMerger();\n private readonly outputNormalizer = new NodeOutputNormalizer();\n private readonly itemExprResolver: ItemExprResolver;\n private readonly outputBehaviorResolver: RunnableOutputBehaviorResolver;\n\n constructor(\n private readonly nodeInstanceFactory: WorkflowNodeInstanceFactory,\n private readonly retryRunner: InProcessRetryRunner,\n itemExprResolver?: ItemExprResolver,\n outputBehaviorResolver?: RunnableOutputBehaviorResolver,\n /** Required for HITL suspension support. When omitted, `SuspensionRequest` throws upward. */\n private readonly suspensionHandler?: NodeSuspensionHandler,\n /** Required alongside `suspensionHandler`. */\n private readonly loadRunState?: (runId: RunId) => Promise<PersistedRunState | undefined>,\n ) {\n this.itemExprResolver = itemExprResolver ?? new ItemExprResolver();\n this.outputBehaviorResolver = outputBehaviorResolver ?? new RunnableOutputBehaviorResolver();\n }\n\n async execute(request: NodeActivationRequest): Promise<NodeOutputs> {\n await this.assertRequiredCredentialsBound(request);\n const policy = request.ctx.config.retryPolicy;\n return await this.retryRunner.run(\n policy,\n async () => {\n const nodeInstance = this.nodeInstanceFactory.createByType(request.ctx.config.type);\n if (request.kind === \"multi\") {\n return await this.executeMultiInputActivation(request, nodeInstance);\n }\n return await this.executeSingleInputNode(request, nodeInstance);\n },\n (error) => !this.isCredentialError(error),\n );\n }\n\n private async assertRequiredCredentialsBound(request: NodeActivationRequest): Promise<void> {\n if (!request.ctx.getCredential) return;\n for (const req of request.ctx.config.getCredentialRequirements?.() ?? []) {\n if (req.optional) continue;\n await request.ctx.getCredential(req.slotKey);\n }\n }\n\n private isCredentialError(e: unknown): boolean {\n if (e instanceof CredentialUnboundError) return true;\n const cause = e instanceof Error ? (e as { cause?: unknown }).cause : undefined;\n return cause instanceof CredentialUnboundError;\n }\n\n private async executeMultiInputActivation(\n request: Extract<NodeActivationRequest, { kind: \"multi\" }>,\n node: unknown,\n ): Promise<NodeOutputs> {\n const multiInputNode = node as MultiInputNode;\n if (typeof (multiInputNode as { executeMulti?: unknown }).executeMulti === \"function\") {\n const raw = await multiInputNode.executeMulti(request.inputsByPort, request.ctx as never);\n this.assertNoPortEnvelopeBypass(request.nodeId, raw, \"executeMulti()\");\n return raw;\n }\n if (this.isRunnableNode(node)) {\n const merged = this.fanInMerger.merge(request.inputsByPort);\n const single: Extract<NodeActivationRequest, { kind: \"single\" }> = {\n ...request,\n kind: \"single\",\n input: merged,\n };\n return await this.executeRunnableActivation(single, node);\n }\n throw new Error(\n `Node ${request.nodeId} does not support executeMulti or RunnableNode.execute but received multi-input activation`,\n );\n }\n\n private async executeSingleInputNode(\n request: Extract<NodeActivationRequest, { kind: \"single\" }>,\n node: unknown,\n ): Promise<NodeOutputs> {\n if (this.isTriggerNode(node)) {\n const raw = await (node as TriggerNode).execute(request.input, request.ctx as never);\n this.assertNoPortEnvelopeBypass(request.nodeId, raw, \"trigger execute()\");\n return raw;\n }\n if (this.isRunnableNode(node)) {\n return await this.executeRunnableActivation(request, node);\n }\n if (this.hasExecuteMulti(node)) {\n return await this.executeMultiInputActivation(this.asMultiFromSingleActivation(request), node);\n }\n throw new Error(`Node ${request.nodeId} does not support trigger or RunnableNode execution`);\n }\n\n private isTriggerNode(node: unknown): node is TriggerNode {\n return typeof node === \"object\" && node !== null && (node as { kind?: string }).kind === \"trigger\";\n }\n\n private isRunnableNode(node: unknown): node is RunnableNode {\n return (\n typeof node === \"object\" &&\n node !== null &&\n (node as { kind?: string }).kind === \"node\" &&\n typeof (node as { execute?: unknown }).execute === \"function\"\n );\n }\n\n private hasExecuteMulti(node: unknown): boolean {\n return typeof (node as { executeMulti?: unknown })?.executeMulti === \"function\";\n }\n\n private asMultiFromSingleActivation(\n request: Extract<NodeActivationRequest, { kind: \"single\" }>,\n ): Extract<NodeActivationRequest, { kind: \"multi\" }> {\n return {\n kind: \"multi\",\n runId: request.runId,\n activationId: request.activationId,\n workflowId: request.workflowId,\n nodeId: request.nodeId,\n parent: request.parent,\n executionOptions: request.executionOptions,\n batchId: request.batchId,\n ctx: request.ctx,\n inputsByPort: { in: request.input ?? [] },\n };\n }\n\n private async executeRunnableActivation(\n request: Extract<NodeActivationRequest, { kind: \"single\" }>,\n node: RunnableNode,\n ): Promise<NodeOutputs> {\n const runnableConfig = request.ctx.config as RunnableNodeConfig;\n const behavior = this.outputBehaviorResolver.resolve(runnableConfig);\n const inputSchema = this.resolveInputSchema(node, runnableConfig);\n const inputBatch = request.input ?? [];\n if (inputBatch.length === 0 && runnableConfig.emptyBatchExecution === \"runOnce\") {\n const syntheticItem: Item = { json: {} };\n const parsed = inputSchema.parse(syntheticItem.json);\n const runnableCtx = request.ctx as NodeExecutionContext<RunnableNodeConfig>;\n const resolvedCtx = await this.itemExprResolver.resolveConfigForItem(runnableCtx, syntheticItem, 0, inputBatch);\n const ctx = this.pickExecutionContext(runnableCtx, resolvedCtx);\n const args: RunnableNodeExecuteArgs = {\n input: parsed,\n item: syntheticItem,\n itemIndex: 0,\n items: inputBatch,\n ctx,\n };\n const raw = await Promise.resolve(node.execute(args));\n return this.outputNormalizer.normalizeExecuteResult({\n baseItem: syntheticItem,\n raw,\n behavior,\n }) as NodeOutputs;\n }\n const byPort: Partial<Record<string, Item[]>> = {};\n let hasSuspension = false;\n for (let i = 0; i < inputBatch.length; i++) {\n const item = inputBatch[i] as Item;\n this.assertItemJsonNotTopLevelArray(request.nodeId, item);\n const parsed = inputSchema.parse(item.json);\n const runnableCtx = request.ctx as NodeExecutionContext<RunnableNodeConfig>;\n const resolvedCtx = await this.itemExprResolver.resolveConfigForItem(runnableCtx, item, i, inputBatch);\n const baseCtx = this.pickExecutionContext(runnableCtx, resolvedCtx);\n // Mint a per-item iteration id and stamp it (with the item index) onto the ctx so connection\n // invocations and telemetry written from inside `node.execute` carry the per-item identity.\n const iterationCtx = {\n ...baseCtx,\n iterationId: NodeIterationIdFactory.create(),\n itemIndex: i,\n } as NodeExecutionContext<RunnableNodeConfig>;\n const args: RunnableNodeExecuteArgs = {\n input: parsed,\n item,\n itemIndex: i,\n items: inputBatch,\n ctx: iterationCtx,\n };\n let raw: unknown;\n try {\n raw = await Promise.resolve(node.execute(args));\n } catch (e) {\n // Use both instanceof AND name check: under tsx/dev with mixed source/dist resolution,\n // SuspensionRequest may load as two distinct class objects and instanceof fails. The\n // name brand survives the duality because both copies set name=\"SuspensionRequest\".\n const isSuspension =\n e instanceof SuspensionRequest ||\n (e instanceof Error &&\n e.name === \"SuspensionRequest\" &&\n typeof (e as { request?: unknown }).request === \"object\");\n if (isSuspension) {\n if (!this.suspensionHandler || !this.loadRunState) {\n // Suspension not supported in this executor configuration — propagate as a regular error.\n throw new Error(\n `Node ${request.nodeId} threw SuspensionRequest but this NodeExecutor has no suspensionHandler configured.`,\n { cause: e },\n );\n }\n // Per-item suspension: load current state, persist the suspension entry, and\n // continue processing remaining items. If deliver throws it propagates upward.\n const state = await this.loadRunState(request.runId);\n if (!state) {\n throw new Error(`NodeExecutor: run state not found for runId ${request.runId} during suspension`, {\n cause: e,\n });\n }\n // handleSuspension throws RunSuspendedError after persisting — we re-throw it\n // to exit the loop immediately. Partial byPort outputs are intentionally dropped\n // (TODO: consider stashing outputs of non-suspended items alongside the suspension).\n await this.suspensionHandler.handle({\n runId: request.runId,\n nodeId: request.nodeId,\n activationId: request.activationId,\n itemIndex: i,\n suspensionRequest: e as SuspensionRequest,\n state,\n telemetry: iterationCtx.telemetry,\n });\n hasSuspension = true; // unreachable — handler always throws, but satisfies TS control-flow\n continue;\n }\n throw e;\n }\n const normalized = this.outputNormalizer.normalizeExecuteResult({\n baseItem: item,\n raw,\n behavior,\n });\n for (const [port, batch] of Object.entries(normalized)) {\n if (!batch || batch.length === 0) {\n continue;\n }\n const list = byPort[port] ?? [];\n list.push(...batch);\n byPort[port] = list;\n }\n }\n if (hasSuspension) {\n // Unreachable in practice (suspensionHandler always throws RunSuspendedError) but\n // guards against future refactors that might change handler behaviour.\n throw new RunSuspendedError(request.runId, \"unknown\");\n }\n return byPort as NodeOutputs;\n }\n\n /** Use resolver ctx only when {@link NodeExecutionContext.config} is non-nullish. */\n private pickExecutionContext<TConfig extends RunnableNodeConfig<any, any>>(\n runnableCtx: NodeExecutionContext<TConfig>,\n resolvedCtx: NodeExecutionContext<TConfig> | null | undefined,\n ): NodeExecutionContext<TConfig> {\n if (resolvedCtx != null && resolvedCtx.config != null) {\n return resolvedCtx;\n }\n return runnableCtx;\n }\n\n private resolveInputSchema(\n nodeInstance: RunnableNode,\n config: RunnableNodeConfig,\n ): {\n parse: (data: unknown) => unknown;\n } {\n const fromInstance = nodeInstance.inputSchema;\n if (fromInstance && typeof fromInstance.parse === \"function\") {\n return fromInstance as { parse: (data: unknown) => unknown };\n }\n const fromConfig = config.inputSchema;\n if (fromConfig && typeof fromConfig.parse === \"function\") {\n return fromConfig as { parse: (data: unknown) => unknown };\n }\n return z.unknown();\n }\n\n private assertItemJsonNotTopLevelArray(nodeId: string, item: Item): void {\n if (Array.isArray(item.json)) {\n throw new Error(`Node ${nodeId}: item.json must not be a top-level JSON array`);\n }\n }\n\n private assertNoPortEnvelopeBypass(nodeId: string, value: unknown, methodName: string): void {\n if (isPortsEmission(value)) {\n throw new Error(`Node ${nodeId}: ${methodName} must return NodeOutputs, not emitPorts(...).`);\n }\n if (isUnbrandedPortsEmissionShape(value)) {\n throw new Error(\n `Node ${nodeId}: ${methodName} returned an unbranded \\`{ ports: ... }\\` object. Return NodeOutputs instead.`,\n );\n }\n }\n}\n","import type { PersistedRunState, RunId, WorkflowNodeInstanceFactory } from \"../types\";\n\nimport { InProcessRetryRunner } from \"./InProcessRetryRunner\";\nimport { NodeExecutor } from \"./NodeExecutor\";\nimport { NodeSuspensionHandler } from \"./NodeSuspensionHandler\";\nimport { RunnableOutputBehaviorResolver } from \"./RunnableOutputBehaviorResolver\";\n\nexport class NodeExecutorFactory {\n create(\n workflowNodeInstanceFactory: WorkflowNodeInstanceFactory,\n retryRunner: InProcessRetryRunner,\n outputBehaviorResolver: RunnableOutputBehaviorResolver,\n suspensionHandler?: NodeSuspensionHandler,\n loadRunState?: (runId: RunId) => Promise<PersistedRunState | undefined>,\n ): NodeExecutor {\n return new NodeExecutor(\n workflowNodeInstanceFactory,\n retryRunner,\n undefined,\n outputBehaviorResolver,\n suspensionHandler,\n loadRunState,\n );\n }\n}\n","export class MissingRuntimeExecutionMarker {\n isMarked(config: unknown): boolean {\n return Boolean((config as Partial<{ missingRuntime: boolean }> | undefined)?.missingRuntime);\n }\n}\n","export class MissingRuntimeNodeToken {}\n","import type { RunnableNodeConfig } from \"../types\";\n\nimport { MissingRuntimeNodeToken } from \"./MissingRuntimeNodeToken\";\n\nexport class MissingRuntimeNodeConfig implements RunnableNodeConfig<unknown, unknown> {\n readonly kind = \"node\" as const;\n readonly type = MissingRuntimeNodeToken;\n\n constructor(\n public readonly name: string,\n public readonly missingTokenId?: string,\n public readonly missingRuntime = true,\n ) {}\n}\n","export class MissingRuntimeTriggerToken {}\n","import type { NodeConfigBase } from \"../types\";\n\nimport { MissingRuntimeTriggerToken } from \"./MissingRuntimeTriggerToken\";\n\nexport class MissingRuntimeTriggerConfig implements NodeConfigBase {\n readonly kind = \"trigger\" as const;\n readonly type = MissingRuntimeTriggerToken;\n\n constructor(\n public readonly name: string,\n public readonly missingTokenId?: string,\n public readonly missingRuntime = true,\n ) {}\n}\n","import type { NodeDefinition, PersistedWorkflowSnapshotNode } from \"../types\";\n\nimport { MissingRuntimeNodeConfig } from \"./MissingRuntimeNodeConfig\";\nimport { MissingRuntimeNodeToken } from \"./MissingRuntimeNodeToken\";\nimport { MissingRuntimeTriggerConfig } from \"./MissingRuntimeTriggerConfig\";\nimport { MissingRuntimeTriggerToken } from \"./MissingRuntimeTriggerToken\";\n\nexport class MissingRuntimeFallbacks {\n createDefinition(snapshotNode: PersistedWorkflowSnapshotNode): NodeDefinition {\n if (snapshotNode.kind === \"trigger\") {\n return {\n id: snapshotNode.id,\n kind: \"trigger\",\n name: snapshotNode.name,\n type: MissingRuntimeTriggerToken,\n config: new MissingRuntimeTriggerConfig(snapshotNode.name ?? snapshotNode.id, snapshotNode.nodeTokenId),\n };\n }\n return {\n id: snapshotNode.id,\n kind: \"node\",\n name: snapshotNode.name,\n type: MissingRuntimeNodeToken,\n config: new MissingRuntimeNodeConfig(snapshotNode.name ?? snapshotNode.id, snapshotNode.nodeTokenId),\n };\n }\n}\n","import type { RunnableNode, RunnableNodeExecuteArgs } from \"../types\";\n\nimport { MissingRuntimeNodeConfig } from \"./MissingRuntimeNodeConfig\";\n\nexport class MissingRuntimeNode implements RunnableNode<MissingRuntimeNodeConfig> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n execute(args: RunnableNodeExecuteArgs<MissingRuntimeNodeConfig>): unknown {\n return args.item;\n }\n}\n","import type { ExecutableTriggerNode, Items, NodeOutputs, TriggerSetupContext } from \"../types\";\n\nimport { MissingRuntimeTriggerConfig } from \"./MissingRuntimeTriggerConfig\";\n\nexport class MissingRuntimeTrigger implements ExecutableTriggerNode<MissingRuntimeTriggerConfig> {\n readonly kind = \"trigger\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async setup(_ctx: TriggerSetupContext<MissingRuntimeTriggerConfig>): Promise<undefined> {\n return undefined;\n }\n\n async execute(items: Items): Promise<NodeOutputs> {\n return { main: items };\n }\n}\n","import type { TypeToken } from \"../di\";\n\nimport { getPersistedRuntimeTypeMetadata } from \"../runtime-types/runtimeTypeDecorators.types\";\n\nimport type { PersistedTokenId } from \"../types\";\n\nexport class PersistedRuntimeTypeIdFactory {\n static fromMetadata(args: Readonly<{ type: TypeToken<unknown> }>): PersistedTokenId | undefined {\n const metadata = getPersistedRuntimeTypeMetadata(args.type);\n if (!metadata) {\n return undefined;\n }\n const packageName = metadata.packageName;\n if (!packageName) {\n return undefined;\n }\n return `${packageName}::${metadata.persistedName}` as PersistedTokenId;\n }\n}\n","import type { TypeToken } from \"../di\";\n\nimport type { PersistedTokenId, WorkflowDefinition } from \"../types\";\n\nimport { PersistedRuntimeTypeIdFactory } from \"./PersistedRuntimeTypeIdFactory\";\n\nexport class PersistedWorkflowTokenRegistry {\n private readonly tokensById = new Map<PersistedTokenId, TypeToken<unknown>>();\n private readonly tokenIdsByToken = new Map<TypeToken<unknown>, PersistedTokenId>();\n\n /**\n * Register a token with its package ID. Token ID is inferred as `packageId::tokenName`.\n */\n register(type: TypeToken<unknown>, packageId: string, persistedNameOverride?: string): PersistedTokenId {\n const tokenName = persistedNameOverride ?? this.displayNameForTypeToken(type);\n const tokenId = `${packageId}::${tokenName}` as PersistedTokenId;\n this.tokensById.set(tokenId, type);\n this.tokenIdsByToken.set(type, tokenId);\n return tokenId;\n }\n\n /**\n * Register all decorated runtime types discovered in workflows.\n */\n registerFromWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): void {\n for (const workflow of workflows) {\n for (const node of workflow.nodes) {\n this.registerDecoratedType(node.type);\n this.registerDecoratedType(node.config.type);\n this.registerNestedTypes(node.config);\n }\n }\n }\n\n private registerDecoratedType(type: TypeToken<unknown>): void {\n if (this.tokenIdsByToken.has(type)) {\n return;\n }\n const tokenId = PersistedRuntimeTypeIdFactory.fromMetadata({ type });\n if (!tokenId) {\n return;\n }\n this.tokensById.set(tokenId, type);\n this.tokenIdsByToken.set(type, tokenId);\n }\n\n private registerNestedTypes(value: unknown): void {\n if (Array.isArray(value)) {\n for (const entry of value) this.registerNestedTypes(entry);\n return;\n }\n if (!value || typeof value !== \"object\") return;\n const record = value as Record<string, unknown>;\n const type = this.asTypeToken(record.type);\n if (type) this.registerDecoratedType(type);\n for (const v of Object.values(record)) this.registerNestedTypes(v);\n }\n\n private displayNameForTypeToken(token: TypeToken<unknown>): string {\n if (typeof token === \"function\" && token.name) return token.name;\n if (typeof token === \"string\") return token;\n return \"\";\n }\n\n private asTypeToken(value: unknown): TypeToken<unknown> | undefined {\n if (typeof value === \"function\" || typeof value === \"string\" || typeof value === \"symbol\") {\n return value as TypeToken<unknown>;\n }\n return undefined;\n }\n\n getTokenId(token: TypeToken<unknown>): PersistedTokenId | undefined {\n const existing = this.tokenIdsByToken.get(token);\n if (existing) {\n return existing;\n }\n const tokenId = PersistedRuntimeTypeIdFactory.fromMetadata({ type: token });\n if (!tokenId) {\n return undefined;\n }\n this.tokensById.set(tokenId, token);\n this.tokenIdsByToken.set(token, tokenId);\n return tokenId;\n }\n\n resolve(tokenId: PersistedTokenId): TypeToken<unknown> | undefined {\n return this.tokensById.get(tokenId);\n }\n}\n","import type { TypeToken } from \"../di\";\nimport type {\n NodeConfigBase,\n PersistedTokenId,\n PersistedWorkflowSnapshot,\n PersistedWorkflowSnapshotNode,\n PersistedWorkflowTokenRegistryLike,\n WorkflowDefinition,\n} from \"../types\";\n\nexport class WorkflowSnapshotCodec {\n constructor(private readonly tokenRegistry: PersistedWorkflowTokenRegistryLike) {}\n\n create(workflow: WorkflowDefinition): PersistedWorkflowSnapshot {\n return {\n id: workflow.id,\n name: workflow.name,\n workflowErrorHandlerConfigured: workflow.workflowErrorHandler !== undefined,\n ...(workflow.connections !== undefined && workflow.connections.length > 0\n ? { connections: workflow.connections }\n : {}),\n nodes: workflow.nodes.map((node) => {\n const inspectorSummaryRows = this.safeInspectorSummary(node.config);\n return {\n id: node.id,\n kind: node.kind,\n name: node.name,\n nodeTokenId: this.resolveTokenId(node.type),\n configTokenId: this.resolveTokenId(node.config.type),\n tokenName: this.resolveTokenName(node.type),\n configTokenName: this.resolveTokenName(node.config.type),\n config: this.serializeConfig(node.config),\n ...(inspectorSummaryRows !== undefined ? { inspectorSummary: inspectorSummaryRows } : {}),\n };\n }),\n edges: workflow.edges.map((edge) => ({\n from: { nodeId: edge.from.nodeId, output: edge.from.output },\n to: { nodeId: edge.to.nodeId, input: edge.to.input },\n })),\n };\n }\n\n hydrate(snapshotNode: PersistedWorkflowSnapshotNode, liveConfig: NodeConfigBase): NodeConfigBase {\n const hydrated = this.mergeValue(liveConfig, snapshotNode.config);\n const configToken = this.tokenRegistry.resolve(snapshotNode.configTokenId);\n Object.assign(hydrated, {\n type: configToken ?? liveConfig.type,\n kind: snapshotNode.kind,\n });\n if (snapshotNode.name && !(\"name\" in hydrated && hydrated.name)) {\n Object.assign(hydrated, { name: snapshotNode.name });\n }\n return hydrated as unknown as NodeConfigBase;\n }\n\n private serializeConfig(config: NodeConfigBase): unknown {\n try {\n const cloned = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n this.injectTokenIds(cloned, config as unknown as Record<string, unknown>);\n return cloned;\n } catch {\n const fallback: Record<string, unknown> = {\n kind: config.kind,\n name: config.name,\n id: config.id,\n icon: config.icon,\n execution: config.execution,\n };\n this.injectTokenIds(fallback, config as unknown as Record<string, unknown>);\n return fallback;\n }\n }\n\n /**\n * Safely call `config.inspectorSummary()` and return a plain JSON-safe array, or undefined.\n * Returns undefined if the method is absent, throws, or produces no valid rows.\n */\n private safeInspectorSummary(\n config: NodeConfigBase,\n ): ReadonlyArray<Readonly<{ label: string; value: string }>> | undefined {\n const fn = (config as { inspectorSummary?: () => unknown }).inspectorSummary;\n if (typeof fn !== \"function\") return undefined;\n let raw: unknown;\n try {\n raw = fn.call(config);\n } catch {\n return undefined;\n }\n if (!Array.isArray(raw)) return undefined;\n const rows: Array<Readonly<{ label: string; value: string }>> = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== \"object\") continue;\n const { label, value } = entry as { label?: unknown; value?: unknown };\n if (typeof label !== \"string\" || typeof value !== \"string\") continue;\n const trimmedLabel = label.trim();\n if (trimmedLabel.length === 0) continue;\n rows.push({ label: trimmedLabel, value });\n }\n return rows.length > 0 ? rows : undefined;\n }\n\n private injectTokenIds(target: Record<string, unknown>, source: Record<string, unknown>): void {\n const type = this.asTypeToken(source.type);\n if (type) {\n target.tokenId = this.tokenRegistry.getTokenId(type) ?? this.resolveTokenName(type) ?? \"unknown\";\n }\n for (const [key, value] of Object.entries(source)) {\n if (key === \"type\" || value == null) {\n continue;\n }\n if (Array.isArray(value)) {\n const targetArray = target[key];\n if (Array.isArray(targetArray)) {\n value.forEach((item, index) => {\n if (item && typeof item === \"object\" && targetArray[index] && typeof targetArray[index] === \"object\") {\n this.injectTokenIds(targetArray[index] as Record<string, unknown>, item as Record<string, unknown>);\n }\n });\n }\n continue;\n }\n if (typeof value === \"object\") {\n const targetValue = target[key];\n if (targetValue && typeof targetValue === \"object\") {\n this.injectTokenIds(targetValue as Record<string, unknown>, value as Record<string, unknown>);\n }\n }\n }\n }\n\n private mergeValue(liveValue: unknown, snapshotValue: unknown): Record<PropertyKey, unknown> {\n const liveRecord = this.asRecord(liveValue);\n const snapshotRecord = this.asRecord(snapshotValue);\n const hydrated = Object.create(\n liveValue && typeof liveValue === \"object\"\n ? (Object.getPrototypeOf(liveValue) ?? Object.prototype)\n : Object.prototype,\n ) as Record<PropertyKey, unknown>;\n\n for (const [key, value] of Object.entries(snapshotRecord)) {\n hydrated[key] = this.mergeNestedValue(liveRecord[key], value);\n }\n\n this.restoreNonSerializableProperties(liveRecord, hydrated);\n this.restoreTypeProperty(hydrated);\n return hydrated;\n }\n\n private mergeNestedValue(liveValue: unknown, snapshotValue: unknown): unknown {\n if (Array.isArray(snapshotValue)) {\n const liveArray = Array.isArray(liveValue) ? liveValue : [];\n return snapshotValue.map((entry, index) => this.mergeNestedValue(liveArray[index], entry));\n }\n if (snapshotValue && typeof snapshotValue === \"object\") {\n return this.mergeValue(liveValue, snapshotValue);\n }\n return snapshotValue;\n }\n\n private restoreNonSerializableProperties(\n liveRecord: Record<PropertyKey, unknown>,\n hydrated: Record<PropertyKey, unknown>,\n ): void {\n for (const [key, value] of Object.entries(liveRecord)) {\n if (typeof value === \"function\" || typeof value === \"symbol\") {\n hydrated[key] = value;\n }\n }\n // Preserve symbol-keyed brands (e.g. itemExpr / emitPorts) and other runtime-only keys.\n for (const sym of Object.getOwnPropertySymbols(liveRecord)) {\n hydrated[sym] = liveRecord[sym];\n }\n }\n\n private restoreTypeProperty(record: Record<PropertyKey, unknown>): void {\n const tokenId = typeof record.tokenId === \"string\" ? record.tokenId : undefined;\n if (!tokenId) {\n return;\n }\n const type = this.tokenRegistry.resolve(tokenId as PersistedTokenId);\n if (type) {\n record.type = type;\n }\n }\n\n private resolveTokenId(token: TypeToken<unknown>): PersistedTokenId {\n return (this.tokenRegistry.getTokenId(token) ?? this.resolveTokenName(token) ?? \"unknown\") as PersistedTokenId;\n }\n\n private resolveTokenName(token: TypeToken<unknown>): string | undefined {\n if (typeof token === \"function\" && token.name) {\n return token.name;\n }\n if (typeof token === \"string\") {\n return token;\n }\n return undefined;\n }\n\n private asTypeToken(value: unknown): TypeToken<unknown> | undefined {\n if (typeof value === \"function\" || typeof value === \"string\" || typeof value === \"symbol\") {\n return value as TypeToken<unknown>;\n }\n return undefined;\n }\n\n private asRecord(value: unknown): Record<PropertyKey, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n const record = value as Record<PropertyKey, unknown>;\n const out: Record<PropertyKey, unknown> = { ...(record as Record<string, unknown>) };\n for (const sym of Object.getOwnPropertySymbols(value)) {\n out[sym] = record[sym];\n }\n return out;\n }\n}\n","import type { TypeToken } from \"../di\";\nimport type {\n NodeDefinition,\n PersistedWorkflowSnapshot,\n PersistedWorkflowTokenRegistryLike,\n WorkflowDefinition,\n WorkflowId,\n WorkflowRepository,\n} from \"../types\";\n\nimport { MissingRuntimeFallbacks } from \"./MissingRuntimeFallbacksFactory\";\nimport { WorkflowSnapshotCodec } from \"./WorkflowSnapshotCodec\";\n\nexport class WorkflowSnapshotResolver {\n constructor(\n private readonly workflowRepository: WorkflowRepository,\n private readonly tokenRegistry: PersistedWorkflowTokenRegistryLike,\n private readonly codec: WorkflowSnapshotCodec,\n private readonly missingRuntimeFallbacks: MissingRuntimeFallbacks,\n ) {}\n\n resolve(args: {\n workflowId: WorkflowId;\n workflowSnapshot?: PersistedWorkflowSnapshot;\n }): WorkflowDefinition | undefined {\n const liveWorkflow = this.workflowRepository.get(args.workflowId);\n if (!args.workflowSnapshot) {\n return liveWorkflow;\n }\n if (!liveWorkflow) {\n return this.rebuildWorkflow(args.workflowSnapshot, undefined);\n }\n return this.rebuildWorkflow(args.workflowSnapshot, liveWorkflow);\n }\n\n private rebuildWorkflow(\n snapshot: PersistedWorkflowSnapshot,\n liveWorkflow: WorkflowDefinition | undefined,\n ): WorkflowDefinition {\n const liveNodesById = new Map((liveWorkflow?.nodes ?? []).map((node) => [node.id, node] as const));\n const nodes = snapshot.nodes.map((snapshotNode) => {\n const liveNode = liveNodesById.get(snapshotNode.id);\n if (!this.isCompatibleLiveNode(liveNode, snapshotNode)) {\n return this.missingRuntimeFallbacks.createDefinition(snapshotNode);\n }\n return {\n id: snapshotNode.id,\n kind: snapshotNode.kind,\n name: snapshotNode.name ?? liveNode.name,\n type: liveNode.type,\n config: this.codec.hydrate(snapshotNode, liveNode.config),\n } satisfies NodeDefinition;\n });\n const nodeIds = new Set(nodes.map((node) => node.id));\n const connectionsFromSnapshot =\n snapshot.connections\n ?.map((connection) => ({\n ...connection,\n childNodeIds: connection.childNodeIds.filter((childId) => nodeIds.has(childId)),\n }))\n .filter((connection) => connection.childNodeIds.length > 0) ?? [];\n return {\n id: snapshot.id,\n name: snapshot.name,\n nodes,\n edges: snapshot.edges.filter((edge) => nodeIds.has(edge.from.nodeId) && nodeIds.has(edge.to.nodeId)),\n ...(connectionsFromSnapshot.length > 0 ? { connections: connectionsFromSnapshot } : {}),\n ...(liveWorkflow?.discoveryPathSegments !== undefined\n ? { discoveryPathSegments: liveWorkflow.discoveryPathSegments }\n : {}),\n };\n }\n\n private isCompatibleLiveNode(\n liveNode: WorkflowDefinition[\"nodes\"][number] | undefined,\n snapshotNode: PersistedWorkflowSnapshot[\"nodes\"][number],\n ): liveNode is WorkflowDefinition[\"nodes\"][number] {\n if (!liveNode || liveNode.kind !== snapshotNode.kind) {\n return false;\n }\n if (!snapshotNode.nodeTokenId || !snapshotNode.configTokenId) {\n throw new Error(`Persisted workflow snapshot node \"${snapshotNode.id}\" is missing stable token ids.`);\n }\n const liveNodeTokenId = this.resolveLiveTokenId(liveNode.type);\n const liveConfigTokenId = this.resolveLiveTokenId(liveNode.config.type);\n return liveNodeTokenId === snapshotNode.nodeTokenId && liveConfigTokenId === snapshotNode.configTokenId;\n }\n\n private resolveLiveTokenId(type: TypeToken<unknown>): string | undefined {\n const registeredTokenId = this.tokenRegistry.getTokenId(type);\n if (registeredTokenId) {\n return registeredTokenId;\n }\n if (typeof type === \"function\" && type.name) {\n return type.name;\n }\n if (typeof type === \"string\") {\n return type;\n }\n return undefined;\n }\n}\n","import type { TypeToken } from \"../di\";\nimport type { NodeId, NodeResolver, WorkflowDefinition, WorkflowNodeInstanceFactory } from \"../types\";\n\nimport { MissingRuntimeNode, MissingRuntimeTrigger } from \"../workflowSnapshots\";\nimport { MissingRuntimeNodeToken } from \"../workflowSnapshots/MissingRuntimeNodeToken\";\nimport { MissingRuntimeTriggerToken } from \"../workflowSnapshots/MissingRuntimeTriggerToken\";\nimport { NodeInstantiationError } from \"./NodeInstantiationError\";\n\nexport class NodeInstanceFactory implements WorkflowNodeInstanceFactory {\n constructor(private readonly nodeResolver: NodeResolver) {}\n\n createNodes(workflow: WorkflowDefinition): Map<NodeId, unknown> {\n const nodeInstances = new Map<NodeId, unknown>();\n for (const definition of workflow.nodes) {\n try {\n nodeInstances.set(definition.id, this.createNode(definition));\n } catch (err) {\n if (err instanceof NodeInstantiationError) {\n throw err;\n }\n throw new NodeInstantiationError(\n definition.id,\n typeof definition.type === \"function\" ? definition.type.name : String(definition.type),\n err instanceof Error ? err : new Error(String(err)),\n );\n }\n }\n return nodeInstances;\n }\n\n createNode(definition: WorkflowDefinition[\"nodes\"][number]): unknown {\n return this.createByType(definition.type);\n }\n\n createByType(type: TypeToken<unknown>): unknown {\n if (type === MissingRuntimeNodeToken) {\n return new MissingRuntimeNode();\n }\n if (type === MissingRuntimeTriggerToken) {\n return new MissingRuntimeTrigger();\n }\n return this.nodeResolver.resolve(type);\n }\n}\n","import type { NodeResolver } from \"../types\";\n\nimport { NodeInstanceFactory } from \"./NodeInstanceFactory\";\n\nexport class NodeInstanceFactoryFactory {\n create(nodeResolver: NodeResolver): NodeInstanceFactory {\n return new NodeInstanceFactory(nodeResolver);\n }\n}\n","import type {\n ConnectionInvocationAppendArgs,\n ConnectionInvocationRecord,\n NodeActivationId,\n NodeExecutionSnapshot,\n NodeExecutionStatePublisher,\n NodeId,\n NodeInputsByPort,\n NodeOutputs,\n ParentExecutionRef,\n RunId,\n WorkflowExecutionRepository,\n WorkflowId,\n} from \"../types\";\n\nimport { NodeInputsByPortFactory } from \"./NodeInputsByPortFactory\";\nimport { NodeExecutionSnapshotFactory } from \"./NodeExecutionSnapshotFactory\";\n\nexport class NodeRunStateWriter implements NodeExecutionStatePublisher {\n private chain: Promise<void> = Promise.resolve();\n\n constructor(\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n private readonly runId: RunId,\n private readonly workflowId: WorkflowId,\n private readonly parent: ParentExecutionRef | undefined,\n private readonly publishNodeEvent: (\n kind: \"nodeQueued\" | \"nodeStarted\" | \"nodeCompleted\" | \"nodeFailed\",\n snapshot: NodeExecutionSnapshot,\n ) => Promise<void>,\n private readonly publishConnectionInvocationEvent?: (record: ConnectionInvocationRecord) => Promise<void>,\n ) {}\n\n markQueued(args: {\n nodeId: NodeId;\n activationId?: NodeActivationId;\n inputsByPort?: NodeInputsByPort;\n }): Promise<void> {\n return this.enqueue(async () => {\n const state = await this.loadState();\n const previous = state.nodeSnapshotsByNodeId?.[args.nodeId];\n const queuedAt = new Date().toISOString();\n const snapshot = NodeExecutionSnapshotFactory.queued({\n runId: this.runId,\n workflowId: this.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId ?? previous?.activationId ?? `synthetic_${args.nodeId}`,\n parent: this.parent,\n queuedAt,\n inputsByPort: args.inputsByPort ?? previous?.inputsByPort ?? NodeInputsByPortFactory.empty(),\n });\n await this.saveSnapshot(state, snapshot);\n await this.publishNodeEvent(\"nodeQueued\", snapshot);\n });\n }\n\n markRunning(args: {\n nodeId: NodeId;\n activationId?: NodeActivationId;\n inputsByPort?: NodeInputsByPort;\n }): Promise<void> {\n return this.enqueue(async () => {\n const state = await this.loadState();\n const previous = state.nodeSnapshotsByNodeId?.[args.nodeId];\n const startedAt = new Date().toISOString();\n const snapshot = NodeExecutionSnapshotFactory.running({\n previous,\n runId: this.runId,\n workflowId: this.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId ?? previous?.activationId ?? `synthetic_${args.nodeId}`,\n parent: this.parent,\n startedAt,\n inputsByPort: args.inputsByPort ?? previous?.inputsByPort ?? NodeInputsByPortFactory.empty(),\n });\n await this.saveSnapshot(state, snapshot);\n await this.publishNodeEvent(\"nodeStarted\", snapshot);\n });\n }\n\n markCompleted(args: {\n nodeId: NodeId;\n activationId?: NodeActivationId;\n inputsByPort?: NodeInputsByPort;\n outputs?: NodeOutputs;\n }): Promise<void> {\n return this.enqueue(async () => {\n const state = await this.loadState();\n const previous = state.nodeSnapshotsByNodeId?.[args.nodeId];\n const finishedAt = new Date().toISOString();\n const snapshot = NodeExecutionSnapshotFactory.completed({\n previous,\n runId: this.runId,\n workflowId: this.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId ?? previous?.activationId ?? `synthetic_${args.nodeId}`,\n parent: this.parent,\n finishedAt,\n inputsByPort: args.inputsByPort ?? previous?.inputsByPort ?? NodeInputsByPortFactory.empty(),\n outputs: args.outputs ?? previous?.outputs ?? {},\n });\n await this.saveSnapshot(state, snapshot);\n await this.publishNodeEvent(\"nodeCompleted\", snapshot);\n });\n }\n\n markFailed(args: {\n nodeId: NodeId;\n activationId?: NodeActivationId;\n inputsByPort?: NodeInputsByPort;\n error: Error;\n }): Promise<void> {\n return this.enqueue(async () => {\n const state = await this.loadState();\n const previous = state.nodeSnapshotsByNodeId?.[args.nodeId];\n const finishedAt = new Date().toISOString();\n const snapshot = NodeExecutionSnapshotFactory.failed({\n previous,\n runId: this.runId,\n workflowId: this.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId ?? previous?.activationId ?? `synthetic_${args.nodeId}`,\n parent: this.parent,\n finishedAt,\n inputsByPort: args.inputsByPort ?? previous?.inputsByPort ?? NodeInputsByPortFactory.empty(),\n error: args.error,\n });\n await this.saveSnapshot(state, snapshot);\n await this.publishNodeEvent(\"nodeFailed\", snapshot);\n });\n }\n\n setChildRunId(args: { nodeId: NodeId; childRunId: RunId }): Promise<void> {\n return this.enqueue(async () => {\n const state = await this.loadState();\n const previous = state.nodeSnapshotsByNodeId?.[args.nodeId];\n if (!previous) {\n return;\n }\n const updated: NodeExecutionSnapshot = { ...previous, childRunId: args.childRunId };\n await this.saveSnapshot(state, updated);\n });\n }\n\n appendConnectionInvocation(args: ConnectionInvocationAppendArgs): Promise<void> {\n return this.enqueue(async () => {\n const state = await this.loadState();\n const updatedAt = new Date().toISOString();\n const record: ConnectionInvocationRecord = {\n invocationId: args.invocationId,\n runId: this.runId,\n workflowId: this.workflowId,\n connectionNodeId: args.connectionNodeId,\n parentAgentNodeId: args.parentAgentNodeId,\n parentAgentActivationId: args.parentAgentActivationId,\n status: args.status,\n managedInput: args.managedInput,\n managedOutput: args.managedOutput,\n statusLabel: args.statusLabel,\n subjectName: args.subjectName,\n error: args.error,\n queuedAt: args.queuedAt,\n startedAt: args.startedAt,\n finishedAt: args.finishedAt,\n updatedAt,\n iterationId: args.iterationId,\n itemIndex: args.itemIndex,\n parentInvocationId: args.parentInvocationId,\n };\n await this.workflowExecutionRepository.save({\n ...state,\n connectionInvocations: [...(state.connectionInvocations ?? []), record],\n });\n if (this.publishConnectionInvocationEvent) {\n await this.publishConnectionInvocationEvent(record);\n }\n });\n }\n\n private enqueue(work: () => Promise<void>): Promise<void> {\n const next = this.chain.then(work);\n this.chain = next.catch(() => undefined);\n return next;\n }\n\n private async loadState(): Promise<NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>> {\n const state = await this.workflowExecutionRepository.load(this.runId);\n if (!state) {\n throw new Error(`Unknown runId: ${this.runId}`);\n }\n return state;\n }\n\n private async saveSnapshot(\n state: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>,\n snapshot: NodeExecutionSnapshot,\n ): Promise<void> {\n await this.workflowExecutionRepository.save({\n ...state,\n nodeSnapshotsByNodeId: {\n ...(state.nodeSnapshotsByNodeId ?? {}),\n [snapshot.nodeId]: snapshot,\n },\n });\n }\n}\n","import type {\n NodeExecutionStatePublisher,\n ParentExecutionRef,\n RunId,\n WorkflowExecutionRepository,\n WorkflowId,\n} from \"../types\";\n\nimport { ConnectionInvocationEventPublisher } from \"../events/ConnectionInvocationEventPublisher\";\nimport { NodeEventPublisher } from \"../events/NodeEventPublisher\";\nimport type { RunEventBus } from \"../events/runEvents\";\nimport { NodeRunStateWriter } from \"./NodeRunStateWriter\";\n\nexport class NodeRunStateWriterFactory {\n constructor(\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n private readonly nodeEventPublisher: NodeEventPublisher,\n private readonly eventBus?: RunEventBus,\n ) {}\n\n create(runId: RunId, workflowId: WorkflowId, parent: ParentExecutionRef | undefined): NodeExecutionStatePublisher {\n const connectionInvocationEventPublisher = new ConnectionInvocationEventPublisher(this.eventBus, parent);\n return new NodeRunStateWriter(\n this.workflowExecutionRepository,\n runId,\n workflowId,\n parent,\n async (kind, snapshot) => {\n await this.nodeEventPublisher.publish(kind, snapshot);\n },\n async (record) => {\n await connectionInvocationEventPublisher.publish(record);\n },\n );\n }\n}\n","import type { EngineRunCounters, PersistedRunState, RunHaltReason, RunQueueEntry } from \"../types\";\n\n/**\n * Merges common terminal-run fields onto a loaded {@link PersistedRunState} without repeating object literals.\n */\nexport class PersistedRunStateTerminalBuilder {\n mergeTerminal(args: {\n state: PersistedRunState;\n engineCounters: EngineRunCounters;\n status: \"completed\" | \"failed\" | \"halted\";\n /** Populated when `status === \"halted\"`. */\n reason?: RunHaltReason;\n queue: RunQueueEntry[];\n outputsByNode: PersistedRunState[\"outputsByNode\"];\n nodeSnapshotsByNodeId: NonNullable<PersistedRunState[\"nodeSnapshotsByNodeId\"]>;\n /** When set, persisted on the run root for listings and retention pruning. */\n finishedAtIso?: string;\n }): PersistedRunState {\n return {\n ...args.state,\n engineCounters: args.engineCounters,\n status: args.status,\n reason: args.reason,\n pending: undefined,\n queue: args.queue,\n outputsByNode: args.outputsByNode,\n nodeSnapshotsByNodeId: args.nodeSnapshotsByNodeId,\n finishedAt: args.finishedAtIso ?? args.state.finishedAt,\n };\n }\n}\n","import type {\n Items,\n NodeActivationId,\n NodeExecutionSnapshot,\n NodeExecutionStatus,\n NodeId,\n NodeInputsByPort,\n NodeOutputs,\n ParentExecutionRef,\n PersistedRunControlState,\n RunCurrentState,\n RunDataFactory,\n RunId,\n RunQueueEntry,\n WorkflowExecutionRepository,\n WorkflowDefinition,\n WorkflowId,\n} from \"../types\";\n\nimport { WorkflowExecutableNodeClassifierFactory } from \"../workflow/definition/WorkflowExecutableNodeClassifierFactory\";\nimport { RunQueuePlanner } from \"../planning/RunQueuePlanner\";\n\nimport { MissingRuntimeExecutionMarker } from \"../workflowSnapshots/MissingRuntimeExecutionMarker\";\nimport { NodeExecutionSnapshotFactory } from \"./NodeExecutionSnapshotFactory\";\nimport { NodeInputsByPortFactory } from \"./NodeInputsByPortFactory\";\n\nexport class RunStateSemantics {\n constructor(private readonly missingRuntimeExecutionMarker: MissingRuntimeExecutionMarker) {}\n\n isStopConditionSatisfied(stopCondition: PersistedRunControlState[\"stopCondition\"], nodeId: NodeId): boolean {\n if (!stopCondition || stopCondition.kind === \"workflowCompleted\") {\n return false;\n }\n return stopCondition.nodeId === nodeId;\n }\n\n resolveResultOutputs(\n workflow: WorkflowDefinition,\n stopCondition: PersistedRunControlState[\"stopCondition\"],\n outputsByNode: Record<NodeId, NodeOutputs>,\n ): Items {\n if (stopCondition?.kind === \"nodeCompleted\") {\n return outputsByNode[stopCondition.nodeId]?.main ?? [];\n }\n const lastNodeId =\n WorkflowExecutableNodeClassifierFactory.create(workflow).lastExecutableNodeIdInDefinitionOrder(workflow);\n return outputsByNode[lastNodeId]?.main ?? [];\n }\n\n applySkippedSnapshots(args: {\n runId: RunId;\n workflowId: WorkflowId;\n parent?: ParentExecutionRef;\n currentState: RunCurrentState;\n skippedNodeIds: ReadonlyArray<NodeId>;\n preservedPinnedNodeIds: ReadonlyArray<NodeId>;\n finishedAt: string;\n }): Record<NodeId, NodeExecutionSnapshot> {\n const snapshots = { ...args.currentState.nodeSnapshotsByNodeId };\n const skippedPinnedNodeIds = new Set<NodeId>(\n args.preservedPinnedNodeIds.filter((nodeId) => args.skippedNodeIds.includes(nodeId)),\n );\n for (const nodeId of args.skippedNodeIds) {\n if (args.currentState.mutableState?.nodesById?.[nodeId]?.pinnedOutputsByPort) {\n skippedPinnedNodeIds.add(nodeId);\n }\n }\n for (const nodeId of skippedPinnedNodeIds) {\n const previous = snapshots[nodeId];\n snapshots[nodeId] = NodeExecutionSnapshotFactory.completed({\n previous,\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId,\n activationId: previous?.activationId ?? `synthetic_${nodeId}`,\n parent: args.parent,\n finishedAt: args.finishedAt,\n inputsByPort: previous?.inputsByPort ?? NodeInputsByPortFactory.empty(),\n outputs: args.currentState.outputsByNode[nodeId] ?? {},\n fromPinnedOutput: true,\n });\n }\n return snapshots;\n }\n\n applyPinnedQueueSkips(args: {\n runId: RunId;\n workflowId: WorkflowId;\n parent?: ParentExecutionRef;\n mutableState: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"];\n planner: RunQueuePlanner;\n queue: RunQueueEntry[];\n data: ReturnType<RunDataFactory[\"create\"]>;\n nodeSnapshotsByNodeId: Record<NodeId, NodeExecutionSnapshot>;\n finishedAt: string;\n }): void {\n let changed = true;\n while (changed) {\n changed = false;\n for (let index = 0; index < args.queue.length; index += 1) {\n const queueEntry = args.queue[index]!;\n const pinnedOutputs = args.mutableState?.nodesById?.[queueEntry.nodeId]?.pinnedOutputsByPort;\n if (!pinnedOutputs) {\n continue;\n }\n args.queue.splice(index, 1);\n const previous = args.nodeSnapshotsByNodeId[queueEntry.nodeId];\n args.nodeSnapshotsByNodeId[queueEntry.nodeId] = NodeExecutionSnapshotFactory.completed({\n previous,\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId: queueEntry.nodeId,\n activationId: previous?.activationId ?? `synthetic_${queueEntry.nodeId}`,\n parent: args.parent,\n finishedAt: args.finishedAt,\n inputsByPort: this.resolveQueueEntryInputsByPort(queueEntry),\n outputs: pinnedOutputs,\n fromPinnedOutput: true,\n });\n args.data.setOutputs(queueEntry.nodeId, pinnedOutputs);\n args.planner.applyOutputs(args.queue, {\n fromNodeId: queueEntry.nodeId,\n outputs: pinnedOutputs as any,\n batchId: queueEntry.batchId ?? \"batch_1\",\n });\n changed = true;\n break;\n }\n }\n }\n\n createFinishedSnapshot(args: {\n workflow: WorkflowDefinition;\n previous?: NodeExecutionSnapshot;\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n parent?: ParentExecutionRef;\n finishedAt: string;\n inputsByPort: NodeInputsByPort;\n outputs: NodeOutputs;\n hitlStatus?: Extract<\n NodeExecutionStatus,\n \"hitl-approved\" | \"hitl-rejected\" | \"hitl-timeout\" | \"hitl-auto-accepted\" | \"hitl-cancelled\"\n >;\n }): NodeExecutionSnapshot {\n const definition = args.workflow.nodes.find((node) => node.id === args.nodeId);\n if (this.missingRuntimeExecutionMarker.isMarked(definition?.config)) {\n return NodeExecutionSnapshotFactory.skipped(args);\n }\n return NodeExecutionSnapshotFactory.completed(args);\n }\n\n private resolveQueueEntryInputsByPort(queueEntry: RunQueueEntry): NodeInputsByPort {\n if (queueEntry.collect) {\n return queueEntry.collect.received;\n }\n return {\n [queueEntry.toInput ?? \"in\"]: queueEntry.input,\n };\n }\n}\n","import type {\n ExecutionContextFactory,\n NodeExecutionStatePublisher,\n NodeId,\n ParentExecutionRef,\n RunDataFactory,\n RunId,\n RunTestContext,\n WorkflowId,\n} from \"../types\";\n\nimport { CredentialResolverFactory } from \"./CredentialResolverFactory\";\n\n/**\n * Shared {@link ExecutionContextFactory#create} wiring for workflow runners (base context before node-specific fields).\n */\nexport class WorkflowRunExecutionContextFactory {\n constructor(\n private readonly executionContextFactory: ExecutionContextFactory,\n private readonly credentialResolverFactory: CredentialResolverFactory,\n ) {}\n\n create(args: {\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n parent?: ParentExecutionRef;\n policySnapshot?: import(\"../types\").PersistedRunPolicySnapshot;\n subworkflowDepth: number;\n engineMaxNodeActivations: number;\n engineMaxSubworkflowDepth: number;\n data: ReturnType<RunDataFactory[\"create\"]>;\n nodeState?: NodeExecutionStatePublisher;\n testContext?: RunTestContext;\n }) {\n return this.executionContextFactory.create({\n runId: args.runId,\n workflowId: args.workflowId,\n parent: args.parent,\n policySnapshot: args.policySnapshot,\n subworkflowDepth: args.subworkflowDepth,\n engineMaxNodeActivations: args.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: args.engineMaxSubworkflowDepth,\n data: args.data,\n nodeState: args.nodeState,\n getCredential: this.credentialResolverFactory.create(args.workflowId, args.nodeId),\n testContext: args.testContext,\n });\n }\n}\n","import type { CostCatalog, CostCatalogEntry } from \"../contracts/CostCatalogContract\";\nimport type { CostTrackingUsageRecord } from \"../contracts/CostTrackingTelemetryContract\";\n\nexport class StaticCostCatalog implements CostCatalog {\n private readonly entriesByKey: ReadonlyMap<string, CostCatalogEntry>;\n\n constructor(entries: ReadonlyArray<CostCatalogEntry>) {\n this.entriesByKey = new Map(entries.map((entry) => [this.createKeyFromEntry(entry), entry]));\n }\n\n findEntry(args: CostTrackingUsageRecord): CostCatalogEntry | undefined {\n return this.entriesByKey.get(this.createKeyFromUsage(args));\n }\n\n private createKeyFromEntry(entry: CostCatalogEntry): string {\n return `${entry.component}::${entry.provider}::${entry.operation}::${entry.pricingKey}::${entry.usageUnit}`;\n }\n\n private createKeyFromUsage(args: CostTrackingUsageRecord): string {\n return `${args.component}::${args.provider}::${args.operation}::${args.pricingKey}::${args.usageUnit}`;\n }\n}\n","import type { InputPortKey, NodeId, OutputPortKey, WorkflowDefinition } from \"../types\";\nimport { WorkflowExecutableNodeClassifierFactory } from \"../workflow/definition/WorkflowExecutableNodeClassifierFactory\";\n\ntype NodeDef = WorkflowDefinition[\"nodes\"][number];\n\nexport type TopologyIncomingEdge = Readonly<{\n from: Readonly<{ nodeId: NodeId; output: OutputPortKey }>;\n input: InputPortKey;\n collectKey: InputPortKey;\n}>;\n\nexport type TopologyOutgoingEdge = Readonly<{\n output: OutputPortKey;\n to: Readonly<{ nodeId: NodeId; input: InputPortKey; collectKey: InputPortKey }>;\n}>;\n\nexport class WorkflowTopology {\n private constructor(\n public readonly defsById: ReadonlyMap<NodeId, NodeDef>,\n public readonly outgoingByNode: ReadonlyMap<NodeId, ReadonlyArray<TopologyOutgoingEdge>>,\n public readonly incomingByNode: ReadonlyMap<NodeId, ReadonlyArray<TopologyIncomingEdge>>,\n public readonly expectedInputsByNode: ReadonlyMap<NodeId, ReadonlyArray<InputPortKey>>,\n public readonly rootNodeIds: ReadonlyArray<NodeId>,\n ) {}\n\n static fromWorkflow(wf: WorkflowDefinition): WorkflowTopology {\n const classifier = WorkflowExecutableNodeClassifierFactory.create(wf);\n const defs = new Map<NodeId, NodeDef>();\n for (const n of wf.nodes) {\n if (classifier.isExecutableNodeId(n.id)) defs.set(n.id, n);\n }\n\n const incomingByNode = new Map<NodeId, TopologyIncomingEdge[]>();\n for (const e of wf.edges) {\n if (!classifier.isExecutableNodeId(e.from.nodeId) || !classifier.isExecutableNodeId(e.to.nodeId)) {\n continue;\n }\n const list = incomingByNode.get(e.to.nodeId) ?? [];\n list.push({\n from: { nodeId: e.from.nodeId, output: e.from.output },\n input: e.to.input,\n collectKey: e.to.input,\n });\n incomingByNode.set(e.to.nodeId, list);\n }\n\n const duplicateInputCounts = new Map<NodeId, Map<InputPortKey, number>>();\n for (const [toNodeId, edges] of incomingByNode.entries()) {\n const counts = new Map<InputPortKey, number>();\n for (const edge of edges) {\n counts.set(edge.input, (counts.get(edge.input) ?? 0) + 1);\n }\n duplicateInputCounts.set(toNodeId, counts);\n }\n\n for (const [toNodeId, edges] of incomingByNode.entries()) {\n const counts = duplicateInputCounts.get(toNodeId) ?? new Map();\n for (let i = 0; i < edges.length; i++) {\n const edge = edges[i]!;\n const dup = (counts.get(edge.input) ?? 0) > 1;\n const collectKey = dup ? `${edge.from.nodeId}:${edge.from.output}` : edge.input;\n edges[i] = { ...edge, collectKey };\n }\n }\n\n const outgoing = new Map<NodeId, TopologyOutgoingEdge[]>();\n for (const e of wf.edges) {\n if (!classifier.isExecutableNodeId(e.from.nodeId) || !classifier.isExecutableNodeId(e.to.nodeId)) {\n continue;\n }\n const counts = duplicateInputCounts.get(e.to.nodeId) ?? new Map();\n const dup = (counts.get(e.to.input) ?? 0) > 1;\n const collectKey = dup ? `${e.from.nodeId}:${e.from.output}` : e.to.input;\n const list = outgoing.get(e.from.nodeId) ?? [];\n list.push({\n output: e.from.output,\n to: { nodeId: e.to.nodeId, input: e.to.input, collectKey },\n });\n outgoing.set(e.from.nodeId, list);\n }\n\n const expected = new Map<NodeId, InputPortKey[]>();\n for (const [toNodeId, edges] of incomingByNode.entries()) {\n const order: InputPortKey[] = [];\n const seen = new Set<InputPortKey>();\n for (const edge of edges) {\n if (seen.has(edge.collectKey)) {\n continue;\n }\n seen.add(edge.collectKey);\n order.push(edge.collectKey);\n }\n expected.set(toNodeId, order);\n }\n\n const rootNodeIds = wf.nodes\n .filter((node) => classifier.isExecutableNodeId(node.id) && !incomingByNode.has(node.id))\n .map((node) => node.id);\n return new WorkflowTopology(defs, outgoing, incomingByNode, expected, rootNodeIds);\n }\n}\n","import type {\n ActivationIdFactory,\n EngineRunCounters,\n NodeActivationId,\n NodeActivationRequest,\n NodeExecutionContext,\n NodeExecutionSnapshot,\n NodeExecutionStatus,\n NodeId,\n NodeInputsByPort,\n NodeOutputs,\n PendingNodeExecution,\n PendingResumeEntry,\n PersistedRunSchedulingState,\n PersistedRunState,\n ResumeContext,\n RunDataFactory,\n RunHaltReason,\n RunId,\n RunQueueEntry,\n RunResult,\n WorkflowExecutionRepository,\n WebhookControlSignal,\n WebhookRunResult,\n WorkflowDefinition,\n WorkflowId,\n WorkflowSnapshotResolver,\n} from \"../types\";\n\nimport { WorkflowTopology } from \"../planning/WorkflowTopologyPlanner\";\nimport { WorkflowExecutableNodeClassifierFactory } from \"../workflow/definition/WorkflowExecutableNodeClassifierFactory\";\n\nimport { CredentialResolverFactory } from \"../execution/CredentialResolverFactory\";\nimport type { EngineExecutionLimitsPolicy } from \"../policies/executionLimits/EngineExecutionLimitsPolicy\";\nimport { RunTerminalPersistenceCoordinator } from \"../policies/storage/RunTerminalPersistenceCoordinator\";\nimport { WorkflowPolicyErrorServices } from \"../policies/WorkflowPolicyErrorServices\";\nimport { EngineWorkflowPlanningFactory } from \"../planning/EngineWorkflowPlanningFactory\";\nimport type { EngineWaiters } from \"../orchestration/EngineWaiters\";\nimport { NodeEventPublisher } from \"../events/NodeEventPublisher\";\n\nimport { ActivationEnqueueService } from \"../execution/ActivationEnqueueService\";\nimport { NodeInputsByPortFactory } from \"../execution/NodeInputsByPortFactory\";\nimport { NodeExecutionSnapshotFactory } from \"../execution/NodeExecutionSnapshotFactory\";\nimport { NodeRunStateWriterFactory } from \"../execution/NodeRunStateWriterFactory\";\nimport { NodeActivationRequestComposer } from \"../execution/NodeActivationRequestComposer\";\nimport { PersistedRunStateTerminalBuilder } from \"../execution/PersistedRunStateTerminalBuilder\";\nimport { RunStateSemantics } from \"../execution/RunStateSemantics\";\nimport { WorkflowRunExecutionContextFactory } from \"../execution/WorkflowRunExecutionContextFactory\";\n\nexport class RunContinuationService {\n constructor(\n private readonly activationIdFactory: ActivationIdFactory,\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n private readonly runDataFactory: RunDataFactory,\n private readonly runExecutionContextFactory: WorkflowRunExecutionContextFactory,\n private readonly workflowSnapshotResolver: WorkflowSnapshotResolver,\n private readonly planningFactory: EngineWorkflowPlanningFactory,\n private readonly nodeStatePublisherFactory: NodeRunStateWriterFactory,\n private readonly credentialResolverFactory: CredentialResolverFactory,\n private readonly nodeActivationRequestComposer: NodeActivationRequestComposer,\n private readonly persistedRunStateTerminalBuilder: PersistedRunStateTerminalBuilder,\n private readonly activationEnqueueService: ActivationEnqueueService,\n private readonly nodeEventPublisher: NodeEventPublisher,\n private readonly semantics: RunStateSemantics,\n private readonly waiters: EngineWaiters,\n private readonly policyErrorServices: WorkflowPolicyErrorServices,\n private readonly terminalPersistence: RunTerminalPersistenceCoordinator,\n private readonly executionLimitsPolicy: EngineExecutionLimitsPolicy,\n ) {}\n\n async markNodeRunning(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n inputsByPort: NodeInputsByPort;\n }): Promise<void> {\n const [state, schedulingState] = await Promise.all([\n this.workflowExecutionRepository.load(args.runId),\n this.workflowExecutionRepository.loadSchedulingState(args.runId),\n ]);\n const pendingExecution = schedulingState?.pending;\n if (!state || !pendingExecution) return;\n if (pendingExecution.activationId !== args.activationId || pendingExecution.nodeId !== args.nodeId) return;\n\n const startedAt = new Date().toISOString();\n const previous = state.nodeSnapshotsByNodeId?.[args.nodeId];\n const snapshot = NodeExecutionSnapshotFactory.running({\n previous,\n runId: state.runId,\n workflowId: state.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n parent: state.parent,\n startedAt,\n inputsByPort: args.inputsByPort,\n });\n\n await this.workflowExecutionRepository.save({\n ...state,\n nodeSnapshotsByNodeId: {\n ...(state.nodeSnapshotsByNodeId ?? {}),\n [args.nodeId]: snapshot,\n },\n });\n await this.nodeEventPublisher.publish(\"nodeStarted\", snapshot);\n }\n\n async resumeFromNodeResult(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n outputs: NodeOutputs;\n }): Promise<RunResult> {\n const [state, schedulingState] = await Promise.all([\n this.workflowExecutionRepository.load(args.runId),\n this.workflowExecutionRepository.loadSchedulingState(args.runId),\n ]);\n if (!state) throw new Error(`Unknown runId: ${args.runId}`);\n const pendingExecution = this.requirePendingExecution(\n args.runId,\n args.activationId,\n args.nodeId,\n state,\n schedulingState,\n );\n if (pendingExecution.activationId !== args.activationId)\n throw new Error(`activationId mismatch for run ${args.runId}`);\n if (pendingExecution.nodeId !== args.nodeId) throw new Error(`nodeId mismatch for run ${args.runId}`);\n\n const wf = this.resolvePersistedWorkflow(state);\n if (!wf) throw new Error(`Unknown workflowId: ${state.workflowId}`);\n\n const { topology, planner } = this.planningFactory.create(wf);\n\n const data = this.runDataFactory.create(state.outputsByNode);\n const limits = this.resolveEngineLimitsFromState(state);\n const base = this.runExecutionContextFactory.create({\n runId: state.runId,\n workflowId: state.workflowId,\n nodeId: args.nodeId,\n parent: state.parent,\n policySnapshot: state.policySnapshot,\n subworkflowDepth: state.executionOptions?.subworkflowDepth ?? 0,\n engineMaxNodeActivations: limits.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: limits.engineMaxSubworkflowDepth,\n data,\n nodeState: this.nodeStatePublisherFactory.create(state.runId, state.workflowId, state.parent),\n testContext: state.executionOptions?.testContext,\n });\n\n data.setOutputs(args.nodeId, args.outputs);\n const completedAt = new Date().toISOString();\n\n // Resolve HITL status from the node's decision output.\n // Only fires when the output carries `item.json.decision.status` written by a\n // defineHumanApprovalNode-based node. Non-HITL nodes never have this field.\n const hitlResolution = this.resolveHitlStatus(args.outputs);\n\n const completedSnapshot = this.semantics.createFinishedSnapshot({\n workflow: wf,\n previous: state.nodeSnapshotsByNodeId?.[args.nodeId],\n runId: state.runId,\n workflowId: state.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n parent: state.parent,\n finishedAt: completedAt,\n inputsByPort: pendingExecution.inputsByPort,\n outputs: args.outputs,\n hitlStatus: hitlResolution?.nodeStatus,\n });\n\n // Halt the run for HITL rejection / timeout outcomes.\n if (hitlResolution?.halt) {\n const haltedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state,\n engineCounters: state.engineCounters ?? { completedNodeActivations: 0 },\n status: \"halted\",\n reason: hitlResolution.reason,\n queue: [],\n outputsByNode: data.dump(),\n nodeSnapshotsByNodeId: {\n ...(state.nodeSnapshotsByNodeId ?? {}),\n [args.nodeId]: completedSnapshot,\n },\n finishedAtIso: completedAt,\n });\n await this.workflowExecutionRepository.save(haltedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: wf,\n state: haltedState,\n finalStatus: \"failed\",\n finishedAt: completedAt,\n });\n const result: RunResult = {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: \"halted\",\n reason: hitlResolution.reason,\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n const completedActivations = (state.engineCounters?.completedNodeActivations ?? 0) + 1;\n const engineCounters = { completedNodeActivations: completedActivations };\n const maxNodeActivations =\n state.executionOptions?.maxNodeActivations ??\n this.executionLimitsPolicy.createRootExecutionOptions().maxNodeActivations!;\n\n if (this.semantics.isStopConditionSatisfied(state.control?.stopCondition, args.nodeId)) {\n const completedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state,\n engineCounters,\n status: \"completed\",\n queue: [],\n outputsByNode: data.dump(),\n nodeSnapshotsByNodeId: {\n ...(state.nodeSnapshotsByNodeId ?? {}),\n [args.nodeId]: completedSnapshot,\n },\n finishedAtIso: completedAt,\n });\n await this.workflowExecutionRepository.save(completedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: wf,\n state: completedState,\n finalStatus: \"completed\",\n finishedAt: completedAt,\n });\n const result: RunResult = {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: \"completed\",\n outputs: this.semantics.resolveResultOutputs(wf, state.control?.stopCondition, data.dump()),\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n const batchId = pendingExecution.batchId ?? \"batch_1\";\n const queue: RunQueueEntry[] = (schedulingState?.queue ?? []).map((q) => ({ ...q, batchId: q.batchId ?? batchId }));\n const nextNodeSnapshotsByNodeId = {\n ...(state.nodeSnapshotsByNodeId ?? {}),\n [args.nodeId]: completedSnapshot,\n };\n\n planner.applyOutputs(queue, { fromNodeId: args.nodeId, outputs: args.outputs as any, batchId });\n this.semantics.applyPinnedQueueSkips({\n runId: state.runId,\n workflowId: state.workflowId,\n parent: state.parent,\n mutableState: state.mutableState,\n planner,\n queue,\n data,\n nodeSnapshotsByNodeId: nextNodeSnapshotsByNodeId,\n finishedAt: completedAt,\n });\n\n let next: ReturnType<(typeof planner)[\"nextActivation\"]>;\n try {\n next = planner.nextActivation(queue);\n } catch (cause) {\n const completedDefinition = topology.defsById.get(args.nodeId);\n const completedNodeLabel = this.formatNodeLabel({\n definition: completedDefinition,\n nodeId: args.nodeId,\n });\n const reason = cause instanceof Error ? cause.message : String(cause);\n throw new Error(\n `After completing ${completedNodeLabel}, the engine could not plan the next activation. ${reason} Outputs: ${this.formatOutputCounts(args.outputs)}.`,\n { cause },\n );\n }\n if (!next) {\n const lastNodeId = WorkflowExecutableNodeClassifierFactory.create(wf).lastExecutableNodeIdInDefinitionOrder(wf);\n const outputs = data.getOutputItems(lastNodeId, \"main\");\n\n const completedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state,\n engineCounters,\n status: \"completed\",\n queue: [],\n outputsByNode: data.dump(),\n nodeSnapshotsByNodeId: nextNodeSnapshotsByNodeId,\n finishedAtIso: completedAt,\n });\n await this.workflowExecutionRepository.save(completedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: wf,\n state: completedState,\n finalStatus: \"completed\",\n finishedAt: completedAt,\n });\n\n const result: RunResult = {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: \"completed\",\n outputs,\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n if (completedActivations >= maxNodeActivations) {\n const message = `Run exceeded maxNodeActivations (${maxNodeActivations}) after ${completedActivations} completed node activations (next would be ${next.nodeId}).`;\n const failedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state,\n engineCounters,\n status: \"failed\",\n queue: queue.map((q) => ({ ...q })),\n outputsByNode: data.dump(),\n nodeSnapshotsByNodeId: nextNodeSnapshotsByNodeId,\n finishedAtIso: completedAt,\n });\n await this.workflowExecutionRepository.save(failedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: wf,\n state: failedState,\n finalStatus: \"failed\",\n finishedAt: completedAt,\n });\n const result: RunResult = {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: \"failed\",\n error: { message },\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n const def = topology.defsById.get(next.nodeId);\n if (!def || def.kind !== \"node\") throw new Error(`Node ${next.nodeId} is not a runnable node`);\n\n const request = this.nodeActivationRequestComposer.createFromPlannedActivation({\n next,\n base,\n data,\n runId: state.runId,\n workflowId: state.workflowId,\n parent: state.parent,\n executionOptions: state.executionOptions,\n nodeDefinition: def,\n });\n\n try {\n const { queuedSnapshot, result } = await this.activationEnqueueService.enqueueActivationWithSnapshot({\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n parent: state.parent,\n executionOptions: state.executionOptions,\n control: state.control,\n workflowSnapshot: state.workflowSnapshot,\n mutableState: state.mutableState,\n policySnapshot: state.policySnapshot,\n pendingQueue: queue,\n request,\n previousNodeSnapshotsByNodeId: nextNodeSnapshotsByNodeId,\n planner,\n engineCounters,\n connectionInvocations: state.connectionInvocations ?? [],\n });\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.nodeEventPublisher.publish(\"nodeQueued\", queuedSnapshot);\n return result;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n return await this.terminateRunAfterActivationEnqueueRejected({\n wf,\n state,\n queue,\n nextNodeId: next.nodeId,\n request,\n completedSnapshot,\n nextNodeSnapshotsByNodeId: nextNodeSnapshotsByNodeId,\n outputsByNode: data.dump(),\n engineCounters,\n error,\n completedAt,\n });\n }\n }\n\n async resumeFromNodeError(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n error: Error;\n }): Promise<RunResult> {\n const [state, schedulingState] = await Promise.all([\n this.workflowExecutionRepository.load(args.runId),\n this.workflowExecutionRepository.loadSchedulingState(args.runId),\n ]);\n if (!state) throw new Error(`Unknown runId: ${args.runId}`);\n const pendingExecution = this.requirePendingExecution(\n args.runId,\n args.activationId,\n args.nodeId,\n state,\n schedulingState,\n );\n if (pendingExecution.activationId !== args.activationId)\n throw new Error(`activationId mismatch for run ${args.runId}`);\n if (pendingExecution.nodeId !== args.nodeId) throw new Error(`nodeId mismatch for run ${args.runId}`);\n\n const wf = this.resolvePersistedWorkflow(state);\n if (!wf) throw new Error(`Unknown workflowId: ${state.workflowId}`);\n const failedDefinition = WorkflowTopology.fromWorkflow(wf).defsById.get(args.nodeId);\n const webhookControlSignal =\n state.executionOptions?.webhook && failedDefinition?.kind === \"trigger\"\n ? this.asWebhookControlSignal(args.error)\n : undefined;\n if (webhookControlSignal) {\n return await this.resumeFromWebhookControl({\n state,\n schedulingState,\n pendingExecution,\n workflow: wf,\n args,\n signal: webhookControlSignal,\n });\n }\n\n if (failedDefinition && failedDefinition.kind === \"node\") {\n const nodeHandler = this.policyErrorServices.resolveNodeErrorHandler(failedDefinition.config.nodeErrorHandler);\n if (nodeHandler) {\n try {\n const ctx = this.buildNodeExecutionContextForPending(\n state,\n pendingExecution,\n wf,\n failedDefinition,\n args.nodeId,\n );\n const inputsByPort = pendingExecution.inputsByPort;\n const portKeys = Object.keys(inputsByPort);\n const kind = portKeys.length === 1 && portKeys[0] === \"in\" ? (\"single\" as const) : (\"multi\" as const);\n const items = inputsByPort.in ?? [];\n const recovered = await nodeHandler.handle({\n kind,\n items,\n inputsByPort: kind === \"multi\" ? inputsByPort : undefined,\n ctx,\n error: args.error,\n });\n return await this.resumeFromNodeResult({\n runId: args.runId,\n activationId: args.activationId,\n nodeId: args.nodeId,\n outputs: recovered,\n });\n } catch {\n // fall through to workflow-level failure\n }\n }\n }\n\n const finishedAt = new Date().toISOString();\n const message = args.error?.message ?? String(args.error);\n const failedSnapshot = NodeExecutionSnapshotFactory.failed({\n previous: state.nodeSnapshotsByNodeId?.[args.nodeId],\n runId: state.runId,\n workflowId: state.workflowId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n parent: state.parent,\n finishedAt,\n inputsByPort: pendingExecution.inputsByPort,\n error: args.error,\n });\n const failedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state,\n engineCounters: state.engineCounters ?? { completedNodeActivations: 0 },\n status: \"failed\",\n queue: (schedulingState?.queue ?? []).map((q) => ({ ...q })),\n outputsByNode: state.outputsByNode,\n nodeSnapshotsByNodeId: {\n ...(state.nodeSnapshotsByNodeId ?? {}),\n [args.nodeId]: failedSnapshot,\n },\n finishedAtIso: finishedAt,\n });\n await this.workflowExecutionRepository.save(failedState);\n await this.nodeEventPublisher.publish(\"nodeFailed\", failedSnapshot);\n\n const wfErr = this.policyErrorServices.resolveWorkflowErrorHandler(wf.workflowErrorHandler);\n if (wfErr) {\n await Promise.resolve(\n wfErr.onError({\n runId: state.runId,\n workflowId: state.workflowId,\n workflow: wf,\n failedNodeId: args.nodeId,\n error: args.error,\n startedAt: state.startedAt,\n finishedAt,\n }),\n );\n }\n\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: wf,\n state: failedState,\n finalStatus: \"failed\",\n finishedAt,\n });\n\n const result: RunResult = {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: \"failed\",\n error: { message },\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n async resumeFromStepResult(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n outputs: NodeOutputs;\n }): Promise<RunResult> {\n return await this.resumeFromNodeResult(args);\n }\n\n async resumeFromStepError(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n error: Error;\n }): Promise<RunResult> {\n return await this.resumeFromNodeError(args);\n }\n\n async waitForCompletion(runId: RunId): Promise<Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>> {\n const existing = await this.workflowExecutionRepository.load(runId);\n if (existing?.status === \"completed\") {\n const wf = this.resolvePersistedWorkflow(existing);\n const outputs = wf\n ? this.semantics.resolveResultOutputs(wf, existing.control?.stopCondition, existing.outputsByNode)\n : [];\n return {\n runId: existing.runId,\n workflowId: existing.workflowId,\n startedAt: existing.startedAt,\n status: \"completed\",\n outputs,\n };\n }\n if (existing?.status === \"failed\") {\n return {\n runId: existing.runId,\n workflowId: existing.workflowId,\n startedAt: existing.startedAt,\n status: \"failed\",\n error: { message: \"Run failed\" },\n };\n }\n if (existing?.status === \"halted\") {\n return {\n runId: existing.runId,\n workflowId: existing.workflowId,\n startedAt: existing.startedAt,\n status: \"halted\",\n reason: existing.reason ?? \"hitl-rejected\",\n };\n }\n\n const result = await this.waiters.waitForCompletion(runId);\n if (result.status !== \"completed\" && result.status !== \"failed\" && result.status !== \"halted\") {\n throw new Error(`Unexpected run completion status: ${result.status}`);\n }\n return result;\n }\n\n async waitForWebhookResponse(runId: RunId): Promise<WebhookRunResult> {\n return await this.waiters.waitForWebhookResponse(runId);\n }\n\n /**\n * Re-activate a previously suspended run item with a human decision.\n *\n * Called by the HITL resume endpoint. This method:\n * 1. Loads `PersistedRunState` and locates the suspension entry by `taskId`.\n * 2. Removes the entry from the `suspension` array; if empty, run stays `\"suspended\"` until\n * enqueue flips it to `\"pending\"`.\n * 3. Writes `pendingResume` onto the state so `NodeExecutionRequestHandlerService` can\n * splice `resumeContext` into the node's execution context.\n * 4. Reconstructs the original input from `outputsByNode` of the upstream node and\n * enqueues a new activation via `activationEnqueueService`.\n *\n * @throws if the run is not found, not suspended, or the `taskId` is unknown.\n */\n async resumeRun(args: { runId: RunId; taskId: string; resumeContext: ResumeContext }): Promise<RunResult> {\n const state = await this.workflowExecutionRepository.load(args.runId);\n if (!state) throw new Error(`Unknown runId: ${args.runId}`);\n if (state.status !== \"suspended\") {\n throw new Error(`Run ${args.runId} is not suspended (status: ${state.status})`);\n }\n\n const suspensionEntry = (state.suspension ?? []).find((s) => s.taskId === args.taskId);\n if (!suspensionEntry) {\n throw new Error(`No suspension entry with taskId \"${args.taskId}\" found on run ${args.runId}`);\n }\n\n const wf = this.resolvePersistedWorkflow(state);\n if (!wf) throw new Error(`Unknown workflowId: ${state.workflowId}`);\n\n const { topology, planner } = this.planningFactory.create(wf);\n const def = topology.defsById.get(suspensionEntry.nodeId);\n if (!def || def.kind !== \"node\") {\n throw new Error(`Node ${suspensionEntry.nodeId} is not a runnable node`);\n }\n\n // Reconstruct input: find the parent node that fed this node and use its main output.\n // The single-item input corresponds to `itemIndex` in the original activation batch.\n const data = this.runDataFactory.create(state.outputsByNode);\n const limits = this.resolveEngineLimitsFromState(state);\n const base = this.runExecutionContextFactory.create({\n runId: state.runId,\n workflowId: state.workflowId,\n nodeId: suspensionEntry.nodeId,\n parent: state.parent,\n policySnapshot: state.policySnapshot,\n subworkflowDepth: state.executionOptions?.subworkflowDepth ?? 0,\n engineMaxNodeActivations: limits.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: limits.engineMaxSubworkflowDepth,\n data,\n nodeState: this.nodeStatePublisherFactory.create(state.runId, state.workflowId, state.parent),\n testContext: state.executionOptions?.testContext,\n });\n\n // Find the original input items for this node from upstream outputs.\n // Use the workflow edges to resolve the parent node. If no parent found, fall back to empty.\n const parentEdges = wf.edges.filter((e) => e.to.nodeId === suspensionEntry.nodeId);\n const parentNodeId = parentEdges[0]?.from.nodeId;\n const parentOutputPort = parentEdges[0]?.from.output ?? \"main\";\n const allParentItems = parentNodeId ? (data.getOutputItems(parentNodeId, parentOutputPort) ?? []) : [];\n // Each suspended item gets its own resume; pass the single item at itemIndex.\n const resumeInput =\n allParentItems.length > suspensionEntry.itemIndex ? [allParentItems[suspensionEntry.itemIndex]!] : allParentItems;\n\n const newActivationId = this.activationIdFactory.makeActivationId();\n const pendingResume: PendingResumeEntry = {\n activationId: newActivationId,\n nodeId: suspensionEntry.nodeId,\n resumeContext: args.resumeContext,\n };\n\n const remainingSuspensions = (state.suspension ?? []).filter((s) => s.taskId !== args.taskId);\n\n // Thread resumeContext into the execution context so the inline scheduler path\n // (InlineDrivingScheduler) delivers it directly to the node's ctx.resumeContext.\n // On the worker path (BullMQ), NodeExecutionRequestHandlerService re-derives it\n // from state.pendingResume — passing it here is additive and harmless.\n const baseWithResume = { ...base, resumeContext: args.resumeContext };\n\n const batchId = `resume_${newActivationId}`;\n const request = this.nodeActivationRequestComposer.createSingleFromDefinitionWithActivation({\n activationId: newActivationId,\n runId: state.runId,\n workflowId: state.workflowId,\n parent: state.parent,\n executionOptions: state.executionOptions,\n base: baseWithResume,\n data,\n definition: { id: suspensionEntry.nodeId, config: def.config },\n batchId,\n input: resumeInput,\n });\n\n const { result, queuedSnapshot } = await this.activationEnqueueService.enqueueActivationWithSnapshot({\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n parent: state.parent,\n executionOptions: state.executionOptions,\n control: state.control,\n workflowSnapshot: state.workflowSnapshot,\n mutableState: state.mutableState,\n policySnapshot: state.policySnapshot,\n pendingQueue: [],\n request,\n previousNodeSnapshotsByNodeId: state.nodeSnapshotsByNodeId ?? {},\n planner,\n engineCounters: state.engineCounters,\n connectionInvocations: state.connectionInvocations ?? [],\n suspension: remainingSuspensions.length > 0 ? remainingSuspensions : undefined,\n pendingResume,\n });\n\n await this.nodeEventPublisher.publish(\"nodeQueued\", queuedSnapshot);\n return result;\n }\n\n private async resumeFromWebhookControl(args: {\n state: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>;\n schedulingState: PersistedRunSchedulingState | undefined;\n pendingExecution: PendingNodeExecution;\n workflow: WorkflowDefinition;\n args: { runId: RunId; activationId: NodeActivationId; nodeId: NodeId; error: Error };\n signal: WebhookControlSignal;\n }): Promise<RunResult> {\n const data = this.runDataFactory.create(args.state.outputsByNode);\n const { topology, planner } = this.planningFactory.create(args.workflow);\n\n const continuedItems =\n args.signal.kind === \"respondNowAndContinue\" ? (args.signal.continueItems ?? []) : args.signal.responseItems;\n const triggerOutputs: NodeOutputs = { main: continuedItems };\n data.setOutputs(args.args.nodeId, triggerOutputs);\n\n const completedSnapshot = this.semantics.createFinishedSnapshot({\n workflow: args.workflow,\n previous: args.state.nodeSnapshotsByNodeId?.[args.args.nodeId],\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n nodeId: args.args.nodeId,\n activationId: args.args.activationId,\n parent: args.state.parent,\n finishedAt: new Date().toISOString(),\n inputsByPort: args.pendingExecution.inputsByPort,\n outputs: triggerOutputs,\n });\n\n const completedActivations = (args.state.engineCounters?.completedNodeActivations ?? 0) + 1;\n const engineCounters = { completedNodeActivations: completedActivations };\n const maxNodeActivations =\n args.state.executionOptions?.maxNodeActivations ??\n this.executionLimitsPolicy.createRootExecutionOptions().maxNodeActivations!;\n\n if (this.semantics.isStopConditionSatisfied(args.state.control?.stopCondition, args.args.nodeId)) {\n const completedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state: args.state,\n engineCounters,\n status: \"completed\",\n queue: [],\n outputsByNode: data.dump(),\n nodeSnapshotsByNodeId: {\n ...(args.state.nodeSnapshotsByNodeId ?? {}),\n [args.args.nodeId]: completedSnapshot,\n },\n finishedAtIso: completedSnapshot.finishedAt ?? completedSnapshot.updatedAt,\n });\n await this.workflowExecutionRepository.save(completedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: args.workflow,\n state: completedState,\n finalStatus: \"completed\",\n finishedAt: completedSnapshot.finishedAt ?? completedSnapshot.updatedAt,\n });\n this.waiters.resolveWebhookResponse({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n runStatus: \"completed\",\n response: args.signal.responseItems,\n });\n const result: RunResult = {\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n status: \"completed\",\n outputs: this.semantics.resolveResultOutputs(args.workflow, args.state.control?.stopCondition, data.dump()),\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n if (args.signal.kind === \"respondNow\") {\n const completedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state: args.state,\n engineCounters,\n status: \"completed\",\n queue: [],\n outputsByNode: data.dump(),\n nodeSnapshotsByNodeId: {\n ...(args.state.nodeSnapshotsByNodeId ?? {}),\n [args.args.nodeId]: completedSnapshot,\n },\n finishedAtIso: completedSnapshot.finishedAt ?? completedSnapshot.updatedAt,\n });\n await this.workflowExecutionRepository.save(completedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: args.workflow,\n state: completedState,\n finalStatus: \"completed\",\n finishedAt: completedSnapshot.finishedAt ?? completedSnapshot.updatedAt,\n });\n\n const result: RunResult = {\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n status: \"completed\",\n outputs: args.signal.responseItems,\n };\n this.waiters.resolveWebhookResponse({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n runStatus: \"completed\",\n response: args.signal.responseItems,\n });\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n const batchId = args.pendingExecution.batchId ?? \"batch_1\";\n const queue: RunQueueEntry[] = (args.schedulingState?.queue ?? []).map((entry) => ({\n ...entry,\n batchId: entry.batchId ?? batchId,\n }));\n planner.applyOutputs(queue, { fromNodeId: args.args.nodeId, outputs: triggerOutputs as any, batchId });\n const next = planner.nextActivation(queue);\n\n const finishedAt = completedSnapshot.finishedAt ?? completedSnapshot.updatedAt;\n const mergedSnapshots = {\n ...(args.state.nodeSnapshotsByNodeId ?? {}),\n [args.args.nodeId]: completedSnapshot,\n };\n\n if (!next) {\n const lastNodeId = WorkflowExecutableNodeClassifierFactory.create(\n args.workflow,\n ).lastExecutableNodeIdInDefinitionOrder(args.workflow);\n const outputs = data.getOutputItems(lastNodeId, \"main\");\n const completedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state: args.state,\n engineCounters,\n status: \"completed\",\n queue: [],\n outputsByNode: data.dump(),\n nodeSnapshotsByNodeId: mergedSnapshots,\n finishedAtIso: finishedAt,\n });\n await this.workflowExecutionRepository.save(completedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: args.workflow,\n state: completedState,\n finalStatus: \"completed\",\n finishedAt: completedSnapshot.finishedAt ?? completedSnapshot.updatedAt,\n });\n\n const result: RunResult = {\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n status: \"completed\",\n outputs,\n };\n this.waiters.resolveWebhookResponse({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n runStatus: \"completed\",\n response: args.signal.responseItems,\n });\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n if (completedActivations >= maxNodeActivations) {\n const message = `Run exceeded maxNodeActivations (${maxNodeActivations}) after ${completedActivations} completed node activations (next would be ${next.nodeId}).`;\n const failedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state: args.state,\n engineCounters,\n status: \"failed\",\n queue: queue.map((q) => ({ ...q })),\n outputsByNode: data.dump(),\n nodeSnapshotsByNodeId: mergedSnapshots,\n finishedAtIso: finishedAt,\n });\n await this.workflowExecutionRepository.save(failedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: args.workflow,\n state: failedState,\n finalStatus: \"failed\",\n finishedAt: completedSnapshot.finishedAt ?? completedSnapshot.updatedAt,\n });\n const result: RunResult = {\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n status: \"failed\",\n error: { message },\n };\n this.waiters.resolveWebhookResponse({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n runStatus: \"pending\",\n response: args.signal.responseItems,\n });\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n const nextDefinition = topology.defsById.get(next.nodeId);\n if (!nextDefinition || nextDefinition.kind !== \"node\") {\n throw new Error(`Node ${next.nodeId} is not a runnable node`);\n }\n\n const webhookLimits = this.resolveEngineLimitsFromState(args.state);\n const base = this.runExecutionContextFactory.create({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n nodeId: nextDefinition.id,\n parent: args.state.parent,\n policySnapshot: args.state.policySnapshot,\n subworkflowDepth: args.state.executionOptions?.subworkflowDepth ?? 0,\n engineMaxNodeActivations: webhookLimits.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: webhookLimits.engineMaxSubworkflowDepth,\n data,\n nodeState: this.nodeStatePublisherFactory.create(args.state.runId, args.state.workflowId, args.state.parent),\n testContext: args.state.executionOptions?.testContext,\n });\n const request = this.nodeActivationRequestComposer.createFromPlannedActivation({\n next,\n base,\n data,\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n parent: args.state.parent,\n executionOptions: args.state.executionOptions,\n nodeDefinition: nextDefinition,\n });\n\n try {\n const { queuedSnapshot, result } = await this.activationEnqueueService.enqueueActivationWithSnapshot({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n parent: args.state.parent,\n executionOptions: args.state.executionOptions,\n control: args.state.control,\n workflowSnapshot: args.state.workflowSnapshot,\n mutableState: args.state.mutableState,\n policySnapshot: args.state.policySnapshot,\n pendingQueue: queue,\n request,\n previousNodeSnapshotsByNodeId: mergedSnapshots,\n planner,\n engineCounters,\n connectionInvocations: args.state.connectionInvocations ?? [],\n });\n await this.nodeEventPublisher.publish(\"nodeCompleted\", completedSnapshot);\n await this.nodeEventPublisher.publish(\"nodeQueued\", queuedSnapshot);\n this.waiters.resolveWebhookResponse({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n runStatus: \"pending\",\n response: args.signal.responseItems,\n });\n return result;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n const result = await this.terminateRunAfterActivationEnqueueRejected({\n wf: args.workflow,\n state: args.state,\n queue,\n nextNodeId: next.nodeId,\n request,\n completedSnapshot,\n nextNodeSnapshotsByNodeId: mergedSnapshots,\n outputsByNode: data.dump(),\n engineCounters,\n error,\n completedAt: finishedAt,\n });\n this.waiters.resolveWebhookResponse({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n runStatus: \"pending\",\n response: args.signal.responseItems,\n });\n return result;\n }\n }\n\n private asWebhookControlSignal(error: Error): WebhookControlSignal | undefined {\n const candidate = error as Partial<WebhookControlSignal> | undefined;\n if (!candidate || candidate.__webhookControl !== true) return undefined;\n if (candidate.kind !== \"respondNow\" && candidate.kind !== \"respondNowAndContinue\") return undefined;\n if (!Array.isArray(candidate.responseItems)) return undefined;\n return candidate as WebhookControlSignal;\n }\n\n private resolvePersistedWorkflow(state: {\n workflowId: WorkflowId;\n workflowSnapshot?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n }): WorkflowDefinition | undefined {\n return this.workflowSnapshotResolver.resolve({\n workflowId: state.workflowId,\n workflowSnapshot: state.workflowSnapshot,\n });\n }\n\n private buildNodeExecutionContextForPending(\n state: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>,\n pendingExecution: PendingNodeExecution,\n wf: WorkflowDefinition,\n def: Readonly<{ id: NodeId; config: NodeExecutionContext[\"config\"] }>,\n nodeId: NodeId,\n ): NodeExecutionContext {\n const data = this.runDataFactory.create(state.outputsByNode);\n const limits = this.resolveEngineLimitsFromState(state);\n const base = this.runExecutionContextFactory.create({\n runId: state.runId,\n workflowId: state.workflowId,\n nodeId,\n parent: state.parent,\n policySnapshot: state.policySnapshot,\n subworkflowDepth: state.executionOptions?.subworkflowDepth ?? 0,\n engineMaxNodeActivations: limits.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: limits.engineMaxSubworkflowDepth,\n data,\n nodeState: this.nodeStatePublisherFactory.create(state.runId, state.workflowId, state.parent),\n testContext: state.executionOptions?.testContext,\n });\n const activationId = pendingExecution.activationId;\n return {\n ...base,\n data,\n nodeId,\n activationId,\n config: def.config,\n telemetry: base.telemetry.forNode({ nodeId, activationId }),\n binary: base.binary.forNode({ nodeId, activationId }),\n getCredential: this.credentialResolverFactory.create(wf.id, nodeId, def.config),\n };\n }\n\n private requirePendingExecution(\n runId: RunId,\n activationId: NodeActivationId,\n nodeId: NodeId,\n state: PersistedRunState,\n schedulingState?: PersistedRunSchedulingState,\n ): PendingNodeExecution {\n if (state.status !== \"pending\") {\n throw new Error(`Run ${runId} is not pending`);\n }\n const pendingExecution = schedulingState?.pending;\n if (!pendingExecution) {\n throw new Error(`Run ${runId} is not pending`);\n }\n if (pendingExecution.activationId !== activationId) {\n throw new Error(`activationId mismatch for run ${runId}`);\n }\n if (pendingExecution.nodeId !== nodeId) {\n throw new Error(`nodeId mismatch for run ${runId}`);\n }\n return pendingExecution;\n }\n\n private resolveEngineLimitsFromState(state: PersistedRunState): {\n engineMaxNodeActivations: number;\n engineMaxSubworkflowDepth: number;\n } {\n const fb = this.executionLimitsPolicy.createRootExecutionOptions();\n return {\n engineMaxNodeActivations: state.executionOptions?.maxNodeActivations ?? fb.maxNodeActivations!,\n engineMaxSubworkflowDepth: state.executionOptions?.maxSubworkflowDepth ?? fb.maxSubworkflowDepth!,\n };\n }\n\n /**\n * Next activation could not be enqueued (e.g. input contract / mapping failed in the preparer).\n * Marks the target node failed and terminates the run.\n */\n private async terminateRunAfterActivationEnqueueRejected(\n args: Readonly<{\n wf: WorkflowDefinition;\n state: PersistedRunState;\n queue: RunQueueEntry[];\n nextNodeId: NodeId;\n request: NodeActivationRequest;\n completedSnapshot: NodeExecutionSnapshot;\n nextNodeSnapshotsByNodeId: NonNullable<PersistedRunState[\"nodeSnapshotsByNodeId\"]>;\n outputsByNode: PersistedRunState[\"outputsByNode\"];\n engineCounters: EngineRunCounters;\n error: Error;\n completedAt: string;\n }>,\n ): Promise<RunResult> {\n const finishedAt = args.completedAt;\n const inputsByPort = NodeInputsByPortFactory.fromRequest(args.request);\n const failedSnapshot = NodeExecutionSnapshotFactory.failed({\n previous: undefined,\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n nodeId: args.nextNodeId,\n activationId: args.request.activationId,\n parent: args.state.parent,\n finishedAt,\n inputsByPort,\n error: args.error,\n });\n const failedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state: args.state,\n engineCounters: args.engineCounters,\n status: \"failed\",\n queue: args.queue.map((q) => ({ ...q })),\n outputsByNode: args.outputsByNode,\n nodeSnapshotsByNodeId: {\n ...args.nextNodeSnapshotsByNodeId,\n [args.nextNodeId]: failedSnapshot,\n },\n finishedAtIso: finishedAt,\n });\n await this.workflowExecutionRepository.save(failedState);\n await this.nodeEventPublisher.publish(\"nodeCompleted\", args.completedSnapshot);\n await this.nodeEventPublisher.publish(\"nodeFailed\", failedSnapshot);\n\n const wfErr = this.policyErrorServices.resolveWorkflowErrorHandler(args.wf.workflowErrorHandler);\n if (wfErr) {\n await Promise.resolve(\n wfErr.onError({\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n workflow: args.wf,\n failedNodeId: args.nextNodeId,\n error: args.error,\n startedAt: args.state.startedAt,\n finishedAt,\n }),\n );\n }\n\n await this.terminalPersistence.maybeDeleteAfterTerminalState({\n workflow: args.wf,\n state: failedState,\n finalStatus: \"failed\",\n finishedAt,\n });\n\n const message = args.error.message ?? String(args.error);\n const result: RunResult = {\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n startedAt: args.state.startedAt,\n status: \"failed\",\n error: { message },\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n /**\n * Inspects node outputs for a `decision.status` written by `defineHumanApprovalNode`.\n * Returns the first-class HITL node status and halt classification, or `undefined`\n * when the node is not a HITL approval node.\n */\n private resolveHitlStatus(outputs: NodeOutputs):\n | {\n nodeStatus: Extract<\n NodeExecutionStatus,\n \"hitl-approved\" | \"hitl-rejected\" | \"hitl-timeout\" | \"hitl-auto-accepted\"\n >;\n halt: boolean;\n reason: RunHaltReason;\n }\n | { nodeStatus: Extract<NodeExecutionStatus, \"hitl-approved\" | \"hitl-auto-accepted\">; halt: false }\n | undefined {\n const firstItem = outputs?.main?.[0];\n const decisionStatus =\n firstItem &&\n typeof firstItem === \"object\" &&\n \"json\" in firstItem &&\n firstItem.json &&\n typeof firstItem.json === \"object\" &&\n \"decision\" in firstItem.json &&\n firstItem.json.decision &&\n typeof firstItem.json.decision === \"object\" &&\n \"status\" in firstItem.json.decision\n ? (firstItem.json.decision as { status: string }).status\n : undefined;\n\n if (!decisionStatus) return undefined;\n\n if (decisionStatus === \"approved\") {\n return { nodeStatus: \"hitl-approved\", halt: false } as {\n nodeStatus: \"hitl-approved\";\n halt: false;\n };\n }\n if (decisionStatus === \"auto-accepted\") {\n return { nodeStatus: \"hitl-auto-accepted\", halt: false } as {\n nodeStatus: \"hitl-auto-accepted\";\n halt: false;\n };\n }\n if (decisionStatus === \"rejected\") {\n return { nodeStatus: \"hitl-rejected\", halt: true, reason: \"hitl-rejected\" as const };\n }\n if (decisionStatus === \"timed-out\") {\n return { nodeStatus: \"hitl-timeout\", halt: true, reason: \"hitl-timeout\" as const };\n }\n\n return undefined;\n }\n\n private formatNodeLabel(args: {\n definition?: Readonly<{ id: NodeId; name?: string; type: unknown }>;\n nodeId: NodeId;\n }): string {\n const tokenName = typeof args.definition?.type === \"function\" ? args.definition.type.name : \"Node\";\n return args.definition?.name\n ? `\"${args.definition.name}\" (${tokenName}:${args.nodeId})`\n : `${tokenName}:${args.nodeId}`;\n }\n\n private formatOutputCounts(outputs: NodeOutputs): string {\n const entries = Object.entries(outputs ?? {});\n if (entries.length === 0) {\n return \"no outputs\";\n }\n return entries.map(([port, items]) => `${port}=${items?.length ?? 0}`).join(\", \");\n }\n}\n","import type {\n ExecutionFrontierPlan,\n InputPortKey,\n Items,\n NodeId,\n NodeOutputs,\n OutputPortKey,\n RunCurrentState,\n PersistedMutableNodeState,\n RunQueueEntry,\n RunStateResetRequest,\n RunStopCondition,\n ConnectionInvocationRecord,\n} from \"../types\";\n\nimport { ConnectionNodeIdFactory } from \"../workflow/definition/ConnectionNodeIdFactory\";\nimport { WorkflowTopology } from \"./WorkflowTopologyPlanner\";\n\nexport class CurrentStateFrontierPlanner {\n constructor(private readonly topology: WorkflowTopology) {}\n\n /** Composition-root-friendly factory (avoids `new` at orchestration call sites under ESLint manual-DI rules). */\n static createFromTopology(topology: WorkflowTopology): CurrentStateFrontierPlanner {\n return new CurrentStateFrontierPlanner(topology);\n }\n\n plan(args: {\n currentState?: RunCurrentState;\n stopCondition?: RunStopCondition;\n reset?: RunStateResetRequest;\n items?: Items;\n }): ExecutionFrontierPlan {\n const stopCondition = args.stopCondition ?? { kind: \"workflowCompleted\" as const };\n const baseState = this.cloneCurrentState(args.currentState);\n const normalizedState = this.overlayPinnedOutputs(baseState);\n const resetResult = this.applyReset({ currentState: normalizedState, reset: args.reset });\n const requiredNodeIds = this.collectRequiredNodeIds(stopCondition, resetResult.currentState);\n const satisfiedNodeIds = this.collectSatisfiedNodeIds(resetResult.currentState);\n const skippedNodeIds = [\n ...new Set([\n ...[...requiredNodeIds].filter((nodeId) => this.isNodeSatisfied(resetResult.currentState, nodeId)),\n ...resetResult.preservedPinnedNodeIds.filter((nodeId) => requiredNodeIds.has(nodeId)),\n ]),\n ];\n const frontierNodeIds = this.collectFrontierNodeIds(requiredNodeIds, resetResult.currentState);\n const rootNodeIds = frontierNodeIds.filter(\n (nodeId) => (this.topology.incomingByNode.get(nodeId) ?? []).length === 0,\n );\n\n if (rootNodeIds.length > 1) {\n throw new Error(`Ambiguous execution frontier. Multiple root nodes require input: ${rootNodeIds.join(\", \")}`);\n }\n\n if (frontierNodeIds.length === 0) {\n return {\n queue: [],\n currentState: resetResult.currentState,\n stopCondition,\n satisfiedNodeIds,\n skippedNodeIds,\n clearedNodeIds: resetResult.clearedNodeIds,\n preservedPinnedNodeIds: resetResult.preservedPinnedNodeIds,\n };\n }\n\n if (rootNodeIds.length === 1) {\n const rootNodeId = rootNodeIds[0]!;\n const definition = this.topology.defsById.get(rootNodeId);\n if (!definition) {\n throw new Error(`Unknown frontier nodeId: ${rootNodeId}`);\n }\n return {\n rootNodeId,\n rootNodeInput: this.resolveRootNodeInput({ nodeKind: definition.kind, items: args.items }),\n queue: [],\n currentState: resetResult.currentState,\n stopCondition,\n satisfiedNodeIds,\n skippedNodeIds,\n clearedNodeIds: resetResult.clearedNodeIds,\n preservedPinnedNodeIds: resetResult.preservedPinnedNodeIds,\n };\n }\n\n const queue: RunQueueEntry[] = [];\n for (const nodeId of frontierNodeIds) {\n queue.push(...this.buildFrontierQueue(nodeId, resetResult.currentState));\n }\n\n return {\n queue,\n currentState: resetResult.currentState,\n stopCondition,\n satisfiedNodeIds,\n skippedNodeIds,\n clearedNodeIds: resetResult.clearedNodeIds,\n preservedPinnedNodeIds: resetResult.preservedPinnedNodeIds,\n };\n }\n\n private cloneCurrentState(currentState: RunCurrentState | undefined): RunCurrentState {\n if (!currentState) {\n return {\n outputsByNode: {},\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n mutableState: undefined,\n };\n }\n return {\n outputsByNode: { ...currentState.outputsByNode },\n nodeSnapshotsByNodeId: { ...currentState.nodeSnapshotsByNodeId },\n connectionInvocations: currentState.connectionInvocations ? [...currentState.connectionInvocations] : undefined,\n mutableState: currentState.mutableState,\n };\n }\n\n private overlayPinnedOutputs(currentState: RunCurrentState): RunCurrentState {\n const outputsByNode: Record<NodeId, NodeOutputs> = { ...currentState.outputsByNode };\n for (const [nodeId, nodeState] of Object.entries(currentState.mutableState?.nodesById ?? {}) as Array<\n [NodeId, PersistedMutableNodeState]\n >) {\n const pinnedOutputs = nodeState.pinnedOutputsByPort;\n if (!pinnedOutputs) {\n continue;\n }\n outputsByNode[nodeId] = pinnedOutputs;\n }\n return {\n outputsByNode,\n nodeSnapshotsByNodeId: { ...currentState.nodeSnapshotsByNodeId },\n connectionInvocations: currentState.connectionInvocations,\n mutableState: currentState.mutableState,\n };\n }\n\n private applyReset(args: { currentState: RunCurrentState; reset?: RunStateResetRequest }): Readonly<{\n currentState: RunCurrentState;\n clearedNodeIds: ReadonlyArray<NodeId>;\n preservedPinnedNodeIds: ReadonlyArray<NodeId>;\n }> {\n if (!args.reset) {\n return {\n currentState: args.currentState,\n clearedNodeIds: [],\n preservedPinnedNodeIds: [],\n };\n }\n\n const outputsByNode: Record<NodeId, NodeOutputs> = { ...args.currentState.outputsByNode };\n const nodeSnapshotsByNodeId = { ...args.currentState.nodeSnapshotsByNodeId };\n const clearedNodeIds: NodeId[] = [];\n const preservedPinnedNodeIds: NodeId[] = [];\n const descendants = this.collectDescendants(args.reset.clearFromNodeId);\n const runtimeDescendants = this.collectRuntimeDescendants(args.currentState, descendants);\n const clearedIdSet = new Set<NodeId>([...descendants, ...runtimeDescendants]);\n\n for (const nodeId of [...descendants, ...runtimeDescendants]) {\n const pinnedOutputs = this.getPinnedOutputs(args.currentState, nodeId);\n if (pinnedOutputs) {\n outputsByNode[nodeId] = pinnedOutputs;\n delete nodeSnapshotsByNodeId[nodeId];\n preservedPinnedNodeIds.push(nodeId);\n continue;\n }\n delete outputsByNode[nodeId];\n delete nodeSnapshotsByNodeId[nodeId];\n clearedNodeIds.push(nodeId);\n }\n\n return {\n currentState: {\n outputsByNode,\n nodeSnapshotsByNodeId,\n connectionInvocations: this.filterConnectionInvocations(args.currentState.connectionInvocations, clearedIdSet),\n mutableState: args.currentState.mutableState,\n },\n clearedNodeIds,\n preservedPinnedNodeIds,\n };\n }\n\n private collectSatisfiedNodeIds(currentState: RunCurrentState): ReadonlyArray<NodeId> {\n const satisfiedNodeIds: NodeId[] = [];\n for (const nodeId of this.topology.defsById.keys()) {\n if (this.isNodeSatisfied(currentState, nodeId)) {\n satisfiedNodeIds.push(nodeId);\n }\n }\n return satisfiedNodeIds;\n }\n\n private collectFrontierNodeIds(\n requiredNodeIds: ReadonlySet<NodeId>,\n currentState: RunCurrentState,\n ): ReadonlyArray<NodeId> {\n const frontierNodeIds: NodeId[] = [];\n for (const nodeId of this.topology.defsById.keys()) {\n if (!requiredNodeIds.has(nodeId) || this.isNodeSatisfied(currentState, nodeId)) {\n continue;\n }\n const incomingEdges = this.topology.incomingByNode.get(nodeId) ?? [];\n const isFrontier = incomingEdges.every((edge) => this.isEdgeSatisfied(currentState, nodeId, edge.collectKey));\n if (isFrontier) {\n frontierNodeIds.push(nodeId);\n }\n }\n return frontierNodeIds;\n }\n\n private collectRequiredNodeIds(stopCondition: RunStopCondition, currentState: RunCurrentState): ReadonlySet<NodeId> {\n const requiredNodeIds = new Set<NodeId>();\n if (stopCondition.kind === \"workflowCompleted\") {\n for (const nodeId of this.topology.defsById.keys()) {\n if (!this.isNodeSatisfied(currentState, nodeId)) {\n this.collectRequiredNode(requiredNodeIds, currentState, nodeId);\n }\n }\n return requiredNodeIds;\n }\n if (!this.topology.defsById.has(stopCondition.nodeId)) {\n throw new Error(`Unknown stop nodeId: ${stopCondition.nodeId}`);\n }\n this.collectRequiredNode(requiredNodeIds, currentState, stopCondition.nodeId);\n return requiredNodeIds;\n }\n\n private collectRequiredNode(requiredNodeIds: Set<NodeId>, currentState: RunCurrentState, nodeId: NodeId): void {\n if (requiredNodeIds.has(nodeId)) {\n return;\n }\n if (this.isNodeSatisfied(currentState, nodeId) && !this.isNodeSatisfiedByOutputsOnly(currentState, nodeId)) {\n return;\n }\n requiredNodeIds.add(nodeId);\n for (const edge of this.topology.incomingByNode.get(nodeId) ?? []) {\n if (\n !this.isEdgeSatisfied(currentState, nodeId, edge.collectKey) ||\n this.isNodeSatisfiedByOutputsOnly(currentState, edge.from.nodeId)\n ) {\n this.collectRequiredNode(requiredNodeIds, currentState, edge.from.nodeId);\n }\n }\n }\n\n private buildFrontierQueue(nodeId: NodeId, currentState: RunCurrentState): ReadonlyArray<RunQueueEntry> {\n const incomingEdges = this.topology.incomingByNode.get(nodeId) ?? [];\n if (incomingEdges.length === 0) {\n return [];\n }\n const expectedInputs = this.topology.expectedInputsByNode.get(nodeId) ?? [];\n const usesCollect = this.usesCollect(nodeId);\n if (usesCollect) {\n const received: Record<InputPortKey, Items> = {};\n for (const input of expectedInputs) {\n received[input] = this.resolveInput(currentState, nodeId, input);\n }\n return [\n {\n nodeId,\n input: [],\n batchId: \"batch_1\",\n collect: {\n expectedInputs,\n received,\n },\n },\n ];\n }\n const input = expectedInputs[0] ?? \"in\";\n const incomingEdge = incomingEdges.find((edge) => edge.collectKey === input);\n return [\n {\n nodeId,\n input: this.resolveInput(currentState, nodeId, input),\n toInput: input,\n batchId: \"batch_1\",\n from: incomingEdge?.from,\n },\n ];\n }\n\n private resolveRootNodeInput(args: { nodeKind: \"node\" | \"trigger\"; items?: Items }): Items {\n if (args.items) {\n return args.items;\n }\n if (args.nodeKind === \"trigger\") {\n return [];\n }\n return [{ json: {} }];\n }\n\n private isNodeSatisfied(currentState: RunCurrentState, nodeId: NodeId): boolean {\n return this.hasOutputs(currentState, nodeId) || this.hasCompletedSnapshot(currentState, nodeId);\n }\n\n private isNodeSatisfiedByOutputsOnly(currentState: RunCurrentState, nodeId: NodeId): boolean {\n return this.hasOutputs(currentState, nodeId) && !this.hasCompletedSnapshot(currentState, nodeId);\n }\n\n private isEdgeSatisfied(currentState: RunCurrentState, nodeId: NodeId, collectKey: InputPortKey): boolean {\n const incomingEdge = (this.topology.incomingByNode.get(nodeId) ?? []).find(\n (edge) => edge.collectKey === collectKey,\n );\n if (!incomingEdge) {\n return false;\n }\n const fromNodeId = incomingEdge.from.nodeId;\n if (!this.isNodeSatisfied(currentState, fromNodeId)) {\n return false;\n }\n if (this.usesCollect(nodeId)) {\n return true;\n }\n const items = this.resolveOutputItems(currentState, fromNodeId, incomingEdge.from.output);\n if (items.length > 0) {\n return true;\n }\n return this.shouldContinueAfterEmptyOutputFromSource(fromNodeId);\n }\n\n private resolveInput(currentState: RunCurrentState, nodeId: NodeId, collectKey: InputPortKey): Items {\n const incomingEdge = (this.topology.incomingByNode.get(nodeId) ?? []).find(\n (edge) => edge.collectKey === collectKey,\n );\n if (!incomingEdge) {\n return [];\n }\n return this.resolveOutputItems(currentState, incomingEdge.from.nodeId, incomingEdge.from.output);\n }\n\n private hasOutputs(currentState: RunCurrentState, nodeId: NodeId): boolean {\n return Object.prototype.hasOwnProperty.call(currentState.outputsByNode, nodeId);\n }\n\n private hasCompletedSnapshot(currentState: RunCurrentState, nodeId: NodeId): boolean {\n const snapshot = currentState.nodeSnapshotsByNodeId[nodeId];\n return snapshot?.status === \"completed\" || snapshot?.status === \"skipped\";\n }\n\n private resolveOutputItems(currentState: RunCurrentState, nodeId: NodeId, output: OutputPortKey): Items {\n return currentState.outputsByNode[nodeId]?.[output] ?? [];\n }\n\n private usesCollect(nodeId: NodeId): boolean {\n const expectedInputs = this.topology.expectedInputsByNode.get(nodeId) ?? [];\n if (expectedInputs.length !== 1 || expectedInputs[0] !== \"in\") {\n return true;\n }\n return (this.topology.incomingByNode.get(nodeId) ?? []).length > 1;\n }\n\n private shouldContinueAfterEmptyOutputFromSource(nodeId: NodeId): boolean {\n const definition = this.topology.defsById.get(nodeId);\n if (!definition) {\n return false;\n }\n return definition.config.continueWhenEmptyOutput === true;\n }\n\n private getPinnedOutputs(currentState: RunCurrentState, nodeId: NodeId): NodeOutputs | undefined {\n return currentState.mutableState?.nodesById?.[nodeId]?.pinnedOutputsByPort;\n }\n\n private filterConnectionInvocations(\n invocations: ReadonlyArray<ConnectionInvocationRecord> | undefined,\n clearedIdSet: ReadonlySet<NodeId>,\n ): ReadonlyArray<ConnectionInvocationRecord> | undefined {\n if (!invocations || invocations.length === 0) {\n return invocations;\n }\n const kept = invocations.filter(\n (invocation) => !clearedIdSet.has(invocation.parentAgentNodeId) && !clearedIdSet.has(invocation.connectionNodeId),\n );\n return kept.length === invocations.length ? invocations : kept;\n }\n\n private collectDescendants(startNodeId: NodeId): ReadonlyArray<NodeId> {\n const pendingNodeIds: NodeId[] = [startNodeId];\n const descendants = new Set<NodeId>();\n while (pendingNodeIds.length > 0) {\n const nodeId = pendingNodeIds.pop();\n if (!nodeId || descendants.has(nodeId)) {\n continue;\n }\n descendants.add(nodeId);\n for (const edge of this.topology.outgoingByNode.get(nodeId) ?? []) {\n pendingNodeIds.push(edge.to.nodeId);\n }\n }\n return [...descendants];\n }\n\n private collectRuntimeDescendants(\n currentState: RunCurrentState,\n descendantNodeIds: ReadonlyArray<NodeId>,\n ): ReadonlyArray<NodeId> {\n const descendantSet = new Set(descendantNodeIds);\n const runtimeNodeIds = new Set<NodeId>();\n for (const nodeId of [\n ...Object.keys(currentState.outputsByNode),\n ...Object.keys(currentState.nodeSnapshotsByNodeId),\n ...Object.keys(currentState.mutableState?.nodesById ?? {}),\n ] as NodeId[]) {\n if (this.isRuntimeDescendant(nodeId, descendantSet)) {\n runtimeNodeIds.add(nodeId);\n }\n }\n return [...runtimeNodeIds];\n }\n\n private isRuntimeDescendant(nodeId: NodeId, descendantNodeIds: ReadonlySet<NodeId>): boolean {\n for (const descendantNodeId of descendantNodeIds) {\n if (nodeId === descendantNodeId) {\n return false;\n }\n if (ConnectionNodeIdFactory.isConnectionOwnedDescendantOf(descendantNodeId, nodeId)) {\n return true;\n }\n }\n return false;\n }\n}\n","import type {\n PersistedRunPolicySnapshot,\n WorkflowDefinition,\n WorkflowPolicyRuntimeDefaults,\n WorkflowStoragePolicyMode,\n} from \"../../types\";\n\nexport class RunPolicySnapshotFactory {\n static create(workflow: WorkflowDefinition, defaults?: WorkflowPolicyRuntimeDefaults): PersistedRunPolicySnapshot {\n const prune = workflow.prunePolicy;\n const retentionSeconds = prune?.runDataRetentionSeconds ?? defaults?.retentionSeconds;\n const binaryRetentionSeconds = prune?.binaryRetentionSeconds ?? defaults?.binaryRetentionSeconds;\n const telemetrySpanRetentionSeconds =\n prune?.telemetrySpanRetentionSeconds ?? defaults?.telemetrySpanRetentionSeconds;\n const telemetryArtifactRetentionSeconds =\n prune?.telemetryArtifactRetentionSeconds ?? defaults?.telemetryArtifactRetentionSeconds;\n const telemetryMetricRetentionSeconds =\n prune?.telemetryMetricRetentionSeconds ?? defaults?.telemetryMetricRetentionSeconds;\n const storagePolicy: WorkflowStoragePolicyMode =\n typeof workflow.storagePolicy === \"string\"\n ? (workflow.storagePolicy as WorkflowStoragePolicyMode)\n : (defaults?.storagePolicy ?? \"ALL\");\n return {\n retentionSeconds,\n binaryRetentionSeconds,\n telemetrySpanRetentionSeconds,\n telemetryArtifactRetentionSeconds,\n telemetryMetricRetentionSeconds,\n storagePolicy,\n };\n }\n}\n","import type {\n CurrentStateExecutionRequest,\n ExecutionContextFactory,\n ExecutionFrontierPlan,\n Items,\n NodeExecutionSnapshot,\n NodeId,\n NodeOutputs,\n ParentExecutionRef,\n PersistedRunControlState,\n RunCurrentState,\n RunDataFactory,\n RunExecutionOptions,\n RunId,\n RunIdFactory,\n RunQueueEntry,\n RunResult,\n WorkflowExecutionRepository,\n WorkflowDefinition,\n WorkflowId,\n WorkflowPolicyRuntimeDefaults,\n WorkflowSnapshotFactory,\n} from \"../types\";\n\nimport { WorkflowExecutableNodeClassifierFactory } from \"../workflow/definition/WorkflowExecutableNodeClassifierFactory\";\nimport { CurrentStateFrontierPlanner } from \"../planning/CurrentStateFrontierPlanner\";\nimport { RunQueuePlanner } from \"../planning/RunQueuePlanner\";\nimport { WorkflowTopology } from \"../planning/WorkflowTopologyPlanner\";\nimport { EngineExecutionLimitsPolicy } from \"../policies/executionLimits/EngineExecutionLimitsPolicy\";\nimport { EngineWorkflowPlanningFactory } from \"../planning/EngineWorkflowPlanningFactory\";\nimport type { EngineWaiters } from \"../orchestration/EngineWaiters\";\nimport { RunPolicySnapshotFactory } from \"../policies/storage/RunPolicySnapshotFactory\";\n\nimport { ActivationEnqueueService } from \"../execution/ActivationEnqueueService\";\nimport { NodeRunStateWriterFactory } from \"../execution/NodeRunStateWriterFactory\";\nimport { NodeActivationRequestComposer } from \"../execution/NodeActivationRequestComposer\";\nimport { NodeExecutionSnapshotFactory } from \"../execution/NodeExecutionSnapshotFactory\";\nimport { NodeInstantiationError } from \"../execution/NodeInstantiationError\";\nimport { PersistedRunStateTerminalBuilder } from \"../execution/PersistedRunStateTerminalBuilder\";\nimport { RunStateSemantics } from \"../execution/RunStateSemantics\";\nimport { WorkflowRunExecutionContextFactory } from \"../execution/WorkflowRunExecutionContextFactory\";\nimport { NodeEventPublisher } from \"../events/NodeEventPublisher\";\n\nexport class RunStartService {\n constructor(\n private readonly runIdFactory: RunIdFactory,\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n private readonly runDataFactory: RunDataFactory,\n private readonly workflowSnapshotFactory: WorkflowSnapshotFactory,\n private readonly planningFactory: EngineWorkflowPlanningFactory,\n private readonly nodeStatePublisherFactory: NodeRunStateWriterFactory,\n private readonly runExecutionContextFactory: WorkflowRunExecutionContextFactory,\n private readonly nodeActivationRequestComposer: NodeActivationRequestComposer,\n private readonly activationEnqueueService: ActivationEnqueueService,\n private readonly semantics: RunStateSemantics,\n private readonly waiters: EngineWaiters,\n private readonly workflowPolicyRuntimeDefaults: WorkflowPolicyRuntimeDefaults | undefined,\n private readonly executionLimitsPolicy: EngineExecutionLimitsPolicy,\n private readonly nodeEventPublisher: NodeEventPublisher,\n private readonly persistedRunStateTerminalBuilder: PersistedRunStateTerminalBuilder,\n ) {}\n\n async runWorkflow(\n workflow: WorkflowDefinition,\n startAt: NodeId,\n items: Items,\n parent?: ParentExecutionRef,\n executionOptions?: RunExecutionOptions,\n persistedStateOverrides?: Readonly<{\n workflowSnapshot?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n mutableState?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"];\n }>,\n ): Promise<RunResult> {\n const runId = this.runIdFactory.makeRunId();\n const startedAt = new Date().toISOString();\n const workflowSnapshot = persistedStateOverrides?.workflowSnapshot ?? this.workflowSnapshotFactory.create(workflow);\n const mutableState = persistedStateOverrides?.mutableState;\n const policySnapshot = RunPolicySnapshotFactory.create(workflow, this.workflowPolicyRuntimeDefaults);\n const mergedExecutionOptions = this.executionLimitsPolicy.mergeExecutionOptionsForNewRun(parent, executionOptions);\n\n await this.workflowExecutionRepository.createRun({\n runId,\n workflowId: workflow.id,\n startedAt,\n parent,\n executionOptions: mergedExecutionOptions,\n workflowSnapshot,\n mutableState,\n policySnapshot,\n engineCounters: { completedNodeActivations: 0 },\n });\n\n const data = this.runDataFactory.create();\n const base = this.runExecutionContextFactory.create({\n runId,\n workflowId: workflow.id,\n nodeId: startAt,\n parent,\n policySnapshot,\n subworkflowDepth: mergedExecutionOptions.subworkflowDepth ?? 0,\n engineMaxNodeActivations: mergedExecutionOptions.maxNodeActivations!,\n engineMaxSubworkflowDepth: mergedExecutionOptions.maxSubworkflowDepth!,\n data,\n nodeState: this.nodeStatePublisherFactory.create(runId, workflow.id, parent),\n testContext: mergedExecutionOptions.testContext,\n });\n let planning: Readonly<ReturnType<EngineWorkflowPlanningFactory[\"create\"]>>;\n try {\n planning = this.planningFactory.create(workflow);\n } catch (err) {\n if (err instanceof NodeInstantiationError) {\n return await this.failRunDuringPlanning({\n runId,\n workflowId: workflow.id,\n startedAt,\n parent,\n executionOptions: mergedExecutionOptions,\n control: undefined,\n workflowSnapshot,\n mutableState,\n policySnapshot,\n err,\n });\n }\n throw err;\n }\n const { topology, planner } = planning;\n const startDefinition = topology.defsById.get(startAt);\n if (!startDefinition) {\n throw new Error(`Unknown start nodeId: ${startAt}`);\n }\n\n const initialNodeSnapshotsByNodeId: Record<NodeId, NodeExecutionSnapshot> = {};\n if (startDefinition.kind === \"trigger\") {\n const request = this.nodeActivationRequestComposer.createSingleFromDefinition({\n runId,\n workflowId: workflow.id,\n definition: startDefinition,\n parent,\n executionOptions: mergedExecutionOptions,\n batchId: \"batch_1\",\n input: items,\n base,\n data,\n });\n return await this.activationEnqueueService.enqueueActivation({\n runId,\n workflowId: workflow.id,\n startedAt,\n parent,\n executionOptions: mergedExecutionOptions,\n workflowSnapshot,\n mutableState,\n policySnapshot,\n control: undefined,\n pendingQueue: [],\n request,\n previousNodeSnapshotsByNodeId: initialNodeSnapshotsByNodeId,\n planner,\n engineCounters: { completedNodeActivations: 0 },\n connectionInvocations: [],\n });\n }\n\n const queue: RunQueueEntry[] = [{ nodeId: startAt, input: items, toInput: \"in\", batchId: \"batch_1\" }];\n return await this.scheduleQueuedPlan({\n runId,\n workflowId: workflow.id,\n startedAt,\n parent,\n executionOptions: mergedExecutionOptions,\n control: undefined,\n workflowSnapshot,\n mutableState,\n policySnapshot,\n workflow,\n planner,\n queue,\n base,\n data,\n nodeSnapshotsByNodeId: initialNodeSnapshotsByNodeId,\n connectionInvocations: [],\n });\n }\n\n async runWorkflowFromState(request: CurrentStateExecutionRequest): Promise<RunResult> {\n const runId = this.runIdFactory.makeRunId();\n const startedAt = new Date().toISOString();\n const workflowSnapshot = request.workflowSnapshot ?? this.workflowSnapshotFactory.create(request.workflow);\n const mutableState = request.mutableState ?? request.currentState?.mutableState;\n const policySnapshot = RunPolicySnapshotFactory.create(request.workflow, this.workflowPolicyRuntimeDefaults);\n const control = {\n stopCondition: request.stopCondition ?? { kind: \"workflowCompleted\" as const },\n };\n const mergedExecutionOptions = this.executionLimitsPolicy.mergeExecutionOptionsForNewRun(\n request.parent,\n request.executionOptions,\n );\n\n await this.workflowExecutionRepository.createRun({\n runId,\n workflowId: request.workflow.id,\n startedAt,\n parent: request.parent,\n executionOptions: mergedExecutionOptions,\n control,\n workflowSnapshot,\n mutableState,\n policySnapshot,\n engineCounters: { completedNodeActivations: 0 },\n });\n\n let planningFromState: Readonly<ReturnType<EngineWorkflowPlanningFactory[\"create\"]>>;\n try {\n planningFromState = this.planningFactory.create(request.workflow);\n } catch (err) {\n if (err instanceof NodeInstantiationError) {\n return await this.failRunDuringPlanning({\n runId,\n workflowId: request.workflow.id,\n startedAt,\n parent: request.parent,\n executionOptions: mergedExecutionOptions,\n control,\n workflowSnapshot,\n mutableState,\n policySnapshot,\n err,\n });\n }\n throw err;\n }\n const { topology, planner } = planningFromState;\n const plan = CurrentStateFrontierPlanner.createFromTopology(topology).plan({\n currentState: this.createRunCurrentState(request.currentState, mutableState),\n stopCondition: control.stopCondition,\n reset: request.reset,\n items: request.items,\n });\n\n const data = this.runDataFactory.create(plan.currentState.outputsByNode);\n const base = this.runExecutionContextFactory.create({\n runId,\n workflowId: request.workflow.id,\n nodeId:\n WorkflowExecutableNodeClassifierFactory.create(request.workflow).firstExecutableNodeIdInDefinitionOrder(\n request.workflow,\n ) ?? \"unknown_node\",\n parent: request.parent,\n policySnapshot,\n subworkflowDepth: mergedExecutionOptions.subworkflowDepth ?? 0,\n engineMaxNodeActivations: mergedExecutionOptions.maxNodeActivations!,\n engineMaxSubworkflowDepth: mergedExecutionOptions.maxSubworkflowDepth!,\n data,\n nodeState: this.nodeStatePublisherFactory.create(runId, request.workflow.id, request.parent),\n testContext: mergedExecutionOptions.testContext,\n });\n\n return await this.scheduleInitialPlan({\n runId,\n startedAt,\n workflow: request.workflow,\n workflowSnapshot,\n mutableState,\n policySnapshot,\n executionOptions: mergedExecutionOptions,\n control,\n parent: request.parent,\n planner,\n plan,\n base,\n data,\n });\n }\n\n private createRunCurrentState(\n currentState: RunCurrentState | undefined,\n mutableState: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"],\n ): RunCurrentState {\n // Each `ConnectionInvocationRecord` represents a single, auditable LLM/tool call\n // that must belong to exactly one run. Reruns start from a fresh invocation\n // ledger so the new run only records what it actually invokes. The prior run's\n // invocations remain queryable on that run's persisted state (their true owner).\n // Carrying them over here would write duplicate `ExecutionInstance` rows whose\n // primary key (`invocationId`) already exists under the previous run, causing a\n // `Unique constraint failed on the fields: (instance_id)` violation on first save.\n return {\n outputsByNode: { ...(currentState?.outputsByNode ?? {}) },\n nodeSnapshotsByNodeId: { ...(currentState?.nodeSnapshotsByNodeId ?? {}) },\n connectionInvocations: [],\n mutableState: mutableState ?? currentState?.mutableState,\n };\n }\n\n private async scheduleInitialPlan(args: {\n runId: RunId;\n startedAt: string;\n workflow: WorkflowDefinition;\n workflowSnapshot: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n mutableState: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"];\n policySnapshot: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"policySnapshot\"];\n executionOptions?: RunExecutionOptions;\n control: PersistedRunControlState | undefined;\n parent?: ParentExecutionRef;\n planner: RunQueuePlanner;\n plan: ExecutionFrontierPlan;\n base: ReturnType<ExecutionContextFactory[\"create\"]>;\n data: ReturnType<RunDataFactory[\"create\"]>;\n }): Promise<RunResult> {\n const initialNodeSnapshotsByNodeId = this.semantics.applySkippedSnapshots({\n runId: args.runId,\n workflowId: args.workflow.id,\n parent: args.parent,\n currentState: args.plan.currentState,\n skippedNodeIds: args.plan.skippedNodeIds,\n preservedPinnedNodeIds: args.plan.preservedPinnedNodeIds,\n finishedAt: args.startedAt,\n });\n\n if (args.plan.rootNodeId) {\n const startDef = WorkflowTopology.fromWorkflow(args.workflow).defsById.get(args.plan.rootNodeId);\n if (!startDef) {\n throw new Error(`Unknown frontier nodeId: ${args.plan.rootNodeId}`);\n }\n const startItems = args.plan.rootNodeInput ?? [];\n const request = this.nodeActivationRequestComposer.createSingleFromDefinition({\n runId: args.runId,\n workflowId: args.workflow.id,\n definition: startDef,\n parent: args.parent,\n executionOptions: args.executionOptions,\n batchId: \"batch_1\",\n input: startItems,\n base: args.base,\n data: args.data,\n });\n return await this.activationEnqueueService.enqueueActivation({\n runId: args.runId,\n workflowId: args.workflow.id,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n pendingQueue: [],\n request,\n previousNodeSnapshotsByNodeId: initialNodeSnapshotsByNodeId,\n planner: args.planner,\n engineCounters: { completedNodeActivations: 0 },\n connectionInvocations: args.plan.currentState.connectionInvocations ?? [],\n });\n }\n\n return await this.scheduleQueuedPlan({\n runId: args.runId,\n workflowId: args.workflow.id,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n workflow: args.workflow,\n planner: args.planner,\n queue: [...args.plan.queue],\n base: args.base,\n data: args.data,\n nodeSnapshotsByNodeId: initialNodeSnapshotsByNodeId,\n connectionInvocations: args.plan.currentState.connectionInvocations ?? [],\n });\n }\n\n private async scheduleQueuedPlan(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: RunExecutionOptions;\n control: PersistedRunControlState | undefined;\n workflowSnapshot: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n mutableState: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"];\n policySnapshot: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"policySnapshot\"];\n workflow: WorkflowDefinition;\n planner: RunQueuePlanner;\n queue: RunQueueEntry[];\n base: ReturnType<ExecutionContextFactory[\"create\"]>;\n data: ReturnType<RunDataFactory[\"create\"]>;\n nodeSnapshotsByNodeId: Record<NodeId, NodeExecutionSnapshot>;\n connectionInvocations: RunCurrentState[\"connectionInvocations\"];\n }): Promise<RunResult> {\n this.semantics.applyPinnedQueueSkips({\n runId: args.runId,\n workflowId: args.workflowId,\n parent: args.parent,\n mutableState: args.mutableState,\n planner: args.planner,\n queue: args.queue,\n data: args.data,\n nodeSnapshotsByNodeId: args.nodeSnapshotsByNodeId,\n finishedAt: args.startedAt,\n });\n const next = args.planner.nextActivation(args.queue);\n if (!next) {\n return await this.completeRun({\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n workflow: args.workflow,\n data: args.data,\n nodeSnapshotsByNodeId: args.nodeSnapshotsByNodeId,\n connectionInvocations: args.connectionInvocations,\n });\n }\n\n const definition = WorkflowTopology.fromWorkflow(args.workflow).defsById.get(next.nodeId);\n if (!definition || definition.kind !== \"node\") {\n throw new Error(`Node ${next.nodeId} is not a runnable node`);\n }\n\n const request = this.nodeActivationRequestComposer.createFromPlannedActivation({\n next,\n base: args.base,\n data: args.data,\n runId: args.runId,\n workflowId: args.workflowId,\n parent: args.parent,\n executionOptions: args.executionOptions,\n nodeDefinition: definition,\n });\n\n return await this.activationEnqueueService.enqueueActivation({\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n pendingQueue: args.queue,\n request,\n previousNodeSnapshotsByNodeId: args.nodeSnapshotsByNodeId,\n planner: args.planner,\n engineCounters: { completedNodeActivations: 0 },\n connectionInvocations: args.connectionInvocations ?? [],\n });\n }\n\n private async completeRun(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: RunExecutionOptions;\n control: PersistedRunControlState | undefined;\n workflowSnapshot: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n mutableState: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"];\n policySnapshot: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"policySnapshot\"];\n workflow: WorkflowDefinition;\n data: ReturnType<RunDataFactory[\"create\"]>;\n nodeSnapshotsByNodeId: Record<NodeId, NodeExecutionSnapshot>;\n connectionInvocations: RunCurrentState[\"connectionInvocations\"];\n }): Promise<RunResult> {\n await this.workflowExecutionRepository.save({\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n engineCounters: { completedNodeActivations: 0 },\n connectionInvocations: args.connectionInvocations ? [...args.connectionInvocations] : [],\n status: \"completed\",\n pending: undefined,\n queue: [],\n outputsByNode: args.data.dump(),\n nodeSnapshotsByNodeId: args.nodeSnapshotsByNodeId,\n });\n const result: RunResult = {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n status: \"completed\",\n outputs: this.semantics.resolveResultOutputs(\n args.workflow,\n args.control?.stopCondition,\n args.data.dump() as Record<NodeId, NodeOutputs>,\n ),\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n\n private async failRunDuringPlanning(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: RunExecutionOptions;\n control?: PersistedRunControlState;\n workflowSnapshot: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n mutableState: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"];\n policySnapshot: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"policySnapshot\"];\n err: NodeInstantiationError;\n }): Promise<RunResult> {\n const finishedAt = new Date().toISOString();\n const failedSnapshot = NodeExecutionSnapshotFactory.failed({\n previous: undefined,\n runId: args.runId,\n workflowId: args.workflowId,\n nodeId: args.err.nodeId,\n activationId: \"planning_failure\",\n parent: args.parent,\n finishedAt,\n inputsByPort: {},\n error: args.err,\n });\n const failedState = this.persistedRunStateTerminalBuilder.mergeTerminal({\n state: {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n engineCounters: { completedNodeActivations: 0 },\n status: \"pending\",\n pending: undefined,\n queue: [],\n outputsByNode: {},\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n },\n engineCounters: { completedNodeActivations: 0 },\n status: \"failed\",\n queue: [],\n outputsByNode: {},\n nodeSnapshotsByNodeId: { [args.err.nodeId]: failedSnapshot },\n finishedAtIso: finishedAt,\n });\n await this.workflowExecutionRepository.save(failedState);\n await this.nodeEventPublisher.publish(\"nodeFailed\", failedSnapshot);\n\n const result: RunResult = {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n status: \"failed\",\n error: { message: args.err.message },\n };\n this.waiters.resolveRunCompletion(result);\n return result;\n }\n}\n","import type {\n ExecutionMode,\n NodeConfigBase,\n NodeId,\n NodeOffloadPolicy,\n NodeSchedulerDecision,\n WorkflowId,\n} from \"../types\";\nexport class ConfigDrivenOffloadPolicy implements NodeOffloadPolicy {\n private readonly defaultMode: ExecutionMode;\n\n constructor(defaultMode: ExecutionMode = \"worker\") {\n this.defaultMode = defaultMode;\n }\n\n decide(args: { workflowId: WorkflowId; nodeId: NodeId; config: NodeConfigBase }): NodeSchedulerDecision {\n const hint = args.config.execution?.hint;\n const queue = args.config.execution?.queue;\n\n if (hint === \"local\") return { mode: \"local\" };\n if (hint === \"worker\") return { mode: \"worker\", queue };\n\n // If a queue is specified, treat it as an implicit worker hint.\n if (queue) return { mode: \"worker\", queue };\n\n return { mode: this.defaultMode };\n }\n}\n","import type {\n NodeActivationContinuation,\n PreparedNodeActivationDispatch,\n NodeActivationReceipt,\n NodeActivationRequest,\n NodeActivationScheduler,\n NodeExecutionRequest,\n NodeExecutionScheduler,\n NodeOffloadPolicy,\n} from \"../types\";\nimport { InlineDrivingScheduler } from \"./InlineDrivingScheduler\";\n\ntype SchedulerSelection = Readonly<{\n mode: NodeActivationReceipt[\"mode\"];\n queue?: string;\n decision: \"runIntentOverride\" | \"nodePolicy\" | \"containerDefault\";\n}>;\n\nexport class DefaultDrivingScheduler implements NodeActivationScheduler {\n constructor(\n private readonly offloadPolicy: NodeOffloadPolicy,\n private readonly workerScheduler: NodeExecutionScheduler,\n private readonly inline: InlineDrivingScheduler,\n ) {}\n\n setContinuation(continuation: NodeActivationContinuation): void {\n this.inline.setContinuation(continuation);\n }\n\n async prepareDispatch(request: NodeActivationRequest): Promise<PreparedNodeActivationDispatch> {\n const selection = await this.selectScheduler(request);\n if (selection.mode === \"worker\") {\n if (request.kind === \"multi\") {\n throw new Error(`Multi-input node ${request.nodeId} cannot be scheduled to worker (insert local placement)`);\n }\n\n const workerRequest: NodeExecutionRequest = {\n runId: request.runId,\n activationId: request.activationId,\n workflowId: request.workflowId,\n nodeId: request.nodeId,\n input: request.input,\n parent: request.parent,\n queue: selection.queue,\n executionOptions: request.executionOptions,\n };\n\n return {\n receipt: {\n receiptId: request.activationId,\n mode: \"worker\",\n queue: selection.queue,\n },\n dispatch: async () => {\n await this.workerScheduler.enqueue(workerRequest);\n },\n };\n }\n\n return await this.prepareInlineDispatch(request);\n }\n\n /**\n * Scheduler precedence is explicit:\n * 1. run-intent override (`executionOptions.localOnly`)\n * 2. node-level execution hint / queue policy\n * 3. container-default scheduler policy fallback\n */\n private async selectScheduler(request: NodeActivationRequest): Promise<SchedulerSelection> {\n if (request.executionOptions?.localOnly) {\n return {\n mode: \"local\",\n decision: \"runIntentOverride\",\n };\n }\n\n const decision = this.offloadPolicy.decide({\n workflowId: request.workflowId,\n nodeId: request.nodeId,\n config: request.ctx.config,\n });\n if (this.hasNodeSchedulingPreference(request)) {\n return {\n mode: decision.mode,\n queue: decision.queue,\n decision: \"nodePolicy\",\n };\n }\n\n return {\n mode: decision.mode,\n queue: decision.queue,\n decision: \"containerDefault\",\n };\n }\n\n private hasNodeSchedulingPreference(request: NodeActivationRequest): boolean {\n return request.ctx.config.execution?.hint !== undefined || request.ctx.config.execution?.queue !== undefined;\n }\n\n private async prepareInlineDispatch(request: NodeActivationRequest): Promise<PreparedNodeActivationDispatch> {\n const prepared = await this.inline.prepareDispatch(request);\n return {\n receipt: { ...prepared.receipt, mode: \"local\" },\n dispatch: async () => {\n await prepared.dispatch();\n },\n };\n }\n}\n","import type { NodeConfigBase, NodeId, NodeOffloadPolicy, NodeSchedulerDecision, WorkflowId } from \"../types\";\n\nexport class HintOnlyOffloadPolicy implements NodeOffloadPolicy {\n decide(args: { workflowId: WorkflowId; nodeId: NodeId; config: NodeConfigBase }): NodeSchedulerDecision {\n const hint = args.config.execution?.hint;\n if (hint === \"worker\") return { mode: \"worker\", queue: args.config.execution?.queue };\n return { mode: \"local\" };\n }\n}\n","import type {\n NodeActivationContinuation,\n PreparedNodeActivationDispatch,\n NodeActivationReceipt,\n NodeActivationRequest,\n NodeActivationScheduler,\n} from \"../types\";\nimport { NodeExecutor } from \"../execution/NodeExecutor\";\n\nexport class InlineDrivingScheduler implements NodeActivationScheduler {\n private continuation: NodeActivationContinuation | undefined;\n private readonly drainingRuns = new Set<string>();\n private readonly queuesByRunId = new Map<\n string,\n Array<Readonly<{ request: NodeActivationRequest; receipt: NodeActivationReceipt }>>\n >();\n private readonly scheduledRuns = new Set<string>();\n\n constructor(private readonly nodeExecutor: NodeExecutor) {}\n\n setContinuation(continuation: NodeActivationContinuation): void {\n this.continuation = continuation;\n }\n\n async prepareDispatch(request: NodeActivationRequest): Promise<PreparedNodeActivationDispatch> {\n const receipt: NodeActivationReceipt = { receiptId: request.activationId, mode: \"local\" };\n return {\n receipt,\n dispatch: async () => {\n const queue = this.queuesByRunId.get(request.runId) ?? [];\n queue.push({ request, receipt });\n this.queuesByRunId.set(request.runId, queue);\n this.scheduleDrain(request.runId);\n },\n };\n }\n\n private async drainRun(runId: string): Promise<void> {\n if (this.drainingRuns.has(runId)) return;\n this.drainingRuns.add(runId);\n this.scheduledRuns.delete(runId);\n try {\n const q = this.queuesByRunId.get(runId) ?? [];\n // Process exactly one activation per drain so the event loop gets a full cycle\n // (poll phase → I/O) between activations. Synchronous SQLite writes otherwise\n // block HTTP responses and WS frames for the entire run duration.\n if (q.length === 0) return;\n const next = q.shift()!;\n const { request } = next;\n\n const cont = this.continuation;\n if (!cont) throw new Error(\"InlineDrivingScheduler is missing a continuation (setContinuation was not called)\");\n\n await cont.markNodeRunning({\n runId: request.runId,\n activationId: request.activationId,\n nodeId: request.nodeId,\n inputsByPort: request.kind === \"multi\" ? request.inputsByPort : { in: request.input },\n });\n\n let outputs;\n try {\n outputs = await this.nodeExecutor.execute(request);\n } catch (e) {\n await this.resumeAfterExecutionError(cont, request, this.asError(e));\n return;\n }\n\n await this.resumeAfterExecutionResult(cont, request, outputs ?? {});\n } finally {\n if ((this.queuesByRunId.get(runId)?.length ?? 0) === 0) this.queuesByRunId.delete(runId);\n this.drainingRuns.delete(runId);\n if ((this.queuesByRunId.get(runId)?.length ?? 0) > 0) {\n this.scheduleDrain(runId);\n }\n }\n }\n\n private scheduleDrain(runId: string): void {\n if (this.drainingRuns.has(runId) || this.scheduledRuns.has(runId)) {\n return;\n }\n this.scheduledRuns.add(runId);\n // Use setImmediate so the activation fires in the check phase (after poll/I/O),\n // giving queued HTTP writes and WS frames a chance to flush between activations.\n setImmediate(() => {\n this.scheduledRuns.delete(runId);\n void this.drainRun(runId);\n });\n }\n\n private async resumeAfterExecutionResult(\n continuation: NodeActivationContinuation,\n request: NodeActivationRequest,\n outputs: unknown,\n ): Promise<void> {\n try {\n await continuation.resumeFromNodeResult({\n runId: request.runId,\n activationId: request.activationId,\n nodeId: request.nodeId,\n outputs: outputs as any,\n });\n } catch (e) {\n this.rethrowUnlessIgnorableContinuationError(e);\n }\n }\n\n private async resumeAfterExecutionError(\n continuation: NodeActivationContinuation,\n request: NodeActivationRequest,\n error: Error,\n ): Promise<void> {\n try {\n await continuation.resumeFromNodeError({\n runId: request.runId,\n activationId: request.activationId,\n nodeId: request.nodeId,\n error,\n });\n } catch (e) {\n this.rethrowUnlessIgnorableContinuationError(e);\n }\n }\n\n private asError(e: unknown): Error {\n return e instanceof Error ? e : new Error(String(e));\n }\n\n private rethrowUnlessIgnorableContinuationError(e: unknown): void {\n if (this.isIgnorableContinuationError(e)) {\n return;\n }\n throw this.asError(e);\n }\n\n private isIgnorableContinuationError(e: unknown): boolean {\n const message = this.asError(e).message;\n return (\n message.includes(\" is not pending\") ||\n message.includes(\"activationId mismatch\") ||\n message.includes(\"nodeId mismatch\")\n );\n }\n}\n","import type { NodeExecutionRequest, NodeExecutionScheduler } from \"../types\";\n\nexport class LocalOnlyScheduler implements NodeExecutionScheduler {\n async enqueue(_request: NodeExecutionRequest): Promise<{ receiptId: string }> {\n throw new Error(\"No worker scheduler configured\");\n }\n}\n","import type { ParentExecutionRef, RunExecutionOptions } from \"../../types\";\n\nexport interface EngineExecutionLimitsPolicyConfig {\n readonly defaultMaxNodeActivations: number;\n readonly hardMaxNodeActivations: number;\n readonly defaultMaxSubworkflowDepth: number;\n readonly hardMaxSubworkflowDepth: number;\n}\n\n/** Framework defaults for {@link EngineExecutionLimitsPolicy} (merged with host `runtime.engineExecutionLimits`). */\nexport const ENGINE_EXECUTION_LIMITS_DEFAULTS: EngineExecutionLimitsPolicyConfig = {\n defaultMaxNodeActivations: 100_000,\n hardMaxNodeActivations: 100_000,\n defaultMaxSubworkflowDepth: 32,\n hardMaxSubworkflowDepth: 32,\n};\n\n/**\n * Resolves per-run execution limits: defaults, hard ceilings, and subworkflow depth for new runs.\n */\nexport class EngineExecutionLimitsPolicy {\n constructor(private readonly config: EngineExecutionLimitsPolicyConfig = ENGINE_EXECUTION_LIMITS_DEFAULTS) {}\n\n /**\n * Effective options for a new root run (depth 0): defaults merged with engine ceilings.\n * Replaces a separate one-method factory for root-run bootstrap.\n */\n createRootExecutionOptions(): RunExecutionOptions {\n return this.mergeExecutionOptionsForNewRun(undefined, undefined);\n }\n\n mergeExecutionOptionsForNewRun(\n parent: ParentExecutionRef | undefined,\n user: RunExecutionOptions | undefined,\n ): RunExecutionOptions {\n const subworkflowDepth = parent === undefined ? 0 : (parent.subworkflowDepth ?? 0) + 1;\n const inheritedMaxNode = parent?.engineMaxNodeActivations;\n const inheritedMaxSub = parent?.engineMaxSubworkflowDepth;\n const maxNodeActivations = this.capNumber(\n user?.maxNodeActivations ?? inheritedMaxNode,\n this.config.defaultMaxNodeActivations,\n this.config.hardMaxNodeActivations,\n );\n const maxSubworkflowDepth = this.capNumber(\n user?.maxSubworkflowDepth ?? inheritedMaxSub,\n this.config.defaultMaxSubworkflowDepth,\n this.config.hardMaxSubworkflowDepth,\n );\n if (subworkflowDepth > maxSubworkflowDepth) {\n throw new Error(\n `Subworkflow nesting depth ${subworkflowDepth} exceeds maxSubworkflowDepth ${maxSubworkflowDepth} (run would be a child of parent run).`,\n );\n }\n return {\n ...user,\n subworkflowDepth,\n maxNodeActivations,\n maxSubworkflowDepth,\n };\n }\n\n private capNumber(requested: number | undefined, defaultValue: number, hardCeiling: number): number {\n const base = requested === undefined ? defaultValue : requested;\n return Math.min(base, hardCeiling);\n }\n}\n","import type { PersistedRunState, WorkflowDefinition, WorkflowExecutionRepository } from \"../../types\";\n\nimport { WorkflowStoragePolicyEvaluator } from \"./WorkflowStoragePolicyEvaluator\";\n\nexport class RunTerminalPersistenceCoordinator {\n constructor(\n private readonly runRepository: WorkflowExecutionRepository,\n private readonly storageEvaluator: WorkflowStoragePolicyEvaluator,\n ) {}\n\n async maybeDeleteAfterTerminalState(args: {\n workflow: WorkflowDefinition;\n state: PersistedRunState;\n finalStatus: \"completed\" | \"failed\";\n finishedAt: string;\n }): Promise<void> {\n const persist = await this.storageEvaluator.shouldPersist(args.workflow, args.state.policySnapshot, {\n runId: args.state.runId,\n workflowId: args.state.workflowId,\n workflow: args.workflow,\n finalStatus: args.finalStatus,\n startedAt: args.state.startedAt,\n finishedAt: args.finishedAt,\n });\n if (persist) return;\n if (!this.runRepository.deleteRun) return;\n await this.runRepository.deleteRun(args.state.runId);\n }\n}\n","import type { TypeToken } from \"../di\";\nimport type {\n NodeErrorHandler,\n NodeErrorHandlerSpec,\n NodeResolver,\n WorkflowErrorHandler,\n WorkflowErrorHandlerSpec,\n} from \"../types\";\n\nexport class WorkflowPolicyErrorServices {\n constructor(private readonly nodeResolver: NodeResolver) {}\n\n resolveNodeErrorHandler(spec: NodeErrorHandlerSpec | undefined): NodeErrorHandler | undefined {\n if (!spec) return undefined;\n if (\n typeof spec === \"object\" &&\n spec !== null &&\n \"handle\" in spec &&\n typeof (spec as NodeErrorHandler).handle === \"function\"\n ) {\n return spec as NodeErrorHandler;\n }\n return this.nodeResolver.resolve(spec as TypeToken<NodeErrorHandler>);\n }\n\n resolveWorkflowErrorHandler(spec: WorkflowErrorHandlerSpec | undefined): WorkflowErrorHandler | undefined {\n if (!spec) return undefined;\n if (\n typeof spec === \"object\" &&\n spec !== null &&\n \"onError\" in spec &&\n typeof (spec as WorkflowErrorHandler).onError === \"function\"\n ) {\n return spec as WorkflowErrorHandler;\n }\n return this.nodeResolver.resolve(spec as TypeToken<WorkflowErrorHandler>);\n }\n}\n","import type { TypeToken } from \"../../di\";\nimport type {\n NodeResolver,\n PersistedRunPolicySnapshot,\n WorkflowDefinition,\n WorkflowStoragePolicyDecisionArgs,\n WorkflowStoragePolicyMode,\n WorkflowStoragePolicyResolver,\n} from \"../../types\";\n\nexport class WorkflowStoragePolicyEvaluator {\n constructor(private readonly nodeResolver: NodeResolver) {}\n\n async shouldPersist(\n workflow: WorkflowDefinition,\n snapshot: PersistedRunPolicySnapshot | undefined,\n args: WorkflowStoragePolicyDecisionArgs,\n ): Promise<boolean> {\n const spec = workflow.storagePolicy;\n if (spec === undefined) {\n return this.modeMatches(snapshot?.storagePolicy ?? \"ALL\", args);\n }\n if (typeof spec === \"string\") {\n return this.modeMatches(spec as WorkflowStoragePolicyMode, args);\n }\n const resolver = this.nodeResolver.resolve(\n spec as TypeToken<WorkflowStoragePolicyResolver>,\n ) as WorkflowStoragePolicyResolver;\n return Boolean(await resolver.shouldPersist(args));\n }\n\n private modeMatches(mode: WorkflowStoragePolicyMode, args: WorkflowStoragePolicyDecisionArgs): boolean {\n if (mode === \"ALL\") return true;\n if (mode === \"NEVER\") return false;\n if (mode === \"SUCCESS\") return args.finalStatus === \"completed\";\n if (mode === \"ERROR\") return args.finalStatus === \"failed\";\n return true;\n }\n}\n","import { ReadableStream } from \"node:stream/web\";\n\nimport type { BinaryBody } from \"../types\";\n\nexport class BinaryBodyBufferReader {\n async read(body: BinaryBody): Promise<Uint8Array> {\n if (body instanceof Uint8Array) {\n return body;\n }\n if (body instanceof ArrayBuffer) {\n return new Uint8Array(body);\n }\n if (body instanceof ReadableStream) {\n return await this.readReadableStream(body);\n }\n return await this.readAsyncIterable(body);\n }\n\n private async readReadableStream(body: ReadableStream<Uint8Array>): Promise<Uint8Array> {\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let totalSize = 0;\n try {\n while (true) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n chunks.push(result.value);\n totalSize += result.value.byteLength;\n }\n } finally {\n reader.releaseLock();\n }\n return this.joinChunks(chunks, totalSize);\n }\n\n private async readAsyncIterable(body: AsyncIterable<Uint8Array>): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n let totalSize = 0;\n for await (const chunk of body) {\n chunks.push(chunk);\n totalSize += chunk.byteLength;\n }\n return this.joinChunks(chunks, totalSize);\n }\n\n private joinChunks(chunks: ReadonlyArray<Uint8Array>, totalSize: number): Uint8Array {\n const bytes = new Uint8Array(totalSize);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n }\n}\n","import { ReadableStream } from \"node:stream/web\";\n\nexport class BinaryBodyReadableStreamFactory {\n constructor(private readonly bytes: Uint8Array) {}\n\n create(): ReadableStream<Uint8Array> {\n const value = this.bytes;\n let consumed = false;\n return new ReadableStream<Uint8Array>({\n pull(controller) {\n if (consumed) {\n controller.close();\n return;\n }\n consumed = true;\n controller.enqueue(value);\n controller.close();\n },\n });\n }\n}\n","import { createHash } from \"node:crypto\";\n\nimport type {\n BinaryBody,\n BinaryStorage,\n BinaryStorageReadResult,\n BinaryStorageStatResult,\n BinaryStorageWriteResult,\n} from \"../types\";\n\nimport { BinaryBodyBufferReader } from \"./BinaryBodyBufferReader\";\nimport { BinaryBodyReadableStreamFactory } from \"./BinaryBodyReadableStreamFactory\";\n\nexport class InMemoryBinaryStorage implements BinaryStorage {\n readonly driverName = \"memory\";\n private readonly values = new Map<string, Uint8Array>();\n\n async write(args: { storageKey: string; body: BinaryBody }): Promise<BinaryStorageWriteResult> {\n const bytes = await new BinaryBodyBufferReader().read(args.body);\n this.values.set(args.storageKey, bytes);\n return {\n storageKey: args.storageKey,\n size: bytes.byteLength,\n sha256: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n };\n }\n\n async openReadStream(storageKey: string): Promise<BinaryStorageReadResult | undefined> {\n const bytes = this.values.get(storageKey);\n if (!bytes) {\n return undefined;\n }\n return {\n body: new BinaryBodyReadableStreamFactory(bytes).create(),\n size: bytes.byteLength,\n };\n }\n\n async stat(storageKey: string): Promise<BinaryStorageStatResult> {\n const bytes = this.values.get(storageKey);\n if (!bytes) {\n return { exists: false };\n }\n return { exists: true, size: bytes.byteLength };\n }\n\n async delete(storageKey: string): Promise<void> {\n this.values.delete(storageKey);\n }\n\n async deleteMany(storageKeys: ReadonlyArray<string>): Promise<void> {\n for (const key of storageKeys) {\n this.values.delete(key);\n }\n }\n\n async listByPrefix(prefix: string): Promise<ReadonlyArray<string>> {\n return Array.from(this.values.keys()).filter((key) => key.startsWith(prefix));\n }\n}\n\nexport { BinaryBodyBufferReader } from \"./BinaryBodyBufferReader\";\nexport { BinaryBodyReadableStreamFactory } from \"./BinaryBodyReadableStreamFactory\";\n","import type { Items, MutableRunData, NodeId, NodeIdRef, NodeOutputs, OutputPortKey, Item } from \"../types\";\n\nexport class InMemoryRunData implements MutableRunData {\n private readonly byNode = new Map<NodeId, NodeOutputs>();\n\n constructor(initial?: Record<NodeId, NodeOutputs>) {\n if (initial) {\n for (const [nodeId, outputs] of Object.entries(initial)) this.byNode.set(nodeId, outputs);\n }\n }\n\n setOutputs(nodeId: NodeId, outputs: NodeOutputs): void {\n this.byNode.set(nodeId, outputs);\n }\n\n getOutputs(nodeId: NodeId): NodeOutputs | undefined {\n return this.byNode.get(nodeId);\n }\n\n getOutputItems<TJson = unknown>(nodeId: NodeId | NodeIdRef<TJson>, output: OutputPortKey = \"main\"): Items<TJson> {\n return (this.byNode.get(nodeId)?.[output] ?? []) as Items<TJson>;\n }\n\n getOutputItem<TJson = unknown>(\n nodeId: NodeId | NodeIdRef<TJson>,\n itemIndex: number,\n output: OutputPortKey = \"main\",\n ): Item<TJson> | undefined {\n return this.getOutputItems<TJson>(nodeId, output)[itemIndex];\n }\n\n dump(): Record<NodeId, NodeOutputs> {\n const out: Record<NodeId, NodeOutputs> = {};\n for (const [nodeId, outputs] of this.byNode.entries()) out[nodeId] = outputs;\n return out;\n }\n}\n","import type { MutableRunData, NodeId, NodeOutputs, RunDataFactory } from \"../types\";\nimport { InMemoryRunData } from \"./InMemoryRunData\";\n\nexport class InMemoryRunDataFactory implements RunDataFactory {\n create(initial?: Record<NodeId, NodeOutputs>): MutableRunData {\n return new InMemoryRunData(initial);\n }\n}\n","/**\n * Merges processed-ID windows for polling triggers, capping the total to avoid unbounded growth.\n * Plugin code receives an instance of this class via {@link PollingTriggerHandle.dedup}.\n */\nexport class PollingTriggerDedupWindow {\n static readonly defaultCapN = 2000;\n\n merge(\n previous: ReadonlyArray<string>,\n incoming: ReadonlyArray<string>,\n capN: number = PollingTriggerDedupWindow.defaultCapN,\n ): ReadonlyArray<string> {\n const merged = new Set(previous);\n for (const id of incoming) {\n merged.add(id);\n }\n const result = [...merged];\n if (result.length <= capN) {\n return result;\n }\n return result.slice(result.length - capN);\n }\n}\n","import type { Items, TriggerInstanceId, TriggerSetupStateRepository } from \"../../types\";\nimport type { PollingTriggerLogger } from \"./PollingTriggerLogger\";\n\nexport interface PollingRunCycleArgs<TState> {\n previousState: TState | undefined;\n signal: AbortSignal;\n}\n\nexport interface PollingRunCycleResult<TState, TItem> {\n items: Items<TItem>;\n nextState: TState;\n}\n\nexport interface PollingTriggerStartArgs<TState, TItem> {\n trigger: TriggerInstanceId;\n intervalMs: number;\n seedState?: TState;\n runCycle: (cycleCtx: PollingRunCycleArgs<TState>) => Promise<PollingRunCycleResult<TState, TItem>>;\n emit: (items: Items) => Promise<void>;\n}\n\n/**\n * Generic polling-trigger runtime. Owns the set-interval loop, overlap guard, and persistence.\n * Constructed by {@link import(\"../../runtime/EngineFactory\").EngineFactory} and exposed to plugin\n * authors via {@link import(\"../../contracts/runtimeTypes\").TriggerSetupContext}.polling.\n */\nexport class PollingTriggerRuntime {\n private readonly activeTriggers = new Set<string>();\n private readonly intervalsByTrigger = new Map<string, ReturnType<typeof setInterval>>();\n private readonly busyTriggers = new Set<string>();\n\n constructor(\n private readonly triggerSetupStateRepository: TriggerSetupStateRepository,\n private readonly logger: PollingTriggerLogger,\n ) {}\n\n async start<TState, TItem>(args: PollingTriggerStartArgs<TState, TItem>): Promise<TState | undefined> {\n let first: TState | undefined;\n try {\n first = await this.runCycle(args, { seedState: args.seedState });\n } catch (err: unknown) {\n this.logError(`Polling trigger initial cycle failed for ${this.describe(args.trigger)}`, err);\n }\n this.ensureLoop(args);\n return first;\n }\n\n async stop(trigger: TriggerInstanceId): Promise<void> {\n const key = this.toKey(trigger);\n const interval = this.intervalsByTrigger.get(key);\n if (interval !== undefined) {\n clearInterval(interval);\n this.intervalsByTrigger.delete(key);\n }\n this.busyTriggers.delete(key);\n this.activeTriggers.delete(key);\n this.logger.debug(`Polling trigger stopped for ${this.describe(trigger)}`);\n }\n\n private ensureLoop<TState, TItem>(args: PollingTriggerStartArgs<TState, TItem>): void {\n const key = this.toKey(args.trigger);\n if (this.activeTriggers.has(key)) {\n this.logger.debug(`Polling trigger already active for ${this.describe(args.trigger)}`);\n return;\n }\n this.activeTriggers.add(key);\n const intervalMs = Math.max(args.intervalMs, 25);\n const interval = setInterval(() => {\n void this.runCycle(args, { seedState: undefined }).catch((err: unknown) => {\n this.logError(`Polling trigger cycle failed for ${this.describe(args.trigger)}`, err);\n });\n }, intervalMs);\n this.intervalsByTrigger.set(key, interval);\n this.logger.info(`Polling trigger started for ${this.describe(args.trigger)} (interval ${intervalMs}ms)`);\n }\n\n private async runCycle<TState, TItem>(\n args: PollingTriggerStartArgs<TState, TItem>,\n opts: { seedState: TState | undefined },\n ): Promise<TState | undefined> {\n const key = this.toKey(args.trigger);\n if (this.busyTriggers.has(key)) {\n this.logger.debug(`Polling trigger skipping overlapping tick for ${this.describe(args.trigger)}`);\n return undefined;\n }\n this.busyTriggers.add(key);\n try {\n const loaded = await this.triggerSetupStateRepository.load(args.trigger);\n const previousState = loaded !== undefined ? (loaded.state as TState | undefined) : opts.seedState;\n const controller = new AbortController();\n const { items, nextState } = await args.runCycle({ previousState, signal: controller.signal });\n await this.triggerSetupStateRepository.save({\n trigger: args.trigger,\n updatedAt: new Date().toISOString(),\n state: nextState as never,\n });\n if (items.length > 0) {\n this.logger.info(`Polling trigger emitting ${items.length} item(s) for ${this.describe(args.trigger)}`);\n await args.emit(items);\n }\n return nextState;\n } finally {\n this.busyTriggers.delete(key);\n }\n }\n\n private toKey(trigger: TriggerInstanceId): string {\n return `${trigger.workflowId}:${trigger.nodeId}`;\n }\n\n private describe(trigger: TriggerInstanceId): string {\n return `${trigger.workflowId}.${trigger.nodeId}`;\n }\n\n private logError(message: string, error: unknown): void {\n if (error instanceof Error) {\n this.logger.error(message, error);\n return;\n }\n this.logger.error(`${message}: ${String(error)}`);\n }\n}\n","/**\n * Minimal logger surface for the polling-trigger runtime.\n * Hosts supply this via {@link EngineDeps.pollingTriggerLogger};\n * when absent the runtime is silent.\n */\nexport interface PollingTriggerLogger {\n info(message: string): void;\n warn(message: string): void;\n error(message: string, exception?: Error): void;\n debug(message: string): void;\n}\n\nexport class NoOpPollingTriggerLogger implements PollingTriggerLogger {\n info(): void {}\n warn(): void {}\n error(): void {}\n debug(): void {}\n}\n","import type {\n NodeActivationContinuation,\n NodeExecutor,\n NodeExecutionRequest,\n NodeExecutionRequestHandler,\n PersistedRunState,\n ResumeContext,\n RunDataFactory,\n WorkflowDefinition,\n WorkflowExecutionRepository,\n WorkflowSnapshotResolver,\n} from \"../types\";\nimport type { EngineExecutionLimitsPolicy } from \"../policies/executionLimits/EngineExecutionLimitsPolicy\";\nimport { RunSuspendedError } from \"../execution/RunSuspendedError\";\nimport { NodeActivationRequestComposer } from \"../execution/NodeActivationRequestComposer\";\nimport { NodeRunStateWriterFactory } from \"../execution/NodeRunStateWriterFactory\";\nimport { WorkflowRunExecutionContextFactory } from \"../execution/WorkflowRunExecutionContextFactory\";\n\ntype PersistedWorkflowLike = Readonly<{\n workflowId: PersistedRunState[\"workflowId\"];\n workflowSnapshot?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n}>;\n\nexport class NodeExecutionRequestHandlerService implements NodeExecutionRequestHandler {\n constructor(\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n private readonly workflowSnapshotResolver: WorkflowSnapshotResolver,\n private readonly runDataFactory: RunDataFactory,\n private readonly runExecutionContextFactory: WorkflowRunExecutionContextFactory,\n private readonly nodeStatePublisherFactory: NodeRunStateWriterFactory,\n private readonly nodeActivationRequestComposer: NodeActivationRequestComposer,\n private readonly nodeExecutor: NodeExecutor,\n private readonly continuation: NodeActivationContinuation,\n private readonly executionLimitsPolicy: EngineExecutionLimitsPolicy,\n ) {}\n\n async handleNodeExecutionRequest(request: NodeExecutionRequest): Promise<void> {\n const [state, schedulingState] = await Promise.all([\n this.workflowExecutionRepository.load(request.runId),\n this.workflowExecutionRepository.loadSchedulingState(request.runId),\n ]);\n if (!state) {\n throw new Error(`Unknown runId: ${request.runId}`);\n }\n if (state.workflowId !== request.workflowId) {\n throw new Error(`workflowId mismatch for run ${request.runId}: ${state.workflowId} vs ${request.workflowId}`);\n }\n const pendingExecution = schedulingState?.pending;\n if (state.status !== \"pending\" || !pendingExecution) {\n return;\n }\n if (pendingExecution.activationId !== request.activationId || pendingExecution.nodeId !== request.nodeId) {\n return;\n }\n\n const workflow = this.resolvePersistedWorkflow(state);\n if (!workflow) {\n throw new Error(`Unknown workflowId: ${state.workflowId}`);\n }\n const definition = workflow.nodes.find((node) => node.id === request.nodeId);\n if (!definition) {\n throw new Error(`Unknown nodeId: ${request.nodeId}`);\n }\n if (definition.kind !== \"node\") {\n throw new Error(`Node ${request.nodeId} is not runnable`);\n }\n\n const resolvedParent = request.parent ?? state.parent;\n const data = this.runDataFactory.create(state.outputsByNode);\n const limits = this.resolveEngineLimitsFromState(state);\n const base = this.runExecutionContextFactory.create({\n runId: state.runId,\n workflowId: state.workflowId,\n nodeId: request.nodeId,\n parent: resolvedParent,\n policySnapshot: state.policySnapshot,\n subworkflowDepth: state.executionOptions?.subworkflowDepth ?? 0,\n engineMaxNodeActivations: limits.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: limits.engineMaxSubworkflowDepth,\n data,\n nodeState: this.nodeStatePublisherFactory.create(state.runId, state.workflowId, resolvedParent),\n testContext: state.executionOptions?.testContext,\n });\n\n const inputsByPort = pendingExecution.inputsByPort;\n const portKeys = Object.keys(inputsByPort);\n const kind = portKeys.length === 1 && portKeys[0] === \"in\" ? (\"single\" as const) : (\"multi\" as const);\n const batchId = pendingExecution.batchId ?? \"batch_1\";\n // Splice resumeContext from pendingResume if this activation is a HITL resume.\n const pendingResume = state.pendingResume;\n const resumeContext: ResumeContext | undefined =\n pendingResume?.activationId === request.activationId && pendingResume?.nodeId === request.nodeId\n ? (pendingResume.resumeContext as ResumeContext)\n : undefined;\n const baseWithResume = resumeContext != null ? { ...base, resumeContext } : base;\n\n const activationRequest =\n kind === \"multi\"\n ? this.nodeActivationRequestComposer.createMultiFromDefinitionWithActivation({\n activationId: request.activationId,\n runId: request.runId,\n workflowId: request.workflowId,\n parent: resolvedParent,\n executionOptions: request.executionOptions ?? state.executionOptions,\n base: baseWithResume,\n data,\n definition: {\n id: definition.id,\n config: definition.config,\n },\n batchId,\n inputsByPort,\n })\n : this.nodeActivationRequestComposer.createSingleFromDefinitionWithActivation({\n activationId: request.activationId,\n runId: request.runId,\n workflowId: request.workflowId,\n parent: resolvedParent,\n executionOptions: request.executionOptions ?? state.executionOptions,\n base: baseWithResume,\n data,\n definition: {\n id: definition.id,\n config: definition.config,\n },\n batchId,\n input: inputsByPort.in ?? request.input ?? [],\n });\n\n // Clear pendingResume from state now that we have consumed it.\n if (resumeContext != null) {\n const clearedState = await this.workflowExecutionRepository.load(request.runId);\n if (clearedState?.pendingResume?.activationId === request.activationId) {\n await this.workflowExecutionRepository.save({ ...clearedState, pendingResume: undefined });\n }\n }\n\n await this.continuation.markNodeRunning({\n runId: activationRequest.runId,\n activationId: activationRequest.activationId,\n nodeId: activationRequest.nodeId,\n inputsByPort: pendingExecution.inputsByPort,\n });\n\n let outputs;\n try {\n outputs = await this.nodeExecutor.execute(activationRequest);\n } catch (error) {\n if (error instanceof RunSuspendedError) {\n // The node threw SuspensionRequest; NodeSuspensionHandler already persisted the\n // suspension entry and flipped status to \"suspended\". Nothing more to do here.\n return;\n }\n await this.resumeAfterExecutionError(activationRequest, this.asError(error));\n return;\n }\n\n await this.resumeAfterExecutionResult(activationRequest, outputs ?? {});\n }\n\n private resolvePersistedWorkflow(state: PersistedWorkflowLike): WorkflowDefinition | undefined {\n return this.workflowSnapshotResolver.resolve({\n workflowId: state.workflowId,\n workflowSnapshot: state.workflowSnapshot,\n });\n }\n\n private resolveEngineLimitsFromState(state: PersistedRunState): {\n engineMaxNodeActivations: number;\n engineMaxSubworkflowDepth: number;\n } {\n const fallback = this.executionLimitsPolicy.createRootExecutionOptions();\n return {\n engineMaxNodeActivations: state.executionOptions?.maxNodeActivations ?? fallback.maxNodeActivations!,\n engineMaxSubworkflowDepth: state.executionOptions?.maxSubworkflowDepth ?? fallback.maxSubworkflowDepth!,\n };\n }\n\n private async resumeAfterExecutionResult(\n request: Readonly<{ runId: string; activationId: string; nodeId: string }>,\n outputs: unknown,\n ): Promise<void> {\n try {\n await this.continuation.resumeFromNodeResult({\n runId: request.runId,\n activationId: request.activationId,\n nodeId: request.nodeId,\n outputs: outputs as never,\n });\n } catch (error) {\n this.rethrowUnlessIgnorableContinuationError(error);\n }\n }\n\n private async resumeAfterExecutionError(\n request: Readonly<{ runId: string; activationId: string; nodeId: string }>,\n error: Error,\n ): Promise<void> {\n try {\n await this.continuation.resumeFromNodeError({\n runId: request.runId,\n activationId: request.activationId,\n nodeId: request.nodeId,\n error,\n });\n } catch (continuationError) {\n this.rethrowUnlessIgnorableContinuationError(continuationError);\n }\n }\n\n private asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n }\n\n private rethrowUnlessIgnorableContinuationError(error: unknown): void {\n if (this.isIgnorableContinuationError(error)) {\n return;\n }\n throw this.asError(error);\n }\n\n private isIgnorableContinuationError(error: unknown): boolean {\n const message = this.asError(error).message;\n return (\n message.includes(\" is not pending\") ||\n message.includes(\"activationId mismatch\") ||\n message.includes(\"nodeId mismatch\")\n );\n }\n}\n","import type { InputPortKey, Items, NodeId, OutputPortKey, RunQueueEntry } from \"../types\";\n\nimport { WorkflowTopology } from \"./WorkflowTopologyPlanner\";\nimport type { TopologyOutgoingEdge } from \"./WorkflowTopologyPlanner\";\n\nexport type PlannedActivation =\n | Readonly<{ kind: \"single\"; nodeId: NodeId; input: Items; batchId: string }>\n | Readonly<{ kind: \"multi\"; nodeId: NodeId; inputsByPort: Readonly<Record<InputPortKey, Items>>; batchId: string }>;\n\nexport class RunQueuePlanner {\n constructor(\n private readonly topology: WorkflowTopology,\n private readonly nodeInstances: ReadonlyMap<NodeId, unknown>,\n ) {}\n\n validateNodeKinds(): void {\n for (const [toNodeId, inputs] of this.topology.expectedInputsByNode.entries()) {\n if (inputs.length <= 1) {\n const only = inputs[0];\n if (only && only !== \"in\") {\n const inst = this.nodeInstances.get(toNodeId);\n if (!this.isMultiInputNode(inst))\n throw new Error(`Node ${toNodeId} only supports input 'in' (got '${only}').`);\n }\n continue;\n }\n\n const inst = this.nodeInstances.get(toNodeId);\n if (!this.isMultiInputNode(inst) && !this.supportsEngineFanInMerge(inst)) {\n throw new Error(\n `Node ${toNodeId} has ${inputs.length} inbound edges but does not support multi-input execution.`,\n );\n }\n }\n }\n\n seedFromTrigger(args: { startNodeId: NodeId; items: Items; batchId: string }): RunQueueEntry[] {\n const queue: RunQueueEntry[] = [];\n for (const e of this.topology.outgoingByNode.get(args.startNodeId) ?? []) {\n if (e.output !== \"main\") continue;\n this.enqueueEdge(queue, {\n batchId: args.batchId,\n to: this.toEnqueueTarget(e),\n from: { nodeId: args.startNodeId, output: \"main\" },\n items: args.items,\n });\n }\n return queue;\n }\n\n applyOutputs(\n queue: RunQueueEntry[],\n args: { fromNodeId: NodeId; outputs: Record<string, Items | undefined>; batchId: string },\n ): void {\n for (const e of this.topology.outgoingByNode.get(args.fromNodeId) ?? []) {\n const outItems = (args.outputs as any)[e.output] ?? [];\n this.enqueueEdge(queue, {\n batchId: args.batchId,\n to: this.toEnqueueTarget(e),\n from: { nodeId: args.fromNodeId, output: e.output },\n items: outItems,\n });\n }\n }\n\n nextActivation(queue: RunQueueEntry[]): PlannedActivation | null {\n const readyCollect = this.resolveReadyCollect(queue);\n if (readyCollect) {\n return readyCollect;\n }\n\n const jobIdx = queue.findIndex((q) => !q.collect);\n if (jobIdx === -1) {\n if (queue.length === 0) return null;\n const sealedCollect = this.resolveSealedCollect(queue);\n if (sealedCollect) {\n return sealedCollect;\n }\n const stuck = queue[0]!;\n throw new Error(this.describeUnsatisfiedCollect(stuck));\n }\n\n const job = queue.splice(jobIdx, 1)[0]!;\n const def = this.topology.defsById.get(job.nodeId);\n if (!def || def.kind !== \"node\") return this.nextActivation(queue);\n return { kind: \"single\", nodeId: job.nodeId, input: job.input, batchId: job.batchId ?? \"batch_1\" };\n }\n\n sumItemsByPort(inputsByPort: Readonly<Record<InputPortKey, Items>>): number {\n let n = 0;\n for (const v of Object.values(inputsByPort)) n += v?.length ?? 0;\n return n;\n }\n\n private resolveReadyCollect(queue: RunQueueEntry[]): PlannedActivation | null {\n for (let i = 0; i < queue.length; i++) {\n const ready = this.tryDequeueCollect(queue, i);\n if (ready) {\n return ready;\n }\n }\n return null;\n }\n\n private resolveSealedCollect(queue: RunQueueEntry[]): PlannedActivation | null {\n for (let i = 0; i < queue.length; i++) {\n const queueEntry = queue[i]!;\n if (!queueEntry.collect) {\n continue;\n }\n const received = queueEntry.collect.received as Record<InputPortKey, Items>;\n if (Object.keys(received).length === 0) {\n continue;\n }\n this.fillMissingCollectInputs(queueEntry);\n const ready = this.tryDequeueCollect(queue, i);\n if (ready) {\n return ready;\n }\n }\n return null;\n }\n\n private tryDequeueCollect(queue: RunQueueEntry[], index: number): PlannedActivation | null {\n const queueEntry = queue[index]!;\n if (!queueEntry.collect) {\n return null;\n }\n const batchId = queueEntry.batchId ?? \"batch_1\";\n const expected = queueEntry.collect.expectedInputs ?? [];\n const received = queueEntry.collect.received as Record<InputPortKey, Items>;\n for (const input of expected) {\n if (!(input in received)) {\n return null;\n }\n }\n queue.splice(index, 1);\n return { kind: \"multi\", nodeId: queueEntry.nodeId, inputsByPort: received, batchId };\n }\n\n private fillMissingCollectInputs(queueEntry: RunQueueEntry): void {\n if (!queueEntry.collect) {\n return;\n }\n const received = queueEntry.collect.received as Record<InputPortKey, Items>;\n for (const input of queueEntry.collect.expectedInputs ?? []) {\n if (!(input in received)) {\n received[input] = [];\n }\n }\n }\n\n /**\n * Matches `CurrentStateFrontierPlanner.buildFrontierQueue`: anything that is not exactly one input\n * port named `in` participates in multi-port collect (Merge after `If` branches, etc.). Routing must\n * not depend solely on `nodeInstances.get(toNodeId)?.executeMulti`, or a Merge can be enqueued as a\n * single-input job and `NodeExecutor` will call `execute` on a multi-input-only implementation.\n */\n private usesTopologyCollectMerge(toNodeId: NodeId): boolean {\n const expectedInputs = this.topology.expectedInputsByNode.get(toNodeId) ?? [];\n if (expectedInputs.length !== 1 || expectedInputs[0] !== \"in\") {\n return true;\n }\n return (this.topology.incomingByNode.get(toNodeId) ?? []).length > 1;\n }\n\n private toEnqueueTarget(edge: TopologyOutgoingEdge): Readonly<{\n nodeId: NodeId;\n input: InputPortKey;\n collectKey: InputPortKey;\n }> {\n return edge.to;\n }\n\n private enqueueEdge(\n queue: RunQueueEntry[],\n args: Readonly<{\n batchId: string;\n to: { nodeId: NodeId; input: InputPortKey; collectKey: InputPortKey };\n from: { nodeId: NodeId; output: OutputPortKey };\n items: Items;\n }>,\n emptyPathSourceNodeId?: NodeId,\n ): void {\n const target = this.nodeInstances.get(args.to.nodeId);\n const isMulti = this.usesTopologyCollectMerge(args.to.nodeId) || this.isMultiInputNode(target);\n\n if (!isMulti) {\n if (args.items.length === 0) {\n const continueSourceNodeId = emptyPathSourceNodeId ?? args.from.nodeId;\n if (this.shouldContinueAfterEmptyOutputFromSource(continueSourceNodeId)) {\n queue.push({\n nodeId: args.to.nodeId,\n input: args.items,\n toInput: args.to.collectKey,\n batchId: args.batchId,\n from: args.from,\n });\n return;\n }\n const source = emptyPathSourceNodeId ?? args.from.nodeId;\n this.propagateEmptyPath(queue, args.to.nodeId, args.batchId, source);\n return;\n }\n queue.push({\n nodeId: args.to.nodeId,\n input: args.items,\n toInput: args.to.collectKey,\n batchId: args.batchId,\n from: args.from,\n });\n return;\n }\n\n const expected = this.topology.expectedInputsByNode.get(args.to.nodeId) ?? [];\n let collect = queue.find(\n (q) => q.nodeId === args.to.nodeId && (q.batchId ?? \"batch_1\") === args.batchId && !!q.collect,\n );\n if (!collect) {\n collect = {\n nodeId: args.to.nodeId,\n input: [],\n batchId: args.batchId,\n collect: { expectedInputs: expected, received: {} as Record<InputPortKey, Items> },\n };\n queue.push(collect);\n }\n\n const received = (collect.collect as any).received as Record<InputPortKey, Items>;\n received[args.to.collectKey] = args.items;\n }\n\n private shouldContinueAfterEmptyOutputFromSource(fromNodeId: NodeId): boolean {\n const def = this.topology.defsById.get(fromNodeId);\n if (!def) {\n return false;\n }\n return def.config.continueWhenEmptyOutput === true;\n }\n\n private propagateEmptyPath(\n queue: RunQueueEntry[],\n nodeId: NodeId,\n batchId: string,\n emptyPathSourceNodeId: NodeId,\n ): void {\n for (const edge of this.topology.outgoingByNode.get(nodeId) ?? []) {\n this.enqueueEdge(\n queue,\n {\n batchId,\n to: edge.to,\n from: { nodeId, output: edge.output },\n items: [],\n },\n emptyPathSourceNodeId,\n );\n }\n }\n\n private isMultiInputNode(n: unknown): boolean {\n return typeof (n as any)?.executeMulti === \"function\";\n }\n\n private hasRunnableExecute(n: unknown): boolean {\n return (\n typeof n === \"object\" &&\n n !== null &&\n (n as { kind?: string }).kind === \"node\" &&\n typeof (n as { execute?: unknown }).execute === \"function\"\n );\n }\n\n private supportsEngineFanInMerge(n: unknown): boolean {\n return this.hasRunnableExecute(n) && !this.isMultiInputNode(n);\n }\n\n private describeUnsatisfiedCollect(queueEntry: RunQueueEntry): string {\n const batchId = queueEntry.batchId ?? \"batch_1\";\n const expectedInputs = queueEntry.collect?.expectedInputs ?? [];\n const receivedInputs = Object.keys(\n (queueEntry.collect?.received ?? {}) as Record<InputPortKey, Items>,\n ) as InputPortKey[];\n const missingInputs = expectedInputs.filter((input) => !receivedInputs.includes(input));\n const mergeNodeLabel = this.formatNodeLabel(queueEntry.nodeId);\n const receivedSummary = this.describeReceivedInputs(queueEntry);\n const missingSummary = this.describeMissingInputs(queueEntry.nodeId, missingInputs);\n\n return [\n `Multi-input collect is stuck at ${mergeNodeLabel} (batchId=${batchId}).`,\n `Expected inputs: ${this.formatInputList(expectedInputs)}.`,\n `Received inputs: ${receivedSummary}.`,\n `Missing inputs: ${missingSummary}.`,\n ].join(\" \");\n }\n\n private describeReceivedInputs(queueEntry: RunQueueEntry): string {\n const received = (queueEntry.collect?.received ?? {}) as Record<InputPortKey, Items>;\n const receivedEntries = Object.entries(received);\n if (receivedEntries.length === 0) {\n return \"none\";\n }\n return receivedEntries\n .map(([input, items]) => `${input} (${items.length} item${items.length === 1 ? \"\" : \"s\"})`)\n .join(\", \");\n }\n\n private describeMissingInputs(nodeId: NodeId, missingInputs: ReadonlyArray<InputPortKey>): string {\n if (missingInputs.length === 0) {\n return \"none\";\n }\n return missingInputs\n .map((input) => {\n const sources = this.findSources(nodeId, input);\n if (sources.length === 0) {\n return input;\n }\n return `${input} from ${sources.join(\" or \")}`;\n })\n .join(\", \");\n }\n\n private findSources(nodeId: NodeId, input: InputPortKey): string[] {\n const matches: string[] = [];\n for (const [sourceNodeId, edges] of this.topology.outgoingByNode.entries()) {\n for (const edge of edges) {\n if (edge.to.nodeId === nodeId && edge.to.collectKey === input) {\n matches.push(this.formatNodeLabel(sourceNodeId));\n }\n }\n }\n return matches;\n }\n\n private formatInputList(inputs: ReadonlyArray<InputPortKey>): string {\n return inputs.length > 0 ? `[${inputs.join(\", \")}]` : \"[]\";\n }\n\n private formatNodeLabel(nodeId: NodeId): string {\n const definition = this.topology.defsById.get(nodeId);\n const instance = this.nodeInstances.get(nodeId);\n const typeName =\n definition?.type && typeof definition.type === \"function\"\n ? definition.type.name\n : instance && typeof instance === \"object\" && \"constructor\" in instance\n ? ((instance.constructor as { name?: string }).name ?? \"Node\")\n : \"Node\";\n return definition?.name ? `\"${definition.name}\" (${typeName}:${nodeId})` : `${typeName}:${nodeId}`;\n }\n}\n","import type { WorkflowDefinition, WorkflowNodeInstanceFactory } from \"../types\";\nimport { WorkflowExecutableNodeClassifierFactory } from \"../workflow/definition/WorkflowExecutableNodeClassifierFactory\";\n\nimport { RunQueuePlanner } from \"./RunQueuePlanner\";\nimport { WorkflowTopology } from \"./WorkflowTopologyPlanner\";\n\nexport class EngineWorkflowPlanningFactory {\n constructor(private readonly workflowNodeInstanceFactory: WorkflowNodeInstanceFactory) {}\n\n create(workflow: WorkflowDefinition): Readonly<{ topology: WorkflowTopology; planner: RunQueuePlanner }> {\n this.validateAcyclic(workflow);\n const topology = WorkflowTopology.fromWorkflow(workflow);\n const nodeInstances = this.workflowNodeInstanceFactory.createNodes(workflow);\n const planner = new RunQueuePlanner(topology, nodeInstances);\n planner.validateNodeKinds();\n return { topology, planner };\n }\n\n private validateAcyclic(workflow: WorkflowDefinition): void {\n const classifier = WorkflowExecutableNodeClassifierFactory.create(workflow);\n const outgoing = new Map<string, string[]>();\n const visitState = new Map<string, \"unvisited\" | \"visiting\" | \"done\">();\n\n for (const node of workflow.nodes) {\n if (classifier.isExecutableNodeId(node.id)) {\n visitState.set(node.id, \"unvisited\");\n }\n }\n\n for (const edge of workflow.edges) {\n if (!classifier.isExecutableNodeId(edge.from.nodeId) || !classifier.isExecutableNodeId(edge.to.nodeId)) {\n continue;\n }\n const destinations = outgoing.get(edge.from.nodeId) ?? [];\n destinations.push(edge.to.nodeId);\n outgoing.set(edge.from.nodeId, destinations);\n }\n\n for (const node of workflow.nodes) {\n if (classifier.isExecutableNodeId(node.id) && visitState.get(node.id) === \"unvisited\") {\n this.depthFirstSearch(node.id, outgoing, visitState);\n }\n }\n }\n\n private depthFirstSearch(\n nodeId: string,\n outgoing: ReadonlyMap<string, ReadonlyArray<string>>,\n visitState: Map<string, \"unvisited\" | \"visiting\" | \"done\">,\n ): void {\n visitState.set(nodeId, \"visiting\");\n for (const toNodeId of outgoing.get(nodeId) ?? []) {\n const state = visitState.get(toNodeId);\n if (state === \"visiting\") {\n throw new Error(`Workflow graph contains a directed cycle (edge ${nodeId} -> ${toNodeId}).`);\n }\n if (state === \"unvisited\") {\n this.depthFirstSearch(toNodeId, outgoing, visitState);\n }\n }\n visitState.set(nodeId, \"done\");\n }\n}\n","import type {\n ExecutionContextFactory,\n Items,\n JsonValue,\n NodeDefinition,\n NodeId,\n NodeResolver,\n RunDataFactory,\n RunIdFactory,\n TestableTriggerNode,\n TriggerCleanupHandle,\n TriggerInstanceId,\n TriggerNode,\n TriggerNodeConfig,\n TriggerSetupContext,\n TriggerSetupStateRepository,\n TriggerRuntimeDiagnostics,\n WorkflowActivationPolicy,\n WorkflowDefinition,\n WorkflowId,\n WorkflowRepository,\n} from \"../types\";\n\nimport { CredentialResolverFactory } from \"../execution/CredentialResolverFactory\";\nimport type { NodeRunStateWriterFactory } from \"../execution/NodeRunStateWriterFactory\";\nimport type { EngineExecutionLimitsPolicy } from \"../policies/executionLimits/EngineExecutionLimitsPolicy\";\nimport type { PollingTriggerRuntime } from \"../triggers/polling/PollingTriggerRuntime\";\nimport type { PollingTriggerDedupWindow } from \"../triggers/polling/PollingTriggerDedupWindow\";\nimport type { PollingTriggerHandle } from \"../contracts/runtimeTypes\";\n\nexport interface TriggerEmitHandler {\n emit(workflow: WorkflowDefinition, triggerNodeId: NodeId, items: Items): Promise<void>;\n}\n\nexport class TriggerRuntimeService {\n private readonly credentialResolverFactory: CredentialResolverFactory;\n private readonly triggerCleanupHandlesByKey = new Map<string, TriggerCleanupHandle[]>();\n\n constructor(\n private readonly workflowRepository: WorkflowRepository,\n private readonly workflowActivationPolicy: WorkflowActivationPolicy,\n private readonly runIdFactory: RunIdFactory,\n private readonly runDataFactory: RunDataFactory,\n private readonly executionContextFactory: ExecutionContextFactory,\n credentialResolverFactory: CredentialResolverFactory,\n private readonly nodeExecutionStatePublisherFactory: NodeRunStateWriterFactory,\n private readonly nodeResolver: NodeResolver,\n private readonly triggerSetupStateRepository: TriggerSetupStateRepository,\n private readonly emitHandler: TriggerEmitHandler,\n private readonly executionLimitsPolicy: EngineExecutionLimitsPolicy,\n private readonly diagnostics: TriggerRuntimeDiagnostics | undefined,\n private readonly pollingTriggerRuntime: PollingTriggerRuntime,\n private readonly pollingTriggerDedupWindow: PollingTriggerDedupWindow,\n ) {\n this.credentialResolverFactory = credentialResolverFactory;\n }\n\n async startTriggers(): Promise<void> {\n for (const wf of this.workflowRepository.list()) {\n if (!this.workflowActivationPolicy.isActive(wf.id)) {\n const summaries = this.formatTriggerSummaries(wf);\n if (summaries.length > 0) {\n this.logInfo(\n `Workflow \"${wf.name}\" (${wf.id}) is inactive; skipping trigger setup — ${summaries.join(\"; \")}.`,\n );\n }\n continue;\n }\n await this.startTriggersForWorkflow(wf);\n }\n }\n\n async syncWorkflowTriggersForActivation(workflowId: WorkflowId): Promise<void> {\n const wf = this.workflowRepository.get(workflowId);\n if (!wf) {\n return;\n }\n const summaries = this.formatTriggerSummaries(wf);\n if (summaries.length > 0) {\n this.logInfo(`Workflow \"${wf.name}\" (${wf.id}): stopping triggers — ${summaries.join(\"; \")}.`);\n }\n await this.stopTriggersForWorkflow(wf);\n if (this.workflowActivationPolicy.isActive(workflowId)) {\n if (summaries.length > 0) {\n this.logInfo(`Workflow \"${wf.name}\" (${wf.id}): activation on; starting triggers — ${summaries.join(\"; \")}.`);\n }\n await this.startTriggersForWorkflow(wf);\n } else {\n this.logInfo(`Workflow \"${wf.name}\" (${wf.id}): activation off; triggers not started.`);\n }\n }\n\n async stop(): Promise<void> {\n for (const workflow of this.workflowRepository.list()) {\n await this.stopTriggersForWorkflow(workflow);\n }\n }\n\n async createTriggerTestItems(args: { workflow: WorkflowDefinition; nodeId: NodeId }): Promise<Items | undefined> {\n const definition = args.workflow.nodes.find((node) => node.id === args.nodeId);\n if (!definition) {\n throw new Error(`Unknown trigger nodeId: ${args.nodeId}`);\n }\n if (definition.kind !== \"trigger\") {\n throw new Error(`Node ${args.nodeId} is not a trigger`);\n }\n const node = this.nodeResolver.resolve(definition.type) as TriggerNode;\n if (!this.isTestableTriggerNode(node)) {\n return undefined;\n }\n const data = this.runDataFactory.create();\n const runId = this.runIdFactory.makeRunId();\n const trigger = { workflowId: args.workflow.id, nodeId: definition.id } as const;\n const previousState = await this.triggerSetupStateRepository.load(trigger);\n return await node.getTestItems({\n ...this.createExecutionContext({\n runId,\n workflowId: args.workflow.id,\n nodeId: definition.id,\n data,\n }),\n trigger,\n nodeId: definition.id,\n config: definition.config as TriggerNodeConfig,\n previousState: previousState?.state as never,\n });\n }\n\n private async startTriggersForWorkflow(wf: WorkflowDefinition): Promise<void> {\n for (const def of wf.nodes) {\n if (def.kind !== \"trigger\") continue;\n if ((def.config as TriggerNodeConfig).triggerKind === \"test\") continue;\n const node = this.nodeResolver.resolve(def.type) as TriggerNode;\n const data = this.runDataFactory.create();\n const triggerRunId = this.runIdFactory.makeRunId();\n const trigger = { workflowId: wf.id, nodeId: def.id } as const;\n await this.stopTrigger(trigger);\n const previousState = await this.triggerSetupStateRepository.load(trigger);\n const emit = this.emitHandler.emit.bind(this.emitHandler, wf, def.id);\n const registerCleanup = this.registerTriggerCleanupHandle.bind(this, trigger);\n const polling = this.buildPollingHandle(trigger, emit);\n let nextState: unknown;\n try {\n nextState = await node.setup({\n ...this.createExecutionContext({\n runId: triggerRunId,\n workflowId: wf.id,\n nodeId: def.id,\n data,\n }),\n trigger,\n config: def.config as TriggerNodeConfig,\n previousState: previousState?.state as never,\n registerCleanup,\n emit,\n polling,\n } satisfies TriggerSetupContext<TriggerNodeConfig>);\n } catch (triggerError: unknown) {\n await this.stopTrigger(trigger);\n const message = triggerError instanceof Error ? triggerError.message : String(triggerError);\n this.logWarn(`Skipping trigger setup for workflow ${wf.id} node ${def.id}: ${message}`);\n continue;\n }\n if (nextState === undefined) {\n await this.triggerSetupStateRepository.delete(trigger);\n } else {\n await this.triggerSetupStateRepository.save({\n trigger,\n updatedAt: new Date().toISOString(),\n state: nextState as JsonValue | undefined,\n });\n }\n }\n }\n\n private async stopTriggersForWorkflow(workflow: WorkflowDefinition): Promise<void> {\n for (const node of workflow.nodes) {\n if (node.kind !== \"trigger\") {\n continue;\n }\n if ((node.config as TriggerNodeConfig).triggerKind === \"test\") {\n continue;\n }\n await this.stopTrigger({\n workflowId: workflow.id,\n nodeId: node.id,\n });\n }\n }\n\n private createExecutionContext(args: {\n runId: ReturnType<RunIdFactory[\"makeRunId\"]>;\n workflowId: string;\n nodeId: NodeId;\n data: ReturnType<RunDataFactory[\"create\"]>;\n }) {\n const nodeState = this.nodeExecutionStatePublisherFactory.create(args.runId, args.workflowId, undefined);\n const rootLimits = this.executionLimitsPolicy.createRootExecutionOptions();\n return this.executionContextFactory.create({\n runId: args.runId,\n workflowId: args.workflowId,\n parent: undefined,\n subworkflowDepth: rootLimits.subworkflowDepth ?? 0,\n engineMaxNodeActivations: rootLimits.maxNodeActivations!,\n engineMaxSubworkflowDepth: rootLimits.maxSubworkflowDepth!,\n data: args.data,\n nodeState,\n getCredential: this.credentialResolverFactory.create(args.workflowId, args.nodeId),\n });\n }\n\n private registerTriggerCleanupHandle(trigger: TriggerInstanceId, cleanup: TriggerCleanupHandle): void {\n const key = this.toTriggerKey(trigger);\n const cleanups = this.triggerCleanupHandlesByKey.get(key) ?? [];\n cleanups.push(cleanup);\n this.triggerCleanupHandlesByKey.set(key, cleanups);\n }\n\n private async stopTrigger(trigger: TriggerInstanceId): Promise<void> {\n const key = this.toTriggerKey(trigger);\n const cleanups = this.triggerCleanupHandlesByKey.get(key) ?? [];\n this.triggerCleanupHandlesByKey.delete(key);\n for (const cleanup of [...cleanups].reverse()) {\n await cleanup.stop();\n }\n }\n\n private toTriggerKey(trigger: TriggerInstanceId): string {\n return `${trigger.workflowId}:${trigger.nodeId}`;\n }\n\n private formatTriggerSummaries(wf: WorkflowDefinition): string[] {\n const out: string[] = [];\n for (const def of wf.nodes) {\n if (def.kind !== \"trigger\") {\n continue;\n }\n if ((def.config as TriggerNodeConfig).triggerKind === \"test\") {\n continue;\n }\n out.push(this.describeTriggerNode(def));\n }\n return out;\n }\n\n private describeTriggerNode(def: NodeDefinition): string {\n const label = def.name !== undefined && def.name.trim().length > 0 ? def.name.trim() : String(def.id);\n const cfg = def.config as { endpointKey?: unknown };\n if (typeof cfg.endpointKey === \"string\" && cfg.endpointKey.trim().length > 0) {\n return `${label} (webhook \"${cfg.endpointKey.trim()}\")`;\n }\n return label;\n }\n\n private logInfo(message: string): void {\n if (this.diagnostics) {\n this.diagnostics.info(message);\n }\n }\n\n private logWarn(message: string): void {\n if (this.diagnostics) {\n this.diagnostics.warn(message);\n } else {\n console.warn(`[engine] ${message}`);\n }\n }\n\n private buildPollingHandle(trigger: TriggerInstanceId, emit: (items: Items) => Promise<void>): PollingTriggerHandle {\n const runtime = this.pollingTriggerRuntime;\n return {\n dedup: this.pollingTriggerDedupWindow,\n start: async (args) => {\n this.registerTriggerCleanupHandle(trigger, {\n stop: async () => {\n await runtime.stop(trigger);\n },\n });\n return runtime.start({ trigger, emit, ...args });\n },\n };\n }\n\n private isTestableTriggerNode(node: TriggerNode): node is TestableTriggerNode<TriggerNodeConfig> {\n return typeof (node as Partial<TestableTriggerNode<TriggerNodeConfig>>).getTestItems === \"function\";\n }\n}\n","import type { RunId, RunResult, WebhookRunResult } from \"../types\";\n\nexport class EngineWaiters {\n private readonly completionWaiters = new Map<RunId, Array<(result: RunResult) => void>>();\n private readonly webhookResponseWaiters = new Map<RunId, Array<(result: WebhookRunResult) => void>>();\n\n waitForCompletion(runId: RunId): Promise<RunResult> {\n return new Promise((resolve) => {\n const list = this.completionWaiters.get(runId) ?? [];\n list.push(resolve);\n this.completionWaiters.set(runId, list);\n });\n }\n\n waitForWebhookResponse(runId: RunId): Promise<WebhookRunResult> {\n return new Promise((resolve) => {\n const list = this.webhookResponseWaiters.get(runId) ?? [];\n list.push(resolve);\n this.webhookResponseWaiters.set(runId, list);\n });\n }\n\n resolveRunCompletion(result: RunResult): void {\n if (result.status !== \"completed\" && result.status !== \"failed\" && result.status !== \"halted\") return;\n const list = this.completionWaiters.get(result.runId);\n if (!list || list.length === 0) return;\n this.completionWaiters.delete(result.runId);\n for (const r of list) r(result);\n }\n\n resolveWebhookResponse(result: WebhookRunResult): void {\n const list = this.webhookResponseWaiters.get(result.runId);\n if (!list || list.length === 0) return;\n this.webhookResponseWaiters.delete(result.runId);\n for (const resolve of list) resolve(result);\n }\n}\n","import type {\n CurrentStateExecutionRequest,\n HttpMethod,\n Items,\n NodeActivationContinuation,\n NodeActivationId,\n NodeExecutionRequest,\n NodeExecutionRequestHandler,\n NodeId,\n NodeInputsByPort,\n NodeOutputs,\n ParentExecutionRef,\n PersistedWorkflowTokenRegistryLike,\n ResumeContext,\n RunExecutionOptions,\n RunId,\n RunResult,\n WorkflowExecutionRepository,\n WebhookRunResult,\n WebhookTriggerMatcher,\n WebhookTriggerResolution,\n WorkflowDefinition,\n WorkflowId,\n LiveWorkflowRepository,\n WorkflowSnapshotResolver,\n} from \"../types\";\n\ninterface EngineTriggerRuntime {\n startTriggers(): Promise<void>;\n stop(): Promise<void>;\n syncWorkflowTriggersForActivation(workflowId: WorkflowId): Promise<void>;\n createTriggerTestItems(args: { workflow: WorkflowDefinition; nodeId: NodeId }): Promise<Items | undefined>;\n}\n\ninterface EngineRunStartService {\n runWorkflow(\n wf: WorkflowDefinition,\n startAt: NodeId,\n items: Items,\n parent?: ParentExecutionRef,\n executionOptions?: RunExecutionOptions,\n persistedStateOverrides?: Readonly<{\n workflowSnapshot?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n mutableState?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"];\n }>,\n ): Promise<RunResult>;\n runWorkflowFromState(request: CurrentStateExecutionRequest): Promise<RunResult>;\n}\n\ninterface EngineRunContinuationService {\n markNodeRunning(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n inputsByPort: NodeInputsByPort;\n }): Promise<void>;\n resumeFromNodeResult(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n outputs: NodeOutputs;\n }): Promise<RunResult>;\n resumeFromNodeError(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n error: Error;\n }): Promise<RunResult>;\n resumeFromStepResult(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n outputs: NodeOutputs;\n }): Promise<RunResult>;\n resumeFromStepError(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n error: Error;\n }): Promise<RunResult>;\n waitForCompletion(runId: RunId): Promise<Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>>;\n waitForWebhookResponse(runId: RunId): Promise<WebhookRunResult>;\n resumeRun(args: { runId: RunId; taskId: string; resumeContext: ResumeContext }): Promise<RunResult>;\n}\n\ninterface EngineNodeExecutionRequestHandler {\n handleNodeExecutionRequest(request: NodeExecutionRequest): Promise<void>;\n}\n\nexport interface EngineFacadeDeps {\n liveWorkflowRepository: LiveWorkflowRepository;\n tokenRegistry: PersistedWorkflowTokenRegistryLike;\n webhookTriggerMatcher: WebhookTriggerMatcher;\n workflowSnapshotResolver: WorkflowSnapshotResolver;\n triggerRuntime: EngineTriggerRuntime;\n runStartService: EngineRunStartService;\n runContinuationService: EngineRunContinuationService;\n nodeExecutionRequestHandler: EngineNodeExecutionRequestHandler;\n}\n\n/**\n * Runtime facade for orchestration, continuation, triggers, and webhook routing.\n * Prefer {@link import(\"../intents/RunIntentService\").RunIntentService} for host/HTTP invocation boundaries.\n * The class token is exported from `@codemation/core/bootstrap` (not the main `@codemation/core` barrel).\n */\nexport class Engine implements NodeActivationContinuation, NodeExecutionRequestHandler {\n constructor(private readonly deps: EngineFacadeDeps) {}\n\n loadWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): void {\n this.deps.tokenRegistry.registerFromWorkflows?.(workflows);\n this.deps.liveWorkflowRepository.setWorkflows(workflows);\n this.deps.webhookTriggerMatcher.onEngineWorkflowsLoaded?.();\n }\n\n getTokenRegistry(): EngineFacadeDeps[\"tokenRegistry\"] {\n return this.deps.tokenRegistry;\n }\n\n resolveWorkflowSnapshot(args: {\n workflowId: WorkflowId;\n workflowSnapshot?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n }): WorkflowDefinition | undefined {\n return this.deps.workflowSnapshotResolver.resolve(args);\n }\n\n async startTriggers(): Promise<void> {\n return await this.deps.triggerRuntime.startTriggers();\n }\n\n async syncWorkflowTriggersForActivation(workflowId: WorkflowId): Promise<void> {\n await this.deps.triggerRuntime.syncWorkflowTriggersForActivation(workflowId);\n this.deps.webhookTriggerMatcher.reloadWebhookRoutes?.();\n }\n\n async start(workflows: WorkflowDefinition[]): Promise<void> {\n await this.stop();\n this.loadWorkflows(workflows);\n await this.startTriggers();\n }\n\n async stop(): Promise<void> {\n await this.deps.triggerRuntime.stop();\n this.deps.webhookTriggerMatcher.onEngineStopped?.();\n }\n\n resolveWebhookTrigger(args: { endpointPath: string; method: HttpMethod }): WebhookTriggerResolution {\n const entry = this.deps.webhookTriggerMatcher.lookup(args.endpointPath);\n if (!entry) {\n return { status: \"notFound\" };\n }\n if (!entry.methods.includes(args.method)) {\n return { status: \"methodNotAllowed\", match: entry };\n }\n return { status: \"ok\", match: entry };\n }\n\n async createTriggerTestItems(args: { workflow: WorkflowDefinition; nodeId: NodeId }): Promise<Items | undefined> {\n return await this.deps.triggerRuntime.createTriggerTestItems(args);\n }\n\n async runWorkflow(\n wf: WorkflowDefinition,\n startAt: NodeId,\n items: Items,\n parent?: ParentExecutionRef,\n executionOptions?: RunExecutionOptions,\n persistedStateOverrides?: Readonly<{\n workflowSnapshot?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"workflowSnapshot\"];\n mutableState?: NonNullable<Awaited<ReturnType<WorkflowExecutionRepository[\"load\"]>>>[\"mutableState\"];\n }>,\n ): Promise<RunResult> {\n return await this.deps.runStartService.runWorkflow(\n wf,\n startAt,\n items,\n parent,\n executionOptions,\n persistedStateOverrides,\n );\n }\n\n async runWorkflowFromState(request: CurrentStateExecutionRequest): Promise<RunResult> {\n return await this.deps.runStartService.runWorkflowFromState(request);\n }\n\n async markNodeRunning(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n inputsByPort: NodeInputsByPort;\n }): Promise<void> {\n return await this.deps.runContinuationService.markNodeRunning(args);\n }\n\n async resumeFromNodeResult(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n outputs: NodeOutputs;\n }): Promise<RunResult> {\n return await this.deps.runContinuationService.resumeFromNodeResult(args);\n }\n\n async resumeFromNodeError(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n error: Error;\n }): Promise<RunResult> {\n return await this.deps.runContinuationService.resumeFromNodeError(args);\n }\n\n async resumeFromStepResult(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n outputs: NodeOutputs;\n }): Promise<RunResult> {\n return await this.deps.runContinuationService.resumeFromStepResult(args);\n }\n\n async resumeFromStepError(args: {\n runId: RunId;\n activationId: NodeActivationId;\n nodeId: NodeId;\n error: Error;\n }): Promise<RunResult> {\n return await this.deps.runContinuationService.resumeFromStepError(args);\n }\n\n async waitForCompletion(runId: RunId): Promise<Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>> {\n return await this.deps.runContinuationService.waitForCompletion(runId);\n }\n\n async waitForWebhookResponse(runId: RunId): Promise<WebhookRunResult> {\n return await this.deps.runContinuationService.waitForWebhookResponse(runId);\n }\n\n /**\n * Re-activate a suspended run item with a human decision (HITL).\n * The HTTP resume endpoint calls this; this method exposes the engine primitive.\n */\n async resumeRun(args: { runId: RunId; taskId: string; resumeContext: ResumeContext }): Promise<RunResult> {\n return await this.deps.runContinuationService.resumeRun(args);\n }\n\n async handleNodeExecutionRequest(request: NodeExecutionRequest): Promise<void> {\n await this.deps.nodeExecutionRequestHandler.handleNodeExecutionRequest(request);\n }\n}\n","import type { EngineDeps } from \"../types\";\n\nimport { PollingTriggerDedupWindow } from \"../triggers/polling/PollingTriggerDedupWindow\";\nimport { PollingTriggerRuntime } from \"../triggers/polling/PollingTriggerRuntime\";\nimport { NoOpPollingTriggerLogger } from \"../triggers/polling/PollingTriggerLogger\";\nimport { MissingRuntimeFallbacks } from \"../workflowSnapshots/MissingRuntimeFallbacksFactory\";\nimport { MissingRuntimeExecutionMarker } from \"../workflowSnapshots/MissingRuntimeExecutionMarker\";\nimport { WorkflowSnapshotCodec } from \"../workflowSnapshots/WorkflowSnapshotCodec\";\nimport { WorkflowSnapshotResolver } from \"../workflowSnapshots/WorkflowSnapshotResolver\";\nimport { ActivationEnqueueService } from \"../execution/ActivationEnqueueService\";\nimport { NodeActivationRequestInputPreparer } from \"../execution/NodeActivationRequestInputPreparer\";\nimport { NodeActivationRequestComposer } from \"../execution/NodeActivationRequestComposer\";\nimport { PersistedRunStateTerminalBuilder } from \"../execution/PersistedRunStateTerminalBuilder\";\nimport { NodeExecutionRequestHandlerService } from \"../orchestration/NodeExecutionRequestHandlerService\";\nimport { RunContinuationService } from \"../orchestration/RunContinuationService\";\nimport { RunStartService } from \"../orchestration/RunStartService\";\nimport { RunStateSemantics } from \"../execution/RunStateSemantics\";\nimport { WorkflowRunExecutionContextFactory } from \"../execution/WorkflowRunExecutionContextFactory\";\nimport { RunTerminalPersistenceCoordinator } from \"../policies/storage/RunTerminalPersistenceCoordinator\";\nimport { WorkflowPolicyErrorServices } from \"../policies/WorkflowPolicyErrorServices\";\nimport { WorkflowStoragePolicyEvaluator } from \"../policies/storage/WorkflowStoragePolicyEvaluator\";\nimport { NodeEventPublisher } from \"../events/NodeEventPublisher\";\nimport { EngineExecutionLimitsPolicy } from \"../policies/executionLimits/EngineExecutionLimitsPolicy\";\nimport { EngineWorkflowPlanningFactory } from \"../planning/EngineWorkflowPlanningFactory\";\nimport { TriggerRuntimeService } from \"../orchestration/TriggerRuntimeService\";\nimport { EngineWaiters } from \"../orchestration/EngineWaiters\";\nimport { Engine } from \"../orchestration/Engine\";\nimport { CredentialResolverFactory } from \"../execution/CredentialResolverFactory\";\nimport { NodeRunStateWriterFactory } from \"../execution/NodeRunStateWriterFactory\";\n\n/**\n * {@link EngineDeps} plus optional overrides for workflow-snapshot materialization.\n * Overrides keep default construction in this factory while allowing tests or advanced wiring to inject instances.\n */\nexport type EngineCompositionDeps = EngineDeps & {\n workflowSnapshotCodec?: WorkflowSnapshotCodec;\n missingRuntimeFallbacks?: MissingRuntimeFallbacks;\n /** When set, used for run-start, trigger, and continuation limit defaults. */\n executionLimitsPolicy?: EngineExecutionLimitsPolicy;\n};\n\n/**\n * Composes the {@link Engine} graph from {@link EngineCompositionDeps}. Production wiring usually goes through\n * {@link import(\"../bootstrap/runtime/EngineRuntimeRegistrar\").EngineRuntimeRegistrar}; this factory remains for tests and custom composition.\n * Exported from `@codemation/core/bootstrap` (not the main `@codemation/core` barrel).\n */\nexport class EngineFactory {\n create(deps: EngineCompositionDeps): Engine {\n const waiters = new EngineWaiters();\n const credentialResolverFactory = new CredentialResolverFactory(deps.credentialSessions);\n const nodeEventPublisher = new NodeEventPublisher(deps.eventBus);\n const nodeStatePublisherFactory = new NodeRunStateWriterFactory(\n deps.workflowExecutionRepository,\n nodeEventPublisher,\n deps.eventBus,\n );\n const planningFactory = new EngineWorkflowPlanningFactory(deps.workflowNodeInstanceFactory);\n const executionLimitsPolicy = deps.executionLimitsPolicy ?? new EngineExecutionLimitsPolicy();\n const workflowSnapshotCodec = deps.workflowSnapshotCodec ?? new WorkflowSnapshotCodec(deps.tokenRegistry);\n const missingRuntimeFallbacks = deps.missingRuntimeFallbacks ?? new MissingRuntimeFallbacks();\n const workflowSnapshotResolver = new WorkflowSnapshotResolver(\n deps.workflowRepository,\n deps.tokenRegistry,\n workflowSnapshotCodec,\n missingRuntimeFallbacks,\n );\n\n const semantics = new RunStateSemantics(new MissingRuntimeExecutionMarker());\n const nodeActivationRequestInputPreparer = new NodeActivationRequestInputPreparer(deps.workflowNodeInstanceFactory);\n const activationEnqueueService = new ActivationEnqueueService(\n deps.activationScheduler,\n deps.workflowExecutionRepository,\n nodeEventPublisher,\n nodeActivationRequestInputPreparer,\n );\n const runExecutionContextFactory = new WorkflowRunExecutionContextFactory(\n deps.executionContextFactory,\n credentialResolverFactory,\n );\n const nodeActivationRequestComposer = new NodeActivationRequestComposer(\n deps.activationIdFactory,\n credentialResolverFactory,\n );\n const persistedRunStateTerminalBuilder = new PersistedRunStateTerminalBuilder();\n const storagePolicyEvaluator = new WorkflowStoragePolicyEvaluator(deps.nodeResolver);\n const terminalPersistence = new RunTerminalPersistenceCoordinator(\n deps.workflowExecutionRepository,\n storagePolicyEvaluator,\n );\n const policyErrorServices = new WorkflowPolicyErrorServices(deps.nodeResolver);\n\n const runStartService = new RunStartService(\n deps.runIdFactory,\n deps.workflowExecutionRepository,\n deps.runDataFactory,\n workflowSnapshotCodec,\n planningFactory,\n nodeStatePublisherFactory,\n runExecutionContextFactory,\n nodeActivationRequestComposer,\n activationEnqueueService,\n semantics,\n waiters,\n deps.workflowPolicyRuntimeDefaults,\n executionLimitsPolicy,\n nodeEventPublisher,\n persistedRunStateTerminalBuilder,\n );\n const runContinuationService = new RunContinuationService(\n deps.activationIdFactory,\n deps.workflowExecutionRepository,\n deps.runDataFactory,\n runExecutionContextFactory,\n workflowSnapshotResolver,\n planningFactory,\n nodeStatePublisherFactory,\n credentialResolverFactory,\n nodeActivationRequestComposer,\n persistedRunStateTerminalBuilder,\n activationEnqueueService,\n nodeEventPublisher,\n semantics,\n waiters,\n policyErrorServices,\n terminalPersistence,\n executionLimitsPolicy,\n );\n const nodeExecutionRequestHandler = new NodeExecutionRequestHandlerService(\n deps.workflowExecutionRepository,\n workflowSnapshotResolver,\n deps.runDataFactory,\n runExecutionContextFactory,\n nodeStatePublisherFactory,\n nodeActivationRequestComposer,\n deps.nodeExecutor,\n runContinuationService,\n executionLimitsPolicy,\n );\n\n const pollingTriggerLogger = deps.pollingTriggerLogger ?? new NoOpPollingTriggerLogger();\n const pollingTriggerDedupWindow = new PollingTriggerDedupWindow();\n const pollingTriggerRuntime = new PollingTriggerRuntime(deps.triggerSetupStateRepository, pollingTriggerLogger);\n\n const triggerRuntime = new TriggerRuntimeService(\n deps.workflowRepository,\n deps.workflowActivationPolicy,\n deps.runIdFactory,\n deps.runDataFactory,\n deps.executionContextFactory,\n credentialResolverFactory,\n nodeStatePublisherFactory,\n deps.nodeResolver,\n deps.triggerSetupStateRepository,\n {\n emit: async (workflow, triggerNodeId, items) => {\n await runStartService.runWorkflow(workflow, triggerNodeId, items, undefined);\n },\n },\n executionLimitsPolicy,\n deps.triggerRuntimeDiagnostics,\n pollingTriggerRuntime,\n pollingTriggerDedupWindow,\n );\n\n const engine = new Engine({\n liveWorkflowRepository: deps.liveWorkflowRepository,\n tokenRegistry: deps.tokenRegistry,\n webhookTriggerMatcher: deps.webhookTriggerMatcher,\n workflowSnapshotResolver,\n triggerRuntime,\n runStartService,\n runContinuationService,\n nodeExecutionRequestHandler,\n });\n\n deps.activationScheduler.setContinuation?.(engine);\n return engine;\n }\n}\n","import type {\n Items,\n NodeId,\n ParentExecutionRef,\n RunResult,\n WorkflowDefinition,\n WorkflowId,\n WorkflowRepository,\n} from \"../types\";\nimport { WorkflowExecutableNodeClassifierFactory } from \"../workflow\";\n\nimport { Engine } from \"../orchestration/Engine\";\n\nexport class EngineWorkflowRunnerService {\n constructor(\n private readonly engine: Engine,\n private readonly workflowRepository: WorkflowRepository,\n ) {}\n\n async runById(args: {\n workflowId: WorkflowId;\n startAt?: NodeId;\n items: Items;\n parent?: ParentExecutionRef;\n }): Promise<RunResult> {\n const { workflowId, startAt, items, parent } = args;\n const wf = this.workflowRepository.get(workflowId);\n if (!wf) throw new Error(`Unknown workflowId: ${workflowId}`);\n\n const startNodeId = startAt ?? this.findDefaultStartNodeId(wf);\n const scheduled = await this.engine.runWorkflow(wf, startNodeId, items, parent);\n if (scheduled.status !== \"pending\") return scheduled;\n return await this.engine.waitForCompletion(scheduled.runId);\n }\n\n private findDefaultStartNodeId(wf: WorkflowDefinition): NodeId {\n return WorkflowExecutableNodeClassifierFactory.create(wf).findDefaultExecutableStartNodeId(wf);\n }\n}\n","import type { WorkflowRepository } from \"../types\";\n\nimport { Engine } from \"../orchestration/Engine\";\n\nimport { EngineWorkflowRunnerService } from \"./EngineWorkflowRunnerService\";\n\nexport class EngineWorkflowRunnerServiceFactory {\n create(engine: Engine, workflowRepository: WorkflowRepository): EngineWorkflowRunnerService {\n return new EngineWorkflowRunnerService(engine, workflowRepository);\n }\n}\n","import type { LiveWorkflowRepository, WorkflowDefinition, WorkflowId } from \"../types\";\n\nexport class InMemoryLiveWorkflowRepository implements LiveWorkflowRepository {\n private readonly workflowsById = new Map<WorkflowId, WorkflowDefinition>();\n\n setWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): void {\n this.workflowsById.clear();\n for (const workflow of workflows) {\n this.workflowsById.set(workflow.id, workflow);\n }\n }\n\n list(): ReadonlyArray<WorkflowDefinition> {\n return [...this.workflowsById.values()];\n }\n\n get(workflowId: WorkflowId): WorkflowDefinition | undefined {\n return this.workflowsById.get(workflowId);\n }\n}\n","import type {\n CurrentStateExecutionRequest,\n HttpMethod,\n Items,\n NodeId,\n RunCurrentState,\n RunExecutionOptions,\n RunResult,\n RunStopCondition,\n WebhookInvocationMatch,\n WebhookRunResult,\n WebhookTriggerResolution,\n WorkflowDefinition,\n WorkflowRepository,\n} from \"../types\";\n\nimport { Engine } from \"../orchestration/Engine\";\n\nexport type StartWorkflowIntent = {\n workflow: WorkflowDefinition;\n startAt?: string;\n items: Items;\n synthesizeTriggerItems?: boolean;\n parent?: CurrentStateExecutionRequest[\"parent\"];\n executionOptions?: RunExecutionOptions;\n workflowSnapshot?: CurrentStateExecutionRequest[\"workflowSnapshot\"];\n mutableState?: CurrentStateExecutionRequest[\"mutableState\"];\n currentState?: RunCurrentState;\n stopCondition?: RunStopCondition;\n reset?: CurrentStateExecutionRequest[\"reset\"];\n};\n\nexport type RerunFromNodeIntent = {\n workflow: WorkflowDefinition;\n nodeId: NodeId;\n currentState: RunCurrentState;\n items?: Items;\n synthesizeTriggerItems?: boolean;\n parent?: CurrentStateExecutionRequest[\"parent\"];\n executionOptions?: RunExecutionOptions;\n workflowSnapshot?: CurrentStateExecutionRequest[\"workflowSnapshot\"];\n mutableState?: CurrentStateExecutionRequest[\"mutableState\"];\n};\n\nexport type MatchedWebhookRunIntent = {\n endpointPath: string;\n method: HttpMethod;\n requestItem: Items[number];\n};\n\nexport type WebhookMatchRunIntent = {\n match: WebhookInvocationMatch;\n requestItem: Items[number];\n};\n\nexport class RunIntentService {\n constructor(\n private readonly engine: Engine,\n private readonly workflowRepository: WorkflowRepository,\n ) {}\n\n async startWorkflow(args: StartWorkflowIntent): Promise<RunResult> {\n const items = await this.resolveStartWorkflowItems(args);\n if (args.startAt && !args.currentState && !args.stopCondition && !args.reset) {\n return await this.engine.runWorkflow(args.workflow, args.startAt, items, args.parent, args.executionOptions, {\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n });\n }\n return await this.engine.runWorkflowFromState({\n workflow: args.workflow,\n items,\n parent: args.parent,\n executionOptions: args.executionOptions,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n currentState: args.currentState,\n stopCondition: args.stopCondition ?? { kind: \"workflowCompleted\" },\n reset: args.reset,\n });\n }\n\n async rerunFromNode(args: RerunFromNodeIntent): Promise<RunResult> {\n const items = await this.resolveRerunItems(args);\n if (items) {\n return await this.engine.runWorkflow(args.workflow, args.nodeId, items, args.parent, args.executionOptions, {\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n });\n }\n return await this.engine.runWorkflowFromState({\n workflow: args.workflow,\n parent: args.parent,\n executionOptions: args.executionOptions,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n currentState: args.currentState,\n stopCondition: { kind: \"workflowCompleted\" },\n reset: { clearFromNodeId: args.nodeId },\n });\n }\n\n private async resolveStartWorkflowItems(args: StartWorkflowIntent): Promise<Items> {\n if (this.hasNonEmptyItems(args.items)) {\n return args.items;\n }\n const triggerNodeId = this.resolveStartWorkflowTriggerNodeId(args);\n if (!triggerNodeId) {\n return args.items;\n }\n return (await this.engine.createTriggerTestItems({ workflow: args.workflow, nodeId: triggerNodeId })) ?? args.items;\n }\n\n private async resolveRerunItems(args: RerunFromNodeIntent): Promise<Items | undefined> {\n if (this.hasNonEmptyItems(args.items)) {\n return args.items;\n }\n const triggerNodeId = this.resolveRerunTriggerNodeId(args);\n if (!triggerNodeId) {\n return args.items;\n }\n return (await this.engine.createTriggerTestItems({ workflow: args.workflow, nodeId: triggerNodeId })) ?? args.items;\n }\n\n private resolveStartWorkflowTriggerNodeId(args: StartWorkflowIntent): NodeId | undefined {\n if (args.stopCondition?.kind === \"nodeCompleted\" && this.isTriggerNode(args.workflow, args.stopCondition.nodeId)) {\n return args.stopCondition.nodeId;\n }\n if (!args.synthesizeTriggerItems) {\n return undefined;\n }\n if (args.startAt && this.isTriggerNode(args.workflow, args.startAt)) {\n return args.startAt;\n }\n return this.firstTriggerNodeId(args.workflow);\n }\n\n private resolveRerunTriggerNodeId(args: RerunFromNodeIntent): NodeId | undefined {\n if (this.isTriggerNode(args.workflow, args.nodeId)) {\n return args.nodeId;\n }\n if (!args.synthesizeTriggerItems) {\n return undefined;\n }\n return this.firstTriggerNodeId(args.workflow);\n }\n\n private firstTriggerNodeId(workflow: WorkflowDefinition): NodeId | undefined {\n return workflow.nodes.find((node) => node.kind === \"trigger\")?.id;\n }\n\n private isTriggerNode(workflow: WorkflowDefinition, nodeId: string): boolean {\n return workflow.nodes.find((node) => node.id === nodeId)?.kind === \"trigger\";\n }\n\n private hasNonEmptyItems(items: Items | undefined): boolean {\n return (items?.length ?? 0) > 0;\n }\n\n resolveWebhookTrigger(args: { endpointPath: string; method: HttpMethod }): WebhookTriggerResolution {\n return this.engine.resolveWebhookTrigger(args);\n }\n\n async runMatchedWebhook(args: MatchedWebhookRunIntent): Promise<WebhookRunResult> {\n const resolution = this.resolveWebhookTrigger(args);\n if (resolution.status === \"notFound\") {\n throw new Error(\"Unknown webhook endpoint\");\n }\n if (resolution.status === \"methodNotAllowed\") {\n throw new Error(\"Method not allowed\");\n }\n return await this.runWebhookMatch({\n match: resolution.match,\n requestItem: args.requestItem,\n });\n }\n\n async runWebhookMatch(args: WebhookMatchRunIntent): Promise<WebhookRunResult> {\n const workflow = this.workflowRepository.get(args.match.workflowId);\n if (!workflow) {\n throw new Error(`Unknown workflowId: ${args.match.workflowId}`);\n }\n const scheduled = await this.engine.runWorkflow(\n workflow,\n args.match.nodeId,\n [args.requestItem],\n undefined,\n this.createWebhookExecutionOptions(),\n );\n if (scheduled.status === \"failed\") {\n throw new Error(scheduled.error.message);\n }\n if (scheduled.status === \"completed\") {\n return {\n runId: scheduled.runId,\n workflowId: scheduled.workflowId,\n startedAt: scheduled.startedAt,\n runStatus: \"completed\",\n response: scheduled.outputs,\n };\n }\n return await Promise.race([\n this.engine.waitForWebhookResponse(scheduled.runId),\n this.engine.waitForCompletion(scheduled.runId).then((completed) => {\n if (completed.status === \"failed\") {\n throw new Error(completed.error.message);\n }\n if (completed.status === \"halted\") {\n throw new Error(`Run halted: ${completed.reason}`);\n }\n return {\n runId: completed.runId,\n workflowId: completed.workflowId,\n startedAt: completed.startedAt,\n runStatus: \"completed\" as const,\n response: completed.outputs,\n } satisfies WebhookRunResult;\n }),\n ]);\n }\n\n /**\n * Webhook-triggered runs always force inline execution first.\n * This is the highest-precedence scheduler override: it wins over node hints and container defaults.\n */\n private createWebhookExecutionOptions(): RunExecutionOptions {\n return {\n localOnly: true,\n webhook: true,\n };\n }\n}\n","import type { WorkflowRepository } from \"../types\";\n\nimport { Engine } from \"../orchestration/Engine\";\n\nimport { RunIntentService } from \"./RunIntentService\";\n\nexport class RunIntentServiceFactory {\n create(engine: Engine, workflowRepository: WorkflowRepository): RunIntentService {\n return new RunIntentService(engine, workflowRepository);\n }\n}\n","import type {\n HttpMethod,\n NodeDefinition,\n NodeId,\n TriggerNodeConfig,\n WebhookInvocationMatch,\n WebhookTriggerMatcher,\n WebhookTriggerRoutingDiagnostics,\n WorkflowActivationPolicy,\n WorkflowDefinition,\n WorkflowId,\n WorkflowRepository,\n} from \"../types\";\n\n/**\n * Resolves webhook HTTP routes from the live workflow repository (no trigger setup / registration).\n * Maintains an in-memory index keyed by user-defined endpoint path for O(1) lookups after reload.\n */\nexport class WorkflowRepositoryWebhookTriggerMatcher implements WebhookTriggerMatcher {\n private readonly routeByPath = new Map<string, WebhookInvocationMatch>();\n private engineRoutesActive = false;\n\n constructor(\n private readonly workflowRepository: WorkflowRepository,\n private readonly workflowActivationPolicy: WorkflowActivationPolicy,\n private readonly diagnostics?: WebhookTriggerRoutingDiagnostics,\n ) {}\n\n onEngineWorkflowsLoaded(): void {\n this.engineRoutesActive = true;\n this.rebuildRouteIndex();\n }\n\n onEngineStopped(): void {\n this.engineRoutesActive = false;\n this.routeByPath.clear();\n }\n\n reloadWebhookRoutes(): void {\n if (!this.engineRoutesActive) {\n return;\n }\n this.rebuildRouteIndex();\n }\n\n lookup(endpointPath: string): WebhookInvocationMatch | undefined {\n if (!this.engineRoutesActive) {\n return undefined;\n }\n const normalized = this.normalizeEndpointPath(endpointPath);\n return this.routeByPath.get(normalized);\n }\n\n match(args: { endpointPath: string; method: HttpMethod }): WebhookInvocationMatch | undefined {\n const entry = this.lookup(args.endpointPath);\n if (!entry) {\n return undefined;\n }\n return entry.methods.includes(args.method) ? entry : undefined;\n }\n\n private rebuildRouteIndex(): void {\n this.routeByPath.clear();\n for (const workflow of this.workflowRepository.list()) {\n if (!this.workflowActivationPolicy.isActive(workflow.id)) {\n const triggerCount = workflow.nodes.filter((n) => n.kind === \"trigger\").length;\n if (triggerCount > 0) {\n const paths = this.collectWebhookEndpointPaths(workflow);\n if (paths.length > 0) {\n this.diagnostics?.info?.(\n `Workflow \"${workflow.name}\" (${workflow.id}) is inactive; webhook routes not registered: ${paths.map((p) => `\"${p}\"`).join(\", \")}`,\n );\n } else {\n this.diagnostics?.info?.(\n `Workflow \"${workflow.name}\" (${workflow.id}) is inactive; no repository webhook routes for its triggers (other trigger kinds are unchanged).`,\n );\n }\n }\n continue;\n }\n for (const def of workflow.nodes) {\n const match = this.tryMatchFromTriggerNode(workflow, def);\n if (!match) {\n continue;\n }\n const key = this.normalizeEndpointPath(match.endpointPath);\n const existing = this.routeByPath.get(key);\n if (existing) {\n this.diagnostics?.warn(\n `Duplicate webhook endpoint path \"${key}\" (workflows \"${existing.workflowId}\" and \"${match.workflowId}\"); using \"${match.workflowId}\".`,\n );\n }\n this.routeByPath.set(key, match);\n }\n }\n }\n\n private collectWebhookEndpointPaths(workflow: WorkflowDefinition): string[] {\n const paths: string[] = [];\n for (const def of workflow.nodes) {\n if (def.kind !== \"trigger\") {\n continue;\n }\n const match = this.tryMatchFromTriggerNode(workflow, def);\n if (match) {\n paths.push(match.endpointPath);\n }\n }\n return paths;\n }\n\n private tryMatchFromTriggerNode(\n workflow: WorkflowDefinition,\n def: NodeDefinition,\n ): WebhookInvocationMatch | undefined {\n if (def.kind !== \"trigger\") {\n return undefined;\n }\n const config = def.config as TriggerNodeConfig & {\n endpointKey?: unknown;\n methods?: unknown;\n parseJsonBody?: (body: unknown) => unknown;\n };\n if (typeof config.endpointKey !== \"string\" || config.endpointKey.length === 0) {\n return undefined;\n }\n if (!Array.isArray(config.methods) || config.methods.length === 0) {\n return undefined;\n }\n const methods = config.methods as HttpMethod[];\n const parseJsonBody = typeof config.parseJsonBody === \"function\" ? config.parseJsonBody.bind(config) : undefined;\n return {\n endpointPath: config.endpointKey,\n workflowId: workflow.id as WorkflowId,\n nodeId: def.id as NodeId,\n methods: [...methods],\n parseJsonBody,\n };\n }\n\n private normalizeEndpointPath(endpointPath: string): string {\n return endpointPath.trim();\n }\n}\n","import type { WebhookTriggerRoutingDiagnostics, WorkflowActivationPolicy, WorkflowRepository } from \"../types\";\n\nimport { WorkflowRepositoryWebhookTriggerMatcher } from \"./WorkflowRepositoryWebhookTriggerMatcher\";\n\nexport class WorkflowRepositoryWebhookTriggerMatcherFactory {\n create(\n workflowRepository: WorkflowRepository,\n workflowActivationPolicy: WorkflowActivationPolicy,\n diagnostics?: WebhookTriggerRoutingDiagnostics,\n ): WorkflowRepositoryWebhookTriggerMatcher {\n return new WorkflowRepositoryWebhookTriggerMatcher(workflowRepository, workflowActivationPolicy, diagnostics);\n }\n}\n"],"mappings":"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"}