macro-agent 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
  2. package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
  3. package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
  4. package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
  5. package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
  6. package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
  7. package/.macro-agent/teams/self-driving/team.yaml +103 -0
  8. package/.macro-agent/teams/structured/prompts/developer.md +26 -0
  9. package/.macro-agent/teams/structured/prompts/lead.md +25 -0
  10. package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
  11. package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
  12. package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
  13. package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
  14. package/.macro-agent/teams/structured/team.yaml +89 -0
  15. package/.sudocode/issues.jsonl +56 -51
  16. package/.sudocode/specs.jsonl +8 -1
  17. package/CLAUDE.md +121 -30
  18. package/README.md +60 -3
  19. package/dist/acp/macro-agent.d.ts +4 -0
  20. package/dist/acp/macro-agent.d.ts.map +1 -1
  21. package/dist/acp/macro-agent.js +50 -4
  22. package/dist/acp/macro-agent.js.map +1 -1
  23. package/dist/acp/session-mapper.d.ts +20 -1
  24. package/dist/acp/session-mapper.d.ts.map +1 -1
  25. package/dist/acp/session-mapper.js +90 -1
  26. package/dist/acp/session-mapper.js.map +1 -1
  27. package/dist/acp/types.d.ts +24 -1
  28. package/dist/acp/types.d.ts.map +1 -1
  29. package/dist/acp/types.js.map +1 -1
  30. package/dist/agent/agent-manager.d.ts +40 -1
  31. package/dist/agent/agent-manager.d.ts.map +1 -1
  32. package/dist/agent/agent-manager.js +172 -8
  33. package/dist/agent/agent-manager.js.map +1 -1
  34. package/dist/agent/types.d.ts +22 -0
  35. package/dist/agent/types.d.ts.map +1 -1
  36. package/dist/agent/types.js.map +1 -1
  37. package/dist/agent/wake.d.ts +15 -0
  38. package/dist/agent/wake.d.ts.map +1 -1
  39. package/dist/agent/wake.js +15 -0
  40. package/dist/agent/wake.js.map +1 -1
  41. package/dist/agent-detection/command-builder.d.ts +30 -0
  42. package/dist/agent-detection/command-builder.d.ts.map +1 -0
  43. package/dist/agent-detection/command-builder.js +71 -0
  44. package/dist/agent-detection/command-builder.js.map +1 -0
  45. package/dist/agent-detection/detector.d.ts +84 -0
  46. package/dist/agent-detection/detector.d.ts.map +1 -0
  47. package/dist/agent-detection/detector.js +240 -0
  48. package/dist/agent-detection/detector.js.map +1 -0
  49. package/dist/agent-detection/index.d.ts +12 -0
  50. package/dist/agent-detection/index.d.ts.map +1 -0
  51. package/dist/agent-detection/index.js +14 -0
  52. package/dist/agent-detection/index.js.map +1 -0
  53. package/dist/agent-detection/registry.d.ts +53 -0
  54. package/dist/agent-detection/registry.d.ts.map +1 -0
  55. package/dist/agent-detection/registry.js +177 -0
  56. package/dist/agent-detection/registry.js.map +1 -0
  57. package/dist/agent-detection/types.d.ts +121 -0
  58. package/dist/agent-detection/types.d.ts.map +1 -0
  59. package/dist/agent-detection/types.js +20 -0
  60. package/dist/agent-detection/types.js.map +1 -0
  61. package/dist/api/server.d.ts +5 -1
  62. package/dist/api/server.d.ts.map +1 -1
  63. package/dist/api/server.js +362 -0
  64. package/dist/api/server.js.map +1 -1
  65. package/dist/api/types.d.ts +50 -1
  66. package/dist/api/types.d.ts.map +1 -1
  67. package/dist/cli/acp.d.ts +2 -0
  68. package/dist/cli/acp.d.ts.map +1 -1
  69. package/dist/cli/acp.js +8 -1
  70. package/dist/cli/acp.js.map +1 -1
  71. package/dist/cli/index.js +29 -0
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/cli/mcp.js +38 -0
  74. package/dist/cli/mcp.js.map +1 -1
  75. package/dist/config/index.d.ts +2 -0
  76. package/dist/config/index.d.ts.map +1 -0
  77. package/dist/config/index.js +2 -0
  78. package/dist/config/index.js.map +1 -0
  79. package/dist/config/project-config.d.ts +46 -0
  80. package/dist/config/project-config.d.ts.map +1 -0
  81. package/dist/config/project-config.js +68 -0
  82. package/dist/config/project-config.js.map +1 -0
  83. package/dist/lifecycle/cascade.d.ts +1 -1
  84. package/dist/lifecycle/cascade.d.ts.map +1 -1
  85. package/dist/lifecycle/handlers/index.d.ts +4 -0
  86. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  87. package/dist/lifecycle/handlers/index.js +2 -0
  88. package/dist/lifecycle/handlers/index.js.map +1 -1
  89. package/dist/lifecycle/handlers/worker.d.ts +4 -0
  90. package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
  91. package/dist/lifecycle/handlers/worker.js +35 -3
  92. package/dist/lifecycle/handlers/worker.js.map +1 -1
  93. package/dist/mail/conversation-map.d.ts +33 -0
  94. package/dist/mail/conversation-map.d.ts.map +1 -0
  95. package/dist/mail/conversation-map.js +61 -0
  96. package/dist/mail/conversation-map.js.map +1 -0
  97. package/dist/mail/index.d.ts +11 -0
  98. package/dist/mail/index.d.ts.map +1 -0
  99. package/dist/mail/index.js +11 -0
  100. package/dist/mail/index.js.map +1 -0
  101. package/dist/mail/mail-service.d.ts +85 -0
  102. package/dist/mail/mail-service.d.ts.map +1 -0
  103. package/dist/mail/mail-service.js +121 -0
  104. package/dist/mail/mail-service.js.map +1 -0
  105. package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
  106. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
  107. package/dist/mail/stores/eventstore-conversation-store.js +131 -0
  108. package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
  109. package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
  110. package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
  111. package/dist/mail/stores/eventstore-participant-store.js +145 -0
  112. package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
  113. package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
  114. package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
  115. package/dist/mail/stores/eventstore-thread-store.js +118 -0
  116. package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
  117. package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
  118. package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
  119. package/dist/mail/stores/eventstore-turn-store.js +153 -0
  120. package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
  121. package/dist/mail/stores/index.d.ts +12 -0
  122. package/dist/mail/stores/index.d.ts.map +1 -0
  123. package/dist/mail/stores/index.js +12 -0
  124. package/dist/mail/stores/index.js.map +1 -0
  125. package/dist/mail/stores/types.d.ts +146 -0
  126. package/dist/mail/stores/types.d.ts.map +1 -0
  127. package/dist/mail/stores/types.js +13 -0
  128. package/dist/mail/stores/types.js.map +1 -0
  129. package/dist/mail/turn-recorder.d.ts +30 -0
  130. package/dist/mail/turn-recorder.d.ts.map +1 -0
  131. package/dist/mail/turn-recorder.js +98 -0
  132. package/dist/mail/turn-recorder.js.map +1 -0
  133. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  134. package/dist/map/adapter/acp-over-map.js +32 -2
  135. package/dist/map/adapter/acp-over-map.js.map +1 -1
  136. package/dist/map/adapter/event-translator.d.ts.map +1 -1
  137. package/dist/map/adapter/event-translator.js +4 -0
  138. package/dist/map/adapter/event-translator.js.map +1 -1
  139. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  140. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  141. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  142. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  143. package/dist/map/adapter/extensions/index.d.ts +10 -1
  144. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  145. package/dist/map/adapter/extensions/index.js +39 -0
  146. package/dist/map/adapter/extensions/index.js.map +1 -1
  147. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  148. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  149. package/dist/map/adapter/extensions/resume.js +59 -0
  150. package/dist/map/adapter/extensions/resume.js.map +1 -0
  151. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  152. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  153. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  154. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  155. package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
  156. package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
  157. package/dist/map/adapter/mail-handler-adapter.js +292 -0
  158. package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
  159. package/dist/map/adapter/map-adapter.d.ts +34 -10
  160. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  161. package/dist/map/adapter/map-adapter.js +110 -14
  162. package/dist/map/adapter/map-adapter.js.map +1 -1
  163. package/dist/map/adapter/rpc-handler.d.ts +4 -1
  164. package/dist/map/adapter/rpc-handler.d.ts.map +1 -1
  165. package/dist/map/adapter/rpc-handler.js +6 -0
  166. package/dist/map/adapter/rpc-handler.js.map +1 -1
  167. package/dist/map/index.d.ts +1 -0
  168. package/dist/map/index.d.ts.map +1 -1
  169. package/dist/map/index.js +2 -0
  170. package/dist/map/index.js.map +1 -1
  171. package/dist/map/types.d.ts +3 -1
  172. package/dist/map/types.d.ts.map +1 -1
  173. package/dist/map/types.js.map +1 -1
  174. package/dist/mcp/mcp-server.d.ts +6 -0
  175. package/dist/mcp/mcp-server.d.ts.map +1 -1
  176. package/dist/mcp/mcp-server.js +45 -0
  177. package/dist/mcp/mcp-server.js.map +1 -1
  178. package/dist/mcp/tools/claim_task.d.ts +35 -0
  179. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  180. package/dist/mcp/tools/claim_task.js +58 -0
  181. package/dist/mcp/tools/claim_task.js.map +1 -0
  182. package/dist/mcp/tools/done.d.ts +15 -2
  183. package/dist/mcp/tools/done.d.ts.map +1 -1
  184. package/dist/mcp/tools/done.js +45 -10
  185. package/dist/mcp/tools/done.js.map +1 -1
  186. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  187. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  188. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  189. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  190. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  191. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  192. package/dist/mcp/tools/unclaim_task.js +47 -0
  193. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  194. package/dist/metrics/index.d.ts +2 -0
  195. package/dist/metrics/index.d.ts.map +1 -0
  196. package/dist/metrics/index.js +2 -0
  197. package/dist/metrics/index.js.map +1 -0
  198. package/dist/metrics/metrics.d.ts +79 -0
  199. package/dist/metrics/metrics.d.ts.map +1 -0
  200. package/dist/metrics/metrics.js +166 -0
  201. package/dist/metrics/metrics.js.map +1 -0
  202. package/dist/roles/capabilities.d.ts +1 -0
  203. package/dist/roles/capabilities.d.ts.map +1 -1
  204. package/dist/roles/capabilities.js +3 -0
  205. package/dist/roles/capabilities.js.map +1 -1
  206. package/dist/roles/types.d.ts +1 -1
  207. package/dist/roles/types.d.ts.map +1 -1
  208. package/dist/router/channels.d.ts +2 -4
  209. package/dist/router/channels.d.ts.map +1 -1
  210. package/dist/router/channels.js.map +1 -1
  211. package/dist/router/message-router.d.ts +85 -9
  212. package/dist/router/message-router.d.ts.map +1 -1
  213. package/dist/router/message-router.js +203 -14
  214. package/dist/router/message-router.js.map +1 -1
  215. package/dist/router/role-resolver.d.ts +10 -1
  216. package/dist/router/role-resolver.d.ts.map +1 -1
  217. package/dist/router/role-resolver.js +15 -1
  218. package/dist/router/role-resolver.js.map +1 -1
  219. package/dist/router/types.d.ts +30 -1
  220. package/dist/router/types.d.ts.map +1 -1
  221. package/dist/router/types.js.map +1 -1
  222. package/dist/server/combined-server.d.ts +6 -0
  223. package/dist/server/combined-server.d.ts.map +1 -1
  224. package/dist/server/combined-server.js +24 -2
  225. package/dist/server/combined-server.js.map +1 -1
  226. package/dist/store/event-store.d.ts +14 -1
  227. package/dist/store/event-store.d.ts.map +1 -1
  228. package/dist/store/event-store.js +456 -4
  229. package/dist/store/event-store.js.map +1 -1
  230. package/dist/store/types/agents.d.ts +1 -1
  231. package/dist/store/types/agents.d.ts.map +1 -1
  232. package/dist/store/types/conversations.d.ts +91 -0
  233. package/dist/store/types/conversations.d.ts.map +1 -0
  234. package/dist/store/types/conversations.js +8 -0
  235. package/dist/store/types/conversations.js.map +1 -0
  236. package/dist/store/types/events.d.ts +1 -1
  237. package/dist/store/types/events.d.ts.map +1 -1
  238. package/dist/store/types/events.js.map +1 -1
  239. package/dist/store/types/index.d.ts +2 -0
  240. package/dist/store/types/index.d.ts.map +1 -1
  241. package/dist/store/types/index.js +2 -0
  242. package/dist/store/types/index.js.map +1 -1
  243. package/dist/store/types/sessions.d.ts +44 -0
  244. package/dist/store/types/sessions.d.ts.map +1 -0
  245. package/dist/store/types/sessions.js +9 -0
  246. package/dist/store/types/sessions.js.map +1 -0
  247. package/dist/store/types/tasks.d.ts +2 -0
  248. package/dist/store/types/tasks.d.ts.map +1 -1
  249. package/dist/task/backend/memory.d.ts +4 -1
  250. package/dist/task/backend/memory.d.ts.map +1 -1
  251. package/dist/task/backend/memory.js +81 -0
  252. package/dist/task/backend/memory.js.map +1 -1
  253. package/dist/task/backend/types.d.ts +30 -0
  254. package/dist/task/backend/types.d.ts.map +1 -1
  255. package/dist/task/backend/types.js.map +1 -1
  256. package/dist/teams/index.d.ts +4 -0
  257. package/dist/teams/index.d.ts.map +1 -0
  258. package/dist/teams/index.js +4 -0
  259. package/dist/teams/index.js.map +1 -0
  260. package/dist/teams/team-loader.d.ts +20 -0
  261. package/dist/teams/team-loader.d.ts.map +1 -0
  262. package/dist/teams/team-loader.js +293 -0
  263. package/dist/teams/team-loader.js.map +1 -0
  264. package/dist/teams/team-runtime.d.ts +139 -0
  265. package/dist/teams/team-runtime.d.ts.map +1 -0
  266. package/dist/teams/team-runtime.js +613 -0
  267. package/dist/teams/team-runtime.js.map +1 -0
  268. package/dist/teams/types.d.ts +266 -0
  269. package/dist/teams/types.d.ts.map +1 -0
  270. package/dist/teams/types.js +20 -0
  271. package/dist/teams/types.js.map +1 -0
  272. package/dist/trigger/router/trigger-router.d.ts +30 -3
  273. package/dist/trigger/router/trigger-router.d.ts.map +1 -1
  274. package/dist/trigger/router/trigger-router.js +30 -3
  275. package/dist/trigger/router/trigger-router.js.map +1 -1
  276. package/dist/trigger/wake/types.d.ts +31 -5
  277. package/dist/trigger/wake/types.d.ts.map +1 -1
  278. package/dist/trigger/wake/types.js +19 -0
  279. package/dist/trigger/wake/types.js.map +1 -1
  280. package/dist/workspace/dataplane-adapter.d.ts +1 -1
  281. package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
  282. package/dist/workspace/dataplane-adapter.js +1 -1
  283. package/dist/workspace/dataplane-adapter.js.map +1 -1
  284. package/dist/workspace/index.d.ts +1 -1
  285. package/dist/workspace/index.d.ts.map +1 -1
  286. package/dist/workspace/strategies/index.d.ts +6 -0
  287. package/dist/workspace/strategies/index.d.ts.map +1 -0
  288. package/dist/workspace/strategies/index.js +5 -0
  289. package/dist/workspace/strategies/index.js.map +1 -0
  290. package/dist/workspace/strategies/optimistic.d.ts +26 -0
  291. package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
  292. package/dist/workspace/strategies/optimistic.js +121 -0
  293. package/dist/workspace/strategies/optimistic.js.map +1 -0
  294. package/dist/workspace/strategies/queue.d.ts +26 -0
  295. package/dist/workspace/strategies/queue.d.ts.map +1 -0
  296. package/dist/workspace/strategies/queue.js +67 -0
  297. package/dist/workspace/strategies/queue.js.map +1 -0
  298. package/dist/workspace/strategies/registry.d.ts +37 -0
  299. package/dist/workspace/strategies/registry.d.ts.map +1 -0
  300. package/dist/workspace/strategies/registry.js +63 -0
  301. package/dist/workspace/strategies/registry.js.map +1 -0
  302. package/dist/workspace/strategies/trunk.d.ts +20 -0
  303. package/dist/workspace/strategies/trunk.d.ts.map +1 -0
  304. package/dist/workspace/strategies/trunk.js +108 -0
  305. package/dist/workspace/strategies/trunk.js.map +1 -0
  306. package/dist/workspace/strategies/types.d.ts +104 -0
  307. package/dist/workspace/strategies/types.d.ts.map +1 -0
  308. package/dist/workspace/strategies/types.js +11 -0
  309. package/dist/workspace/strategies/types.js.map +1 -0
  310. package/dist/workspace/types.d.ts +1 -1
  311. package/dist/workspace/types.d.ts.map +1 -1
  312. package/dist/workspace/workspace-manager.d.ts +1 -1
  313. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  314. package/docs/implementation-details.md +1127 -0
  315. package/docs/implementation-summary.md +448 -0
  316. package/docs/mail-integration.md +608 -0
  317. package/docs/plan-self-driving-support.md +433 -0
  318. package/docs/spec-self-driving-support.md +462 -0
  319. package/docs/team-templates.md +860 -0
  320. package/docs/teams.md +233 -0
  321. package/package.json +5 -3
  322. package/src/acp/__tests__/integration.test.ts +161 -1
  323. package/src/acp/__tests__/macro-agent.test.ts +95 -0
  324. package/src/acp/__tests__/session-persistence.test.ts +276 -0
  325. package/src/acp/macro-agent.ts +79 -7
  326. package/src/acp/session-mapper.ts +108 -1
  327. package/src/acp/types.ts +33 -1
  328. package/src/agent/agent-manager.ts +278 -6
  329. package/src/agent/types.ts +27 -0
  330. package/src/agent/wake.ts +15 -0
  331. package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
  332. package/src/agent-detection/__tests__/detector.test.ts +768 -0
  333. package/src/agent-detection/__tests__/registry.test.ts +254 -0
  334. package/src/agent-detection/command-builder.ts +90 -0
  335. package/src/agent-detection/detector.ts +307 -0
  336. package/src/agent-detection/index.ts +36 -0
  337. package/src/agent-detection/registry.ts +200 -0
  338. package/src/agent-detection/types.ts +184 -0
  339. package/src/api/__tests__/conversation-api.test.ts +468 -0
  340. package/src/api/server.ts +425 -1
  341. package/src/api/types.ts +64 -1
  342. package/src/cli/acp.ts +9 -1
  343. package/src/cli/index.ts +44 -0
  344. package/src/cli/mcp.ts +47 -0
  345. package/src/config/index.ts +9 -0
  346. package/src/config/project-config.ts +107 -0
  347. package/src/lifecycle/cascade.ts +1 -1
  348. package/src/lifecycle/handlers/index.ts +8 -0
  349. package/src/lifecycle/handlers/worker.ts +48 -3
  350. package/src/mail/__tests__/conversation-lifecycle.test.ts +409 -0
  351. package/src/mail/__tests__/eventstore-stores.test.ts +1073 -0
  352. package/src/mail/__tests__/mail-full-agent.e2e.test.ts +575 -0
  353. package/src/mail/__tests__/mail-integration.test.ts +759 -0
  354. package/src/mail/__tests__/mail-map-protocol.e2e.test.ts +1068 -0
  355. package/src/mail/__tests__/mail-service.test.ts +506 -0
  356. package/src/mail/__tests__/turn-recorder.test.ts +328 -0
  357. package/src/mail/conversation-map.ts +107 -0
  358. package/src/mail/index.ts +25 -0
  359. package/src/mail/mail-service.ts +257 -0
  360. package/src/mail/stores/eventstore-conversation-store.ts +146 -0
  361. package/src/mail/stores/eventstore-participant-store.ts +172 -0
  362. package/src/mail/stores/eventstore-thread-store.ts +129 -0
  363. package/src/mail/stores/eventstore-turn-store.ts +173 -0
  364. package/src/mail/stores/index.ts +12 -0
  365. package/src/mail/stores/types.ts +160 -0
  366. package/src/mail/turn-recorder.ts +124 -0
  367. package/src/map/README.md +79 -0
  368. package/src/map/adapter/__tests__/extensions.test.ts +359 -0
  369. package/src/map/adapter/__tests__/map-adapter.test.ts +90 -0
  370. package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
  371. package/src/map/adapter/acp-over-map.ts +45 -2
  372. package/src/map/adapter/event-translator.ts +4 -0
  373. package/src/map/adapter/extensions/agent-detection.ts +201 -0
  374. package/src/map/adapter/extensions/index.ts +63 -0
  375. package/src/map/adapter/extensions/resume.ts +114 -0
  376. package/src/map/adapter/extensions/workspace-files.ts +449 -0
  377. package/src/map/adapter/mail-handler-adapter.ts +429 -0
  378. package/src/map/adapter/map-adapter.ts +173 -27
  379. package/src/map/adapter/rpc-handler.ts +8 -1
  380. package/src/map/index.ts +3 -0
  381. package/src/map/types.ts +3 -1
  382. package/src/mcp/mcp-server.ts +67 -0
  383. package/src/mcp/tools/claim_task.ts +86 -0
  384. package/src/mcp/tools/done.ts +59 -10
  385. package/src/mcp/tools/list_claimable_tasks.ts +93 -0
  386. package/src/mcp/tools/unclaim_task.ts +71 -0
  387. package/src/metrics/index.ts +9 -0
  388. package/src/metrics/metrics.ts +280 -0
  389. package/src/roles/capabilities.ts +3 -0
  390. package/src/roles/types.ts +2 -1
  391. package/src/router/README.md +120 -0
  392. package/src/router/__tests__/message-router.test.ts +561 -0
  393. package/src/router/channels.ts +3 -4
  394. package/src/router/message-router.ts +308 -22
  395. package/src/router/role-resolver.ts +22 -1
  396. package/src/router/types.ts +36 -1
  397. package/src/server/combined-server.ts +36 -2
  398. package/src/store/README.md +134 -0
  399. package/src/store/event-store.ts +546 -3
  400. package/src/store/types/agents.ts +1 -1
  401. package/src/store/types/conversations.ts +129 -0
  402. package/src/store/types/events.ts +5 -1
  403. package/src/store/types/index.ts +2 -0
  404. package/src/store/types/sessions.ts +53 -0
  405. package/src/store/types/tasks.ts +3 -0
  406. package/src/task/backend/memory.ts +116 -0
  407. package/src/task/backend/types.ts +43 -0
  408. package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
  409. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
  410. package/src/teams/__tests__/team-system.test.ts +1280 -0
  411. package/src/teams/index.ts +13 -0
  412. package/src/teams/team-loader.ts +434 -0
  413. package/src/teams/team-runtime.ts +727 -0
  414. package/src/teams/types.ts +377 -0
  415. package/src/trigger/router/trigger-router.ts +30 -3
  416. package/src/trigger/wake/types.ts +32 -5
  417. package/src/trigger/wake/wake-manager.ts +2 -2
  418. package/src/workspace/dataplane-adapter.ts +1 -1
  419. package/src/workspace/index.ts +1 -1
  420. package/src/workspace/strategies/index.ts +18 -0
  421. package/src/workspace/strategies/optimistic.ts +136 -0
  422. package/src/workspace/strategies/queue.ts +81 -0
  423. package/src/workspace/strategies/registry.ts +89 -0
  424. package/src/workspace/strategies/trunk.ts +123 -0
  425. package/src/workspace/strategies/types.ts +145 -0
  426. package/src/workspace/types.ts +1 -1
  427. package/src/workspace/workspace-manager.ts +1 -1
  428. package/.claude/settings.local.json +0 -59
  429. package/dist/map/utils/address-translation.d.ts +0 -99
  430. package/dist/map/utils/address-translation.d.ts.map +0 -1
  431. package/dist/map/utils/address-translation.js +0 -285
  432. package/dist/map/utils/address-translation.js.map +0 -1
  433. package/dist/map/utils/index.d.ts +0 -7
  434. package/dist/map/utils/index.d.ts.map +0 -1
  435. package/dist/map/utils/index.js +0 -7
  436. package/dist/map/utils/index.js.map +0 -1
  437. package/openspec/AGENTS.md +0 -456
  438. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/design.md +0 -128
  439. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/proposal.md +0 -49
  440. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/agent-manager/spec.md +0 -150
  441. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/cli-api/spec.md +0 -258
  442. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/event-store/spec.md +0 -160
  443. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/mcp-tools/spec.md +0 -224
  444. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/message-router/spec.md +0 -153
  445. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/task-manager/spec.md +0 -136
  446. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/tasks.md +0 -147
  447. package/openspec/project.md +0 -31
  448. package/openspec/specs/agent-manager/spec.md +0 -154
  449. package/openspec/specs/cli-api/spec.md +0 -262
  450. package/openspec/specs/event-store/spec.md +0 -164
  451. package/openspec/specs/mcp-tools/spec.md +0 -228
  452. package/openspec/specs/message-router/spec.md +0 -157
  453. package/openspec/specs/task-manager/spec.md +0 -140
  454. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  455. package/references/acp-factory-ref/LICENSE +0 -21
  456. package/references/acp-factory-ref/README.md +0 -341
  457. package/references/acp-factory-ref/package-lock.json +0 -3102
  458. package/references/acp-factory-ref/package.json +0 -96
  459. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  460. package/references/acp-factory-ref/python/LICENSE +0 -21
  461. package/references/acp-factory-ref/python/Makefile +0 -57
  462. package/references/acp-factory-ref/python/README.md +0 -253
  463. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  464. package/references/acp-factory-ref/python/tests/__init__.py +0 -0
  465. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  466. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  467. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  468. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  469. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  470. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  471. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  472. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  473. package/references/claude-code-acp/.prettierrc.json +0 -4
  474. package/references/claude-code-acp/CHANGELOG.md +0 -249
  475. package/references/claude-code-acp/LICENSE +0 -222
  476. package/references/claude-code-acp/README.md +0 -53
  477. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  478. package/references/claude-code-acp/eslint.config.js +0 -48
  479. package/references/claude-code-acp/package-lock.json +0 -4570
  480. package/references/claude-code-acp/package.json +0 -88
  481. package/references/claude-code-acp/scripts/release.sh +0 -119
  482. package/references/claude-code-acp/src/acp-agent.ts +0 -2065
  483. package/references/claude-code-acp/src/index.ts +0 -26
  484. package/references/claude-code-acp/src/lib.ts +0 -38
  485. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  486. package/references/claude-code-acp/src/settings.ts +0 -522
  487. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  488. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  489. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  490. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  491. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  492. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  493. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  494. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  495. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  496. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  497. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  498. package/references/claude-code-acp/src/tools.ts +0 -819
  499. package/references/claude-code-acp/src/utils.ts +0 -171
  500. package/references/claude-code-acp/tsconfig.json +0 -18
  501. package/references/claude-code-acp/vitest.config.ts +0 -19
  502. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -82
  503. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -9
  504. package/references/multi-agent-protocol/LICENSE +0 -21
  505. package/references/multi-agent-protocol/README.md +0 -113
  506. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -460
  507. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  508. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  509. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  510. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  511. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  512. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  513. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  514. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  515. package/references/multi-agent-protocol/package-lock.json +0 -3239
  516. package/references/multi-agent-protocol/package.json +0 -56
  517. package/references/multi-agent-protocol/schema/meta.json +0 -337
  518. package/references/multi-agent-protocol/schema/schema.json +0 -1828
