@codemation/core 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/dist/{CostCatalogContract-B9aYIqJu.d.cts → CostCatalogContract-Dwo-ZamG.d.cts} +2 -2
  3. package/dist/EngineRuntimeRegistration.types-BiNasx3G.d.cts +54 -0
  4. package/dist/EngineRuntimeRegistration.types-Dq4ucrdo.d.ts +21 -0
  5. package/dist/{InMemoryRunDataFactory-C3rIszrW.d.cts → InMemoryRunDataFactory-D2U9azmZ.d.cts} +2 -20
  6. package/dist/{InMemoryRunEventBusRegistry-Sa86VxuV.cjs → InMemoryRunEventBusRegistry-DO0WM9Lw.cjs} +1 -1
  7. package/dist/{InMemoryRunEventBusRegistry-Sa86VxuV.cjs.map → InMemoryRunEventBusRegistry-DO0WM9Lw.cjs.map} +1 -1
  8. package/dist/{InMemoryRunEventBusRegistry-Bwunvt1T.js → InMemoryRunEventBusRegistry-Layt2xgm.js} +1 -1
  9. package/dist/{InMemoryRunEventBusRegistry-Bwunvt1T.js.map → InMemoryRunEventBusRegistry-Layt2xgm.js.map} +1 -1
  10. package/dist/{ItemsInputNormalizer-UCpn7luX.d.cts → ItemsInputNormalizer-A5txcOWX.d.cts} +3 -98
  11. package/dist/{ItemsInputNormalizer-B9SdLG24.cjs → ItemsInputNormalizer-C1fv3sMW.cjs} +2 -2
  12. package/dist/ItemsInputNormalizer-C1fv3sMW.cjs.map +1 -0
  13. package/dist/{ItemsInputNormalizer-DoOawd9R.d.ts → ItemsInputNormalizer-D2vrMrX1.d.ts} +2 -62
  14. package/dist/{ItemsInputNormalizer-CZEODg94.js → ItemsInputNormalizer-fUYo4GLV.js} +2 -2
  15. package/dist/ItemsInputNormalizer-fUYo4GLV.js.map +1 -0
  16. package/dist/{RunIntentService-0f3ICjAz.d.cts → RunIntentService-DKxuHTUz.d.cts} +2 -15
  17. package/dist/{RunIntentService-Dx_HHxDX.d.ts → RunIntentService-DrpKli2k.d.ts} +2 -22
  18. package/dist/{agentMcpTypes-B11B3Hd-.d.cts → agentMcpTypes-BHX4RQCC.d.cts} +24 -524
  19. package/dist/bootstrap/index.cjs +9 -5
  20. package/dist/bootstrap/index.d.cts +32 -106
  21. package/dist/bootstrap/index.d.ts +18 -17
  22. package/dist/bootstrap/index.js +6 -5
  23. package/dist/{bootstrap-Be0LB0nh.cjs → bootstrap-CTB53rEF.cjs} +9 -60
  24. package/dist/bootstrap-CTB53rEF.cjs.map +1 -0
  25. package/dist/{bootstrap-pSQdsMfa.js → bootstrap-DmqKheCI.js} +6 -57
  26. package/dist/bootstrap-DmqKheCI.js.map +1 -0
  27. package/dist/browser.cjs +12 -11
  28. package/dist/browser.d.cts +4 -4
  29. package/dist/browser.d.ts +3 -3
  30. package/dist/browser.js +3 -2
  31. package/dist/contracts-7L1wJHdk.cjs +569 -0
  32. package/dist/contracts-7L1wJHdk.cjs.map +1 -0
  33. package/dist/contracts-CjJ5CZ7N.js +447 -0
  34. package/dist/contracts-CjJ5CZ7N.js.map +1 -0
  35. package/dist/contracts.cjs +9 -2
  36. package/dist/contracts.d.cts +5 -5
  37. package/dist/contracts.d.ts +2 -2
  38. package/dist/contracts.js +3 -2
  39. package/dist/{executionPersistenceContracts-CX9Ql8N1.d.cts → deploymentManifestTypes-B8CDmZZK.d.cts} +65 -81
  40. package/dist/di-C6Ubf9o5.cjs +179 -0
  41. package/dist/di-C6Ubf9o5.cjs.map +1 -0
  42. package/dist/di-Cjiil7U-.js +114 -0
  43. package/dist/di-Cjiil7U-.js.map +1 -0
  44. package/dist/{index-CbJdbIHe.d.ts → index-CRv3_pY3.d.ts} +87 -870
  45. package/dist/{index-uPnD9EE6.d.ts → index-mnLS0iQl.d.ts} +27 -400
  46. package/dist/index.cjs +44 -115
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.d.cts +17 -524
  49. package/dist/index.d.ts +5 -5
  50. package/dist/index.js +21 -98
  51. package/dist/index.js.map +1 -1
  52. package/dist/{params-Dwl10Ws9.d.cts → params-CrK4iuG1.d.cts} +2 -11
  53. package/dist/{runtime-CSunvf7A.js → runtime-CBFDpmiz.js} +46 -679
  54. package/dist/runtime-CBFDpmiz.js.map +1 -0
  55. package/dist/{runtime-n2tqRwaf.cjs → runtime-Due-FOZ2.cjs} +69 -752
  56. package/dist/runtime-Due-FOZ2.cjs.map +1 -0
  57. package/dist/testing.cjs +8 -40
  58. package/dist/testing.cjs.map +1 -1
  59. package/dist/testing.d.cts +3 -32
  60. package/dist/testing.d.ts +3 -32
  61. package/dist/testing.js +6 -38
  62. package/dist/testing.js.map +1 -1
  63. package/dist/{di-DhwtDRgs.cjs → workflowTypes-BW6Hhee7.cjs} +4 -229
  64. package/dist/workflowTypes-BW6Hhee7.cjs.map +1 -0
  65. package/dist/{di-CEV6wTc4.js → workflowTypes-DZtBTmKf.js} +3 -162
  66. package/dist/workflowTypes-DZtBTmKf.js.map +1 -0
  67. package/package.json +1 -1
  68. package/src/ai/AgentConnectionNodeCollector.ts +0 -4
  69. package/src/ai/AgentMessageConfigNormalizerFactory.ts +0 -4
  70. package/src/ai/AiHost.ts +0 -38
  71. package/src/ai/CallableToolConfig.ts +0 -9
  72. package/src/ai/CallableToolKindToken.ts +0 -4
  73. package/src/authoring/callableTool.types.ts +0 -3
  74. package/src/authoring/defineCollection.types.ts +0 -11
  75. package/src/authoring/defineHumanApprovalNode.types.ts +0 -116
  76. package/src/authoring/defineNode.types.ts +0 -25
  77. package/src/authoring/definePollingTrigger.types.ts +18 -152
  78. package/src/authoring/definePollingTriggerInternals.ts +0 -4
  79. package/src/authoring/nodeBaseOptions.types.ts +0 -14
  80. package/src/binaries/boundedReadBinary.types.ts +0 -16
  81. package/src/bootstrap/index.ts +8 -2
  82. package/src/bootstrap/runtime/EngineRuntimeRegistrar.ts +0 -5
  83. package/src/bootstrap/runtime/EngineRuntimeRegistration.types.ts +0 -23
  84. package/src/browser.ts +0 -3
  85. package/src/contracts/AgentBindError.ts +0 -5
  86. package/src/contracts/Clock.ts +0 -1
  87. package/src/contracts/CodemationTelemetryAttributeNames.ts +0 -10
  88. package/src/contracts/NoOpAgentMcpIntegration.ts +0 -6
  89. package/src/contracts/NoOpTelemetrySpanScope.ts +0 -7
  90. package/src/contracts/RetryPolicy.ts +0 -2
  91. package/src/contracts/agentMcpTypes.ts +0 -34
  92. package/src/contracts/assertionTypes.ts +0 -33
  93. package/src/contracts/baseTypes.ts +0 -6
  94. package/src/contracts/collectionTypes.ts +0 -25
  95. package/src/contracts/credentialTypes.ts +13 -60
  96. package/src/contracts/deploymentManifestTypes.ts +158 -0
  97. package/src/contracts/dispatchTypes.ts +29 -0
  98. package/src/contracts/executionPersistenceContracts.ts +0 -33
  99. package/src/contracts/hitlSeamTypes.ts +0 -14
  100. package/src/contracts/humanTaskStoreTypes.ts +0 -2
  101. package/src/contracts/inboxChannelTypes.ts +0 -9
  102. package/src/contracts/index.ts +3 -0
  103. package/src/contracts/itemExpr.ts +0 -18
  104. package/src/contracts/itemMeta.ts +0 -3
  105. package/src/contracts/mcpTypes.ts +0 -16
  106. package/src/contracts/retryPolicySpec.types.ts +0 -10
  107. package/src/contracts/runFinishedAtFactory.ts +0 -1
  108. package/src/contracts/runTypes.ts +0 -74
  109. package/src/contracts/runtimeTypes.ts +4 -131
  110. package/src/contracts/telemetryTypes.ts +0 -7
  111. package/src/contracts/testTriggerTypes.ts +0 -43
  112. package/src/contracts/triggerInvokerTypes.ts +6 -0
  113. package/src/contracts/webhookTypes.ts +0 -8
  114. package/src/contracts/workflowActivationPolicy.ts +0 -5
  115. package/src/contracts/workflowTypes.ts +4 -86
  116. package/src/contracts/workspaceFileTypes.ts +0 -72
  117. package/src/contracts.ts +18 -10
  118. package/src/credentials/CredentialMaterialProvider.types.ts +0 -28
  119. package/src/credentials/ManagedCredentialMaterialWriteError.ts +0 -6
  120. package/src/credentials/ManagedMaterialFetchError.ts +0 -6
  121. package/src/credentials/OAuthFlowExecutor.types.ts +0 -15
  122. package/src/di/CoreTokens.ts +2 -6
  123. package/src/events/ConnectionInvocationEventPublisher.ts +0 -7
  124. package/src/events/NodeEventPublisher.ts +0 -1
  125. package/src/events/runEvents.ts +0 -8
  126. package/src/execution/ActivationEnqueueService.ts +0 -10
  127. package/src/execution/ChildExecutionScopeFactory.ts +0 -13
  128. package/src/execution/FanInMergeByOriginMerger.ts +0 -11
  129. package/src/execution/InProcessRetryRunner.ts +0 -1
  130. package/src/execution/ItemExprResolver.ts +0 -3
  131. package/src/execution/NodeActivationRequestComposer.ts +0 -3
  132. package/src/execution/NodeActivationRequestInputPreparer.ts +0 -5
  133. package/src/execution/NodeExecutionSnapshotFactory.ts +0 -1
  134. package/src/execution/NodeExecutor.ts +1 -17
  135. package/src/execution/NodeSuspensionHandler.ts +1 -39
  136. package/src/execution/PersistedRunStateTerminalBuilder.ts +0 -5
  137. package/src/execution/RunSuspendedError.ts +0 -10
  138. package/src/execution/WorkflowRunExecutionContextFactory.ts +0 -3
  139. package/src/orchestration/AbortControllerFactory.ts +0 -4
  140. package/src/orchestration/Engine.ts +0 -9
  141. package/src/orchestration/NodeExecutionRequestHandlerService.ts +3 -4
  142. package/src/orchestration/RunContinuationService.ts +7 -39
  143. package/src/orchestration/RunStartService.ts +0 -7
  144. package/src/orchestration/TestSuiteOrchestrator.ts +0 -18
  145. package/src/orchestration/TestSuiteRunIdFactory.ts +0 -4
  146. package/src/orchestration/TriggerRuntimeService.ts +3 -2
  147. package/src/planning/CurrentStateFrontierPlanner.ts +0 -1
  148. package/src/planning/RunQueuePlanner.ts +0 -6
  149. package/src/policies/executionLimits/EngineExecutionLimitsPolicy.ts +0 -8
  150. package/src/policies/executionLimits/EngineExecutionLimitsPolicyFactory.ts +0 -3
  151. package/src/runStorage/RunSummaryMapper.ts +0 -1
  152. package/src/runtime/EngineFactory.ts +6 -11
  153. package/src/runtime/RunIntentService.ts +0 -4
  154. package/src/runtime/WorkflowRepositoryWebhookTriggerMatcher.ts +0 -4
  155. package/src/runtime-types/InjectableRuntimeDecoratorComposerRegistry.ts +0 -4
  156. package/src/runtime-types/PersistedRuntimeTypeMetadataStoreRegistry.ts +0 -4
  157. package/src/runtime-types/PersistedRuntimeTypeNameResolver.ts +0 -1
  158. package/src/runtime-types/persistedRuntimeTypeModelRegistry.ts +0 -4
  159. package/src/runtime-types/runtimeTypeDecorators.types.ts +0 -12
  160. package/src/scheduler/ConfigDrivenOffloadPolicy.ts +0 -1
  161. package/src/scheduler/DefaultDrivingScheduler.ts +0 -6
  162. package/src/scheduler/InlineDrivingScheduler.ts +0 -13
  163. package/src/serialization/ItemsInputNormalizer.ts +0 -5
  164. package/src/testing/CapturingScheduler.ts +0 -3
  165. package/src/testing/EngineTestKitRunIdFactory.ts +0 -3
  166. package/src/testing/ItemHarnessNode.ts +0 -3
  167. package/src/testing/ItemHarnessNodeConfig.ts +0 -4
  168. package/src/testing/PrefixedSequentialIdGenerator.ts +0 -3
  169. package/src/testing/RegistrarEngineTestKit.types.ts +0 -2
  170. package/src/testing/RejectingCredentialSessionService.ts +0 -4
  171. package/src/testing/SubWorkflowRunnerTestNode.ts +0 -3
  172. package/src/testing/WorkflowTestHarnessManualTrigger.ts +0 -3
  173. package/src/testing/WorkflowTestKitBuilder.ts +0 -4
  174. package/src/testing/WorkflowTestKitRunNodeWorkflowFactory.ts +0 -3
  175. package/src/testing.ts +0 -3
  176. package/src/triggers/polling/PollingTriggerDedupWindow.ts +0 -4
  177. package/src/triggers/polling/PollingTriggerLogger.ts +0 -5
  178. package/src/triggers/polling/PollingTriggerRuntime.ts +0 -5
  179. package/src/types/index.ts +0 -6
  180. package/src/validation/WorkflowEdgePortValidator.ts +0 -5
  181. package/src/workflow/definition/ConnectionInvocationIdFactory.ts +0 -7
  182. package/src/workflow/definition/ConnectionNodeIdFactory.ts +0 -6
  183. package/src/workflow/definition/NodeIterationIdFactory.ts +0 -13
  184. package/src/workflow/definition/WorkflowExecutableNodeClassifier.ts +0 -6
  185. package/src/workflow/dsl/ChainCursorResolver.ts +0 -20
  186. package/src/workflow/dsl/NodeIdSlugifier.ts +0 -9
  187. package/src/workflow/dsl/WhenBuilder.ts +0 -17
  188. package/src/workflow/dsl/WorkflowDefinitionError.ts +0 -9
  189. package/src/workflow/dsl/workflowBuilderTypes.ts +0 -24
  190. package/src/workflowSnapshots/MissingRuntimeParityGuard.ts +24 -0
  191. package/src/workflowSnapshots/PersistedWorkflowTokenRegistry.ts +0 -6
  192. package/src/workflowSnapshots/WorkflowParityMismatchError.ts +18 -0
  193. package/src/workflowSnapshots/WorkflowSnapshotCodec.ts +0 -5
  194. package/src/workflowSnapshots/index.ts +3 -0
  195. package/dist/EngineRuntimeRegistration.types-BYAmGMdS.d.cts +0 -81
  196. package/dist/EngineRuntimeRegistration.types-CVLI8DsJ.d.ts +0 -44
  197. package/dist/ItemsInputNormalizer-B9SdLG24.cjs.map +0 -1
  198. package/dist/ItemsInputNormalizer-CZEODg94.js.map +0 -1
  199. package/dist/bootstrap-Be0LB0nh.cjs.map +0 -1
  200. package/dist/bootstrap-pSQdsMfa.js.map +0 -1
  201. package/dist/contracts-CK0x6w_G.cjs +0 -74
  202. package/dist/contracts-CK0x6w_G.cjs.map +0 -1
  203. package/dist/contracts-DXdfTdpW.js +0 -50
  204. package/dist/contracts-DXdfTdpW.js.map +0 -1
  205. package/dist/di-CEV6wTc4.js.map +0 -1
  206. package/dist/di-DhwtDRgs.cjs.map +0 -1
  207. package/dist/runtime-CSunvf7A.js.map +0 -1
  208. package/dist/runtime-n2tqRwaf.cjs.map +0 -1
