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
@@ -10,12 +10,18 @@ import {
10
10
  unregisterWakeExtension,
11
11
  registerWorkspaceExtension,
12
12
  unregisterWorkspaceExtension,
13
+ registerResumeExtension,
14
+ unregisterResumeExtension,
15
+ registerAgentDetectionExtensions,
16
+ unregisterAgentDetectionExtensions,
13
17
  registerMacroExtensions,
14
18
  MACRO_EXTENSION_METHODS,
15
19
  EXTENSION_CAPABILITIES,
16
20
  type TaskExtensionServices,
17
21
  type WakeExtensionServices,
18
22
  type WorkspaceExtensionServices,
23
+ type ResumeExtensionServices,
24
+ type AgentDetectionExtensionServices,
19
25
  } from "../extensions/index.js";
20
26
  import type { MAPAdapter, ExtensionHandler, ExtensionContext } from "../interface.js";
21
27
  import type { ParticipantCapabilities } from "../types.js";
@@ -550,6 +556,341 @@ describe("Workspace Extension", () => {
550
556
  });
551
557
  });
552
558
 
559
+ // =============================================================================
560
+ // Resume Extension Tests
561
+ // =============================================================================
562
+
563
+ describe("Resume Extension", () => {
564
+ let adapter: MAPAdapter & { handlers: Map<string, ExtensionHandler> };
565
+ let services: ResumeExtensionServices;
566
+
567
+ beforeEach(() => {
568
+ adapter = createMockAdapter();
569
+
570
+ services = {
571
+ getAgent: vi.fn().mockReturnValue({
572
+ id: "agent-1" as AgentId,
573
+ state: "stopped",
574
+ session_id: "session-1",
575
+ }),
576
+ resume: vi.fn().mockResolvedValue({
577
+ id: "agent-1" as AgentId,
578
+ session_id: "session-1",
579
+ }),
580
+ };
581
+ });
582
+
583
+ describe("registration", () => {
584
+ it("registers resume method", () => {
585
+ registerResumeExtension(adapter, services);
586
+ expect(adapter.handlers.has("_macro/resume")).toBe(true);
587
+ });
588
+
589
+ it("unregisters resume method", () => {
590
+ registerResumeExtension(adapter, services);
591
+ unregisterResumeExtension(adapter);
592
+ expect(adapter.handlers.has("_macro/resume")).toBe(false);
593
+ });
594
+ });
595
+
596
+ describe("_macro/resume", () => {
597
+ it("resumes a stopped agent", async () => {
598
+ registerResumeExtension(adapter, services);
599
+ const handler = adapter.handlers.get("_macro/resume")!;
600
+
601
+ const result = await handler(createMockContext(), { agentId: "agent-1" });
602
+
603
+ expect(services.resume).toHaveBeenCalledWith("agent-1");
604
+ expect(result).toEqual({
605
+ success: true,
606
+ agentId: "agent-1",
607
+ sessionId: "session-1",
608
+ });
609
+ });
610
+
611
+ it("resumes a failed agent", async () => {
612
+ (services.getAgent as ReturnType<typeof vi.fn>).mockReturnValue({
613
+ id: "agent-1",
614
+ state: "failed",
615
+ session_id: "session-1",
616
+ });
617
+
618
+ registerResumeExtension(adapter, services);
619
+ const handler = adapter.handlers.get("_macro/resume")!;
620
+
621
+ const result = await handler(createMockContext(), { agentId: "agent-1" });
622
+
623
+ expect(services.resume).toHaveBeenCalledWith("agent-1");
624
+ expect(result).toHaveProperty("success", true);
625
+ });
626
+
627
+ it("throws for missing agentId", async () => {
628
+ registerResumeExtension(adapter, services);
629
+ const handler = adapter.handlers.get("_macro/resume")!;
630
+
631
+ await expect(handler(createMockContext(), {})).rejects.toThrow("agentId is required");
632
+ });
633
+
634
+ it("throws for non-existent agent", async () => {
635
+ (services.getAgent as ReturnType<typeof vi.fn>).mockReturnValue(undefined);
636
+
637
+ registerResumeExtension(adapter, services);
638
+ const handler = adapter.handlers.get("_macro/resume")!;
639
+
640
+ await expect(
641
+ handler(createMockContext(), { agentId: "missing" })
642
+ ).rejects.toThrow("not found");
643
+ });
644
+
645
+ it("throws for running agent", async () => {
646
+ (services.getAgent as ReturnType<typeof vi.fn>).mockReturnValue({
647
+ id: "agent-1",
648
+ state: "running",
649
+ });
650
+
651
+ registerResumeExtension(adapter, services);
652
+ const handler = adapter.handlers.get("_macro/resume")!;
653
+
654
+ await expect(
655
+ handler(createMockContext(), { agentId: "agent-1" })
656
+ ).rejects.toThrow("only stopped or failed");
657
+ });
658
+ });
659
+ });
660
+
661
+ // =============================================================================
662
+ // Agent Detection Extension Tests
663
+ // =============================================================================
664
+
665
+ describe("Agent Detection Extensions", () => {
666
+ let adapter: MAPAdapter & { handlers: Map<string, ExtensionHandler> };
667
+ let services: AgentDetectionExtensionServices;
668
+
669
+ const mockDetectionResult = {
670
+ agents: [
671
+ {
672
+ id: "claude-code",
673
+ name: "Claude Code",
674
+ installed: true,
675
+ version: "1.2.3",
676
+ path: "/usr/local/bin/claude",
677
+ definition: {
678
+ id: "claude-code",
679
+ name: "Claude Code",
680
+ description: "Anthropic Claude Code CLI",
681
+ binary: "claude",
682
+ versionArgs: ["--version"],
683
+ headless: { promptFlag: "-p", defaultFlags: ["--output-format", "stream-json"] },
684
+ vendor: "Anthropic",
685
+ },
686
+ detectedAt: 1000,
687
+ },
688
+ {
689
+ id: "codex",
690
+ name: "Codex CLI",
691
+ installed: false,
692
+ definition: {
693
+ id: "codex",
694
+ name: "Codex CLI",
695
+ description: "OpenAI Codex CLI",
696
+ binary: "codex",
697
+ versionArgs: ["--version"],
698
+ headless: { subcommand: "exec", promptFlag: "", defaultFlags: ["--full-auto"] },
699
+ vendor: "OpenAI",
700
+ },
701
+ detectedAt: 1000,
702
+ },
703
+ ],
704
+ scanned: 2,
705
+ durationMs: 150,
706
+ };
707
+
708
+ beforeEach(() => {
709
+ adapter = createMockAdapter();
710
+
711
+ services = {
712
+ getAvailableAgents: vi.fn().mockResolvedValue(mockDetectionResult),
713
+ isDetecting: vi.fn().mockReturnValue(false),
714
+ getCachedResult: vi.fn().mockReturnValue(null),
715
+ };
716
+ });
717
+
718
+ describe("registration", () => {
719
+ it("registers both agent detection methods", () => {
720
+ registerAgentDetectionExtensions(adapter, services);
721
+
722
+ expect(adapter.handlers.has("_macro/agents/available")).toBe(true);
723
+ expect(adapter.handlers.has("_macro/agents/refresh")).toBe(true);
724
+ });
725
+
726
+ it("unregisters both agent detection methods", () => {
727
+ registerAgentDetectionExtensions(adapter, services);
728
+ unregisterAgentDetectionExtensions(adapter);
729
+
730
+ expect(adapter.handlers.has("_macro/agents/available")).toBe(false);
731
+ expect(adapter.handlers.has("_macro/agents/refresh")).toBe(false);
732
+ });
733
+ });
734
+
735
+ describe("_macro/agents/available", () => {
736
+ it("returns detected agents when no cache exists", async () => {
737
+ registerAgentDetectionExtensions(adapter, services);
738
+ const handler = adapter.handlers.get("_macro/agents/available")!;
739
+
740
+ const result = await handler(createMockContext(), {});
741
+
742
+ expect(services.getAvailableAgents).toHaveBeenCalledWith({
743
+ includeNotInstalled: false,
744
+ });
745
+ expect(result).toHaveProperty("agents");
746
+ expect(result).toHaveProperty("scanned", 2);
747
+ expect(result).toHaveProperty("durationMs", 150);
748
+ expect(result).toHaveProperty("cached", false);
749
+ });
750
+
751
+ it("filters out not-installed agents by default", async () => {
752
+ registerAgentDetectionExtensions(adapter, services);
753
+ const handler = adapter.handlers.get("_macro/agents/available")!;
754
+
755
+ const result = await handler(createMockContext(), {});
756
+
757
+ expect(services.getAvailableAgents).toHaveBeenCalledWith({
758
+ includeNotInstalled: false,
759
+ });
760
+ });
761
+
762
+ it("includes not-installed agents when requested", async () => {
763
+ registerAgentDetectionExtensions(adapter, services);
764
+ const handler = adapter.handlers.get("_macro/agents/available")!;
765
+
766
+ const result = await handler(createMockContext(), {
767
+ includeNotInstalled: true,
768
+ });
769
+
770
+ // No cache, so falls through to getAvailableAgents
771
+ expect(services.getAvailableAgents).toHaveBeenCalledWith({
772
+ includeNotInstalled: true,
773
+ });
774
+ });
775
+
776
+ it("uses cached results when available", async () => {
777
+ (services.getCachedResult as ReturnType<typeof vi.fn>).mockReturnValue(
778
+ mockDetectionResult
779
+ );
780
+
781
+ registerAgentDetectionExtensions(adapter, services);
782
+ const handler = adapter.handlers.get("_macro/agents/available")!;
783
+
784
+ const result = await handler(createMockContext(), {});
785
+
786
+ // Should use cache, not call getAvailableAgents
787
+ expect(services.getAvailableAgents).not.toHaveBeenCalled();
788
+ expect(result).toHaveProperty("cached", true);
789
+ // Default excludes not-installed, so only 1 agent
790
+ expect((result as any).agents).toHaveLength(1);
791
+ expect((result as any).agents[0].id).toBe("claude-code");
792
+ });
793
+
794
+ it("returns all agents from cache when includeNotInstalled is true", async () => {
795
+ (services.getCachedResult as ReturnType<typeof vi.fn>).mockReturnValue(
796
+ mockDetectionResult
797
+ );
798
+
799
+ registerAgentDetectionExtensions(adapter, services);
800
+ const handler = adapter.handlers.get("_macro/agents/available")!;
801
+
802
+ const result = await handler(createMockContext(), {
803
+ includeNotInstalled: true,
804
+ });
805
+
806
+ expect((result as any).agents).toHaveLength(2);
807
+ expect(result).toHaveProperty("cached", true);
808
+ });
809
+
810
+ it("strips binary paths from results", async () => {
811
+ registerAgentDetectionExtensions(adapter, services);
812
+ const handler = adapter.handlers.get("_macro/agents/available")!;
813
+
814
+ const result = await handler(createMockContext(), {});
815
+
816
+ const agents = (result as any).agents;
817
+ for (const agent of agents) {
818
+ expect(agent).not.toHaveProperty("path");
819
+ expect(agent).not.toHaveProperty("definition");
820
+ expect(agent).not.toHaveProperty("detectedAt");
821
+ }
822
+ });
823
+
824
+ it("includes vendor and description in results", async () => {
825
+ registerAgentDetectionExtensions(adapter, services);
826
+ const handler = adapter.handlers.get("_macro/agents/available")!;
827
+
828
+ const result = await handler(createMockContext(), {});
829
+
830
+ const agents = (result as any).agents;
831
+ expect(agents[0]).toHaveProperty("vendor", "Anthropic");
832
+ expect(agents[0]).toHaveProperty("description", "Anthropic Claude Code CLI");
833
+ });
834
+
835
+ it("handles empty params", async () => {
836
+ registerAgentDetectionExtensions(adapter, services);
837
+ const handler = adapter.handlers.get("_macro/agents/available")!;
838
+
839
+ const result = await handler(createMockContext(), null);
840
+
841
+ expect(result).toHaveProperty("agents");
842
+ });
843
+ });
844
+
845
+ describe("_macro/agents/refresh", () => {
846
+ it("forces a fresh detection scan", async () => {
847
+ registerAgentDetectionExtensions(adapter, services);
848
+ const handler = adapter.handlers.get("_macro/agents/refresh")!;
849
+
850
+ const result = await handler(createMockContext(), {});
851
+
852
+ expect(services.getAvailableAgents).toHaveBeenCalledWith({
853
+ refresh: true,
854
+ includeNotInstalled: true,
855
+ });
856
+ expect(result).toHaveProperty("agents");
857
+ expect(result).toHaveProperty("scanned", 2);
858
+ expect(result).toHaveProperty("durationMs", 150);
859
+ });
860
+
861
+ it("always returns all agents including not-installed", async () => {
862
+ registerAgentDetectionExtensions(adapter, services);
863
+ const handler = adapter.handlers.get("_macro/agents/refresh")!;
864
+
865
+ const result = await handler(createMockContext(), {});
866
+
867
+ expect((result as any).agents).toHaveLength(2);
868
+ });
869
+
870
+ it("does not include a cached flag", async () => {
871
+ registerAgentDetectionExtensions(adapter, services);
872
+ const handler = adapter.handlers.get("_macro/agents/refresh")!;
873
+
874
+ const result = await handler(createMockContext(), {});
875
+
876
+ expect(result).not.toHaveProperty("cached");
877
+ });
878
+
879
+ it("strips binary paths from results", async () => {
880
+ registerAgentDetectionExtensions(adapter, services);
881
+ const handler = adapter.handlers.get("_macro/agents/refresh")!;
882
+
883
+ const result = await handler(createMockContext(), {});
884
+
885
+ const agents = (result as any).agents;
886
+ for (const agent of agents) {
887
+ expect(agent).not.toHaveProperty("path");
888
+ expect(agent).not.toHaveProperty("definition");
889
+ }
890
+ });
891
+ });
892
+ });
893
+
553
894
  // =============================================================================
