@nodetool-ai/agents 0.7.0-rc.11

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 (281) hide show
  1. package/dist/agent-executor.d.ts +62 -0
  2. package/dist/agent-executor.d.ts.map +1 -0
  3. package/dist/agent-executor.js +324 -0
  4. package/dist/agent-executor.js.map +1 -0
  5. package/dist/agent-step-executor.d.ts +28 -0
  6. package/dist/agent-step-executor.d.ts.map +1 -0
  7. package/dist/agent-step-executor.js +99 -0
  8. package/dist/agent-step-executor.js.map +1 -0
  9. package/dist/agent-workflow-runner.d.ts +31 -0
  10. package/dist/agent-workflow-runner.d.ts.map +1 -0
  11. package/dist/agent-workflow-runner.js +124 -0
  12. package/dist/agent-workflow-runner.js.map +1 -0
  13. package/dist/agent.d.ts +115 -0
  14. package/dist/agent.d.ts.map +1 -0
  15. package/dist/agent.js +587 -0
  16. package/dist/agent.js.map +1 -0
  17. package/dist/base-agent.d.ts +42 -0
  18. package/dist/base-agent.d.ts.map +1 -0
  19. package/dist/base-agent.js +29 -0
  20. package/dist/base-agent.js.map +1 -0
  21. package/dist/constants.d.ts +8 -0
  22. package/dist/constants.d.ts.map +1 -0
  23. package/dist/constants.js +8 -0
  24. package/dist/constants.js.map +1 -0
  25. package/dist/graph-builder.d.ts +49 -0
  26. package/dist/graph-builder.d.ts.map +1 -0
  27. package/dist/graph-builder.js +206 -0
  28. package/dist/graph-builder.js.map +1 -0
  29. package/dist/graph-planner.d.ts +56 -0
  30. package/dist/graph-planner.d.ts.map +1 -0
  31. package/dist/graph-planner.js +311 -0
  32. package/dist/graph-planner.js.map +1 -0
  33. package/dist/index.d.ts +79 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +81 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/js-sandbox.d.ts +84 -0
  38. package/dist/js-sandbox.d.ts.map +1 -0
  39. package/dist/js-sandbox.js +654 -0
  40. package/dist/js-sandbox.js.map +1 -0
  41. package/dist/multi-mode-agent.d.ts +86 -0
  42. package/dist/multi-mode-agent.d.ts.map +1 -0
  43. package/dist/multi-mode-agent.js +476 -0
  44. package/dist/multi-mode-agent.js.map +1 -0
  45. package/dist/output-format.d.ts +10 -0
  46. package/dist/output-format.d.ts.map +1 -0
  47. package/dist/output-format.js +17 -0
  48. package/dist/output-format.js.map +1 -0
  49. package/dist/parallel-task-executor.d.ts +87 -0
  50. package/dist/parallel-task-executor.d.ts.map +1 -0
  51. package/dist/parallel-task-executor.js +332 -0
  52. package/dist/parallel-task-executor.js.map +1 -0
  53. package/dist/prompts/graph-planner-prompt.d.ts +48 -0
  54. package/dist/prompts/graph-planner-prompt.d.ts.map +1 -0
  55. package/dist/prompts/graph-planner-prompt.js +180 -0
  56. package/dist/prompts/graph-planner-prompt.js.map +1 -0
  57. package/dist/reject-agentic-provider.d.ts +21 -0
  58. package/dist/reject-agentic-provider.d.ts.map +1 -0
  59. package/dist/reject-agentic-provider.js +32 -0
  60. package/dist/reject-agentic-provider.js.map +1 -0
  61. package/dist/simple-agent.d.ts +29 -0
  62. package/dist/simple-agent.d.ts.map +1 -0
  63. package/dist/simple-agent.js +54 -0
  64. package/dist/simple-agent.js.map +1 -0
  65. package/dist/step-executor.d.ts +162 -0
  66. package/dist/step-executor.d.ts.map +1 -0
  67. package/dist/step-executor.js +1114 -0
  68. package/dist/step-executor.js.map +1 -0
  69. package/dist/sub-agent-planner.d.ts +33 -0
  70. package/dist/sub-agent-planner.d.ts.map +1 -0
  71. package/dist/sub-agent-planner.js +203 -0
  72. package/dist/sub-agent-planner.js.map +1 -0
  73. package/dist/task-executor.d.ts +89 -0
  74. package/dist/task-executor.d.ts.map +1 -0
  75. package/dist/task-executor.js +359 -0
  76. package/dist/task-executor.js.map +1 -0
  77. package/dist/task-planner.d.ts +44 -0
  78. package/dist/task-planner.d.ts.map +1 -0
  79. package/dist/task-planner.js +532 -0
  80. package/dist/task-planner.js.map +1 -0
  81. package/dist/team/db-task-board.d.ts +54 -0
  82. package/dist/team/db-task-board.d.ts.map +1 -0
  83. package/dist/team/db-task-board.js +361 -0
  84. package/dist/team/db-task-board.js.map +1 -0
  85. package/dist/team/edge-message-bus.d.ts +51 -0
  86. package/dist/team/edge-message-bus.d.ts.map +1 -0
  87. package/dist/team/edge-message-bus.js +169 -0
  88. package/dist/team/edge-message-bus.js.map +1 -0
  89. package/dist/team/edge-task-board.d.ts +77 -0
  90. package/dist/team/edge-task-board.d.ts.map +1 -0
  91. package/dist/team/edge-task-board.js +140 -0
  92. package/dist/team/edge-task-board.js.map +1 -0
  93. package/dist/team/index.d.ts +16 -0
  94. package/dist/team/index.d.ts.map +1 -0
  95. package/dist/team/index.js +17 -0
  96. package/dist/team/index.js.map +1 -0
  97. package/dist/team/message-bus.d.ts +58 -0
  98. package/dist/team/message-bus.d.ts.map +1 -0
  99. package/dist/team/message-bus.js +151 -0
  100. package/dist/team/message-bus.js.map +1 -0
  101. package/dist/team/task-board.d.ts +106 -0
  102. package/dist/team/task-board.d.ts.map +1 -0
  103. package/dist/team/task-board.js +370 -0
  104. package/dist/team/task-board.js.map +1 -0
  105. package/dist/team/team-executor.d.ts +72 -0
  106. package/dist/team/team-executor.d.ts.map +1 -0
  107. package/dist/team/team-executor.js +466 -0
  108. package/dist/team/team-executor.js.map +1 -0
  109. package/dist/team/team-tools.d.ts +252 -0
  110. package/dist/team/team-tools.d.ts.map +1 -0
  111. package/dist/team/team-tools.js +412 -0
  112. package/dist/team/team-tools.js.map +1 -0
  113. package/dist/team/types.d.ts +198 -0
  114. package/dist/team/types.d.ts.map +1 -0
  115. package/dist/team/types.js +8 -0
  116. package/dist/team/types.js.map +1 -0
  117. package/dist/tools/add-edge-tool.d.ts +18 -0
  118. package/dist/tools/add-edge-tool.d.ts.map +1 -0
  119. package/dist/tools/add-edge-tool.js +92 -0
  120. package/dist/tools/add-edge-tool.js.map +1 -0
  121. package/dist/tools/add-node-tool.d.ts +22 -0
  122. package/dist/tools/add-node-tool.d.ts.map +1 -0
  123. package/dist/tools/add-node-tool.js +128 -0
  124. package/dist/tools/add-node-tool.js.map +1 -0
  125. package/dist/tools/asset-tools.d.ts +58 -0
  126. package/dist/tools/asset-tools.d.ts.map +1 -0
  127. package/dist/tools/asset-tools.js +191 -0
  128. package/dist/tools/asset-tools.js.map +1 -0
  129. package/dist/tools/base-tool.d.ts +25 -0
  130. package/dist/tools/base-tool.d.ts.map +1 -0
  131. package/dist/tools/base-tool.js +24 -0
  132. package/dist/tools/base-tool.js.map +1 -0
  133. package/dist/tools/browser-tools.d.ts +32 -0
  134. package/dist/tools/browser-tools.d.ts.map +1 -0
  135. package/dist/tools/browser-tools.js +208 -0
  136. package/dist/tools/browser-tools.js.map +1 -0
  137. package/dist/tools/calculator-tool.d.ts +24 -0
  138. package/dist/tools/calculator-tool.d.ts.map +1 -0
  139. package/dist/tools/calculator-tool.js +64 -0
  140. package/dist/tools/calculator-tool.js.map +1 -0
  141. package/dist/tools/claude-code-tools.d.ts +96 -0
  142. package/dist/tools/claude-code-tools.d.ts.map +1 -0
  143. package/dist/tools/claude-code-tools.js +463 -0
  144. package/dist/tools/claude-code-tools.js.map +1 -0
  145. package/dist/tools/code-tools.d.ts +26 -0
  146. package/dist/tools/code-tools.d.ts.map +1 -0
  147. package/dist/tools/code-tools.js +82 -0
  148. package/dist/tools/code-tools.js.map +1 -0
  149. package/dist/tools/control-tool.d.ts +47 -0
  150. package/dist/tools/control-tool.d.ts.map +1 -0
  151. package/dist/tools/control-tool.js +101 -0
  152. package/dist/tools/control-tool.js.map +1 -0
  153. package/dist/tools/create-plan-tool.d.ts +29 -0
  154. package/dist/tools/create-plan-tool.d.ts.map +1 -0
  155. package/dist/tools/create-plan-tool.js +355 -0
  156. package/dist/tools/create-plan-tool.js.map +1 -0
  157. package/dist/tools/create-task-tool.d.ts +28 -0
  158. package/dist/tools/create-task-tool.d.ts.map +1 -0
  159. package/dist/tools/create-task-tool.js +254 -0
  160. package/dist/tools/create-task-tool.js.map +1 -0
  161. package/dist/tools/dataseo-tools.d.ts +38 -0
  162. package/dist/tools/dataseo-tools.d.ts.map +1 -0
  163. package/dist/tools/dataseo-tools.js +329 -0
  164. package/dist/tools/dataseo-tools.js.map +1 -0
  165. package/dist/tools/email-tools.d.ts +76 -0
  166. package/dist/tools/email-tools.d.ts.map +1 -0
  167. package/dist/tools/email-tools.js +259 -0
  168. package/dist/tools/email-tools.js.map +1 -0
  169. package/dist/tools/filesystem-tools.d.ts +77 -0
  170. package/dist/tools/filesystem-tools.d.ts.map +1 -0
  171. package/dist/tools/filesystem-tools.js +334 -0
  172. package/dist/tools/filesystem-tools.js.map +1 -0
  173. package/dist/tools/find-model-tool.d.ts +25 -0
  174. package/dist/tools/find-model-tool.d.ts.map +1 -0
  175. package/dist/tools/find-model-tool.js +236 -0
  176. package/dist/tools/find-model-tool.js.map +1 -0
  177. package/dist/tools/finish-graph-tool.d.ts +23 -0
  178. package/dist/tools/finish-graph-tool.d.ts.map +1 -0
  179. package/dist/tools/finish-graph-tool.js +46 -0
  180. package/dist/tools/finish-graph-tool.js.map +1 -0
  181. package/dist/tools/finish-step-tool.d.ts +16 -0
  182. package/dist/tools/finish-step-tool.d.ts.map +1 -0
  183. package/dist/tools/finish-step-tool.js +68 -0
  184. package/dist/tools/finish-step-tool.js.map +1 -0
  185. package/dist/tools/google-tools.d.ts +44 -0
  186. package/dist/tools/google-tools.d.ts.map +1 -0
  187. package/dist/tools/google-tools.js +176 -0
  188. package/dist/tools/google-tools.js.map +1 -0
  189. package/dist/tools/http-tools.d.ts +56 -0
  190. package/dist/tools/http-tools.d.ts.map +1 -0
  191. package/dist/tools/http-tools.js +180 -0
  192. package/dist/tools/http-tools.js.map +1 -0
  193. package/dist/tools/js-code-tool.d.ts +30 -0
  194. package/dist/tools/js-code-tool.d.ts.map +1 -0
  195. package/dist/tools/js-code-tool.js +98 -0
  196. package/dist/tools/js-code-tool.js.map +1 -0
  197. package/dist/tools/local-get-node-info-tool.d.ts +19 -0
  198. package/dist/tools/local-get-node-info-tool.d.ts.map +1 -0
  199. package/dist/tools/local-get-node-info-tool.js +75 -0
  200. package/dist/tools/local-get-node-info-tool.js.map +1 -0
  201. package/dist/tools/local-list-nodes-tool.d.ts +19 -0
  202. package/dist/tools/local-list-nodes-tool.d.ts.map +1 -0
  203. package/dist/tools/local-list-nodes-tool.js +69 -0
  204. package/dist/tools/local-list-nodes-tool.js.map +1 -0
  205. package/dist/tools/local-search-nodes-tool.d.ts +21 -0
  206. package/dist/tools/local-search-nodes-tool.d.ts.map +1 -0
  207. package/dist/tools/local-search-nodes-tool.js +111 -0
  208. package/dist/tools/local-search-nodes-tool.js.map +1 -0
  209. package/dist/tools/math-tools.d.ts +156 -0
  210. package/dist/tools/math-tools.d.ts.map +1 -0
  211. package/dist/tools/math-tools.js +422 -0
  212. package/dist/tools/math-tools.js.map +1 -0
  213. package/dist/tools/mcp-tools.d.ts +413 -0
  214. package/dist/tools/mcp-tools.d.ts.map +1 -0
  215. package/dist/tools/mcp-tools.js +618 -0
  216. package/dist/tools/mcp-tools.js.map +1 -0
  217. package/dist/tools/media-tools.d.ts +277 -0
  218. package/dist/tools/media-tools.d.ts.map +1 -0
  219. package/dist/tools/media-tools.js +682 -0
  220. package/dist/tools/media-tools.js.map +1 -0
  221. package/dist/tools/model-tools.d.ts +25 -0
  222. package/dist/tools/model-tools.d.ts.map +1 -0
  223. package/dist/tools/model-tools.js +48 -0
  224. package/dist/tools/model-tools.js.map +1 -0
  225. package/dist/tools/openai-tools.d.ts +73 -0
  226. package/dist/tools/openai-tools.d.ts.map +1 -0
  227. package/dist/tools/openai-tools.js +193 -0
  228. package/dist/tools/openai-tools.js.map +1 -0
  229. package/dist/tools/pdf-tools.d.ts +152 -0
  230. package/dist/tools/pdf-tools.d.ts.map +1 -0
  231. package/dist/tools/pdf-tools.js +339 -0
  232. package/dist/tools/pdf-tools.js.map +1 -0
  233. package/dist/tools/plan-builder-tools.d.ts +72 -0
  234. package/dist/tools/plan-builder-tools.d.ts.map +1 -0
  235. package/dist/tools/plan-builder-tools.js +438 -0
  236. package/dist/tools/plan-builder-tools.js.map +1 -0
  237. package/dist/tools/search-tools.d.ts +39 -0
  238. package/dist/tools/search-tools.d.ts.map +1 -0
  239. package/dist/tools/search-tools.js +218 -0
  240. package/dist/tools/search-tools.js.map +1 -0
  241. package/dist/tools/serp-providers/dataforseo-provider.d.ts +14 -0
  242. package/dist/tools/serp-providers/dataforseo-provider.d.ts.map +1 -0
  243. package/dist/tools/serp-providers/dataforseo-provider.js +114 -0
  244. package/dist/tools/serp-providers/dataforseo-provider.js.map +1 -0
  245. package/dist/tools/serp-providers/index.d.ts +35 -0
  246. package/dist/tools/serp-providers/index.d.ts.map +1 -0
  247. package/dist/tools/serp-providers/index.js +14 -0
  248. package/dist/tools/serp-providers/index.js.map +1 -0
  249. package/dist/tools/serp-providers/serpapi-provider.d.ts +18 -0
  250. package/dist/tools/serp-providers/serpapi-provider.d.ts.map +1 -0
  251. package/dist/tools/serp-providers/serpapi-provider.js +66 -0
  252. package/dist/tools/serp-providers/serpapi-provider.js.map +1 -0
  253. package/dist/tools/tool-registry.d.ts +9 -0
  254. package/dist/tools/tool-registry.d.ts.map +1 -0
  255. package/dist/tools/tool-registry.js +17 -0
  256. package/dist/tools/tool-registry.js.map +1 -0
  257. package/dist/tools/vector-tools.d.ts +224 -0
  258. package/dist/tools/vector-tools.d.ts.map +1 -0
  259. package/dist/tools/vector-tools.js +582 -0
  260. package/dist/tools/vector-tools.js.map +1 -0
  261. package/dist/tools/workspace-tools.d.ts +58 -0
  262. package/dist/tools/workspace-tools.d.ts.map +1 -0
  263. package/dist/tools/workspace-tools.js +152 -0
  264. package/dist/tools/workspace-tools.js.map +1 -0
  265. package/dist/types.d.ts +65 -0
  266. package/dist/types.d.ts.map +1 -0
  267. package/dist/types.js +5 -0
  268. package/dist/types.js.map +1 -0
  269. package/dist/utils/json-parser.d.ts +15 -0
  270. package/dist/utils/json-parser.d.ts.map +1 -0
  271. package/dist/utils/json-parser.js +78 -0
  272. package/dist/utils/json-parser.js.map +1 -0
  273. package/dist/utils/remove-base64-images.d.ts +12 -0
  274. package/dist/utils/remove-base64-images.d.ts.map +1 -0
  275. package/dist/utils/remove-base64-images.js +20 -0
  276. package/dist/utils/remove-base64-images.js.map +1 -0
  277. package/dist/utils/wrap-generators-parallel.d.ts +11 -0
  278. package/dist/utils/wrap-generators-parallel.d.ts.map +1 -0
  279. package/dist/utils/wrap-generators-parallel.js +38 -0
  280. package/dist/utils/wrap-generators-parallel.js.map +1 -0
  281. package/package.json +65 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * ParallelTaskExecutor -- orchestrates parallel execution of a multi-task plan.