@@ -1,11 +1,6 @@
1
- import "reflect-metadata";
2
- import { container as container$1, delay, inject, injectAll, injectable, instanceCachingFactory, instancePerContainerCachingFactory, predicateAwareClassFactory, registry, singleton } from "tsyringe";
1
+ import { f as AgentConfigInspector } from "./di-Cjiil7U-.js";
3
2
 
4
3
  //#region src/workflow/definition/ConnectionNodeIdFactory.ts
5
- /**
6
- * Deterministic ids for workflow connection-owned child nodes (LLM slot, tools, etc.).
7
- * These are stable across loads.
8
- */
9
4
  var ConnectionNodeIdFactory = class {
10
5
  static connectionSegment = "__conn__";
11
6
  static languageModelConnectionNodeId(parentNodeId) {
@@ -59,104 +54,14 @@ var ConnectionNodeIdFactory = class {
59
54
  normalizedToolName
60
55
  };
61
56
  }
62
- /** True when `nodeId` is a connection-owned child of `parentNodeId` (LLM or tool slot). */
63
57
  static isConnectionOwnedDescendantOf(parentNodeId, nodeId) {
64
58
  return nodeId.startsWith(`${parentNodeId}${this.connectionSegment}`);
65
59
  }
66
- /** Normalizes a tool display name to a stable id segment. */
67
60
  static normalizeToolName(toolName) {
68
61
  return toolName.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "") || "tool";
69
62
  }
