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
@@ -16,10 +16,10 @@ function extractToolOutput(rawOutput) {
16
16
  if (typeof rawOutput === "string")
17
17
  return rawOutput;
18
18
  if (Array.isArray(rawOutput)) {
19
- return rawOutput
19
+ return (rawOutput
20
20
  .filter((item) => item.type === "text" && typeof item.text === "string")
21
21
  .map((item) => item.text)
22
- .join("\n") || undefined;
22
+ .join("\n") || undefined);
23
23
  }
24
24
  return undefined;
25
25
  }
@@ -31,15 +31,39 @@ export class ACPOverMAPHandler {
31
31
  eventStore;
32
32
  taskManager;
33
33
  defaultCwd;
34
+ onAgentRegistered;
34
35
  /** Stream states by streamId */
35
36
  streams = new Map();
36
37
  /** Session mapper for ACP session -> Agent mapping */
37
- sessionMapper = new SessionMapper();
38
+ sessionMapper;
38
39
  constructor(config) {
39
40
  this.agentManager = config.agentManager;
40
41
  this.eventStore = config.eventStore;
41
42
  this.taskManager = config.taskManager;
42
43
  this.defaultCwd = config.defaultCwd ?? process.cwd();
44
+ this.onAgentRegistered = config.onAgentRegistered;
45
+ // Initialize session mapper with EventStore for persistence and recovery
46
+ this.sessionMapper = new SessionMapper(this.eventStore);
47
+ const recovered = this.sessionMapper.recoverFromStore();
48
+ if (recovered > 0) {
49
+ console.error(`[ACP-over-MAP] Recovered ${recovered} session(s) from store`);
50
+ }
51
+ }
52
+ /**
53
+ * Notify subscribers that a new agent was registered.
54
+ * Looks up agent details from EventStore and calls the onAgentRegistered callback.
55
+ */
56
+ notifyAgentRegistered(agentId) {
57
+ if (!this.onAgentRegistered)
58
+ return;
59
+ const agent = this.eventStore.getAgent(agentId);
60
+ this.onAgentRegistered({
61
+ id: agentId,
62
+ name: agent?.name,
63
+ role: agent?.role,
64
+ parent: agent?.parent ?? undefined,
65
+ metadata: agent?.metadata,
66
+ });
43
67
  }
44
68
  /**
45
69
  * Abort all active streams targeting a specific agent.
@@ -136,6 +160,14 @@ export class ACPOverMAPHandler {
136
160
  throw new Error("Stream already initialized");
137
161
  }
138
162
  streamState.initialized = true;
163
+ // Extract permission mode from _meta.macroConfig if provided
164
+ const meta = params?._meta;
165
+ const macroConfig = meta?.macroConfig;
166
+ const defaultSubAgentConfig = macroConfig?.defaultSubAgentConfig;
167
+ if (defaultSubAgentConfig?.permissionMode) {
168
+ streamState.permissionMode =
169
+ defaultSubAgentConfig.permissionMode;
170
+ }
139
171
  return {
140
172
  protocolVersion: 1,
141
173
  agentCapabilities: {
@@ -162,6 +194,7 @@ export class ACPOverMAPHandler {
162
194
  const spawned = await this.agentManager.getOrCreateHeadManager({
163
195
  cwd: workingDir,
164
196
  forceNew: true,
197
+ permissionMode: streamState.permissionMode,
165
198
  });
166
199
  const sessionId = spawned.session_id;
167
200
  streamState.sessionId = sessionId;
@@ -169,6 +202,8 @@ export class ACPOverMAPHandler {
169
202
  // Create session mapping
170
203
  this.sessionMapper.createMapping(sessionId, spawned.id);
171
204
  console.error(`[ACP-over-MAP] Created session ${sessionId} -> agent ${spawned.id}`);
205
+ // Notify subscribers that a new agent was registered
206
+ this.notifyAgentRegistered(spawned.id);
172
207
  // Emit session_info_update so client has title/timestamps
173
208
  this.emitSessionInfo(streamState, sessionId, emitNotification);
174
209
  return { sessionId };
@@ -177,7 +212,7 @@ export class ACPOverMAPHandler {
177
212
  if (!streamState.initialized) {
178
213
  throw new Error("Must call initialize before loadSession");
179
214
  }
180
- const { sessionId: rawSessionId, cwd, _meta } = params ?? {};
215
+ const { sessionId: rawSessionId, cwd, _meta, } = params ?? {};
181
216
  if (!rawSessionId) {
182
217
  throw new Error("sessionId required");
183
218
  }
@@ -191,6 +226,32 @@ export class ACPOverMAPHandler {
191
226
  }
192
227
  sessionId = agent.session_id;
193
228
  console.error(`[ACP-over-MAP] loadSession: Resolved agentId ${metaAgentId} to session ${sessionId}`);
229
+ // Handle the agent directly — works for both head managers and sub-agents.
230
+ // The previous code only searched listHeadManagers(), so sub-agents
231
+ // were never found and a new head manager was created instead.
232
+ if (this.agentManager.hasActiveSession(metaAgentId)) {
233
+ console.error(`[ACP-over-MAP] loadSession: Reusing active session for agent ${metaAgentId}`);
234
+ }
235
+ else {
236
+ // Agent exists but no active session — resume it
237
+ console.error(`[ACP-over-MAP] loadSession: Resuming agent ${metaAgentId}`);
238
+ try {
239
+ await this.agentManager.resume(metaAgentId, streamState.permissionMode);
240
+ }
241
+ catch (resumeErr) {
242
+ // ALREADY_RUNNING can happen in a race — safe to ignore
243
+ const code = resumeErr.code;
244
+ if (code !== "ALREADY_RUNNING") {
245
+ throw resumeErr;
246
+ }
247
+ console.error(`[ACP-over-MAP] loadSession: Agent ${metaAgentId} already running (race), continuing`);
248
+ }
249
+ }
250
+ streamState.sessionId = sessionId;
251
+ streamState.agentId = metaAgentId;
252
+ this.sessionMapper.createMapping(sessionId, metaAgentId);
253
+ this.emitSessionInfo(streamState, sessionId, emitNotification);
254
+ return { sessionId };
194
255
  }
195
256
  const workingDir = cwd ?? this.defaultCwd;
196
257
  // Try to find an existing head manager with this session ID
@@ -208,7 +269,7 @@ export class ACPOverMAPHandler {
208
269
  }
209
270
  // Agent exists but no active session - resume it
210
271
  console.error(`[ACP-over-MAP] loadSession: Resuming stopped agent ${existing.id}`);
211
- const spawned = await this.agentManager.resume(existing.id);
272
+ const spawned = await this.agentManager.resume(existing.id, streamState.permissionMode);
212
273
  streamState.sessionId = sessionId;
213
274
  streamState.agentId = spawned.id;
214
275
  this.sessionMapper.createMapping(sessionId, spawned.id);
@@ -220,10 +281,13 @@ export class ACPOverMAPHandler {
220
281
  const spawned = await this.agentManager.getOrCreateHeadManager({
221
282
  cwd: workingDir,
222
283
  sessionId,
284
+ permissionMode: streamState.permissionMode,
223
285
  });
224
286
  streamState.sessionId = sessionId;
225
287
  streamState.agentId = spawned.id;
226
288
  this.sessionMapper.createMapping(sessionId, spawned.id);
289
+ // Notify subscribers that a new agent was registered
290
+ this.notifyAgentRegistered(spawned.id);
227
291
  this.emitSessionInfo(streamState, sessionId, emitNotification);
228
292
  return { sessionId };
229
293
  }
@@ -310,6 +374,10 @@ export class ACPOverMAPHandler {
310
374
  // Accumulate content for history persistence (preserving text/tool interleaving order)
311
375
  const u = update;
312
376
  const updateType = u.sessionUpdate ?? u.type;
377
+ // Annotate permission_request updates with agentId so clients can respond
378
+ if (updateType === "permission_request") {
379
+ u._agentId = agentId;
380
+ }
313
381
  if (updateType === "agent_message_chunk") {
314
382
  const content = u.content;
315
383
  if (content?.text) {
@@ -328,7 +396,8 @@ export class ACPOverMAPHandler {
328
396
  latestPlan = entries;
329
397
  }
330
398
  }
331
- else if (updateType === "tool_call" || updateType === "tool_call_update") {
399
+ else if (updateType === "tool_call" ||
400
+ updateType === "tool_call_update") {
332
401
  const toolCallId = u.toolCallId;
333
402
  const status = u.status;
334
403
  const meta = u._meta;
@@ -342,7 +411,9 @@ export class ACPOverMAPHandler {
342
411
  }
343
412
  if (status === "completed" || status === "failed") {
344
413
  // Merge cached info for tool_call_update events that lack title/input
345
- const cached = toolCallId ? toolInfoCache.get(toolCallId) : undefined;
414
+ const cached = toolCallId
415
+ ? toolInfoCache.get(toolCallId)
416
+ : undefined;
346
417
  buffer.parts.push({
347
418
  type: "tool",
348
419
  toolCallId,
@@ -373,10 +444,30 @@ export class ACPOverMAPHandler {
373
444
  return { stopReason };
374
445
  }
375
446
  catch (error) {
376
- console.error(`[ACP-over-MAP] Prompt error:`, error);
447
+ // Extract a meaningful error message — errors from the ACP SDK may be
448
+ // plain objects ({code, message}) rather than Error instances.
449
+ let errorMessage;
450
+ if (error instanceof Error) {
451
+ errorMessage = error.message;
452
+ }
453
+ else if (typeof error === "object" &&
454
+ error !== null &&
455
+ "message" in error &&
456
+ typeof error.message === "string") {
457
+ errorMessage = error.message;
458
+ }
459
+ else {
460
+ try {
461
+ errorMessage = JSON.stringify(error);
462
+ }
463
+ catch {
464
+ errorMessage = String(error);
465
+ }
466
+ }
467
+ console.error(`[ACP-over-MAP] Prompt error for agent ${agentId}:`, errorMessage);
377
468
  return {
378
469
  stopReason: "end_turn",
379
- error: error instanceof Error ? error.message : String(error),
470
+ error: errorMessage,
380
471
  };
381
472
  }
382
473
  finally {
@@ -438,7 +529,11 @@ export class ACPOverMAPHandler {
438
529
  task,
439
530
  cwd: cwd ?? this.defaultCwd,
440
531
  role: "worker",
532
+ topics,
533
+ config,
441
534
  });
535
+ // Notify subscribers that a new agent was registered
536
+ this.notifyAgentRegistered(spawned.id);
442
537
  return {
443
538
  agentId: spawned.id,
444
539
  sessionId: spawned.session_id,
@@ -470,8 +565,17 @@ export class ACPOverMAPHandler {
470
565
  if (!agent) {
471
566
  throw new Error(`Agent not found: ${agentId}`);
472
567
  }
568
+ // If the agent is already running, return its current state
569
+ // instead of throwing. The caller likely just wants to ensure
570
+ // the agent is active, which it already is.
473
571
  if (agent.state !== "stopped" && agent.state !== "failed") {
474
- throw new Error(`Agent ${agentId} is ${agent.state} only stopped or failed agents can be resumed`);
572
+ console.error(`[ACP-over-MAP] _macro/resume: Agent ${agentId} is already ${agent.state}, returning current state`);
573
+ return {
574
+ success: true,
575
+ agentId: agent.id,
576
+ sessionId: agent.session_id,
577
+ alreadyRunning: true,
578
+ };
475
579
  }
476
580
  const spawned = await this.agentManager.resume(agentId);
477
581
  return {
@@ -481,18 +585,18 @@ export class ACPOverMAPHandler {
481
585
  };
482
586
  }
483
587
  case "_macro/getHistory": {
484
- const { sessionId, agentId: historyAgentId, limit } = methodParams;
588
+ const { sessionId, agentId: historyAgentId, limit, } = methodParams;
485
589
  // Resolve conversationId: prefer agentId lookup (resolves to the
486
590
  // original session_id where turns were recorded), fall back to
487
591
  // explicit sessionId. This allows history to survive across server
488
592
  // restarts even when the ACP session ID changes (e.g., resume()
489
593
  // fails → TUI creates new session with different ID).
594
+ const agent = historyAgentId
595
+ ? this.eventStore.getAgent(historyAgentId)
596
+ : undefined;
490
597
  let conversationId;
491
- if (historyAgentId) {
492
- const agent = this.eventStore.getAgent(historyAgentId);
493
- if (agent) {
494
- conversationId = agent.session_id;
495
- }
598
+ if (agent) {
599
+ conversationId = agent.session_id;
496
600
  }
497
601
  if (!conversationId) {
498
602
  conversationId = sessionId;
@@ -500,13 +604,39 @@ export class ACPOverMAPHandler {
500
604
  if (!conversationId) {
501
605
  return { turns: [] };
502
606
  }
503
- const turns = this.eventStore.listTurns({
504
- conversationId,
505
- order: "asc",
506
- limit: limit ?? 200,
507
- });
508
- // Include persisted plan and agent cwd if available
509
- const agent = historyAgentId ? this.eventStore.getAgent(historyAgentId) : undefined;
607
+ // For forked agents, include the source agent's conversation history
608
+ // (pre-fork turns) followed by this agent's own turns.
609
+ // Only include source turns from before the fork to avoid leaking
610
+ // turns that the source recorded after the fork point.
611
+ const sourceAgentId = agent?.metadata?.fork_of;
612
+ let turns;
613
+ if (sourceAgentId) {
614
+ const sourceAgent = this.eventStore.getAgent(sourceAgentId);
615
+ const sourceConversationId = sourceAgent?.session_id;
616
+ const forkTimestamp = agent.created_at;
617
+ const sourceTurns = sourceConversationId
618
+ ? this.eventStore
619
+ .listTurns({
620
+ conversationId: sourceConversationId,
621
+ order: "asc",
622
+ limit: limit ?? 200,
623
+ })
624
+ .filter((t) => t.timestamp <= forkTimestamp)
625
+ : [];
626
+ const ownTurns = this.eventStore.listTurns({
627
+ conversationId,
628
+ order: "asc",
629
+ limit: limit ?? 200,
630
+ });
631
+ turns = [...sourceTurns, ...ownTurns];
632
+ }
633
+ else {
634
+ turns = this.eventStore.listTurns({
635
+ conversationId,
636
+ order: "asc",
637
+ limit: limit ?? 200,
638
+ });
639
+ }
510
640
  const plan = agent?.plan ?? [];
511
641
  return {
512
642
  turns: turns.map((turn) => ({
@@ -520,6 +650,237 @@ export class ACPOverMAPHandler {
520
650
  cwd: agent?.cwd ?? null,
521
651
  };
522
652
  }
653
+ case "_macro/respondToPermission": {
654
+ const { agentId: targetAgentId, requestId, optionId, } = methodParams;
655
+ if (!targetAgentId || !requestId || !optionId) {
656
+ throw new Error("agentId, requestId, and optionId are required");
657
+ }
658
+ const success = this.agentManager.respondToPermission(targetAgentId, requestId, optionId);
659
+ return { success };
660
+ }
661
+ case "_macro/cancelPermission": {
662
+ const { agentId: targetAgentId, requestId } = methodParams;
663
+ if (!targetAgentId || !requestId) {
664
+ throw new Error("agentId and requestId are required");
665
+ }
666
+ const success = this.agentManager.cancelPermission(targetAgentId, requestId);
667
+ return { success };
668
+ }
669
+ case "_macro/setPermissionMode": {
670
+ const { agentId: targetAgentId, permissionMode } = methodParams;
671
+ if (!targetAgentId || !permissionMode) {
672
+ throw new Error("agentId and permissionMode are required");
673
+ }
674
+ const previousMode = this.agentManager.getPermissionMode(targetAgentId);
675
+ const success = this.agentManager.setPermissionMode(targetAgentId, permissionMode);
676
+ if (success) {
677
+ return { success: true, previousMode: previousMode ?? undefined };
678
+ }
679
+ return {
680
+ success: false,
681
+ error: `No active session found for agent ${targetAgentId}`,
682
+ };
683
+ }
684
+ case "_macro/forkAgent": {
685
+ const { agentId, name, prompt, cwd } = methodParams;
686
+ if (!agentId) {
687
+ throw new Error("agentId is required");
688
+ }
689
+ const sourceAgent = this.eventStore.getAgent(agentId);
690
+ if (!sourceAgent) {
691
+ throw new Error(`Agent not found: ${agentId}`);
692
+ }
693
+ const forked = await this.agentManager.forkAgent(agentId, {
694
+ name,
695
+ prompt,
696
+ cwd: cwd ?? sourceAgent.cwd ?? this.defaultCwd,
697
+ });
698
+ // Fire-and-forget initial prompt if provided
699
+ if (prompt) {
700
+ (async () => {
701
+ try {
702
+ for await (const _update of this.agentManager.prompt(forked.id, prompt)) {
703
+ // drain iterator
704
+ }
705
+ }
706
+ catch {
707
+ // best-effort
708
+ }
709
+ })();
710
+ }
711
+ return {
712
+ newAgentId: forked.id,
713
+ newSessionId: forked.session_id,
714
+ originalAgentId: agentId,
715
+ providerSessionId: forked.session?.id,
716
+ };
717
+ }
718
+ case "_macro/agents/update": {
719
+ const { agentId, name, plan, metadata } = methodParams;
720
+ if (!agentId) {
721
+ throw new Error("agentId is required");
722
+ }
723
+ if (name === undefined &&
724
+ plan === undefined &&
725
+ metadata === undefined) {
726
+ throw new Error("At least one field to update is required (name, plan, or metadata)");
727
+ }
728
+ if (name !== undefined && !name.trim()) {
729
+ throw new Error("name must not be empty");
730
+ }
731
+ const agent = this.eventStore.getAgent(agentId);
732
+ if (!agent) {
733
+ throw new Error(`Agent not found: ${agentId}`);
734
+ }
735
+ const updates = {};
736
+ const updatedFields = [];
737
+ if (name !== undefined) {
738
+ updates.name = name.trim();
739
+ updatedFields.push("name");
740
+ }
741
+ if (plan !== undefined) {
742
+ updates.plan = plan;
743
+ updatedFields.push("plan");
744
+ }
745
+ if (metadata !== undefined) {
746
+ updates.metadata = metadata;
747
+ updatedFields.push("metadata");
748
+ }
749
+ this.eventStore.updateAgentMetadata(agentId, updates);
750
+ return {
751
+ success: true,
752
+ agentId,
753
+ updated: updatedFields,
754
+ };
755
+ }
756
+ case "_macro/getModels": {
757
+ const { sessionId } = methodParams;
758
+ const agentId = this.sessionMapper.getAgentId(sessionId);
759
+ if (!agentId) {
760
+ return { currentModelId: null, availableModels: [] };
761
+ }
762
+ const session = this.agentManager.getSession(agentId);
763
+ if (!session) {
764
+ return { currentModelId: null, availableModels: [] };
765
+ }
766
+ // Try clientHandler's model info store first (from _model_state_update notification)
767
+ const clientHandler = session.clientHandler;
768
+ const modelInfo = clientHandler?.getSessionModelInfo?.(session.id);
769
+ if (modelInfo && modelInfo.availableModels.length > 0) {
770
+ return modelInfo;
771
+ }
772
+ // Fall back to Session.models (from initial session response — just IDs)
773
+ if (session.models && session.models.length > 0) {
774
+ return {
775
+ currentModelId: session.models[0],
776
+ availableModels: session.models.map((id) => ({
777
+ modelId: id,
778
+ name: id,
779
+ })),
780
+ };
781
+ }
782
+ return { currentModelId: null, availableModels: [] };
783
+ }
784
+ case "_session/setCompaction": {
785
+ // Compaction is handled internally by the agent process.
786
+ // Accept the request as a no-op so the client doesn't get an error.
787
+ // TODO: Make sure this overrides if needed.
788
+ return { success: true };
789
+ }
790
+ // ── Task Management Extensions ────────────────────────────────
791
+ // These mirror the registered adapter extensions (_macro/task/*)
792
+ // so they're accessible via ACP-over-MAP streams.
793
+ case "_macro/task/list": {
794
+ const { filter } = (methodParams ?? {});
795
+ const taskFilter = filter
796
+ ? {
797
+ status: filter.status,
798
+ assigned_agent: filter.assignedAgent,
799
+ parent_task: filter.parentTask,
800
+ created_by: filter.createdBy,
801
+ rootTasksOnly: filter.rootTasksOnly,
802
+ }
803
+ : undefined;
804
+ const tasks = this.taskManager.list(taskFilter);
805
+ return {
806
+ tasks: tasks.map((t) => ({
807
+ id: t.id,
808
+ description: t.description,
809
+ status: t.status,
810
+ assignedAgent: t.assigned_agent,
811
+ createdBy: t.created_by,
812
+ createdAt: t.created_at,
813
+ parentTask: t.parent_task,
814
+ isBlocked: t.isBlocked,
815
+ externalId: t.external_id,
816
+ })),
817
+ };
818
+ }
819
+ case "_macro/task/get": {
820
+ const { taskId } = methodParams;
821
+ if (!taskId)
822
+ throw new Error("taskId is required");
823
+ const task = this.taskManager.get(taskId);
824
+ if (!task)
825
+ throw new Error(`Task not found: ${taskId}`);
826
+ return {
827
+ task: {
828
+ id: task.id,
829
+ description: task.description,
830
+ status: task.status,
831
+ assignedAgent: task.assigned_agent,
832
+ createdBy: task.created_by,
833
+ createdAt: task.created_at,
834
+ parentTask: task.parent_task,
835
+ isBlocked: task.isBlocked,
836
+ externalId: task.external_id,
837
+ },
838
+ };
839
+ }
840
+ case "_macro/task/create": {
841
+ const { description, parentTask, externalId } = methodParams;
842
+ if (!description)
843
+ throw new Error("description is required");
844
+ // Determine who is creating the task — use the stream's agent or a default
845
+ const createdBy = (streamState.agentId ?? "tui");
846
+ const task = this.taskManager.create({
847
+ description,
848
+ created_by: createdBy,
849
+ parent_task: parentTask,
850
+ });
851
+ return {
852
+ task: {
853
+ id: task.id,
854
+ description: task.description,
855
+ status: task.status,
856
+ assignedAgent: task.assigned_agent,
857
+ createdBy: task.created_by,
858
+ createdAt: task.created_at,
859
+ parentTask: task.parent_task,
860
+ },
861
+ };
862
+ }
863
+ case "_macro/task/assign": {
864
+ const { taskId, agentId, role } = methodParams;
865
+ if (!taskId)
866
+ throw new Error("taskId is required");
867
+ if (!agentId)
868
+ throw new Error("agentId is required");
869
+ this.taskManager.assign(taskId, agentId, role);
870
+ return { success: true };
871
+ }
872
+ case "_macro/task/complete": {
873
+ const { taskId, outputs } = methodParams;
874
+ if (!taskId)
875
+ throw new Error("taskId is required");
876
+ // Update status to completed
877
+ this.taskManager.updateStatus(taskId, "completed");
878
+ // If outputs provided, update task metadata
879
+ if (outputs) {
880
+ this.taskManager.update(taskId, { outputs });
881
+ }
882
+ return { success: true };
883
+ }
523
884
  default:
524
885
  throw new Error(`Unknown extension method: ${method}`);
525
886
  }