@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.
- package/CHANGELOG.md +68 -0
- package/dist/{CostCatalogContract-B9aYIqJu.d.cts → CostCatalogContract-Dwo-ZamG.d.cts} +2 -2
- package/dist/EngineRuntimeRegistration.types-BiNasx3G.d.cts +54 -0
- package/dist/EngineRuntimeRegistration.types-Dq4ucrdo.d.ts +21 -0
- package/dist/{InMemoryRunDataFactory-C3rIszrW.d.cts → InMemoryRunDataFactory-D2U9azmZ.d.cts} +2 -20
- package/dist/{InMemoryRunEventBusRegistry-Sa86VxuV.cjs → InMemoryRunEventBusRegistry-DO0WM9Lw.cjs} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-Sa86VxuV.cjs.map → InMemoryRunEventBusRegistry-DO0WM9Lw.cjs.map} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-Bwunvt1T.js → InMemoryRunEventBusRegistry-Layt2xgm.js} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-Bwunvt1T.js.map → InMemoryRunEventBusRegistry-Layt2xgm.js.map} +1 -1
- package/dist/{ItemsInputNormalizer-UCpn7luX.d.cts → ItemsInputNormalizer-A5txcOWX.d.cts} +3 -98
- package/dist/{ItemsInputNormalizer-B9SdLG24.cjs → ItemsInputNormalizer-C1fv3sMW.cjs} +2 -2
- package/dist/ItemsInputNormalizer-C1fv3sMW.cjs.map +1 -0
- package/dist/{ItemsInputNormalizer-DoOawd9R.d.ts → ItemsInputNormalizer-D2vrMrX1.d.ts} +2 -62
- package/dist/{ItemsInputNormalizer-CZEODg94.js → ItemsInputNormalizer-fUYo4GLV.js} +2 -2
- package/dist/ItemsInputNormalizer-fUYo4GLV.js.map +1 -0
- package/dist/{RunIntentService-0f3ICjAz.d.cts → RunIntentService-DKxuHTUz.d.cts} +2 -15
- package/dist/{RunIntentService-Dx_HHxDX.d.ts → RunIntentService-DrpKli2k.d.ts} +2 -22
- package/dist/{agentMcpTypes-B11B3Hd-.d.cts → agentMcpTypes-BHX4RQCC.d.cts} +24 -524
- package/dist/bootstrap/index.cjs +9 -5
- package/dist/bootstrap/index.d.cts +32 -106
- package/dist/bootstrap/index.d.ts +18 -17
- package/dist/bootstrap/index.js +6 -5
- package/dist/{bootstrap-Be0LB0nh.cjs → bootstrap-CTB53rEF.cjs} +9 -60
- package/dist/bootstrap-CTB53rEF.cjs.map +1 -0
- package/dist/{bootstrap-pSQdsMfa.js → bootstrap-DmqKheCI.js} +6 -57
- package/dist/bootstrap-DmqKheCI.js.map +1 -0
- package/dist/browser.cjs +12 -11
- package/dist/browser.d.cts +4 -4
- package/dist/browser.d.ts +3 -3
- package/dist/browser.js +3 -2
- package/dist/contracts-7L1wJHdk.cjs +569 -0
- package/dist/contracts-7L1wJHdk.cjs.map +1 -0
- package/dist/contracts-CjJ5CZ7N.js +447 -0
- package/dist/contracts-CjJ5CZ7N.js.map +1 -0
- package/dist/contracts.cjs +9 -2
- package/dist/contracts.d.cts +5 -5
- package/dist/contracts.d.ts +2 -2
- package/dist/contracts.js +3 -2
- package/dist/{executionPersistenceContracts-CX9Ql8N1.d.cts → deploymentManifestTypes-B8CDmZZK.d.cts} +65 -81
- package/dist/di-C6Ubf9o5.cjs +179 -0
- package/dist/di-C6Ubf9o5.cjs.map +1 -0
- package/dist/di-Cjiil7U-.js +114 -0
- package/dist/di-Cjiil7U-.js.map +1 -0
- package/dist/{index-CbJdbIHe.d.ts → index-CRv3_pY3.d.ts} +87 -870
- package/dist/{index-uPnD9EE6.d.ts → index-mnLS0iQl.d.ts} +27 -400
- package/dist/index.cjs +44 -115
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -524
- package/dist/index.d.ts +5 -5
- package/dist/index.js +21 -98
- package/dist/index.js.map +1 -1
- package/dist/{params-Dwl10Ws9.d.cts → params-CrK4iuG1.d.cts} +2 -11
- package/dist/{runtime-CSunvf7A.js → runtime-CBFDpmiz.js} +46 -679
- package/dist/runtime-CBFDpmiz.js.map +1 -0
- package/dist/{runtime-n2tqRwaf.cjs → runtime-Due-FOZ2.cjs} +69 -752
- package/dist/runtime-Due-FOZ2.cjs.map +1 -0
- package/dist/testing.cjs +8 -40
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +3 -32
- package/dist/testing.d.ts +3 -32
- package/dist/testing.js +6 -38
- package/dist/testing.js.map +1 -1
- package/dist/{di-DhwtDRgs.cjs → workflowTypes-BW6Hhee7.cjs} +4 -229
- package/dist/workflowTypes-BW6Hhee7.cjs.map +1 -0
- package/dist/{di-CEV6wTc4.js → workflowTypes-DZtBTmKf.js} +3 -162
- package/dist/workflowTypes-DZtBTmKf.js.map +1 -0
- package/package.json +1 -1
- package/src/ai/AgentConnectionNodeCollector.ts +0 -4
- package/src/ai/AgentMessageConfigNormalizerFactory.ts +0 -4
- package/src/ai/AiHost.ts +0 -38
- package/src/ai/CallableToolConfig.ts +0 -9
- package/src/ai/CallableToolKindToken.ts +0 -4
- package/src/authoring/callableTool.types.ts +0 -3
- package/src/authoring/defineCollection.types.ts +0 -11
- package/src/authoring/defineHumanApprovalNode.types.ts +0 -116
- package/src/authoring/defineNode.types.ts +0 -25
- package/src/authoring/definePollingTrigger.types.ts +18 -152
- package/src/authoring/definePollingTriggerInternals.ts +0 -4
- package/src/authoring/nodeBaseOptions.types.ts +0 -14
- package/src/binaries/boundedReadBinary.types.ts +0 -16
- package/src/bootstrap/index.ts +8 -2
- package/src/bootstrap/runtime/EngineRuntimeRegistrar.ts +0 -5
- package/src/bootstrap/runtime/EngineRuntimeRegistration.types.ts +0 -23
- package/src/browser.ts +0 -3
- package/src/contracts/AgentBindError.ts +0 -5
- package/src/contracts/Clock.ts +0 -1
- package/src/contracts/CodemationTelemetryAttributeNames.ts +0 -10
- package/src/contracts/NoOpAgentMcpIntegration.ts +0 -6
- package/src/contracts/NoOpTelemetrySpanScope.ts +0 -7
- package/src/contracts/RetryPolicy.ts +0 -2
- package/src/contracts/agentMcpTypes.ts +0 -34
- package/src/contracts/assertionTypes.ts +0 -33
- package/src/contracts/baseTypes.ts +0 -6
- package/src/contracts/collectionTypes.ts +0 -25
- package/src/contracts/credentialTypes.ts +13 -60
- package/src/contracts/deploymentManifestTypes.ts +158 -0
- package/src/contracts/dispatchTypes.ts +29 -0
- package/src/contracts/executionPersistenceContracts.ts +0 -33
- package/src/contracts/hitlSeamTypes.ts +0 -14
- package/src/contracts/humanTaskStoreTypes.ts +0 -2
- package/src/contracts/inboxChannelTypes.ts +0 -9
- package/src/contracts/index.ts +3 -0
- package/src/contracts/itemExpr.ts +0 -18
- package/src/contracts/itemMeta.ts +0 -3
- package/src/contracts/mcpTypes.ts +0 -16
- package/src/contracts/retryPolicySpec.types.ts +0 -10
- package/src/contracts/runFinishedAtFactory.ts +0 -1
- package/src/contracts/runTypes.ts +0 -74
- package/src/contracts/runtimeTypes.ts +4 -131
- package/src/contracts/telemetryTypes.ts +0 -7
- package/src/contracts/testTriggerTypes.ts +0 -43
- package/src/contracts/triggerInvokerTypes.ts +6 -0
- package/src/contracts/webhookTypes.ts +0 -8
- package/src/contracts/workflowActivationPolicy.ts +0 -5
- package/src/contracts/workflowTypes.ts +4 -86
- package/src/contracts/workspaceFileTypes.ts +0 -72
- package/src/contracts.ts +18 -10
- package/src/credentials/CredentialMaterialProvider.types.ts +0 -28
- package/src/credentials/ManagedCredentialMaterialWriteError.ts +0 -6
- package/src/credentials/ManagedMaterialFetchError.ts +0 -6
- package/src/credentials/OAuthFlowExecutor.types.ts +0 -15
- package/src/di/CoreTokens.ts +2 -6
- package/src/events/ConnectionInvocationEventPublisher.ts +0 -7
- package/src/events/NodeEventPublisher.ts +0 -1
- package/src/events/runEvents.ts +0 -8
- package/src/execution/ActivationEnqueueService.ts +0 -10
- package/src/execution/ChildExecutionScopeFactory.ts +0 -13
- package/src/execution/FanInMergeByOriginMerger.ts +0 -11
- package/src/execution/InProcessRetryRunner.ts +0 -1
- package/src/execution/ItemExprResolver.ts +0 -3
- package/src/execution/NodeActivationRequestComposer.ts +0 -3
- package/src/execution/NodeActivationRequestInputPreparer.ts +0 -5
- package/src/execution/NodeExecutionSnapshotFactory.ts +0 -1
- package/src/execution/NodeExecutor.ts +1 -17
- package/src/execution/NodeSuspensionHandler.ts +1 -39
- package/src/execution/PersistedRunStateTerminalBuilder.ts +0 -5
- package/src/execution/RunSuspendedError.ts +0 -10
- package/src/execution/WorkflowRunExecutionContextFactory.ts +0 -3
- package/src/orchestration/AbortControllerFactory.ts +0 -4
- package/src/orchestration/Engine.ts +0 -9
- package/src/orchestration/NodeExecutionRequestHandlerService.ts +3 -4
- package/src/orchestration/RunContinuationService.ts +7 -39
- package/src/orchestration/RunStartService.ts +0 -7
- package/src/orchestration/TestSuiteOrchestrator.ts +0 -18
- package/src/orchestration/TestSuiteRunIdFactory.ts +0 -4
- package/src/orchestration/TriggerRuntimeService.ts +3 -2
- package/src/planning/CurrentStateFrontierPlanner.ts +0 -1
- package/src/planning/RunQueuePlanner.ts +0 -6
- package/src/policies/executionLimits/EngineExecutionLimitsPolicy.ts +0 -8
- package/src/policies/executionLimits/EngineExecutionLimitsPolicyFactory.ts +0 -3
- package/src/runStorage/RunSummaryMapper.ts +0 -1
- package/src/runtime/EngineFactory.ts +6 -11
- package/src/runtime/RunIntentService.ts +0 -4
- package/src/runtime/WorkflowRepositoryWebhookTriggerMatcher.ts +0 -4
- package/src/runtime-types/InjectableRuntimeDecoratorComposerRegistry.ts +0 -4
- package/src/runtime-types/PersistedRuntimeTypeMetadataStoreRegistry.ts +0 -4
- package/src/runtime-types/PersistedRuntimeTypeNameResolver.ts +0 -1
- package/src/runtime-types/persistedRuntimeTypeModelRegistry.ts +0 -4
- package/src/runtime-types/runtimeTypeDecorators.types.ts +0 -12
- package/src/scheduler/ConfigDrivenOffloadPolicy.ts +0 -1
- package/src/scheduler/DefaultDrivingScheduler.ts +0 -6
- package/src/scheduler/InlineDrivingScheduler.ts +0 -13
- package/src/serialization/ItemsInputNormalizer.ts +0 -5
- package/src/testing/CapturingScheduler.ts +0 -3
- package/src/testing/EngineTestKitRunIdFactory.ts +0 -3
- package/src/testing/ItemHarnessNode.ts +0 -3
- package/src/testing/ItemHarnessNodeConfig.ts +0 -4
- package/src/testing/PrefixedSequentialIdGenerator.ts +0 -3
- package/src/testing/RegistrarEngineTestKit.types.ts +0 -2
- package/src/testing/RejectingCredentialSessionService.ts +0 -4
- package/src/testing/SubWorkflowRunnerTestNode.ts +0 -3
- package/src/testing/WorkflowTestHarnessManualTrigger.ts +0 -3
- package/src/testing/WorkflowTestKitBuilder.ts +0 -4
- package/src/testing/WorkflowTestKitRunNodeWorkflowFactory.ts +0 -3
- package/src/testing.ts +0 -3
- package/src/triggers/polling/PollingTriggerDedupWindow.ts +0 -4
- package/src/triggers/polling/PollingTriggerLogger.ts +0 -5
- package/src/triggers/polling/PollingTriggerRuntime.ts +0 -5
- package/src/types/index.ts +0 -6
- package/src/validation/WorkflowEdgePortValidator.ts +0 -5
- package/src/workflow/definition/ConnectionInvocationIdFactory.ts +0 -7
- package/src/workflow/definition/ConnectionNodeIdFactory.ts +0 -6
- package/src/workflow/definition/NodeIterationIdFactory.ts +0 -13
- package/src/workflow/definition/WorkflowExecutableNodeClassifier.ts +0 -6
- package/src/workflow/dsl/ChainCursorResolver.ts +0 -20
- package/src/workflow/dsl/NodeIdSlugifier.ts +0 -9
- package/src/workflow/dsl/WhenBuilder.ts +0 -17
- package/src/workflow/dsl/WorkflowDefinitionError.ts +0 -9
- package/src/workflow/dsl/workflowBuilderTypes.ts +0 -24
- package/src/workflowSnapshots/MissingRuntimeParityGuard.ts +24 -0
- package/src/workflowSnapshots/PersistedWorkflowTokenRegistry.ts +0 -6
- package/src/workflowSnapshots/WorkflowParityMismatchError.ts +18 -0
- package/src/workflowSnapshots/WorkflowSnapshotCodec.ts +0 -5
- package/src/workflowSnapshots/index.ts +3 -0
- package/dist/EngineRuntimeRegistration.types-BYAmGMdS.d.cts +0 -81
- package/dist/EngineRuntimeRegistration.types-CVLI8DsJ.d.ts +0 -44
- package/dist/ItemsInputNormalizer-B9SdLG24.cjs.map +0 -1
- package/dist/ItemsInputNormalizer-CZEODg94.js.map +0 -1
- package/dist/bootstrap-Be0LB0nh.cjs.map +0 -1
- package/dist/bootstrap-pSQdsMfa.js.map +0 -1
- package/dist/contracts-CK0x6w_G.cjs +0 -74
- package/dist/contracts-CK0x6w_G.cjs.map +0 -1
- package/dist/contracts-DXdfTdpW.js +0 -50
- package/dist/contracts-DXdfTdpW.js.map +0 -1
- package/dist/di-CEV6wTc4.js.map +0 -1
- package/dist/di-DhwtDRgs.cjs.map +0 -1
- package/dist/runtime-CSunvf7A.js.map +0 -1
- package/dist/runtime-n2tqRwaf.cjs.map +0 -1
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import "
|
|
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
|
-
|
|
382
|
-
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -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>> {
|
|
@@ -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 = {
|