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
@@ -0,0 +1,608 @@
1
+ # Mail Protocol Integration Guide
2
+
3
+ This document describes how to integrate the MAP Mail Protocol into macro-agent, enabling structured conversation tracking across the agent hierarchy.
4
+
5
+ ## Background
6
+
7
+ ### What Mail Adds
8
+
9
+ macro-agent already coordinates multiple agents with message routing, status events, and lifecycle signals. Mail adds a **structured conversation layer** on top:
10
+
11
+ - **Conversations** — Named, stateful containers grouping related interactions (e.g., one per user session or delegated task)
12
+ - **Turns** — Ordered records of every message, status update, and tool call within a conversation
13
+ - **Threads** — Sub-conversations for branching discussions within a conversation
14
+ - **Participants** — Tracked membership with roles and permissions per conversation
15
+
16
+ Today, macro-agent's `conversationHistory[]` is a flat array on the API server with no structure. Internal agent-to-agent messages flow through the MessageRouter but aren't linked to any conversation context. Mail gives all of this a shared identity.
17
+
18
+ ### What Doesn't Change
19
+
20
+ - Agent spawning still uses acp-factory
21
+ - The role system (worker, integrator, coordinator, monitor) stays the same
22
+ - Workspace isolation and merge queue are unaffected
23
+ - MCP remains the agent-facing tool interface
24
+
25
+ ---
26
+
27
+ ## Current Architecture vs Mail
28
+
29
+ | macro-agent today | With mail | What changes |
30
+ |---|---|---|
31
+ | `conversationHistory[]` flat array | `Conversation` with ordered `Turn[]` | Structured, queryable, has lifecycle |
32
+ | `MessageRouter.send()` fire-and-forget | `send()` with `mail` meta → auto-recorded turn | Messages become conversation turns |
33
+ | `emit_status()` broadcast | `recordTurn(contentType: 'event')` | Status events linked to conversations |
34
+ | `correlation_id` for reply threading | `threadId` within conversation | Threads are first-class, nestable |
35
+ | `done()` summary string | `closeConversation()` with summary | Completion tied to conversation lifecycle |
36
+ | No cross-session history | `listTurns()`, `replayConversation()` | Full audit trail per conversation |
37
+
38
+ ---
39
+
40
+ ## Integration Strategy
41
+
42
+ The recommended approach is **incremental overlay** — keep the existing MessageRouter and EventStore, add mail as a parallel tracking layer. This avoids a risky rewrite while getting mail benefits immediately.
43
+
44
+ ### Dependencies
45
+
46
+ Add the MAP SDK as a dependency:
47
+
48
+ ```bash
49
+ npm install @anthropic-ai/multi-agent-protocol
50
+ ```
51
+
52
+ The key imports:
53
+
54
+ ```typescript
55
+ import {
56
+ MAPServer,
57
+ type ConversationManager,
58
+ type TurnManager,
59
+ type ThreadManager,
60
+ } from '@anthropic-ai/multi-agent-protocol/server';
61
+ ```
62
+
63
+ Or, if connecting to an external MAP server instead of embedding one:
64
+
65
+ ```typescript
66
+ import { AgentConnection } from '@anthropic-ai/multi-agent-protocol';
67
+ ```
68
+
69
+ ---
70
+
71
+ ## Phase 1: Conversation Lifecycle on API Server
72
+
73
+ **Goal**: Each user chat session gets a mail conversation. User messages and head manager responses become turns.
74
+
75
+ ### Changes to `src/api/server.ts`
76
+
77
+ Replace the flat `conversationHistory[]` with a mail-backed conversation:
78
+
79
+ ```typescript
80
+ // Before
81
+ interface ServerState {
82
+ conversationHistory: Array<{
83
+ role: 'user' | 'assistant';
84
+ content: string;
85
+ agent_id?: string;
86
+ timestamp: number;
87
+ }>;
88
+ }
89
+
90
+ // After
91
+ interface ServerState {
92
+ activeConversationId: string | null;
93
+ mailServer: MAPServer; // or external connection
94
+ }
95
+ ```
96
+
97
+ #### On system init (`POST /api/init`)
98
+
99
+ Create or configure the mail server:
100
+
101
+ ```typescript
102
+ const mailServer = new MAPServer({
103
+ name: 'macro-agent',
104
+ mail: { enabled: true },
105
+ });
106
+ ```
107
+
108
+ #### On user message (`POST /api/conversation/message`)
109
+
110
+ ```typescript
111
+ // Create conversation on first message (or reuse active one)
112
+ if (!state.activeConversationId) {
113
+ const result = await mailServer.conversations.create({
114
+ type: 'user-session',
115
+ subject: body.message.slice(0, 80),
116
+ createdBy: 'user',
117
+ });
118
+ state.activeConversationId = result.id;
119
+ }
120
+
121
+ // Record user message as turn
122
+ await mailServer.turns.add({
123
+ conversationId: state.activeConversationId,
124
+ participant: 'user',
125
+ contentType: 'text',
126
+ content: { text: body.message },
127
+ });
128
+
129
+ // ... prompt head manager ...
130
+
131
+ // Record assistant response as turn
132
+ await mailServer.turns.add({
133
+ conversationId: state.activeConversationId,
134
+ participant: state.headManagerId,
135
+ contentType: 'text',
136
+ content: { text: responseContent },
137
+ });
138
+ ```
139
+
140
+ #### On history query (`GET /api/conversation/history`)
141
+
142
+ ```typescript
143
+ const { turns } = await mailServer.turns.list(
144
+ state.activeConversationId,
145
+ { order: 'asc', limit, offset }
146
+ );
147
+ ```
148
+
149
+ ### New module: `src/mail/mail-service.ts`
150
+
151
+ A thin wrapper that owns the MAPServer instance and exposes conversation operations:
152
+
153
+ ```typescript
154
+ export interface MailService {
155
+ /** Create a new conversation */
156
+ createConversation(opts: {
157
+ type: string;
158
+ subject: string;
159
+ createdBy: string;
160
+ parentConversationId?: string;
161
+ }): Promise<{ conversationId: string }>;
162
+
163
+ /** Record a turn */
164
+ recordTurn(opts: {
165
+ conversationId: string;
166
+ participant: string;
167
+ contentType: string;
168
+ content: unknown;
169
+ threadId?: string;
170
+ }): Promise<{ turnId: string }>;
171
+
172
+ /** Close a conversation */
173
+ closeConversation(opts: {
174
+ conversationId: string;
175
+ closedBy: string;
176
+ summary?: string;
177
+ }): Promise<void>;
178
+
179
+ /** List turns for a conversation */
180
+ listTurns(conversationId: string, opts?: {
181
+ limit?: number;
182
+ order?: 'asc' | 'desc';
183
+ threadId?: string;
184
+ }): Promise<Turn[]>;
185
+
186
+ /** Get or create conversation for a session */
187
+ getOrCreateSessionConversation(sessionKey: string): Promise<string>;
188
+ }
189
+ ```
190
+
191
+ This keeps the rest of macro-agent decoupled from MAP internals.
192
+
193
+ ---
194
+
195
+ ## Phase 2: Mail Context in MessageRouter
196
+
197
+ **Goal**: When messages flow between agents, mail context (conversationId, threadId) travels with them. Turns are auto-recorded.
198
+
199
+ ### Changes to `src/router/types.ts`
200
+
201
+ Add mail context to the message types:
202
+
203
+ ```typescript
204
+ export interface SendMessageRequest {
205
+ from: MessageSender;
206
+ to: MessageTarget;
207
+ content: string;
208
+ correlation_id?: string;
209
+ priority?: MessagePriority;
210
+ // New: mail context
211
+ mail?: {
212
+ conversationId: string;
213
+ threadId?: string;
214
+ };
215
+ }
216
+
217
+ export interface SentMessage {
218
+ id: EventId;
219
+ from: MessageSender;
220
+ to: MessageTarget;
221
+ content: string;
222
+ timestamp: Timestamp;
223
+ correlation_id?: string;
224
+ // New: mail context preserved
225
+ mail?: {
226
+ conversationId: string;
227
+ threadId?: string;
228
+ };
229
+ }
230
+
231
+ export interface ReceivedMessage {
232
+ id: EventId;
233
+ from: EventSource;
234
+ content: string;
235
+ timestamp: Timestamp;
236
+ truncated: boolean;
237
+ correlation_id?: string;
238
+ // New: mail context for receivers
239
+ mail?: {
240
+ conversationId: string;
241
+ threadId?: string;
242
+ };
243
+ }
244
+ ```
245
+
246
+ ### Changes to `src/router/message-router.ts`
247
+
248
+ In the `send()` method, after routing the message, record a turn if mail context is present:
249
+
250
+ ```typescript
251
+ async send(request: SendMessageRequest): Promise<SentMessage> {
252
+ // ... existing routing logic ...
253
+
254
+ // Record turn if mail context present
255
+ if (request.mail?.conversationId && this.mailService) {
256
+ try {
257
+ await this.mailService.recordTurn({
258
+ conversationId: request.mail.conversationId,
259
+ participant: request.from.agent_id,
260
+ contentType: 'data',
261
+ content: { message: request.content },
262
+ threadId: request.mail.threadId,
263
+ });
264
+ } catch (err) {
265
+ // Never fail message delivery due to mail errors
266
+ console.warn('Mail turn recording failed:', err);
267
+ }
268
+ }
269
+
270
+ return sentMessage;
271
+ }
272
+ ```
273
+
274
+ The `mail` field flows through to `ReceivedMessage` so receiving agents can see and forward it.
275
+
276
+ ### Conversation-per-Task Pattern
277
+
278
+ When a coordinator spawns a worker for a task, create a child conversation:
279
+
280
+ ```typescript
281
+ // In agent-manager.ts spawn()
282
+ if (parentMailContext?.conversationId && this.mailService) {
283
+ const child = await this.mailService.createConversation({
284
+ type: 'agent-task',
285
+ subject: taskDescription,
286
+ createdBy: parentAgentId,
287
+ parentConversationId: parentMailContext.conversationId,
288
+ });
289
+ // Attach to the spawned agent's context
290
+ agentMailContext.set(newAgentId, {
291
+ conversationId: child.conversationId,
292
+ });
293
+ }
294
+ ```
295
+
296
+ This creates a conversation tree:
297
+ ```
298
+ User Session (conv-001)
299
+ ├── Head Manager delegates to Worker A (conv-002)
300
+ │ └── Worker A's tool calls and results
301
+ ├── Head Manager delegates to Worker B (conv-003)
302
+ │ └── Worker B's tool calls and results
303
+ └── Head Manager final response
304
+ ```
305
+
306
+ ---
307
+
308
+ ## Phase 3: MCP Tool Updates
309
+
310
+ **Goal**: Agents can interact with mail through their existing MCP tool interface.
311
+
312
+ ### Update `send_message` tool
313
+
314
+ Add optional mail fields:
315
+
316
+ ```typescript
317
+ const SendMessageSchema = {
318
+ to: z.object({
319
+ agent_id: z.string().optional(),
320
+ task_id: z.string().optional(),
321
+ topic: z.string().optional(),
322
+ }).describe('Message target'),
323
+ content: z.string().describe('Message content'),
324
+ correlation_id: z.string().optional(),
325
+ // New
326
+ conversation_id: z.string().optional()
327
+ .describe('Conversation ID for mail tracking (auto-set if in conversation context)'),
328
+ thread_id: z.string().optional()
329
+ .describe('Thread ID within conversation'),
330
+ };
331
+ ```
332
+
333
+ The handler auto-injects conversation context from the agent's current context if not explicitly provided:
334
+
335
+ ```typescript
336
+ // In send_message handler
337
+ const mailContext = args.conversation_id
338
+ ? { conversationId: args.conversation_id, threadId: args.thread_id }
339
+ : agentMailContext.get(context.agent_id); // auto from spawn context
340
+
341
+ await messageRouter.send({
342
+ from: { agent_id: context.agent_id },
343
+ to: args.to,
344
+ content: args.content,
345
+ correlation_id: args.correlation_id,
346
+ mail: mailContext,
347
+ });
348
+ ```
349
+
350
+ ### Update `check_messages` tool
351
+
352
+ Return mail context so agents can forward it:
353
+
354
+ ```typescript
355
+ // In response formatting
356
+ messages.map(msg => ({
357
+ id: msg.id,
358
+ from: msg.from,
359
+ content: msg.content,
360
+ timestamp: msg.timestamp,
361
+ conversation_id: msg.mail?.conversationId, // New
362
+ thread_id: msg.mail?.threadId, // New
363
+ }));
364
+ ```
365
+
366
+ ### New `record_observation` tool
367
+
368
+ For Level 2 (conversation-aware) agents that want to record non-message turns:
369
+
370
+ ```typescript
371
+ const RecordObservationSchema = {
372
+ content_type: z.enum(['event', 'tool_call', 'tool_result', 'text'])
373
+ .describe('Type of observation'),
374
+ content: z.record(z.string(), z.unknown())
375
+ .describe('Observation content'),
376
+ conversation_id: z.string().optional()
377
+ .describe('Conversation ID (defaults to agent context)'),
378
+ };
379
+ ```
380
+
381
+ This lets agents record tool calls, intermediate results, or status changes as conversation turns without sending messages.
382
+
383
+ ### Update `done()` tool
384
+
385
+ When an agent completes, close its conversation:
386
+
387
+ ```typescript
388
+ // In done handler, after existing logic
389
+ const agentConvId = agentMailContext.get(context.agent_id);
390
+ if (agentConvId && mailService) {
391
+ // Record completion turn
392
+ await mailService.recordTurn({
393
+ conversationId: agentConvId,
394
+ participant: context.agent_id,
395
+ contentType: 'event',
396
+ content: {
397
+ event: `agent.${args.status}`,
398
+ summary: args.summary,
399
+ details: args.details,
400
+ },
401
+ });
402
+
403
+ // Close the conversation
404
+ await mailService.closeConversation({
405
+ conversationId: agentConvId,
406
+ closedBy: context.agent_id,
407
+ summary: args.summary,
408
+ });
409
+ }
410
+ ```
411
+
412
+ ---
413
+
414
+ ## Phase 4: Agent System Prompt Updates
415
+
416
+ **Goal**: Agents understand mail context and forward it naturally.
417
+
418
+ ### Changes to `src/agent/system-prompt.ts`
419
+
420
+ Add a mail section to the system prompt for agents that may receive mail context:
421
+
422
+ #### Workers (Level 1 — pass-through)
423
+
424
+ ```
425
+ ## Message Context
426
+
427
+ Messages you receive may include a `conversation_id` field. This tracks the
428
+ conversation this work belongs to. When replying or sending messages, include
429
+ the same `conversation_id` to maintain the conversation chain:
430
+
431
+ send_message({ to: { agent_id: "..." }, content: "...", conversation_id: "<from received message>" })
432
+
433
+ If no conversation_id is present, omit it — your message will still be delivered normally.
434
+ ```
435
+
436
+ #### Coordinators (Level 3 — orchestrator)
437
+
438
+ ```
439
+ ## Conversation Tracking
440
+
441
+ When you spawn workers or delegate tasks, the system automatically creates
442
+ child conversations to track their work. You can:
443
+
444
+ - Use `record_observation` to log planning decisions or intermediate analysis
445
+ - Check conversation history via the conversation_id in status updates
446
+ - The `done()` call automatically closes the agent's conversation
447
+
448
+ All agent interactions within a task are recorded as conversation turns,
449
+ giving you a full audit trail of delegated work.
450
+ ```
451
+
452
+ ---
453
+
454
+ ## Phase 5: WebSocket/Observer Integration
455
+
456
+ **Goal**: Dashboard clients can watch conversation turns in real-time.
457
+
458
+ ### Changes to `src/api/server.ts` (WebSocket handling)
459
+
460
+ Add a `conversation` subscription channel that forwards mail events:
461
+
462
+ ```typescript
463
+ // New WebSocket message types
464
+ type WSMessageType =
465
+ | 'subscribe' | 'unsubscribe'
466
+ | 'agent_update' | 'task_update'
467
+ | 'message' | 'status' | 'error'
468
+ | 'turn_added' // New
469
+ | 'conversation_update' // New
470
+ ;
471
+ ```
472
+
473
+ When mail events fire, broadcast to subscribed WebSocket clients:
474
+
475
+ ```typescript
476
+ mailServer.eventBus.on('mail.turn.added', (event) => {
477
+ broadcast(`conversation:${event.data.conversationId}`, {
478
+ type: 'turn_added',
479
+ data: event.data.turn,
480
+ });
481
+ });
482
+
483
+ mailServer.eventBus.on('mail.closed', (event) => {
484
+ broadcast(`conversation:${event.data.conversationId}`, {
485
+ type: 'conversation_update',
486
+ data: { status: 'closed', summary: event.data.summary },
487
+ });
488
+ });
489
+ ```
490
+
491
+ ### New REST endpoints
492
+
493
+ ```
494
+ GET /api/conversations List conversations
495
+ GET /api/conversations/:id Get conversation details
496
+ GET /api/conversations/:id/turns List turns (paginated)
497
+ GET /api/conversations/:id/threads List threads
498
+ POST /api/conversations/:id/close Close a conversation
499
+ ```
500
+
501
+ ---
502
+
503
+ ## Data Flow: Complete Example
504
+
505
+ Here's how a user request flows through the system with mail enabled:
506
+
507
+ ```
508
+ 1. User sends "Refactor the auth module" via POST /api/conversation/message
509
+
510
+ 2. API Server:
511
+ - Creates conversation conv-001 (type: user-session)
512
+ - Records Turn 1: user text "Refactor the auth module"
513
+ - Prompts Head Manager with mail context { conversationId: conv-001 }
514
+
515
+ 3. Head Manager (coordinator):
516
+ - Spawns Worker A for "analyze current auth code"
517
+ → Creates child conversation conv-002 (parent: conv-001)
518
+ - Spawns Worker B for "write new auth implementation"
519
+ → Creates child conversation conv-003 (parent: conv-001)
520
+ - Records Turn 2: event { plan: "split into analyze + implement" }
521
+
522
+ 4. Worker A receives message with { conversationId: conv-002 }:
523
+ - Records Turn: event { tool: "file_read", file: "src/auth.ts" }
524
+ - Records Turn: event { analysis: "found 3 issues..." }
525
+ - Calls done(status: "completed", summary: "Analysis complete")
526
+ → Records completion turn, closes conv-002
527
+ - Sends results back to Head Manager with mail context
528
+
529
+ 5. Head Manager receives Worker A results:
530
+ - Turn auto-recorded in conv-001 (intercepted from message)
531
+ - Forwards analysis to Worker B via message with conv-003 context
532
+
533
+ 6. Worker B completes implementation:
534
+ - Records tool call turns in conv-003
535
+ - Calls done() → closes conv-003
536
+
537
+ 7. Head Manager compiles final response:
538
+ - Records Turn: text "Refactored auth module. Changes: ..."
539
+ - Response returned to API Server
540
+
541
+ 8. API Server:
542
+ - Records Turn: assistant response in conv-001
543
+ - Returns response to user
544
+
545
+ Conversation tree:
546
+ conv-001 (user-session): 5 turns
547
+ ├── conv-002 (agent-task: analyze): 4 turns
548
+ └── conv-003 (agent-task: implement): 6 turns
549
+ ```
550
+
551
+ ---
552
+
553
+ ## File Change Summary
554
+
555
+ | Phase | File | Change |
556
+ |---|---|---|
557
+ | 1 | `package.json` | Add `@anthropic-ai/multi-agent-protocol` dependency |
558
+ | 1 | `src/mail/mail-service.ts` | **New** — MailService wrapper around MAPServer |
559
+ | 1 | `src/mail/index.ts` | **New** — Barrel export |
560
+ | 1 | `src/api/server.ts` | Replace `conversationHistory[]` with mail-backed conversations |
561
+ | 2 | `src/router/types.ts` | Add `mail` field to message types |
562
+ | 2 | `src/router/message-router.ts` | Record turns on send when mail context present |
563
+ | 2 | `src/agent/agent-manager.ts` | Create child conversations on spawn, track agent mail context |
564
+ | 3 | `src/mcp/mcp-server.ts` | Add mail fields to send_message, check_messages; add record_observation tool |
565
+ | 3 | `src/mcp/tools/done.ts` | Record completion turn and close conversation on done() |
566
+ | 4 | `src/agent/system-prompt.ts` | Add mail context instructions per role |
567
+ | 5 | `src/api/server.ts` | Add conversation WebSocket channels and REST endpoints |
568
+ | 5 | `src/api/types.ts` | Add conversation-related API types |
569
+
570
+ ---
571
+
572
+ ## Configuration
573
+
574
+ Mail is opt-in. Add to macro-agent's config:
575
+
576
+ ```typescript
577
+ interface MacroAgentConfig {
578
+ // ... existing config ...
579
+
580
+ /** Enable mail conversation tracking */
581
+ mail?: {
582
+ enabled: boolean;
583
+ /** Connect to external MAP server instead of embedding one */
584
+ serverUrl?: string;
585
+ /** Custom stores for persistence (default: in-memory) */
586
+ stores?: {
587
+ conversations?: ConversationStore;
588
+ turns?: TurnStore;
589
+ threads?: ThreadStore;
590
+ };
591
+ };
592
+ }
593
+ ```
594
+
595
+ When `mail.enabled` is false (default), all mail code paths are no-ops and no conversations are created.
596
+
597
+ ---
598
+
599
+ ## Testing Strategy
600
+
601
+ | Test | What it validates |
602
+ |---|---|
603
+ | `mail-service.test.ts` | MailService CRUD operations |
604
+ | `message-router.test.ts` | Existing tests still pass; new tests for mail context propagation |
605
+ | `api-server.test.ts` | Conversation endpoints return correct turns |
606
+ | `done.test.ts` | done() records completion turn and closes conversation |
607
+ | `mcp-server.test.ts` | send_message passes mail context; record_observation works |
608
+ | `integration.test.ts` | Full flow: user message → spawn → worker done → conversation tree |