macro-agent 0.0.17 → 0.1.1

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 (338) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/.sudocode/specs.jsonl +4 -0
  3. package/CLAUDE.md +16 -14
  4. package/README.md +11 -29
  5. package/dist/acp/macro-agent.d.ts +17 -0
  6. package/dist/acp/macro-agent.d.ts.map +1 -1
  7. package/dist/acp/macro-agent.js +183 -55
  8. package/dist/acp/macro-agent.js.map +1 -1
  9. package/dist/acp/types.d.ts +32 -1
  10. package/dist/acp/types.d.ts.map +1 -1
  11. package/dist/acp/types.js.map +1 -1
  12. package/dist/agent/agent-manager.d.ts +65 -1
  13. package/dist/agent/agent-manager.d.ts.map +1 -1
  14. package/dist/agent/agent-manager.js +464 -183
  15. package/dist/agent/agent-manager.js.map +1 -1
  16. package/dist/agent/types.d.ts +1 -1
  17. package/dist/agent/types.d.ts.map +1 -1
  18. package/dist/api/server.d.ts +3 -0
  19. package/dist/api/server.d.ts.map +1 -1
  20. package/dist/api/server.js +37 -6
  21. package/dist/api/server.js.map +1 -1
  22. package/dist/auth/index.d.ts +2 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +2 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/auth/token.d.ts +41 -0
  27. package/dist/auth/token.d.ts.map +1 -0
  28. package/dist/auth/token.js +73 -0
  29. package/dist/auth/token.js.map +1 -0
  30. package/dist/cli/acp.d.ts +2 -23
  31. package/dist/cli/acp.d.ts.map +1 -1
  32. package/dist/cli/acp.js +127 -61
  33. package/dist/cli/acp.js.map +1 -1
  34. package/dist/cli/index.js +147 -15
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/mcp.d.ts +6 -0
  37. package/dist/cli/mcp.d.ts.map +1 -1
  38. package/dist/cli/mcp.js +268 -181
  39. package/dist/cli/mcp.js.map +1 -1
  40. package/dist/cli/parse-args.d.ts +20 -0
  41. package/dist/cli/parse-args.d.ts.map +1 -0
  42. package/dist/cli/parse-args.js +43 -0
  43. package/dist/cli/parse-args.js.map +1 -0
  44. package/dist/cli/stable-instance-id.d.ts +8 -0
  45. package/dist/cli/stable-instance-id.d.ts.map +1 -0
  46. package/dist/cli/stable-instance-id.js +14 -0
  47. package/dist/cli/stable-instance-id.js.map +1 -0
  48. package/dist/config/project-config.d.ts +74 -7
  49. package/dist/config/project-config.d.ts.map +1 -1
  50. package/dist/config/project-config.js +123 -20
  51. package/dist/config/project-config.js.map +1 -1
  52. package/dist/map/adapter/acp-over-map.d.ts +23 -0
  53. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  54. package/dist/map/adapter/acp-over-map.js +482 -55
  55. package/dist/map/adapter/acp-over-map.js.map +1 -1
  56. package/dist/map/adapter/connection-manager.d.ts.map +1 -1
  57. package/dist/map/adapter/connection-manager.js +3 -0
  58. package/dist/map/adapter/connection-manager.js.map +1 -1
  59. package/dist/map/adapter/event-log.d.ts +87 -0
  60. package/dist/map/adapter/event-log.d.ts.map +1 -0
  61. package/dist/map/adapter/event-log.js +122 -0
  62. package/dist/map/adapter/event-log.js.map +1 -0
  63. package/dist/map/adapter/event-translator.js +6 -6
  64. package/dist/map/adapter/event-translator.js.map +1 -1
  65. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  66. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  67. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  68. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  69. package/dist/map/adapter/extensions/index.d.ts +10 -1
  70. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  71. package/dist/map/adapter/extensions/index.js +34 -0
  72. package/dist/map/adapter/extensions/index.js.map +1 -1
  73. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  74. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  75. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  76. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  77. package/dist/map/adapter/extensions/rename.d.ts +29 -0
  78. package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
  79. package/dist/map/adapter/extensions/rename.js +49 -0
  80. package/dist/map/adapter/extensions/rename.js.map +1 -0
  81. package/dist/map/adapter/extensions/task.d.ts.map +1 -1
  82. package/dist/map/adapter/extensions/task.js +10 -0
  83. package/dist/map/adapter/extensions/task.js.map +1 -1
  84. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  85. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  86. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  87. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  88. package/dist/map/adapter/index.d.ts +2 -1
  89. package/dist/map/adapter/index.d.ts.map +1 -1
  90. package/dist/map/adapter/index.js +8 -2
  91. package/dist/map/adapter/index.js.map +1 -1
  92. package/dist/map/adapter/interface.d.ts +2 -0
  93. package/dist/map/adapter/interface.d.ts.map +1 -1
  94. package/dist/map/adapter/map-adapter.d.ts +4 -0
  95. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  96. package/dist/map/adapter/map-adapter.js +302 -30
  97. package/dist/map/adapter/map-adapter.js.map +1 -1
  98. package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
  99. package/dist/map/adapter/subscription-manager.js +5 -1
  100. package/dist/map/adapter/subscription-manager.js.map +1 -1
  101. package/dist/map/adapter/types.d.ts +2 -0
  102. package/dist/map/adapter/types.d.ts.map +1 -1
  103. package/dist/mcp/map-client.d.ts +39 -0
  104. package/dist/mcp/map-client.d.ts.map +1 -0
  105. package/dist/mcp/map-client.js +129 -0
  106. package/dist/mcp/map-client.js.map +1 -0
  107. package/dist/mcp/mcp-server.d.ts +14 -0
  108. package/dist/mcp/mcp-server.d.ts.map +1 -1
  109. package/dist/mcp/mcp-server.js +113 -85
  110. package/dist/mcp/mcp-server.js.map +1 -1
  111. package/dist/mcp/types.d.ts +9 -1
  112. package/dist/mcp/types.d.ts.map +1 -1
  113. package/dist/mcp/types.js.map +1 -1
  114. package/dist/metrics/metrics.js +1 -1
  115. package/dist/metrics/metrics.js.map +1 -1
  116. package/dist/roles/capabilities.d.ts +3 -1
  117. package/dist/roles/capabilities.d.ts.map +1 -1
  118. package/dist/roles/capabilities.js +17 -7
  119. package/dist/roles/capabilities.js.map +1 -1
  120. package/dist/roles/config-loader.d.ts +6 -6
  121. package/dist/roles/config-loader.d.ts.map +1 -1
  122. package/dist/roles/config-loader.js +6 -6
  123. package/dist/roles/config-loader.js.map +1 -1
  124. package/dist/roles/registry.d.ts +2 -2
  125. package/dist/roles/registry.js +2 -2
  126. package/dist/server/combined-server.d.ts +20 -0
  127. package/dist/server/combined-server.d.ts.map +1 -1
  128. package/dist/server/combined-server.js +107 -8
  129. package/dist/server/combined-server.js.map +1 -1
  130. package/dist/store/event-store.d.ts +7 -1
  131. package/dist/store/event-store.d.ts.map +1 -1
  132. package/dist/store/event-store.js +91 -8
  133. package/dist/store/event-store.js.map +1 -1
  134. package/dist/store/types/agents.d.ts +23 -0
  135. package/dist/store/types/agents.d.ts.map +1 -1
  136. package/dist/store/types/events.d.ts +1 -1
  137. package/dist/store/types/events.d.ts.map +1 -1
  138. package/dist/task/backend/index.d.ts +47 -29
  139. package/dist/task/backend/index.d.ts.map +1 -1
  140. package/dist/task/backend/index.js +109 -71
  141. package/dist/task/backend/index.js.map +1 -1
  142. package/dist/task/backend/memory.d.ts +1 -0
  143. package/dist/task/backend/memory.d.ts.map +1 -1
  144. package/dist/task/backend/memory.js +3 -0
  145. package/dist/task/backend/memory.js.map +1 -1
  146. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  147. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  148. package/dist/task/backend/opentasks/backend.js +1023 -0
  149. package/dist/task/backend/opentasks/backend.js.map +1 -0
  150. package/dist/task/backend/opentasks/client.d.ts +337 -0
  151. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  152. package/dist/task/backend/opentasks/client.js +225 -0
  153. package/dist/task/backend/opentasks/client.js.map +1 -0
  154. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  155. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  156. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  157. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  158. package/dist/task/backend/opentasks/index.d.ts +21 -0
  159. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  160. package/dist/task/backend/opentasks/index.js +21 -0
  161. package/dist/task/backend/opentasks/index.js.map +1 -0
  162. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  163. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  164. package/dist/task/backend/opentasks/mapping.js +77 -0
  165. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  166. package/dist/task/backend/types.d.ts +33 -53
  167. package/dist/task/backend/types.d.ts.map +1 -1
  168. package/dist/task/backend/types.js +7 -11
  169. package/dist/task/backend/types.js.map +1 -1
  170. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  171. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  172. package/dist/task/backend/unified-tool-provider.js +623 -0
  173. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  174. package/dist/teams/team-loader.d.ts +2 -2
  175. package/dist/teams/team-loader.js +3 -3
  176. package/dist/teams/team-loader.js.map +1 -1
  177. package/dist/teams/team-runtime.d.ts.map +1 -1
  178. package/dist/teams/team-runtime.js +2 -0
  179. package/dist/teams/team-runtime.js.map +1 -1
  180. package/docs/architecture.md +7 -6
  181. package/docs/configuration.md +26 -62
  182. package/docs/implementation-details.md +5 -5
  183. package/docs/implementation-summary.md +17 -17
  184. package/docs/plan-self-driving-support.md +4 -4
  185. package/docs/spec-self-driving-support.md +10 -10
  186. package/docs/team-templates.md +2 -2
  187. package/docs/teams.md +3 -3
  188. package/docs/troubleshooting.md +10 -11
  189. package/package.json +6 -4
  190. package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
  191. package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
  192. package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
  193. package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
  194. package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
  195. package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
  196. package/src/acp/__tests__/history.test.ts +8 -4
  197. package/src/acp/__tests__/integration.test.ts +56 -31
  198. package/src/acp/__tests__/macro-agent.test.ts +16 -7
  199. package/src/acp/macro-agent.ts +230 -62
  200. package/src/acp/types.ts +46 -1
  201. package/src/agent/__tests__/agent-manager.test.ts +228 -2
  202. package/src/agent/agent-manager.ts +714 -261
  203. package/src/agent/types.ts +3 -1
  204. package/src/api/server.ts +41 -7
  205. package/src/auth/__tests__/token.test.ts +100 -0
  206. package/src/auth/index.ts +1 -0
  207. package/src/auth/token.ts +82 -0
  208. package/src/cli/__tests__/acp.test.ts +1 -1
  209. package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
  210. package/src/cli/acp.ts +130 -72
  211. package/src/cli/index.ts +120 -14
  212. package/src/cli/mcp.ts +311 -207
  213. package/src/cli/parse-args.ts +54 -0
  214. package/src/cli/stable-instance-id.ts +14 -0
  215. package/src/config/project-config.ts +190 -27
  216. package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
  217. package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +820 -0
  218. package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
  219. package/src/map/adapter/__tests__/acp-over-map-history.test.ts +724 -2
  220. package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
  221. package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
  222. package/src/map/adapter/__tests__/event-log.test.ts +527 -0
  223. package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
  224. package/src/map/adapter/__tests__/extensions.test.ts +408 -0
  225. package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
  226. package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
  227. package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
  228. package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
  229. package/src/map/adapter/acp-over-map.ts +777 -92
  230. package/src/map/adapter/connection-manager.ts +3 -0
  231. package/src/map/adapter/event-log.ts +208 -0
  232. package/src/map/adapter/event-translator.ts +6 -6
  233. package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
  234. package/src/map/adapter/extensions/index.ts +60 -0
  235. package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
  236. package/src/map/adapter/extensions/task.ts +11 -0
  237. package/src/map/adapter/extensions/update-metadata.ts +126 -0
  238. package/src/map/adapter/index.ts +28 -0
  239. package/src/map/adapter/interface.ts +2 -0
  240. package/src/map/adapter/map-adapter.ts +373 -38
  241. package/src/map/adapter/subscription-manager.ts +5 -1
  242. package/src/map/adapter/types.ts +2 -0
  243. package/src/mcp/__tests__/map-client.test.ts +386 -0
  244. package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
  245. package/src/mcp/__tests__/mcp-server.test.ts +100 -1
  246. package/src/mcp/map-client.ts +177 -0
  247. package/src/mcp/mcp-server.ts +191 -100
  248. package/src/mcp/types.ts +6 -1
  249. package/src/metrics/metrics.ts +1 -1
  250. package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
  251. package/src/roles/__tests__/config-loader.test.ts +7 -7
  252. package/src/roles/capabilities.ts +17 -7
  253. package/src/roles/config-loader.ts +6 -6
  254. package/src/roles/registry.ts +2 -2
  255. package/src/server/__tests__/combined-server.test.ts +94 -21
  256. package/src/server/combined-server.ts +189 -33
  257. package/src/steering/__tests__/steering-integration.test.ts +1 -1
  258. package/src/store/__tests__/event-store.test.ts +236 -1
  259. package/src/store/__tests__/instance.test.ts +3 -3
  260. package/src/store/event-store.ts +109 -8
  261. package/src/store/types/agents.ts +16 -0
  262. package/src/store/types/events.ts +1 -1
  263. package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
  264. package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
  265. package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
  266. package/src/task/backend/index.ts +156 -106
  267. package/src/task/backend/memory.ts +4 -0
  268. package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
  269. package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
  270. package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
  271. package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
  272. package/src/task/backend/opentasks/backend.ts +1323 -0
  273. package/src/task/backend/opentasks/client.ts +652 -0
  274. package/src/task/backend/opentasks/daemon-manager.ts +253 -0
  275. package/src/task/backend/opentasks/index.ts +69 -0
  276. package/src/task/backend/opentasks/mapping.ts +94 -0
  277. package/src/task/backend/types.ts +42 -66
  278. package/src/task/backend/unified-tool-provider.ts +779 -0
  279. package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
  280. package/src/teams/team-loader.ts +3 -3
  281. package/src/teams/team-runtime.ts +2 -0
  282. package/test_fixtures/README.md +2 -3
  283. package/test_fixtures/fixtures/index.ts +0 -3
  284. package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
  285. package/test_fixtures/fixtures/repos/index.ts +1 -3
  286. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
  287. package/test_fixtures/fixtures/repos/types.ts +0 -11
  288. package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
  289. package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
  290. package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
  291. package/vitest.config.ts +1 -1
  292. package/vitest.e2e.config.ts +1 -1
  293. package/vitest.setup.ts +1 -30
  294. package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
  295. package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
  296. package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
  297. package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
  298. package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
  299. package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
  300. package/.macro-agent/teams/self-driving/team.yaml +0 -103
  301. package/.macro-agent/teams/structured/prompts/developer.md +0 -26
  302. package/.macro-agent/teams/structured/prompts/lead.md +0 -25
  303. package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
  304. package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
  305. package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
  306. package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
  307. package/.macro-agent/teams/structured/team.yaml +0 -89
  308. package/docs/sudocode-integration.md +0 -383
  309. package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
  310. package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
  311. package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
  312. package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
  313. package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
  314. package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
  315. package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
  316. package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
  317. package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
  318. package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
  319. package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
  320. package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
  321. package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
  322. package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
  323. package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
  324. package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
  325. package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
  326. package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
  327. package/src/task/backend/sudocode/backend.ts +0 -1237
  328. package/src/task/backend/sudocode/client.ts +0 -515
  329. package/src/task/backend/sudocode/index.ts +0 -120
  330. package/src/task/backend/sudocode/mapping.ts +0 -93
  331. package/src/task/backend/sudocode/server-client.ts +0 -522
  332. package/src/task/backend/sudocode/standalone-client.ts +0 -623
  333. package/src/task/backend/sudocode/sync-policy.ts +0 -387
  334. package/src/task/backend/sudocode/tools.ts +0 -896
  335. package/src/task/backend/tool-provider.ts +0 -506
  336. package/test_fixtures/fixtures/sudocode/index.ts +0 -29
  337. package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
  338. package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
