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,173 @@
1
+ /**
2
+ * EventStore-backed TurnStore adapter.
3
+ *
4
+ * Implements the MAP-compatible TurnStore interface by:
5
+ * - append() → emits a `turn` event with action `recorded`
6
+ * - get()/list() → reads from EventStore materialized views
7
+ * - count() → counts turns in materialized view
8
+ *
9
+ * Supports cursor-based pagination and timestamp range queries
10
+ * by post-filtering EventStore results.
11
+ */
12
+
13
+ import type { EventStore } from "../../store/event-store.js";
14
+ import type { TurnStore, ServerTurn, MAPTurnFilter } from "./types.js";
15
+ import type { ConversationTurn, TurnFilter } from "../../store/types/index.js";
16
+
17
+ /**
18
+ * Convert internal ConversationTurn to MAP ServerTurn.
19
+ */
20
+ function toServerTurn(turn: ConversationTurn): ServerTurn {
21
+ return {
22
+ id: turn.id,
23
+ conversationId: turn.conversationId,
24
+ participant: turn.participant,
25
+ timestamp: turn.timestamp,
26
+ contentType: turn.contentType,
27
+ content: turn.content,
28
+ threadId: turn.threadId,
29
+ inReplyTo: turn.inReplyTo,
30
+ source:
31
+ turn.sourceType === "intercepted" && turn.sourceMessageId
32
+ ? { type: "intercepted", messageId: turn.sourceMessageId }
33
+ : { type: "explicit", method: "mail/turn" },
34
+ metadata: turn.metadata ?? {},
35
+ };
36
+ }
37
+
38
+ export class EventStoreTurnStore implements TurnStore {
39
+ constructor(private readonly eventStore: EventStore) {}
40
+
41
+ /**
42
+ * Append a turn by emitting a turn event.
43
+ */
44
+ append(turn: ServerTurn): void {
45
+ this.eventStore.emit({
46
+ type: "turn",
47
+ source: { agent_id: turn.participant },
48
+ payload: {
49
+ action: "recorded",
50
+ turn_id: turn.id,
51
+ conversation_id: turn.conversationId,
52
+ participant: turn.participant,
53
+ content_type: turn.contentType,
54
+ content: turn.content,
55
+ thread_id: turn.threadId,
56
+ in_reply_to: turn.inReplyTo,
57
+ source_type: turn.source.type,
58
+ source_message_id:
59
+ turn.source.type === "intercepted"
60
+ ? turn.source.messageId
61
+ : undefined,
62
+ metadata: turn.metadata,
63
+ },
64
+ });
65
+ }
66
+
67
+ /**
68
+ * Get a specific turn by ID.
69
+ * Searches across all conversations since we only have the turn ID.
70
+ */
71
+ get(id: string): ServerTurn | undefined {
72
+ // EventStore's listTurns requires a conversationId.
73
+ // For ID-based lookup, we scan all turns. In practice this is
74
+ // called rarely — most access is via list() with a conversationId.
75
+ //
76
+ // A more efficient approach would be adding a getTurn(id) method
77
+ // to EventStore, but for now this works with the existing interface.
78
+ const allConvIds = this.eventStore
79
+ .listConversations()
80
+ .map((c) => c.id);
81
+
82
+ for (const convId of allConvIds) {
83
+ const turns = this.eventStore.listTurns({ conversationId: convId });
84
+ const turn = turns.find((t) => t.id === id);
85
+ if (turn) return toServerTurn(turn);
86
+ }
87
+
88
+ return undefined;
89
+ }
90
+
91
+ /**
92
+ * List turns matching filter criteria with pagination.
93
+ */
94
+ list(filter: MAPTurnFilter): ServerTurn[] {
95
+ // Get all turns for the conversation with basic filters
96
+ const internalFilter: TurnFilter = {
97
+ conversationId: filter.conversationId,
98
+ threadId: filter.threadId,
99
+ contentType: filter.contentTypes?.[0],
100
+ participantId: filter.participantId,
101
+ order: filter.order,
102
+ };
103
+
104
+ let turns = this.eventStore
105
+ .listTurns(internalFilter)
106
+ .map(toServerTurn);
107
+
108
+ // Apply multi-value content type filter
109
+ if (filter.contentTypes && filter.contentTypes.length > 1) {
110
+ turns = turns.filter((t) =>
111
+ filter.contentTypes!.includes(t.contentType)
112
+ );
113
+ }
114
+
115
+ // Apply timestamp range filters
116
+ if (filter.afterTimestamp !== undefined) {
117
+ turns = turns.filter((t) => t.timestamp > filter.afterTimestamp!);
118
+ }
119
+ if (filter.beforeTimestamp !== undefined) {
120
+ turns = turns.filter((t) => t.timestamp < filter.beforeTimestamp!);
121
+ }
122
+
123
+ // Apply cursor-based pagination
124
+ if (filter.afterTurnId) {
125
+ const idx = turns.findIndex((t) => t.id === filter.afterTurnId);
126
+ if (idx !== -1) {
127
+ turns = turns.slice(idx + 1);
128
+ }
129
+ }
130
+ if (filter.beforeTurnId) {
131
+ const idx = turns.findIndex((t) => t.id === filter.beforeTurnId);
132
+ if (idx !== -1) {
133
+ turns = turns.slice(0, idx);
134
+ }
135
+ }
136
+
137
+ // Apply limit
138
+ if (filter.limit !== undefined) {
139
+ turns = turns.slice(0, filter.limit);
140
+ }
141
+
142
+ return turns;
143
+ }
144
+
145
+ /**
146
+ * Delete a specific turn. Not supported — EventStore is append-only.
147
+ */
148
+ delete(_id: string): boolean {
149
+ return false;
150
+ }
151
+
152
+ /**
153
+ * Delete all turns for a conversation. Not supported.
154
+ */
155
+ deleteByConversation(_conversationId: string): number {
156
+ return 0;
157
+ }
158
+
159
+ /**
160
+ * Count turns in a conversation.
161
+ */
162
+ count(conversationId: string, threadId?: string): number {
163
+ const filter: TurnFilter = { conversationId, threadId };
164
+ return this.eventStore.listTurns(filter).length;
165
+ }
166
+
167
+ /**
168
+ * Clear all turns. Not supported — EventStore is append-only.
169
+ */
170
+ clear(): void {
171
+ // No-op
172
+ }
173
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * EventStore-backed mail store adapters.
3
+ *
4
+ * These implement MAP-compatible store interfaces backed by
5
+ * the EventStore's append-only event log and materialized views.
6
+ */
7
+
8
+ export * from "./types.js";
9
+ export { EventStoreConversationStore } from "./eventstore-conversation-store.js";
10
+ export { EventStoreTurnStore } from "./eventstore-turn-store.js";
11
+ export { EventStoreThreadStore } from "./eventstore-thread-store.js";
12
+ export { EventStoreParticipantStore } from "./eventstore-participant-store.js";
@@ -0,0 +1,160 @@
1
+ /**
2
+ * MAP-compatible store interfaces for mail.
3
+ *
4
+ * These mirror the store interfaces from the MAP SDK server module
5
+ * (ConversationStore, TurnStore, ThreadStore, ParticipantStore) so that
6
+ * our EventStore-backed implementations can be plugged into MAP handlers.
7
+ *
8
+ * The MAP SDK server module is not exported from the installed package,
9
+ * so we define the interfaces locally. They match the SDK's shapes so
10
+ * swapping to SDK imports is a single-line change per type.
11
+ */
12
+
13
+ // =============================================================================
14
+ // Server-side record types (match MAP SDK ServerConversation, etc.)
15
+ // =============================================================================
16
+
17
+ export interface ServerConversation {
18
+ id: string;
19
+ type: string;
20
+ status: string;
21
+ subject?: string;
22
+ participantCount: number;
23
+ parentConversationId?: string;
24
+ parentTurnId?: string;
25
+ createdAt: number;
26
+ updatedAt: number;
27
+ closedAt?: number;
28
+ createdBy: string;
29
+ metadata: Record<string, unknown>;
30
+ }
31
+
32
+ export interface ServerParticipant {
33
+ id: string;
34
+ conversationId: string;
35
+ type: "user" | "agent" | "system";
36
+ role: string;
37
+ joinedAt: number;
38
+ leftAt?: number;
39
+ permissions: {
40
+ canSend: boolean;
41
+ canObserve: boolean;
42
+ canInvite: boolean;
43
+ canRemove: boolean;
44
+ canCreateThreads: boolean;
45
+ historyAccess: "none" | "from-join" | "full";
46
+ canSeeInternal: boolean;
47
+ };
48
+ agentInfo?: {
49
+ agentId: string;
50
+ name?: string;
51
+ role?: string;
52
+ };
53
+ }
54
+
55
+ export interface ServerTurn {
56
+ id: string;
57
+ conversationId: string;
58
+ participant: string;
59
+ timestamp: number;
60
+ contentType: string;
61
+ content: unknown;
62
+ threadId?: string;
63
+ inReplyTo?: string;
64
+ source: { type: "explicit"; method: "mail/turn" } | { type: "intercepted"; messageId: string };
65
+ visibility?: { type: string; [key: string]: unknown };
66
+ status?: string;
67
+ metadata: Record<string, unknown>;
68
+ }
69
+
70
+ export interface ServerThread {
71
+ id: string;
72
+ conversationId: string;
73
+ parentThreadId?: string;
74
+ subject?: string;
75
+ rootTurnId: string;
76
+ turnCount: number;
77
+ participantCount: number;
78
+ createdAt: number;
79
+ updatedAt: number;
80
+ createdBy: string;
81
+ }
82
+
83
+ // =============================================================================
84
+ // Filter types (match MAP SDK ConversationFilter, TurnFilter, etc.)
85
+ // =============================================================================
86
+
87
+ export interface MAPConversationFilter {
88
+ type?: string[];
89
+ status?: string[];
90
+ participantId?: string;
91
+ createdAfter?: number;
92
+ createdBefore?: number;
93
+ parentConversationId?: string;
94
+ }
95
+
96
+ export interface MAPTurnFilter {
97
+ conversationId: string;
98
+ threadId?: string;
99
+ contentTypes?: string[];
100
+ participantId?: string;
101
+ afterTurnId?: string;
102
+ beforeTurnId?: string;
103
+ afterTimestamp?: number;
104
+ beforeTimestamp?: number;
105
+ limit?: number;
106
+ order?: "asc" | "desc";
107
+ }
108
+
109
+ export interface MAPThreadFilter {
110
+ conversationId: string;
111
+ parentThreadId?: string;
112
+ }
113
+
114
+ export interface MAPParticipantFilter {
115
+ conversationId?: string;
116
+ participantId?: string;
117
+ role?: string;
118
+ active?: boolean;
119
+ }
120
+
121
+ // =============================================================================
122
+ // Store interfaces (match MAP SDK ConversationStore, TurnStore, etc.)
123
+ // =============================================================================
124
+
125
+ export interface ConversationStore {
126
+ save(conversation: ServerConversation): void;
127
+ get(id: string): ServerConversation | undefined;
128
+ list(filter?: MAPConversationFilter): ServerConversation[];
129
+ delete(id: string): boolean;
130
+ clear(): void;
131
+ }
132
+
133
+ export interface TurnStore {
134
+ append(turn: ServerTurn): void;
135
+ get(id: string): ServerTurn | undefined;
136
+ list(filter: MAPTurnFilter): ServerTurn[];
137
+ delete(id: string): boolean;
138
+ deleteByConversation(conversationId: string): number;
139
+ count(conversationId: string, threadId?: string): number;
140
+ clear(): void;
141
+ }
142
+
143
+ export interface ThreadStore {
144
+ save(thread: ServerThread): void;
145
+ get(id: string): ServerThread | undefined;
146
+ list(filter: MAPThreadFilter): ServerThread[];
147
+ delete(id: string): boolean;
148
+ deleteByConversation(conversationId: string): number;
149
+ clear(): void;
150
+ }
151
+
152
+ export interface ParticipantStore {
153
+ save(participant: ServerParticipant): void;
154
+ get(conversationId: string, participantId: string): ServerParticipant | undefined;
155
+ list(filter: MAPParticipantFilter): ServerParticipant[];
156
+ delete(conversationId: string, participantId: string): boolean;
157
+ deleteByConversation(conversationId: string): number;
158
+ getConversationsForParticipant(participantId: string, active?: boolean): string[];
159
+ clear(): void;
160
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * TurnRecorder — Hierarchy-aware conversation resolution and turn recording.
3
+ *
4
+ * Resolves which conversation a message belongs to based on the
5
+ * relationship between sender and receiver:
6
+ * - Parent→child or child→parent: child's task conversation
7
+ * - Peers (no parent/child relationship): auto-created peer conversation
8
+ *
9
+ * @module mail/turn-recorder
10
+ */
11
+
12
+ import type { AgentId } from "../store/types/index.js";
13
+ import type { EventStore } from "../store/event-store.js";
14
+ import type { MailService } from "./mail-service.js";
15
+ import type { ConversationMap } from "./conversation-map.js";
16
+ import type { TurnRecordInfo, TurnRecorderCallback } from "../router/types.js";
17
+
18
+ export interface TurnRecorderDeps {
19
+ mailService: MailService;
20
+ conversationMap: ConversationMap;
21
+ eventStore: EventStore;
22
+ }
23
+
24
+ /**
25
+ * Create a TurnRecorderCallback for use with MessageRouter.setTurnRecorder().
26
+ *
27
+ * Resolution algorithm:
28
+ * 1. Get both agents from EventStore
29
+ * 2. If parent→child or child→parent: use child's task conversation
30
+ * 3. If peers: getOrCreatePeerConversation()
31
+ * 4. Record turn with sourceType: 'intercepted'
32
+ */
33
+ export function createTurnRecorder(deps: TurnRecorderDeps): TurnRecorderCallback {
34
+ const { mailService, conversationMap, eventStore } = deps;
35
+
36
+ return (info: TurnRecordInfo): void => {
37
+ const { from, toAgent, content, messageId } = info;
38
+
39
+ // Resolve conversation based on agent relationship
40
+ const conversationId = resolveConversation(from, toAgent);
41
+ if (!conversationId) return;
42
+
43
+ // Record the turn — never fail core message routing
44
+ try {
45
+ mailService.recordTurn({
46
+ conversationId,
47
+ participant: from,
48
+ contentType: "text",
49
+ content,
50
+ sourceType: "intercepted",
51
+ sourceMessageId: messageId,
52
+ });
53
+ } catch (err) {
54
+ console.warn(`[TurnRecorder] Failed to record turn: ${err}`);
55
+ }
56
+ };
57
+
58
+ /**
59
+ * Find the nearest common ancestor of two agents and return its conversation ID.
60
+ * Lineage arrays are ordered root-to-parent: [grandparent, parent].
61
+ */
62
+ function findNearestCommonAncestorConversation(
63
+ lineageA: AgentId[],
64
+ lineageB: AgentId[]
65
+ ): string | undefined {
66
+ // Walk lineages from the end (nearest ancestor) to find the deepest shared ancestor
67
+ const setB = new Set(lineageB);
68
+ for (let i = lineageA.length - 1; i >= 0; i--) {
69
+ if (setB.has(lineageA[i])) {
70
+ // Found nearest common ancestor — look up its conversation
71
+ return (
72
+ conversationMap.getAgentConversation(lineageA[i]) ??
73
+ conversationMap.getSessionConversation(lineageA[i])
74
+ );
75
+ }
76
+ }
77
+ return undefined;
78
+ }
79
+
80
+ function resolveConversation(from: AgentId, to: AgentId): string | null {
81
+ const fromAgent = eventStore.getAgent(from);
82
+ const toAgent = eventStore.getAgent(to);
83
+
84
+ // If either agent doesn't exist, skip
85
+ if (!fromAgent || !toAgent) return null;
86
+
87
+ // Check parent→child relationship
88
+ if (fromAgent.parent === to) {
89
+ // from is a child of to — use from's task conversation
90
+ return conversationMap.getAgentConversation(from) ?? null;
91
+ }
92
+ if (toAgent.parent === from) {
93
+ // to is a child of from — use to's task conversation
94
+ return conversationMap.getAgentConversation(to) ?? null;
95
+ }
96
+
97
+ // Peers — get or create peer conversation
98
+ return conversationMap.getOrCreatePeerConversation(from, to, () => {
99
+ // Find nearest common ancestor's conversation for tree structure
100
+ const parentConversationId = findNearestCommonAncestorConversation(
101
+ fromAgent.lineage,
102
+ toAgent.lineage
103
+ );
104
+
105
+ const { conversationId } = mailService.createConversation({
106
+ type: "peer",
107
+ subject: `Peer: ${from} ↔ ${to}`,
108
+ createdBy: from,
109
+ parentConversationId,
110
+ });
111
+ mailService.joinConversation({
112
+ conversationId,
113
+ participantId: from,
114
+ role: "worker",
115
+ });
116
+ mailService.joinConversation({
117
+ conversationId,
118
+ participantId: to,
119
+ role: "worker",
120
+ });
121
+ return conversationId;
122
+ });
123
+ }
124
+ }
@@ -0,0 +1,79 @@
1
+ # MAP Integration Module
2
+
3
+ Multi-Agent Protocol (MAP) integration for macro-agent, enabling standardized communication with external clients, agents, and gateways.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ External Clients → MAPAdapter → MessageRouter → EventStore
9
+ (MAP protocol) (translation) (routing) (persistence)
10
+ ```
11
+
12
+ ## Components
13
+
14
+ ### Core Types (`types.ts`)
15
+
16
+ Defines MAP-compliant address types for message routing:
17
+
18
+ - **AgentAddress** - `{ agent: AgentId }` - Direct to agent
19
+ - **AgentsAddress** - `{ agents: AgentId[] }` - Multi-agent delivery
20
+ - **TaskAddress** - `{ task: TaskId }` - Route to assigned agent
21
+ - **ScopeAddress** - `{ scope: ScopeId }` - Scope-based pub/sub
22
+ - **RoleAddress** - `{ role: string, within?: ScopeId }` - Role-based fan-out
23
+ - **BroadcastAddress** - `{ broadcast: scope }` - System-wide broadcast
24
+ - **HierarchicalAddress** - Parent/children/ancestors/descendants/siblings
25
+ - **FederatedAddress** - Cross-system routing
26
+
27
+ ### Adapter (`adapter/`)
28
+
29
+ The `MAPAdapter` handles external connections:
30
+
31
+ - **Connection Management** - Accept/disconnect participants
32
+ - **Authentication** - Validate credentials, assign capabilities
33
+ - **RPC Handling** - JSON-RPC 2.0 request/response
34
+ - **Subscriptions** - Event streaming to participants
35
+ - **Extensions** - Pluggable method handlers (spawn, wake, tasks)
36
+
37
+ Key files:
38
+ - `map-adapter.ts` - Core adapter implementation
39
+ - `connection-manager.ts` - Participant lifecycle
40
+ - `subscription-manager.ts` - Event subscriptions
41
+ - `rpc-handler.ts` - JSON-RPC processing
42
+ - `extensions/` - Extension method handlers
43
+
44
+ ### Federation (`federation/`)
45
+
46
+ Cross-system communication:
47
+
48
+ - **FederationHandler** - Routes messages between MAP systems
49
+ - **PeerManager** - Manages connections to peer systems
50
+ - **SystemId** - Unique system identification (domain/system/instance)
51
+
52
+ ## Usage
53
+
54
+ ```typescript
55
+ import { createMAPAdapter } from "./map/adapter/index.js";
56
+
57
+ const adapter = createMAPAdapter({
58
+ name: "my-system",
59
+ authenticate: async (type, credentials) => {
60
+ // Validate credentials
61
+ return { allowed: true, capabilities: { canQuery: true } };
62
+ },
63
+ });
64
+
65
+ await adapter.start();
66
+
67
+ // Accept WebSocket connection
68
+ const participant = await adapter.acceptConnection(stream);
69
+ ```
70
+
71
+ ## ID Naming Convention
72
+
73
+ MAP types use clean field names (`agent`, `task`) while internal types use explicit names (`agent_id`, `task_id`). See CLAUDE.md for details.
74
+
75
+ ## Related Modules
76
+
77
+ - `router/` - Internal message routing (MessageRouter)
78
+ - `store/` - Event persistence (EventStore)
79
+ - `trigger/` - External event routing (TriggerRouter)