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,471 +0,0 @@
1
- /**
2
- * SudocodeTaskToolProvider Tests
3
- *
4
- * Tests for the sudocode task tool provider implementation.
5
- */
6
-
7
- import { describe, it, expect, vi, beforeEach } from "vitest";
8
- import {
9
- SudocodeTaskToolProvider,
10
- createSudocodeTaskToolProvider,
11
- TaskToolMode,
12
- GetSudocodeToolContext,
13
- } from "../tools.js";
14
- import type { SudocodeTaskBackend } from "../backend.js";
15
- import type { SudocodeClient } from "../client.js";
16
-
17
- // Mock backend
18
- function createMockBackend(): SudocodeTaskBackend {
19
- return {
20
- create: vi.fn(async () => ({
21
- id: "task-1",
22
- status: "pending",
23
- description: "Test",
24
- created_at: "2024-01-01T00:00:00Z",
25
- created_by: "agent-1",
26
- isBlocked: false,
27
- })),
28
- get: vi.fn(async () => ({
29
- id: "task-1",
30
- status: "pending",
31
- description: "Test",
32
- created_at: "2024-01-01T00:00:00Z",
33
- created_by: "agent-1",
34
- isBlocked: false,
35
- })),
36
- list: vi.fn(async () => []),
37
- listReady: vi.fn(async () => []),
38
- update: vi.fn(async () => ({
39
- id: "task-1",
40
- status: "in_progress",
41
- description: "Test",
42
- created_at: "2024-01-01T00:00:00Z",
43
- created_by: "agent-1",
44
- isBlocked: false,
45
- })),
46
- delete: vi.fn(async () => {}),
47
- assign: vi.fn(async () => {}),
48
- unassign: vi.fn(async () => {}),
49
- start: vi.fn(async () => {}),
50
- complete: vi.fn(async () => {}),
51
- fail: vi.fn(async () => {}),
52
- addBlocker: vi.fn(async () => {}),
53
- removeBlocker: vi.fn(async () => {}),
54
- getBlockers: vi.fn(async () => []),
55
- getBlocking: vi.fn(async () => []),
56
- getChildren: vi.fn(async () => []),
57
- getSubtaskStatus: vi.fn(async () => ({
58
- total: 0,
59
- pending: 0,
60
- assigned: 0,
61
- in_progress: 0,
62
- completed: 0,
63
- failed: 0,
64
- allCompleted: false,
65
- anyFailed: false,
66
- })),
67
- createSubtask: vi.fn(async () => ({
68
- id: "task-2",
69
- status: "pending",
70
- description: "Subtask",
71
- created_at: "2024-01-01T00:00:00Z",
72
- created_by: "agent-1",
73
- isBlocked: false,
74
- })),
75
- getAgentHistory: vi.fn(async () => []),
76
- onTaskChange: vi.fn(() => () => {}),
77
- getSyncPolicy: vi.fn(() => ({
78
- onIssueClosed: "notify_only" as const,
79
- onDescriptionChanged: "snapshot" as const,
80
- onBlockerChanged: "update_blocked" as const,
81
- updateIssueOnStart: true,
82
- updateIssueOnComplete: "never" as const,
83
- })),
84
- onSyncEvent: vi.fn(() => () => {}),
85
- getTasksByIssue: vi.fn(() => []),
86
- getIssueForTask: vi.fn(() => undefined),
87
- bindToIssue: vi.fn(async () => {}),
88
- unbindFromIssue: vi.fn(async () => {}),
89
- close: vi.fn(),
90
- } as unknown as SudocodeTaskBackend;
91
- }
92
-
93
- // Mock client
94
- function createMockClient(): SudocodeClient {
95
- return {
96
- getIssue: vi.fn(async () => ({
97
- id: "i-test",
98
- uuid: "uuid-test",
99
- title: "Test Issue",
100
- content: "Test content",
101
- status: "open",
102
- priority: 1,
103
- created_at: "2024-01-01T00:00:00Z",
104
- updated_at: "2024-01-01T00:00:00Z",
105
- })),
106
- listIssues: vi.fn(async () => []),
107
- getReadyIssues: vi.fn(async () => []),
108
- updateIssue: vi.fn(async () => ({
109
- id: "i-test",
110
- uuid: "uuid-test",
111
- title: "Test Issue",
112
- content: "Test content",
113
- status: "open",
114
- priority: 1,
115
- created_at: "2024-01-01T00:00:00Z",
116
- updated_at: "2024-01-01T00:00:00Z",
117
- })),
118
- createLink: vi.fn(async () => {}),
119
- removeLink: vi.fn(async () => {}),
120
- getBlockers: vi.fn(async () => []),
121
- getBlocking: vi.fn(async () => []),
122
- getSpec: vi.fn(async () => null),
123
- listSpecs: vi.fn(async () => []),
124
- addFeedback: vi.fn(async () => {}),
125
- onIssueChange: vi.fn(() => () => {}),
126
- isReady: vi.fn(() => true),
127
- close: vi.fn(),
128
- } as unknown as SudocodeClient;
129
- }
130
-
131
- describe("SudocodeTaskToolProvider", () => {
132
- let backend: SudocodeTaskBackend;
133
- let client: SudocodeClient;
134
- let getContext: GetSudocodeToolContext;
135
-
136
- beforeEach(() => {
137
- backend = createMockBackend();
138
- client = createMockClient();
139
- getContext = () => ({ agent_id: "test-agent" });
140
- });
141
-
142
- describe("tool modes", () => {
143
- it("should expose native tools in native mode", () => {
144
- const provider = new SudocodeTaskToolProvider(
145
- backend,
146
- client,
147
- getContext,
148
- { mode: "native" }
149
- );
150
-
151
- const tools = provider.getTools();
152
- const toolNames = tools.map((t) => t.name);
153
-
154
- expect(toolNames).toContain("upsert_issue");
155
- expect(toolNames).toContain("show_issue");
156
- expect(toolNames).toContain("list_issues");
157
- expect(toolNames).toContain("ready");
158
- expect(toolNames).toContain("link");
159
- expect(toolNames).toContain("add_feedback");
160
-
161
- // Should not have mapped tools
162
- expect(toolNames).not.toContain("create_task");
163
- expect(toolNames).not.toContain("get_task");
164
- });
165
-
166
- it("should expose mapped tools in mapped mode", () => {
167
- const provider = new SudocodeTaskToolProvider(
168
- backend,
169
- client,
170
- getContext,
171
- { mode: "mapped" }
172
- );
173
-
174
- const tools = provider.getTools();
175
- const toolNames = tools.map((t) => t.name);
176
-
177
- expect(toolNames).toContain("create_task");
178
- expect(toolNames).toContain("get_task");
179
- expect(toolNames).toContain("list_tasks");
180
- expect(toolNames).toContain("list_ready_tasks");
181
- expect(toolNames).toContain("complete_task");
182
-
183
- // Should not have native tools
184
- expect(toolNames).not.toContain("upsert_issue");
185
- expect(toolNames).not.toContain("show_issue");
186
- });
187
-
188
- it("should expose all tools in both mode", () => {
189
- const provider = new SudocodeTaskToolProvider(
190
- backend,
191
- client,
192
- getContext,
193
- { mode: "both" }
194
- );
195
-
196
- const tools = provider.getTools();
197
- const toolNames = tools.map((t) => t.name);
198
-
199
- // Native tools
200
- expect(toolNames).toContain("upsert_issue");
201
- expect(toolNames).toContain("show_issue");
202
-
203
- // Mapped tools
204
- expect(toolNames).toContain("create_task");
205
- expect(toolNames).toContain("get_task");
206
- });
207
-
208
- it("should default to native mode", () => {
209
- const provider = new SudocodeTaskToolProvider(
210
- backend,
211
- client,
212
- getContext
213
- );
214
-
215
- const tools = provider.getTools();
216
- const toolNames = tools.map((t) => t.name);
217
-
218
- expect(toolNames).toContain("upsert_issue");
219
- expect(toolNames).not.toContain("create_task");
220
- });
221
- });
222
-
223
- describe("getExcludedTools", () => {
224
- it("should exclude mapped tools in native mode", () => {
225
- const provider = new SudocodeTaskToolProvider(
226
- backend,
227
- client,
228
- getContext,
229
- { mode: "native" }
230
- );
231
-
232
- const excluded = provider.getExcludedTools();
233
-
234
- expect(excluded).toContain("create_task");
235
- expect(excluded).toContain("get_task");
236
- expect(excluded).toContain("list_tasks");
237
- expect(excluded).not.toContain("upsert_issue");
238
- });
239
-
240
- it("should exclude native tools in mapped mode", () => {
241
- const provider = new SudocodeTaskToolProvider(
242
- backend,
243
- client,
244
- getContext,
245
- { mode: "mapped" }
246
- );
247
-
248
- const excluded = provider.getExcludedTools();
249
-
250
- expect(excluded).toContain("upsert_issue");
251
- expect(excluded).toContain("show_issue");
252
- expect(excluded).not.toContain("create_task");
253
- });
254
-
255
- it("should not exclude any tools in both mode", () => {
256
- const provider = new SudocodeTaskToolProvider(
257
- backend,
258
- client,
259
- getContext,
260
- { mode: "both" }
261
- );
262
-
263
- const excluded = provider.getExcludedTools();
264
-
265
- expect(excluded).toHaveLength(0);
266
- });
267
- });
268
-
269
- describe("native tool handlers", () => {
270
- let provider: SudocodeTaskToolProvider;
271
-
272
- beforeEach(() => {
273
- provider = new SudocodeTaskToolProvider(backend, client, getContext, {
274
- mode: "native",
275
- });
276
- });
277
-
278
- it("show_issue should call client.getIssue", async () => {
279
- const tools = provider.getTools();
280
- const showIssue = tools.find((t) => t.name === "show_issue");
281
-
282
- await showIssue!.handler({ issue_id: "i-test" });
283
-
284
- expect(client.getIssue).toHaveBeenCalledWith("i-test");
285
- });
286
-
287
- it("show_issue should throw when issue not found", async () => {
288
- (client.getIssue as ReturnType<typeof vi.fn>).mockResolvedValue(null);
289
-
290
- const tools = provider.getTools();
291
- const showIssue = tools.find((t) => t.name === "show_issue");
292
-
293
- await expect(
294
- showIssue!.handler({ issue_id: "i-nonexistent" })
295
- ).rejects.toThrow("Issue not found");
296
- });
297
-
298
- it("list_issues should call client.listIssues", async () => {
299
- const tools = provider.getTools();
300
- const listIssues = tools.find((t) => t.name === "list_issues");
301
-
302
- await listIssues!.handler({ status: "open" });
303
-
304
- expect(client.listIssues).toHaveBeenCalledWith({ status: "open" });
305
- });
306
-
307
- it("ready should call client.getReadyIssues", async () => {
308
- const tools = provider.getTools();
309
- const ready = tools.find((t) => t.name === "ready");
310
-
311
- await ready!.handler({});
312
-
313
- expect(client.getReadyIssues).toHaveBeenCalled();
314
- });
315
-
316
- it("link should call client.createLink", async () => {
317
- const tools = provider.getTools();
318
- const link = tools.find((t) => t.name === "link");
319
-
320
- await link!.handler({
321
- from_id: "i-1",
322
- to_id: "i-2",
323
- type: "blocks",
324
- });
325
-
326
- expect(client.createLink).toHaveBeenCalledWith("i-1", "i-2", "blocks");
327
- });
328
-
329
- it("add_feedback should call client.addFeedback", async () => {
330
- const tools = provider.getTools();
331
- const addFeedback = tools.find((t) => t.name === "add_feedback");
332
-
333
- await addFeedback!.handler({
334
- to_id: "s-test",
335
- content: "This is feedback",
336
- type: "comment",
337
- });
338
-
339
- expect(client.addFeedback).toHaveBeenCalledWith(undefined, "s-test", {
340
- type: "comment",
341
- content: "This is feedback",
342
- anchor: undefined,
343
- });
344
- });
345
- });
346
-
347
- describe("mapped tool handlers", () => {
348
- let provider: SudocodeTaskToolProvider;
349
-
350
- beforeEach(() => {
351
- provider = new SudocodeTaskToolProvider(backend, client, getContext, {
352
- mode: "mapped",
353
- });
354
- });
355
-
356
- it("create_task should call backend.create", async () => {
357
- const tools = provider.getTools();
358
- const createTask = tools.find((t) => t.name === "create_task");
359
-
360
- await createTask!.handler({
361
- description: "Test task",
362
- external_id: "i-test",
363
- });
364
-
365
- expect(backend.create).toHaveBeenCalledWith({
366
- description: "Test task",
367
- created_by: "test-agent",
368
- parent_task: undefined,
369
- external_id: "i-test",
370
- });
371
- });
372
-
373
- it("get_task should call backend.get", async () => {
374
- const tools = provider.getTools();
375
- const getTask = tools.find((t) => t.name === "get_task");
376
-
377
- await getTask!.handler({ task_id: "task-1" });
378
-
379
- expect(backend.get).toHaveBeenCalledWith("task-1");
380
- });
381
-
382
- it("get_task should throw when task not found", async () => {
383
- (backend.get as ReturnType<typeof vi.fn>).mockResolvedValue(null);
384
-
385
- const tools = provider.getTools();
386
- const getTask = tools.find((t) => t.name === "get_task");
387
-
388
- await expect(
389
- getTask!.handler({ task_id: "nonexistent" })
390
- ).rejects.toThrow("Task not found");
391
- });
392
-
393
- it("list_ready_tasks should call backend.listReady", async () => {
394
- const tools = provider.getTools();
395
- const listReady = tools.find((t) => t.name === "list_ready_tasks");
396
-
397
- await listReady!.handler({ assigned_agent: "agent-1" });
398
-
399
- expect(backend.listReady).toHaveBeenCalledWith({
400
- assigned_agent: "agent-1",
401
- });
402
- });
403
-
404
- it("add_blocker should call backend.addBlocker", async () => {
405
- const tools = provider.getTools();
406
- const addBlocker = tools.find((t) => t.name === "add_blocker");
407
-
408
- await addBlocker!.handler({
409
- task_id: "task-1",
410
- blocker_id: "task-2",
411
- });
412
-
413
- expect(backend.addBlocker).toHaveBeenCalledWith("task-1", "task-2");
414
- });
415
-
416
- it("complete_task should call backend.complete", async () => {
417
- const tools = provider.getTools();
418
- const completeTask = tools.find((t) => t.name === "complete_task");
419
-
420
- await completeTask!.handler({
421
- task_id: "task-1",
422
- summary: "Done",
423
- });
424
-
425
- expect(backend.complete).toHaveBeenCalledWith("task-1", {
426
- summary: "Done",
427
- data: undefined,
428
- });
429
- });
430
-
431
- it("assign_task should use context agent_id by default", async () => {
432
- const tools = provider.getTools();
433
- const assignTask = tools.find((t) => t.name === "assign_task");
434
-
435
- await assignTask!.handler({ task_id: "task-1" });
436
-
437
- expect(backend.assign).toHaveBeenCalledWith("task-1", "test-agent", {
438
- role: undefined,
439
- });
440
- });
441
-
442
- it("assign_task should use provided agent_id", async () => {
443
- const tools = provider.getTools();
444
- const assignTask = tools.find((t) => t.name === "assign_task");
445
-
446
- await assignTask!.handler({
447
- task_id: "task-1",
448
- agent_id: "other-agent",
449
- role: "reviewer",
450
- });
451
-
452
- expect(backend.assign).toHaveBeenCalledWith("task-1", "other-agent", {
453
- role: "reviewer",
454
- });
455
- });
456
- });
457
-
458
- describe("createSudocodeTaskToolProvider", () => {
459
- it("should create a tool provider instance", () => {
460
- const provider = createSudocodeTaskToolProvider(
461
- backend,
462
- client,
463
- getContext,
464
- { mode: "both" }
465
- );
466
-
467
- expect(provider).toBeInstanceOf(SudocodeTaskToolProvider);
468
- expect(provider.getTools().length).toBeGreaterThan(0);
469
- });
470
- });
471
- });