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
@@ -97,7 +97,7 @@ describe("AgentManager", () => {
97
97
 
98
98
  // Terminate one
99
99
  eventStore.emit({
100
- type: "terminate",
100
+ type: "stop",
101
101
  source: { agent_id: "agent_2" },
102
102
  payload: { reason: "completed" },
103
103
  });
@@ -562,6 +562,82 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
562
562
  expect(cwdEnv.value).toBe("/test/cwd");
563
563
  });
564
564
 
565
+ it("should propagate OPENTASKS_SOCKET_PATH from config to child agents", async () => {
566
+ // Create manager with explicit socket path
567
+ await agentManager.close();
568
+ agentManager = createAgentManager(eventStore, messageRouter, {
569
+ openTasksSocketPath: "/tmp/opentasks.sock",
570
+ taskBackend: "opentasks",
571
+ });
572
+
573
+ await agentManager.spawn({
574
+ task: "Test task",
575
+ cwd: "/tmp",
576
+ });
577
+
578
+ const createSessionArgs = mockHandle.createSession.mock.calls[0];
579
+ const sessionOptions = createSessionArgs[1];
580
+ const macroAgentMcp = sessionOptions.mcpServers.find(
581
+ (s: any) => s.name === "macro-agent"
582
+ );
583
+
584
+ const socketPathEnv = macroAgentMcp.env.find(
585
+ (e: any) => e.name === "OPENTASKS_SOCKET_PATH"
586
+ );
587
+ expect(socketPathEnv).toBeDefined();
588
+ expect(socketPathEnv.value).toBe("/tmp/opentasks.sock");
589
+ });
590
+
591
+ it("should use setOpenTasksSocketPath to override config value", async () => {
592
+ // Create manager WITHOUT a socket path (simulates autoStart mode)
593
+ await agentManager.close();
594
+ agentManager = createAgentManager(eventStore, messageRouter, {
595
+ taskBackend: "opentasks",
596
+ // No openTasksSocketPath — simulating daemon auto-start
597
+ });
598
+
599
+ // Late-bind the runtime socket path (as createTaskBackend would provide)
600
+ agentManager.setOpenTasksSocketPath("/run/daemon/opentasks.sock");
601
+
602
+ await agentManager.spawn({
603
+ task: "Test task",
604
+ cwd: "/tmp",
605
+ });
606
+
607
+ const createSessionArgs = mockHandle.createSession.mock.calls[0];
608
+ const sessionOptions = createSessionArgs[1];
609
+ const macroAgentMcp = sessionOptions.mcpServers.find(
610
+ (s: any) => s.name === "macro-agent"
611
+ );
612
+
613
+ const socketPathEnv = macroAgentMcp.env.find(
614
+ (e: any) => e.name === "OPENTASKS_SOCKET_PATH"
615
+ );
616
+ expect(socketPathEnv).toBeDefined();
617
+ expect(socketPathEnv.value).toBe("/run/daemon/opentasks.sock");
618
+ });
619
+
620
+ it("should propagate empty OPENTASKS_SOCKET_PATH when not set", async () => {
621
+ // Manager with no socket path and no env var
622
+ await agentManager.spawn({
623
+ task: "Test task",
624
+ cwd: "/tmp",
625
+ });
626
+
627
+ const createSessionArgs = mockHandle.createSession.mock.calls[0];
628
+ const sessionOptions = createSessionArgs[1];
629
+ const macroAgentMcp = sessionOptions.mcpServers.find(
630
+ (s: any) => s.name === "macro-agent"
631
+ );
632
+
633
+ const socketPathEnv = macroAgentMcp.env.find(
634
+ (e: any) => e.name === "OPENTASKS_SOCKET_PATH"
635
+ );
636
+ expect(socketPathEnv).toBeDefined();
637
+ // Should be empty string when nothing is configured
638
+ expect(socketPathEnv.value).toBe("");
639
+ });
640
+
565
641
  it("should persist events after spawning for cross-process visibility", async () => {
566
642
  // Spy on eventStore.persist
567
643
  const persistSpy = vi.spyOn(eventStore, "persist");
@@ -700,6 +776,10 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
700
776
  expect(mockHandle.loadSession).toHaveBeenCalledWith(
701
777
  expect.any(String), // session ID
702
778
  "/custom/project/path",
779
+ expect.arrayContaining([
780
+ expect.objectContaining({ name: "macro-agent" }),
781
+ ]),
782
+ undefined,
703
783
  );
704
784
  });
705
785
 
@@ -717,6 +797,10 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
717
797
  expect(mockHandle.loadSession).toHaveBeenCalledWith(
718
798
  agent!.provider_session_id,
719
799
  expect.any(String),
800
+ expect.arrayContaining([
801
+ expect.objectContaining({ name: "macro-agent" }),
802
+ ]),
803
+ undefined,
720
804
  );
721
805
  });
722
806
 
@@ -745,7 +829,11 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
745
829
  await agentManager.resume(agentId);
746
830
 
747
831
  // Should create a new session instead of loading with invalid macro-agent session_id
748
- expect(mockHandle.createSession).toHaveBeenCalledWith("/tmp");
832
+ expect(mockHandle.createSession).toHaveBeenCalledWith("/tmp", {
833
+ mcpServers: expect.arrayContaining([
834
+ expect.objectContaining({ name: "macro-agent" }),
835
+ ]),
836
+ });
749
837
  expect(mockHandle.loadSession).not.toHaveBeenCalled();
750
838
  });
751
839
  });
@@ -995,6 +1083,144 @@ describe("AgentManager Integration (with mocked acp-factory)", () => {
995
1083
  expect(result).toBe(false);
996
1084
  });
997
1085
  });
