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
@@ -4,7 +4,6 @@
4
4
  * Exports task backend interface types and implementations.
5
5
  *
6
6
  * @module task/backend
7
- * @see s-8472 Pluggable Task Backend Integration with Sudocode
8
7
  */
9
8
 
10
9
  // =============================================================================
@@ -35,19 +34,15 @@ export type {
35
34
 
36
35
  // Tool provider
37
36
  MCPToolDefinition,
38
- TaskToolMode,
39
37
  TaskToolProvider,
40
38
 
41
39
  // Configuration
42
40
  InMemoryBackendConfig,
43
- ExecutionTrackingConfig,
44
- ExecutionFilter,
45
- SudocodeBackendConfig,
41
+ OpenTasksBackendConfig,
46
42
  TaskBackendConfig,
47
43
  TaskConfig,
48
44
  } from "./types.js";
49
45
 
50
-
51
46
  // Re-export base types for convenience
52
47
  export type {
53
48
  Task,
@@ -67,55 +62,67 @@ export {
67
62
  } from "./memory.js";
68
63
 
69
64
  export {
70
- InMemoryTaskToolProvider,
71
- createTaskToolProvider,
72
- } from "./tool-provider.js";
65
+ UnifiedTaskToolProvider,
66
+ createUnifiedToolProvider,
67
+ } from "./unified-tool-provider.js";
73
68
 
74
- export type { TaskToolContext, GetToolContext } from "./tool-provider.js";
69
+ export type { ToolContext, GetToolContext } from "./unified-tool-provider.js";
75
70
 
76
71
  // =============================================================================
77
- // Sudocode Backend (re-export)
72
+ // OpenTasks Backend (re-export)
78
73
  // =============================================================================
79
74
 
80
75
  export {
81
- SudocodeTaskBackend,
82
- SudocodeTaskBackendError,
83
- createSudocodeTaskBackend,
84
- createSudocodeClient,
85
- SudocodeTaskToolProvider,
86
- createSudocodeTaskToolProvider,
87
- } from "./sudocode/index.js";
76
+ OpenTasksTaskBackend,
77
+ OpenTasksBackendError,
78
+ createOpenTasksTaskBackend,
79
+ IPCOpenTasksClient,
80
+ OpenTasksClientError,
81
+ createOpenTasksClient,
82
+ } from "./opentasks/index.js";
88
83
 
89
84
  export type {
90
- SudocodeClient,
91
- SudocodeClientConfig,
92
- SudocodeClientMode,
93
- SudocodeToolContext,
94
- GetSudocodeToolContext,
95
- } from "./sudocode/index.js";
85
+ OpenTasksClient,
86
+ OpenTasksClientConfig,
87
+ OpenTasksIssue,
88
+ OpenTasksEdge,
89
+ OpenTasksNodeSummary,
90
+ } from "./opentasks/index.js";
96
91
 
97
92
  // =============================================================================
98
93
  // Backend Factory
99
94
  // =============================================================================
100
95
 
101
96
  import type { EventStore } from "../../store/event-store.js";
102
- import type { TaskBackend, TaskConfig, TaskBackendConfig, TaskToolMode, TaskToolProvider } from "./types.js";
103
- import { DEFAULT_TASK_CONFIG, DEFAULT_SUDOCODE_CONFIG } from "./types.js";
97
+ import type { TaskBackend, TaskConfig, TaskBackendConfig } from "./types.js";
98
+ import type { OpenTasksClient } from "./opentasks/client.js";
99
+ import { DEFAULT_TASK_CONFIG, DEFAULT_OPENTASKS_CONFIG } from "./types.js";
104
100
  import { InMemoryTaskBackend } from "./memory.js";
105
- import { InMemoryTaskToolProvider } from "./tool-provider.js";
101
+ import { OpenTasksTaskBackend } from "./opentasks/backend.js";
102
+ import { createOpenTasksClient } from "./opentasks/client.js";
103
+ import { DaemonManager } from "./opentasks/daemon-manager.js";
106
104
 
107
105
  /**
108
- * Result of creating a task backend with its tool provider
106
+ * Result of creating a task backend
109
107
  */