@@ -1,17 +1,33 @@
1
1
  /**
2
- * MAPAdapter - Core MAP Protocol Adapter Implementation
2
+ * MAPAdapter - External MAP Protocol Interface
3
3
  *
4
- * The MAPAdapter is the external-facing component that:
5
- * - Accepts MAP protocol connections from clients, agents, and gateways
6
- * - Manages participant lifecycle and authentication
7
- * - Handles subscriptions and event streaming
8
- * - Dispatches extension method calls
9
- * - Enforces system-level permissions (Layer 1)
4
+ * ## Routing Architecture Role
10
5
  *
11
- * The adapter delegates to internal components:
12
- * - MessageRouter: For message routing and delivery
6
+ * MAPAdapter is the **external protocol translation layer** for MAP clients.
7
+ * It translates MAP protocol messages into internal routing calls.
8
+ *
9
+ * ```
10
+ * External → MAPAdapter → MessageRouter → EventStore
11
+ * (MAP RPC) (this) (routing) (persistence)
12
+ * ```
13
+ *
14
+ * **Responsibilities:**
15
+ * - Accept MAP protocol connections (JSON-RPC over WebSocket/streams)
16
+ * - Manage participant lifecycle (connect, disconnect, capabilities)
17
+ * - Handle authentication and permission enforcement (Layer 1)
18
+ * - Translate MAP addresses to internal routing
19
+ * - Stream events to subscribed participants
20
+ * - Dispatch extension method calls (spawn, wake, tasks, etc.)
21
+ *
22
+ * **Delegates to internal components:**
23
+ * - MessageRouter: For message routing and delivery (sendToAddress)
13
24
  * - AgentManager: For agent lifecycle operations
14
- * - EventStore: For event persistence and replay
25
+ * - EventStore: For event persistence and subscription
26
+ *
27
+ * **Not responsible for:**
28
+ * - Internal agent-to-agent messaging (use MessageRouter directly)
29
+ * - Batch event delivery (use TriggerRouter/WakeManager)
30
+ * - Legacy channel-based routing (use MessageRouter.send())
15
31
  *
16
32
  * @see specs/s-5qir_map_integration_for_macro_agent.md
17
33
  */
