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,93 @@
1
+ /**
2
+ * list_claimable_tasks() MCP Tool
3
+ *
4
+ * Lists tasks available for claiming. Allows agents to preview
5
+ * what's in the task pool before claiming.
6
+ *
7
+ * @module mcp/tools/list_claimable_tasks
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 ListClaimableTasksSchema = {
19
+ tags: z
20
+ .array(z.string())
21
+ .optional()
22
+ .describe("Only list tasks with at least one matching tag"),
23
+ root_tasks_only: z
24
+ .boolean()
25
+ .optional()
26
+ .describe("Only list root tasks (no parent)"),
27
+ limit: z
28
+ .number()
29
+ .optional()
30
+ .describe("Maximum number of tasks to return (default: 20)"),
31
+ };
32
+
33
+ // =============================================================================
34
+ // Handler
35
+ // =============================================================================
36
+
37
+ export interface ListClaimableTasksDeps {
38
+ taskBackend: TaskBackend;
39
+ }
40
+
41
+ export function createListClaimableTasksHandler(
42
+ _context: ToolContext,
43
+ deps: ListClaimableTasksDeps
44
+ ) {
45
+ return async (args: {
46
+ tags?: string[];
47
+ root_tasks_only?: boolean;
48
+ limit?: number;
49
+ }): Promise<{
50
+ tasks: ExtendedTask[];
51
+ count: number;
52
+ message: string;
53
+ }> => {
54
+ if (!deps.taskBackend.listClaimable) {
55
+ return {
56
+ tasks: [],
57
+ count: 0,
58
+ message: "Task backend does not support listClaimable operations",
59
+ };
60
+ }
61
+
62
+ const filter: ClaimFilter = {};
63
+ if (args.tags) filter.tags = args.tags;
64
+ if (args.root_tasks_only) filter.rootTasksOnly = args.root_tasks_only;
65
+
66
+ let tasks = await deps.taskBackend.listClaimable(filter);
67
+
68
+ const limit = args.limit ?? 20;
69
+ if (tasks.length > limit) {
70
+ tasks = tasks.slice(0, limit);
71
+ }
72
+
73
+ return {
74
+ tasks,
75
+ count: tasks.length,
76
+ message:
77
+ tasks.length > 0
78
+ ? `Found ${tasks.length} claimable task(s)`
79
+ : "No claimable tasks available",
80
+ };
81
+ };
82
+ }
83
+
84
+ // =============================================================================
85
+ // Tool Info
86
+ // =============================================================================
87
+
88
+ export const LIST_CLAIMABLE_TASKS_TOOL_INFO = {
89
+ name: "list_claimable_tasks",
90
+ description:
91
+ "List tasks available for claiming. Shows pending, unblocked, unassigned tasks. Requires task.claim capability.",
92
+ schema: ListClaimableTasksSchema,
93
+ };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * unclaim_task() MCP Tool
3
+ *
4
+ * Allows agents with `task.claim` capability to release a claimed task
5
+ * back to the pending pool.
6
+ *
7
+ * @module mcp/tools/unclaim_task
8
+ */
9
+
10
+ import { z } from "zod";
11
+ import type { TaskBackend } from "../../task/backend/types.js";
12
+ import type { ToolContext } from "../types.js";
13
+
14
+ // =============================================================================
15
+ // Schema
16
+ // =============================================================================
17
+
18
+ export const UnclaimTaskSchema = {
19
+ task_id: z.string().describe("ID of the task to unclaim"),
20
+ };
21
+
22
+ // =============================================================================
23
+ // Handler
24
+ // =============================================================================
25
+
26
+ export interface UnclaimTaskDeps {
27
+ taskBackend: TaskBackend;
28
+ }
29
+
30
+ export function createUnclaimTaskHandler(
31
+ _context: ToolContext,
32
+ deps: UnclaimTaskDeps
33
+ ) {
34
+ return async (args: {
35
+ task_id: string;
36
+ }): Promise<{
37
+ success: boolean;
38
+ message: string;
39
+ }> => {
40
+ if (!deps.taskBackend.unclaim) {
41
+ return {
42
+ success: false,
43
+ message: "Task backend does not support unclaim operations",
44
+ };
45
+ }
46
+
47
+ try {
48
+ await deps.taskBackend.unclaim(args.task_id);
49
+ return {
50
+ success: true,
51
+ message: `Task ${args.task_id} unclaimed and returned to pending pool`,
52
+ };
53
+ } catch (error) {
54
+ return {
55
+ success: false,
56
+ message: `Failed to unclaim task: ${error instanceof Error ? error.message : String(error)}`,
57
+ };
58
+ }
59
+ };
60
+ }
61
+
62
+ // =============================================================================
63
+ // Tool Info
64
+ // =============================================================================
65
+
66
+ export const UNCLAIM_TASK_TOOL_INFO = {
67
+ name: "unclaim_task",
68
+ description:
69
+ "Release a claimed task back to the pending pool so another agent can pick it up. Requires task.claim capability.",
70
+ schema: UnclaimTaskSchema,
71
+ };
@@ -0,0 +1,9 @@
1
+ export {
2
+ getThroughputMetrics,
3
+ getUtilizationMetrics,
4
+ getErrorMetrics,
5
+ type ThroughputMetrics,
6
+ type UtilizationMetrics,
7
+ type ErrorMetrics,
8
+ type ErrorEntry,
9
+ } from "./metrics.js";
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Metrics Module
3
+ *
4
+ * Computes throughput, utilization, and error metrics from EventStore data.
5
+ * No new events needed — aggregates existing spawn, terminate, task, and
6
+ * status events.
7
+ *
8
+ * @module metrics/metrics
9
+ */
10
+
11
+ import type { EventStore } from "../store/event-store.js";
12
+ import type { Agent } from "../store/types/index.js";
13
+
14
+ // =============================================================================
15
+ // Types
16
+ // =============================================================================
17
+
18
+ export interface ThroughputMetrics {
19
+ /** Tasks completed in the time window */
20
+ tasksCompleted: number;
21
+
22
+ /** Tasks failed in the time window */
23
+ tasksFailed: number;
24
+
25
+ /** Total tasks created in the time window */
26
+ tasksCreated: number;
27
+
28
+ /** Average completion time in ms (completed tasks only) */
29
+ avgCompletionTimeMs: number | null;
30
+
31
+ /** Tasks per minute (completed) */
32
+ completedPerMinute: number;
33
+
34
+ /** Time window start */
35
+ windowStart: number;
36
+
37
+ /** Time window end */
38
+ windowEnd: number;
39
+ }
40
+
41
+ export interface UtilizationMetrics {
42
+ /** Currently running agents */
43
+ activeAgents: number;
44
+
45
+ /** Total agents spawned in the time window */
46
+ totalSpawned: number;
47
+
48
+ /** Total agents stopped in the time window */
49
+ totalStopped: number;
50
+
51
+ /** Agents by role */
52
+ agentsByRole: Record<string, number>;
53
+
54
+ /** Agents by state */
55
+ agentsByState: Record<string, number>;
56
+ }
57
+
58
+ export interface ErrorMetrics {
59
+ /** Total errors in the time window */
60
+ totalErrors: number;
61
+
62
+ /** Errors by type */
63
+ errorsByType: Record<string, number>;
64
+
65
+ /** Recent errors (last N) */
66
+ recentErrors: ErrorEntry[];
67
+ }
68
+
69
+ export interface ErrorEntry {
70
+ /** Timestamp */
71
+ timestamp: number;
72
+
73
+ /** Agent ID */
74
+ agentId: string;
75
+
76
+ /** Error type/category */
77
+ type: string;
78
+
79
+ /** Error summary */
80
+ summary: string;
81
+ }
82
+
83
+ // =============================================================================
84
+ // Implementation
85
+ // =============================================================================
86
+
87
+ /**
88
+ * Compute throughput metrics for a time window.
89
+ *
90
+ * @param eventStore - EventStore to query
91
+ * @param windowMs - Time window in milliseconds (default: 5 minutes)
92
+ */
93
+ export function getThroughputMetrics(
94
+ eventStore: EventStore,
95
+ windowMs: number = 5 * 60 * 1000
96
+ ): ThroughputMetrics {
97
+ const now = Date.now();
98
+ const windowStart = now - windowMs;
99
+
100
+ const taskEvents = eventStore.query({
101
+ type: "task",
102
+ after: windowStart,
103
+ });
104
+
105
+ let tasksCompleted = 0;
106
+ let tasksFailed = 0;
107
+ let tasksCreated = 0;
108
+ let totalCompletionTimeMs = 0;
109
+ let completedWithTime = 0;
110
+
111
+ for (const event of taskEvents) {
112
+ const action = event.payload?.action as string | undefined;
113
+
114
+ if (action === "created") {
115
+ tasksCreated++;
116
+ } else if (action === "completed") {
117
+ tasksCompleted++;
118
+
119
+ // Try to compute completion time
120
+ const taskId = event.payload?.task_id as string | undefined;
121
+ if (taskId) {
122
+ const task = eventStore.getTask(taskId);
123
+ if (task?.created_at && task?.completed_at) {
124
+ totalCompletionTimeMs += task.completed_at - task.created_at;
125
+ completedWithTime++;
126
+ }
127
+ }
128
+ } else if (action === "failed") {
129
+ tasksFailed++;
130
+ }
131
+ }
132
+
133
+ const windowMinutes = windowMs / 60000;
134
+ const completedPerMinute =
135
+ windowMinutes > 0 ? tasksCompleted / windowMinutes : 0;
136
+
137
+ return {
138
+ tasksCompleted,
139
+ tasksFailed,
140
+ tasksCreated,
141
+ avgCompletionTimeMs:
142
+ completedWithTime > 0
143
+ ? Math.round(totalCompletionTimeMs / completedWithTime)
144
+ : null,
145
+ completedPerMinute: Math.round(completedPerMinute * 100) / 100,
146
+ windowStart,
147
+ windowEnd: now,
148
+ };
149
+ }
150
+
151
+ /**
152
+ * Compute utilization metrics (current snapshot + window).
153
+ *
154
+ * @param eventStore - EventStore to query
155
+ * @param windowMs - Time window for spawn/stop counts (default: 5 minutes)
156
+ */
157
+ export function getUtilizationMetrics(
158
+ eventStore: EventStore,
159
+ windowMs: number = 5 * 60 * 1000
160
+ ): UtilizationMetrics {
161
+ const now = Date.now();
162
+ const windowStart = now - windowMs;
163
+
164
+ // Current agents
165
+ const allAgents = eventStore.listAgents();
166
+ const activeAgents = allAgents.filter(
167
+ (a: Agent) => a.state === "running" || a.state === "spawning"
168
+ );
169
+
170
+ // Agents by role
171
+ const agentsByRole: Record<string, number> = {};
172
+ for (const agent of activeAgents) {
173
+ const role = agent.role ?? "unknown";
174
+ agentsByRole[role] = (agentsByRole[role] ?? 0) + 1;
175
+ }
176
+
177
+ // Agents by state
178
+ const agentsByState: Record<string, number> = {};
179
+ for (const agent of allAgents) {
180
+ agentsByState[agent.state] = (agentsByState[agent.state] ?? 0) + 1;
181
+ }
182
+
183
+ // Count spawn and terminate events in window
184
+ const spawnEvents = eventStore.query({
185
+ type: "spawn",
186
+ after: windowStart,
187
+ });
188
+ const terminateEvents = eventStore.query({
189
+ type: "terminate",
190
+ after: windowStart,
191
+ });
192
+
193
+ return {
194
+ activeAgents: activeAgents.length,
195
+ totalSpawned: spawnEvents.length,
196
+ totalStopped: terminateEvents.length,
197
+ agentsByRole,
198
+ agentsByState,
199
+ };
200
+ }
201
+
202
+ /**
203
+ * Compute error metrics for a time window.
204
+ *
205
+ * @param eventStore - EventStore to query
206
+ * @param windowMs - Time window in milliseconds (default: 30 minutes)
207
+ * @param maxRecent - Maximum recent errors to return (default: 20)
208
+ */
209
+ export function getErrorMetrics(
210
+ eventStore: EventStore,
211
+ windowMs: number = 30 * 60 * 1000,
212
+ maxRecent: number = 20
213
+ ): ErrorMetrics {
214
+ const now = Date.now();
215
+ const windowStart = now - windowMs;
216
+
217
+ // Query status events that indicate errors
218
+ const statusEvents = eventStore.query({
219
+ type: "status",
220
+ after: windowStart,
221
+ });
222
+
223
+ const errors: ErrorEntry[] = [];
224
+ const errorsByType: Record<string, number> = {};
225
+
226
+ for (const event of statusEvents) {
227
+ const statusType = event.payload?.status_type as string | undefined;
228
+ if (statusType !== "failed") continue;
229
+
230
+ const agentId =
231
+ (event.source as { agent_id?: string })?.agent_id ?? "unknown";
232
+ const summary =
233
+ (event.payload?.summary as string) ?? "Unknown error";
234
+ const errorType =
235
+ (event.payload?.details as Record<string, unknown>)?.signal as string ??
236
+ "agent_failed";
237
+
238
+ errors.push({
239
+ timestamp: event.timestamp,
240
+ agentId,
241
+ type: errorType,
242
+ summary,
243
+ });
244
+
245
+ errorsByType[errorType] = (errorsByType[errorType] ?? 0) + 1;
246
+ }
247
+
248
+ // Also count task failures
249
+ const taskEvents = eventStore.query({
250
+ type: "task",
251
+ after: windowStart,
252
+ });
253
+
254
+ for (const event of taskEvents) {
255
+ if (event.payload?.action !== "failed") continue;
256
+
257
+ const agentId =
258
+ (event.source as { agent_id?: string })?.agent_id ?? "unknown";
259
+ const taskId = (event.payload?.task_id as string) ?? "unknown";
260
+
261
+ errors.push({
262
+ timestamp: event.timestamp,
263
+ agentId,
264
+ type: "task_failed",
265
+ summary: `Task ${taskId} failed`,
266
+ });
267
+
268
+ errorsByType["task_failed"] = (errorsByType["task_failed"] ?? 0) + 1;
269
+ }
270
+
271
+ // Sort by timestamp descending and limit
272
+ errors.sort((a, b) => b.timestamp - a.timestamp);
273
+ const recentErrors = errors.slice(0, maxRecent);
274
+
275
+ return {
276
+ totalErrors: errors.length,
277
+ errorsByType,
278
+ recentErrors,
279
+ };
280
+ }
@@ -48,6 +48,7 @@ export const TASK_CAPABILITIES = {
48
48
  ASSIGN: "task.assign" as const,
49
49
  UPDATE: "task.update" as const,
50
50
  CLOSE: "task.close" as const,
51
+ CLAIM: "task.claim" as const,
51
52
  };
