@codemation/core 0.13.0 → 0.13.2

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 (42) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{ItemsInputNormalizer-BWtlwdVI.d.ts → ItemsInputNormalizer-BYljnXU0.d.ts} +9 -1
  3. package/dist/{ItemsInputNormalizer-57EdA1ad.cjs → ItemsInputNormalizer-BbQTSEkZ.cjs} +2 -2
  4. package/dist/{ItemsInputNormalizer-57EdA1ad.cjs.map → ItemsInputNormalizer-BbQTSEkZ.cjs.map} +1 -1
  5. package/dist/{ItemsInputNormalizer-pLrWwUAP.d.cts → ItemsInputNormalizer-Bi8m-Ijs.d.cts} +9 -1
  6. package/dist/{ItemsInputNormalizer-BkSvmfAW.js → ItemsInputNormalizer-CSZGMgl3.js} +2 -2
  7. package/dist/{ItemsInputNormalizer-BkSvmfAW.js.map → ItemsInputNormalizer-CSZGMgl3.js.map} +1 -1
  8. package/dist/bootstrap/index.cjs +3 -3
  9. package/dist/bootstrap/index.d.cts +11 -0
  10. package/dist/bootstrap/index.d.ts +2 -2
  11. package/dist/bootstrap/index.js +3 -3
  12. package/dist/{bootstrap-CSeInbj1.js → bootstrap-Bkd-Nfbn.js} +3 -3
  13. package/dist/{bootstrap-CSeInbj1.js.map → bootstrap-Bkd-Nfbn.js.map} +1 -1
  14. package/dist/{bootstrap-BEu1fJBM.cjs → bootstrap-DIv-vloi.cjs} +3 -3
  15. package/dist/{bootstrap-BEu1fJBM.cjs.map → bootstrap-DIv-vloi.cjs.map} +1 -1
  16. package/dist/browser.cjs +2 -2
  17. package/dist/browser.d.cts +1 -1
  18. package/dist/browser.d.ts +1 -1
  19. package/dist/browser.js +2 -2
  20. package/dist/{di-C-2ep8NZ.cjs → di-LP2qSHkY.cjs} +3 -1
  21. package/dist/di-LP2qSHkY.cjs.map +1 -0
  22. package/dist/{di-D9Mv3kF3.js → di-tom0pM2h.js} +3 -1
  23. package/dist/di-tom0pM2h.js.map +1 -0
  24. package/dist/{index-CqZeNGAp.d.ts → index-BSQ2LoIh.d.ts} +13 -2
  25. package/dist/index.cjs +3 -3
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +1 -1
  28. package/dist/index.d.ts +2 -2
  29. package/dist/index.js +3 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/{runtime-6-U2Cou5.js → runtime-CWPdvJpC.js} +22 -4
  32. package/dist/{runtime-6-U2Cou5.js.map → runtime-CWPdvJpC.js.map} +1 -1
  33. package/dist/{runtime-DjYXgOo0.cjs → runtime-_VdHwGkJ.cjs} +22 -4
  34. package/dist/{runtime-DjYXgOo0.cjs.map → runtime-_VdHwGkJ.cjs.map} +1 -1
  35. package/dist/testing.cjs +3 -3
  36. package/dist/testing.js +3 -3
  37. package/package.json +1 -1
  38. package/src/ai/AiHost.ts +7 -0
  39. package/src/ai/NodeBackedToolConfig.ts +2 -0
  40. package/src/scheduler/InlineDrivingScheduler.ts +23 -2
  41. package/dist/di-C-2ep8NZ.cjs.map +0 -1
  42. package/dist/di-D9Mv3kF3.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-BEu1fJBM.cjs","names":["EngineExecutionLimitsPolicy","ENGINE_EXECUTION_LIMITS_DEFAULTS","RunFinishedAtFactory","out: RunPruneCandidate[]","RunFinishedAtFactory","engine: TestSuiteOrchestratorEngine","testSuiteRunIdFactory: TestSuiteRunIdFactory","credentialResolverFactory: CredentialResolverFactory","abortControllerFactory: AbortControllerFactory","eventBus: RunEventBus | undefined","currentDate: () => Date","setupContext: TestTriggerSetupContext","cases: TestSuiteCaseOutcome[]","waitForSlot: Promise<void> | undefined","releaseSlot: (() => void) | undefined","queue: Array<Promise<void>>","generationError: Error | undefined","status: TestSuiteRunStatus","executionOptions: RunExecutionOptions","terminal: Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>","status: TestCaseRunStatus","workflowExecutionRepository: WorkflowExecutionRepository","humanTaskStore?: HumanTaskStore","tokenSigner?: HitlResumeTokenSignerSeam","timeoutScheduler?: HitlTimeoutJobSchedulerSeam","workspaceId?: string","handle: HumanTaskHandle","CodemationTelemetryAttributeNames","deliveryRef: Awaited<ReturnType<typeof deliver>>","record: HumanTaskRecord","entry: PersistedSuspensionEntry","updatedState: PersistedRunState","RunSuspendedError","z","InlineDrivingScheduler","CoreTokens","NoOpAgentMcpIntegration","ItemExprResolver","NodeOutputNormalizer","RunnableOutputBehaviorResolver","ChildExecutionScopeFactory","NodeInstanceFactoryFactory","DefaultAsyncSleeper","InProcessRetryRunnerFactory","NodeExecutorFactory","RunIntentServiceFactory","EngineWorkflowRunnerServiceFactory","WorkflowRepositoryWebhookTriggerMatcherFactory","NodeExecutor","HumanTaskStoreToken","HitlResumeTokenSignerToken","HitlTimeoutJobSchedulerToken","HitlWorkspaceIdToken","InlineDrivingScheduler","EngineFactory","Engine","RunIntentService"],"sources":["../src/policies/executionLimits/EngineExecutionLimitsPolicyFactory.ts","../src/runStorage/RunSummaryMapper.ts","../src/runStorage/InMemoryWorkflowExecutionRepository.ts","../src/orchestration/AbortControllerFactory.ts","../src/orchestration/TestSuiteOrchestrator.ts","../src/orchestration/TestSuiteRunIdFactory.ts","../src/execution/NodeSuspensionHandler.ts","../src/scheduler/InlineDrivingSchedulerFactory.ts","../src/bootstrap/runtime/EngineRuntimeRegistrar.ts"],"sourcesContent":["import {\n EngineExecutionLimitsPolicy,\n ENGINE_EXECUTION_LIMITS_DEFAULTS,\n type EngineExecutionLimitsPolicyConfig,\n} from \"./EngineExecutionLimitsPolicy\";\n\n/**\n * Builds {@link EngineExecutionLimitsPolicy} by merging {@link ENGINE_EXECUTION_LIMITS_DEFAULTS} with optional `overrides` (e.g. host `runtime.engineExecutionLimits`).\n */\nexport class EngineExecutionLimitsPolicyFactory {\n create(overrides?: Partial<EngineExecutionLimitsPolicyConfig>): EngineExecutionLimitsPolicy {\n return new EngineExecutionLimitsPolicy({ ...ENGINE_EXECUTION_LIMITS_DEFAULTS, ...overrides });\n }\n}\n","import { RunFinishedAtFactory } from \"../contracts/runFinishedAtFactory\";\nimport type { PersistedRunState, RunSummary } from \"../types\";\n\n/** Maps persisted run state to API run summaries for listings. */\nexport class RunSummaryMapper {\n static fromPersistedState(state: PersistedRunState): RunSummary {\n return {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: state.status,\n finishedAt: RunFinishedAtFactory.resolveIso(state),\n parent: state.parent,\n executionOptions: state.executionOptions,\n };\n }\n}\n","import type {\n EngineRunCounters,\n NodeId,\n NodeOutputs,\n ParentExecutionRef,\n PersistedRunSchedulingState,\n PersistedRunState,\n RunId,\n RunSummary,\n WorkflowExecutionListingRepository,\n WorkflowExecutionPruneRepository,\n WorkflowExecutionRepository,\n RunPruneCandidate,\n WorkflowId,\n} from \"../types\";\nimport { RunFinishedAtFactory } from \"../contracts/runFinishedAtFactory\";\nimport { RunSummaryMapper } from \"./RunSummaryMapper\";\n\nexport class InMemoryWorkflowExecutionRepository\n implements WorkflowExecutionRepository, WorkflowExecutionListingRepository, WorkflowExecutionPruneRepository\n{\n private readonly runs = new Map<RunId, PersistedRunState>();\n\n async createRun(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: PersistedRunState[\"executionOptions\"];\n control?: PersistedRunState[\"control\"];\n workflowSnapshot?: PersistedRunState[\"workflowSnapshot\"];\n mutableState?: PersistedRunState[\"mutableState\"];\n policySnapshot?: PersistedRunState[\"policySnapshot\"];\n engineCounters?: EngineRunCounters;\n }): Promise<void> {\n this.runs.set(args.runId, {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n revision: 0,\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 status: \"running\",\n queue: [],\n outputsByNode: {} as Record<NodeId, NodeOutputs>,\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n });\n }\n\n async load(runId: RunId): Promise<PersistedRunState | undefined> {\n return this.runs.get(runId);\n }\n\n async loadSchedulingState(runId: RunId): Promise<PersistedRunSchedulingState | undefined> {\n const state = this.runs.get(runId);\n if (!state) {\n return undefined;\n }\n return {\n pending: state.pending ? { ...state.pending } : undefined,\n queue: state.queue.map((entry) => ({ ...entry })),\n };\n }\n\n async save(state: PersistedRunState): Promise<void> {\n this.runs.set(state.runId, { ...state, revision: (state.revision ?? 0) + 1 });\n }\n\n async deleteRun(runId: RunId): Promise<void> {\n this.runs.delete(runId);\n }\n\n async listRuns(args?: Readonly<{ workflowId?: WorkflowId; limit?: number }>): Promise<ReadonlyArray<RunSummary>> {\n const limit = args?.limit ?? 50;\n const summaries = [...this.runs.values()]\n .filter((s) => (args?.workflowId ? s.workflowId === args.workflowId : true))\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, limit)\n .map((s) => RunSummaryMapper.fromPersistedState(s));\n return summaries;\n }\n\n async listRunsOlderThan(\n args: Readonly<{ nowIso: string; defaultRetentionSeconds: number; limit?: number }>,\n ): Promise<ReadonlyArray<RunPruneCandidate>> {\n const limit = args.limit ?? 100;\n const out: RunPruneCandidate[] = [];\n for (const s of this.runs.values()) {\n if (s.status !== \"completed\" && s.status !== \"failed\") continue;\n const finishedAt = RunFinishedAtFactory.resolveIso(s);\n const retentionSeconds = s.policySnapshot?.retentionSeconds ?? args.defaultRetentionSeconds;\n const cutoffIso = new Date(new Date(args.nowIso).getTime() - retentionSeconds * 1000).toISOString();\n if (!finishedAt || finishedAt >= cutoffIso) continue;\n out.push({\n runId: s.runId,\n workflowId: s.workflowId,\n startedAt: s.startedAt,\n finishedAt,\n });\n }\n out.sort((a, b) => a.finishedAt.localeCompare(b.finishedAt));\n return out.slice(0, limit);\n }\n}\n","/**\n * Mints fresh {@link AbortController}s. Injected (rather than direct `new`) to honor the\n * codebase's no-direct-construction rule and to give tests a seam for substituting a fake.\n */\nexport class AbortControllerFactory {\n create(): AbortController {\n return new AbortController();\n }\n}\n","import type { CredentialResolverFactory } from \"../execution/CredentialResolverFactory\";\nimport type { RunEventBus, TestCaseRunStatus, TestSuiteRunStatus } from \"../events/runEvents\";\nimport type {\n Item,\n Items,\n NodeId,\n ParentExecutionRef,\n RunExecutionOptions,\n RunId,\n RunResult,\n TestSuiteRunId,\n TestTriggerNodeConfig,\n TestTriggerSetupContext,\n TriggerNodeConfig,\n WorkflowDefinition,\n WorkflowId,\n} from \"../types\";\n\nimport type { AbortControllerFactory } from \"./AbortControllerFactory\";\nimport { TestSuiteRunIdFactory } from \"./TestSuiteRunIdFactory\";\n\nconst DEFAULT_CONCURRENCY = 4;\n\n/**\n * Engine-facade subset the orchestrator needs. Kept narrow on purpose so unit tests can\n * substitute a fake without depending on the full Engine wiring.\n */\nexport interface TestSuiteOrchestratorEngine {\n runWorkflow(\n wf: WorkflowDefinition,\n startAt: NodeId,\n items: Items,\n parent?: ParentExecutionRef,\n executionOptions?: RunExecutionOptions,\n ): Promise<RunResult>;\n waitForCompletion(runId: RunId): Promise<Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>>;\n}\n\nexport interface TestSuiteCaseOutcome {\n readonly testCaseIndex: number;\n readonly runId: RunId;\n readonly status: TestCaseRunStatus;\n}\n\nexport interface TestSuiteRunResult {\n readonly testSuiteRunId: TestSuiteRunId;\n readonly workflowId: WorkflowId;\n readonly triggerNodeId: NodeId;\n readonly status: TestSuiteRunStatus;\n readonly totalCases: number;\n readonly passedCases: number;\n readonly failedCases: number;\n readonly cases: ReadonlyArray<TestSuiteCaseOutcome>;\n}\n\nexport interface RunTestSuiteArgs {\n readonly workflow: WorkflowDefinition;\n readonly triggerNodeId: NodeId;\n readonly testSuiteRunId?: TestSuiteRunId;\n readonly concurrency?: number;\n readonly signal?: AbortSignal;\n}\n\n/**\n * Drives a {@link TestTriggerNodeConfig.generateItems} iterable into one workflow run per item,\n * with bounded concurrency. Pure engine logic — no persistence, no HTTP, no UI. Hosts adapt by\n * subscribing to {@link RunEventBus} and writing rows on `testSuite*` / `testCase*` / `nodeCompleted`.\n *\n * Cancellation: the supplied `AbortSignal` aborts the source iterable (so credentialed pulls bail)\n * and stops scheduling further cases. In-flight cases are awaited; engine-level cancellation of\n * an already-dispatched run is not yet wired (Phase 2).\n */\nexport class TestSuiteOrchestrator {\n constructor(\n private readonly engine: TestSuiteOrchestratorEngine,\n private readonly testSuiteRunIdFactory: TestSuiteRunIdFactory,\n private readonly credentialResolverFactory: CredentialResolverFactory,\n private readonly abortControllerFactory: AbortControllerFactory,\n private readonly eventBus: RunEventBus | undefined,\n private readonly currentDate: () => Date = () => new Date(),\n ) {}\n\n async runSuite(args: RunTestSuiteArgs): Promise<TestSuiteRunResult> {\n const triggerNodeId = args.triggerNodeId;\n const definition = args.workflow.nodes.find((n) => n.id === triggerNodeId);\n if (!definition) {\n throw new Error(`Unknown trigger nodeId: ${triggerNodeId}`);\n }\n if (definition.kind !== \"trigger\") {\n throw new Error(`Node ${triggerNodeId} is not a trigger`);\n }\n const triggerConfig = definition.config as TriggerNodeConfig;\n if (triggerConfig.triggerKind !== \"test\") {\n throw new Error(\n `Node ${triggerNodeId} is not a test trigger (triggerKind=\"${triggerConfig.triggerKind ?? \"live\"}\")`,\n );\n }\n const testTriggerConfig = triggerConfig as TestTriggerNodeConfig<unknown>;\n if (typeof testTriggerConfig.generateItems !== \"function\") {\n throw new Error(`Test trigger ${triggerNodeId} is missing a generateItems implementation`);\n }\n\n const testSuiteRunId = args.testSuiteRunId ?? this.testSuiteRunIdFactory.makeTestSuiteRunId();\n const concurrency = Math.max(1, args.concurrency ?? testTriggerConfig.concurrency ?? DEFAULT_CONCURRENCY);\n const externalSignal = args.signal;\n const internalAbort = this.abortControllerFactory.create();\n const onExternalAbort = () => internalAbort.abort(externalSignal?.reason);\n if (externalSignal) {\n if (externalSignal.aborted) {\n internalAbort.abort(externalSignal.reason);\n } else {\n externalSignal.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n }\n\n const triggerNodeName = definition.name ?? testTriggerConfig.name;\n\n await this.publish({\n kind: \"testSuiteStarted\",\n testSuiteRunId,\n workflowId: args.workflow.id,\n triggerNodeId,\n ...(triggerNodeName ? { triggerNodeName } : {}),\n concurrency,\n at: this.now(),\n });\n\n const setupContext: TestTriggerSetupContext = {\n workflowId: args.workflow.id,\n nodeId: triggerNodeId,\n config: testTriggerConfig,\n testSuiteRunId,\n getCredential: this.credentialResolverFactory.create(args.workflow.id, triggerNodeId, testTriggerConfig),\n signal: internalAbort.signal,\n };\n\n const cases: TestSuiteCaseOutcome[] = [];\n let nextIndex = 0;\n let inFlight = 0;\n let waitForSlot: Promise<void> | undefined;\n let releaseSlot: (() => void) | undefined;\n const queue: Array<Promise<void>> = [];\n let generationError: Error | undefined;\n\n const acquireSlot = async (): Promise<void> => {\n while (inFlight >= concurrency) {\n if (!waitForSlot) {\n waitForSlot = new Promise<void>((resolve) => {\n releaseSlot = resolve;\n });\n }\n await waitForSlot;\n }\n inFlight += 1;\n };\n\n const release = (): void => {\n inFlight -= 1;\n if (releaseSlot) {\n const fn = releaseSlot;\n releaseSlot = undefined;\n waitForSlot = undefined;\n fn();\n }\n };\n\n try {\n for await (const item of testTriggerConfig.generateItems(setupContext) as AsyncIterable<Item<unknown>>) {\n if (internalAbort.signal.aborted) {\n break;\n }\n await acquireSlot();\n if (internalAbort.signal.aborted) {\n release();\n break;\n }\n const testCaseIndex = nextIndex++;\n const testCaseLabel = this.resolveCaseLabel(testTriggerConfig, item);\n queue.push(\n this.runOneCase({\n workflow: args.workflow,\n triggerNodeId,\n testSuiteRunId,\n testCaseIndex,\n testCaseLabel,\n item,\n })\n .then((outcome) => {\n cases.push(outcome);\n })\n .finally(release),\n );\n }\n } catch (err) {\n generationError = err instanceof Error ? err : new Error(String(err));\n } finally {\n if (externalSignal) {\n externalSignal.removeEventListener(\"abort\", onExternalAbort);\n }\n }\n\n await Promise.all(queue);\n\n cases.sort((a, b) => a.testCaseIndex - b.testCaseIndex);\n const totalCases = cases.length;\n const passedCases = cases.filter((c) => c.status === \"succeeded\").length;\n const failedCases = cases.filter((c) => c.status === \"failed\").length;\n const status: TestSuiteRunStatus = this.deriveSuiteStatus({\n generationError,\n cancelled: internalAbort.signal.aborted,\n totalCases,\n passedCases,\n failedCases,\n });\n\n await this.publish({\n kind: \"testSuiteFinished\",\n testSuiteRunId,\n workflowId: args.workflow.id,\n status,\n totalCases,\n passedCases,\n failedCases,\n at: this.now(),\n });\n\n if (generationError && status === \"errored\") {\n throw generationError;\n }\n\n return {\n testSuiteRunId,\n workflowId: args.workflow.id,\n triggerNodeId,\n status,\n totalCases,\n passedCases,\n failedCases,\n cases,\n };\n }\n\n private async runOneCase(args: {\n workflow: WorkflowDefinition;\n triggerNodeId: NodeId;\n testSuiteRunId: TestSuiteRunId;\n testCaseIndex: number;\n testCaseLabel: string | undefined;\n item: Item<unknown>;\n }): Promise<TestSuiteCaseOutcome> {\n const executionOptions: RunExecutionOptions = {\n testContext: {\n testSuiteRunId: args.testSuiteRunId,\n testCaseIndex: args.testCaseIndex,\n ...(args.testCaseLabel !== undefined ? { testCaseLabel: args.testCaseLabel } : {}),\n },\n };\n\n const initial = await this.engine.runWorkflow(\n args.workflow,\n args.triggerNodeId,\n [args.item],\n undefined,\n executionOptions,\n );\n\n const runId = initial.runId;\n await this.publish({\n kind: \"testCaseStarted\",\n testSuiteRunId: args.testSuiteRunId,\n testCaseIndex: args.testCaseIndex,\n runId,\n workflowId: args.workflow.id,\n at: this.now(),\n ...(args.testCaseLabel !== undefined ? { testCaseLabel: args.testCaseLabel } : {}),\n });\n\n let terminal: Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>;\n if (initial.status === \"completed\" || initial.status === \"failed\") {\n terminal = initial;\n } else {\n terminal = await this.engine.waitForCompletion(runId);\n }\n\n // RunResult.status from the engine narrows to \"completed\" | \"failed\" | \"halted\" here; widening to\n // \"errored\" / \"cancelled\" happens outside this code path (tracker downgrade for assertion\n // failures; outer abort handling for cancelled). Halted runs are treated as \"failed\" for\n // test case status purposes.\n const status: TestCaseRunStatus = terminal.status === \"completed\" ? \"succeeded\" : \"failed\";\n await this.publish({\n kind: \"testCaseCompleted\",\n testSuiteRunId: args.testSuiteRunId,\n testCaseIndex: args.testCaseIndex,\n runId,\n workflowId: args.workflow.id,\n status,\n at: this.now(),\n });\n return { testCaseIndex: args.testCaseIndex, runId, status };\n }\n\n private deriveSuiteStatus(args: {\n generationError: Error | undefined;\n cancelled: boolean;\n totalCases: number;\n passedCases: number;\n failedCases: number;\n }): TestSuiteRunStatus {\n if (args.generationError && args.totalCases === 0) {\n return \"errored\";\n }\n if (args.cancelled) {\n return \"cancelled\";\n }\n if (args.generationError) {\n return \"errored\";\n }\n if (args.totalCases === 0) {\n return \"succeeded\";\n }\n if (args.failedCases === 0) {\n return \"succeeded\";\n }\n if (args.passedCases === 0) {\n return \"failed\";\n }\n return \"partial\";\n }\n\n private now(): string {\n return this.currentDate().toISOString();\n }\n\n /** Defensive label resolver — author-supplied callbacks throw / return non-strings; we tolerate both. */\n private resolveCaseLabel(config: TestTriggerNodeConfig<unknown>, item: Item<unknown>): string | undefined {\n if (typeof config.caseLabel !== \"function\") return undefined;\n try {\n const result = config.caseLabel(item);\n if (typeof result !== \"string\") return undefined;\n const trimmed = result.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n } catch {\n return undefined;\n }\n }\n\n private async publish(event: Parameters<RunEventBus[\"publish\"]>[0]): Promise<void> {\n if (!this.eventBus) return;\n await this.eventBus.publish(event);\n }\n}\n","import type { TestSuiteRunId } from \"../contracts/testTriggerTypes\";\n\n/**\n * Mints unique TestSuiteRun identifiers. Separated from {@link import(\"../types\").RunIdFactory}\n * so suite ids and per-case workflow run ids never alias.\n */\nexport class TestSuiteRunIdFactory {\n makeTestSuiteRunId(): TestSuiteRunId {\n return `tsr_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\n\nimport type { HitlResumeTokenSignerSeam, HitlTimeoutJobSchedulerSeam } from \"../contracts/hitlSeamTypes\";\nimport type { HumanTaskRecord, HumanTaskStore } from \"../contracts/humanTaskStoreTypes\";\nimport type {\n HumanTaskHandle,\n NodeActivationId,\n NodeId,\n PersistedRunState,\n PersistedSuspensionEntry,\n RunId,\n SuspensionRequest,\n WorkflowExecutionRepository,\n} from \"../types\";\nimport type { TelemetryScope } from \"../contracts/telemetryTypes\";\nimport { CodemationTelemetryAttributeNames } from \"../contracts/CodemationTelemetryAttributeNames\";\n\nimport { RunSuspendedError } from \"./RunSuspendedError\";\nexport { RunSuspendedError };\n\n/**\n * Handles per-item `SuspensionRequest` catches in the engine's item execution loop.\n *\n * Responsibilities:\n * 1. Generate a `taskId` (UUID v4).\n * 2. Persist a `HumanTask` row via `HumanTaskStore.create`.\n * 3. Sign a resume URL via `HitlResumeTokenSigner.sign`.\n * 4. Enqueue a delayed BullMQ timeout job via `HitlTimeoutJobScheduler.enqueue`.\n * 5. Build a `HumanTaskHandle` and call `deliver`.\n * 6. Append a `PersistedSuspensionEntry` to the run state and flip status to `\"suspended\"`.\n * 7. Persist via `WorkflowExecutionRepository.save`.\n * 8. Throw `RunSuspendedError` so the caller can exit cleanly.\n *\n * If `deliver` throws, the error propagates up to `NodeExecutionRequestHandlerService`\n * which routes it through `resumeFromNodeError` → run status becomes `\"failed\"`.\n *\n * `humanTaskStore`, `tokenSigner`, and `timeoutScheduler` are optional —\n * when not registered (e.g. in unit tests), the handler still suspends the run but\n * skips persistence, token signing, and job scheduling.\n */\nexport class NodeSuspensionHandler {\n constructor(\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n private readonly humanTaskStore?: HumanTaskStore,\n private readonly tokenSigner?: HitlResumeTokenSignerSeam,\n private readonly timeoutScheduler?: HitlTimeoutJobSchedulerSeam,\n /** Workspace ID to stamp on HumanTaskRecord in managed mode (T7 security fix). Null in non-managed mode. */\n private readonly workspaceId?: string,\n ) {}\n\n async handle(args: {\n runId: RunId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n itemIndex: number;\n suspensionRequest: SuspensionRequest;\n state: PersistedRunState;\n /** Telemetry scope of the node's per-item span. Used to emit `hitl.task.*` span events. */\n telemetry?: TelemetryScope;\n }): Promise<never> {\n const taskId = `htask_${globalThis.crypto.randomUUID()}`;\n const { timeout, onTimeout, deliver, decisionSchema, subject, metadata } = args.suspensionRequest.request;\n\n const timeoutMs = this.parseDurationMs(timeout);\n const expiresAt = new Date(Date.now() + timeoutMs);\n\n const decisionSchemaHash = this.hashSchema(decisionSchema);\n const decisionSchemaJson = this.schemaToJson(decisionSchema);\n\n // Build resume token (when signer is available)\n let resumeUrl = \"\";\n let resumeTokenHash = \"\";\n if (this.tokenSigner) {\n const token = this.tokenSigner.sign({ taskId, expiresAt, schemaHash: decisionSchemaHash });\n resumeUrl = token; // callers (deliver) receive the raw token; inbox layers wrap into a URL\n resumeTokenHash = this.tokenSigner.hashToken(token);\n }\n\n const handle: HumanTaskHandle = {\n taskId,\n runId: args.runId,\n nodeId: args.nodeId,\n expiresAt,\n resumeUrl,\n ...(metadata !== undefined ? { metadata } : {}),\n };\n\n // Emit hitl.task.created before calling deliver.\n const channel = (metadata as Record<string, unknown> | undefined)?.[\"channel\"];\n await args.telemetry?.addSpanEvent?.({\n name: \"hitl.task.created\",\n attributes: {\n [CodemationTelemetryAttributeNames.hitlTaskId]: taskId,\n [CodemationTelemetryAttributeNames.hitlChannel]: typeof channel === \"string\" ? channel : \"unknown\",\n [CodemationTelemetryAttributeNames.runId]: args.runId,\n [CodemationTelemetryAttributeNames.nodeId]: args.nodeId,\n expiresAt: expiresAt.toISOString(),\n },\n });\n\n // D5: deliver throws → emit hitl.task.delivery_failed, then propagate upward;\n // caller routes to resumeFromNodeError → \"failed\"\n let deliveryRef: Awaited<ReturnType<typeof deliver>>;\n try {\n deliveryRef = await deliver(handle);\n } catch (deliverError) {\n await args.telemetry?.addSpanEvent?.({\n name: \"hitl.task.delivery_failed\",\n attributes: {\n [CodemationTelemetryAttributeNames.hitlTaskId]: taskId,\n [CodemationTelemetryAttributeNames.hitlChannel]: typeof channel === \"string\" ? channel : \"unknown\",\n error: deliverError instanceof Error ? deliverError.message : String(deliverError),\n },\n });\n throw deliverError;\n }\n\n // Persist HumanTask row\n if (this.humanTaskStore) {\n const record: HumanTaskRecord = {\n id: taskId,\n runId: args.runId,\n workflowId: args.state.workflowId,\n // T7: stamp workspaceId in managed mode so HitlCallbackHandler can assert workspace identity.\n // Non-managed mode leaves this undefined (null in DB) — the check in HitlCallbackHandler\n // is guarded by `task.workspaceId !== undefined` and is a no-op when null.\n workspaceId: this.workspaceId ?? undefined,\n nodeId: args.nodeId,\n activationId: args.activationId,\n itemIndex: args.itemIndex,\n status: \"pending\",\n channel: \"local\",\n subject,\n metadata: (metadata as Record<string, import(\"../contracts/workflowTypes\").JsonValue>) ?? {},\n decisionSchemaJson,\n decisionSchemaHash,\n onTimeout,\n deliveryRef,\n resumeTokenHash: resumeTokenHash || \"no-token\",\n expiresAt,\n createdAt: new Date(),\n };\n await this.humanTaskStore.create(record);\n }\n\n // Enqueue timeout job\n if (this.timeoutScheduler) {\n await this.timeoutScheduler.enqueueTimeoutJob({ taskId, expiresAt });\n }\n\n const entry: PersistedSuspensionEntry = {\n taskId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n itemIndex: args.itemIndex,\n decisionSchemaHash,\n deliveryRef,\n timeoutAt: expiresAt.toISOString(),\n onTimeout,\n };\n\n const existingSuspensions = args.state.suspension ?? [];\n const updatedState: PersistedRunState = {\n ...args.state,\n status: \"suspended\",\n suspension: [...existingSuspensions, entry],\n };\n\n await this.workflowExecutionRepository.save(updatedState);\n\n throw new RunSuspendedError(args.runId, taskId);\n }\n\n /**\n * Parse a duration string into milliseconds.\n * Accepts ISO 8601 durations (\"PT24H\", \"PT30M\") and shorthand (\"24h\", \"30m\", \"1d\").\n * Throws for unrecognised formats.\n */\n private parseDurationMs(duration: string): number {\n // Shorthand: \"24h\", \"30m\", \"7d\", \"3600s\"\n const shorthand = /^(\\d+(?:\\.\\d+)?)(s|m|h|d)$/i.exec(duration);\n if (shorthand) {\n const value = parseFloat(shorthand[1]!);\n const unit = shorthand[2]!.toLowerCase();\n const multipliers: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n };\n return value * multipliers[unit]!;\n }\n // ISO 8601 duration subset: PTnHnMnS (days handled via P1D)\n const iso = /^P(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/.exec(duration);\n if (iso) {\n const days = parseFloat(iso[1] ?? \"0\");\n const hours = parseFloat(iso[2] ?? \"0\");\n const minutes = parseFloat(iso[3] ?? \"0\");\n const seconds = parseFloat(iso[4] ?? \"0\");\n return (days * 86_400 + hours * 3_600 + minutes * 60 + seconds) * 1_000;\n }\n throw new Error(`NodeSuspensionHandler: unrecognised duration format: \"${duration}\"`);\n }\n\n private hashSchema(schema: unknown): string {\n const json = this.schemaToJson(schema);\n return createHash(\"sha256\").update(json).digest(\"hex\");\n }\n\n private schemaToJson(schema: unknown): string {\n if (schema instanceof z.ZodType) {\n return JSON.stringify(z.toJSONSchema(schema));\n }\n if (typeof (schema as { toJSON?: unknown }).toJSON === \"function\") {\n return JSON.stringify((schema as { toJSON: () => unknown }).toJSON());\n }\n return JSON.stringify(schema);\n }\n}\n","import { NodeExecutor } from \"../execution/NodeExecutor\";\n\nimport { InlineDrivingScheduler } from \"./InlineDrivingScheduler\";\n\nexport class InlineDrivingSchedulerFactory {\n create(nodeExecutor: NodeExecutor): InlineDrivingScheduler {\n return new InlineDrivingScheduler(nodeExecutor);\n }\n}\n","import { instanceCachingFactory, type DependencyContainer } from \"../../di\";\nimport { CoreTokens } from \"../../di\";\nimport { NoOpAgentMcpIntegration } from \"../../contracts/NoOpAgentMcpIntegration\";\nimport { EngineExecutionLimitsPolicyFactory } from \"../../policies/executionLimits/EngineExecutionLimitsPolicyFactory\";\nimport {\n ChildExecutionScopeFactory,\n DefaultAsyncSleeper,\n InProcessRetryRunnerFactory,\n ItemExprResolver,\n NodeExecutor,\n NodeExecutorFactory,\n NodeInstanceFactoryFactory,\n NodeOutputNormalizer,\n RunnableOutputBehaviorResolver,\n} from \"../../execution\";\nimport { NodeSuspensionHandler } from \"../../execution/NodeSuspensionHandler\";\nimport { HumanTaskStoreToken } from \"../../contracts/humanTaskStoreTypes\";\nimport {\n HitlResumeTokenSignerToken,\n HitlTimeoutJobSchedulerToken,\n HitlWorkspaceIdToken,\n} from \"../../contracts/hitlSeamTypes\";\nimport {\n EngineFactory,\n EngineWorkflowRunnerServiceFactory,\n RunIntentServiceFactory,\n RunIntentService,\n WorkflowRepositoryWebhookTriggerMatcherFactory,\n} from \"../../runtime\";\nimport { InlineDrivingScheduler } from \"../../scheduler/InlineDrivingScheduler\";\nimport { InlineDrivingSchedulerFactory } from \"../../scheduler/InlineDrivingSchedulerFactory\";\nimport { Engine } from \"../../orchestration/Engine\";\nimport type { EngineRuntimeRegistrationOptions } from \"./EngineRuntimeRegistration.types\";\nimport type { WebhookTriggerMatcherProvider } from \"./EngineRuntimeRegistration.types\";\n\n/**\n * Container-first entry: call on a host/test container **after** workflow, run, node, and credential\n * ports are registered. The registrar owns the default inline scheduler, engine binding,\n * and intent-surface wiring so hosts only override the seams they actually replace.\n */\nexport class EngineRuntimeRegistrar {\n register(container: DependencyContainer, options?: EngineRuntimeRegistrationOptions): void {\n this.registerSupportFactories(container);\n this.registerExecutionLimitsPolicy(container, options);\n this.ensureWorkflowNodeInstanceFactory(container);\n this.ensureNodeExecutor(container);\n this.registerDefaultActivationScheduler(container);\n this.registerEngine(container, options);\n this.registerIntentServices(container);\n this.registerAgentMcpIntegration(container);\n }\n\n private registerAgentMcpIntegration(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.AgentMcpIntegration, true)) {\n return;\n }\n container.registerInstance(CoreTokens.AgentMcpIntegration, new NoOpAgentMcpIntegration());\n }\n\n private registerSupportFactories(container: DependencyContainer): void {\n if (!container.isRegistered(ItemExprResolver, true)) {\n container.registerSingleton(ItemExprResolver, ItemExprResolver);\n }\n if (!container.isRegistered(NodeOutputNormalizer, true)) {\n container.registerSingleton(NodeOutputNormalizer, NodeOutputNormalizer);\n }\n if (!container.isRegistered(RunnableOutputBehaviorResolver, true)) {\n container.registerSingleton(RunnableOutputBehaviorResolver, RunnableOutputBehaviorResolver);\n }\n if (!container.isRegistered(ChildExecutionScopeFactory, true)) {\n container.register(ChildExecutionScopeFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return new ChildExecutionScopeFactory(dependencyContainer.resolve(CoreTokens.ActivationIdFactory));\n }),\n });\n }\n container.registerSingleton(EngineExecutionLimitsPolicyFactory, EngineExecutionLimitsPolicyFactory);\n container.registerSingleton(NodeInstanceFactoryFactory, NodeInstanceFactoryFactory);\n container.registerSingleton(DefaultAsyncSleeper, DefaultAsyncSleeper);\n container.registerSingleton(InProcessRetryRunnerFactory, InProcessRetryRunnerFactory);\n container.registerSingleton(NodeExecutorFactory, NodeExecutorFactory);\n container.registerSingleton(InlineDrivingSchedulerFactory, InlineDrivingSchedulerFactory);\n container.registerSingleton(RunIntentServiceFactory, RunIntentServiceFactory);\n container.registerSingleton(EngineWorkflowRunnerServiceFactory, EngineWorkflowRunnerServiceFactory);\n container.registerSingleton(\n WorkflowRepositoryWebhookTriggerMatcherFactory,\n WorkflowRepositoryWebhookTriggerMatcherFactory,\n );\n }\n\n private registerExecutionLimitsPolicy(\n container: DependencyContainer,\n options: EngineRuntimeRegistrationOptions | undefined,\n ): void {\n if (container.isRegistered(CoreTokens.EngineExecutionLimitsPolicy, true)) {\n return;\n }\n container.register(CoreTokens.EngineExecutionLimitsPolicy, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const fromResolver = options?.resolveEngineExecutionLimits?.();\n const merged = fromResolver ?? options?.engineExecutionLimits;\n return dependencyContainer.resolve(EngineExecutionLimitsPolicyFactory).create(merged);\n }),\n });\n }\n\n private ensureWorkflowNodeInstanceFactory(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.WorkflowNodeInstanceFactory, true)) {\n return;\n }\n container.register(CoreTokens.WorkflowNodeInstanceFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(NodeInstanceFactoryFactory)\n .create(dependencyContainer.resolve(CoreTokens.NodeResolver));\n }),\n });\n }\n\n private ensureNodeExecutor(container: DependencyContainer): void {\n if (container.isRegistered(NodeExecutor, true)) {\n return;\n }\n container.register(NodeExecutor, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const retryRunner = dependencyContainer\n .resolve(InProcessRetryRunnerFactory)\n .create(dependencyContainer.resolve(DefaultAsyncSleeper));\n const workflowExecutionRepository = dependencyContainer.resolve(CoreTokens.WorkflowExecutionRepository);\n const humanTaskStore = dependencyContainer.isRegistered(HumanTaskStoreToken, true)\n ? dependencyContainer.resolve(HumanTaskStoreToken)\n : undefined;\n const tokenSigner = dependencyContainer.isRegistered(HitlResumeTokenSignerToken, true)\n ? dependencyContainer.resolve(HitlResumeTokenSignerToken)\n : undefined;\n const timeoutScheduler = dependencyContainer.isRegistered(HitlTimeoutJobSchedulerToken, true)\n ? dependencyContainer.resolve(HitlTimeoutJobSchedulerToken)\n : undefined;\n const workspaceId = dependencyContainer.isRegistered(HitlWorkspaceIdToken, true)\n ? dependencyContainer.resolve(HitlWorkspaceIdToken)\n : undefined;\n const suspensionHandler = new NodeSuspensionHandler(\n workflowExecutionRepository,\n humanTaskStore ?? undefined,\n tokenSigner ?? undefined,\n timeoutScheduler ?? undefined,\n workspaceId ?? undefined,\n );\n return dependencyContainer\n .resolve(NodeExecutorFactory)\n .create(\n dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory),\n retryRunner,\n dependencyContainer.resolve(RunnableOutputBehaviorResolver),\n suspensionHandler,\n (runId) => workflowExecutionRepository.load(runId),\n );\n }),\n });\n }\n\n private registerDefaultActivationScheduler(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.NodeActivationScheduler, true)) {\n return;\n }\n container.register(InlineDrivingScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(InlineDrivingSchedulerFactory)\n .create(dependencyContainer.resolve(NodeExecutor));\n }),\n });\n container.register(CoreTokens.NodeActivationScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer.resolve(InlineDrivingScheduler);\n }),\n });\n }\n\n private registerEngine(container: DependencyContainer, options: EngineRuntimeRegistrationOptions | undefined): void {\n container.registerSingleton(EngineFactory, EngineFactory);\n const matcherProvider = this.resolveMatcherProvider(options);\n container.register(Engine, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const liveWorkflowRepository = dependencyContainer.resolve(CoreTokens.LiveWorkflowRepository);\n const nodeResolver = dependencyContainer.resolve(CoreTokens.NodeResolver);\n const tokenRegistryLike = dependencyContainer.resolve(CoreTokens.PersistedWorkflowTokenRegistry);\n const workflowActivationPolicy = dependencyContainer.resolve(CoreTokens.WorkflowActivationPolicy);\n const webhookTriggerMatcher = matcherProvider.createMatcher(dependencyContainer);\n const workflowNodeInstanceFactory = dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory);\n const triggerRuntimeDiagnostics = options?.triggerRuntimeDiagnosticsProvider?.create(dependencyContainer);\n return dependencyContainer.resolve(EngineFactory).create({\n credentialSessions: dependencyContainer.resolve(CoreTokens.CredentialSessionService),\n liveWorkflowRepository,\n workflowRepository: dependencyContainer.resolve(CoreTokens.WorkflowRepository),\n workflowActivationPolicy,\n nodeResolver,\n triggerSetupStateRepository: dependencyContainer.resolve(CoreTokens.TriggerSetupStateRepository),\n webhookTriggerMatcher,\n runIdFactory: dependencyContainer.resolve(CoreTokens.RunIdFactory),\n activationIdFactory: dependencyContainer.resolve(CoreTokens.ActivationIdFactory),\n workflowExecutionRepository: dependencyContainer.resolve(CoreTokens.WorkflowExecutionRepository),\n activationScheduler: dependencyContainer.resolve(CoreTokens.NodeActivationScheduler),\n runDataFactory: dependencyContainer.resolve(CoreTokens.RunDataFactory),\n executionContextFactory: dependencyContainer.resolve(CoreTokens.ExecutionContextFactory),\n nodeExecutor: dependencyContainer.resolve(NodeExecutor),\n eventBus: dependencyContainer.resolve(CoreTokens.RunEventBus),\n tokenRegistry: tokenRegistryLike,\n workflowNodeInstanceFactory,\n executionLimitsPolicy: dependencyContainer.resolve(CoreTokens.EngineExecutionLimitsPolicy),\n workflowPolicyRuntimeDefaults: options?.workflowPolicyRuntimeDefaults,\n triggerRuntimeDiagnostics,\n });\n }),\n });\n }\n\n private registerIntentServices(container: DependencyContainer): void {\n container.register(RunIntentService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(RunIntentServiceFactory)\n .create(dependencyContainer.resolve(Engine), dependencyContainer.resolve(CoreTokens.WorkflowRepository));\n }),\n });\n container.register(CoreTokens.WorkflowRunnerService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(EngineWorkflowRunnerServiceFactory)\n .create(dependencyContainer.resolve(Engine), dependencyContainer.resolve(CoreTokens.WorkflowRepository));\n }),\n });\n }\n\n private resolveMatcherProvider(options: EngineRuntimeRegistrationOptions | undefined): WebhookTriggerMatcherProvider {\n if (options?.webhookTriggerMatcherProvider) {\n return options.webhookTriggerMatcherProvider;\n }\n return {\n createMatcher: (container) =>\n container\n .resolve(WorkflowRepositoryWebhookTriggerMatcherFactory)\n .create(\n container.resolve(CoreTokens.WorkflowRepository),\n container.resolve(CoreTokens.WorkflowActivationPolicy),\n options?.webhookTriggerRoutingDiagnostics,\n ),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap-DIv-vloi.cjs","names":["EngineExecutionLimitsPolicy","ENGINE_EXECUTION_LIMITS_DEFAULTS","RunFinishedAtFactory","out: RunPruneCandidate[]","RunFinishedAtFactory","engine: TestSuiteOrchestratorEngine","testSuiteRunIdFactory: TestSuiteRunIdFactory","credentialResolverFactory: CredentialResolverFactory","abortControllerFactory: AbortControllerFactory","eventBus: RunEventBus | undefined","currentDate: () => Date","setupContext: TestTriggerSetupContext","cases: TestSuiteCaseOutcome[]","waitForSlot: Promise<void> | undefined","releaseSlot: (() => void) | undefined","queue: Array<Promise<void>>","generationError: Error | undefined","status: TestSuiteRunStatus","executionOptions: RunExecutionOptions","terminal: Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>","status: TestCaseRunStatus","workflowExecutionRepository: WorkflowExecutionRepository","humanTaskStore?: HumanTaskStore","tokenSigner?: HitlResumeTokenSignerSeam","timeoutScheduler?: HitlTimeoutJobSchedulerSeam","workspaceId?: string","handle: HumanTaskHandle","CodemationTelemetryAttributeNames","deliveryRef: Awaited<ReturnType<typeof deliver>>","record: HumanTaskRecord","entry: PersistedSuspensionEntry","updatedState: PersistedRunState","RunSuspendedError","z","InlineDrivingScheduler","CoreTokens","NoOpAgentMcpIntegration","ItemExprResolver","NodeOutputNormalizer","RunnableOutputBehaviorResolver","ChildExecutionScopeFactory","NodeInstanceFactoryFactory","DefaultAsyncSleeper","InProcessRetryRunnerFactory","NodeExecutorFactory","RunIntentServiceFactory","EngineWorkflowRunnerServiceFactory","WorkflowRepositoryWebhookTriggerMatcherFactory","NodeExecutor","HumanTaskStoreToken","HitlResumeTokenSignerToken","HitlTimeoutJobSchedulerToken","HitlWorkspaceIdToken","InlineDrivingScheduler","EngineFactory","Engine","RunIntentService"],"sources":["../src/policies/executionLimits/EngineExecutionLimitsPolicyFactory.ts","../src/runStorage/RunSummaryMapper.ts","../src/runStorage/InMemoryWorkflowExecutionRepository.ts","../src/orchestration/AbortControllerFactory.ts","../src/orchestration/TestSuiteOrchestrator.ts","../src/orchestration/TestSuiteRunIdFactory.ts","../src/execution/NodeSuspensionHandler.ts","../src/scheduler/InlineDrivingSchedulerFactory.ts","../src/bootstrap/runtime/EngineRuntimeRegistrar.ts"],"sourcesContent":["import {\n EngineExecutionLimitsPolicy,\n ENGINE_EXECUTION_LIMITS_DEFAULTS,\n type EngineExecutionLimitsPolicyConfig,\n} from \"./EngineExecutionLimitsPolicy\";\n\n/**\n * Builds {@link EngineExecutionLimitsPolicy} by merging {@link ENGINE_EXECUTION_LIMITS_DEFAULTS} with optional `overrides` (e.g. host `runtime.engineExecutionLimits`).\n */\nexport class EngineExecutionLimitsPolicyFactory {\n create(overrides?: Partial<EngineExecutionLimitsPolicyConfig>): EngineExecutionLimitsPolicy {\n return new EngineExecutionLimitsPolicy({ ...ENGINE_EXECUTION_LIMITS_DEFAULTS, ...overrides });\n }\n}\n","import { RunFinishedAtFactory } from \"../contracts/runFinishedAtFactory\";\nimport type { PersistedRunState, RunSummary } from \"../types\";\n\n/** Maps persisted run state to API run summaries for listings. */\nexport class RunSummaryMapper {\n static fromPersistedState(state: PersistedRunState): RunSummary {\n return {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: state.status,\n finishedAt: RunFinishedAtFactory.resolveIso(state),\n parent: state.parent,\n executionOptions: state.executionOptions,\n };\n }\n}\n","import type {\n EngineRunCounters,\n NodeId,\n NodeOutputs,\n ParentExecutionRef,\n PersistedRunSchedulingState,\n PersistedRunState,\n RunId,\n RunSummary,\n WorkflowExecutionListingRepository,\n WorkflowExecutionPruneRepository,\n WorkflowExecutionRepository,\n RunPruneCandidate,\n WorkflowId,\n} from \"../types\";\nimport { RunFinishedAtFactory } from \"../contracts/runFinishedAtFactory\";\nimport { RunSummaryMapper } from \"./RunSummaryMapper\";\n\nexport class InMemoryWorkflowExecutionRepository\n implements WorkflowExecutionRepository, WorkflowExecutionListingRepository, WorkflowExecutionPruneRepository\n{\n private readonly runs = new Map<RunId, PersistedRunState>();\n\n async createRun(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: PersistedRunState[\"executionOptions\"];\n control?: PersistedRunState[\"control\"];\n workflowSnapshot?: PersistedRunState[\"workflowSnapshot\"];\n mutableState?: PersistedRunState[\"mutableState\"];\n policySnapshot?: PersistedRunState[\"policySnapshot\"];\n engineCounters?: EngineRunCounters;\n }): Promise<void> {\n this.runs.set(args.runId, {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n revision: 0,\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 status: \"running\",\n queue: [],\n outputsByNode: {} as Record<NodeId, NodeOutputs>,\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n });\n }\n\n async load(runId: RunId): Promise<PersistedRunState | undefined> {\n return this.runs.get(runId);\n }\n\n async loadSchedulingState(runId: RunId): Promise<PersistedRunSchedulingState | undefined> {\n const state = this.runs.get(runId);\n if (!state) {\n return undefined;\n }\n return {\n pending: state.pending ? { ...state.pending } : undefined,\n queue: state.queue.map((entry) => ({ ...entry })),\n };\n }\n\n async save(state: PersistedRunState): Promise<void> {\n this.runs.set(state.runId, { ...state, revision: (state.revision ?? 0) + 1 });\n }\n\n async deleteRun(runId: RunId): Promise<void> {\n this.runs.delete(runId);\n }\n\n async listRuns(args?: Readonly<{ workflowId?: WorkflowId; limit?: number }>): Promise<ReadonlyArray<RunSummary>> {\n const limit = args?.limit ?? 50;\n const summaries = [...this.runs.values()]\n .filter((s) => (args?.workflowId ? s.workflowId === args.workflowId : true))\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, limit)\n .map((s) => RunSummaryMapper.fromPersistedState(s));\n return summaries;\n }\n\n async listRunsOlderThan(\n args: Readonly<{ nowIso: string; defaultRetentionSeconds: number; limit?: number }>,\n ): Promise<ReadonlyArray<RunPruneCandidate>> {\n const limit = args.limit ?? 100;\n const out: RunPruneCandidate[] = [];\n for (const s of this.runs.values()) {\n if (s.status !== \"completed\" && s.status !== \"failed\") continue;\n const finishedAt = RunFinishedAtFactory.resolveIso(s);\n const retentionSeconds = s.policySnapshot?.retentionSeconds ?? args.defaultRetentionSeconds;\n const cutoffIso = new Date(new Date(args.nowIso).getTime() - retentionSeconds * 1000).toISOString();\n if (!finishedAt || finishedAt >= cutoffIso) continue;\n out.push({\n runId: s.runId,\n workflowId: s.workflowId,\n startedAt: s.startedAt,\n finishedAt,\n });\n }\n out.sort((a, b) => a.finishedAt.localeCompare(b.finishedAt));\n return out.slice(0, limit);\n }\n}\n","/**\n * Mints fresh {@link AbortController}s. Injected (rather than direct `new`) to honor the\n * codebase's no-direct-construction rule and to give tests a seam for substituting a fake.\n */\nexport class AbortControllerFactory {\n create(): AbortController {\n return new AbortController();\n }\n}\n","import type { CredentialResolverFactory } from \"../execution/CredentialResolverFactory\";\nimport type { RunEventBus, TestCaseRunStatus, TestSuiteRunStatus } from \"../events/runEvents\";\nimport type {\n Item,\n Items,\n NodeId,\n ParentExecutionRef,\n RunExecutionOptions,\n RunId,\n RunResult,\n TestSuiteRunId,\n TestTriggerNodeConfig,\n TestTriggerSetupContext,\n TriggerNodeConfig,\n WorkflowDefinition,\n WorkflowId,\n} from \"../types\";\n\nimport type { AbortControllerFactory } from \"./AbortControllerFactory\";\nimport { TestSuiteRunIdFactory } from \"./TestSuiteRunIdFactory\";\n\nconst DEFAULT_CONCURRENCY = 4;\n\n/**\n * Engine-facade subset the orchestrator needs. Kept narrow on purpose so unit tests can\n * substitute a fake without depending on the full Engine wiring.\n */\nexport interface TestSuiteOrchestratorEngine {\n runWorkflow(\n wf: WorkflowDefinition,\n startAt: NodeId,\n items: Items,\n parent?: ParentExecutionRef,\n executionOptions?: RunExecutionOptions,\n ): Promise<RunResult>;\n waitForCompletion(runId: RunId): Promise<Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>>;\n}\n\nexport interface TestSuiteCaseOutcome {\n readonly testCaseIndex: number;\n readonly runId: RunId;\n readonly status: TestCaseRunStatus;\n}\n\nexport interface TestSuiteRunResult {\n readonly testSuiteRunId: TestSuiteRunId;\n readonly workflowId: WorkflowId;\n readonly triggerNodeId: NodeId;\n readonly status: TestSuiteRunStatus;\n readonly totalCases: number;\n readonly passedCases: number;\n readonly failedCases: number;\n readonly cases: ReadonlyArray<TestSuiteCaseOutcome>;\n}\n\nexport interface RunTestSuiteArgs {\n readonly workflow: WorkflowDefinition;\n readonly triggerNodeId: NodeId;\n readonly testSuiteRunId?: TestSuiteRunId;\n readonly concurrency?: number;\n readonly signal?: AbortSignal;\n}\n\n/**\n * Drives a {@link TestTriggerNodeConfig.generateItems} iterable into one workflow run per item,\n * with bounded concurrency. Pure engine logic — no persistence, no HTTP, no UI. Hosts adapt by\n * subscribing to {@link RunEventBus} and writing rows on `testSuite*` / `testCase*` / `nodeCompleted`.\n *\n * Cancellation: the supplied `AbortSignal` aborts the source iterable (so credentialed pulls bail)\n * and stops scheduling further cases. In-flight cases are awaited; engine-level cancellation of\n * an already-dispatched run is not yet wired (Phase 2).\n */\nexport class TestSuiteOrchestrator {\n constructor(\n private readonly engine: TestSuiteOrchestratorEngine,\n private readonly testSuiteRunIdFactory: TestSuiteRunIdFactory,\n private readonly credentialResolverFactory: CredentialResolverFactory,\n private readonly abortControllerFactory: AbortControllerFactory,\n private readonly eventBus: RunEventBus | undefined,\n private readonly currentDate: () => Date = () => new Date(),\n ) {}\n\n async runSuite(args: RunTestSuiteArgs): Promise<TestSuiteRunResult> {\n const triggerNodeId = args.triggerNodeId;\n const definition = args.workflow.nodes.find((n) => n.id === triggerNodeId);\n if (!definition) {\n throw new Error(`Unknown trigger nodeId: ${triggerNodeId}`);\n }\n if (definition.kind !== \"trigger\") {\n throw new Error(`Node ${triggerNodeId} is not a trigger`);\n }\n const triggerConfig = definition.config as TriggerNodeConfig;\n if (triggerConfig.triggerKind !== \"test\") {\n throw new Error(\n `Node ${triggerNodeId} is not a test trigger (triggerKind=\"${triggerConfig.triggerKind ?? \"live\"}\")`,\n );\n }\n const testTriggerConfig = triggerConfig as TestTriggerNodeConfig<unknown>;\n if (typeof testTriggerConfig.generateItems !== \"function\") {\n throw new Error(`Test trigger ${triggerNodeId} is missing a generateItems implementation`);\n }\n\n const testSuiteRunId = args.testSuiteRunId ?? this.testSuiteRunIdFactory.makeTestSuiteRunId();\n const concurrency = Math.max(1, args.concurrency ?? testTriggerConfig.concurrency ?? DEFAULT_CONCURRENCY);\n const externalSignal = args.signal;\n const internalAbort = this.abortControllerFactory.create();\n const onExternalAbort = () => internalAbort.abort(externalSignal?.reason);\n if (externalSignal) {\n if (externalSignal.aborted) {\n internalAbort.abort(externalSignal.reason);\n } else {\n externalSignal.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n }\n\n const triggerNodeName = definition.name ?? testTriggerConfig.name;\n\n await this.publish({\n kind: \"testSuiteStarted\",\n testSuiteRunId,\n workflowId: args.workflow.id,\n triggerNodeId,\n ...(triggerNodeName ? { triggerNodeName } : {}),\n concurrency,\n at: this.now(),\n });\n\n const setupContext: TestTriggerSetupContext = {\n workflowId: args.workflow.id,\n nodeId: triggerNodeId,\n config: testTriggerConfig,\n testSuiteRunId,\n getCredential: this.credentialResolverFactory.create(args.workflow.id, triggerNodeId, testTriggerConfig),\n signal: internalAbort.signal,\n };\n\n const cases: TestSuiteCaseOutcome[] = [];\n let nextIndex = 0;\n let inFlight = 0;\n let waitForSlot: Promise<void> | undefined;\n let releaseSlot: (() => void) | undefined;\n const queue: Array<Promise<void>> = [];\n let generationError: Error | undefined;\n\n const acquireSlot = async (): Promise<void> => {\n while (inFlight >= concurrency) {\n if (!waitForSlot) {\n waitForSlot = new Promise<void>((resolve) => {\n releaseSlot = resolve;\n });\n }\n await waitForSlot;\n }\n inFlight += 1;\n };\n\n const release = (): void => {\n inFlight -= 1;\n if (releaseSlot) {\n const fn = releaseSlot;\n releaseSlot = undefined;\n waitForSlot = undefined;\n fn();\n }\n };\n\n try {\n for await (const item of testTriggerConfig.generateItems(setupContext) as AsyncIterable<Item<unknown>>) {\n if (internalAbort.signal.aborted) {\n break;\n }\n await acquireSlot();\n if (internalAbort.signal.aborted) {\n release();\n break;\n }\n const testCaseIndex = nextIndex++;\n const testCaseLabel = this.resolveCaseLabel(testTriggerConfig, item);\n queue.push(\n this.runOneCase({\n workflow: args.workflow,\n triggerNodeId,\n testSuiteRunId,\n testCaseIndex,\n testCaseLabel,\n item,\n })\n .then((outcome) => {\n cases.push(outcome);\n })\n .finally(release),\n );\n }\n } catch (err) {\n generationError = err instanceof Error ? err : new Error(String(err));\n } finally {\n if (externalSignal) {\n externalSignal.removeEventListener(\"abort\", onExternalAbort);\n }\n }\n\n await Promise.all(queue);\n\n cases.sort((a, b) => a.testCaseIndex - b.testCaseIndex);\n const totalCases = cases.length;\n const passedCases = cases.filter((c) => c.status === \"succeeded\").length;\n const failedCases = cases.filter((c) => c.status === \"failed\").length;\n const status: TestSuiteRunStatus = this.deriveSuiteStatus({\n generationError,\n cancelled: internalAbort.signal.aborted,\n totalCases,\n passedCases,\n failedCases,\n });\n\n await this.publish({\n kind: \"testSuiteFinished\",\n testSuiteRunId,\n workflowId: args.workflow.id,\n status,\n totalCases,\n passedCases,\n failedCases,\n at: this.now(),\n });\n\n if (generationError && status === \"errored\") {\n throw generationError;\n }\n\n return {\n testSuiteRunId,\n workflowId: args.workflow.id,\n triggerNodeId,\n status,\n totalCases,\n passedCases,\n failedCases,\n cases,\n };\n }\n\n private async runOneCase(args: {\n workflow: WorkflowDefinition;\n triggerNodeId: NodeId;\n testSuiteRunId: TestSuiteRunId;\n testCaseIndex: number;\n testCaseLabel: string | undefined;\n item: Item<unknown>;\n }): Promise<TestSuiteCaseOutcome> {\n const executionOptions: RunExecutionOptions = {\n testContext: {\n testSuiteRunId: args.testSuiteRunId,\n testCaseIndex: args.testCaseIndex,\n ...(args.testCaseLabel !== undefined ? { testCaseLabel: args.testCaseLabel } : {}),\n },\n };\n\n const initial = await this.engine.runWorkflow(\n args.workflow,\n args.triggerNodeId,\n [args.item],\n undefined,\n executionOptions,\n );\n\n const runId = initial.runId;\n await this.publish({\n kind: \"testCaseStarted\",\n testSuiteRunId: args.testSuiteRunId,\n testCaseIndex: args.testCaseIndex,\n runId,\n workflowId: args.workflow.id,\n at: this.now(),\n ...(args.testCaseLabel !== undefined ? { testCaseLabel: args.testCaseLabel } : {}),\n });\n\n let terminal: Extract<RunResult, { status: \"completed\" | \"failed\" | \"halted\" }>;\n if (initial.status === \"completed\" || initial.status === \"failed\") {\n terminal = initial;\n } else {\n terminal = await this.engine.waitForCompletion(runId);\n }\n\n // RunResult.status from the engine narrows to \"completed\" | \"failed\" | \"halted\" here; widening to\n // \"errored\" / \"cancelled\" happens outside this code path (tracker downgrade for assertion\n // failures; outer abort handling for cancelled). Halted runs are treated as \"failed\" for\n // test case status purposes.\n const status: TestCaseRunStatus = terminal.status === \"completed\" ? \"succeeded\" : \"failed\";\n await this.publish({\n kind: \"testCaseCompleted\",\n testSuiteRunId: args.testSuiteRunId,\n testCaseIndex: args.testCaseIndex,\n runId,\n workflowId: args.workflow.id,\n status,\n at: this.now(),\n });\n return { testCaseIndex: args.testCaseIndex, runId, status };\n }\n\n private deriveSuiteStatus(args: {\n generationError: Error | undefined;\n cancelled: boolean;\n totalCases: number;\n passedCases: number;\n failedCases: number;\n }): TestSuiteRunStatus {\n if (args.generationError && args.totalCases === 0) {\n return \"errored\";\n }\n if (args.cancelled) {\n return \"cancelled\";\n }\n if (args.generationError) {\n return \"errored\";\n }\n if (args.totalCases === 0) {\n return \"succeeded\";\n }\n if (args.failedCases === 0) {\n return \"succeeded\";\n }\n if (args.passedCases === 0) {\n return \"failed\";\n }\n return \"partial\";\n }\n\n private now(): string {\n return this.currentDate().toISOString();\n }\n\n /** Defensive label resolver — author-supplied callbacks throw / return non-strings; we tolerate both. */\n private resolveCaseLabel(config: TestTriggerNodeConfig<unknown>, item: Item<unknown>): string | undefined {\n if (typeof config.caseLabel !== \"function\") return undefined;\n try {\n const result = config.caseLabel(item);\n if (typeof result !== \"string\") return undefined;\n const trimmed = result.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n } catch {\n return undefined;\n }\n }\n\n private async publish(event: Parameters<RunEventBus[\"publish\"]>[0]): Promise<void> {\n if (!this.eventBus) return;\n await this.eventBus.publish(event);\n }\n}\n","import type { TestSuiteRunId } from \"../contracts/testTriggerTypes\";\n\n/**\n * Mints unique TestSuiteRun identifiers. Separated from {@link import(\"../types\").RunIdFactory}\n * so suite ids and per-case workflow run ids never alias.\n */\nexport class TestSuiteRunIdFactory {\n makeTestSuiteRunId(): TestSuiteRunId {\n return `tsr_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\n\nimport type { HitlResumeTokenSignerSeam, HitlTimeoutJobSchedulerSeam } from \"../contracts/hitlSeamTypes\";\nimport type { HumanTaskRecord, HumanTaskStore } from \"../contracts/humanTaskStoreTypes\";\nimport type {\n HumanTaskHandle,\n NodeActivationId,\n NodeId,\n PersistedRunState,\n PersistedSuspensionEntry,\n RunId,\n SuspensionRequest,\n WorkflowExecutionRepository,\n} from \"../types\";\nimport type { TelemetryScope } from \"../contracts/telemetryTypes\";\nimport { CodemationTelemetryAttributeNames } from \"../contracts/CodemationTelemetryAttributeNames\";\n\nimport { RunSuspendedError } from \"./RunSuspendedError\";\nexport { RunSuspendedError };\n\n/**\n * Handles per-item `SuspensionRequest` catches in the engine's item execution loop.\n *\n * Responsibilities:\n * 1. Generate a `taskId` (UUID v4).\n * 2. Persist a `HumanTask` row via `HumanTaskStore.create`.\n * 3. Sign a resume URL via `HitlResumeTokenSigner.sign`.\n * 4. Enqueue a delayed BullMQ timeout job via `HitlTimeoutJobScheduler.enqueue`.\n * 5. Build a `HumanTaskHandle` and call `deliver`.\n * 6. Append a `PersistedSuspensionEntry` to the run state and flip status to `\"suspended\"`.\n * 7. Persist via `WorkflowExecutionRepository.save`.\n * 8. Throw `RunSuspendedError` so the caller can exit cleanly.\n *\n * If `deliver` throws, the error propagates up to `NodeExecutionRequestHandlerService`\n * which routes it through `resumeFromNodeError` → run status becomes `\"failed\"`.\n *\n * `humanTaskStore`, `tokenSigner`, and `timeoutScheduler` are optional —\n * when not registered (e.g. in unit tests), the handler still suspends the run but\n * skips persistence, token signing, and job scheduling.\n */\nexport class NodeSuspensionHandler {\n constructor(\n private readonly workflowExecutionRepository: WorkflowExecutionRepository,\n private readonly humanTaskStore?: HumanTaskStore,\n private readonly tokenSigner?: HitlResumeTokenSignerSeam,\n private readonly timeoutScheduler?: HitlTimeoutJobSchedulerSeam,\n /** Workspace ID to stamp on HumanTaskRecord in managed mode (T7 security fix). Null in non-managed mode. */\n private readonly workspaceId?: string,\n ) {}\n\n async handle(args: {\n runId: RunId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n itemIndex: number;\n suspensionRequest: SuspensionRequest;\n state: PersistedRunState;\n /** Telemetry scope of the node's per-item span. Used to emit `hitl.task.*` span events. */\n telemetry?: TelemetryScope;\n }): Promise<never> {\n const taskId = `htask_${globalThis.crypto.randomUUID()}`;\n const { timeout, onTimeout, deliver, decisionSchema, subject, metadata } = args.suspensionRequest.request;\n\n const timeoutMs = this.parseDurationMs(timeout);\n const expiresAt = new Date(Date.now() + timeoutMs);\n\n const decisionSchemaHash = this.hashSchema(decisionSchema);\n const decisionSchemaJson = this.schemaToJson(decisionSchema);\n\n // Build resume token (when signer is available)\n let resumeUrl = \"\";\n let resumeTokenHash = \"\";\n if (this.tokenSigner) {\n const token = this.tokenSigner.sign({ taskId, expiresAt, schemaHash: decisionSchemaHash });\n resumeUrl = token; // callers (deliver) receive the raw token; inbox layers wrap into a URL\n resumeTokenHash = this.tokenSigner.hashToken(token);\n }\n\n const handle: HumanTaskHandle = {\n taskId,\n runId: args.runId,\n nodeId: args.nodeId,\n expiresAt,\n resumeUrl,\n ...(metadata !== undefined ? { metadata } : {}),\n };\n\n // Emit hitl.task.created before calling deliver.\n const channel = (metadata as Record<string, unknown> | undefined)?.[\"channel\"];\n await args.telemetry?.addSpanEvent?.({\n name: \"hitl.task.created\",\n attributes: {\n [CodemationTelemetryAttributeNames.hitlTaskId]: taskId,\n [CodemationTelemetryAttributeNames.hitlChannel]: typeof channel === \"string\" ? channel : \"unknown\",\n [CodemationTelemetryAttributeNames.runId]: args.runId,\n [CodemationTelemetryAttributeNames.nodeId]: args.nodeId,\n expiresAt: expiresAt.toISOString(),\n },\n });\n\n // D5: deliver throws → emit hitl.task.delivery_failed, then propagate upward;\n // caller routes to resumeFromNodeError → \"failed\"\n let deliveryRef: Awaited<ReturnType<typeof deliver>>;\n try {\n deliveryRef = await deliver(handle);\n } catch (deliverError) {\n await args.telemetry?.addSpanEvent?.({\n name: \"hitl.task.delivery_failed\",\n attributes: {\n [CodemationTelemetryAttributeNames.hitlTaskId]: taskId,\n [CodemationTelemetryAttributeNames.hitlChannel]: typeof channel === \"string\" ? channel : \"unknown\",\n error: deliverError instanceof Error ? deliverError.message : String(deliverError),\n },\n });\n throw deliverError;\n }\n\n // Persist HumanTask row\n if (this.humanTaskStore) {\n const record: HumanTaskRecord = {\n id: taskId,\n runId: args.runId,\n workflowId: args.state.workflowId,\n // T7: stamp workspaceId in managed mode so HitlCallbackHandler can assert workspace identity.\n // Non-managed mode leaves this undefined (null in DB) — the check in HitlCallbackHandler\n // is guarded by `task.workspaceId !== undefined` and is a no-op when null.\n workspaceId: this.workspaceId ?? undefined,\n nodeId: args.nodeId,\n activationId: args.activationId,\n itemIndex: args.itemIndex,\n status: \"pending\",\n channel: \"local\",\n subject,\n metadata: (metadata as Record<string, import(\"../contracts/workflowTypes\").JsonValue>) ?? {},\n decisionSchemaJson,\n decisionSchemaHash,\n onTimeout,\n deliveryRef,\n resumeTokenHash: resumeTokenHash || \"no-token\",\n expiresAt,\n createdAt: new Date(),\n };\n await this.humanTaskStore.create(record);\n }\n\n // Enqueue timeout job\n if (this.timeoutScheduler) {\n await this.timeoutScheduler.enqueueTimeoutJob({ taskId, expiresAt });\n }\n\n const entry: PersistedSuspensionEntry = {\n taskId,\n nodeId: args.nodeId,\n activationId: args.activationId,\n itemIndex: args.itemIndex,\n decisionSchemaHash,\n deliveryRef,\n timeoutAt: expiresAt.toISOString(),\n onTimeout,\n };\n\n const existingSuspensions = args.state.suspension ?? [];\n const updatedState: PersistedRunState = {\n ...args.state,\n status: \"suspended\",\n suspension: [...existingSuspensions, entry],\n };\n\n await this.workflowExecutionRepository.save(updatedState);\n\n throw new RunSuspendedError(args.runId, taskId);\n }\n\n /**\n * Parse a duration string into milliseconds.\n * Accepts ISO 8601 durations (\"PT24H\", \"PT30M\") and shorthand (\"24h\", \"30m\", \"1d\").\n * Throws for unrecognised formats.\n */\n private parseDurationMs(duration: string): number {\n // Shorthand: \"24h\", \"30m\", \"7d\", \"3600s\"\n const shorthand = /^(\\d+(?:\\.\\d+)?)(s|m|h|d)$/i.exec(duration);\n if (shorthand) {\n const value = parseFloat(shorthand[1]!);\n const unit = shorthand[2]!.toLowerCase();\n const multipliers: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n };\n return value * multipliers[unit]!;\n }\n // ISO 8601 duration subset: PTnHnMnS (days handled via P1D)\n const iso = /^P(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/.exec(duration);\n if (iso) {\n const days = parseFloat(iso[1] ?? \"0\");\n const hours = parseFloat(iso[2] ?? \"0\");\n const minutes = parseFloat(iso[3] ?? \"0\");\n const seconds = parseFloat(iso[4] ?? \"0\");\n return (days * 86_400 + hours * 3_600 + minutes * 60 + seconds) * 1_000;\n }\n throw new Error(`NodeSuspensionHandler: unrecognised duration format: \"${duration}\"`);\n }\n\n private hashSchema(schema: unknown): string {\n const json = this.schemaToJson(schema);\n return createHash(\"sha256\").update(json).digest(\"hex\");\n }\n\n private schemaToJson(schema: unknown): string {\n if (schema instanceof z.ZodType) {\n return JSON.stringify(z.toJSONSchema(schema));\n }\n if (typeof (schema as { toJSON?: unknown }).toJSON === \"function\") {\n return JSON.stringify((schema as { toJSON: () => unknown }).toJSON());\n }\n return JSON.stringify(schema);\n }\n}\n","import { NodeExecutor } from \"../execution/NodeExecutor\";\n\nimport { InlineDrivingScheduler } from \"./InlineDrivingScheduler\";\n\nexport class InlineDrivingSchedulerFactory {\n create(nodeExecutor: NodeExecutor): InlineDrivingScheduler {\n return new InlineDrivingScheduler(nodeExecutor);\n }\n}\n","import { instanceCachingFactory, type DependencyContainer } from \"../../di\";\nimport { CoreTokens } from \"../../di\";\nimport { NoOpAgentMcpIntegration } from \"../../contracts/NoOpAgentMcpIntegration\";\nimport { EngineExecutionLimitsPolicyFactory } from \"../../policies/executionLimits/EngineExecutionLimitsPolicyFactory\";\nimport {\n ChildExecutionScopeFactory,\n DefaultAsyncSleeper,\n InProcessRetryRunnerFactory,\n ItemExprResolver,\n NodeExecutor,\n NodeExecutorFactory,\n NodeInstanceFactoryFactory,\n NodeOutputNormalizer,\n RunnableOutputBehaviorResolver,\n} from \"../../execution\";\nimport { NodeSuspensionHandler } from \"../../execution/NodeSuspensionHandler\";\nimport { HumanTaskStoreToken } from \"../../contracts/humanTaskStoreTypes\";\nimport {\n HitlResumeTokenSignerToken,\n HitlTimeoutJobSchedulerToken,\n HitlWorkspaceIdToken,\n} from \"../../contracts/hitlSeamTypes\";\nimport {\n EngineFactory,\n EngineWorkflowRunnerServiceFactory,\n RunIntentServiceFactory,\n RunIntentService,\n WorkflowRepositoryWebhookTriggerMatcherFactory,\n} from \"../../runtime\";\nimport { InlineDrivingScheduler } from \"../../scheduler/InlineDrivingScheduler\";\nimport { InlineDrivingSchedulerFactory } from \"../../scheduler/InlineDrivingSchedulerFactory\";\nimport { Engine } from \"../../orchestration/Engine\";\nimport type { EngineRuntimeRegistrationOptions } from \"./EngineRuntimeRegistration.types\";\nimport type { WebhookTriggerMatcherProvider } from \"./EngineRuntimeRegistration.types\";\n\n/**\n * Container-first entry: call on a host/test container **after** workflow, run, node, and credential\n * ports are registered. The registrar owns the default inline scheduler, engine binding,\n * and intent-surface wiring so hosts only override the seams they actually replace.\n */\nexport class EngineRuntimeRegistrar {\n register(container: DependencyContainer, options?: EngineRuntimeRegistrationOptions): void {\n this.registerSupportFactories(container);\n this.registerExecutionLimitsPolicy(container, options);\n this.ensureWorkflowNodeInstanceFactory(container);\n this.ensureNodeExecutor(container);\n this.registerDefaultActivationScheduler(container);\n this.registerEngine(container, options);\n this.registerIntentServices(container);\n this.registerAgentMcpIntegration(container);\n }\n\n private registerAgentMcpIntegration(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.AgentMcpIntegration, true)) {\n return;\n }\n container.registerInstance(CoreTokens.AgentMcpIntegration, new NoOpAgentMcpIntegration());\n }\n\n private registerSupportFactories(container: DependencyContainer): void {\n if (!container.isRegistered(ItemExprResolver, true)) {\n container.registerSingleton(ItemExprResolver, ItemExprResolver);\n }\n if (!container.isRegistered(NodeOutputNormalizer, true)) {\n container.registerSingleton(NodeOutputNormalizer, NodeOutputNormalizer);\n }\n if (!container.isRegistered(RunnableOutputBehaviorResolver, true)) {\n container.registerSingleton(RunnableOutputBehaviorResolver, RunnableOutputBehaviorResolver);\n }\n if (!container.isRegistered(ChildExecutionScopeFactory, true)) {\n container.register(ChildExecutionScopeFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return new ChildExecutionScopeFactory(dependencyContainer.resolve(CoreTokens.ActivationIdFactory));\n }),\n });\n }\n container.registerSingleton(EngineExecutionLimitsPolicyFactory, EngineExecutionLimitsPolicyFactory);\n container.registerSingleton(NodeInstanceFactoryFactory, NodeInstanceFactoryFactory);\n container.registerSingleton(DefaultAsyncSleeper, DefaultAsyncSleeper);\n container.registerSingleton(InProcessRetryRunnerFactory, InProcessRetryRunnerFactory);\n container.registerSingleton(NodeExecutorFactory, NodeExecutorFactory);\n container.registerSingleton(InlineDrivingSchedulerFactory, InlineDrivingSchedulerFactory);\n container.registerSingleton(RunIntentServiceFactory, RunIntentServiceFactory);\n container.registerSingleton(EngineWorkflowRunnerServiceFactory, EngineWorkflowRunnerServiceFactory);\n container.registerSingleton(\n WorkflowRepositoryWebhookTriggerMatcherFactory,\n WorkflowRepositoryWebhookTriggerMatcherFactory,\n );\n }\n\n private registerExecutionLimitsPolicy(\n container: DependencyContainer,\n options: EngineRuntimeRegistrationOptions | undefined,\n ): void {\n if (container.isRegistered(CoreTokens.EngineExecutionLimitsPolicy, true)) {\n return;\n }\n container.register(CoreTokens.EngineExecutionLimitsPolicy, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const fromResolver = options?.resolveEngineExecutionLimits?.();\n const merged = fromResolver ?? options?.engineExecutionLimits;\n return dependencyContainer.resolve(EngineExecutionLimitsPolicyFactory).create(merged);\n }),\n });\n }\n\n private ensureWorkflowNodeInstanceFactory(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.WorkflowNodeInstanceFactory, true)) {\n return;\n }\n container.register(CoreTokens.WorkflowNodeInstanceFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(NodeInstanceFactoryFactory)\n .create(dependencyContainer.resolve(CoreTokens.NodeResolver));\n }),\n });\n }\n\n private ensureNodeExecutor(container: DependencyContainer): void {\n if (container.isRegistered(NodeExecutor, true)) {\n return;\n }\n container.register(NodeExecutor, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const retryRunner = dependencyContainer\n .resolve(InProcessRetryRunnerFactory)\n .create(dependencyContainer.resolve(DefaultAsyncSleeper));\n const workflowExecutionRepository = dependencyContainer.resolve(CoreTokens.WorkflowExecutionRepository);\n const humanTaskStore = dependencyContainer.isRegistered(HumanTaskStoreToken, true)\n ? dependencyContainer.resolve(HumanTaskStoreToken)\n : undefined;\n const tokenSigner = dependencyContainer.isRegistered(HitlResumeTokenSignerToken, true)\n ? dependencyContainer.resolve(HitlResumeTokenSignerToken)\n : undefined;\n const timeoutScheduler = dependencyContainer.isRegistered(HitlTimeoutJobSchedulerToken, true)\n ? dependencyContainer.resolve(HitlTimeoutJobSchedulerToken)\n : undefined;\n const workspaceId = dependencyContainer.isRegistered(HitlWorkspaceIdToken, true)\n ? dependencyContainer.resolve(HitlWorkspaceIdToken)\n : undefined;\n const suspensionHandler = new NodeSuspensionHandler(\n workflowExecutionRepository,\n humanTaskStore ?? undefined,\n tokenSigner ?? undefined,\n timeoutScheduler ?? undefined,\n workspaceId ?? undefined,\n );\n return dependencyContainer\n .resolve(NodeExecutorFactory)\n .create(\n dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory),\n retryRunner,\n dependencyContainer.resolve(RunnableOutputBehaviorResolver),\n suspensionHandler,\n (runId) => workflowExecutionRepository.load(runId),\n );\n }),\n });\n }\n\n private registerDefaultActivationScheduler(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.NodeActivationScheduler, true)) {\n return;\n }\n container.register(InlineDrivingScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(InlineDrivingSchedulerFactory)\n .create(dependencyContainer.resolve(NodeExecutor));\n }),\n });\n container.register(CoreTokens.NodeActivationScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer.resolve(InlineDrivingScheduler);\n }),\n });\n }\n\n private registerEngine(container: DependencyContainer, options: EngineRuntimeRegistrationOptions | undefined): void {\n container.registerSingleton(EngineFactory, EngineFactory);\n const matcherProvider = this.resolveMatcherProvider(options);\n container.register(Engine, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const liveWorkflowRepository = dependencyContainer.resolve(CoreTokens.LiveWorkflowRepository);\n const nodeResolver = dependencyContainer.resolve(CoreTokens.NodeResolver);\n const tokenRegistryLike = dependencyContainer.resolve(CoreTokens.PersistedWorkflowTokenRegistry);\n const workflowActivationPolicy = dependencyContainer.resolve(CoreTokens.WorkflowActivationPolicy);\n const webhookTriggerMatcher = matcherProvider.createMatcher(dependencyContainer);\n const workflowNodeInstanceFactory = dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory);\n const triggerRuntimeDiagnostics = options?.triggerRuntimeDiagnosticsProvider?.create(dependencyContainer);\n return dependencyContainer.resolve(EngineFactory).create({\n credentialSessions: dependencyContainer.resolve(CoreTokens.CredentialSessionService),\n liveWorkflowRepository,\n workflowRepository: dependencyContainer.resolve(CoreTokens.WorkflowRepository),\n workflowActivationPolicy,\n nodeResolver,\n triggerSetupStateRepository: dependencyContainer.resolve(CoreTokens.TriggerSetupStateRepository),\n webhookTriggerMatcher,\n runIdFactory: dependencyContainer.resolve(CoreTokens.RunIdFactory),\n activationIdFactory: dependencyContainer.resolve(CoreTokens.ActivationIdFactory),\n workflowExecutionRepository: dependencyContainer.resolve(CoreTokens.WorkflowExecutionRepository),\n activationScheduler: dependencyContainer.resolve(CoreTokens.NodeActivationScheduler),\n runDataFactory: dependencyContainer.resolve(CoreTokens.RunDataFactory),\n executionContextFactory: dependencyContainer.resolve(CoreTokens.ExecutionContextFactory),\n nodeExecutor: dependencyContainer.resolve(NodeExecutor),\n eventBus: dependencyContainer.resolve(CoreTokens.RunEventBus),\n tokenRegistry: tokenRegistryLike,\n workflowNodeInstanceFactory,\n executionLimitsPolicy: dependencyContainer.resolve(CoreTokens.EngineExecutionLimitsPolicy),\n workflowPolicyRuntimeDefaults: options?.workflowPolicyRuntimeDefaults,\n triggerRuntimeDiagnostics,\n });\n }),\n });\n }\n\n private registerIntentServices(container: DependencyContainer): void {\n container.register(RunIntentService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(RunIntentServiceFactory)\n .create(dependencyContainer.resolve(Engine), dependencyContainer.resolve(CoreTokens.WorkflowRepository));\n }),\n });\n container.register(CoreTokens.WorkflowRunnerService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(EngineWorkflowRunnerServiceFactory)\n .create(dependencyContainer.resolve(Engine), dependencyContainer.resolve(CoreTokens.WorkflowRepository));\n }),\n });\n }\n\n private resolveMatcherProvider(options: EngineRuntimeRegistrationOptions | undefined): WebhookTriggerMatcherProvider {\n if (options?.webhookTriggerMatcherProvider) {\n return options.webhookTriggerMatcherProvider;\n }\n return {\n createMatcher: (container) =>\n container\n .resolve(WorkflowRepositoryWebhookTriggerMatcherFactory)\n .create(\n container.resolve(CoreTokens.WorkflowRepository),\n container.resolve(CoreTokens.WorkflowActivationPolicy),\n options?.webhookTriggerRoutingDiagnostics,\n ),\n };\n }\n}\n"],"mappings":"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"}