3
+ *
4
+ * Each task in the plan runs as an independent sub-agent via TaskExecutor.
5
+ * Tasks form a DAG via their `dependsOn` arrays. Independent tasks
6
+ * (those with no unmet dependencies) run concurrently.
7
+ *
8
+ * Flow:
9
+ * TaskPlan (multiple Tasks) → ParallelTaskExecutor
10
+ * → finds tasks with satisfied dependencies
11
+ * → runs them concurrently, each via TaskExecutor
12
+ * → stores results in shared context
13
+ * → repeats until all tasks complete
14
+ */
15
+ import type { BaseProvider } from "@nodetool-ai/runtime";
16
+ import type { ProcessingContext } from "@nodetool-ai/runtime";
17
+ import type { ProcessingMessage } from "@nodetool-ai/protocol";
18
+ import type { Tool } from "./tools/base-tool.js";
19
+ import type { TaskPlan } from "./types.js";
20
+ export interface ParallelTaskExecutorOptions {
21
+ provider: BaseProvider;
22
+ model: string;
23
+ context: ProcessingContext;
24
+ tools: Tool[];
25
+ taskPlan: TaskPlan;
26
+ systemPrompt?: string;
27
+ inputs?: Record<string, unknown>;
28
+ /** Maximum total iteration count across all tasks. */
29
+ maxIterations?: number;
30
+ /** Maximum iterations per step within a task. */
31
+ maxStepIterations?: number;
32
+ maxTokenLimit?: number;
33
+ }
34
+ export declare class ParallelTaskExecutor {
35
+ private readonly provider;
36
+ private readonly model;
37
+ private readonly tools;
38
+ private readonly taskPlan;
39
+ private readonly context;
40
+ private readonly inputs;
41
+ private readonly systemPrompt;
42
+ private readonly maxIterations;
43
+ private readonly maxStepIterations;
44
+ private readonly maxTokenLimit;
45
+ /** Results collected per task ID. */
46
+ private readonly taskResults;
47
+ constructor(opts: ParallelTaskExecutorOptions);
48
+ /**
49
+ * Execute all tasks in the plan, respecting inter-task dependencies.
50
+ * Independent tasks run concurrently as separate sub-agents.
51
+ */
52
+ execute(): AsyncGenerator<ProcessingMessage>;
53
+ /**
54
+ * Execute a single task as an independent sub-agent.
55
+ * Injects dependency results into the task's context before execution.
56
+ */
57
+ private executeTask;
58
+ /**
59
+ * Build a map of dependency results for a task.
60
+ */
61
+ private buildDependencyContext;
62
+ /**
63
+ * Build system prompt enhanced with dependency results.
64
+ */
65
+ private buildTaskSystemPrompt;
66
+ /**
67
+ * Check if all tasks have been completed.
68
+ */
69
+ private allTasksComplete;
70
+ /**
71
+ * Find tasks whose dependencies are all satisfied.
72
+ */
73
+ private getExecutableTasks;
74
+ /**
75
+ * Get the result of a specific task.
76
+ */
77
+ getTaskResult(taskId: string): unknown;
78
+ /**
79
+ * Get all task results.
80
+ */
81
+ getAllResults(): Record<string, unknown>;
82
+ /**
83
+ * Get the result of the final task (last task in the plan, typically the aggregator).
84
+ */
85
+ getFinalResult(): unknown;
86
+ }
87
+ //# sourceMappingURL=parallel-task-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-task-executor.d.ts","sourceRoot":"","sources":["../src/parallel-task-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EACV,iBAAiB,EAKlB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQjD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,IAAI,EAAE,2BAA2B;IAc7C;;;OAGG;IACI,OAAO,IAAI,cAAc,CAAC,iBAAiB,CAAC;IAiFnD;;;OAGG;YACY,WAAW;IAuF1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQxC;;OAEG;IACH,cAAc,IAAI,OAAO;CAK1B"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * ParallelTaskExecutor -- orchestrates parallel execution of a multi-task plan.
3
+ *
4
+ * Each task in the plan runs as an independent sub-agent via TaskExecutor.
5
+ * Tasks form a DAG via their `dependsOn` arrays. Independent tasks
6
+ * (those with no unmet dependencies) run concurrently.
7
+ *
8
+ * Flow:
9
+ * TaskPlan (multiple Tasks) → ParallelTaskExecutor
10
+ * → finds tasks with satisfied dependencies
11
+ * → runs them concurrently, each via TaskExecutor
12
+ * → stores results in shared context
13
+ * → repeats until all tasks complete
14
+ */
15
+ import { createLogger } from "@nodetool-ai/config";
16
+ import { TaskUpdateEvent } from "@nodetool-ai/protocol";
17
+ import { TaskExecutor } from "./task-executor.js";
18
+ import { DEFAULT_TOKEN_LIMIT } from "./constants.js";
19
+ const log = createLogger("nodetool.agents.parallel-task-executor");
20
+ const DEFAULT_MAX_TASK_ITERATIONS = 100;
21
+ const DEFAULT_MAX_STEP_ITERATIONS = 10;
22
+ export class ParallelTaskExecutor {
23
+ provider;
24
+ model;
25
+ tools;
26
+ taskPlan;
27
+ context;
28
+ inputs;
29
+ systemPrompt;
30
+ maxIterations;
31
+ maxStepIterations;
32
+ maxTokenLimit;
33
+ /** Results collected per task ID. */
34
+ taskResults = new Map();
35
+ constructor(opts) {
36
+ this.provider = opts.provider;
37
+ this.model = opts.model;
38
+ this.tools = opts.tools;
39
+ this.taskPlan = opts.taskPlan;
40
+ this.context = opts.context;
41
+ this.inputs = opts.inputs ?? {};
42
+ this.systemPrompt = opts.systemPrompt;
43
+ this.maxIterations = opts.maxIterations ?? DEFAULT_MAX_TASK_ITERATIONS;
44
+ this.maxStepIterations =
45
+ opts.maxStepIterations ?? DEFAULT_MAX_STEP_ITERATIONS;
46
+ this.maxTokenLimit = opts.maxTokenLimit ?? DEFAULT_TOKEN_LIMIT;
47
+ }
48
+ /**
49
+ * Execute all tasks in the plan, respecting inter-task dependencies.
50
+ * Independent tasks run concurrently as separate sub-agents.
51
+ */
52
+ async *execute() {
53
+ // Seed inputs into context
54
+ for (const [key, value] of Object.entries(this.inputs)) {
55
+ this.context.set(key, value);
56
+ }
57
+ const totalTasks = this.taskPlan.tasks.length;
58
+ log.info("Parallel task execution started", {
59
+ title: this.taskPlan.title,
60
+ tasks: totalTasks
61
+ });
62
+ yield {
63
+ type: "log_update",
64
+ node_id: "parallel_task_executor",
65
+ node_name: "ParallelTaskExecutor",
66
+ content: `Starting parallel execution of ${totalTasks} tasks...`,
67
+ severity: "info"
68
+ };
69
+ let iterations = 0;
70
+ while (!this.allTasksComplete() && iterations < this.maxIterations) {
71
+ iterations++;
72
+ const executableTasks = this.getExecutableTasks();
73
+ if (executableTasks.length === 0) {
74
+ if (!this.allTasksComplete()) {
75
+ yield {
76
+ type: "chunk",
77
+ content: "\nNo executable tasks but not all complete. Possible dependency issues.\n",
78
+ done: false
79
+ };
80
+ }
81
+ break;
82
+ }
83
+ const taskIds = executableTasks.map((t) => t.id);
84
+ log.debug("Dispatching parallel tasks", { taskIds });
85
+ yield {
86
+ type: "log_update",
87
+ node_id: "parallel_task_executor",
88
+ node_name: "ParallelTaskExecutor",
89
+ content: `Running ${executableTasks.length} task(s) in parallel: ${taskIds.join(", ")}`,
90
+ severity: "info"
91
+ };
92
+ // Create task executors — each task runs as its own sub-agent
93
+ const taskGenerators = executableTasks.map((task) => {
94
+ return this.executeTask(task);
95
+ });
96
+ if (taskGenerators.length > 1) {
97
+ // Execute all tasks concurrently, merging yielded messages
98
+ yield* mergeAsyncGenerators(taskGenerators);
99
+ }
100
+ else {
101
+ // Single task — no need for merge overhead
102
+ for await (const message of taskGenerators[0]) {
103
+ yield message;
104
+ }
105
+ }
106
+ }
107
+ if (iterations >= this.maxIterations) {
108
+ log.warn("Max iterations reached", {
109
+ iterations,
110
+ completedTasks: this.taskPlan.tasks.filter((t) => t.completed).length,
111
+ totalTasks
112
+ });
113
+ }
114
+ log.info("Parallel task execution completed", {
115
+ title: this.taskPlan.title,
116
+ completedTasks: this.taskPlan.tasks.filter((t) => t.completed).length,
117
+ totalTasks
118
+ });
119
+ }
120
+ /**
121
+ * Execute a single task as an independent sub-agent.
122
+ * Injects dependency results into the task's context before execution.
123
+ */
124
+ async *executeTask(task) {
125
+ // Mark task as started
126
+ task.completed = false;
127
+ yield {
128
+ type: "task_update",
129
+ event: TaskUpdateEvent.TaskCreated,
130
+ task: {
131
+ id: task.id,
132
+ title: task.title,
133
+ description: task.description,
134
+ steps: task.steps.map((s) => ({
135
+ id: s.id,
136
+ instructions: s.instructions,
137
+ completed: s.completed
138
+ }))
139
+ }
140
+ };
141
+ // Build context with dependency results
142
+ const depContext = this.buildDependencyContext(task);
143
+ // Build enhanced system prompt with dependency information
144
+ const enhancedPrompt = this.buildTaskSystemPrompt(task, depContext);
145
+ // Create TaskExecutor for this task's steps
146
+ const executor = new TaskExecutor({
147
+ provider: this.provider,
148
+ model: this.model,
149
+ context: this.context,
150
+ tools: [...this.tools],
151
+ task,
152
+ systemPrompt: enhancedPrompt,
153
+ inputs: { ...this.inputs, ...depContext },
154
+ maxSteps: task.steps.length + 5, // Allow some slack
155
+ maxStepIterations: this.maxStepIterations,
156
+ maxTokenLimit: this.maxTokenLimit,
157
+ parallelExecution: true // Enable parallel step execution within each task
158
+ });
159
+ let taskResult = null;
160
+ for await (const item of executor.executeTasks()) {
161
+ if (item.type === "step_result") {
162
+ const stepResult = item;
163
+ if (stepResult.is_task_result) {
164
+ taskResult = stepResult.result;
165
+ }
166
+ }
167
+ yield item;
168
+ }
169
+ // Store task result in shared context and mark complete
170
+ if (taskResult !== null && taskResult !== undefined) {
171
+ this.taskResults.set(task.id, taskResult);
172
+ this.context.set(task.id, taskResult);
173
+ }
174
+ else {
175
+ // Use last step result as task result
176
+ const lastStep = task.steps[task.steps.length - 1];
177
+ if (lastStep) {
178
+ const lastResult = this.context.get(lastStep.id);
179
+ if (lastResult !== undefined) {
180
+ this.taskResults.set(task.id, lastResult);
181
+ this.context.set(task.id, lastResult);
182
+ taskResult = lastResult;
183
+ }
184
+ }
185
+ }
186
+ task.completed = true;
187
+ yield {
188
+ type: "task_update",
189
+ event: TaskUpdateEvent.TaskCompleted,
190
+ task: {
191
+ id: task.id,
192
+ title: task.title,
193
+ result: taskResult
194
+ }
195
+ };
196
+ log.info("Task completed", {
197
+ taskId: task.id,
198
+ title: task.title
199
+ });
200
+ }
201
+ /**
202
+ * Build a map of dependency results for a task.
203
+ */
204
+ buildDependencyContext(task) {
205
+ const depContext = {};
206
+ for (const depId of task.dependsOn ?? []) {
207
+ const result = this.taskResults.get(depId);
208
+ if (result !== undefined) {
209
+ depContext[depId] = result;
210
+ }
211
+ }
212
+ return depContext;
213
+ }
214
+ /**
215
+ * Build system prompt enhanced with dependency results.
216
+ */
217
+ buildTaskSystemPrompt(task, depContext) {
218
+ const parts = [];
219
+ if (this.systemPrompt) {
220
+ parts.push(this.systemPrompt);
221
+ }
222
+ if (Object.keys(depContext).length > 0) {
223
+ parts.push("\n# Results from prerequisite tasks:");
224
+ for (const [depId, result] of Object.entries(depContext)) {
225
+ const depTask = this.taskPlan.tasks.find((t) => t.id === depId);
226
+ const depTitle = depTask?.title ?? depId;
227
+ const resultStr = typeof result === "string"
228
+ ? result
229
+ : JSON.stringify(result, null, 2);
230
+ parts.push(`\n## ${depTitle} (${depId}):\n${resultStr}`);
231
+ }
232
+ }
233
+ return parts.length > 0 ? parts.join("\n") : undefined;
234
+ }
235
+ /**
236
+ * Check if all tasks have been completed.
237
+ */
238
+ allTasksComplete() {
239
+ return this.taskPlan.tasks.every((task) => task.completed);
240
+ }
241
+ /**
242
+ * Find tasks whose dependencies are all satisfied.
243
+ */
244
+ getExecutableTasks() {
245
+ const completedIds = new Set(this.taskPlan.tasks
246
+ .filter((t) => t.completed)
247
+ .map((t) => t.id));
248
+ // Input keys also count as satisfied dependencies
249
+ for (const key of Object.keys(this.inputs)) {
250
+ completedIds.add(key);
251
+ }
252
+ return this.taskPlan.tasks.filter((task) => !task.completed &&
253
+ (task.dependsOn ?? []).every((dep) => completedIds.has(dep)));
254
+ }
255
+ /**
256
+ * Get the result of a specific task.
257
+ */
258
+ getTaskResult(taskId) {
259
+ return this.taskResults.get(taskId);
260
+ }
261
+ /**
262
+ * Get all task results.
263
+ */
264
+ getAllResults() {
265
+ const results = {};
266
+ for (const [id, result] of this.taskResults) {
267
+ results[id] = result;
268
+ }
269
+ return results;
270
+ }
271
+ /**
272
+ * Get the result of the final task (last task in the plan, typically the aggregator).
273
+ */
274
+ getFinalResult() {
275
+ if (this.taskPlan.tasks.length === 0)
276
+ return null;
277
+ const lastTask = this.taskPlan.tasks[this.taskPlan.tasks.length - 1];
278
+ return this.taskResults.get(lastTask.id) ?? null;
279
+ }
280
+ }
281
+ // ---------------------------------------------------------------------------
282
+ // Async generator merge utility
283
+ // ---------------------------------------------------------------------------
284
+ async function* mergeAsyncGenerators(generators) {
285
+ const queue = [];
286
+ let activeCount = generators.length;
287
+ let resolve = null;
288
+ let firstError = undefined;
289
+ function notify() {
290
+ if (resolve) {
291
+ const r = resolve;
292
+ resolve = null;
293
+ r();
294
+ }
295
+ }
296
+ const tasks = generators.map(async (gen) => {
297
+ try {
298
+ for await (const item of gen) {
299
+ queue.push(item);
300
+ notify();
301
+ }
302
+ }
303
+ catch (e) {
304
+ if (firstError === undefined)
305
+ firstError = e;
306
+ }
307
+ finally {
308
+ activeCount--;
309
+ notify();
310
+ }
311
+ });
312
+ while (activeCount > 0 || queue.length > 0) {
313
+ if (queue.length > 0) {
314
+ yield queue.shift();
315
+ }
316
+ else if (activeCount > 0) {
317
+ const waitPromise = new Promise((r) => {
318
+ resolve = r;
319
+ });
320
+ if (queue.length > 0) {
321
+ resolve = null;
322
+ continue;
323
+ }
324
+ await waitPromise;
325
+ }
326
+ }
327
+ await Promise.allSettled(tasks);
328
+ if (firstError !== undefined) {
329
+ throw firstError;
330
+ }
331
+ }
332
+ //# sourceMappingURL=parallel-task-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-task-executor.js","sourceRoot":"","sources":["../src/parallel-task-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * GraphPlanner system prompt and the curated catalog of generic AI nodes
3
+ * that the workflow-building agent must prefer over provider-specific nodes.
4
+ *
5
+ * Centralized here so the prompt's table and the runtime catalog can't drift.
6
+ */
7
+ import { PROVIDER_NAMESPACES } from "@nodetool-ai/node-sdk";
8
+ export type GenericNodeCapability = "text_to_image" | "image_to_image" | "text_to_video" | "image_to_video" | "text_to_speech" | "automatic_speech_recognition" | "generate_embedding" | "generate_message";
9
+ export interface GenericAINode {
10
+ /** Fully-qualified node_type to pass to add_node. */
11
+ type: string;
12
+ /** Provider capability used to look up models via `find_model`. */
13
+ capability: GenericNodeCapability;
14
+ /** Human-readable task label used in the prompt table. */
15
+ task: string;
16
+ /** One-line description shown to the agent. */
17
+ summary: string;
18
+ /**
19
+ * Whether this node accepts a `model` property of the form `{provider, id}`.
20
+ * `false` for AgentStep, which inherits the workflow's configured model.
21
+ */
22
+ acceptsModel: boolean;
23
+ }
24
+ /**
25
+ * Curated set of provider-agnostic nodes the agent must reach for FIRST when
26
+ * the user asks for AI generation/transform of any kind.
27
+ *
28
+ * Verified to exist in `@nodetool-ai/base-nodes` as of writing.
29
+ */
30
+ export declare const GENERIC_AI_NODES: readonly GenericAINode[];
31
+ /** Deterministic baseline namespaces — search inside these for non-AI work. */
32
+ export declare const CORE_BASELINE_NAMESPACES: readonly string[];
33
+ export { PROVIDER_NAMESPACES };
34
+ export interface BuildPromptOptions {
35
+ /**
36
+ * Whether `find_model` is available. When false (no providers configured),
37
+ * the prompt drops the "use find_model" instruction and steers the agent
38
+ * toward AgentStep for any AI work.
39
+ */
40
+ hasFindModel?: boolean;
41
+ }
42
+ /**
43
+ * Build the GraphPlanner system prompt. Pass `hasFindModel: false` when
44
+ * there are no configured providers — the prompt then omits the model
45
+ * lookup step and tells the agent to fall back to AgentStep.
46
+ */
47
+ export declare function buildGraphPlannerSystemPrompt(options?: BuildPromptOptions): string;
48
+ //# sourceMappingURL=graph-planner-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-planner-prompt.d.ts","sourceRoot":"","sources":["../../src/prompts/graph-planner-prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAC7B,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,8BAA8B,GAC9B,oBAAoB,GACpB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,UAAU,EAAE,qBAAqB,CAAC;IAClC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAiEpD,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAcrD,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAeD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CA+ER"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * GraphPlanner system prompt and the curated catalog of generic AI nodes
3
+ * that the workflow-building agent must prefer over provider-specific nodes.
4
+ *
5
+ * Centralized here so the prompt's table and the runtime catalog can't drift.
6
+ */
7
+ import { PROVIDER_NAMESPACES } from "@nodetool-ai/node-sdk";
8
+ /**
9
+ * Curated set of provider-agnostic nodes the agent must reach for FIRST when
10
+ * the user asks for AI generation/transform of any kind.
11
+ *
12
+ * Verified to exist in `@nodetool-ai/base-nodes` as of writing.
13
+ */
14
+ export const GENERIC_AI_NODES = [
15
+ {
16
+ type: "nodetool.image.TextToImage",
17
+ capability: "text_to_image",
18
+ task: "Text → Image",
19
+ summary: "Generate an image from a text prompt. Required: prompt, model.",
20
+ acceptsModel: true
21
+ },
22
+ {
23
+ type: "nodetool.image.ImageToImage",
24
+ capability: "image_to_image",
25
+ task: "Image → Image",
26
+ summary: "Transform a source image with a text prompt. Required: image, prompt, model.",
27
+ acceptsModel: true
28
+ },
29
+ {
30
+ type: "nodetool.video.TextToVideo",
31
+ capability: "text_to_video",
32
+ task: "Text → Video",
33
+ summary: "Generate a video from a text prompt. Required: prompt, model.",
34
+ acceptsModel: true
35
+ },
36
+ {
37
+ type: "nodetool.video.ImageToVideo",
38
+ capability: "image_to_video",
39
+ task: "Image → Video",
40
+ summary: "Animate a source image into a video. Required: image, prompt, model.",
41
+ acceptsModel: true
42
+ },
43
+ {
44
+ type: "nodetool.audio.TextToSpeech",
45
+ capability: "text_to_speech",
46
+ task: "Text → Speech",
47
+ summary: "Generate speech audio from text. Required: text, model. Optional: voice.",
48
+ acceptsModel: true
49
+ },
50
+ {
51
+ type: "nodetool.text.AutomaticSpeechRecognition",
52
+ capability: "automatic_speech_recognition",
53
+ task: "Speech → Text",
54
+ summary: "Transcribe audio to text. Required: audio, model.",
55
+ acceptsModel: true
56
+ },
57
+ {
58
+ type: "nodetool.text.Embedding",
59
+ capability: "generate_embedding",
60
+ task: "Text → Embedding",
61
+ summary: "Compute a text embedding vector. Required: text, model.",
62
+ acceptsModel: true
63
+ },
64
+ {
65
+ type: "nodetool.agents.AgentStep",
66
+ capability: "generate_message",
67
+ task: "LLM step (reasoning / generation)",
68
+ summary: "LLM step: pass instructions in, get text out. Inherits the workflow's configured model — do NOT set a model property.",
69
+ acceptsModel: false
70
+ }
71
+ ];
72
+ /** Deterministic baseline namespaces — search inside these for non-AI work. */
73
+ export const CORE_BASELINE_NAMESPACES = [
74
+ "nodetool.control",
75
+ "nodetool.text",
76
+ "nodetool.image",
77
+ "nodetool.video",
78
+ "nodetool.audio",
79
+ "nodetool.data",
80
+ "nodetool.constant",
81
+ "nodetool.input",
82
+ "nodetool.output",
83
+ "nodetool.workspace",
84
+ "nodetool.document",
85
+ "nodetool.vector",
86
+ "nodetool.triggers"
87
+ ];
88
+ export { PROVIDER_NAMESPACES };
89
+ function renderGenericNodeTable() {
90
+ const header = "| Task | node_type | Capability |";
91
+ const sep = "|---|---|---|";
92
+ const rows = GENERIC_AI_NODES.map((n) => `| ${n.task} | \`${n.type}\` | \`${n.capability}\` |`);
93
+ return [header, sep, ...rows].join("\n");
94
+ }
95
+ function renderProviderList() {
96
+ return PROVIDER_NAMESPACES.map((ns) => `${ns}.*`).join(", ");
97
+ }
98
+ /**
99
+ * Build the GraphPlanner system prompt. Pass `hasFindModel: false` when
100
+ * there are no configured providers — the prompt then omits the model
101
+ * lookup step and tells the agent to fall back to AgentStep.
102
+ */
103
+ export function buildGraphPlannerSystemPrompt(options = {}) {
104
+ const hasFindModel = options.hasFindModel ?? true;
105
+ const tools = [
106
+ hasFindModel
107
+ ? "- `find_model(capability, [task], [provider_hint], [prefer_local])` — REQUIRED before adding any generic AI node. Returns ranked `{provider, model_id, name, downloaded, recommended}` filtered to providers the user has actually configured. Use the first result unless the user named a specific provider."
108
+ : null,
109
+ "- `search_nodes(query, [namespace], [include_provider_nodes])` — deterministic core nodes only by default. Provider-specific nodes are HIDDEN unless `include_provider_nodes: true`. Optional `namespace` restricts results to a single core namespace.",
110
+ "- `get_node_info(node_type)` — fetch full property/output schema. REQUIRED before `add_node` for non-generic nodes.",
111
+ "- `list_nodes([namespace])` — browse a baseline namespace.",
112
+ "- `add_node`, `add_edge`, `finish_graph` — graph mutation."
113
+ ]
114
+ .filter((line) => line !== null)
115
+ .join("\n");
116
+ const aiWorkflow = hasFindModel
117
+ ? `2. For each AI node from the table: call \`find_model\` with the node's capability. Pick the first ranked result. Set the node's \`model\` property to \`{ provider: <provider>, id: <model_id> }\`. AgentStep is the exception — it inherits the workflow's configured model, so do NOT set a \`model\` property on it.`
118
+ : `2. No providers are configured for model lookup. Use \`nodetool.agents.AgentStep\` for any AI work — it uses the workflow's configured model. Do NOT pick provider-specific nodes.`;
119
+ return `You are a WorkflowArchitect. Build a workflow graph to achieve the user's objective.
120
+
121
+ # Node-selection policy (READ FIRST)
122
+
123
+ Always start from the CORE catalog below. Do NOT use provider-specific nodes
124
+ (${renderProviderList()})
125
+ unless the user explicitly named that provider (e.g. "use OpenAI's image API").
126
+ Provider-specific nodes are hidden from search results by default; only set
127
+ \`include_provider_nodes: true\` when the user named a provider.
128
+
129
+ ## Generic AI nodes — pick one of these for ANY AI generation/transform
130
+
131
+ ${renderGenericNodeTable()}
132
+
133
+ These nodes accept a \`model\` property (a \`{provider, id}\` object) — except
134
+ AgentStep, which uses the workflow's configured model. Do NOT guess model IDs;
135
+ ${hasFindModel ? "use `find_model` to pick a real model+provider." : "AgentStep is the safe choice when no providers are configured."}
136
+
137
+ ## Core baseline namespaces (deterministic, non-AI work)
138
+
139
+ For non-AI operations, use deterministic nodes from these namespaces only:
140
+ ${CORE_BASELINE_NAMESPACES.join(", ")}.
141
+
142
+ # Workflow
143
+
144
+ 1. CHOOSE: For each step, decide whether it is (a) AI generation/transform →
145
+ pick a generic node from the table above, or (b) deterministic → use
146
+ \`search_nodes\` to find a node in a core baseline namespace.
147
+ ${aiWorkflow}
148
+ 3. INSPECT non-AI nodes with \`get_node_info\` before adding so handle names
149
+ and types match exactly.
150
+ 4. BUILD with \`add_node\` for each node and \`add_edge\` to connect outputs to
151
+ inputs. Every node needs a unique snake_case id.
152
+ 5. FINALIZE with \`finish_graph\` when done.
153
+
154
+ # Tools
155
+
156
+ ${tools}
157
+
158
+ # Rules
159
+
160
+ - Provider-specific nodes are FORBIDDEN unless the user named the provider.
161
+ - Always pass required properties to \`add_node\`. A constant String node
162
+ needs \`{ "value": "your text here" }\`. Empty defaults break workflows.
163
+ - Maximize parallelism: nodes without data dependencies run concurrently.
164
+ - Use \`nodetool.agents.AgentStep\` ONLY when no deterministic node and no
165
+ generic AI node fits. AgentStep required properties: \`instructions\` (string).
166
+ Optional: \`tools\` (string array), \`output_schema\` (JSON schema string).
167
+ Input handle: \`input\`. Output handle: \`output\`.
168
+ - Do NOT use \`nodetool.agents.Agent\` (the registry node) — it requires a
169
+ complex model property that cannot be set via \`add_node\`.
170
+
171
+ # Persistence
172
+
173
+ - Workflow outputs are persisted by their nodes. For images/audio/video the
174
+ generic AI nodes auto-save assets; you do NOT need a separate save node.
175
+ - For text artifacts an AgentStep produces (reports, summaries, JSON), use
176
+ the \`nodetool.workspace.WriteTextFile\` deterministic node OR have the
177
+ AgentStep call \`save_asset\` with \`name\` + \`content\` from its tool list
178
+ so the artifact shows up in the chat asset browser.`;
179
+ }
180
+ //# sourceMappingURL=graph-planner-prompt.js.map