macro-agent 0.1.0 → 0.1.2

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 (660) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/.sudocode/issues.jsonl +28 -0
  3. package/.sudocode/specs.jsonl +8 -0
  4. package/CLAUDE.md +25 -17
  5. package/README.md +11 -29
  6. package/dist/acp/macro-agent.d.ts +15 -0
  7. package/dist/acp/macro-agent.d.ts.map +1 -1
  8. package/dist/acp/macro-agent.js +131 -35
  9. package/dist/acp/macro-agent.js.map +1 -1
  10. package/dist/acp/types.d.ts +32 -1
  11. package/dist/acp/types.d.ts.map +1 -1
  12. package/dist/acp/types.js.map +1 -1
  13. package/dist/agent/agent-manager.d.ts +65 -1
  14. package/dist/agent/agent-manager.d.ts.map +1 -1
  15. package/dist/agent/agent-manager.js +544 -200
  16. package/dist/agent/agent-manager.js.map +1 -1
  17. package/dist/agent/types.d.ts +8 -1
  18. package/dist/agent/types.d.ts.map +1 -1
  19. package/dist/agent/types.js.map +1 -1
  20. package/dist/api/server.d.ts +8 -1
  21. package/dist/api/server.d.ts.map +1 -1
  22. package/dist/api/server.js +136 -8
  23. package/dist/api/server.js.map +1 -1
  24. package/dist/api/types.d.ts +1 -1
  25. package/dist/api/types.d.ts.map +1 -1
  26. package/dist/auth/index.d.ts +2 -0
  27. package/dist/auth/index.d.ts.map +1 -0
  28. package/dist/auth/index.js +2 -0
  29. package/dist/auth/index.js.map +1 -0
  30. package/dist/auth/token.d.ts +41 -0
  31. package/dist/auth/token.d.ts.map +1 -0
  32. package/dist/auth/token.js +73 -0
  33. package/dist/auth/token.js.map +1 -0
  34. package/dist/cli/acp.d.ts +2 -23
  35. package/dist/cli/acp.d.ts.map +1 -1
  36. package/dist/cli/acp.js +197 -61
  37. package/dist/cli/acp.js.map +1 -1
  38. package/dist/cli/index.js +152 -16
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/mcp.d.ts +6 -0
  41. package/dist/cli/mcp.d.ts.map +1 -1
  42. package/dist/cli/mcp.js +279 -173
  43. package/dist/cli/mcp.js.map +1 -1
  44. package/dist/cli/parse-args.d.ts +20 -0
  45. package/dist/cli/parse-args.d.ts.map +1 -0
  46. package/dist/cli/parse-args.js +43 -0
  47. package/dist/cli/parse-args.js.map +1 -0
  48. package/dist/cli/stable-instance-id.d.ts +8 -0
  49. package/dist/cli/stable-instance-id.d.ts.map +1 -0
  50. package/dist/cli/stable-instance-id.js +14 -0
  51. package/dist/cli/stable-instance-id.js.map +1 -0
  52. package/dist/config/project-config.d.ts +85 -7
  53. package/dist/config/project-config.d.ts.map +1 -1
  54. package/dist/config/project-config.js +133 -20
  55. package/dist/config/project-config.js.map +1 -1
  56. package/dist/index.d.ts +1 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +2 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/lifecycle/handlers/index.d.ts +7 -3
  61. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  62. package/dist/lifecycle/handlers/index.js +25 -8
  63. package/dist/lifecycle/handlers/index.js.map +1 -1
  64. package/dist/lifecycle/types.d.ts +2 -0
  65. package/dist/lifecycle/types.d.ts.map +1 -1
  66. package/dist/lifecycle/types.js.map +1 -1
  67. package/dist/map/adapter/acp-over-map.d.ts +17 -0
  68. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  69. package/dist/map/adapter/acp-over-map.js +384 -23
  70. package/dist/map/adapter/acp-over-map.js.map +1 -1
  71. package/dist/map/adapter/connection-manager.d.ts.map +1 -1
  72. package/dist/map/adapter/connection-manager.js +3 -0
  73. package/dist/map/adapter/connection-manager.js.map +1 -1
  74. package/dist/map/adapter/event-log.d.ts +87 -0
  75. package/dist/map/adapter/event-log.d.ts.map +1 -0
  76. package/dist/map/adapter/event-log.js +122 -0
  77. package/dist/map/adapter/event-log.js.map +1 -0
  78. package/dist/map/adapter/event-translator.js +6 -6
  79. package/dist/map/adapter/event-translator.js.map +1 -1
  80. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  81. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  82. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  83. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  84. package/dist/map/adapter/extensions/index.d.ts +13 -1
  85. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  86. package/dist/map/adapter/extensions/index.js +61 -0
  87. package/dist/map/adapter/extensions/index.js.map +1 -1
  88. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  89. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  90. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  91. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  92. package/dist/map/adapter/extensions/rename.d.ts +29 -0
  93. package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
  94. package/dist/map/adapter/extensions/rename.js +49 -0
  95. package/dist/map/adapter/extensions/rename.js.map +1 -0
  96. package/dist/map/adapter/extensions/streams.d.ts +95 -0
  97. package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
  98. package/dist/map/adapter/extensions/streams.js +515 -0
  99. package/dist/map/adapter/extensions/streams.js.map +1 -0
  100. package/dist/map/adapter/extensions/task.d.ts.map +1 -1
  101. package/dist/map/adapter/extensions/task.js +10 -0
  102. package/dist/map/adapter/extensions/task.js.map +1 -1
  103. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  104. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  105. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  106. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  107. package/dist/map/adapter/index.d.ts +2 -1
  108. package/dist/map/adapter/index.d.ts.map +1 -1
  109. package/dist/map/adapter/index.js +10 -2
  110. package/dist/map/adapter/index.js.map +1 -1
  111. package/dist/map/adapter/interface.d.ts +2 -0
  112. package/dist/map/adapter/interface.d.ts.map +1 -1
  113. package/dist/map/adapter/map-adapter.d.ts +3 -0
  114. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  115. package/dist/map/adapter/map-adapter.js +258 -35
  116. package/dist/map/adapter/map-adapter.js.map +1 -1
  117. package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
  118. package/dist/map/adapter/subscription-manager.js +5 -1
  119. package/dist/map/adapter/subscription-manager.js.map +1 -1
  120. package/dist/map/adapter/types.d.ts +3 -1
  121. package/dist/map/adapter/types.d.ts.map +1 -1
  122. package/dist/mcp/map-client.d.ts +39 -0
  123. package/dist/mcp/map-client.d.ts.map +1 -0
  124. package/dist/mcp/map-client.js +129 -0
  125. package/dist/mcp/map-client.js.map +1 -0
  126. package/dist/mcp/mcp-server.d.ts +16 -0
  127. package/dist/mcp/mcp-server.d.ts.map +1 -1
  128. package/dist/mcp/mcp-server.js +125 -88
  129. package/dist/mcp/mcp-server.js.map +1 -1
  130. package/dist/mcp/tools/done.d.ts.map +1 -1
  131. package/dist/mcp/tools/done.js +18 -0
  132. package/dist/mcp/tools/done.js.map +1 -1
  133. package/dist/mcp/types.d.ts +9 -1
  134. package/dist/mcp/types.d.ts.map +1 -1
  135. package/dist/mcp/types.js.map +1 -1
  136. package/dist/metrics/metrics.js +1 -1
  137. package/dist/metrics/metrics.js.map +1 -1
  138. package/dist/roles/builtin/coordinator.d.ts.map +1 -1
  139. package/dist/roles/builtin/coordinator.js +2 -1
  140. package/dist/roles/builtin/coordinator.js.map +1 -1
  141. package/dist/roles/builtin/integrator.d.ts.map +1 -1
  142. package/dist/roles/builtin/integrator.js +2 -1
  143. package/dist/roles/builtin/integrator.js.map +1 -1
  144. package/dist/roles/builtin/worker.d.ts.map +1 -1
  145. package/dist/roles/builtin/worker.js +3 -1
  146. package/dist/roles/builtin/worker.js.map +1 -1
  147. package/dist/roles/capabilities.d.ts +9 -1
  148. package/dist/roles/capabilities.d.ts.map +1 -1
  149. package/dist/roles/capabilities.js +27 -7
  150. package/dist/roles/capabilities.js.map +1 -1
  151. package/dist/roles/config-loader.d.ts +6 -6
  152. package/dist/roles/config-loader.d.ts.map +1 -1
  153. package/dist/roles/config-loader.js +8 -7
  154. package/dist/roles/config-loader.js.map +1 -1
  155. package/dist/roles/registry.d.ts +2 -2
  156. package/dist/roles/registry.js +2 -2
  157. package/dist/roles/types.d.ts +3 -1
  158. package/dist/roles/types.d.ts.map +1 -1
  159. package/dist/server/combined-server.d.ts +28 -1
  160. package/dist/server/combined-server.d.ts.map +1 -1
  161. package/dist/server/combined-server.js +111 -8
  162. package/dist/server/combined-server.js.map +1 -1
  163. package/dist/store/event-store.d.ts +2 -1
  164. package/dist/store/event-store.d.ts.map +1 -1
  165. package/dist/store/event-store.js +80 -24
  166. package/dist/store/event-store.js.map +1 -1
  167. package/dist/store/instance.d.ts +1 -1
  168. package/dist/store/instance.d.ts.map +1 -1
  169. package/dist/store/instance.js +2 -2
  170. package/dist/store/instance.js.map +1 -1
  171. package/dist/store/types/agents.d.ts +23 -0
  172. package/dist/store/types/agents.d.ts.map +1 -1
  173. package/dist/store/types/events.d.ts +1 -1
  174. package/dist/store/types/events.d.ts.map +1 -1
  175. package/dist/task/backend/index.d.ts +47 -29
  176. package/dist/task/backend/index.d.ts.map +1 -1
  177. package/dist/task/backend/index.js +109 -71
  178. package/dist/task/backend/index.js.map +1 -1
  179. package/dist/task/backend/memory.d.ts +1 -0
  180. package/dist/task/backend/memory.d.ts.map +1 -1
  181. package/dist/task/backend/memory.js +3 -0
  182. package/dist/task/backend/memory.js.map +1 -1
  183. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  184. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  185. package/dist/task/backend/opentasks/backend.js +1023 -0
  186. package/dist/task/backend/opentasks/backend.js.map +1 -0
  187. package/dist/task/backend/opentasks/client.d.ts +337 -0
  188. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  189. package/dist/task/backend/opentasks/client.js +225 -0
  190. package/dist/task/backend/opentasks/client.js.map +1 -0
  191. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  192. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  193. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  194. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  195. package/dist/task/backend/opentasks/index.d.ts +21 -0
  196. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  197. package/dist/task/backend/opentasks/index.js +21 -0
  198. package/dist/task/backend/opentasks/index.js.map +1 -0
  199. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  200. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  201. package/dist/task/backend/opentasks/mapping.js +77 -0
  202. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  203. package/dist/task/backend/types.d.ts +33 -53
  204. package/dist/task/backend/types.d.ts.map +1 -1
  205. package/dist/task/backend/types.js +7 -11
  206. package/dist/task/backend/types.js.map +1 -1
  207. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  208. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  209. package/dist/task/backend/unified-tool-provider.js +623 -0
  210. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  211. package/dist/teams/index.d.ts +3 -1
  212. package/dist/teams/index.d.ts.map +1 -1
  213. package/dist/teams/index.js +2 -0
  214. package/dist/teams/index.js.map +1 -1
  215. package/dist/teams/seed-defaults.d.ts +20 -0
  216. package/dist/teams/seed-defaults.d.ts.map +1 -0
  217. package/dist/teams/seed-defaults.js +71 -0
  218. package/dist/teams/seed-defaults.js.map +1 -0
  219. package/dist/teams/team-loader.d.ts +7 -3
  220. package/dist/teams/team-loader.d.ts.map +1 -1
  221. package/dist/teams/team-loader.js +156 -164
  222. package/dist/teams/team-loader.js.map +1 -1
  223. package/dist/teams/team-manager.d.ts +112 -0
  224. package/dist/teams/team-manager.d.ts.map +1 -0
  225. package/dist/teams/team-manager.js +305 -0
  226. package/dist/teams/team-manager.js.map +1 -0
  227. package/dist/teams/team-runtime.d.ts +125 -19
  228. package/dist/teams/team-runtime.d.ts.map +1 -1
  229. package/dist/teams/team-runtime.js +529 -119
  230. package/dist/teams/team-runtime.js.map +1 -1
  231. package/dist/teams/types.d.ts +41 -151
  232. package/dist/teams/types.d.ts.map +1 -1
  233. package/dist/teams/types.js +2 -3
  234. package/dist/teams/types.js.map +1 -1
  235. package/docs/architecture.md +7 -6
  236. package/docs/configuration.md +26 -62
  237. package/docs/implementation-details.md +5 -5
  238. package/docs/implementation-summary.md +17 -17
  239. package/docs/plan-self-driving-support.md +4 -4
  240. package/docs/spec-self-driving-support.md +10 -10
  241. package/docs/team-templates.md +2 -2
  242. package/docs/teams.md +76 -3
  243. package/docs/troubleshooting.md +10 -11
  244. package/package.json +7 -4
  245. package/references/minimem/.claude/settings.json +7 -0
  246. package/references/minimem/.sudocode/issues.jsonl +18 -0
  247. package/references/minimem/.sudocode/specs.jsonl +1 -0
  248. package/references/minimem/CLAUDE.md +310 -0
  249. package/references/minimem/README.md +562 -0
  250. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
  251. package/references/minimem/claude-plugin/.mcp.json +7 -0
  252. package/references/minimem/claude-plugin/README.md +158 -0
  253. package/references/minimem/claude-plugin/commands/recall.md +47 -0
  254. package/references/minimem/claude-plugin/commands/remember.md +41 -0
  255. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
  256. package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
  257. package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
  258. package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
  259. package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
  260. package/references/minimem/media/banner.png +0 -0
  261. package/references/minimem/package-lock.json +5373 -0
  262. package/references/minimem/package.json +72 -0
  263. package/references/minimem/scripts/postbuild.js +35 -0
  264. package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
  265. package/references/minimem/src/__tests__/errors.test.ts +265 -0
  266. package/references/minimem/src/__tests__/helpers.ts +199 -0
  267. package/references/minimem/src/__tests__/internal.test.ts +407 -0
  268. package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
  269. package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
  270. package/references/minimem/src/__tests__/session.test.ts +190 -0
  271. package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
  272. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
  273. package/references/minimem/src/cli/commands/append.ts +76 -0
  274. package/references/minimem/src/cli/commands/config.ts +262 -0
  275. package/references/minimem/src/cli/commands/conflicts.ts +413 -0
  276. package/references/minimem/src/cli/commands/daemon.ts +169 -0
  277. package/references/minimem/src/cli/commands/index.ts +12 -0
  278. package/references/minimem/src/cli/commands/init.ts +88 -0
  279. package/references/minimem/src/cli/commands/mcp.ts +177 -0
  280. package/references/minimem/src/cli/commands/push-pull.ts +213 -0
  281. package/references/minimem/src/cli/commands/search.ts +158 -0
  282. package/references/minimem/src/cli/commands/status.ts +84 -0
  283. package/references/minimem/src/cli/commands/sync-init.ts +290 -0
  284. package/references/minimem/src/cli/commands/sync.ts +70 -0
  285. package/references/minimem/src/cli/commands/upsert.ts +197 -0
  286. package/references/minimem/src/cli/config.ts +584 -0
  287. package/references/minimem/src/cli/index.ts +264 -0
  288. package/references/minimem/src/cli/shared.ts +161 -0
  289. package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
  290. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
  291. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
  292. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
  293. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
  294. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
  295. package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
  296. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
  297. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
  298. package/references/minimem/src/cli/sync/central.ts +292 -0
  299. package/references/minimem/src/cli/sync/conflicts.ts +204 -0
  300. package/references/minimem/src/cli/sync/daemon.ts +407 -0
  301. package/references/minimem/src/cli/sync/detection.ts +138 -0
  302. package/references/minimem/src/cli/sync/index.ts +107 -0
  303. package/references/minimem/src/cli/sync/operations.ts +373 -0
  304. package/references/minimem/src/cli/sync/registry.ts +279 -0
  305. package/references/minimem/src/cli/sync/state.ts +355 -0
  306. package/references/minimem/src/cli/sync/validation.ts +206 -0
  307. package/references/minimem/src/cli/sync/watcher.ts +234 -0
  308. package/references/minimem/src/cli/version.ts +34 -0
  309. package/references/minimem/src/core/index.ts +9 -0
  310. package/references/minimem/src/core/indexer.ts +628 -0
  311. package/references/minimem/src/core/searcher.ts +221 -0
  312. package/references/minimem/src/db/schema.ts +183 -0
  313. package/references/minimem/src/db/sqlite-vec.ts +24 -0
  314. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
  315. package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
  316. package/references/minimem/src/embeddings/batch-openai.ts +409 -0
  317. package/references/minimem/src/embeddings/embeddings.ts +434 -0
  318. package/references/minimem/src/index.ts +109 -0
  319. package/references/minimem/src/internal.ts +299 -0
  320. package/references/minimem/src/minimem.ts +1276 -0
  321. package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
  322. package/references/minimem/src/search/graph.ts +234 -0
  323. package/references/minimem/src/search/hybrid.ts +151 -0
  324. package/references/minimem/src/search/search.ts +256 -0
  325. package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
  326. package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
  327. package/references/minimem/src/server/mcp.ts +326 -0
  328. package/references/minimem/src/server/tools.ts +720 -0
  329. package/references/minimem/src/session.ts +460 -0
  330. package/references/minimem/tsconfig.json +19 -0
  331. package/references/minimem/tsup.config.ts +26 -0
  332. package/references/minimem/vitest.config.ts +24 -0
  333. package/references/openteams/.claude/settings.json +6 -0
  334. package/references/openteams/README.md +1 -0
  335. package/references/openteams/SKILL.md +341 -0
  336. package/references/openteams/design.md +411 -0
  337. package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
  338. package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
  339. package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
  340. package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
  341. package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
  342. package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
  343. package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
  344. package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
  345. package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
  346. package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
  347. package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
  348. package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
  349. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
  350. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
  351. package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
  352. package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
  353. package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
  354. package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
  355. package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
  356. package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
  357. package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
  358. package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
  359. package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
  360. package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
  361. package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
  362. package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
  363. package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
  364. package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
  365. package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
  366. package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
  367. package/references/openteams/examples/bmad-method/team.yaml +161 -0
  368. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +17 -0
  369. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +5 -0
  370. package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +25 -0
  371. package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +5 -0
  372. package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +34 -0
  373. package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +5 -0
  374. package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +18 -0
  375. package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +3 -0
  376. package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +42 -0
  377. package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +5 -0
  378. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +15 -0
  379. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +3 -0
  380. package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +17 -0
  381. package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +3 -0
  382. package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +28 -0
  383. package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +5 -0
  384. package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +16 -0
  385. package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +3 -0
  386. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +13 -0
  387. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +3 -0
  388. package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +14 -0
  389. package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +3 -0
  390. package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +19 -0
  391. package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +5 -0
  392. package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +8 -0
  393. package/references/openteams/examples/get-shit-done/roles/debugger.yaml +8 -0
  394. package/references/openteams/examples/get-shit-done/roles/executor.yaml +8 -0
  395. package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +8 -0
  396. package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +9 -0
  397. package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +7 -0
  398. package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +8 -0
  399. package/references/openteams/examples/get-shit-done/roles/planner.yaml +8 -0
  400. package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +8 -0
  401. package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +7 -0
  402. package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +7 -0
  403. package/references/openteams/examples/get-shit-done/roles/verifier.yaml +8 -0
  404. package/references/openteams/examples/get-shit-done/team.yaml +154 -0
  405. package/references/openteams/package-lock.json +2181 -0
  406. package/references/openteams/package.json +48 -0
  407. package/references/openteams/schema/role.schema.json +125 -0
  408. package/references/openteams/schema/team.schema.json +284 -0
  409. package/references/openteams/src/cli/agent.ts +104 -0
  410. package/references/openteams/src/cli/cli.test.ts +381 -0
  411. package/references/openteams/src/cli/generate.ts +220 -0
  412. package/references/openteams/src/cli/message.ts +241 -0
  413. package/references/openteams/src/cli/task.ts +154 -0
  414. package/references/openteams/src/cli/team.ts +104 -0
  415. package/references/openteams/src/cli/template.ts +207 -0
  416. package/references/openteams/src/cli.ts +45 -0
  417. package/references/openteams/src/db/database.test.ts +185 -0
  418. package/references/openteams/src/db/database.ts +240 -0
  419. package/references/openteams/src/generators/agent-prompt-generator.test.ts +332 -0
  420. package/references/openteams/src/generators/agent-prompt-generator.ts +521 -0
  421. package/references/openteams/src/generators/package-generator.test.ts +129 -0
  422. package/references/openteams/src/generators/package-generator.ts +102 -0
  423. package/references/openteams/src/generators/skill-generator.test.ts +246 -0
  424. package/references/openteams/src/generators/skill-generator.ts +374 -0
  425. package/references/openteams/src/index.ts +104 -0
  426. package/references/openteams/src/services/agent-service.test.ts +158 -0
  427. package/references/openteams/src/services/agent-service.ts +84 -0
  428. package/references/openteams/src/services/communication-service.test.ts +455 -0
  429. package/references/openteams/src/services/communication-service.ts +371 -0
  430. package/references/openteams/src/services/message-service.test.ts +342 -0
  431. package/references/openteams/src/services/message-service.ts +203 -0
  432. package/references/openteams/src/services/task-service.test.ts +434 -0
  433. package/references/openteams/src/services/task-service.ts +239 -0
  434. package/references/openteams/src/services/team-service.test.ts +181 -0
  435. package/references/openteams/src/services/team-service.ts +139 -0
  436. package/references/openteams/src/services/template-service.test.ts +306 -0
  437. package/references/openteams/src/services/template-service.ts +182 -0
  438. package/references/openteams/src/spawner/acp-factory.ts +96 -0
  439. package/references/openteams/src/spawner/interface.ts +31 -0
  440. package/references/openteams/src/spawner/mock.test.ts +93 -0
  441. package/references/openteams/src/spawner/mock.ts +59 -0
  442. package/references/openteams/src/template/loader.test.ts +1319 -0
  443. package/references/openteams/src/template/loader.ts +698 -0
  444. package/references/openteams/src/template/types.ts +200 -0
  445. package/references/openteams/src/types.ts +205 -0
  446. package/references/openteams/tsconfig.json +18 -0
  447. package/references/openteams/vitest.config.ts +9 -0
  448. package/references/skill-tree/.claude/settings.json +6 -0
  449. package/references/skill-tree/.sudocode/issues.jsonl +11 -0
  450. package/references/skill-tree/.sudocode/specs.jsonl +1 -0
  451. package/references/skill-tree/CLAUDE.md +150 -0
  452. package/references/skill-tree/README.md +324 -0
  453. package/references/skill-tree/docs/GAPS_v1.md +221 -0
  454. package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
  455. package/references/skill-tree/docs/TODOS.md +91 -0
  456. package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
  457. package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
  458. package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
  459. package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
  460. package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
  461. package/references/skill-tree/docs/scraper/README.md +170 -0
  462. package/references/skill-tree/examples/basic-usage.ts +190 -0
  463. package/references/skill-tree/package-lock.json +1509 -0
  464. package/references/skill-tree/package.json +66 -0
  465. package/references/skill-tree/scraper/README.md +123 -0
  466. package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
  467. package/references/skill-tree/scraper/docs/PLAN.md +336 -0
  468. package/references/skill-tree/scraper/drizzle.config.ts +10 -0
  469. package/references/skill-tree/scraper/package-lock.json +6329 -0
  470. package/references/skill-tree/scraper/package.json +68 -0
  471. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
  472. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
  473. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
  474. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
  475. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
  476. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
  477. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
  478. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
  479. package/references/skill-tree/scraper/tsup.config.ts +14 -0
  480. package/references/skill-tree/scraper/vitest.config.ts +17 -0
  481. package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
  482. package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
  483. package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
  484. package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
  485. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
  486. package/references/skill-tree/test/run-all.ts +106 -0
  487. package/references/skill-tree/test/utils.ts +128 -0
  488. package/references/skill-tree/vitest.config.ts +16 -0
  489. package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
  490. package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
  491. package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
  492. package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
  493. package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
  494. package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
  495. package/src/acp/__tests__/integration.test.ts +56 -31
  496. package/src/acp/__tests__/macro-agent.test.ts +16 -7
  497. package/src/acp/macro-agent.ts +170 -36
  498. package/src/acp/types.ts +46 -1
  499. package/src/agent/__tests__/agent-manager.test.ts +228 -2
  500. package/src/agent/agent-manager.ts +809 -285
  501. package/src/agent/types.ts +12 -1
  502. package/src/api/__tests__/server.test.ts +203 -4
  503. package/src/api/server.ts +169 -10
  504. package/src/api/types.ts +3 -1
  505. package/src/auth/__tests__/token.test.ts +100 -0
  506. package/src/auth/index.ts +1 -0
  507. package/src/auth/token.ts +82 -0
  508. package/src/cli/__tests__/acp.test.ts +1 -1
  509. package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
  510. package/src/cli/acp.ts +197 -72
  511. package/src/cli/index.ts +125 -15
  512. package/src/cli/mcp.ts +315 -197
  513. package/src/cli/parse-args.ts +54 -0
  514. package/src/cli/stable-instance-id.ts +14 -0
  515. package/src/config/project-config.ts +214 -27
  516. package/src/index.ts +3 -0
  517. package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
  518. package/src/lifecycle/__tests__/handlers.test.ts +53 -0
  519. package/src/lifecycle/handlers/index.ts +25 -8
  520. package/src/lifecycle/types.ts +3 -0
  521. package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +22 -4
  522. package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
  523. package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
  524. package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
  525. package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
  526. package/src/map/adapter/__tests__/event-log.test.ts +527 -0
  527. package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
  528. package/src/map/adapter/__tests__/extensions.test.ts +408 -0
  529. package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
  530. package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
  531. package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
  532. package/src/map/adapter/__tests__/stream-extensions.test.ts +494 -0
  533. package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
  534. package/src/map/adapter/acp-over-map.ts +678 -66
  535. package/src/map/adapter/connection-manager.ts +3 -0
  536. package/src/map/adapter/event-log.ts +208 -0
  537. package/src/map/adapter/event-translator.ts +6 -6
  538. package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
  539. package/src/map/adapter/extensions/index.ts +96 -0
  540. package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
  541. package/src/map/adapter/extensions/streams.ts +839 -0
  542. package/src/map/adapter/extensions/task.ts +11 -0
  543. package/src/map/adapter/extensions/update-metadata.ts +126 -0
  544. package/src/map/adapter/index.ts +33 -0
  545. package/src/map/adapter/interface.ts +2 -0
  546. package/src/map/adapter/map-adapter.ts +312 -47
  547. package/src/map/adapter/subscription-manager.ts +5 -1
  548. package/src/map/adapter/types.ts +10 -1
  549. package/src/mcp/__tests__/map-client.test.ts +386 -0
  550. package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
  551. package/src/mcp/__tests__/mcp-server.test.ts +100 -1
  552. package/src/mcp/map-client.ts +177 -0
  553. package/src/mcp/mcp-server.ts +205 -103
  554. package/src/mcp/tools/done.ts +19 -0
  555. package/src/mcp/types.ts +6 -1
  556. package/src/metrics/metrics.ts +1 -1
  557. package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
  558. package/src/roles/__tests__/config-loader.test.ts +7 -7
  559. package/src/roles/builtin/coordinator.ts +2 -0
  560. package/src/roles/builtin/integrator.ts +2 -0
  561. package/src/roles/builtin/worker.ts +3 -0
  562. package/src/roles/capabilities.ts +28 -7
  563. package/src/roles/config-loader.ts +8 -7
  564. package/src/roles/registry.ts +2 -2
  565. package/src/roles/types.ts +7 -0
  566. package/src/server/__tests__/combined-server.test.ts +94 -21
  567. package/src/server/combined-server.ts +203 -33
  568. package/src/steering/__tests__/steering-integration.test.ts +1 -1
  569. package/src/store/__tests__/event-store-oob.test.ts +109 -0
  570. package/src/store/__tests__/event-store.test.ts +196 -1
  571. package/src/store/__tests__/instance.test.ts +3 -3
  572. package/src/store/event-store.ts +92 -23
  573. package/src/store/instance.ts +2 -2
  574. package/src/store/types/agents.ts +20 -0
  575. package/src/store/types/events.ts +1 -1
  576. package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
  577. package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
  578. package/src/task/backend/__tests__/memory-pull-mode.test.ts +153 -0
  579. package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
  580. package/src/task/backend/index.ts +156 -106
  581. package/src/task/backend/memory.ts +4 -0
  582. package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
  583. package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
  584. package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
  585. package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
  586. package/src/task/backend/opentasks/backend.ts +1323 -0
  587. package/src/task/backend/opentasks/client.ts +652 -0
  588. package/src/task/backend/opentasks/daemon-manager.ts +256 -0
  589. package/src/task/backend/opentasks/index.ts +69 -0
  590. package/src/task/backend/opentasks/mapping.ts +94 -0
  591. package/src/task/backend/types.ts +42 -66
  592. package/src/task/backend/unified-tool-provider.ts +779 -0
  593. package/src/teams/CLAUDE.md +180 -0
  594. package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
  595. package/src/teams/__tests__/e2e/workspace-isolation.e2e.test.ts +1263 -0
  596. package/src/teams/__tests__/team-manager.test.ts +814 -0
  597. package/src/teams/__tests__/team-system.test.ts +1291 -8
  598. package/src/teams/index.ts +21 -3
  599. package/src/teams/seed-defaults.ts +79 -0
  600. package/src/teams/team-loader.ts +202 -236
  601. package/src/teams/team-manager.ts +387 -0
  602. package/src/teams/team-runtime.ts +592 -121
  603. package/src/teams/types.ts +99 -200
  604. package/test_fixtures/README.md +2 -3
  605. package/test_fixtures/fixtures/index.ts +0 -3
  606. package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
  607. package/test_fixtures/fixtures/repos/index.ts +1 -3
  608. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
  609. package/test_fixtures/fixtures/repos/types.ts +0 -11
  610. package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
  611. package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
  612. package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
  613. package/vitest.config.ts +1 -1
  614. package/vitest.e2e.config.ts +1 -1
  615. package/vitest.setup.ts +1 -30
  616. package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
  617. package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
  618. package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
  619. package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
  620. package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
  621. package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
  622. package/.macro-agent/teams/self-driving/team.yaml +0 -103
  623. package/.macro-agent/teams/structured/prompts/developer.md +0 -26
  624. package/.macro-agent/teams/structured/prompts/lead.md +0 -25
  625. package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
  626. package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
  627. package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
  628. package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
  629. package/.macro-agent/teams/structured/team.yaml +0 -89
  630. package/docs/sudocode-integration.md +0 -383
  631. package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
  632. package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
  633. package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
  634. package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
  635. package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
  636. package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
  637. package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
  638. package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
  639. package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
  640. package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
  641. package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
  642. package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
  643. package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
  644. package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
  645. package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
  646. package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
  647. package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
  648. package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
  649. package/src/task/backend/sudocode/backend.ts +0 -1237
  650. package/src/task/backend/sudocode/client.ts +0 -515
  651. package/src/task/backend/sudocode/index.ts +0 -120
  652. package/src/task/backend/sudocode/mapping.ts +0 -93
  653. package/src/task/backend/sudocode/server-client.ts +0 -522
  654. package/src/task/backend/sudocode/standalone-client.ts +0 -623
  655. package/src/task/backend/sudocode/sync-policy.ts +0 -387
  656. package/src/task/backend/sudocode/tools.ts +0 -896
  657. package/src/task/backend/tool-provider.ts +0 -506
  658. package/test_fixtures/fixtures/sudocode/index.ts +0 -29
  659. package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
  660. package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