110
108
  export interface TaskBackendResult {
111
109
  /** The task backend instance */
112
110
  backend: TaskBackend;
113
111
 
114
- /** The tool provider for this backend (if any) */
115
- toolProvider?: TaskToolProvider;
112
+ /** OpenTasks client (if opentasks backend is used) */
113
+ openTasksClient?: OpenTasksClient;
114
+
115
+ /** Runtime socket path of the daemon (for propagating to child agents) */
116
+ socketPath?: string;
117
+
118
+ /** Shutdown function — stops daemon if we started it, disconnects client */
119
+ shutdown?: () => Promise<void>;
116
120
 
117
- /** The effective tool mode */
118
- toolMode: TaskToolMode;
121
+ /** Connect a project's .opentasks/ directory to the central daemon (Phase 2) */
122
+ connectProject?: (projectPath: string) => Promise<void>;
123
+
124
+ /** Get list of connected project .opentasks/ paths */
125
+ getConnectedProjects?: () => string[];
119
126
  }
120
127
 
121
128
  /**
@@ -123,25 +130,19 @@ export interface TaskBackendResult {
123
130
  *
124
131
  * @param config - Task configuration
125
132
  * @param eventStore - Event store for state management
126
- * @returns Backend result with backend instance and tool provider
133
+ * @returns Backend result with backend instance and optional OpenTasks client
127
134
  *
128
135
  * @example
129
136
  * ```typescript
130
137
  * // Create in-memory backend (default)
131
- * const { backend, toolProvider } = await createTaskBackend(
138
+ * const { backend } = await createTaskBackend(
132
139
  * { backend: { type: 'memory' } },
133
140
  * eventStore
134
141
  * );
135
142
  *
136
- * // Create sudocode backend
137
- * const { backend, toolProvider } = await createTaskBackend(
138
- * {
139
- * backend: {
140
- * type: 'sudocode',
141
- * projectPath: '/path/to/project',
142
- * },
143
- * toolMode: 'native',
144
- * },
143
+ * // Create opentasks backend
144
+ * const { backend, openTasksClient } = await createTaskBackend(
145
+ * { backend: { type: 'opentasks' } },
145
146
  * eventStore
146
147
  * );
147
148
  * ```
@@ -150,111 +151,160 @@ export async function createTaskBackend(
150
151
  config: TaskConfig,
151
152
  eventStore: EventStore
152
153
  ): Promise<TaskBackendResult> {
153
- const { backend: backendConfig, toolMode = "auto" } = config;
154
+ const { backend: backendConfig } = config;
154
155
 
155
156
  if (backendConfig.type === "memory") {
156
157
  const backend = new InMemoryTaskBackend(eventStore);
157
- const effectiveMode = toolMode === "auto" ? "abstract" : toolMode;
158
-
159
- // For in-memory backend, we use the abstract tool provider
160
- // Note: Tool provider is created separately in MCP server with context
161
- return {
162
- backend,
163
- toolMode: effectiveMode,
164
- };
158
+ return { backend };
165
159
  }
166
160
 
167
- if (backendConfig.type === "sudocode") {
168
- // Dynamic import to avoid loading sudocode dependencies if not needed
169
- const { createSudocodeClient } = await import("./sudocode/client.js");
170
- const { SudocodeTaskBackend } = await import("./sudocode/backend.js");
171
- const { SudocodeTaskToolProvider } = await import("./sudocode/tools.js");
172
-
161
+ if (backendConfig.type === "opentasks") {
173
162
  // Merge with defaults
174
- const sudocodeConfig = {
175
- ...DEFAULT_SUDOCODE_CONFIG,
163
+ const openTasksConfig = {
164
+ ...DEFAULT_OPENTASKS_CONFIG,
176
165
  ...backendConfig,
177
166
  };
178
167
 
179
- // Create sudocode client
180
- const client = await createSudocodeClient({
181
- mode: "auto",
182
- projectPath: sudocodeConfig.projectPath,
183
- });
168
+ // Determine how to get the OpenTasks client:
169
+ // 1. If socketPath is explicitly provided, connect directly (legacy / child agent mode)
170
+ // 2. If autoStart is enabled (default), use DaemonManager to auto-start central daemon
171
+ // 3. Otherwise, try to connect without auto-start
172
+
173
+ let openTasksClient: OpenTasksClient;
174
+ let resolvedSocketPath: string | undefined;
175
+ let shutdownFn: (() => Promise<void>) | undefined;
176
+ let daemonManager: DaemonManager | undefined;
177
+
178
+ if (openTasksConfig.socketPath) {
179
+ // Direct connection to a known socket (e.g., child agent with inherited socket path)
180
+ openTasksClient = await createOpenTasksClient({
181
+ socketPath: openTasksConfig.socketPath,
182
+ });
183
+ resolvedSocketPath = openTasksConfig.socketPath;
184
+ shutdownFn = async () => {
185
+ openTasksClient.disconnect();
186
+ };
187
+ } else if (openTasksConfig.autoStart !== false) {
188
+ // Auto-start daemon via DaemonManager (default behavior)
189
+ daemonManager = new DaemonManager({
190
+ centralPath: openTasksConfig.centralPath,
191
+ connectOnSpawn: openTasksConfig.connectOnSpawn,
192
+ });
193
+
194
+ const result = await daemonManager.ensureDaemon();
195
+ openTasksClient = result.client;
196
+ resolvedSocketPath = result.socketPath;
197
+ shutdownFn = () => daemonManager!.shutdown();
198
+ } else {
199
+ // Auto-start disabled, no socket path — try default socket discovery
200
+ openTasksClient = await createOpenTasksClient();
201
+ shutdownFn = async () => {
202
+ openTasksClient.disconnect();
203
+ };
204
+ }
184
205
 
185
206
  // Create backend
186
- const backend = new SudocodeTaskBackend(eventStore, client, sudocodeConfig);
187
-
188
- // Determine effective tool mode
189
- // Sudocode uses 'mapped' internally but we expose it as 'abstract' in TaskToolMode
190
- const backendToolMode = sudocodeConfig.toolMode ?? "mapped";
207
+ const backend = new OpenTasksTaskBackend(eventStore, openTasksClient, {
208
+ socketPath: openTasksConfig.socketPath,
209
+ syncStatus: openTasksConfig.syncStatus,
210
+ sourceLabel: openTasksConfig.sourceLabel,
211
+ });
191
212
 
192
- // Map sudocode tool modes to TaskToolMode
193
- const mapSudocodeMode = (mode: "native" | "mapped" | "both"): TaskToolMode => {
194
- if (mode === "mapped") return "abstract";
195
- return mode; // 'native' and 'both' are same in both systems
213
+ // Wrap shutdown to close the backend before disconnecting the client/daemon
214
+ const finalShutdown = async () => {
215
+ if (backend.close) {
216
+ try { await backend.close(); } catch { /* ignore */ }
217
+ }
218
+ if (shutdownFn) await shutdownFn();
196
219
  };
