macro-agent 0.0.11 → 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 (408) 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 +6 -0
  16. package/.sudocode/specs.jsonl +7 -0
  17. package/CLAUDE.md +110 -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 +25 -1
  31. package/dist/agent/agent-manager.d.ts.map +1 -1
  32. package/dist/agent/agent-manager.js +93 -7
  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-detection/command-builder.d.ts +30 -0
  38. package/dist/agent-detection/command-builder.d.ts.map +1 -0
  39. package/dist/agent-detection/command-builder.js +71 -0
  40. package/dist/agent-detection/command-builder.js.map +1 -0
  41. package/dist/agent-detection/detector.d.ts +84 -0
  42. package/dist/agent-detection/detector.d.ts.map +1 -0
  43. package/dist/agent-detection/detector.js +240 -0
  44. package/dist/agent-detection/detector.js.map +1 -0
  45. package/dist/agent-detection/index.d.ts +12 -0
  46. package/dist/agent-detection/index.d.ts.map +1 -0
  47. package/dist/agent-detection/index.js +14 -0
  48. package/dist/agent-detection/index.js.map +1 -0
  49. package/dist/agent-detection/registry.d.ts +53 -0
  50. package/dist/agent-detection/registry.d.ts.map +1 -0
  51. package/dist/agent-detection/registry.js +177 -0
  52. package/dist/agent-detection/registry.js.map +1 -0
  53. package/dist/agent-detection/types.d.ts +121 -0
  54. package/dist/agent-detection/types.d.ts.map +1 -0
  55. package/dist/agent-detection/types.js +20 -0
  56. package/dist/agent-detection/types.js.map +1 -0
  57. package/dist/api/server.d.ts.map +1 -1
  58. package/dist/api/server.js +95 -0
  59. package/dist/api/server.js.map +1 -1
  60. package/dist/cli/index.js +29 -0
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/mcp.js +38 -0
  63. package/dist/cli/mcp.js.map +1 -1
  64. package/dist/config/index.d.ts +2 -0
  65. package/dist/config/index.d.ts.map +1 -0
  66. package/dist/config/index.js +2 -0
  67. package/dist/config/index.js.map +1 -0
  68. package/dist/config/project-config.d.ts +46 -0
  69. package/dist/config/project-config.d.ts.map +1 -0
  70. package/dist/config/project-config.js +68 -0
  71. package/dist/config/project-config.js.map +1 -0
  72. package/dist/lifecycle/cascade.d.ts +1 -1
  73. package/dist/lifecycle/cascade.d.ts.map +1 -1
  74. package/dist/lifecycle/handlers/index.d.ts +4 -0
  75. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  76. package/dist/lifecycle/handlers/index.js +2 -0
  77. package/dist/lifecycle/handlers/index.js.map +1 -1
  78. package/dist/lifecycle/handlers/worker.d.ts +4 -0
  79. package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
  80. package/dist/lifecycle/handlers/worker.js +35 -3
  81. package/dist/lifecycle/handlers/worker.js.map +1 -1
  82. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  83. package/dist/map/adapter/acp-over-map.js +32 -2
  84. package/dist/map/adapter/acp-over-map.js.map +1 -1
  85. package/dist/map/adapter/event-translator.d.ts.map +1 -1
  86. package/dist/map/adapter/event-translator.js +1 -0
  87. package/dist/map/adapter/event-translator.js.map +1 -1
  88. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  89. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  90. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  91. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  92. package/dist/map/adapter/extensions/index.d.ts +10 -1
  93. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  94. package/dist/map/adapter/extensions/index.js +39 -0
  95. package/dist/map/adapter/extensions/index.js.map +1 -1
  96. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  97. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  98. package/dist/map/adapter/extensions/resume.js +59 -0
  99. package/dist/map/adapter/extensions/resume.js.map +1 -0
  100. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  101. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  102. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  103. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  104. package/dist/mcp/mcp-server.d.ts +6 -0
  105. package/dist/mcp/mcp-server.d.ts.map +1 -1
  106. package/dist/mcp/mcp-server.js +45 -0
  107. package/dist/mcp/mcp-server.js.map +1 -1
  108. package/dist/mcp/tools/claim_task.d.ts +35 -0
  109. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  110. package/dist/mcp/tools/claim_task.js +58 -0
  111. package/dist/mcp/tools/claim_task.js.map +1 -0
  112. package/dist/mcp/tools/done.d.ts +11 -2
  113. package/dist/mcp/tools/done.d.ts.map +1 -1
  114. package/dist/mcp/tools/done.js +15 -10
  115. package/dist/mcp/tools/done.js.map +1 -1
  116. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  117. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  118. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  119. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  120. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  121. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  122. package/dist/mcp/tools/unclaim_task.js +47 -0
  123. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  124. package/dist/metrics/index.d.ts +2 -0
  125. package/dist/metrics/index.d.ts.map +1 -0
  126. package/dist/metrics/index.js +2 -0
  127. package/dist/metrics/index.js.map +1 -0
  128. package/dist/metrics/metrics.d.ts +79 -0
  129. package/dist/metrics/metrics.d.ts.map +1 -0
  130. package/dist/metrics/metrics.js +166 -0
  131. package/dist/metrics/metrics.js.map +1 -0
  132. package/dist/roles/capabilities.d.ts +1 -0
  133. package/dist/roles/capabilities.d.ts.map +1 -1
  134. package/dist/roles/capabilities.js +3 -0
  135. package/dist/roles/capabilities.js.map +1 -1
  136. package/dist/roles/types.d.ts +1 -1
  137. package/dist/roles/types.d.ts.map +1 -1
  138. package/dist/router/message-router.d.ts +41 -0
  139. package/dist/router/message-router.d.ts.map +1 -1
  140. package/dist/router/message-router.js +136 -5
  141. package/dist/router/message-router.js.map +1 -1
  142. package/dist/store/event-store.d.ts +8 -1
  143. package/dist/store/event-store.d.ts.map +1 -1
  144. package/dist/store/event-store.js +120 -4
  145. package/dist/store/event-store.js.map +1 -1
  146. package/dist/store/types/agents.d.ts +1 -1
  147. package/dist/store/types/agents.d.ts.map +1 -1
  148. package/dist/store/types/events.d.ts +1 -1
  149. package/dist/store/types/events.d.ts.map +1 -1
  150. package/dist/store/types/events.js.map +1 -1
  151. package/dist/store/types/index.d.ts +1 -0
  152. package/dist/store/types/index.d.ts.map +1 -1
  153. package/dist/store/types/index.js +1 -0
  154. package/dist/store/types/index.js.map +1 -1
  155. package/dist/store/types/sessions.d.ts +44 -0
  156. package/dist/store/types/sessions.d.ts.map +1 -0
  157. package/dist/store/types/sessions.js +9 -0
  158. package/dist/store/types/sessions.js.map +1 -0
  159. package/dist/store/types/tasks.d.ts +2 -0
  160. package/dist/store/types/tasks.d.ts.map +1 -1
  161. package/dist/task/backend/memory.d.ts +4 -1
  162. package/dist/task/backend/memory.d.ts.map +1 -1
  163. package/dist/task/backend/memory.js +81 -0
  164. package/dist/task/backend/memory.js.map +1 -1
  165. package/dist/task/backend/types.d.ts +30 -0
  166. package/dist/task/backend/types.d.ts.map +1 -1
  167. package/dist/task/backend/types.js.map +1 -1
  168. package/dist/teams/index.d.ts +4 -0
  169. package/dist/teams/index.d.ts.map +1 -0
  170. package/dist/teams/index.js +4 -0
  171. package/dist/teams/index.js.map +1 -0
  172. package/dist/teams/team-loader.d.ts +20 -0
  173. package/dist/teams/team-loader.d.ts.map +1 -0
  174. package/dist/teams/team-loader.js +293 -0
  175. package/dist/teams/team-loader.js.map +1 -0
  176. package/dist/teams/team-runtime.d.ts +139 -0
  177. package/dist/teams/team-runtime.d.ts.map +1 -0
  178. package/dist/teams/team-runtime.js +613 -0
  179. package/dist/teams/team-runtime.js.map +1 -0
  180. package/dist/teams/types.d.ts +266 -0
  181. package/dist/teams/types.d.ts.map +1 -0
  182. package/dist/teams/types.js +20 -0
  183. package/dist/teams/types.js.map +1 -0
  184. package/dist/workspace/dataplane-adapter.d.ts +1 -1
  185. package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
  186. package/dist/workspace/dataplane-adapter.js +1 -1
  187. package/dist/workspace/dataplane-adapter.js.map +1 -1
  188. package/dist/workspace/index.d.ts +1 -1
  189. package/dist/workspace/index.d.ts.map +1 -1
  190. package/dist/workspace/strategies/index.d.ts +6 -0
  191. package/dist/workspace/strategies/index.d.ts.map +1 -0
  192. package/dist/workspace/strategies/index.js +5 -0
  193. package/dist/workspace/strategies/index.js.map +1 -0
  194. package/dist/workspace/strategies/optimistic.d.ts +26 -0
  195. package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
  196. package/dist/workspace/strategies/optimistic.js +121 -0
  197. package/dist/workspace/strategies/optimistic.js.map +1 -0
  198. package/dist/workspace/strategies/queue.d.ts +26 -0
  199. package/dist/workspace/strategies/queue.d.ts.map +1 -0
  200. package/dist/workspace/strategies/queue.js +67 -0
  201. package/dist/workspace/strategies/queue.js.map +1 -0
  202. package/dist/workspace/strategies/registry.d.ts +37 -0
  203. package/dist/workspace/strategies/registry.d.ts.map +1 -0
  204. package/dist/workspace/strategies/registry.js +63 -0
  205. package/dist/workspace/strategies/registry.js.map +1 -0
  206. package/dist/workspace/strategies/trunk.d.ts +20 -0
  207. package/dist/workspace/strategies/trunk.d.ts.map +1 -0
  208. package/dist/workspace/strategies/trunk.js +108 -0
  209. package/dist/workspace/strategies/trunk.js.map +1 -0
  210. package/dist/workspace/strategies/types.d.ts +104 -0
  211. package/dist/workspace/strategies/types.d.ts.map +1 -0
  212. package/dist/workspace/strategies/types.js +11 -0
  213. package/dist/workspace/strategies/types.js.map +1 -0
  214. package/dist/workspace/types.d.ts +1 -1
  215. package/dist/workspace/types.d.ts.map +1 -1
  216. package/dist/workspace/workspace-manager.d.ts +1 -1
  217. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  218. package/docs/implementation-details.md +1127 -0
  219. package/docs/implementation-summary.md +448 -0
  220. package/docs/plan-self-driving-support.md +433 -0
  221. package/docs/spec-self-driving-support.md +462 -0
  222. package/docs/team-templates.md +860 -0
  223. package/docs/teams.md +233 -0
  224. package/package.json +4 -2
  225. package/src/acp/__tests__/integration.test.ts +161 -1
  226. package/src/acp/__tests__/macro-agent.test.ts +95 -0
  227. package/src/acp/__tests__/session-persistence.test.ts +276 -0
  228. package/src/acp/macro-agent.ts +79 -7
  229. package/src/acp/session-mapper.ts +108 -1
  230. package/src/acp/types.ts +33 -1
  231. package/src/agent/agent-manager.ts +158 -6
  232. package/src/agent/types.ts +27 -0
  233. package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
  234. package/src/agent-detection/__tests__/detector.test.ts +768 -0
  235. package/src/agent-detection/__tests__/registry.test.ts +254 -0
  236. package/src/agent-detection/command-builder.ts +90 -0
  237. package/src/agent-detection/detector.ts +307 -0
  238. package/src/agent-detection/index.ts +36 -0
  239. package/src/agent-detection/registry.ts +200 -0
  240. package/src/agent-detection/types.ts +184 -0
  241. package/src/api/server.ts +110 -0
  242. package/src/cli/index.ts +44 -0
  243. package/src/cli/mcp.ts +47 -0
  244. package/src/config/index.ts +9 -0
  245. package/src/config/project-config.ts +107 -0
  246. package/src/lifecycle/cascade.ts +1 -1
  247. package/src/lifecycle/handlers/index.ts +8 -0
  248. package/src/lifecycle/handlers/worker.ts +48 -3
  249. package/src/map/adapter/__tests__/extensions.test.ts +359 -0
  250. package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
  251. package/src/map/adapter/acp-over-map.ts +45 -2
  252. package/src/map/adapter/event-translator.ts +1 -0
  253. package/src/map/adapter/extensions/agent-detection.ts +201 -0
  254. package/src/map/adapter/extensions/index.ts +63 -0
  255. package/src/map/adapter/extensions/resume.ts +114 -0
  256. package/src/map/adapter/extensions/workspace-files.ts +449 -0
  257. package/src/mcp/mcp-server.ts +67 -0
  258. package/src/mcp/tools/claim_task.ts +86 -0
  259. package/src/mcp/tools/done.ts +24 -10
  260. package/src/mcp/tools/list_claimable_tasks.ts +93 -0
  261. package/src/mcp/tools/unclaim_task.ts +71 -0
  262. package/src/metrics/index.ts +9 -0
  263. package/src/metrics/metrics.ts +280 -0
  264. package/src/roles/capabilities.ts +3 -0
  265. package/src/roles/types.ts +2 -1
  266. package/src/router/__tests__/message-router.test.ts +561 -0
  267. package/src/router/message-router.ts +223 -6
  268. package/src/store/event-store.ts +151 -3
  269. package/src/store/types/agents.ts +1 -1
  270. package/src/store/types/events.ts +2 -1
  271. package/src/store/types/index.ts +1 -0
  272. package/src/store/types/sessions.ts +53 -0
  273. package/src/store/types/tasks.ts +3 -0
  274. package/src/task/backend/memory.ts +116 -0
  275. package/src/task/backend/types.ts +43 -0
  276. package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
  277. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
  278. package/src/teams/__tests__/team-system.test.ts +1280 -0
  279. package/src/teams/index.ts +13 -0
  280. package/src/teams/team-loader.ts +434 -0
  281. package/src/teams/team-runtime.ts +727 -0
  282. package/src/teams/types.ts +377 -0
  283. package/src/workspace/dataplane-adapter.ts +1 -1
  284. package/src/workspace/index.ts +1 -1
  285. package/src/workspace/strategies/index.ts +18 -0
  286. package/src/workspace/strategies/optimistic.ts +136 -0
  287. package/src/workspace/strategies/queue.ts +81 -0
  288. package/src/workspace/strategies/registry.ts +89 -0
  289. package/src/workspace/strategies/trunk.ts +123 -0
  290. package/src/workspace/strategies/types.ts +145 -0
  291. package/src/workspace/types.ts +1 -1
  292. package/src/workspace/workspace-manager.ts +1 -1
  293. package/.claude/settings.local.json +0 -59
  294. package/dist/map/utils/address-translation.d.ts +0 -99
  295. package/dist/map/utils/address-translation.d.ts.map +0 -1
  296. package/dist/map/utils/address-translation.js +0 -285
  297. package/dist/map/utils/address-translation.js.map +0 -1
  298. package/dist/map/utils/index.d.ts +0 -7
  299. package/dist/map/utils/index.d.ts.map +0 -1
  300. package/dist/map/utils/index.js +0 -7
  301. package/dist/map/utils/index.js.map +0 -1
  302. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  303. package/references/acp-factory-ref/LICENSE +0 -21
  304. package/references/acp-factory-ref/README.md +0 -341
  305. package/references/acp-factory-ref/package-lock.json +0 -3102
  306. package/references/acp-factory-ref/package.json +0 -96
  307. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  308. package/references/acp-factory-ref/python/LICENSE +0 -21
  309. package/references/acp-factory-ref/python/Makefile +0 -57
  310. package/references/acp-factory-ref/python/README.md +0 -253
  311. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  312. package/references/acp-factory-ref/python/tests/__init__.py +0 -0
  313. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  314. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  315. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  316. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  317. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  318. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  319. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  320. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  321. package/references/claude-code-acp/.prettierrc.json +0 -4
  322. package/references/claude-code-acp/CHANGELOG.md +0 -249
  323. package/references/claude-code-acp/LICENSE +0 -222
  324. package/references/claude-code-acp/README.md +0 -53
  325. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  326. package/references/claude-code-acp/eslint.config.js +0 -48
  327. package/references/claude-code-acp/package-lock.json +0 -4570
  328. package/references/claude-code-acp/package.json +0 -88
  329. package/references/claude-code-acp/scripts/release.sh +0 -119
  330. package/references/claude-code-acp/src/acp-agent.ts +0 -2065
  331. package/references/claude-code-acp/src/index.ts +0 -26
  332. package/references/claude-code-acp/src/lib.ts +0 -38
  333. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  334. package/references/claude-code-acp/src/settings.ts +0 -522
  335. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  336. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  337. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  338. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  339. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  340. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  341. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  342. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  343. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  344. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  345. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  346. package/references/claude-code-acp/src/tools.ts +0 -819
  347. package/references/claude-code-acp/src/utils.ts +0 -171
  348. package/references/claude-code-acp/tsconfig.json +0 -18
  349. package/references/claude-code-acp/vitest.config.ts +0 -19
  350. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -111
  351. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
  352. package/references/multi-agent-protocol/LICENSE +0 -21
  353. package/references/multi-agent-protocol/README.md +0 -113
  354. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -496
  355. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  356. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  357. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  358. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  359. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  360. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  361. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  362. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  363. package/references/multi-agent-protocol/docs/09-authentication.md +0 -680
  364. package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
  365. package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
  366. package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
  367. package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
  368. package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
  369. package/references/multi-agent-protocol/docs-site/README.md +0 -82
  370. package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
  371. package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
  372. package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
  373. package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
  374. package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
  375. package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
  376. package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
  377. package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
  378. package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
  379. package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
  380. package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
  381. package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
  382. package/references/multi-agent-protocol/docs-site/index.md +0 -136
  383. package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
  384. package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
  385. package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
  386. package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
  387. package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
  388. package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
  389. package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
  390. package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
  391. package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
  392. package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
  393. package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
  394. package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
  395. package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
  396. package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
  397. package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
  398. package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
  399. package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
  400. package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
  401. package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
  402. package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
  403. package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
  404. package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
  405. package/references/multi-agent-protocol/package-lock.json +0 -3886
  406. package/references/multi-agent-protocol/package.json +0 -56
  407. package/references/multi-agent-protocol/schema/meta.json +0 -467
  408. package/references/multi-agent-protocol/schema/schema.json +0 -2558
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Project Configuration Loader
3
+ *
4
+ * Reads .macro-agent/config.json for project-level settings.
5
+ *
6
+ * @module config/project-config
7
+ */
8
+
9
+ import * as fs from "fs";
10
+ import * as path from "path";
11
+
12
+ // =============================================================================
13
+ // Types
14
+ // =============================================================================
15
+
16
+ /**
17
+ * Project-level configuration schema.
18
+ *
19
+ * Loaded from .macro-agent/config.json in the project root.
20
+ */
21
+ export interface ProjectConfig {
22
+ /** Team template name to load on startup */
23
+ team?: string;
24
+
25
+ /** Additional project-level settings (extensible) */
26
+ [key: string]: unknown;
27
+ }
28
+
29
+ // =============================================================================
30
+ // Constants
31
+ // =============================================================================
32
+
33
+ /** Config directory name */
34
+ export const CONFIG_DIR = ".macro-agent";
35
+
36
+ /** Config file name */
37
+ export const CONFIG_FILE = "config.json";
38
+
39
+ // =============================================================================
40
+ // Loader
41
+ // =============================================================================
42
+
43
+ /**
44
+ * Get the project config file path.
45
+ *
46
+ * @param projectPath - Project root directory (default: process.cwd())
47
+ * @returns Absolute path to .macro-agent/config.json
48
+ */
49
+ export function getProjectConfigPath(projectPath?: string): string {
50
+ const root = projectPath ?? process.cwd();
51
+ return path.join(root, CONFIG_DIR, CONFIG_FILE);
52
+ }
53
+
54
+ /**
55
+ * Load project configuration from .macro-agent/config.json.
56
+ *
57
+ * Returns empty config if the file doesn't exist.
58
+ * Throws on invalid JSON.
59
+ *
60
+ * @param projectPath - Project root directory (default: process.cwd())
61
+ * @returns Parsed ProjectConfig
62
+ */
63
+ export function loadProjectConfig(projectPath?: string): ProjectConfig {
64
+ const configPath = getProjectConfigPath(projectPath);
65
+
66
+ if (!fs.existsSync(configPath)) {
67
+ return {};
68
+ }
69
+
70
+ const raw = fs.readFileSync(configPath, "utf-8");
71
+
72
+ try {
73
+ const parsed = JSON.parse(raw);
74
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
75
+ throw new ProjectConfigError(
76
+ `Config must be a JSON object, got ${Array.isArray(parsed) ? "array" : typeof parsed}`,
77
+ "INVALID_FORMAT",
78
+ configPath
79
+ );
80
+ }
81
+ return parsed as ProjectConfig;
82
+ } catch (error) {
83
+ if (error instanceof ProjectConfigError) throw error;
84
+ throw new ProjectConfigError(
85
+ `Failed to parse ${configPath}: ${error instanceof Error ? error.message : String(error)}`,
86
+ "PARSE_ERROR",
87
+ configPath
88
+ );
89
+ }
90
+ }
91
+
92
+ // =============================================================================
93
+ // Errors
94
+ // =============================================================================
95
+
96
+ export type ProjectConfigErrorCode = "PARSE_ERROR" | "INVALID_FORMAT";
97
+
98
+ export class ProjectConfigError extends Error {
99
+ constructor(
100
+ message: string,
101
+ public readonly code: ProjectConfigErrorCode,
102
+ public readonly configPath: string
103
+ ) {
104
+ super(message);
105
+ this.name = "ProjectConfigError";
106
+ }
107
+ }
@@ -30,7 +30,7 @@ import { attemptMerge, abortMerge, getCurrentBranch } from "./cleanup.js";
30
30
  */
