macro-agent 0.0.17 → 0.1.1

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 (338) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/.sudocode/specs.jsonl +4 -0
  3. package/CLAUDE.md +16 -14
  4. package/README.md +11 -29
  5. package/dist/acp/macro-agent.d.ts +17 -0
  6. package/dist/acp/macro-agent.d.ts.map +1 -1
  7. package/dist/acp/macro-agent.js +183 -55
  8. package/dist/acp/macro-agent.js.map +1 -1
  9. package/dist/acp/types.d.ts +32 -1
  10. package/dist/acp/types.d.ts.map +1 -1
  11. package/dist/acp/types.js.map +1 -1
  12. package/dist/agent/agent-manager.d.ts +65 -1
  13. package/dist/agent/agent-manager.d.ts.map +1 -1
  14. package/dist/agent/agent-manager.js +464 -183
  15. package/dist/agent/agent-manager.js.map +1 -1
  16. package/dist/agent/types.d.ts +1 -1
  17. package/dist/agent/types.d.ts.map +1 -1
  18. package/dist/api/server.d.ts +3 -0
  19. package/dist/api/server.d.ts.map +1 -1
  20. package/dist/api/server.js +37 -6
  21. package/dist/api/server.js.map +1 -1
  22. package/dist/auth/index.d.ts +2 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +2 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/auth/token.d.ts +41 -0
  27. package/dist/auth/token.d.ts.map +1 -0
  28. package/dist/auth/token.js +73 -0
  29. package/dist/auth/token.js.map +1 -0
  30. package/dist/cli/acp.d.ts +2 -23
  31. package/dist/cli/acp.d.ts.map +1 -1
  32. package/dist/cli/acp.js +127 -61
  33. package/dist/cli/acp.js.map +1 -1
  34. package/dist/cli/index.js +147 -15
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/mcp.d.ts +6 -0
  37. package/dist/cli/mcp.d.ts.map +1 -1
  38. package/dist/cli/mcp.js +268 -181
  39. package/dist/cli/mcp.js.map +1 -1
  40. package/dist/cli/parse-args.d.ts +20 -0
  41. package/dist/cli/parse-args.d.ts.map +1 -0
  42. package/dist/cli/parse-args.js +43 -0
  43. package/dist/cli/parse-args.js.map +1 -0
  44. package/dist/cli/stable-instance-id.d.ts +8 -0
  45. package/dist/cli/stable-instance-id.d.ts.map +1 -0
  46. package/dist/cli/stable-instance-id.js +14 -0
  47. package/dist/cli/stable-instance-id.js.map +1 -0
  48. package/dist/config/project-config.d.ts +74 -7
  49. package/dist/config/project-config.d.ts.map +1 -1
  50. package/dist/config/project-config.js +123 -20
  51. package/dist/config/project-config.js.map +1 -1
  52. package/dist/map/adapter/acp-over-map.d.ts +23 -0
  53. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  54. package/dist/map/adapter/acp-over-map.js +482 -55
  55. package/dist/map/adapter/acp-over-map.js.map +1 -1
  56. package/dist/map/adapter/connection-manager.d.ts.map +1 -1
  57. package/dist/map/adapter/connection-manager.js +3 -0
  58. package/dist/map/adapter/connection-manager.js.map +1 -1
  59. package/dist/map/adapter/event-log.d.ts +87 -0
  60. package/dist/map/adapter/event-log.d.ts.map +1 -0
  61. package/dist/map/adapter/event-log.js +122 -0
  62. package/dist/map/adapter/event-log.js.map +1 -0
  63. package/dist/map/adapter/event-translator.js +6 -6
  64. package/dist/map/adapter/event-translator.js.map +1 -1
  65. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  66. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  67. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  68. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  69. package/dist/map/adapter/extensions/index.d.ts +10 -1
  70. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  71. package/dist/map/adapter/extensions/index.js +34 -0
  72. package/dist/map/adapter/extensions/index.js.map +1 -1
  73. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  74. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  75. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  76. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  77. package/dist/map/adapter/extensions/rename.d.ts +29 -0
  78. package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
  79. package/dist/map/adapter/extensions/rename.js +49 -0
  80. package/dist/map/adapter/extensions/rename.js.map +1 -0
  81. package/dist/map/adapter/extensions/task.d.ts.map +1 -1
  82. package/dist/map/adapter/extensions/task.js +10 -0
  83. package/dist/map/adapter/extensions/task.js.map +1 -1
  84. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  85. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  86. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  87. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  88. package/dist/map/adapter/index.d.ts +2 -1
  89. package/dist/map/adapter/index.d.ts.map +1 -1
  90. package/dist/map/adapter/index.js +8 -2
  91. package/dist/map/adapter/index.js.map +1 -1
  92. package/dist/map/adapter/interface.d.ts +2 -0
  93. package/dist/map/adapter/interface.d.ts.map +1 -1
  94. package/dist/map/adapter/map-adapter.d.ts +4 -0
  95. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  96. package/dist/map/adapter/map-adapter.js +302 -30
  97. package/dist/map/adapter/map-adapter.js.map +1 -1
  98. package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
  99. package/dist/map/adapter/subscription-manager.js +5 -1
  100. package/dist/map/adapter/subscription-manager.js.map +1 -1
  101. package/dist/map/adapter/types.d.ts +2 -0
  102. package/dist/map/adapter/types.d.ts.map +1 -1
  103. package/dist/mcp/map-client.d.ts +39 -0
  104. package/dist/mcp/map-client.d.ts.map +1 -0
  105. package/dist/mcp/map-client.js +129 -0
  106. package/dist/mcp/map-client.js.map +1 -0
  107. package/dist/mcp/mcp-server.d.ts +14 -0
  108. package/dist/mcp/mcp-server.d.ts.map +1 -1
  109. package/dist/mcp/mcp-server.js +113 -85
  110. package/dist/mcp/mcp-server.js.map +1 -1
  111. package/dist/mcp/types.d.ts +9 -1
  112. package/dist/mcp/types.d.ts.map +1 -1
  113. package/dist/mcp/types.js.map +1 -1
  114. package/dist/metrics/metrics.js +1 -1
  115. package/dist/metrics/metrics.js.map +1 -1
  116. package/dist/roles/capabilities.d.ts +3 -1
  117. package/dist/roles/capabilities.d.ts.map +1 -1
  118. package/dist/roles/capabilities.js +17 -7
  119. package/dist/roles/capabilities.js.map +1 -1
  120. package/dist/roles/config-loader.d.ts +6 -6
  121. package/dist/roles/config-loader.d.ts.map +1 -1
  122. package/dist/roles/config-loader.js +6 -6
  123. package/dist/roles/config-loader.js.map +1 -1
  124. package/dist/roles/registry.d.ts +2 -2
  125. package/dist/roles/registry.js +2 -2
  126. package/dist/server/combined-server.d.ts +20 -0
  127. package/dist/server/combined-server.d.ts.map +1 -1
  128. package/dist/server/combined-server.js +107 -8
  129. package/dist/server/combined-server.js.map +1 -1
  130. package/dist/store/event-store.d.ts +7 -1
  131. package/dist/store/event-store.d.ts.map +1 -1
  132. package/dist/store/event-store.js +91 -8
  133. package/dist/store/event-store.js.map +1 -1
  134. package/dist/store/types/agents.d.ts +23 -0
  135. package/dist/store/types/agents.d.ts.map +1 -1
  136. package/dist/store/types/events.d.ts +1 -1
  137. package/dist/store/types/events.d.ts.map +1 -1
  138. package/dist/task/backend/index.d.ts +47 -29
  139. package/dist/task/backend/index.d.ts.map +1 -1
  140. package/dist/task/backend/index.js +109 -71
  141. package/dist/task/backend/index.js.map +1 -1
  142. package/dist/task/backend/memory.d.ts +1 -0
  143. package/dist/task/backend/memory.d.ts.map +1 -1
  144. package/dist/task/backend/memory.js +3 -0
  145. package/dist/task/backend/memory.js.map +1 -1
  146. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  147. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  148. package/dist/task/backend/opentasks/backend.js +1023 -0
  149. package/dist/task/backend/opentasks/backend.js.map +1 -0
  150. package/dist/task/backend/opentasks/client.d.ts +337 -0
  151. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  152. package/dist/task/backend/opentasks/client.js +225 -0
  153. package/dist/task/backend/opentasks/client.js.map +1 -0
  154. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  155. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  156. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  157. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  158. package/dist/task/backend/opentasks/index.d.ts +21 -0
  159. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  160. package/dist/task/backend/opentasks/index.js +21 -0
  161. package/dist/task/backend/opentasks/index.js.map +1 -0
  162. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  163. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  164. package/dist/task/backend/opentasks/mapping.js +77 -0
  165. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  166. package/dist/task/backend/types.d.ts +33 -53
  167. package/dist/task/backend/types.d.ts.map +1 -1
  168. package/dist/task/backend/types.js +7 -11
  169. package/dist/task/backend/types.js.map +1 -1
  170. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  171. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  172. package/dist/task/backend/unified-tool-provider.js +623 -0
  173. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  174. package/dist/teams/team-loader.d.ts +2 -2
  175. package/dist/teams/team-loader.js +3 -3
  176. package/dist/teams/team-loader.js.map +1 -1
  177. package/dist/teams/team-runtime.d.ts.map +1 -1
  178. package/dist/teams/team-runtime.js +2 -0
  179. package/dist/teams/team-runtime.js.map +1 -1
  180. package/docs/architecture.md +7 -6
  181. package/docs/configuration.md +26 -62
  182. package/docs/implementation-details.md +5 -5
  183. package/docs/implementation-summary.md +17 -17
  184. package/docs/plan-self-driving-support.md +4 -4
  185. package/docs/spec-self-driving-support.md +10 -10
  186. package/docs/team-templates.md +2 -2
  187. package/docs/teams.md +3 -3
  188. package/docs/troubleshooting.md +10 -11
  189. package/package.json +6 -4
  190. package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
  191. package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
  192. package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
  193. package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
  194. package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
  195. package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
  196. package/src/acp/__tests__/history.test.ts +8 -4
  197. package/src/acp/__tests__/integration.test.ts +56 -31
  198. package/src/acp/__tests__/macro-agent.test.ts +16 -7
  199. package/src/acp/macro-agent.ts +230 -62
  200. package/src/acp/types.ts +46 -1
  201. package/src/agent/__tests__/agent-manager.test.ts +228 -2
  202. package/src/agent/agent-manager.ts +714 -261
  203. package/src/agent/types.ts +3 -1
  204. package/src/api/server.ts +41 -7
  205. package/src/auth/__tests__/token.test.ts +100 -0
  206. package/src/auth/index.ts +1 -0
  207. package/src/auth/token.ts +82 -0
  208. package/src/cli/__tests__/acp.test.ts +1 -1
  209. package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
  210. package/src/cli/acp.ts +130 -72
  211. package/src/cli/index.ts +120 -14
  212. package/src/cli/mcp.ts +311 -207
  213. package/src/cli/parse-args.ts +54 -0
  214. package/src/cli/stable-instance-id.ts +14 -0
  215. package/src/config/project-config.ts +190 -27
  216. package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
  217. package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +820 -0
  218. package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
  219. package/src/map/adapter/__tests__/acp-over-map-history.test.ts +724 -2
  220. package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
  221. package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
  222. package/src/map/adapter/__tests__/event-log.test.ts +527 -0
  223. package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
  224. package/src/map/adapter/__tests__/extensions.test.ts +408 -0
  225. package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
  226. package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
  227. package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
  228. package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
  229. package/src/map/adapter/acp-over-map.ts +777 -92
  230. package/src/map/adapter/connection-manager.ts +3 -0
  231. package/src/map/adapter/event-log.ts +208 -0
  232. package/src/map/adapter/event-translator.ts +6 -6
  233. package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
  234. package/src/map/adapter/extensions/index.ts +60 -0
  235. package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
  236. package/src/map/adapter/extensions/task.ts +11 -0
  237. package/src/map/adapter/extensions/update-metadata.ts +126 -0
  238. package/src/map/adapter/index.ts +28 -0
  239. package/src/map/adapter/interface.ts +2 -0
  240. package/src/map/adapter/map-adapter.ts +373 -38
  241. package/src/map/adapter/subscription-manager.ts +5 -1
  242. package/src/map/adapter/types.ts +2 -0
  243. package/src/mcp/__tests__/map-client.test.ts +386 -0
  244. package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
  245. package/src/mcp/__tests__/mcp-server.test.ts +100 -1
  246. package/src/mcp/map-client.ts +177 -0
  247. package/src/mcp/mcp-server.ts +191 -100
  248. package/src/mcp/types.ts +6 -1
  249. package/src/metrics/metrics.ts +1 -1
  250. package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
  251. package/src/roles/__tests__/config-loader.test.ts +7 -7
  252. package/src/roles/capabilities.ts +17 -7
  253. package/src/roles/config-loader.ts +6 -6
  254. package/src/roles/registry.ts +2 -2
  255. package/src/server/__tests__/combined-server.test.ts +94 -21
  256. package/src/server/combined-server.ts +189 -33
  257. package/src/steering/__tests__/steering-integration.test.ts +1 -1
  258. package/src/store/__tests__/event-store.test.ts +236 -1
  259. package/src/store/__tests__/instance.test.ts +3 -3
  260. package/src/store/event-store.ts +109 -8
  261. package/src/store/types/agents.ts +16 -0
  262. package/src/store/types/events.ts +1 -1
  263. package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
  264. package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
  265. package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
  266. package/src/task/backend/index.ts +156 -106
  267. package/src/task/backend/memory.ts +4 -0
  268. package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
  269. package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
  270. package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
  271. package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
  272. package/src/task/backend/opentasks/backend.ts +1323 -0
  273. package/src/task/backend/opentasks/client.ts +652 -0
  274. package/src/task/backend/opentasks/daemon-manager.ts +253 -0
  275. package/src/task/backend/opentasks/index.ts +69 -0
  276. package/src/task/backend/opentasks/mapping.ts +94 -0
  277. package/src/task/backend/types.ts +42 -66
  278. package/src/task/backend/unified-tool-provider.ts +779 -0
  279. package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
  280. package/src/teams/team-loader.ts +3 -3
  281. package/src/teams/team-runtime.ts +2 -0
  282. package/test_fixtures/README.md +2 -3
  283. package/test_fixtures/fixtures/index.ts +0 -3
  284. package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
  285. package/test_fixtures/fixtures/repos/index.ts +1 -3
  286. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
  287. package/test_fixtures/fixtures/repos/types.ts +0 -11
  288. package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
  289. package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
  290. package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
  291. package/vitest.config.ts +1 -1
  292. package/vitest.e2e.config.ts +1 -1
  293. package/vitest.setup.ts +1 -30
  294. package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
  295. package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
  296. package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
  297. package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
  298. package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
  299. package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
  300. package/.macro-agent/teams/self-driving/team.yaml +0 -103
  301. package/.macro-agent/teams/structured/prompts/developer.md +0 -26
  302. package/.macro-agent/teams/structured/prompts/lead.md +0 -25
  303. package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
  304. package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
  305. package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
  306. package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
  307. package/.macro-agent/teams/structured/team.yaml +0 -89
  308. package/docs/sudocode-integration.md +0 -383
  309. package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
  310. package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
  311. package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
  312. package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
  313. package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
  314. package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
  315. package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
  316. package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
  317. package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
  318. package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
  319. package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
  320. package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
  321. package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
  322. package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
  323. package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
  324. package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
  325. package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
  326. package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
  327. package/src/task/backend/sudocode/backend.ts +0 -1237
  328. package/src/task/backend/sudocode/client.ts +0 -515
  329. package/src/task/backend/sudocode/index.ts +0 -120
  330. package/src/task/backend/sudocode/mapping.ts +0 -93
  331. package/src/task/backend/sudocode/server-client.ts +0 -522
  332. package/src/task/backend/sudocode/standalone-client.ts +0 -623
  333. package/src/task/backend/sudocode/sync-policy.ts +0 -387
  334. package/src/task/backend/sudocode/tools.ts +0 -896
  335. package/src/task/backend/tool-provider.ts +0 -506
  336. package/test_fixtures/fixtures/sudocode/index.ts +0 -29
  337. package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
  338. package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