197
220
 
198
- // Determine the effective TaskToolMode
199
- let effectiveMode: TaskToolMode;
200
- if (toolMode === "auto") {
201
- effectiveMode = mapSudocodeMode(backendToolMode);
202
- } else if (toolMode === "abstract" || toolMode === "native" || toolMode === "both") {
203
- effectiveMode = toolMode;
204
- } else {
205
- // 'auto' falls back to backend default
206
- effectiveMode = mapSudocodeMode(backendToolMode);
207
- }
208
-
209
221
  return {
210
222
  backend,
211
- toolMode: effectiveMode,
223
+ openTasksClient,
224
+ socketPath: resolvedSocketPath,
225
+ shutdown: finalShutdown,
226
+ connectProject: daemonManager
227
+ ? (projectPath: string) => daemonManager.connectProject(projectPath)
228
+ : undefined,
229
+ getConnectedProjects: daemonManager
230
+ ? () => daemonManager.getConnectedProjects()
231
+ : undefined,
212
232
  };
213
233
  }
214
234
 
215
- throw new Error(`Unknown backend type: ${(backendConfig as TaskBackendConfig).type}`);
235
+ throw new Error(
236
+ `Unknown backend type: ${(backendConfig as TaskBackendConfig).type}`
237
+ );
216
238
  }
217
239
 