31
31
  export interface CascadeAgent {
32
32
  id: AgentId;
33
- state: "running" | "spawning" | "stopped";
33
+ state: "running" | "spawning" | "stopped" | "failed";
34
34
  parent?: AgentId | null;
35
35
  }
36
36
 
@@ -55,6 +55,12 @@ export interface AllHandlerDeps {
55
55
 
56
56
  /** Optional workspace path resolver for integrators */
57
57
  getWorkspacePath?: (agentId: string) => string | undefined;
58
+
59
+ /** Optional integration strategy (from team config) */
60
+ integrationStrategy?: import("../../workspace/strategies/types.js").IntegrationStrategy;
61
+
62
+ /** Optional task mode from team config */
63
+ taskMode?: "push" | "pull";
58
64
  }
59
65
 
60
66
  // =============================================================================
@@ -75,6 +81,8 @@ export function createHandlerRegistry(
75
81
  agentManager: deps.agentManager,
76
82
  mergeQueue: deps.mergeQueue,
77
83
  getWorkspacePath: deps.getWorkspacePath,
84
+ integrationStrategy: deps.integrationStrategy,
85
+ taskMode: deps.taskMode,
78
86
  };
79
87
  registry.set("worker", (context, args, cleanupStatus) =>
80
88
  handleWorkerDone(context, args, cleanupStatus, workerDeps)
@@ -60,6 +60,12 @@ export interface WorkerHandlerDeps {
60
60
 
61
61
  /** Get workspace path for an agent (for resolver → integrator inline merge) */
62
62
  getWorkspacePath?: (agentId: string) => string | undefined;
63
+
64
+ /** Optional integration strategy (from team config) */
65
+ integrationStrategy?: import("../../workspace/strategies/types.js").IntegrationStrategy;
66
+
67
+ /** Optional task mode from team config */
68
+ taskMode?: "push" | "pull";
63
69
  }
64
70
 
65
71
  // =============================================================================
@@ -326,9 +332,42 @@ export async function handleWorkerDone(
326
332
  `Failed to emit RESOLVER_DONE: ${error instanceof Error ? error.message : "unknown"}`,
327
333
  );
328
334
  }
