@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,28 @@
1
+ /**
2
+ * Tool for creating and validating a single-task execution plan.
3
+ *
4
+ * Used by TaskPlanner (legacy single-task path) to let the LLM produce
5
+ * a validated Task through the standard agent tool-calling loop.
6
+ */
7
+ import type { ProcessingContext } from "@nodetool-ai/runtime";
8
+ import { Tool } from "./base-tool.js";
9
+ import type { Task } from "../types.js";
10
+ export declare class CreateTaskPlanTool extends Tool {
11
+ readonly name = "create_task";
12
+ readonly description: string;
13
+ readonly inputSchema: Record<string, unknown>;
14
+ /** Captured validated task, or null if not yet created. */
15
+ private _task;
16
+ /** Input keys for dependency validation. */
17
+ private readonly inputKeys;
18
+ constructor(inputs?: Record<string, unknown>);
19
+ get task(): Task | null;
20
+ process(_context: ProcessingContext, params: Record<string, unknown>): Promise<unknown>;
21
+ userMessage(params: Record<string, unknown>): string;
22
+ private buildTask;
23
+ private validateTask;
24
+ private checkForCycles;
25
+ private validatePlanSemantics;
26
+ private applySchemaOverrides;
27
+ }
28
+ //# sourceMappingURL=create-task-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-task-tool.d.ts","sourceRoot":"","sources":["../../src/tools/create-task-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAQ,IAAI,EAAE,MAAM,aAAa,CAAC;AA4B9C,qBAAa,kBAAmB,SAAQ,IAAI;IAC1C,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,SAEwD;IAC5E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAA4B;IAEzE,2DAA2D;IAC3D,OAAO,CAAC,KAAK,CAAqB;IAElC,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAE5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAK5C,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,CAEtB;IAEK,OAAO,CACX,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAqBnB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAUpD,OAAO,CAAC,SAAS;IAyCjB,OAAO,CAAC,YAAY;IAwCpB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,qBAAqB;IA8E7B,OAAO,CAAC,oBAAoB;CAmB7B"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Tool for creating and validating a single-task execution plan.
3
+ *
4
+ * Used by TaskPlanner (legacy single-task path) to let the LLM produce
5
+ * a validated Task through the standard agent tool-calling loop.
6
+ */
7
+ import { Tool } from "./base-tool.js";
8
+ import { randomUUID } from "node:crypto";
9
+ /**
10
+ * JSON Schema for the create_task tool input.
11
+ */
12
+ const CREATE_TASK_INPUT_SCHEMA = {
13
+ type: "object",
14
+ properties: {
15
+ title: { type: "string", description: "Task title" },
16
+ steps: {
17
+ type: "array",
18
+ items: {
19
+ type: "object",
20
+ properties: {
21
+ id: { type: "string" },
22
+ instructions: { type: "string" },
23
+ depends_on: { type: "array", items: { type: "string" } },
24
+ output_schema: { type: "string" },
25
+ tools: { type: "array", items: { type: "string" } }
26
+ },
27
+ required: ["id", "instructions", "depends_on"]
28
+ }
29
+ }
30
+ },
31
+ required: ["title", "steps"]
32
+ };
33
+ export class CreateTaskPlanTool extends Tool {
34
+ name = "create_task";
35
+ description = "Create an executable task with steps. " +
36
+ "Steps form a DAG via depends_on for parallel execution within the task.";
37
+ inputSchema = CREATE_TASK_INPUT_SCHEMA;
38
+ /** Captured validated task, or null if not yet created. */
39
+ _task = null;
40
+ /** Input keys for dependency validation. */
41
+ inputKeys;
42
+ constructor(inputs) {
43
+ super();
44
+ this.inputKeys = new Set(Object.keys(inputs ?? {}));
45
+ }
46
+ get task() {
47
+ return this._task;
48
+ }
49
+ async process(_context, params) {
50
+ const task = this.buildTask(params);
51
+ const errors = this.validateTask(task);
52
+ if (errors.length > 0) {
53
+ return {
54
+ status: "validation_failed",
55
+ errors
56
+ };
57
+ }
58
+ this.applySchemaOverrides(task.steps);
59
+ this._task = task;
60
+ return {
61
+ status: "task_created",
62
+ title: task.title,
63
+ steps: task.steps.length
64
+ };
65
+ }
66
+ userMessage(params) {
67
+ const title = typeof params["title"] === "string" ? params["title"] : "task";
68
+ return `Creating task: ${title}`;
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Build
72
+ // ---------------------------------------------------------------------------
73
+ buildTask(data) {
74
+ const title = typeof data["title"] === "string" ? data["title"] : "Untitled Task";
75
+ const rawSteps = Array.isArray(data["steps"]) ? data["steps"] : [];
76
+ const steps = rawSteps.map((s) => {
77
+ const raw = s;
78
+ return {
79
+ id: typeof raw["id"] === "string" ? raw["id"] : randomUUID(),
80
+ instructions: typeof raw["instructions"] === "string" ? raw["instructions"] : "",
81
+ completed: false,
82
+ dependsOn: Array.isArray(raw["depends_on"])
83
+ ? raw["depends_on"]
84
+ : Array.isArray(raw["dependsOn"])
85
+ ? raw["dependsOn"]
86
+ : [],
87
+ outputSchema: typeof raw["output_schema"] === "string"
88
+ ? raw["output_schema"]
89
+ : typeof raw["outputSchema"] === "string"
90
+ ? raw["outputSchema"]
91
+ : undefined,
92
+ tools: Array.isArray(raw["tools"])
93
+ ? raw["tools"]
94
+ : undefined,
95
+ logs: []
96
+ };
97
+ });
98
+ return {
99
+ id: randomUUID(),
100
+ title,
101
+ steps
102
+ };
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // Validation
106
+ // ---------------------------------------------------------------------------
107
+ validateTask(task) {
108
+ const errors = [];
109
+ const stepIds = new Set(task.steps.map((s) => s.id));
110
+ // Check dependencies
111
+ for (const step of task.steps) {
112
+ for (const dep of step.dependsOn) {
113
+ if (!stepIds.has(dep) && !this.inputKeys.has(dep)) {
114
+ errors.push(`Step '${step.id}' depends on '${dep}' which does not exist as a step ID or input key.`);
115
+ }
116
+ }
117
+ }
118
+ // Check for duplicate step IDs
119
+ const seen = new Set();
120
+ for (const step of task.steps) {
121
+ if (seen.has(step.id)) {
122
+ errors.push(`Duplicate step ID: '${step.id}'.`);
123
+ }
124
+ seen.add(step.id);
125
+ }
126
+ // Check for cycles
127
+ if (!this.checkForCycles(task)) {
128
+ errors.push("Circular dependency detected in task plan.");
129
+ }
130
+ // Semantic checks
131
+ errors.push(...this.validatePlanSemantics(task.steps));
132
+ // Must have at least one step
133
+ if (task.steps.length === 0) {
134
+ errors.push("Task must contain at least one step.");
135
+ }
136
+ return errors;
137
+ }
138
+ checkForCycles(task) {
139
+ const stepIds = new Set(task.steps.map((s) => s.id));
140
+ const visited = new Set();
141
+ const inStack = new Set();
142
+ const stepMap = new Map(task.steps.map((s) => [s.id, s]));
143
+ const hasCycle = (id) => {
144
+ if (inStack.has(id))
145
+ return true;
146
+ if (visited.has(id))
147
+ return false;
148
+ visited.add(id);
149
+ inStack.add(id);
150
+ const step = stepMap.get(id);
151
+ if (step) {
152
+ for (const dep of step.dependsOn) {
153
+ if (stepIds.has(dep) && hasCycle(dep))
154
+ return true;
155
+ }
156
+ }
157
+ inStack.delete(id);
158
+ return false;
159
+ };
160
+ for (const step of task.steps) {
161
+ if (hasCycle(step.id))
162
+ return false;
163
+ }
164
+ return true;
165
+ }
166
+ validatePlanSemantics(steps) {
167
+ const errors = [];
168
+ const loopingPhrases = [
169
+ "for each",
170
+ "for every",
171
+ "iterate over",
172
+ "loop over",
173
+ "for all"
174
+ ];
175
+ const aggregatorPatterns = [
176
+ "aggregate",
177
+ "compile",
178
+ "combine",
179
+ "merge",
180
+ "final",
181
+ "report"
182
+ ];
183
+ const aggregatorIds = new Set();
184
+ for (const step of steps) {
185
+ const sid = step.id.toLowerCase();
186
+ if (aggregatorPatterns.some((p) => sid.includes(p))) {
187
+ aggregatorIds.add(step.id);
188
+ }
189
+ }
190
+ for (const step of steps) {
191
+ if (aggregatorIds.has(step.id))
192
+ continue;
193
+ const content = step.instructions.toLowerCase();
194
+ for (const phrase of loopingPhrases) {
195
+ if (content.includes(phrase)) {
196
+ errors.push(`Step '${step.id}' contains looping phrase '${phrase}'. Emit one step per item (fan-out) instead.`);
197
+ break;
198
+ }
199
+ }
200
+ }
201
+ const extractorPatterns = [
202
+ "extract",
203
+ "fetch",
204
+ "scrape",
205
+ "crawl",
206
+ "parse",
207
+ "process"
208
+ ];
209
+ const extractorIds = [];
210
+ for (const step of steps) {
211
+ const sid = step.id.toLowerCase();
212
+ if (extractorPatterns.some((p) => sid.includes(p))) {
213
+ extractorIds.push(step.id);
214
+ }
215
+ }
216
+ if (aggregatorIds.size > 0 && extractorIds.length > 0) {
217
+ for (const aggId of aggregatorIds) {
218
+ const agg = steps.find((s) => s.id === aggId);
219
+ if (!agg)
220
+ continue;
221
+ const declaredDeps = new Set(agg.dependsOn);
222
+ const missing = extractorIds.filter((eid) => !declaredDeps.has(eid));
223
+ if (missing.length > 0) {
224
+ errors.push(`Aggregator '${aggId}' must depend on all extractor steps. Missing: ${missing.join(", ")}`);
225
+ }
226
+ }
227
+ }
228
+ return errors;
229
+ }
230
+ // ---------------------------------------------------------------------------
231
+ // Schema normalization
232
+ // ---------------------------------------------------------------------------
233
+ applySchemaOverrides(steps) {
234
+ for (const step of steps) {
235
+ if (!step.outputSchema)
236
+ continue;
237
+ try {
238
+ const parsed = typeof step.outputSchema === "string"
239
+ ? JSON.parse(step.outputSchema)
240
+ : step.outputSchema;
241
+ if (typeof parsed === "object" && parsed !== null) {
242
+ if (!("type" in parsed)) {
243
+ parsed["type"] = "object";
244
+ step.outputSchema = JSON.stringify(parsed);
245
+ }
246
+ }
247
+ }
248
+ catch {
249
+ step.outputSchema = undefined;
250
+ }
251
+ }
252
+ }
253
+ }
254
+ //# sourceMappingURL=create-task-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-task-tool.js","sourceRoot":"","sources":["../../src/tools/create-task-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * DataForSEO search tools.
3
+ *
4
+ * Port of:
5
+ * - src/nodetool/agents/serp_providers/data_for_seo_provider.py
6
+ * - DataForSEO-specific tools from src/nodetool/agents/tools/serp_tools.py
7
+ */
8
+ import type { ProcessingContext } from "@nodetool-ai/runtime";
9
+ import { Tool } from "./base-tool.js";
10
+ import type { SerpProvider } from "./serp-providers/index.js";
11
+ export declare class DataForSEOSearchTool extends Tool {
12
+ readonly name = "dataforseo_search";
13
+ readonly description = "Search Google via DataForSEO to retrieve organic search results.";
14
+ readonly inputSchema: Record<string, unknown>;
15
+ private _provider?;
16
+ constructor(provider?: SerpProvider);
17
+ process(context: ProcessingContext, params: Record<string, unknown>): Promise<unknown>;
18
+ userMessage(params: Record<string, unknown>): string;
19
+ }
20
+ export declare class DataForSEONewsTool extends Tool {
21
+ readonly name = "dataforseo_news";
22
+ readonly description = "Search Google News via DataForSEO to retrieve live news articles.";
23
+ readonly inputSchema: Record<string, unknown>;
24
+ private _provider?;
25
+ constructor(provider?: SerpProvider);
26
+ process(context: ProcessingContext, params: Record<string, unknown>): Promise<unknown>;
27
+ userMessage(params: Record<string, unknown>): string;
28
+ }
29
+ export declare class DataForSEOImagesTool extends Tool {
30
+ readonly name = "dataforseo_images";
31
+ readonly description = "Search Google Images via DataForSEO to retrieve image results.";
32
+ readonly inputSchema: Record<string, unknown>;
33
+ private _provider?;
34
+ constructor(provider?: SerpProvider);
35
+ process(context: ProcessingContext, params: Record<string, unknown>): Promise<unknown>;
36
+ userMessage(params: Record<string, unknown>): string;
37
+ }
38
+ //# sourceMappingURL=dataseo-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataseo-tools.d.ts","sourceRoot":"","sources":["../../src/tools/dataseo-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAmH9D,qBAAa,oBAAqB,SAAQ,IAAI;IAC5C,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,sEACiD;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc3C;IAEF,OAAO,CAAC,SAAS,CAAC,CAAe;gBAErB,QAAQ,CAAC,EAAE,YAAY;IAK7B,OAAO,CACX,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IA6CnB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAKrD;AAMD,qBAAa,kBAAmB,SAAQ,IAAI;IAC1C,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,WAAW,uEACkD;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc3C;IAEF,OAAO,CAAC,SAAS,CAAC,CAAe;gBAErB,QAAQ,CAAC,EAAE,YAAY;IAK7B,OAAO,CACX,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAmDnB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAKrD;AAMD,qBAAa,oBAAqB,SAAQ,IAAI;IAC5C,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,oEAC+C;IACnE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmB3C;IAEF,OAAO,CAAC,SAAS,CAAC,CAAe;gBAErB,QAAQ,CAAC,EAAE,YAAY;IAK7B,OAAO,CACX,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IA+DnB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAQrD"}
@@ -0,0 +1,329 @@
1
+ /**
2
+ * DataForSEO search tools.
3
+ *
4
+ * Port of:
5
+ * - src/nodetool/agents/serp_providers/data_for_seo_provider.py
6
+ * - DataForSEO-specific tools from src/nodetool/agents/tools/serp_tools.py
7
+ */
8
+ import { Tool } from "./base-tool.js";
9
+ /* ------------------------------------------------------------------ */
10
+ /* Helpers */
11
+ /* ------------------------------------------------------------------ */
12
+ const API_BASE = "https://api.dataforseo.com";
13
+ const DEFAULT_LOCATION_CODE = 2840; // United States
14
+ const DEFAULT_LANGUAGE_CODE = "en";
15
+ async function getDataForSEOCredentials(context) {
16
+ const login = (await context.getSecret("DATA_FOR_SEO_LOGIN")) ??
17
+ process.env.DATA_FOR_SEO_LOGIN;
18
+ const password = (await context.getSecret("DATA_FOR_SEO_PASSWORD")) ??
19
+ process.env.DATA_FOR_SEO_PASSWORD;
20
+ if (!login || !password) {
21
+ throw new Error("DataForSEO credentials (DATA_FOR_SEO_LOGIN, DATA_FOR_SEO_PASSWORD) not found.");
22
+ }
23
+ return { login, password };
24
+ }
25
+ function makeAuthHeader(login, password) {
26
+ const encoded = Buffer.from(`${login}:${password}`).toString("base64");
27
+ return `Basic ${encoded}`;
28
+ }
29
+ /** Strip base64-encoded images from result objects to keep payloads small. */
30
+ function removeBase64Images(data) {
31
+ if (Array.isArray(data)) {
32
+ return data.map(removeBase64Images);
33
+ }
34
+ if (data !== null && typeof data === "object") {
35
+ const out = {};
36
+ for (const [k, v] of Object.entries(data)) {
37
+ if (typeof v === "string" && v.startsWith("data:image/"))
38
+ continue;
39
+ out[k] = removeBase64Images(v);
40
+ }
41
+ return out;
42
+ }
43
+ return data;
44
+ }
45
+ async function dataForSEORequest(endpoint, payload, auth) {
46
+ const url = `${API_BASE}${endpoint}`;
47
+ try {
48
+ const res = await fetch(url, {
49
+ method: "POST",
50
+ headers: {
51
+ Authorization: auth,
52
+ "Content-Type": "application/json"
53
+ },
54
+ body: JSON.stringify(payload)
55
+ });
56
+ if (!res.ok) {
57
+ let details;
58
+ try {
59
+ details = await res.json();
60
+ }
61
+ catch {
62
+ details = await res.text();
63
+ }
64
+ return {
65
+ error: `HTTP error occurred: ${res.status} - ${res.statusText}`,
66
+ details
67
+ };
68
+ }
69
+ return (await res.json());
70
+ }
71
+ catch (e) {
72
+ return { error: `DataForSEO request failed: ${e.message}` };
73
+ }
74
+ }
75
+ function extractItems(result) {
76
+ if ("error" in result)
77
+ return result;
78
+ if (result.status_code !== 20000 || result.status_message !== "Ok.") {
79
+ return {
80
+ error: `DataForSEO API Error: ${result.status_code} - ${result.status_message}`,
81
+ details: result
82
+ };
83
+ }
84
+ const taskResult = result.tasks?.[0]?.result;
85
+ if (taskResult && Array.isArray(taskResult) && taskResult.length > 0) {
86
+ return taskResult[0].items ?? [];
87
+ }
88
+ return [];
89
+ }
90
+ /* ------------------------------------------------------------------ */
91
+ /* DataForSEOSearchTool */
92
+ /* ------------------------------------------------------------------ */
93
+ export class DataForSEOSearchTool extends Tool {
94
+ name = "dataforseo_search";
95
+ description = "Search Google via DataForSEO to retrieve organic search results.";
96
+ inputSchema = {
97
+ type: "object",
98
+ properties: {
99
+ keyword: {
100
+ type: "string",
101
+ description: "The keyword to search for."
102
+ },
103
+ num_results: {
104
+ type: "integer",
105
+ description: "Number of results to retrieve.",
106
+ default: 10
107
+ }
108
+ },
109
+ required: ["keyword"]
110
+ };
111
+ _provider;
112
+ constructor(provider) {
113
+ super();
114
+ this._provider = provider;
115
+ }
116
+ async process(context, params) {
117
+ const keyword = params.keyword;
118
+ if (!keyword)
119
+ return { error: "keyword is required" };
120
+ const numResults = params.num_results ?? 10;
121
+ let creds;
122
+ try {
123
+ creds = await getDataForSEOCredentials(context);
124
+ }
125
+ catch (e) {
126
+ return { error: e.message };
127
+ }
128
+ const auth = makeAuthHeader(creds.login, creds.password);
129
+ const payload = [
130
+ {
131
+ keyword,
132
+ location_code: DEFAULT_LOCATION_CODE,
133
+ language_code: DEFAULT_LANGUAGE_CODE,
134
+ device: "desktop",
135
+ os: "windows",
136
+ depth: numResults
137
+ }
138
+ ];
139
+ const result = await dataForSEORequest("/v3/serp/google/organic/live/advanced", payload, auth);
140
+ const items = extractItems(result);
141
+ if (!Array.isArray(items))
142
+ return items;
143
+ const organicResults = items
144
+ .filter((item) => item.type === "organic")
145
+ .map((item) => ({
146
+ title: item.title ?? null,
147
+ url: item.url ?? null,
148
+ snippet: item.description ?? null,
149
+ position: item.rank_absolute ?? null,
150
+ type: "organic"
151
+ }));
152
+ return { success: true, results: removeBase64Images(organicResults) };
153
+ }
154
+ userMessage(params) {
155
+ const keyword = params.keyword ?? "something";
156
+ const msg = `Searching Google (DataForSEO) for '${keyword}'...`;
157
+ return msg.length > 80 ? "Searching Google (DataForSEO)..." : msg;
158
+ }
159
+ }
160
+ /* ------------------------------------------------------------------ */
161
+ /* DataForSEONewsTool */
162
+ /* ------------------------------------------------------------------ */
163
+ export class DataForSEONewsTool extends Tool {
164
+ name = "dataforseo_news";
165
+ description = "Search Google News via DataForSEO to retrieve live news articles.";
166
+ inputSchema = {
167
+ type: "object",
168
+ properties: {
169
+ keyword: {
170
+ type: "string",
171
+ description: "The keyword to search for in Google News."
172
+ },
173
+ num_results: {
174
+ type: "integer",
175
+ description: "Number of news results to retrieve.",
176
+ default: 10
177
+ }
178
+ },
179
+ required: ["keyword"]
180
+ };
181
+ _provider;
182
+ constructor(provider) {
183
+ super();
184
+ this._provider = provider;
185
+ }
186
+ async process(context, params) {
187
+ const keyword = params.keyword;
188
+ if (!keyword)
189
+ return { error: "keyword is required" };
190
+ const numResults = params.num_results ?? 10;
191
+ let creds;
192
+ try {
193
+ creds = await getDataForSEOCredentials(context);
194
+ }
195
+ catch (e) {
196
+ return { error: e.message };
197
+ }
198
+ const auth = makeAuthHeader(creds.login, creds.password);
199
+ const payload = [
200
+ {
201
+ keyword,
202
+ location_code: DEFAULT_LOCATION_CODE,
203
+ language_code: DEFAULT_LANGUAGE_CODE,
204
+ sort_by: "relevance",
205
+ depth: numResults
206
+ }
207
+ ];
208
+ const result = await dataForSEORequest("/v3/serp/google/news/live/advanced", payload, auth);
209
+ const items = extractItems(result);
210
+ if (!Array.isArray(items))
211
+ return items;
212
+ const newsResults = items
213
+ .filter((item) => item.type === "news_search" || item.type === "top_stories")
214
+ .map((item) => {
215
+ const timestamp = item.timestamp;
216
+ const publishedAt = timestamp ? timestamp.split(" ")[0] : null;
217
+ return {
218
+ title: item.title ?? null,
219
+ url: item.url ?? null,
220
+ source: item.source ?? null,
221
+ published_at: publishedAt,
222
+ snippet: item.description ?? null,
223
+ type: "news"
224
+ };
225
+ });
226
+ return { success: true, results: removeBase64Images(newsResults) };
227
+ }
228
+ userMessage(params) {
229
+ const keyword = params.keyword ?? "something";
230
+ const msg = `Searching Google News (DataForSEO) for '${keyword}'...`;
231
+ return msg.length > 80 ? "Searching Google News (DataForSEO)..." : msg;
232
+ }
233
+ }
234
+ /* ------------------------------------------------------------------ */
235
+ /* DataForSEOImagesTool */
236
+ /* ------------------------------------------------------------------ */
237
+ export class DataForSEOImagesTool extends Tool {
238
+ name = "dataforseo_images";
239
+ description = "Search Google Images via DataForSEO to retrieve image results.";
240
+ inputSchema = {
241
+ type: "object",
242
+ properties: {
243
+ keyword: {
244
+ type: "string",
245
+ description: "Keyword for image search. (Optional if image_url is provided)"
246
+ },
247
+ image_url: {
248
+ type: "string",
249
+ description: "URL of an image for reverse search. (Optional if keyword is provided)"
250
+ },
251
+ num_results: {
252
+ type: "integer",
253
+ description: "Number of image results to retrieve.",
254
+ default: 20
255
+ }
256
+ }
257
+ };
258
+ _provider;
259
+ constructor(provider) {
260
+ super();
261
+ this._provider = provider;
262
+ }
263
+ async process(context, params) {
264
+ const keyword = params.keyword;
265
+ const imageUrl = params.image_url;
266
+ const numResults = params.num_results ?? 20;
267
+ if (!keyword && !imageUrl) {
268
+ return {
269
+ error: "One of 'keyword' or 'image_url' is required for image search."
270
+ };
271
+ }
272
+ let creds;
273
+ try {
274
+ creds = await getDataForSEOCredentials(context);
275
+ }
276
+ catch (e) {
277
+ return { error: e.message };
278
+ }
279
+ const auth = makeAuthHeader(creds.login, creds.password);
280
+ const payloadDict = {
281
+ location_code: DEFAULT_LOCATION_CODE,
282
+ language_code: DEFAULT_LANGUAGE_CODE,
283
+ depth: numResults
284
+ };
285
+ if (keyword)
286
+ payloadDict.keyword = keyword;
287
+ if (imageUrl)
288
+ payloadDict.image_url = imageUrl;
289
+ const result = await dataForSEORequest("/v3/serp/google/images/live/advanced", [payloadDict], auth);
290
+ const items = extractItems(result);
291
+ if (!Array.isArray(items))
292
+ return items;
293
+ const imageResults = [];
294
+ for (const item of items) {
295
+ if (item.type === "images_search") {
296
+ imageResults.push({
297
+ title: item.title ?? null,
298
+ image_url: item.image_url ?? null,
299
+ source_url: item.source_url ?? null,
300
+ alt_text: item.alt ?? null,
301
+ type: "image"
302
+ });
303
+ }
304
+ else if (item.type === "carousel" && Array.isArray(item.items)) {
305
+ for (const ci of item.items) {
306
+ if (ci.type === "carousel_element" && ci.image_url) {
307
+ imageResults.push({
308
+ title: ci.title ?? null,
309
+ image_url: ci.image_url ?? null,
310
+ source_url: ci.url ?? null,
311
+ alt_text: ci.title ?? null,
312
+ type: "image_carousel_element"
313
+ });
314
+ }
315
+ }
316
+ }
317
+ }
318
+ return { success: true, results: removeBase64Images(imageResults) };
319
+ }
320
+ userMessage(params) {
321
+ const keyword = params.keyword;
322
+ if (keyword) {
323
+ const msg = `Searching Google Images (DataForSEO) for '${keyword}'...`;
324
+ return msg.length > 80 ? "Searching Google Images (DataForSEO)..." : msg;
325
+ }
326
+ return "Searching Google Images (DataForSEO)...";
327
+ }
328
+ }
329
+ //# sourceMappingURL=dataseo-tools.js.map