macro-agent 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/.sudocode/issues.jsonl +28 -0
  3. package/.sudocode/specs.jsonl +8 -0
  4. package/CLAUDE.md +25 -17
  5. package/README.md +11 -29
  6. package/dist/acp/macro-agent.d.ts +15 -0
  7. package/dist/acp/macro-agent.d.ts.map +1 -1
  8. package/dist/acp/macro-agent.js +131 -35
  9. package/dist/acp/macro-agent.js.map +1 -1
  10. package/dist/acp/types.d.ts +32 -1
  11. package/dist/acp/types.d.ts.map +1 -1
  12. package/dist/acp/types.js.map +1 -1
  13. package/dist/agent/agent-manager.d.ts +65 -1
  14. package/dist/agent/agent-manager.d.ts.map +1 -1
  15. package/dist/agent/agent-manager.js +544 -200
  16. package/dist/agent/agent-manager.js.map +1 -1
  17. package/dist/agent/types.d.ts +8 -1
  18. package/dist/agent/types.d.ts.map +1 -1
  19. package/dist/agent/types.js.map +1 -1
  20. package/dist/api/server.d.ts +8 -1
  21. package/dist/api/server.d.ts.map +1 -1
  22. package/dist/api/server.js +136 -8
  23. package/dist/api/server.js.map +1 -1
  24. package/dist/api/types.d.ts +1 -1
  25. package/dist/api/types.d.ts.map +1 -1
  26. package/dist/auth/index.d.ts +2 -0
  27. package/dist/auth/index.d.ts.map +1 -0
  28. package/dist/auth/index.js +2 -0
  29. package/dist/auth/index.js.map +1 -0
  30. package/dist/auth/token.d.ts +41 -0
  31. package/dist/auth/token.d.ts.map +1 -0
  32. package/dist/auth/token.js +73 -0
  33. package/dist/auth/token.js.map +1 -0
  34. package/dist/cli/acp.d.ts +2 -23
  35. package/dist/cli/acp.d.ts.map +1 -1
  36. package/dist/cli/acp.js +197 -61
  37. package/dist/cli/acp.js.map +1 -1
  38. package/dist/cli/index.js +152 -16
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/mcp.d.ts +6 -0
  41. package/dist/cli/mcp.d.ts.map +1 -1
  42. package/dist/cli/mcp.js +279 -173
  43. package/dist/cli/mcp.js.map +1 -1
  44. package/dist/cli/parse-args.d.ts +20 -0
  45. package/dist/cli/parse-args.d.ts.map +1 -0
  46. package/dist/cli/parse-args.js +43 -0
  47. package/dist/cli/parse-args.js.map +1 -0
  48. package/dist/cli/stable-instance-id.d.ts +8 -0
  49. package/dist/cli/stable-instance-id.d.ts.map +1 -0
  50. package/dist/cli/stable-instance-id.js +14 -0
  51. package/dist/cli/stable-instance-id.js.map +1 -0
  52. package/dist/config/project-config.d.ts +85 -7
  53. package/dist/config/project-config.d.ts.map +1 -1
  54. package/dist/config/project-config.js +133 -20
  55. package/dist/config/project-config.js.map +1 -1
  56. package/dist/index.d.ts +1 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +2 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/lifecycle/handlers/index.d.ts +7 -3
  61. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  62. package/dist/lifecycle/handlers/index.js +25 -8
  63. package/dist/lifecycle/handlers/index.js.map +1 -1
  64. package/dist/lifecycle/types.d.ts +2 -0
  65. package/dist/lifecycle/types.d.ts.map +1 -1
  66. package/dist/lifecycle/types.js.map +1 -1
  67. package/dist/map/adapter/acp-over-map.d.ts +17 -0
  68. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  69. package/dist/map/adapter/acp-over-map.js +384 -23
  70. package/dist/map/adapter/acp-over-map.js.map +1 -1
  71. package/dist/map/adapter/connection-manager.d.ts.map +1 -1
  72. package/dist/map/adapter/connection-manager.js +3 -0
  73. package/dist/map/adapter/connection-manager.js.map +1 -1
  74. package/dist/map/adapter/event-log.d.ts +87 -0
  75. package/dist/map/adapter/event-log.d.ts.map +1 -0
  76. package/dist/map/adapter/event-log.js +122 -0
  77. package/dist/map/adapter/event-log.js.map +1 -0
  78. package/dist/map/adapter/event-translator.js +6 -6
  79. package/dist/map/adapter/event-translator.js.map +1 -1
  80. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  81. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  82. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  83. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  84. package/dist/map/adapter/extensions/index.d.ts +13 -1
  85. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  86. package/dist/map/adapter/extensions/index.js +61 -0
  87. package/dist/map/adapter/extensions/index.js.map +1 -1
  88. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  89. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  90. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  91. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  92. package/dist/map/adapter/extensions/rename.d.ts +29 -0
  93. package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
  94. package/dist/map/adapter/extensions/rename.js +49 -0
  95. package/dist/map/adapter/extensions/rename.js.map +1 -0
  96. package/dist/map/adapter/extensions/streams.d.ts +95 -0
  97. package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
  98. package/dist/map/adapter/extensions/streams.js +515 -0
  99. package/dist/map/adapter/extensions/streams.js.map +1 -0
  100. package/dist/map/adapter/extensions/task.d.ts.map +1 -1
  101. package/dist/map/adapter/extensions/task.js +10 -0
  102. package/dist/map/adapter/extensions/task.js.map +1 -1
  103. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  104. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  105. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  106. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  107. package/dist/map/adapter/index.d.ts +2 -1
  108. package/dist/map/adapter/index.d.ts.map +1 -1
  109. package/dist/map/adapter/index.js +10 -2
  110. package/dist/map/adapter/index.js.map +1 -1
  111. package/dist/map/adapter/interface.d.ts +2 -0
  112. package/dist/map/adapter/interface.d.ts.map +1 -1
  113. package/dist/map/adapter/map-adapter.d.ts +3 -0
  114. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  115. package/dist/map/adapter/map-adapter.js +258 -35
  116. package/dist/map/adapter/map-adapter.js.map +1 -1
  117. package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
  118. package/dist/map/adapter/subscription-manager.js +5 -1
  119. package/dist/map/adapter/subscription-manager.js.map +1 -1
  120. package/dist/map/adapter/types.d.ts +3 -1
  121. package/dist/map/adapter/types.d.ts.map +1 -1
  122. package/dist/mcp/map-client.d.ts +39 -0
  123. package/dist/mcp/map-client.d.ts.map +1 -0
  124. package/dist/mcp/map-client.js +129 -0
  125. package/dist/mcp/map-client.js.map +1 -0
  126. package/dist/mcp/mcp-server.d.ts +16 -0
  127. package/dist/mcp/mcp-server.d.ts.map +1 -1
  128. package/dist/mcp/mcp-server.js +125 -88
  129. package/dist/mcp/mcp-server.js.map +1 -1
  130. package/dist/mcp/tools/done.d.ts.map +1 -1
  131. package/dist/mcp/tools/done.js +18 -0
  132. package/dist/mcp/tools/done.js.map +1 -1
  133. package/dist/mcp/types.d.ts +9 -1
  134. package/dist/mcp/types.d.ts.map +1 -1
  135. package/dist/mcp/types.js.map +1 -1
  136. package/dist/metrics/metrics.js +1 -1
  137. package/dist/metrics/metrics.js.map +1 -1
  138. package/dist/roles/builtin/coordinator.d.ts.map +1 -1
  139. package/dist/roles/builtin/coordinator.js +2 -1
  140. package/dist/roles/builtin/coordinator.js.map +1 -1
  141. package/dist/roles/builtin/integrator.d.ts.map +1 -1
  142. package/dist/roles/builtin/integrator.js +2 -1
  143. package/dist/roles/builtin/integrator.js.map +1 -1
  144. package/dist/roles/builtin/worker.d.ts.map +1 -1
  145. package/dist/roles/builtin/worker.js +3 -1
  146. package/dist/roles/builtin/worker.js.map +1 -1
  147. package/dist/roles/capabilities.d.ts +9 -1
  148. package/dist/roles/capabilities.d.ts.map +1 -1
  149. package/dist/roles/capabilities.js +27 -7
  150. package/dist/roles/capabilities.js.map +1 -1
  151. package/dist/roles/config-loader.d.ts +6 -6
  152. package/dist/roles/config-loader.d.ts.map +1 -1
  153. package/dist/roles/config-loader.js +8 -7
  154. package/dist/roles/config-loader.js.map +1 -1
  155. package/dist/roles/registry.d.ts +2 -2
  156. package/dist/roles/registry.js +2 -2
  157. package/dist/roles/types.d.ts +3 -1
  158. package/dist/roles/types.d.ts.map +1 -1
  159. package/dist/server/combined-server.d.ts +28 -1
  160. package/dist/server/combined-server.d.ts.map +1 -1
  161. package/dist/server/combined-server.js +111 -8
  162. package/dist/server/combined-server.js.map +1 -1
  163. package/dist/store/event-store.d.ts +2 -1
  164. package/dist/store/event-store.d.ts.map +1 -1
  165. package/dist/store/event-store.js +80 -24
  166. package/dist/store/event-store.js.map +1 -1
  167. package/dist/store/instance.d.ts +1 -1
  168. package/dist/store/instance.d.ts.map +1 -1
  169. package/dist/store/instance.js +2 -2
  170. package/dist/store/instance.js.map +1 -1
  171. package/dist/store/types/agents.d.ts +23 -0
  172. package/dist/store/types/agents.d.ts.map +1 -1
  173. package/dist/store/types/events.d.ts +1 -1
  174. package/dist/store/types/events.d.ts.map +1 -1
  175. package/dist/task/backend/index.d.ts +47 -29
  176. package/dist/task/backend/index.d.ts.map +1 -1
  177. package/dist/task/backend/index.js +109 -71
  178. package/dist/task/backend/index.js.map +1 -1
  179. package/dist/task/backend/memory.d.ts +1 -0
  180. package/dist/task/backend/memory.d.ts.map +1 -1
  181. package/dist/task/backend/memory.js +3 -0
  182. package/dist/task/backend/memory.js.map +1 -1
  183. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  184. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  185. package/dist/task/backend/opentasks/backend.js +1023 -0
  186. package/dist/task/backend/opentasks/backend.js.map +1 -0
  187. package/dist/task/backend/opentasks/client.d.ts +337 -0
  188. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  189. package/dist/task/backend/opentasks/client.js +225 -0
  190. package/dist/task/backend/opentasks/client.js.map +1 -0
  191. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  192. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  193. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  194. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  195. package/dist/task/backend/opentasks/index.d.ts +21 -0
  196. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  197. package/dist/task/backend/opentasks/index.js +21 -0
  198. package/dist/task/backend/opentasks/index.js.map +1 -0
  199. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  200. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  201. package/dist/task/backend/opentasks/mapping.js +77 -0
  202. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  203. package/dist/task/backend/types.d.ts +33 -53
  204. package/dist/task/backend/types.d.ts.map +1 -1
  205. package/dist/task/backend/types.js +7 -11
  206. package/dist/task/backend/types.js.map +1 -1
  207. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  208. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  209. package/dist/task/backend/unified-tool-provider.js +623 -0
  210. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  211. package/dist/teams/index.d.ts +3 -1
  212. package/dist/teams/index.d.ts.map +1 -1
  213. package/dist/teams/index.js +2 -0
  214. package/dist/teams/index.js.map +1 -1
  215. package/dist/teams/seed-defaults.d.ts +20 -0
  216. package/dist/teams/seed-defaults.d.ts.map +1 -0
  217. package/dist/teams/seed-defaults.js +71 -0
  218. package/dist/teams/seed-defaults.js.map +1 -0
  219. package/dist/teams/team-loader.d.ts +7 -3
  220. package/dist/teams/team-loader.d.ts.map +1 -1
  221. package/dist/teams/team-loader.js +156 -164
  222. package/dist/teams/team-loader.js.map +1 -1
  223. package/dist/teams/team-manager.d.ts +112 -0
  224. package/dist/teams/team-manager.d.ts.map +1 -0
  225. package/dist/teams/team-manager.js +305 -0
  226. package/dist/teams/team-manager.js.map +1 -0
  227. package/dist/teams/team-runtime.d.ts +125 -19
  228. package/dist/teams/team-runtime.d.ts.map +1 -1
  229. package/dist/teams/team-runtime.js +529 -119
  230. package/dist/teams/team-runtime.js.map +1 -1
  231. package/dist/teams/types.d.ts +41 -151
  232. package/dist/teams/types.d.ts.map +1 -1
  233. package/dist/teams/types.js +2 -3
  234. package/dist/teams/types.js.map +1 -1
  235. package/docs/architecture.md +7 -6
  236. package/docs/configuration.md +26 -62
  237. package/docs/implementation-details.md +5 -5
  238. package/docs/implementation-summary.md +17 -17
  239. package/docs/plan-self-driving-support.md +4 -4
  240. package/docs/spec-self-driving-support.md +10 -10
  241. package/docs/team-templates.md +2 -2
  242. package/docs/teams.md +76 -3
  243. package/docs/troubleshooting.md +10 -11
  244. package/package.json +7 -4
  245. package/references/minimem/.claude/settings.json +7 -0
  246. package/references/minimem/.sudocode/issues.jsonl +18 -0
  247. package/references/minimem/.sudocode/specs.jsonl +1 -0
  248. package/references/minimem/CLAUDE.md +310 -0
  249. package/references/minimem/README.md +562 -0
  250. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
  251. package/references/minimem/claude-plugin/.mcp.json +7 -0
  252. package/references/minimem/claude-plugin/README.md +158 -0
  253. package/references/minimem/claude-plugin/commands/recall.md +47 -0
  254. package/references/minimem/claude-plugin/commands/remember.md +41 -0
  255. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
  256. package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
  257. package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
  258. package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
  259. package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
  260. package/references/minimem/media/banner.png +0 -0
  261. package/references/minimem/package-lock.json +5373 -0
  262. package/references/minimem/package.json +72 -0
  263. package/references/minimem/scripts/postbuild.js +35 -0
  264. package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
  265. package/references/minimem/src/__tests__/errors.test.ts +265 -0
  266. package/references/minimem/src/__tests__/helpers.ts +199 -0
  267. package/references/minimem/src/__tests__/internal.test.ts +407 -0
  268. package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
  269. package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
  270. package/references/minimem/src/__tests__/session.test.ts +190 -0
  271. package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
  272. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
  273. package/references/minimem/src/cli/commands/append.ts +76 -0
  274. package/references/minimem/src/cli/commands/config.ts +262 -0
  275. package/references/minimem/src/cli/commands/conflicts.ts +413 -0
  276. package/references/minimem/src/cli/commands/daemon.ts +169 -0
  277. package/references/minimem/src/cli/commands/index.ts +12 -0
  278. package/references/minimem/src/cli/commands/init.ts +88 -0
  279. package/references/minimem/src/cli/commands/mcp.ts +177 -0
  280. package/references/minimem/src/cli/commands/push-pull.ts +213 -0
  281. package/references/minimem/src/cli/commands/search.ts +158 -0
  282. package/references/minimem/src/cli/commands/status.ts +84 -0
  283. package/references/minimem/src/cli/commands/sync-init.ts +290 -0
  284. package/references/minimem/src/cli/commands/sync.ts +70 -0
  285. package/references/minimem/src/cli/commands/upsert.ts +197 -0
  286. package/references/minimem/src/cli/config.ts +584 -0
  287. package/references/minimem/src/cli/index.ts +264 -0
  288. package/references/minimem/src/cli/shared.ts +161 -0
  289. package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
  290. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
  291. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
  292. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
  293. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
  294. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
  295. package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
  296. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
  297. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
  298. package/references/minimem/src/cli/sync/central.ts +292 -0
  299. package/references/minimem/src/cli/sync/conflicts.ts +204 -0
  300. package/references/minimem/src/cli/sync/daemon.ts +407 -0
  301. package/references/minimem/src/cli/sync/detection.ts +138 -0
  302. package/references/minimem/src/cli/sync/index.ts +107 -0
  303. package/references/minimem/src/cli/sync/operations.ts +373 -0
  304. package/references/minimem/src/cli/sync/registry.ts +279 -0
  305. package/references/minimem/src/cli/sync/state.ts +355 -0
  306. package/references/minimem/src/cli/sync/validation.ts +206 -0
  307. package/references/minimem/src/cli/sync/watcher.ts +234 -0
  308. package/references/minimem/src/cli/version.ts +34 -0
  309. package/references/minimem/src/core/index.ts +9 -0
  310. package/references/minimem/src/core/indexer.ts +628 -0
  311. package/references/minimem/src/core/searcher.ts +221 -0
  312. package/references/minimem/src/db/schema.ts +183 -0
  313. package/references/minimem/src/db/sqlite-vec.ts +24 -0
  314. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
  315. package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
  316. package/references/minimem/src/embeddings/batch-openai.ts +409 -0
  317. package/references/minimem/src/embeddings/embeddings.ts +434 -0
  318. package/references/minimem/src/index.ts +109 -0
  319. package/references/minimem/src/internal.ts +299 -0
  320. package/references/minimem/src/minimem.ts +1276 -0
  321. package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
  322. package/references/minimem/src/search/graph.ts +234 -0
  323. package/references/minimem/src/search/hybrid.ts +151 -0
  324. package/references/minimem/src/search/search.ts +256 -0
  325. package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
  326. package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
  327. package/references/minimem/src/server/mcp.ts +326 -0
  328. package/references/minimem/src/server/tools.ts +720 -0
  329. package/references/minimem/src/session.ts +460 -0
  330. package/references/minimem/tsconfig.json +19 -0
  331. package/references/minimem/tsup.config.ts +26 -0
  332. package/references/minimem/vitest.config.ts +24 -0
  333. package/references/openteams/.claude/settings.json +6 -0
  334. package/references/openteams/README.md +1 -0
  335. package/references/openteams/SKILL.md +341 -0
  336. package/references/openteams/design.md +411 -0
  337. package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
  338. package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
  339. package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
  340. package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
  341. package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
  342. package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
  343. package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
  344. package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
  345. package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
  346. package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
  347. package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
  348. package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
  349. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
  350. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
  351. package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
  352. package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
  353. package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
  354. package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
  355. package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
  356. package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
  357. package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
  358. package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
  359. package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
  360. package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
  361. package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
  362. package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
  363. package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
  364. package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
  365. package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
  366. package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
  367. package/references/openteams/examples/bmad-method/team.yaml +161 -0
  368. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +17 -0
  369. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +5 -0
  370. package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +25 -0
  371. package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +5 -0
  372. package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +34 -0
  373. package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +5 -0
  374. package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +18 -0
  375. package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +3 -0
  376. package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +42 -0
  377. package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +5 -0
  378. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +15 -0
  379. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +3 -0
  380. package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +17 -0
  381. package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +3 -0
  382. package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +28 -0
  383. package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +5 -0
  384. package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +16 -0
  385. package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +3 -0
  386. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +13 -0
  387. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +3 -0
  388. package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +14 -0
  389. package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +3 -0
  390. package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +19 -0
  391. package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +5 -0
  392. package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +8 -0
  393. package/references/openteams/examples/get-shit-done/roles/debugger.yaml +8 -0
  394. package/references/openteams/examples/get-shit-done/roles/executor.yaml +8 -0
  395. package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +8 -0
  396. package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +9 -0
  397. package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +7 -0
  398. package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +8 -0
  399. package/references/openteams/examples/get-shit-done/roles/planner.yaml +8 -0
  400. package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +8 -0
  401. package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +7 -0
  402. package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +7 -0
  403. package/references/openteams/examples/get-shit-done/roles/verifier.yaml +8 -0
  404. package/references/openteams/examples/get-shit-done/team.yaml +154 -0
  405. package/references/openteams/package-lock.json +2181 -0
  406. package/references/openteams/package.json +48 -0
  407. package/references/openteams/schema/role.schema.json +125 -0
  408. package/references/openteams/schema/team.schema.json +284 -0
  409. package/references/openteams/src/cli/agent.ts +104 -0
  410. package/references/openteams/src/cli/cli.test.ts +381 -0
  411. package/references/openteams/src/cli/generate.ts +220 -0
  412. package/references/openteams/src/cli/message.ts +241 -0
  413. package/references/openteams/src/cli/task.ts +154 -0
  414. package/references/openteams/src/cli/team.ts +104 -0
  415. package/references/openteams/src/cli/template.ts +207 -0
  416. package/references/openteams/src/cli.ts +45 -0
  417. package/references/openteams/src/db/database.test.ts +185 -0
  418. package/references/openteams/src/db/database.ts +240 -0
  419. package/references/openteams/src/generators/agent-prompt-generator.test.ts +332 -0
  420. package/references/openteams/src/generators/agent-prompt-generator.ts +521 -0
  421. package/references/openteams/src/generators/package-generator.test.ts +129 -0
  422. package/references/openteams/src/generators/package-generator.ts +102 -0
  423. package/references/openteams/src/generators/skill-generator.test.ts +246 -0
  424. package/references/openteams/src/generators/skill-generator.ts +374 -0
  425. package/references/openteams/src/index.ts +104 -0
  426. package/references/openteams/src/services/agent-service.test.ts +158 -0
  427. package/references/openteams/src/services/agent-service.ts +84 -0
  428. package/references/openteams/src/services/communication-service.test.ts +455 -0
  429. package/references/openteams/src/services/communication-service.ts +371 -0
  430. package/references/openteams/src/services/message-service.test.ts +342 -0
  431. package/references/openteams/src/services/message-service.ts +203 -0
  432. package/references/openteams/src/services/task-service.test.ts +434 -0
  433. package/references/openteams/src/services/task-service.ts +239 -0
  434. package/references/openteams/src/services/team-service.test.ts +181 -0
  435. package/references/openteams/src/services/team-service.ts +139 -0
  436. package/references/openteams/src/services/template-service.test.ts +306 -0
  437. package/references/openteams/src/services/template-service.ts +182 -0
  438. package/references/openteams/src/spawner/acp-factory.ts +96 -0
  439. package/references/openteams/src/spawner/interface.ts +31 -0
  440. package/references/openteams/src/spawner/mock.test.ts +93 -0
  441. package/references/openteams/src/spawner/mock.ts +59 -0
  442. package/references/openteams/src/template/loader.test.ts +1319 -0
  443. package/references/openteams/src/template/loader.ts +698 -0
  444. package/references/openteams/src/template/types.ts +200 -0
  445. package/references/openteams/src/types.ts +205 -0
  446. package/references/openteams/tsconfig.json +18 -0
  447. package/references/openteams/vitest.config.ts +9 -0
  448. package/references/skill-tree/.claude/settings.json +6 -0
  449. package/references/skill-tree/.sudocode/issues.jsonl +11 -0
  450. package/references/skill-tree/.sudocode/specs.jsonl +1 -0
  451. package/references/skill-tree/CLAUDE.md +150 -0
  452. package/references/skill-tree/README.md +324 -0
  453. package/references/skill-tree/docs/GAPS_v1.md +221 -0
  454. package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
  455. package/references/skill-tree/docs/TODOS.md +91 -0
  456. package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
  457. package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
  458. package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
  459. package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
  460. package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
  461. package/references/skill-tree/docs/scraper/README.md +170 -0
  462. package/references/skill-tree/examples/basic-usage.ts +190 -0
  463. package/references/skill-tree/package-lock.json +1509 -0
  464. package/references/skill-tree/package.json +66 -0
  465. package/references/skill-tree/scraper/README.md +123 -0
  466. package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
  467. package/references/skill-tree/scraper/docs/PLAN.md +336 -0
  468. package/references/skill-tree/scraper/drizzle.config.ts +10 -0
  469. package/references/skill-tree/scraper/package-lock.json +6329 -0
  470. package/references/skill-tree/scraper/package.json +68 -0
  471. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
  472. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
  473. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
  474. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
  475. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
  476. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
  477. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
  478. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
  479. package/references/skill-tree/scraper/tsup.config.ts +14 -0
  480. package/references/skill-tree/scraper/vitest.config.ts +17 -0
  481. package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
  482. package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
  483. package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
  484. package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
  485. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
  486. package/references/skill-tree/test/run-all.ts +106 -0
  487. package/references/skill-tree/test/utils.ts +128 -0
  488. package/references/skill-tree/vitest.config.ts +16 -0
  489. package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
  490. package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
  491. package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
  492. package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
  493. package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
  494. package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
  495. package/src/acp/__tests__/integration.test.ts +56 -31
  496. package/src/acp/__tests__/macro-agent.test.ts +16 -7
  497. package/src/acp/macro-agent.ts +170 -36
  498. package/src/acp/types.ts +46 -1
  499. package/src/agent/__tests__/agent-manager.test.ts +228 -2
  500. package/src/agent/agent-manager.ts +809 -285
  501. package/src/agent/types.ts +12 -1
  502. package/src/api/__tests__/server.test.ts +203 -4
  503. package/src/api/server.ts +169 -10
  504. package/src/api/types.ts +3 -1
  505. package/src/auth/__tests__/token.test.ts +100 -0
  506. package/src/auth/index.ts +1 -0
  507. package/src/auth/token.ts +82 -0
  508. package/src/cli/__tests__/acp.test.ts +1 -1
  509. package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
  510. package/src/cli/acp.ts +197 -72
  511. package/src/cli/index.ts +125 -15
  512. package/src/cli/mcp.ts +315 -197
  513. package/src/cli/parse-args.ts +54 -0
  514. package/src/cli/stable-instance-id.ts +14 -0
  515. package/src/config/project-config.ts +214 -27
  516. package/src/index.ts +3 -0
  517. package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
  518. package/src/lifecycle/__tests__/handlers.test.ts +53 -0
  519. package/src/lifecycle/handlers/index.ts +25 -8
  520. package/src/lifecycle/types.ts +3 -0
  521. package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +22 -4
  522. package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
  523. package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
  524. package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
  525. package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
  526. package/src/map/adapter/__tests__/event-log.test.ts +527 -0
  527. package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
  528. package/src/map/adapter/__tests__/extensions.test.ts +408 -0
  529. package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
  530. package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
  531. package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
  532. package/src/map/adapter/__tests__/stream-extensions.test.ts +494 -0
  533. package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
  534. package/src/map/adapter/acp-over-map.ts +678 -66
  535. package/src/map/adapter/connection-manager.ts +3 -0
  536. package/src/map/adapter/event-log.ts +208 -0
  537. package/src/map/adapter/event-translator.ts +6 -6
  538. package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
  539. package/src/map/adapter/extensions/index.ts +96 -0
  540. package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
  541. package/src/map/adapter/extensions/streams.ts +839 -0
  542. package/src/map/adapter/extensions/task.ts +11 -0
  543. package/src/map/adapter/extensions/update-metadata.ts +126 -0
  544. package/src/map/adapter/index.ts +33 -0
  545. package/src/map/adapter/interface.ts +2 -0
  546. package/src/map/adapter/map-adapter.ts +312 -47
  547. package/src/map/adapter/subscription-manager.ts +5 -1
  548. package/src/map/adapter/types.ts +10 -1
  549. package/src/mcp/__tests__/map-client.test.ts +386 -0
  550. package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
  551. package/src/mcp/__tests__/mcp-server.test.ts +100 -1
  552. package/src/mcp/map-client.ts +177 -0
  553. package/src/mcp/mcp-server.ts +205 -103
  554. package/src/mcp/tools/done.ts +19 -0
  555. package/src/mcp/types.ts +6 -1
  556. package/src/metrics/metrics.ts +1 -1
  557. package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
  558. package/src/roles/__tests__/config-loader.test.ts +7 -7
  559. package/src/roles/builtin/coordinator.ts +2 -0
  560. package/src/roles/builtin/integrator.ts +2 -0
  561. package/src/roles/builtin/worker.ts +3 -0
  562. package/src/roles/capabilities.ts +28 -7
  563. package/src/roles/config-loader.ts +8 -7
  564. package/src/roles/registry.ts +2 -2
  565. package/src/roles/types.ts +7 -0
  566. package/src/server/__tests__/combined-server.test.ts +94 -21
  567. package/src/server/combined-server.ts +203 -33
  568. package/src/steering/__tests__/steering-integration.test.ts +1 -1
  569. package/src/store/__tests__/event-store-oob.test.ts +109 -0
  570. package/src/store/__tests__/event-store.test.ts +196 -1
  571. package/src/store/__tests__/instance.test.ts +3 -3
  572. package/src/store/event-store.ts +92 -23
  573. package/src/store/instance.ts +2 -2
  574. package/src/store/types/agents.ts +20 -0
  575. package/src/store/types/events.ts +1 -1
  576. package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
  577. package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
  578. package/src/task/backend/__tests__/memory-pull-mode.test.ts +153 -0
  579. package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
  580. package/src/task/backend/index.ts +156 -106
  581. package/src/task/backend/memory.ts +4 -0
  582. package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
  583. package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
  584. package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
  585. package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
  586. package/src/task/backend/opentasks/backend.ts +1323 -0
  587. package/src/task/backend/opentasks/client.ts +652 -0
  588. package/src/task/backend/opentasks/daemon-manager.ts +256 -0
  589. package/src/task/backend/opentasks/index.ts +69 -0
  590. package/src/task/backend/opentasks/mapping.ts +94 -0
  591. package/src/task/backend/types.ts +42 -66
  592. package/src/task/backend/unified-tool-provider.ts +779 -0
  593. package/src/teams/CLAUDE.md +180 -0
  594. package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
  595. package/src/teams/__tests__/e2e/workspace-isolation.e2e.test.ts +1263 -0
  596. package/src/teams/__tests__/team-manager.test.ts +814 -0
  597. package/src/teams/__tests__/team-system.test.ts +1291 -8
  598. package/src/teams/index.ts +21 -3
  599. package/src/teams/seed-defaults.ts +79 -0
  600. package/src/teams/team-loader.ts +202 -236
  601. package/src/teams/team-manager.ts +387 -0
  602. package/src/teams/team-runtime.ts +592 -121
  603. package/src/teams/types.ts +99 -200
  604. package/test_fixtures/README.md +2 -3
  605. package/test_fixtures/fixtures/index.ts +0 -3
  606. package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
  607. package/test_fixtures/fixtures/repos/index.ts +1 -3
  608. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
  609. package/test_fixtures/fixtures/repos/types.ts +0 -11
  610. package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
  611. package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
  612. package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
  613. package/vitest.config.ts +1 -1
  614. package/vitest.e2e.config.ts +1 -1
  615. package/vitest.setup.ts +1 -30
  616. package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
  617. package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
  618. package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
  619. package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
  620. package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
  621. package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
  622. package/.macro-agent/teams/self-driving/team.yaml +0 -103
  623. package/.macro-agent/teams/structured/prompts/developer.md +0 -26
  624. package/.macro-agent/teams/structured/prompts/lead.md +0 -25
  625. package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
  626. package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
  627. package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
  628. package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
  629. package/.macro-agent/teams/structured/team.yaml +0 -89
  630. package/docs/sudocode-integration.md +0 -383
  631. package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
  632. package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
  633. package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
  634. package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
  635. package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
  636. package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
  637. package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
  638. package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
  639. package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
  640. package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
  641. package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
  642. package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
  643. package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
  644. package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
  645. package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
  646. package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
  647. package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
  648. package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
  649. package/src/task/backend/sudocode/backend.ts +0 -1237
  650. package/src/task/backend/sudocode/client.ts +0 -515
  651. package/src/task/backend/sudocode/index.ts +0 -120
  652. package/src/task/backend/sudocode/mapping.ts +0 -93
  653. package/src/task/backend/sudocode/server-client.ts +0 -522
  654. package/src/task/backend/sudocode/standalone-client.ts +0 -623
  655. package/src/task/backend/sudocode/sync-policy.ts +0 -387
  656. package/src/task/backend/sudocode/tools.ts +0 -896
  657. package/src/task/backend/tool-provider.ts +0 -506
  658. package/test_fixtures/fixtures/sudocode/index.ts +0 -29
  659. package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
  660. package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
