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
@@ -235,11 +235,29 @@ export class ACPOverMAPHandler {
235
235
  throw new Error("Must call initialize before loadSession");
236
236
  }
237
237
 
238
- const { sessionId, cwd } = (params as { sessionId: string; cwd?: string }) ?? {};
239
- if (!sessionId) {
238
+ const { sessionId: rawSessionId, cwd, _meta } = (params as {
239
+ sessionId: string;
240
+ cwd?: string;
241
+ _meta?: Record<string, unknown>;
242
+ }) ?? {};
243
+ if (!rawSessionId) {
240
244
  throw new Error("sessionId required");
241
245
  }
242
246
 
247
+ // Extension: If _meta.agentId provided, look up session from agent record
248
+ let sessionId = rawSessionId;
249
+ const metaAgentId = _meta?.agentId as string | undefined;
250
+ if (metaAgentId) {
251
+ const agent = this.eventStore.getAgent(metaAgentId as AgentId);
252
+ if (!agent) {
253
+ throw new Error(`Agent not found: ${metaAgentId}`);
254
+ }
255
+ sessionId = agent.session_id;
256
+ console.error(
257
+ `[ACP-over-MAP] loadSession: Resolved agentId ${metaAgentId} to session ${sessionId}`
258
+ );
259
+ }
260
+
243
261
  const workingDir = cwd ?? this.defaultCwd;
244
262
 
245
263
  // Try to find an existing head manager with this session ID
@@ -484,6 +502,31 @@ export class ACPOverMAPHandler {
484
502
  return { task };
485
503
  }
486
504
 
505
+ case "_macro/resume": {
506
+ const { agentId } = methodParams as { agentId: string };
507
+ if (!agentId) {
508
+ throw new Error("agentId is required");
509
+ }
510
+
511
+ const agent = this.eventStore.getAgent(agentId as AgentId);
512
+ if (!agent) {
513
+ throw new Error(`Agent not found: ${agentId}`);
514
+ }
515
+
516
+ if (agent.state !== "stopped" && agent.state !== "failed") {
517
+ throw new Error(
518
+ `Agent ${agentId} is ${agent.state} — only stopped or failed agents can be resumed`
519
+ );
520
+ }
521
+
522
+ const spawned = await this.agentManager.resume(agentId as AgentId);
523
+ return {
524
+ success: true,
525
+ agentId: spawned.id,
526
+ sessionId: spawned.session_id,
527
+ };
528
+ }
529
+
487
530
  default:
488
531
  throw new Error(`Unknown extension method: ${method}`);
489
532
  }
@@ -54,6 +54,10 @@ const EVENT_TYPE_MAP: Record<EventType, MAPEventType | MAPEventType[] | null> =
54
54
  subscription: null, // Internal only, not exposed
55
55
  peer_message: null, // Federation, handled separately
56
56
  peer_request: null, // Federation, handled separately
57
+ conversation: null, // Mail: handled by mail module
58
+ turn: null, // Mail: handled by mail module
59
+ thread: null, // Mail: handled by mail module
60
+ session: null, // Internal session tracking
57
61
  };
58
62
 