70
63
  };
71
64
 
72
- //#endregion
73
- //#region src/contracts/itemExpr.ts
74
- function itemExpr(fn) {
75
- return {
76
- __codemationItemExpr: "codemation.itemExpr",
77
- fn
78
- };
79
- }
80
- function isItemExpr(value) {
81
- if (typeof value !== "object" || value === null) return false;
82
- const v = value;
83
- if (v["__codemationItemExpr"] === "codemation.itemExpr" && typeof v["fn"] === "function") return true;
84
- for (const sym of Object.getOwnPropertySymbols(v)) if (sym.description === "codemation.itemExpr" && v[sym] === true) return true;
85
- const keys = Object.keys(v);
86
- if (keys.length === 1 && keys[0] === "fn" && typeof v.fn === "function") return true;
87
- return false;
88
- }
89
- function containsItemExprInUnknown(value, seen = /* @__PURE__ */ new WeakSet()) {
90
- if (isItemExpr(value)) return true;
91
- if (value === null || typeof value !== "object") return false;
92
- if (seen.has(value)) return false;
93
- seen.add(value);
94
- if (Array.isArray(value)) return value.some((entry) => containsItemExprInUnknown(entry, seen));
95
- for (const entry of Object.values(value)) if (containsItemExprInUnknown(entry, seen)) return true;
96
- return false;
97
- }
98
- /**
99
- * Deep-resolves {@link itemExpr} leaves. Returns a new graph (does not mutate the original config object).
100
- */
101
- async function resolveItemExprsInUnknown(value, args, seen = /* @__PURE__ */ new WeakSet()) {
102
- if (isItemExpr(value)) return await Promise.resolve(value.fn(args));
103
- if (value === null || typeof value !== "object") return value;
104
- if (seen.has(value)) return value;
105
- seen.add(value);
106
- if (Array.isArray(value)) {
107
- const out$1 = [];
108
- for (let i = 0; i < value.length; i++) out$1.push(await resolveItemExprsInUnknown(value[i], args, seen));
109
- return out$1;
110
- }
111
- const rec = value;
112
- const entries = Object.entries(rec);
113
- const proto = Object.getPrototypeOf(value);
114
- if (proto !== Object.prototype && proto !== null && entries.length === 0) return value;
115
- const out = Object.create(proto);
116
- for (const [k, v] of entries) out[k] = await resolveItemExprsInUnknown(v, args, seen);
117
- return out;
118
- }
119
- /**
120
- * Clones runnable config (best-effort) so per-item {@link itemExpr} resolution never mutates shared instances.
121
- */
122
- async function resolveItemExprsForExecution(config, nodeCtx, item, itemIndex, items) {
123
- const exprArgs = {
124
- item,
125
- itemIndex,
126
- items,
127
- ctx: {
128
- runId: nodeCtx.runId,
129
- workflowId: nodeCtx.workflowId,
130
- nodeId: nodeCtx.nodeId,
131
- activationId: nodeCtx.activationId,
132
- data: nodeCtx.data
133
- }
134
- };
135
- if (!containsItemExprInUnknown(config)) return;
136
- return await resolveItemExprsInUnknown(config, exprArgs);
137
- }
138
-
139
- //#endregion
140
- //#region src/ai/AgentConfigInspectorFactory.ts
141
- var AgentConfigInspector = class {
142
- static isAgentNodeConfig(config) {
143
- if (!config) return false;
144
- const candidate = config;
145
- return !!candidate.chatModel && this.hasCompatibleMessageConfiguration(candidate);
146
- }
147
- static hasCompatibleMessageConfiguration(candidate) {
148
- const messages = candidate.messages;
149
- if (messages === void 0 || messages === null) return false;
150
- if (Array.isArray(messages)) return messages.length > 0;
151
- if (typeof messages === "object") {
152
- if (isItemExpr(messages)) return true;
153
- const o = messages;
154
- return Array.isArray(o.prompt) && o.prompt.length > 0 || typeof o.buildMessages === "function";
155
- }
156
- return false;
157
- }
158
- };
159
-
160
65
  //#endregion
