macro-agent 0.0.10 → 0.0.12

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 (518) hide show
  1. package/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
  2. package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
  3. package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
  4. package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
  5. package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
  6. package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
  7. package/.macro-agent/teams/self-driving/team.yaml +103 -0
  8. package/.macro-agent/teams/structured/prompts/developer.md +26 -0
  9. package/.macro-agent/teams/structured/prompts/lead.md +25 -0
  10. package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
  11. package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
  12. package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
  13. package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
  14. package/.macro-agent/teams/structured/team.yaml +89 -0
  15. package/.sudocode/issues.jsonl +56 -51
  16. package/.sudocode/specs.jsonl +8 -1
  17. package/CLAUDE.md +121 -30
  18. package/README.md +60 -3
  19. package/dist/acp/macro-agent.d.ts +4 -0
  20. package/dist/acp/macro-agent.d.ts.map +1 -1
  21. package/dist/acp/macro-agent.js +50 -4
  22. package/dist/acp/macro-agent.js.map +1 -1
  23. package/dist/acp/session-mapper.d.ts +20 -1
  24. package/dist/acp/session-mapper.d.ts.map +1 -1
  25. package/dist/acp/session-mapper.js +90 -1
  26. package/dist/acp/session-mapper.js.map +1 -1
  27. package/dist/acp/types.d.ts +24 -1
  28. package/dist/acp/types.d.ts.map +1 -1
  29. package/dist/acp/types.js.map +1 -1
  30. package/dist/agent/agent-manager.d.ts +40 -1
  31. package/dist/agent/agent-manager.d.ts.map +1 -1
  32. package/dist/agent/agent-manager.js +172 -8
  33. package/dist/agent/agent-manager.js.map +1 -1
  34. package/dist/agent/types.d.ts +22 -0
  35. package/dist/agent/types.d.ts.map +1 -1
  36. package/dist/agent/types.js.map +1 -1
  37. package/dist/agent/wake.d.ts +15 -0
  38. package/dist/agent/wake.d.ts.map +1 -1
  39. package/dist/agent/wake.js +15 -0
  40. package/dist/agent/wake.js.map +1 -1
  41. package/dist/agent-detection/command-builder.d.ts +30 -0
  42. package/dist/agent-detection/command-builder.d.ts.map +1 -0
  43. package/dist/agent-detection/command-builder.js +71 -0
  44. package/dist/agent-detection/command-builder.js.map +1 -0
  45. package/dist/agent-detection/detector.d.ts +84 -0
  46. package/dist/agent-detection/detector.d.ts.map +1 -0
  47. package/dist/agent-detection/detector.js +240 -0
  48. package/dist/agent-detection/detector.js.map +1 -0
  49. package/dist/agent-detection/index.d.ts +12 -0
  50. package/dist/agent-detection/index.d.ts.map +1 -0
  51. package/dist/agent-detection/index.js +14 -0
  52. package/dist/agent-detection/index.js.map +1 -0
  53. package/dist/agent-detection/registry.d.ts +53 -0
  54. package/dist/agent-detection/registry.d.ts.map +1 -0
  55. package/dist/agent-detection/registry.js +177 -0
  56. package/dist/agent-detection/registry.js.map +1 -0
  57. package/dist/agent-detection/types.d.ts +121 -0
  58. package/dist/agent-detection/types.d.ts.map +1 -0
  59. package/dist/agent-detection/types.js +20 -0
  60. package/dist/agent-detection/types.js.map +1 -0
  61. package/dist/api/server.d.ts +5 -1
  62. package/dist/api/server.d.ts.map +1 -1
  63. package/dist/api/server.js +362 -0
  64. package/dist/api/server.js.map +1 -1
  65. package/dist/api/types.d.ts +50 -1
  66. package/dist/api/types.d.ts.map +1 -1
  67. package/dist/cli/acp.d.ts +2 -0
  68. package/dist/cli/acp.d.ts.map +1 -1
  69. package/dist/cli/acp.js +8 -1
  70. package/dist/cli/acp.js.map +1 -1
  71. package/dist/cli/index.js +29 -0
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/cli/mcp.js +38 -0
  74. package/dist/cli/mcp.js.map +1 -1
  75. package/dist/config/index.d.ts +2 -0
  76. package/dist/config/index.d.ts.map +1 -0
  77. package/dist/config/index.js +2 -0
  78. package/dist/config/index.js.map +1 -0
  79. package/dist/config/project-config.d.ts +46 -0
  80. package/dist/config/project-config.d.ts.map +1 -0
  81. package/dist/config/project-config.js +68 -0
  82. package/dist/config/project-config.js.map +1 -0
  83. package/dist/lifecycle/cascade.d.ts +1 -1
  84. package/dist/lifecycle/cascade.d.ts.map +1 -1
  85. package/dist/lifecycle/handlers/index.d.ts +4 -0
  86. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  87. package/dist/lifecycle/handlers/index.js +2 -0
  88. package/dist/lifecycle/handlers/index.js.map +1 -1
  89. package/dist/lifecycle/handlers/worker.d.ts +4 -0
  90. package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
  91. package/dist/lifecycle/handlers/worker.js +35 -3
  92. package/dist/lifecycle/handlers/worker.js.map +1 -1
  93. package/dist/mail/conversation-map.d.ts +33 -0
  94. package/dist/mail/conversation-map.d.ts.map +1 -0
  95. package/dist/mail/conversation-map.js +61 -0
  96. package/dist/mail/conversation-map.js.map +1 -0
  97. package/dist/mail/index.d.ts +11 -0
  98. package/dist/mail/index.d.ts.map +1 -0
  99. package/dist/mail/index.js +11 -0
  100. package/dist/mail/index.js.map +1 -0
  101. package/dist/mail/mail-service.d.ts +85 -0
  102. package/dist/mail/mail-service.d.ts.map +1 -0
  103. package/dist/mail/mail-service.js +121 -0
  104. package/dist/mail/mail-service.js.map +1 -0
  105. package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
  106. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
  107. package/dist/mail/stores/eventstore-conversation-store.js +131 -0
  108. package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
  109. package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
  110. package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
  111. package/dist/mail/stores/eventstore-participant-store.js +145 -0
  112. package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
  113. package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
  114. package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
  115. package/dist/mail/stores/eventstore-thread-store.js +118 -0
  116. package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
  117. package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
  118. package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
  119. package/dist/mail/stores/eventstore-turn-store.js +153 -0
  120. package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
  121. package/dist/mail/stores/index.d.ts +12 -0
  122. package/dist/mail/stores/index.d.ts.map +1 -0
  123. package/dist/mail/stores/index.js +12 -0
  124. package/dist/mail/stores/index.js.map +1 -0
  125. package/dist/mail/stores/types.d.ts +146 -0
  126. package/dist/mail/stores/types.d.ts.map +1 -0
  127. package/dist/mail/stores/types.js +13 -0
  128. package/dist/mail/stores/types.js.map +1 -0
  129. package/dist/mail/turn-recorder.d.ts +30 -0
  130. package/dist/mail/turn-recorder.d.ts.map +1 -0
  131. package/dist/mail/turn-recorder.js +98 -0
  132. package/dist/mail/turn-recorder.js.map +1 -0
  133. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  134. package/dist/map/adapter/acp-over-map.js +32 -2
  135. package/dist/map/adapter/acp-over-map.js.map +1 -1
  136. package/dist/map/adapter/event-translator.d.ts.map +1 -1
  137. package/dist/map/adapter/event-translator.js +4 -0
  138. package/dist/map/adapter/event-translator.js.map +1 -1
  139. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  140. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  141. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  142. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  143. package/dist/map/adapter/extensions/index.d.ts +10 -1
  144. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  145. package/dist/map/adapter/extensions/index.js +39 -0
  146. package/dist/map/adapter/extensions/index.js.map +1 -1
  147. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  148. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  149. package/dist/map/adapter/extensions/resume.js +59 -0
  150. package/dist/map/adapter/extensions/resume.js.map +1 -0
  151. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  152. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  153. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  154. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  155. package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
  156. package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
  157. package/dist/map/adapter/mail-handler-adapter.js +292 -0
  158. package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
  159. package/dist/map/adapter/map-adapter.d.ts +34 -10
  160. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  161. package/dist/map/adapter/map-adapter.js +110 -14
  162. package/dist/map/adapter/map-adapter.js.map +1 -1
  163. package/dist/map/adapter/rpc-handler.d.ts +4 -1
  164. package/dist/map/adapter/rpc-handler.d.ts.map +1 -1
  165. package/dist/map/adapter/rpc-handler.js +6 -0
  166. package/dist/map/adapter/rpc-handler.js.map +1 -1
  167. package/dist/map/index.d.ts +1 -0
  168. package/dist/map/index.d.ts.map +1 -1
  169. package/dist/map/index.js +2 -0
  170. package/dist/map/index.js.map +1 -1
  171. package/dist/map/types.d.ts +3 -1
  172. package/dist/map/types.d.ts.map +1 -1
  173. package/dist/map/types.js.map +1 -1
  174. package/dist/mcp/mcp-server.d.ts +6 -0
  175. package/dist/mcp/mcp-server.d.ts.map +1 -1
  176. package/dist/mcp/mcp-server.js +45 -0
  177. package/dist/mcp/mcp-server.js.map +1 -1
  178. package/dist/mcp/tools/claim_task.d.ts +35 -0
  179. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  180. package/dist/mcp/tools/claim_task.js +58 -0
  181. package/dist/mcp/tools/claim_task.js.map +1 -0
  182. package/dist/mcp/tools/done.d.ts +15 -2
  183. package/dist/mcp/tools/done.d.ts.map +1 -1
  184. package/dist/mcp/tools/done.js +45 -10
  185. package/dist/mcp/tools/done.js.map +1 -1
  186. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  187. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  188. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  189. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  190. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  191. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  192. package/dist/mcp/tools/unclaim_task.js +47 -0
  193. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  194. package/dist/metrics/index.d.ts +2 -0
  195. package/dist/metrics/index.d.ts.map +1 -0
  196. package/dist/metrics/index.js +2 -0
  197. package/dist/metrics/index.js.map +1 -0
  198. package/dist/metrics/metrics.d.ts +79 -0
  199. package/dist/metrics/metrics.d.ts.map +1 -0
  200. package/dist/metrics/metrics.js +166 -0
  201. package/dist/metrics/metrics.js.map +1 -0
  202. package/dist/roles/capabilities.d.ts +1 -0
  203. package/dist/roles/capabilities.d.ts.map +1 -1
  204. package/dist/roles/capabilities.js +3 -0
  205. package/dist/roles/capabilities.js.map +1 -1
  206. package/dist/roles/types.d.ts +1 -1
  207. package/dist/roles/types.d.ts.map +1 -1
  208. package/dist/router/channels.d.ts +2 -4
  209. package/dist/router/channels.d.ts.map +1 -1
  210. package/dist/router/channels.js.map +1 -1
  211. package/dist/router/message-router.d.ts +85 -9
  212. package/dist/router/message-router.d.ts.map +1 -1
  213. package/dist/router/message-router.js +203 -14
  214. package/dist/router/message-router.js.map +1 -1
  215. package/dist/router/role-resolver.d.ts +10 -1
  216. package/dist/router/role-resolver.d.ts.map +1 -1
  217. package/dist/router/role-resolver.js +15 -1
  218. package/dist/router/role-resolver.js.map +1 -1
  219. package/dist/router/types.d.ts +30 -1
  220. package/dist/router/types.d.ts.map +1 -1
  221. package/dist/router/types.js.map +1 -1
  222. package/dist/server/combined-server.d.ts +6 -0
  223. package/dist/server/combined-server.d.ts.map +1 -1
  224. package/dist/server/combined-server.js +24 -2
  225. package/dist/server/combined-server.js.map +1 -1
  226. package/dist/store/event-store.d.ts +14 -1
  227. package/dist/store/event-store.d.ts.map +1 -1
  228. package/dist/store/event-store.js +456 -4
  229. package/dist/store/event-store.js.map +1 -1
  230. package/dist/store/types/agents.d.ts +1 -1
  231. package/dist/store/types/agents.d.ts.map +1 -1
  232. package/dist/store/types/conversations.d.ts +91 -0
  233. package/dist/store/types/conversations.d.ts.map +1 -0
  234. package/dist/store/types/conversations.js +8 -0
  235. package/dist/store/types/conversations.js.map +1 -0
  236. package/dist/store/types/events.d.ts +1 -1
  237. package/dist/store/types/events.d.ts.map +1 -1
  238. package/dist/store/types/events.js.map +1 -1
  239. package/dist/store/types/index.d.ts +2 -0
  240. package/dist/store/types/index.d.ts.map +1 -1
  241. package/dist/store/types/index.js +2 -0
  242. package/dist/store/types/index.js.map +1 -1
  243. package/dist/store/types/sessions.d.ts +44 -0
  244. package/dist/store/types/sessions.d.ts.map +1 -0
  245. package/dist/store/types/sessions.js +9 -0
  246. package/dist/store/types/sessions.js.map +1 -0
  247. package/dist/store/types/tasks.d.ts +2 -0
  248. package/dist/store/types/tasks.d.ts.map +1 -1
  249. package/dist/task/backend/memory.d.ts +4 -1
  250. package/dist/task/backend/memory.d.ts.map +1 -1
  251. package/dist/task/backend/memory.js +81 -0
  252. package/dist/task/backend/memory.js.map +1 -1
  253. package/dist/task/backend/types.d.ts +30 -0
  254. package/dist/task/backend/types.d.ts.map +1 -1
  255. package/dist/task/backend/types.js.map +1 -1
  256. package/dist/teams/index.d.ts +4 -0
  257. package/dist/teams/index.d.ts.map +1 -0
  258. package/dist/teams/index.js +4 -0
  259. package/dist/teams/index.js.map +1 -0
  260. package/dist/teams/team-loader.d.ts +20 -0
  261. package/dist/teams/team-loader.d.ts.map +1 -0
  262. package/dist/teams/team-loader.js +293 -0
  263. package/dist/teams/team-loader.js.map +1 -0
  264. package/dist/teams/team-runtime.d.ts +139 -0
  265. package/dist/teams/team-runtime.d.ts.map +1 -0
  266. package/dist/teams/team-runtime.js +613 -0
  267. package/dist/teams/team-runtime.js.map +1 -0
  268. package/dist/teams/types.d.ts +266 -0
  269. package/dist/teams/types.d.ts.map +1 -0
  270. package/dist/teams/types.js +20 -0
  271. package/dist/teams/types.js.map +1 -0
  272. package/dist/trigger/router/trigger-router.d.ts +30 -3
  273. package/dist/trigger/router/trigger-router.d.ts.map +1 -1
  274. package/dist/trigger/router/trigger-router.js +30 -3
  275. package/dist/trigger/router/trigger-router.js.map +1 -1
  276. package/dist/trigger/wake/types.d.ts +31 -5
  277. package/dist/trigger/wake/types.d.ts.map +1 -1
  278. package/dist/trigger/wake/types.js +19 -0
  279. package/dist/trigger/wake/types.js.map +1 -1
  280. package/dist/workspace/dataplane-adapter.d.ts +1 -1
  281. package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
  282. package/dist/workspace/dataplane-adapter.js +1 -1
  283. package/dist/workspace/dataplane-adapter.js.map +1 -1
  284. package/dist/workspace/index.d.ts +1 -1
  285. package/dist/workspace/index.d.ts.map +1 -1
  286. package/dist/workspace/strategies/index.d.ts +6 -0
  287. package/dist/workspace/strategies/index.d.ts.map +1 -0
  288. package/dist/workspace/strategies/index.js +5 -0
  289. package/dist/workspace/strategies/index.js.map +1 -0
  290. package/dist/workspace/strategies/optimistic.d.ts +26 -0
  291. package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
  292. package/dist/workspace/strategies/optimistic.js +121 -0
  293. package/dist/workspace/strategies/optimistic.js.map +1 -0
  294. package/dist/workspace/strategies/queue.d.ts +26 -0
  295. package/dist/workspace/strategies/queue.d.ts.map +1 -0
  296. package/dist/workspace/strategies/queue.js +67 -0
  297. package/dist/workspace/strategies/queue.js.map +1 -0
  298. package/dist/workspace/strategies/registry.d.ts +37 -0
  299. package/dist/workspace/strategies/registry.d.ts.map +1 -0
  300. package/dist/workspace/strategies/registry.js +63 -0
  301. package/dist/workspace/strategies/registry.js.map +1 -0
  302. package/dist/workspace/strategies/trunk.d.ts +20 -0
  303. package/dist/workspace/strategies/trunk.d.ts.map +1 -0
  304. package/dist/workspace/strategies/trunk.js +108 -0
  305. package/dist/workspace/strategies/trunk.js.map +1 -0
  306. package/dist/workspace/strategies/types.d.ts +104 -0
  307. package/dist/workspace/strategies/types.d.ts.map +1 -0
  308. package/dist/workspace/strategies/types.js +11 -0
  309. package/dist/workspace/strategies/types.js.map +1 -0
  310. package/dist/workspace/types.d.ts +1 -1
  311. package/dist/workspace/types.d.ts.map +1 -1
  312. package/dist/workspace/workspace-manager.d.ts +1 -1
  313. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  314. package/docs/implementation-details.md +1127 -0
  315. package/docs/implementation-summary.md +448 -0
  316. package/docs/mail-integration.md +608 -0
  317. package/docs/plan-self-driving-support.md +433 -0
  318. package/docs/spec-self-driving-support.md +462 -0
  319. package/docs/team-templates.md +860 -0
  320. package/docs/teams.md +233 -0
  321. package/package.json +5 -3
  322. package/src/acp/__tests__/integration.test.ts +161 -1
  323. package/src/acp/__tests__/macro-agent.test.ts +95 -0
  324. package/src/acp/__tests__/session-persistence.test.ts +276 -0
  325. package/src/acp/macro-agent.ts +79 -7
  326. package/src/acp/session-mapper.ts +108 -1
  327. package/src/acp/types.ts +33 -1
  328. package/src/agent/agent-manager.ts +278 -6
  329. package/src/agent/types.ts +27 -0
  330. package/src/agent/wake.ts +15 -0
  331. package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
  332. package/src/agent-detection/__tests__/detector.test.ts +768 -0
  333. package/src/agent-detection/__tests__/registry.test.ts +254 -0
  334. package/src/agent-detection/command-builder.ts +90 -0
  335. package/src/agent-detection/detector.ts +307 -0
  336. package/src/agent-detection/index.ts +36 -0
  337. package/src/agent-detection/registry.ts +200 -0
  338. package/src/agent-detection/types.ts +184 -0
  339. package/src/api/__tests__/conversation-api.test.ts +468 -0
  340. package/src/api/server.ts +425 -1
  341. package/src/api/types.ts +64 -1
  342. package/src/cli/acp.ts +9 -1
  343. package/src/cli/index.ts +44 -0
  344. package/src/cli/mcp.ts +47 -0
  345. package/src/config/index.ts +9 -0
  346. package/src/config/project-config.ts +107 -0
  347. package/src/lifecycle/cascade.ts +1 -1
  348. package/src/lifecycle/handlers/index.ts +8 -0
  349. package/src/lifecycle/handlers/worker.ts +48 -3
  350. package/src/mail/__tests__/conversation-lifecycle.test.ts +409 -0
  351. package/src/mail/__tests__/eventstore-stores.test.ts +1073 -0
  352. package/src/mail/__tests__/mail-full-agent.e2e.test.ts +575 -0
  353. package/src/mail/__tests__/mail-integration.test.ts +759 -0
  354. package/src/mail/__tests__/mail-map-protocol.e2e.test.ts +1068 -0
  355. package/src/mail/__tests__/mail-service.test.ts +506 -0
  356. package/src/mail/__tests__/turn-recorder.test.ts +328 -0
  357. package/src/mail/conversation-map.ts +107 -0
  358. package/src/mail/index.ts +25 -0
  359. package/src/mail/mail-service.ts +257 -0
  360. package/src/mail/stores/eventstore-conversation-store.ts +146 -0
  361. package/src/mail/stores/eventstore-participant-store.ts +172 -0
  362. package/src/mail/stores/eventstore-thread-store.ts +129 -0
  363. package/src/mail/stores/eventstore-turn-store.ts +173 -0
  364. package/src/mail/stores/index.ts +12 -0
  365. package/src/mail/stores/types.ts +160 -0
  366. package/src/mail/turn-recorder.ts +124 -0
  367. package/src/map/README.md +79 -0
  368. package/src/map/adapter/__tests__/extensions.test.ts +359 -0
  369. package/src/map/adapter/__tests__/map-adapter.test.ts +90 -0
  370. package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
  371. package/src/map/adapter/acp-over-map.ts +45 -2
  372. package/src/map/adapter/event-translator.ts +4 -0
  373. package/src/map/adapter/extensions/agent-detection.ts +201 -0
  374. package/src/map/adapter/extensions/index.ts +63 -0
  375. package/src/map/adapter/extensions/resume.ts +114 -0
  376. package/src/map/adapter/extensions/workspace-files.ts +449 -0
  377. package/src/map/adapter/mail-handler-adapter.ts +429 -0
  378. package/src/map/adapter/map-adapter.ts +173 -27
  379. package/src/map/adapter/rpc-handler.ts +8 -1
  380. package/src/map/index.ts +3 -0
  381. package/src/map/types.ts +3 -1
  382. package/src/mcp/mcp-server.ts +67 -0
  383. package/src/mcp/tools/claim_task.ts +86 -0
  384. package/src/mcp/tools/done.ts +59 -10
  385. package/src/mcp/tools/list_claimable_tasks.ts +93 -0
  386. package/src/mcp/tools/unclaim_task.ts +71 -0
  387. package/src/metrics/index.ts +9 -0
  388. package/src/metrics/metrics.ts +280 -0
  389. package/src/roles/capabilities.ts +3 -0
  390. package/src/roles/types.ts +2 -1
  391. package/src/router/README.md +120 -0
  392. package/src/router/__tests__/message-router.test.ts +561 -0
  393. package/src/router/channels.ts +3 -4
  394. package/src/router/message-router.ts +308 -22
  395. package/src/router/role-resolver.ts +22 -1
  396. package/src/router/types.ts +36 -1
  397. package/src/server/combined-server.ts +36 -2
  398. package/src/store/README.md +134 -0
  399. package/src/store/event-store.ts +546 -3
  400. package/src/store/types/agents.ts +1 -1
  401. package/src/store/types/conversations.ts +129 -0
  402. package/src/store/types/events.ts +5 -1
  403. package/src/store/types/index.ts +2 -0
  404. package/src/store/types/sessions.ts +53 -0
  405. package/src/store/types/tasks.ts +3 -0
  406. package/src/task/backend/memory.ts +116 -0
  407. package/src/task/backend/types.ts +43 -0
  408. package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
  409. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
  410. package/src/teams/__tests__/team-system.test.ts +1280 -0
  411. package/src/teams/index.ts +13 -0
  412. package/src/teams/team-loader.ts +434 -0
  413. package/src/teams/team-runtime.ts +727 -0
  414. package/src/teams/types.ts +377 -0
  415. package/src/trigger/router/trigger-router.ts +30 -3
  416. package/src/trigger/wake/types.ts +32 -5
  417. package/src/trigger/wake/wake-manager.ts +2 -2
  418. package/src/workspace/dataplane-adapter.ts +1 -1
  419. package/src/workspace/index.ts +1 -1
  420. package/src/workspace/strategies/index.ts +18 -0
  421. package/src/workspace/strategies/optimistic.ts +136 -0
  422. package/src/workspace/strategies/queue.ts +81 -0
  423. package/src/workspace/strategies/registry.ts +89 -0
  424. package/src/workspace/strategies/trunk.ts +123 -0
  425. package/src/workspace/strategies/types.ts +145 -0
  426. package/src/workspace/types.ts +1 -1
  427. package/src/workspace/workspace-manager.ts +1 -1
  428. package/.claude/settings.local.json +0 -59
  429. package/dist/map/utils/address-translation.d.ts +0 -99
  430. package/dist/map/utils/address-translation.d.ts.map +0 -1
  431. package/dist/map/utils/address-translation.js +0 -285
  432. package/dist/map/utils/address-translation.js.map +0 -1
  433. package/dist/map/utils/index.d.ts +0 -7
  434. package/dist/map/utils/index.d.ts.map +0 -1
  435. package/dist/map/utils/index.js +0 -7
  436. package/dist/map/utils/index.js.map +0 -1
  437. package/openspec/AGENTS.md +0 -456
  438. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/design.md +0 -128
  439. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/proposal.md +0 -49
  440. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/agent-manager/spec.md +0 -150
  441. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/cli-api/spec.md +0 -258
  442. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/event-store/spec.md +0 -160
  443. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/mcp-tools/spec.md +0 -224
  444. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/message-router/spec.md +0 -153
  445. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/task-manager/spec.md +0 -136
  446. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/tasks.md +0 -147
  447. package/openspec/project.md +0 -31
  448. package/openspec/specs/agent-manager/spec.md +0 -154
  449. package/openspec/specs/cli-api/spec.md +0 -262
  450. package/openspec/specs/event-store/spec.md +0 -164
  451. package/openspec/specs/mcp-tools/spec.md +0 -228
  452. package/openspec/specs/message-router/spec.md +0 -157
  453. package/openspec/specs/task-manager/spec.md +0 -140
  454. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  455. package/references/acp-factory-ref/LICENSE +0 -21
  456. package/references/acp-factory-ref/README.md +0 -341
  457. package/references/acp-factory-ref/package-lock.json +0 -3102
  458. package/references/acp-factory-ref/package.json +0 -96
  459. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  460. package/references/acp-factory-ref/python/LICENSE +0 -21
  461. package/references/acp-factory-ref/python/Makefile +0 -57
  462. package/references/acp-factory-ref/python/README.md +0 -253
  463. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  464. package/references/acp-factory-ref/python/tests/__init__.py +0 -0
  465. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  466. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  467. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  468. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  469. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  470. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  471. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  472. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  473. package/references/claude-code-acp/.prettierrc.json +0 -4
  474. package/references/claude-code-acp/CHANGELOG.md +0 -249
  475. package/references/claude-code-acp/LICENSE +0 -222
  476. package/references/claude-code-acp/README.md +0 -53
  477. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  478. package/references/claude-code-acp/eslint.config.js +0 -48
  479. package/references/claude-code-acp/package-lock.json +0 -4570
  480. package/references/claude-code-acp/package.json +0 -88
  481. package/references/claude-code-acp/scripts/release.sh +0 -119
  482. package/references/claude-code-acp/src/acp-agent.ts +0 -2065
  483. package/references/claude-code-acp/src/index.ts +0 -26
  484. package/references/claude-code-acp/src/lib.ts +0 -38
  485. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  486. package/references/claude-code-acp/src/settings.ts +0 -522
  487. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  488. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  489. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  490. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  491. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  492. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  493. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  494. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  495. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  496. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  497. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  498. package/references/claude-code-acp/src/tools.ts +0 -819
  499. package/references/claude-code-acp/src/utils.ts +0 -171
  500. package/references/claude-code-acp/tsconfig.json +0 -18
  501. package/references/claude-code-acp/vitest.config.ts +0 -19
  502. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -82
  503. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -9
  504. package/references/multi-agent-protocol/LICENSE +0 -21
  505. package/references/multi-agent-protocol/README.md +0 -113
  506. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -460
  507. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  508. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  509. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  510. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  511. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  512. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  513. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  514. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  515. package/references/multi-agent-protocol/package-lock.json +0 -3239
  516. package/references/multi-agent-protocol/package.json +0 -56
  517. package/references/multi-agent-protocol/schema/meta.json +0 -337
  518. package/references/multi-agent-protocol/schema/schema.json +0 -1828