@@ -1,430 +0,0 @@
1
- /**
2
- * Tool Provider Edge Case Tests
3
- *
4
- * Tests for edge cases in the InMemoryTaskToolProvider.
5
- *
6
- * @module task/backend/__tests__/tool-provider-edge-cases.test
7
- * @see s-8472 Pluggable Task Backend Integration
8
- */
9
-
10
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
11
- import { createEventStore, type EventStore } from "../../../store/event-store.js";
12
- import { createInMemoryTaskBackend, InMemoryTaskBackend } from "../memory.js";
13
- import {
14
- InMemoryTaskToolProvider,
15
- createTaskToolProvider,
16
- type TaskToolContext,
17
- } from "../tool-provider.js";
18
-
19
- describe("InMemoryTaskToolProvider Edge Cases", () => {
20
- let eventStore: EventStore;
21
- let backend: InMemoryTaskBackend;
22
- let toolProvider: InMemoryTaskToolProvider;
23
- const testAgentId = "agent_test";
24
-
25
- beforeEach(async () => {
26
- eventStore = await createEventStore({ inMemory: true });
27
- backend = createInMemoryTaskBackend(eventStore);
28
- toolProvider = createTaskToolProvider(backend, () => ({
29
- agent_id: testAgentId,
30
- }));
31
- });
32
-
33
- afterEach(async () => {
34
- await eventStore.close();
35
- });
36
-
37
- function getToolByName(name: string) {
38
- const tools = toolProvider.getTools();
39
- return tools.find((t) => t.name === name);
40
- }
41
-
42
- describe("list_tasks include_blocked default behavior", () => {
43
- it("should have consistent include_blocked behavior", async () => {
44
- // Create blocker and blocked tasks
45
- const createTool = getToolByName("create_task")!;
46
- const listTool = getToolByName("list_tasks")!;
47
- const addBlockerTool = getToolByName("add_blocker")!;
48
-
49
- const blocker = (await createTool.handler({
50
- description: "Blocker",
51
- })) as { task_id: string };
52
- const blocked = (await createTool.handler({
53
- description: "Blocked",
54
- })) as { task_id: string };
55
-
56
- await addBlockerTool.handler({
57
- task_id: blocked.task_id,
58
- blocker_id: blocker.task_id,
59
- });
60
-
61
- // Default list_tasks (include_blocked not specified)
62
- const defaultResult = (await listTool.handler({})) as {
63
- tasks: { id: string }[];
64
- total: number;
65
- };
66
-
67
- // The tool description says "Include blocked tasks (default: true)"
68
- // but the backend defaults to excluding blocked tasks
69
- // This creates confusion about expected behavior
70
-
71
- // Current behavior: blocked tasks are excluded by default
72
- // because includeBlocked is undefined, which backend treats as false
73
- expect(defaultResult.tasks.find((t) => t.id === blocked.task_id)).toBeUndefined();
74
-
75
- // Explicit include_blocked: true
76
- const includedResult = (await listTool.handler({
77
- include_blocked: true,
78
- })) as { tasks: { id: string }[]; total: number };
79
- expect(includedResult.tasks.find((t) => t.id === blocked.task_id)).toBeDefined();
80
-
81
- // Explicit include_blocked: false
82
- const excludedResult = (await listTool.handler({
83
- include_blocked: false,
84
- })) as { tasks: { id: string }[]; total: number };
85
- expect(excludedResult.tasks.find((t) => t.id === blocked.task_id)).toBeUndefined();
86
- });
87
- });
88
-
89
- describe("complete_task without start", () => {
90
- it("should fail if task not started first", async () => {
91
- const createTool = getToolByName("create_task")!;
92
- const completeTool = getToolByName("complete_task")!;
93
-
94
- const task = (await createTool.handler({
95
- description: "Test",
96
- })) as { task_id: string };
97
-
98
- // Try to complete without starting
99
- await expect(
100
- completeTool.handler({ task_id: task.task_id })
101
- ).rejects.toThrow("Invalid status transition");
102
- });
103
- });
104
-
105
- describe("complete_task from assigned state", () => {
106
- it("should fail if only assigned (not in_progress)", async () => {
107
- const createTool = getToolByName("create_task")!;
108
- const assignTool = getToolByName("assign_task")!;
109
- const completeTool = getToolByName("complete_task")!;
110
-
111
- const task = (await createTool.handler({
112
- description: "Test",
113
- })) as { task_id: string };
114
-
115
- await assignTool.handler({ task_id: task.task_id });
116
-
117
- // Try to complete from assigned state
118
- await expect(
119
- completeTool.handler({ task_id: task.task_id })
120
- ).rejects.toThrow("Invalid status transition");
121
- });
122
- });
123
-
124
- describe("missing tools", () => {
125
- it("should NOT have a start_task tool", () => {
126
- // Note: There's no start_task tool, you have to use update_task_status
127
- const startTool = getToolByName("start_task");
128
- expect(startTool).toBeUndefined();
129
- });
130
-
131
- it("should NOT have an unassign_task tool", () => {
132
- // Note: There's no unassign_task tool, even though backend supports it
133
- const unassignTool = getToolByName("unassign_task");
134
- expect(unassignTool).toBeUndefined();
135
- });
136
-
137
- it("should NOT have a fail_task tool", () => {
138
- // Note: There's no fail_task tool
139
- const failTool = getToolByName("fail_task");
140
- expect(failTool).toBeUndefined();
141
- });
142
-
143
- it("should NOT have a delete_task tool", () => {
144
- // Note: There's no delete_task tool
145
- const deleteTool = getToolByName("delete_task");
146
- expect(deleteTool).toBeUndefined();
147
- });
148
-
149
- it("should NOT have a get_subtask_status tool", () => {
150
- // Note: There's no get_subtask_status tool
151
- const subtaskTool = getToolByName("get_subtask_status");
152
- expect(subtaskTool).toBeUndefined();
153
- });
154
- });
155
-
156
- describe("update_task_status validation", () => {
157
- it("should reject invalid status transitions", async () => {
158
- const createTool = getToolByName("create_task")!;
159
- const updateTool = getToolByName("update_task_status")!;
160
-
161
- const task = (await createTool.handler({
162
- description: "Test",
163
- })) as { task_id: string };
164
-
165
- // pending -> completed is invalid (must go through in_progress)
166
- await expect(
167
- updateTool.handler({ task_id: task.task_id, status: "completed" })
168
- ).rejects.toThrow("Invalid status transition");
169
- });
170
-
171
- it("should allow pending -> in_progress", async () => {
172
- const createTool = getToolByName("create_task")!;
173
- const updateTool = getToolByName("update_task_status")!;
174
- const getTool = getToolByName("get_task")!;
175
-
176
- const task = (await createTool.handler({
177
- description: "Test",
178
- })) as { task_id: string };
179
-
180
- await updateTool.handler({
181
- task_id: task.task_id,
182
- status: "in_progress",
183
- });
184
-
185
- const result = (await getTool.handler({
186
- task_id: task.task_id,
187
- })) as { status: string };
188
- expect(result.status).toBe("in_progress");
189
- });
190
-
191
- it("should allow pending -> assigned via assign_task", async () => {
192
- const createTool = getToolByName("create_task")!;
193
- const assignTool = getToolByName("assign_task")!;
194
- const getTool = getToolByName("get_task")!;
195
-
196
- const task = (await createTool.handler({
197
- description: "Test",
198
- })) as { task_id: string };
199
-
200
- await assignTool.handler({ task_id: task.task_id });
201
-
202
- const result = (await getTool.handler({
203
- task_id: task.task_id,
204
- })) as { status: string; assigned_agent: string };
205
- expect(result.status).toBe("assigned");
206
- expect(result.assigned_agent).toBe(testAgentId);
207
- });
208
- });
209
-
210
- describe("add_blocker error handling", () => {
211
- it("should fail for non-existent task", async () => {
212
- const createTool = getToolByName("create_task")!;
213
- const addBlockerTool = getToolByName("add_blocker")!;
214
-
215
- const blocker = (await createTool.handler({
216
- description: "Blocker",
217
- })) as { task_id: string };
218
-
219
- await expect(
220
- addBlockerTool.handler({
221
- task_id: "task_nonexistent",
222
- blocker_id: blocker.task_id,
223
- })
224
- ).rejects.toThrow();
225
- });
226
-
227
- it("should fail for non-existent blocker", async () => {
228
- const createTool = getToolByName("create_task")!;
229
- const addBlockerTool = getToolByName("add_blocker")!;
230
-
231
- const task = (await createTool.handler({
232
- description: "Task",
233
- })) as { task_id: string };
234
-
235
- await expect(
236
- addBlockerTool.handler({
237
- task_id: task.task_id,
238
- blocker_id: "task_nonexistent",
239
- })
240
- ).rejects.toThrow();
241
- });
242
- });
243
-
244
- describe("get_task_blockers response format", () => {
245
- it("should return isBlocked based on blocker statuses", async () => {
246
- const createTool = getToolByName("create_task")!;
247
- const addBlockerTool = getToolByName("add_blocker")!;
248
- const getBlockersTool = getToolByName("get_task_blockers")!;
249
- const updateTool = getToolByName("update_task_status")!;
250
-
251
- const blocker = (await createTool.handler({
252
- description: "Blocker",
253
- })) as { task_id: string };
254
- const task = (await createTool.handler({
255
- description: "Task",
256
- })) as { task_id: string };
257
-
258
- await addBlockerTool.handler({
259
- task_id: task.task_id,
260
- blocker_id: blocker.task_id,
261
- });
262
-
263
- // Check blockers while blocker is pending
264
- const beforeComplete = (await getBlockersTool.handler({
265
- task_id: task.task_id,
266
- })) as { isBlocked: boolean; blockers: { isCompleted: boolean }[] };
267
-
268
- expect(beforeComplete.isBlocked).toBe(true);
269
- expect(beforeComplete.blockers[0].isCompleted).toBe(false);
270
-
271
- // Complete the blocker
272
- await updateTool.handler({
273
- task_id: blocker.task_id,
274
- status: "in_progress",
275
- });
276
- await backend.complete(blocker.task_id);
277
-
278
- // Check blockers after completion
279
- const afterComplete = (await getBlockersTool.handler({
280
- task_id: task.task_id,
281
- })) as { isBlocked: boolean; blockers: { isCompleted: boolean }[] };
282
-
283
- expect(afterComplete.isBlocked).toBe(false);
284
- expect(afterComplete.blockers[0].isCompleted).toBe(true);
285
- });
286
- });
287
-
288
- describe("list_ready_tasks filtering", () => {
289
- it("should only return pending/assigned tasks", async () => {
290
- const createTool = getToolByName("create_task")!;
291
- const listReadyTool = getToolByName("list_ready_tasks")!;
292
- const updateTool = getToolByName("update_task_status")!;
293
-
294
- // Create tasks in various states
295
- const pending = (await createTool.handler({
296
- description: "Pending",
297
- })) as { task_id: string };
298
-
299
- const inProgress = (await createTool.handler({
300
- description: "In Progress",
301
- })) as { task_id: string };
302
- await updateTool.handler({
303
- task_id: inProgress.task_id,
304
- status: "in_progress",
305
- });
306
-
307
- const completed = (await createTool.handler({
308
- description: "Completed",
309
- })) as { task_id: string };
310
- await updateTool.handler({
311
- task_id: completed.task_id,
312
- status: "in_progress",
313
- });
314
- await backend.complete(completed.task_id);
315
-
316
- const ready = (await listReadyTool.handler({})) as {
317
- tasks: { id: string; description: string }[];
318
- };
319
-
320
- // Should only have pending task
321
- expect(ready.tasks.length).toBe(1);
322
- expect(ready.tasks[0].id).toBe(pending.task_id);
323
- });
324
- });
325
-
326
- describe("create_task with external_id", () => {
327
- it("should pass external_id to backend", async () => {
328
- const createTool = getToolByName("create_task")!;
329
- const getTool = getToolByName("get_task")!;
330
-
331
- const task = (await createTool.handler({
332
- description: "External task",
333
- external_id: "i-test123",
334
- })) as { task_id: string };
335
-
336
- // Note: The response doesn't include external_id
337
- // But get_task also doesn't include external_id in response
338
- // This could be a gap - how do users know what external_id is bound?
339
- const fetched = (await getTool.handler({
340
- task_id: task.task_id,
341
- })) as Record<string, unknown>;
342
-
343
- // external_id is not in the get_task response
344
- expect(fetched.external_id).toBeUndefined();
345
- // It's stored in outputs if you check there
346
- expect((fetched.outputs as Record<string, unknown>)?.external_id).toBeUndefined();
347
- });
348
- });
349
-
350
- describe("assign_task with agent_id parameter", () => {
351
- it("should use provided agent_id", async () => {
352
- const createTool = getToolByName("create_task")!;
353
- const assignTool = getToolByName("assign_task")!;
354
- const getTool = getToolByName("get_task")!;
355
-
356
- const task = (await createTool.handler({
357
- description: "Test",
358
- })) as { task_id: string };
359
-
360
- await assignTool.handler({
361
- task_id: task.task_id,
362
- agent_id: "other_agent",
363
- });
364
-
365
- const fetched = (await getTool.handler({
366
- task_id: task.task_id,
367
- })) as { assigned_agent: string };
368
-
369
- expect(fetched.assigned_agent).toBe("other_agent");
370
- });
371
-
372
- it("should default to context agent_id if not provided", async () => {
373
- const createTool = getToolByName("create_task")!;
374
- const assignTool = getToolByName("assign_task")!;
375
- const getTool = getToolByName("get_task")!;
376
-
377
- const task = (await createTool.handler({
378
- description: "Test",
379
- })) as { task_id: string };
380
-
381
- await assignTool.handler({ task_id: task.task_id });
382
-
383
- const fetched = (await getTool.handler({
384
- task_id: task.task_id,
385
- })) as { assigned_agent: string };
386
-
387
- expect(fetched.assigned_agent).toBe(testAgentId);
388
- });
389
- });
390
-
391
- describe("complete_task with outputs", () => {
392
- it("should store summary and outputs", async () => {
393
- const createTool = getToolByName("create_task")!;
394
- const updateTool = getToolByName("update_task_status")!;
395
- const completeTool = getToolByName("complete_task")!;
396
- const getTool = getToolByName("get_task")!;
397
-
398
- const task = (await createTool.handler({
399
- description: "Test",
400
- })) as { task_id: string };
401
-
402
- await updateTool.handler({
403
- task_id: task.task_id,
404
- status: "in_progress",
405
- });
406
-
407
- await completeTool.handler({
408
- task_id: task.task_id,
409
- summary: "Work completed",
410
- outputs: { result: "success", count: 42 },
411
- });
412
-
413
- const fetched = (await getTool.handler({
414
- task_id: task.task_id,
415
- })) as { status: string; outputs: Record<string, unknown> };
416
-
417
- expect(fetched.status).toBe("completed");
418
- expect(fetched.outputs?.result).toBe("success");
419
- expect(fetched.outputs?.count).toBe(42);
420
- });
421
- });
422
-
423
- describe("getExcludedTools", () => {
424
- it("should return correct excluded tools", () => {
425
- const excluded = toolProvider.getExcludedTools();
426
- expect(excluded).toContain("create_task");
427
- expect(excluded).toContain("get_task");
428
- });
429
- });
430
- });