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
@@ -170,7 +170,7 @@ describe('EventStore', () => {
170
170
  });
171
171
 
172
172
  store.emit({
173
- type: 'terminate',
173
+ type: 'stop',
174
174
  source: { agent_id: 'agent_1' },
175
175
  payload: { reason: 'completed' },
176
176
  });
@@ -1096,6 +1096,201 @@ describe('Event Archival', () => {
1096
1096
 
1097
1097
  await planStore.close();
1098
1098
  });
1099
+
1100
+ it('should update agent name via updateAgentMetadata', async () => {
1101
+ const metaStore = await createEventStore({ inMemory: true });
1102
+
1103
+ metaStore.emit({
1104
+ type: 'spawn',
1105
+ source: { agent_id: 'agent_meta' },
1106
+ payload: {
1107
+ agent_id: 'agent_meta',
1108
+ session_id: 'sess_meta',
1109
+ task: 'test metadata',
1110
+ },
1111
+ });
1112
+
1113
+ // Name starts undefined
1114
+ expect(metaStore.getAgent('agent_meta')?.name).toBeUndefined();
1115
+
1116
+ // Set name via updateAgentMetadata
1117
+ metaStore.updateAgentMetadata('agent_meta', { name: 'MyAgent' });
1118
+ expect(metaStore.getAgent('agent_meta')?.name).toBe('MyAgent');
1119
+
1120
+ await metaStore.close();
1121
+ });
1122
+
1123
+ it('should update agent metadata via updateAgentMetadata', async () => {
1124
+ const metaStore = await createEventStore({ inMemory: true });
1125
+
1126
+ metaStore.emit({
1127
+ type: 'spawn',
1128
+ source: { agent_id: 'agent_meta2' },
1129
+ payload: {
1130
+ agent_id: 'agent_meta2',
1131
+ session_id: 'sess_meta2',
1132
+ task: 'test metadata field',
1133
+ },
1134
+ });
1135
+
1136
+ // Metadata starts undefined
1137
+ expect(metaStore.getAgent('agent_meta2')?.metadata).toBeUndefined();
1138
+
1139
+ // Set metadata
1140
+ metaStore.updateAgentMetadata('agent_meta2', {
1141
+ metadata: { color: 'blue', priority: 1 },
1142
+ });
1143
+ const after = metaStore.getAgent('agent_meta2');
1144
+ expect(after?.metadata).toEqual({ color: 'blue', priority: 1 });
1145
+
1146
+ await metaStore.close();
1147
+ });
1148
+
1149
+ it('should shallow-merge metadata with existing values', async () => {
1150
+ const metaStore = await createEventStore({ inMemory: true });
1151
+
1152
+ metaStore.emit({
1153
+ type: 'spawn',
1154
+ source: { agent_id: 'agent_merge' },
1155
+ payload: {
1156
+ agent_id: 'agent_merge',
1157
+ session_id: 'sess_merge',
1158
+ task: 'test metadata merge',
1159
+ },
1160
+ });
1161
+
1162
+ // Set initial metadata
1163
+ metaStore.updateAgentMetadata('agent_merge', {
1164
+ metadata: { color: 'blue', size: 'large' },
1165
+ });
1166
+ expect(metaStore.getAgent('agent_merge')?.metadata).toEqual({
1167
+ color: 'blue',
1168
+ size: 'large',
1169
+ });
1170
+
1171
+ // Merge with new metadata — existing keys preserved, new keys added
1172
+ metaStore.updateAgentMetadata('agent_merge', {
1173
+ metadata: { color: 'red', shape: 'circle' },
1174
+ });
1175
+ expect(metaStore.getAgent('agent_merge')?.metadata).toEqual({
1176
+ color: 'red',
1177
+ size: 'large',
1178
+ shape: 'circle',
1179
+ });
1180
+
1181
+ await metaStore.close();
1182
+ });
1183
+
1184
+ it('should update multiple fields in a single updateAgentMetadata call', async () => {
1185
+ const metaStore = await createEventStore({ inMemory: true });
1186
+
1187
+ metaStore.emit({
1188
+ type: 'spawn',
1189
+ source: { agent_id: 'agent_multi' },
1190
+ payload: {
1191
+ agent_id: 'agent_multi',
1192
+ session_id: 'sess_multi',
1193
+ task: 'test multi-field update',
1194
+ },
1195
+ });
1196
+
1197
+ const plan = [
1198
+ { content: 'Step 1', priority: 'high', status: 'pending' },
1199
+ ];
1200
+
1201
+ metaStore.updateAgentMetadata('agent_multi', {
1202
+ name: 'MultiAgent',
1203
+ plan,
1204
+ metadata: { tag: 'test' },
1205
+ });
1206
+
1207
+ const agent = metaStore.getAgent('agent_multi');
1208
+ expect(agent?.name).toBe('MultiAgent');
1209
+ expect(agent?.plan).toEqual(plan);
1210
+ expect(agent?.metadata).toEqual({ tag: 'test' });
1211
+
1212
+ await metaStore.close();
1213
+ });
1214
+
1215
+ it('should notify agent change listeners on metadata update', async () => {
1216
+ const metaStore = await createEventStore({ inMemory: true });
1217
+
1218
+ metaStore.emit({
1219
+ type: 'spawn',
1220
+ source: { agent_id: 'agent_notify' },
1221
+ payload: {
1222
+ agent_id: 'agent_notify',
1223
+ session_id: 'sess_notify',
1224
+ task: 'test notify',
1225
+ },
1226
+ });
1227
+
1228
+ const changes: string[] = [];
1229
+ metaStore.onAgentChange((agentId) => {
1230
+ changes.push(agentId);
1231
+ });
1232
+
1233
+ metaStore.updateAgentMetadata('agent_notify', { name: 'Notified' });
1234
+ expect(changes).toContain('agent_notify');
1235
+
1236
+ await metaStore.close();
1237
+ });
1238
+
1239
+ it('should preserve all out-of-band fields across reload', async () => {
1240
+ const metaStore = await createEventStore({
1241
+ baseDir: testDir,
1242
+ instanceId: 'metadata-reload-test',
1243
+ });
1244
+
1245
+ metaStore.emit({
1246
+ type: 'spawn',
1247
+ source: { agent_id: 'agent_reload' },
1248
+ payload: {
1249
+ agent_id: 'agent_reload',
1250
+ session_id: 'sess_reload',
1251
+ task: 'test reload persistence',
1252
+ },
1253
+ });
1254
+
1255
+ // Set all out-of-band fields
1256
+ const plan = [
1257
+ { content: 'Research', priority: 'high', status: 'completed' },
1258
+ ];
1259
+ metaStore.updateAgentMetadata('agent_reload', {
1260
+ name: 'ReloadAgent',
1261
+ plan,
1262
+ metadata: { version: 2, env: 'test' },
1263
+ });
1264
+
1265
+ // Verify before reload
1266
+ const before = metaStore.getAgent('agent_reload');
1267
+ expect(before?.name).toBe('ReloadAgent');
1268
+ expect(before?.plan).toEqual(plan);
1269
+ expect(before?.metadata).toEqual({ version: 2, env: 'test' });
1270
+
1271
+ // Persist and reload (rebuildViews)
1272
+ await metaStore.persist();
1273
+ await metaStore.reload();
1274
+
1275
+ // All fields should survive
1276
+ const after = metaStore.getAgent('agent_reload');
1277
+ expect(after).toBeDefined();
1278
+ expect(after?.name).toBe('ReloadAgent');
1279
+ expect(after?.plan).toEqual(plan);
1280
+ expect(after?.metadata).toEqual({ version: 2, env: 'test' });
1281
+
1282
+ await metaStore.close();
1283
+ });
1284
+
1285
+ it('should no-op when agent does not exist', async () => {
1286
+ const metaStore = await createEventStore({ inMemory: true });
1287
+
1288
+ // Should not throw
1289
+ metaStore.updateAgentMetadata('nonexistent', { name: 'Ghost' });
1290
+ expect(metaStore.getAgent('nonexistent')).toBeNull();
1291
+
1292
+ await metaStore.close();
1293
+ });
1099
1294
  });
