@ai-setting/roy-agent-core 1.5.14-test → 1.5.15-test

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/package.json +1 -1
  2. package/dist/config/index.d.ts +0 -1250
  3. package/dist/config/index.js +0 -32
  4. package/dist/env/agent/index.d.ts +0 -2279
  5. package/dist/env/agent/index.js +0 -24
  6. package/dist/env/commands/index.d.ts +0 -1131
  7. package/dist/env/commands/index.js +0 -14
  8. package/dist/env/debug/formatters/index.d.ts +0 -236
  9. package/dist/env/debug/formatters/index.js +0 -11
  10. package/dist/env/debug/index.d.ts +0 -1652
  11. package/dist/env/debug/index.js +0 -26
  12. package/dist/env/hook/index.d.ts +0 -279
  13. package/dist/env/hook/index.js +0 -29
  14. package/dist/env/index.d.ts +0 -3481
  15. package/dist/env/index.js +0 -82
  16. package/dist/env/llm/index.d.ts +0 -1760
  17. package/dist/env/llm/index.js +0 -40
  18. package/dist/env/log-trace/index.d.ts +0 -1574
  19. package/dist/env/log-trace/index.js +0 -83
  20. package/dist/env/mcp/index.d.ts +0 -1331
  21. package/dist/env/mcp/index.js +0 -39
  22. package/dist/env/mcp/tool/index.d.ts +0 -183
  23. package/dist/env/mcp/tool/index.js +0 -14
  24. package/dist/env/memory/built-in/index.d.ts +0 -232
  25. package/dist/env/memory/built-in/index.js +0 -11
  26. package/dist/env/memory/index.d.ts +0 -1799
  27. package/dist/env/memory/index.js +0 -56
  28. package/dist/env/memory/plugin/index.d.ts +0 -747
  29. package/dist/env/memory/plugin/index.js +0 -36
  30. package/dist/env/prompt/index.d.ts +0 -1164
  31. package/dist/env/prompt/index.js +0 -20
  32. package/dist/env/session/index.d.ts +0 -1908
  33. package/dist/env/session/index.js +0 -25
  34. package/dist/env/session/storage/index.d.ts +0 -564
  35. package/dist/env/session/storage/index.js +0 -18
  36. package/dist/env/skill/index.d.ts +0 -1266
  37. package/dist/env/skill/index.js +0 -34
  38. package/dist/env/skill/tool/index.d.ts +0 -193
  39. package/dist/env/skill/tool/index.js +0 -9
  40. package/dist/env/task/delegate/index.d.ts +0 -1612
  41. package/dist/env/task/delegate/index.js +0 -18
  42. package/dist/env/task/events/index.d.ts +0 -171
  43. package/dist/env/task/events/index.js +0 -7
  44. package/dist/env/task/hooks/index.d.ts +0 -624
  45. package/dist/env/task/hooks/index.js +0 -7
  46. package/dist/env/task/index.d.ts +0 -1553
  47. package/dist/env/task/index.js +0 -34
  48. package/dist/env/task/plugins/index.d.ts +0 -466
  49. package/dist/env/task/plugins/index.js +0 -23
  50. package/dist/env/task/storage/index.d.ts +0 -241
  51. package/dist/env/task/storage/index.js +0 -14
  52. package/dist/env/task/tools/index.d.ts +0 -1485
  53. package/dist/env/task/tools/index.js +0 -17
  54. package/dist/env/task/tools/operation/index.d.ts +0 -1484
  55. package/dist/env/task/tools/operation/index.js +0 -15
  56. package/dist/env/tool/built-in/index.d.ts +0 -218
  57. package/dist/env/tool/built-in/index.js +0 -25
  58. package/dist/env/tool/index.d.ts +0 -1396
  59. package/dist/env/tool/index.js +0 -39
  60. package/dist/env/workflow/decorators/index.d.ts +0 -2161
  61. package/dist/env/workflow/decorators/index.js +0 -27
  62. package/dist/env/workflow/engine/index.d.ts +0 -3453
  63. package/dist/env/workflow/engine/index.js +0 -28
  64. package/dist/env/workflow/index.d.ts +0 -3546
  65. package/dist/env/workflow/index.js +0 -136
  66. package/dist/env/workflow/nodes/index.d.ts +0 -2092
  67. package/dist/env/workflow/nodes/index.js +0 -19
  68. package/dist/env/workflow/service/index.d.ts +0 -227
  69. package/dist/env/workflow/service/index.js +0 -13
  70. package/dist/env/workflow/storage/index.d.ts +0 -165
  71. package/dist/env/workflow/storage/index.js +0 -27
  72. package/dist/env/workflow/tools/index.d.ts +0 -416
  73. package/dist/env/workflow/tools/index.js +0 -159
  74. package/dist/env/workflow/types/index.d.ts +0 -2255
  75. package/dist/env/workflow/types/index.js +0 -98
  76. package/dist/env/workflow/utils/index.d.ts +0 -2031
  77. package/dist/env/workflow/utils/index.js +0 -637
  78. package/dist/index.d.ts +0 -7858
  79. package/dist/index.js +0 -399
  80. package/dist/shared/@ai-setting/roy-agent-core-0rtxwr28.js +0 -258
  81. package/dist/shared/@ai-setting/roy-agent-core-0vbdz0x7.js +0 -36
  82. package/dist/shared/@ai-setting/roy-agent-core-1akcqxj9.js +0 -349
  83. package/dist/shared/@ai-setting/roy-agent-core-1ce3fqrk.js +0 -117
  84. package/dist/shared/@ai-setting/roy-agent-core-2dhd60aw.js +0 -11
  85. package/dist/shared/@ai-setting/roy-agent-core-3jywqmdd.js +0 -393
  86. package/dist/shared/@ai-setting/roy-agent-core-3rr5k71j.js +0 -200
  87. package/dist/shared/@ai-setting/roy-agent-core-44hnfb02.js +0 -299
  88. package/dist/shared/@ai-setting/roy-agent-core-4t40mkpv.js +0 -206
  89. package/dist/shared/@ai-setting/roy-agent-core-4txzpsbt.js +0 -393
  90. package/dist/shared/@ai-setting/roy-agent-core-5x94xmt6.js +0 -350
  91. package/dist/shared/@ai-setting/roy-agent-core-69jskqjg.js +0 -180
  92. package/dist/shared/@ai-setting/roy-agent-core-6kvtahqv.js +0 -408
  93. package/dist/shared/@ai-setting/roy-agent-core-7fgf85wc.js +0 -284
  94. package/dist/shared/@ai-setting/roy-agent-core-81w1963m.js +0 -762
  95. package/dist/shared/@ai-setting/roy-agent-core-8gxth0eh.js +0 -10
  96. package/dist/shared/@ai-setting/roy-agent-core-92z6t4he.js +0 -14
  97. package/dist/shared/@ai-setting/roy-agent-core-93zfb3r1.js +0 -922
  98. package/dist/shared/@ai-setting/roy-agent-core-9yxb3ty9.js +0 -15
  99. package/dist/shared/@ai-setting/roy-agent-core-b0x5dda6.js +0 -1130
  100. package/dist/shared/@ai-setting/roy-agent-core-bcbqy27c.js +0 -14
  101. package/dist/shared/@ai-setting/roy-agent-core-bvr1761x.js +0 -653
  102. package/dist/shared/@ai-setting/roy-agent-core-ctdhjv68.js +0 -93
  103. package/dist/shared/@ai-setting/roy-agent-core-d7cyjkf7.js +0 -872
  104. package/dist/shared/@ai-setting/roy-agent-core-dh9d7a3m.js +0 -11
  105. package/dist/shared/@ai-setting/roy-agent-core-e25xkv53.js +0 -64
  106. package/dist/shared/@ai-setting/roy-agent-core-eajcvp4e.js +0 -378
  107. package/dist/shared/@ai-setting/roy-agent-core-f7q2x5z6.js +0 -492
  108. package/dist/shared/@ai-setting/roy-agent-core-fs0mn2jk.js +0 -52
  109. package/dist/shared/@ai-setting/roy-agent-core-g1s2h0e5.js +0 -171
  110. package/dist/shared/@ai-setting/roy-agent-core-g99pxzn5.js +0 -862
  111. package/dist/shared/@ai-setting/roy-agent-core-gbqcyegm.js +0 -1387
  112. package/dist/shared/@ai-setting/roy-agent-core-gjq1yk68.js +0 -208
  113. package/dist/shared/@ai-setting/roy-agent-core-gq20wsgv.js +0 -139
  114. package/dist/shared/@ai-setting/roy-agent-core-gwc4h96n.js +0 -534
  115. package/dist/shared/@ai-setting/roy-agent-core-jfh9q2qh.js +0 -204
  116. package/dist/shared/@ai-setting/roy-agent-core-jvatggbb.js +0 -603
  117. package/dist/shared/@ai-setting/roy-agent-core-kkbwepqb.js +0 -97
  118. package/dist/shared/@ai-setting/roy-agent-core-pjr12nnd.js +0 -587
  119. package/dist/shared/@ai-setting/roy-agent-core-psv4v63c.js +0 -176
  120. package/dist/shared/@ai-setting/roy-agent-core-psvxt4c9.js +0 -60
  121. package/dist/shared/@ai-setting/roy-agent-core-qqceba6k.js +0 -442
  122. package/dist/shared/@ai-setting/roy-agent-core-qxhq8ven.js +0 -57
  123. package/dist/shared/@ai-setting/roy-agent-core-qxnbvgwe.js +0 -66
  124. package/dist/shared/@ai-setting/roy-agent-core-r9ezzemr.js +0 -10
  125. package/dist/shared/@ai-setting/roy-agent-core-rhmtwnw1.js +0 -267
  126. package/dist/shared/@ai-setting/roy-agent-core-rvv6ydff.js +0 -584
  127. package/dist/shared/@ai-setting/roy-agent-core-rvxg1wps.js +0 -102
  128. package/dist/shared/@ai-setting/roy-agent-core-satmq6sh.js +0 -549
  129. package/dist/shared/@ai-setting/roy-agent-core-sx7wsvnn.js +0 -15
  130. package/dist/shared/@ai-setting/roy-agent-core-t94ktchq.js +0 -213
  131. package/dist/shared/@ai-setting/roy-agent-core-vf215qfv.js +0 -812
  132. package/dist/shared/@ai-setting/roy-agent-core-vkz81f7v.js +0 -1316
  133. package/dist/shared/@ai-setting/roy-agent-core-vn2bc59q.js +0 -1205
  134. package/dist/shared/@ai-setting/roy-agent-core-wa1kzqky.js +0 -328
  135. package/dist/shared/@ai-setting/roy-agent-core-wft9ra24.js +0 -20
  136. package/dist/shared/@ai-setting/roy-agent-core-wrcy0h6z.js +0 -2098
  137. package/dist/shared/@ai-setting/roy-agent-core-xq8hhqb8.js +0 -419
  138. package/dist/shared/@ai-setting/roy-agent-core-xs5rsgat.js +0 -368
  139. package/dist/shared/@ai-setting/roy-agent-core-zbkpc41z.js +0 -377
  140. package/dist/shared/@ai-setting/roy-agent-core-zgypchmt.js +0 -172
  141. package/dist/shared/@ai-setting/roy-agent-core-zpn0bqa8.js +0 -103