@@ -161,6 +161,28 @@ function createMockAgentManager(): AgentManager {
161
161
  getSession: vi.fn().mockReturnValue(null),
162
162
  onLifecycleEvent: vi.fn().mockReturnValue(() => {}),
163
163
  close: vi.fn().mockResolvedValue(undefined),
164
+ forkAgent: vi.fn().mockImplementation((sourceId) => {
165
+ const agentId = `agent-${++agentCounter}`;
166
+ const sessionId = `session-${++sessionCounter}`;
167
+ const agent: Agent = {
168
+ id: agentId,
169
+ session_id: sessionId,
170
+ state: "running",
171
+ task: `[Fork of ${sourceId}]`,
172
+ task_id: `task-${++taskCounter}`,
173
+ parent: null,
174
+ lineage: [],
175
+ created_at: Date.now(),
176
+ started_at: Date.now(),
177
+ };
178
+ agentStore.set(agent.id, agent);
179
+ return Promise.resolve({
180
+ id: agent.id,
181
+ session_id: agent.session_id,
182
+ agent,
183
+ session: { id: `provider-${sessionId}` },
184
+ });
185
+ }),
164
186
  } as unknown as AgentManager;
165
187
  }
166
188
 
@@ -238,7 +260,7 @@ describe("ACP Mode Integration", () => {
238
260
  expect(initResponse.agentCapabilities).toBeDefined();
239
261
  expect(initResponse.agentCapabilities?.loadSession).toBe(true);
240
262
  expect(initResponse.agentCapabilities?._meta?.extensions).toContain(
241
- "_macro/spawnAgent"
263
+ "_macro/spawnAgent",
242
264
  );
243
265
 
244
266
  // Step 2: Create new session
@@ -286,8 +308,8 @@ describe("ACP Mode Integration", () => {
286
308
  cwd: "/test/project",
287
309
  });
288
310
 
289
- // loadSession returns empty object on success
290
- expect(loadResponse).toEqual({});
311
+ // loadSession returns model state (null when no models available)
312
+ expect(loadResponse).toEqual({ models: null });
291
313
  });