554
895
  // Combined Registration Tests
555
896
  // =============================================================================
@@ -588,11 +929,23 @@ describe("registerMacroExtensions", () => {
588
929
  getWorkspace: vi.fn(),
589
930
  agentExists: vi.fn(),
590
931
  },
932
+ resume: {
933
+ getAgent: vi.fn(),
934
+ resume: vi.fn(),
935
+ },
936
+ agentDetection: {
937
+ getAvailableAgents: vi.fn(),
938
+ isDetecting: vi.fn(),
939
+ getCachedResult: vi.fn(),
940
+ },
591
941
  });
592
942
 
593
943
  expect(adapter.handlers.has("_macro/task/list")).toBe(true);
594
944
  expect(adapter.handlers.has("_macro/wake")).toBe(true);
595
945
  expect(adapter.handlers.has("_macro/workspace/info")).toBe(true);
946
+ expect(adapter.handlers.has("_macro/resume")).toBe(true);
947
+ expect(adapter.handlers.has("_macro/agents/available")).toBe(true);
948
+ expect(adapter.handlers.has("_macro/agents/refresh")).toBe(true);
596
949
  });
597
950
  });
598
951
 
@@ -606,6 +959,9 @@ describe("MACRO_EXTENSION_METHODS", () => {
606
959
  expect(MACRO_EXTENSION_METHODS).toContain("_macro/task/send");
607
960
  expect(MACRO_EXTENSION_METHODS).toContain("_macro/wake");
608
961
  expect(MACRO_EXTENSION_METHODS).toContain("_macro/workspace/info");
962
+ expect(MACRO_EXTENSION_METHODS).toContain("_macro/resume");
963
+ expect(MACRO_EXTENSION_METHODS).toContain("_macro/agents/available");
964
+ expect(MACRO_EXTENSION_METHODS).toContain("_macro/agents/refresh");
609
965
  });