package/src/cli/mcp.ts CHANGED
@@ -4,25 +4,17 @@
4
4
  *
5
5
  * Runs the MCP server as a subprocess that agents can connect to.
6
6
  * Agent context is passed via environment variables.
7
+ *
8
+ * Two modes:
9
+ * - **Thin-client mode** (MACRO_SERVER_URL set): Tools forward to the main server
10
+ * via ephemeral MAP WebSocket connections. No local services needed.
11
+ * - **Legacy mode** (MACRO_INSTANCE_ID set): Creates a full local service stack
12
+ * with shared SQLite. Used as fallback for backward compatibility.
7
13
  */
8
14
 
9
15
  import * as fs from "fs";
10
16
  import * as path from "path";
11
17
  import * as os from "os";
12
- import { createEventStore } from "../store/event-store.js";
13
- import { createAgentManager } from "../agent/agent-manager.js";
14
- import { createTaskManager } from "../task/task-manager.js";
15
- import { createMessageRouter } from "../router/message-router.js";
16
- import { createMCPServer } from "../mcp/mcp-server.js";
17
- import {
18
- createActivityWatcher,
19
- subscribeAgentToEvents,
20
- MONITOR_DEFAULT_EVENT_TYPES,
21
- } from "../activity/index.js";
22
- import {
23
- createWakeHandler,
24
- createSessionProviderFromAgentManager,
25
- } from "../agent/wake.js";
26
18
 