292
314
 
293
315
  it("should load session by agentId via _meta", async () => {
@@ -314,7 +336,7 @@ describe("ACP Mode Integration", () => {
314
336
  _meta: { agentId: originalAgentId },
315
337
  } as any);
316
338
 
317
- expect(loadResponse).toEqual({});
339
+ expect(loadResponse).toEqual({ models: null });
318
340
  });
319
341
 
320
342
  it("should throw when _meta.agentId references non-existent agent", async () => {
@@ -323,7 +345,7 @@ describe("ACP Mode Integration", () => {
323
345
  sessionId: "_resume_",
324
346
  cwd: "/test/project",
325
347
  _meta: { agentId: "non-existent-agent" },
326
- } as any)
348
+ } as any),
327
349
  ).rejects.toThrow("Agent not found: non-existent-agent");
328
350
  });
329
351
 
@@ -345,7 +367,7 @@ describe("ACP Mode Integration", () => {
345
367
  await expect(
346
368
  macroAgent.cancel({
347
369
  sessionId: sessionResponse.sessionId,
348
- })
370
+ }),
349
371
  ).resolves.toBeUndefined();
350
372
  });
351
373
 
@@ -373,10 +395,11 @@ describe("ACP Mode Integration", () => {
373
395
  expect(extensions).toContain("_macro/cancelPermission");
374
396
  expect(extensions).toContain("_macro/resume");
375
397
  expect(extensions).toContain("_macro/getHistory");
376
- expect(extensions?.length).toBe(17);
398
+ expect(extensions).toContain("_macro/forkAgent");
399
+ expect(extensions?.length).toBe(19);
377
400
 
378
401
  expect(initResponse.agentCapabilities?._meta?.agentType).toBe(
379
- "macro-agent"
402
+ "macro-agent",
380
403
  );
381
404
  });