@@ -1,2098 +0,0 @@
1
- import {
2
- AgentComponentAdapter,
3
- init_agent_component_adapter
4
- } from "./roy-agent-core-69jskqjg.js";
5
- import {
6
- SkillNode,
7
- ToolNode,
8
- WorkflowNode,
9
- init_skill_node,
10
- init_tool_node,
11
- init_workflow_node
12
- } from "./roy-agent-core-jvatggbb.js";
13
- import {
14
- createWorkflowEvent,
15
- init_event,
16
- init_types
17
- } from "./roy-agent-core-5x94xmt6.js";
18
- import {
19
- AskUserError,
20
- createNodeInterruptEvent,
21
- init_workflow_hil
22
- } from "./roy-agent-core-e25xkv53.js";
23
- import {
24
- TracedAs,
25
- init_decorator
26
- } from "./roy-agent-core-zgypchmt.js";
27
- import {
28
- createLogger,
29
- init_logger
30
- } from "./roy-agent-core-44hnfb02.js";
31
- import {
32
- __esm,
33
- __export,
34
- __legacyDecorateClassTS,
35
- __require
36
- } from "./roy-agent-core-fs0mn2jk.js";
37
-
38
- // src/env/workflow/engine/event-bus.ts
39
- class EventBus {
40
- handlers = new Map;
41
- wildcardHandlers = new Set;
42
- constructor() {}
43
- on(eventType, handler) {
44
- let handlers = this.handlers.get(eventType);
45
- if (!handlers) {
46
- handlers = new Set;
47
- this.handlers.set(eventType, handlers);
48
- }
49
- handlers.add(handler);
50
- return () => this.off(eventType, handler);
51
- }
52
- once(eventType, handler) {
53
- let executed = false;
54
- const wrappedHandler = async (event) => {
55
- if (executed) {
56
- return;
57
- }
58
- executed = true;
59
- try {
60
- await handler(event);
61
- } catch (error) {
62
- console.error("Event handler error:", error);
63
- }
64
- this.off(eventType, wrappedHandler);
65
- };
66
- return this.on(eventType, wrappedHandler);
67
- }
68
- off(eventType, handler) {
69
- const handlers = this.handlers.get(eventType);
70
- if (handlers) {
71
- handlers.delete(handler);
72
- if (handlers.size === 0) {
73
- this.handlers.delete(eventType);
74
- }
75
- }
76
- }
77
- onAny(handler) {
78
- this.wildcardHandlers.add(handler);
79
- return () => {
80
- this.wildcardHandlers.delete(handler);
81
- };
82
- }
83
- async publish(event, waitForHandlers = false) {
84
- const handlers = this.handlers.get(event.type);
85
- const handlerPromises = [];
86
- if (handlers) {
87
- for (const handler of handlers) {
88
- const promise = this.executeHandler(handler, event);
89
- handlerPromises.push(promise);
90
- }
91
- }
92
- for (const handler of this.wildcardHandlers) {
93
- const promise = this.executeHandler(handler, event);
94
- handlerPromises.push(promise);
95
- }
96
- if (waitForHandlers && handlerPromises.length > 0) {
97
- await Promise.allSettled(handlerPromises);
98
- }
99
- }
100
- async executeHandler(handler, event) {
101
- try {
102
- await handler(event);
103
- } catch (error) {
104
- console.error("Event handler error:", error);
105
- }
106
- }
107
- clear() {
108
- this.handlers.clear();
109
- this.wildcardHandlers.clear();
110
- }
111
- getStats() {
112
- let totalHandlers = 0;
113
- for (const handlers of this.handlers.values()) {
114
- totalHandlers += handlers.size;
115
- }
116
- totalHandlers += this.wildcardHandlers.size;
117
- return {
118
- eventTypes: this.handlers.size,
119
- wildcardHandlers: this.wildcardHandlers.size,
120
- totalHandlers
121
- };
122
- }
123
- }
124
- var init_event_bus = () => {};
125
-
126
- // src/env/workflow/engine/dag-manager.ts
127
- class DAGManager {
128
- workflow;
129
- nodeMap;
130
- extendedDefinition = null;
131
- cachedAnalysis = null;
132
- constructor(workflow) {
133
- if (!workflow.nodes || workflow.nodes.length === 0) {
134
- throw new Error("At least one node is required");
135
- }
136
- this.workflow = workflow;
137
- this.nodeMap = new Map;
138
- for (const node of workflow.nodes) {
139
- if (node.id === "") {
140
- throw new Error("Node ID cannot be empty");
141
- }
142
- if (this.nodeMap.has(node.id)) {
143
- throw new Error(`Duplicate node ID: ${node.id}`);
144
- }
145
- this.nodeMap.set(node.id, node);
146
- }
147
- }
148
- getExtendedDefinition() {
149
- if (this.extendedDefinition) {
150
- return this.extendedDefinition;
151
- }
152
- const analysis = this.analyze();
153
- this.extendedDefinition = {
154
- ...this.workflow,
155
- computedEntry: analysis.entryNodes,
156
- nodeMap: this.nodeMap,
157
- topologicalOrder: this.getTopologicalOrder()
158
- };
159
- return this.extendedDefinition;
160
- }
161
- analyze() {
162
- if (this.cachedAnalysis) {
163
- return this.cachedAnalysis;
164
- }
165
- const dependencies = this.buildDependenciesMap();
166
- const dependents = this.buildDependentsMap(dependencies);
167
- const entryNodes = this.findEntryNodes(dependencies);
168
- const exitNodes = this.findExitNodes(dependents);
169
- const levels = this.computeLevels(dependencies);
170
- const criticalPath = this.findCriticalPath(levels, dependencies);
171
- this.cachedAnalysis = {
172
- entryNodes,
173
- exitNodes,
174
- levels,
175
- dependencies,
176
- dependents,
177
- criticalPath
178
- };
179
- return this.cachedAnalysis;
180
- }
181
- buildDependenciesMap() {
182
- const dependencies = new Map;
183
- for (const node of this.workflow.nodes) {
184
- const deps = node.depends_on || [];
185
- dependencies.set(node.id, [...deps]);
186
- }
187
- return dependencies;
188
- }
189
- buildDependentsMap(dependencies) {
190
- const dependentsMap = new Map;
191
- for (const nodeId of dependencies.keys()) {
192
- dependentsMap.set(nodeId, []);
193
- }
194
- for (const [nodeId, deps] of dependencies.entries()) {
195
- for (const dep of deps) {
196
- const nodeDependents = dependentsMap.get(dep) || [];
197
- nodeDependents.push(nodeId);
198
- dependentsMap.set(dep, nodeDependents);
199
- }
200
- }
201
- return dependentsMap;
202
- }
203
- findEntryNodes(dependencies) {
204
- const entryNodes = [];
205
- for (const [nodeId, deps] of dependencies.entries()) {
206
- if (deps.length === 0) {
207
- entryNodes.push(nodeId);
208
- }
209
- }
210
- return entryNodes;
211
- }
212
- findExitNodes(dependents) {
213
- const exitNodes = [];
214
- for (const [nodeId, deps] of dependents.entries()) {
215
- if (deps.length === 0) {
216
- exitNodes.push(nodeId);
217
- }
218
- }
219
- return exitNodes;
220
- }
221
- computeLevels(dependencies) {
222
- const levels = [];
223
- const assigned = new Set;
224
- const nodeLevels = new Map;
225
- const dependentsMap = this.buildDependentsMap(dependencies);
226
- const entryNodes = this.findEntryNodes(dependencies);
227
- const queue = [];
228
- for (const entry of entryNodes) {
229
- queue.push({ nodeId: entry, level: 0 });
230
- nodeLevels.set(entry, 0);
231
- }
232
- while (queue.length > 0) {
233
- const { nodeId, level } = queue.shift();
234
- if (assigned.has(nodeId)) {
235
- const currentLevel = nodeLevels.get(nodeId) || 0;
236
- if (level > currentLevel) {
237
- nodeLevels.set(nodeId, level);
238
- }
239
- continue;
240
- }
241
- assigned.add(nodeId);
242
- nodeLevels.set(nodeId, level);
243
- const dependentsOfNode = dependentsMap.get(nodeId) || [];
244
- for (const dependent of dependentsOfNode) {
245
- if (!assigned.has(dependent)) {
246
- queue.push({ nodeId: dependent, level: level + 1 });
247
- }
248
- }
249
- }
250
- for (const nodeId of dependencies.keys()) {
251
- if (!nodeLevels.has(nodeId)) {
252
- nodeLevels.set(nodeId, 0);
253
- }
254
- }
255
- const maxLevel = Math.max(...nodeLevels.values(), 0);
256
- for (let i = 0;i <= maxLevel; i++) {
257
- levels.push([]);
258
- }
259
- for (const [nodeId, level] of nodeLevels.entries()) {
260
- levels[level].push(nodeId);
261
- }
262
- return levels;
263
- }
264
- findCriticalPath(levels, dependencies) {
265
- if (levels.length === 0) {
266
- return [];
267
- }
268
- const longestPath = new Map;
269
- const allNodes = [];
270
- for (const level of levels) {
271
- allNodes.push(...level);
272
- }
273
- for (const nodeId of allNodes) {
274
- const deps = dependencies.get(nodeId) || [];
275
- if (deps.length === 0) {
276
- longestPath.set(nodeId, { length: 1, path: [nodeId] });
277
- } else {
278
- let maxLength2 = 0;
279
- let maxPath = [];
280
- for (const dep of deps) {
281
- const depInfo = longestPath.get(dep);
282
- if (depInfo && depInfo.length > maxLength2) {
283
- maxLength2 = depInfo.length;
284
- maxPath = depInfo.path;
285
- }
286
- }
287
- longestPath.set(nodeId, {
288
- length: maxLength2 + 1,
289
- path: [...maxPath, nodeId]
290
- });
291
- }
292
- }
293
- let maxLength = 0;
294
- let criticalPath = [];
295
- for (const [, info] of longestPath.entries()) {
296
- if (info.length > maxLength) {
297
- maxLength = info.length;
298
- criticalPath = info.path;
299
- }
300
- }
301
- return criticalPath;
302
- }
303
- getTopologicalOrder() {
304
- const dependencies = this.buildDependenciesMap();
305
- const dependents = this.buildDependentsMap(dependencies);
306
- const inDegree = new Map;
307
- for (const nodeId of dependencies.keys()) {
308
- inDegree.set(nodeId, dependencies.get(nodeId)?.length || 0);
309
- }
310
- const queue = [];
311
- for (const [nodeId, degree] of inDegree.entries()) {
312
- if (degree === 0) {
313
- queue.push(nodeId);
314
- }
315
- }
316
- const result = [];
317
- while (queue.length > 0) {
318
- const nodeId = queue.shift();
319
- result.push(nodeId);
320
- const nodeDependents = dependents.get(nodeId) || [];
321
- for (const dependent of nodeDependents) {
322
- const currentDegree = inDegree.get(dependent) || 0;
323
- inDegree.set(dependent, currentDegree - 1);
324
- if (currentDegree - 1 === 0) {
325
- queue.push(dependent);
326
- }
327
- }
328
- }
329
- return result;
330
- }
331
- getReadyNodes(completedNodes) {
332
- const dependencies = this.buildDependenciesMap();
333
- const ready = [];
334
- for (const nodeId of dependencies.keys()) {
335
- if (completedNodes.has(nodeId)) {
336
- continue;
337
- }
338
- if (this.areDependenciesMet(nodeId, completedNodes)) {
339
- ready.push(nodeId);
340
- }
341
- }
342
- return ready;
343
- }
344
- areDependenciesMet(nodeId, completedNodes) {
345
- const node = this.nodeMap.get(nodeId);
346
- if (!node) {
347
- return false;
348
- }
349
- const dependencies = node.depends_on || [];
350
- for (const dep of dependencies) {
351
- if (!completedNodes.has(dep)) {
352
- return false;
353
- }
354
- }
355
- return true;
356
- }
357
- isCyclic() {
358
- const dependencies = this.buildDependenciesMap();
359
- const order = this.getTopologicalOrderInternal(dependencies);
360
- return order.length !== this.workflow.nodes.length;
361
- }
362
- getTopologicalOrderInternal(dependencies) {
363
- const dependents = this.buildDependentsMap(dependencies);
364
- const inDegree = new Map;
365
- for (const nodeId of dependencies.keys()) {
366
- inDegree.set(nodeId, dependencies.get(nodeId)?.length || 0);
367
- }
368
- const queue = [];
369
- for (const [nodeId, degree] of inDegree.entries()) {
370
- if (degree === 0) {
371
- queue.push(nodeId);
372
- }
373
- }
374
- const result = [];
375
- while (queue.length > 0) {
376
- const nodeId = queue.shift();
377
- result.push(nodeId);
378
- const nodeDependents = dependents.get(nodeId) || [];
379
- for (const dependent of nodeDependents) {
380
- const currentDegree = inDegree.get(dependent) || 0;
381
- inDegree.set(dependent, currentDegree - 1);
382
- if (currentDegree - 1 === 0) {
383
- queue.push(dependent);
384
- }
385
- }
386
- }
387
- return result;
388
- }
389
- validate() {
390
- const errors = [];
391
- const nodeIds = new Set;
392
- for (const node of this.workflow.nodes) {
393
- if (node.id === "") {
394
- errors.push("Node ID cannot be empty");
395
- continue;
396
- }
397
- if (nodeIds.has(node.id)) {
398
- errors.push(`Duplicate node ID: ${node.id}`);
399
- }
400
- nodeIds.add(node.id);
401
- }
402
- for (const node of this.workflow.nodes) {
403
- const deps = node.depends_on || [];
404
- for (const dep of deps) {
405
- if (!nodeIds.has(dep)) {
406
- errors.push(`Node '${node.id}' depends on non-existent node '${dep}'`);
407
- }
408
- }
409
- }
410
- if (this.isCyclic()) {
411
- errors.push("Workflow contains a cycle");
412
- }
413
- return {
414
- valid: errors.length === 0,
415
- errors
416
- };
417
- }
418
- addNode(node) {
419
- if (!node.id || node.id.trim() === "") {
420
- throw new Error("Node ID cannot be empty");
421
- }
422
- if (this.nodeMap.has(node.id)) {
423
- throw new Error(`Node with ID '${node.id}' already exists`);
424
- }
425
- const deps = node.depends_on || [];
426
- for (const dep of deps) {
427
- if (!this.nodeMap.has(dep)) {
428
- throw new Error(`Cannot add node '${node.id}': depends on non-existent node '${dep}'`);
429
- }
430
- }
431
- const originalNodes = [...this.workflow.nodes];
432
- this.workflow.nodes.push(node);
433
- if (this.isCyclic()) {
434
- this.workflow.nodes = originalNodes;
435
- throw new Error(`Cannot add node '${node.id}': would create a cycle in the workflow`);
436
- }
437
- this.nodeMap.set(node.id, node);
438
- this.cachedAnalysis = null;
439
- this.extendedDefinition = null;
440
- }
441
- removeNode(nodeId) {
442
- if (!this.nodeMap.has(nodeId)) {
443
- throw new Error(`Node '${nodeId}' does not exist`);
444
- }
445
- const dependents = this.getDependents(nodeId);
446
- if (dependents.length > 0) {
447
- throw new Error(`Cannot remove node '${nodeId}': other nodes depend on it: ${dependents.join(", ")}`);
448
- }
449
- this.workflow.nodes = this.workflow.nodes.filter((n) => n.id !== nodeId);
450
- this.nodeMap.delete(nodeId);
451
- this.cachedAnalysis = null;
452
- this.extendedDefinition = null;
453
- }
454
- getDependents(nodeId) {
455
- const analysis = this.analyze();
456
- return analysis.dependents.get(nodeId) || [];
457
- }
458
- getDefinition() {
459
- return this.workflow;
460
- }
461
- getNode(nodeId) {
462
- return this.nodeMap.get(nodeId);
463
- }
464
- getNodeIds() {
465
- return Array.from(this.nodeMap.keys());
466
- }
467
- getNodeCount() {
468
- return this.nodeMap.size;
469
- }
470
- }
471
- var init_dag_manager = () => {};
472
-
473
- // src/env/workflow/engine/scheduler.ts
474
- class Scheduler {
475
- dagManager;
476
- options;
477
- pending = new Set;
478
- ready = new Set;
479
- running = new Set;
480
- completed = new Set;
481
- failed = new Set;
482
- skipped = new Set;
483
- constructor(dagManager, options) {
484
- this.dagManager = dagManager;
485
- const parallelLimit = options?.parallelLimit;
486
- this.options = {
487
- parallelLimit: parallelLimit === undefined ? 1 : parallelLimit
488
- };
489
- const analysis = dagManager.analyze();
490
- for (const nodeId of analysis.dependencies.keys()) {
491
- this.pending.add(nodeId);
492
- }
493
- this.updateReadyNodes(new Set);
494
- }
495
- getReadyNodes(completedNodes) {
496
- const allCompleted = new Set(completedNodes);
497
- for (const nodeId of this.completed) {
498
- allCompleted.add(nodeId);
499
- }
500
- const readyFromDag = this.dagManager.getReadyNodes(allCompleted);
501
- const ready = [];
502
- for (const nodeId of readyFromDag) {
503
- const isProcessed = this.running.has(nodeId) || this.completed.has(nodeId) || this.failed.has(nodeId) || this.skipped.has(nodeId);
504
- if (!isProcessed) {
505
- ready.push(nodeId);
506
- }
507
- }
508
- return ready.sort();
509
- }
510
- getRunningCount() {
511
- return this.running.size;
512
- }
513
- canStartMore() {
514
- if (this.options.parallelLimit === null) {
515
- return true;
516
- }
517
- if (this.options.parallelLimit <= 0) {
518
- return false;
519
- }
520
- return this.running.size < this.options.parallelLimit;
521
- }
522
- markStarted(nodeId) {
523
- if (!this.running.has(nodeId)) {
524
- this.running.add(nodeId);
525
- this.ready.delete(nodeId);
526
- this.pending.delete(nodeId);
527
- }
528
- }
529
- isRunning(nodeId) {
530
- return this.running.has(nodeId);
531
- }
532
- isCompleted(nodeId) {
533
- return this.completed.has(nodeId);
534
- }
535
- isFailed(nodeId) {
536
- return this.failed.has(nodeId);
537
- }
538
- isPending(nodeId) {
539
- return this.pending.has(nodeId);
540
- }
541
- isReady(nodeId) {
542
- return this.ready.has(nodeId);
543
- }
544
- markCompleted(nodeId) {
545
- this.running.delete(nodeId);
546
- this.ready.delete(nodeId);
547
- this.pending.delete(nodeId);
548
- this.failed.delete(nodeId);
549
- this.skipped.delete(nodeId);
550
- this.completed.add(nodeId);
551
- }
552
- markFailed(nodeId) {
553
- this.running.delete(nodeId);
554
- this.ready.delete(nodeId);
555
- this.pending.delete(nodeId);
556
- this.completed.delete(nodeId);
557
- this.skipped.delete(nodeId);
558
- this.failed.add(nodeId);
559
- }
560
- markSkipped(nodeId) {
561
- if (this.running.has(nodeId)) {
562
- this.running.delete(nodeId);
563
- }
564
- if (this.ready.has(nodeId)) {
565
- this.ready.delete(nodeId);
566
- }
567
- if (this.pending.has(nodeId)) {
568
- this.pending.delete(nodeId);
569
- }
570
- this.skipped.add(nodeId);
571
- }
572
- reset() {
573
- this.running.clear();
574
- this.completed.clear();
575
- this.failed.clear();
576
- this.skipped.clear();
577
- const analysis = this.dagManager.analyze();
578
- this.pending.clear();
579
- this.ready.clear();
580
- for (const nodeId of analysis.dependencies.keys()) {
581
- this.pending.add(nodeId);
582
- }
583
- this.updateReadyNodes(new Set);
584
- }
585
- getState() {
586
- this.updateReadyNodes(new Set);
587
- return {
588
- pending: Array.from(this.pending).sort(),
589
- ready: Array.from(this.ready).sort(),
590
- running: Array.from(this.running).sort(),
591
- completed: Array.from(this.completed).sort(),
592
- failed: Array.from(this.failed).sort(),
593
- skipped: Array.from(this.skipped).sort()
594
- };
595
- }
596
- updateReadyNodes(completedNodes) {
597
- const allCompleted = new Set(completedNodes);
598
- for (const nodeId of this.completed) {
599
- allCompleted.add(nodeId);
600
- }
601
- const analysis = this.dagManager.analyze();
602
- const allNodeIds = Array.from(analysis.dependencies.keys());
603
- this.ready.clear();
604
- for (const nodeId of allNodeIds) {
605
- if (this.running.has(nodeId) || this.completed.has(nodeId) || this.failed.has(nodeId) || this.skipped.has(nodeId)) {
606
- continue;
607
- }
608
- if (this.dagManager.areDependenciesMet(nodeId, allCompleted)) {
609
- this.ready.add(nodeId);
610
- }
611
- }
612
- }
613
- getParallelLimit() {
614
- return this.options.parallelLimit;
615
- }
616
- setParallelLimit(limit) {
617
- this.options.parallelLimit = limit;
618
- }
619
- }
620
- var init_scheduler = () => {};
621
-
622
- // src/env/workflow/engine/executor.ts
623
- var Executor;
624
- var init_executor = __esm(() => {
625
- init_event();
626
- init_types();
627
- init_decorator();
628
- Executor = class Executor {
629
- nodeRegistry;
630
- eventBus;
631
- options;
632
- sessionComponent;
633
- abortControllers = new Map;
634
- constructor(nodeRegistry, eventBus, options, sessionComponent) {
635
- this.nodeRegistry = nodeRegistry;
636
- this.eventBus = eventBus;
637
- this.options = options;
638
- this.sessionComponent = sessionComponent;
639
- }
640
- async executeNode(definition, context) {
641
- const nodeId = definition.id;
642
- const nodeType = definition.type;
643
- const agentSessionId = context.agentSessionId;
644
- await this.eventBus.publish(createWorkflowEvent("node.started", context.runId, {
645
- node_id: nodeId,
646
- input: context.input
647
- }));
648
- await this.writeNodeStart(context.sessionId, nodeId, nodeType, context.input, agentSessionId);
649
- const abortController = new AbortController;
650
- this.abortControllers.set(nodeId, abortController);
651
- const timeout = definition.timeout ?? this.options.globalTimeout ?? undefined;
652
- const retryConfig = definition.retry ?? this.options.globalRetry;
653
- try {
654
- let result;
655
- if (retryConfig && retryConfig.max_attempts > 1) {
656
- result = await this.executeWithRetry(definition, context, abortController.signal, timeout);
657
- } else {
658
- result = await this.executeWithTimeout(definition, context, abortController.signal, timeout);
659
- }
660
- if (result.error instanceof AskUserError) {
661
- const interruptEvent = createNodeInterruptEvent(context.runId, nodeId, nodeType, result.error.query, result.error.agentSessionId || agentSessionId);
662
- await this.eventBus.publish(interruptEvent);
663
- await this.writeNodeInterrupt(context.sessionId, nodeId, nodeType, result.error.query, result.error.agentSessionId || agentSessionId);
664
- throw result.error;
665
- }
666
- if (result.error) {
667
- const errorMessage = result.error instanceof Error ? result.error.message : String(result.error);
668
- const errorStack = result.error instanceof Error ? result.error.stack : undefined;
669
- await this.eventBus.publish(createWorkflowEvent("node.failed", context.runId, {
670
- node_id: nodeId,
671
- error: {
672
- message: errorMessage,
673
- stack: errorStack
674
- }
675
- }));
676
- await this.writeNodeEnd(context.sessionId, nodeId, nodeType, result.output, errorMessage, result.durationMs ?? 0, agentSessionId);
677
- } else {
678
- await this.eventBus.publish(createWorkflowEvent("node.completed", context.runId, {
679
- node_id: nodeId,
680
- output: result.output,
681
- duration_ms: result.durationMs ?? 0
682
- }));
683
- await this.writeNodeEnd(context.sessionId, nodeId, nodeType, result.output, undefined, result.durationMs ?? 0, agentSessionId);
684
- }
685
- return result;
686
- } finally {
687
- this.abortControllers.delete(nodeId);
688
- }
689
- }
690
- async executeWithTimeout(definition, context, signal, timeout) {
691
- const startTime = Date.now();
692
- const nodeContext = {
693
- runId: context.runId,
694
- workflowName: context.workflowName,
695
- eventBus: this.eventBus,
696
- debug: context.debug
697
- };
698
- const node = this.nodeRegistry.createNode(definition, nodeContext);
699
- if (timeout) {
700
- const timeoutPromise = new Promise((_, reject) => {
701
- const handle = setTimeout(() => {
702
- reject(new Error(`Node execution timeout: ${timeout}ms`));
703
- }, timeout);
704
- signal.addEventListener("abort", () => clearTimeout(handle));
705
- });
706
- try {
707
- const result = await Promise.race([
708
- node.execute(context),
709
- timeoutPromise
710
- ]);
711
- return {
712
- output: result.output,
713
- error: result.error ?? undefined,
714
- durationMs: Date.now() - startTime
715
- };
716
- } catch (error) {
717
- if (error instanceof AskUserError) {
718
- throw error;
719
- }
720
- return {
721
- output: undefined,
722
- error: error instanceof Error ? error : new Error(String(error)),
723
- durationMs: Date.now() - startTime
724
- };
725
- }
726
- } else {
727
- try {
728
- const result = await node.execute(context);
729
- return {
730
- output: result.output,
731
- durationMs: Date.now() - startTime
732
- };
733
- } catch (error) {
734
- if (error instanceof AskUserError) {
735
- throw error;
736
- }
737
- return {
738
- output: undefined,
739
- error: error instanceof Error ? error : new Error(String(error)),
740
- durationMs: Date.now() - startTime
741
- };
742
- }
743
- }
744
- }
745
- async executeWithRetry(definition, context, signal, timeout) {
746
- const retryConfig = definition.retry;
747
- let lastError;
748
- let delay = retryConfig.initial_delay;
749
- for (let attempt = 1;attempt <= retryConfig.max_attempts; attempt++) {
750
- if (signal.aborted) {
751
- return {
752
- output: undefined,
753
- error: new Error("Execution aborted"),
754
- durationMs: 0
755
- };
756
- }
757
- const attemptAbort = new AbortController;
758
- const combinedSignal = this.combineAbortSignals(signal, attemptAbort.signal);
759
- try {
760
- const result = await this.executeWithTimeout(definition, context, combinedSignal, timeout);
761
- if (!result.error) {
762
- return result;
763
- }
764
- lastError = result.error instanceof Error ? result.error : new Error(String(result.error));
765
- } catch (error) {
766
- lastError = error instanceof Error ? error : new Error(String(error));
767
- }
768
- if (attempt < retryConfig.max_attempts) {
769
- await this.sleep(delay);
770
- if (retryConfig.backoff === "exponential") {
771
- delay *= 2;
772
- }
773
- }
774
- }
775
- return {
776
- output: undefined,
777
- error: lastError ?? new Error("Unknown error after retries"),
778
- durationMs: 0
779
- };
780
- }
781
- cancelNode(nodeId) {
782
- const controller = this.abortControllers.get(nodeId);
783
- if (controller) {
784
- controller.abort();
785
- this.abortControllers.delete(nodeId);
786
- }
787
- }
788
- cancelAll() {
789
- for (const controller of this.abortControllers.values()) {
790
- controller.abort();
791
- }
792
- this.abortControllers.clear();
793
- }
794
- combineAbortSignals(signal1, signal2) {
795
- const controller = new AbortController;
796
- signal1.addEventListener("abort", () => controller.abort());
797
- signal2.addEventListener("abort", () => controller.abort());
798
- return controller.signal;
799
- }
800
- sleep(ms) {
801
- return new Promise((resolve) => setTimeout(resolve, ms));
802
- }
803
- async writeNodeStart(sessionId, nodeId, nodeType, input, agentSessionId) {
804
- if (!this.sessionComponent)
805
- return;
806
- const startTime = Date.now();
807
- const part = {
808
- type: "workflow-node-start",
809
- nodeId,
810
- nodeType,
811
- input,
812
- startTime,
813
- ...agentSessionId ? { agentSessionId } : {}
814
- };
815
- const contentSummary = this.summarizeCall(nodeType, nodeId, input);
816
- await this.sessionComponent.addMessage(sessionId, {
817
- role: "workflow.node.start",
818
- content: contentSummary,
819
- parts: [part],
820
- metadata: {
821
- _workflowNodeMetadata: true,
822
- type: "workflow.node.start",
823
- workflowNodeId: nodeId,
824
- workflowNodeType: nodeType,
825
- ...agentSessionId ? { agentSessionId } : {}
826
- }
827
- });
828
- }
829
- summarizeCall(nodeType, nodeId, input) {
830
- if (input === undefined || input === null) {
831
- return `[${nodeType}] ${nodeId} started`;
832
- }
833
- if (typeof input === "object") {
834
- const inputObj = input;
835
- const keys = Object.keys(inputObj);
836
- if (keys.length === 0) {
837
- return `[${nodeType}] ${nodeId} started`;
838
- }
839
- const summary = keys.slice(0, 3).map((k) => `${k}: ${JSON.stringify(inputObj[k])}`).join(", ");
840
- return `[${nodeType}] ${nodeId}: ${summary}`;
841
- }
842
- return `[${nodeType}] ${nodeId}: ${String(input)}`;
843
- }
844
- async writeNodeInterrupt(sessionId, nodeId, nodeType, query, agentSessionId) {
845
- if (!this.sessionComponent)
846
- return;
847
- const timestamp = Date.now();
848
- const part = {
849
- type: "workflow-node-interrupt",
850
- nodeId,
851
- nodeType,
852
- query,
853
- timestamp,
854
- ...agentSessionId ? { agentSessionId } : {}
855
- };
856
- await this.sessionComponent.addMessage(sessionId, {
857
- role: "workflow.node.interrupt",
858
- content: query,
859
- parts: [part],
860
- metadata: {
861
- _workflowNodeMetadata: true,
862
- type: "workflow.node.interrupt",
863
- workflowNodeId: nodeId,
864
- workflowNodeType: nodeType,
865
- query,
866
- agentSessionId
867
- }
868
- });
869
- }
870
- async writeNodeEnd(sessionId, nodeId, nodeType, output, error, durationMs, agentSessionId) {
871
- if (!this.sessionComponent)
872
- return;
873
- const part = {
874
- type: "workflow-node-end",
875
- nodeId,
876
- nodeType,
877
- output,
878
- error,
879
- durationMs,
880
- ...agentSessionId ? { agentSessionId } : {}
881
- };
882
- const contentSummary = this.summarizeResult(nodeId, output, error, durationMs);
883
- await this.sessionComponent.addMessage(sessionId, {
884
- role: "workflow.node.end",
885
- content: contentSummary,
886
- parts: [part],
887
- metadata: {
888
- _workflowNodeMetadata: true,
889
- type: "workflow.node.end",
890
- workflowNodeId: nodeId,
891
- workflowNodeType: nodeType,
892
- success: !error,
893
- ...agentSessionId ? { agentSessionId } : {}
894
- }
895
- });
896
- }
897
- summarizeResult(nodeId, output, error, durationMs) {
898
- if (error) {
899
- return `❌ ${nodeId} failed: ${error}`;
900
- }
901
- if (output === undefined || output === null) {
902
- return `✅ ${nodeId} completed (${durationMs}ms)`;
903
- }
904
- if (typeof output === "object") {
905
- const keys = Object.keys(output);
906
- if (keys.length === 0) {
907
- return `✅ ${nodeId} completed (${durationMs}ms)`;
908
- }
909
- const summary = keys.slice(0, 3).join(", ");
910
- return `✅ ${nodeId}: ${summary} (${durationMs}ms)`;
911
- }
912
- const strOutput = String(output);
913
- const truncated = strOutput.length > 100 ? strOutput.substring(0, 100) + "..." : strOutput;
914
- return `✅ ${nodeId}: ${truncated} (${durationMs}ms)`;
915
- }
916
- async writeNodeResume(sessionId, nodeId, response, agentSessionId) {
917
- if (!this.sessionComponent)
918
- return;
919
- const timestamp = Date.now();
920
- const part = {
921
- type: "workflow-node-resume",
922
- nodeId,
923
- response,
924
- timestamp,
925
- ...agentSessionId ? { agentSessionId } : {}
926
- };
927
- await this.sessionComponent.addMessage(sessionId, {
928
- role: "workflow.node.resume",
929
- content: response,
930
- parts: [part],
931
- metadata: {
932
- _workflowNodeMetadata: true,
933
- type: "workflow.node.resume",
934
- workflowNodeId: nodeId,
935
- ...agentSessionId ? { agentSessionId } : {}
936
- }
937
- });
938
- }
939
- };
940
- __legacyDecorateClassTS([
941
- TracedAs("workflow.executor.executeNode", { recordParams: true, recordResult: true, log: true })
942
- ], Executor.prototype, "executeNode", null);
943
- __legacyDecorateClassTS([
944
- TracedAs("workflow.executor.writeNodeStart", { recordParams: true, recordResult: true, log: true })
945
- ], Executor.prototype, "writeNodeStart", null);
946
- __legacyDecorateClassTS([
947
- TracedAs("workflow.executor.writeNodeInterrupt", { recordParams: true, recordResult: true, log: true })
948
- ], Executor.prototype, "writeNodeInterrupt", null);
949
- __legacyDecorateClassTS([
950
- TracedAs("workflow.executor.writeNodeEnd", { recordParams: true, recordResult: true, log: true })
951
- ], Executor.prototype, "writeNodeEnd", null);
952
- __legacyDecorateClassTS([
953
- TracedAs("workflow.executor.writeNodeResume", { recordParams: true, recordResult: true, log: true })
954
- ], Executor.prototype, "writeNodeResume", null);
955
- });
956
-
957
- // src/env/workflow/nodes/agent-node.ts
958
- var AgentNode;
959
- var init_agent_node = __esm(() => {
960
- init_workflow_hil();
961
- init_decorator();
962
- AgentNode = class AgentNode {
963
- definition;
964
- agentRunner;
965
- type = "agent";
966
- id;
967
- constructor(definition, agentRunner) {
968
- this.definition = definition;
969
- this.agentRunner = agentRunner;
970
- this.id = definition.id;
971
- }
972
- async execute(context) {
973
- const startTime = Date.now();
974
- try {
975
- const config = this.definition.config || {};
976
- const agentType = config.agent_type || "general";
977
- const promptTemplate = config.prompt || "";
978
- const options = config.options || {};
979
- const resolvedPrompt = this.resolveTemplate(promptTemplate, context);
980
- if (this.agentRunner.registerAgent && this.agentRunner.hasAgent) {
981
- if (!this.agentRunner.hasAgent(agentType)) {
982
- this.agentRunner.registerAgent(agentType, {
983
- type: agentType,
984
- systemPrompt: config.system_prompt || `You are a ${agentType} agent.`,
985
- model: options.model
986
- });
987
- }
988
- }
989
- const userQuery = context.input?.userQuery;
990
- let agentSessionId = context.agentSessionId;
991
- if (!agentSessionId && context.sessionComponent) {
992
- agentSessionId = await this.createAgentSubSession(context);
993
- context.agentSessionId = agentSessionId;
994
- }
995
- const agentConfig = {
996
- type: agentType,
997
- prompt: resolvedPrompt,
998
- options: {
999
- timeout: options.timeout,
1000
- model: options.model,
1001
- allowedTools: ["ask_user"]
1002
- },
1003
- workflowHistory: context.workflowHistory,
1004
- nodeId: this.definition.id,
1005
- agentSessionId
1006
- };
1007
- const resumeOptions = {
1008
- userQuery,
1009
- agentSessionId
1010
- };
1011
- const result = await this.agentRunner.run(agentConfig, resumeOptions);
1012
- const duration = Date.now() - startTime;
1013
- return {
1014
- output: {
1015
- result: result.output,
1016
- metadata: result.metadata,
1017
- workflowHistory: result.messages
1018
- },
1019
- error: undefined,
1020
- duration
1021
- };
1022
- } catch (error) {
1023
- if (error instanceof AskUserError) {
1024
- const contextAgentSessionId = context.agentSessionId;
1025
- if (contextAgentSessionId && !error.agentSessionId) {
1026
- throw new AskUserError(error.runId, error.sessionId, error.nodeId, error.nodeType, error.query, contextAgentSessionId, error.timestamp);
1027
- }
1028
- throw error;
1029
- }
1030
- const duration = Date.now() - startTime;
1031
- const errorMessage = error instanceof Error ? error.message : String(error);
1032
- return {
1033
- output: undefined,
1034
- error: errorMessage,
1035
- duration
1036
- };
1037
- }
1038
- }
1039
- async createAgentSubSession(context) {
1040
- const sessionComponent = context.sessionComponent;
1041
- if (!sessionComponent) {
1042
- return "";
1043
- }
1044
- const nodeId = this.definition.id || "unknown";
1045
- const agentSessionId = `agent_${nodeId}_${Date.now()}`;
1046
- await sessionComponent.create({
1047
- id: agentSessionId,
1048
- title: `Agent: ${nodeId}`,
1049
- metadata: {
1050
- type: "agent",
1051
- parentSessionId: context.sessionId,
1052
- nodeId,
1053
- workflowName: context.workflowName
1054
- }
1055
- });
1056
- const workflowSession = await sessionComponent.get(context.sessionId);
1057
- if (workflowSession) {
1058
- const metadata = workflowSession.metadata || {};
1059
- const agentSessions = metadata.agentSessions || [];
1060
- const existingIndex = agentSessions.findIndex((s) => s.nodeId === this.definition.id);
1061
- if (existingIndex >= 0) {
1062
- agentSessions[existingIndex] = {
1063
- nodeId: this.definition.id,
1064
- sessionId: agentSessionId,
1065
- status: "active",
1066
- createdAt: Date.now()
1067
- };
1068
- } else {
1069
- agentSessions.push({
1070
- nodeId: this.definition.id,
1071
- sessionId: agentSessionId,
1072
- status: "active",
1073
- createdAt: Date.now()
1074
- });
1075
- }
1076
- await sessionComponent.update(context.sessionId, {
1077
- metadata: {
1078
- ...metadata,
1079
- agentSessions
1080
- }
1081
- });
1082
- }
1083
- return agentSessionId;
1084
- }
1085
- resolveTemplate(template, context) {
1086
- if (!template) {
1087
- return "";
1088
- }
1089
- let resolved = template;
1090
- resolved = resolved.replace(/\{\{input\.([^}]+)\}\}/g, (match, path) => {
1091
- let value = this.getNestedValue(context.input, path);
1092
- if (value === undefined && context.workflowInput) {
1093
- value = this.getNestedValue(context.workflowInput, path);
1094
- }
1095
- return this.stringifyValue(value, match);
1096
- });
1097
- resolved = resolved.replace(/\{\{inputs\.([^}]+)\}\}/g, (match, path) => {
1098
- let value = this.getNestedValue(context.input, path);
1099
- if (value === undefined && context.workflowInput) {
1100
- value = this.getNestedValue(context.workflowInput, path);
1101
- }
1102
- return this.stringifyValue(value, match);
1103
- });
1104
- resolved = resolved.replace(/\{\{nodes\.([^}]+)\}\}/g, (match, path) => {
1105
- const segments = path.split(".");
1106
- const nodeId = segments[0];
1107
- let nodeOutput = context.previousOutputs.get(nodeId);
1108
- if (nodeOutput === undefined) {
1109
- const normalizedUnderscore = nodeId.replace(/-/g, "_");
1110
- const normalizedHyphen = nodeId.replace(/_/g, "-");
1111
- if (normalizedUnderscore !== nodeId) {
1112
- nodeOutput = context.previousOutputs.get(normalizedUnderscore);
1113
- }
1114
- if (nodeOutput === undefined && normalizedHyphen !== nodeId) {
1115
- nodeOutput = context.previousOutputs.get(normalizedHyphen);
1116
- }
1117
- }
1118
- if (nodeOutput === undefined) {
1119
- return match;
1120
- }
1121
- nodeOutput = this.extractFromWrapper(nodeOutput);
1122
- if (segments.length === 1) {
1123
- return this.stringifyValue(nodeOutput, match);
1124
- }
1125
- let value = nodeOutput;
1126
- let startIndex = 1;
1127
- if (segments.length > 1 && (segments[1] === "output" || segments[1] === "result" || segments[1] === "metadata")) {
1128
- startIndex = 2;
1129
- }
1130
- for (let i = startIndex;i < segments.length; i++) {
1131
- if (value === null || value === undefined) {
1132
- return match;
1133
- }
1134
- value = value[segments[i]];
1135
- }
1136
- return this.stringifyValue(value, match);
1137
- });
1138
- resolved = resolved.replace(/\{\{([^}]+)\}\}/g, (match, path) => {
1139
- if (path.startsWith("input.") || path.startsWith("nodes.")) {
1140
- return match;
1141
- }
1142
- const segments = path.split(".");
1143
- const nodeId = segments[0];
1144
- let nodeOutput = context.previousOutputs.get(nodeId);
1145
- if (nodeOutput === undefined) {
1146
- const normalizedUnderscore = nodeId.replace(/-/g, "_");
1147
- const normalizedHyphen = nodeId.replace(/_/g, "-");
1148
- if (normalizedUnderscore !== nodeId) {
1149
- nodeOutput = context.previousOutputs.get(normalizedUnderscore);
1150
- }
1151
- if (nodeOutput === undefined && normalizedHyphen !== nodeId) {
1152
- nodeOutput = context.previousOutputs.get(normalizedHyphen);
1153
- }
1154
- }
1155
- if (nodeOutput === undefined) {
1156
- return match;
1157
- }
1158
- nodeOutput = this.extractFromWrapper(nodeOutput);
1159
- if (segments.length === 1) {
1160
- return this.stringifyValue(nodeOutput, match);
1161
- }
1162
- let value = nodeOutput;
1163
- let startIndex = 1;
1164
- if (segments.length > 1 && (segments[1] === "output" || segments[1] === "result" || segments[1] === "metadata")) {
1165
- startIndex = 2;
1166
- }
1167
- for (let i = startIndex;i < segments.length; i++) {
1168
- if (value === null || value === undefined) {
1169
- return match;
1170
- }
1171
- value = value[segments[i]];
1172
- }
1173
- return this.stringifyValue(value, match);
1174
- });
1175
- return resolved;
1176
- }
1177
- stringifyValue(value, originalTemplate) {
1178
- if (value === undefined) {
1179
- return originalTemplate;
1180
- }
1181
- if (value === null) {
1182
- return "null";
1183
- }
1184
- if (typeof value === "string") {
1185
- return value;
1186
- }
1187
- return JSON.stringify(value);
1188
- }
1189
- extractFromWrapper(value) {
1190
- if (value === null || value === undefined) {
1191
- return value;
1192
- }
1193
- if (typeof value !== "object") {
1194
- return value;
1195
- }
1196
- if ("result" in value && "metadata" in value) {
1197
- return value.result;
1198
- }
1199
- if ("output" in value) {
1200
- return value.output;
1201
- }
1202
- return value;
1203
- }
1204
- getNestedValue(obj, path) {
1205
- if (!obj) {
1206
- return;
1207
- }
1208
- if ("input" in obj && path in obj["input"]) {
1209
- return obj["input"][path];
1210
- }
1211
- return path.split(".").reduce((current, key) => {
1212
- if (current && typeof current === "object") {
1213
- return current[key];
1214
- }
1215
- return;
1216
- }, obj);
1217
- }
1218
- };
1219
- __legacyDecorateClassTS([
1220
- TracedAs("agent.node.execute", { recordParams: true, recordResult: true, log: true })
1221
- ], AgentNode.prototype, "execute", null);
1222
- __legacyDecorateClassTS([
1223
- TracedAs("agent.node.createAgentSubSession", { recordParams: true, recordResult: true, log: true })
1224
- ], AgentNode.prototype, "createAgentSubSession", null);
1225
- });
1226
-
1227
- // src/env/workflow/nodes/ask-user-node.ts
1228
- class AskUserNode {
1229
- type = "ask_user";
1230
- id;
1231
- config;
1232
- constructor(definition) {
1233
- this.id = definition.id;
1234
- this.config = definition.config || {};
1235
- }
1236
- async execute(context) {
1237
- const query = this.config.query || "确认继续吗?";
1238
- const options = this.config.options;
1239
- const fullQuery = options ? `${query} (选项: ${options.join(", ")})` : query;
1240
- await context.eventBus.publish(createNodeInterruptEvent(context.runId, this.id, this.type, fullQuery));
1241
- throw new AskUserError(context.runId, context.sessionId, this.id, this.type, query);
1242
- }
1243
- validateConfig(_config) {
1244
- return true;
1245
- }
1246
- }
1247
- var init_ask_user_node = __esm(() => {
1248
- init_workflow_hil();
1249
- });
1250
-
1251
- // src/env/workflow/engine/node-registry.ts
1252
- class NodeRegistry {
1253
- factories = new Map;
1254
- toolRegistry;
1255
- skillRegistry;
1256
- agentRunner;
1257
- workflowRunner;
1258
- agentComponentAdapter;
1259
- sessionComponent;
1260
- constructor(options) {
1261
- const {
1262
- toolRegistry,
1263
- skillRegistry,
1264
- agentComponent,
1265
- agentRunner,
1266
- workflowRunner,
1267
- sessionComponent
1268
- } = options ?? {};
1269
- this.toolRegistry = toolRegistry;
1270
- this.skillRegistry = skillRegistry;
1271
- this.workflowRunner = workflowRunner;
1272
- this.sessionComponent = sessionComponent;
1273
- if (agentRunner) {
1274
- this.agentRunner = agentRunner;
1275
- if (agentRunner.setSessionComponent && sessionComponent) {
1276
- agentRunner.setSessionComponent(sessionComponent);
1277
- }
1278
- } else if (agentComponent) {
1279
- this.agentComponentAdapter = new AgentComponentAdapter(agentComponent, {}, sessionComponent);
1280
- this.agentRunner = this.agentComponentAdapter;
1281
- }
1282
- this.registerBuiltInTypes();
1283
- }
1284
- getAgentAdapter() {
1285
- return this.agentComponentAdapter;
1286
- }
1287
- getAgentRunner() {
1288
- return this.agentRunner;
1289
- }
1290
- getSessionComponent() {
1291
- return this.sessionComponent;
1292
- }
1293
- registerBuiltInTypes() {
1294
- this.factories.set("tool", (definition) => {
1295
- if (!this.toolRegistry) {
1296
- throw new Error("ToolRegistry is required for tool nodes");
1297
- }
1298
- return new ToolNode(definition, this.toolRegistry);
1299
- });
1300
- this.factories.set("skill", (definition) => {
1301
- if (!this.skillRegistry) {
1302
- throw new Error("SkillRegistry is required for skill nodes");
1303
- }
1304
- return new SkillNode(definition, this.skillRegistry);
1305
- });
1306
- this.factories.set("agent", (definition) => {
1307
- if (!this.agentRunner) {
1308
- throw new Error("AgentRunner is required for agent nodes");
1309
- }
1310
- return new AgentNode(definition, this.agentRunner);
1311
- });
1312
- this.factories.set("workflow", (definition) => {
1313
- if (!this.workflowRunner) {
1314
- throw new Error("WorkflowRunner is required for workflow nodes");
1315
- }
1316
- return new WorkflowNode(definition, this.workflowRunner);
1317
- });
1318
- this.factories.set("ask_user", (definition) => {
1319
- return new AskUserNode(definition);
1320
- });
1321
- }
1322
- register(type, factory) {
1323
- this.factories.set(type, factory);
1324
- }
1325
- has(type) {
1326
- return this.factories.has(type);
1327
- }
1328
- list() {
1329
- return Array.from(this.factories.keys());
1330
- }
1331
- createNode(definition, context) {
1332
- const factory = this.factories.get(definition.type);
1333
- if (!factory) {
1334
- const availableTypes = this.list().join(", ");
1335
- throw new Error(`Unknown node type: ${definition.type}. Available types: ${availableTypes}`);
1336
- }
1337
- return factory(definition, context);
1338
- }
1339
- }
1340
- var init_node_registry = __esm(() => {
1341
- init_tool_node();
1342
- init_skill_node();
1343
- init_agent_node();
1344
- init_agent_component_adapter();
1345
- init_workflow_node();
1346
- init_ask_user_node();
1347
- });
1348
-
1349
- // src/env/workflow/engine/engine.ts
1350
- import { EventEmitter } from "events";
1351
- var logger, WorkflowEngine;
1352
- var init_engine = __esm(() => {
1353
- init_event();
1354
- init_workflow_hil();
1355
- init_dag_manager();
1356
- init_event_bus();
1357
- init_scheduler();
1358
- init_executor();
1359
- init_node_registry();
1360
- init_logger();
1361
- init_decorator();
1362
- logger = createLogger("workflow:engine");
1363
- WorkflowEngine = class WorkflowEngine extends EventEmitter {
1364
- activeSessions = new Map;
1365
- sessionIdCounter = 0;
1366
- sessionComponent;
1367
- nodeRegistry;
1368
- workflowRepository;
1369
- constructor(nodeRegistry, sessionComponent, workflowRepository) {
1370
- super();
1371
- this.nodeRegistry = nodeRegistry;
1372
- this.sessionComponent = sessionComponent;
1373
- this.workflowRepository = workflowRepository;
1374
- }
1375
- static async create(options) {
1376
- const agentComponent = options.env?.getComponent("agent");
1377
- const sessionComponent = options.sessionComponent;
1378
- const nodeRegistry = new NodeRegistry({
1379
- toolRegistry: options.toolRegistry,
1380
- skillRegistry: options.skillRegistry,
1381
- agentComponent,
1382
- workflowRunner: options.workflowRunner,
1383
- sessionComponent
1384
- });
1385
- return new WorkflowEngine(nodeRegistry, sessionComponent, options.workflowRepository);
1386
- }
1387
- generateRunId() {
1388
- const random = Math.random().toString(36).substring(2, 8);
1389
- return `run_${Date.now()}_${++this.sessionIdCounter}_${random}`;
1390
- }
1391
- getRunIdFromSessionId(sessionId) {
1392
- return sessionId.replace(/^workflow_/, "");
1393
- }
1394
- getSessionId(runId) {
1395
- return `workflow_${runId}`;
1396
- }
1397
- async createSession(workflow, options) {
1398
- const definition = "definition" in workflow ? workflow.definition : workflow;
1399
- const workflowId = "id" in workflow ? workflow.id : `inline_${definition.name}`;
1400
- const workflowName = definition.name;
1401
- const runId = this.generateRunId();
1402
- const sessionId = this.getSessionId(runId);
1403
- const metadata = {
1404
- type: "workflow",
1405
- workflowId,
1406
- workflowName,
1407
- workflowVersion: definition.version,
1408
- status: "running",
1409
- input: options?.input,
1410
- agentSessions: []
1411
- };
1412
- if (this.sessionComponent) {
1413
- await this.sessionComponent.create({
1414
- id: sessionId,
1415
- title: `Workflow: ${workflowName} (${runId})`,
1416
- metadata
1417
- });
1418
- }
1419
- logger.info(`[WorkflowEngine] Created session: ${sessionId}`);
1420
- return sessionId;
1421
- }
1422
- async run(sessionId, options) {
1423
- let session = this.sessionComponent ? await this.sessionComponent.get(sessionId) : null;
1424
- let workflowDef = null;
1425
- let workflowId = "";
1426
- let workflowName = "";
1427
- if (session) {
1428
- const metadata2 = session.metadata;
1429
- if (metadata2.type === "workflow" && metadata2.workflowId) {
1430
- workflowDef = this.findDefinitionForWorkflow(metadata2.workflowId);
1431
- workflowId = metadata2.workflowId;
1432
- workflowName = metadata2.workflowName;
1433
- }
1434
- if (!workflowDef && metadata2.workflowName) {
1435
- workflowDef = this.findDefinitionForWorkflow(metadata2.workflowName);
1436
- workflowId = metadata2.workflowName;
1437
- workflowName = metadata2.workflowName;
1438
- }
1439
- } else {
1440
- if (!options?.workflowId) {
1441
- throw new Error("workflowId required for new session");
1442
- }
1443
- workflowDef = this.findDefinitionForWorkflow(options.workflowId);
1444
- if (!workflowDef) {
1445
- throw new Error(`Workflow not found: ${options.workflowId}`);
1446
- }
1447
- workflowId = options.workflowId;
1448
- workflowName = workflowDef.name;
1449
- if (this.sessionComponent) {
1450
- const sessionMetadata = {
1451
- type: "workflow",
1452
- workflowId,
1453
- workflowName,
1454
- workflowVersion: workflowDef.version,
1455
- status: "running",
1456
- input: options?.input,
1457
- agentSessions: []
1458
- };
1459
- await this.sessionComponent.create({
1460
- id: sessionId,
1461
- title: `Workflow: ${workflowName}`,
1462
- metadata: sessionMetadata
1463
- });
1464
- session = await this.sessionComponent.get(sessionId);
1465
- }
1466
- }
1467
- if (!session || !workflowDef) {
1468
- throw new Error(`Cannot start workflow: session or workflow not found`);
1469
- }
1470
- const metadata = session.metadata;
1471
- if (metadata.status === "completed") {
1472
- return { runId: this.getRunIdFromSessionId(sessionId), status: "completed" };
1473
- }
1474
- if (metadata.status === "failed") {
1475
- return { runId: this.getRunIdFromSessionId(sessionId), status: "failed" };
1476
- }
1477
- if (options?.input && this.sessionComponent) {
1478
- const hasNewInput = typeof options.input === "string" ? options.input !== undefined && options.input !== "" : Object.keys(options.input).length > 0;
1479
- if (hasNewInput) {
1480
- const existingInput = metadata.input || {};
1481
- const newInput = typeof options.input === "string" ? { userQuery: options.input } : options.input;
1482
- await this.sessionComponent.update(sessionId, {
1483
- metadata: {
1484
- ...metadata,
1485
- input: { ...existingInput, ...newInput }
1486
- }
1487
- });
1488
- metadata.input = { ...existingInput, ...newInput };
1489
- logger.info(`[WorkflowEngine] Updated session ${sessionId} input with resume user input`);
1490
- }
1491
- }
1492
- const messages = this.sessionComponent ? await this.sessionComponent.getMessages(sessionId) : [];
1493
- const { inferNextNode } = await import("./roy-agent-core-gq20wsgv.js");
1494
- const entry = workflowDef.entry;
1495
- const entryNode = Array.isArray(entry) ? entry[0] : entry;
1496
- const resumePoint = inferNextNode(messages, {
1497
- entryNode: entryNode !== "__default_entry__" ? entryNode : undefined,
1498
- edges: undefined
1499
- });
1500
- const sessionState = await this.initializeSessionState(sessionId, workflowDef, workflowId, workflowName, options);
1501
- this.activeSessions.set(sessionId, sessionState);
1502
- return this.runWithResume(sessionId, resumePoint, options);
1503
- }
1504
- async initializeSessionState(sessionId, definition, workflowId, workflowName, options) {
1505
- const dagManager = new DAGManager(definition);
1506
- const validation = dagManager.validate();
1507
- if (!validation.valid) {
1508
- throw new Error(`Invalid workflow: ${validation.errors.join(", ")}`);
1509
- }
1510
- const parallelLimit = options?.parallelLimit ?? definition.config?.parallel_limit ?? null;
1511
- const scheduler = new Scheduler(dagManager, { parallelLimit });
1512
- const eventBus = new EventBus;
1513
- const executorOptions = {
1514
- globalTimeout: options?.timeout ?? definition.config?.timeout ?? null,
1515
- globalRetry: definition.config?.retry ?? null,
1516
- debug: options?.debug ?? definition.config?.debug ?? false
1517
- };
1518
- const executor = new Executor(this.nodeRegistry, eventBus, executorOptions, this.sessionComponent);
1519
- const config = {
1520
- parallelLimit,
1521
- timeout: options?.timeout ?? definition.config?.timeout ?? null,
1522
- debug: options?.debug ?? definition.config?.debug ?? false
1523
- };
1524
- const abortController = new AbortController;
1525
- let resolveCompleted;
1526
- let rejectCompleted;
1527
- const completedPromise = new Promise((resolve, reject) => {
1528
- resolveCompleted = resolve;
1529
- rejectCompleted = reject;
1530
- });
1531
- const sessionState = {
1532
- sessionId,
1533
- workflowId,
1534
- workflowName,
1535
- status: "running",
1536
- startedAt: new Date,
1537
- eventBus,
1538
- dagManager,
1539
- scheduler,
1540
- executor,
1541
- nodeRegistry: this.nodeRegistry,
1542
- nodeOutputs: new Map,
1543
- config,
1544
- abortController,
1545
- completedPromise,
1546
- resolveCompleted,
1547
- rejectCompleted,
1548
- workflowHistory: [],
1549
- agentSessions: new Map
1550
- };
1551
- this.setupEventHandlers(sessionState);
1552
- return sessionState;
1553
- }
1554
- async runWithResume(sessionId, resumePoint, options) {
1555
- const sessionState = this.activeSessions.get(sessionId);
1556
- if (!sessionState) {
1557
- throw new Error(`Session not found: ${sessionId}`);
1558
- }
1559
- const runId = this.getRunIdFromSessionId(sessionId);
1560
- await sessionState.eventBus.publish(createWorkflowEvent("workflow.started", runId, {
1561
- workflow_name: sessionState.workflowName,
1562
- input: options?.input
1563
- }));
1564
- let pendingNodeId;
1565
- let agentSessionId;
1566
- switch (resumePoint.type) {
1567
- case "entry_node":
1568
- case "next_nodes":
1569
- pendingNodeId = undefined;
1570
- break;
1571
- case "resume_node":
1572
- case "ask_user":
1573
- pendingNodeId = resumePoint.nodeId;
1574
- agentSessionId = resumePoint.agentSessionId;
1575
- break;
1576
- }
1577
- let inputForExecution;
1578
- if (typeof options?.input === "string") {
1579
- inputForExecution = { userQuery: options.input };
1580
- } else if (options?.input && typeof options.input === "object") {
1581
- inputForExecution = options.input;
1582
- }
1583
- this.scheduleAndExecute(sessionState, {
1584
- input: inputForExecution,
1585
- pendingNodeId,
1586
- agentSessionId
1587
- }).catch((error) => {
1588
- logger.error(`Workflow ${sessionId} scheduling error:`, error);
1589
- this.failWorkflow(sessionState, error);
1590
- });
1591
- if (options?.sync !== false) {
1592
- return this.waitForCompletion(sessionId, options?.timeout);
1593
- }
1594
- return { runId, status: "running" };
1595
- }
1596
- async runWorkflow(workflow, options) {
1597
- const definition = "definition" in workflow ? workflow.definition : workflow;
1598
- const workflowId = "id" in workflow ? workflow.id : `inline_${definition.name}`;
1599
- const workflowName = definition.name;
1600
- const sessionId = await this.createSession(workflow, options);
1601
- const sessionState = await this.initializeSessionState(sessionId, definition, workflowId, workflowName, options);
1602
- this.activeSessions.set(sessionId, sessionState);
1603
- return this.runWithResume(sessionId, { type: "entry_node" }, options);
1604
- }
1605
- async pause(sessionId) {
1606
- const sessionState = this.activeSessions.get(sessionId);
1607
- if (!sessionState) {
1608
- throw new Error(`Session not found: ${sessionId}`);
1609
- }
1610
- if (sessionState.status !== "running") {
1611
- throw new Error(`Session ${sessionId} is not running (current: ${sessionState.status})`);
1612
- }
1613
- sessionState.status = "paused";
1614
- sessionState.abortController.abort();
1615
- sessionState.executor.cancelAll();
1616
- if (this.sessionComponent) {
1617
- const metadata = await this.getSessionMetadata(sessionId);
1618
- await this.sessionComponent.update(sessionId, {
1619
- metadata: { ...metadata, status: "paused" }
1620
- });
1621
- }
1622
- await sessionState.eventBus.publish(createWorkflowEvent("workflow.paused", this.getRunIdFromSessionId(sessionId), {}));
1623
- logger.info(`[WorkflowEngine] Workflow paused: ${sessionId}`);
1624
- }
1625
- async stop(sessionId, reason) {
1626
- const sessionState = this.activeSessions.get(sessionId);
1627
- if (!sessionState) {
1628
- if (this.sessionComponent) {
1629
- await this.sessionComponent.update(sessionId, {
1630
- metadata: { status: "stopped" }
1631
- });
1632
- }
1633
- return;
1634
- }
1635
- sessionState.status = "stopped";
1636
- sessionState.abortController.abort();
1637
- sessionState.executor.cancelAll();
1638
- if (this.sessionComponent) {
1639
- const metadata = await this.getSessionMetadata(sessionId);
1640
- await this.sessionComponent.update(sessionId, {
1641
- metadata: { ...metadata, status: "stopped" }
1642
- });
1643
- }
1644
- await sessionState.eventBus.publish(createWorkflowEvent("workflow.stopped", this.getRunIdFromSessionId(sessionId), {
1645
- reason: reason ?? "User requested stop"
1646
- }));
1647
- this.cleanupSession(sessionState);
1648
- }
1649
- getSessionStatus(sessionId) {
1650
- const sessionState = this.activeSessions.get(sessionId);
1651
- return sessionState?.status ?? null;
1652
- }
1653
- isSessionActive(sessionId) {
1654
- return this.activeSessions.has(sessionId);
1655
- }
1656
- setupEventHandlers(sessionState) {
1657
- const { sessionId, eventBus, scheduler } = sessionState;
1658
- const runId = this.getRunIdFromSessionId(sessionId);
1659
- eventBus.on("node.completed", async (event) => {
1660
- if (event.type !== "node.completed")
1661
- return;
1662
- sessionState.nodeOutputs.set(event.node_id, event.output);
1663
- scheduler.markCompleted(event.node_id);
1664
- if (event.output && typeof event.output === "object" && "workflowHistory" in event.output) {
1665
- const messages = event.output.workflowHistory;
1666
- if (Array.isArray(messages)) {
1667
- sessionState.workflowHistory.push(...messages);
1668
- }
1669
- }
1670
- this.checkAndFinalize(sessionState);
1671
- });
1672
- eventBus.on("node.failed", async (event) => {
1673
- if (event.type !== "node.failed")
1674
- return;
1675
- scheduler.markFailed(event.node_id);
1676
- await this.failWorkflow(sessionState, new Error(event.error.message));
1677
- });
1678
- eventBus.on("node.interrupt", async (event) => {
1679
- if (event.type !== "node.interrupt")
1680
- return;
1681
- logger.info(`Workflow paused at node "${event.node_id}" - ask_user pending`);
1682
- sessionState.status = "paused";
1683
- sessionState.abortController.abort();
1684
- if (this.sessionComponent) {
1685
- const metadata = await this.getSessionMetadata(sessionId);
1686
- await this.sessionComponent.update(sessionId, {
1687
- metadata: { ...metadata, status: "paused" }
1688
- });
1689
- }
1690
- await eventBus.publish(createWorkflowEvent("workflow.paused", runId, {
1691
- pendingNodeId: event.node_id,
1692
- query: event.query
1693
- }));
1694
- await this.writeNodeInterrupt(sessionId, event.node_id, event.node_type, event.query, event.agent_session_id);
1695
- sessionState.resolveCompleted({
1696
- runId,
1697
- status: "paused",
1698
- pendingNodeId: event.node_id,
1699
- query: event.query,
1700
- agentSessionId: event.agent_session_id
1701
- });
1702
- });
1703
- }
1704
- async writeNodeInterrupt(sessionId, nodeId, nodeType, query, agentSessionId) {
1705
- if (this.sessionComponent) {
1706
- await this.sessionComponent.addMessage(sessionId, {
1707
- role: "workflow.node.interrupt",
1708
- content: query,
1709
- metadata: {
1710
- type: "workflow.node.interrupt",
1711
- workflowNodeId: nodeId,
1712
- workflowNodeType: nodeType,
1713
- query,
1714
- agentSessionId,
1715
- timestamp: Date.now()
1716
- }
1717
- });
1718
- }
1719
- }
1720
- async scheduleAndExecute(sessionState, options) {
1721
- const { scheduler, executor, eventBus, abortController, nodeOutputs } = sessionState;
1722
- const { input: globalInput, pendingNodeId, agentSessionId, restoredOutputs } = options || {};
1723
- if (restoredOutputs) {
1724
- for (const [nodeId, output] of restoredOutputs) {
1725
- nodeOutputs.set(nodeId, output);
1726
- }
1727
- }
1728
- const scheduleAvailableNodes = async () => {
1729
- const state = scheduler.getState();
1730
- const completedNodes = new Set(state.completed);
1731
- const readyNodes = scheduler.getReadyNodes(completedNodes);
1732
- const canStart = scheduler.canStartMore();
1733
- if (readyNodes.length === 0 || !canStart) {
1734
- return false;
1735
- }
1736
- let scheduled = 0;
1737
- for (const nodeId of readyNodes) {
1738
- if (!scheduler.canStartMore())
1739
- break;
1740
- if (scheduled >= (sessionState.config.parallelLimit ?? Infinity))
1741
- break;
1742
- await this.startNode(sessionState, nodeId, globalInput);
1743
- scheduled++;
1744
- }
1745
- return true;
1746
- };
1747
- if (pendingNodeId) {
1748
- await this.resumeNode(sessionState, pendingNodeId, {
1749
- agentSessionId,
1750
- userQuery: globalInput?.userQuery
1751
- });
1752
- } else {
1753
- await scheduleAvailableNodes();
1754
- }
1755
- while (sessionState.status === "running" && !abortController.signal.aborted) {
1756
- const state = scheduler.getState();
1757
- if (state.pending.length === 0 && state.running.length === 0) {
1758
- break;
1759
- }
1760
- try {
1761
- await this.waitForNextNodeEvent(sessionState, abortController.signal);
1762
- } catch {
1763
- break;
1764
- }
1765
- await scheduleAvailableNodes();
1766
- }
1767
- }
1768
- waitForNextNodeEvent(sessionState, signal) {
1769
- return new Promise((resolve) => {
1770
- const timeoutId = setTimeout(() => {
1771
- cleanup();
1772
- resolve();
1773
- }, 100);
1774
- const cleanup = () => {
1775
- clearTimeout(timeoutId);
1776
- sessionState.eventBus.off("node.completed", onCompleted);
1777
- sessionState.eventBus.off("node.failed", onFailed);
1778
- };
1779
- const onCompleted = (event) => {
1780
- if (event.type === "node.completed") {
1781
- cleanup();
1782
- resolve();
1783
- }
1784
- };
1785
- const onFailed = (event) => {
1786
- if (event.type === "node.failed") {
1787
- cleanup();
1788
- resolve();
1789
- }
1790
- };
1791
- sessionState.eventBus.on("node.completed", onCompleted);
1792
- sessionState.eventBus.on("node.failed", onFailed);
1793
- if (signal.aborted) {
1794
- cleanup();
1795
- resolve();
1796
- }
1797
- });
1798
- }
1799
- async startNode(sessionState, nodeId, input) {
1800
- const { scheduler, executor, eventBus, dagManager } = sessionState;
1801
- const sessionId = sessionState.sessionId;
1802
- const runId = this.getRunIdFromSessionId(sessionId);
1803
- scheduler.markStarted(nodeId);
1804
- await eventBus.publish(createWorkflowEvent("node.scheduled", runId, {
1805
- node_id: nodeId
1806
- }));
1807
- const nodeDef = dagManager.getNode(nodeId);
1808
- if (!nodeDef) {
1809
- scheduler.markFailed(nodeId);
1810
- return;
1811
- }
1812
- await this.writeNodeStart(sessionId, nodeId, nodeDef.type, input);
1813
- const context = this.createExecutionContext(sessionState, nodeId, input);
1814
- executor.executeNode(nodeDef, context).catch(async (error) => {
1815
- if (error instanceof AskUserError) {
1816
- await eventBus.publish(createNodeInterruptEvent(runId, nodeId, nodeDef.type, error.query, error.agentSessionId));
1817
- return;
1818
- }
1819
- scheduler.markFailed(nodeId);
1820
- });
1821
- }
1822
- async writeNodeStart(sessionId, nodeId, nodeType, input) {
1823
- if (this.sessionComponent) {
1824
- await this.sessionComponent.addMessage(sessionId, {
1825
- role: "workflow.node.start",
1826
- content: JSON.stringify({ input }),
1827
- metadata: {
1828
- type: "workflow.node.start",
1829
- workflowNodeId: nodeId,
1830
- workflowNodeType: nodeType,
1831
- timestamp: Date.now()
1832
- }
1833
- });
1834
- }
1835
- }
1836
- async writeNodeResume(sessionId, nodeId, userResponse) {
1837
- if (this.sessionComponent && userResponse) {
1838
- await this.sessionComponent.addMessage(sessionId, {
1839
- role: "workflow.node.resume",
1840
- content: JSON.stringify({ userResponse }),
1841
- metadata: {
1842
- type: "workflow.node.resume",
1843
- workflowNodeId: nodeId,
1844
- timestamp: Date.now()
1845
- }
1846
- });
1847
- }
1848
- }
1849
- async resumeNode(sessionState, nodeId, options) {
1850
- const { scheduler, executor, eventBus, dagManager } = sessionState;
1851
- const sessionId = sessionState.sessionId;
1852
- const runId = this.getRunIdFromSessionId(sessionId);
1853
- scheduler.markStarted(nodeId);
1854
- await this.writeNodeResume(sessionId, nodeId, options?.userQuery);
1855
- await eventBus.publish(createWorkflowEvent("node.started", runId, {
1856
- node_id: nodeId,
1857
- agentSessionId: options?.agentSessionId,
1858
- userQuery: options?.userQuery
1859
- }));
1860
- const nodeDef = dagManager.getNode(nodeId);
1861
- if (!nodeDef) {
1862
- scheduler.markFailed(nodeId);
1863
- return;
1864
- }
1865
- const context = this.createExecutionContext(sessionState, nodeId, { userQuery: options?.userQuery }, true);
1866
- if (options?.agentSessionId) {
1867
- context.agentSessionId = options.agentSessionId;
1868
- }
1869
- if (nodeDef.type === "agent" && options?.agentSessionId) {
1870
- const agentAdapter = this.nodeRegistry.getAgentAdapter?.();
1871
- if (agentAdapter?.resumeAgent) {
1872
- const agentConfig = {
1873
- type: nodeDef.config?.agent_type || "general",
1874
- prompt: nodeDef.config?.prompt || "",
1875
- nodeId,
1876
- runId,
1877
- workflowSessionId: sessionId
1878
- };
1879
- try {
1880
- await agentAdapter.resumeAgent(options.agentSessionId, options.userQuery || "", agentConfig);
1881
- } catch (error) {
1882
- console.error(`Failed to resume agent node ${nodeId}:`, error);
1883
- }
1884
- }
1885
- }
1886
- executor.executeNode(nodeDef, context).catch((error) => {
1887
- if (error instanceof AskUserError) {
1888
- const event = createNodeInterruptEvent(runId, nodeId, nodeDef.type, error.query, error.agentSessionId);
1889
- eventBus.publish(event);
1890
- return;
1891
- }
1892
- scheduler.markFailed(nodeId);
1893
- });
1894
- }
1895
- createExecutionContext(sessionState, nodeId, globalInput, forceGlobalInput) {
1896
- const nodeDef = sessionState.dagManager.getNode(nodeId);
1897
- const runId = this.getRunIdFromSessionId(sessionState.sessionId);
1898
- const deps = nodeDef.depends_on || [];
1899
- const input = {};
1900
- for (const depId of deps) {
1901
- const depOutput = sessionState.nodeOutputs.get(depId);
1902
- if (depOutput !== undefined) {
1903
- input[depId] = depOutput;
1904
- }
1905
- }
1906
- const analysis = sessionState.dagManager.analyze();
1907
- const isEntryNode = analysis.entryNodes.includes(nodeId);
1908
- if ((isEntryNode || forceGlobalInput) && globalInput) {
1909
- Object.assign(input, globalInput);
1910
- }
1911
- const askUser = (query) => {
1912
- throw new AskUserError(runId, sessionState.sessionId, nodeId, nodeDef.type, query);
1913
- };
1914
- return {
1915
- runId,
1916
- sessionId: sessionState.sessionId,
1917
- workflowName: sessionState.workflowName,
1918
- nodeId,
1919
- input,
1920
- previousOutputs: sessionState.nodeOutputs,
1921
- config: nodeDef.config ?? {},
1922
- debug: sessionState.config.debug,
1923
- eventBus: sessionState.eventBus,
1924
- nodeOutputs: sessionState.nodeOutputs,
1925
- workflowHistory: sessionState.workflowHistory,
1926
- sessionComponent: this.sessionComponent,
1927
- askUser
1928
- };
1929
- }
1930
- checkAndFinalize(sessionState) {
1931
- const state = sessionState.scheduler.getState();
1932
- if (state.pending.length === 0 && state.running.length === 0 && state.ready.length === 0) {
1933
- if (state.failed.length > 0) {
1934
- this.failWorkflow(sessionState, new Error(`Nodes failed: ${state.failed.join(", ")}`));
1935
- } else {
1936
- this.completeWorkflow(sessionState);
1937
- }
1938
- }
1939
- }
1940
- async completeWorkflow(sessionState) {
1941
- const durationMs = Date.now() - sessionState.startedAt.getTime();
1942
- const sessionId = sessionState.sessionId;
1943
- const runId = this.getRunIdFromSessionId(sessionId);
1944
- const output = {};
1945
- for (const [nodeId, nodeOutput] of sessionState.nodeOutputs) {
1946
- output[nodeId] = nodeOutput;
1947
- }
1948
- if (this.sessionComponent) {
1949
- const metadata = await this.getSessionMetadata(sessionId);
1950
- await this.sessionComponent.update(sessionId, {
1951
- metadata: { ...metadata, status: "completed" }
1952
- });
1953
- }
1954
- await sessionState.eventBus.publish(createWorkflowEvent("workflow.completed", runId, {
1955
- result: output,
1956
- duration_ms: durationMs
1957
- }), true);
1958
- sessionState.resolveCompleted({
1959
- runId,
1960
- status: "completed",
1961
- output,
1962
- durationMs
1963
- });
1964
- this.cleanupSession(sessionState);
1965
- }
1966
- async failWorkflow(sessionState, error) {
1967
- const durationMs = Date.now() - sessionState.startedAt.getTime();
1968
- const sessionId = sessionState.sessionId;
1969
- const runId = this.getRunIdFromSessionId(sessionId);
1970
- sessionState.executor.cancelAll();
1971
- if (this.sessionComponent) {
1972
- const metadata = await this.getSessionMetadata(sessionId);
1973
- await this.sessionComponent.update(sessionId, {
1974
- metadata: { ...metadata, status: "failed" }
1975
- });
1976
- }
1977
- await sessionState.eventBus.publish(createWorkflowEvent("workflow.failed", runId, {
1978
- error: { message: error.message, stack: error.stack },
1979
- failed_at: new Date().toISOString()
1980
- }), true);
1981
- sessionState.resolveCompleted({
1982
- runId,
1983
- status: "failed",
1984
- error: error.message,
1985
- durationMs
1986
- });
1987
- this.cleanupSession(sessionState);
1988
- }
1989
- cleanupSession(sessionState) {
1990
- sessionState.eventBus.clear();
1991
- this.activeSessions.delete(sessionState.sessionId);
1992
- }
1993
- async waitForCompletion(sessionId, timeout) {
1994
- const sessionState = this.activeSessions.get(sessionId);
1995
- if (!sessionState) {
1996
- throw new Error(`Session not found: ${sessionId}`);
1997
- }
1998
- const timeoutMs = timeout ?? 300000;
1999
- const timeoutPromise = new Promise((_, reject) => {
2000
- setTimeout(() => {
2001
- reject(new Error(`Workflow execution timeout: ${timeoutMs}ms`));
2002
- }, timeoutMs);
2003
- });
2004
- return Promise.race([
2005
- sessionState.completedPromise,
2006
- timeoutPromise
2007
- ]);
2008
- }
2009
- async getSessionMetadata(sessionId) {
2010
- if (!this.sessionComponent) {
2011
- return { type: "workflow", workflowId: "", workflowName: "", status: "running" };
2012
- }
2013
- const session = await this.sessionComponent.get(sessionId);
2014
- return session?.metadata || { type: "workflow", workflowId: "", workflowName: "", status: "running" };
2015
- }
2016
- findDefinitionForWorkflow(workflowIdOrName) {
2017
- if (!this.workflowRepository) {
2018
- return null;
2019
- }
2020
- let workflow = this.workflowRepository.getById(workflowIdOrName);
2021
- if (workflow)
2022
- return workflow.definition;
2023
- workflow = this.workflowRepository.getByName(workflowIdOrName);
2024
- if (workflow)
2025
- return workflow.definition;
2026
- return null;
2027
- }
2028
- };
2029
- __legacyDecorateClassTS([
2030
- TracedAs("workflow.engine.createSession", { recordParams: true, recordResult: true, log: true })
2031
- ], WorkflowEngine.prototype, "createSession", null);
2032
- __legacyDecorateClassTS([
2033
- TracedAs("workflow.engine.run", { recordParams: true, recordResult: true, log: true })
2034
- ], WorkflowEngine.prototype, "run", null);
2035
- __legacyDecorateClassTS([
2036
- TracedAs("workflow.engine.runWithResume", { recordParams: true, recordResult: true, log: true })
2037
- ], WorkflowEngine.prototype, "runWithResume", null);
2038
- __legacyDecorateClassTS([
2039
- TracedAs("workflow.engine.runWorkflow", { recordParams: true, recordResult: true, log: true })
2040
- ], WorkflowEngine.prototype, "runWorkflow", null);
2041
- __legacyDecorateClassTS([
2042
- TracedAs("workflow.engine.pause", { recordParams: true, recordResult: true, log: true })
2043
- ], WorkflowEngine.prototype, "pause", null);
2044
- __legacyDecorateClassTS([
2045
- TracedAs("workflow.engine.stop", { recordParams: true, recordResult: true, log: true })
2046
- ], WorkflowEngine.prototype, "stop", null);
2047
- __legacyDecorateClassTS([
2048
- TracedAs("workflow.engine.writeNodeInterrupt", { recordParams: true, recordResult: true, log: true })
2049
- ], WorkflowEngine.prototype, "writeNodeInterrupt", null);
2050
- __legacyDecorateClassTS([
2051
- TracedAs("workflow.engine.scheduleAndExecute", { recordParams: true, recordResult: true, log: true })
2052
- ], WorkflowEngine.prototype, "scheduleAndExecute", null);
2053
- __legacyDecorateClassTS([
2054
- TracedAs("workflow.engine.waitForNextNodeEvent", { recordParams: true, recordResult: true, log: true })
2055
- ], WorkflowEngine.prototype, "waitForNextNodeEvent", null);
2056
- __legacyDecorateClassTS([
2057
- TracedAs("workflow.engine.startNode", { recordParams: true, recordResult: true, log: true })
2058
- ], WorkflowEngine.prototype, "startNode", null);
2059
- __legacyDecorateClassTS([
2060
- TracedAs("workflow.engine.writeNodeStart", { recordParams: true, recordResult: true, log: true })
2061
- ], WorkflowEngine.prototype, "writeNodeStart", null);
2062
- __legacyDecorateClassTS([
2063
- TracedAs("workflow.engine.writeNodeResume", { recordParams: true, recordResult: true, log: true })
2064
- ], WorkflowEngine.prototype, "writeNodeResume", null);
2065
- __legacyDecorateClassTS([
2066
- TracedAs("workflow.engine.resumeNode", { recordParams: true, recordResult: true, log: true })
2067
- ], WorkflowEngine.prototype, "resumeNode", null);
2068
- __legacyDecorateClassTS([
2069
- TracedAs("workflow.engine.checkAndFinalize", { recordParams: true, recordResult: true, log: true })
2070
- ], WorkflowEngine.prototype, "checkAndFinalize", null);
2071
- __legacyDecorateClassTS([
2072
- TracedAs("workflow.engine.completeWorkflow", { recordParams: true, recordResult: true, log: true })
2073
- ], WorkflowEngine.prototype, "completeWorkflow", null);
2074
- __legacyDecorateClassTS([
2075
- TracedAs("workflow.engine.failWorkflow", { recordParams: true, recordResult: true, log: true })
2076
- ], WorkflowEngine.prototype, "failWorkflow", null);
2077
- });
2078
-
2079
- // src/env/workflow/engine/index.ts
2080
- var exports_engine = {};
2081
- __export(exports_engine, {
2082
- WorkflowEngine: () => WorkflowEngine,
2083
- Scheduler: () => Scheduler,
2084
- NodeRegistry: () => NodeRegistry,
2085
- Executor: () => Executor,
2086
- EventBus: () => EventBus,
2087
- DAGManager: () => DAGManager
2088
- });
2089
- var init_engine2 = __esm(() => {
2090
- init_event_bus();
2091
- init_dag_manager();
2092
- init_scheduler();
2093
- init_executor();
2094
- init_engine();
2095
- init_node_registry();
2096
- });
2097
-
2098
- export { EventBus, DAGManager, Scheduler, Executor, NodeRegistry, WorkflowEngine, exports_engine, init_engine2 as init_engine };