52
53
 
53
54
  /** Execution capabilities */
@@ -101,6 +102,7 @@ export const ALL_CAPABILITIES: Set<Capability> = new Set([
101
102
  TASK_CAPABILITIES.ASSIGN,
102
103
  TASK_CAPABILITIES.UPDATE,
103
104
  TASK_CAPABILITIES.CLOSE,
105
+ TASK_CAPABILITIES.CLAIM,
104
106
  // Exec
105
107
  EXEC_CAPABILITIES.COMMAND,
106
108
  EXEC_CAPABILITIES.BUILD,
@@ -159,6 +161,7 @@ export const CAPABILITY_TOOL_MAP: CapabilityToolMap = {
159
161
  [TASK_CAPABILITIES.ASSIGN]: ["sudocode_upsert_issue", "assign_task"],
160
162
  [TASK_CAPABILITIES.UPDATE]: ["sudocode_upsert_issue", "update_task"],
161
163
  [TASK_CAPABILITIES.CLOSE]: ["sudocode_upsert_issue", "close_task"],
164
+ [TASK_CAPABILITIES.CLAIM]: ["claim_task", "unclaim_task", "list_claimable_tasks"],
162
165
 
163
166
  // Execution operations
164
167
  [EXEC_CAPABILITIES.COMMAND]: ["bash"],
@@ -41,7 +41,8 @@ export type TaskCapability =
41
41
  | "task.create"
42
42
  | "task.assign"
43
43
  | "task.update"
44
- | "task.close";
44
+ | "task.close"
45
+ | "task.claim";
45
46
 
46
47
  /** Execution capabilities */
47
48
  export type ExecCapability =
@@ -0,0 +1,120 @@
1
+ # Router Module
2
+
3
+ Core internal message routing for macro-agent. Handles all agent-to-agent communication.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ ┌─────────────────────────────────────────────────────────────┐
9
+ │ MessageRouter │
10
+ │ │
11
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
12
+ │ │ Legacy API │ │ Address API │ │ Status/Events │ │
13
+ │ │ send() │ │ sendTo │ │ emitStatus() │ │
14
+ │ │ sendMessage │ │ Address() │ │ subscribe() │ │
15
+ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │
16
+ │ │ │ │ │
17
+ │ └────────────────┼───────────────────┘ │
18
+ │ ▼ │
19
+ │ ┌─────────────┐ │
20
+ │ │ EventStore │ │
21
+ │ └─────────────┘ │
22
+ └─────────────────────────────────────────────────────────────┘
23
+ ```
24
+
25
+ ## Components
26
+
27
+ ### MessageRouter (`message-router.ts`)
28
+
29
+ The central routing authority. Two APIs:
30
+
31
+ **Legacy Channel-based** (`send`, `sendMessage`):
32
+ ```typescript
33
+ router.send(from, { agent_id: targetId }, content);
34
+ router.send(from, { task_id: taskId }, content);
35
+ router.send(from, { topic: "updates" }, content);
36
+ ```
37
+
38
+ **MAP Address-based** (`sendToAddress`):
39
+ ```typescript
40
+ router.sendToAddress({
41
+ from: agentId,
42
+ to: { agent: targetId },
43
+ content: "Hello",
44
+ priority: "high",
45
+ });
46
+ ```
47
+
48
+ ### Channels (`channels.ts`, `types.ts`)
49
+
50
+ Channel types for legacy routing:
51
+ - `agent_id` - Direct to agent
52
+ - `task_id` - To task's assigned agent
53
+ - `topic` - Pub/sub topic
54
+ - `lineage` - To ancestors
55
+ - `subtree` - To descendants
56
+ - `broadcast` - System-wide
57
+
58
+ ### Role Resolution (`role-resolver.ts`)
59
+
60
+ Resolves role-based addresses to agent IDs:
61
+
62
+ ```typescript
63
+ const workers = resolveRoleTarget(agentSource, {
64
+ role: "worker",
65
+ scope: "project-1", // Filter by scope membership
66
+ coordinatorId: "coord-1", // Filter by subtree
67
+ });
68
+ ```
69
+
70
+ ### Wake Logic (`wake.ts`)
71
+
72
+ Priority-based wake decisions:
73
+ - `urgent` → Interrupt current activity
74
+ - `high` → Inject into session (fallback: interrupt)
75
+ - `normal` → Wake if idle
76
+ - `low` → Queue only
77
+
78
+ ### Broadcast (`broadcast.ts`)
79
+
80
+ Fan-out message delivery:
81
+ - `all` - All running agents
82
+ - `coordinators` - Agents with coordinator role
83
+ - `workers` - Agents with worker role
84
+ - `monitors` - Agents with monitor role
85
+
86
+ ## Usage
87
+
88
+ ```typescript
89
+ import { createMessageRouter } from "./router/message-router.js";
90
+
91
+ const router = createMessageRouter({
92
+ eventStore,
93
+ agentManager,
94
+ federationHandler, // Optional: for cross-system routing
95
+ });
96
+
97
+ // Send to agent
98
+ await router.sendToAddress({
99
+ from: senderId,
100
+ to: { agent: recipientId },
101
+ content: "Hello",
102
+ });
103
+
104
+ // Send to role
105
+ await router.sendToAddress({
106
+ from: senderId,
107
+ to: { role: "worker" },
108
+ content: "Task update",
109
+ });
110
+ ```
111
+
112
+ ## Relationship to Other Routers
113
+
114
+ | Router | Purpose | Entry Point |
115
+ |--------|---------|-------------|
116
+ | **MessageRouter** | Internal agent↔agent | AgentManager, MCP tools |
117
+ | **MAPAdapter** | External MAP clients | WebSocket connections |
118
+ | **TriggerRouter** | External events | Webhooks, cron |
119
+
120
+ MessageRouter is the **core authority** - other routers delegate to it.