1086
+
1087
+ describe("Process cleanup on spawn failure", () => {
1088
+ it("should close handle when createSession throws", async () => {
1089
+ mockHandle.createSession = vi.fn().mockRejectedValue(
1090
+ new Error("Session creation failed")
1091
+ );
1092
+
1093
+ await expect(
1094
+ agentManager.spawn({ task: "Test", cwd: "/tmp" })
1095
+ ).rejects.toThrow("Failed to spawn agent");
1096
+
1097
+ // The handle should have been closed to prevent orphaned process
1098
+ expect(mockHandle.close).toHaveBeenCalled();
1099
+ });
1100
+
1101
+ it("should not leave handle in activeSessions when createSession throws", async () => {
1102
+ mockHandle.createSession = vi.fn().mockRejectedValue(
1103
+ new Error("Session creation failed")
1104
+ );
1105
+
1106
+ await expect(
1107
+ agentManager.spawn({ task: "Test", cwd: "/tmp" })
1108
+ ).rejects.toThrow();
1109
+
1110
+ // No active sessions should remain
1111
+ const agents = agentManager.list({ state: "running" as any });
1112
+ for (const agent of agents) {
1113
+ expect(agentManager.hasActiveSession(agent.id)).toBe(false);
1114
+ }
1115
+ });
1116
+
1117
+ it("should close handle even if handle.close() itself throws", async () => {
1118
+ mockHandle.createSession = vi.fn().mockRejectedValue(
1119
+ new Error("Session creation failed")
1120
+ );
1121
+ mockHandle.close = vi.fn().mockRejectedValue(
1122
+ new Error("Close also failed")
1123
+ );
1124
+
1125
+ // Should still throw the original spawn error, not the close error
1126
+ await expect(
1127
+ agentManager.spawn({ task: "Test", cwd: "/tmp" })
1128
+ ).rejects.toThrow("Failed to spawn agent");
1129
+
1130
+ // close() was attempted
1131
+ expect(mockHandle.close).toHaveBeenCalled();
1132
+ });
1133
+ });
1134
+
1135
+ describe("Process cleanup on resume failure", () => {
1136
+ it("should close handle when loadSession throws", async () => {
1137
+ // Spawn and terminate to create a resumable agent
1138
+ const spawned = await agentManager.spawn({ task: "Test" });
1139
+ await agentManager.terminate(spawned.id, "completed");
1140
+
1141
+ // Make loadSession fail on resume
1142
+ mockHandle.loadSession = vi.fn().mockRejectedValue(
1143
+ new Error("Load session failed")
1144
+ );
1145
+
1146
+ await expect(
1147
+ agentManager.resume(spawned.id)
1148
+ ).rejects.toThrow("Load session failed");
1149
+
1150
+ // The handle should have been closed to prevent orphaned process
1151
+ expect(mockHandle.close).toHaveBeenCalledTimes(2); // once for terminate, once for failed resume
1152
+ });
1153
+
1154
+ it("should close handle when createSession throws during resume (no provider_session_id)", async () => {
1155
+ // Create agent directly without provider_session_id
1156
+ const agentId = "agent_no_provider_resume";
1157
+ eventStore.emit({
1158
+ type: "spawn",
1159
+ source: { agent_id: "system" },
1160
+ payload: {
1161
+ agent_id: agentId,
1162
+ session_id: "session_no_provider_resume",
1163
+ task: "Test",
1164
+ parent: null,
1165
+ cwd: "/tmp",
1166
+ },
1167
+ });
1168
+ eventStore.emit({
1169
+ type: "status",
1170
+ source: { agent_id: agentId },
1171
+ payload: { status_type: "started" },
1172
+ });
1173
+
1174
+ // Make createSession fail on resume
1175
+ mockHandle.createSession = vi.fn().mockRejectedValue(
1176
+ new Error("Create session failed")
1177
+ );
1178
+
1179
+ await expect(
1180
+ agentManager.resume(agentId)
1181
+ ).rejects.toThrow("Create session failed");
1182
+
1183
+ // The handle should have been closed
1184
+ expect(mockHandle.close).toHaveBeenCalled();
1185
+ });
1186
+ });
1187
+
1188
+ describe("Shutdown guard", () => {
1189
+ it("should reject spawn() after close() is called", async () => {
1190
+ await agentManager.close();
1191
+
1192
+ await expect(
1193
+ agentManager.spawn({ task: "Test", cwd: "/tmp" })
1194
+ ).rejects.toThrow("Cannot spawn agent during shutdown");
1195
+ });
1196
+
1197
+ it("should reject resume() after close() is called", async () => {
1198
+ // Create a resumable agent before shutdown
1199
+ const spawned = await agentManager.spawn({ task: "Test" });
1200
+ await agentManager.terminate(spawned.id, "completed");
1201
+
1202
+ await agentManager.close();
1203
+
1204
+ await expect(
1205
+ agentManager.resume(spawned.id)
1206
+ ).rejects.toThrow("Cannot resume agent during shutdown");
1207
+ });
1208
+
1209
+ it("should not spawn new processes after close()", async () => {
1210
+ const { AgentFactory } = await import("acp-factory");
1211
+ const spawnSpy = vi.mocked(AgentFactory.spawn);
1212
+
1213
+ await agentManager.close();
1214
+ spawnSpy.mockClear();
1215
+
1216
+ await expect(
1217
+ agentManager.spawn({ task: "Test", cwd: "/tmp" })
1218
+ ).rejects.toThrow("Cannot spawn agent during shutdown");
1219
+
1220
+ // AgentFactory.spawn should never have been called
1221
+ expect(spawnSpy).not.toHaveBeenCalled();
1222
+ });
1223
+ });
998
1224
  });
999
1225
 
1000
1226
  describe("AgentManager HealthCheckService Integration", () => {