@nodetool-ai/agents 0.7.0-rc.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/dist/agent-executor.d.ts +62 -0
  2. package/dist/agent-executor.d.ts.map +1 -0
  3. package/dist/agent-executor.js +324 -0
  4. package/dist/agent-executor.js.map +1 -0
  5. package/dist/agent-step-executor.d.ts +28 -0
  6. package/dist/agent-step-executor.d.ts.map +1 -0
  7. package/dist/agent-step-executor.js +99 -0
  8. package/dist/agent-step-executor.js.map +1 -0
  9. package/dist/agent-workflow-runner.d.ts +31 -0
  10. package/dist/agent-workflow-runner.d.ts.map +1 -0
  11. package/dist/agent-workflow-runner.js +124 -0
  12. package/dist/agent-workflow-runner.js.map +1 -0
  13. package/dist/agent.d.ts +115 -0
  14. package/dist/agent.d.ts.map +1 -0
  15. package/dist/agent.js +587 -0
  16. package/dist/agent.js.map +1 -0
  17. package/dist/base-agent.d.ts +42 -0
  18. package/dist/base-agent.d.ts.map +1 -0
  19. package/dist/base-agent.js +29 -0
  20. package/dist/base-agent.js.map +1 -0
  21. package/dist/constants.d.ts +8 -0
  22. package/dist/constants.d.ts.map +1 -0
  23. package/dist/constants.js +8 -0
  24. package/dist/constants.js.map +1 -0
  25. package/dist/graph-builder.d.ts +49 -0
  26. package/dist/graph-builder.d.ts.map +1 -0
  27. package/dist/graph-builder.js +206 -0
  28. package/dist/graph-builder.js.map +1 -0
  29. package/dist/graph-planner.d.ts +56 -0
  30. package/dist/graph-planner.d.ts.map +1 -0
  31. package/dist/graph-planner.js +311 -0
  32. package/dist/graph-planner.js.map +1 -0
  33. package/dist/index.d.ts +79 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +81 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/js-sandbox.d.ts +84 -0
  38. package/dist/js-sandbox.d.ts.map +1 -0
  39. package/dist/js-sandbox.js +654 -0
  40. package/dist/js-sandbox.js.map +1 -0
  41. package/dist/multi-mode-agent.d.ts +86 -0
  42. package/dist/multi-mode-agent.d.ts.map +1 -0
  43. package/dist/multi-mode-agent.js +476 -0
  44. package/dist/multi-mode-agent.js.map +1 -0
  45. package/dist/output-format.d.ts +10 -0
  46. package/dist/output-format.d.ts.map +1 -0
  47. package/dist/output-format.js +17 -0
  48. package/dist/output-format.js.map +1 -0
  49. package/dist/parallel-task-executor.d.ts +87 -0
  50. package/dist/parallel-task-executor.d.ts.map +1 -0
  51. package/dist/parallel-task-executor.js +332 -0
  52. package/dist/parallel-task-executor.js.map +1 -0
  53. package/dist/prompts/graph-planner-prompt.d.ts +48 -0
  54. package/dist/prompts/graph-planner-prompt.d.ts.map +1 -0
  55. package/dist/prompts/graph-planner-prompt.js +180 -0
  56. package/dist/prompts/graph-planner-prompt.js.map +1 -0
  57. package/dist/reject-agentic-provider.d.ts +21 -0
  58. package/dist/reject-agentic-provider.d.ts.map +1 -0
  59. package/dist/reject-agentic-provider.js +32 -0
  60. package/dist/reject-agentic-provider.js.map +1 -0
  61. package/dist/simple-agent.d.ts +29 -0
  62. package/dist/simple-agent.d.ts.map +1 -0
  63. package/dist/simple-agent.js +54 -0
  64. package/dist/simple-agent.js.map +1 -0
  65. package/dist/step-executor.d.ts +162 -0
  66. package/dist/step-executor.d.ts.map +1 -0
  67. package/dist/step-executor.js +1114 -0
  68. package/dist/step-executor.js.map +1 -0
  69. package/dist/sub-agent-planner.d.ts +33 -0
  70. package/dist/sub-agent-planner.d.ts.map +1 -0
  71. package/dist/sub-agent-planner.js +203 -0
  72. package/dist/sub-agent-planner.js.map +1 -0
  73. package/dist/task-executor.d.ts +89 -0
  74. package/dist/task-executor.d.ts.map +1 -0
  75. package/dist/task-executor.js +359 -0
  76. package/dist/task-executor.js.map +1 -0
  77. package/dist/task-planner.d.ts +44 -0
  78. package/dist/task-planner.d.ts.map +1 -0
  79. package/dist/task-planner.js +532 -0
  80. package/dist/task-planner.js.map +1 -0
  81. package/dist/team/db-task-board.d.ts +54 -0
  82. package/dist/team/db-task-board.d.ts.map +1 -0
  83. package/dist/team/db-task-board.js +361 -0
  84. package/dist/team/db-task-board.js.map +1 -0
  85. package/dist/team/edge-message-bus.d.ts +51 -0
  86. package/dist/team/edge-message-bus.d.ts.map +1 -0
  87. package/dist/team/edge-message-bus.js +169 -0
  88. package/dist/team/edge-message-bus.js.map +1 -0
  89. package/dist/team/edge-task-board.d.ts +77 -0
  90. package/dist/team/edge-task-board.d.ts.map +1 -0
  91. package/dist/team/edge-task-board.js +140 -0
  92. package/dist/team/edge-task-board.js.map +1 -0
  93. package/dist/team/index.d.ts +16 -0
  94. package/dist/team/index.d.ts.map +1 -0
  95. package/dist/team/index.js +17 -0
  96. package/dist/team/index.js.map +1 -0
  97. package/dist/team/message-bus.d.ts +58 -0
  98. package/dist/team/message-bus.d.ts.map +1 -0
  99. package/dist/team/message-bus.js +151 -0
  100. package/dist/team/message-bus.js.map +1 -0
  101. package/dist/team/task-board.d.ts +106 -0
  102. package/dist/team/task-board.d.ts.map +1 -0
  103. package/dist/team/task-board.js +370 -0
  104. package/dist/team/task-board.js.map +1 -0
  105. package/dist/team/team-executor.d.ts +72 -0
  106. package/dist/team/team-executor.d.ts.map +1 -0
  107. package/dist/team/team-executor.js +466 -0
  108. package/dist/team/team-executor.js.map +1 -0
  109. package/dist/team/team-tools.d.ts +252 -0
  110. package/dist/team/team-tools.d.ts.map +1 -0
  111. package/dist/team/team-tools.js +412 -0
  112. package/dist/team/team-tools.js.map +1 -0
  113. package/dist/team/types.d.ts +198 -0
  114. package/dist/team/types.d.ts.map +1 -0
  115. package/dist/team/types.js +8 -0
  116. package/dist/team/types.js.map +1 -0
  117. package/dist/tools/add-edge-tool.d.ts +18 -0
  118. package/dist/tools/add-edge-tool.d.ts.map +1 -0
  119. package/dist/tools/add-edge-tool.js +92 -0
  120. package/dist/tools/add-edge-tool.js.map +1 -0
  121. package/dist/tools/add-node-tool.d.ts +22 -0
  122. package/dist/tools/add-node-tool.d.ts.map +1 -0
  123. package/dist/tools/add-node-tool.js +128 -0
  124. package/dist/tools/add-node-tool.js.map +1 -0
  125. package/dist/tools/asset-tools.d.ts +58 -0
  126. package/dist/tools/asset-tools.d.ts.map +1 -0
  127. package/dist/tools/asset-tools.js +191 -0
  128. package/dist/tools/asset-tools.js.map +1 -0
  129. package/dist/tools/base-tool.d.ts +25 -0
  130. package/dist/tools/base-tool.d.ts.map +1 -0
  131. package/dist/tools/base-tool.js +24 -0
  132. package/dist/tools/base-tool.js.map +1 -0
  133. package/dist/tools/browser-tools.d.ts +32 -0
  134. package/dist/tools/browser-tools.d.ts.map +1 -0
  135. package/dist/tools/browser-tools.js +208 -0
  136. package/dist/tools/browser-tools.js.map +1 -0
  137. package/dist/tools/calculator-tool.d.ts +24 -0
  138. package/dist/tools/calculator-tool.d.ts.map +1 -0
  139. package/dist/tools/calculator-tool.js +64 -0
  140. package/dist/tools/calculator-tool.js.map +1 -0
  141. package/dist/tools/claude-code-tools.d.ts +96 -0
  142. package/dist/tools/claude-code-tools.d.ts.map +1 -0
  143. package/dist/tools/claude-code-tools.js +463 -0
  144. package/dist/tools/claude-code-tools.js.map +1 -0
  145. package/dist/tools/code-tools.d.ts +26 -0
  146. package/dist/tools/code-tools.d.ts.map +1 -0
  147. package/dist/tools/code-tools.js +82 -0
  148. package/dist/tools/code-tools.js.map +1 -0
  149. package/dist/tools/control-tool.d.ts +47 -0
  150. package/dist/tools/control-tool.d.ts.map +1 -0
  151. package/dist/tools/control-tool.js +101 -0
  152. package/dist/tools/control-tool.js.map +1 -0
  153. package/dist/tools/create-plan-tool.d.ts +29 -0
  154. package/dist/tools/create-plan-tool.d.ts.map +1 -0
  155. package/dist/tools/create-plan-tool.js +355 -0
  156. package/dist/tools/create-plan-tool.js.map +1 -0
  157. package/dist/tools/create-task-tool.d.ts +28 -0
  158. package/dist/tools/create-task-tool.d.ts.map +1 -0
  159. package/dist/tools/create-task-tool.js +254 -0
  160. package/dist/tools/create-task-tool.js.map +1 -0
  161. package/dist/tools/dataseo-tools.d.ts +38 -0
  162. package/dist/tools/dataseo-tools.d.ts.map +1 -0
  163. package/dist/tools/dataseo-tools.js +329 -0
  164. package/dist/tools/dataseo-tools.js.map +1 -0
  165. package/dist/tools/email-tools.d.ts +76 -0
  166. package/dist/tools/email-tools.d.ts.map +1 -0
  167. package/dist/tools/email-tools.js +259 -0
  168. package/dist/tools/email-tools.js.map +1 -0
  169. package/dist/tools/filesystem-tools.d.ts +77 -0
  170. package/dist/tools/filesystem-tools.d.ts.map +1 -0
  171. package/dist/tools/filesystem-tools.js +334 -0
  172. package/dist/tools/filesystem-tools.js.map +1 -0
  173. package/dist/tools/find-model-tool.d.ts +25 -0
  174. package/dist/tools/find-model-tool.d.ts.map +1 -0
  175. package/dist/tools/find-model-tool.js +236 -0
  176. package/dist/tools/find-model-tool.js.map +1 -0
  177. package/dist/tools/finish-graph-tool.d.ts +23 -0
  178. package/dist/tools/finish-graph-tool.d.ts.map +1 -0
  179. package/dist/tools/finish-graph-tool.js +46 -0
  180. package/dist/tools/finish-graph-tool.js.map +1 -0
  181. package/dist/tools/finish-step-tool.d.ts +16 -0
  182. package/dist/tools/finish-step-tool.d.ts.map +1 -0
  183. package/dist/tools/finish-step-tool.js +68 -0
  184. package/dist/tools/finish-step-tool.js.map +1 -0
  185. package/dist/tools/google-tools.d.ts +44 -0
  186. package/dist/tools/google-tools.d.ts.map +1 -0
  187. package/dist/tools/google-tools.js +176 -0
  188. package/dist/tools/google-tools.js.map +1 -0
  189. package/dist/tools/http-tools.d.ts +56 -0
  190. package/dist/tools/http-tools.d.ts.map +1 -0
  191. package/dist/tools/http-tools.js +180 -0
  192. package/dist/tools/http-tools.js.map +1 -0
  193. package/dist/tools/js-code-tool.d.ts +30 -0
  194. package/dist/tools/js-code-tool.d.ts.map +1 -0
  195. package/dist/tools/js-code-tool.js +98 -0
  196. package/dist/tools/js-code-tool.js.map +1 -0
  197. package/dist/tools/local-get-node-info-tool.d.ts +19 -0
  198. package/dist/tools/local-get-node-info-tool.d.ts.map +1 -0
  199. package/dist/tools/local-get-node-info-tool.js +75 -0
  200. package/dist/tools/local-get-node-info-tool.js.map +1 -0
  201. package/dist/tools/local-list-nodes-tool.d.ts +19 -0
  202. package/dist/tools/local-list-nodes-tool.d.ts.map +1 -0
  203. package/dist/tools/local-list-nodes-tool.js +69 -0
  204. package/dist/tools/local-list-nodes-tool.js.map +1 -0
  205. package/dist/tools/local-search-nodes-tool.d.ts +21 -0
  206. package/dist/tools/local-search-nodes-tool.d.ts.map +1 -0
  207. package/dist/tools/local-search-nodes-tool.js +111 -0
  208. package/dist/tools/local-search-nodes-tool.js.map +1 -0
  209. package/dist/tools/math-tools.d.ts +156 -0
  210. package/dist/tools/math-tools.d.ts.map +1 -0
  211. package/dist/tools/math-tools.js +422 -0
  212. package/dist/tools/math-tools.js.map +1 -0
  213. package/dist/tools/mcp-tools.d.ts +413 -0
  214. package/dist/tools/mcp-tools.d.ts.map +1 -0
  215. package/dist/tools/mcp-tools.js +618 -0
  216. package/dist/tools/mcp-tools.js.map +1 -0
  217. package/dist/tools/media-tools.d.ts +277 -0
  218. package/dist/tools/media-tools.d.ts.map +1 -0
  219. package/dist/tools/media-tools.js +682 -0
  220. package/dist/tools/media-tools.js.map +1 -0
  221. package/dist/tools/model-tools.d.ts +25 -0
  222. package/dist/tools/model-tools.d.ts.map +1 -0
  223. package/dist/tools/model-tools.js +48 -0
  224. package/dist/tools/model-tools.js.map +1 -0
  225. package/dist/tools/openai-tools.d.ts +73 -0
  226. package/dist/tools/openai-tools.d.ts.map +1 -0
  227. package/dist/tools/openai-tools.js +193 -0
  228. package/dist/tools/openai-tools.js.map +1 -0
  229. package/dist/tools/pdf-tools.d.ts +152 -0
  230. package/dist/tools/pdf-tools.d.ts.map +1 -0
  231. package/dist/tools/pdf-tools.js +339 -0
  232. package/dist/tools/pdf-tools.js.map +1 -0
  233. package/dist/tools/plan-builder-tools.d.ts +72 -0
  234. package/dist/tools/plan-builder-tools.d.ts.map +1 -0
  235. package/dist/tools/plan-builder-tools.js +438 -0
  236. package/dist/tools/plan-builder-tools.js.map +1 -0
  237. package/dist/tools/search-tools.d.ts +39 -0
  238. package/dist/tools/search-tools.d.ts.map +1 -0
  239. package/dist/tools/search-tools.js +218 -0
  240. package/dist/tools/search-tools.js.map +1 -0
  241. package/dist/tools/serp-providers/dataforseo-provider.d.ts +14 -0
  242. package/dist/tools/serp-providers/dataforseo-provider.d.ts.map +1 -0
  243. package/dist/tools/serp-providers/dataforseo-provider.js +114 -0
  244. package/dist/tools/serp-providers/dataforseo-provider.js.map +1 -0
  245. package/dist/tools/serp-providers/index.d.ts +35 -0
  246. package/dist/tools/serp-providers/index.d.ts.map +1 -0
  247. package/dist/tools/serp-providers/index.js +14 -0
  248. package/dist/tools/serp-providers/index.js.map +1 -0
  249. package/dist/tools/serp-providers/serpapi-provider.d.ts +18 -0
  250. package/dist/tools/serp-providers/serpapi-provider.d.ts.map +1 -0
  251. package/dist/tools/serp-providers/serpapi-provider.js +66 -0
  252. package/dist/tools/serp-providers/serpapi-provider.js.map +1 -0
  253. package/dist/tools/tool-registry.d.ts +9 -0
  254. package/dist/tools/tool-registry.d.ts.map +1 -0
  255. package/dist/tools/tool-registry.js +17 -0
  256. package/dist/tools/tool-registry.js.map +1 -0
  257. package/dist/tools/vector-tools.d.ts +224 -0
  258. package/dist/tools/vector-tools.d.ts.map +1 -0
  259. package/dist/tools/vector-tools.js +582 -0
  260. package/dist/tools/vector-tools.js.map +1 -0
  261. package/dist/tools/workspace-tools.d.ts +58 -0
  262. package/dist/tools/workspace-tools.d.ts.map +1 -0
  263. package/dist/tools/workspace-tools.js +152 -0
  264. package/dist/tools/workspace-tools.js.map +1 -0
  265. package/dist/types.d.ts +65 -0
  266. package/dist/types.d.ts.map +1 -0
  267. package/dist/types.js +5 -0
  268. package/dist/types.js.map +1 -0
  269. package/dist/utils/json-parser.d.ts +15 -0
  270. package/dist/utils/json-parser.d.ts.map +1 -0
  271. package/dist/utils/json-parser.js +78 -0
  272. package/dist/utils/json-parser.js.map +1 -0
  273. package/dist/utils/remove-base64-images.d.ts +12 -0
  274. package/dist/utils/remove-base64-images.d.ts.map +1 -0
  275. package/dist/utils/remove-base64-images.js +20 -0
  276. package/dist/utils/remove-base64-images.js.map +1 -0
  277. package/dist/utils/wrap-generators-parallel.d.ts +11 -0
  278. package/dist/utils/wrap-generators-parallel.d.ts.map +1 -0
  279. package/dist/utils/wrap-generators-parallel.js +38 -0
  280. package/dist/utils/wrap-generators-parallel.js.map +1 -0
  281. package/package.json +65 -0