package/dist/browser.cjs CHANGED
@@ -1,5 +1,5 @@
1
- const require_di = require('./di-C-2ep8NZ.cjs');
2
- const require_ItemsInputNormalizer = require('./ItemsInputNormalizer-57EdA1ad.cjs');
1
+ const require_di = require('./di-LP2qSHkY.cjs');
2
+ const require_ItemsInputNormalizer = require('./ItemsInputNormalizer-BbQTSEkZ.cjs');
3
3
 
4
4
  exports.AgentConnectionNodeCollector = require_di.AgentConnectionNodeCollector;
5
5
  exports.BINARY_DEFAULT_MAX_BYTES = require_di.BINARY_DEFAULT_MAX_BYTES;
@@ -1,4 +1,4 @@
1
1
  import { $n as NodeActivationRequest, $t as RunnableNodeConfig, A as RunHaltReason, Ai as CredentialOAuth2ScopesFromPublicConfig, An as BinaryAttachmentCreateRequest, Ar as WorkflowSnapshotResolver, At as JsonValue, B as WorkflowExecutionListingRepository, Bi as CredentialUnboundError, Bn as ExecutableTriggerNode, Bt as NodeIterationId, C as PersistedWorkflowSnapshotNode, Ci as CredentialHealthStatus, Cn as triggerNodeOutputType, Cr as TriggerSetupStateRepository, Ct as Item, D as RunCurrentState, Di as CredentialJsonRecord, Dr as WorkflowRunnerResolver, Dt as JsonNonArray, E as RunCompletionNotifier, Ei as CredentialInstanceRecord, Er as WorkflowRepository, Et as JsonArray, F as RunStatus, Fi as CredentialSetupStatus, Fn as BinaryStorageWriteRequest, Fr as WebhookTriggerMatcher, Ft as NodeErrorHandler, Gi as InputPortKey, Gn as HumanTaskHandle, Gt as NodeSchedulerDecision, H as WorkflowExecutionRepository, Hn as ExecutionContext, Ht as NodeOffloadPolicy, I as RunStopCondition, Ii as CredentialType, In as BinaryStorageWriteResult, Ir as WebhookTriggerResolution, It as NodeErrorHandlerArgs, Ji as OutputPortKey, Jn as ItemNode, Jt as PersistedRunPolicySnapshot, Ki as NodeConnectionName, Kn as HumanTaskId, Kt as PairedItemRef, L as RunSummary, Li as CredentialTypeDefinition, Ln as Duration, Lr as WebhookTriggerRoutingDiagnostics, Lt as NodeErrorHandlerSpec, M as RunQueueEntry, Mi as CredentialSessionFactory, Mn as BinaryStorage, Mr as TriggerInstanceId, Mt as NodeActivationId, N as RunResult, Ni as CredentialSessionFactoryArgs, Nn as BinaryStorageReadResult, Nr as WebhookControlSignal, Nt as NodeConfigBase, O as RunEventPublisherDeps, Oi as CredentialMaterialSourceKind, On as RetryPolicySpec, Or as WorkflowRunnerService, Ot as JsonObject, P as RunStateResetRequest, Pi as CredentialSessionService, Pn as BinaryStorageStatResult, Pr as WebhookInvocationMatch, Pt as NodeDefinition, Qn as NodeActivationReceipt, Qt as RunIdFactory, R as RunTestContext, Ri as CredentialTypeId, Rn as EngineDeps, Rt as NodeIdRef, S as PersistedWorkflowSnapshot, Si as CredentialHealth, Sn as runnableNodeOutputType, Sr as TriggerSetupStateFor, St as ExecutionMode, T as PinnedNodeOutputsByPort, Ti as CredentialInstanceId, Tr as WorkflowNodeInstanceFactory, Tt as Items, Un as ExecutionContextFactory, Ut as NodeOutputs, V as WorkflowExecutionPruneRepository, Vi as OAuth2ProviderFromPublicConfig, Vn as ExecutionBinaryService, Vt as NodeKind, Wn as HumanTaskActor, Wt as NodeRef, Xi as WorkflowId, Xn as MultiInputNode, Xt as RunDataSnapshot, Yi as PersistedTokenId, Yn as LiveWorkflowRepository, Yt as RunDataFactory, Zn as NodeActivationContinuation, Zt as RunId, _ as PersistedMutableRunState, _i as CredentialAdvancedSectionPresentation, _n as WorkflowStoragePolicyResolver, _r as TestableTriggerNode, a as ConnectionInvocationId, an as UpstreamRefPlaceholder, ar as NodeExecutionRequestHandler, b as PersistedRunState, bi as CredentialBindingKey, bn as nodeRef, br as TriggerRuntimeDiagnostics, bt as BinaryPreviewKind, c as EngineRunCounters, cn as WorkflowErrorHandler, cr as NodeExecutor, d as NodeExecutionSnapshot, dn as WorkflowGraphFactory, dr as PollingTriggerHandle, en as RunnableNodeInputJson, er as NodeActivationRequestBase, f as NodeExecutionStatus, fn as WorkflowNodeConnection, fr as PreparedNodeActivationDispatch, g as PersistedMutableNodeState, gi as AnyCredentialType, gn as WorkflowStoragePolicyMode, gr as SuspensionRequest, h as PendingResumeEntry, hn as WorkflowStoragePolicyDecisionArgs, hr as RunnableNodeExecuteArgs, i as ConnectionInvocationAppendArgs, in as TriggerNodeSetupState, ir as NodeExecutionRequest, j as RunPruneCandidate, ji as CredentialRequirement, jn as BinaryBody, jr as HttpMethod, jt as MutableRunData, k as RunExecutionOptions, ki as CredentialOAuth2AuthDefinition, kn as BINARY_DEFAULT_MAX_BYTES, kr as WorkflowSnapshotFactory, kt as JsonPrimitive, l as ExecutionFrontierPlan, ln as WorkflowErrorHandlerSpec, lr as NodeResolver, m as PendingNodeExecution, mn as WorkflowPrunePolicySpec, mr as RunnableNode, nn as TriggerNodeConfig, nr as NodeBinaryAttachmentService, o as ConnectionInvocationRecord, on as WorkflowDefinition, or as NodeExecutionScheduler, p as NodeInputsByPort, pn as WorkflowPolicyRuntimeDefaults, pr as ResumeContext, qi as NodeId, qn as HumanTaskSubject, qt as ParentExecutionRef, rn as TriggerNodeOutputJson, rr as NodeExecutionContext, s as CurrentStateExecutionRequest, sn as WorkflowErrorContext, sr as NodeExecutionStatePublisher, tn as RunnableNodeOutputJson, tr as NodeActivationScheduler, u as NodeExecutionError, un as WorkflowGraph, ur as PersistedTriggerSetupState, v as PersistedRunControlState, vi as CredentialAuthDefinition, vn as WorkflowStoragePolicySpec, vr as TriggerCleanupHandle, vt as ActivationIdFactory, w as PersistedWorkflowTokenRegistryLike, wi as CredentialHealthTester, wn as triggerNodeSetupStateType, wr as TriggerTestItemsContext, wt as ItemBinary, x as PersistedSuspensionEntry, xi as CredentialFieldSchema, xn as runnableNodeInputType, xr as TriggerSetupContext, xt as Edge, y as PersistedRunSchedulingState, yi as CredentialBinding, yn as branchRef, yr as TriggerNode, yt as BinaryAttachment, z as WebhookRunResult, zi as CredentialTypeRegistry, zn as EngineHost, zt as NodeInspectorSummaryRow } from "./agentMcpTypes-DGIwk6Ue.cjs";
