@codemation/core 0.11.0 → 0.11.1
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 +10 -0
- package/dist/CostCatalogContract-DZgcUBE4.d.cts +19 -0
- package/dist/{EngineRuntimeRegistration.types-BZ_1XWAJ.d.ts → EngineRuntimeRegistration.types-BQbS9_gs.d.ts} +2 -2
- package/dist/{EngineRuntimeRegistration.types-MPYWsEM0.d.cts → EngineRuntimeRegistration.types-Cggm5GVY.d.cts} +3 -2
- package/dist/{InMemoryRunDataFactory-hmkh0lzR.d.cts → InMemoryRunDataFactory-C7YItvHG.d.cts} +3 -18
- package/dist/{InMemoryRunEventBusRegistry-sM4z4n_i.js → InMemoryRunEventBusRegistry-Bwunvt1T.js} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-sM4z4n_i.js.map → InMemoryRunEventBusRegistry-Bwunvt1T.js.map} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-VM3OWnHo.cjs → InMemoryRunEventBusRegistry-Sa86VxuV.cjs} +1 -1
- package/dist/{InMemoryRunEventBusRegistry-VM3OWnHo.cjs.map → InMemoryRunEventBusRegistry-Sa86VxuV.cjs.map} +1 -1
- package/dist/ItemsInputNormalizer-C_dpn76M.d.cts +407 -0
- package/dist/ItemsInputNormalizer-CwdOhSAK.cjs +43 -0
- package/dist/ItemsInputNormalizer-CwdOhSAK.cjs.map +1 -0
- package/dist/ItemsInputNormalizer-D-MH8MBs.js +36 -0
- package/dist/ItemsInputNormalizer-D-MH8MBs.js.map +1 -0
- package/dist/ItemsInputNormalizer-_Mfcd3YU.d.ts +321 -0
- package/dist/RunIntentService-BVur7x9n.d.ts +285 -0
- package/dist/RunIntentService-CEF-sFfI.d.cts +206 -0
- package/dist/{RunIntentService-MUHJ1bhO.d.cts → agentMcpTypes-ZiNbNsEi.d.cts} +2 -204
- package/dist/bootstrap/index.cjs +4 -2
- package/dist/bootstrap/index.d.cts +5 -3
- package/dist/bootstrap/index.d.ts +5 -4
- package/dist/bootstrap/index.js +4 -2
- package/dist/{bootstrap-dVmpU1ju.cjs → bootstrap-BxuTFTLB.cjs} +38 -36
- package/dist/{bootstrap-dVmpU1ju.cjs.map → bootstrap-BxuTFTLB.cjs.map} +1 -1
- package/dist/{bootstrap-Dgzsjoj7.js → bootstrap-D_Yyi0wL.js} +4 -2
- package/dist/{bootstrap-Dgzsjoj7.js.map → bootstrap-D_Yyi0wL.js.map} +1 -1
- package/dist/browser.cjs +16 -0
- package/dist/browser.d.cts +4 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.js +4 -0
- package/dist/contracts-CK0x6w_G.cjs +74 -0
- package/dist/contracts-CK0x6w_G.cjs.map +1 -0
- package/dist/contracts-DXdfTdpW.js +50 -0
- package/dist/contracts-DXdfTdpW.js.map +1 -0
- package/dist/contracts.cjs +6 -0
- package/dist/contracts.d.cts +5 -0
- package/dist/contracts.d.ts +2 -0
- package/dist/contracts.js +3 -0
- package/dist/di-0Wop7z1y.js +376 -0
- package/dist/di-0Wop7z1y.js.map +1 -0
- package/dist/di-BlEKdoZS.cjs +489 -0
- package/dist/di-BlEKdoZS.cjs.map +1 -0
- package/dist/executionPersistenceContracts-BgZMRsTa.d.cts +275 -0
- package/dist/{index-Bes88mxT.d.ts → index-62Ba9f7D.d.ts} +6 -319
- package/dist/{RunIntentService-BrEq6Jm6.d.ts → index-zWGtEhrf.d.ts} +2 -283
- package/dist/index.cjs +29 -92
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -715
- package/dist/index.d.ts +4 -2
- package/dist/index.js +5 -68
- package/dist/index.js.map +1 -1
- package/dist/params-B5SENSzZ.d.cts +44 -0
- package/dist/{runtime-vH0EeZzH.cjs → runtime-DBzq5YBi.cjs} +13 -517
- package/dist/runtime-DBzq5YBi.cjs.map +1 -0
- package/dist/{runtime-Duf3ClPw.js → runtime-cxmUkk0l.js} +3 -389
- package/dist/runtime-cxmUkk0l.js.map +1 -0
- package/dist/testing.cjs +23 -21
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +3 -2
- package/dist/testing.d.ts +3 -2
- package/dist/testing.js +5 -3
- package/dist/testing.js.map +1 -1
- package/package.json +9 -5
- package/src/ai/AgentConnectionNodeCollector.ts +1 -1
- package/tsdown.config.ts +1 -1
- package/dist/runtime-Duf3ClPw.js.map +0 -1
- package/dist/runtime-vH0EeZzH.cjs.map +0 -1
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
//#region rolldown:runtime
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
10
|
+
key = keys[i];
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
12
|
+
get: ((k) => from[k]).bind(null, key),
|
|
13
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
19
|
+
value: mod,
|
|
20
|
+
enumerable: true
|
|
21
|
+
}) : target, mod));
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
require("reflect-metadata");
|
|
25
|
+
let tsyringe = require("tsyringe");
|
|
26
|
+
tsyringe = __toESM(tsyringe);
|
|
27
|
+
|
|
28
|
+
//#region src/workflow/definition/ConnectionNodeIdFactory.ts
|
|
29
|
+
/**
|
|
30
|
+
* Deterministic ids for workflow connection-owned child nodes (LLM slot, tools, etc.).
|
|
31
|
+
* These are stable across loads.
|
|
32
|
+
*/
|
|
33
|
+
var ConnectionNodeIdFactory = class {
|
|
34
|
+
static connectionSegment = "__conn__";
|
|
35
|
+
static languageModelConnectionNodeId(parentNodeId) {
|
|
36
|
+
return `${parentNodeId}${this.connectionSegment}llm`;
|
|
37
|
+
}
|
|
38
|
+
static toolConnectionNodeId(parentNodeId, toolName) {
|
|
39
|
+
const normalized = this.normalizeToolName(toolName);
|
|
40
|
+
return `${parentNodeId}${this.connectionSegment}tool${this.connectionSegment}${normalized}`;
|
|
41
|
+
}
|
|
42
|
+
static mcpConnectionNodeId(parentNodeId, serverId) {
|
|
43
|
+
return `${parentNodeId}${this.connectionSegment}mcp${this.connectionSegment}${serverId}`;
|
|
44
|
+
}
|
|
45
|
+
static isMcpConnectionNodeId(nodeId) {
|
|
46
|
+
return nodeId.includes(`${this.connectionSegment}mcp${this.connectionSegment}`);
|
|
47
|
+
}
|
|
48
|
+
static parseMcpConnectionNodeId(nodeId) {
|
|
49
|
+
if (!this.isMcpConnectionNodeId(nodeId)) return;
|
|
50
|
+
const marker = `${this.connectionSegment}mcp${this.connectionSegment}`;
|
|
51
|
+
const idx = nodeId.lastIndexOf(marker);
|
|
52
|
+
if (idx < 0) return;
|
|
53
|
+
const parentNodeId = nodeId.slice(0, idx);
|
|
54
|
+
const serverId = nodeId.slice(idx + marker.length);
|
|
55
|
+
if (!parentNodeId || !serverId) return;
|
|
56
|
+
return {
|
|
57
|
+
parentNodeId,
|
|
58
|
+
serverId
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
static isLanguageModelConnectionNodeId(nodeId) {
|
|
62
|
+
return nodeId.endsWith(`${this.connectionSegment}llm`);
|
|
63
|
+
}
|
|
64
|
+
static isToolConnectionNodeId(nodeId) {
|
|
65
|
+
return nodeId.includes(`${this.connectionSegment}tool${this.connectionSegment}`);
|
|
66
|
+
}
|
|
67
|
+
static parseLanguageModelConnectionNodeId(nodeId) {
|
|
68
|
+
if (!this.isLanguageModelConnectionNodeId(nodeId)) return;
|
|
69
|
+
const suffix = `${this.connectionSegment}llm`;
|
|
70
|
+
const parentNodeId = nodeId.slice(0, -suffix.length);
|
|
71
|
+
return parentNodeId ? { parentNodeId } : void 0;
|
|
72
|
+
}
|
|
73
|
+
static parseToolConnectionNodeId(nodeId) {
|
|
74
|
+
if (!this.isToolConnectionNodeId(nodeId)) return;
|
|
75
|
+
const marker = `${this.connectionSegment}tool${this.connectionSegment}`;
|
|
76
|
+
const idx = nodeId.lastIndexOf(marker);
|
|
77
|
+
if (idx < 0) return;
|
|
78
|
+
const parentNodeId = nodeId.slice(0, idx);
|
|
79
|
+
const normalizedToolName = nodeId.slice(idx + marker.length);
|
|
80
|
+
if (!parentNodeId || !normalizedToolName) return;
|
|
81
|
+
return {
|
|
82
|
+
parentNodeId,
|
|
83
|
+
normalizedToolName
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** True when `nodeId` is a connection-owned child of `parentNodeId` (LLM or tool slot). */
|
|
87
|
+
static isConnectionOwnedDescendantOf(parentNodeId, nodeId) {
|
|
88
|
+
return nodeId.startsWith(`${parentNodeId}${this.connectionSegment}`);
|
|
89
|
+
}
|
|
90
|
+
/** Normalizes a tool display name to a stable id segment. */
|
|
91
|
+
static normalizeToolName(toolName) {
|
|
92
|
+
return toolName.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "") || "tool";
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src/contracts/itemExpr.ts
|
|
98
|
+
const ITEM_EXPR_BRAND = Symbol.for("codemation.itemExpr");
|
|
99
|
+
function itemExpr(fn) {
|
|
100
|
+
return {
|
|
101
|
+
[ITEM_EXPR_BRAND]: true,
|
|
102
|
+
fn
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function isItemExpr(value) {
|
|
106
|
+
if (typeof value !== "object" || value === null) return false;
|
|
107
|
+
const v = value;
|
|
108
|
+
if (v[ITEM_EXPR_BRAND] === true) return true;
|
|
109
|
+
const keys = Object.keys(v);
|
|
110
|
+
if (keys.length === 1 && keys[0] === "fn" && typeof v.fn === "function") return true;
|
|
111
|
+
for (const sym of Object.getOwnPropertySymbols(v)) if (sym.description === "codemation.itemExpr" && v[sym] === true) return true;
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
function containsItemExprInUnknown(value, seen = /* @__PURE__ */ new WeakSet()) {
|
|
115
|
+
if (isItemExpr(value)) return true;
|
|
116
|
+
if (value === null || typeof value !== "object") return false;
|
|
117
|
+
if (seen.has(value)) return false;
|
|
118
|
+
seen.add(value);
|
|
119
|
+
if (Array.isArray(value)) return value.some((entry) => containsItemExprInUnknown(entry, seen));
|
|
120
|
+
for (const entry of Object.values(value)) if (containsItemExprInUnknown(entry, seen)) return true;
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Deep-resolves {@link itemExpr} leaves. Returns a new graph (does not mutate the original config object).
|
|
125
|
+
*/
|
|
126
|
+
async function resolveItemExprsInUnknown(value, args, seen = /* @__PURE__ */ new WeakSet()) {
|
|
127
|
+
if (isItemExpr(value)) return await Promise.resolve(value.fn(args));
|
|
128
|
+
if (value === null || typeof value !== "object") return value;
|
|
129
|
+
if (seen.has(value)) return value;
|
|
130
|
+
seen.add(value);
|
|
131
|
+
if (Array.isArray(value)) {
|
|
132
|
+
const out$1 = [];
|
|
133
|
+
for (let i = 0; i < value.length; i++) out$1.push(await resolveItemExprsInUnknown(value[i], args, seen));
|
|
134
|
+
return out$1;
|
|
135
|
+
}
|
|
136
|
+
const rec = value;
|
|
137
|
+
const entries = Object.entries(rec);
|
|
138
|
+
const proto = Object.getPrototypeOf(value);
|
|
139
|
+
if (proto !== Object.prototype && proto !== null && entries.length === 0) return value;
|
|
140
|
+
const out = Object.create(proto);
|
|
141
|
+
for (const [k, v] of entries) out[k] = await resolveItemExprsInUnknown(v, args, seen);
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Clones runnable config (best-effort) so per-item {@link itemExpr} resolution never mutates shared instances.
|
|
146
|
+
*/
|
|
147
|
+
async function resolveItemExprsForExecution(config, nodeCtx, item, itemIndex, items) {
|
|
148
|
+
const exprArgs = {
|
|
149
|
+
item,
|
|
150
|
+
itemIndex,
|
|
151
|
+
items,
|
|
152
|
+
ctx: {
|
|
153
|
+
runId: nodeCtx.runId,
|
|
154
|
+
workflowId: nodeCtx.workflowId,
|
|
155
|
+
nodeId: nodeCtx.nodeId,
|
|
156
|
+
activationId: nodeCtx.activationId,
|
|
157
|
+
data: nodeCtx.data
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
if (!containsItemExprInUnknown(config)) return;
|
|
161
|
+
return await resolveItemExprsInUnknown(config, exprArgs);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region src/ai/AgentConfigInspectorFactory.ts
|
|
166
|
+
var AgentConfigInspector = class {
|
|
167
|
+
static isAgentNodeConfig(config) {
|
|
168
|
+
if (!config) return false;
|
|
169
|
+
const candidate = config;
|
|
170
|
+
return !!candidate.chatModel && this.hasCompatibleMessageConfiguration(candidate);
|
|
171
|
+
}
|
|
172
|
+
static hasCompatibleMessageConfiguration(candidate) {
|
|
173
|
+
const messages = candidate.messages;
|
|
174
|
+
if (messages === void 0 || messages === null) return false;
|
|
175
|
+
if (Array.isArray(messages)) return messages.length > 0;
|
|
176
|
+
if (typeof messages === "object") {
|
|
177
|
+
if (isItemExpr(messages)) return true;
|
|
178
|
+
const o = messages;
|
|
179
|
+
return Array.isArray(o.prompt) && o.prompt.length > 0 || typeof o.buildMessages === "function";
|
|
180
|
+
}
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
//#endregion
|
|
186
|
+
//#region src/ai/NodeBackedToolConfig.ts
|
|
187
|
+
var NodeBackedToolConfig = class {
|
|
188
|
+
type;
|
|
189
|
+
toolKind = "nodeBacked";
|
|
190
|
+
description;
|
|
191
|
+
presentation;
|
|
192
|
+
inputSchemaValue;
|
|
193
|
+
outputSchemaValue;
|
|
194
|
+
mapInputValue;
|
|
195
|
+
mapOutputValue;
|
|
196
|
+
constructor(name, node, options) {
|
|
197
|
+
this.name = name;
|
|
198
|
+
this.node = node;
|
|
199
|
+
this.type = node.type;
|
|
200
|
+
this.description = options.description;
|
|
201
|
+
this.presentation = options.presentation;
|
|
202
|
+
this.inputSchemaValue = options.inputSchema;
|
|
203
|
+
this.outputSchemaValue = options.outputSchema;
|
|
204
|
+
this.mapInputValue = options.mapInput;
|
|
205
|
+
this.mapOutputValue = options.mapOutput;
|
|
206
|
+
}
|
|
207
|
+
getCredentialRequirements() {
|
|
208
|
+
return this.node.getCredentialRequirements?.() ?? [];
|
|
209
|
+
}
|
|
210
|
+
getInputSchema() {
|
|
211
|
+
return this.inputSchemaValue;
|
|
212
|
+
}
|
|
213
|
+
getOutputSchema() {
|
|
214
|
+
return this.outputSchemaValue;
|
|
215
|
+
}
|
|
216
|
+
toNodeItem(args) {
|
|
217
|
+
const mapped = this.mapInputValue?.(args) ?? args.input;
|
|
218
|
+
if (this.isItem(mapped)) return mapped;
|
|
219
|
+
return { json: mapped };
|
|
220
|
+
}
|
|
221
|
+
toToolOutput(args) {
|
|
222
|
+
const raw = this.mapOutputValue?.(args) ?? this.readDefaultToolOutput(args.outputs);
|
|
223
|
+
return this.outputSchemaValue.parse(raw);
|
|
224
|
+
}
|
|
225
|
+
readDefaultToolOutput(outputs) {
|
|
226
|
+
const firstMainItem = outputs.main?.[0];
|
|
227
|
+
if (!firstMainItem) throw new Error(`Node-backed tool "${this.name}" did not produce a main output item.`);
|
|
228
|
+
return firstMainItem.json;
|
|
229
|
+
}
|
|
230
|
+
isItem(value) {
|
|
231
|
+
return typeof value === "object" && value !== null && "json" in value;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
//#endregion
|
|
236
|
+
//#region src/ai/AgentConnectionNodeCollector.ts
|
|
237
|
+
const AgentConnectionNodeCollector = new class {
|
|
238
|
+
collect(parentNodeId, agentConfig, mcpServerResolver) {
|
|
239
|
+
const collected = [];
|
|
240
|
+
this.collectInto(parentNodeId, agentConfig, collected, mcpServerResolver);
|
|
241
|
+
return collected;
|
|
242
|
+
}
|
|
243
|
+
collectInto(parentNodeId, agentConfig, collected, mcpServerResolver) {
|
|
244
|
+
collected.push({
|
|
245
|
+
nodeId: ConnectionNodeIdFactory.languageModelConnectionNodeId(parentNodeId),
|
|
246
|
+
parentNodeId,
|
|
247
|
+
connectionName: "llm",
|
|
248
|
+
role: "languageModel",
|
|
249
|
+
name: agentConfig.chatModel.presentation?.label ?? agentConfig.chatModel.name,
|
|
250
|
+
typeName: agentConfig.chatModel.name,
|
|
251
|
+
icon: agentConfig.chatModel.presentation?.icon,
|
|
252
|
+
credentialSource: agentConfig.chatModel
|
|
253
|
+
});
|
|
254
|
+
for (const tool of agentConfig.tools ?? []) {
|
|
255
|
+
const toolNodeId = ConnectionNodeIdFactory.toolConnectionNodeId(parentNodeId, tool.name);
|
|
256
|
+
const isNestedAgent = this.isNodeBackedAgentTool(tool);
|
|
257
|
+
collected.push({
|
|
258
|
+
nodeId: toolNodeId,
|
|
259
|
+
parentNodeId,
|
|
260
|
+
connectionName: "tools",
|
|
261
|
+
role: isNestedAgent ? "nestedAgent" : "tool",
|
|
262
|
+
name: tool.presentation?.label ?? tool.name,
|
|
263
|
+
typeName: tool.name,
|
|
264
|
+
icon: tool.presentation?.icon,
|
|
265
|
+
credentialSource: tool
|
|
266
|
+
});
|
|
267
|
+
this.collectNestedAgentTools(toolNodeId, tool, collected, mcpServerResolver);
|
|
268
|
+
}
|
|
269
|
+
if (mcpServerResolver) {
|
|
270
|
+
const mcpServers = agentConfig.mcpServers;
|
|
271
|
+
for (const serverId of mcpServers ?? []) {
|
|
272
|
+
const decl = mcpServerResolver(serverId);
|
|
273
|
+
if (!decl) continue;
|
|
274
|
+
const acceptedTypes = decl.acceptedCredentialTypes ?? [];
|
|
275
|
+
collected.push({
|
|
276
|
+
nodeId: ConnectionNodeIdFactory.mcpConnectionNodeId(parentNodeId, serverId),
|
|
277
|
+
parentNodeId,
|
|
278
|
+
connectionName: "tools",
|
|
279
|
+
role: "tool",
|
|
280
|
+
name: decl.displayName,
|
|
281
|
+
typeName: "MCP server",
|
|
282
|
+
icon: "lucide:plug",
|
|
283
|
+
credentialSource: { getCredentialRequirements: () => [{
|
|
284
|
+
slotKey: "credential",
|
|
285
|
+
label: decl.displayName,
|
|
286
|
+
acceptedTypes
|
|
287
|
+
}] }
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
collectNestedAgentTools(toolNodeId, tool, collected, mcpServerResolver) {
|
|
293
|
+
if (!this.isNodeBackedAgentTool(tool)) return;
|
|
294
|
+
const innerAgent = tool instanceof NodeBackedToolConfig ? tool.node : tool.node;
|
|
295
|
+
this.collectInto(toolNodeId, innerAgent, collected, mcpServerResolver);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* After JSON round-trip (persisted snapshots), tools are plain objects — `instanceof NodeBackedToolConfig` fails.
|
|
299
|
+
* Detect node-backed tools structurally via {@link NodeBackedToolConfig#toolKind}.
|
|
300
|
+
*/
|
|
301
|
+
isNodeBackedAgentTool(tool) {
|
|
302
|
+
if (tool instanceof NodeBackedToolConfig) return AgentConfigInspector.isAgentNodeConfig(tool.node);
|
|
303
|
+
if (!tool || typeof tool !== "object") return false;
|
|
304
|
+
const t = tool;
|
|
305
|
+
if (t.toolKind !== "nodeBacked") return false;
|
|
306
|
+
return AgentConfigInspector.isAgentNodeConfig(t.node);
|
|
307
|
+
}
|
|
308
|
+
}();
|
|
309
|
+
|
|
310
|
+
//#endregion
|
|
311
|
+
//#region src/workflow/definition/NodeIterationIdFactory.ts
|
|
312
|
+
/**
|
|
313
|
+
* Unique ids for one per-item iteration of a runnable node's execute loop.
|
|
314
|
+
*
|
|
315
|
+
* Activations are per-batch (one scheduled execution of a node, possibly with N items).
|
|
316
|
+
* Iterations refine that to one identifier per item-index inside the batch loop, so per-item
|
|
317
|
+
* connection invocations and telemetry can be grouped without time-window heuristics.
|
|
318
|
+
*
|
|
319
|
+
* Uses Web Crypto's `randomUUID` (Node 19+ and all modern browsers) so this module is safe
|
|
320
|
+
* to include in the browser entry. Importing `node:crypto` here previously leaked into the
|
|
321
|
+
* canvas client bundle through `browser.ts` and OOM'd consumers' Turbopack builds.
|
|
322
|
+
*/
|
|
323
|
+
var NodeIterationIdFactory = class {
|
|
324
|
+
static create() {
|
|
325
|
+
return `iter_${globalThis.crypto.randomUUID()}`;
|
|
326
|
+
}
|
|
327
|
+
/** Deterministic id for tests when a stable sequence is needed. */
|
|
328
|
+
static createForTest(seed, sequence) {
|
|
329
|
+
return `iter_${seed}_${sequence}`;
|
|
330
|
+
}
|
|
331
|
+
/** Deterministic id derived from a connection node id (for sub-agent / tool-call scopes). */
|
|
332
|
+
static createForConnection(connectionNodeId, sequence) {
|
|
333
|
+
return `iter_${connectionNodeId}_${sequence}`;
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
//#endregion
|
|
338
|
+
//#region src/contracts/credentialTypes.ts
|
|
339
|
+
var CredentialUnboundError = class CredentialUnboundError extends Error {
|
|
340
|
+
constructor(bindingKey, acceptedTypes = []) {
|
|
341
|
+
super(CredentialUnboundError.createMessage(bindingKey, acceptedTypes));
|
|
342
|
+
this.bindingKey = bindingKey;
|
|
343
|
+
this.acceptedTypes = acceptedTypes;
|
|
344
|
+
this.name = "CredentialUnboundError";
|
|
345
|
+
}
|
|
346
|
+
static createMessage(bindingKey, acceptedTypes) {
|
|
347
|
+
const acceptedTypesSuffix = acceptedTypes.length > 0 ? ` Accepted credential types: ${acceptedTypes.join(", ")}.` : "";
|
|
348
|
+
return `Credential slot "${bindingKey.slotKey}" is not bound for workflow ${bindingKey.workflowId} node ${bindingKey.nodeId}.${acceptedTypesSuffix}`;
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
//#endregion
|
|
353
|
+
//#region src/contracts/runFinishedAtFactory.ts
|
|
354
|
+
/** Derives workflow end time from persisted run root or node snapshots for run listings. */
|
|
355
|
+
var RunFinishedAtFactory = class {
|
|
356
|
+
static resolveIso(state) {
|
|
357
|
+
if (state.finishedAt && state.status !== "running" && state.status !== "pending") return state.finishedAt;
|
|
358
|
+
if (state.status === "running" || state.status === "pending") return;
|
|
359
|
+
let max;
|
|
360
|
+
for (const snap of Object.values(state.nodeSnapshotsByNodeId)) if (snap?.finishedAt && (!max || snap.finishedAt > max)) max = snap.finishedAt;
|
|
361
|
+
return max;
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
//#endregion
|
|
366
|
+
//#region src/contracts/workflowTypes.ts
|
|
367
|
+
function nodeRef(nodeId) {
|
|
368
|
+
return nodeId;
|
|
369
|
+
}
|
|
370
|
+
const branchRef = (index) => `$${index}`;
|
|
371
|
+
|
|
372
|
+
//#endregion
|
|
373
|
+
//#region src/di/CoreTokens.ts
|
|
374
|
+
const CoreTokens = {
|
|
375
|
+
PersistedWorkflowTokenRegistry: Symbol.for("codemation.core.PersistedWorkflowTokenRegistry"),
|
|
376
|
+
CredentialSessionService: Symbol.for("codemation.core.CredentialSessionService"),
|
|
377
|
+
CredentialTypeRegistry: Symbol.for("codemation.core.CredentialTypeRegistry"),
|
|
378
|
+
WorkflowRunnerService: Symbol.for("codemation.core.WorkflowRunnerService"),
|
|
379
|
+
LiveWorkflowRepository: Symbol.for("codemation.core.LiveWorkflowRepository"),
|
|
380
|
+
WorkflowRepository: Symbol.for("codemation.core.WorkflowRepository"),
|
|
381
|
+
NodeResolver: Symbol.for("codemation.core.NodeResolver"),
|
|
382
|
+
WorkflowNodeInstanceFactory: Symbol.for("codemation.core.WorkflowNodeInstanceFactory"),
|
|
383
|
+
RunIdFactory: Symbol.for("codemation.core.RunIdFactory"),
|
|
384
|
+
ActivationIdFactory: Symbol.for("codemation.core.ActivationIdFactory"),
|
|
385
|
+
WorkflowExecutionRepository: Symbol.for("codemation.core.WorkflowExecutionRepository"),
|
|
386
|
+
TriggerSetupStateRepository: Symbol.for("codemation.core.TriggerSetupStateRepository"),
|
|
387
|
+
NodeActivationScheduler: Symbol.for("codemation.core.NodeActivationScheduler"),
|
|
388
|
+
RunDataFactory: Symbol.for("codemation.core.RunDataFactory"),
|
|
389
|
+
ExecutionContextFactory: Symbol.for("codemation.core.ExecutionContextFactory"),
|
|
390
|
+
RunEventBus: Symbol.for("codemation.core.RunEventBus"),
|
|
391
|
+
BinaryStorage: Symbol.for("codemation.core.BinaryStorage"),
|
|
392
|
+
WebhookBasePath: Symbol.for("codemation.core.WebhookBasePath"),
|
|
393
|
+
EngineExecutionLimitsPolicy: Symbol.for("codemation.core.EngineExecutionLimitsPolicy"),
|
|
394
|
+
WorkflowActivationPolicy: Symbol.for("codemation.core.WorkflowActivationPolicy"),
|
|
395
|
+
AgentMcpIntegration: Symbol.for("codemation.core.AgentMcpIntegration")
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
//#endregion
|
|
399
|
+
Object.defineProperty(exports, 'AgentConfigInspector', {
|
|
400
|
+
enumerable: true,
|
|
401
|
+
get: function () {
|
|
402
|
+
return AgentConfigInspector;
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
Object.defineProperty(exports, 'AgentConnectionNodeCollector', {
|
|
406
|
+
enumerable: true,
|
|
407
|
+
get: function () {
|
|
408
|
+
return AgentConnectionNodeCollector;
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
Object.defineProperty(exports, 'ConnectionNodeIdFactory', {
|
|
412
|
+
enumerable: true,
|
|
413
|
+
get: function () {
|
|
414
|
+
return ConnectionNodeIdFactory;
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
Object.defineProperty(exports, 'CoreTokens', {
|
|
418
|
+
enumerable: true,
|
|
419
|
+
get: function () {
|
|
420
|
+
return CoreTokens;
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
Object.defineProperty(exports, 'CredentialUnboundError', {
|
|
424
|
+
enumerable: true,
|
|
425
|
+
get: function () {
|
|
426
|
+
return CredentialUnboundError;
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
Object.defineProperty(exports, 'NodeBackedToolConfig', {
|
|
430
|
+
enumerable: true,
|
|
431
|
+
get: function () {
|
|
432
|
+
return NodeBackedToolConfig;
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
Object.defineProperty(exports, 'NodeIterationIdFactory', {
|
|
436
|
+
enumerable: true,
|
|
437
|
+
get: function () {
|
|
438
|
+
return NodeIterationIdFactory;
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
Object.defineProperty(exports, 'RunFinishedAtFactory', {
|
|
442
|
+
enumerable: true,
|
|
443
|
+
get: function () {
|
|
444
|
+
return RunFinishedAtFactory;
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
Object.defineProperty(exports, '__toESM', {
|
|
448
|
+
enumerable: true,
|
|
449
|
+
get: function () {
|
|
450
|
+
return __toESM;
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
Object.defineProperty(exports, 'branchRef', {
|
|
454
|
+
enumerable: true,
|
|
455
|
+
get: function () {
|
|
456
|
+
return branchRef;
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
Object.defineProperty(exports, 'isItemExpr', {
|
|
460
|
+
enumerable: true,
|
|
461
|
+
get: function () {
|
|
462
|
+
return isItemExpr;
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
Object.defineProperty(exports, 'itemExpr', {
|
|
466
|
+
enumerable: true,
|
|
467
|
+
get: function () {
|
|
468
|
+
return itemExpr;
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
Object.defineProperty(exports, 'nodeRef', {
|
|
472
|
+
enumerable: true,
|
|
473
|
+
get: function () {
|
|
474
|
+
return nodeRef;
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
Object.defineProperty(exports, 'resolveItemExprsForExecution', {
|
|
478
|
+
enumerable: true,
|
|
479
|
+
get: function () {
|
|
480
|
+
return resolveItemExprsForExecution;
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
Object.defineProperty(exports, 'resolveItemExprsInUnknown', {
|
|
484
|
+
enumerable: true,
|
|
485
|
+
get: function () {
|
|
486
|
+
return resolveItemExprsInUnknown;
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
//# sourceMappingURL=di-BlEKdoZS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"di-BlEKdoZS.cjs","names":["out: unknown[]","out","exprArgs: ItemExprArgs","name: string","node: TNodeConfig","AgentConnectionNodeCollector: AgentConnectionNodeCollectorApi","collected: AgentConnectionNodeDescriptor[]","bindingKey: CredentialBindingKey","acceptedTypes: ReadonlyArray<CredentialTypeId>","max: string | undefined"],"sources":["../src/workflow/definition/ConnectionNodeIdFactory.ts","../src/contracts/itemExpr.ts","../src/ai/AgentConfigInspectorFactory.ts","../src/ai/NodeBackedToolConfig.ts","../src/ai/AgentConnectionNodeCollector.ts","../src/workflow/definition/NodeIterationIdFactory.ts","../src/contracts/credentialTypes.ts","../src/contracts/runFinishedAtFactory.ts","../src/contracts/workflowTypes.ts","../src/di/CoreTokens.ts"],"sourcesContent":["import type { NodeId } from \"../../types\";\n\n/**\n * Deterministic ids for workflow connection-owned child nodes (LLM slot, tools, etc.).\n * These are stable across loads.\n */\nexport class ConnectionNodeIdFactory {\n static readonly connectionSegment = \"__conn__\" as const;\n\n static languageModelConnectionNodeId(parentNodeId: NodeId): NodeId {\n return `${parentNodeId}${this.connectionSegment}llm`;\n }\n\n static toolConnectionNodeId(parentNodeId: NodeId, toolName: string): NodeId {\n const normalized = this.normalizeToolName(toolName);\n return `${parentNodeId}${this.connectionSegment}tool${this.connectionSegment}${normalized}`;\n }\n\n static mcpConnectionNodeId(parentNodeId: NodeId, serverId: string): NodeId {\n return `${parentNodeId}${this.connectionSegment}mcp${this.connectionSegment}${serverId}`;\n }\n\n static isMcpConnectionNodeId(nodeId: NodeId): boolean {\n return nodeId.includes(`${this.connectionSegment}mcp${this.connectionSegment}`);\n }\n\n static parseMcpConnectionNodeId(nodeId: NodeId): Readonly<{ parentNodeId: NodeId; serverId: string }> | undefined {\n if (!this.isMcpConnectionNodeId(nodeId)) {\n return undefined;\n }\n const marker = `${this.connectionSegment}mcp${this.connectionSegment}`;\n const idx = nodeId.lastIndexOf(marker);\n if (idx < 0) {\n return undefined;\n }\n const parentNodeId = nodeId.slice(0, idx);\n const serverId = nodeId.slice(idx + marker.length);\n if (!parentNodeId || !serverId) {\n return undefined;\n }\n return { parentNodeId, serverId };\n }\n\n static isLanguageModelConnectionNodeId(nodeId: NodeId): boolean {\n return nodeId.endsWith(`${this.connectionSegment}llm`);\n }\n\n static isToolConnectionNodeId(nodeId: NodeId): boolean {\n return nodeId.includes(`${this.connectionSegment}tool${this.connectionSegment}`);\n }\n\n static parseLanguageModelConnectionNodeId(nodeId: NodeId): Readonly<{ parentNodeId: NodeId }> | undefined {\n if (!this.isLanguageModelConnectionNodeId(nodeId)) {\n return undefined;\n }\n const suffix = `${this.connectionSegment}llm`;\n const parentNodeId = nodeId.slice(0, -suffix.length);\n return parentNodeId ? { parentNodeId } : undefined;\n }\n\n static parseToolConnectionNodeId(\n nodeId: NodeId,\n ): Readonly<{ parentNodeId: NodeId; normalizedToolName: string }> | undefined {\n if (!this.isToolConnectionNodeId(nodeId)) {\n return undefined;\n }\n const marker = `${this.connectionSegment}tool${this.connectionSegment}`;\n const idx = nodeId.lastIndexOf(marker);\n if (idx < 0) {\n return undefined;\n }\n const parentNodeId = nodeId.slice(0, idx);\n const normalizedToolName = nodeId.slice(idx + marker.length);\n if (!parentNodeId || !normalizedToolName) {\n return undefined;\n }\n return { parentNodeId, normalizedToolName };\n }\n\n /** True when `nodeId` is a connection-owned child of `parentNodeId` (LLM or tool slot). */\n static isConnectionOwnedDescendantOf(parentNodeId: NodeId, nodeId: NodeId): boolean {\n return nodeId.startsWith(`${parentNodeId}${this.connectionSegment}`);\n }\n\n /** Normalizes a tool display name to a stable id segment. */\n static normalizeToolName(toolName: string): string {\n return (\n toolName\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"tool\"\n );\n }\n}\n","import type { NodeExecutionContext } from \"./runtimeTypes\";\nimport type { Item, Items, NodeActivationId, NodeId, RunDataSnapshot, RunId, WorkflowId } from \"./workflowTypes\";\n\nconst ITEM_EXPR_BRAND = Symbol.for(\"codemation.itemExpr\");\n\nexport type ItemExprResolvedContext = Readonly<{\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n data: RunDataSnapshot;\n}>;\n\n/**\n * Context aligned with former {@link ItemInputMapperContext} — use **`data`** to read any completed upstream node.\n */\nexport type ItemExprContext = ItemExprResolvedContext;\n\nexport type ItemExprArgs<TItemJson = unknown> = Readonly<{\n item: Item<TItemJson>;\n itemIndex: number;\n items: Items<TItemJson>;\n ctx: ItemExprContext;\n}>;\n\nexport type ItemExprCallback<T, TItemJson = unknown> = (args: ItemExprArgs<TItemJson>) => T | Promise<T>;\n\nexport type ItemExpr<T, TItemJson = unknown> = Readonly<{\n readonly [ITEM_EXPR_BRAND]: true;\n readonly fn: ItemExprCallback<T, TItemJson>;\n}>;\n\nexport function itemExpr<T, TItemJson = unknown>(fn: ItemExprCallback<T, TItemJson>): ItemExpr<T, TItemJson> {\n return { [ITEM_EXPR_BRAND]: true, fn };\n}\n\nexport function isItemExpr<T, TItemJson = unknown>(value: unknown): value is ItemExpr<T, TItemJson> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const v = value as Record<PropertyKey, unknown>;\n if (v[ITEM_EXPR_BRAND] === true) {\n return true;\n }\n // Support snapshot-hydrated itemExpr wrappers where the symbol brand was lost but the callback survived.\n // Workflow snapshot hydration currently restores function-valued fields (like `fn`) but may drop symbol-keyed brands.\n // We treat the minimal `{ fn: Function }` shape as an itemExpr wrapper to keep runnable configs working.\n const keys = Object.keys(v);\n if (keys.length === 1 && keys[0] === \"fn\" && typeof (v as { fn?: unknown }).fn === \"function\") {\n return true;\n }\n for (const sym of Object.getOwnPropertySymbols(v)) {\n if (sym.description === \"codemation.itemExpr\" && v[sym] === true) {\n return true;\n }\n }\n return false;\n}\n\nfunction containsItemExprInUnknown(value: unknown, seen: WeakSet<object> = new WeakSet()): boolean {\n if (isItemExpr(value)) {\n return true;\n }\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n if (seen.has(value as object)) {\n return false;\n }\n seen.add(value as object);\n if (Array.isArray(value)) {\n return value.some((entry) => containsItemExprInUnknown(entry, seen));\n }\n for (const entry of Object.values(value as Record<string, unknown>)) {\n if (containsItemExprInUnknown(entry, seen)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Deep-resolves {@link itemExpr} leaves. Returns a new graph (does not mutate the original config object).\n */\nexport async function resolveItemExprsInUnknown(\n value: unknown,\n args: ItemExprArgs,\n seen: WeakSet<object> = new WeakSet(),\n): Promise<unknown> {\n if (isItemExpr(value)) {\n return await Promise.resolve(value.fn(args));\n }\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (seen.has(value as object)) {\n return value;\n }\n seen.add(value as object);\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n for (let i = 0; i < value.length; i++) {\n out.push(await resolveItemExprsInUnknown(value[i], args, seen));\n }\n return out;\n }\n const rec = value as Record<string, unknown>;\n const entries = Object.entries(rec);\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null && entries.length === 0) {\n return value;\n }\n const out = Object.create(proto) as Record<string, unknown>;\n for (const [k, v] of entries) {\n out[k] = await resolveItemExprsInUnknown(v, args, seen);\n }\n return out;\n}\n\n/**\n * Clones runnable config (best-effort) so per-item {@link itemExpr} resolution never mutates shared instances.\n */\nexport async function resolveItemExprsForExecution(\n config: unknown,\n nodeCtx: NodeExecutionContext,\n item: Item,\n itemIndex: number,\n items: Items,\n): Promise<unknown | undefined> {\n const exprArgs: ItemExprArgs = {\n item,\n itemIndex,\n items,\n ctx: {\n runId: nodeCtx.runId,\n workflowId: nodeCtx.workflowId,\n nodeId: nodeCtx.nodeId,\n activationId: nodeCtx.activationId,\n data: nodeCtx.data,\n },\n };\n if (!containsItemExprInUnknown(config)) {\n return undefined;\n }\n return await resolveItemExprsInUnknown(config, exprArgs);\n}\n","import type { NodeConfigBase } from \"../types\";\nimport { isItemExpr } from \"../contracts/itemExpr\";\nimport type { AgentNodeConfig } from \"./AiHost\";\n\nexport class AgentConfigInspector {\n static isAgentNodeConfig(config: NodeConfigBase | undefined): config is AgentNodeConfig<any, any> {\n if (!config) return false;\n const candidate = config as Partial<AgentNodeConfig<any, any>>;\n return !!candidate.chatModel && this.hasCompatibleMessageConfiguration(candidate);\n }\n\n private static hasCompatibleMessageConfiguration(candidate: Partial<AgentNodeConfig<any, any>>): boolean {\n const messages = candidate.messages;\n if (messages === undefined || messages === null) {\n return false;\n }\n if (Array.isArray(messages)) {\n return messages.length > 0;\n }\n if (typeof messages === \"object\") {\n if (isItemExpr(messages)) {\n return true;\n }\n const o = messages as { prompt?: unknown; buildMessages?: unknown };\n return (Array.isArray(o.prompt) && o.prompt.length > 0) || typeof o.buildMessages === \"function\";\n }\n return false;\n }\n}\n","import type { CredentialRequirement } from \"../contracts/credentialTypes\";\nimport type { TypeToken } from \"../di\";\nimport type { Item, NodeOutputs, RunnableNodeConfig, RunnableNodeInputJson } from \"../types\";\nimport type { input as ZodInput, output as ZodOutput } from \"zod\";\nimport type {\n AgentCanvasPresentation,\n NodeBackedToolConfigOptions,\n NodeBackedToolInputMapper,\n NodeBackedToolInputMapperArgs,\n NodeBackedToolOutputMapper,\n NodeBackedToolOutputMapperArgs,\n ToolConfig,\n ZodSchemaAny,\n} from \"./AiHost\";\n\nexport class NodeBackedToolConfig<\n TNodeConfig extends RunnableNodeConfig<any, any>,\n TInputSchema extends ZodSchemaAny,\n TOutputSchema extends ZodSchemaAny,\n> implements ToolConfig {\n readonly type: TypeToken<unknown>;\n readonly toolKind = \"nodeBacked\" as const;\n readonly description?: string;\n readonly presentation?: AgentCanvasPresentation;\n 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.inputSchemaValue = options.inputSchema;\n this.outputSchemaValue = options.outputSchema;\n this.mapInputValue = options.mapInput;\n this.mapOutputValue = options.mapOutput;\n }\n\n getCredentialRequirements(): ReadonlyArray<CredentialRequirement> {\n return this.node.getCredentialRequirements?.() ?? [];\n }\n\n getInputSchema(): TInputSchema {\n return this.inputSchemaValue;\n }\n\n getOutputSchema(): TOutputSchema {\n return this.outputSchemaValue;\n }\n\n toNodeItem(\n args: NodeBackedToolInputMapperArgs<TNodeConfig, ZodInput<TInputSchema>>,\n ): Item<RunnableNodeInputJson<TNodeConfig>> {\n const mapped = this.mapInputValue?.(args) ?? (args.input as RunnableNodeInputJson<TNodeConfig>);\n if (this.isItem(mapped)) {\n return mapped;\n }\n return { json: mapped };\n }\n\n toToolOutput(args: NodeBackedToolOutputMapperArgs<TNodeConfig, ZodInput<TInputSchema>>): ZodOutput<TOutputSchema> {\n const raw = this.mapOutputValue?.(args) ?? this.readDefaultToolOutput(args.outputs);\n return this.outputSchemaValue.parse(raw) as ZodOutput<TOutputSchema>;\n }\n\n private readDefaultToolOutput(outputs: NodeOutputs): unknown {\n const firstMainItem = outputs.main?.[0];\n if (!firstMainItem) {\n throw new Error(`Node-backed tool \"${this.name}\" did not produce a main output item.`);\n }\n return firstMainItem.json;\n }\n\n private isItem(value: unknown): value is Item {\n return typeof value === \"object\" && value !== null && \"json\" in value;\n }\n}\n","import type { CredentialRequirement } from \"../contracts/credentialTypes\";\nimport type { McpServerDeclaration } from \"../contracts/mcpTypes\";\nimport type { NodeConfigBase, NodeConnectionName, NodeId } from \"../types\";\nimport { ConnectionNodeIdFactory } from \"../workflow/definition/ConnectionNodeIdFactory\";\nimport { AgentConfigInspector } from \"./AgentConfigInspectorFactory\";\nimport type { AgentNodeConfig, ToolConfig } from \"./AiHost\";\nimport { NodeBackedToolConfig } from \"./NodeBackedToolConfig\";\n\nexport type AgentConnectionNodeRole = \"languageModel\" | \"tool\" | \"nestedAgent\";\n\nexport type AgentConnectionCredentialSource = Readonly<{\n getCredentialRequirements?(): ReadonlyArray<CredentialRequirement>;\n}>;\n\nexport type AgentConnectionNodeDescriptor = Readonly<{\n nodeId: NodeId;\n parentNodeId: NodeId;\n connectionName: NodeConnectionName;\n role: AgentConnectionNodeRole;\n name: string;\n typeName: string;\n icon?: string;\n credentialSource: AgentConnectionCredentialSource;\n}>;\n\nexport type McpServerResolver = (id: string) => McpServerDeclaration | undefined;\n\ntype AgentConnectionNodeCollectorApi = Readonly<{\n collect(\n parentNodeId: NodeId,\n agentConfig: AgentNodeConfig<any, any>,\n mcpServerResolver?: McpServerResolver,\n ): ReadonlyArray<AgentConnectionNodeDescriptor>;\n}>;\n\nexport const AgentConnectionNodeCollector: AgentConnectionNodeCollectorApi = new (class {\n collect(\n parentNodeId: NodeId,\n agentConfig: AgentNodeConfig<any, any>,\n mcpServerResolver?: McpServerResolver,\n ): ReadonlyArray<AgentConnectionNodeDescriptor> {\n const collected: AgentConnectionNodeDescriptor[] = [];\n this.collectInto(parentNodeId, agentConfig, collected, mcpServerResolver);\n return collected;\n }\n\n private collectInto(\n parentNodeId: NodeId,\n agentConfig: AgentNodeConfig<any, any>,\n collected: AgentConnectionNodeDescriptor[],\n mcpServerResolver?: McpServerResolver,\n ): void {\n collected.push({\n nodeId: ConnectionNodeIdFactory.languageModelConnectionNodeId(parentNodeId),\n parentNodeId,\n connectionName: \"llm\",\n role: \"languageModel\",\n name: agentConfig.chatModel.presentation?.label ?? agentConfig.chatModel.name,\n typeName: agentConfig.chatModel.name,\n icon: agentConfig.chatModel.presentation?.icon,\n credentialSource: agentConfig.chatModel,\n });\n\n for (const tool of agentConfig.tools ?? []) {\n const toolNodeId = ConnectionNodeIdFactory.toolConnectionNodeId(parentNodeId, tool.name);\n const isNestedAgent = this.isNodeBackedAgentTool(tool);\n collected.push({\n nodeId: toolNodeId,\n parentNodeId,\n connectionName: \"tools\",\n role: isNestedAgent ? \"nestedAgent\" : \"tool\",\n name: tool.presentation?.label ?? tool.name,\n typeName: tool.name,\n icon: tool.presentation?.icon,\n credentialSource: tool,\n });\n this.collectNestedAgentTools(toolNodeId, tool, collected, mcpServerResolver);\n }\n\n if (mcpServerResolver) {\n const mcpServers = (agentConfig as unknown as { mcpServers?: ReadonlyArray<string> }).mcpServers;\n for (const serverId of mcpServers ?? []) {\n const decl = mcpServerResolver(serverId);\n if (!decl) {\n continue;\n }\n const acceptedTypes = decl.acceptedCredentialTypes ?? [];\n collected.push({\n nodeId: ConnectionNodeIdFactory.mcpConnectionNodeId(parentNodeId, serverId),\n parentNodeId,\n connectionName: \"tools\",\n role: \"tool\",\n name: decl.displayName,\n typeName: \"MCP server\",\n icon: \"lucide:plug\",\n credentialSource: {\n getCredentialRequirements: () => [\n {\n slotKey: \"credential\",\n label: decl.displayName,\n acceptedTypes,\n },\n ],\n },\n });\n }\n }\n }\n\n private collectNestedAgentTools(\n toolNodeId: NodeId,\n tool: ToolConfig,\n collected: AgentConnectionNodeDescriptor[],\n mcpServerResolver?: McpServerResolver,\n ): void {\n if (!this.isNodeBackedAgentTool(tool)) {\n return;\n }\n const innerAgent =\n tool instanceof NodeBackedToolConfig ? tool.node : (tool as unknown as { node: AgentNodeConfig<any, any> }).node;\n this.collectInto(toolNodeId, innerAgent, collected, mcpServerResolver);\n }\n\n /**\n * After JSON round-trip (persisted snapshots), tools are plain objects — `instanceof NodeBackedToolConfig` fails.\n * Detect node-backed tools structurally via {@link NodeBackedToolConfig#toolKind}.\n */\n private isNodeBackedAgentTool(tool: ToolConfig): boolean {\n if (tool instanceof NodeBackedToolConfig) {\n return AgentConfigInspector.isAgentNodeConfig(tool.node);\n }\n if (!tool || typeof tool !== \"object\") {\n return false;\n }\n const t = tool as unknown as Record<string, unknown>;\n if (t.toolKind !== \"nodeBacked\") {\n return false;\n }\n return AgentConfigInspector.isAgentNodeConfig(t.node as NodeConfigBase);\n }\n})();\n","import type { NodeId } from \"../../types\";\n\n/**\n * Unique ids for one per-item iteration of a runnable node's execute loop.\n *\n * Activations are per-batch (one scheduled execution of a node, possibly with N items).\n * Iterations refine that to one identifier per item-index inside the batch loop, so per-item\n * connection invocations and telemetry can be grouped without time-window heuristics.\n *\n * Uses Web Crypto's `randomUUID` (Node 19+ and all modern browsers) so this module is safe\n * to include in the browser entry. Importing `node:crypto` here previously leaked into the\n * canvas client bundle through `browser.ts` and OOM'd consumers' Turbopack builds.\n */\nexport class NodeIterationIdFactory {\n static create(): string {\n return `iter_${globalThis.crypto.randomUUID()}`;\n }\n\n /** Deterministic id for tests when a stable sequence is needed. */\n static createForTest(seed: string, sequence: number): string {\n return `iter_${seed}_${sequence}`;\n }\n\n /** Deterministic id derived from a connection node id (for sub-agent / tool-call scopes). */\n static createForConnection(connectionNodeId: NodeId, sequence: number): string {\n return `iter_${connectionNodeId}_${sequence}`;\n }\n}\n","import type { NodeId, WorkflowId } from \"./baseTypes\";\n\nexport type CredentialTypeId = string;\nexport type CredentialInstanceId = string;\n\nexport type CredentialMaterialSourceKind = \"db\" | \"env\" | \"code\";\nexport type CredentialSetupStatus = \"draft\" | \"ready\";\nexport type CredentialHealthStatus = \"unknown\" | \"healthy\" | \"failing\";\n\nexport type CredentialFieldSchema = Readonly<{\n key: string;\n label: string;\n type: \"string\" | \"password\" | \"textarea\" | \"json\" | \"boolean\";\n required?: true;\n order?: number;\n /**\n * Where this field appears in the credential dialog. Use `\"advanced\"` for optional or\n * power-user fields; they render inside a collapsible section (see `CredentialTypeDefinition.advancedSection`).\n * Defaults to `\"default\"` when omitted.\n */\n visibility?: \"default\" | \"advanced\";\n placeholder?: string;\n helpText?: string;\n /** When set, host resolves this field from process.env at runtime; env wins over stored values. */\n envVarName?: string;\n /**\n * When set, the dialog shows a copy action for this exact string (e.g. a static OAuth redirect URI\n * pattern or documentation URL). Do not use for secret values.\n */\n copyValue?: string;\n /** Accessible label for the copy control (default: Copy). */\n copyButtonLabel?: string;\n}>;\n\nexport type CredentialRequirement = Readonly<{\n slotKey: string;\n label: string;\n acceptedTypes: ReadonlyArray<CredentialTypeId>;\n optional?: true;\n helpText?: string;\n helpUrl?: string;\n}>;\n\nexport type CredentialBindingKey = Readonly<{\n workflowId: WorkflowId;\n nodeId: NodeId;\n slotKey: string;\n}>;\n\nexport type CredentialBinding = Readonly<{\n key: CredentialBindingKey;\n instanceId: CredentialInstanceId;\n updatedAt: string;\n}>;\n\nexport type CredentialHealth = Readonly<{\n status: CredentialHealthStatus;\n message?: string;\n testedAt?: string;\n expiresAt?: string;\n details?: Readonly<Record<string, unknown>>;\n}>;\n\nexport type OAuth2ProviderFromPublicConfig = Readonly<{\n authorizeUrlFieldKey: string;\n tokenUrlFieldKey: string;\n userInfoUrlFieldKey?: string;\n}>;\n\nexport type CredentialOAuth2ScopesFromPublicConfig = Readonly<{\n presetFieldKey: string;\n presetScopes: Readonly<Record<string, ReadonlyArray<string>>>;\n customPresetKey?: string;\n customScopesFieldKey?: string;\n}>;\n\nexport type CredentialOAuth2AuthDefinition = Readonly<\n | {\n kind: \"oauth2\";\n providerId: string;\n scopes: ReadonlyArray<string>;\n scopesFromPublicConfig?: CredentialOAuth2ScopesFromPublicConfig;\n clientIdFieldKey?: string;\n clientSecretFieldKey?: string;\n }\n | {\n kind: \"oauth2\";\n providerFromPublicConfig: OAuth2ProviderFromPublicConfig;\n scopes: ReadonlyArray<string>;\n scopesFromPublicConfig?: CredentialOAuth2ScopesFromPublicConfig;\n clientIdFieldKey?: string;\n clientSecretFieldKey?: string;\n }\n | {\n kind: \"oauth2\";\n /**\n * Free-form provider identifier for telemetry, DB rows, and Better Auth provider naming.\n * Not used for any registry lookup — URLs come from {@link authorizeUrl} / {@link tokenUrl}.\n */\n providerId: string;\n /**\n * Authorization endpoint. May contain `{publicFieldKey}` placeholders that the runtime\n * substitutes from the credential's resolved public config (URL-encoded).\n * Example: `https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize`\n */\n authorizeUrl: string;\n /** Token endpoint. Same templating rules as {@link authorizeUrl}. */\n tokenUrl: string;\n /** Optional userinfo endpoint. Same templating rules as {@link authorizeUrl}. */\n userInfoUrl?: string;\n scopes: ReadonlyArray<string>;\n scopesFromPublicConfig?: CredentialOAuth2ScopesFromPublicConfig;\n clientIdFieldKey?: string;\n clientSecretFieldKey?: string;\n }\n>;\n\nexport type CredentialAuthDefinition = CredentialOAuth2AuthDefinition;\n\nexport type CredentialAdvancedSectionPresentation = Readonly<{\n /** Collapsible section title (default: \"Advanced\"). */\n title?: string;\n /** Optional short helper text shown inside the section (above the fields). */\n description?: string;\n /** When true, the advanced section starts expanded. Default: false (collapsed). */\n defaultOpen?: boolean;\n}>;\n\nexport type CredentialTypeDefinition = Readonly<{\n typeId: CredentialTypeId;\n displayName: string;\n description?: string;\n publicFields?: ReadonlyArray<CredentialFieldSchema>;\n secretFields?: ReadonlyArray<CredentialFieldSchema>;\n /**\n * Optional labels for the collapsible block that contains every field with `visibility: \"advanced\"`.\n * If omitted, the UI still shows that block with defaults (title \"Advanced\", collapsed).\n */\n advancedSection?: CredentialAdvancedSectionPresentation;\n supportedSourceKinds?: ReadonlyArray<CredentialMaterialSourceKind>;\n auth?: CredentialAuthDefinition;\n}>;\n\n/**\n * JSON-shaped credential field bag (public config, resolved secret material, etc.).\n */\nexport type CredentialJsonRecord = Readonly<Record<string, unknown>>;\n\n/**\n * Persisted credential instance with typed `publicConfig`.\n * Hosts may specialize `secretRef` with a stricter union while remaining\n * assignable here for session/test callbacks.\n */\nexport type CredentialInstanceRecord<TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord> = Readonly<{\n instanceId: CredentialInstanceId;\n typeId: CredentialTypeId;\n displayName: string;\n sourceKind: CredentialMaterialSourceKind;\n publicConfig: TPublicConfig;\n secretRef: CredentialJsonRecord;\n tags: ReadonlyArray<string>;\n setupStatus: CredentialSetupStatus;\n createdAt: string;\n updatedAt: string;\n}>;\n\n/**\n * Arguments passed to `CredentialType.createSession` and `CredentialType.test`.\n * Declare `TPublicConfig` / `TMaterial` on `CredentialType` so implementations are checked\n * against your credential shapes (similar to `NodeExecutionContext.config` for nodes).\n */\nexport type CredentialSessionFactoryArgs<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n> = Readonly<{\n instance: CredentialInstanceRecord<TPublicConfig>;\n material: TMaterial;\n publicConfig: TPublicConfig;\n}>;\n\nexport type CredentialSessionFactory<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n TSession = unknown,\n> = (args: CredentialSessionFactoryArgs<TPublicConfig, TMaterial>) => Promise<TSession>;\n\nexport type CredentialHealthTester<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n> = (args: CredentialSessionFactoryArgs<TPublicConfig, TMaterial>) => Promise<CredentialHealth>;\n\n/**\n * Full credential type implementation: `definition` (UI/schema), `createSession`, and `test`.\n * Use this at registration and config boundaries; `CredentialTypeDefinition` is only the schema slice.\n */\nexport type CredentialType<\n TPublicConfig extends CredentialJsonRecord = CredentialJsonRecord,\n TMaterial extends CredentialJsonRecord = CredentialJsonRecord,\n TSession = unknown,\n> = Readonly<{\n definition: CredentialTypeDefinition;\n createSession: CredentialSessionFactory<TPublicConfig, TMaterial, TSession>;\n test: CredentialHealthTester<TPublicConfig, TMaterial>;\n}>;\n\n/**\n * Credential type with unspecified generics — used for `CodemationConfig.credentialTypes`, the host registry,\n * and anywhere a concrete `CredentialType<YourPublic, YourMaterial, YourSession>` is placed in a heterogeneous list.\n * Using `any` here avoids unsafe `as` casts while keeping typed `satisfies CredentialType<…>` definitions.\n */\nexport type AnyCredentialType = CredentialType<any, any, unknown>;\n\nexport interface CredentialSessionService {\n getSession<TSession = unknown>(\n args: Readonly<{\n workflowId: WorkflowId;\n nodeId: NodeId;\n slotKey: string;\n }>,\n ): Promise<TSession>;\n}\n\nexport interface CredentialTypeRegistry {\n listTypes(): ReadonlyArray<CredentialTypeDefinition>;\n getType(typeId: CredentialTypeId): CredentialTypeDefinition | undefined;\n}\n\nexport class CredentialUnboundError extends Error {\n constructor(\n public readonly bindingKey: CredentialBindingKey,\n public readonly acceptedTypes: ReadonlyArray<CredentialTypeId> = [],\n ) {\n super(CredentialUnboundError.createMessage(bindingKey, acceptedTypes));\n this.name = \"CredentialUnboundError\";\n }\n\n private static createMessage(\n bindingKey: CredentialBindingKey,\n acceptedTypes: ReadonlyArray<CredentialTypeId>,\n ): string {\n const acceptedTypesSuffix =\n acceptedTypes.length > 0 ? ` Accepted credential types: ${acceptedTypes.join(\", \")}.` : \"\";\n return `Credential slot \"${bindingKey.slotKey}\" is not bound for workflow ${bindingKey.workflowId} node ${bindingKey.nodeId}.${acceptedTypesSuffix}`;\n }\n}\n","import type { PersistedRunState } from \"./runTypes\";\n\ntype RunFinishedAtSource = Pick<PersistedRunState, \"status\" | \"nodeSnapshotsByNodeId\" | \"finishedAt\">;\n\n/** Derives workflow end time from persisted run root or node snapshots for run listings. */\nexport class RunFinishedAtFactory {\n static resolveIso(state: RunFinishedAtSource): string | undefined {\n if (state.finishedAt && state.status !== \"running\" && state.status !== \"pending\") {\n return state.finishedAt;\n }\n if (state.status === \"running\" || state.status === \"pending\") {\n return undefined;\n }\n let max: string | undefined;\n for (const snap of Object.values(state.nodeSnapshotsByNodeId)) {\n if (snap?.finishedAt && (!max || snap.finishedAt > max)) {\n max = snap.finishedAt;\n }\n }\n return max;\n }\n}\n","import type { ZodType } from \"zod\";\n\nimport type { TypeToken } from \"../di\";\nimport type { CredentialRequirement } from \"./credentialTypes\";\nimport type { RetryPolicySpec } from \"./retryPolicySpec.types\";\nimport type { InputPortKey, NodeConnectionName, NodeId, OutputPortKey, WorkflowId } from \"./baseTypes\";\n\nexport type {\n InputPortKey,\n NodeConnectionName,\n NodeId,\n OutputPortKey,\n PersistedTokenId,\n WorkflowId,\n} from \"./baseTypes\";\n\nexport type NodeIdRef<TJson = unknown> = NodeId & Readonly<{ __codemationNodeJson?: TJson }>;\n\nexport type NodeKind = \"trigger\" | \"node\";\nexport type JsonPrimitive = string | number | boolean | null;\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\nexport type JsonArray = ReadonlyArray<JsonValue>;\n/** JSON value that is not a top-level array (nested arrays inside objects are allowed). */\nexport type JsonNonArray = JsonPrimitive | JsonObject;\n\nexport interface Edge {\n from: { nodeId: NodeId; output: OutputPortKey };\n to: { nodeId: NodeId; input: InputPortKey };\n}\n\n/**\n * Named connection from a parent node to child nodes that exist in {@link WorkflowDefinition.nodes}\n * but are not traversed by the main execution graph. Parents are commonly executable nodes, but may\n * also be connection-owned nodes for recursive agent attachments.\n */\nexport interface WorkflowNodeConnection {\n readonly parentNodeId: NodeId;\n readonly connectionName: NodeConnectionName;\n readonly childNodeIds: ReadonlyArray<NodeId>;\n}\n\nexport interface WorkflowDefinition {\n id: WorkflowId;\n name: string;\n nodes: NodeDefinition[];\n edges: Edge[];\n /**\n * Optional metadata: which nodes are connection-owned children (e.g. AI agent `llm` / `tools` slots).\n * When omitted, all nodes in {@link nodes} are treated as executable for topology.\n */\n readonly connections?: ReadonlyArray<WorkflowNodeConnection>;\n /** Directory + file-stem path under a workflow discovery root (for UI grouping only). */\n discoveryPathSegments?: readonly string[];\n /** Retention for run JSON and binaries (seconds). Host/env may supply defaults when omitted. */\n readonly prunePolicy?: WorkflowPrunePolicySpec;\n /** Whether to keep run data after completion. Host/env may supply defaults when omitted. */\n readonly storagePolicy?: WorkflowStoragePolicySpec;\n /** Invoked after a node fails permanently (retries exhausted) and node error handler did not recover. */\n readonly workflowErrorHandler?: WorkflowErrorHandlerSpec;\n}\n\nexport interface WorkflowGraph {\n next(nodeId: NodeId, output: OutputPortKey): ReadonlyArray<Readonly<{ nodeId: NodeId; input: InputPortKey }>>;\n}\n\nexport interface WorkflowGraphFactory {\n create(def: WorkflowDefinition): WorkflowGraph;\n}\n\nexport interface NodeConfigBase {\n readonly kind: NodeKind;\n readonly type: TypeToken<unknown>;\n readonly name?: string;\n readonly id?: NodeId;\n readonly icon?: string;\n readonly execution?: Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }>;\n /** In-process execute retries (runnable nodes). Triggers typically omit this. */\n readonly retryPolicy?: RetryPolicySpec;\n /** Recover from execute failures; return outputs to continue, or rethrow to fail the node. */\n readonly nodeErrorHandler?: NodeErrorHandlerSpec;\n /**\n * When true, edges carrying zero items on an output port still schedule single-input downstream nodes.\n * Decided from the **source** node that produced the (empty) output. Default (false/undefined): empty\n * main batches skip downstream execution and propagate the empty path.\n */\n readonly continueWhenEmptyOutput?: boolean;\n /**\n * Declared I/O port names for canvas authoring (unioned with ports inferred from edges).\n * Use for dynamic routers (Switch) and future error ports.\n */\n readonly declaredOutputPorts?: ReadonlyArray<OutputPortKey>;\n readonly declaredInputPorts?: ReadonlyArray<InputPortKey>;\n getCredentialRequirements?(): ReadonlyArray<CredentialRequirement>;\n /**\n * Marker: this node emits {@link import(\"./assertionTypes\").AssertionResult}-shaped items on its\n * `main` port. The TestSuiteOrchestrator (and host-side TestAssertionPersister) listen for\n * `nodeCompleted` events from nodes with this flag set, and persist their output items as\n * TestAssertion records (only when the run carries a `testContext`). Set on assertion node\n * configs (e.g. `AssertionNodeConfig`, `StringEqualsAssertionNodeConfig`).\n */\n readonly emitsAssertions?: true;\n /**\n * Static configuration summary surfaced in the workflow inspector — the design-time\n * \"what does this node do\" panel that renders before any run telemetry exists.\n *\n * Return 2–6 short label/value pairs derived from this config (method + url for an HTTP\n * call, model + tool list for an agent, schedule + timezone for a cron trigger, etc.).\n * Values are truncated by the UI; aim for one line each. Return `undefined` to opt out\n * — the inspector hides the section when no rows are produced.\n *\n * Implement on the config class instance so the function can read sibling config fields.\n * `defineNode({ inspectorSummary })` plumbs through to this.\n */\n inspectorSummary?(): ReadonlyArray<NodeInspectorSummaryRow> | undefined;\n}\n\n/**\n * One row of a node's static configuration summary. See {@link NodeConfigBase.inspectorSummary}.\n */\nexport interface NodeInspectorSummaryRow {\n readonly label: string;\n readonly value: string;\n}\n\nexport declare const runnableNodeInputType: unique symbol;\nexport declare const runnableNodeOutputType: unique symbol;\nexport declare const triggerNodeOutputType: unique symbol;\n\n/**\n * Runnable node: **`TInputJson`** is what **`inputSchema`** validates on **`item.json`** (the wire payload).\n * **`TOutputJson`** is emitted `item.json` on outputs.\n */\nexport interface RunnableNodeConfig<TInputJson = unknown, TOutputJson = unknown> extends NodeConfigBase {\n readonly kind: \"node\";\n readonly [runnableNodeInputType]?: TInputJson;\n readonly [runnableNodeOutputType]?: TOutputJson;\n /**\n * Optional Zod input contract for {@link RunnableNode} when not set on the node class.\n * Resolution order: node instance `inputSchema`, then config `inputSchema`, then `z.unknown()`.\n */\n readonly inputSchema?: ZodType<TInputJson>;\n /**\n * When an activation receives **zero** input items, the engine normally runs `execute` zero times.\n * Set to **`runOnce`** to run `execute` once with an empty `items` batch (and a synthetic wire item for schema parsing).\n * Used by batch-style callback nodes (built-in `Callback`) so `callback([], ctx)` still runs.\n */\n readonly emptyBatchExecution?: \"skip\" | \"runOnce\";\n}\n\nexport declare const triggerNodeSetupStateType: unique symbol;\n\nexport interface TriggerNodeConfig<\n TOutputJson = unknown,\n TSetupState extends JsonValue | undefined = undefined,\n> extends NodeConfigBase {\n readonly kind: \"trigger\";\n readonly [triggerNodeOutputType]?: TOutputJson;\n readonly [triggerNodeSetupStateType]?: TSetupState;\n /**\n * Distinguishes triggers driven by the live activation policy (webhooks, cron, polling) from\n * triggers driven only by the {@link TestSuiteOrchestrator}. `WorkflowActivation` skips\n * `\"test\"` triggers; the orchestrator skips `\"live\"` triggers. Defaults to `\"live\"` when omitted.\n */\n readonly triggerKind?: \"live\" | \"test\";\n}\n\nexport type RunnableNodeInputJson<TConfig extends RunnableNodeConfig<any, any>> =\n TConfig extends RunnableNodeConfig<infer TInputJson, any> ? TInputJson : never;\n\nexport type RunnableNodeOutputJson<TConfig extends RunnableNodeConfig<any, any>> =\n TConfig extends RunnableNodeConfig<any, infer TOutputJson> ? TOutputJson : never;\n\nexport type TriggerNodeOutputJson<TConfig extends TriggerNodeConfig<any, any>> =\n TConfig extends TriggerNodeConfig<infer TOutputJson, any> ? TOutputJson : never;\n\nexport type TriggerNodeSetupState<TConfig extends TriggerNodeConfig<any, any>> =\n TConfig extends TriggerNodeConfig<any, infer TSetupState> ? TSetupState : never;\n\nexport interface NodeDefinition {\n id: NodeId;\n kind: NodeKind;\n type: TypeToken<unknown>;\n name?: string;\n config: NodeConfigBase;\n}\n\nexport interface NodeRef {\n id: NodeId;\n kind: NodeKind;\n name?: string;\n}\n\nexport function nodeRef<TJson>(nodeId: NodeId): NodeIdRef<TJson> {\n return nodeId as NodeIdRef<TJson>;\n}\n\nexport type PairedItemRef = Readonly<{ nodeId: NodeId; output: OutputPortKey; itemIndex: number }>;\n\nexport type BinaryPreviewKind = \"image\" | \"audio\" | \"video\" | \"download\";\n\nexport type BinaryAttachment = Readonly<{\n id: string;\n storageKey: string;\n mimeType: string;\n size: number;\n storageDriver: string;\n previewKind: BinaryPreviewKind;\n createdAt: string;\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n activationId: NodeActivationId;\n filename?: string;\n sha256?: string;\n}>;\n\nexport type ItemBinary = Readonly<Record<string, BinaryAttachment>>;\n\nexport type Item<TJson = unknown> = Readonly<{\n json: TJson;\n binary?: ItemBinary;\n meta?: Readonly<Record<string, unknown>>;\n paired?: ReadonlyArray<PairedItemRef>;\n}>;\n\nexport type Items<TJson = unknown> = ReadonlyArray<Item<TJson>>;\n\nexport type NodeOutputs = Partial<Record<OutputPortKey, Items>>;\n\nexport type RunId = string;\nexport type NodeActivationId = string;\n/**\n * One per-item iteration of a runnable node's execute loop. Refines `NodeActivationId` for\n * per-item connection invocations and telemetry. Undefined when the executing node is a batch\n * node or trigger that does not iterate items.\n */\nexport type NodeIterationId = string;\n\nexport interface ParentExecutionRef {\n runId: RunId;\n workflowId: WorkflowId;\n nodeId: NodeId;\n /** Subworkflow depth of the **spawning** run (0 = root). Passed when starting a child run. */\n subworkflowDepth?: number;\n /** Effective max node activations from the parent run (propagated to child policy merge). */\n engineMaxNodeActivations?: number;\n /** Effective max subworkflow depth from the parent run (propagated to child policy merge). */\n engineMaxSubworkflowDepth?: number;\n /**\n * Test-suite linkage inherited by the child subworkflow run. Set by whichever node\n * spawns the subworkflow when its own `ctx.testContext` is present, so assertions\n * emitted inside a subworkflow land under the correct parent test case.\n */\n testContext?: import(\"./runTypes\").RunTestContext;\n}\n\nexport interface RunDataSnapshot {\n getOutputs(nodeId: NodeId): NodeOutputs | undefined;\n getOutputItems<TJson = unknown>(nodeId: NodeId | NodeIdRef<TJson>, output?: OutputPortKey): Items<TJson>;\n getOutputItem<TJson = unknown>(\n nodeId: NodeId | NodeIdRef<TJson>,\n itemIndex: number,\n output?: OutputPortKey,\n ): Item<TJson> | undefined;\n}\n\nexport interface MutableRunData extends RunDataSnapshot {\n setOutputs(nodeId: NodeId, outputs: NodeOutputs): void;\n dump(): Record<NodeId, NodeOutputs>;\n}\n\nexport interface RunDataFactory {\n create(initial?: Record<NodeId, NodeOutputs>): MutableRunData;\n}\n\nexport interface RunIdFactory {\n makeRunId(): RunId;\n}\n\nexport interface ActivationIdFactory {\n makeActivationId(): NodeActivationId;\n}\n\nexport type UpstreamRefPlaceholder = `$${number}`;\nexport const branchRef = (index: number) => `$${index}` as UpstreamRefPlaceholder;\n\nexport type ExecutionMode = \"local\" | \"worker\";\n\nexport interface NodeSchedulerDecision {\n mode: ExecutionMode;\n queue?: string;\n}\n\nexport interface NodeOffloadPolicy {\n decide(args: { workflowId: WorkflowId; nodeId: NodeId; config: NodeConfigBase }): NodeSchedulerDecision;\n}\n\n/** Whether to persist run execution data after the workflow finishes. */\nexport type WorkflowStoragePolicyMode = \"ALL\" | \"SUCCESS\" | \"ERROR\" | \"NEVER\";\n\nexport type WorkflowStoragePolicySpec = WorkflowStoragePolicyMode | TypeToken<WorkflowStoragePolicyResolver>;\n\nexport interface WorkflowStoragePolicyResolver {\n shouldPersist(args: WorkflowStoragePolicyDecisionArgs): boolean | Promise<boolean>;\n}\n\nexport interface WorkflowStoragePolicyDecisionArgs {\n readonly runId: RunId;\n readonly workflowId: WorkflowId;\n readonly workflow: WorkflowDefinition;\n readonly finalStatus: \"completed\" | \"failed\";\n readonly startedAt: string;\n readonly finishedAt: string;\n}\n\nexport interface WorkflowPrunePolicySpec {\n readonly runDataRetentionSeconds?: number;\n readonly binaryRetentionSeconds?: number;\n readonly telemetrySpanRetentionSeconds?: number;\n readonly telemetryArtifactRetentionSeconds?: number;\n readonly telemetryMetricRetentionSeconds?: number;\n}\n\nexport interface PersistedRunPolicySnapshot {\n readonly retentionSeconds?: number;\n readonly binaryRetentionSeconds?: number;\n readonly telemetrySpanRetentionSeconds?: number;\n readonly telemetryArtifactRetentionSeconds?: number;\n readonly telemetryMetricRetentionSeconds?: number;\n readonly storagePolicy: WorkflowStoragePolicyMode;\n}\n\nexport interface WorkflowErrorHandler {\n onError(ctx: WorkflowErrorContext): void | Promise<void>;\n}\n\nexport interface WorkflowErrorContext {\n readonly runId: RunId;\n readonly workflowId: WorkflowId;\n readonly workflow: WorkflowDefinition;\n readonly failedNodeId: NodeId;\n readonly error: Error;\n readonly startedAt: string;\n readonly finishedAt: string;\n}\n\nexport type WorkflowErrorHandlerSpec = TypeToken<WorkflowErrorHandler> | WorkflowErrorHandler;\n\nexport interface NodeErrorHandlerArgs<TConfig extends NodeConfigBase = NodeConfigBase> {\n readonly kind: \"single\" | \"multi\";\n readonly items: Items;\n readonly inputsByPort: Readonly<Record<InputPortKey, Items>> | undefined;\n readonly ctx: import(\"./runtimeTypes\").NodeExecutionContext<TConfig>;\n readonly error: Error;\n}\n\nexport interface NodeErrorHandler {\n handle<TConfig extends NodeConfigBase>(args: NodeErrorHandlerArgs<TConfig>): Promise<NodeOutputs>;\n}\n\nexport type NodeErrorHandlerSpec = TypeToken<NodeErrorHandler> | NodeErrorHandler;\n\n/** Runtime defaults when workflow omits prune/storage fields (typically from host env). */\nexport interface WorkflowPolicyRuntimeDefaults {\n readonly retentionSeconds?: number;\n readonly binaryRetentionSeconds?: number;\n readonly telemetrySpanRetentionSeconds?: number;\n readonly telemetryArtifactRetentionSeconds?: number;\n readonly telemetryMetricRetentionSeconds?: number;\n readonly storagePolicy?: WorkflowStoragePolicyMode;\n}\n","import type { TypeToken } from \"./index\";\nimport type { RunEventBus } from \"../events/runEvents\";\nimport type { EngineExecutionLimitsPolicy } from \"../policies/executionLimits/EngineExecutionLimitsPolicy\";\nimport type { AgentMcpIntegration } from \"../contracts/agentMcpTypes\";\nimport type {\n ActivationIdFactory,\n BinaryStorage,\n CredentialSessionService,\n CredentialTypeRegistry,\n ExecutionContextFactory,\n LiveWorkflowRepository,\n NodeActivationScheduler,\n NodeResolver,\n PersistedWorkflowTokenRegistryLike,\n RunDataFactory,\n RunIdFactory,\n TriggerSetupStateRepository,\n WorkflowExecutionRepository,\n WorkflowNodeInstanceFactory,\n WorkflowActivationPolicy,\n WorkflowRepository,\n WorkflowRunnerService,\n} from \"../types\";\n\nexport const CoreTokens = {\n PersistedWorkflowTokenRegistry: Symbol.for(\n \"codemation.core.PersistedWorkflowTokenRegistry\",\n ) as TypeToken<PersistedWorkflowTokenRegistryLike>,\n CredentialSessionService: Symbol.for(\n \"codemation.core.CredentialSessionService\",\n ) as TypeToken<CredentialSessionService>,\n CredentialTypeRegistry: Symbol.for(\"codemation.core.CredentialTypeRegistry\") as TypeToken<CredentialTypeRegistry>,\n WorkflowRunnerService: Symbol.for(\"codemation.core.WorkflowRunnerService\") as TypeToken<WorkflowRunnerService>,\n LiveWorkflowRepository: Symbol.for(\"codemation.core.LiveWorkflowRepository\") as TypeToken<LiveWorkflowRepository>,\n WorkflowRepository: Symbol.for(\"codemation.core.WorkflowRepository\") as TypeToken<WorkflowRepository>,\n NodeResolver: Symbol.for(\"codemation.core.NodeResolver\") as TypeToken<NodeResolver>,\n WorkflowNodeInstanceFactory: Symbol.for(\n \"codemation.core.WorkflowNodeInstanceFactory\",\n ) as TypeToken<WorkflowNodeInstanceFactory>,\n RunIdFactory: Symbol.for(\"codemation.core.RunIdFactory\") as TypeToken<RunIdFactory>,\n ActivationIdFactory: Symbol.for(\"codemation.core.ActivationIdFactory\") as TypeToken<ActivationIdFactory>,\n WorkflowExecutionRepository: Symbol.for(\n \"codemation.core.WorkflowExecutionRepository\",\n ) as TypeToken<WorkflowExecutionRepository>,\n TriggerSetupStateRepository: Symbol.for(\n \"codemation.core.TriggerSetupStateRepository\",\n ) as TypeToken<TriggerSetupStateRepository>,\n NodeActivationScheduler: Symbol.for(\"codemation.core.NodeActivationScheduler\") as TypeToken<NodeActivationScheduler>,\n RunDataFactory: Symbol.for(\"codemation.core.RunDataFactory\") as TypeToken<RunDataFactory>,\n ExecutionContextFactory: Symbol.for(\"codemation.core.ExecutionContextFactory\") as TypeToken<ExecutionContextFactory>,\n RunEventBus: Symbol.for(\"codemation.core.RunEventBus\") as TypeToken<RunEventBus>,\n BinaryStorage: Symbol.for(\"codemation.core.BinaryStorage\") as TypeToken<BinaryStorage>,\n WebhookBasePath: Symbol.for(\"codemation.core.WebhookBasePath\") as TypeToken<string>,\n /** Engine execution limits (defaults + optional host overrides). Consumers may bind a custom instance to override. */\n EngineExecutionLimitsPolicy: Symbol.for(\n \"codemation.core.EngineExecutionLimitsPolicy\",\n ) as TypeToken<EngineExecutionLimitsPolicy>,\n WorkflowActivationPolicy: Symbol.for(\n \"codemation.core.WorkflowActivationPolicy\",\n ) as TypeToken<WorkflowActivationPolicy>,\n /**\n * Optional. When registered, AIAgentNode uses it to resolve mcpServers bindings,\n * validate scopes, open pool connections, and prepare the MCP ToolSet map.\n * Not registered in the default core bootstrap — the host provides the implementation.\n */\n AgentMcpIntegration: Symbol.for(\"codemation.core.AgentMcpIntegration\") as TypeToken<AgentMcpIntegration>,\n} as const;\n"],"mappings":"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"}
|