59
63
  /**
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Agent Detection Extension Methods
3
+ *
4
+ * Exposes CLI agent auto-detection to external MAP clients:
5
+ * - `_macro/agents/available` — List detected CLI agents (cached)
6
+ * - `_macro/agents/refresh` — Force a fresh detection scan
7
+ *
8
+ * Both methods are read-only queries gated by `canQuery`.
9
+ */
10
+
11
+ import type { MAPAdapter, ExtensionHandler, ExtensionContext } from "../interface.js";
12
+ import type {
13
+ DetectedAgent,
14
+ DetectionResult,
15
+ } from "../../../agent-detection/types.js";
16
+
17
+ // =============================================================================
18
+ // Request/Response Types
19
+ // =============================================================================
20
+
21
+ interface AvailableParams {
22
+ /** Include agents that are not installed (default: false) */
23
+ includeNotInstalled?: boolean;
24
+ }
25
+
26
+ interface AvailableResult {
27
+ /** Detected agents */
28
+ agents: PublicDetectedAgent[];
29
+ /** Number of agent definitions scanned */
30
+ scanned: number;
31
+ /** Detection duration in milliseconds */
32
+ durationMs: number;
33
+ /** Whether results came from cache */
34
+ cached: boolean;
35
+ }
36
+
37
+ interface RefreshResult {
38
+ /** Detected agents (fresh scan) */
39
+ agents: PublicDetectedAgent[];
40
+ /** Number of agent definitions scanned */
41
+ scanned: number;
42
+ /** Detection duration in milliseconds */
43
+ durationMs: number;
44
+ }
45
+
46
+ /**
47
+ * Public agent info returned to MAP clients.
48
+ * Strips internal details (binary path) for security.
49
+ */
50
+ interface PublicDetectedAgent {
51
+ /** Agent definition ID (e.g., "claude-code") */
52
+ id: string;
53
+ /** Human-readable name */
54
+ name: string;
55
+ /** Whether the binary was found on PATH */
56
+ installed: boolean;
57
+ /** Parsed version string (e.g., "1.2.3") */
58
+ version?: string;
59
+ /** Provider/vendor name */
60
+ vendor: string;
61
+ /** Short description */
62
+ description: string;
63
+ }
64
+
65
+ // =============================================================================
66
+ // Extension Services
67
+ // =============================================================================
68
+
69
+ /**
70
+ * Services required for agent detection extensions.
71
+ *
72
+ * Uses narrow method signatures rather than exposing the full AgentDetector
73
+ * to keep the contract minimal and testable.
74
+ */
75
+ export interface AgentDetectionExtensionServices {
76
+ /**
77
+ * Get available agents, returning cached results when possible.
78
+ */
79
+ getAvailableAgents: (options?: {
80
+ refresh?: boolean;
81
+ includeNotInstalled?: boolean;
82
+ }) => Promise<DetectionResult>;
83
+
84
+ /**
85
+ * Whether a detection scan is currently running.
86
+ */
87
+ isDetecting: () => boolean;
88
+
89
+ /**
90
+ * Get cached result without triggering a new scan.
91
+ * Returns null if no results are available yet.
92
+ */
93
+ getCachedResult: () => DetectionResult | null;
94
+ }
95
+
96
+ // =============================================================================
97
+ // Helpers
98
+ // =============================================================================
99
+
100
+ /**
101
+ * Convert internal DetectedAgent to public format.
102
+ * Strips filesystem paths for security.
103
+ */
104
+ function toPublicAgent(agent: DetectedAgent): PublicDetectedAgent {
105
+ return {
106
+ id: agent.id,
107
+ name: agent.name,
108
+ installed: agent.installed,
109
+ version: agent.version,
110
+ vendor: agent.definition.vendor,
111
+ description: agent.definition.description,
112
+ };
113
+ }
114
+
115
+ // =============================================================================
116
+ // Handler Implementations
117
+ // =============================================================================
118
+
119
+ function createAvailableHandler(
120
+ services: AgentDetectionExtensionServices,
121
+ ): ExtensionHandler {
122
+ return async (_context: ExtensionContext, params: unknown) => {
123
+ const { includeNotInstalled = false } = (params ?? {}) as AvailableParams;
124
+
125
+ // Try cached result first
126
+ const cached = services.getCachedResult();
127
+ if (cached) {
128
+ const agents = includeNotInstalled
129
+ ? cached.agents
130
+ : cached.agents.filter((a) => a.installed);
131
+
132
+ return {
133
+ agents: agents.map(toPublicAgent),
134
+ scanned: cached.scanned,
135
+ durationMs: cached.durationMs,
136
+ cached: true,
137
+ } satisfies AvailableResult;
138
+ }
139
+
140
+ // No cache — run detection
141
+ const result = await services.getAvailableAgents({ includeNotInstalled });
142
+
143
+ return {
144
+ agents: result.agents.map(toPublicAgent),
145
+ scanned: result.scanned,
146
+ durationMs: result.durationMs,
147
+ cached: false,
148
+ } satisfies AvailableResult;
149
+ };
150
+ }
151
+
152
+ function createRefreshHandler(
153
+ services: AgentDetectionExtensionServices,
154
+ ): ExtensionHandler {
155
+ return async (_context: ExtensionContext, _params: unknown) => {
156
+ const result = await services.getAvailableAgents({
157
+ refresh: true,
158
+ includeNotInstalled: true,
159
+ });
160
+
161
+ return {
162
+ agents: result.agents.map(toPublicAgent),
163
+ scanned: result.scanned,
164
+ durationMs: result.durationMs,
165
+ } satisfies RefreshResult;
166
+ };
167
+ }
168
+
169
+ // =============================================================================
170
+ // Registration
171
+ // =============================================================================
172
+
173
+ /**
174
+ * Register agent detection extension methods with the MAPAdapter.
175
+ *
176
+ * @param adapter - MAPAdapter instance
177
+ * @param services - Agent detection services
178
+ */
179
+ export function registerAgentDetectionExtensions(
180
+ adapter: MAPAdapter,
181
+ services: AgentDetectionExtensionServices,
182
+ ): void {
183
+ adapter.registerExtension(
184
+ "_macro/agents/available",
185
+ createAvailableHandler(services),
186
+ );
187
+ adapter.registerExtension(
188
+ "_macro/agents/refresh",
189
+ createRefreshHandler(services),
190
+ );
191
+ }
192
+
193
+ /**
194
+ * Unregister agent detection extension methods.
195
+ *
196
+ * @param adapter - MAPAdapter instance
197
+ */
198
+ export function unregisterAgentDetectionExtensions(adapter: MAPAdapter): void {
199
+ adapter.unregisterExtension("_macro/agents/available");
200
+ adapter.unregisterExtension("_macro/agents/refresh");
201
+ }
@@ -31,13 +31,40 @@ export {
31
31
  type InternalWorkspace,
32
32
  } from "./workspace.js";
