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,328 @@
1
+ /**
2
+ * TurnRecorder Tests
3
+ *
4
+ * Tests for hierarchy-aware conversation resolution and turn recording.
5
+ */
6
+
7
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
8
+ import { createEventStore, type EventStore } from "../../store/event-store.js";
9
+ import { createMailService, type MailService } from "../mail-service.js";
10
+ import { createConversationMap, type ConversationMap } from "../conversation-map.js";
11
+ import { createTurnRecorder } from "../turn-recorder.js";
12
+ import type { TurnRecorderCallback, TurnRecordInfo } from "../../router/types.js";
13
+ import type { AgentId, EventId } from "../../store/types/index.js";
14
+
15
+ describe("TurnRecorder", () => {
16
+ let eventStore: EventStore;
17
+ let mailService: MailService;
18
+ let conversationMap: ConversationMap;
19
+ let turnRecorder: TurnRecorderCallback;
20
+
21
+ beforeEach(async () => {
22
+ eventStore = await createEventStore({ inMemory: true });
23
+ mailService = createMailService({ eventStore });
24
+ conversationMap = createConversationMap();
25
+ turnRecorder = createTurnRecorder({ mailService, conversationMap, eventStore });
26
+ });
27
+
28
+ afterEach(async () => {
29
+ await eventStore.close();
30
+ });
31
+
32
+ // Helper: create a spawned agent in EventStore
33
+ function spawnAgent(agentId: string, parentId?: string): void {
34
+ eventStore.emit({
35
+ type: "spawn",
36
+ source: { agent_id: (parentId ?? agentId) as AgentId },
37
+ payload: {
38
+ agent_id: agentId,
39
+ session_id: `session-${agentId}`,
40
+ task: `Task for ${agentId}`,
41
+ parent: parentId ?? null,
42
+ lineage: parentId ? [parentId] : [],
43
+ role: "worker",
44
+ },
45
+ });
46
+ }
47
+
48
+ // Helper: set up a task conversation for an agent
49
+ function setupTaskConversation(agentId: string, parentId: string): string {
50
+ const { conversationId } = mailService.createConversation({
51
+ type: "task",
52
+ subject: `Task conversation for ${agentId}`,
53
+ createdBy: parentId,
54
+ });
55
+ mailService.joinConversation({
56
+ conversationId,
57
+ participantId: parentId,
58
+ role: "initiator",
59
+ });
60
+ mailService.joinConversation({
61
+ conversationId,
62
+ participantId: agentId,
63
+ role: "worker",
64
+ });
65
+ conversationMap.setAgentConversation(agentId, conversationId);
66
+ return conversationId;
67
+ }
68
+
69
+ describe("Parent → Child resolution", () => {
70
+ it("should record turn in child's task conversation when parent sends to child", () => {
71
+ spawnAgent("parent-1");
72
+ spawnAgent("child-1", "parent-1");
73
+ const taskConvId = setupTaskConversation("child-1", "parent-1");
74
+
75
+ turnRecorder({
76
+ from: "parent-1" as AgentId,
77
+ toAgent: "child-1" as AgentId,
78
+ content: "Hello child",
79
+ messageId: "msg-1" as EventId,
80
+ addressType: "agent",
81
+ });
82
+
83
+ const turns = mailService.listTurns({ conversationId: taskConvId });
84
+ expect(turns).toHaveLength(1);
85
+ expect(turns[0].participant).toBe("parent-1");
86
+ expect(turns[0].content).toBe("Hello child");
87
+ expect(turns[0].sourceType).toBe("intercepted");
88
+ expect(turns[0].sourceMessageId).toBe("msg-1");
89
+ });
90
+ });
91
+
92
+ describe("Child → Parent resolution", () => {
93
+ it("should record turn in child's task conversation when child sends to parent", () => {
94
+ spawnAgent("parent-1");
95
+ spawnAgent("child-1", "parent-1");
96
+ const taskConvId = setupTaskConversation("child-1", "parent-1");
97
+
98
+ turnRecorder({
99
+ from: "child-1" as AgentId,
100
+ toAgent: "parent-1" as AgentId,
101
+ content: "Hello parent",
102
+ messageId: "msg-2" as EventId,
103
+ addressType: "agent",
104
+ });
105
+
106
+ const turns = mailService.listTurns({ conversationId: taskConvId });
107
+ expect(turns).toHaveLength(1);
108
+ expect(turns[0].participant).toBe("child-1");
109
+ expect(turns[0].content).toBe("Hello parent");
110
+ });
111
+ });
112
+
113
+ describe("Peer resolution", () => {
114
+ it("should auto-create peer conversation when peers message each other", () => {
115
+ spawnAgent("parent-1");
116
+ spawnAgent("peer-a", "parent-1");
117
+ spawnAgent("peer-b", "parent-1");
118
+
119
+ // Set up parent's task conversation so it can be used as parentConversationId
120
+ const parentConvId = setupTaskConversation("parent-1", "parent-1");
121
+
122
+ // peer-a sends to peer-b (neither is the other's parent)
123
+ turnRecorder({
124
+ from: "peer-a" as AgentId,
125
+ toAgent: "peer-b" as AgentId,
126
+ content: "Hey peer",
127
+ messageId: "msg-3" as EventId,
128
+ addressType: "agent",
129
+ });
130
+
131
+ // A peer conversation should have been auto-created
132
+ const peerConvId = conversationMap.getPeerConversation("peer-a", "peer-b");
133
+ expect(peerConvId).toBeDefined();
134
+
135
+ const turns = mailService.listTurns({ conversationId: peerConvId! });
136
+ expect(turns).toHaveLength(1);
137
+ expect(turns[0].participant).toBe("peer-a");
138
+ expect(turns[0].content).toBe("Hey peer");
139
+
140
+ // Verify peer conversation was created properly
141
+ const conv = mailService.getConversation(peerConvId!);
142
+ expect(conv).not.toBeNull();
143
+ expect(conv!.type).toBe("peer");
144
+
145
+ // Verify parentConversationId is set to nearest common ancestor's conversation
146
+ expect(conv!.parentConversationId).toBe(parentConvId);
147
+ });
148
+
149
+ it("should set parentConversationId to nearest common ancestor in deep hierarchy", () => {
150
+ // grandparent → parent-a → peer-a
151
+ // grandparent → parent-b → peer-b
152
+ spawnAgent("grandparent");
153
+ spawnAgent("parent-a", "grandparent");
154
+ spawnAgent("parent-b", "grandparent");
155
+ spawnAgent("peer-a", "parent-a");
156
+ spawnAgent("peer-b", "parent-b");
157
+
158
+ // Set up conversations for ancestors
159
+ const gpConvId = setupTaskConversation("grandparent", "grandparent");
160
+ setupTaskConversation("parent-a", "grandparent");
161
+ setupTaskConversation("parent-b", "grandparent");
162
+
163
+ turnRecorder({
164
+ from: "peer-a" as AgentId,
165
+ toAgent: "peer-b" as AgentId,
166
+ content: "Deep peer message",
167
+ messageId: "msg-deep" as EventId,
168
+ addressType: "agent",
169
+ });
170
+
171
+ const peerConvId = conversationMap.getPeerConversation("peer-a", "peer-b");
172
+ const conv = mailService.getConversation(peerConvId!);
173
+ // Nearest common ancestor is grandparent
174
+ expect(conv!.parentConversationId).toBe(gpConvId);
175
+ });
176
+
177
+ it("should leave parentConversationId undefined when peers share no ancestor", () => {
178
+ // Two root agents with no common parent
179
+ spawnAgent("root-a");
180
+ spawnAgent("root-b");
181
+
182
+ turnRecorder({
183
+ from: "root-a" as AgentId,
184
+ toAgent: "root-b" as AgentId,
185
+ content: "No ancestor",
186
+ messageId: "msg-no-ancestor" as EventId,
187
+ addressType: "agent",
188
+ });
189
+
190
+ const peerConvId = conversationMap.getPeerConversation("root-a", "root-b");
191
+ const conv = mailService.getConversation(peerConvId!);
192
+ expect(conv!.parentConversationId).toBeUndefined();
193
+ });
194
+
195
+ it("should reuse peer conversation for subsequent messages", () => {
196
+ spawnAgent("parent-1");
197
+ spawnAgent("peer-a", "parent-1");
198
+ spawnAgent("peer-b", "parent-1");
199
+
200
+ // First message
201
+ turnRecorder({
202
+ from: "peer-a" as AgentId,
203
+ toAgent: "peer-b" as AgentId,
204
+ content: "First message",
205
+ messageId: "msg-4" as EventId,
206
+ addressType: "agent",
207
+ });
208
+
209
+ // Second message (reverse direction)
210
+ turnRecorder({
211
+ from: "peer-b" as AgentId,
212
+ toAgent: "peer-a" as AgentId,
213
+ content: "Reply",
214
+ messageId: "msg-5" as EventId,
215
+ addressType: "agent",
216
+ });
217
+
218
+ const peerConvId = conversationMap.getPeerConversation("peer-a", "peer-b");
219
+ const turns = mailService.listTurns({ conversationId: peerConvId! });
220
+ expect(turns).toHaveLength(2);
221
+ expect(turns[0].participant).toBe("peer-a");
222
+ expect(turns[1].participant).toBe("peer-b");
223
+ });
224
+ });
225
+
226
+ describe("Task address resolution", () => {
227
+ it("should handle task address type the same as agent address", () => {
228
+ spawnAgent("parent-1");
229
+ spawnAgent("child-1", "parent-1");
230
+ const taskConvId = setupTaskConversation("child-1", "parent-1");
231
+
232
+ turnRecorder({
233
+ from: "parent-1" as AgentId,
234
+ toAgent: "child-1" as AgentId,
235
+ content: "Task message",
236
+ messageId: "msg-6" as EventId,
237
+ addressType: "task",
238
+ });
239
+
240
+ const turns = mailService.listTurns({ conversationId: taskConvId });
241
+ expect(turns).toHaveLength(1);
242
+ expect(turns[0].content).toBe("Task message");
243
+ });
244
+ });
245
+
246
+ describe("Edge cases", () => {
247
+ it("should silently skip when sender agent not found", () => {
248
+ spawnAgent("child-1");
249
+
250
+ // This should not throw
251
+ turnRecorder({
252
+ from: "nonexistent" as AgentId,
253
+ toAgent: "child-1" as AgentId,
254
+ content: "Hello",
255
+ messageId: "msg-7" as EventId,
256
+ addressType: "agent",
257
+ });
258
+
259
+ // No conversations should have been created
260
+ expect(conversationMap.getPeerConversation("nonexistent", "child-1")).toBeUndefined();
261
+ });
262
+
263
+ it("should silently skip when receiver agent not found", () => {
264
+ spawnAgent("sender-1");
265
+
266
+ turnRecorder({
267
+ from: "sender-1" as AgentId,
268
+ toAgent: "nonexistent" as AgentId,
269
+ content: "Hello",
270
+ messageId: "msg-8" as EventId,
271
+ addressType: "agent",
272
+ });
273
+
274
+ expect(conversationMap.getPeerConversation("sender-1", "nonexistent")).toBeUndefined();
275
+ });
276
+
277
+ it("should skip when child has no task conversation and parent sends", () => {
278
+ spawnAgent("parent-1");
279
+ spawnAgent("child-1", "parent-1");
280
+ // No task conversation set up
281
+
282
+ turnRecorder({
283
+ from: "parent-1" as AgentId,
284
+ toAgent: "child-1" as AgentId,
285
+ content: "Hello",
286
+ messageId: "msg-9" as EventId,
287
+ addressType: "agent",
288
+ });
289
+
290
+ // No error should have been thrown, and no turns recorded anywhere
291
+ // (resolveConversation returns null)
292
+ });
293
+
294
+ it("should handle multiple children correctly", () => {
295
+ spawnAgent("parent-1");
296
+ spawnAgent("child-a", "parent-1");
297
+ spawnAgent("child-b", "parent-1");
298
+
299
+ const convA = setupTaskConversation("child-a", "parent-1");
300
+ const convB = setupTaskConversation("child-b", "parent-1");
301
+
302
+ // Message to child-a
303
+ turnRecorder({
304
+ from: "parent-1" as AgentId,
305
+ toAgent: "child-a" as AgentId,
306
+ content: "To child A",
307
+ messageId: "msg-10" as EventId,
308
+ addressType: "agent",
309
+ });
310
+
311
+ // Message to child-b
312
+ turnRecorder({
313
+ from: "parent-1" as AgentId,
314
+ toAgent: "child-b" as AgentId,
315
+ content: "To child B",
316
+ messageId: "msg-11" as EventId,
317
+ addressType: "agent",
318
+ });
319
+
320
+ const turnsA = mailService.listTurns({ conversationId: convA });
321
+ const turnsB = mailService.listTurns({ conversationId: convB });
322
+ expect(turnsA).toHaveLength(1);
323
+ expect(turnsA[0].content).toBe("To child A");
324
+ expect(turnsB).toHaveLength(1);
325
+ expect(turnsB[0].content).toBe("To child B");
326
+ });
327
+ });
328
+ });
@@ -0,0 +1,107 @@
1
+ /**
2
+ * ConversationMap — Agent-to-conversation tracking.
3
+ *
4
+ * Maps agents to their active conversations and manages peer
5
+ * conversation indexing. In-memory, reconstructible from EventStore.
6
+ */
7
+
8
+ import type { AgentId } from "../store/types/index.js";
9
+
10
+ export interface ConversationMap {
11
+ /** Set the task conversation for an agent. */
12
+ setAgentConversation(agentId: AgentId, conversationId: string): void;
13
+
14
+ /** Get the task conversation for an agent. */
15
+ getAgentConversation(agentId: AgentId): string | undefined;
16
+
17
+ /** Remove an agent from the map. */
18
+ removeAgent(agentId: AgentId): void;
19
+
20
+ /** Set the session conversation for a head manager. */
21
+ setSessionConversation(headManagerId: AgentId, conversationId: string): void;
22
+
23
+ /** Get the session conversation for a head manager. */
24
+ getSessionConversation(headManagerId: AgentId): string | undefined;
25
+
26
+ /**
27
+ * Get or create a peer conversation between two agents.
28
+ * Uses sorted agent pair as key to ensure consistency.
29
+ */
30
+ getOrCreatePeerConversation(
31
+ agentA: AgentId,
32
+ agentB: AgentId,
33
+ createFn: () => string
34
+ ): string;
35
+
36
+ /** Get the peer conversation ID for two agents (if exists). */
37
+ getPeerConversation(agentA: AgentId, agentB: AgentId): string | undefined;
38
+
39
+ /** Close all peer conversations for an agent. Returns closed conversation IDs. */
40
+ closePeerConversationsFor(agentId: AgentId): string[];
41
+ }
42
+
43
+ /**
44
+ * Create a ConversationMap instance.
45
+ */
46
+ export function createConversationMap(): ConversationMap {
47
+ // Agent ID → task conversation ID
48
+ const agentConversations = new Map<AgentId, string>();
49
+
50
+ // Head manager ID → session conversation ID
51
+ const sessionConversations = new Map<AgentId, string>();
52
+
53
+ // Sorted agent pair key → peer conversation ID
54
+ const peerConversations = new Map<string, string>();
55
+
56
+ function peerKey(a: AgentId, b: AgentId): string {
57
+ return a < b ? `${a}:${b}` : `${b}:${a}`;
58
+ }
59
+
60
+ return {
61
+ setAgentConversation(agentId, conversationId) {
62
+ agentConversations.set(agentId, conversationId);
63
+ },
64
+
65
+ getAgentConversation(agentId) {
66
+ return agentConversations.get(agentId);
67
+ },
68
+
69
+ removeAgent(agentId) {
70
+ agentConversations.delete(agentId);
71
+ },
72
+
73
+ setSessionConversation(headManagerId, conversationId) {
74
+ sessionConversations.set(headManagerId, conversationId);
75
+ },
76
+
77
+ getSessionConversation(headManagerId) {
78
+ return sessionConversations.get(headManagerId);
79
+ },
80
+
81
+ getOrCreatePeerConversation(agentA, agentB, createFn) {
82
+ const key = peerKey(agentA, agentB);
83
+ let convId = peerConversations.get(key);
84
+ if (!convId) {
85
+ convId = createFn();
86
+ peerConversations.set(key, convId);
87
+ }
88
+ return convId;
89
+ },
90
+
91
+ getPeerConversation(agentA, agentB) {
92
+ return peerConversations.get(peerKey(agentA, agentB));
93
+ },
94
+
95
+ closePeerConversationsFor(agentId) {
96
+ const closed: string[] = [];
97
+ for (const [key, convId] of peerConversations) {
98
+ const [a, b] = key.split(':');
99
+ if (a === agentId || b === agentId) {
100
+ closed.push(convId);
101
+ peerConversations.delete(key);
102
+ }
103
+ }
104
+ return closed;
105
+ },
106
+ };
107
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Mail module — structured conversation tracking for macro-agent.
3
+ *
4
+ * Provides MAP-compatible mail stores backed by the EventStore,
5
+ * and the MailService facade for conversation lifecycle management.
6
+ */
7
+
8
+ export * from "./stores/index.js";
9
+ export {
10
+ createMailService,
11
+ type MailService,
12
+ type MailServiceConfig,
13
+ type CreateConversationOptions,
14
+ type RecordTurnOptions,
15
+ type CloseConversationOptions,
16
+ type JoinConversationOptions,
17
+ } from "./mail-service.js";
18
+ export {
19
+ createConversationMap,
20
+ type ConversationMap,
21
+ } from "./conversation-map.js";
22
+ export {
23
+ createTurnRecorder,
24
+ type TurnRecorderDeps,
25
+ } from "./turn-recorder.js";