218
240
  /**
219
241
  * Load task configuration from environment variables
220
242
  *
221
243
  * Environment variables:
222
- * - MACRO_TASK_BACKEND: 'memory' | 'sudocode' (default: 'memory')
223
- * - MACRO_TASK_TOOL_MODE: 'abstract' | 'native' | 'both' | 'auto' (default: 'auto')
224
- * - SUDOCODE_PROJECT_PATH: Path to sudocode project (default: cwd)
225
- * - SUDOCODE_TOOL_MODE: 'native' | 'mapped' | 'both' (default: 'mapped')
244
+ * - MACRO_TASK_BACKEND: 'memory' | 'opentasks' (default: 'opentasks')
245
+ * - OPENTASKS_SOCKET_PATH: Path to OpenTasks daemon socket (auto-discovered if not set)
226
246
  *
227
247
  * @returns Task configuration
228
248
  */
229
249
  export function loadTaskConfigFromEnv(): TaskConfig {
230
- const backendType = process.env.MACRO_TASK_BACKEND ?? "memory";
231
- const toolMode = (process.env.MACRO_TASK_TOOL_MODE ?? "auto") as TaskToolMode;
250
+ const backendType = process.env.MACRO_TASK_BACKEND ?? "opentasks";
251
+
252
+ if (backendType === "opentasks") {
253
+ const socketPath = process.env.OPENTASKS_SOCKET_PATH;
232
254
 
233
- if (backendType === "sudocode") {
234
- const projectPath = process.env.SUDOCODE_PROJECT_PATH ?? process.cwd();
235
- const sudocodeToolMode = process.env.SUDOCODE_TOOL_MODE as
236
- | "native"
237
- | "mapped"
238
- | "both"
239
- | undefined;
255
+ return {
256
+ backend: {
257
+ type: "opentasks",
258
+ socketPath,
259
+ },
260
+ };
261
+ }
262
+
263
+ return {
264
+ backend: { type: "memory" },
265
+ };
266
+ }
267
+
268
+ /**
269
+ * Load task configuration from a merged MultiagentConfig.
270
+ *
271
+ * Use this instead of loadTaskConfigFromEnv() when you have
272
+ * a merged config from the layered config system.
273
+ *
274
+ * @param config - Merged config with task settings already resolved
275
+ * @returns Task configuration
276
+ */
277
+ export function loadTaskConfigFromMerged(config: {
278
+ task?: {
279
+ backend?: string;
280
+ opentasks?: {
281
+ socket_path?: string;
282
+ auto_start?: boolean;
283
+ central_path?: string;
284
+ connect_on_spawn?: boolean;
285
+ };
286
+ };
287
+ }): TaskConfig {
288
+ const backendType = config.task?.backend ?? "opentasks";
240
289
 
290
+ if (backendType === "opentasks") {
241
291
  return {
242
292
  backend: {
243
- type: "sudocode",
244
- projectPath,
245
- toolMode: sudocodeToolMode ?? "mapped",
293
+ type: "opentasks",
294
+ socketPath: config.task?.opentasks?.socket_path,
295
+ autoStart: config.task?.opentasks?.auto_start,
296
+ centralPath: config.task?.opentasks?.central_path,
297
+ connectOnSpawn: config.task?.opentasks?.connect_on_spawn,
246
298
  },
247
- toolMode,
248
299
  };
249
300
  }
250
301
 
251
302
  return {
252
303
  backend: { type: "memory" },
253
- toolMode,
254
304
  };
255
305
  }
256
306
 
257
307
  /**
258
308
  * Default task configuration (in-memory backend)
259
309
  */
260
- export { DEFAULT_TASK_CONFIG, DEFAULT_SUDOCODE_CONFIG };
310
+ export { DEFAULT_TASK_CONFIG, DEFAULT_OPENTASKS_CONFIG };
@@ -72,6 +72,10 @@ export class InMemoryTaskBackend implements TaskBackend {
72
72
  // Lifecycle
73
73
  // ─────────────────────────────────────────────────────────────────────────────
74
74
 
75
+ async close(): Promise<void> {
76
+ // No-op for in-memory backend
77
+ }
78
+
75
79
  async create(options: CreateTaskOptions): Promise<ExtendedTask> {
76
80
  const taskId = `task_${nanoid(12)}`;
77
81