2
2
  import "./params-DRUr0F5v.cjs";
3
- import { Q as RunFinishedAtFactory, X as NodeIterationIdFactory, Z as ConnectionNodeIdFactory, a as AgentConnectionNodeRole, i as AgentConnectionNodeDescriptor, n as AgentConnectionCredentialSource, o as McpServerResolver, r as AgentConnectionNodeCollector, t as ItemsInputNormalizer, y as AgentNodeConfig } from "./ItemsInputNormalizer-pLrWwUAP.cjs";
3
+ import { Q as RunFinishedAtFactory, X as NodeIterationIdFactory, Z as ConnectionNodeIdFactory, a as AgentConnectionNodeRole, i as AgentConnectionNodeDescriptor, n as AgentConnectionCredentialSource, o as McpServerResolver, r as AgentConnectionNodeCollector, t as ItemsInputNormalizer, y as AgentNodeConfig } from "./ItemsInputNormalizer-Bi8m-Ijs.cjs";
4
4
  export { ActivationIdFactory, type AgentConnectionCredentialSource, AgentConnectionNodeCollector, type AgentConnectionNodeDescriptor, type AgentConnectionNodeRole, type AgentNodeConfig, AnyCredentialType, BINARY_DEFAULT_MAX_BYTES, BinaryAttachment, BinaryAttachmentCreateRequest, BinaryBody, BinaryPreviewKind, BinaryStorage, BinaryStorageReadResult, BinaryStorageStatResult, BinaryStorageWriteRequest, BinaryStorageWriteResult, ConnectionInvocationAppendArgs, ConnectionInvocationId, ConnectionInvocationRecord, ConnectionNodeIdFactory, CredentialAdvancedSectionPresentation, CredentialAuthDefinition, CredentialBinding, CredentialBindingKey, CredentialFieldSchema, CredentialHealth, CredentialHealthStatus, CredentialHealthTester, CredentialInstanceId, CredentialInstanceRecord, CredentialJsonRecord, CredentialMaterialSourceKind, CredentialOAuth2AuthDefinition, CredentialOAuth2ScopesFromPublicConfig, CredentialRequirement, CredentialSessionFactory, CredentialSessionFactoryArgs, CredentialSessionService, CredentialSetupStatus, CredentialType, CredentialTypeDefinition, CredentialTypeId, CredentialTypeRegistry, CredentialUnboundError, CurrentStateExecutionRequest, Duration, Edge, EngineDeps, EngineHost, EngineRunCounters, ExecutableTriggerNode, ExecutionBinaryService, ExecutionContext, ExecutionContextFactory, ExecutionFrontierPlan, ExecutionMode, HttpMethod, HumanTaskActor, HumanTaskHandle, HumanTaskId, HumanTaskSubject, InputPortKey, Item, ItemBinary, ItemNode, Items, ItemsInputNormalizer, JsonArray, JsonNonArray, JsonObject, JsonPrimitive, JsonValue, LiveWorkflowRepository, type McpServerResolver, MultiInputNode, MutableRunData, NodeActivationContinuation, NodeActivationId, NodeActivationReceipt, NodeActivationRequest, NodeActivationRequestBase, NodeActivationScheduler, NodeBinaryAttachmentService, NodeConfigBase, NodeConnectionName, NodeDefinition, NodeErrorHandler, NodeErrorHandlerArgs, NodeErrorHandlerSpec, NodeExecutionContext, NodeExecutionError, NodeExecutionRequest, NodeExecutionRequestHandler, NodeExecutionScheduler, NodeExecutionSnapshot, NodeExecutionStatePublisher, NodeExecutionStatus, NodeExecutor, NodeId, NodeIdRef, NodeInputsByPort, NodeInspectorSummaryRow, NodeIterationId, NodeIterationIdFactory, NodeKind, NodeOffloadPolicy, NodeOutputs, NodeRef, NodeResolver, NodeSchedulerDecision, OAuth2ProviderFromPublicConfig, OutputPortKey, PairedItemRef, ParentExecutionRef, PendingNodeExecution, PendingResumeEntry, PersistedMutableNodeState, PersistedMutableRunState, PersistedRunControlState, PersistedRunPolicySnapshot, PersistedRunSchedulingState, PersistedRunState, PersistedSuspensionEntry, PersistedTokenId, PersistedTriggerSetupState, PersistedWorkflowSnapshot, PersistedWorkflowSnapshotNode, PersistedWorkflowTokenRegistryLike, PinnedNodeOutputsByPort, PollingTriggerHandle, PreparedNodeActivationDispatch, ResumeContext, type RetryPolicySpec, RunCompletionNotifier, RunCurrentState, RunDataFactory, RunDataSnapshot, RunEventPublisherDeps, RunExecutionOptions, RunFinishedAtFactory, RunHaltReason, RunId, RunIdFactory, RunPruneCandidate, RunQueueEntry, RunResult, RunStateResetRequest, RunStatus, RunStopCondition, RunSummary, RunTestContext, RunnableNode, RunnableNodeConfig, RunnableNodeExecuteArgs, RunnableNodeInputJson, RunnableNodeOutputJson, SuspensionRequest, TestableTriggerNode, TriggerCleanupHandle, TriggerInstanceId, TriggerNode, TriggerNodeConfig, TriggerNodeOutputJson, TriggerNodeSetupState, TriggerRuntimeDiagnostics, TriggerSetupContext, TriggerSetupStateFor, TriggerSetupStateRepository, TriggerTestItemsContext, UpstreamRefPlaceholder, WebhookControlSignal, WebhookInvocationMatch, WebhookRunResult, WebhookTriggerMatcher, WebhookTriggerResolution, WebhookTriggerRoutingDiagnostics, WorkflowDefinition, WorkflowErrorContext, WorkflowErrorHandler, WorkflowErrorHandlerSpec, WorkflowExecutionListingRepository, WorkflowExecutionPruneRepository, WorkflowExecutionRepository, WorkflowGraph, WorkflowGraphFactory, WorkflowId, WorkflowNodeConnection, WorkflowNodeInstanceFactory, WorkflowPolicyRuntimeDefaults, WorkflowPrunePolicySpec, WorkflowRepository, WorkflowRunnerResolver, WorkflowRunnerService, WorkflowSnapshotFactory, WorkflowSnapshotResolver, WorkflowStoragePolicyDecisionArgs, WorkflowStoragePolicyMode, WorkflowStoragePolicyResolver, WorkflowStoragePolicySpec, branchRef, nodeRef, runnableNodeInputType, runnableNodeOutputType, triggerNodeOutputType, triggerNodeSetupStateType };