@@ -1,224 +0,0 @@
1
- ## ADDED Requirements
2
-
3
- ### Requirement: MCP Server Setup
4
-
5
- The system SHALL provide an MCP server that exposes multi-agent tools to agents.
6
-
7
- #### Scenario: Start MCP server
8
- - **GIVEN** the multi-agent system is initialized
9
- - **WHEN** the MCP server is started
10
- - **THEN** the server registers all available tools
11
- - **AND** agents can discover tools via the MCP protocol
12
-
13
- #### Scenario: Tool context injection
14
- - **GIVEN** an agent with id 'agent_1' and session 'sess_123'
15
- - **WHEN** the agent calls any MCP tool
16
- - **THEN** the tool handler receives context { agent_id: 'agent_1', session_id: 'sess_123' }
17
- - **AND** the tool can use this context for authorization and attribution
18
-
19
- ---
20
-
21
- ### Requirement: spawn_agent Tool
22
-
23
- The system SHALL provide a tool for agents to spawn child agents.
24
-
25
- #### Scenario: Spawn child agent
26
- - **GIVEN** an agent 'manager_1' calls spawn_agent
27
- - **WHEN** spawn_agent({ task: 'Implement feature X' }) is invoked
28
- - **THEN** a new agent is spawned with parent 'manager_1'
29
- - **AND** the tool returns { agent_id, task_id }
30
-
31
- #### Scenario: Spawn with subscribe_parent false
32
- - **GIVEN** an agent calls spawn_agent with fire-and-forget intent
33
- - **WHEN** spawn_agent({ task: 'Background task', subscribe_parent: false }) is invoked
34
- - **THEN** the parent is NOT subscribed to the child's subtree
35
- - **AND** the child operates independently
36
-
37
- #### Scenario: Spawn with custom config
38
- - **GIVEN** an agent needs a specific model for a child
39
- - **WHEN** spawn_agent({ task: 'Complex analysis', config: { model: 'claude-opus-4-20250514' } }) is invoked
40
- - **THEN** the child agent uses the specified model
41
-
42
- ---
43
-
44
- ### Requirement: emit_status Tool
45
-
46
- The system SHALL provide a tool for agents to report status milestones.
47
-
48
- #### Scenario: Emit started status
49
- - **GIVEN** agent 'worker_1' beginning work
50
- - **WHEN** emit_status({ status_type: 'started', summary: 'Beginning implementation' }) is invoked
51
- - **THEN** a status event is emitted with source agent_id 'worker_1'
52
- - **AND** the tool returns { event_id }
53
-
54
- #### Scenario: Emit checkpoint status
55
- - **GIVEN** agent 'worker_1' reaching a milestone
56
- - **WHEN** emit_status({ status_type: 'checkpoint', summary: '50% complete', details: { progress: '50%' } }) is invoked
57
- - **THEN** the status event includes the details
58
- - **AND** subscribers (e.g., parent) receive the update
59
-
60
- #### Scenario: Emit completed status
61
- - **GIVEN** agent 'worker_1' finishing work
62
- - **WHEN** emit_status({ status_type: 'completed', summary: 'Task finished', details: { artifacts: [...] } }) is invoked
63
- - **THEN** the completion is recorded
64
- - **AND** the agent's task status is updated
65
-
66
- ---
67
-
68
- ### Requirement: send_message Tool
69
-
70
- The system SHALL provide a tool for agents to send messages.
71
-
72
- #### Scenario: Send direct message
73
- - **GIVEN** agent 'agent_1' wants to message 'agent_2'
74
- - **WHEN** send_message({ to: { agent_id: 'agent_2' }, content: 'Need your input' }) is invoked
75
- - **THEN** the message is routed to agent_2
76
- - **AND** the tool returns { message_id }
77
-
78
- #### Scenario: Send message to topic
79
- - **GIVEN** agent 'agent_1' wants to broadcast to a topic
80
- - **WHEN** send_message({ to: { topic: 'discoveries' }, content: 'Found issue X' }) is invoked
81
- - **THEN** all agents subscribed to 'discoveries' receive the message
82
-
83
- #### Scenario: Send reply with correlation
84
- - **GIVEN** agent received message 'msg_123'
85
- - **WHEN** send_message({ to: { agent_id: 'sender' }, content: 'Response', correlation_id: 'msg_123' }) is invoked
86
- - **THEN** the response is threaded with the original message
87
-
88
- ---
89
-
90
- ### Requirement: check_messages Tool
91
-
92
- The system SHALL provide a tool for agents to check their message queue.
93
-
94
- #### Scenario: Check messages with default limit
95
- - **GIVEN** agent 'agent_1' has pending messages
96
- - **WHEN** check_messages({}) is invoked by agent_1
97
- - **THEN** up to 10 messages are returned (default limit)
98
- - **AND** messages include id, from, content, timestamp, truncated flag
99
-
100
- #### Scenario: Check messages with custom limit
101
- - **GIVEN** agent 'agent_1' has many pending messages
102
- - **WHEN** check_messages({ limit: 5 }) is invoked
103
- - **THEN** only 5 messages are returned
104
-
105
- #### Scenario: No pending messages
106
- - **GIVEN** agent 'agent_1' has no pending messages
107
- - **WHEN** check_messages({}) is invoked
108
- - **THEN** an empty messages array is returned
109
-
110
- ---
111
-
112
- ### Requirement: query_index Tool
113
-
114
- The system SHALL provide a tool for agents to search for agents and tasks.
115
-
116
- #### Scenario: Query running agents
117
- - **GIVEN** multiple agents in various states
118
- - **WHEN** query_index({ type: 'agents', filter: { state: 'running' } }) is invoked
119
- - **THEN** only running agents are returned
120
- - **AND** the tool returns { entries, total, has_more }
121
-
122
- #### Scenario: Query tasks by status
123
- - **GIVEN** tasks in various statuses
124
- - **WHEN** query_index({ type: 'tasks', filter: { status: 'in_progress' } }) is invoked
125
- - **THEN** only in-progress tasks are returned
126
-
127
- #### Scenario: Search with text query
128
- - **GIVEN** agents and tasks with various descriptions
129
- - **WHEN** query_index({ type: 'all', search: 'authentication' }) is invoked
130
- - **THEN** entries matching 'authentication' are returned
131
- - **AND** results are sorted by relevance/recency
132
-
133
- ---
134
-
135
- ### Requirement: get_hierarchy Tool
136
-
137
- The system SHALL provide a tool for agents to view the agent tree.
138
-
139
- #### Scenario: Get full hierarchy
140
- - **GIVEN** a multi-level agent hierarchy
141
- - **WHEN** get_hierarchy({}) is invoked
142
- - **THEN** the complete tree from head manager is returned
143
- - **AND** each node includes agent_id, task, state, children
144
-
145
- #### Scenario: Get hierarchy from specific root
146
- - **GIVEN** agent 'manager_1' with children
147
- - **WHEN** get_hierarchy({ root: 'manager_1' }) is invoked
148
- - **THEN** only the subtree under manager_1 is returned
149
-
150
- #### Scenario: Get hierarchy with depth limit
151
- - **GIVEN** a deep hierarchy
152
- - **WHEN** get_hierarchy({ depth: 2 }) is invoked
153
- - **THEN** only 2 levels of the hierarchy are returned
154
-
155
- ---
156
-
157
- ### Requirement: get_agent_summary Tool
158
-
159
- The system SHALL provide a tool for quick agent lookup.
160
-
161
- #### Scenario: Get agent summary
162
- - **GIVEN** agent 'worker_1' exists with recent activity
163
- - **WHEN** get_agent_summary({ agent_id: 'worker_1' }) is invoked
164
- - **THEN** the summary includes id, session_id, task, state, parent, children_count, last_activity, recent_status
165
-
166
- #### Scenario: Get non-existent agent
167
- - **GIVEN** no agent with id 'nonexistent'
168
- - **WHEN** get_agent_summary({ agent_id: 'nonexistent' }) is invoked
169
- - **THEN** an error is returned indicating agent not found
170
-
171
- ---
172
-
173
- ### Requirement: stop_agent Tool
174
-
175
- The system SHALL provide a tool for agents to terminate their children.
176
-
177
- #### Scenario: Stop own child
178
- - **GIVEN** agent 'manager_1' spawned 'worker_1'
179
- - **WHEN** manager_1 invokes stop_agent({ agent_id: 'worker_1' })
180
- - **THEN** worker_1 is terminated with reason 'stopped'
181
- - **AND** the tool returns { success: true }
182
-
183
- #### Scenario: Stop grandchild
184
- - **GIVEN** hierarchy: manager_1 → worker_1 → helper_1
185
- - **WHEN** manager_1 invokes stop_agent({ agent_id: 'helper_1' })
186
- - **THEN** helper_1 is terminated (manager_1 owns the subtree)
187
-
188
- #### Scenario: Cannot stop agent outside subtree
189
- - **GIVEN** agent 'agent_A' not in 'agent_B's subtree
190
- - **WHEN** agent_B invokes stop_agent({ agent_id: 'agent_A' })
191
- - **THEN** the operation fails with error 'Cannot stop agent outside your subtree'
192
-
193
- ---
194
-
195
- ### Requirement: create_task Tool
196
-
197
- The system SHALL provide a tool for agents to create explicit tasks.
198
-
199
- #### Scenario: Create task
200
- - **GIVEN** agent 'manager_1' wants to create a task
201
- - **WHEN** create_task({ description: 'Review code changes' }) is invoked by manager_1
202
- - **THEN** a new task is created with created_by: 'manager_1'
203
- - **AND** the tool returns { task_id }
204
-
205
- #### Scenario: Create subtask
206
- - **GIVEN** parent task 'task_1' exists
207
- - **WHEN** create_task({ description: 'Subtask', parent_task: 'task_1' }) is invoked
208
- - **THEN** the task is created with parent_task reference
209
-
210
- ---
211
-
212
- ### Requirement: get_task Tool
213
-
214
- The system SHALL provide a tool for agents to lookup task details.
215
-
216
- #### Scenario: Get task details
217
- - **GIVEN** task 'task_1' exists
218
- - **WHEN** get_task({ task_id: 'task_1' }) is invoked
219
- - **THEN** the full task record is returned including description, status, assigned_agent, inputs, outputs, artifacts
220
-
221
- #### Scenario: Get non-existent task
222
- - **GIVEN** no task with id 'nonexistent'
223
- - **WHEN** get_task({ task_id: 'nonexistent' }) is invoked
224
- - **THEN** an error is returned indicating task not found
@@ -1,153 +0,0 @@
1
- ## ADDED Requirements
2
-
3
- ### Requirement: Message Sending
4
-
5
- The system SHALL route messages to recipients based on target specification.
6
-
7
- #### Scenario: Send direct message to agent
8
- - **GIVEN** agents 'sender_1' and 'recipient_1' exist
9
- - **WHEN** send({ from: { agent_id: 'sender_1' }, to: { agent_id: 'recipient_1' }, content: 'Hello' }) is called
10
- - **THEN** a message event is emitted
11
- - **AND** the message appears in recipient_1's pending queue
12
- - **AND** the function returns the message with id and timestamp
13
-
14
- #### Scenario: Send message to task
15
- - **GIVEN** task 'task_1' assigned to agent 'worker_1'
16
- - **WHEN** send({ from: { agent_id: 'sender_1' }, to: { task_id: 'task_1' }, content: 'Status update needed' }) is called
17
- - **THEN** the message is routed to 'worker_1' (the assigned agent)
18
- - **AND** the message appears in worker_1's pending queue
19
-
20
- #### Scenario: Send message to topic
21
- - **GIVEN** agents 'agent_1' and 'agent_2' subscribed to topic 'errors'
22
- - **WHEN** send({ from: { agent_id: 'sender_1' }, to: { topic: 'errors' }, content: 'Error detected' }) is called
23
- - **THEN** the message appears in both agent_1's and agent_2's pending queues
24
-
25
- #### Scenario: Send message with correlation_id
26
- - **GIVEN** an original message with id 'msg_123'
27
- - **WHEN** send({ from: { agent_id: 'responder' }, to: { agent_id: 'requester' }, content: 'Response', correlation_id: 'msg_123' }) is called
28
- - **THEN** the message includes correlation_id 'msg_123' for threading
29
-
30
- ---
31
-
32
- ### Requirement: Message Retrieval
33
-
34
- The system SHALL allow agents to retrieve their pending messages.
35
-
36
- #### Scenario: Get pending messages
37
- - **GIVEN** agent 'agent_1' has 3 pending messages
38
- - **WHEN** getMessages('agent_1') is called
39
- - **THEN** all 3 messages are returned in chronological order
40
- - **AND** each message includes id, from, content, timestamp
41
-
42
- #### Scenario: Get messages with limit
43
- - **GIVEN** agent 'agent_1' has 10 pending messages
44
- - **WHEN** getMessages('agent_1', { limit: 5 }) is called
45
- - **THEN** only the 5 oldest messages are returned
46
-
47
- #### Scenario: Get full message content
48
- - **GIVEN** a message 'msg_1' with truncated content in the queue
49
- - **WHEN** getFullMessage('msg_1') is called
50
- - **THEN** the complete message content is returned
51
-
52
- #### Scenario: Empty message queue
53
- - **GIVEN** agent 'agent_1' has no pending messages
54
- - **WHEN** getMessages('agent_1') is called
55
- - **THEN** an empty array is returned
56
-
57
- ---
58
-
59
- ### Requirement: Subscription Management
60
-
61
- The system SHALL manage agent subscriptions to message channels.
62
-
63
- #### Scenario: Subscribe to topic
64
- - **GIVEN** agent 'agent_1' with no topic subscriptions
65
- - **WHEN** subscribe('agent_1', { type: 'topic', target: 'discoveries' }) is called
66
- - **THEN** agent_1 is subscribed to topic 'discoveries'
67
- - **AND** future messages to topic 'discoveries' are routed to agent_1
68
-
69
- #### Scenario: Subscribe to agent channel
70
- - **GIVEN** agent 'agent_1'
71
- - **WHEN** subscribe('agent_1', { type: 'agent', target: 'agent_1' }) is called
72
- - **THEN** agent_1 receives direct messages addressed to it
73
-
74
- #### Scenario: Subscribe to subtree
75
- - **GIVEN** manager 'manager_1' spawned child 'child_1'
76
- - **WHEN** subscribe('manager_1', { type: 'subtree', target: 'child_1' }) is called
77
- - **THEN** manager_1 receives all events from child_1 and its descendants
78
-
79
- #### Scenario: Unsubscribe from topic
80
- - **GIVEN** agent 'agent_1' subscribed to topic 'updates'
81
- - **WHEN** unsubscribe('agent_1', { type: 'topic', target: 'updates' }) is called
82
- - **THEN** agent_1 no longer receives messages to topic 'updates'
83
-
84
- #### Scenario: Get agent subscriptions
85
- - **GIVEN** agent 'agent_1' with multiple subscriptions
86
- - **WHEN** getSubscriptions('agent_1') is called
87
- - **THEN** all subscriptions are returned as an array of { type, target }
88
-
89
- ---
90
-
91
- ### Requirement: Automatic Subscription Setup
92
-
93
- The system SHALL configure default subscriptions when agents spawn.
94
-
95
- #### Scenario: Default subscriptions on spawn
96
- - **GIVEN** spawning agent 'child_1' with parent 'parent_1'
97
- - **WHEN** default subscriptions are set up
98
- - **THEN** child_1 is subscribed to { type: 'agent', target: 'child_1' }
99
- - **AND** child_1 is subscribed to { type: 'lineage', target: 'child_1' }
100
- - **AND** if task_id provided, child_1 is subscribed to { type: 'task', target: task_id }
101
-
102
- #### Scenario: Parent subtree subscription
103
- - **GIVEN** spawning agent 'child_1' with parent 'parent_1' and subscribe_parent: true
104
- - **WHEN** default subscriptions are set up
105
- - **THEN** parent_1 is subscribed to { type: 'subtree', target: 'child_1' }
106
-
107
- #### Scenario: Skip parent subscription
108
- - **GIVEN** spawning agent 'child_1' with parent 'parent_1' and subscribe_parent: false
109
- - **WHEN** default subscriptions are set up
110
- - **THEN** parent_1 is NOT subscribed to child_1's subtree
111
-
112
- ---
113
-
114
- ### Requirement: Status Event Routing
115
-
116
- The system SHALL route status events to appropriate subscribers.
117
-
118
- #### Scenario: Route status to parent
119
- - **GIVEN** agent 'child_1' with parent 'parent_1' subscribed to subtree
120
- - **WHEN** child_1 emits a status event (e.g., 'checkpoint')
121
- - **THEN** the status event appears in parent_1's message queue
122
- - **AND** the event includes agent_id, task_id, status_type, summary
123
-
124
- #### Scenario: Route completed status
125
- - **GIVEN** agent 'worker_1' with manager 'manager_1' subscribed to subtree
126
- - **WHEN** worker_1 emits status { status_type: 'completed', summary: 'Task done' }
127
- - **THEN** manager_1 receives the completion notification
128
- - **AND** can query worker_1 for detailed results
129
-
130
- #### Scenario: Route failed status
131
- - **GIVEN** agent 'worker_1' with manager 'manager_1' subscribed to subtree
132
- - **WHEN** worker_1 emits status { status_type: 'failed', summary: 'Error occurred' }
133
- - **THEN** manager_1 receives the failure notification
134
- - **AND** the event includes error details for manager to decide on recovery
135
-
136
- ---
137
-
138
- ### Requirement: Message Truncation
139
-
140
- The system SHALL truncate large messages in the queue with reference to full content.
141
-
142
- #### Scenario: Truncate large message
143
- - **GIVEN** a message with content exceeding the configured limit (e.g., 1000 tokens)
144
- - **WHEN** the message is added to a recipient's queue
145
- - **THEN** the queued message content is truncated
146
- - **AND** the message is marked with truncated: true
147
- - **AND** the full content is retrievable via getFullMessage(message_id)
148
-
149
- #### Scenario: Small message not truncated
150
- - **GIVEN** a message with content under the configured limit
151
- - **WHEN** the message is added to a recipient's queue
152
- - **THEN** the full content is included
153
- - **AND** the message is marked with truncated: false
@@ -1,136 +0,0 @@
1
- ## ADDED Requirements
2
-
3
- ### Requirement: Task Creation
4
-
5
- The system SHALL create tasks with unique IDs and emit task events.
6
-
7
- #### Scenario: Create a new task
8
- - **GIVEN** an initialized TaskManager
9
- - **WHEN** create({ description: 'Implement user authentication', created_by: 'agent_1' }) is called
10
- - **THEN** a unique task_id is generated
11
- - **AND** a task event with action 'created' is emitted
12
- - **AND** the task appears in the tasks view with status 'pending'
13
- - **AND** the function returns the new task record
14
-
15
- #### Scenario: Create task with inputs
16
- - **GIVEN** an initialized TaskManager
17
- - **WHEN** create({ description: 'Review PR #123', created_by: 'manager_1', inputs: { pr_number: 123, repo: 'my-repo' } }) is called
18
- - **THEN** the task is created with the provided inputs
19
- - **AND** the inputs are stored in the task record
20
-
21
- ---
22
-
23
- ### Requirement: Task Retrieval
24
-
25
- The system SHALL support retrieving tasks by ID and filtering.
26
-
27
- #### Scenario: Get task by ID
28
- - **GIVEN** a task 'task_1' exists
29
- - **WHEN** get('task_1') is called
30
- - **THEN** the full task record is returned including id, description, status, assigned_agent, timestamps
31
-
32
- #### Scenario: Get non-existent task
33
- - **GIVEN** no task with id 'nonexistent'
34
- - **WHEN** get('nonexistent') is called
35
- - **THEN** null is returned
36
-
37
- #### Scenario: List tasks with status filter
38
- - **GIVEN** tasks in various statuses (pending, in_progress, completed)
39
- - **WHEN** list({ status: 'in_progress' }) is called
40
- - **THEN** only tasks with status 'in_progress' are returned
41
-
42
- #### Scenario: List tasks by assigned agent
43
- - **GIVEN** agent 'worker_1' assigned to tasks 'task_1' and 'task_2'
44
- - **WHEN** list({ assigned_agent: 'worker_1' }) is called
45
- - **THEN** both 'task_1' and 'task_2' are returned
46
-
47
- ---
48
-
49
- ### Requirement: Task Assignment
50
-
51
- The system SHALL support assigning and unassigning agents to tasks.
52
-
53
- #### Scenario: Assign agent to task
54
- - **GIVEN** a task 'task_1' in 'pending' status
55
- - **WHEN** assign('task_1', 'worker_1') is called
56
- - **THEN** a task event with action 'assigned' is emitted
57
- - **AND** the task's assigned_agent is set to 'worker_1'
58
- - **AND** the task's status changes to 'assigned'
59
- - **AND** an entry is added to the task's agent_history
60
-
61
- #### Scenario: Assign with role
62
- - **GIVEN** a task 'task_1' in 'pending' status
63
- - **WHEN** assign('task_1', 'reviewer_1', 'reviewer') is called
64
- - **THEN** the agent_history entry includes role 'reviewer'
65
-
66
- #### Scenario: Unassign agent from task
67
- - **GIVEN** a task 'task_1' assigned to 'worker_1'
68
- - **WHEN** unassign('task_1', 'worker_1') is called
69
- - **THEN** a task event with action 'unassigned' is emitted
70
- - **AND** the task's assigned_agent is cleared
71
- - **AND** the agent_history entry's ended_at is set
72
-
73
- ---
74
-
75
- ### Requirement: Task Status Updates
76
-
77
- The system SHALL support updating task status with appropriate transitions.
78
-
79
- #### Scenario: Start task
80
- - **GIVEN** a task 'task_1' in 'assigned' status
81
- - **WHEN** updateStatus('task_1', 'in_progress') is called
82
- - **THEN** a task event with action 'status_change' is emitted
83
- - **AND** the task's status changes to 'in_progress'
84
- - **AND** started_at is set if not already set
85
-
86
- #### Scenario: Complete task
87
- - **GIVEN** a task 'task_1' in 'in_progress' status
88
- - **WHEN** updateStatus('task_1', 'completed') is called
89
- - **THEN** a task event with action 'completed' is emitted
90
- - **AND** the task's status changes to 'completed'
91
- - **AND** completed_at is set to current timestamp
92
-
93
- #### Scenario: Fail task
94
- - **GIVEN** a task 'task_1' in 'in_progress' status
95
- - **WHEN** updateStatus('task_1', 'failed') is called
96
- - **THEN** a task event with action 'failed' is emitted
97
- - **AND** the task's status changes to 'failed'
98
-
99
- ---
100
-
101
- ### Requirement: Task Updates
102
-
103
- The system SHALL support updating task metadata.
104
-
105
- #### Scenario: Update task outputs
106
- - **GIVEN** a task 'task_1' in 'in_progress' status
107
- - **WHEN** update('task_1', { outputs: { result: 'success', files_changed: 5 } }) is called
108
- - **THEN** the task's outputs are updated
109
- - **AND** the change is reflected in the tasks view
110
-
111
- #### Scenario: Add artifact to task
112
- - **GIVEN** a task 'task_1'
113
- - **WHEN** update('task_1', { artifacts: [{ type: 'file', ref: 'src/auth.ts' }] }) is called
114
- - **THEN** the artifact is added to the task's artifacts array
115
-
116
- ---
117
-
118
- ### Requirement: Subtask Management
119
-
120
- The system SHALL support hierarchical task decomposition.
121
-
122
- #### Scenario: Create subtask
123
- - **GIVEN** a parent task 'task_1'
124
- - **WHEN** createSubtask('task_1', { description: 'Implement JWT validation', created_by: 'manager_1' }) is called
125
- - **THEN** a new task is created with parent_task set to 'task_1'
126
- - **AND** the new task_id is added to task_1's subtasks array
127
-
128
- #### Scenario: Get subtasks
129
- - **GIVEN** task 'task_1' with subtasks 'task_2' and 'task_3'
130
- - **WHEN** getSubtasks('task_1') is called
131
- - **THEN** both 'task_2' and 'task_3' task records are returned
132
-
133
- #### Scenario: Subtask status rollup
134
- - **GIVEN** task 'task_1' with subtasks 'task_2' (completed) and 'task_3' (in_progress)
135
- - **WHEN** querying task 'task_1'
136
- - **THEN** the parent task can derive aggregate status from subtask statuses
@@ -1,147 +0,0 @@
1
- ## Phase 1: Foundation (Sequential) ✅ COMPLETE
2
-
3
- ### 1. Event Store
4
- - [x] 1.1 Set up TinyBase with SQLite persistence
5
- - [x] 1.2 Create events table schema (id, timestamp, type, source, target, payload, metadata)
6
- - [x] 1.3 Implement emit() function with auto-generated ID and timestamp
7
- - [x] 1.4 Implement query() function with type/source/time filtering
8
- - [x] 1.5 Create agents materialized view with projection logic
9
- - [x] 1.6 Create tasks materialized view with projection logic
10
- - [x] 1.7 Create messages materialized view (per-agent queues)
11
- - [x] 1.8 Create subscriptions materialized view
12
- - [x] 1.9 Implement subscribe() for reactive view updates
13
- - [x] 1.10 Write tests for event emission and view projections (27 tests passing)
14
-
15
- ---
16
-
17
- ## Phase 2: Core Managers (Parallel - 3 Streams)
18
-
19
- ### Stream A: Agent Manager ✅ COMPLETE
20
- - [x] 2A.1 Define AgentManager interface (spawn, terminate, get, list, getChildren, getHierarchy)
21
- - [x] 2A.2 Implement spawn() with ID generation and event emission
22
- - [x] 2A.3 Integrate with acp-factory for session creation
23
- - [x] 2A.4 Implement default subscription setup on spawn
24
- - [x] 2A.5 Implement terminate() with event emission and task status update
25
- - [x] 2A.6 Implement get() and list() queries from agents view
26
- - [x] 2A.7 Implement getChildren() and getHierarchy()
27
- - [x] 2A.8 Implement getOrCreateHeadManager()
28
- - [x] 2A.9 Implement system prompt generator with templates
29
- - [x] 2A.10 Write tests for agent lifecycle (29 tests passing)
30
-
31
- ### Stream B: Task Manager ✅ COMPLETE
32
- - [x] 2B.1 Define TaskManager interface (create, get, list, update, assign, updateStatus)
33
- - [x] 2B.2 Implement create() with ID generation and event emission
34
- - [x] 2B.3 Implement get() and list() queries from tasks view
35
- - [x] 2B.4 Implement assign() and unassign() with event emission
36
- - [x] 2B.5 Implement updateStatus() with valid transitions
37
- - [x] 2B.6 Implement update() for metadata (outputs, artifacts)
38
- - [x] 2B.7 Implement createSubtask() and getSubtasks()
39
- - [x] 2B.8 Write tests for task lifecycle (39 tests passing)
40
-
41
- ### Stream C: Message Router ✅ COMPLETE
42
- - [x] 2C.1 Define MessageRouter interface (send, getMessages, subscribe, unsubscribe)
43
- - [x] 2C.2 Implement send() with target resolution (agent, task, topic)
44
- - [x] 2C.3 Implement message queue routing logic
45
- - [x] 2C.4 Implement getMessages() with limit and getFullMessage()
46
- - [x] 2C.5 Implement subscribe() and unsubscribe() for topics
47
- - [x] 2C.6 Implement getSubscriptions()
48
- - [x] 2C.7 Implement automatic subscription setup helper
49
- - [x] 2C.8 Implement status event routing to subtree subscribers
50
- - [x] 2C.9 Implement message truncation for large content
51
- - [x] 2C.10 Write tests for message routing (35 tests passing)
52
-
53
- ---
54
-
55
- ## Phase 3: MCP Tools (Parallel - by tool) ✅ COMPLETE
56
-
57
- ### 3. MCP Server & Tools
58
- - [x] 3.1 Set up MCP server with tool registration
59
- - [x] 3.2 Implement tool context injection (agent_id, session_id)
60
- - [x] 3.3 Implement spawn_agent tool
61
- - [x] 3.4 Implement emit_status tool
62
- - [x] 3.5 Implement send_message tool
63
- - [x] 3.6 Implement check_messages tool
64
- - [x] 3.7 Implement query_index tool
65
- - [x] 3.8 Implement get_hierarchy tool
66
- - [x] 3.9 Implement get_agent_summary tool
67
- - [x] 3.10 Implement stop_agent tool (with subtree ownership check)
68
- - [x] 3.11 Implement create_task tool
69
- - [x] 3.12 Implement get_task tool
70
- - [x] 3.13 Write tests for all MCP tools (28 tests passing)
71
-
72
- ---
73
-
74
- ## Phase 4: API & CLI (Sequential) ✅ COMPLETE
75
-
76
- ### 4. API Layer
77
- - [x] 4.1 Set up Express/Fastify server
78
- - [x] 4.2 Implement POST /api/init
79
- - [x] 4.3 Implement GET /api/status
80
- - [x] 4.4 Implement POST /api/conversation/message
81
- - [x] 4.5 Implement GET /api/conversation/history
82
- - [x] 4.6 Implement GET /api/agents and /api/agents/:id
83
- - [x] 4.7 Implement GET /api/agents/:id/hierarchy
84
- - [x] 4.8 Implement GET /api/tasks and /api/tasks/:id
85
- - [x] 4.9 Implement GET /api/events with filters
86
- - [x] 4.10 Set up WebSocket server
87
- - [x] 4.11 Implement WebSocket subscription channels (agents, tasks, conversation)
88
- - [x] 4.12 Implement TinyBase → WebSocket bridge for real-time updates
89
- - [x] 4.13 Write tests for API endpoints (18 tests passing)
90
-
91
- ### 5. CLI
92
- - [x] 5.1 Set up CLI framework (Commander/Yargs)
93
- - [x] 5.2 Implement `multiagent start` command
94
- - [x] 5.3 Implement `multiagent chat` command with real-time updates
95
- - [x] 5.4 Implement `multiagent status` command
96
- - [x] 5.5 Implement `multiagent agents` and `multiagent agents <id>` commands
97
- - [x] 5.6 Implement `multiagent tasks` and `multiagent tasks <id>` commands
98
- - [x] 5.7 Implement `multiagent hierarchy` command with tree visualization
99
- - [x] 5.8 Implement `multiagent clear` command
100
- - [x] 5.9 Implement `multiagent stop` command
101
- - [x] 5.10 Write tests for CLI commands (included in API tests)
102
-
103
- ---
104
-
105
- ## Phase 5: Integration & Validation ✅ COMPLETE
106
-
107
- ### 6. End-to-End Integration
108
- - [x] 6.1 Integrate ACP wrapper with real Claude Code (already integrated via acp-factory)
109
- - [x] 6.2 End-to-end test: user → head manager → child agent → result (integration.test.ts - requires ANTHROPIC_API_KEY)
110
- - [x] 6.3 Test status flow from child to parent (Message Routing Integration test)
111
- - [x] 6.4 Test persistence across restart (Persistence test in integration.test.ts)
112
- - [x] 6.5 Fix integration bugs (async EventStore, spawn events for routing)
113
- - [x] 6.6 Update documentation
114
-
115
- ---
116
-
117
- ## Dependency Graph
118
-
119
- ```
120
- Phase 1: [1.1-1.10] Event Store
121
-
122
- ├─────────────────┬─────────────────┐
123
- ▼ ▼ ▼
124
- Phase 2: [2A.1-2A.10] [2B.1-2B.8] [2C.1-2C.10]
125
- Agent Manager Task Manager Message Router
126
- │ │ │
127
- └─────────────────┴─────────────────┘
128
-
129
-
130
- Phase 3: [3.1-3.13] MCP Tools
131
-
132
-
133
- Phase 4: [4.1-4.13] API Layer
134
-
135
-
136
- [5.1-5.10] CLI
137
-
138
-
139
- Phase 5: [6.1-6.6] Integration
140
- ```
141
-
142
- ## Parallelization Notes
143
-
144
- - **Phase 2 streams can run fully in parallel** once Phase 1 is complete
145
- - **Phase 3 tools can be partially parallelized** (tools 3.3-3.12 are independent once 3.1-3.2 done)
146
- - **Phase 4-5 are sequential** (CLI depends on API, API depends on MCP tools)
147
- - **Testing within each phase can run in parallel** with implementation