macro-agent 0.1.0 → 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 (337) 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 +15 -0
  6. package/dist/acp/macro-agent.d.ts.map +1 -1
  7. package/dist/acp/macro-agent.js +131 -35
  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 +17 -0
  53. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  54. package/dist/map/adapter/acp-over-map.js +384 -23
  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 +3 -0
  95. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  96. package/dist/map/adapter/map-adapter.js +258 -35
  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 +2 -1
  131. package/dist/store/event-store.d.ts.map +1 -1
  132. package/dist/store/event-store.js +69 -20
  133. package/dist/store/event-store.js.map +1 -1
  134. package/dist/store/types/agents.d.ts +18 -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__/integration.test.ts +56 -31
  197. package/src/acp/__tests__/macro-agent.test.ts +16 -7
  198. package/src/acp/macro-agent.ts +170 -36
  199. package/src/acp/types.ts +46 -1
  200. package/src/agent/__tests__/agent-manager.test.ts +228 -2
  201. package/src/agent/agent-manager.ts +714 -261
  202. package/src/agent/types.ts +3 -1
  203. package/src/api/server.ts +41 -7
  204. package/src/auth/__tests__/token.test.ts +100 -0
  205. package/src/auth/index.ts +1 -0
  206. package/src/auth/token.ts +82 -0
  207. package/src/cli/__tests__/acp.test.ts +1 -1
  208. package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
  209. package/src/cli/acp.ts +130 -72
  210. package/src/cli/index.ts +120 -14
  211. package/src/cli/mcp.ts +311 -207
  212. package/src/cli/parse-args.ts +54 -0
  213. package/src/cli/stable-instance-id.ts +14 -0
  214. package/src/config/project-config.ts +190 -27
  215. package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
  216. package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +22 -4
  217. package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
  218. package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
  219. package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
  220. package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
  221. package/src/map/adapter/__tests__/event-log.test.ts +527 -0
  222. package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
  223. package/src/map/adapter/__tests__/extensions.test.ts +408 -0
  224. package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
  225. package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
  226. package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
  227. package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
  228. package/src/map/adapter/acp-over-map.ts +678 -66
  229. package/src/map/adapter/connection-manager.ts +3 -0
  230. package/src/map/adapter/event-log.ts +208 -0
  231. package/src/map/adapter/event-translator.ts +6 -6
  232. package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
  233. package/src/map/adapter/extensions/index.ts +60 -0
  234. package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
  235. package/src/map/adapter/extensions/task.ts +11 -0
  236. package/src/map/adapter/extensions/update-metadata.ts +126 -0
  237. package/src/map/adapter/index.ts +28 -0
  238. package/src/map/adapter/interface.ts +2 -0
  239. package/src/map/adapter/map-adapter.ts +312 -47
  240. package/src/map/adapter/subscription-manager.ts +5 -1
  241. package/src/map/adapter/types.ts +2 -0
  242. package/src/mcp/__tests__/map-client.test.ts +386 -0
  243. package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
  244. package/src/mcp/__tests__/mcp-server.test.ts +100 -1
  245. package/src/mcp/map-client.ts +177 -0
  246. package/src/mcp/mcp-server.ts +191 -100
  247. package/src/mcp/types.ts +6 -1
  248. package/src/metrics/metrics.ts +1 -1
  249. package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
  250. package/src/roles/__tests__/config-loader.test.ts +7 -7
  251. package/src/roles/capabilities.ts +17 -7
  252. package/src/roles/config-loader.ts +6 -6
  253. package/src/roles/registry.ts +2 -2
  254. package/src/server/__tests__/combined-server.test.ts +94 -21
  255. package/src/server/combined-server.ts +189 -33
  256. package/src/steering/__tests__/steering-integration.test.ts +1 -1
  257. package/src/store/__tests__/event-store.test.ts +196 -1
  258. package/src/store/__tests__/instance.test.ts +3 -3
  259. package/src/store/event-store.ts +80 -21
  260. package/src/store/types/agents.ts +15 -0
  261. package/src/store/types/events.ts +1 -1
  262. package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
  263. package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
  264. package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
  265. package/src/task/backend/index.ts +156 -106
  266. package/src/task/backend/memory.ts +4 -0
  267. package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
  268. package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
  269. package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
  270. package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
  271. package/src/task/backend/opentasks/backend.ts +1323 -0
  272. package/src/task/backend/opentasks/client.ts +652 -0
  273. package/src/task/backend/opentasks/daemon-manager.ts +253 -0
  274. package/src/task/backend/opentasks/index.ts +69 -0
  275. package/src/task/backend/opentasks/mapping.ts +94 -0
  276. package/src/task/backend/types.ts +42 -66
  277. package/src/task/backend/unified-tool-provider.ts +779 -0
  278. package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
  279. package/src/teams/team-loader.ts +3 -3
  280. package/src/teams/team-runtime.ts +2 -0
  281. package/test_fixtures/README.md +2 -3
  282. package/test_fixtures/fixtures/index.ts +0 -3
  283. package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
  284. package/test_fixtures/fixtures/repos/index.ts +1 -3
  285. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
  286. package/test_fixtures/fixtures/repos/types.ts +0 -11
  287. package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
  288. package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
  289. package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
  290. package/vitest.config.ts +1 -1
  291. package/vitest.e2e.config.ts +1 -1
  292. package/vitest.setup.ts +1 -30
  293. package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
  294. package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
  295. package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
  296. package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
  297. package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
  298. package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
  299. package/.macro-agent/teams/self-driving/team.yaml +0 -103
  300. package/.macro-agent/teams/structured/prompts/developer.md +0 -26
  301. package/.macro-agent/teams/structured/prompts/lead.md +0 -25
  302. package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
  303. package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
  304. package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
  305. package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
  306. package/.macro-agent/teams/structured/team.yaml +0 -89
  307. package/docs/sudocode-integration.md +0 -383
  308. package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
  309. package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
  310. package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
  311. package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
  312. package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
  313. package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
  314. package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
  315. package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
  316. package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
  317. package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
  318. package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
  319. package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
  320. package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
  321. package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
  322. package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
  323. package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
  324. package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
  325. package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
  326. package/src/task/backend/sudocode/backend.ts +0 -1237
  327. package/src/task/backend/sudocode/client.ts +0 -515
  328. package/src/task/backend/sudocode/index.ts +0 -120
  329. package/src/task/backend/sudocode/mapping.ts +0 -93
  330. package/src/task/backend/sudocode/server-client.ts +0 -522
  331. package/src/task/backend/sudocode/standalone-client.ts +0 -623
  332. package/src/task/backend/sudocode/sync-policy.ts +0 -387
  333. package/src/task/backend/sudocode/tools.ts +0 -896
  334. package/src/task/backend/tool-provider.ts +0 -506
  335. package/test_fixtures/fixtures/sudocode/index.ts +0 -29
  336. package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
  337. 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
- });