package/dist/browser.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { $a as CredentialBindingKey, $i as TriggerRuntimeDiagnostics, $n as BinaryPreviewKind, $r as nodeRef, $t as PersistedRunState, Ai as NodeActivationContinuation, Ar as RunId, Bi as NodeExecutionStatePublisher, Br as WorkflowErrorContext, Bt as CurrentStateExecutionRequest, Ci as HumanTaskActor, Cr as NodeRef, Di as ItemNode, Do as OutputPortKey, Dr as PersistedRunPolicySnapshot, Ei as HumanTaskSubject, Eo as NodeId, Er as ParentExecutionRef, Fi as NodeBinaryAttachmentService, Fr as TriggerNodeConfig, Gi as PreparedNodeActivationDispatch, Gr as WorkflowNodeConnection, Gt as NodeExecutionStatus, Hi as NodeResolver, Hr as WorkflowErrorHandlerSpec, Ht as ExecutionFrontierPlan, I as RunFinishedAtFactory, Ii as NodeExecutionContext, Ir as TriggerNodeOutputJson, Ji as RunnableNodeExecuteArgs, Jr as WorkflowStoragePolicyDecisionArgs, Jt as PendingResumeEntry, Ki as ResumeContext, Kr as WorkflowPolicyRuntimeDefaults, Kt as NodeInputsByPort, Li as NodeExecutionRequest, Lr as TriggerNodeSetupState, Lt as ConnectionInvocationAppendArgs, Mi as NodeActivationRequest, Mr as RunnableNodeConfig, Ni as NodeActivationRequestBase, Nr as RunnableNodeInputJson, Oi as LiveWorkflowRepository, Oo as PersistedTokenId, Or as RunDataFactory, Pi as NodeActivationScheduler, Pr as RunnableNodeOutputJson, Qa as CredentialBinding, Qi as TriggerNode, Qn as BinaryAttachment, Qr as branchRef, Qt as PersistedRunSchedulingState, Ri as NodeExecutionRequestHandler, Rr as UpstreamRefPlaceholder, Rt as ConnectionInvocationId, Si as ExecutionContextFactory, Sr as NodeOutputs, Ti as HumanTaskId, To as NodeConnectionName, Tr as PairedItemRef, Ui as PersistedTriggerSetupState, Ur as WorkflowGraph, Ut as NodeExecutionError, Vi as NodeExecutor, Vr as WorkflowErrorHandler, Vt as EngineRunCounters, Wi as PollingTriggerHandle, Wr as WorkflowGraphFactory, Wt as NodeExecutionSnapshot, Xa as CredentialAdvancedSectionPresentation, Xi as TestableTriggerNode, Xr as WorkflowStoragePolicyResolver, Xt as PersistedMutableRunState, Ya as AnyCredentialType, Yi as SuspensionRequest, Yr as WorkflowStoragePolicyMode, Yt as PersistedMutableNodeState, Za as CredentialAuthDefinition, Zi as TriggerCleanupHandle, Zn as ActivationIdFactory, Zr as WorkflowStoragePolicySpec, Zt as PersistedRunControlState, _i as EngineDeps, _n as RunTestContext, _o as CredentialTypeId, _r as NodeIdRef, a as ConnectionNodeIdFactory, aa as WorkflowRepository, an as RunCompletionNotifier, ao as CredentialInstanceRecord, ar as JsonArray, bi as ExecutionBinaryService, bn as WorkflowExecutionPruneRepository, bo as OAuth2ProviderFromPublicConfig, br as NodeKind, ca as WorkflowSnapshotFactory, ci as BINARY_DEFAULT_MAX_BYTES, cn as RunExecutionOptions, co as CredentialOAuth2AuthDefinition, cr as JsonPrimitive, da as TriggerInstanceId, di as BinaryStorage, dn as RunQueueEntry, do as CredentialSessionFactory, dr as NodeActivationId, ea as TriggerSetupContext, ei as runnableNodeInputType, en as PersistedSuspensionEntry, eo as CredentialFieldSchema, er as Edge, fa as WebhookControlSignal, fi as BinaryStorageReadResult, fn as RunResult, fo as CredentialSessionFactoryArgs, fr as NodeConfigBase, ga as WebhookTriggerRoutingDiagnostics, gi as Duration, gn as RunSummary, go as CredentialTypeDefinition, gr as NodeErrorHandlerSpec, ha as WebhookTriggerResolution, hi as BinaryStorageWriteResult, hn as RunStopCondition, ho as CredentialType, hr as NodeErrorHandlerArgs, i as NodeIterationIdFactory, ia as WorkflowNodeInstanceFactory, in as PinnedNodeOutputsByPort, io as CredentialInstanceId, ir as Items, ji as NodeActivationReceipt, jr as RunIdFactory, ki as MultiInputNode, ko as WorkflowId, kr as RunDataSnapshot, la as WorkflowSnapshotResolver, li as BinaryAttachmentCreateRequest, ln as RunHaltReason, lo as CredentialOAuth2ScopesFromPublicConfig, lr as JsonValue, ma as WebhookTriggerMatcher, mi as BinaryStorageWriteRequest, mn as RunStatus, mo as CredentialSetupStatus, mr as NodeErrorHandler, na as TriggerSetupStateRepository, ni as triggerNodeOutputType, nn as PersistedWorkflowSnapshotNode, no as CredentialHealthStatus, nr as Item, oa as WorkflowRunnerResolver, on as RunCurrentState, oo as CredentialJsonRecord, or as JsonNonArray, pa as WebhookInvocationMatch, pi as BinaryStorageStatResult, pn as RunStateResetRequest, po as CredentialSessionService, pr as NodeDefinition, qi as RunnableNode, qr as WorkflowPrunePolicySpec, qt as PendingNodeExecution, ra as TriggerTestItemsContext, ri as triggerNodeSetupStateType, rn as PersistedWorkflowTokenRegistryLike, ro as CredentialHealthTester, rr as ItemBinary, sa as WorkflowRunnerService, si as RetryPolicySpec, sn as RunEventPublisherDeps, so as CredentialMaterialSourceKind, sr as JsonObject, ta as TriggerSetupStateFor, ti as runnableNodeOutputType, tn as PersistedWorkflowSnapshot, to as CredentialHealth, tr as ExecutionMode, ua as HttpMethod, ui as BinaryBody, un as RunPruneCandidate, uo as CredentialRequirement, ur as MutableRunData, vi as EngineHost, vn as WebhookRunResult, vo as CredentialTypeRegistry, vr as NodeInspectorSummaryRow, wi as HumanTaskHandle, wo as InputPortKey, wr as NodeSchedulerDecision, xi as ExecutionContext, xn as WorkflowExecutionRepository, xr as NodeOffloadPolicy, yi as ExecutableTriggerNode, yn as WorkflowExecutionListingRepository, yo as CredentialUnboundError, yr as NodeIterationId, zi as NodeExecutionScheduler, zr as WorkflowDefinition, zt as ConnectionInvocationRecord } from "./index-rllWL4r-.js";
2
- import { a as AgentConnectionNodeRole, i as AgentConnectionNodeDescriptor, n as AgentConnectionCredentialSource, o as McpServerResolver, r as AgentConnectionNodeCollector, t as ItemsInputNormalizer, y as AgentNodeConfig } from "./ItemsInputNormalizer-BWtlwdVI.js";
2
+ import { a as AgentConnectionNodeRole, i as AgentConnectionNodeDescriptor, n as AgentConnectionCredentialSource, o as McpServerResolver, r as AgentConnectionNodeCollector, t as ItemsInputNormalizer, y as AgentNodeConfig } from "./ItemsInputNormalizer-BYljnXU0.js";
3
3
  export { ActivationIdFactory, type AgentConnectionCredentialSource, AgentConnectionNodeCollector, type AgentConnectionNodeDescriptor, type AgentConnectionNodeRole, type AgentNodeConfig, AnyCredentialType, BINARY_DEFAULT_MAX_BYTES, BinaryAttachment, BinaryAttachmentCreateRequest, BinaryBody, BinaryPreviewKind, BinaryStorage, BinaryStorageReadResult, BinaryStorageStatResult, BinaryStorageWriteRequest, BinaryStorageWriteResult, ConnectionInvocationAppendArgs, ConnectionInvocationId, ConnectionInvocationRecord, ConnectionNodeIdFactory, CredentialAdvancedSectionPresentation, CredentialAuthDefinition, CredentialBinding, CredentialBindingKey, CredentialFieldSchema, CredentialHealth, CredentialHealthStatus, CredentialHealthTester, CredentialInstanceId, CredentialInstanceRecord, CredentialJsonRecord, CredentialMaterialSourceKind, CredentialOAuth2AuthDefinition, CredentialOAuth2ScopesFromPublicConfig, CredentialRequirement, CredentialSessionFactory, CredentialSessionFactoryArgs, CredentialSessionService, CredentialSetupStatus, CredentialType, CredentialTypeDefinition, CredentialTypeId, CredentialTypeRegistry, CredentialUnboundError, CurrentStateExecutionRequest, Duration, Edge, EngineDeps, EngineHost, EngineRunCounters, ExecutableTriggerNode, ExecutionBinaryService, ExecutionContext, ExecutionContextFactory, ExecutionFrontierPlan, ExecutionMode, HttpMethod, HumanTaskActor, HumanTaskHandle, HumanTaskId, HumanTaskSubject, InputPortKey, Item, ItemBinary, ItemNode, Items, ItemsInputNormalizer, JsonArray, JsonNonArray, JsonObject, JsonPrimitive, JsonValue, LiveWorkflowRepository, type McpServerResolver, MultiInputNode, MutableRunData, NodeActivationContinuation, NodeActivationId, NodeActivationReceipt, NodeActivationRequest, NodeActivationRequestBase, NodeActivationScheduler, NodeBinaryAttachmentService, NodeConfigBase, NodeConnectionName, NodeDefinition, NodeErrorHandler, NodeErrorHandlerArgs, NodeErrorHandlerSpec, NodeExecutionContext, NodeExecutionError, NodeExecutionRequest, NodeExecutionRequestHandler, NodeExecutionScheduler, NodeExecutionSnapshot, NodeExecutionStatePublisher, NodeExecutionStatus, NodeExecutor, NodeId, NodeIdRef, NodeInputsByPort, NodeInspectorSummaryRow, NodeIterationId, NodeIterationIdFactory, NodeKind, NodeOffloadPolicy, NodeOutputs, NodeRef, NodeResolver, NodeSchedulerDecision, OAuth2ProviderFromPublicConfig, OutputPortKey, PairedItemRef, ParentExecutionRef, PendingNodeExecution, PendingResumeEntry, PersistedMutableNodeState, PersistedMutableRunState, PersistedRunControlState, PersistedRunPolicySnapshot, PersistedRunSchedulingState, PersistedRunState, PersistedSuspensionEntry, PersistedTokenId, PersistedTriggerSetupState, PersistedWorkflowSnapshot, PersistedWorkflowSnapshotNode, PersistedWorkflowTokenRegistryLike, PinnedNodeOutputsByPort, PollingTriggerHandle, PreparedNodeActivationDispatch, ResumeContext, type RetryPolicySpec, RunCompletionNotifier, RunCurrentState, RunDataFactory, RunDataSnapshot, RunEventPublisherDeps, RunExecutionOptions, RunFinishedAtFactory, RunHaltReason, RunId, RunIdFactory, RunPruneCandidate, RunQueueEntry, RunResult, RunStateResetRequest, RunStatus, RunStopCondition, RunSummary, RunTestContext, RunnableNode, RunnableNodeConfig, RunnableNodeExecuteArgs, RunnableNodeInputJson, RunnableNodeOutputJson, SuspensionRequest, TestableTriggerNode, TriggerCleanupHandle, TriggerInstanceId, TriggerNode, TriggerNodeConfig, TriggerNodeOutputJson, TriggerNodeSetupState, TriggerRuntimeDiagnostics, TriggerSetupContext, TriggerSetupStateFor, TriggerSetupStateRepository, TriggerTestItemsContext, UpstreamRefPlaceholder, WebhookControlSignal, WebhookInvocationMatch, WebhookRunResult, WebhookTriggerMatcher, WebhookTriggerResolution, WebhookTriggerRoutingDiagnostics, WorkflowDefinition, WorkflowErrorContext, WorkflowErrorHandler, WorkflowErrorHandlerSpec, WorkflowExecutionListingRepository, WorkflowExecutionPruneRepository, WorkflowExecutionRepository, WorkflowGraph, WorkflowGraphFactory, WorkflowId, WorkflowNodeConnection, WorkflowNodeInstanceFactory, WorkflowPolicyRuntimeDefaults, WorkflowPrunePolicySpec, WorkflowRepository, WorkflowRunnerResolver, WorkflowRunnerService, WorkflowSnapshotFactory, WorkflowSnapshotResolver, WorkflowStoragePolicyDecisionArgs, WorkflowStoragePolicyMode, WorkflowStoragePolicyResolver, WorkflowStoragePolicySpec, branchRef, nodeRef, runnableNodeInputType, runnableNodeOutputType, triggerNodeOutputType, triggerNodeSetupStateType };