33
33
 
34
+ // Workspace file search extension
35
+ export {
36
+ registerWorkspaceFileExtensions,
37
+ unregisterWorkspaceFileExtensions,
38
+ type WorkspaceFileServices,
39
+ } from "./workspace-files.js";
40
+
41
+ // Resume extension
42
+ export {
43
+ registerResumeExtension,
44
+ unregisterResumeExtension,
45
+ type ResumeExtensionServices,
46
+ } from "./resume.js";
47
+
48
+ // Agent detection extensions
49
+ export {
50
+ registerAgentDetectionExtensions,
51
+ unregisterAgentDetectionExtensions,
52
+ type AgentDetectionExtensionServices,
53
+ } from "./agent-detection.js";
54
+
34
55
  import type { MAPAdapter } from "../interface.js";
35
56
  import type { TaskExtensionServices } from "./task.js";
36
57
  import type { WakeExtensionServices } from "./wake.js";
37
58
  import type { WorkspaceExtensionServices } from "./workspace.js";
59
+ import type { WorkspaceFileServices } from "./workspace-files.js";
60
+ import type { ResumeExtensionServices } from "./resume.js";
61
+ import type { AgentDetectionExtensionServices } from "./agent-detection.js";
38
62
  import { registerTaskExtensions } from "./task.js";
39
63
  import { registerWakeExtension } from "./wake.js";
40
64
  import { registerWorkspaceExtension } from "./workspace.js";
65
+ import { registerWorkspaceFileExtensions } from "./workspace-files.js";
66
+ import { registerResumeExtension } from "./resume.js";
67
+ import { registerAgentDetectionExtensions } from "./agent-detection.js";
41
68
 
42
69
  // =============================================================================
43
70
  // Combined Registration
@@ -50,6 +77,9 @@ export interface MacroExtensionServices {
50
77
  task?: TaskExtensionServices;
51
78
  wake?: WakeExtensionServices;
52
79
  workspace?: WorkspaceExtensionServices;
80
+ workspaceFiles?: WorkspaceFileServices;
81
+ resume?: ResumeExtensionServices;
82
+ agentDetection?: AgentDetectionExtensionServices;
53
83
  }
54
84
 