@@ -0,0 +1,361 @@
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 { randomUUID } from "node:crypto";
9
+ import { eq, and } from "drizzle-orm";
10
+ import { getDb, teamTasks } from "@nodetool-ai/models";
11
+ function rowToTask(row) {
12
+ return {
13
+ id: row.id,
14
+ title: row.title,
15
+ description: row.description,
16
+ status: row.status,
17
+ createdBy: row.created_by,
18
+ claimedBy: row.claimed_by ?? undefined,
19
+ dependsOn: row.depends_on ?? [],
20
+ requiredSkills: row.required_skills ?? [],
21
+ priority: row.priority,
22
+ artifacts: row.artifacts ?? [],
23
+ parentTaskId: row.parent_task_id ?? undefined,
24
+ result: row.result ?? undefined,
25
+ failureReason: row.failure_reason ?? undefined,
26
+ createdAt: new Date(row.created_at).getTime(),
27
+ updatedAt: new Date(row.updated_at).getTime()
28
+ };
29
+ }
30
+ export class DbTaskBoard {
31
+ teamId;
32
+ listeners = [];
33
+ constructor(teamId) {
34
+ this.teamId = teamId;
35
+ }
36
+ db() {
37
+ return getDb();
38
+ }
39
+ now() {
40
+ return new Date().toISOString();
41
+ }
42
+ getRow(taskId) {
43
+ const rows = this.db()
44
+ .select()
45
+ .from(teamTasks)
46
+ .where(and(eq(teamTasks.id, taskId), eq(teamTasks.team_id, this.teamId)))
47
+ .all();
48
+ return rows[0] ?? null;
49
+ }
50
+ create(opts) {
51
+ const now = this.now();
52
+ const id = randomUUID();
53
+ const dependsOn = opts.dependsOn ?? [];
54
+ const requiredSkills = opts.requiredSkills ?? [];
55
+ const priority = opts.priority ?? 5;
56
+ // Validate dependencies exist
57
+ for (const depId of dependsOn) {
58
+ if (!this.getRow(depId)) {
59
+ throw new Error(`Dependency task ${depId} not found`);
60
+ }
61
+ }
62
+ this.db()
63
+ .insert(teamTasks)
64
+ .values({
65
+ id,
66
+ team_id: this.teamId,
67
+ title: opts.title,
68
+ description: opts.description,
69
+ status: "open",
70
+ created_by: opts.createdBy,
71
+ depends_on: dependsOn,
72
+ required_skills: requiredSkills,
73
+ priority,
74
+ artifacts: [],
75
+ parent_task_id: opts.parentTaskId ?? null,
76
+ result: null,
77
+ failure_reason: null,
78
+ created_at: now,
79
+ updated_at: now
80
+ })
81
+ .run();
82
+ const task = rowToTask(this.getRow(id));
83
+ this.emit({
84
+ type: "task_created",
85
+ task: { ...task },
86
+ timestamp: Date.now()
87
+ });
88
+ return task;
89
+ }
90
+ claim(taskId, agentId) {
91
+ const row = this.getRow(taskId);
92
+ if (!row || row.status !== "open")
93
+ return false;
94
+ if (!this.dependenciesMet(taskId))
95
+ return false;
96
+ const result = this.db()
97
+ .update(teamTasks)
98
+ .set({ status: "claimed", claimed_by: agentId, updated_at: this.now() })
99
+ .where(and(eq(teamTasks.id, taskId), eq(teamTasks.status, "open")))
100
+ .run();
101
+ if (result.changes === 0)
102
+ return false;
103
+ this.emit({
104
+ type: "task_claimed",
105
+ taskId,
106
+ agentId,
107
+ timestamp: Date.now()
108
+ });
109
+ return true;
110
+ }
111
+ startWork(taskId, agentId) {
112
+ const row = this.getRow(taskId);
113
+ if (!row || row.claimed_by !== agentId || row.status !== "claimed") {
114
+ return false;
115
+ }
116
+ this.db()
117
+ .update(teamTasks)
118
+ .set({ status: "working", updated_at: this.now() })
119
+ .where(eq(teamTasks.id, taskId))
120
+ .run();
121
+ this.emit({
122
+ type: "task_working",
123
+ taskId,
124
+ agentId,
125
+ timestamp: Date.now()
126
+ });
127
+ return true;
128
+ }
129
+ complete(taskId, opts) {
130
+ const row = this.getRow(taskId);
131
+ if (!row || (row.status !== "working" && row.status !== "claimed")) {
132
+ return false;
133
+ }
134
+ const existingArtifacts = row.artifacts ?? [];
135
+ const newArtifacts = opts?.artifacts
136
+ ? [...existingArtifacts, ...opts.artifacts]
137
+ : existingArtifacts;
138
+ this.db()
139
+ .update(teamTasks)
140
+ .set({
141
+ status: "done",
142
+ result: opts?.result ?? null,
143
+ artifacts: newArtifacts,
144
+ updated_at: this.now()
145
+ })
146
+ .where(eq(teamTasks.id, taskId))
147
+ .run();
148
+ this.emit({
149
+ type: "task_completed",
150
+ taskId,
151
+ artifacts: newArtifacts,
152
+ timestamp: Date.now()
153
+ });
154
+ return true;
155
+ }
156
+ fail(taskId, reason) {
157
+ const row = this.getRow(taskId);
158
+ if (!row || row.status === "done" || row.status === "failed") {
159
+ return false;
160
+ }
161
+ this.db()
162
+ .update(teamTasks)
163
+ .set({ status: "failed", failure_reason: reason, updated_at: this.now() })
164
+ .where(eq(teamTasks.id, taskId))
165
+ .run();
166
+ this.emit({
167
+ type: "task_failed",
168
+ taskId,
169
+ reason,
170
+ timestamp: Date.now()
171
+ });
172
+ return true;
173
+ }
174
+ block(taskId) {
175
+ const row = this.getRow(taskId);
176
+ if (!row || row.status === "done" || row.status === "failed") {
177
+ return false;
178
+ }
179
+ this.db()
180
+ .update(teamTasks)
181
+ .set({ status: "blocked", updated_at: this.now() })
182
+ .where(eq(teamTasks.id, taskId))
183
+ .run();
184
+ return true;
185
+ }
186
+ unblock(taskId) {
187
+ const row = this.getRow(taskId);
188
+ if (!row || row.status !== "blocked")
189
+ return false;
190
+ this.db()
191
+ .update(teamTasks)
192
+ .set({ status: "open", claimed_by: null, updated_at: this.now() })
193
+ .where(eq(teamTasks.id, taskId))
194
+ .run();
195
+ return true;
196
+ }
197
+ decompose(parentTaskId, subtasks) {
198
+ const parent = this.getRow(parentTaskId);
199
+ if (!parent)
200
+ throw new Error(`Parent task ${parentTaskId} not found`);
201
+ const created = [];
202
+ for (const sub of subtasks) {
203
+ created.push(this.create({
204
+ ...sub,
205
+ parentTaskId,
206
+ dependsOn: sub.dependsOn ?? []
207
+ }));
208
+ }
209
+ // Block parent until subtasks are done
210
+ this.db()
211
+ .update(teamTasks)
212
+ .set({ status: "blocked", updated_at: this.now() })
213
+ .where(eq(teamTasks.id, parentTaskId))
214
+ .run();
215
+ return created;
216
+ }
217
+ getAvailable(agent) {
218
+ const rows = this.db()
219
+ .select()
220
+ .from(teamTasks)
221
+ .where(and(eq(teamTasks.team_id, this.teamId), eq(teamTasks.status, "open")))
222
+ .all();
223
+ const available = [];
224
+ for (const row of rows) {
225
+ const task = rowToTask(row);
226
+ if (!this.dependenciesMet(task.id))
227
+ continue;
228
+ if (agent && task.requiredSkills.length > 0) {
229
+ const hasAllSkills = task.requiredSkills.every((s) => agent.skills.includes(s));
230
+ if (!hasAllSkills)
231
+ continue;
232
+ }
233
+ available.push(task);
234
+ }
235
+ return available.sort((a, b) => a.priority - b.priority);
236
+ }
237
+ get(taskId) {
238
+ const row = this.getRow(taskId);
239
+ return row ? rowToTask(row) : undefined;
240
+ }
241
+ getSnapshot() {
242
+ const rows = this.db()
243
+ .select()
244
+ .from(teamTasks)
245
+ .where(eq(teamTasks.team_id, this.teamId))
246
+ .all();
247
+ return rows.map(rowToTask);
248
+ }
249
+ getSubtasks(parentTaskId) {
250
+ const rows = this.db()
251
+ .select()
252
+ .from(teamTasks)
253
+ .where(and(eq(teamTasks.team_id, this.teamId), eq(teamTasks.parent_task_id, parentTaskId)))
254
+ .all();
255
+ return rows.map(rowToTask);
256
+ }
257
+ isComplete() {
258
+ const rows = this.db()
259
+ .select()
260
+ .from(teamTasks)
261
+ .where(eq(teamTasks.team_id, this.teamId))
262
+ .all();
263
+ if (rows.length === 0)
264
+ return false;
265
+ return rows.every((r) => r.status === "done" || r.status === "failed");
266
+ }
267
+ detectDeadlock() {
268
+ const rows = this.db()
269
+ .select()
270
+ .from(teamTasks)
271
+ .where(eq(teamTasks.team_id, this.teamId))
272
+ .all();
273
+ const active = [];
274
+ const stuck = [];
275
+ for (const row of rows) {
276
+ if (row.status === "done" || row.status === "failed")
277
+ continue;
278
+ if (row.status === "claimed" || row.status === "working") {
279
+ active.push(row.id);
280
+ }
281
+ else if (row.status === "open" && !this.dependenciesMet(row.id)) {
282
+ stuck.push(row.id);
283
+ }
284
+ else if (row.status === "blocked") {
285
+ stuck.push(row.id);
286
+ }
287
+ }
288
+ if (stuck.length > 0 && active.length === 0) {
289
+ const claimable = rows.filter((r) => r.status === "open" && this.dependenciesMet(r.id));
290
+ if (claimable.length === 0)
291
+ return stuck;
292
+ }
293
+ return null;
294
+ }
295
+ resolveParents() {
296
+ const rows = this.db()
297
+ .select()
298
+ .from(teamTasks)
299
+ .where(and(eq(teamTasks.team_id, this.teamId), eq(teamTasks.status, "blocked")))
300
+ .all();
301
+ for (const row of rows) {
302
+ const subtasks = this.getSubtasks(row.id);
303
+ if (subtasks.length === 0)
304
+ continue;
305
+ if (subtasks.every((s) => s.status === "done")) {
306
+ const allArtifacts = subtasks.flatMap((s) => s.artifacts);
307
+ const result = subtasks.map((s) => s.result);
308
+ this.db()
309
+ .update(teamTasks)
310
+ .set({
311
+ status: "done",
312
+ result,
313
+ artifacts: allArtifacts,
314
+ updated_at: this.now()
315
+ })
316
+ .where(eq(teamTasks.id, row.id))
317
+ .run();
318
+ this.emit({
319
+ type: "task_completed",
320
+ taskId: row.id,
321
+ artifacts: allArtifacts,
322
+ timestamp: Date.now()
323
+ });
324
+ }
325
+ }
326
+ }
327
+ onEvent(handler) {
328
+ this.listeners.push(handler);
329
+ return () => {
330
+ const idx = this.listeners.indexOf(handler);
331
+ if (idx >= 0)
332
+ this.listeners.splice(idx, 1);
333
+ };
334
+ }
335
+ // ─── Internal ───
336
+ dependenciesMet(taskId) {
337
+ const row = this.getRow(taskId);
338
+ if (!row)
339
+ return false;
340
+ const deps = row.depends_on ?? [];
341
+ if (deps.length === 0)
342
+ return true;
343
+ for (const depId of deps) {
344
+ const dep = this.getRow(depId);
345
+ if (dep?.status !== "done")
346
+ return false;
347
+ }
348
+ return true;
349
+ }
350
+ emit(event) {
351
+ for (const listener of this.listeners) {
352
+ try {
353
+ listener(event);
354
+ }
355
+ catch {
356
+ // Don't let listener errors break the board
357
+ }
358
+ }
359
+ }
360
+ }
361
+ //# sourceMappingURL=db-task-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-task-board.js","sourceRoot":"","sources":["../../src/team/db-task-board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * EdgeMessageBus — IMessageBus implementation that routes agent messages
3
+ * through the workflow kernel's edge system via ProcessingContext.
4
+ *
5
+ * Each agent is a node in the workflow graph. Messages are sent as control
6
+ * events to target agent nodes. The target node receives the message in its
7
+ * inbox and processes it as part of its execution loop.
8
+ *
9
+ * Falls back to in-memory buffering for agents that don't have a corresponding
10
+ * workflow node (e.g. programmatic-only agents within a TeamNode).
11
+ */
12
+ import type { ProcessingContext } from "@nodetool-ai/runtime";
13
+ import type { AgentMessage, IMessageBus, MessageType } from "./types.js";
14
+ export declare class EdgeMessageBus implements IMessageBus {
15
+ /** In-memory fallback inboxes for agents without workflow nodes. */
16
+ private inboxes;
17
+ /** Mapping from agent ID → workflow node ID for edge routing. */
18
+ private nodeMap;
19
+ /** Real-time subscribers. */
20
+ private subscribers;
21
+ /** Full message log (bounded). */
22
+ private log;
23
+ /** Processing context for sending control events. */
24
+ private context;
25
+ constructor(context?: ProcessingContext);
26
+ /**
27
+ * Map an agent ID to a workflow node ID for edge-based routing.
28
+ * When set, messages to this agent will be sent as control events
29
+ * to the corresponding node.
30
+ */
31
+ mapAgentToNode(agentId: string, nodeId: string): void;
32
+ register(agentId: string): void;
33
+ send(opts: {
34
+ from: string;
35
+ to: string | "all";
36
+ type: MessageType;
37
+ subject: string;
38
+ body: string;
39
+ replyTo?: string;
40
+ taskId?: string;
41
+ }): AgentMessage;
42
+ receive(agentId: string): AgentMessage[];
43
+ peek(agentId: string): AgentMessage[];
44
+ subscribe(agentId: string, handler: (msg: AgentMessage) => void): () => void;
45
+ getThread(messageId: string): AgentMessage[];
46
+ getHistory(): AgentMessage[];
47
+ pendingCount(agentId: string): number;
48
+ private deliver;
49
+ private bufferMessage;
50
+ }
51
+ //# sourceMappingURL=edge-message-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-message-bus.d.ts","sourceRoot":"","sources":["../../src/team/edge-message-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOzE,qBAAa,cAAe,YAAW,WAAW;IAChD,oEAAoE;IACpE,OAAO,CAAC,OAAO,CAAqC;IACpD,iEAAiE;IACjE,OAAO,CAAC,OAAO,CAA6B;IAC5C,6BAA6B;IAC7B,OAAO,CAAC,WAAW,CAAuD;IAC1E,kCAAkC;IAClC,OAAO,CAAC,GAAG,CAAsB;IACjC,qDAAqD;IACrD,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,CAAC,EAAE,iBAAiB;IAIvC;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIrD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM/B,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,EAAE,WAAW,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,YAAY;IA+BhB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAQxC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAIrC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI;IAU5E,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IA4B5C,UAAU,IAAI,YAAY,EAAE;IAI5B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMrC,OAAO,CAAC,OAAO;IA2Bf,OAAO,CAAC,aAAa;CAiBtB"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * EdgeMessageBus — IMessageBus implementation that routes agent messages
3
+ * through the workflow kernel's edge system via ProcessingContext.
4
+ *
5
+ * Each agent is a node in the workflow graph. Messages are sent as control
6
+ * events to target agent nodes. The target node receives the message in its
7
+ * inbox and processes it as part of its execution loop.
8
+ *
9
+ * Falls back to in-memory buffering for agents that don't have a corresponding
10
+ * workflow node (e.g. programmatic-only agents within a TeamNode).
11
+ */
12
+ import { randomUUID } from "node:crypto";
13
+ import { createLogger } from "@nodetool-ai/config";
14
+ const log = createLogger("agents:edge-message-bus");
15
+ /** Maximum number of messages retained in the history log. */
16
+ const MAX_LOG_SIZE = 10_000;
17
+ export class EdgeMessageBus {
18
+ /** In-memory fallback inboxes for agents without workflow nodes. */
19
+ inboxes = new Map();
20
+ /** Mapping from agent ID → workflow node ID for edge routing. */
21
+ nodeMap = new Map();
22
+ /** Real-time subscribers. */
23
+ subscribers = new Map();
24
+ /** Full message log (bounded). */
25
+ log = [];
26
+ /** Processing context for sending control events. */
27
+ context;
28
+ constructor(context) {
29
+ this.context = context ?? null;
30
+ }
31
+ /**
32
+ * Map an agent ID to a workflow node ID for edge-based routing.
33
+ * When set, messages to this agent will be sent as control events
34
+ * to the corresponding node.
35
+ */
36
+ mapAgentToNode(agentId, nodeId) {
37
+ this.nodeMap.set(agentId, nodeId);
38
+ }
39
+ register(agentId) {
40
+ if (!this.inboxes.has(agentId)) {
41
+ this.inboxes.set(agentId, []);
42
+ }
43
+ }
44
+ send(opts) {
45
+ const msg = {
46
+ id: randomUUID(),
47
+ from: opts.from,
48
+ to: opts.to,
49
+ type: opts.type,
50
+ subject: opts.subject,
51
+ body: opts.body,
52
+ replyTo: opts.replyTo,
53
+ taskId: opts.taskId,
54
+ timestamp: Date.now()
55
+ };
56
+ this.log.push(msg);
57
+ if (this.log.length > MAX_LOG_SIZE) {
58
+ this.log = this.log.slice(-Math.floor(MAX_LOG_SIZE * 0.75));
59
+ }
60
+ if (opts.to === "all") {
61
+ for (const [agentId] of this.inboxes) {
62
+ if (agentId !== opts.from) {
63
+ this.deliver(agentId, msg);
64
+ }
65
+ }
66
+ }
67
+ else {
68
+ this.deliver(opts.to, msg);
69
+ }
70
+ return msg;
71
+ }
72
+ receive(agentId) {
73
+ const inbox = this.inboxes.get(agentId);
74
+ if (!inbox || inbox.length === 0)
75
+ return [];
76
+ const messages = [...inbox];
77
+ inbox.length = 0;
78
+ return messages;
79
+ }
80
+ peek(agentId) {
81
+ return [...(this.inboxes.get(agentId) ?? [])];
82
+ }
83
+ subscribe(agentId, handler) {
84
+ let handlers = this.subscribers.get(agentId);
85
+ if (!handlers) {
86
+ handlers = new Set();
87
+ this.subscribers.set(agentId, handlers);
88
+ }
89
+ handlers.add(handler);
90
+ return () => handlers.delete(handler);
91
+ }
92
+ getThread(messageId) {
93
+ let rootId = messageId;
94
+ const msgMap = new Map(this.log.map((m) => [m.id, m]));
95
+ let current = msgMap.get(rootId);
96
+ while (current?.replyTo) {
97
+ rootId = current.replyTo;
98
+ current = msgMap.get(rootId);
99
+ }
100
+ const thread = [];
101
+ const visited = new Set();
102
+ const queue = [rootId];
103
+ while (queue.length > 0) {
104
+ const id = queue.shift();
105
+ if (visited.has(id))
106
+ continue;
107
+ visited.add(id);
108
+ const msg = msgMap.get(id);
109
+ if (msg) {
110
+ thread.push(msg);
111
+ for (const m of this.log) {
112
+ if (m.replyTo === id && !visited.has(m.id)) {
113
+ queue.push(m.id);
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return thread.sort((a, b) => a.timestamp - b.timestamp);
119
+ }
120
+ getHistory() {
121
+ return [...this.log];
122
+ }
123
+ pendingCount(agentId) {
124
+ return this.inboxes.get(agentId)?.length ?? 0;
125
+ }
126
+ // ─── Internal ───
127
+ deliver(agentId, msg) {
128
+ const nodeId = this.nodeMap.get(agentId);
129
+ // Try edge routing first: send as control event to the agent's node
130
+ if (nodeId && this.context?.hasControlEventSupport) {
131
+ // Fire-and-forget: the control event delivers the message payload
132
+ // to the target node's __control__ inbox. The node picks it up
133
+ // on its next iteration.
134
+ this.context
135
+ .sendControlEvent(nodeId, {
136
+ __agent_message__: true,
137
+ message: msg
138
+ })
139
+ .catch((err) => {
140
+ // Intentional: if edge delivery fails, fall back to in-memory buffering
141
+ log.warn("Edge message delivery failed, falling back to in-memory buffer", { agentId, error: String(err) });
142
+ this.bufferMessage(agentId, msg);
143
+ });
144
+ }
145
+ else {
146
+ // In-memory fallback
147
+ this.bufferMessage(agentId, msg);
148
+ }
149
+ }
150
+ bufferMessage(agentId, msg) {
151
+ const inbox = this.inboxes.get(agentId);
152
+ if (inbox) {
153
+ inbox.push(msg);
154
+ }
155
+ // Notify subscribers
156
+ const handlers = this.subscribers.get(agentId);
157
+ if (handlers) {
158
+ for (const handler of handlers) {
159
+ try {
160
+ handler(msg);
161
+ }
162
+ catch {
163
+ // ignore
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ //# sourceMappingURL=edge-message-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-message-bus.js","sourceRoot":"","sources":["../../src/team/edge-message-bus.ts"],"names":[],"mappings":"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"}