382
405
  });
@@ -474,7 +497,7 @@ describe("ACP Mode Integration", () => {
474
497
  expect.objectContaining({
475
498
  task: "Integration test task",
476
499
  cwd: "/test/spawn",
477
- })
500
+ }),
478
501
  );
479
502
  });
480
503
 
@@ -497,7 +520,7 @@ describe("ACP Mode Integration", () => {
497
520
  expect.objectContaining({
498
521
  task: "Child agent task",
499
522
  parent: parentId,
500
- })
523
+ }),
501
524
  );
502
525
  });
503
526
  });
@@ -545,7 +568,7 @@ describe("ACP Mode Integration", () => {
545
568
  await expect(
546
569
  macroAgent.extMethod("macro/getHierarchy", {
547
570
  rootAgentId: "non-existent-agent",
548
- })
571
+ }),
549
572
  ).rejects.toThrow(ACPError);
550
573
  });
551
574
  });
@@ -576,7 +599,7 @@ describe("ACP Mode Integration", () => {
576
599
  await expect(
577
600
  macroAgent.extMethod("macro/getTask", {
578
601
  taskId: "non-existent-task",
579
- })
602
+ }),
580
603
  ).rejects.toThrow(ACPError);
581
604
  });
582
605
  });
@@ -640,7 +663,7 @@ describe("ACP Mode Integration", () => {
640
663
  macroAgent.extMethod("macro/mountAgent", {
641
664
  sessionId: "non-existent-session",
642
665
  agentId: "some-agent",
643
- })
666
+ }),
644
667
  ).rejects.toThrow(ACPError);