55
85
  /**
@@ -98,6 +128,18 @@ export function registerMacroExtensions(
98
128
  if (services.workspace) {
99
129
  registerWorkspaceExtension(adapter, services.workspace);
100
130
  }
131
+
132
+ if (services.workspaceFiles) {
133
+ registerWorkspaceFileExtensions(adapter, services.workspaceFiles);
134
+ }
135
+
136
+ if (services.resume) {
137
+ registerResumeExtension(adapter, services.resume);
138
+ }
139
+
140
+ if (services.agentDetection) {
141
+ registerAgentDetectionExtensions(adapter, services.agentDetection);
142
+ }
101
143
  }
102
144
 
103
145
  /**
@@ -116,6 +158,12 @@ export function unregisterMacroExtensions(adapter: MAPAdapter): void {
116
158
  adapter.unregisterExtension("_macro/task/send");
117
159
  adapter.unregisterExtension("_macro/wake");
118
160
  adapter.unregisterExtension("_macro/workspace/info");
161
+ adapter.unregisterExtension("_macro/workspace/files/search");
162
+ adapter.unregisterExtension("_macro/workspace/files/list");
163
+ adapter.unregisterExtension("_macro/workspace/files/read");
164
+ adapter.unregisterExtension("_macro/resume");
165
+ adapter.unregisterExtension("_macro/agents/available");
166
+ adapter.unregisterExtension("_macro/agents/refresh");
119
167
  } catch {
120
168
  // Ignore errors from unregistering non-existent extensions
121
169
  }
@@ -140,6 +188,15 @@ export const MACRO_EXTENSION_METHODS = [
140
188
  "_macro/wake",
141
189
  // Workspace extension
142
190
  "_macro/workspace/info",
191
+ // Workspace file search extensions
192
+ "_macro/workspace/files/search",
193
+ "_macro/workspace/files/list",
194
+ "_macro/workspace/files/read",
195
+ // Resume extension
196
+ "_macro/resume",
197
+ // Agent detection extensions
198
+ "_macro/agents/available",
199
+ "_macro/agents/refresh",
143
200
  ] as const;
144
201
 
145
202
  /**
@@ -154,4 +211,10 @@ export const EXTENSION_CAPABILITIES: Record<string, string> = {
154
211
  "_macro/task/send": "canMessage",
155
212
  "_macro/wake": "canMessage", // Wake requires messaging capability
156
213
  "_macro/workspace/info": "canQuery",
214
+ "_macro/workspace/files/search": "canQuery",
215
+ "_macro/workspace/files/list": "canQuery",
216
+ "_macro/workspace/files/read": "canQuery",
217
+ "_macro/resume": "canManageLifecycle",
218
+ "_macro/agents/available": "canQuery",
219
+ "_macro/agents/refresh": "canQuery",
157
220
  };
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Resume Extension Method (_macro/resume)
3
+ *
4
+ * Resumes a stopped agent by spawning a new process and loading
5
+ * the existing ACP session. This is a lifecycle management operation
6
+ * independent from session loading.
7
+ *
8
+ * Unlike _macro/wake (which handles sleeping/idle agents), this extension
9
+ * handles agents whose process has terminated (state: "stopped" or "failed").
10
+ */
11
+
12
+ import type { MAPAdapter, ExtensionHandler, ExtensionContext } from "../interface.js";
13
+ import type { AgentId } from "../../../store/types/index.js";
14
+ import { RPCError } from "../rpc-handler.js";
15
+
16
+ // =============================================================================
17
+ // Request/Response Types
18
+ // =============================================================================
19
+
20
+ interface ResumeParams {
21
+ /** Agent ID to resume */
22
+ agentId: string;
23
+ }
24
+
25
+ interface ResumeResult {
26
+ /** Whether the resume was successful */
27
+ success: boolean;
28
+ /** The resumed agent's ID */
29
+ agentId: string;
30
+ /** The agent's ACP session ID */
31
+ sessionId?: string;
32
+ }
33
+
34
+ // =============================================================================
35
+ // Extension Services
36
+ // =============================================================================
37
+
38
+ /**
39
+ * Services required for resume extension
40
+ */
41
+ export interface ResumeExtensionServices {
42
+ /**
43
+ * Get agent by ID. Returns agent record or undefined if not found.
44
+ */
45
+ getAgent: (agentId: AgentId) => { id: AgentId; state: string; session_id?: string } | undefined;
46
+
47
+ /**
48
+ * Resume a stopped agent — spawns a new process and loads the existing session.
49
+ * Returns the spawned agent record.
50
+ */
51
+ resume: (agentId: AgentId) => Promise<{ id: AgentId; session_id: string }>;
52
+ }
53
+
54
+ // =============================================================================
55
+ // Handler Implementation
56
+ // =============================================================================
57
+
58
+ function createResumeHandler(services: ResumeExtensionServices): ExtensionHandler {
59
+ return async (_context: ExtensionContext, params: unknown) => {
60
+ const { agentId } = (params ?? {}) as ResumeParams;
61
+
62
+ if (!agentId) {
63
+ throw RPCError.invalidParams("agentId is required");
64
+ }
65
+
66
+ // Check agent exists
67
+ const agent = services.getAgent(agentId as AgentId);
68
+ if (!agent) {
69
+ throw RPCError.notFound("agent", agentId);
70
+ }
71
+
72
+ // Only resume stopped/failed agents
73
+ if (agent.state !== "stopped" && agent.state !== "failed") {
74
+ throw RPCError.invalidParams(
75
+ `Agent ${agentId} is ${agent.state} — only stopped or failed agents can be resumed`
76
+ );
77
+ }
78
+
79
+ // Resume the agent
80
+ const spawned = await services.resume(agentId as AgentId);
81
+
82
+ return {
83
+ success: true,
84
+ agentId: spawned.id,
85
+ sessionId: spawned.session_id,
86
+ } satisfies ResumeResult;
87
+ };
88
+ }
89
+
90
+ // =============================================================================
91
+ // Registration
92
+ // =============================================================================
93
+
94
+ /**
95
+ * Register resume extension method with the MAPAdapter.
96
+ *
97
+ * @param adapter - MAPAdapter instance
98
+ * @param services - Resume extension services
99
+ */
100
+ export function registerResumeExtension(
101
+ adapter: MAPAdapter,
102
+ services: ResumeExtensionServices
103
+ ): void {
104
+ adapter.registerExtension("_macro/resume", createResumeHandler(services));
105
+ }
106
+
107
+ /**
108
+ * Unregister resume extension method.
109
+ *
110
+ * @param adapter - MAPAdapter instance
111
+ */
112
+ export function unregisterResumeExtension(adapter: MAPAdapter): void {
113
+ adapter.unregisterExtension("_macro/resume");
114
+ }