@@ -687,8 +687,8 @@ Commit "Resolve conflict".
687
687
  // The agents are terminated manually because they don't autonomously call done()
688
688
  const allEvents = eventStore.query({});
689
689
  const spawnCount = allEvents.filter((e) => e.type === "spawn").length;
690
- const terminateCount = allEvents.filter((e) => e.type === "terminate").length;
691
- log(`✓ Events: ${spawnCount} spawns, ${terminateCount} terminates`);
690
+ const terminateCount = allEvents.filter((e) => e.type === "stop").length;
691
+ log(`✓ Events: ${spawnCount} spawns, ${terminateCount} stops`);
692
692
 
693
693
  expect(spawnCount).toBeGreaterThanOrEqual(3); // w1, w2, resolver
694
694
  expect(terminateCount).toBeGreaterThanOrEqual(3); // w1, w2, resolver
@@ -0,0 +1,304 @@
1
+ /**
2
+ * E2E Integration tests for MCP Thin-Client Bridge
3
+ *
4
+ * Starts a real combined server with real services, then uses mapCall()
5
+ * over WebSocket to verify the complete round-trip through MCP bridge
6
+ * extension handlers.
7
+ */
8
+
9
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
10
+ import { createEventStore, type EventStore } from "../../store/event-store.js";
11
+ import { createAgentManager, type AgentManager } from "../../agent/agent-manager.js";
12
+ import { createTaskManager, type TaskManager } from "../../task/task-manager.js";
13
+ import { createMessageRouter, type MessageRouter } from "../../router/message-router.js";
14
+ import {
15
+ createCombinedServer,
16
+ type CombinedServer,
17
+ } from "../../server/combined-server.js";
18
+ import { mapCall, MapCallError } from "../../mcp/map-client.js";
19
+
20
+ // =============================================================================
21
+ // Test Helpers
22
+ // =============================================================================
23
+
24
+ function getRandomPort(): number {
25
+ return 10000 + Math.floor(Math.random() * 50000);
26
+ }
27
+
28
+ /**
29
+ * Valid agent context for bridge calls.
30
+ * Must match an agent that exists in EventStore.
31
+ */
32
+ function agentContext(agentId: string, taskId?: string) {
33
+ return {
34
+ agent_id: agentId,
35
+ session_id: "sess_test",
36
+ task_id: taskId ?? "task_test",
37
+ lineage: [],
38
+ cwd: "/test/cwd",
39
+ };
40
+ }
41
+
42
+ // =============================================================================
43
+ // Tests
44
+ // =============================================================================
45
+
46
+ describe("MCP Thin-Client Bridge E2E", () => {
47
+ let eventStore: EventStore;
48
+ let agentManager: AgentManager;
49
+ let taskManager: TaskManager;
50
+ let messageRouter: MessageRouter;
51
+ let server: CombinedServer;
52
+ let port: number;
53
+ let serverUrl: string;
54
+
55
+ beforeEach(async () => {
56
+ port = getRandomPort();
57
+ serverUrl = `http://localhost:${port}`;
58
+
59
+ // Create real services with in-memory EventStore
60
+ eventStore = await createEventStore({ inMemory: true });
61
+ messageRouter = createMessageRouter(eventStore);
62
+ agentManager = createAgentManager(eventStore, messageRouter, {
63
+ defaultPermissionMode: "auto-approve",
64
+ defaultCwd: "/test/cwd",
65
+ });
66
+ taskManager = createTaskManager(eventStore);
67
+
68
+ // Create and start combined server (includes MCP bridge registration)
69
+ server = createCombinedServer(
70
+ { eventStore, agentManager, taskManager, messageRouter },
71
+ { port, host: "localhost" }
72
+ );
73
+
74
+ await server.start();
75
+ });
76
+
77
+ afterEach(async () => {
78
+ await server.stop();
79
+ await agentManager.close();
80
+ await eventStore.close();
81
+ });
82
+
83
+ // ─────────────────────────────────────────────────────────────────
84
+ // emit_status round-trip
85
+ // ─────────────────────────────────────────────────────────────────
86
+
87
+ describe("emit_status round-trip", () => {
88
+ it("emits a status event via bridge and verifies it in EventStore", async () => {
89
+ // Seed an agent in the EventStore
90
+ eventStore.emit({
91
+ type: "spawn",
92
+ source: { agent_id: "system" },
93
+ payload: {
94
+ agent_id: "agent_e2e",
95
+ session_id: "sess_e2e",
96
+ task: "E2E test task",
97
+ task_id: "task_e2e",
98
+ parent: null,
99
+ config: {},
100
+ cwd: "/test/cwd",
101
+ },
102
+ });
103
+
104
+ const result = await mapCall<{ event_id: string; task_updated: boolean }>(
105
+ serverUrl,
106
+ "_macro/mcp/emit_status",
107
+ {
108
+ context: agentContext("agent_e2e", "task_e2e"),
109
+ status_type: "checkpoint",
110
+ summary: "50% complete",
111
+ }
112
+ );
113
+
114
+ expect(result.event_id).toBeDefined();
115
+ expect(result.task_updated).toBe(false);
116
+
117
+ // Verify the event was actually stored
118
+ const events = eventStore.query({
119
+ type: "status",
120
+ source_agent_id: "agent_e2e",
121
+ });
122
+ expect(events.length).toBeGreaterThanOrEqual(1);
123
+ expect(events[0].payload.summary).toBe("50% complete");
124
+ });
125
+ });
126
+
127
+ // ─────────────────────────────────────────────────────────────────
128
+ // query_index round-trip
129
+ // ─────────────────────────────────────────────────────────────────
130
+
131
+ describe("query_index round-trip", () => {
132
+ it("queries agents via bridge after seeding data", async () => {
133
+ // Seed agents
134
+ eventStore.emit({
135
+ type: "spawn",
136
+ source: { agent_id: "system" },
137
+ payload: {
138
+ agent_id: "agent_1",
139
+ session_id: "sess_1",
140
+ task: "First task",
141
+ task_id: "task_1",
142
+ parent: null,
143
+ config: {},
144
+ cwd: "/test",
145
+ },
146
+ });
147
+ eventStore.emit({
148
+ type: "spawn",
149
+ source: { agent_id: "system" },
150
+ payload: {
151
+ agent_id: "agent_2",
152
+ session_id: "sess_2",
153
+ task: "Second task",
154
+ task_id: "task_2",
155
+ parent: null,
156
+ config: {},
157
+ cwd: "/test",
158
+ },
159
+ });
160
+
161
+ const result = await mapCall<{
162
+ entries: Array<{ type: string; id: string; summary: string }>;
163
+ total: number;
164
+ has_more: boolean;
165
+ }>(serverUrl, "_macro/mcp/query_index", {
166
+ context: agentContext("agent_1"),
167
+ type: "agents",
168
+ });
169
+
170
+ expect(result.entries.length).toBeGreaterThanOrEqual(2);
171
+ expect(result.entries.some((e) => e.id === "agent_1")).toBe(true);
172
+ expect(result.entries.some((e) => e.id === "agent_2")).toBe(true);
173
+ });
174
+
175
+ it("queries tasks via bridge", async () => {
176
+ // Create a task
177
+ taskManager.create({
178
+ description: "E2E test task",
179
+ created_by: "agent_test",
180
+ });
181
+
182
+ const result = await mapCall<{
183
+ entries: Array<{ type: string; id: string; summary: string }>;
184
+ total: number;
185
+ }>(serverUrl, "_macro/mcp/query_index", {
186
+ context: agentContext("agent_test"),
187
+ type: "tasks",
188
+ });
189
+
190
+ expect(result.entries.length).toBeGreaterThanOrEqual(1);
191
+ expect(result.entries[0].type).toBe("task");
192
+ });
193
+ });
194
+
195
+ // ─────────────────────────────────────────────────────────────────
196
+ // send_message + check_messages round-trip
197
+ // ─────────────────────────────────────────────────────────────────
198
+
199
+ describe("send_message + check_messages round-trip", () => {
200
+ it("sends and receives a message via bridge", async () => {
201
+ // Seed two agents
202
+ eventStore.emit({
203
+ type: "spawn",
204
+ source: { agent_id: "system" },
205
+ payload: {
206
+ agent_id: "agent_sender",
207
+ session_id: "sess_sender",
208
+ task: "Sender task",
209
+ task_id: "task_sender",
210
+ parent: null,
211
+ config: {},
212
+ cwd: "/test",
213
+ },
214
+ });
215
+ eventStore.emit({
216
+ type: "spawn",
217
+ source: { agent_id: "system" },
218
+ payload: {
219
+ agent_id: "agent_receiver",
220
+ session_id: "sess_receiver",
221
+ task: "Receiver task",
222
+ task_id: "task_receiver",
223
+ parent: null,
224
+ config: {},
225
+ cwd: "/test",
226
+ },
227
+ });
228
+
229
+ // Subscribe receiver to their own address
230
+ eventStore.addSubscription("agent_receiver", "agent:agent_receiver");
231
+
232
+ // Send message via bridge
233
+ const sendResult = await mapCall<{ message_id: string; delivered_to: number }>(
234
+ serverUrl,
235
+ "_macro/mcp/send_message",
236
+ {
237
+ context: agentContext("agent_sender"),
238
+ to: { agent_id: "agent_receiver" },
239
+ content: "Hello from E2E test",
240
+ }
241
+ );
242
+
243
+ expect(sendResult.message_id).toBeDefined();
244
+ expect(sendResult.delivered_to).toBeGreaterThanOrEqual(1);
245
+
246
+ // Check messages via bridge
247
+ const checkResult = await mapCall<{
248
+ messages: Array<{ id: string; content: string; from: string }>;
249
+ total_pending: number;
250
+ }>(serverUrl, "_macro/mcp/check_messages", {
251
+ context: agentContext("agent_receiver"),
252
+ });
253
+
254
+ expect(checkResult.messages.length).toBeGreaterThanOrEqual(1);
255
+ expect(checkResult.messages.some((m) => m.content === "Hello from E2E test")).toBe(true);
256
+ });
257
+ });
258
+
259
+ // ─────────────────────────────────────────────────────────────────
260
+ // Context validation over the wire
261
+ // ─────────────────────────────────────────────────────────────────
262
+
263
+ describe("context validation over the wire", () => {
264
+ it("rejects calls without context", async () => {
265
+ try {
266
+ await mapCall(serverUrl, "_macro/mcp/query_index", { type: "agents" });
267
+ expect.fail("Should have thrown");
268
+ } catch (err) {
269
+ expect(err).toBeInstanceOf(MapCallError);
270
+ expect((err as MapCallError).message).toContain("agent_id is required");
271
+ }
272
+ });
273
+ });
274
+
275
+ // ─────────────────────────────────────────────────────────────────
276
+ // Error propagation
277
+ // ─────────────────────────────────────────────────────────────────
278
+
279
+ describe("error propagation", () => {
280
+ it("returns error for non-existent agent in get_agent_summary", async () => {
281
+ try {
282
+ await mapCall(serverUrl, "_macro/mcp/get_agent_summary", {
283
+ context: agentContext("agent_test"),
284
+ agent_id: "nonexistent_agent",
285
+ });
286
+ expect.fail("Should have thrown");
287
+ } catch (err) {
288
+ expect(err).toBeInstanceOf(MapCallError);
289
+ expect((err as MapCallError).message).toContain("not found");
290
+ }
291
+ });
292
+
293
+ it("returns error for non-existent extension method", async () => {
294
+ try {
295
+ await mapCall(serverUrl, "_macro/mcp/nonexistent_method", {
296
+ context: agentContext("agent_test"),
297
+ });
298
+ expect.fail("Should have thrown");
299
+ } catch (err) {
300
+ expect(err).toBeInstanceOf(MapCallError);
301
+ }
302
+ });
303
+ });
304
+ });
@@ -0,0 +1,324 @@
1
+ /**
2
+ * MCP Tools Availability E2E Test
3
+ *
4
+ * Verifies that agents spawned through acp-factory have access to the
5
+ * macro-agent MCP tools. This tests the full chain:
6
+ * agent-manager → acp-factory → claude-code-acp → Claude Agent SDK → MCP subprocess
7
+ *
8
+ * REQUIRES: RUN_FULL_AGENT_TESTS=true environment variable
9
+ *
10
+ * Run with:
11
+ * RUN_FULL_AGENT_TESTS=true npm run test:e2e -- src/__tests__/e2e/mcp-tools-available.e2e.test.ts
12
+ */
13
+
14
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
15
+ import * as fs from "fs";
16
+ import * as path from "path";
17
+ import * as os from "os";
18
+ import { execSync } from "child_process";
19
+
20
+ import { createEventStore, type EventStore } from "../../store/event-store.js";
21
+ import {
22
+ createAgentManager,
23
+ type AgentManager,
24
+ } from "../../agent/agent-manager.js";
25
+ import {
26
+ createMessageRouter,
27
+ type MessageRouter,
28
+ } from "../../router/message-router.js";
29
+
30
+ // ─────────────────────────────────────────────────────────────────
31
+ // Test Configuration
32
+ // ─────────────────────────────────────────────────────────────────
33
+
34
+ const RUN_FULL_AGENT = !!process.env.RUN_FULL_AGENT_TESTS;
35
+ const testFn = RUN_FULL_AGENT ? it : it.skip;
36
+
37
+ // MCP server name as configured in agent-manager.ts
38
+ const MCP_SERVER_NAME = "macro-agent";
39
+
40
+ // Core coordination tools always registered for any agent role
41
+ const EXPECTED_CORE_TOOLS = [
42
+ "done",
43
+ "spawn_agent",
44
+ "emit_status",
45
+ "send_message",
46
+ "check_messages",
47
+ "get_hierarchy",
48
+ "get_agent_summary",
49
+ "query_index",
50
+ "inject_context",
51
+ "wait_for_activity",
52
+ ];
53
+
54
+ // Peer communication tools (registered when PeerManager is available)
55
+ const PEER_TOOLS = [
56
+ "send_peer_message",
57
+ "send_peer_request",
58
+ "respond_to_peer_request",
59
+ ];
60
+
61
+ // Role-gated tools that may not be available to all roles
62
+ const ROLE_GATED_TOOLS = [
63
+ "stop_agent", // requires agent.terminate capability
64
+ ];
65
+
66
+ // Task backend tools (memory backend, push mode) — registered via taskToolProvider
67
+ const TASK_BACKEND_TOOLS = [
68
+ "create_task",
69
+ "get_task",
70
+ "list_tasks",
71
+ "assign_task",
72
+ ];
73
+
74
+ /**
75
+ * Build the full MCP tool name as it appears in Claude Code.
76
+ * Format: mcp__<server-name>__<tool-name>
77
+ */
78
+ function mcpToolName(tool: string): string {
79
+ return `mcp__${MCP_SERVER_NAME}__${tool}`;
80
+ }
81
+
82
+ // ─────────────────────────────────────────────────────────────────
83
+ // Helpers
84
+ // ─────────────────────────────────────────────────────────────────
85
+
86
+ interface ToolCallInfo {
87
+ toolName: string;
88
+ toolCallId: string;
89
+ status: string;
90
+ }
91
+
92
+ /**
93
+ * Extract tool_call events from session update stream.
94
+ *
95
+ * Claude Code reports MCP tool usage via session updates:
96
+ * { sessionUpdate: "tool_call", _meta: { claudeCode: { toolName } }, toolCallId, status }
97
+ */
98
+ function extractToolCalls(updates: Record<string, unknown>[]): ToolCallInfo[] {
99
+ const calls: ToolCallInfo[] = [];
100
+ for (const update of updates) {
101
+ if (update.sessionUpdate === "tool_call") {
102
+ const meta = update._meta as
103
+ | { claudeCode?: { toolName?: string } }
104
+ | undefined;
105
+ const toolName = meta?.claudeCode?.toolName ?? (update as { title?: string }).title ?? "unknown";
106
+ calls.push({
107
+ toolName,
108
+ toolCallId: (update.toolCallId as string) ?? "",
109
+ status: (update.status as string) ?? "",
110
+ });
111
+ }
112
+ }
113
+ return calls;
114
+ }
115
+
116
+ // ─────────────────────────────────────────────────────────────────
117
+ // Tests
118
+ // ─────────────────────────────────────────────────────────────────
119
+
120
+ describe("MCP Tools Availability", () => {
121
+ let eventStore: EventStore;
122
+ let agentManager: AgentManager;
123
+ let messageRouter: MessageRouter;
124
+ let tmpDir: string;
125
+ let testRepoPath: string;
126
+
127
+ beforeEach(async () => {
128
+ if (!RUN_FULL_AGENT) return;
129
+
130
+ // File-based EventStore so MCP subprocess can access the same database
131
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "mcp-tools-e2e-"));
132
+ const instanceId = `test-mcp-tools-${Date.now()}`;
133
+
134
+ // Isolated git repo for agent cwd
135
+ testRepoPath = path.join(tmpDir, "test-repo");
136
+ fs.mkdirSync(testRepoPath);
137
+ execSync("git init", { cwd: testRepoPath });
138
+ execSync('git config user.email "test@test.com"', { cwd: testRepoPath });
139
+ execSync('git config user.name "Test User"', { cwd: testRepoPath });
140
+ fs.writeFileSync(path.join(testRepoPath, "README.md"), "# Test Repo\n");
141
+ execSync("git add -A", { cwd: testRepoPath });
142
+ execSync('git commit -m "Initial commit"', { cwd: testRepoPath });
143
+
144
+ eventStore = await createEventStore({ instanceId, baseDir: tmpDir });
145
+ messageRouter = createMessageRouter(eventStore);
146
+ agentManager = createAgentManager(eventStore, messageRouter, {
147
+ defaultPermissionMode: "auto-approve",
148
+ defaultCwd: testRepoPath,
149
+ });
150
+ });
151
+
152
+ afterEach(async () => {
153
+ if (!RUN_FULL_AGENT) return;
154
+
155
+ // Terminate all running agents
156
+ try {
157
+ for (const agent of agentManager.list()) {
158
+ if (agent.state === "running") {
159
+ await agentManager.terminate(agent.id, "cancelled");
160
+ }
161
+ }
162
+ } catch {
163
+ // Ignore cleanup errors
164
+ }
165
+
166
+ await agentManager?.close();
167
+ await eventStore?.close();
168
+
169
+ if (tmpDir) {
170
+ fs.rmSync(tmpDir, { recursive: true, force: true });
171
+ }
172
+ });
173
+
174
+ testFn(
175
+ "spawned agent can use macro-agent MCP tools (emit_status, check_messages, done)",
176
+ async () => {
177
+ // Spawn a worker agent
178
+ const spawnResult = await agentManager.spawn({
179
+ task: "Use MCP tools as instructed.",
180
+ role: "worker",
181
+ cwd: testRepoPath,
182
+ });
183
+
184
+ // Prompt the agent to call several MCP tools so we can observe tool_call events
185
+ const allUpdates: Record<string, unknown>[] = [];
186
+
187
+ for await (const update of agentManager.prompt(
188
+ spawnResult.id,
189
+ `You have access to MCP tools from the "macro-agent" server. Please do the following steps IN ORDER:
190
+
191
+ 1. Call emit_status with status_type "checkpoint" and summary "mcp tool verification"
192
+ 2. Call check_messages to check your inbox
193
+ 3. Call done with status "completed" and summary "all tools verified"
194
+
195
+ Do these steps now. Do NOT do any other work.`,
196
+ )) {
197
+ allUpdates.push(update as Record<string, unknown>);
198
+ }
199
+
200
+ // Extract tool calls from the update stream
201
+ const toolCalls = extractToolCalls(allUpdates);
202
+ const toolNames = toolCalls.map((tc) => tc.toolName);
203
+
204
+ // Log for diagnostics
205
+ console.log(`\n[MCP Tools E2E] Total session updates: ${allUpdates.length}`);
206
+ console.log(`[MCP Tools E2E] Tool calls observed: ${toolCalls.length}`);
207
+ for (const tc of toolCalls) {
208
+ console.log(` - ${tc.toolName} (status: ${tc.status})`);
209
+ }
210
+
211
+ // ── Assertions ──────────────────────────────────────────────
212
+
213
+ // Agent should have made at least one tool call
214
+ expect(toolCalls.length).toBeGreaterThan(0);
215
+
216
+ // Verify the tools used were macro-agent MCP tools
217
+ const macroAgentCalls = toolNames.filter((n) =>
218
+ n.startsWith(`mcp__${MCP_SERVER_NAME}__`),
219
+ );
220
+ expect(
221
+ macroAgentCalls.length,
222
+ "Expected at least one macro-agent MCP tool call",
223
+ ).toBeGreaterThan(0);
224
+
225
+ // Verify done() was called via MCP
226
+ expect(toolNames).toContain(mcpToolName("done"));
227
+
228
+ // Verify EventStore received the done event from MCP subprocess
229
+ await eventStore.reload();
230
+ const statusEvents = eventStore.query({ type: "status" });
231
+ const doneEvent = statusEvents.find(
232
+ (e) =>
233
+ e.source?.agent_id === spawnResult.id &&
234
+ e.payload?.status_type === "completed",
235
+ );
236
+ expect(doneEvent).toBeDefined();
237
+
238
+ // Terminate agent (may already be stopped from done())
239
+ const agent = agentManager.get(spawnResult.id);
240
+ if (agent?.state === "running") {
241
+ await agentManager.terminate(spawnResult.id, "completed");
242
+ }
243
+ },
244
+ { timeout: 120_000 },
245
+ );
246
+
247
+ testFn(
248
+ "spawned agent has all expected MCP tools registered",
249
+ async () => {
250
+ // Spawn a worker and ask it to list all its MCP tools by trying to use them.
251
+ // We verify the tool set by asking the agent to describe its mcp__macro-agent__ tools.
252
+ const spawnResult = await agentManager.spawn({
253
+ task: "Report on your available MCP tools.",
254
+ role: "worker",
255
+ cwd: testRepoPath,
256
+ });
257
+
258
+ let responseText = "";
259
+ const allUpdates: Record<string, unknown>[] = [];
260
+
261
+ for await (const update of agentManager.prompt(
262
+ spawnResult.id,
263
+ `List ALL tools you have that start with "mcp__macro-agent__".
264
+ Just list them by name, one per line. Be exhaustive - include every single one.
265
+ After listing them, call done() with status "completed".`,
266
+ )) {
267
+ const updateObj = update as Record<string, unknown>;
268
+ allUpdates.push(updateObj);
269
+
270
+ // Collect text response
271
+ if (updateObj.sessionUpdate === "agent_message_chunk") {
272
+ const content = updateObj.content as { type?: string; text?: string } | undefined;
273
+ if (content?.type === "text" && content?.text) {
274
+ responseText += content.text;
275
+ }
276
+ }
277
+ }
278
+
279
+ const toolCalls = extractToolCalls(allUpdates);
280
+ const toolNames = toolCalls.map((tc) => tc.toolName);
281
+
282
+ console.log(`\n[MCP Tools E2E] Agent response about tools:\n${responseText}`);
283
+ console.log(`\n[MCP Tools E2E] Tool calls made: ${toolNames.join(", ")}`);
284
+
285
+ // The response should mention macro-agent MCP tools
286
+ const responseLower = responseText.toLowerCase();
287
+ expect(
288
+ responseLower.includes("mcp__macro-agent__") || responseLower.includes("done"),
289
+ "Agent should mention macro-agent MCP tools in response",
290
+ ).toBe(true);
291
+
292
+ // Verify the core tools are mentioned in the response.
293
+ const mentionedCoreTools = EXPECTED_CORE_TOOLS.filter(
294
+ (tool) =>
295
+ responseLower.includes(mcpToolName(tool)) ||
296
+ responseLower.includes(tool),
297
+ );
298
+
299
+ console.log(
300
+ `[MCP Tools E2E] Core tools mentioned: ${mentionedCoreTools.length}/${EXPECTED_CORE_TOOLS.length}`,
301
+ );
302
+ console.log(` Mentioned: ${mentionedCoreTools.join(", ")}`);
303
+ const missingCoreTools = EXPECTED_CORE_TOOLS.filter(
304
+ (t) => !mentionedCoreTools.includes(t),
305
+ );
306
+ if (missingCoreTools.length > 0) {
307
+ console.log(` Missing: ${missingCoreTools.join(", ")}`);
308
+ }
309
+
310
+ // All core tools should be mentioned
311
+ expect(mentionedCoreTools.length).toBe(EXPECTED_CORE_TOOLS.length);
312
+
313
+ // done() should have been called
314
+ expect(toolNames).toContain(mcpToolName("done"));
315
+
316
+ // Terminate
317
+ const agent = agentManager.get(spawnResult.id);
318
+ if (agent?.state === "running") {
319
+ await agentManager.terminate(spawnResult.id, "completed");
320
+ }
321
+ },
322
+ { timeout: 120_000 },
323
+ );
324
+ });
@@ -542,10 +542,10 @@ describe("Part 1: Multi-Agent Lifecycle E2E", () => {
542
542
  `✓ Grandchild state: ${grandchildAgent?.state}, reason: ${grandchildAgent?.stop_reason}`,
543
543
  );
544
544
 
545
- // Verify terminate events
546
- const terminateEvents = eventStore.query({ type: "terminate" });
545
+ // Verify stop events
546
+ const terminateEvents = eventStore.query({ type: "stop" });
547
547
  expect(terminateEvents.length).toBeGreaterThanOrEqual(3);
548
- log(`✓ Terminate events: ${terminateEvents.length}`);
548
+ log(`✓ Stop events: ${terminateEvents.length}`);
549
549
  },
550
550
  { timeout: TIMEOUT.HIERARCHY },
551
551
  );
@@ -961,8 +961,8 @@ describe("Part 3: Event Storage E2E", () => {
961
961
  // Terminate agent
962
962
  await agentManager.terminate(headId, "completed");
963
963
 
964
- // Verify terminate event
965
- const terminateEvents = eventStore.query({ type: "terminate" });
964
+ // Verify stop event
965
+ const terminateEvents = eventStore.query({ type: "stop" });
966
966
  expect(terminateEvents.length).toBeGreaterThanOrEqual(1);
967
967
  const termEvent = terminateEvents.find(
968
968
  (e) => e.payload.agent_id === headId,