645
668
  });
646
669
 
@@ -653,7 +676,7 @@ describe("ACP Mode Integration", () => {
653
676
  macroAgent.extMethod("macro/mountAgent", {
654
677
  sessionId: sessionResponse.sessionId,
655
678
  agentId: "non-existent-agent",
656
- })
679
+ }),
657
680
  ).rejects.toThrow(ACPError);
658
681
  });
659
682
  });
@@ -666,7 +689,7 @@ describe("ACP Mode Integration", () => {
666
689
  });
667
690
 
668
691
  const originalAgentId = macroAgent.getMappedAgentId(
669
- sessionResponse.sessionId
692
+ sessionResponse.sessionId,
670
693
  );
671
694
 
672
695
  // Fork the agent
@@ -678,18 +701,20 @@ describe("ACP Mode Integration", () => {
678
701
  expect(forkResponse.newAgentId).toBeDefined();
679
702
  expect(forkResponse.newSessionId).toBeDefined();
680
703
  expect(forkResponse.originalAgentId).toBe(originalAgentId);
704
+ expect(forkResponse.providerSessionId).toBeDefined();
681
705
 
682
- // Verify forked agent exists
683
- const forkedAgent = agentStore.get(forkResponse.newAgentId as string);
684
- expect(forkedAgent).not.toBeNull();
685
- expect(forkedAgent?.task).toContain("Forked for testing");
706
+ // Verify forkAgent was called with correct args
707
+ expect(mockAgentManager.forkAgent).toHaveBeenCalledWith(
708
+ originalAgentId,
709
+ expect.objectContaining({ name: "Forked for testing" }),
710
+ );
686
711
  });
