@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,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskExecutor -- orchestrates execution of a complete Task plan.
|
|
3
|
+
*
|
|
4
|
+
* Port of src/nodetool/agents/task_executor.py
|
|
5
|
+
*
|
|
6
|
+
* Iteratively finds steps whose dependencies are satisfied, runs
|
|
7
|
+
* StepExecutor for each, and collects results until all steps complete
|
|
8
|
+
* or the safety limit is reached.
|
|
9
|
+
*
|
|
10
|
+
* Process-mode steps automatically fan out over list inputs produced by
|
|
11
|
+
* a preceding discover step. Each item is rendered into the step's
|
|
12
|
+
* `perItemInstructions` template and executed as an ephemeral step.
|
|
13
|
+
* Results are aggregated into a list that downstream aggregate steps consume.
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
import { createLogger } from "@nodetool-ai/config";
|
|
17
|
+
const log = createLogger("nodetool.agents.task-executor");
|
|
18
|
+
import { StepExecutor } from "./step-executor.js";
|
|
19
|
+
import { DEFAULT_TOKEN_LIMIT } from "./constants.js";
|
|
20
|
+
const DEFAULT_MAX_STEPS = 50;
|
|
21
|
+
const DEFAULT_MAX_STEP_ITERATIONS = 10;
|
|
22
|
+
export class TaskExecutor {
|
|
23
|
+
provider;
|
|
24
|
+
model;
|
|
25
|
+
tools;
|
|
26
|
+
task;
|
|
27
|
+
context;
|
|
28
|
+
inputs;
|
|
29
|
+
systemPrompt;
|
|
30
|
+
maxSteps;
|
|
31
|
+
maxStepIterations;
|
|
32
|
+
maxTokenLimit;
|
|
33
|
+
finalStepId;
|
|
34
|
+
parallelExecution;
|
|
35
|
+
_finishStepId;
|
|
36
|
+
constructor(opts) {
|
|
37
|
+
this.provider = opts.provider;
|
|
38
|
+
this.model = opts.model;
|
|
39
|
+
this.tools = opts.tools;
|
|
40
|
+
this.task = opts.task;
|
|
41
|
+
this.context = opts.context;
|
|
42
|
+
this.inputs = opts.inputs ?? {};
|
|
43
|
+
this.systemPrompt = opts.systemPrompt;
|
|
44
|
+
this.maxSteps = opts.maxSteps ?? DEFAULT_MAX_STEPS;
|
|
45
|
+
this.maxStepIterations =
|
|
46
|
+
opts.maxStepIterations ?? DEFAULT_MAX_STEP_ITERATIONS;
|
|
47
|
+
this.maxTokenLimit = opts.maxTokenLimit ?? DEFAULT_TOKEN_LIMIT;
|
|
48
|
+
this.finalStepId = opts.finalStepId;
|
|
49
|
+
this.parallelExecution = opts.parallelExecution ?? false;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Execute all steps in the task plan, respecting dependency order.
|
|
53
|
+
* Supports both sequential and parallel execution modes.
|
|
54
|
+
*/
|
|
55
|
+
async *executeTasks() {
|
|
56
|
+
// Seed inputs into context
|
|
57
|
+
for (const [key, value] of Object.entries(this.inputs)) {
|
|
58
|
+
this.context.set(key, value);
|
|
59
|
+
}
|
|
60
|
+
// Auto-detect finish step (last step) like Python does
|
|
61
|
+
this._finishStepId =
|
|
62
|
+
this.finalStepId ??
|
|
63
|
+
(this.task.steps.length > 0
|
|
64
|
+
? this.task.steps[this.task.steps.length - 1].id
|
|
65
|
+
: undefined);
|
|
66
|
+
log.info("Task execution started", {
|
|
67
|
+
title: this.task.title,
|
|
68
|
+
steps: this.task.steps.length
|
|
69
|
+
});
|
|
70
|
+
let stepsTaken = 0;
|
|
71
|
+
while (!this.allTasksComplete() && stepsTaken < this.maxSteps) {
|
|
72
|
+
stepsTaken++;
|
|
73
|
+
let executableSteps = this.getExecutableSteps();
|
|
74
|
+
executableSteps = this.maybeDeferFinishStep(executableSteps);
|
|
75
|
+
if (executableSteps.length === 0) {
|
|
76
|
+
if (!this.allTasksComplete()) {
|
|
77
|
+
yield {
|
|
78
|
+
type: "chunk",
|
|
79
|
+
content: "\nNo executable steps but not all complete. Possible dependency issues.\n",
|
|
80
|
+
done: false
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
log.debug("Dispatching steps", {
|
|
86
|
+
stepIds: executableSteps.map((s) => s.id)
|
|
87
|
+
});
|
|
88
|
+
// Separate process-mode steps from normal steps
|
|
89
|
+
const processSteps = executableSteps.filter((s) => s.mode === "process");
|
|
90
|
+
const normalSteps = executableSteps.filter((s) => s.mode !== "process");
|
|
91
|
+
// Handle process-mode steps with fan-out
|
|
92
|
+
for (const pStep of processSteps) {
|
|
93
|
+
yield* this.handleProcessStep(pStep);
|
|
94
|
+
}
|
|
95
|
+
// Create step executors for normal steps
|
|
96
|
+
const stepGenerators = normalSteps.map((step) => {
|
|
97
|
+
const executor = new StepExecutor({
|
|
98
|
+
task: this.task,
|
|
99
|
+
step,
|
|
100
|
+
context: this.context,
|
|
101
|
+
provider: this.provider,
|
|
102
|
+
model: this.model,
|
|
103
|
+
tools: [...this.tools],
|
|
104
|
+
systemPrompt: this.systemPrompt,
|
|
105
|
+
maxTokenLimit: this.maxTokenLimit,
|
|
106
|
+
maxIterations: this.maxStepIterations,
|
|
107
|
+
useFinishTask: this.isFinishStep(step)
|
|
108
|
+
});
|
|
109
|
+
return executor.execute();
|
|
110
|
+
});
|
|
111
|
+
if (this.parallelExecution && stepGenerators.length > 1) {
|
|
112
|
+
// Execute all steps concurrently, merging yielded messages
|
|
113
|
+
yield* mergeAsyncGenerators(stepGenerators);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Execute steps sequentially
|
|
117
|
+
for (const generator of stepGenerators) {
|
|
118
|
+
for await (const message of generator) {
|
|
119
|
+
yield message;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Produce a short deterministic hash for a value (used in ephemeral step IDs).
|
|
127
|
+
*/
|
|
128
|
+
shortHash(value) {
|
|
129
|
+
const data = JSON.stringify(value, (_key, val) => {
|
|
130
|
+
if (val != null && typeof val === "object" && !Array.isArray(val)) {
|
|
131
|
+
const sorted = {};
|
|
132
|
+
for (const k of Object.keys(val).sort()) {
|
|
133
|
+
sorted[k] = val[k];
|
|
134
|
+
}
|
|
135
|
+
return sorted;
|
|
136
|
+
}
|
|
137
|
+
return val;
|
|
138
|
+
});
|
|
139
|
+
return createHash("sha1").update(data).digest("hex").slice(0, 12);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Handle a process-mode step by fanning out over list inputs.
|
|
143
|
+
* Creates ephemeral steps for each item in the discover step's result
|
|
144
|
+
* and aggregates the outputs into a list stored in context.
|
|
145
|
+
*/
|
|
146
|
+
async *handleProcessStep(step) {
|
|
147
|
+
const discoverStepId = step.dependsOn[0];
|
|
148
|
+
if (!discoverStepId) {
|
|
149
|
+
log.warn("Process step has no dependencies, skipping fan-out", {
|
|
150
|
+
stepId: step.id
|
|
151
|
+
});
|
|
152
|
+
step.completed = true;
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
let discoverResult = this.context.get(discoverStepId);
|
|
156
|
+
if (discoverResult === undefined || discoverResult === null) {
|
|
157
|
+
log.warn("Discover step result is null/undefined, skipping fan-out", {
|
|
158
|
+
stepId: step.id
|
|
159
|
+
});
|
|
160
|
+
step.completed = true;
|
|
161
|
+
this.context.set(step.id, []);
|
|
162
|
+
step.endTime = Date.now();
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (!Array.isArray(discoverResult)) {
|
|
166
|
+
log.warn("Discover step result is not an array, wrapping as single-item list", {
|
|
167
|
+
stepId: step.id,
|
|
168
|
+
resultType: typeof discoverResult
|
|
169
|
+
});
|
|
170
|
+
discoverResult = [discoverResult];
|
|
171
|
+
}
|
|
172
|
+
const items = discoverResult;
|
|
173
|
+
const template = step.perItemInstructions ?? step.instructions;
|
|
174
|
+
const perItemSchema = step.perItemSchema;
|
|
175
|
+
log.info("Fan-out processing", {
|
|
176
|
+
stepId: step.id,
|
|
177
|
+
itemCount: items.length
|
|
178
|
+
});
|
|
179
|
+
// Create ephemeral steps for each item
|
|
180
|
+
const ephemeralSteps = items.map((item) => {
|
|
181
|
+
let instructions = template;
|
|
182
|
+
if (typeof item === "object" && item !== null) {
|
|
183
|
+
for (const [key, value] of Object.entries(item)) {
|
|
184
|
+
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
185
|
+
const strValue = String(value);
|
|
186
|
+
instructions = instructions.replace(new RegExp(`\\{${escapedKey}\\}`, "g"), () => strValue);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const strItem = String(item);
|
|
191
|
+
instructions = instructions.replace(/\{item\}/g, () => strItem);
|
|
192
|
+
}
|
|
193
|
+
const hash = this.shortHash(item);
|
|
194
|
+
return {
|
|
195
|
+
id: `${step.id}_item_${hash}`,
|
|
196
|
+
instructions,
|
|
197
|
+
completed: false,
|
|
198
|
+
dependsOn: [],
|
|
199
|
+
logs: [],
|
|
200
|
+
outputSchema: perItemSchema ?? step.outputSchema
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
// Create step executors for each ephemeral step
|
|
204
|
+
const generators = ephemeralSteps.map((ephStep) => {
|
|
205
|
+
const executor = new StepExecutor({
|
|
206
|
+
task: this.task,
|
|
207
|
+
step: ephStep,
|
|
208
|
+
context: this.context,
|
|
209
|
+
provider: this.provider,
|
|
210
|
+
model: this.model,
|
|
211
|
+
tools: [...this.tools],
|
|
212
|
+
systemPrompt: this.systemPrompt,
|
|
213
|
+
maxTokenLimit: this.maxTokenLimit,
|
|
214
|
+
maxIterations: this.maxStepIterations,
|
|
215
|
+
useFinishTask: false
|
|
216
|
+
});
|
|
217
|
+
return executor.execute();
|
|
218
|
+
});
|
|
219
|
+
// Execute and collect results
|
|
220
|
+
const results = [];
|
|
221
|
+
if (this.parallelExecution && generators.length > 1) {
|
|
222
|
+
for await (const msg of mergeAsyncGenerators(generators)) {
|
|
223
|
+
if (msg.type === "step_result") {
|
|
224
|
+
results.push(msg.result);
|
|
225
|
+
}
|
|
226
|
+
yield msg;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
for (const gen of generators) {
|
|
231
|
+
for await (const msg of gen) {
|
|
232
|
+
if (msg.type === "step_result") {
|
|
233
|
+
results.push(msg.result);
|
|
234
|
+
}
|
|
235
|
+
yield msg;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Store aggregated results and mark complete
|
|
240
|
+
this.context.set(step.id, results);
|
|
241
|
+
step.completed = true;
|
|
242
|
+
step.endTime = Date.now();
|
|
243
|
+
log.info("Fan-out complete", {
|
|
244
|
+
stepId: step.id,
|
|
245
|
+
resultCount: results.length
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Check if all steps in the task are completed.
|
|
250
|
+
*/
|
|
251
|
+
allTasksComplete() {
|
|
252
|
+
return this.task.steps.every((step) => step.completed);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Find steps whose dependencies are all satisfied (completed).
|
|
256
|
+
*/
|
|
257
|
+
getExecutableSteps() {
|
|
258
|
+
const completedIds = new Set(this.task.steps.filter((s) => s.completed).map((s) => s.id));
|
|
259
|
+
// Also count inputs as satisfied dependencies
|
|
260
|
+
for (const key of Object.keys(this.inputs)) {
|
|
261
|
+
completedIds.add(key);
|
|
262
|
+
}
|
|
263
|
+
return this.task.steps.filter((step) => !step.completed &&
|
|
264
|
+
!this.isStepRunning(step) &&
|
|
265
|
+
step.dependsOn.every((dep) => completedIds.has(dep)));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Check if a step is currently running (started but not finished).
|
|
269
|
+
* Mirrors Python's Step.is_running().
|
|
270
|
+
*/
|
|
271
|
+
isStepRunning(step) {
|
|
272
|
+
return step.startTime != null && step.endTime == null;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Check if a step is the designated finish/aggregation step.
|
|
276
|
+
*/
|
|
277
|
+
isFinishStep(step) {
|
|
278
|
+
if (this._finishStepId) {
|
|
279
|
+
return step.id === this._finishStepId;
|
|
280
|
+
}
|
|
281
|
+
return (this.task.steps.length > 0 &&
|
|
282
|
+
step === this.task.steps[this.task.steps.length - 1]);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Defer the finish step until all other steps are complete.
|
|
286
|
+
* This ensures the final aggregation step runs last.
|
|
287
|
+
*/
|
|
288
|
+
maybeDeferFinishStep(executableSteps) {
|
|
289
|
+
if (!this._finishStepId)
|
|
290
|
+
return executableSteps;
|
|
291
|
+
const finishReady = executableSteps.some((s) => s.id === this._finishStepId);
|
|
292
|
+
if (!finishReady)
|
|
293
|
+
return executableSteps;
|
|
294
|
+
const otherPending = this.task.steps.some((s) => !s.completed && s.id !== this._finishStepId);
|
|
295
|
+
if (!otherPending)
|
|
296
|
+
return executableSteps;
|
|
297
|
+
return executableSteps.filter((s) => s.id !== this._finishStepId);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
// Async generator merge utility (TS equivalent of wrap_generators_parallel)
|
|
302
|
+
// ---------------------------------------------------------------------------
|
|
303
|
+
async function* mergeAsyncGenerators(generators) {
|
|
304
|
+
// Channel: a queue of resolved values with a promise-based pull mechanism
|
|
305
|
+
const queue = [];
|
|
306
|
+
let activeCount = generators.length;
|
|
307
|
+
let resolve = null;
|
|
308
|
+
let firstError = undefined;
|
|
309
|
+
function notify() {
|
|
310
|
+
if (resolve) {
|
|
311
|
+
const r = resolve;
|
|
312
|
+
resolve = null;
|
|
313
|
+
r();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Start a consumer task for each generator
|
|
317
|
+
const tasks = generators.map(async (gen) => {
|
|
318
|
+
try {
|
|
319
|
+
for await (const item of gen) {
|
|
320
|
+
queue.push(item);
|
|
321
|
+
notify();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
if (firstError === undefined)
|
|
326
|
+
firstError = e;
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
activeCount--;
|
|
330
|
+
notify();
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
// Yield items as they arrive
|
|
334
|
+
while (activeCount > 0 || queue.length > 0) {
|
|
335
|
+
if (queue.length > 0) {
|
|
336
|
+
yield queue.shift();
|
|
337
|
+
}
|
|
338
|
+
else if (activeCount > 0) {
|
|
339
|
+
// Set resolve BEFORE checking queue again to avoid race condition
|
|
340
|
+
// where an item is pushed between the check and the await.
|
|
341
|
+
const waitPromise = new Promise((r) => {
|
|
342
|
+
resolve = r;
|
|
343
|
+
});
|
|
344
|
+
// Re-check after setting resolve — item may have arrived between
|
|
345
|
+
// the outer check and setting resolve.
|
|
346
|
+
if (queue.length > 0) {
|
|
347
|
+
resolve = null;
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
await waitPromise;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Wait for all producer promises to settle
|
|
354
|
+
await Promise.allSettled(tasks);
|
|
355
|
+
if (firstError !== undefined) {
|
|
356
|
+
throw firstError;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=task-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-executor.js","sourceRoot":"","sources":["../src/task-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskPlanner -- decomposes an objective into a Task or TaskPlan via tool calls.
|
|
3
|
+
*
|
|
4
|
+
* planMultiTask() builds the plan incrementally: the LLM calls add_task one
|
|
5
|
+
* task at a time, with per-task validation. Progress is yielded as task_update
|
|
6
|
+
* events (TaskPlanned) so clients can watch the plan take shape in real time.
|
|
7
|
+
*
|
|
8
|
+
* plan() (single-task) keeps the original one-shot create_task tool.
|
|
9
|
+
*/
|
|
10
|
+
import type { BaseProvider, ProcessingContext } from "@nodetool-ai/runtime";
|
|
11
|
+
import { type ProcessingMessage } from "@nodetool-ai/protocol";
|
|
12
|
+
import type { Task, TaskPlan } from "./types.js";
|
|
13
|
+
import type { Tool } from "./tools/base-tool.js";
|
|
14
|
+
export interface TaskPlannerOptions {
|
|
15
|
+
provider: BaseProvider;
|
|
16
|
+
model: string;
|
|
17
|
+
reasoningModel?: string;
|
|
18
|
+
tools?: Tool[];
|
|
19
|
+
systemPrompt?: string;
|
|
20
|
+
outputSchema?: Record<string, unknown>;
|
|
21
|
+
inputs?: Record<string, unknown>;
|
|
22
|
+
maxRetries?: number;
|
|
23
|
+
threadId?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class TaskPlanner {
|
|
26
|
+
private provider;
|
|
27
|
+
private model;
|
|
28
|
+
readonly reasoningModel: string;
|
|
29
|
+
private tools;
|
|
30
|
+
private systemPrompt;
|
|
31
|
+
private outputSchema;
|
|
32
|
+
private inputs;
|
|
33
|
+
private maxRetries;
|
|
34
|
+
private threadId?;
|
|
35
|
+
constructor(opts: TaskPlannerOptions);
|
|
36
|
+
plan(objective: string, context: ProcessingContext): AsyncGenerator<ProcessingMessage, Task | null>;
|
|
37
|
+
private _planImpl;
|
|
38
|
+
planMultiTask(objective: string, context: ProcessingContext): AsyncGenerator<ProcessingMessage, TaskPlan | null>;
|
|
39
|
+
private _planMultiTaskImpl;
|
|
40
|
+
private callSingleTaskTool;
|
|
41
|
+
private taskPlannedEvent;
|
|
42
|
+
private formatToolsInfo;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=task-planner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-planner.d.ts","sourceRoot":"","sources":["../src/task-planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EAGlB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAEL,KAAK,iBAAiB,EAKvB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAQ,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AA2GjD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,KAAK,CAAS;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,IAAI,EAAE,kBAAkB;IAgB7B,IAAI,CACT,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,cAAc,CAAC,iBAAiB,EAAE,IAAI,GAAG,IAAI,CAAC;YAclC,SAAS;IAyGjB,aAAa,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,cAAc,CAAC,iBAAiB,EAAE,QAAQ,GAAG,IAAI,CAAC;YActC,kBAAkB;YA6OlB,kBAAkB;IAmFjC,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,eAAe;CA0BxB"}
|