161
66
  //#region src/ai/NodeBackedToolConfig.ts
162
67
  var NodeBackedToolConfig = class {
@@ -271,10 +176,6 @@ const AgentConnectionNodeCollector = new class {
271
176
  const innerAgent = tool instanceof NodeBackedToolConfig ? tool.node : tool.node;
272
177
  this.collectInto(toolNodeId, innerAgent, collected, mcpServerResolver);
273
178
  }
274
- /**
275
- * After JSON round-trip (persisted snapshots), tools are plain objects — `instanceof NodeBackedToolConfig` fails.
276
- * Detect node-backed tools structurally via {@link NodeBackedToolConfig#toolKind}.
277
- */
278
179
  isNodeBackedAgentTool(tool) {
279
180
  if (tool instanceof NodeBackedToolConfig) return AgentConfigInspector.isAgentNodeConfig(tool.node);
280
181
  if (!tool || typeof tool !== "object") return false;
@@ -286,26 +187,13 @@ const AgentConnectionNodeCollector = new class {
286
187
 
287
188
  //#endregion
288
189
  //#region src/workflow/definition/NodeIterationIdFactory.ts
289
- /**
290
- * Unique ids for one per-item iteration of a runnable node's execute loop.
291
- *
292
- * Activations are per-batch (one scheduled execution of a node, possibly with N items).
293
- * Iterations refine that to one identifier per item-index inside the batch loop, so per-item
294
- * connection invocations and telemetry can be grouped without time-window heuristics.
295
- *
296
- * Uses Web Crypto's `randomUUID` (Node 19+ and all modern browsers) so this module is safe
297
- * to include in the browser entry. Importing `node:crypto` here previously leaked into the
298
- * canvas client bundle through `browser.ts` and OOM'd consumers' Turbopack builds.
299
- */
300
190
  var NodeIterationIdFactory = class {
301
191
  static create() {
302
192
  return `iter_${globalThis.crypto.randomUUID()}`;
303
193
  }
304
- /** Deterministic id for tests when a stable sequence is needed. */
305
194
  static createForTest(seed, sequence) {
306
195
  return `iter_${seed}_${sequence}`;
307
196
  }
308
- /** Deterministic id derived from a connection node id (for sub-agent / tool-call scopes). */
309
197
  static createForConnection(connectionNodeId, sequence) {
310
198
  return `iter_${connectionNodeId}_${sequence}`;
311
199
  }
@@ -328,25 +216,6 @@ var CredentialUnboundError = class CredentialUnboundError extends Error {
328
216
 
329
217
  //#endregion
330
218
  //#region src/contracts/runtimeTypes.ts
331
- /**
332
- * Thrown by a node's `execute()` to request durable suspension of the current item.
333
- * The engine catches this, persists the suspension entry, calls `deliver`, and
334
- * continues to the next item (per-item semantics).
335
- *
336
- * @example
337
- * ```ts
338
- * throw new SuspensionRequest({
339
- * decisionSchema: z.object({ approved: z.boolean() }),
340
- * timeout: "PT24H",
341
- * onTimeout: "halt",
342
- * subject: { title: "Approve invoice", summary: "Invoice #1234 needs approval" },
343
- * deliver: async (handle) => {
344
- * await notifySlack(handle);
345
- * return { channel: "slack", ts: "..." };
346
- * },
347
- * });
348
- * ```
349
- */
350
219
  var SuspensionRequest = class extends Error {
351
220
  constructor(request) {
352
221
  super(`SuspensionRequest(${request.subject?.title ?? "untitled"})`);
@@ -354,12 +223,10 @@ var SuspensionRequest = class extends Error {
354
223
  this.name = "SuspensionRequest";
355
224
  }
356
225
  };
357
- /** Default maximum bytes read into memory by the bounded helpers (50 MiB). */
358
226
  const BINARY_DEFAULT_MAX_BYTES = 50 * 1024 * 1024;
359
227
 
360
228
  //#endregion
361
229
  //#region src/contracts/runFinishedAtFactory.ts
362
- /** Derives workflow end time from persisted run root or node snapshots for run listings. */
363
230
  var RunFinishedAtFactory = class {
364
231
  static resolveIso(state) {
365
232
  if (state.finishedAt && state.status !== "running" && state.status !== "pending") return state.finishedAt;
@@ -378,31 +245,5 @@ function nodeRef(nodeId) {
378
245
  const branchRef = (index) => `$${index}`;
379
246
 
380
247
  //#endregion
381
- //#region src/di/CoreTokens.ts
382
- const CoreTokens = {
383
- PersistedWorkflowTokenRegistry: Symbol.for("codemation.core.PersistedWorkflowTokenRegistry"),
384
- CredentialSessionService: Symbol.for("codemation.core.CredentialSessionService"),
385
- CredentialTypeRegistry: Symbol.for("codemation.core.CredentialTypeRegistry"),
386
- WorkflowRunnerService: Symbol.for("codemation.core.WorkflowRunnerService"),
387
- LiveWorkflowRepository: Symbol.for("codemation.core.LiveWorkflowRepository"),
388
- WorkflowRepository: Symbol.for("codemation.core.WorkflowRepository"),
389
- NodeResolver: Symbol.for("codemation.core.NodeResolver"),
390
- WorkflowNodeInstanceFactory: Symbol.for("codemation.core.WorkflowNodeInstanceFactory"),
391
- RunIdFactory: Symbol.for("codemation.core.RunIdFactory"),
392
- ActivationIdFactory: Symbol.for("codemation.core.ActivationIdFactory"),
393
- WorkflowExecutionRepository: Symbol.for("codemation.core.WorkflowExecutionRepository"),
394
- TriggerSetupStateRepository: Symbol.for("codemation.core.TriggerSetupStateRepository"),
395
- NodeActivationScheduler: Symbol.for("codemation.core.NodeActivationScheduler"),
396
- RunDataFactory: Symbol.for("codemation.core.RunDataFactory"),
397
- ExecutionContextFactory: Symbol.for("codemation.core.ExecutionContextFactory"),
398
- RunEventBus: Symbol.for("codemation.core.RunEventBus"),
399
- BinaryStorage: Symbol.for("codemation.core.BinaryStorage"),
400
- WebhookBasePath: Symbol.for("codemation.core.WebhookBasePath"),
401
- EngineExecutionLimitsPolicy: Symbol.for("codemation.core.EngineExecutionLimitsPolicy"),
402
- WorkflowActivationPolicy: Symbol.for("codemation.core.WorkflowActivationPolicy"),
403
- AgentMcpIntegration: Symbol.for("codemation.core.AgentMcpIntegration")
404
- };
405
-
406
- //#endregion
407
- 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 };
408
- //# sourceMappingURL=di-CEV6wTc4.js.map
248
+ export { SuspensionRequest as a, AgentConnectionNodeCollector as c, BINARY_DEFAULT_MAX_BYTES as i, NodeBackedToolConfig as l, nodeRef as n, CredentialUnboundError as o, RunFinishedAtFactory as r, NodeIterationIdFactory as s, branchRef as t, ConnectionNodeIdFactory as u };
249
+ //# sourceMappingURL=workflowTypes-DZtBTmKf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowTypes-DZtBTmKf.js","names":["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/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"],"sourcesContent":["import type { NodeId } from \"../../types\";\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 static isConnectionOwnedDescendantOf(parentNodeId: NodeId, nodeId: NodeId): boolean {\n return nodeId.startsWith(`${parentNodeId}${this.connectionSegment}`);\n }\n\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 { 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 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\nexport class NodeIterationIdFactory {\n static create(): string {\n return `iter_${globalThis.crypto.randomUUID()}`;\n }\n\n static createForTest(seed: string, sequence: number): string {\n return `iter_${seed}_${sequence}`;\n }\n\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 visibility?: \"default\" | \"advanced\";\n placeholder?: string;\n helpText?: string;\n envVarName?: string;\n copyValue?: string;\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 providerId: string;\n authorizeUrl: string;\n tokenUrl: string;\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 title?: string;\n description?: string;\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 advancedSection?: CredentialAdvancedSectionPresentation;\n supportedSourceKinds?: ReadonlyArray<CredentialMaterialSourceKind>;\n auth?: CredentialAuthDefinition;\n}>;\n\nexport type CredentialJsonRecord = Readonly<Record<string, unknown>>;\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 material: Readonly<{ source: \"local\" | \"control-plane\"; ref: string }>;\n}>;\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 CredentialAccessTokenSessionArgs<TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord> =\n Readonly<{\n accessToken: string;\n grantedScopes: ReadonlyArray<string>;\n publicConfig: TPublicConfig;\n }>;\n\nexport type CredentialAccessTokenSessionFactory<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TSession = unknown,\n> = (args: CredentialAccessTokenSessionArgs<TPublicConfig>) => Promise<TSession>;\n\nexport type CredentialHealthTester<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n> = (args: CredentialSessionFactoryArgs<TPublicConfig, TMaterial>) => Promise<CredentialHealth>;\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 createSessionFromAccessToken?: CredentialAccessTokenSessionFactory<TPublicConfig, TSession>;\n test: CredentialHealthTester<TPublicConfig, TMaterial>;\n}>;\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\nexport type HumanTaskId = string;\n\nexport type Duration = string;\n\nexport interface HumanTaskHandle {\n readonly taskId: HumanTaskId;\n readonly runId: string;\n readonly nodeId: string;\n readonly expiresAt: Date;\n readonly resumeUrl: string;\n readonly metadata?: Readonly<Record<string, import(\"./workflowTypes\").JsonValue>>;\n}\n\nexport interface HumanTaskSubject {\n readonly title: string;\n readonly summary: string;\n readonly attributes?: import(\"./workflowTypes\").JsonValue;\n}\n\nexport interface HumanTaskActor {\n readonly actorId: string;\n readonly displayName?: string;\n}\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\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 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 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 deleteMany(storageKeys: ReadonlyArray<string>): Promise<void>;\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\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 getBytes(attachment: BinaryAttachment, maxBytes?: number): Promise<Uint8Array>;\n getText(attachment: BinaryAttachment, maxBytes?: number): Promise<string>;\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 subworkflowDepth: number;\n engineMaxNodeActivations: number;\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 iterationId?: NodeIterationId;\n itemIndex?: number;\n parentInvocationId?: ConnectionInvocationId;\n testContext?: RunTestContext;\n readonly collections?: CollectionsContext;\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 resumeContext?: ResumeContext;\n}\n\nexport interface TriggerPollingPort {\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}\n\nexport interface PollingTriggerHandle extends TriggerPollingPort {\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 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\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\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 readonly outputPorts?: ReadonlyArray<OutputPortKey>;\n readonly inputSchema?: ZodType<TInputJson>;\n execute(args: RunnableNodeExecuteArgs<TConfig, TInputJson>): Promise<unknown> | unknown;\n}\n\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 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\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 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 workflowPolicyRuntimeDefaults?: WorkflowPolicyRuntimeDefaults;\n triggerRuntimeDiagnostics?: TriggerRuntimeDiagnostics;\n pollingTriggerLogger?: import(\"../triggers/polling/PollingTriggerLogger\").PollingTriggerLogger;\n}\n","import type { PersistedRunState } from \"./runTypes\";\n\ntype RunFinishedAtSource = Pick<PersistedRunState, \"status\" | \"nodeSnapshotsByNodeId\" | \"finishedAt\">;\n\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>;\nexport type JsonNonArray = JsonPrimitive | JsonObject;\n\nexport interface Edge {\n from: { nodeId: NodeId; output: OutputPortKey };\n to: { nodeId: NodeId; input: InputPortKey };\n}\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 readonly connections?: ReadonlyArray<WorkflowNodeConnection>;\n discoveryPathSegments?: readonly string[];\n readonly prunePolicy?: WorkflowPrunePolicySpec;\n readonly storagePolicy?: WorkflowStoragePolicySpec;\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 description?: string;\n readonly execution?: Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }>;\n readonly retryPolicy?: RetryPolicySpec;\n readonly nodeErrorHandler?: NodeErrorHandlerSpec;\n readonly continueWhenEmptyOutput?: boolean;\n readonly declaredOutputPorts?: ReadonlyArray<OutputPortKey>;\n readonly declaredInputPorts?: ReadonlyArray<InputPortKey>;\n getCredentialRequirements?(): ReadonlyArray<CredentialRequirement>;\n readonly emitsAssertions?: true;\n inspectorSummary?(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;\n}\n\nexport interface PollingTriggerConfig {\n getTriggerPollConfig(): Readonly<{ config: JsonObject; pollIntervalMs?: number }>;\n}\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\nexport interface RunnableNodeConfig<TInputJson = unknown, TOutputJson = unknown> extends NodeConfigBase {\n readonly kind: \"node\";\n readonly [runnableNodeInputType]?: TInputJson;\n readonly [runnableNodeOutputType]?: TOutputJson;\n readonly inputSchema?: ZodType<TInputJson>;\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 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;\nexport type NodeIterationId = string;\n\nexport interface ParentExecutionRef {\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n subworkflowDepth?: number;\n engineMaxNodeActivations?: number;\n engineMaxSubworkflowDepth?: number;\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\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\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"],"mappings":";;;AAEA,IAAa,0BAAb,MAAqC;CACnC,OAAgB,oBAAoB;CAEpC,OAAO,8BAA8B,cAA8B;AACjE,SAAO,GAAG,eAAe,KAAK,kBAAkB;;CAGlD,OAAO,qBAAqB,cAAsB,UAA0B;EAC1E,MAAM,aAAa,KAAK,kBAAkB,SAAS;AACnD,SAAO,GAAG,eAAe,KAAK,kBAAkB,MAAM,KAAK,oBAAoB;;CAGjF,OAAO,oBAAoB,cAAsB,UAA0B;AACzE,SAAO,GAAG,eAAe,KAAK,kBAAkB,KAAK,KAAK,oBAAoB;;CAGhF,OAAO,sBAAsB,QAAyB;AACpD,SAAO,OAAO,SAAS,GAAG,KAAK,kBAAkB,KAAK,KAAK,oBAAoB;;CAGjF,OAAO,yBAAyB,QAAkF;AAChH,MAAI,CAAC,KAAK,sBAAsB,OAAO,CACrC;EAEF,MAAM,SAAS,GAAG,KAAK,kBAAkB,KAAK,KAAK;EACnD,MAAM,MAAM,OAAO,YAAY,OAAO;AACtC,MAAI,MAAM,EACR;EAEF,MAAM,eAAe,OAAO,MAAM,GAAG,IAAI;EACzC,MAAM,WAAW,OAAO,MAAM,MAAM,OAAO,OAAO;AAClD,MAAI,CAAC,gBAAgB,CAAC,SACpB;AAEF,SAAO;GAAE;GAAc;GAAU;;CAGnC,OAAO,gCAAgC,QAAyB;AAC9D,SAAO,OAAO,SAAS,GAAG,KAAK,kBAAkB,KAAK;;CAGxD,OAAO,uBAAuB,QAAyB;AACrD,SAAO,OAAO,SAAS,GAAG,KAAK,kBAAkB,MAAM,KAAK,oBAAoB;;CAGlF,OAAO,mCAAmC,QAAgE;AACxG,MAAI,CAAC,KAAK,gCAAgC,OAAO,CAC/C;EAEF,MAAM,SAAS,GAAG,KAAK,kBAAkB;EACzC,MAAM,eAAe,OAAO,MAAM,GAAG,CAAC,OAAO,OAAO;AACpD,SAAO,eAAe,EAAE,cAAc,GAAG;;CAG3C,OAAO,0BACL,QAC4E;AAC5E,MAAI,CAAC,KAAK,uBAAuB,OAAO,CACtC;EAEF,MAAM,SAAS,GAAG,KAAK,kBAAkB,MAAM,KAAK;EACpD,MAAM,MAAM,OAAO,YAAY,OAAO;AACtC,MAAI,MAAM,EACR;EAEF,MAAM,eAAe,OAAO,MAAM,GAAG,IAAI;EACzC,MAAM,qBAAqB,OAAO,MAAM,MAAM,OAAO,OAAO;AAC5D,MAAI,CAAC,gBAAgB,CAAC,mBACpB;AAEF,SAAO;GAAE;GAAc;GAAoB;;CAG7C,OAAO,8BAA8B,cAAsB,QAAyB;AAClF,SAAO,OAAO,WAAW,GAAG,eAAe,KAAK,oBAAoB;;CAGtE,OAAO,kBAAkB,UAA0B;AACjD,SACE,SACG,MAAM,CACN,aAAa,CACb,QAAQ,eAAe,IAAI,CAC3B,QAAQ,YAAY,GAAG,IAAI;;;;;;ACtEpC,IAAa,uBAAb,MAIwB;CACtB,AAAS;CACT,AAAS,WAAW;CACpB,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAMjB,YACE,AAAgBA,MAChB,AAAgBC,MAChB,SACA;EAHgB;EACA;AAGhB,OAAK,OAAO,KAAK;AACjB,OAAK,cAAc,QAAQ;AAC3B,OAAK,eAAe,QAAQ;AAC5B,OAAK,aAAa,QAAQ;AAC1B,OAAK,mBAAmB,QAAQ;AAChC,OAAK,oBAAoB,QAAQ;AACjC,OAAK,gBAAgB,QAAQ;AAC7B,OAAK,iBAAiB,QAAQ;;CAGhC,4BAAkE;AAChE,SAAO,KAAK,KAAK,6BAA6B,IAAI,EAAE;;CAGtD,iBAA+B;AAC7B,SAAO,KAAK;;CAGd,kBAAiC;AAC/B,SAAO,KAAK;;CAGd,WACE,MAC0C;EAC1C,MAAM,SAAS,KAAK,gBAAgB,KAAK,IAAK,KAAK;AACnD,MAAI,KAAK,OAAO,OAAO,CACrB,QAAO;AAET,SAAO,EAAE,MAAM,QAAQ;;CAGzB,aAAa,MAAqG;EAChH,MAAM,MAAM,KAAK,iBAAiB,KAAK,IAAI,KAAK,sBAAsB,KAAK,QAAQ;AACnF,SAAO,KAAK,kBAAkB,MAAM,IAAI;;CAG1C,AAAQ,sBAAsB,SAA+B;EAC3D,MAAM,gBAAgB,QAAQ,OAAO;AACrC,MAAI,CAAC,cACH,OAAM,IAAI,MAAM,qBAAqB,KAAK,KAAK,uCAAuC;AAExF,SAAO,cAAc;;CAGvB,AAAQ,OAAO,OAA+B;AAC5C,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU;;;;;;AClDpE,MAAaC,+BAAgE,IAAK,MAAM;CACtF,QACE,cACA,aACA,mBAC8C;EAC9C,MAAMC,YAA6C,EAAE;AACrD,OAAK,YAAY,cAAc,aAAa,WAAW,kBAAkB;AACzE,SAAO;;CAGT,AAAQ,YACN,cACA,aACA,WACA,mBACM;AACN,YAAU,KAAK;GACb,QAAQ,wBAAwB,8BAA8B,aAAa;GAC3E;GACA,gBAAgB;GAChB,MAAM;GACN,MAAM,YAAY,UAAU,cAAc,SAAS,YAAY,UAAU;GACzE,UAAU,YAAY,UAAU;GAChC,MAAM,YAAY,UAAU,cAAc;GAC1C,kBAAkB,YAAY;GAC/B,CAAC;AAEF,OAAK,MAAM,QAAQ,YAAY,SAAS,EAAE,EAAE;GAC1C,MAAM,aAAa,wBAAwB,qBAAqB,cAAc,KAAK,KAAK;GACxF,MAAM,gBAAgB,KAAK,sBAAsB,KAAK;AACtD,aAAU,KAAK;IACb,QAAQ;IACR;IACA,gBAAgB;IAChB,MAAM,gBAAgB,gBAAgB;IACtC,MAAM,KAAK,cAAc,SAAS,KAAK;IACvC,UAAU,KAAK;IACf,MAAM,KAAK,cAAc;IACzB,kBAAkB;IACnB,CAAC;AACF,QAAK,wBAAwB,YAAY,MAAM,WAAW,kBAAkB;;AAG9E,MAAI,mBAAmB;GACrB,MAAM,aAAc,YAAkE;AACtF,QAAK,MAAM,YAAY,cAAc,EAAE,EAAE;IACvC,MAAM,OAAO,kBAAkB,SAAS;AACxC,QAAI,CAAC,KACH;IAEF,MAAM,gBAAgB,KAAK,2BAA2B,EAAE;AACxD,cAAU,KAAK;KACb,QAAQ,wBAAwB,oBAAoB,cAAc,SAAS;KAC3E;KACA,gBAAgB;KAChB,MAAM;KACN,MAAM,KAAK;KACX,UAAU;KACV,MAAM;KACN,kBAAkB,EAChB,iCAAiC,CAC/B;MACE,SAAS;MACT,OAAO,KAAK;MACZ;MACD,CACF,EACF;KACF,CAAC;;;;CAKR,AAAQ,wBACN,YACA,MACA,WACA,mBACM;AACN,MAAI,CAAC,KAAK,sBAAsB,KAAK,CACnC;EAEF,MAAM,aACJ,gBAAgB,uBAAuB,KAAK,OAAQ,KAAwD;AAC9G,OAAK,YAAY,YAAY,YAAY,WAAW,kBAAkB;;CAGxE,AAAQ,sBAAsB,MAA2B;AACvD,MAAI,gBAAgB,qBAClB,QAAO,qBAAqB,kBAAkB,KAAK,KAAK;AAE1D,MAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,QAAO;EAET,MAAM,IAAI;AACV,MAAI,EAAE,aAAa,aACjB,QAAO;AAET,SAAO,qBAAqB,kBAAkB,EAAE,KAAuB;;GAEvE;;;;ACtIJ,IAAa,yBAAb,MAAoC;CAClC,OAAO,SAAiB;AACtB,SAAO,QAAQ,WAAW,OAAO,YAAY;;CAG/C,OAAO,cAAc,MAAc,UAA0B;AAC3D,SAAO,QAAQ,KAAK,GAAG;;CAGzB,OAAO,oBAAoB,kBAA0B,UAA0B;AAC7E,SAAO,QAAQ,iBAAiB,GAAG;;;;;;ACkLvC,IAAa,yBAAb,MAAa,+BAA+B,MAAM;CAChD,YACE,AAAgBC,YAChB,AAAgBC,gBAAiD,EAAE,EACnE;AACA,QAAM,uBAAuB,cAAc,YAAY,cAAc,CAAC;EAHtD;EACA;AAGhB,OAAK,OAAO;;CAGd,OAAe,cACb,YACA,eACQ;EACR,MAAM,sBACJ,cAAc,SAAS,IAAI,+BAA+B,cAAc,KAAK,KAAK,CAAC,KAAK;AAC1F,SAAO,oBAAoB,WAAW,QAAQ,8BAA8B,WAAW,WAAW,QAAQ,WAAW,OAAO,GAAG;;;;;;ACvJnI,IAAa,oBAAb,cAGU,MAAM;CACd,YACE,AAASC,SAQT;AACA,QAAM,qBAAqB,QAAQ,SAAS,SAAS,WAAW,GAAG;EAT1D;AAUT,OAAK,OAAO;;;AA6HhB,MAAa,2BAA2B,KAAK,OAAO;;;;AC9LpD,IAAa,uBAAb,MAAkC;CAChC,OAAO,WAAW,OAAgD;AAChE,MAAI,MAAM,cAAc,MAAM,WAAW,aAAa,MAAM,WAAW,UACrE,QAAO,MAAM;AAEf,MAAI,MAAM,WAAW,aAAa,MAAM,WAAW,UACjD;EAEF,IAAIC;AACJ,OAAK,MAAM,QAAQ,OAAO,OAAO,MAAM,sBAAsB,CAC3D,KAAI,MAAM,eAAe,CAAC,OAAO,KAAK,aAAa,KACjD,OAAM,KAAK;AAGf,SAAO;;;;;;ACqHX,SAAgB,QAAe,QAAkC;AAC/D,QAAO;;AA8ET,MAAa,aAAa,UAAkB,IAAI"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemation/core",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -121,10 +121,6 @@ export const AgentConnectionNodeCollector: AgentConnectionNodeCollectorApi = new
121
121
  this.collectInto(toolNodeId, innerAgent, collected, mcpServerResolver);
122
122
  }
123
123
 
124
- /**
125
- * After JSON round-trip (persisted snapshots), tools are plain objects — `instanceof NodeBackedToolConfig` fails.
126
- * Detect node-backed tools structurally via {@link NodeBackedToolConfig#toolKind}.
127
- */
128
124
  private isNodeBackedAgentTool(tool: ToolConfig): boolean {
129
125
  if (tool instanceof NodeBackedToolConfig) {
130
126
  return AgentConfigInspector.isAgentNodeConfig(tool.node);
@@ -10,10 +10,6 @@ import type {
10
10
  } from "./AiHost";
11
11
 
12
12
  export class AgentMessageConfigNormalizer {
13
- /**
14
- * Prefer {@code input.messages} when present (ItemNode / engine-mapped payloads); otherwise resolve from
15
- * {@link AgentNodeConfig.messages} templates.
16
- */
17
13
  static resolveFromInputOrConfig<TInputJson, TOutputJson>(
18
14
  input: unknown,
19
15
  config: AgentNodeConfig<TInputJson, TOutputJson>,
package/src/ai/AiHost.ts CHANGED
@@ -37,11 +37,6 @@ export type ToolExecuteArgs<TConfig extends ToolConfig = ToolConfig, TInput = un
37
37
  item: Item;
38
38
  itemIndex: number;
39
39
  items: Items;
40
- /**
41
- * Optional sub-agent boundary hooks: when present, the live `agent.tool.call` span and the
42
- * planned tool-call invocationId are forwarded so node-backed runtimes can re-root their child
43
- * execution scope. Plain function tools may safely ignore these hooks.
44
- */
45
40
  hooks?: Readonly<{
46
41
  parentSpan?: import("../contracts/telemetryTypes").TelemetrySpanScope;
47
42
  parentInvocationId?: import("../contracts/runTypes").ConnectionInvocationId;
@@ -93,13 +88,8 @@ export interface AgentMessageTemplate<TInputJson = unknown> {
93
88
  readonly content: AgentMessageTemplateContent<TInputJson>;
94
89
  }
95
90
 
96
- /** A single prompt line: fixed DTO or template with optional function `content`. */
97
91
  export type AgentMessageLine<TInputJson = unknown> = AgentMessageDto | AgentMessageTemplate<TInputJson>;
98
92
 
99
- /**
100
- * Message list for an agent. Prefer a **plain array** of `{ role, content }` (optionally with function `content` for templates).
101
- * Use the object form only when you need `buildMessages` to append messages after optional `prompt` lines.
102
- */
103
93
  export type AgentMessageConfig<TInputJson = unknown> =
104
94
  | Expr<ReadonlyArray<AgentMessageLine<TInputJson>>, TInputJson>
105
95
  | ReadonlyArray<AgentMessageLine<TInputJson>>
@@ -121,7 +111,6 @@ export interface AgentGuardrailConfig {
121
111
  readonly modelInvocationOptions?: AgentModelInvocationOptions;
122
112
  }
123
113
 
124
- /** Defaults aligned with common tool-agent iteration limits (many products use ~10 max rounds). */
125
114
  export const AgentGuardrailDefaults = {
126
115
  maxTurns: 10,
127
116
  onTurnLimitReached: "error" as AgentTurnLimitBehavior,
@@ -151,25 +140,10 @@ export interface ChatModelConfig {
151
140
  getCredentialRequirements?(): ReadonlyArray<CredentialRequirement>;
152
141
  }
153
142
 
154
- /**
155
- * Provider-neutral chat language model wrapper returned by a {@link ChatModelFactory}.
156
- *
157
- * Thin adapter around an AI SDK `LanguageModelV2` (from `@ai-sdk/provider`) plus the call-site
158
- * defaults Codemation needs at every generate/stream: the provider label, the model name used for
159
- * pricing / telemetry, and the default invocation options (max output tokens, temperature,
160
- * provider-specific overrides).
161
- *
162
- * The consumer (AIAgentNode / AgentStructuredOutputRunner) passes `languageModel` directly into
163
- * `generateText({ model, ... })` from the `ai` package.
164
- */
165
143
  export interface ChatLanguageModel {
166
- /** AI SDK `LanguageModelV2` instance (kept `unknown` to avoid leaking the SDK type into `@codemation/core`). */
167
144
  readonly languageModel: unknown;
168
- /** Stable pricing/telemetry key — e.g. `"gpt-4.1-nano"`. */
169
145
  readonly modelName: string;
170
- /** Provider label — e.g. `"openai"`. Used for cost tracking. */
171
146
  readonly provider?: string;
172
- /** Defaults merged into every call. Consumers may override per-invocation. */
173
147
  readonly defaultCallOptions?: ChatLanguageModelCallOptions;
174
148
  }
175
149
 
@@ -179,14 +153,8 @@ export interface ChatLanguageModelCallOptions {
179
153
  readonly providerOptions?: Readonly<Record<string, Readonly<Record<string, JsonValue>>>>;
180
154
  }
181
155
 
182
- /**
183
- * Options for a structured-output generate call. Mirrors
184
- * `generateText({ output: Output.object(...) })` from the `ai` package.
185
- */
186
156
  export interface StructuredOutputOptions {
187
- /** Optional schema name — used by some providers as the JSON schema name attribute. */
188
157
  readonly schemaName?: string;
189
- /** When `true`, the consumer should pass a strict-mode-compatible JSON Schema record. */
190
158
  readonly strict?: boolean;
191
159
  }
192
160
 
@@ -242,12 +210,6 @@ export type NodeBackedToolConfigOptions<
242
210
  outputSchema: TOutputSchema;
243
211
  mapInput?: NodeBackedToolInputMapper<TNodeConfig, ZodInput<TInputSchema>>;
244
212
  mapOutput?: NodeBackedToolOutputMapper<TNodeConfig, ZodInput<TInputSchema>, ZodOutput<TOutputSchema>>;
245
- /**
246
- * Marks THIS tool binding as human-in-the-loop and sets the behavior when a human rejects the
247
- * approval: `"return"` feeds the rejection back to the agent as a tool result, `"halt"` stops the
248
- * run. Set per binding, so two tools backed by the same node can reject differently. When set, it
249
- * takes precedence over any `humanApprovalToolBehavior` marker carried by the backing node.
250
- */
251
213
  onRejected?: "halt" | "return";
252
214
  }>;
253
215
 
@@ -18,16 +18,10 @@ export type CallableToolConfigOptions<
18
18
  presentation?: AgentCanvasPresentation;
19
19
  inputSchema: TInputSchema;
20
20
  outputSchema: TOutputSchema;
21
- /**
22
- * Optional credential slots for this tool (same contract as other {@link ToolConfig} shapes).
23
- */
24
21
  credentialRequirements?: ReadonlyArray<CredentialRequirement>;
25
22
  execute: CallableToolExecuteHandler<TInputSchema, TOutputSchema>;
26
23
  }>;
27
24
 
28
- /**
29
- * Inline callable agent tool: DSL sugar over {@link ToolConfig} without a separate {@link NodeResolver}-registered {@link Tool} class.
30
- */
31
25
  export class CallableToolConfig<
32
26
  TInputSchema extends ZodSchemaAny,
33
27
  TOutputSchema extends ZodSchemaAny,
@@ -65,9 +59,6 @@ export class CallableToolConfig<
65
59
  return this.outputSchemaValue;
66
60
  }
67
61
 
68
- /**
69
- * Parses tool input and output with the configured Zod schemas.
70
- */
71
62
  async executeTool(
72
63
  args: ToolExecuteArgs<CallableToolConfig<TInputSchema, TOutputSchema>, ZodInput<TInputSchema>>,
73
64
  ): Promise<ZodOutput<TOutputSchema>> {
@@ -1,5 +1 @@
1
- /**
2
- * Shared {@link import("../di").TypeToken} marker for {@link CallableToolConfig}.
3
- * Callable tools are not registered in {@link NodeResolver}; this class only satisfies {@link ToolConfig#type}.
4
- */
5
1
  export class CallableToolKindToken {}
@@ -2,9 +2,6 @@ import type { ZodSchemaAny } from "../ai/AiHost";
2
2
  import type { CallableToolConfig, CallableToolConfigOptions } from "../ai/CallableToolConfig";
3
3
  import { CallableToolFactory } from "../ai/CallableToolFactory";
4
4
 
5
- /**
6
- * Workflow-facing helper for inline Zod-typed agent tools (same as {@link CallableToolFactory.callableTool}).
7
- */
8
5
  export function callableTool<TInputSchema extends ZodSchemaAny, TOutputSchema extends ZodSchemaAny>(
9
6
  options: CallableToolConfigOptions<TInputSchema, TOutputSchema>,
10
7
  ): CallableToolConfig<TInputSchema, TOutputSchema> {
@@ -80,9 +80,6 @@ export interface DefinedCollection<TDefinition extends CollectionDefinition = Co
80
80
  register(context: { registerCollection(d: CollectionDefinition): void }): void;
81
81
  }
82
82
 
83
- /**
84
- * Validates that a name follows the required pattern: lowercase + underscores, starts with letter.
85
- */
86
83
  function validateCollectionName(name: string): void {
87
84
  const pattern = /^[a-z][a-z0-9_]*$/;
88
85
  if (!pattern.test(name)) {
@@ -92,9 +89,6 @@ function validateCollectionName(name: string): void {
92
89
  }
93
90
  }
94
91
 
95
- /**
96
- * Validates that all field names follow the required pattern.
97
- */
98
92
  function validateFieldNames(fields: Record<string, CollectionFieldDefinition>): void {
99
93
  const pattern = /^[a-z][a-z0-9_]*$/;
100
94
  const reserved = ["id", "created_at", "updated_at"];
@@ -111,9 +105,6 @@ function validateFieldNames(fields: Record<string, CollectionFieldDefinition>):
111
105
  }
112
106
  }
113
107
 
114
- /**
115
- * Validates that all indexed fields exist in the declared fields.
116
- */
117
108
  function validateIndexes(indexes: ReadonlyArray<CollectionIndexDefinition>, fieldNames: Set<string>): void {
118
109
  for (const index of indexes) {
119
110
  for (const fieldName of index.on) {
@@ -139,7 +130,6 @@ export function defineCollection<TName extends string>(
139
130
  > {
140
131
  validateCollectionName(options.name);
141
132
 
142
- // Convert the column builders to field definitions
143
133
  const fields: Record<string, CollectionFieldDefinition> = {};
144
134
  for (const [fieldName, builder] of Object.entries(options.fields)) {
145
135
  const columnBuilder = builder as CollectionColumnBuilder;
@@ -162,7 +152,6 @@ export function defineCollection<TName extends string>(
162
152
  indexes,
163
153
  };
164
154
 
165
- // Register immediately (mirror defineNode behavior)
166
155
  DefinedCollectionRegistry.register(definition);
167
156
 
168
157
  const result: DefinedCollection = {