@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,532 @@
|
|
|
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 { withAgentSpanGen } from "@nodetool-ai/runtime";
|
|
11
|
+
import { createLogger } from "@nodetool-ai/config";
|
|
12
|
+
import { TaskUpdateEvent } from "@nodetool-ai/protocol";
|
|
13
|
+
const log = createLogger("nodetool.agents.planner");
|
|
14
|
+
import { CreateTaskPlanTool } from "./tools/create-task-tool.js";
|
|
15
|
+
import { PlanBuilder, AddTaskTool, RemoveTaskTool, FinishPlanTool } from "./tools/plan-builder-tools.js";
|
|
16
|
+
import { rejectAgenticProvider } from "./reject-agentic-provider.js";
|
|
17
|
+
const MAX_RETRIES = 3;
|
|
18
|
+
const MAX_PER_TASK_RETRIES = 3;
|
|
19
|
+
const DEFAULT_PLANNING_SYSTEM_PROMPT = `You are a TaskArchitect. Decompose objectives into parallel executable plans by calling tools.
|
|
20
|
+
|
|
21
|
+
## Process (call tools in order)
|
|
22
|
+
1. Call \`add_task\` one task at a time. Each call adds exactly one task and is validated immediately.
|
|
23
|
+
2. If a call returns \`validation_failed\`, read the errors and call \`add_task\` again with corrections.
|
|
24
|
+
3. Add dependency tasks BEFORE their dependents (task-level \`depends_on\` must point at a task already added).
|
|
25
|
+
4. If you added a task in error, call \`remove_task\` with its id.
|
|
26
|
+
5. When all tasks are added, call \`finish_plan\` with the overall plan title.
|
|
27
|
+
|
|
28
|
+
## Structure
|
|
29
|
+
- Task: { id, title, depends_on[], steps[] } — each task runs as an independent sub-agent.
|
|
30
|
+
- Step: { id, instructions, depends_on[], output_schema?, tools? }
|
|
31
|
+
|
|
32
|
+
## ID Rules (violations cause retries)
|
|
33
|
+
- Task IDs: descriptive snake_case, e.g. "research_nlp", "write_summary".
|
|
34
|
+
- Step IDs: globally unique across the plan. Prefix with the task id, e.g. "research_nlp_s1".
|
|
35
|
+
- NEVER use bare "s1", "s2" — they collide across tasks.
|
|
36
|
+
|
|
37
|
+
## Parallelism
|
|
38
|
+
- Independent work goes in separate tasks (they run concurrently).
|
|
39
|
+
- Only add \`depends_on\` when one task genuinely needs another's output.
|
|
40
|
+
- Add a final aggregation task (depending on all others) when results need combining.
|
|
41
|
+
|
|
42
|
+
## Step Instructions
|
|
43
|
+
- Specific and concise. State exactly what to do, not the whole objective.
|
|
44
|
+
- Reference available tools by name.
|
|
45
|
+
- Bad: "Research NLP and write a summary including main ideas and relevance."
|
|
46
|
+
- Good: "Use google_search to find recent NLP advances. Summarize key findings in 2-3 sentences."
|
|
47
|
+
|
|
48
|
+
## Step Granularity (hard rule)
|
|
49
|
+
- One step = one focused operation that a sub-agent can finish in ~3 LLM turns.
|
|
50
|
+
Typical shapes: a single search + summarize, a single image/video render, a single file write.
|
|
51
|
+
- NEVER combine N independent items into one step (e.g. "research 3 games and render an image for each"
|
|
52
|
+
is 6 steps minimum, not 1). Fan out into N parallel steps/tasks, then an aggregation step.
|
|
53
|
+
- If a step would need more than 2 tool calls of different kinds, split it.
|
|
54
|
+
- Prefer many small parallel steps over a few wide ones — steps are iteration-capped, parallelism is cheap.
|
|
55
|
+
|
|
56
|
+
## Output Schemas
|
|
57
|
+
- Include \`output_schema\` (as a JSON schema string) for steps that produce structured data.
|
|
58
|
+
- The aggregation step MUST have an \`output_schema\` matching the plan's overall output schema.
|
|
59
|
+
- Use type "object" at the top level.
|
|
60
|
+
|
|
61
|
+
## Models & Media (use the right tools)
|
|
62
|
+
- Before generating media, call \`find_model\` once for the relevant capability
|
|
63
|
+
(text_to_image, text_to_video, text_to_speech, automatic_speech_recognition,
|
|
64
|
+
generate_embedding) and pass the resulting \`provider\` + \`model\` to the
|
|
65
|
+
generation tool.
|
|
66
|
+
- Generation tools: \`generate_image\`, \`edit_image\`, \`generate_video\`,
|
|
67
|
+
\`animate_image\`, \`generate_speech\`, \`transcribe_audio\`, \`embed_text\`.
|
|
68
|
+
- These tools save outputs as ASSETS automatically — the result includes
|
|
69
|
+
\`asset_id\` and \`asset_uri\` ("asset://<id>.<ext>"). Reference those in
|
|
70
|
+
later steps and in the final response so the chat UI can show them.
|
|
71
|
+
- For non-media artifacts the user should keep (reports, JSON, manifests),
|
|
72
|
+
call \`save_asset\` with \`name\` + \`content\` (text) or \`content_base64\`
|
|
73
|
+
(binary). Use \`read_asset\` / \`list_assets\` / \`get_asset\` to retrieve.`;
|
|
74
|
+
const DEFAULT_SINGLE_TASK_SYSTEM_PROMPT = `You are a TaskArchitect. Decompose objectives into executable step plans.
|
|
75
|
+
|
|
76
|
+
## Structure
|
|
77
|
+
- Task: { title, steps[] }
|
|
78
|
+
- Step: { id, instructions, depends_on[], output_schema?, tools? }
|
|
79
|
+
|
|
80
|
+
## Rules
|
|
81
|
+
- Step IDs: descriptive snake_case, e.g. "search_sources", "write_report".
|
|
82
|
+
- Steps must be atomic and focused — one clear action each.
|
|
83
|
+
- Maximize parallelism: steps without data dependencies should have \`depends_on: []\`.
|
|
84
|
+
- Reference available tools by name in step instructions.
|
|
85
|
+
- Include \`output_schema\` (JSON schema string) for steps producing structured data.
|
|
86
|
+
- Dependencies must form a valid DAG (no cycles).
|
|
87
|
+
|
|
88
|
+
Call the \`create_task\` tool with your task plan.`;
|
|
89
|
+
const PLAN_CREATION_PROMPT_TEMPLATE = `Build an executable TaskPlan by calling add_task once per task, then finish_plan.
|
|
90
|
+
|
|
91
|
+
Objective: {{objective}}
|
|
92
|
+
|
|
93
|
+
Available tools (reference by name in step instructions):
|
|
94
|
+
{{toolsInfo}}
|
|
95
|
+
|
|
96
|
+
Output schema for the final aggregation step:
|
|
97
|
+
{{outputSchema}}
|
|
98
|
+
|
|
99
|
+
Remember: prefix step IDs with their task ID (e.g. "task1_search", "task1_summarize") to avoid collisions. Call add_task for each task in dependency order.`;
|
|
100
|
+
const TASK_CREATION_PROMPT_TEMPLATE = `Create an executable task plan using the create_task tool.
|
|
101
|
+
|
|
102
|
+
Objective: {{objective}}
|
|
103
|
+
|
|
104
|
+
Available tools (reference by name in step instructions):
|
|
105
|
+
{{toolsInfo}}
|
|
106
|
+
|
|
107
|
+
Output schema for the final step:
|
|
108
|
+
{{outputSchema}}`;
|
|
109
|
+
export class TaskPlanner {
|
|
110
|
+
provider;
|
|
111
|
+
model;
|
|
112
|
+
reasoningModel;
|
|
113
|
+
tools;
|
|
114
|
+
systemPrompt;
|
|
115
|
+
outputSchema;
|
|
116
|
+
inputs;
|
|
117
|
+
maxRetries;
|
|
118
|
+
threadId;
|
|
119
|
+
constructor(opts) {
|
|
120
|
+
this.provider = opts.provider;
|
|
121
|
+
this.model = opts.model;
|
|
122
|
+
this.reasoningModel = opts.reasoningModel ?? opts.model;
|
|
123
|
+
this.tools = opts.tools ?? [];
|
|
124
|
+
this.systemPrompt = opts.systemPrompt ?? DEFAULT_PLANNING_SYSTEM_PROMPT;
|
|
125
|
+
this.outputSchema = opts.outputSchema;
|
|
126
|
+
this.inputs = opts.inputs ?? {};
|
|
127
|
+
this.maxRetries = opts.maxRetries ?? MAX_RETRIES;
|
|
128
|
+
this.threadId = opts.threadId;
|
|
129
|
+
}
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// Single-task planning (legacy one-shot)
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
async *plan(objective, context) {
|
|
134
|
+
return yield* withAgentSpanGen("plan", {
|
|
135
|
+
objective,
|
|
136
|
+
provider: this.provider.provider,
|
|
137
|
+
model: this.model,
|
|
138
|
+
toolsCount: this.tools.length,
|
|
139
|
+
extra: { "agent.plan.kind": "single" }
|
|
140
|
+
}, () => this._planImpl(objective, context));
|
|
141
|
+
}
|
|
142
|
+
async *_planImpl(objective, _context) {
|
|
143
|
+
rejectAgenticProvider(this.provider, "TaskPlanner.plan");
|
|
144
|
+
const toolsInfo = this.formatToolsInfo();
|
|
145
|
+
const userPrompt = TASK_CREATION_PROMPT_TEMPLATE
|
|
146
|
+
.replace("{{objective}}", objective)
|
|
147
|
+
.replace("{{toolsInfo}}", toolsInfo)
|
|
148
|
+
.replace("{{outputSchema}}", this.outputSchema
|
|
149
|
+
? JSON.stringify(this.outputSchema, null, 2)
|
|
150
|
+
: "None specified");
|
|
151
|
+
const systemPrompt = this.systemPrompt !== DEFAULT_PLANNING_SYSTEM_PROMPT
|
|
152
|
+
? this.systemPrompt
|
|
153
|
+
: DEFAULT_SINGLE_TASK_SYSTEM_PROMPT;
|
|
154
|
+
const messages = [
|
|
155
|
+
{ role: "system", content: systemPrompt },
|
|
156
|
+
{ role: "user", content: userPrompt }
|
|
157
|
+
];
|
|
158
|
+
yield {
|
|
159
|
+
type: "planning_update",
|
|
160
|
+
phase: "initialization",
|
|
161
|
+
status: "started",
|
|
162
|
+
content: "Starting task planning..."
|
|
163
|
+
};
|
|
164
|
+
const createTaskTool = new CreateTaskPlanTool(this.inputs);
|
|
165
|
+
for (let attempt = 0; attempt < this.maxRetries; attempt++) {
|
|
166
|
+
yield {
|
|
167
|
+
type: "planning_update",
|
|
168
|
+
phase: "generation",
|
|
169
|
+
status: "running",
|
|
170
|
+
content: attempt > 0
|
|
171
|
+
? `Retry attempt ${attempt + 1}/${this.maxRetries}...`
|
|
172
|
+
: "Generating plan..."
|
|
173
|
+
};
|
|
174
|
+
const toolCallResult = yield* this.callSingleTaskTool(messages, createTaskTool);
|
|
175
|
+
if (createTaskTool.task) {
|
|
176
|
+
yield {
|
|
177
|
+
type: "planning_update",
|
|
178
|
+
phase: "complete",
|
|
179
|
+
status: "success",
|
|
180
|
+
content: `Plan created: ${createTaskTool.task.title} (${createTaskTool.task.steps.length} steps)`
|
|
181
|
+
};
|
|
182
|
+
return createTaskTool.task;
|
|
183
|
+
}
|
|
184
|
+
const errorMsg = toolCallResult.error ??
|
|
185
|
+
`Planning tool was not called successfully on attempt ${attempt + 1}/${this.maxRetries}`;
|
|
186
|
+
yield {
|
|
187
|
+
type: "planning_update",
|
|
188
|
+
phase: "validation",
|
|
189
|
+
status: "failed",
|
|
190
|
+
content: errorMsg
|
|
191
|
+
};
|
|
192
|
+
if (toolCallResult.assistantContent) {
|
|
193
|
+
messages.push({
|
|
194
|
+
role: "assistant",
|
|
195
|
+
content: toolCallResult.assistantContent
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
messages.push({
|
|
199
|
+
role: "user",
|
|
200
|
+
content: `Error: ${errorMsg}. Please call the create_task tool with a corrected plan.`
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
yield {
|
|
204
|
+
type: "chunk",
|
|
205
|
+
content: `\nFailed to generate a task plan after ${this.maxRetries} attempts.\n`,
|
|
206
|
+
done: true
|
|
207
|
+
};
|
|
208
|
+
yield {
|
|
209
|
+
type: "planning_update",
|
|
210
|
+
phase: "complete",
|
|
211
|
+
status: "failed",
|
|
212
|
+
content: `Plan generation failed after ${this.maxRetries} attempts`
|
|
213
|
+
};
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
// Multi-task planning (incremental)
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
async *planMultiTask(objective, context) {
|
|
220
|
+
return yield* withAgentSpanGen("plan", {
|
|
221
|
+
objective,
|
|
222
|
+
provider: this.provider.provider,
|
|
223
|
+
model: this.model,
|
|
224
|
+
toolsCount: this.tools.length,
|
|
225
|
+
extra: { "agent.plan.kind": "multi" }
|
|
226
|
+
}, () => this._planMultiTaskImpl(objective, context));
|
|
227
|
+
}
|
|
228
|
+
async *_planMultiTaskImpl(objective, _context) {
|
|
229
|
+
const toolsInfo = this.formatToolsInfo();
|
|
230
|
+
const userPrompt = PLAN_CREATION_PROMPT_TEMPLATE
|
|
231
|
+
.replace("{{objective}}", objective)
|
|
232
|
+
.replace("{{toolsInfo}}", toolsInfo)
|
|
233
|
+
.replace("{{outputSchema}}", this.outputSchema
|
|
234
|
+
? JSON.stringify(this.outputSchema, null, 2)
|
|
235
|
+
: "None specified");
|
|
236
|
+
const messages = [
|
|
237
|
+
{ role: "system", content: this.systemPrompt },
|
|
238
|
+
{ role: "user", content: userPrompt }
|
|
239
|
+
];
|
|
240
|
+
yield {
|
|
241
|
+
type: "planning_update",
|
|
242
|
+
phase: "initialization",
|
|
243
|
+
status: "started",
|
|
244
|
+
content: "Starting parallel task planning..."
|
|
245
|
+
};
|
|
246
|
+
rejectAgenticProvider(this.provider, "TaskPlanner.planMultiTask");
|
|
247
|
+
const builder = new PlanBuilder(this.inputs);
|
|
248
|
+
const addTaskTool = new AddTaskTool(builder);
|
|
249
|
+
const removeTaskTool = new RemoveTaskTool(builder);
|
|
250
|
+
const finishPlanTool = new FinishPlanTool(builder);
|
|
251
|
+
const toolsByName = new Map([
|
|
252
|
+
[addTaskTool.name, addTaskTool],
|
|
253
|
+
[removeTaskTool.name, removeTaskTool],
|
|
254
|
+
[finishPlanTool.name, finishPlanTool]
|
|
255
|
+
]);
|
|
256
|
+
const providerTools = [
|
|
257
|
+
addTaskTool.toProviderTool(),
|
|
258
|
+
removeTaskTool.toProviderTool(),
|
|
259
|
+
finishPlanTool.toProviderTool()
|
|
260
|
+
];
|
|
261
|
+
const perTaskFailures = new Map();
|
|
262
|
+
const MAX_CALLS = 100;
|
|
263
|
+
for (let call = 0; call < MAX_CALLS; call++) {
|
|
264
|
+
const pendingToolCalls = [];
|
|
265
|
+
let assistantText = "";
|
|
266
|
+
const stream = this.provider.generateMessagesTraced({
|
|
267
|
+
messages: [...messages],
|
|
268
|
+
model: this.model,
|
|
269
|
+
tools: providerTools,
|
|
270
|
+
toolChoice: "any",
|
|
271
|
+
threadId: this.threadId
|
|
272
|
+
});
|
|
273
|
+
for await (const item of stream) {
|
|
274
|
+
if ("type" in item && item.type === "chunk") {
|
|
275
|
+
const chunk = item;
|
|
276
|
+
if (typeof chunk.content === "string" && chunk.content.length > 0) {
|
|
277
|
+
assistantText += chunk.content;
|
|
278
|
+
yield {
|
|
279
|
+
type: "chunk",
|
|
280
|
+
content: chunk.content,
|
|
281
|
+
done: false
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if ("id" in item && "name" in item && "args" in item) {
|
|
286
|
+
pendingToolCalls.push(item);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Record assistant turn with any tool calls.
|
|
290
|
+
messages.push({
|
|
291
|
+
role: "assistant",
|
|
292
|
+
content: assistantText,
|
|
293
|
+
toolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined
|
|
294
|
+
});
|
|
295
|
+
if (pendingToolCalls.length === 0) {
|
|
296
|
+
messages.push({
|
|
297
|
+
role: "user",
|
|
298
|
+
content: "No tool call in your response. Call add_task, remove_task, or finish_plan to continue."
|
|
299
|
+
});
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
let aborted = null;
|
|
303
|
+
let finished = false;
|
|
304
|
+
for (const tc of pendingToolCalls) {
|
|
305
|
+
const tool = toolsByName.get(tc.name);
|
|
306
|
+
if (!tool) {
|
|
307
|
+
messages.push({
|
|
308
|
+
role: "tool",
|
|
309
|
+
toolCallId: tc.id,
|
|
310
|
+
content: JSON.stringify({
|
|
311
|
+
status: "error",
|
|
312
|
+
error: `Unknown tool: ${tc.name}. Use add_task, remove_task, or finish_plan.`
|
|
313
|
+
})
|
|
314
|
+
});
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
const args = (tc.args ?? {});
|
|
318
|
+
yield {
|
|
319
|
+
type: "tool_call_update",
|
|
320
|
+
node_id: "",
|
|
321
|
+
name: tc.name,
|
|
322
|
+
args,
|
|
323
|
+
message: tool.userMessage(args)
|
|
324
|
+
};
|
|
325
|
+
const result = (await tool.process({}, args));
|
|
326
|
+
messages.push({
|
|
327
|
+
role: "tool",
|
|
328
|
+
toolCallId: tc.id,
|
|
329
|
+
content: JSON.stringify(result)
|
|
330
|
+
});
|
|
331
|
+
const status = result["status"];
|
|
332
|
+
if (tc.name === addTaskTool.name) {
|
|
333
|
+
const taskId = typeof args["id"] === "string" ? args["id"] : undefined;
|
|
334
|
+
if (status === "task_added") {
|
|
335
|
+
const added = builder.currentTasks[builder.currentTasks.length - 1];
|
|
336
|
+
if (added)
|
|
337
|
+
yield this.taskPlannedEvent(added);
|
|
338
|
+
yield {
|
|
339
|
+
type: "planning_update",
|
|
340
|
+
phase: "generation",
|
|
341
|
+
status: "running",
|
|
342
|
+
content: `Added task ${builder.taskCount}: ${added?.title ?? taskId ?? ""}`
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
else if (status === "validation_failed") {
|
|
346
|
+
const errors = result["errors"] ?? [];
|
|
347
|
+
const count = (perTaskFailures.get(taskId ?? "_") ?? 0) + 1;
|
|
348
|
+
perTaskFailures.set(taskId ?? "_", count);
|
|
349
|
+
yield {
|
|
350
|
+
type: "planning_update",
|
|
351
|
+
phase: "validation",
|
|
352
|
+
status: "failed",
|
|
353
|
+
content: `Task '${taskId ?? "?"}' validation failed (${count}/${MAX_PER_TASK_RETRIES}): ${errors.join("; ")}`
|
|
354
|
+
};
|
|
355
|
+
if (count >= MAX_PER_TASK_RETRIES) {
|
|
356
|
+
aborted = `Task '${taskId ?? "?"}' failed validation ${count} times. Aborting plan.`;
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
else if (tc.name === removeTaskTool.name) {
|
|
362
|
+
const removedId = typeof args["id"] === "string" ? args["id"] : "";
|
|
363
|
+
if (status === "task_removed") {
|
|
364
|
+
yield {
|
|
365
|
+
type: "task_update",
|
|
366
|
+
event: TaskUpdateEvent.TaskRemoved,
|
|
367
|
+
task: { id: removedId }
|
|
368
|
+
};
|
|
369
|
+
perTaskFailures.delete(removedId);
|
|
370
|
+
yield {
|
|
371
|
+
type: "planning_update",
|
|
372
|
+
phase: "generation",
|
|
373
|
+
status: "running",
|
|
374
|
+
content: `Removed task: ${removedId}`
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
else if (tc.name === finishPlanTool.name) {
|
|
379
|
+
if (status === "plan_finished" && builder.plan) {
|
|
380
|
+
const plan = builder.plan;
|
|
381
|
+
const totalSteps = plan.tasks.reduce((s, t) => s + t.steps.length, 0);
|
|
382
|
+
const independent = plan.tasks.filter((t) => !t.dependsOn || t.dependsOn.length === 0).length;
|
|
383
|
+
log.info("Multi-task plan created", {
|
|
384
|
+
title: plan.title,
|
|
385
|
+
tasks: plan.tasks.length
|
|
386
|
+
});
|
|
387
|
+
yield {
|
|
388
|
+
type: "planning_update",
|
|
389
|
+
phase: "complete",
|
|
390
|
+
status: "success",
|
|
391
|
+
content: `Plan created: ${plan.title} (${plan.tasks.length} tasks, ${totalSteps} steps, ${independent} parallelizable)`
|
|
392
|
+
};
|
|
393
|
+
finished = true;
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
if (status === "validation_failed") {
|
|
397
|
+
const errors = result["errors"] ?? [];
|
|
398
|
+
yield {
|
|
399
|
+
type: "planning_update",
|
|
400
|
+
phase: "validation",
|
|
401
|
+
status: "failed",
|
|
402
|
+
content: `finish_plan failed: ${errors.join("; ")}`
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (finished)
|
|
408
|
+
return builder.plan;
|
|
409
|
+
if (aborted) {
|
|
410
|
+
yield {
|
|
411
|
+
type: "planning_update",
|
|
412
|
+
phase: "complete",
|
|
413
|
+
status: "failed",
|
|
414
|
+
content: aborted
|
|
415
|
+
};
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
log.error("Multi-task plan exhausted call budget", {
|
|
420
|
+
tasksSoFar: builder.taskCount
|
|
421
|
+
});
|
|
422
|
+
yield {
|
|
423
|
+
type: "planning_update",
|
|
424
|
+
phase: "complete",
|
|
425
|
+
status: "failed",
|
|
426
|
+
content: `Plan generation exhausted ${MAX_CALLS} calls without calling finish_plan`
|
|
427
|
+
};
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
430
|
+
// ---------------------------------------------------------------------------
|
|
431
|
+
// Single-task one-shot call
|
|
432
|
+
// ---------------------------------------------------------------------------
|
|
433
|
+
async *callSingleTaskTool(messages, planningTool) {
|
|
434
|
+
let content = "";
|
|
435
|
+
let toolCallArgs = null;
|
|
436
|
+
const providerTool = planningTool.toProviderTool();
|
|
437
|
+
const onToolCall = async (name, args) => {
|
|
438
|
+
if (name === planningTool.name) {
|
|
439
|
+
toolCallArgs = args;
|
|
440
|
+
return JSON.stringify({ status: "tool_called" });
|
|
441
|
+
}
|
|
442
|
+
return JSON.stringify({ error: `Unknown tool: ${name}` });
|
|
443
|
+
};
|
|
444
|
+
const stream = this.provider.generateMessagesTraced({
|
|
445
|
+
messages: [...messages],
|
|
446
|
+
model: this.model,
|
|
447
|
+
tools: [providerTool],
|
|
448
|
+
toolChoice: planningTool.name,
|
|
449
|
+
threadId: this.threadId,
|
|
450
|
+
onToolCall
|
|
451
|
+
});
|
|
452
|
+
for await (const item of stream) {
|
|
453
|
+
if ("type" in item &&
|
|
454
|
+
item["type"] === "chunk") {
|
|
455
|
+
const chunk = item;
|
|
456
|
+
if (typeof chunk.content === "string") {
|
|
457
|
+
content += chunk.content;
|
|
458
|
+
yield {
|
|
459
|
+
type: "chunk",
|
|
460
|
+
content: chunk.content,
|
|
461
|
+
done: false
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
if ("name" in item && item.name === planningTool.name) {
|
|
466
|
+
toolCallArgs = item.args;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
if (!toolCallArgs) {
|
|
470
|
+
return {
|
|
471
|
+
error: `LLM did not call ${planningTool.name} tool`,
|
|
472
|
+
assistantContent: content || undefined
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
const result = await planningTool.process({}, toolCallArgs);
|
|
476
|
+
if (typeof result === "object" &&
|
|
477
|
+
result !== null &&
|
|
478
|
+
result["status"] === "validation_failed") {
|
|
479
|
+
const errors = result["errors"];
|
|
480
|
+
return {
|
|
481
|
+
error: `Plan validation failed:\n${errors.map((e) => `- ${e}`).join("\n")}`,
|
|
482
|
+
assistantContent: content || undefined
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
return { assistantContent: content || undefined };
|
|
486
|
+
}
|
|
487
|
+
// ---------------------------------------------------------------------------
|
|
488
|
+
// Helpers
|
|
489
|
+
// ---------------------------------------------------------------------------
|
|
490
|
+
taskPlannedEvent(task) {
|
|
491
|
+
const steps = task.steps.map((s) => ({
|
|
492
|
+
id: s.id,
|
|
493
|
+
instructions: s.instructions,
|
|
494
|
+
completed: false
|
|
495
|
+
}));
|
|
496
|
+
return {
|
|
497
|
+
type: "task_update",
|
|
498
|
+
event: TaskUpdateEvent.TaskPlanned,
|
|
499
|
+
task: {
|
|
500
|
+
id: task.id,
|
|
501
|
+
title: task.title,
|
|
502
|
+
steps,
|
|
503
|
+
dependsOn: task.dependsOn
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
formatToolsInfo() {
|
|
508
|
+
if (this.tools.length === 0)
|
|
509
|
+
return "No execution tools available.";
|
|
510
|
+
const lines = ["Available execution tools for steps:"];
|
|
511
|
+
for (const tool of this.tools) {
|
|
512
|
+
let schemaInfo = "";
|
|
513
|
+
const schema = tool.inputSchema;
|
|
514
|
+
if (schema && typeof schema === "object" && "properties" in schema) {
|
|
515
|
+
const props = Object.keys(schema.properties);
|
|
516
|
+
const required = Array.isArray(schema.required)
|
|
517
|
+
? schema.required
|
|
518
|
+
: [];
|
|
519
|
+
const propDetails = props.map((p) => {
|
|
520
|
+
const isReq = required.includes(p) ? " (required)" : "";
|
|
521
|
+
return `${p}${isReq}`;
|
|
522
|
+
});
|
|
523
|
+
if (propDetails.length > 0) {
|
|
524
|
+
schemaInfo = ` | Args: ${propDetails.join(", ")}`;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
lines.push(`- ${tool.name}: ${tool.description}${schemaInfo}`);
|
|
528
|
+
}
|
|
529
|
+
return lines.join("\n");
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
//# sourceMappingURL=task-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-planner.js","sourceRoot":"","sources":["../src/task-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DbTaskBoard — ITaskBoard implementation backed by SQLite via Drizzle.
|
|
3
|
+
*
|
|
4
|
+
* All tasks are persisted to the `nodetool_team_tasks` table, keyed by
|
|
5
|
+
* team_id. This replaces the in-memory TaskBoard for production use,
|
|
6
|
+
* ensuring tasks survive restarts and are queryable across sessions.
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentIdentity, BoardTask, ITaskBoard, TeamEvent } from "./types.js";
|
|
9
|
+
export type BoardEventHandler = (event: TeamEvent) => void;
|
|
10
|
+
export declare class DbTaskBoard implements ITaskBoard {
|
|
11
|
+
private teamId;
|
|
12
|
+
private listeners;
|
|
13
|
+
constructor(teamId: string);
|
|
14
|
+
private db;
|
|
15
|
+
private now;
|
|
16
|
+
private getRow;
|
|
17
|
+
create(opts: {
|
|
18
|
+
title: string;
|
|
19
|
+
description: string;
|
|
20
|
+
createdBy: string;
|
|
21
|
+
dependsOn?: string[];
|
|
22
|
+
requiredSkills?: string[];
|
|
23
|
+
priority?: number;
|
|
24
|
+
parentTaskId?: string;
|
|
25
|
+
}): BoardTask;
|
|
26
|
+
claim(taskId: string, agentId: string): boolean;
|
|
27
|
+
startWork(taskId: string, agentId: string): boolean;
|
|
28
|
+
complete(taskId: string, opts?: {
|
|
29
|
+
result?: unknown;
|
|
30
|
+
artifacts?: unknown[];
|
|
31
|
+
}): boolean;
|
|
32
|
+
fail(taskId: string, reason: string): boolean;
|
|
33
|
+
block(taskId: string): boolean;
|
|
34
|
+
unblock(taskId: string): boolean;
|
|
35
|
+
decompose(parentTaskId: string, subtasks: Array<{
|
|
36
|
+
title: string;
|
|
37
|
+
description: string;
|
|
38
|
+
createdBy: string;
|
|
39
|
+
requiredSkills?: string[];
|
|
40
|
+
priority?: number;
|
|
41
|
+
dependsOn?: string[];
|
|
42
|
+
}>): BoardTask[];
|
|
43
|
+
getAvailable(agent?: AgentIdentity): BoardTask[];
|
|
44
|
+
get(taskId: string): BoardTask | undefined;
|
|
45
|
+
getSnapshot(): BoardTask[];
|
|
46
|
+
getSubtasks(parentTaskId: string): BoardTask[];
|
|
47
|
+
isComplete(): boolean;
|
|
48
|
+
detectDeadlock(): string[] | null;
|
|
49
|
+
resolveParents(): void;
|
|
50
|
+
onEvent(handler: BoardEventHandler): () => void;
|
|
51
|
+
private dependenciesMet;
|
|
52
|
+
private emit;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=db-task-board.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-task-board.d.ts","sourceRoot":"","sources":["../../src/team/db-task-board.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,UAAU,EAEV,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AAsB3D,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAA2B;gBAEhC,MAAM,EAAE,MAAM;IAI1B,OAAO,CAAC,EAAE;IAIV,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,MAAM;IASd,MAAM,CAAC,IAAI,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,SAAS;IA6Cb,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAsB/C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAqBnD,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GACjD,OAAO;IA+BV,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAqB7C,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAc9B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAYhC,SAAS,CACP,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,KAAK,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC,GACD,SAAS,EAAE;IAyBd,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,EAAE;IA2BhD,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAK1C,WAAW,IAAI,SAAS,EAAE;IAS1B,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE;IAc9C,UAAU,IAAI,OAAO;IAWrB,cAAc,IAAI,MAAM,EAAE,GAAG,IAAI;IA+BjC,cAAc,IAAI,IAAI;IAqCtB,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAU/C,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,IAAI;CASb"}
|