@@ -34,13 +50,20 @@ import type {
34
50
  import type {
35
51
  ParticipantId,
36
52
  ParticipantType,
53
+ ParticipantCapabilities,
37
54
  ConnectedParticipant,
38
55
  SubscriptionId,
39
56
  SubscriptionFilter,
40
57
  EventNotification,
58
+ AuthCredentials,
41
59
  MAPEventType,
42
60
  } from "./types.js";
43
- import { isAgentAddress, type Address, type SendOptions, type ScopeId } from "../types.js";
61
+ import {
62
+ isAgentAddress,
63
+ type Address,
64
+ type SendOptions,
65
+ type ScopeId,
66
+ } from "../types.js";
44
67
  import type { AgentId } from "../../store/types/index.js";
45
68
  import {
46
69
  createConnectionManager,
@@ -68,6 +91,7 @@ import type {
68
91
  MAPPeerConfig,
69
92
  } from "../federation/types.js";
70
93
  import { ACPOverMAPHandler, type ACPEnvelope } from "./acp-over-map.js";
94
+ import { createMailHandlers } from "./mail-handler-adapter.js";
71
95
 
72
96
  // =============================================================================
73
97
  // Connection Session
@@ -147,6 +171,11 @@ export interface MAPAdapterServices {
147
171
  * Default working directory for ACP sessions.
148
172
  */
149
173
  defaultCwd?: string;
174
+
175
+ /**
176
+ * Mail service for conversation tracking.
177
+ */
178
+ mailService?: import("../../mail/mail-service.js").MailService;
150
179
  }
151
180
 
152
181
  /**
@@ -196,7 +225,8 @@ export class MAPAdapterImpl implements MAPAdapter {
196
225
  private readonly services: MAPAdapterServices;
197
226
  private readonly acpOverMapHandler: ACPOverMAPHandler | null = null;
198
227
  /** Sequence numbers per subscription for proper event ordering */
199
- private readonly subscriptionSequences: Map<SubscriptionId, number> = new Map();
228
+ private readonly subscriptionSequences: Map<SubscriptionId, number> =
229
+ new Map();
200
230
 
201
231
  private running = false;
202
232
 
@@ -512,8 +542,7 @@ export class MAPAdapterImpl implements MAPAdapter {
512
542
 
513
543
  emitEvent(event: EventNotification): void {
514
544
  // Match event against subscriptions
515
- const { subscriptions: matchingSubs } =
516
- this.subscriptions.match(event);
545
+ const { subscriptions: matchingSubs } = this.subscriptions.match(event);
517
546
 
518
547
  // Send to each matched subscription with proper SDK format
519
548
  // SDK EventNotificationParams: { subscriptionId, sequenceNumber, eventId?, timestamp?, event, causedBy? }
@@ -528,9 +557,10 @@ export class MAPAdapterImpl implements MAPAdapter {
528
557
  const params = {
529
558
  subscriptionId: subscription.id,
530
559
  sequenceNumber: currentSeq,
531
- eventId: event.eventId, // For deduplication
560
+ eventId: event.eventId, // For deduplication
532
561
  timestamp: event.timestamp, // Envelope timestamp
533
- event: { // The actual event object
562
+ event: {
563
+ // The actual event object
534
564
  id: event.eventId,
535
565
  type: event.type,
536
566
  timestamp: event.timestamp,
@@ -717,6 +747,14 @@ export class MAPAdapterImpl implements MAPAdapter {
717
747
  };
718
748
  }
719
749
 
750
+ // Add mail protocol handlers if mail service is available
751
+ if (this.services.mailService) {
752
+ const mailHandlers = createMailHandlers(this.services.mailService);
753
+ for (const [method, handler] of Object.entries(mailHandlers)) {
754
+ handlers[method] = handler;
755
+ }
756
+ }
757
+
720
758
  // Capability requirements for methods
721
759
  const capabilityRequirements: Record<
722
760
  string,
@@ -829,8 +867,55 @@ export class MAPAdapterImpl implements MAPAdapter {
829
867
  throw RPCError.notFound("participant", participantId);
830
868
  }
831
869
 
832
- // TODO: Handle authentication when auth hook is provided
833
- // For now, return the already-assigned capabilities
870
+ // Parse connect request parameters
871
+ const connectParams = params as
872
+ | {
873
+ type?: ParticipantType;
874
+ name?: string;
875
+ credentials?: AuthCredentials;
876
+ }
877
+ | undefined;
878
+
879
+ const requestedType = connectParams?.type ?? participant.type;
880
+ const credentials = connectParams?.credentials;
881
+
882
+ // Handle authentication if handler is configured and credentials provided
883
+ if (this.config.authenticate && credentials) {
884
+ const authResult = await this.config.authenticate(
885
+ requestedType,
886
+ credentials,
887
+ );
888
+
889
+ if (!authResult.allowed) {
890
+ throw RPCError.authenticationFailed(
891
+ authResult.error ?? "Authentication failed",
892
+ );
893
+ }
894
+
895
+ // Update capabilities based on auth result
896
+ const newCapabilities =
897
+ authResult.capabilities ?? this.getDefaultCapabilities(requestedType);
898
+ this.connections.updateCapabilities(participantId, newCapabilities);
899
+
900
+ // Return updated participant info
901
+ const updatedParticipant = this.connections.getParticipant(participantId);
902
+ return {
903
+ participantId: participant.id,
904
+ capabilities: updatedParticipant?.capabilities ?? newCapabilities,
905
+ };
906
+ }
907
+
908
+ // No auth handler or no credentials - use default capabilities for the type
909
+ if (requestedType !== participant.type) {
910
+ const defaultCapabilities = this.getDefaultCapabilities(requestedType);
911
+ this.connections.updateCapabilities(participantId, defaultCapabilities);
912
+
913
+ const updatedParticipant = this.connections.getParticipant(participantId);
914
+ return {
915
+ participantId: participant.id,
916
+ capabilities: updatedParticipant?.capabilities ?? defaultCapabilities,
917
+ };
918
+ }
834
919
 
835
920
  return {
836
921
  participantId: participant.id,
@@ -838,6 +923,53 @@ export class MAPAdapterImpl implements MAPAdapter {
838
923
  };
839
924
  }
840
925
 
926
+ /**
927
+ * Get default capabilities for a participant type.
928
+ */
929
+ private getDefaultCapabilities(
930
+ type: ParticipantType,
931
+ ): ParticipantCapabilities {
932
+ switch (type) {
933
+ case "agent":
934
+ return (
935
+ this.config.defaultAgentCapabilities ?? {
936
+ canQuery: true,
937
+ canSubscribe: true,
938
+ canMessage: true,
939
+ canSpawn: true,
940
+ canStop: true,
941
+ canManageScopes: true,
942
+ canManageTasks: true,
943
+ canManageFederation: true,
944
+ }
945
+ );
946
+ case "gateway":
947
+ return {
948
+ canQuery: true,
949
+ canSubscribe: true,
950
+ canMessage: true,
951
+ canSpawn: false,
952
+ canStop: false,
953
+ canManageScopes: false,
954
+ canManageTasks: false,
955
+ canManageFederation: true,
956
+ };
957
+ case "client":
958
+ default:
959
+ return (
960
+ this.config.defaultClientCapabilities ?? {
961
+ canQuery: true,
962
+ canSubscribe: true,
963
+ canMessage: true,
964
+ canSpawn: false,
965
+ canStop: false,
966
+ canManageScopes: false,
967
+ canManageTasks: false,
968
+ }
969
+ );
970
+ }
971
+ }
972
+
841
973
  private async handleDisconnect(
842
974
  participantId: ParticipantId,
843
975
  ): Promise<{ success: boolean }> {
@@ -903,8 +1035,15 @@ export class MAPAdapterImpl implements MAPAdapter {
903
1035
 
904
1036
  // Check if this is an ACP-over-MAP message
905
1037
  // SDK sends ACP envelope directly as payload (not wrapped in content)
906
- const rawPayload = payload as unknown as Record<string, unknown> | undefined;
907
- if (rawPayload && typeof rawPayload === 'object' && 'acp' in rawPayload && 'acpContext' in rawPayload) {
1038
+ const rawPayload = payload as unknown as
1039
+ | Record<string, unknown>
1040
+ | undefined;
1041
+ if (
1042
+ rawPayload &&
1043
+ typeof rawPayload === "object" &&
1044
+ "acp" in rawPayload &&
1045
+ "acpContext" in rawPayload
1046
+ ) {
908
1047
  // This is an ACP envelope - route through ACP-over-MAP handler
909
1048
  return this.handleACPOverMAP(participantId, to, rawPayload, ctx);
910
1049
  }
@@ -923,7 +1062,9 @@ export class MAPAdapterImpl implements MAPAdapter {
923
1062
  ctx: HandlerContext,
924
1063
  ): Promise<SendResult> {
925
1064
  if (!this.acpOverMapHandler) {
926
- throw RPCError.internalError("ACP-over-MAP not available - missing services");
1065
+ throw RPCError.internalError(
1066
+ "ACP-over-MAP not available - missing services",
1067
+ );
927
1068
  }
928
1069
 
929
1070
  const acp = envelope.acp as {
@@ -940,7 +1081,9 @@ export class MAPAdapterImpl implements MAPAdapter {
940
1081
  direction: string;
941
1082
  };
942
1083
 
943
- console.error(`[ACP-over-MAP] Received - method=${acp.method} to=${JSON.stringify(to)}`);
1084
+ console.error(
1085
+ `[ACP-over-MAP] Received - method=${acp.method} to=${JSON.stringify(to)}`,
1086
+ );
944
1087
 
945
1088
  // For now, we only support messages to specific agents
946
1089
  if (!isAgentAddress(to)) {
@@ -953,7 +1096,12 @@ export class MAPAdapterImpl implements MAPAdapter {
953
1096
  if (!acp.method) {
954
1097
  // This is a response - route it normally
955
1098
  console.error(`[ACP-over-MAP] Routing response back`);
956
- return this.sendMessage(participantId, to, { content: envelope }, undefined);
1099
+ return this.sendMessage(
1100
+ participantId,
1101
+ to,
1102
+ { content: envelope },
1103
+ undefined,
1104
+ );
957
1105
  }
958
1106
 
959
1107
  // Create notification emitter to stream session updates
@@ -981,7 +1129,7 @@ export class MAPAdapterImpl implements MAPAdapter {
981
1129
  const responseEnvelope = await this.acpOverMapHandler.processRequest(
982
1130
  targetAgentId,
983
1131
  acpEnvelope,
984
- emitNotification
1132
+ emitNotification,
985
1133
  );
986
1134
 
987
1135
  console.error(`[ACP-over-MAP] Request processed - method=${acp.method}`);
@@ -1167,9 +1315,7 @@ export class MAPAdapterImpl implements MAPAdapter {
1167
1315
  }
1168
1316
  }
1169
1317
 
1170
- private async handleFederationList(
1171
- participantId: ParticipantId,
1172
- ): Promise<{
1318
+ private async handleFederationList(participantId: ParticipantId): Promise<{
1173
1319
  peers: Array<{ systemId: string; status: string; connectedAt: number }>;
1174
1320
  }> {
1175
1321
  if (!this.services.federationHandler) {
@@ -116,6 +116,8 @@ export const MAP_ERRORS = {
116
116
  RATE_LIMIT_EXCEEDED: -32011,
117
117
  /** Resource limit exceeded. */
118
118
  RESOURCE_LIMIT_EXCEEDED: -32012,
119
+ /** Authentication failed. */
120
+ AUTHENTICATION_FAILED: -32013,
119
121
  /** Invalid address. */
120
122
  INVALID_ADDRESS: -32020,
121
123
  /** Routing failed. */
@@ -311,13 +313,14 @@ export class RPCError extends Error {
311
313
  return new RPCError(MAP_ERRORS.PERMISSION_DENIED, message);
312
314
  }
313
315
 
314
- static notFound(type: "agent" | "scope" | "subscription" | "participant" | "peer", id: string): RPCError {
316
+ static notFound(type: "agent" | "scope" | "subscription" | "participant" | "peer" | "conversation", id: string): RPCError {
315
317
  const codes = {
316
318
  agent: MAP_ERRORS.AGENT_NOT_FOUND,
317
319
  scope: MAP_ERRORS.SCOPE_NOT_FOUND,
318
320
  subscription: MAP_ERRORS.SUBSCRIPTION_NOT_FOUND,
319
321
  participant: MAP_ERRORS.PARTICIPANT_NOT_FOUND,
320
322
  peer: MAP_ERRORS.NOT_CONNECTED, // Use NOT_CONNECTED for peer not found
323
+ conversation: JSON_RPC_ERRORS.INTERNAL_ERROR,
321
324
  };
322
325
  return new RPCError(codes[type], `${type} not found: ${id}`);
323
326
  }
@@ -333,6 +336,10 @@ export class RPCError extends Error {
333
336
  static routingFailed(message: string): RPCError {
334
337
  return new RPCError(MAP_ERRORS.ROUTING_FAILED, message);
335
338
  }
339
+
340
+ static authenticationFailed(message: string): RPCError {
341
+ return new RPCError(MAP_ERRORS.AUTHENTICATION_FAILED, message);
342
+ }
336
343
  }
337
344
 
338
345
  // =============================================================================
package/src/map/index.ts CHANGED
@@ -14,3 +14,6 @@ export * from "./types.js";
14
14
 
15
15
  // Adapter types
16
16
  export * from "./adapter/index.js";
17
+
18
+ // Federation types and handler
19
+ export * from "./federation/index.js";
package/src/map/types.ts CHANGED
@@ -337,8 +337,10 @@ export function isFederatedAddress(addr: Address): addr is FederatedAddress {
337
337
  /**
338
338
  * Message priority levels.
339
339
  * Higher priority messages may wake sleeping agents.
340
+ * Re-exported from router/types.ts to maintain single source of truth.
340
341
  */
341
- export type MessagePriority = "low" | "normal" | "high" | "urgent";
342
+ import type { MessagePriority } from "../router/types.js";
343
+ export type { MessagePriority };
342
344
 
343
345
  /**
344
346
  * Delivery hint for message routing.
@@ -36,6 +36,21 @@ import {
36
36
  formatInjectContextResult,
37
37
  INJECT_CONTEXT_TOOL_INFO,
38
38
  } from "./tools/inject_context.js";
39
+ import {
40
+ ClaimTaskSchema,
41
+ createClaimTaskHandler,
42
+ CLAIM_TASK_TOOL_INFO,
43
+ } from "./tools/claim_task.js";
44
+ import {
45
+ UnclaimTaskSchema,
46
+ createUnclaimTaskHandler,
47
+ UNCLAIM_TASK_TOOL_INFO,
48
+ } from "./tools/unclaim_task.js";
49
+ import {
50
+ ListClaimableTasksSchema,
51
+ createListClaimableTasksHandler,
52
+ LIST_CLAIMABLE_TASKS_TOOL_INFO,
53
+ } from "./tools/list_claimable_tasks.js";
39
54
  import type { TaskToolProvider } from "../task/backend/types.js";
40
55
  import type { RoleRegistry, RoleDefinition } from "../roles/types.js";
41
56
  import { DefaultRoleRegistry } from "../roles/registry.js";
@@ -82,6 +97,12 @@ export interface MCPServices {
82
97
  taskToolProvider?: TaskToolProvider;
83
98
  /** Optional role registry for role-based tool filtering */
84
99
  roleRegistry?: RoleRegistry;
100
+ /** Optional task mode from team config (push or pull) */
101
+ taskMode?: "push" | "pull";
102
+ /** Optional integration strategy from team config */
103
+ integrationStrategy?: import("../workspace/strategies/types.js").IntegrationStrategy;
104
+ /** Optional task backend for pull model tools (claim/unclaim) */
105
+ taskBackend?: import("../task/backend/types.js").TaskBackend;
85
106
  }
86
107
 
87
108
  // ─────────────────────────────────────────────────────────────────
@@ -1093,6 +1114,9 @@ export function createMCPServer(
1093
1114
  agentManager,
1094
1115
  messageRouter,
1095
1116
  taskManager,
1117
+ roleRegistry,
1118
+ integrationStrategy: services.integrationStrategy,
1119
+ taskMode: services.taskMode,
1096
1120
  });
1097
1121
 
1098
1122
  try {
@@ -1134,6 +1158,49 @@ export function createMCPServer(
1134
1158
  });
1135
1159
  }
1136
1160
 
1161
+ // ─────────────────────────────────────────────────────────────────
1162
+ // Tools: claim_task, unclaim_task, list_claimable_tasks (pull model)
1163
+ // ─────────────────────────────────────────────────────────────────
1164
+
1165
+ if (services.taskBackend && shouldRegisterTool("claim_task")) {
1166
+ server.registerTool(CLAIM_TASK_TOOL_INFO.name, {
1167
+ description: CLAIM_TASK_TOOL_INFO.description,
1168
+ inputSchema: ClaimTaskSchema,
1169
+ }, async (args) => {
1170
+ const handler = createClaimTaskHandler(context, {
1171
+ taskBackend: services.taskBackend!,
1172
+ });
1173
+ const result = await handler(args as { tags?: string[]; root_tasks_only?: boolean });
1174
+ return { content: [{ type: "text" as const, text: JSON.stringify(result) }] };
1175
+ });
1176
+ }
1177
+
1178
+ if (services.taskBackend && shouldRegisterTool("unclaim_task")) {
1179
+ server.registerTool(UNCLAIM_TASK_TOOL_INFO.name, {
1180
+ description: UNCLAIM_TASK_TOOL_INFO.description,
1181
+ inputSchema: UnclaimTaskSchema,
1182
+ }, async (args) => {
1183
+ const handler = createUnclaimTaskHandler(context, {
1184
+ taskBackend: services.taskBackend!,
1185
+ });
1186
+ const result = await handler(args as { task_id: string });
1187
+ return { content: [{ type: "text" as const, text: JSON.stringify(result) }] };
1188
+ });
1189
+ }
1190
+
1191
+ if (services.taskBackend && shouldRegisterTool("list_claimable_tasks")) {
1192
+ server.registerTool(LIST_CLAIMABLE_TASKS_TOOL_INFO.name, {
1193
+ description: LIST_CLAIMABLE_TASKS_TOOL_INFO.description,
1194
+ inputSchema: ListClaimableTasksSchema,
1195
+ }, async (args) => {
1196
+ const handler = createListClaimableTasksHandler(context, {
1197
+ taskBackend: services.taskBackend!,
1198
+ });
1199
+ const result = await handler(args as { tags?: string[]; root_tasks_only?: boolean; limit?: number });
1200
+ return { content: [{ type: "text" as const, text: JSON.stringify(result) }] };
1201
+ });
1202
+ }
1203
+
1137
1204
  // ─────────────────────────────────────────────────────────────────
1138
1205
  // Tool: inject_context (always allowed - parent-to-child communication)
1139
1206
  // ─────────────────────────────────────────────────────────────────
@@ -0,0 +1,86 @@
1
+ /**
2
+ * claim_task() MCP Tool
3
+ *
4
+ * Allows agents with `task.claim` capability to claim the next available task.
5
+ * Used in the pull model where agents autonomously pick up work.
6
+ *
7
+ * @module mcp/tools/claim_task
8
+ */
9
+
10
+ import { z } from "zod";
11
+ import type { TaskBackend, ClaimFilter, ExtendedTask } from "../../task/backend/types.js";
12
+ import type { ToolContext } from "../types.js";
13
+
14
+ // =============================================================================
15
+ // Schema
16
+ // =============================================================================
17
+
18
+ export const ClaimTaskSchema = {
19
+ tags: z
20
+ .array(z.string())
21
+ .optional()
22
+ .describe("Only claim tasks with at least one matching tag"),
23
+ root_tasks_only: z
24
+ .boolean()
25
+ .optional()
26
+ .describe("Only claim root tasks (no parent)"),
27
+ };
28
+
29
+ // =============================================================================
30
+ // Handler
31
+ // =============================================================================
32
+
33
+ export interface ClaimTaskDeps {
34
+ taskBackend: TaskBackend;
35
+ }
36
+
37
+ export function createClaimTaskHandler(
38
+ context: ToolContext,
39
+ deps: ClaimTaskDeps
40
+ ) {
41
+ return async (args: {
42
+ tags?: string[];
43
+ root_tasks_only?: boolean;
44
+ }): Promise<{
45
+ claimed: boolean;
46
+ task?: ExtendedTask;
47
+ message: string;
48
+ }> => {
49
+ if (!deps.taskBackend.claim) {
50
+ return {
51
+ claimed: false,
52
+ message: "Task backend does not support claim operations",
53
+ };
54
+ }
55
+
56
+ const filter: ClaimFilter = {};
57
+ if (args.tags) filter.tags = args.tags;
58
+ if (args.root_tasks_only) filter.rootTasksOnly = args.root_tasks_only;
59
+
60
+ const task = await deps.taskBackend.claim(context.agent_id, filter);
61
+
62
+ if (!task) {
63
+ return {
64
+ claimed: false,
65
+ message: "No claimable tasks available",
66
+ };
67
+ }
68
+
69
+ return {
70
+ claimed: true,
71
+ task,
72
+ message: `Claimed task ${task.id}: ${task.description}`,
73
+ };
74
+ };
75
+ }
76
+
77
+ // =============================================================================
78
+ // Tool Info
79
+ // =============================================================================
80
+
81
+ export const CLAIM_TASK_TOOL_INFO = {
82
+ name: "claim_task",
83
+ description:
84
+ "Claim the next available task from the task pool. Returns the claimed task or null if none available. Requires task.claim capability.",
85
+ schema: ClaimTaskSchema,
86
+ };
@@ -65,6 +65,16 @@ export interface DoneToolDeps {
65
65
  /** Get merge queue for coordinating worker merges */
66
66
  getMergeQueue?(): AllHandlerDeps["mergeQueue"];
67
67
  };
68
+ /** Optional RoleRegistry for capability-based done() checks */
69
+ roleRegistry?: import("../../roles/types.js").RoleRegistry;
70
+ /** Optional MailService for recording completion turns */
71
+ mailService?: import("../../mail/mail-service.js").MailService;
72
+ /** Optional ConversationMap for agent-to-conversation lookup */
73
+ conversationMap?: import("../../mail/conversation-map.js").ConversationMap;
74
+ /** Optional integration strategy (from team config) */
75
+ integrationStrategy?: import("../../workspace/strategies/types.js").IntegrationStrategy;
76
+ /** Optional task mode from team config */
77
+ taskMode?: "push" | "pull";
68
78
  }
69
79
 
70
80
  // =============================================================================
@@ -72,11 +82,15 @@ export interface DoneToolDeps {
72
82
  // =============================================================================
73
83
 
74
84
  /**
75
- * Check if an agent has the lifecycle.done capability
85
+ * Check if an agent has the lifecycle.done capability.
86
+ *
87
+ * Uses RoleRegistry for capability resolution, supporting both built-in
88
+ * roles and team-defined roles that extend them.
76
89
  */
77
90
  export function hasLifecycleDoneCapability(
78
91
  eventStore: EventStore,
79
- agentId: string
92
+ agentId: string,
93
+ roleRegistry?: import("../../roles/types.js").RoleRegistry
80
94
  ): { hasCapability: boolean; role: string } {
81
95
  // Get the agent to find their role
82
96
  const agent = eventStore.getAgent(agentId);
@@ -84,13 +98,15 @@ export function hasLifecycleDoneCapability(
84
98
  return { hasCapability: false, role: "unknown" };
85
99
  }
86
100
 
87
- // Get the agent's role (set at spawn time) or default to "worker"
88
- // In the future, this should query the RoleRegistry for full capability lookup
89
101
  const role = agent.role ?? "worker";
90
102
 
91
- // Check if the role has lifecycle.done capability
92
- // For now, we check based on known roles that have this capability
93
- // In the future, this should query the RoleRegistry
103
+ // Use RoleRegistry for capability lookup when available
104
+ if (roleRegistry) {
105
+ const hasCapability = roleRegistry.hasCapability(role, "lifecycle.done");
106
+ return { hasCapability, role };
107
+ }
108
+
109
+ // Fallback: check base role via prefix match against known built-in roles
94
110
  const rolesWithDoneCapability = new Set([
95
111
  "worker",
96
112
  "worker.resolver",
@@ -98,7 +114,6 @@ export function hasLifecycleDoneCapability(
98
114
  "monitor",
99
115
  ]);
100
116
 
101
- // Check exact match or prefix match
102
117
  const hasCapability =
103
118
  rolesWithDoneCapability.has(role) ||
104
119
  rolesWithDoneCapability.has(role.split(".")[0]);
@@ -158,7 +173,7 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
158
173
  details?: Record<string, unknown>;
159
174
  task_id?: string;
160
175
  }): Promise<DoneResult> => {
161
- const { eventStore, agentManager, messageRouter, taskManager, workspaceManager } = deps;
176
+ const { eventStore, agentManager, messageRouter, taskManager, workspaceManager, roleRegistry, mailService, conversationMap } = deps;
162
177
 
163
178
  // ─────────────────────────────────────────────────────────────────────────
164
179
  // Step 1: Check capability
@@ -166,7 +181,8 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
166
181
 
167
182
  const { hasCapability, role } = hasLifecycleDoneCapability(
168
183
  eventStore,
169
- context.agent_id
184
+ context.agent_id,
185
+ roleRegistry
170
186
  );
171
187
 
172
188
  if (!hasCapability) {
@@ -233,6 +249,37 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
233
249
  // Continue even if emit fails
234
250
  }
235
251
 
252
+ // ─────────────────────────────────────────────────────────────────────────
253
+ // Step 4b: Record completion turn and close conversation (Mail)
254
+ // ─────────────────────────────────────────────────────────────────────────
255
+ if (mailService && conversationMap) {
256
+ try {
257
+ const convId = conversationMap.getAgentConversation(context.agent_id);
258
+ if (convId) {
259
+ // Record completion turn
260
+ mailService.recordTurn({
261
+ conversationId: convId,
262
+ participant: context.agent_id,
263
+ contentType: "event",
264
+ content: {
265
+ event: `agent.${args.status}`,
266
+ summary: args.summary,
267
+ details: args.details,
268
+ },
269
+ });
270
+
271
+ // Close the conversation
272
+ mailService.closeConversation({
273
+ conversationId: convId,
274
+ closedBy: context.agent_id,
275
+ reason: args.status,
276
+ });
277
+ }
278
+ } catch {
279
+ // Never fail done() due to mail errors
280
+ }
281
+ }
282
+
236
283
  // ─────────────────────────────────────────────────────────────────────────
237
284
  // Step 5: Dispatch to role-specific handler
238
285
  // ─────────────────────────────────────────────────────────────────────────
@@ -251,6 +298,8 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
251
298
  getWorkspacePath: workspaceManager
252
299
  ? (agentId: string) => workspaceManager.getWorkspace(agentId)?.path
253
300
  : undefined,
301
+ integrationStrategy: deps.integrationStrategy,
302
+ taskMode: deps.taskMode,
254
303
  };
255
304
 
256
305
  const handlerResult = await dispatchDone(