27
19
  // Debug logging to file (since stderr doesn't show up from MCP subprocess)
28
20
  const debugLogPath = path.join(os.tmpdir(), "macro-agent-mcp-debug.log");
@@ -33,180 +25,276 @@ function debugLog(message: string) {
33
25
  console.error(message); // Also log to stderr in case it's visible
34
26
  }
35
27
 
36
- async function main() {
37
- // Get agent context from environment variables
38
- const agentId = process.env.MACRO_AGENT_ID;
39
- const parentId = process.env.MACRO_PARENT_ID || null;
28
+ // =============================================================================
29
+ // Thin-Client Mode (MACRO_SERVER_URL)
30
+ // =============================================================================
31
+
32
+ async function startThinClient() {
33
+ const agentId = process.env.MACRO_AGENT_ID!;
40
34
  const taskId = process.env.MACRO_TASK_ID;
41
35
  const agentCwd = process.env.MACRO_AGENT_CWD || process.cwd();
42
- const instanceId = process.env.MACRO_INSTANCE_ID;
43
- const baseDir = process.env.MACRO_BASE_DIR; // Optional: custom base directory for testing
36
+ const serverUrl = process.env.MACRO_SERVER_URL!;
37
+ const lineageStr = process.env.MACRO_AGENT_LINEAGE || "[]";
38
+ const sessionId = process.env.MACRO_SESSION_ID || "";
39
+ const serverToken = process.env.MACRO_SERVER_TOKEN || "";
40
+ const agentToken = process.env.MACRO_AGENT_TOKEN || "";
44
41
 
45
- if (!agentId) {
46
- console.error("Error: MACRO_AGENT_ID environment variable is required");
47
- process.exit(1);
42
+ let lineage: string[];
43
+ try {
44
+ lineage = JSON.parse(lineageStr);
45
+ } catch {
46
+ lineage = [];
48
47
  }
49
48
 
50
- if (!instanceId) {
51
- console.error("Error: MACRO_INSTANCE_ID environment variable is required");
52
- process.exit(1);
53
- }
49
+ debugLog(`[MCP] Thin-client mode: agent=${agentId}, server=${serverUrl}`);
50
+
51
+ const { createMCPServerThinClient } = await import("../mcp/mcp-server.js");
52
+ const { mapCall } = await import("../mcp/map-client.js");
53
+
54
+ const context = {
55
+ agent_id: agentId,
56
+ session_id: sessionId,
57
+ task_id: taskId ?? undefined,
58
+ lineage,
59
+ cwd: agentCwd,
60
+ agent_token: agentToken || undefined,
61
+ };
62
+
63
+ // Also pass permission mode for spawn_agent forwarding
64
+ const permissionMode = process.env.MACRO_PERMISSION_MODE;
65
+
66
+ // Build mapCall options with server token for WebSocket auth
67
+ const callOptions = serverToken ? { serverToken } : undefined;
68
+
69
+ const mcpServer = createMCPServerThinClient(
70
+ context,
71
+ async (method, params, options) => {
72
+ // Merge auth options with per-call options
73
+ const mergedOptions = { ...callOptions, ...options };
74
+ // Inject permission_mode into spawn_agent calls
75
+ if (method === "_macro/mcp/spawn_agent" && permissionMode) {
76
+ const p = (params ?? {}) as Record<string, unknown>;
77
+ p.permission_mode = permissionMode;
78
+ return mapCall(serverUrl, method, p, mergedOptions);
79
+ }
80
+ return mapCall(serverUrl, method, params, mergedOptions);
81
+ }
82
+ );
83
+
84
+ await mcpServer.start();
54
85
 
55
- debugLog(`[MCP] Starting MCP server for agent ${agentId} with instanceId ${instanceId}`);
86
+ // Handle graceful shutdown
87
+ const shutdown = async () => {
88
+ await mcpServer.close();
89
+ process.exit(0);
90
+ };
91
+ process.on("SIGINT", shutdown);
92
+ process.on("SIGTERM", shutdown);
93
+ }
94
+
95
+ // =============================================================================
96
+ // Legacy Mode (MACRO_INSTANCE_ID)
97
+ // =============================================================================
98
+
99
+ async function startLegacy() {
100
+ const agentId = process.env.MACRO_AGENT_ID!;
101
+ const taskId = process.env.MACRO_TASK_ID;
102
+ const agentCwd = process.env.MACRO_AGENT_CWD || process.cwd();
103
+ const instanceId = process.env.MACRO_INSTANCE_ID!;
104
+ const baseDir = process.env.MACRO_BASE_DIR;
105
+
106
+ debugLog(`[MCP] Legacy mode: agent=${agentId}, instanceId=${instanceId}`);
56
107
  debugLog(`[MCP] Debug log file: ${debugLogPath}`);
57
108
 
109
+ const { createEventStore } = await import("../store/event-store.js");
110
+ const { createAgentManager } = await import("../agent/agent-manager.js");
111
+ const { createTaskManager } = await import("../task/task-manager.js");
112
+ const { createMessageRouter } = await import("../router/message-router.js");
113
+ const { createMCPServer } = await import("../mcp/mcp-server.js");
114
+ const { createTaskBackend, loadTaskConfigFromEnv } = await import("../task/backend/index.js");
115
+ const { UnifiedTaskToolProvider } = await import("../task/backend/unified-tool-provider.js");
116
+ const {
117
+ createActivityWatcher,
118
+ subscribeAgentToEvents,
119
+ MONITOR_DEFAULT_EVENT_TYPES,
120
+ } = await import("../activity/index.js");
121
+ const {
122
+ createWakeHandler,
123
+ createSessionProviderFromAgentManager,
124
+ } = await import("../agent/wake.js");
125
+
126
+ // Initialize services with shared file-based storage
127
+ const eventStore = await createEventStore({ inMemory: false, instanceId, baseDir });
128
+ debugLog(`[MCP] EventStore created, path: ${eventStore.instancePath}`);
129
+ const messageRouter = createMessageRouter(eventStore);
130
+ const agentManager = createAgentManager(eventStore, messageRouter);
131
+ const taskManager = createTaskManager(eventStore);
132
+
133
+ // Create task backend from env config
134
+ const taskConfig = loadTaskConfigFromEnv();
135
+ let taskBackend: import("../task/backend/types.js").TaskBackend | undefined;
136
+ let taskToolProvider: InstanceType<typeof UnifiedTaskToolProvider> | undefined;
137
+ let openTasksClient: import("../task/backend/opentasks/client.js").OpenTasksClient | undefined;
138
+
58
139
  try {
59
- // Initialize services with shared file-based storage using the same instanceId as the main process
60
- // If MACRO_BASE_DIR is provided (e.g., for testing), use it to resolve to the correct database location
61
- const eventStore = await createEventStore({ inMemory: false, instanceId, baseDir });
62
- debugLog(`[MCP] EventStore created, path: ${eventStore.instancePath}`);
63
- const messageRouter = createMessageRouter(eventStore);
64
- const agentManager = createAgentManager(eventStore, messageRouter);
65
- const taskManager = createTaskManager(eventStore);
66
-
67
- // Get agent lineage for authorization checks
68
- // Note: The agent may not be in the store yet if the MCP server starts before
69
- // the spawn event is persisted. This is a race condition - we retry a few times.
70
- let agent = eventStore.getAgent(agentId);
71
- const allAgentsInitial = eventStore.listAgents();
72
- debugLog(`[MCP] Initial check: agent found = ${!!agent}, total agents in store = ${allAgentsInitial.length}`);
73
- if (allAgentsInitial.length > 0) {
74
- debugLog(`[MCP] Agents in store: ${allAgentsInitial.map(a => a.id).join(', ')}`);
75
- }
140
+ const result = await createTaskBackend(taskConfig, eventStore);
141
+ taskBackend = result.backend;
142
+ openTasksClient = result.openTasksClient;
76
143
 
77
- if (!agent) {
78
- // Retry a few times with small delays to handle race condition
79
- // where MCP server starts before spawn event is persisted
80
- for (let i = 0; i < 10; i++) {
81
- await new Promise(resolve => setTimeout(resolve, 100));
82
- // Reload from SQLite to get fresh data
83
- await eventStore.reload();
84
- agent = eventStore.getAgent(agentId);
85
- const allAgentsRetry = eventStore.listAgents();
86
- debugLog(`[MCP] Retry ${i + 1}: agent found = ${!!agent}, total agents = ${allAgentsRetry.length}`);
87
- if (agent) {
88
- debugLog(`[MCP] Found agent ${agentId} after ${i + 1} retries`);
89
- break;
90
- }
144
+ taskToolProvider = new UnifiedTaskToolProvider(
145
+ taskBackend,
146
+ () => ({ agent_id: agentId! }),
147
+ openTasksClient
148
+ );
149
+ debugLog(`[MCP] Task backend created: ${taskConfig.backend.type}`);
150
+ } catch (err) {
151
+ debugLog(`[MCP] Failed to create task backend: ${err}. Falling back to legacy TaskManager only.`);
152
+ }
153
+
154
+ // Get agent lineage for authorization checks
155
+ let agent = eventStore.getAgent(agentId);
156
+ const allAgentsInitial = eventStore.listAgents();
157
+ debugLog(`[MCP] Initial check: agent found = ${!!agent}, total agents in store = ${allAgentsInitial.length}`);
158
+ if (allAgentsInitial.length > 0) {
159
+ debugLog(`[MCP] Agents in store: ${allAgentsInitial.map(a => a.id).join(', ')}`);
160
+ }
161
+
162
+ if (!agent) {
163
+ for (let i = 0; i < 10; i++) {
164
+ await new Promise(resolve => setTimeout(resolve, 100));
165
+ await eventStore.reload();
166
+ agent = eventStore.getAgent(agentId);
167
+ const allAgentsRetry = eventStore.listAgents();
168
+ debugLog(`[MCP] Retry ${i + 1}: agent found = ${!!agent}, total agents = ${allAgentsRetry.length}`);
169
+ if (agent) {
170
+ debugLog(`[MCP] Found agent ${agentId} after ${i + 1} retries`);
171
+ break;
91
172
  }
92
- } else {
93
- debugLog(`[MCP] Agent ${agentId} found immediately (no retry needed)`);
94
173
  }
174
+ } else {
175
+ debugLog(`[MCP] Agent ${agentId} found immediately (no retry needed)`);
176
+ }
95
177
 
96
- if (!agent) {
97
- debugLog(`[MCP] Warning: Agent ${agentId} not found in store after retries. ` +
98
- `Continuing with limited context. This may affect authorization checks.`);
99
- // List all events to help debug
100
- const events = eventStore.query({ limit: 50 });
101
- debugLog(`[MCP] Events in store (${events.length}): ${events.map(e => `${e.type}:${e.payload?.agent_id || e.source?.agent_id}`).join(', ')}`);
102
- }
178
+ if (!agent) {
179
+ debugLog(`[MCP] Warning: Agent ${agentId} not found in store after retries. ` +
180
+ `Continuing with limited context. This may affect authorization checks.`);
181
+ const events = eventStore.query({ limit: 50 });
182
+ debugLog(`[MCP] Events in store (${events.length}): ${events.map(e => `${e.type}:${e.payload?.agent_id || e.source?.agent_id}`).join(', ')}`);
183
+ }
103
184
 
104
- const lineage = agent?.lineage ?? [];
105
-
106
- // Create ActivityWatcher for wait_for_activity MCP tool
107
- const sessionProvider = createSessionProviderFromAgentManager(agentManager);
108
- const wakeHandler = createWakeHandler(sessionProvider, agentManager);
109
- const activityWatcher = createActivityWatcher(
110
- {
111
- listAgents: () => agentManager.list(),
112
- getAgent: (id) => agentManager.get(id),
113
- },
114
- wakeHandler
115
- );
185
+ const lineage = agent?.lineage ?? [];
116
186
 
117
- // Wire EventStore events to ActivityWatcher
118
- eventStore.onAgentChange((changedAgentId, changedAgent) => {
119
- if (!activityWatcher.isRunning()) return;
120
- if (!changedAgent) return; // Agent was deleted
121
-
122
- // Infer event type from agent state
123
- const eventType = changedAgent.state === "spawning" ? "agent_spawned"
124
- : changedAgent.state === "running" ? "agent_started"
125
- : changedAgent.state === "stopped" ? "agent_terminated"
126
- : "agent_updated";
127
-
128
- activityWatcher.processActivity({
129
- id: `evt-${Date.now()}-${Math.random().toString(36).slice(2)}`,
130
- type: eventType,
131
- source: { agent_id: changedAgentId, role: changedAgent.role },
132
- timestamp: Date.now(),
133
- details: { state: changedAgent.state },
134
- });
135
- });
187
+ // Create ActivityWatcher for wait_for_activity MCP tool
188
+ const sessionProvider = createSessionProviderFromAgentManager(agentManager);
189
+ const wakeHandler = createWakeHandler(sessionProvider, agentManager);
190
+ const activityWatcher = createActivityWatcher(
191
+ {
192
+ listAgents: () => agentManager.list(),
193
+ getAgent: (id) => agentManager.get(id),
194
+ },
195
+ wakeHandler
196
+ );
197
+
198
+ // Wire EventStore events to ActivityWatcher
199
+ eventStore.onAgentChange((changedAgentId, changedAgent) => {
200
+ if (!activityWatcher.isRunning()) return;
201
+ if (!changedAgent) return;
202
+
203
+ const eventType = changedAgent.state === "spawning" ? "agent_spawned"
204
+ : changedAgent.state === "running" ? "agent_started"
205
+ : changedAgent.state === "stopped" ? "agent_terminated"
206
+ : "agent_updated";
136
207
 
137
- eventStore.onTaskChange((changedTaskId, task) => {
138
- if (!activityWatcher.isRunning()) return;
139
- if (!task) return; // Task was deleted
140
-
141
- // Infer event type from task status
142
- const eventType = task.status === "pending" ? "task_created"
143
- : task.status === "assigned" ? "task_assigned"
144
- : task.status === "in_progress" ? "task_started"
145
- : task.status === "completed" ? "task_completed"
146
- : task.status === "failed" ? "task_failed"
147
- : "task_updated";
148
-
149
- activityWatcher.processActivity({
150
- id: `evt-${Date.now()}-${Math.random().toString(36).slice(2)}`,
151
- type: eventType,
152
- source: { agent_id: task.assigned_agent ?? undefined, task_id: changedTaskId },
153
- timestamp: Date.now(),
154
- details: { status: task.status },
155
- });
208
+ activityWatcher.processActivity({
209
+ id: `evt-${Date.now()}-${Math.random().toString(36).slice(2)}`,
210
+ type: eventType,
211
+ source: { agent_id: changedAgentId, role: changedAgent.role },
212
+ timestamp: Date.now(),
213
+ details: { state: changedAgent.state },
156
214
  });
215
+ });
157
216
 
158
- // Start the ActivityWatcher
159
- activityWatcher.start();
160
-
161
- // Auto-subscribe Monitor agents to health events when they spawn
162
- agentManager.onLifecycleEvent((event) => {
163
- if (event.type === "spawned") {
164
- const spawnedAgent = event.agent;
165
- // Check if this is a Monitor agent
166
- if (spawnedAgent.role === "monitor" || spawnedAgent.role?.startsWith("monitor.")) {
167
- subscribeAgentToEvents(
168
- activityWatcher,
169
- spawnedAgent.id,
170
- MONITOR_DEFAULT_EVENT_TYPES,
171
- undefined, // No scope filter - monitor sees all
172
- "high" // High priority for health events
173
- );
174
- debugLog(`[MCP] Auto-subscribed Monitor ${spawnedAgent.id} to health events`);
175
- }
176
- }
217
+ eventStore.onTaskChange((changedTaskId, task) => {
218
+ if (!activityWatcher.isRunning()) return;
219
+ if (!task) return;
220
+
221
+ const eventType = task.status === "pending" ? "task_created"
222
+ : task.status === "assigned" ? "task_assigned"
223
+ : task.status === "in_progress" ? "task_started"
224
+ : task.status === "completed" ? "task_completed"
225
+ : task.status === "failed" ? "task_failed"
226
+ : "task_updated";
227
+
228
+ activityWatcher.processActivity({
229
+ id: `evt-${Date.now()}-${Math.random().toString(36).slice(2)}`,
230
+ type: eventType,
231
+ source: { agent_id: task.assigned_agent ?? undefined, task_id: changedTaskId },
232
+ timestamp: Date.now(),
233
+ details: { status: task.status },
177
234
  });
235
+ });
178
236
 
179
- // Read team config from EventStore (stored by TeamRuntime.initialize)
180
- let teamTaskMode: string | undefined;
181
- const teamEvents = eventStore.query({ type: "status", limit: 50 });
182
- const teamConfigEvent = teamEvents.find(
183
- (e) => e.payload?.team_config != null
184
- );
185
- if (teamConfigEvent?.payload?.team_config) {
186
- const tc = teamConfigEvent.payload.team_config as Record<string, unknown>;
187
- teamTaskMode = tc.taskMode as string | undefined;
188
- debugLog(`[MCP] Found team config: team=${tc.teamName}, strategy=${tc.strategy}, taskMode=${tc.taskMode}`);
237
+ activityWatcher.start();
238
+
239
+ // Auto-subscribe Monitor agents to health events when they spawn
240
+ agentManager.onLifecycleEvent((event) => {
241
+ if (event.type === "spawned") {
242
+ const spawnedAgent = event.agent;
243
+ if (spawnedAgent.role === "monitor" || spawnedAgent.role?.startsWith("monitor.")) {
244
+ subscribeAgentToEvents(
245
+ activityWatcher,
246
+ spawnedAgent.id,
247
+ MONITOR_DEFAULT_EVENT_TYPES,
248
+ undefined,
249
+ "high"
250
+ );
251
+ debugLog(`[MCP] Auto-subscribed Monitor ${spawnedAgent.id} to health events`);
252
+ }
189
253
  }
254
+ });
190
255
 
191
- // Register team roles in local RoleRegistry for capability checks
192
- const roleRegistry = agentManager.getRoleRegistry();
193
- let integrationStrategy: import("../workspace/strategies/types.js").IntegrationStrategy | undefined;
256
+ // Read team config from EventStore (scoped by MACRO_TEAM_NAME for multi-team)
257
+ let teamTaskMode: string | undefined;
258
+ const myTeamName = process.env.MACRO_TEAM_NAME;
259
+ const teamEvents = eventStore.query({ type: "status", limit: 50 });
260
+ const teamConfigEvent = teamEvents.find((e) => {
261
+ const tc = e.payload?.team_config as Record<string, unknown> | undefined;
262
+ if (!tc) return false;
263
+ // If agent has a team name, find that specific team's config
264
+ if (myTeamName) return tc.teamName === myTeamName;
265
+ // Fallback: first team_config found (backward compat)
266
+ return true;
267
+ });
268
+ if (teamConfigEvent?.payload?.team_config) {
269
+ const tc = teamConfigEvent.payload.team_config as Record<string, unknown>;
270
+ teamTaskMode = tc.taskMode as string | undefined;
271
+ debugLog(`[MCP] Found team config: team=${tc.teamName}, strategy=${tc.strategy}, taskMode=${tc.taskMode}`);
272
+ }
194
273
 
195
- if (teamConfigEvent?.payload?.team_config) {
196
- const tc = teamConfigEvent.payload.team_config as Record<string, unknown>;
274
+ // Register team roles in local RoleRegistry
275
+ const roleRegistry = agentManager.getRoleRegistry();
276
+ let integrationStrategy: import("../workspace/strategies/types.js").IntegrationStrategy | undefined;
197
277
 
198
- // Register serialized team roles (stored by TeamRuntime.initialize)
199
- const roles = tc.roles as Record<string, { name: string; capabilities: string[] }> | undefined;
200
- if (roles) {
201
- for (const roleDef of Object.values(roles)) {
202
- roleRegistry.registerRole(roleDef as import("../roles/types.js").RoleDefinition);
203
- }
204
- debugLog(`[MCP] Registered ${Object.keys(roles).length} team roles in RoleRegistry`);
278
+ if (teamConfigEvent?.payload?.team_config) {
279
+ const tc = teamConfigEvent.payload.team_config as Record<string, unknown>;
280
+
281
+ const roles = tc.roles as Record<string, { name: string; capabilities: string[] }> | undefined;
282
+ if (roles) {
283
+ for (const roleDef of Object.values(roles)) {
284
+ roleRegistry.registerRole(roleDef as import("../roles/types.js").RoleDefinition);
205
285
  }
286
+ debugLog(`[MCP] Registered ${Object.keys(roles).length} team roles in RoleRegistry`);
287
+ }
206
288
 
207
- // Instantiate integration strategy from team config
208
- const strategyName = tc.strategy as string | undefined;
209
- if (strategyName) {
289
+ const strategyName = tc.strategy as string | undefined;
290
+ if (strategyName) {
291
+ // Queue strategy requires merge queue which is only available in the main process.
292
+ // Skip it so the worker handler falls through to MERGE_REQUEST signal emission,
293
+ // which the main server's TeamRuntime polls for and submits to the real merge queue.
294
+ if (strategyName === "queue") {
295
+ debugLog(`[MCP] Skipping queue strategy in subprocess (no merge queue available). ` +
296
+ `Worker done() will emit MERGE_REQUEST signal for main process to handle.`);
297
+ } else {
210
298
  try {
211
299
  const { defaultStrategyRegistry } = await import("../workspace/strategies/registry.js");
212
300
  integrationStrategy = defaultStrategyRegistry.get(
@@ -219,45 +307,75 @@ async function main() {
219
307
  }
220
308
  }
221
309
  }
310
+ }
222
311
 
223
- // Create MCP server with agent context
224
- const mcpServer = createMCPServer(
225
- {
226
- agent_id: agentId,
227
- session_id: agent?.session_id ?? "",
228
- task_id: taskId ?? undefined,
229
- lineage,
230
- cwd: agentCwd,
231
- },
232
- {
233
- eventStore,
234
- agentManager,
235
- taskManager,
236
- messageRouter,
237
- activityWatcher,
238
- taskMode: teamTaskMode as "push" | "pull" | undefined,
239
- roleRegistry,
240
- integrationStrategy,
241
- }
242
- );
312
+ const mcpServer = createMCPServer(
313
+ {
314
+ agent_id: agentId,
315
+ session_id: agent?.session_id ?? "",
316
+ task_id: taskId ?? undefined,
317
+ lineage,
318
+ cwd: agentCwd,
319
+ },
320
+ {
321
+ eventStore,
322
+ agentManager,
323
+ taskManager,
324
+ messageRouter,
325
+ activityWatcher,
326
+ taskMode: teamTaskMode as "push" | "pull" | undefined,
327
+ roleRegistry,
328
+ integrationStrategy,
329
+ taskBackend,
330
+ taskToolProvider,
331
+ }
332
+ );
243
333
 
244
- // Start the MCP server (uses stdio transport)
245
- await mcpServer.start();
334
+ await mcpServer.start();
246
335
 
247
- // Handle graceful shutdown
248
- process.on("SIGINT", async () => {
249
- activityWatcher.stop();
250
- await mcpServer.close();
251
- await eventStore.close();
252
- process.exit(0);
253
- });
336
+ // Handle graceful shutdown
337
+ process.on("SIGINT", async () => {
338
+ activityWatcher.stop();
339
+ try { openTasksClient?.disconnect(); } catch { /* ignore */ }
340
+ await mcpServer.close();
341
+ await eventStore.close();
342
+ process.exit(0);
343
+ });
254
344
 
255
- process.on("SIGTERM", async () => {
256
- activityWatcher.stop();
257
- await mcpServer.close();
258
- await eventStore.close();
259
- process.exit(0);
260
- });
345
+ process.on("SIGTERM", async () => {
346
+ activityWatcher.stop();
347
+ try { openTasksClient?.disconnect(); } catch { /* ignore */ }
348
+ await mcpServer.close();
349
+ await eventStore.close();
350
+ process.exit(0);
351
+ });
352
+ }
353
+
354
+ // =============================================================================
355
+ // Main
356
+ // =============================================================================
357
+
358
+ async function main() {
359
+ const agentId = process.env.MACRO_AGENT_ID;
360
+ const serverUrl = process.env.MACRO_SERVER_URL;
361
+ const instanceId = process.env.MACRO_INSTANCE_ID;
362
+
363
+ if (!agentId) {
364
+ console.error("Error: MACRO_AGENT_ID environment variable is required");
365
+ process.exit(1);
366
+ }
367
+
368
+ try {
369
+ if (serverUrl) {
370
+ // Thin-client mode: forward tool calls to main server via MAP WebSocket
371
+ await startThinClient();
372
+ } else if (instanceId) {
373
+ // Legacy mode: create full local service stack with shared SQLite
374
+ await startLegacy();
375
+ } else {
376
+ console.error("Error: Either MACRO_SERVER_URL or MACRO_INSTANCE_ID environment variable is required");
377
+ process.exit(1);
378
+ }
261
379
  } catch (error) {
262
380
  console.error(`Failed to start MCP server: ${error}`);
263
381
  process.exit(1);
@@ -0,0 +1,54 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ export interface ACPServerOptions {
6
+ /** Working directory for agents */
7
+ cwd?: string;
8
+ /** Stdio ACP-only mode (for embedded use with acp-factory) */
9
+ acp?: boolean;
10
+ /** Port for server (default: 3001) */
11
+ port?: number;
12
+ /** Host for server (default: localhost) */
13
+ host?: string;
14
+ /** Instance ID to reuse an existing event store (omit for new instance) */
15
+ instanceId?: string;
16
+ /** Disable authentication (for local development/testing) */
17
+ noAuth?: boolean;
18
+ }
19
+
20
+ /**
21
+ * Parse command line arguments.
22
+ * @param argv Optional array of arguments (defaults to process.argv.slice(2))
23
+ */
24
+ export function parseArgs(argv?: string[]): ACPServerOptions {
25
+ const args = argv ?? process.argv.slice(2);
26
+ const options: ACPServerOptions = {};
27
+
28
+ for (let i = 0; i < args.length; i++) {
29
+ if (args[i] === "--version" || args[i] === "-v") {
30
+ const __dirname = dirname(fileURLToPath(import.meta.url));
31
+ const pkg = JSON.parse(readFileSync(join(__dirname, "../../package.json"), "utf-8"));
32
+ console.log(pkg.version);
33
+ process.exit(0);
34
+ } else if (args[i] === "--cwd" && args[i + 1]) {
35
+ options.cwd = args[i + 1];
36
+ i++;
37
+ } else if (args[i] === "--acp") {
38
+ options.acp = true;
39
+ } else if (args[i] === "--port" && args[i + 1]) {
40
+ options.port = parseInt(args[i + 1], 10);
41
+ i++;
42
+ } else if (args[i] === "--host" && args[i + 1]) {
43
+ options.host = args[i + 1];
44
+ i++;
45
+ } else if (args[i] === "--instance-id" && args[i + 1]) {
46
+ options.instanceId = args[i + 1];
47
+ i++;
48
+ } else if (args[i] === "--no-auth") {
49
+ options.noAuth = true;
50
+ }
51
+ }
52
+
53
+ return options;
54
+ }
@@ -0,0 +1,14 @@
1
+ import { createHash } from "node:crypto";
2
+ import { resolve } from "node:path";
3
+
4
+ /**
5
+ * Generate a stable, deterministic instance ID from a directory path.
6
+ *
7
+ * This ensures the same project always uses the same EventStore,
8
+ * so agents and sessions persist across server restarts.
9
+ */
10
+ export function getStableInstanceId(cwd: string): string {
11
+ const normalizedPath = resolve(cwd);
12
+ const hash = createHash("sha256").update(normalizedPath).digest("hex").slice(0, 12);
13
+ return `inst_${hash}`;
14
+ }