1100
1295
  });
1101
1296
 
@@ -467,10 +467,10 @@ describe('Peer Visibility', () => {
467
467
  it('should filter by whitelist when visibleEventTypes is specified', () => {
468
468
  const visibility: PeerVisibilityConfig = {
469
469
  exportEvents: true,
470
- visibleEventTypes: ['spawn', 'terminate'],
470
+ visibleEventTypes: ['spawn', 'stop'],
471
471
  };
472
472
  expect(isEventTypeVisibleToPeers('spawn', visibility)).toBe(true);
473
- expect(isEventTypeVisibleToPeers('terminate', visibility)).toBe(true);
473
+ expect(isEventTypeVisibleToPeers('stop', visibility)).toBe(true);
474
474
  expect(isEventTypeVisibleToPeers('message', visibility)).toBe(false);
475
475
  });
476
476
  });
@@ -503,7 +503,7 @@ describe('Peer Visibility', () => {
503
503
  { type: 'spawn', source: { agent_id: 'agent-1' }, payload: {} },
504
504
  { type: 'message', source: { agent_id: 'agent-1' }, payload: {} },
505
505
  { type: 'spawn', source: { agent_id: 'agent-2' }, payload: {} },
506
- { type: 'terminate', source: { agent_id: 'agent-2' }, payload: {} },
506
+ { type: 'stop', source: { agent_id: 'agent-2' }, payload: {} },
507
507
  ];
508
508
 
509
509
  it('should return empty array when export is disabled', () => {
@@ -23,6 +23,7 @@ import type {
23
23
  EventFilter,
24
24
  Agent,
25
25
  AgentState,
26
+ AgentMetadataUpdate,
26
27
  Task,
27
28
  TaskStatus,
28
29
  QueuedMessage,
@@ -57,6 +58,7 @@ import {
57
58
  readInstanceMeta,
58
59
  touchInstance,
59
60
  registerInstance,
61
+ DEFAULT_BASE_DIR,
60
62
  DEFAULT_NAMESPACE,
61
63
  DEFAULT_PEER_VISIBILITY,
62
64
  filterEventsForPeer,
@@ -131,8 +133,8 @@ function createTabularBetterSqlite3Persister(
131
133
  undefined,
132
134
  // onIgnoredError
133
135
  (error: any) => console.warn('[EventStore] Persister error:', error),
134
- // destroy
135
- () => db.close(),
136
+ // destroy — do NOT close DB here; close() handles it after the persister drains
137
+ () => {},
136
138
  // persist mode (1 = StoreOnly)
137
139
  1 as any,
138
140
  // thing (the db instance)
@@ -204,6 +206,7 @@ export interface EventStore {
204
206
  getAgent(agentId: AgentId): Agent | null;
205
207
  listAgents(filter?: { state?: AgentState; parent?: AgentId | null }): Agent[];
206
208
  updateAgentPlan(agentId: AgentId, plan: Array<{ content: string; priority: string; status: string }>): void;
209
+ updateAgentMetadata(agentId: AgentId, updates: AgentMetadataUpdate): void;
207
210
 
208
211
  // Task view
209
212
  getTask(taskId: TaskId): Task | null;
@@ -306,7 +309,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
306
309
  }
307
310
 
308
311
  // Track baseDir for MCP subprocess communication
309
- const baseDir = config.baseDir ?? path.join(os.homedir(), '.multiagent');
312
+ const baseDir = config.baseDir ?? DEFAULT_BASE_DIR;
310
313
 
311
314
  // Get peer visibility config (default is restrictive)
312
315
  const peerVisibility: PeerVisibilityConfig =
@@ -380,7 +383,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
380
383
 
381
384
  // Register in namespace for discovery
382
385
  registerInstance(
383
- config.baseDir ?? path.join(os.homedir(), '.multiagent'),
386
+ config.baseDir ?? DEFAULT_BASE_DIR,
384
387
  namespace,
385
388
  instanceId,
386
389
  { label: config.label }
@@ -521,24 +524,56 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
521
524
  }
522
525
 
523
526
  /**
524
- * Update an agent's plan entries (persisted to SQLite via TinyBase)
527
+ * Update agent metadata fields (name, plan, metadata).
528
+ * Only provided fields are updated. Metadata is shallow-merged with existing.
525
529
  */
526
- function updateAgentPlan(
530
+ function updateAgentMetadata(
527
531
  agentId: AgentId,
528
- plan: Array<{ content: string; priority: string; status: string }>,
532
+ updates: AgentMetadataUpdate,
529
533
  ): void {
530
534
  const row = store.getRow('agents', agentId);
531
535
  if (!row.id) return;
532
536
 
533
- store.setPartialRow('agents', agentId, {
534
- plan: JSON.stringify(plan),
537
+ const partial: Record<string, string | number | boolean> = {
535
538
  last_activity_at: Date.now(),
536
- });
539
+ };
540
+
541
+ if (updates.name !== undefined) {
542
+ partial.name = updates.name;
543
+ }
544
+ if (updates.plan !== undefined) {
545
+ partial.plan = JSON.stringify(updates.plan);
546
+ }
547
+ if (updates.metadata !== undefined) {
548
+ // Shallow merge with existing metadata
549
+ const existing = row.metadata ? JSON.parse(row.metadata as string) : {};
550
+ partial.metadata = JSON.stringify({ ...existing, ...updates.metadata });
551
+ }
552
+ if (updates.team_instance !== undefined) {
553
+ partial.team_instance = updates.team_instance;
554
+ }
555
+ if (updates.cwd !== undefined) {
556
+ partial.cwd = updates.cwd;
557
+ }
558
+
559
+ store.setPartialRow('agents', agentId, partial);
537
560
 
538
561
  const agent = rowToAgent(store.getRow('agents', agentId));
539
562
  notifyAgentChange(agentId, agent);
540
563
  }
541
564
 
565
+ /**
566
+ * Update an agent's plan entries (persisted to SQLite via TinyBase).
567
+ * Convenience wrapper around updateAgentMetadata.
568
+ */
569
+ function updateAgentPlan(
570
+ agentId: AgentId,
571
+ plan: Array<{ content: string; priority: string; status: string }>,
572
+ ): void {
573
+ updateAgentMetadata(agentId, { plan });
574
+ }
575
+
576
+
542
577
  /**
543
578
  * Get task by ID
544
579
  */
@@ -947,8 +982,18 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
947
982
  */
948
983
  async function close(): Promise<void> {
949
984
  if (persister) {
985
+ // Stop auto-save first to prevent race conditions between
986
+ // auto-save callbacks and the explicit save/destroy sequence.
987
+ await persister.stopAutoSave();
950
988
  await persister.save();
989
+ // Destroy the persister (removes store listeners) BEFORE closing the DB.
990
+ // The destroy callback is a no-op — we close the DB ourselves below
991
+ // after giving TinyBase's internal async queues time to drain.
951
992
  persister.destroy();
993
+ // Allow any in-flight TinyBase microtasks to settle before closing
994
+ // the database connection. Without this, pending writes from store
995
+ // change listeners can race against db.close().
996
+ await new Promise(resolve => setTimeout(resolve, 50));
952
997
  }
953
998
  if (db) {
954
999
  db.close();
@@ -1224,6 +1269,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
1224
1269
  getAgent,
1225
1270
  listAgents,
1226
1271
  updateAgentPlan,
1272
+ updateAgentMetadata,
1227
1273
  getTask,
1228
1274
  listTasks,
1229
1275
  getMessages,
@@ -1291,13 +1337,21 @@ function initializeTables(store: Store): void {
1291
1337
  */
1292
1338
  function rebuildViews(store: Store): void {
1293
1339
  // Preserve out-of-band agent fields that aren't derived from events.
1294
- // `plan` is written directly via updateAgentPlan(), not through events,
1295
- // so it would be lost when we clear and replay.
1296
- const savedAgentPlan = new Map<string, string>();
1340
+ // These fields are written directly (not through events),
1341
+ // so they would be lost when we clear and replay.
1342
+ const OUT_OF_BAND_FIELDS = ['plan', 'name', 'metadata', 'cwd', 'team_instance'] as const;
1343
+ const savedOutOfBand = new Map<string, Record<string, string>>();
1297
1344
  for (const rowId of store.getRowIds('agents')) {
1298
1345
  const row = store.getRow('agents', rowId);
1299
- if (row.plan && row.plan !== '[]') {
1300
- savedAgentPlan.set(rowId, row.plan as string);
1346
+ const saved: Record<string, string> = {};
1347
+ for (const field of OUT_OF_BAND_FIELDS) {
1348
+ const val = row[field] as string | undefined;
1349
+ if (val && val !== '' && val !== '[]') {
1350
+ saved[field] = val;
1351
+ }
1352
+ }
1353
+ if (Object.keys(saved).length > 0) {
1354
+ savedOutOfBand.set(rowId, saved);
1301
1355
  }
1302
1356
  }
1303
1357
 
@@ -1358,10 +1412,10 @@ function rebuildViews(store: Store): void {
1358
1412
  }
1359
1413
 
1360
1414
  // Restore out-of-band agent fields preserved before the wipe
1361
- for (const [agentId, plan] of savedAgentPlan) {
1415
+ for (const [agentId, fields] of savedOutOfBand) {
1362
1416
  const row = store.getRow('agents', agentId);
1363
1417
  if (row.id) {
1364
- store.setPartialRow('agents', agentId, { plan });
1418
+ store.setPartialRow('agents', agentId, fields);
1365
1419
  }
1366
1420
  }
1367
1421
  }
@@ -1383,8 +1437,8 @@ function applyEventToViews(
1383
1437
  case 'spawn':
1384
1438
  applySpawnEvent(store, event, notifyAgentChange);
1385
1439
  break;
1386
- case 'terminate':
1387
- applyTerminateEvent(store, event, notifyAgentChange);
1440
+ case 'stop':
1441
+ applyStopEvent(store, event, notifyAgentChange);
1388
1442
  break;
1389
1443
  case 'status':
1390
1444
  applyStatusEvent(store, event, notifyAgentChange);
@@ -1431,6 +1485,7 @@ function applySpawnEvent(
1431
1485
  task_id?: TaskId;
1432
1486
  parent?: AgentId | null;
1433
1487
  role?: string;
1488
+ team_instance?: string;
1434
1489
  config?: Record<string, unknown>;
1435
1490
  cwd?: string;
1436
1491
  };
@@ -1451,6 +1506,7 @@ function applySpawnEvent(
1451
1506
 
1452
1507
  store.setRow('agents', agentId, {
1453
1508
  id: agentId,
1509
+ name: '',
1454
1510
  session_id: payload.session_id,
1455
1511
  provider_session_id: '',
1456
1512
  parent: parent ?? '',
@@ -1460,9 +1516,11 @@ function applySpawnEvent(
1460
1516
  task: payload.task,
1461
1517
  task_id: payload.task_id ?? '',
1462
1518
  role: payload.role ?? '',
1519
+ team_instance: payload.team_instance ?? '',
1463
1520
  config: JSON.stringify(payload.config ?? {}),
1464
1521
  cwd: payload.cwd ?? process.cwd(),
1465
1522
  plan: '[]',
1523
+ metadata: '',
1466
1524
  created_at: event.timestamp,
1467
1525
  started_at: 0,
1468
1526
  stopped_at: 0,
@@ -1474,9 +1532,9 @@ function applySpawnEvent(
1474
1532
  }
1475
1533
 
1476
1534
  /**
1477
- * Apply terminate event to agents view
1535
+ * Apply stop event to agents view
1478
1536
  */
1479
- function applyTerminateEvent(
1537
+ function applyStopEvent(
1480
1538
  store: Store,
1481
1539
  event: Event,
1482
1540
  notify: (agentId: AgentId, agent: Agent | null) => void,
@@ -1618,6 +1676,7 @@ function applyTaskEvent(
1618
1676
  description: string;
1619
1677
  parent_task?: TaskId;
1620
1678
  inputs?: Record<string, unknown>;
1679
+ tags?: string[];
1621
1680
  retryPolicy?: unknown;
1622
1681
  };
1623
1682
  store.setRow('tasks', taskId, {
@@ -1628,6 +1687,7 @@ function applyTaskEvent(
1628
1687
  parent_task: details.parent_task ?? '',
1629
1688
  subtasks: JSON.stringify([]),
1630
1689
  blockers: JSON.stringify([]),
1690
+ tags: details.tags ? JSON.stringify(details.tags) : '',
1631
1691
  created_at: event.timestamp,
1632
1692
  started_at: 0,
1633
1693
  completed_at: 0,
@@ -1674,10 +1734,15 @@ function applyTaskEvent(
1674
1734
  break;
1675
1735
  }
1676
1736
  }
1677
- store.setPartialRow('tasks', taskId, {
1737
+ const updates: Record<string, string | number | boolean> = {
1678
1738
  assigned_agent: '',
1679
1739
  agent_history: JSON.stringify(history),
1680
- });
1740
+ };
1741
+ // Reset to pending if task was only assigned (not yet started)
1742
+ if (existing.status === 'assigned') {
1743
+ updates.status = 'pending';
1744
+ }
1745
+ store.setPartialRow('tasks', taskId, updates);
1681
1746
  break;
1682
1747
  }
1683
1748
  case 'status_change': {
@@ -1800,6 +1865,7 @@ function rowToAgent(row: Record<string, unknown>): Agent {
1800
1865
  const stopReason = row.stop_reason as string;
1801
1866
  return {
1802
1867
  id: row.id as AgentId,
1868
+ name: (row.name as string) || undefined,
1803
1869
  session_id: row.session_id as string,
1804
1870
  provider_session_id: (row.provider_session_id as string) || undefined,
1805
1871
  parent: (row.parent as string) || null,
@@ -1809,9 +1875,11 @@ function rowToAgent(row: Record<string, unknown>): Agent {
1809
1875
  task: row.task as string,
1810
1876
  task_id: (row.task_id as string) || undefined,
1811
1877
  role: (row.role as string) || undefined,
1878
+ team_instance: (row.team_instance as string) || undefined,
1812
1879
  config: row.config ? JSON.parse(row.config as string) : {},
1813
1880
  cwd: (row.cwd as string) || process.cwd(),
1814
1881
  plan: row.plan ? JSON.parse(row.plan as string) : [],
1882
+ metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,
1815
1883
  created_at: row.created_at as Timestamp,
1816
1884
  started_at: (row.started_at as number) || undefined,
1817
1885
  stopped_at: (row.stopped_at as number) || undefined,
@@ -1839,6 +1907,7 @@ function rowToTask(row: Record<string, unknown>): Task {
1839
1907
  outputs: row.outputs ? JSON.parse(row.outputs as string) : undefined,
1840
1908
  artifacts: row.artifacts ? JSON.parse(row.artifacts as string) : undefined,
1841
1909
  agent_history: row.agent_history ? JSON.parse(row.agent_history as string) : undefined,
1910
+ tags: row.tags ? JSON.parse(row.tags as string) : undefined,
1842
1911
  retryPolicy: row.retry_policy ? JSON.parse(row.retry_policy as string) : undefined,
1843
1912
  retryState: row.retry_state ? JSON.parse(row.retry_state as string) : undefined,
1844
1913
  };
@@ -221,8 +221,8 @@ export interface ResolvedInstance {
221
221
  // Constants
222
222
  // ─────────────────────────────────────────────────────────────────────────────
223
223
 
224
- /** Default base directory */
225
- export const DEFAULT_BASE_DIR = path.join(os.homedir(), '.multiagent');
224
+ /** Default base directory (override with MACRO_AGENT_HOME env var) */
225
+ export const DEFAULT_BASE_DIR = process.env.MACRO_AGENT_HOME || path.join(os.homedir(), '.multiagent');
226
226
 
227
227
  /** Default namespace */
228
228
  export const DEFAULT_NAMESPACE = 'default';
@@ -28,6 +28,8 @@ export interface AgentConfig {
28
28
  // Agent record in materialized view
29
29
  export interface Agent {
30
30
  id: AgentId;
31
+ /** Optional display name (set via rename, not derived from events) */
32
+ name?: string;
31
33
  session_id: SessionId;
32
34
  /** Session ID from the underlying agent provider (e.g., Claude Code UUID for --resume) */
33
35
  provider_session_id?: string;
@@ -38,12 +40,30 @@ export interface Agent {
38
40
  task: string;
39
41
  task_id?: TaskId;
40
42
  role?: string;
43
+ /** Team instance ID this agent belongs to (set by TeamManager) */
44
+ team_instance?: string;
41
45
  config: AgentConfig;
42
46
  cwd: string;
43
47
  plan: Array<{ content: string; priority: string; status: string }>;
48
+ /** Arbitrary metadata (persisted out-of-band, not derived from events) */
49
+ metadata?: Record<string, unknown>;
44
50
  created_at: Timestamp;
45
51
  started_at?: Timestamp;
46
52
  stopped_at?: Timestamp;
47
53
  /** Last time this agent emitted an event (for health monitoring) */
48
54
  last_activity_at?: Timestamp;
49
55
  }
56
+
57
+ /**
58
+ * Partial update for agent metadata fields.
59
+ * All fields are optional — only provided fields are updated.
60
+ * `metadata` is merged (shallow) with existing metadata.
61
+ */
62
+ export interface AgentMetadataUpdate {
63
+ name?: string;
64
+ plan?: Array<{ content: string; priority: string; status: string }>;
65
+ metadata?: Record<string, unknown>;
66
+ team_instance?: string;
67
+ /** Override the agent's working directory (e.g., to workspace worktree path) */
68
+ cwd?: string;
69
+ }
@@ -11,7 +11,7 @@ export const CURRENT_EVENT_VERSION = 1;
11
11
  // Event types
12
12
  export type EventType =
13
13
  | "spawn"
14
- | "terminate"
14
+ | "stop"
15
15
  | "status"
16
16
  | "message"
17
17
  | "task"