@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.
- package/dist/agent-executor.d.ts +62 -0
- package/dist/agent-executor.d.ts.map +1 -0
- package/dist/agent-executor.js +324 -0
- package/dist/agent-executor.js.map +1 -0
- package/dist/agent-step-executor.d.ts +28 -0
- package/dist/agent-step-executor.d.ts.map +1 -0
- package/dist/agent-step-executor.js +99 -0
- package/dist/agent-step-executor.js.map +1 -0
- package/dist/agent-workflow-runner.d.ts +31 -0
- package/dist/agent-workflow-runner.d.ts.map +1 -0
- package/dist/agent-workflow-runner.js +124 -0
- package/dist/agent-workflow-runner.js.map +1 -0
- package/dist/agent.d.ts +115 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +587 -0
- package/dist/agent.js.map +1 -0
- package/dist/base-agent.d.ts +42 -0
- package/dist/base-agent.d.ts.map +1 -0
- package/dist/base-agent.js +29 -0
- package/dist/base-agent.js.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/graph-builder.d.ts +49 -0
- package/dist/graph-builder.d.ts.map +1 -0
- package/dist/graph-builder.js +206 -0
- package/dist/graph-builder.js.map +1 -0
- package/dist/graph-planner.d.ts +56 -0
- package/dist/graph-planner.d.ts.map +1 -0
- package/dist/graph-planner.js +311 -0
- package/dist/graph-planner.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/js-sandbox.d.ts +84 -0
- package/dist/js-sandbox.d.ts.map +1 -0
- package/dist/js-sandbox.js +654 -0
- package/dist/js-sandbox.js.map +1 -0
- package/dist/multi-mode-agent.d.ts +86 -0
- package/dist/multi-mode-agent.d.ts.map +1 -0
- package/dist/multi-mode-agent.js +476 -0
- package/dist/multi-mode-agent.js.map +1 -0
- package/dist/output-format.d.ts +10 -0
- package/dist/output-format.d.ts.map +1 -0
- package/dist/output-format.js +17 -0
- package/dist/output-format.js.map +1 -0
- package/dist/parallel-task-executor.d.ts +87 -0
- package/dist/parallel-task-executor.d.ts.map +1 -0
- package/dist/parallel-task-executor.js +332 -0
- package/dist/parallel-task-executor.js.map +1 -0
- package/dist/prompts/graph-planner-prompt.d.ts +48 -0
- package/dist/prompts/graph-planner-prompt.d.ts.map +1 -0
- package/dist/prompts/graph-planner-prompt.js +180 -0
- package/dist/prompts/graph-planner-prompt.js.map +1 -0
- package/dist/reject-agentic-provider.d.ts +21 -0
- package/dist/reject-agentic-provider.d.ts.map +1 -0
- package/dist/reject-agentic-provider.js +32 -0
- package/dist/reject-agentic-provider.js.map +1 -0
- package/dist/simple-agent.d.ts +29 -0
- package/dist/simple-agent.d.ts.map +1 -0
- package/dist/simple-agent.js +54 -0
- package/dist/simple-agent.js.map +1 -0
- package/dist/step-executor.d.ts +162 -0
- package/dist/step-executor.d.ts.map +1 -0
- package/dist/step-executor.js +1114 -0
- package/dist/step-executor.js.map +1 -0
- package/dist/sub-agent-planner.d.ts +33 -0
- package/dist/sub-agent-planner.d.ts.map +1 -0
- package/dist/sub-agent-planner.js +203 -0
- package/dist/sub-agent-planner.js.map +1 -0
- package/dist/task-executor.d.ts +89 -0
- package/dist/task-executor.d.ts.map +1 -0
- package/dist/task-executor.js +359 -0
- package/dist/task-executor.js.map +1 -0
- package/dist/task-planner.d.ts +44 -0
- package/dist/task-planner.d.ts.map +1 -0
- package/dist/task-planner.js +532 -0
- package/dist/task-planner.js.map +1 -0
- package/dist/team/db-task-board.d.ts +54 -0
- package/dist/team/db-task-board.d.ts.map +1 -0
- package/dist/team/db-task-board.js +361 -0
- package/dist/team/db-task-board.js.map +1 -0
- package/dist/team/edge-message-bus.d.ts +51 -0
- package/dist/team/edge-message-bus.d.ts.map +1 -0
- package/dist/team/edge-message-bus.js +169 -0
- package/dist/team/edge-message-bus.js.map +1 -0
- package/dist/team/edge-task-board.d.ts +77 -0
- package/dist/team/edge-task-board.d.ts.map +1 -0
- package/dist/team/edge-task-board.js +140 -0
- package/dist/team/edge-task-board.js.map +1 -0
- package/dist/team/index.d.ts +16 -0
- package/dist/team/index.d.ts.map +1 -0
- package/dist/team/index.js +17 -0
- package/dist/team/index.js.map +1 -0
- package/dist/team/message-bus.d.ts +58 -0
- package/dist/team/message-bus.d.ts.map +1 -0
- package/dist/team/message-bus.js +151 -0
- package/dist/team/message-bus.js.map +1 -0
- package/dist/team/task-board.d.ts +106 -0
- package/dist/team/task-board.d.ts.map +1 -0
- package/dist/team/task-board.js +370 -0
- package/dist/team/task-board.js.map +1 -0
- package/dist/team/team-executor.d.ts +72 -0
- package/dist/team/team-executor.d.ts.map +1 -0
- package/dist/team/team-executor.js +466 -0
- package/dist/team/team-executor.js.map +1 -0
- package/dist/team/team-tools.d.ts +252 -0
- package/dist/team/team-tools.d.ts.map +1 -0
- package/dist/team/team-tools.js +412 -0
- package/dist/team/team-tools.js.map +1 -0
- package/dist/team/types.d.ts +198 -0
- package/dist/team/types.d.ts.map +1 -0
- package/dist/team/types.js +8 -0
- package/dist/team/types.js.map +1 -0
- package/dist/tools/add-edge-tool.d.ts +18 -0
- package/dist/tools/add-edge-tool.d.ts.map +1 -0
- package/dist/tools/add-edge-tool.js +92 -0
- package/dist/tools/add-edge-tool.js.map +1 -0
- package/dist/tools/add-node-tool.d.ts +22 -0
- package/dist/tools/add-node-tool.d.ts.map +1 -0
- package/dist/tools/add-node-tool.js +128 -0
- package/dist/tools/add-node-tool.js.map +1 -0
- package/dist/tools/asset-tools.d.ts +58 -0
- package/dist/tools/asset-tools.d.ts.map +1 -0
- package/dist/tools/asset-tools.js +191 -0
- package/dist/tools/asset-tools.js.map +1 -0
- package/dist/tools/base-tool.d.ts +25 -0
- package/dist/tools/base-tool.d.ts.map +1 -0
- package/dist/tools/base-tool.js +24 -0
- package/dist/tools/base-tool.js.map +1 -0
- package/dist/tools/browser-tools.d.ts +32 -0
- package/dist/tools/browser-tools.d.ts.map +1 -0
- package/dist/tools/browser-tools.js +208 -0
- package/dist/tools/browser-tools.js.map +1 -0
- package/dist/tools/calculator-tool.d.ts +24 -0
- package/dist/tools/calculator-tool.d.ts.map +1 -0
- package/dist/tools/calculator-tool.js +64 -0
- package/dist/tools/calculator-tool.js.map +1 -0
- package/dist/tools/claude-code-tools.d.ts +96 -0
- package/dist/tools/claude-code-tools.d.ts.map +1 -0
- package/dist/tools/claude-code-tools.js +463 -0
- package/dist/tools/claude-code-tools.js.map +1 -0
- package/dist/tools/code-tools.d.ts +26 -0
- package/dist/tools/code-tools.d.ts.map +1 -0
- package/dist/tools/code-tools.js +82 -0
- package/dist/tools/code-tools.js.map +1 -0
- package/dist/tools/control-tool.d.ts +47 -0
- package/dist/tools/control-tool.d.ts.map +1 -0
- package/dist/tools/control-tool.js +101 -0
- package/dist/tools/control-tool.js.map +1 -0
- package/dist/tools/create-plan-tool.d.ts +29 -0
- package/dist/tools/create-plan-tool.d.ts.map +1 -0
- package/dist/tools/create-plan-tool.js +355 -0
- package/dist/tools/create-plan-tool.js.map +1 -0
- package/dist/tools/create-task-tool.d.ts +28 -0
- package/dist/tools/create-task-tool.d.ts.map +1 -0
- package/dist/tools/create-task-tool.js +254 -0
- package/dist/tools/create-task-tool.js.map +1 -0
- package/dist/tools/dataseo-tools.d.ts +38 -0
- package/dist/tools/dataseo-tools.d.ts.map +1 -0
- package/dist/tools/dataseo-tools.js +329 -0
- package/dist/tools/dataseo-tools.js.map +1 -0
- package/dist/tools/email-tools.d.ts +76 -0
- package/dist/tools/email-tools.d.ts.map +1 -0
- package/dist/tools/email-tools.js +259 -0
- package/dist/tools/email-tools.js.map +1 -0
- package/dist/tools/filesystem-tools.d.ts +77 -0
- package/dist/tools/filesystem-tools.d.ts.map +1 -0
- package/dist/tools/filesystem-tools.js +334 -0
- package/dist/tools/filesystem-tools.js.map +1 -0
- package/dist/tools/find-model-tool.d.ts +25 -0
- package/dist/tools/find-model-tool.d.ts.map +1 -0
- package/dist/tools/find-model-tool.js +236 -0
- package/dist/tools/find-model-tool.js.map +1 -0
- package/dist/tools/finish-graph-tool.d.ts +23 -0
- package/dist/tools/finish-graph-tool.d.ts.map +1 -0
- package/dist/tools/finish-graph-tool.js +46 -0
- package/dist/tools/finish-graph-tool.js.map +1 -0
- package/dist/tools/finish-step-tool.d.ts +16 -0
- package/dist/tools/finish-step-tool.d.ts.map +1 -0
- package/dist/tools/finish-step-tool.js +68 -0
- package/dist/tools/finish-step-tool.js.map +1 -0
- package/dist/tools/google-tools.d.ts +44 -0
- package/dist/tools/google-tools.d.ts.map +1 -0
- package/dist/tools/google-tools.js +176 -0
- package/dist/tools/google-tools.js.map +1 -0
- package/dist/tools/http-tools.d.ts +56 -0
- package/dist/tools/http-tools.d.ts.map +1 -0
- package/dist/tools/http-tools.js +180 -0
- package/dist/tools/http-tools.js.map +1 -0
- package/dist/tools/js-code-tool.d.ts +30 -0
- package/dist/tools/js-code-tool.d.ts.map +1 -0
- package/dist/tools/js-code-tool.js +98 -0
- package/dist/tools/js-code-tool.js.map +1 -0
- package/dist/tools/local-get-node-info-tool.d.ts +19 -0
- package/dist/tools/local-get-node-info-tool.d.ts.map +1 -0
- package/dist/tools/local-get-node-info-tool.js +75 -0
- package/dist/tools/local-get-node-info-tool.js.map +1 -0
- package/dist/tools/local-list-nodes-tool.d.ts +19 -0
- package/dist/tools/local-list-nodes-tool.d.ts.map +1 -0
- package/dist/tools/local-list-nodes-tool.js +69 -0
- package/dist/tools/local-list-nodes-tool.js.map +1 -0
- package/dist/tools/local-search-nodes-tool.d.ts +21 -0
- package/dist/tools/local-search-nodes-tool.d.ts.map +1 -0
- package/dist/tools/local-search-nodes-tool.js +111 -0
- package/dist/tools/local-search-nodes-tool.js.map +1 -0
- package/dist/tools/math-tools.d.ts +156 -0
- package/dist/tools/math-tools.d.ts.map +1 -0
- package/dist/tools/math-tools.js +422 -0
- package/dist/tools/math-tools.js.map +1 -0
- package/dist/tools/mcp-tools.d.ts +413 -0
- package/dist/tools/mcp-tools.d.ts.map +1 -0
- package/dist/tools/mcp-tools.js +618 -0
- package/dist/tools/mcp-tools.js.map +1 -0
- package/dist/tools/media-tools.d.ts +277 -0
- package/dist/tools/media-tools.d.ts.map +1 -0
- package/dist/tools/media-tools.js +682 -0
- package/dist/tools/media-tools.js.map +1 -0
- package/dist/tools/model-tools.d.ts +25 -0
- package/dist/tools/model-tools.d.ts.map +1 -0
- package/dist/tools/model-tools.js +48 -0
- package/dist/tools/model-tools.js.map +1 -0
- package/dist/tools/openai-tools.d.ts +73 -0
- package/dist/tools/openai-tools.d.ts.map +1 -0
- package/dist/tools/openai-tools.js +193 -0
- package/dist/tools/openai-tools.js.map +1 -0
- package/dist/tools/pdf-tools.d.ts +152 -0
- package/dist/tools/pdf-tools.d.ts.map +1 -0
- package/dist/tools/pdf-tools.js +339 -0
- package/dist/tools/pdf-tools.js.map +1 -0
- package/dist/tools/plan-builder-tools.d.ts +72 -0
- package/dist/tools/plan-builder-tools.d.ts.map +1 -0
- package/dist/tools/plan-builder-tools.js +438 -0
- package/dist/tools/plan-builder-tools.js.map +1 -0
- package/dist/tools/search-tools.d.ts +39 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +218 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/tools/serp-providers/dataforseo-provider.d.ts +14 -0
- package/dist/tools/serp-providers/dataforseo-provider.d.ts.map +1 -0
- package/dist/tools/serp-providers/dataforseo-provider.js +114 -0
- package/dist/tools/serp-providers/dataforseo-provider.js.map +1 -0
- package/dist/tools/serp-providers/index.d.ts +35 -0
- package/dist/tools/serp-providers/index.d.ts.map +1 -0
- package/dist/tools/serp-providers/index.js +14 -0
- package/dist/tools/serp-providers/index.js.map +1 -0
- package/dist/tools/serp-providers/serpapi-provider.d.ts +18 -0
- package/dist/tools/serp-providers/serpapi-provider.d.ts.map +1 -0
- package/dist/tools/serp-providers/serpapi-provider.js +66 -0
- package/dist/tools/serp-providers/serpapi-provider.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +9 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +17 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/vector-tools.d.ts +224 -0
- package/dist/tools/vector-tools.d.ts.map +1 -0
- package/dist/tools/vector-tools.js +582 -0
- package/dist/tools/vector-tools.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +58 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +152 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/json-parser.d.ts +15 -0
- package/dist/utils/json-parser.d.ts.map +1 -0
- package/dist/utils/json-parser.js +78 -0
- package/dist/utils/json-parser.js.map +1 -0
- package/dist/utils/remove-base64-images.d.ts +12 -0
- package/dist/utils/remove-base64-images.d.ts.map +1 -0
- package/dist/utils/remove-base64-images.js +20 -0
- package/dist/utils/remove-base64-images.js.map +1 -0
- package/dist/utils/wrap-generators-parallel.d.ts +11 -0
- package/dist/utils/wrap-generators-parallel.d.ts.map +1 -0
- package/dist/utils/wrap-generators-parallel.js +38 -0
- package/dist/utils/wrap-generators-parallel.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code execution tool — runs JavaScript in a QuickJS sandbox.
|
|
3
|
+
*
|
|
4
|
+
* Only JavaScript is supported. TypeScript, Python, and Bash have been
|
|
5
|
+
* removed for security (no subprocess spawning).
|
|
6
|
+
*/
|
|
7
|
+
import { Tool } from "./base-tool.js";
|
|
8
|
+
import { runInSandbox } from "../js-sandbox.js";
|
|
9
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
10
|
+
export class RunCodeTool extends Tool {
|
|
11
|
+
name = "run_code";
|
|
12
|
+
description = "Execute JavaScript code in a sandboxed QuickJS environment. Only javascript is supported.";
|
|
13
|
+
inputSchema = {
|
|
14
|
+
type: "object",
|
|
15
|
+
properties: {
|
|
16
|
+
language: {
|
|
17
|
+
type: "string",
|
|
18
|
+
enum: ["javascript"],
|
|
19
|
+
description: "The language to use. Only 'javascript' is supported."
|
|
20
|
+
},
|
|
21
|
+
code: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "JavaScript source code to execute."
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
required: ["language", "code"]
|
|
27
|
+
};
|
|
28
|
+
timeoutMs;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
super();
|
|
31
|
+
this.timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
32
|
+
}
|
|
33
|
+
async process(context, params) {
|
|
34
|
+
const language = params.language;
|
|
35
|
+
const code = params.code;
|
|
36
|
+
if (!code || typeof code !== "string" || !code.trim()) {
|
|
37
|
+
return { stdout: "", stderr: "No code provided.", exitCode: 1 };
|
|
38
|
+
}
|
|
39
|
+
if (language !== "javascript") {
|
|
40
|
+
return {
|
|
41
|
+
stdout: "",
|
|
42
|
+
stderr: `Unsupported language: ${language}. Only 'javascript' is supported.`,
|
|
43
|
+
exitCode: 1
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const result = await runInSandbox({
|
|
47
|
+
code,
|
|
48
|
+
context,
|
|
49
|
+
timeoutMs: this.timeoutMs
|
|
50
|
+
});
|
|
51
|
+
const logs = result.logs?.join("\n") ?? "";
|
|
52
|
+
if (result.success) {
|
|
53
|
+
const output = result.result !== undefined && result.result !== null
|
|
54
|
+
? typeof result.result === "string"
|
|
55
|
+
? result.result
|
|
56
|
+
: JSON.stringify(result.result, null, 2)
|
|
57
|
+
: "";
|
|
58
|
+
const stdout = logs ? `${logs}\n${output}`.trim() : output;
|
|
59
|
+
return { stdout, stderr: "", exitCode: 0 };
|
|
60
|
+
}
|
|
61
|
+
const errorParts = [];
|
|
62
|
+
if (logs)
|
|
63
|
+
errorParts.push(logs);
|
|
64
|
+
if (result.error)
|
|
65
|
+
errorParts.push(result.error);
|
|
66
|
+
if (result.stack)
|
|
67
|
+
errorParts.push(result.stack);
|
|
68
|
+
return {
|
|
69
|
+
stdout: "",
|
|
70
|
+
stderr: errorParts.join("\n").trim(),
|
|
71
|
+
exitCode: 1
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
userMessage(params) {
|
|
75
|
+
const code = params.code ?? "";
|
|
76
|
+
if (code.length > 0 && code.length < 50) {
|
|
77
|
+
return `Executing javascript: '${code.slice(0, 40)}...'`;
|
|
78
|
+
}
|
|
79
|
+
return "Executing javascript...";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=code-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-tools.js","sourceRoot":"","sources":["../../src/tools/code-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAQlC,MAAM,OAAO,WAAY,SAAQ,IAAI;IAC1B,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAClB,2FAA2F,CAAC;IACrF,WAAW,GAA4B;QAC9C,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,YAAY,CAAC;gBACpB,WAAW,EAAE,sDAAsD;aACpE;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;KAC/B,CAAC;IAEe,SAAS,CAAS;IAEnC,YAAY,OAAgC;QAC1C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,kBAAkB,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA0B,EAC1B,MAA+B;QAE/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAkB,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAc,CAAC;QAEnC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACtD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAClE,CAAC;QAED,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,yBAAyB,QAAQ,mCAAmC;gBAC5E,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAE3C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;gBACnD,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;oBACjC,CAAC,CAAC,MAAM,CAAC,MAAM;oBACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,IAAI;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,KAAK;YAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,KAAK;YAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhD,OAAO;YACL,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;YACpC,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,MAA+B;QACzC,MAAM,IAAI,GAAI,MAAM,CAAC,IAAe,IAAI,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxC,OAAO,0BAA0B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;QAC3D,CAAC;QACD,OAAO,yBAAyB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Control Node Tool for Agent-based Control Edge System
|
|
3
|
+
*
|
|
4
|
+
* Port of src/nodetool/agents/tools/control_tool.py
|
|
5
|
+
*
|
|
6
|
+
* When an agent has outgoing control edges, ControlNodeTool instances are
|
|
7
|
+
* automatically added to its tool list. When the agent calls a control tool,
|
|
8
|
+
* it creates a RunEvent for dispatch to the controlled node.
|
|
9
|
+
*/
|
|
10
|
+
import type { ProcessingContext } from "@nodetool-ai/runtime";
|
|
11
|
+
import type { ControlEvent } from "@nodetool-ai/protocol";
|
|
12
|
+
import { Tool } from "./base-tool.js";
|
|
13
|
+
/**
|
|
14
|
+
* Convert a node title to a valid tool name (snake_case, max 64 chars).
|
|
15
|
+
*/
|
|
16
|
+
export declare function sanitizeToolName(name: string): string;
|
|
17
|
+
export interface ControlNodeInfo {
|
|
18
|
+
node_id: string;
|
|
19
|
+
node_type: string;
|
|
20
|
+
node_title: string;
|
|
21
|
+
node_description?: string;
|
|
22
|
+
control_actions?: Record<string, {
|
|
23
|
+
properties?: Record<string, Record<string, unknown>>;
|
|
24
|
+
}>;
|
|
25
|
+
properties?: Record<string, unknown>;
|
|
26
|
+
upstream_data?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
export declare class ControlNodeTool extends Tool {
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly description: string;
|
|
31
|
+
readonly inputSchema: Record<string, unknown>;
|
|
32
|
+
readonly targetNodeId: string;
|
|
33
|
+
readonly nodeInfo: ControlNodeInfo;
|
|
34
|
+
constructor(targetNodeId: string, nodeInfo: ControlNodeInfo);
|
|
35
|
+
/**
|
|
36
|
+
* Create a control event from tool arguments.
|
|
37
|
+
*/
|
|
38
|
+
createControlEvent(args: Record<string, unknown>): ControlEvent;
|
|
39
|
+
userMessage(params: Record<string, unknown>): string;
|
|
40
|
+
/**
|
|
41
|
+
* Stub process method for tool interface compatibility.
|
|
42
|
+
* In the normal control flow, control tools are intercepted by the
|
|
43
|
+
* execution loop and converted to control events.
|
|
44
|
+
*/
|
|
45
|
+
process(_context: ProcessingContext, params: Record<string, unknown>): Promise<unknown>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=control-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-tool.d.ts","sourceRoot":"","sources":["../../src/tools/control-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CACtB,MAAM,EACN;QACE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;KACtD,CACF,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,qBAAa,eAAgB,SAAQ,IAAI;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;gBAEvB,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe;IA0C3D;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY;IAI/D,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAQpD;;;;OAIG;IACG,OAAO,CACX,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;CAKpB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Control Node Tool for Agent-based Control Edge System
|
|
3
|
+
*
|
|
4
|
+
* Port of src/nodetool/agents/tools/control_tool.py
|
|
5
|
+
*
|
|
6
|
+
* When an agent has outgoing control edges, ControlNodeTool instances are
|
|
7
|
+
* automatically added to its tool list. When the agent calls a control tool,
|
|
8
|
+
* it creates a RunEvent for dispatch to the controlled node.
|
|
9
|
+
*/
|
|
10
|
+
import { Tool } from "./base-tool.js";
|
|
11
|
+
/**
|
|
12
|
+
* Convert a node title to a valid tool name (snake_case, max 64 chars).
|
|
13
|
+
*/
|
|
14
|
+
export function sanitizeToolName(name) {
|
|
15
|
+
if (typeof name !== "string" || !name)
|
|
16
|
+
return "control_node";
|
|
17
|
+
let s = name
|
|
18
|
+
// Replace non-alphanumeric with underscores
|
|
19
|
+
.replace(/[^a-zA-Z0-9]/g, "_")
|
|
20
|
+
// camelCase → snake_case
|
|
21
|
+
.replace(/([a-z])([A-Z])/g, "$1_$2")
|
|
22
|
+
.toLowerCase()
|
|
23
|
+
// Collapse consecutive underscores
|
|
24
|
+
.replace(/_+/g, "_")
|
|
25
|
+
// Strip leading/trailing underscores
|
|
26
|
+
.replace(/^_+|_+$/g, "");
|
|
27
|
+
if (!s)
|
|
28
|
+
return "control_node";
|
|
29
|
+
if (s.length > 64)
|
|
30
|
+
s = s.slice(0, 64);
|
|
31
|
+
return s;
|
|
32
|
+
}
|
|
33
|
+
export class ControlNodeTool extends Tool {
|
|
34
|
+
name;
|
|
35
|
+
description;
|
|
36
|
+
inputSchema;
|
|
37
|
+
targetNodeId;
|
|
38
|
+
nodeInfo;
|
|
39
|
+
constructor(targetNodeId, nodeInfo) {
|
|
40
|
+
super();
|
|
41
|
+
this.targetNodeId = targetNodeId;
|
|
42
|
+
this.nodeInfo = nodeInfo;
|
|
43
|
+
// Build schema from the "run" action properties
|
|
44
|
+
const actions = nodeInfo.control_actions ?? {};
|
|
45
|
+
const runAction = actions["run"] ?? {};
|
|
46
|
+
const rawProperties = runAction.properties ?? {};
|
|
47
|
+
const properties = {};
|
|
48
|
+
for (const [key, schema] of Object.entries(rawProperties)) {
|
|
49
|
+
if (typeof schema === "object" && schema !== null) {
|
|
50
|
+
properties[key] = { ...schema };
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
properties[key] = { type: "string", description: String(schema) };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
this.inputSchema = {
|
|
57
|
+
type: "object",
|
|
58
|
+
properties,
|
|
59
|
+
required: []
|
|
60
|
+
};
|
|
61
|
+
// Set name from normalized node title
|
|
62
|
+
const nodeTitle = nodeInfo.node_title || targetNodeId;
|
|
63
|
+
this.name = sanitizeToolName(nodeTitle);
|
|
64
|
+
// Set description
|
|
65
|
+
if (nodeInfo.node_description) {
|
|
66
|
+
this.description = nodeInfo.node_description;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
let desc = `Control ${nodeTitle}: trigger execution with optional property overrides`;
|
|
70
|
+
const propNames = Object.keys(properties);
|
|
71
|
+
if (propNames.length > 0) {
|
|
72
|
+
desc += `. Available properties: ${propNames.join(", ")}`;
|
|
73
|
+
}
|
|
74
|
+
this.description = desc;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a control event from tool arguments.
|
|
79
|
+
*/
|
|
80
|
+
createControlEvent(args) {
|
|
81
|
+
return { event_type: "run", properties: args };
|
|
82
|
+
}
|
|
83
|
+
userMessage(params) {
|
|
84
|
+
const nodeTitle = this.nodeInfo.node_title || this.targetNodeId;
|
|
85
|
+
if (params && Object.keys(params).length > 0) {
|
|
86
|
+
return `Triggering ${nodeTitle} with properties: ${Object.keys(params).join(", ")}`;
|
|
87
|
+
}
|
|
88
|
+
return `Triggering ${nodeTitle}`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Stub process method for tool interface compatibility.
|
|
92
|
+
* In the normal control flow, control tools are intercepted by the
|
|
93
|
+
* execution loop and converted to control events.
|
|
94
|
+
*/
|
|
95
|
+
async process(_context, params) {
|
|
96
|
+
const event = this.createControlEvent(params);
|
|
97
|
+
const nodeTitle = this.nodeInfo.node_title || this.targetNodeId;
|
|
98
|
+
return `Created ${event.event_type} event for ${nodeTitle} with properties: ${Object.keys(params).join(", ")}`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=control-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-tool.js","sourceRoot":"","sources":["../../src/tools/control-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool for creating and validating a multi-task execution plan.
|
|
3
|
+
*
|
|
4
|
+
* Used by TaskPlanner to let the LLM produce a validated TaskPlan
|
|
5
|
+
* 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 { TaskPlan } from "../types.js";
|
|
10
|
+
export declare class CreatePlanTool extends Tool {
|
|
11
|
+
readonly name = "create_plan";
|
|
12
|
+
readonly description: string;
|
|
13
|
+
readonly inputSchema: Record<string, unknown>;
|
|
14
|
+
/** Captured validated plan, or null if not yet created. */
|
|
15
|
+
private _plan;
|
|
16
|
+
/** Input keys for dependency validation. */
|
|
17
|
+
private readonly inputKeys;
|
|
18
|
+
constructor(inputs?: Record<string, unknown>);
|
|
19
|
+
get plan(): TaskPlan | null;
|
|
20
|
+
process(_context: ProcessingContext, params: Record<string, unknown>): Promise<unknown>;
|
|
21
|
+
userMessage(params: Record<string, unknown>): string;
|
|
22
|
+
private buildTaskPlan;
|
|
23
|
+
private validateTaskPlan;
|
|
24
|
+
private checkForTaskCycles;
|
|
25
|
+
private checkForStepCycles;
|
|
26
|
+
private validatePlanSemantics;
|
|
27
|
+
private applySchemaOverrides;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=create-plan-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-plan-tool.d.ts","sourceRoot":"","sources":["../../src/tools/create-plan-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,EAAc,QAAQ,EAAE,MAAM,aAAa,CAAC;AAkDxD,qBAAa,cAAe,SAAQ,IAAI;IACtC,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,SAEsD;IAC1E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAA4B;IAEzE,2DAA2D;IAC3D,OAAO,CAAC,KAAK,CAAyB;IAEtC,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAE5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAK5C,IAAI,IAAI,IAAI,QAAQ,GAAG,IAAI,CAE1B;IAEK,OAAO,CACX,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAyBnB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAUpD,OAAO,CAAC,aAAa;IA+DrB,OAAO,CAAC,gBAAgB;IA8ExB,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,qBAAqB;IAgF7B,OAAO,CAAC,oBAAoB;CAmB7B"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool for creating and validating a multi-task execution plan.
|
|
3
|
+
*
|
|
4
|
+
* Used by TaskPlanner to let the LLM produce a validated TaskPlan
|
|
5
|
+
* 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_plan tool input.
|
|
11
|
+
*/
|
|
12
|
+
const CREATE_PLAN_INPUT_SCHEMA = {
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {
|
|
15
|
+
title: { type: "string", description: "Overall plan title" },
|
|
16
|
+
tasks: {
|
|
17
|
+
type: "array",
|
|
18
|
+
description: "Independent tasks to execute in parallel. Each task runs as its own sub-agent.",
|
|
19
|
+
items: {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties: {
|
|
22
|
+
id: { type: "string", description: "Unique task identifier" },
|
|
23
|
+
title: { type: "string", description: "Task title" },
|
|
24
|
+
depends_on: {
|
|
25
|
+
type: "array",
|
|
26
|
+
items: { type: "string" },
|
|
27
|
+
description: "Task IDs this task depends on ([] for independent)"
|
|
28
|
+
},
|
|
29
|
+
steps: {
|
|
30
|
+
type: "array",
|
|
31
|
+
items: {
|
|
32
|
+
type: "object",
|
|
33
|
+
properties: {
|
|
34
|
+
id: { type: "string" },
|
|
35
|
+
instructions: { type: "string" },
|
|
36
|
+
depends_on: {
|
|
37
|
+
type: "array",
|
|
38
|
+
items: { type: "string" },
|
|
39
|
+
description: "Step IDs within this task"
|
|
40
|
+
},
|
|
41
|
+
output_schema: { type: "string" },
|
|
42
|
+
tools: { type: "array", items: { type: "string" } }
|
|
43
|
+
},
|
|
44
|
+
required: ["id", "instructions", "depends_on"]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
required: ["id", "title", "depends_on", "steps"]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
required: ["title", "tasks"]
|
|
53
|
+
};
|
|
54
|
+
export class CreatePlanTool extends Tool {
|
|
55
|
+
name = "create_plan";
|
|
56
|
+
description = "Create a parallel execution plan with multiple independent tasks. " +
|
|
57
|
+
"Each task runs as its own sub-agent. Tasks form a DAG via depends_on.";
|
|
58
|
+
inputSchema = CREATE_PLAN_INPUT_SCHEMA;
|
|
59
|
+
/** Captured validated plan, or null if not yet created. */
|
|
60
|
+
_plan = null;
|
|
61
|
+
/** Input keys for dependency validation. */
|
|
62
|
+
inputKeys;
|
|
63
|
+
constructor(inputs) {
|
|
64
|
+
super();
|
|
65
|
+
this.inputKeys = new Set(Object.keys(inputs ?? {}));
|
|
66
|
+
}
|
|
67
|
+
get plan() {
|
|
68
|
+
return this._plan;
|
|
69
|
+
}
|
|
70
|
+
async process(_context, params) {
|
|
71
|
+
const taskPlan = this.buildTaskPlan(params);
|
|
72
|
+
const errors = this.validateTaskPlan(taskPlan);
|
|
73
|
+
if (errors.length > 0) {
|
|
74
|
+
return {
|
|
75
|
+
status: "validation_failed",
|
|
76
|
+
errors
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Apply schema normalization to all task steps
|
|
80
|
+
for (const task of taskPlan.tasks) {
|
|
81
|
+
this.applySchemaOverrides(task.steps);
|
|
82
|
+
}
|
|
83
|
+
this._plan = taskPlan;
|
|
84
|
+
return {
|
|
85
|
+
status: "plan_created",
|
|
86
|
+
title: taskPlan.title,
|
|
87
|
+
tasks: taskPlan.tasks.length,
|
|
88
|
+
totalSteps: taskPlan.tasks.reduce((sum, t) => sum + t.steps.length, 0)
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
userMessage(params) {
|
|
92
|
+
const title = typeof params["title"] === "string" ? params["title"] : "plan";
|
|
93
|
+
return `Creating plan: ${title}`;
|
|
94
|
+
}
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
// Build
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
buildTaskPlan(data) {
|
|
99
|
+
const title = typeof data["title"] === "string" ? data["title"] : "Untitled Plan";
|
|
100
|
+
const rawTasks = Array.isArray(data["tasks"]) ? data["tasks"] : [];
|
|
101
|
+
const tasks = rawTasks.map((t) => {
|
|
102
|
+
const rawTask = t;
|
|
103
|
+
const taskId = typeof rawTask["id"] === "string" ? rawTask["id"] : randomUUID();
|
|
104
|
+
const taskTitle = typeof rawTask["title"] === "string"
|
|
105
|
+
? rawTask["title"]
|
|
106
|
+
: "Untitled Task";
|
|
107
|
+
const taskDependsOn = Array.isArray(rawTask["depends_on"])
|
|
108
|
+
? rawTask["depends_on"]
|
|
109
|
+
: Array.isArray(rawTask["dependsOn"])
|
|
110
|
+
? rawTask["dependsOn"]
|
|
111
|
+
: [];
|
|
112
|
+
const rawSteps = Array.isArray(rawTask["steps"])
|
|
113
|
+
? rawTask["steps"]
|
|
114
|
+
: [];
|
|
115
|
+
const steps = rawSteps.map((s) => {
|
|
116
|
+
const raw = s;
|
|
117
|
+
return {
|
|
118
|
+
id: typeof raw["id"] === "string" ? raw["id"] : randomUUID(),
|
|
119
|
+
instructions: typeof raw["instructions"] === "string" ? raw["instructions"] : "",
|
|
120
|
+
completed: false,
|
|
121
|
+
dependsOn: Array.isArray(raw["depends_on"])
|
|
122
|
+
? raw["depends_on"]
|
|
123
|
+
: Array.isArray(raw["dependsOn"])
|
|
124
|
+
? raw["dependsOn"]
|
|
125
|
+
: [],
|
|
126
|
+
outputSchema: typeof raw["output_schema"] === "string"
|
|
127
|
+
? raw["output_schema"]
|
|
128
|
+
: typeof raw["outputSchema"] === "string"
|
|
129
|
+
? raw["outputSchema"]
|
|
130
|
+
: undefined,
|
|
131
|
+
tools: Array.isArray(raw["tools"])
|
|
132
|
+
? raw["tools"]
|
|
133
|
+
: undefined,
|
|
134
|
+
logs: []
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
return {
|
|
138
|
+
id: taskId,
|
|
139
|
+
title: taskTitle,
|
|
140
|
+
dependsOn: taskDependsOn,
|
|
141
|
+
completed: false,
|
|
142
|
+
steps
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
return { title, tasks };
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// Validation
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
validateTaskPlan(taskPlan) {
|
|
151
|
+
const errors = [];
|
|
152
|
+
const taskIds = new Set(taskPlan.tasks.map((t) => t.id));
|
|
153
|
+
// Check for duplicate task IDs
|
|
154
|
+
const seenTaskIds = new Set();
|
|
155
|
+
for (const task of taskPlan.tasks) {
|
|
156
|
+
if (seenTaskIds.has(task.id)) {
|
|
157
|
+
errors.push(`Duplicate task ID: '${task.id}'.`);
|
|
158
|
+
}
|
|
159
|
+
seenTaskIds.add(task.id);
|
|
160
|
+
}
|
|
161
|
+
// Check task-level dependencies
|
|
162
|
+
for (const task of taskPlan.tasks) {
|
|
163
|
+
for (const dep of task.dependsOn ?? []) {
|
|
164
|
+
if (!taskIds.has(dep)) {
|
|
165
|
+
errors.push(`Task '${task.id}' depends on '${dep}' which does not exist as a task ID.`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Check for cycles at the task level
|
|
170
|
+
if (!this.checkForTaskCycles(taskPlan)) {
|
|
171
|
+
errors.push("Circular dependency detected among tasks.");
|
|
172
|
+
}
|
|
173
|
+
// Collect all step IDs across all tasks for uniqueness check
|
|
174
|
+
const allStepIds = new Set();
|
|
175
|
+
for (const task of taskPlan.tasks) {
|
|
176
|
+
for (const step of task.steps) {
|
|
177
|
+
if (allStepIds.has(step.id)) {
|
|
178
|
+
errors.push(`Duplicate step ID '${step.id}' found across tasks.`);
|
|
179
|
+
}
|
|
180
|
+
allStepIds.add(step.id);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Validate each task's internal steps
|
|
184
|
+
for (const task of taskPlan.tasks) {
|
|
185
|
+
const stepIds = new Set(task.steps.map((s) => s.id));
|
|
186
|
+
for (const step of task.steps) {
|
|
187
|
+
for (const dep of step.dependsOn) {
|
|
188
|
+
if (!stepIds.has(dep) && !this.inputKeys.has(dep)) {
|
|
189
|
+
errors.push(`Step '${step.id}' in task '${task.id}' depends on '${dep}' which does not exist within that task or as an input key.`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Check for step-level cycles within this task
|
|
194
|
+
if (!this.checkForStepCycles(task)) {
|
|
195
|
+
errors.push(`Circular dependency detected in steps of task '${task.id}'.`);
|
|
196
|
+
}
|
|
197
|
+
// Validate semantics within each task
|
|
198
|
+
const semanticErrors = this.validatePlanSemantics(task.steps);
|
|
199
|
+
for (const err of semanticErrors) {
|
|
200
|
+
errors.push(`Task '${task.id}': ${err}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Must have at least one task
|
|
204
|
+
if (taskPlan.tasks.length === 0) {
|
|
205
|
+
errors.push("Plan must contain at least one task.");
|
|
206
|
+
}
|
|
207
|
+
return errors;
|
|
208
|
+
}
|
|
209
|
+
checkForTaskCycles(taskPlan) {
|
|
210
|
+
const taskIds = new Set(taskPlan.tasks.map((t) => t.id));
|
|
211
|
+
const visited = new Set();
|
|
212
|
+
const inStack = new Set();
|
|
213
|
+
const taskMap = new Map(taskPlan.tasks.map((t) => [t.id, t]));
|
|
214
|
+
const hasCycle = (id) => {
|
|
215
|
+
if (inStack.has(id))
|
|
216
|
+
return true;
|
|
217
|
+
if (visited.has(id))
|
|
218
|
+
return false;
|
|
219
|
+
visited.add(id);
|
|
220
|
+
inStack.add(id);
|
|
221
|
+
const task = taskMap.get(id);
|
|
222
|
+
if (task) {
|
|
223
|
+
for (const dep of task.dependsOn ?? []) {
|
|
224
|
+
if (taskIds.has(dep) && hasCycle(dep))
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
inStack.delete(id);
|
|
229
|
+
return false;
|
|
230
|
+
};
|
|
231
|
+
for (const task of taskPlan.tasks) {
|
|
232
|
+
if (hasCycle(task.id))
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
checkForStepCycles(task) {
|
|
238
|
+
const stepIds = new Set(task.steps.map((s) => s.id));
|
|
239
|
+
const visited = new Set();
|
|
240
|
+
const inStack = new Set();
|
|
241
|
+
const stepMap = new Map(task.steps.map((s) => [s.id, s]));
|
|
242
|
+
const hasCycle = (id) => {
|
|
243
|
+
if (inStack.has(id))
|
|
244
|
+
return true;
|
|
245
|
+
if (visited.has(id))
|
|
246
|
+
return false;
|
|
247
|
+
visited.add(id);
|
|
248
|
+
inStack.add(id);
|
|
249
|
+
const step = stepMap.get(id);
|
|
250
|
+
if (step) {
|
|
251
|
+
for (const dep of step.dependsOn) {
|
|
252
|
+
if (stepIds.has(dep) && hasCycle(dep))
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
inStack.delete(id);
|
|
257
|
+
return false;
|
|
258
|
+
};
|
|
259
|
+
for (const step of task.steps) {
|
|
260
|
+
if (hasCycle(step.id))
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
validatePlanSemantics(steps) {
|
|
266
|
+
const errors = [];
|
|
267
|
+
const loopingPhrases = [
|
|
268
|
+
"for each",
|
|
269
|
+
"for every",
|
|
270
|
+
"iterate over",
|
|
271
|
+
"loop over",
|
|
272
|
+
"for all"
|
|
273
|
+
];
|
|
274
|
+
const aggregatorPatterns = [
|
|
275
|
+
"aggregate",
|
|
276
|
+
"compile",
|
|
277
|
+
"combine",
|
|
278
|
+
"merge",
|
|
279
|
+
"final",
|
|
280
|
+
"report"
|
|
281
|
+
];
|
|
282
|
+
const aggregatorIds = new Set();
|
|
283
|
+
for (const step of steps) {
|
|
284
|
+
const sid = step.id.toLowerCase();
|
|
285
|
+
if (aggregatorPatterns.some((p) => sid.includes(p))) {
|
|
286
|
+
aggregatorIds.add(step.id);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Check non-aggregator steps for looping language
|
|
290
|
+
for (const step of steps) {
|
|
291
|
+
if (aggregatorIds.has(step.id))
|
|
292
|
+
continue;
|
|
293
|
+
const content = step.instructions.toLowerCase();
|
|
294
|
+
for (const phrase of loopingPhrases) {
|
|
295
|
+
if (content.includes(phrase)) {
|
|
296
|
+
errors.push(`Step '${step.id}' contains looping phrase '${phrase}'. Emit one step per item (fan-out) instead.`);
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Check aggregator wiring
|
|
302
|
+
const extractorPatterns = [
|
|
303
|
+
"extract",
|
|
304
|
+
"fetch",
|
|
305
|
+
"scrape",
|
|
306
|
+
"crawl",
|
|
307
|
+
"parse",
|
|
308
|
+
"process"
|
|
309
|
+
];
|
|
310
|
+
const extractorIds = [];
|
|
311
|
+
for (const step of steps) {
|
|
312
|
+
const sid = step.id.toLowerCase();
|
|
313
|
+
if (extractorPatterns.some((p) => sid.includes(p))) {
|
|
314
|
+
extractorIds.push(step.id);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (aggregatorIds.size > 0 && extractorIds.length > 0) {
|
|
318
|
+
for (const aggId of aggregatorIds) {
|
|
319
|
+
const agg = steps.find((s) => s.id === aggId);
|
|
320
|
+
if (!agg)
|
|
321
|
+
continue;
|
|
322
|
+
const declaredDeps = new Set(agg.dependsOn);
|
|
323
|
+
const missing = extractorIds.filter((eid) => !declaredDeps.has(eid));
|
|
324
|
+
if (missing.length > 0) {
|
|
325
|
+
errors.push(`Aggregator '${aggId}' must depend on all extractor steps. Missing: ${missing.join(", ")}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return errors;
|
|
330
|
+
}
|
|
331
|
+
// ---------------------------------------------------------------------------
|
|
332
|
+
// Schema normalization
|
|
333
|
+
// ---------------------------------------------------------------------------
|
|
334
|
+
applySchemaOverrides(steps) {
|
|
335
|
+
for (const step of steps) {
|
|
336
|
+
if (!step.outputSchema)
|
|
337
|
+
continue;
|
|
338
|
+
try {
|
|
339
|
+
const parsed = typeof step.outputSchema === "string"
|
|
340
|
+
? JSON.parse(step.outputSchema)
|
|
341
|
+
: step.outputSchema;
|
|
342
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
343
|
+
if (!("type" in parsed)) {
|
|
344
|
+
parsed["type"] = "object";
|
|
345
|
+
step.outputSchema = JSON.stringify(parsed);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
step.outputSchema = undefined;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=create-plan-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-plan-tool.js","sourceRoot":"","sources":["../../src/tools/create-plan-tool.ts"],"names":[],"mappings":"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"}
|