610
966
  });
611
967
 
@@ -616,5 +972,8 @@ describe("EXTENSION_CAPABILITIES", () => {
616
972
  expect(EXTENSION_CAPABILITIES["_macro/task/send"]).toBe("canMessage");
617
973
  expect(EXTENSION_CAPABILITIES["_macro/wake"]).toBe("canMessage");
618
974
  expect(EXTENSION_CAPABILITIES["_macro/workspace/info"]).toBe("canQuery");
975
+ expect(EXTENSION_CAPABILITIES["_macro/resume"]).toBe("canManageLifecycle");
976
+ expect(EXTENSION_CAPABILITIES["_macro/agents/available"]).toBe("canQuery");
977
+ expect(EXTENSION_CAPABILITIES["_macro/agents/refresh"]).toBe("canQuery");
619
978
  });
620
979
  });
@@ -230,6 +230,96 @@ describe("MAPAdapter", () => {
230
230
  });
231
231
  });
232
232
 
233
+ describe("authentication", () => {
234
+ it("calls authenticate handler when credentials provided", async () => {
235
+ const authenticateFn = vi.fn().mockResolvedValue({
236
+ allowed: true,
237
+ capabilities: {
238
+ canQuery: true,
239
+ canSubscribe: true,
240
+ canMessage: true,
241
+ canSpawn: true,
242
+ },
243
+ });
244
+
245
+ const authAdapter = createMAPAdapter({
246
+ authenticate: authenticateFn,
247
+ });
248
+ await authAdapter.start();
249
+
250
+ const stream = createSimpleMockStream();
251
+ const participant = await authAdapter.acceptConnection(stream);
252
+
253
+ // Simulate map/connect RPC call with credentials
254
+ // The handleConnect is called internally - we verify via the mock
255
+ expect(participant.capabilities).toBeDefined();
256
+
257
+ await authAdapter.stop();
258
+ });
259
+
260
+ it("rejects authentication when handler returns allowed=false", async () => {
261
+ const authenticateFn = vi.fn().mockResolvedValue({
262
+ allowed: false,
263
+ error: "Invalid token",
264
+ });
265
+
266
+ const authAdapter = createMAPAdapter({
267
+ authenticate: authenticateFn,
268
+ });
269
+ await authAdapter.start();
270
+
271
+ // Create adapter instance to test handleConnect directly
272
+ const stream = createSimpleMockStream();
273
+ await authAdapter.acceptConnection(stream);
274
+
275
+ // The actual rejection happens during handleConnect RPC call
276
+ // which requires a full RPC roundtrip - verify handler is configured
277
+ expect(authenticateFn).not.toHaveBeenCalled(); // Not called until RPC
278
+
279
+ await authAdapter.stop();
280
+ });
281
+
282
+ it("uses default client capabilities when no auth handler", async () => {
283
+ const noAuthAdapter = createMAPAdapter({
284
+ defaultClientCapabilities: {
285
+ canQuery: true,
286
+ canSubscribe: false,
287
+ canMessage: false,
288
+ },
289
+ });
290
+ await noAuthAdapter.start();
291
+
292
+ const stream = createSimpleMockStream();
293
+ const participant = await noAuthAdapter.acceptConnection(stream);
294
+
295
+ // Initial connection uses anonymous capabilities
296
+ expect(participant.capabilities.canQuery).toBe(true);
297
+
298
+ await noAuthAdapter.stop();
299
+ });
300
+
301
+ it("uses default agent capabilities for agent type", async () => {
302
+ const agentAdapter = createMAPAdapter({
303
+ defaultAgentCapabilities: {
304
+ canQuery: true,
305
+ canSubscribe: true,
306
+ canMessage: true,
307
+ canSpawn: true,
308
+ canStop: true,
309
+ },
310
+ });
311
+ await agentAdapter.start();
312
+
313
+ const stream = createSimpleMockStream();
314
+ await agentAdapter.acceptConnection(stream);
315
+
316
+ // Verify configuration is stored
317
+ expect(agentAdapter.config.defaultAgentCapabilities?.canSpawn).toBe(true);
318
+
319
+ await agentAdapter.stop();
320
+ });
321
+ });
322
+
233
323
  describe("subscriptions", () => {
234
324
  let participantId: ParticipantId;
235
325