687
712
 
688
713
  it("should throw for non-existent agent", async () => {
689
714
  await expect(
690
715
  macroAgent.extMethod("macro/forkAgent", {
691
716
  agentId: "non-existent-agent",
692
- })
717
+ }),
693
718
  ).rejects.toThrow(ACPError);
694
719
  });
695
720
  });
@@ -697,7 +722,7 @@ describe("ACP Mode Integration", () => {
697
722
  describe("Extension Error Handling", () => {
698
723
  it("should throw for unknown extension method", async () => {
699
724
  await expect(macroAgent.extMethod("unknown/method", {})).rejects.toThrow(
700
- ACPError
725
+ ACPError,
701
726
  );
702
727
 
703
728
  try {
@@ -736,7 +761,7 @@ describe("ACP Mode Integration", () => {
736
761
 
737
762
  // Verify session2 is now controlling the child agent
738
763
  expect(macroAgent.getMappedAgentId(session2.sessionId)).toBe(
739
- childSpawn.agentId
764
+ childSpawn.agentId,
740
765
  );
741
766
 
742
767
  // 5. Fork the child from session2's perspective
@@ -763,7 +788,7 @@ describe("ACP Mode Integration", () => {
763
788
 
764
789
  // Get session2's original agent
765
790
  const session2AgentBefore = macroAgent.getMappedAgentId(
766
- session2.sessionId
791
+ session2.sessionId,
767
792
  );
768
793
 
769
794
  // Mount session1 to new agent
@@ -774,10 +799,10 @@ describe("ACP Mode Integration", () => {
774
799
 
775
800
  // Session2 should still point to its original head manager
776
801
  expect(macroAgent.getMappedAgentId(session1.sessionId)).toBe(
777
- spawn1.agentId
802
+ spawn1.agentId,
778
803
  );
779
804
  expect(macroAgent.getMappedAgentId(session2.sessionId)).toBe(
780
- session2AgentBefore
805
+ session2AgentBefore,
781
806
  );
782
807
  });
783
808
  });
@@ -883,7 +908,7 @@ describe("ACP Protocol Compliance", () => {
883
908
  headManagers.length = 0;
884
909
  const hierarchyResponse = await macroAgent.extMethod(
885
910
  "macro/getHierarchy",
886
- {}
911
+ {},
887
912
  );
888
913
  expect(hierarchyResponse).toBeDefined();
889
914
  expect(hierarchyResponse.totalAgents).toBe(0);
@@ -967,7 +992,7 @@ describe("ACP Protocol Compliance", () => {
967
992
  await expect(
968
993
  macroAgent.extMethod("_macro/resume", {
969
994
  agentId: childAgentId,
970
- })
995
+ }),
971
996
  ).rejects.toThrow("only stopped or failed");
972
997
  });
973
998
 
@@ -975,14 +1000,14 @@ describe("ACP Protocol Compliance", () => {
975
1000
  await expect(
976
1001
  macroAgent.extMethod("_macro/resume", {
977
1002
  agentId: "non-existent-agent",
978
- })
1003
+ }),
979
1004
  ).rejects.toThrow("Agent not found");
980
1005
  });
981
1006
 
982
1007
  it("should reject resume without agentId", async () => {
983
- await expect(
984
- macroAgent.extMethod("_macro/resume", {})
985
- ).rejects.toThrow("agentId is required");
1008
+ await expect(macroAgent.extMethod("_macro/resume", {})).rejects.toThrow(
1009
+ "agentId is required",
1010
+ );
986
1011
  });
987
1012
 
988
1013
  it("full lifecycle: spawn → stop → resume", async () => {
@@ -98,6 +98,12 @@ function createMockAgentManager(): AgentManager {
98
98
  close: vi.fn().mockResolvedValue(undefined),
99
99
  respondToPermission: vi.fn().mockReturnValue(true),
100
100
  cancelPermission: vi.fn().mockReturnValue(true),
101
+ forkAgent: vi.fn().mockResolvedValue({
102
+ id: "agent-forked",
103
+ session_id: "session-forked",
104
+ agent: createMockAgent({ id: "agent-forked", session_id: "session-forked" }),
105
+ session: { id: "provider-session-forked" },
106
+ }),
101
107
  } as unknown as AgentManager;
102
108
  }
103
109
 
@@ -612,21 +618,23 @@ describe("MacroAgent", () => {
612
618
  agentId: "agent-1",
613
619
  });
614
620
 
615
- expect(response).toHaveProperty("newAgentId");
616
- expect(response).toHaveProperty("newSessionId");
621
+ expect(response).toHaveProperty("newAgentId", "agent-forked");
622
+ expect(response).toHaveProperty("newSessionId", "session-forked");
617
623
  expect(response).toHaveProperty("originalAgentId", "agent-1");
618
- expect(mockAgentManager.spawn).toHaveBeenCalled();
624
+ expect(response).toHaveProperty("providerSessionId", "provider-session-forked");
625
+ expect(mockAgentManager.forkAgent).toHaveBeenCalledWith("agent-1", expect.any(Object));
619
626
  });
620
627
 
621
- it("should use custom name in task description", async () => {
628
+ it("should pass custom name to forkAgent", async () => {
622
629
  await macroAgent.extMethod("macro/forkAgent", {
623
630
  agentId: "agent-1",
624
631
  name: "Custom fork name",
625
632
  });
626
633
 
627
- expect(mockAgentManager.spawn).toHaveBeenCalledWith(
634
+ expect(mockAgentManager.forkAgent).toHaveBeenCalledWith(
635
+ "agent-1",
628
636
  expect.objectContaining({
629
- task: expect.stringContaining("Custom fork name"),
637
+ name: "Custom fork name",
630
638
  })
631
639
  );
632
640
  });
@@ -641,8 +649,9 @@ describe("MacroAgent", () => {
641
649
  ).rejects.toThrow(ACPError);
642
650
  });
643
651
 
644
- it("should throw if agent has no active session", async () => {
652
+ it("should throw if agent has no active session and no provider_session_id", async () => {
645
653
  vi.mocked(mockAgentManager.hasActiveSession).mockReturnValue(false);
654
+ // Default mock agent has no provider_session_id
646
655
 
647
656
  await expect(
648
657
  macroAgent.extMethod("macro/forkAgent", {