package/dist/browser.js CHANGED
@@ -1,4 +1,4 @@
1
- import { E as ConnectionNodeIdFactory, _ as CredentialUnboundError, f as branchRef, g as SuspensionRequest, h as BINARY_DEFAULT_MAX_BYTES, m as RunFinishedAtFactory, p as nodeRef, v as NodeIterationIdFactory, y as AgentConnectionNodeCollector } from "./di-D9Mv3kF3.js";
2
- import { t as ItemsInputNormalizer } from "./ItemsInputNormalizer-BkSvmfAW.js";
1
+ import { E as ConnectionNodeIdFactory, _ as CredentialUnboundError, f as branchRef, g as SuspensionRequest, h as BINARY_DEFAULT_MAX_BYTES, m as RunFinishedAtFactory, p as nodeRef, v as NodeIterationIdFactory, y as AgentConnectionNodeCollector } from "./di-tom0pM2h.js";
2
+ import { t as ItemsInputNormalizer } from "./ItemsInputNormalizer-CSZGMgl3.js";
3
3
 
4
4
  export { AgentConnectionNodeCollector, BINARY_DEFAULT_MAX_BYTES, ConnectionNodeIdFactory, CredentialUnboundError, ItemsInputNormalizer, NodeIterationIdFactory, RunFinishedAtFactory, SuspensionRequest, branchRef, nodeRef };