335
+ } else if (deps.integrationStrategy) {
336
+ // ───────────────────────────────────────────────────────────────────────
337
+ // Strategy-based integration (team config)
338
+ // ───────────────────────────────────────────────────────────────────────
339
+ try {
340
+ const landResult = await deps.integrationStrategy.land({
341
+ sourceBranch,
342
+ targetBranch,
343
+ workspacePath: context.workspacePath!,
344
+ agentId: context.agentId,
345
+ taskId: context.taskId,
346
+ streamId: context.streamId,
347
+ });
348
+
349
+ if (landResult.status === "landed") {
350
+ cleanupActions.push(
351
+ `Strategy '${deps.integrationStrategy.name}' landed ${sourceBranch} → ${targetBranch}${landResult.commitHash ? ` (${landResult.commitHash.slice(0, 8)})` : ""}${landResult.mergeRequestId ? ` (MR: ${landResult.mergeRequestId})` : ""}`,
352
+ );
353
+ signalsEmitted.push("WORKER_INTEGRATED");
354
+ } else if (landResult.status === "conflict") {
355
+ warnings.push(
356
+ `Strategy '${deps.integrationStrategy.name}' conflict: ${landResult.error ?? "unknown conflict"}`,
357
+ );
358
+ } else {
359
+ warnings.push(
360
+ `Strategy '${deps.integrationStrategy.name}' failed: ${landResult.error ?? "unknown error"}`,
361
+ );
362
+ }
363
+ } catch (strategyError) {
364
+ warnings.push(
365
+ `Integration strategy error: ${strategyError instanceof Error ? strategyError.message : "unknown"}`,
366
+ );
367
+ }
329
368
  } else {
330
369
  // ───────────────────────────────────────────────────────────────────────
331
- // Regular workers emit MERGE_REQUEST and submit to queue
370
+ // Regular workers emit MERGE_REQUEST and submit to queue (fallback)
332
371
  // ───────────────────────────────────────────────────────────────────────
333
372
  try {
334
373
  // Emit the signal for notification
@@ -449,11 +488,17 @@ export async function handleWorkerDone(
449
488
  }
450
489
 
451
490
  // ─────────────────────────────────────────────────────────────────────────────
452
- // Return result - shouldTerminate=true for completed/failed workers
491
+ // Return result
453
492
  // ─────────────────────────────────────────────────────────────────────────────
454
493
 
494
+ // In pull mode, completed workers stay alive to claim more tasks
495
+ const shouldTerminate =
496
+ deps.taskMode === "pull" && args.status === "completed"
497
+ ? false
498
+ : true;
499
+
455
500
  return {
456
- shouldTerminate: true,
501
+ shouldTerminate,
457
502
  signalsEmitted,
458
503
  cleanupActions,
459
504
  warnings: warnings.length > 0 ? warnings : undefined,
@@ -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
  });