@@ -189,6 +189,7 @@ var NodeBackedToolConfig = class {
189
189
  toolKind = "nodeBacked";
190
190
  description;
191
191
  presentation;
192
+ onRejected;
192
193
  inputSchemaValue;
193
194
  outputSchemaValue;
194
195
  mapInputValue;
@@ -199,6 +200,7 @@ var NodeBackedToolConfig = class {
199
200
  this.type = node.type;
200
201
  this.description = options.description;
201
202
  this.presentation = options.presentation;
203
+ this.onRejected = options.onRejected;
202
204
  this.inputSchemaValue = options.inputSchema;
203
205
  this.outputSchemaValue = options.outputSchema;
204
206
  this.mapInputValue = options.mapInput;
@@ -529,4 +531,4 @@ Object.defineProperty(exports, 'resolveItemExprsInUnknown', {
529
531
  return resolveItemExprsInUnknown;
530
532
  }
531
533
  });
532
- //# sourceMappingURL=di-C-2ep8NZ.cjs.map
534
+ //# sourceMappingURL=di-LP2qSHkY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"di-LP2qSHkY.cjs","names":["out: unknown[]","out","exprArgs: ItemExprArgs","name: string","node: TNodeConfig","AgentConnectionNodeCollector: AgentConnectionNodeCollectorApi","collected: AgentConnectionNodeDescriptor[]","bindingKey: CredentialBindingKey","acceptedTypes: ReadonlyArray<CredentialTypeId>","request: Readonly<{\n decisionSchema: ZodType<TDecision>;\n timeout: Duration;\n onTimeout: \"halt\" | \"auto-accept\";\n subject: HumanTaskSubject;\n metadata?: Readonly<Record<string, import(\"./workflowTypes\").JsonValue>>;\n deliver: (handle: HumanTaskHandle) => Promise<TDelivery>;\n }>","max: string | undefined"],"sources":["../src/workflow/definition/ConnectionNodeIdFactory.ts","../src/contracts/itemExpr.ts","../src/ai/AgentConfigInspectorFactory.ts","../src/ai/NodeBackedToolConfig.ts","../src/ai/AgentConnectionNodeCollector.ts","../src/workflow/definition/NodeIterationIdFactory.ts","../src/contracts/credentialTypes.ts","../src/contracts/runtimeTypes.ts","../src/contracts/runFinishedAtFactory.ts","../src/contracts/workflowTypes.ts","../src/di/CoreTokens.ts"],"sourcesContent":["import type { NodeId } from \"../../types\";\n\n/**\n * Deterministic ids for workflow connection-owned child nodes (LLM slot, tools, etc.).\n * These are stable across loads.\n */\nexport class ConnectionNodeIdFactory {\n static readonly connectionSegment = \"__conn__\" as const;\n\n static languageModelConnectionNodeId(parentNodeId: NodeId): NodeId {\n return `${parentNodeId}${this.connectionSegment}llm`;\n }\n\n static toolConnectionNodeId(parentNodeId: NodeId, toolName: string): NodeId {\n const normalized = this.normalizeToolName(toolName);\n return `${parentNodeId}${this.connectionSegment}tool${this.connectionSegment}${normalized}`;\n }\n\n static mcpConnectionNodeId(parentNodeId: NodeId, serverId: string): NodeId {\n return `${parentNodeId}${this.connectionSegment}mcp${this.connectionSegment}${serverId}`;\n }\n\n static isMcpConnectionNodeId(nodeId: NodeId): boolean {\n return nodeId.includes(`${this.connectionSegment}mcp${this.connectionSegment}`);\n }\n\n static parseMcpConnectionNodeId(nodeId: NodeId): Readonly<{ parentNodeId: NodeId; serverId: string }> | undefined {\n if (!this.isMcpConnectionNodeId(nodeId)) {\n return undefined;\n }\n const marker = `${this.connectionSegment}mcp${this.connectionSegment}`;\n const idx = nodeId.lastIndexOf(marker);\n if (idx < 0) {\n return undefined;\n }\n const parentNodeId = nodeId.slice(0, idx);\n const serverId = nodeId.slice(idx + marker.length);\n if (!parentNodeId || !serverId) {\n return undefined;\n }\n return { parentNodeId, serverId };\n }\n\n static isLanguageModelConnectionNodeId(nodeId: NodeId): boolean {\n return nodeId.endsWith(`${this.connectionSegment}llm`);\n }\n\n static isToolConnectionNodeId(nodeId: NodeId): boolean {\n return nodeId.includes(`${this.connectionSegment}tool${this.connectionSegment}`);\n }\n\n static parseLanguageModelConnectionNodeId(nodeId: NodeId): Readonly<{ parentNodeId: NodeId }> | undefined {\n if (!this.isLanguageModelConnectionNodeId(nodeId)) {\n return undefined;\n }\n const suffix = `${this.connectionSegment}llm`;\n const parentNodeId = nodeId.slice(0, -suffix.length);\n return parentNodeId ? { parentNodeId } : undefined;\n }\n\n static parseToolConnectionNodeId(\n nodeId: NodeId,\n ): Readonly<{ parentNodeId: NodeId; normalizedToolName: string }> | undefined {\n if (!this.isToolConnectionNodeId(nodeId)) {\n return undefined;\n }\n const marker = `${this.connectionSegment}tool${this.connectionSegment}`;\n const idx = nodeId.lastIndexOf(marker);\n if (idx < 0) {\n return undefined;\n }\n const parentNodeId = nodeId.slice(0, idx);\n const normalizedToolName = nodeId.slice(idx + marker.length);\n if (!parentNodeId || !normalizedToolName) {\n return undefined;\n }\n return { parentNodeId, normalizedToolName };\n }\n\n /** True when `nodeId` is a connection-owned child of `parentNodeId` (LLM or tool slot). */\n static isConnectionOwnedDescendantOf(parentNodeId: NodeId, nodeId: NodeId): boolean {\n return nodeId.startsWith(`${parentNodeId}${this.connectionSegment}`);\n }\n\n /** Normalizes a tool display name to a stable id segment. */\n static normalizeToolName(toolName: string): string {\n return (\n toolName\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"tool\"\n );\n }\n}\n","import type { NodeExecutionContext } from \"./runtimeTypes\";\nimport type { Item, Items, NodeActivationId, NodeId, RunDataSnapshot, RunId, WorkflowId } from \"./workflowTypes\";\n\nconst ITEM_EXPR_BRAND = Symbol.for(\"codemation.itemExpr\");\n\nexport type ItemExprResolvedContext = Readonly<{\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n data: RunDataSnapshot;\n}>;\n\n/**\n * Context aligned with former {@link ItemInputMapperContext} — use **`data`** to read any completed upstream node.\n */\nexport type ItemExprContext = ItemExprResolvedContext;\n\nexport type ItemExprArgs<TItemJson = unknown> = Readonly<{\n item: Item<TItemJson>;\n itemIndex: number;\n items: Items<TItemJson>;\n ctx: ItemExprContext;\n}>;\n\nexport type ItemExprCallback<T, TItemJson = unknown> = (args: ItemExprArgs<TItemJson>) => T | Promise<T>;\n\nexport type ItemExpr<T, TItemJson = unknown> = Readonly<{\n readonly [ITEM_EXPR_BRAND]: true;\n readonly fn: ItemExprCallback<T, TItemJson>;\n}>;\n\nexport function itemExpr<T, TItemJson = unknown>(fn: ItemExprCallback<T, TItemJson>): ItemExpr<T, TItemJson> {\n return { [ITEM_EXPR_BRAND]: true, fn };\n}\n\nexport function isItemExpr<T, TItemJson = unknown>(value: unknown): value is ItemExpr<T, TItemJson> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const v = value as Record<PropertyKey, unknown>;\n if (v[ITEM_EXPR_BRAND] === true) {\n return true;\n }\n // Support snapshot-hydrated itemExpr wrappers where the symbol brand was lost but the callback survived.\n // Workflow snapshot hydration currently restores function-valued fields (like `fn`) but may drop symbol-keyed brands.\n // We treat the minimal `{ fn: Function }` shape as an itemExpr wrapper to keep runnable configs working.\n const keys = Object.keys(v);\n if (keys.length === 1 && keys[0] === \"fn\" && typeof (v as { fn?: unknown }).fn === \"function\") {\n return true;\n }\n for (const sym of Object.getOwnPropertySymbols(v)) {\n if (sym.description === \"codemation.itemExpr\" && v[sym] === true) {\n return true;\n }\n }\n return false;\n}\n\nfunction containsItemExprInUnknown(value: unknown, seen: WeakSet<object> = new WeakSet()): boolean {\n if (isItemExpr(value)) {\n return true;\n }\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n if (seen.has(value as object)) {\n return false;\n }\n seen.add(value as object);\n if (Array.isArray(value)) {\n return value.some((entry) => containsItemExprInUnknown(entry, seen));\n }\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (containsItemExprInUnknown(entry, seen)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Deep-resolves {@link itemExpr} leaves. Returns a new graph (does not mutate the original config object).\n */\nexport async function resolveItemExprsInUnknown(\n value: unknown,\n args: ItemExprArgs,\n seen: WeakSet<object> = new WeakSet(),\n): Promise<unknown> {\n if (isItemExpr(value)) {\n return await Promise.resolve(value.fn(args));\n }\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (seen.has(value as object)) {\n return value;\n }\n seen.add(value as object);\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n for (let i = 0; i < value.length; i++) {\n out.push(await resolveItemExprsInUnknown(value[i], args, seen));\n }\n return out;\n }\n const rec = value as Record<string, unknown>;\n const entries = Object.entries(rec);\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null && entries.length === 0) {\n return value;\n }\n const out = Object.create(proto) as Record<string, unknown>;\n for (const [k, v] of entries) {\n out[k] = await resolveItemExprsInUnknown(v, args, seen);\n }\n return out;\n}\n\n/**\n * Clones runnable config (best-effort) so per-item {@link itemExpr} resolution never mutates shared instances.\n */\nexport async function resolveItemExprsForExecution(\n config: unknown,\n nodeCtx: NodeExecutionContext,\n item: Item,\n itemIndex: number,\n items: Items,\n): Promise<unknown | undefined> {\n const exprArgs: ItemExprArgs = {\n item,\n itemIndex,\n items,\n ctx: {\n runId: nodeCtx.runId,\n workflowId: nodeCtx.workflowId,\n nodeId: nodeCtx.nodeId,\n activationId: nodeCtx.activationId,\n data: nodeCtx.data,\n },\n };\n if (!containsItemExprInUnknown(config)) {\n return undefined;\n }\n return await resolveItemExprsInUnknown(config, exprArgs);\n}\n","import type { NodeConfigBase } from \"../types\";\nimport { isItemExpr } from \"../contracts/itemExpr\";\nimport type { AgentNodeConfig } from \"./AiHost\";\n\nexport class AgentConfigInspector {\n static isAgentNodeConfig(config: NodeConfigBase | undefined): config is AgentNodeConfig<any, any> {\n if (!config) return false;\n const candidate = config as Partial<AgentNodeConfig<any, any>>;\n return !!candidate.chatModel && this.hasCompatibleMessageConfiguration(candidate);\n }\n\n private static hasCompatibleMessageConfiguration(candidate: Partial<AgentNodeConfig<any, any>>): boolean {\n const messages = candidate.messages;\n if (messages === undefined || messages === null) {\n return false;\n }\n if (Array.isArray(messages)) {\n return messages.length > 0;\n }\n if (typeof messages === \"object\") {\n if (isItemExpr(messages)) {\n return true;\n }\n const o = messages as { prompt?: unknown; buildMessages?: unknown };\n return (Array.isArray(o.prompt) && o.prompt.length > 0) || typeof o.buildMessages === \"function\";\n }\n return false;\n }\n}\n","import type { CredentialRequirement } from \"../contracts/credentialTypes\";\nimport type { TypeToken } from \"../di\";\nimport type { Item, NodeOutputs, RunnableNodeConfig, RunnableNodeInputJson } from \"../types\";\nimport type { input as ZodInput, output as ZodOutput } from \"zod\";\nimport type {\n AgentCanvasPresentation,\n NodeBackedToolConfigOptions,\n NodeBackedToolInputMapper,\n NodeBackedToolInputMapperArgs,\n NodeBackedToolOutputMapper,\n NodeBackedToolOutputMapperArgs,\n ToolConfig,\n ZodSchemaAny,\n} from \"./AiHost\";\n\nexport class NodeBackedToolConfig<\n TNodeConfig extends RunnableNodeConfig<any, any>,\n TInputSchema extends ZodSchemaAny,\n TOutputSchema extends ZodSchemaAny,\n> implements ToolConfig {\n readonly type: TypeToken<unknown>;\n readonly toolKind = \"nodeBacked\" as const;\n readonly description?: string;\n readonly presentation?: AgentCanvasPresentation;\n readonly onRejected?: \"halt\" | \"return\";\n private readonly inputSchemaValue: TInputSchema;\n private readonly outputSchemaValue: TOutputSchema;\n private readonly mapInputValue?: NodeBackedToolInputMapper<TNodeConfig, ZodInput<TInputSchema>>;\n private readonly mapOutputValue?: NodeBackedToolOutputMapper<\n TNodeConfig,\n ZodInput<TInputSchema>,\n ZodOutput<TOutputSchema>\n >;\n\n constructor(\n public readonly name: string,\n public readonly node: TNodeConfig,\n options: NodeBackedToolConfigOptions<TNodeConfig, TInputSchema, TOutputSchema>,\n ) {\n this.type = node.type;\n this.description = options.description;\n this.presentation = options.presentation;\n this.onRejected = options.onRejected;\n this.inputSchemaValue = options.inputSchema;\n this.outputSchemaValue = options.outputSchema;\n this.mapInputValue = options.mapInput;\n this.mapOutputValue = options.mapOutput;\n }\n\n getCredentialRequirements(): ReadonlyArray<CredentialRequirement> {\n return this.node.getCredentialRequirements?.() ?? [];\n }\n\n getInputSchema(): TInputSchema {\n return this.inputSchemaValue;\n }\n\n getOutputSchema(): TOutputSchema {\n return this.outputSchemaValue;\n }\n\n toNodeItem(\n args: NodeBackedToolInputMapperArgs<TNodeConfig, ZodInput<TInputSchema>>,\n ): Item<RunnableNodeInputJson<TNodeConfig>> {\n const mapped = this.mapInputValue?.(args) ?? (args.input as RunnableNodeInputJson<TNodeConfig>);\n if (this.isItem(mapped)) {\n return mapped;\n }\n return { json: mapped };\n }\n\n toToolOutput(args: NodeBackedToolOutputMapperArgs<TNodeConfig, ZodInput<TInputSchema>>): ZodOutput<TOutputSchema> {\n const raw = this.mapOutputValue?.(args) ?? this.readDefaultToolOutput(args.outputs);\n return this.outputSchemaValue.parse(raw) as ZodOutput<TOutputSchema>;\n }\n\n private readDefaultToolOutput(outputs: NodeOutputs): unknown {\n const firstMainItem = outputs.main?.[0];\n if (!firstMainItem) {\n throw new Error(`Node-backed tool \"${this.name}\" did not produce a main output item.`);\n }\n return firstMainItem.json;\n }\n\n private isItem(value: unknown): value is Item {\n return typeof value === \"object\" && value !== null && \"json\" in value;\n }\n}\n","import type { CredentialRequirement } from \"../contracts/credentialTypes\";\nimport type { McpServerDeclaration } from \"../contracts/mcpTypes\";\nimport type { NodeConfigBase, NodeConnectionName, NodeId } from \"../types\";\nimport { ConnectionNodeIdFactory } from \"../workflow/definition/ConnectionNodeIdFactory\";\nimport { AgentConfigInspector } from \"./AgentConfigInspectorFactory\";\nimport type { AgentNodeConfig, ToolConfig } from \"./AiHost\";\nimport { NodeBackedToolConfig } from \"./NodeBackedToolConfig\";\n\nexport type AgentConnectionNodeRole = \"languageModel\" | \"tool\" | \"nestedAgent\";\n\nexport type AgentConnectionCredentialSource = Readonly<{\n getCredentialRequirements?(): ReadonlyArray<CredentialRequirement>;\n}>;\n\nexport type AgentConnectionNodeDescriptor = Readonly<{\n nodeId: NodeId;\n parentNodeId: NodeId;\n connectionName: NodeConnectionName;\n role: AgentConnectionNodeRole;\n name: string;\n typeName: string;\n icon?: string;\n credentialSource: AgentConnectionCredentialSource;\n}>;\n\nexport type McpServerResolver = (id: string) => McpServerDeclaration | undefined;\n\ntype AgentConnectionNodeCollectorApi = Readonly<{\n collect(\n parentNodeId: NodeId,\n agentConfig: AgentNodeConfig<any, any>,\n mcpServerResolver?: McpServerResolver,\n ): ReadonlyArray<AgentConnectionNodeDescriptor>;\n}>;\n\nexport const AgentConnectionNodeCollector: AgentConnectionNodeCollectorApi = new (class {\n collect(\n parentNodeId: NodeId,\n agentConfig: AgentNodeConfig<any, any>,\n mcpServerResolver?: McpServerResolver,\n ): ReadonlyArray<AgentConnectionNodeDescriptor> {\n const collected: AgentConnectionNodeDescriptor[] = [];\n this.collectInto(parentNodeId, agentConfig, collected, mcpServerResolver);\n return collected;\n }\n\n private collectInto(\n parentNodeId: NodeId,\n agentConfig: AgentNodeConfig<any, any>,\n collected: AgentConnectionNodeDescriptor[],\n mcpServerResolver?: McpServerResolver,\n ): void {\n collected.push({\n nodeId: ConnectionNodeIdFactory.languageModelConnectionNodeId(parentNodeId),\n parentNodeId,\n connectionName: \"llm\",\n role: \"languageModel\",\n name: agentConfig.chatModel.presentation?.label ?? agentConfig.chatModel.name,\n typeName: agentConfig.chatModel.name,\n icon: agentConfig.chatModel.presentation?.icon,\n credentialSource: agentConfig.chatModel,\n });\n\n for (const tool of agentConfig.tools ?? []) {\n const toolNodeId = ConnectionNodeIdFactory.toolConnectionNodeId(parentNodeId, tool.name);\n const isNestedAgent = this.isNodeBackedAgentTool(tool);\n collected.push({\n nodeId: toolNodeId,\n parentNodeId,\n connectionName: \"tools\",\n role: isNestedAgent ? \"nestedAgent\" : \"tool\",\n name: tool.presentation?.label ?? tool.name,\n typeName: tool.name,\n icon: tool.presentation?.icon,\n credentialSource: tool,\n });\n this.collectNestedAgentTools(toolNodeId, tool, collected, mcpServerResolver);\n }\n\n if (mcpServerResolver) {\n const mcpServers = (agentConfig as unknown as { mcpServers?: ReadonlyArray<string> }).mcpServers;\n for (const serverId of mcpServers ?? []) {\n const decl = mcpServerResolver(serverId);\n if (!decl) {\n continue;\n }\n const acceptedTypes = decl.acceptedCredentialTypes ?? [];\n collected.push({\n nodeId: ConnectionNodeIdFactory.mcpConnectionNodeId(parentNodeId, serverId),\n parentNodeId,\n connectionName: \"tools\",\n role: \"tool\",\n name: decl.displayName,\n typeName: \"MCP server\",\n icon: \"lucide:plug\",\n credentialSource: {\n getCredentialRequirements: () => [\n {\n slotKey: \"credential\",\n label: decl.displayName,\n acceptedTypes,\n },\n ],\n },\n });\n }\n }\n }\n\n private collectNestedAgentTools(\n toolNodeId: NodeId,\n tool: ToolConfig,\n collected: AgentConnectionNodeDescriptor[],\n mcpServerResolver?: McpServerResolver,\n ): void {\n if (!this.isNodeBackedAgentTool(tool)) {\n return;\n }\n const innerAgent =\n tool instanceof NodeBackedToolConfig ? tool.node : (tool as unknown as { node: AgentNodeConfig<any, any> }).node;\n this.collectInto(toolNodeId, innerAgent, collected, mcpServerResolver);\n }\n\n /**\n * After JSON round-trip (persisted snapshots), tools are plain objects — `instanceof NodeBackedToolConfig` fails.\n * Detect node-backed tools structurally via {@link NodeBackedToolConfig#toolKind}.\n */\n private isNodeBackedAgentTool(tool: ToolConfig): boolean {\n if (tool instanceof NodeBackedToolConfig) {\n return AgentConfigInspector.isAgentNodeConfig(tool.node);\n }\n if (!tool || typeof tool !== \"object\") {\n return false;\n }\n const t = tool as unknown as Record<string, unknown>;\n if (t.toolKind !== \"nodeBacked\") {\n return false;\n }\n return AgentConfigInspector.isAgentNodeConfig(t.node as NodeConfigBase);\n }\n})();\n","import type { NodeId } from \"../../types\";\n\n/**\n * Unique ids for one per-item iteration of a runnable node's execute loop.\n *\n * Activations are per-batch (one scheduled execution of a node, possibly with N items).\n * Iterations refine that to one identifier per item-index inside the batch loop, so per-item\n * connection invocations and telemetry can be grouped without time-window heuristics.\n *\n * Uses Web Crypto's `randomUUID` (Node 19+ and all modern browsers) so this module is safe\n * to include in the browser entry. Importing `node:crypto` here previously leaked into the\n * canvas client bundle through `browser.ts` and OOM'd consumers' Turbopack builds.\n */\nexport class NodeIterationIdFactory {\n static create(): string {\n return `iter_${globalThis.crypto.randomUUID()}`;\n }\n\n /** Deterministic id for tests when a stable sequence is needed. */\n static createForTest(seed: string, sequence: number): string {\n return `iter_${seed}_${sequence}`;\n }\n\n /** Deterministic id derived from a connection node id (for sub-agent / tool-call scopes). */\n static createForConnection(connectionNodeId: NodeId, sequence: number): string {\n return `iter_${connectionNodeId}_${sequence}`;\n }\n}\n","import type { NodeId, WorkflowId } from \"./baseTypes\";\n\nexport type CredentialTypeId = string;\nexport type CredentialInstanceId = string;\n\nexport type CredentialMaterialSourceKind = \"db\" | \"env\" | \"code\";\nexport type CredentialSetupStatus = \"draft\" | \"ready\";\nexport type CredentialHealthStatus = \"unknown\" | \"healthy\" | \"failing\";\n\nexport type CredentialFieldSchema = Readonly<{\n key: string;\n label: string;\n type: \"string\" | \"password\" | \"textarea\" | \"json\" | \"boolean\";\n required?: true;\n order?: number;\n /**\n * Where this field appears in the credential dialog. Use `\"advanced\"` for optional or\n * power-user fields; they render inside a collapsible section (see `CredentialTypeDefinition.advancedSection`).\n * Defaults to `\"default\"` when omitted.\n */\n visibility?: \"default\" | \"advanced\";\n placeholder?: string;\n helpText?: string;\n /** When set, host resolves this field from process.env at runtime; env wins over stored values. */\n envVarName?: string;\n /**\n * When set, the dialog shows a copy action for this exact string (e.g. a static OAuth redirect URI\n * pattern or documentation URL). Do not use for secret values.\n */\n copyValue?: string;\n /** Accessible label for the copy control (default: Copy). */\n copyButtonLabel?: string;\n}>;\n\nexport type CredentialRequirement = Readonly<{\n slotKey: string;\n label: string;\n acceptedTypes: ReadonlyArray<CredentialTypeId>;\n optional?: true;\n helpText?: string;\n helpUrl?: string;\n}>;\n\nexport type CredentialBindingKey = Readonly<{\n workflowId: WorkflowId;\n nodeId: NodeId;\n slotKey: string;\n}>;\n\nexport type CredentialBinding = Readonly<{\n key: CredentialBindingKey;\n instanceId: CredentialInstanceId;\n updatedAt: string;\n}>;\n\nexport type CredentialHealth = Readonly<{\n status: CredentialHealthStatus;\n message?: string;\n testedAt?: string;\n expiresAt?: string;\n details?: Readonly<Record<string, unknown>>;\n}>;\n\nexport type OAuth2ProviderFromPublicConfig = Readonly<{\n authorizeUrlFieldKey: string;\n tokenUrlFieldKey: string;\n userInfoUrlFieldKey?: string;\n}>;\n\nexport type CredentialOAuth2ScopesFromPublicConfig = Readonly<{\n presetFieldKey: string;\n presetScopes: Readonly<Record<string, ReadonlyArray<string>>>;\n customPresetKey?: string;\n customScopesFieldKey?: string;\n}>;\n\nexport type CredentialOAuth2AuthDefinition = Readonly<\n | {\n kind: \"oauth2\";\n providerId: string;\n scopes: ReadonlyArray<string>;\n scopesFromPublicConfig?: CredentialOAuth2ScopesFromPublicConfig;\n clientIdFieldKey?: string;\n clientSecretFieldKey?: string;\n }\n | {\n kind: \"oauth2\";\n providerFromPublicConfig: OAuth2ProviderFromPublicConfig;\n scopes: ReadonlyArray<string>;\n scopesFromPublicConfig?: CredentialOAuth2ScopesFromPublicConfig;\n clientIdFieldKey?: string;\n clientSecretFieldKey?: string;\n }\n | {\n kind: \"oauth2\";\n /**\n * Free-form provider identifier for telemetry, DB rows, and Better Auth provider naming.\n * Not used for any registry lookup — URLs come from {@link authorizeUrl} / {@link tokenUrl}.\n */\n providerId: string;\n /**\n * Authorization endpoint. May contain `{publicFieldKey}` placeholders that the runtime\n * substitutes from the credential's resolved public config (URL-encoded).\n * Example: `https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize`\n */\n authorizeUrl: string;\n /** Token endpoint. Same templating rules as {@link authorizeUrl}. */\n tokenUrl: string;\n /** Optional userinfo endpoint. Same templating rules as {@link authorizeUrl}. */\n userInfoUrl?: string;\n scopes: ReadonlyArray<string>;\n scopesFromPublicConfig?: CredentialOAuth2ScopesFromPublicConfig;\n clientIdFieldKey?: string;\n clientSecretFieldKey?: string;\n }\n>;\n\nexport type CredentialAuthDefinition = CredentialOAuth2AuthDefinition;\n\nexport type CredentialAdvancedSectionPresentation = Readonly<{\n /** Collapsible section title (default: \"Advanced\"). */\n title?: string;\n /** Optional short helper text shown inside the section (above the fields). */\n description?: string;\n /** When true, the advanced section starts expanded. Default: false (collapsed). */\n defaultOpen?: boolean;\n}>;\n\nexport type CredentialTypeDefinition = Readonly<{\n typeId: CredentialTypeId;\n displayName: string;\n description?: string;\n publicFields?: ReadonlyArray<CredentialFieldSchema>;\n secretFields?: ReadonlyArray<CredentialFieldSchema>;\n /**\n * Optional labels for the collapsible block that contains every field with `visibility: \"advanced\"`.\n * If omitted, the UI still shows that block with defaults (title \"Advanced\", collapsed).\n */\n advancedSection?: CredentialAdvancedSectionPresentation;\n supportedSourceKinds?: ReadonlyArray<CredentialMaterialSourceKind>;\n auth?: CredentialAuthDefinition;\n}>;\n\n/**\n * JSON-shaped credential field bag (public config, resolved secret material, etc.).\n */\nexport type CredentialJsonRecord = Readonly<Record<string, unknown>>;\n\n/**\n * Persisted credential instance with typed `publicConfig`.\n * Hosts may specialize `secretRef` with a stricter union while remaining\n * assignable here for session/test callbacks.\n */\nexport type CredentialInstanceRecord<TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord> = Readonly<{\n instanceId: CredentialInstanceId;\n typeId: CredentialTypeId;\n displayName: string;\n sourceKind: CredentialMaterialSourceKind;\n publicConfig: TPublicConfig;\n secretRef: CredentialJsonRecord;\n tags: ReadonlyArray<string>;\n setupStatus: CredentialSetupStatus;\n createdAt: string;\n updatedAt: string;\n /**\n * Pointer to where the credential material bytes live. For OSS / standalone\n * rows this is `{source: \"local\", ref: instanceId}` and the bytes co-locate\n * with the row in the workspace DB. For managed-mode rows this is\n * `{source: \"control-plane\", ref: <cp_id>}` and the bytes live at CP.\n *\n * The seam is read through `CredentialMaterialProvider`. See\n * `docs/design/credentials-oauth-unification.md` (\"Material provider seam\").\n */\n material: Readonly<{ source: \"local\" | \"control-plane\"; ref: string }>;\n}>;\n\n/**\n * Arguments passed to `CredentialType.createSession` and `CredentialType.test`.\n * Declare `TPublicConfig` / `TMaterial` on `CredentialType` so implementations are checked\n * against your credential shapes (similar to `NodeExecutionContext.config` for nodes).\n */\nexport type CredentialSessionFactoryArgs<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n> = Readonly<{\n instance: CredentialInstanceRecord<TPublicConfig>;\n material: TMaterial;\n publicConfig: TPublicConfig;\n}>;\n\nexport type CredentialSessionFactory<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n TSession = unknown,\n> = (args: CredentialSessionFactoryArgs<TPublicConfig, TMaterial>) => Promise<TSession>;\n\nexport type CredentialHealthTester<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n> = (args: CredentialSessionFactoryArgs<TPublicConfig, TMaterial>) => Promise<CredentialHealth>;\n\n/**\n * Full credential type implementation: `definition` (UI/schema), `createSession`, and `test`.\n * Use this at registration and config boundaries; `CredentialTypeDefinition` is only the schema slice.\n */\nexport type CredentialType<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n TSession = unknown,\n> = Readonly<{\n definition: CredentialTypeDefinition;\n createSession: CredentialSessionFactory<TPublicConfig, TMaterial, TSession>;\n test: CredentialHealthTester<TPublicConfig, TMaterial>;\n}>;\n\n/**\n * Credential type with unspecified generics — used for `CodemationConfig.credentialTypes`, the host registry,\n * and anywhere a concrete `CredentialType<YourPublic, YourMaterial, YourSession>` is placed in a heterogeneous list.\n * Using `any` here avoids unsafe `as` casts while keeping typed `satisfies CredentialType<…>` definitions.\n */\nexport type AnyCredentialType = CredentialType<any, any, unknown>;\n\nexport interface CredentialSessionService {\n getSession<TSession = unknown>(\n args: Readonly<{\n workflowId: WorkflowId;\n nodeId: NodeId;\n slotKey: string;\n }>,\n ): Promise<TSession>;\n}\n\nexport interface CredentialTypeRegistry {\n listTypes(): ReadonlyArray<CredentialTypeDefinition>;\n getType(typeId: CredentialTypeId): CredentialTypeDefinition | undefined;\n}\n\nexport class CredentialUnboundError extends Error {\n constructor(\n public readonly bindingKey: CredentialBindingKey,\n public readonly acceptedTypes: ReadonlyArray<CredentialTypeId> = [],\n ) {\n super(CredentialUnboundError.createMessage(bindingKey, acceptedTypes));\n this.name = \"CredentialUnboundError\";\n }\n\n private static createMessage(\n bindingKey: CredentialBindingKey,\n acceptedTypes: ReadonlyArray<CredentialTypeId>,\n ): string {\n const acceptedTypesSuffix =\n acceptedTypes.length > 0 ? ` Accepted credential types: ${acceptedTypes.join(\", \")}.` : \"\";\n return `Credential slot \"${bindingKey.slotKey}\" is not bound for workflow ${bindingKey.workflowId} node ${bindingKey.nodeId}.${acceptedTypesSuffix}`;\n }\n}\n","import type { ReadableStream as BinaryReadableStream } from \"node:stream/web\";\nimport type { TypeToken } from \"../di\";\nimport type { RunEventBus } from \"../events/runEvents\";\nimport type { CredentialSessionService } from \"./credentialTypes\";\nimport type { CollectionsContext } from \"./collectionTypes\";\nimport type { ExecutionTelemetry, ExecutionTelemetryFactory, NodeExecutionTelemetry } from \"./telemetryTypes\";\nimport type {\n ConnectionInvocationAppendArgs,\n ConnectionInvocationId,\n NodeInputsByPort,\n PersistedWorkflowSnapshot,\n PersistedWorkflowTokenRegistryLike,\n RunExecutionOptions,\n RunResult,\n RunTestContext,\n WorkflowExecutionRepository,\n} from \"./runTypes\";\nimport type { WorkflowActivationPolicy } from \"./workflowActivationPolicy\";\nimport type { TriggerInstanceId, WebhookTriggerMatcher } from \"./webhookTypes\";\nimport type { ZodType } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// HITL primitives\n// ---------------------------------------------------------------------------\n\n/** Opaque unique identifier for a single HumanTask instance. */\nexport type HumanTaskId = string;\n\n/**\n * Duration string — ISO 8601 duration (\"PT24H\") or shorthand (\"24h\").\n * Parsed by the timeout job; stored as-is in the suspension record.\n */\nexport type Duration = string;\n\n/**\n * Minimal handle handed to the `deliver` callback so it can route to the correct\n * inbox channel.\n */\nexport interface HumanTaskHandle {\n readonly taskId: HumanTaskId;\n readonly runId: string;\n readonly nodeId: string;\n readonly expiresAt: Date;\n /** TODO: real signed URL; placeholder empty string for now. */\n readonly resumeUrl: string;\n /**\n * Arbitrary JSON metadata copied from `SuspensionRequest.request.metadata` at suspension time.\n * Used by the agent runtime to round-trip the `agentCheckpoint` back to the\n * resumed node via `ctx.resumeContext.task.metadata`.\n */\n readonly metadata?: Readonly<Record<string, import(\"./workflowTypes\").JsonValue>>;\n}\n\n/** Human-readable description surface shown to the reviewer. */\nexport interface HumanTaskSubject {\n readonly title: string;\n readonly summary: string;\n readonly attributes?: import(\"./workflowTypes\").JsonValue;\n}\n\n/** Identity of the person who made a decision on the task. */\nexport interface HumanTaskActor {\n readonly actorId: string;\n readonly displayName?: string;\n}\n\n/**\n * Resume context injected into `NodeExecutionContext` when the engine re-activates\n * a previously suspended node. `defineHumanApprovalNode` wraps this with parsed\n * `TDecision`; at the engine layer `decision.value` is `unknown`.\n */\nexport interface ResumeContext {\n readonly decision:\n | Readonly<{ kind: \"decided\"; value: unknown; actor: HumanTaskActor; decidedAt: Date }>\n | Readonly<{ kind: \"timed_out\"; at: Date }>\n | Readonly<{ kind: \"auto_accepted\"; at: Date }>;\n readonly delivery: import(\"./workflowTypes\").JsonValue;\n readonly task: HumanTaskHandle;\n}\n\n/**\n * Thrown by a node's `execute()` to request durable suspension of the current item.\n * The engine catches this, persists the suspension entry, calls `deliver`, and\n * continues to the next item (per-item semantics).\n *\n * @example\n * ```ts\n * throw new SuspensionRequest({\n * decisionSchema: z.object({ approved: z.boolean() }),\n * timeout: \"PT24H\",\n * onTimeout: \"halt\",\n * subject: { title: \"Approve invoice\", summary: \"Invoice #1234 needs approval\" },\n * deliver: async (handle) => {\n * await notifySlack(handle);\n * return { channel: \"slack\", ts: \"...\" };\n * },\n * });\n * ```\n */\nexport class SuspensionRequest<\n TDecision = unknown,\n TDelivery extends import(\"./workflowTypes\").JsonValue = import(\"./workflowTypes\").JsonValue,\n> extends Error {\n constructor(\n readonly request: Readonly<{\n decisionSchema: ZodType<TDecision>;\n timeout: Duration;\n onTimeout: \"halt\" | \"auto-accept\";\n subject: HumanTaskSubject;\n metadata?: Readonly<Record<string, import(\"./workflowTypes\").JsonValue>>;\n deliver: (handle: HumanTaskHandle) => Promise<TDelivery>;\n }>,\n ) {\n // Extending Error so wrappers like InProcessRetryRunner preserve identity\n // (`instanceof SuspensionRequest`) instead of coercing via String(thrown).\n super(`SuspensionRequest(${request.subject?.title ?? \"untitled\"})`);\n this.name = \"SuspensionRequest\";\n }\n}\n\nimport type {\n ActivationIdFactory,\n BinaryAttachment,\n Item,\n Items,\n JsonValue,\n NodeActivationId,\n NodeConfigBase,\n NodeId,\n NodeIterationId,\n NodeOutputs,\n RunnableNodeConfig,\n OutputPortKey,\n ParentExecutionRef,\n PersistedRunPolicySnapshot,\n RunDataFactory,\n RunDataSnapshot,\n RunId,\n RunIdFactory,\n TriggerNodeConfig,\n TriggerNodeSetupState,\n WorkflowDefinition,\n WorkflowId,\n WorkflowPolicyRuntimeDefaults,\n} from \"./workflowTypes\";\n\nexport interface WorkflowRunnerService {\n runById(args: {\n workflowId: WorkflowId;\n startAt?: NodeId;\n items: Items;\n parent?: ParentExecutionRef;\n }): Promise<RunResult>;\n}\n\nexport interface WorkflowRunnerResolver {\n resolve(): WorkflowRunnerService | undefined;\n}\n\nexport interface WorkflowRepository {\n list(): ReadonlyArray<WorkflowDefinition>;\n get(workflowId: WorkflowId): WorkflowDefinition | undefined;\n}\n\nexport interface LiveWorkflowRepository extends WorkflowRepository {\n setWorkflows(workflows: ReadonlyArray<WorkflowDefinition>): void;\n}\n\nexport interface NodeResolver {\n resolve<T>(token: TypeToken<T>): T;\n}\n\nexport interface NodeExecutionStatePublisher {\n markQueued(args: { nodeId: NodeId; activationId?: NodeActivationId; inputsByPort?: NodeInputsByPort }): Promise<void>;\n markRunning(args: {\n nodeId: NodeId;\n activationId?: NodeActivationId;\n inputsByPort?: NodeInputsByPort;\n }): Promise<void>;\n markCompleted(args: {\n nodeId: NodeId;\n activationId?: NodeActivationId;\n inputsByPort?: NodeInputsByPort;\n outputs?: NodeOutputs;\n }): Promise<void>;\n markFailed(args: {\n nodeId: NodeId;\n activationId?: NodeActivationId;\n inputsByPort?: NodeInputsByPort;\n error: Error;\n }): Promise<void>;\n appendConnectionInvocation(args: ConnectionInvocationAppendArgs): Promise<void>;\n /**\n * Annotates the current snapshot for `nodeId` with the id of the child run spawned by a\n * SubWorkflow invocation. Called from `SubWorkflowNode.execute` after `runById` resolves.\n * The engine's subsequent `markCompleted` call preserves the value via `previous.childRunId`.\n */\n setChildRunId?(args: { nodeId: NodeId; childRunId: RunId }): Promise<void>;\n}\n\nexport type BinaryBody = BinaryReadableStream<Uint8Array> | AsyncIterable<Uint8Array> | Uint8Array | ArrayBuffer;\n\nexport interface BinaryStorageWriteRequest {\n storageKey: string;\n body: BinaryBody;\n}\n\nexport interface BinaryStorageWriteResult {\n storageKey: string;\n size: number;\n sha256?: string;\n}\n\nexport interface BinaryStorageReadResult {\n body: BinaryReadableStream<Uint8Array>;\n size?: number;\n}\n\nexport interface BinaryStorageStatResult {\n exists: boolean;\n size?: number;\n}\n\nexport interface BinaryStorage {\n readonly driverName: string;\n write(args: BinaryStorageWriteRequest): Promise<BinaryStorageWriteResult>;\n openReadStream(storageKey: string): Promise<BinaryStorageReadResult | undefined>;\n stat(storageKey: string): Promise<BinaryStorageStatResult>;\n delete(storageKey: string): Promise<void>;\n /** Deletes multiple objects in bulk. Keys are batched internally. */\n deleteMany(storageKeys: ReadonlyArray<string>): Promise<void>;\n /** Lists all keys sharing a common prefix. Returns keys in arbitrary order. */\n listByPrefix(prefix: string): Promise<ReadonlyArray<string>>;\n}\n\nexport interface BinaryAttachmentCreateRequest {\n name: string;\n body: BinaryBody;\n mimeType: string;\n filename?: string;\n previewKind?: BinaryAttachment[\"previewKind\"];\n}\n\nexport interface NodeBinaryAttachmentService extends ExecutionBinaryService {\n attach(args: BinaryAttachmentCreateRequest): Promise<BinaryAttachment>;\n withAttachment<TJson>(item: Item<TJson>, name: string, attachment: BinaryAttachment): Item<TJson>;\n}\n\n/** Default maximum bytes read into memory by the bounded helpers (50 MiB). */\nexport const BINARY_DEFAULT_MAX_BYTES = 50 * 1024 * 1024;\n\nexport interface ExecutionBinaryService {\n forNode(args: { nodeId: NodeId; activationId: NodeActivationId }): NodeBinaryAttachmentService;\n openReadStream(attachment: BinaryAttachment): Promise<BinaryStorageReadResult | undefined>;\n /**\n * Reads all bytes from the attachment into a contiguous `Uint8Array`.\n * Checks `attachment.size` against `maxBytes` *before* any allocation; throws a bounded-read\n * error when exceeded (no OOM). Throws if the stream is unavailable or the byte count mismatches.\n */\n getBytes(attachment: BinaryAttachment, maxBytes?: number): Promise<Uint8Array>;\n /**\n * Reads the attachment and decodes the bytes as UTF-8 text.\n * Subject to the same bounded-read safety as `getBytes`.\n */\n getText(attachment: BinaryAttachment, maxBytes?: number): Promise<string>;\n /**\n * Reads the attachment, decodes as UTF-8 text, and parses as JSON.\n * Throws a clear error on invalid JSON. Subject to the same bounded-read safety.\n */\n getJson<T = unknown>(attachment: BinaryAttachment, maxBytes?: number): Promise<T>;\n}\n\nexport interface ExecutionContext {\n runId: RunId;\n workflowId: WorkflowId;\n parent?: ParentExecutionRef;\n /** This run's subworkflow depth (0 = root). */\n subworkflowDepth: number;\n /** Effective activation budget cap for this run (after policy merge). */\n engineMaxNodeActivations: number;\n /** Effective subworkflow nesting cap for this run (after policy merge). */\n engineMaxSubworkflowDepth: number;\n now: () => Date;\n data: RunDataSnapshot;\n nodeState?: NodeExecutionStatePublisher;\n telemetry: ExecutionTelemetry;\n binary: ExecutionBinaryService;\n getCredential<TSession = unknown>(slotKey: string): Promise<TSession>;\n /** Per-item iteration id, set by {@link NodeExecutor} on the ctx passed into runnable `execute`. */\n iterationId?: NodeIterationId;\n /** Item index (0-based) within the current activation's batch; set alongside {@link iterationId}. */\n itemIndex?: number;\n /** When set, this ctx is executing inside a sub-agent triggered by the named parent invocation. */\n parentInvocationId?: ConnectionInvocationId;\n /**\n * Present iff the run was started by a TestSuiteOrchestrator. The {@link IsTestRunNode}\n * branches on this; assertion-emitting nodes use it to decide whether to record results.\n */\n testContext?: RunTestContext;\n /**\n * Collections registered in the codemation config, keyed by collection name.\n */\n readonly collections?: CollectionsContext;\n /**\n * Resolve a DI token from the host container.\n * Allows nodes to reach host-side services (e.g. `InboxChannelResolverToken`)\n * without importing host code. Wired by `DefaultExecutionContextFactory`; throws\n * a clear error when no resolver is configured (e.g. in unit tests that don't\n * set up the full container).\n */\n resolve<T>(token: TypeToken<T>): T;\n}\n\nexport interface ExecutionContextFactory {\n create(args: {\n runId: RunId;\n workflowId: WorkflowId;\n parent?: ParentExecutionRef;\n policySnapshot?: PersistedRunPolicySnapshot;\n subworkflowDepth: number;\n engineMaxNodeActivations: number;\n engineMaxSubworkflowDepth: number;\n data: RunDataSnapshot;\n nodeState?: NodeExecutionStatePublisher;\n telemetry?: ExecutionTelemetry;\n getCredential<TSession = unknown>(slotKey: string): Promise<TSession>;\n testContext?: RunTestContext;\n }): ExecutionContext;\n}\n\nexport interface NodeExecutionContext<TConfig extends NodeConfigBase = NodeConfigBase> extends ExecutionContext {\n nodeId: NodeId;\n activationId: NodeActivationId;\n config: TConfig;\n telemetry: NodeExecutionTelemetry;\n binary: NodeBinaryAttachmentService;\n /**\n * Present when this node activation is a HITL resume.\n * The node checks `ctx.resumeContext !== undefined` and takes the resume branch.\n */\n resumeContext?: ResumeContext;\n}\n\nexport interface PollingTriggerHandle {\n /**\n * Start the polling loop. The runtime registers its own cleanup handle so callers do not need to\n * call {@link TriggerSetupContext.registerCleanup} for the loop.\n * @returns The state returned by the first cycle (or `undefined` when the overlap guard fired).\n */\n start<TState, TItem>(args: {\n intervalMs: number;\n seedState?: TState;\n runCycle: (cycleCtx: {\n previousState: TState | undefined;\n signal: AbortSignal;\n }) => Promise<{ items: Items<TItem>; nextState: TState }>;\n }): Promise<TState | undefined>;\n /** Convenience dedup-window helper. */\n readonly dedup: import(\"../triggers/polling/PollingTriggerDedupWindow\").PollingTriggerDedupWindow;\n}\n\nexport interface TriggerSetupContext<\n TConfig extends TriggerNodeConfig<any, any> = TriggerNodeConfig<any, any>,\n TSetupState extends JsonValue | undefined = TriggerNodeSetupState<TConfig>,\n> extends ExecutionContext {\n trigger: TriggerInstanceId;\n config: TConfig;\n previousState: TSetupState;\n registerCleanup(cleanup: TriggerCleanupHandle): void;\n emit(items: Items): Promise<void>;\n /** Generic polling-trigger surface. Pre-binds trigger id, emit, and registerCleanup. */\n readonly polling: PollingTriggerHandle;\n}\n\nexport interface TriggerTestItemsContext<\n TConfig extends TriggerNodeConfig<any, any> = TriggerNodeConfig<any, any>,\n TSetupState extends JsonValue | undefined = TriggerNodeSetupState<TConfig>,\n> extends ExecutionContext {\n trigger: TriggerInstanceId;\n nodeId: NodeId;\n config: TConfig;\n previousState: TSetupState;\n}\n\n/**\n * Trigger setup state is intentionally engine-owned so future ownership and\n * leader-election metadata can be coordinated centrally rather than pushed into\n * package-level setup code.\n */\n\nexport interface PersistedTriggerSetupState<TState extends JsonValue | undefined = JsonValue | undefined> {\n trigger: TriggerInstanceId;\n updatedAt: string;\n state: TState;\n}\n\nexport interface TriggerSetupStateRepository {\n load(trigger: TriggerInstanceId): Promise<PersistedTriggerSetupState | undefined>;\n save(state: PersistedTriggerSetupState): Promise<void>;\n delete(trigger: TriggerInstanceId): Promise<void>;\n}\n\nexport interface TriggerCleanupHandle {\n stop(): Promise<void> | void;\n}\n\nexport interface EngineHost {\n credentialSessions: CredentialSessionService;\n workflows?: WorkflowRunnerService;\n}\n\n/**\n * Per-item runnable node: return JSON, an array to fan-out on `main`, an explicit `Item`, or {@link emitPorts}\n * for multi-port emission. Engine applies `inputSchema.parse(item.json)` and passes the result as `args.input`\n * (wire `item.json` is unchanged). Transform helpers may opt into binary preservation, while routers and\n * pass-through nodes should return explicit items when they need to preserve full item state.\n */\nexport interface RunnableNodeExecuteArgs<\n TConfig extends RunnableNodeConfig<any, any> = RunnableNodeConfig<any, any>,\n TInputJson = unknown,\n> {\n readonly input: TInputJson;\n readonly item: Item;\n readonly itemIndex: number;\n readonly items: Items;\n readonly ctx: NodeExecutionContext<TConfig>;\n}\n\nexport interface RunnableNode<\n TConfig extends RunnableNodeConfig<any, any> = RunnableNodeConfig<any, any>,\n TInputJson = unknown,\n _TOutputJson = unknown,\n> {\n readonly kind: \"node\";\n /**\n * Declared output ports (e.g. `[\"main\"]`).\n *\n * Prefer describing dynamic router ports (Switch) and fixed multi-ports (If true/false)\n * via {@link NodeConfigBase.declaredOutputPorts}. Engine defaults to `[\"main\"]` when omitted.\n */\n readonly outputPorts?: ReadonlyArray<OutputPortKey>;\n /** When omitted, engine uses {@link RunnableNodeConfig.inputSchema} or `z.unknown()`. */\n readonly inputSchema?: ZodType<TInputJson>;\n execute(args: RunnableNodeExecuteArgs<TConfig, TInputJson>): Promise<unknown> | unknown;\n}\n\n/** @deprecated Use {@link RunnableNode} */\nexport type ItemNode<\n TConfig extends RunnableNodeConfig<any, any> = RunnableNodeConfig<any, any>,\n TInputJson = unknown,\n TOutputJson = unknown,\n> = RunnableNode<TConfig, TInputJson, TOutputJson>;\n\nexport interface MultiInputNode<TConfig extends NodeConfigBase = NodeConfigBase> {\n kind: \"node\";\n /**\n * Declared output ports (typically `[\"main\"]`).\n *\n * Prefer describing ports for authoring/canvas via {@link NodeConfigBase.declaredOutputPorts}.\n * Engine defaults to `[\"main\"]` when omitted.\n */\n outputPorts?: ReadonlyArray<OutputPortKey>;\n executeMulti(inputsByPort: NodeInputsByPort, ctx: NodeExecutionContext<TConfig>): Promise<NodeOutputs>;\n}\n\nexport type TriggerSetupStateFor<TConfig extends TriggerNodeConfig<any, any>> = TriggerNodeSetupState<TConfig>;\n\nexport interface TriggerNode<TConfig extends TriggerNodeConfig<any, any> = TriggerNodeConfig<any, any>> {\n kind: \"trigger\";\n outputPorts: readonly [\"main\"];\n setup(ctx: TriggerSetupContext<TConfig>): Promise<TriggerSetupStateFor<TConfig>>;\n execute(items: Items, ctx: NodeExecutionContext<TConfig>): Promise<NodeOutputs>;\n}\n\nexport interface TestableTriggerNode<\n TConfig extends TriggerNodeConfig<any, any> = TriggerNodeConfig<any, any>,\n> extends TriggerNode<TConfig> {\n getTestItems(ctx: TriggerTestItemsContext<TConfig>): Promise<Items>;\n}\n\nexport type ExecutableTriggerNode<TConfig extends TriggerNodeConfig<any, any> = TriggerNodeConfig<any, any>> =\n TriggerNode<TConfig>;\n\nexport interface NodeExecutionRequest {\n runId: RunId;\n activationId: NodeActivationId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n input: Items;\n parent?: ParentExecutionRef;\n queue?: string;\n executionOptions?: RunExecutionOptions;\n}\n\nexport interface NodeExecutionScheduler {\n enqueue(request: NodeExecutionRequest): Promise<{ receiptId: string }>;\n cancel?(receiptId: string): Promise<void>;\n}\n\nexport interface NodeExecutionRequestHandler {\n handleNodeExecutionRequest(request: NodeExecutionRequest): Promise<void>;\n}\n\nexport type NodeActivationRequestBase = Readonly<{\n runId: RunId;\n activationId: NodeActivationId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n parent?: ParentExecutionRef;\n executionOptions?: RunExecutionOptions;\n batchId?: string;\n ctx: NodeExecutionContext;\n}>;\n\nexport type NodeActivationRequest =\n | (NodeActivationRequestBase &\n Readonly<{\n kind: \"single\";\n input: Items;\n }>)\n | (NodeActivationRequestBase &\n Readonly<{\n kind: \"multi\";\n inputsByPort: NodeInputsByPort;\n }>);\n\nexport interface NodeActivationReceipt {\n receiptId: string;\n mode?: \"local\" | \"worker\";\n queue?: string;\n}\n\nexport interface PreparedNodeActivationDispatch {\n readonly receipt: NodeActivationReceipt;\n dispatch(): Promise<void>;\n}\n\nexport interface NodeActivationContinuation {\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}\n\nexport interface NodeActivationScheduler {\n setContinuation?(continuation: NodeActivationContinuation): void;\n prepareDispatch(request: NodeActivationRequest): Promise<PreparedNodeActivationDispatch>;\n cancel?(receiptId: string): Promise<void>;\n}\n\nexport interface WorkflowNodeInstanceFactory {\n createNodes(workflow: WorkflowDefinition): ReadonlyMap<NodeId, unknown>;\n createByType(type: TypeToken<unknown>): unknown;\n}\n\nexport interface NodeExecutor {\n execute(request: NodeActivationRequest): Promise<NodeOutputs>;\n}\n\nexport interface WorkflowSnapshotFactory {\n create(workflow: WorkflowDefinition): PersistedWorkflowSnapshot;\n}\n\nexport interface WorkflowSnapshotResolver {\n resolve(args: {\n workflowId: WorkflowId;\n workflowSnapshot?: PersistedWorkflowSnapshot;\n }): WorkflowDefinition | undefined;\n}\n\n/** Optional host wiring for trigger lifecycle logs (boot skip + activation sync). */\nexport interface TriggerRuntimeDiagnostics {\n info(message: string): void;\n warn(message: string): void;\n}\n\nexport interface EngineDeps {\n credentialSessions: CredentialSessionService;\n liveWorkflowRepository: LiveWorkflowRepository;\n workflowRepository: WorkflowRepository;\n /** When {@link AllWorkflowsActiveWorkflowActivationPolicy}, all workflows behave as active (tests). */\n workflowActivationPolicy: WorkflowActivationPolicy;\n nodeResolver: NodeResolver;\n triggerSetupStateRepository: TriggerSetupStateRepository;\n webhookTriggerMatcher: WebhookTriggerMatcher;\n runIdFactory: RunIdFactory;\n activationIdFactory: ActivationIdFactory;\n workflowExecutionRepository: WorkflowExecutionRepository;\n activationScheduler: NodeActivationScheduler;\n runDataFactory: RunDataFactory;\n executionContextFactory: ExecutionContextFactory;\n executionTelemetryFactory?: ExecutionTelemetryFactory;\n nodeExecutor: NodeExecutor;\n eventBus?: RunEventBus;\n tokenRegistry: PersistedWorkflowTokenRegistryLike;\n workflowNodeInstanceFactory: WorkflowNodeInstanceFactory;\n /** Defaults for prune/storage snapshot when workflow omits explicit policy fields. */\n workflowPolicyRuntimeDefaults?: WorkflowPolicyRuntimeDefaults;\n /** When set, logs inactive-workflow skips at boot and trigger start/stop on activation changes. */\n triggerRuntimeDiagnostics?: TriggerRuntimeDiagnostics;\n /** When set, the polling-trigger runtime uses this logger for cycle info/debug/error. */\n pollingTriggerLogger?: import(\"../triggers/polling/PollingTriggerLogger\").PollingTriggerLogger;\n}\n","import type { PersistedRunState } from \"./runTypes\";\n\ntype RunFinishedAtSource = Pick<PersistedRunState, \"status\" | \"nodeSnapshotsByNodeId\" | \"finishedAt\">;\n\n/** Derives workflow end time from persisted run root or node snapshots for run listings. */\nexport class RunFinishedAtFactory {\n static resolveIso(state: RunFinishedAtSource): string | undefined {\n if (state.finishedAt && state.status !== \"running\" && state.status !== \"pending\") {\n return state.finishedAt;\n }\n if (state.status === \"running\" || state.status === \"pending\") {\n return undefined;\n }\n let max: string | undefined;\n for (const snap of Object.values(state.nodeSnapshotsByNodeId)) {\n if (snap?.finishedAt && (!max || snap.finishedAt > max)) {\n max = snap.finishedAt;\n }\n }\n return max;\n }\n}\n","import type { ZodType } from \"zod\";\n\nimport type { TypeToken } from \"../di\";\nimport type { CredentialRequirement } from \"./credentialTypes\";\nimport type { RetryPolicySpec } from \"./retryPolicySpec.types\";\nimport type { InputPortKey, NodeConnectionName, NodeId, OutputPortKey, WorkflowId } from \"./baseTypes\";\n\nexport type {\n InputPortKey,\n NodeConnectionName,\n NodeId,\n OutputPortKey,\n PersistedTokenId,\n WorkflowId,\n} from \"./baseTypes\";\n\nexport type NodeIdRef<TJson = unknown> = NodeId & Readonly<{ __codemationNodeJson?: TJson }>;\n\nexport type NodeKind = \"trigger\" | \"node\";\nexport type JsonPrimitive = string | number | boolean | null;\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\nexport type JsonArray = ReadonlyArray<JsonValue>;\n/** JSON value that is not a top-level array (nested arrays inside objects are allowed). */\nexport type JsonNonArray = JsonPrimitive | JsonObject;\n\nexport interface Edge {\n from: { nodeId: NodeId; output: OutputPortKey };\n to: { nodeId: NodeId; input: InputPortKey };\n}\n\n/**\n * Named connection from a parent node to child nodes that exist in {@link WorkflowDefinition.nodes}\n * but are not traversed by the main execution graph. Parents are commonly executable nodes, but may\n * also be connection-owned nodes for recursive agent attachments.\n */\nexport interface WorkflowNodeConnection {\n readonly parentNodeId: NodeId;\n readonly connectionName: NodeConnectionName;\n readonly childNodeIds: ReadonlyArray<NodeId>;\n}\n\nexport interface WorkflowDefinition {\n id: WorkflowId;\n name: string;\n nodes: NodeDefinition[];\n edges: Edge[];\n /**\n * Optional metadata: which nodes are connection-owned children (e.g. AI agent `llm` / `tools` slots).\n * When omitted, all nodes in {@link nodes} are treated as executable for topology.\n */\n readonly connections?: ReadonlyArray<WorkflowNodeConnection>;\n /** Directory + file-stem path under a workflow discovery root (for UI grouping only). */\n discoveryPathSegments?: readonly string[];\n /** Retention for run JSON and binaries (seconds). Host/env may supply defaults when omitted. */\n readonly prunePolicy?: WorkflowPrunePolicySpec;\n /** Whether to keep run data after completion. Host/env may supply defaults when omitted. */\n readonly storagePolicy?: WorkflowStoragePolicySpec;\n /** Invoked after a node fails permanently (retries exhausted) and node error handler did not recover. */\n readonly workflowErrorHandler?: WorkflowErrorHandlerSpec;\n}\n\nexport interface WorkflowGraph {\n next(nodeId: NodeId, output: OutputPortKey): ReadonlyArray<Readonly<{ nodeId: NodeId; input: InputPortKey }>>;\n}\n\nexport interface WorkflowGraphFactory {\n create(def: WorkflowDefinition): WorkflowGraph;\n}\n\nexport interface NodeConfigBase {\n readonly kind: NodeKind;\n readonly type: TypeToken<unknown>;\n readonly name?: string;\n readonly id?: NodeId;\n readonly icon?: string;\n readonly execution?: Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }>;\n /** In-process execute retries (runnable nodes). Triggers typically omit this. */\n readonly retryPolicy?: RetryPolicySpec;\n /** Recover from execute failures; return outputs to continue, or rethrow to fail the node. */\n readonly nodeErrorHandler?: NodeErrorHandlerSpec;\n /**\n * When true, edges carrying zero items on an output port still schedule single-input downstream nodes.\n * Decided from the **source** node that produced the (empty) output. Default (false/undefined): empty\n * main batches skip downstream execution and propagate the empty path.\n */\n readonly continueWhenEmptyOutput?: boolean;\n /**\n * Declared I/O port names for canvas authoring (unioned with ports inferred from edges).\n * Use for dynamic routers (Switch) and future error ports.\n */\n readonly declaredOutputPorts?: ReadonlyArray<OutputPortKey>;\n readonly declaredInputPorts?: ReadonlyArray<InputPortKey>;\n getCredentialRequirements?(): ReadonlyArray<CredentialRequirement>;\n /**\n * Marker: this node emits {@link import(\"./assertionTypes\").AssertionResult}-shaped items on its\n * `main` port. The TestSuiteOrchestrator (and host-side TestAssertionPersister) listen for\n * `nodeCompleted` events from nodes with this flag set, and persist their output items as\n * TestAssertion records (only when the run carries a `testContext`). Set on assertion node\n * configs (e.g. `AssertionNodeConfig`, `StringEqualsAssertionNodeConfig`).\n */\n readonly emitsAssertions?: true;\n /**\n * Static configuration summary surfaced in the workflow inspector — the design-time\n * \"what does this node do\" panel that renders before any run telemetry exists.\n *\n * Return 2–6 short label/value pairs derived from this config (method + url for an HTTP\n * call, model + tool list for an agent, schedule + timezone for a cron trigger, etc.).\n * Values are truncated by the UI; aim for one line each. Return `undefined` to opt out\n * — the inspector hides the section when no rows are produced.\n *\n * Implement on the config class instance so the function can read sibling config fields.\n * `defineNode({ inspectorSummary })` plumbs through to this.\n */\n inspectorSummary?(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;\n}\n\n/**\n * One row of a node's static configuration summary. See {@link NodeConfigBase.inspectorSummary}.\n */\nexport interface NodeInspectorSummaryRow {\n readonly label: string;\n readonly value: string;\n}\n\nexport declare const runnableNodeInputType: unique symbol;\nexport declare const runnableNodeOutputType: unique symbol;\nexport declare const triggerNodeOutputType: unique symbol;\n\n/**\n * Runnable node: **`TInputJson`** is what **`inputSchema`** validates on **`item.json`** (the wire payload).\n * **`TOutputJson`** is emitted `item.json` on outputs.\n */\nexport interface RunnableNodeConfig<TInputJson = unknown, TOutputJson = unknown> extends NodeConfigBase {\n readonly kind: \"node\";\n readonly [runnableNodeInputType]?: TInputJson;\n readonly [runnableNodeOutputType]?: TOutputJson;\n /**\n * Optional Zod input contract for {@link RunnableNode} when not set on the node class.\n * Resolution order: node instance `inputSchema`, then config `inputSchema`, then `z.unknown()`.\n */\n readonly inputSchema?: ZodType<TInputJson>;\n /**\n * When an activation receives **zero** input items, the engine normally runs `execute` zero times.\n * Set to **`runOnce`** to run `execute` once with an empty `items` batch (and a synthetic wire item for schema parsing).\n * Used by batch-style callback nodes (built-in `Callback`) so `callback([], ctx)` still runs.\n */\n readonly emptyBatchExecution?: \"skip\" | \"runOnce\";\n}\n\nexport declare const triggerNodeSetupStateType: unique symbol;\n\nexport interface TriggerNodeConfig<\n TOutputJson = unknown,\n TSetupState extends JsonValue | undefined = undefined,\n> extends NodeConfigBase {\n readonly kind: \"trigger\";\n readonly [triggerNodeOutputType]?: TOutputJson;\n readonly [triggerNodeSetupStateType]?: TSetupState;\n /**\n * Distinguishes triggers driven by the live activation policy (webhooks, cron, polling) from\n * triggers driven only by the {@link TestSuiteOrchestrator}. `WorkflowActivation` skips\n * `\"test\"` triggers; the orchestrator skips `\"live\"` triggers. Defaults to `\"live\"` when omitted.\n */\n readonly triggerKind?: \"live\" | \"test\";\n}\n\nexport type RunnableNodeInputJson<TConfig extends RunnableNodeConfig<any, any>> =\n TConfig extends RunnableNodeConfig<infer TInputJson, any> ? TInputJson : never;\n\nexport type RunnableNodeOutputJson<TConfig extends RunnableNodeConfig<any, any>> =\n TConfig extends RunnableNodeConfig<any, infer TOutputJson> ? TOutputJson : never;\n\nexport type TriggerNodeOutputJson<TConfig extends TriggerNodeConfig<any, any>> =\n TConfig extends TriggerNodeConfig<infer TOutputJson, any> ? TOutputJson : never;\n\nexport type TriggerNodeSetupState<TConfig extends TriggerNodeConfig<any, any>> =\n TConfig extends TriggerNodeConfig<any, infer TSetupState> ? TSetupState : never;\n\nexport interface NodeDefinition {\n id: NodeId;\n kind: NodeKind;\n type: TypeToken<unknown>;\n name?: string;\n config: NodeConfigBase;\n}\n\nexport interface NodeRef {\n id: NodeId;\n kind: NodeKind;\n name?: string;\n}\n\nexport function nodeRef<TJson>(nodeId: NodeId): NodeIdRef<TJson> {\n return nodeId as NodeIdRef<TJson>;\n}\n\nexport type PairedItemRef = Readonly<{ nodeId: NodeId; output: OutputPortKey; itemIndex: number }>;\n\nexport type BinaryPreviewKind = \"image\" | \"audio\" | \"video\" | \"download\";\n\nexport type BinaryAttachment = Readonly<{\n id: string;\n storageKey: string;\n mimeType: string;\n size: number;\n storageDriver: string;\n previewKind: BinaryPreviewKind;\n createdAt: string;\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n filename?: string;\n sha256?: string;\n}>;\n\nexport type ItemBinary = Readonly<Record<string, BinaryAttachment>>;\n\nexport type Item<TJson = unknown> = Readonly<{\n json: TJson;\n binary?: ItemBinary;\n meta?: Readonly<Record<string, unknown>>;\n paired?: ReadonlyArray<PairedItemRef>;\n}>;\n\nexport type Items<TJson = unknown> = ReadonlyArray<Item<TJson>>;\n\nexport type NodeOutputs = Partial<Record<OutputPortKey, Items>>;\n\nexport type RunId = string;\nexport type NodeActivationId = string;\n/**\n * One per-item iteration of a runnable node's execute loop. Refines `NodeActivationId` for\n * per-item connection invocations and telemetry. Undefined when the executing node is a batch\n * node or trigger that does not iterate items.\n */\nexport type NodeIterationId = string;\n\nexport interface ParentExecutionRef {\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n /** Subworkflow depth of the **spawning** run (0 = root). Passed when starting a child run. */\n subworkflowDepth?: number;\n /** Effective max node activations from the parent run (propagated to child policy merge). */\n engineMaxNodeActivations?: number;\n /** Effective max subworkflow depth from the parent run (propagated to child policy merge). */\n engineMaxSubworkflowDepth?: number;\n /**\n * Test-suite linkage inherited by the child subworkflow run. Set by whichever node\n * spawns the subworkflow when its own `ctx.testContext` is present, so assertions\n * emitted inside a subworkflow land under the correct parent test case.\n */\n testContext?: import(\"./runTypes\").RunTestContext;\n}\n\nexport interface RunDataSnapshot {\n getOutputs(nodeId: NodeId): NodeOutputs | undefined;\n getOutputItems<TJson = unknown>(nodeId: NodeId | NodeIdRef<TJson>, output?: OutputPortKey): Items<TJson>;\n getOutputItem<TJson = unknown>(\n nodeId: NodeId | NodeIdRef<TJson>,\n itemIndex: number,\n output?: OutputPortKey,\n ): Item<TJson> | undefined;\n}\n\nexport interface MutableRunData extends RunDataSnapshot {\n setOutputs(nodeId: NodeId, outputs: NodeOutputs): void;\n dump(): Record<NodeId, NodeOutputs>;\n}\n\nexport interface RunDataFactory {\n create(initial?: Record<NodeId, NodeOutputs>): MutableRunData;\n}\n\nexport interface RunIdFactory {\n makeRunId(): RunId;\n}\n\nexport interface ActivationIdFactory {\n makeActivationId(): NodeActivationId;\n}\n\nexport type UpstreamRefPlaceholder = `$${number}`;\nexport const branchRef = (index: number) => `$${index}` as UpstreamRefPlaceholder;\n\nexport type ExecutionMode = \"local\" | \"worker\";\n\nexport interface NodeSchedulerDecision {\n mode: ExecutionMode;\n queue?: string;\n}\n\nexport interface NodeOffloadPolicy {\n decide(args: { workflowId: WorkflowId; nodeId: NodeId; config: NodeConfigBase }): NodeSchedulerDecision;\n}\n\n/** Whether to persist run execution data after the workflow finishes. */\nexport type WorkflowStoragePolicyMode = \"ALL\" | \"SUCCESS\" | \"ERROR\" | \"NEVER\";\n\nexport type WorkflowStoragePolicySpec = WorkflowStoragePolicyMode | TypeToken<WorkflowStoragePolicyResolver>;\n\nexport interface WorkflowStoragePolicyResolver {\n shouldPersist(args: WorkflowStoragePolicyDecisionArgs): boolean | Promise<boolean>;\n}\n\nexport interface WorkflowStoragePolicyDecisionArgs {\n readonly runId: RunId;\n readonly workflowId: WorkflowId;\n readonly workflow: WorkflowDefinition;\n readonly finalStatus: \"completed\" | \"failed\";\n readonly startedAt: string;\n readonly finishedAt: string;\n}\n\nexport interface WorkflowPrunePolicySpec {\n readonly runDataRetentionSeconds?: number;\n readonly binaryRetentionSeconds?: number;\n readonly telemetrySpanRetentionSeconds?: number;\n readonly telemetryArtifactRetentionSeconds?: number;\n readonly telemetryMetricRetentionSeconds?: number;\n}\n\nexport interface PersistedRunPolicySnapshot {\n readonly retentionSeconds?: number;\n readonly binaryRetentionSeconds?: number;\n readonly telemetrySpanRetentionSeconds?: number;\n readonly telemetryArtifactRetentionSeconds?: number;\n readonly telemetryMetricRetentionSeconds?: number;\n readonly storagePolicy: WorkflowStoragePolicyMode;\n}\n\nexport interface WorkflowErrorHandler {\n onError(ctx: WorkflowErrorContext): void | Promise<void>;\n}\n\nexport interface WorkflowErrorContext {\n readonly runId: RunId;\n readonly workflowId: WorkflowId;\n readonly workflow: WorkflowDefinition;\n readonly failedNodeId: NodeId;\n readonly error: Error;\n readonly startedAt: string;\n readonly finishedAt: string;\n}\n\nexport type WorkflowErrorHandlerSpec = TypeToken<WorkflowErrorHandler> | WorkflowErrorHandler;\n\nexport interface NodeErrorHandlerArgs<TConfig extends NodeConfigBase = NodeConfigBase> {\n readonly kind: \"single\" | \"multi\";\n readonly items: Items;\n readonly inputsByPort: Readonly<Record<InputPortKey, Items>> | undefined;\n readonly ctx: import(\"./runtimeTypes\").NodeExecutionContext<TConfig>;\n readonly error: Error;\n}\n\nexport interface NodeErrorHandler {\n handle<TConfig extends NodeConfigBase>(args: NodeErrorHandlerArgs<TConfig>): Promise<NodeOutputs>;\n}\n\nexport type NodeErrorHandlerSpec = TypeToken<NodeErrorHandler> | NodeErrorHandler;\n\n/** Runtime defaults when workflow omits prune/storage fields (typically from host env). */\nexport interface WorkflowPolicyRuntimeDefaults {\n readonly retentionSeconds?: number;\n readonly binaryRetentionSeconds?: number;\n readonly telemetrySpanRetentionSeconds?: number;\n readonly telemetryArtifactRetentionSeconds?: number;\n readonly telemetryMetricRetentionSeconds?: number;\n readonly storagePolicy?: WorkflowStoragePolicyMode;\n}\n","import type { TypeToken } from \"./index\";\nimport type { RunEventBus } from \"../events/runEvents\";\nimport type { EngineExecutionLimitsPolicy } from \"../policies/executionLimits/EngineExecutionLimitsPolicy\";\nimport type { AgentMcpIntegration } from \"../contracts/agentMcpTypes\";\nimport type {\n ActivationIdFactory,\n BinaryStorage,\n CredentialSessionService,\n CredentialTypeRegistry,\n ExecutionContextFactory,\n LiveWorkflowRepository,\n NodeActivationScheduler,\n NodeResolver,\n PersistedWorkflowTokenRegistryLike,\n RunDataFactory,\n RunIdFactory,\n TriggerSetupStateRepository,\n WorkflowExecutionRepository,\n WorkflowNodeInstanceFactory,\n WorkflowActivationPolicy,\n WorkflowRepository,\n WorkflowRunnerService,\n} from \"../types\";\n\nexport const CoreTokens = {\n PersistedWorkflowTokenRegistry: Symbol.for(\n \"codemation.core.PersistedWorkflowTokenRegistry\",\n ) as TypeToken<PersistedWorkflowTokenRegistryLike>,\n CredentialSessionService: Symbol.for(\n \"codemation.core.CredentialSessionService\",\n ) as TypeToken<CredentialSessionService>,\n CredentialTypeRegistry: Symbol.for(\"codemation.core.CredentialTypeRegistry\") as TypeToken<CredentialTypeRegistry>,\n WorkflowRunnerService: Symbol.for(\"codemation.core.WorkflowRunnerService\") as TypeToken<WorkflowRunnerService>,\n LiveWorkflowRepository: Symbol.for(\"codemation.core.LiveWorkflowRepository\") as TypeToken<LiveWorkflowRepository>,\n WorkflowRepository: Symbol.for(\"codemation.core.WorkflowRepository\") as TypeToken<WorkflowRepository>,\n NodeResolver: Symbol.for(\"codemation.core.NodeResolver\") as TypeToken<NodeResolver>,\n WorkflowNodeInstanceFactory: Symbol.for(\n \"codemation.core.WorkflowNodeInstanceFactory\",\n ) as TypeToken<WorkflowNodeInstanceFactory>,\n RunIdFactory: Symbol.for(\"codemation.core.RunIdFactory\") as TypeToken<RunIdFactory>,\n ActivationIdFactory: Symbol.for(\"codemation.core.ActivationIdFactory\") as TypeToken<ActivationIdFactory>,\n WorkflowExecutionRepository: Symbol.for(\n \"codemation.core.WorkflowExecutionRepository\",\n ) as TypeToken<WorkflowExecutionRepository>,\n TriggerSetupStateRepository: Symbol.for(\n \"codemation.core.TriggerSetupStateRepository\",\n ) as TypeToken<TriggerSetupStateRepository>,\n NodeActivationScheduler: Symbol.for(\"codemation.core.NodeActivationScheduler\") as TypeToken<NodeActivationScheduler>,\n RunDataFactory: Symbol.for(\"codemation.core.RunDataFactory\") as TypeToken<RunDataFactory>,\n ExecutionContextFactory: Symbol.for(\"codemation.core.ExecutionContextFactory\") as TypeToken<ExecutionContextFactory>,\n RunEventBus: Symbol.for(\"codemation.core.RunEventBus\") as TypeToken<RunEventBus>,\n BinaryStorage: Symbol.for(\"codemation.core.BinaryStorage\") as TypeToken<BinaryStorage>,\n WebhookBasePath: Symbol.for(\"codemation.core.WebhookBasePath\") as TypeToken<string>,\n /** Engine execution limits (defaults + optional host overrides). Consumers may bind a custom instance to override. */\n EngineExecutionLimitsPolicy: Symbol.for(\n \"codemation.core.EngineExecutionLimitsPolicy\",\n ) as TypeToken<EngineExecutionLimitsPolicy>,\n WorkflowActivationPolicy: Symbol.for(\n \"codemation.core.WorkflowActivationPolicy\",\n ) as TypeToken<WorkflowActivationPolicy>,\n /**\n * Optional. When registered, AIAgentNode uses it to resolve mcpServers bindings,\n * validate scopes, open pool connections, and prepare the MCP ToolSet map.\n * Not registered in the default core bootstrap — the host provides the implementation.\n */\n AgentMcpIntegration: Symbol.for(\"codemation.core.AgentMcpIntegration\") as TypeToken<AgentMcpIntegration>,\n} as const;\n"],"mappings":"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"}
@@ -165,6 +165,7 @@ var NodeBackedToolConfig = class {
165
165
  toolKind = "nodeBacked";
166
166
  description;
167
167
  presentation;
168
+ onRejected;
168
169
  inputSchemaValue;
169
170
  outputSchemaValue;
170
171
  mapInputValue;
@@ -175,6 +176,7 @@ var NodeBackedToolConfig = class {
175
176
  this.type = node.type;
176
177
  this.description = options.description;
177
178
  this.presentation = options.presentation;
179
+ this.onRejected = options.onRejected;
178
180
  this.inputSchemaValue = options.inputSchema;
179
181
  this.outputSchemaValue = options.outputSchema;
180
182
  this.mapInputValue = options.mapInput;
@@ -404,4 +406,4 @@ const CoreTokens = {
404
406
 
405
407
  //#endregion
406
408
  export { itemExpr as C, ConnectionNodeIdFactory as E, isItemExpr as S, resolveItemExprsInUnknown as T, CredentialUnboundError as _, injectable as a, NodeBackedToolConfig as b, predicateAwareClassFactory as c, CoreTokens as d, branchRef as f, SuspensionRequest as g, BINARY_DEFAULT_MAX_BYTES as h, injectAll as i, registry as l, RunFinishedAtFactory as m, delay as n, instanceCachingFactory as o, nodeRef as p, inject as r, instancePerContainerCachingFactory as s, container$1 as t, singleton as u, NodeIterationIdFactory as v, resolveItemExprsForExecution as w, AgentConfigInspector as x, AgentConnectionNodeCollector as y };
407
- //# sourceMappingURL=di-D9Mv3kF3.js.map
409
+ //# sourceMappingURL=di-tom0pM2h.js.map