macro-agent 0.1.2 → 0.1.4

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 (1540) hide show
  1. package/.gitattributes +3 -0
  2. package/.opentasks/config.json +9 -0
  3. package/CLAUDE.md +432 -206
  4. package/README.md +129 -371
  5. package/dist/acp/index.d.ts +9 -51
  6. package/dist/acp/index.d.ts.map +1 -1
  7. package/dist/acp/index.js +5 -46
  8. package/dist/acp/index.js.map +1 -1
  9. package/dist/acp/macro-agent.d.ts +28 -255
  10. package/dist/acp/macro-agent.d.ts.map +1 -1
  11. package/dist/acp/macro-agent.js +593 -1231
  12. package/dist/acp/macro-agent.js.map +1 -1
  13. package/dist/acp/map-bridge.d.ts +62 -0
  14. package/dist/acp/map-bridge.d.ts.map +1 -0
  15. package/dist/acp/map-bridge.js +123 -0
  16. package/dist/acp/map-bridge.js.map +1 -0
  17. package/dist/acp/session-mapper.d.ts +29 -126
  18. package/dist/acp/session-mapper.d.ts.map +1 -1
  19. package/dist/acp/session-mapper.js +36 -234
  20. package/dist/acp/session-mapper.js.map +1 -1
  21. package/dist/acp/types.d.ts +24 -535
  22. package/dist/acp/types.d.ts.map +1 -1
  23. package/dist/acp/types.js +7 -7
  24. package/dist/acp/types.js.map +1 -1
  25. package/dist/acp/websocket-server.d.ts +16 -136
  26. package/dist/acp/websocket-server.d.ts.map +1 -1
  27. package/dist/acp/websocket-server.js +131 -371
  28. package/dist/acp/websocket-server.js.map +1 -1
  29. package/dist/adapters/federation.d.ts +76 -0
  30. package/dist/adapters/federation.d.ts.map +1 -0
  31. package/dist/adapters/federation.js +120 -0
  32. package/dist/adapters/federation.js.map +1 -0
  33. package/dist/adapters/inbox-adapter.d.ts +72 -0
  34. package/dist/adapters/inbox-adapter.d.ts.map +1 -0
  35. package/dist/adapters/inbox-adapter.js +196 -0
  36. package/dist/adapters/inbox-adapter.js.map +1 -0
  37. package/dist/adapters/inbox-client-adapter.d.ts +40 -0
  38. package/dist/adapters/inbox-client-adapter.d.ts.map +1 -0
  39. package/dist/adapters/inbox-client-adapter.js +135 -0
  40. package/dist/adapters/inbox-client-adapter.js.map +1 -0
  41. package/dist/adapters/index.d.ts +11 -0
  42. package/dist/adapters/index.d.ts.map +1 -0
  43. package/dist/adapters/index.js +10 -0
  44. package/dist/adapters/index.js.map +1 -0
  45. package/dist/adapters/opentasks-daemon.d.ts +32 -0
  46. package/dist/adapters/opentasks-daemon.d.ts.map +1 -0
  47. package/dist/adapters/opentasks-daemon.js +190 -0
  48. package/dist/adapters/opentasks-daemon.js.map +1 -0
  49. package/dist/adapters/tasks-adapter.d.ts +49 -0
  50. package/dist/adapters/tasks-adapter.d.ts.map +1 -0
  51. package/dist/adapters/tasks-adapter.js +209 -0
  52. package/dist/adapters/tasks-adapter.js.map +1 -0
  53. package/dist/adapters/types.d.ts +198 -0
  54. package/dist/adapters/types.d.ts.map +1 -0
  55. package/dist/adapters/types.js +13 -0
  56. package/dist/adapters/types.js.map +1 -0
  57. package/dist/agent/agent-manager-v2.d.ts +38 -0
  58. package/dist/agent/agent-manager-v2.d.ts.map +1 -0
  59. package/dist/agent/agent-manager-v2.js +1097 -0
  60. package/dist/agent/agent-manager-v2.js.map +1 -0
  61. package/dist/agent/agent-manager.d.ts +52 -42
  62. package/dist/agent/agent-manager.d.ts.map +1 -1
  63. package/dist/agent/agent-manager.js +11 -1318
  64. package/dist/agent/agent-manager.js.map +1 -1
  65. package/dist/agent/agent-store.d.ts +89 -0
  66. package/dist/agent/agent-store.d.ts.map +1 -0
  67. package/dist/agent/agent-store.js +279 -0
  68. package/dist/agent/agent-store.js.map +1 -0
  69. package/dist/api/index.d.ts +5 -3
  70. package/dist/api/index.d.ts.map +1 -1
  71. package/dist/api/index.js +4 -3
  72. package/dist/api/index.js.map +1 -1
  73. package/dist/api/server.d.ts +6 -127
  74. package/dist/api/server.d.ts.map +1 -1
  75. package/dist/api/server.js +235 -1574
  76. package/dist/api/server.js.map +1 -1
  77. package/dist/api/types.d.ts +20 -248
  78. package/dist/api/types.d.ts.map +1 -1
  79. package/dist/api/types.js +3 -1
  80. package/dist/api/types.js.map +1 -1
  81. package/dist/boot-v2.d.ts +165 -0
  82. package/dist/boot-v2.d.ts.map +1 -0
  83. package/dist/boot-v2.js +315 -0
  84. package/dist/boot-v2.js.map +1 -0
  85. package/dist/cli/acp.d.ts +6 -28
  86. package/dist/cli/acp.d.ts.map +1 -1
  87. package/dist/cli/acp.js +38 -442
  88. package/dist/cli/acp.js.map +1 -1
  89. package/dist/cli/index.d.ts +1 -2
  90. package/dist/cli/index.d.ts.map +1 -1
  91. package/dist/cli/index.js +65 -453
  92. package/dist/cli/index.js.map +1 -1
  93. package/dist/cli/mcp.d.ts +18 -8
  94. package/dist/cli/mcp.d.ts.map +1 -1
  95. package/dist/cli/mcp.js +231 -301
  96. package/dist/cli/mcp.js.map +1 -1
  97. package/dist/cognitive/analyst-role.d.ts +13 -0
  98. package/dist/cognitive/analyst-role.d.ts.map +1 -0
  99. package/dist/cognitive/analyst-role.js +48 -0
  100. package/dist/cognitive/analyst-role.js.map +1 -0
  101. package/dist/cognitive/index.d.ts +18 -0
  102. package/dist/cognitive/index.d.ts.map +1 -0
  103. package/dist/cognitive/index.js +21 -0
  104. package/dist/cognitive/index.js.map +1 -0
  105. package/dist/cognitive/macro-agent-backend.d.ts +40 -0
  106. package/dist/cognitive/macro-agent-backend.d.ts.map +1 -0
  107. package/dist/cognitive/macro-agent-backend.js +290 -0
  108. package/dist/cognitive/macro-agent-backend.js.map +1 -0
  109. package/dist/cognitive/session-converter.d.ts +30 -0
  110. package/dist/cognitive/session-converter.d.ts.map +1 -0
  111. package/dist/cognitive/session-converter.js +119 -0
  112. package/dist/cognitive/session-converter.js.map +1 -0
  113. package/dist/cognitive/types.d.ts +129 -0
  114. package/dist/cognitive/types.d.ts.map +1 -0
  115. package/dist/cognitive/types.js +12 -0
  116. package/dist/cognitive/types.js.map +1 -0
  117. package/dist/cognitive/workspace-handler.d.ts +38 -0
  118. package/dist/cognitive/workspace-handler.d.ts.map +1 -0
  119. package/dist/cognitive/workspace-handler.js +136 -0
  120. package/dist/cognitive/workspace-handler.js.map +1 -0
  121. package/dist/control/control-client.d.ts +63 -0
  122. package/dist/control/control-client.d.ts.map +1 -0
  123. package/dist/control/control-client.js +276 -0
  124. package/dist/control/control-client.js.map +1 -0
  125. package/dist/control/control-server.d.ts +46 -0
  126. package/dist/control/control-server.d.ts.map +1 -0
  127. package/dist/control/control-server.js +237 -0
  128. package/dist/control/control-server.js.map +1 -0
  129. package/dist/control/index.d.ts +9 -0
  130. package/dist/control/index.d.ts.map +1 -0
  131. package/dist/control/index.js +8 -0
  132. package/dist/control/index.js.map +1 -0
  133. package/dist/control/types.d.ts +64 -0
  134. package/dist/control/types.d.ts.map +1 -0
  135. package/dist/control/types.js +10 -0
  136. package/dist/control/types.js.map +1 -0
  137. package/dist/index.d.ts +14 -16
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +15 -34
  140. package/dist/index.js.map +1 -1
  141. package/dist/integrations/context-builder.d.ts +49 -0
  142. package/dist/integrations/context-builder.d.ts.map +1 -0
  143. package/dist/integrations/context-builder.js +160 -0
  144. package/dist/integrations/context-builder.js.map +1 -0
  145. package/dist/integrations/sessionlog.d.ts +58 -0
  146. package/dist/integrations/sessionlog.d.ts.map +1 -0
  147. package/dist/integrations/sessionlog.js +152 -0
  148. package/dist/integrations/sessionlog.js.map +1 -0
  149. package/dist/integrations/skilltree.d.ts +53 -0
  150. package/dist/integrations/skilltree.d.ts.map +1 -0
  151. package/dist/integrations/skilltree.js +140 -0
  152. package/dist/integrations/skilltree.js.map +1 -0
  153. package/dist/lifecycle/cleanup.d.ts +5 -14
  154. package/dist/lifecycle/cleanup.d.ts.map +1 -1
  155. package/dist/lifecycle/cleanup.js +4 -34
  156. package/dist/lifecycle/cleanup.js.map +1 -1
  157. package/dist/lifecycle/handlers-v2.d.ts +33 -0
  158. package/dist/lifecycle/handlers-v2.d.ts.map +1 -0
  159. package/dist/lifecycle/handlers-v2.js +319 -0
  160. package/dist/lifecycle/handlers-v2.js.map +1 -0
  161. package/dist/lifecycle/index.d.ts +3 -5
  162. package/dist/lifecycle/index.d.ts.map +1 -1
  163. package/dist/lifecycle/index.js +3 -12
  164. package/dist/lifecycle/index.js.map +1 -1
  165. package/dist/map/acp-bridge.d.ts +39 -0
  166. package/dist/map/acp-bridge.d.ts.map +1 -0
  167. package/dist/map/acp-bridge.js +180 -0
  168. package/dist/map/acp-bridge.js.map +1 -0
  169. package/dist/map/cc-swarm-hooks.d.ts +36 -0
  170. package/dist/map/cc-swarm-hooks.d.ts.map +1 -0
  171. package/dist/map/cc-swarm-hooks.js +218 -0
  172. package/dist/map/cc-swarm-hooks.js.map +1 -0
  173. package/dist/map/coordination-handler.d.ts +36 -0
  174. package/dist/map/coordination-handler.d.ts.map +1 -0
  175. package/dist/map/coordination-handler.js +170 -0
  176. package/dist/map/coordination-handler.js.map +1 -0
  177. package/dist/map/index.d.ts +5 -10
  178. package/dist/map/index.d.ts.map +1 -1
  179. package/dist/map/index.js +4 -13
  180. package/dist/map/index.js.map +1 -1
  181. package/dist/map/lifecycle-bridge.d.ts +34 -0
  182. package/dist/map/lifecycle-bridge.d.ts.map +1 -0
  183. package/dist/map/lifecycle-bridge.js +96 -0
  184. package/dist/map/lifecycle-bridge.js.map +1 -0
  185. package/dist/map/server.d.ts +38 -0
  186. package/dist/map/server.d.ts.map +1 -0
  187. package/dist/map/server.js +461 -0
  188. package/dist/map/server.js.map +1 -0
  189. package/dist/map/sidecar.d.ts +24 -0
  190. package/dist/map/sidecar.d.ts.map +1 -0
  191. package/dist/map/sidecar.js +277 -0
  192. package/dist/map/sidecar.js.map +1 -0
  193. package/dist/map/task-bridge.d.ts +22 -0
  194. package/dist/map/task-bridge.d.ts.map +1 -0
  195. package/dist/map/task-bridge.js +67 -0
  196. package/dist/map/task-bridge.js.map +1 -0
  197. package/dist/map/trajectory-reporter.d.ts +24 -0
  198. package/dist/map/trajectory-reporter.d.ts.map +1 -0
  199. package/dist/map/trajectory-reporter.js +86 -0
  200. package/dist/map/trajectory-reporter.js.map +1 -0
  201. package/dist/map/types.d.ts +162 -226
  202. package/dist/map/types.d.ts.map +1 -1
  203. package/dist/map/types.js +6 -165
  204. package/dist/map/types.js.map +1 -1
  205. package/dist/mcp/index.d.ts +2 -2
  206. package/dist/mcp/index.d.ts.map +1 -1
  207. package/dist/mcp/index.js +2 -2
  208. package/dist/mcp/index.js.map +1 -1
  209. package/dist/mcp/mcp-server-v2.d.ts +44 -0
  210. package/dist/mcp/mcp-server-v2.d.ts.map +1 -0
  211. package/dist/mcp/mcp-server-v2.js +376 -0
  212. package/dist/mcp/mcp-server-v2.js.map +1 -0
  213. package/dist/mcp/tools/done-v2.d.ts +57 -0
  214. package/dist/mcp/tools/done-v2.d.ts.map +1 -0
  215. package/dist/mcp/tools/done-v2.js +129 -0
  216. package/dist/mcp/tools/done-v2.js.map +1 -0
  217. package/dist/metrics/index.d.ts +7 -1
  218. package/dist/metrics/index.d.ts.map +1 -1
  219. package/dist/metrics/index.js +6 -1
  220. package/dist/metrics/index.js.map +1 -1
  221. package/dist/metrics/metrics.d.ts +9 -70
  222. package/dist/metrics/metrics.d.ts.map +1 -1
  223. package/dist/metrics/metrics.js +89 -145
  224. package/dist/metrics/metrics.js.map +1 -1
  225. package/dist/metrics/types.d.ts +44 -0
  226. package/dist/metrics/types.d.ts.map +1 -0
  227. package/dist/metrics/types.js +7 -0
  228. package/dist/metrics/types.js.map +1 -0
  229. package/dist/store/index.d.ts +3 -6
  230. package/dist/store/index.d.ts.map +1 -1
  231. package/dist/store/index.js +3 -21
  232. package/dist/store/index.js.map +1 -1
  233. package/dist/store/types/events.d.ts +3 -60
  234. package/dist/store/types/events.d.ts.map +1 -1
  235. package/dist/store/types/events.js +3 -46
  236. package/dist/store/types/events.js.map +1 -1
  237. package/dist/store/types/index.d.ts +0 -3
  238. package/dist/store/types/index.d.ts.map +1 -1
  239. package/dist/store/types/index.js +0 -3
  240. package/dist/store/types/index.js.map +1 -1
  241. package/dist/teams/index.d.ts +0 -2
  242. package/dist/teams/index.d.ts.map +1 -1
  243. package/dist/teams/index.js +0 -2
  244. package/dist/teams/index.js.map +1 -1
  245. package/dist/teams/team-manager-v2.d.ts +87 -0
  246. package/dist/teams/team-manager-v2.d.ts.map +1 -0
  247. package/dist/teams/team-manager-v2.js +203 -0
  248. package/dist/teams/team-manager-v2.js.map +1 -0
  249. package/dist/teams/team-runtime-v2.d.ts +149 -0
  250. package/dist/teams/team-runtime-v2.d.ts.map +1 -0
  251. package/dist/teams/team-runtime-v2.js +741 -0
  252. package/dist/teams/team-runtime-v2.js.map +1 -0
  253. package/dist/trigger/index.d.ts +2 -2
  254. package/dist/trigger/index.d.ts.map +1 -1
  255. package/dist/trigger/index.js +4 -4
  256. package/dist/trigger/index.js.map +1 -1
  257. package/dist/trigger/sources/cron/cron-service.d.ts +1 -1
  258. package/dist/trigger/sources/cron/cron-service.d.ts.map +1 -1
  259. package/dist/trigger/sources/webhook/webhook-handler.d.ts +1 -1
  260. package/dist/trigger/sources/webhook/webhook-handler.d.ts.map +1 -1
  261. package/dist/trigger/strategies/ai-router.d.ts +31 -0
  262. package/dist/trigger/strategies/ai-router.d.ts.map +1 -0
  263. package/dist/trigger/strategies/ai-router.js +132 -0
  264. package/dist/trigger/strategies/ai-router.js.map +1 -0
  265. package/dist/trigger/trigger-system-v2.d.ts +106 -0
  266. package/dist/trigger/trigger-system-v2.d.ts.map +1 -0
  267. package/dist/trigger/trigger-system-v2.js +347 -0
  268. package/dist/trigger/trigger-system-v2.js.map +1 -0
  269. package/dist/trigger/types.d.ts +8 -0
  270. package/dist/trigger/types.d.ts.map +1 -1
  271. package/dist/trigger/types.js.map +1 -1
  272. package/dist/workspace/strategies/optimistic.d.ts +13 -3
  273. package/dist/workspace/strategies/optimistic.d.ts.map +1 -1
  274. package/dist/workspace/strategies/optimistic.js +4 -4
  275. package/dist/workspace/strategies/optimistic.js.map +1 -1
  276. package/docs/design-subsystem-extraction.md +627 -0
  277. package/docs/lifecycle-events-design.md +111 -0
  278. package/docs/openhive-capability-summary.md +415 -0
  279. package/docs/openhive-integration.md +415 -0
  280. package/docs/roadmap-v2-gaps.md +216 -0
  281. package/package.json +27 -7
  282. package/src/__tests__/boot-v2.test.ts +196 -0
  283. package/src/__tests__/e2e/acp-over-map-live.e2e.test.ts +496 -0
  284. package/src/__tests__/e2e/acp-over-map.e2e.test.ts +365 -0
  285. package/src/__tests__/e2e/agent-lifecycle.e2e.test.ts +770 -0
  286. package/src/__tests__/e2e/cc-swarm-bridge.e2e.test.ts +253 -0
  287. package/src/__tests__/e2e/cognitive-workspace.e2e.test.ts +282 -0
  288. package/src/__tests__/e2e/done-scenarios.e2e.test.ts +322 -0
  289. package/src/__tests__/e2e/live-agent.e2e.test.ts +1330 -0
  290. package/src/__tests__/e2e/map-server.e2e.test.ts +128 -0
  291. package/src/__tests__/e2e/map-sidecar.e2e.test.ts +139 -0
  292. package/src/__tests__/e2e/opentasks-integration.e2e.test.ts +280 -0
  293. package/src/__tests__/e2e/pull-mode.e2e.test.ts +632 -0
  294. package/src/__tests__/e2e/resume-continue.e2e.test.ts +312 -0
  295. package/src/__tests__/e2e/swarmkit-integration.e2e.test.ts +562 -0
  296. package/src/__tests__/e2e/swarmkit-live.e2e.test.ts +1049 -0
  297. package/src/__tests__/e2e/trajectory-tracking.e2e.test.ts +258 -0
  298. package/src/__tests__/e2e/trigger-wake.e2e.test.ts +257 -0
  299. package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +375 -0
  300. package/src/acp/__tests__/macro-agent.test.ts +234 -945
  301. package/src/acp/__tests__/session-mapper.test.ts +82 -155
  302. package/src/acp/__tests__/websocket-server.test.ts +121 -270
  303. package/src/acp/index.ts +18 -118
  304. package/src/acp/macro-agent.ts +692 -1752
  305. package/src/acp/map-bridge.ts +193 -0
  306. package/src/acp/session-mapper.ts +43 -276
  307. package/src/acp/types.ts +39 -767
  308. package/src/acp/websocket-server.ts +152 -588
  309. package/src/adapters/__tests__/federation.test.ts +256 -0
  310. package/src/adapters/__tests__/inbox-adapter.test.ts +316 -0
  311. package/src/adapters/__tests__/tasks-adapter.test.ts +269 -0
  312. package/src/adapters/federation.ts +185 -0
  313. package/src/adapters/inbox-adapter.ts +292 -0
  314. package/src/adapters/inbox-client-adapter.ts +173 -0
  315. package/src/adapters/index.ts +44 -0
  316. package/src/adapters/opentasks-daemon.ts +252 -0
  317. package/src/adapters/tasks-adapter.ts +327 -0
  318. package/src/adapters/types.ts +285 -0
  319. package/src/agent/__tests__/agent-manager-v2.test.ts +554 -0
  320. package/src/agent/__tests__/agent-store.test.ts +413 -0
  321. package/src/agent/agent-manager-v2.ts +1476 -0
  322. package/src/agent/agent-manager.ts +41 -1794
  323. package/src/agent/agent-store.ts +385 -0
  324. package/src/api/__tests__/server.test.ts +235 -1157
  325. package/src/api/index.ts +5 -3
  326. package/src/api/server.ts +270 -1989
  327. package/src/api/types.ts +25 -339
  328. package/src/boot-v2.ts +527 -0
  329. package/src/cli/acp.ts +38 -500
  330. package/src/cli/index.ts +68 -470
  331. package/src/cli/mcp.ts +260 -340
  332. package/src/cognitive/__tests__/macro-agent-backend.test.ts +478 -0
  333. package/src/cognitive/__tests__/session-converter.test.ts +423 -0
  334. package/src/cognitive/__tests__/workspace-handler.test.ts +221 -0
  335. package/src/cognitive/analyst-role.ts +59 -0
  336. package/src/cognitive/index.ts +49 -0
  337. package/src/cognitive/macro-agent-backend.ts +354 -0
  338. package/src/cognitive/session-converter.ts +151 -0
  339. package/src/cognitive/types.ts +163 -0
  340. package/src/cognitive/workspace-handler.ts +160 -0
  341. package/src/control/__tests__/control-resilience.test.ts +251 -0
  342. package/src/control/__tests__/control-socket.test.ts +240 -0
  343. package/src/control/control-client.ts +337 -0
  344. package/src/control/control-server.ts +298 -0
  345. package/src/control/index.ts +17 -0
  346. package/src/control/types.ts +95 -0
  347. package/src/index.ts +42 -224
  348. package/src/integrations/__tests__/context-builder.test.ts +218 -0
  349. package/src/integrations/__tests__/sessionlog.test.ts +498 -0
  350. package/src/integrations/__tests__/skilltree.test.ts +136 -0
  351. package/src/integrations/context-builder.ts +280 -0
  352. package/src/integrations/sessionlog.ts +194 -0
  353. package/src/integrations/skilltree.ts +183 -0
  354. package/src/lifecycle/__tests__/handlers-v2.test.ts +565 -0
  355. package/src/lifecycle/cleanup.ts +6 -46
  356. package/src/lifecycle/handlers-v2.ts +437 -0
  357. package/src/lifecycle/index.ts +2 -28
  358. package/src/map/__tests__/lifecycle-bridge.test.ts +223 -0
  359. package/src/map/__tests__/permission-forwarding.test.ts +143 -0
  360. package/src/map/__tests__/sidecar-integration.test.ts +190 -0
  361. package/src/map/__tests__/task-bridge.test.ts +153 -0
  362. package/src/map/__tests__/trajectory-reporter.test.ts +173 -0
  363. package/src/map/acp-bridge.ts +270 -0
  364. package/src/map/cc-swarm-hooks.ts +242 -0
  365. package/src/map/coordination-handler.ts +224 -0
  366. package/src/map/index.ts +13 -14
  367. package/src/map/lifecycle-bridge.ts +140 -0
  368. package/src/map/server.ts +527 -0
  369. package/src/map/sidecar.ts +331 -0
  370. package/src/map/task-bridge.ts +89 -0
  371. package/src/map/trajectory-reporter.ts +124 -0
  372. package/src/map/types.ts +195 -367
  373. package/src/mcp/__tests__/mcp-server-v2.test.ts +236 -0
  374. package/src/mcp/index.ts +2 -2
  375. package/src/mcp/mcp-server-v2.ts +485 -0
  376. package/src/mcp/tools/done-v2.ts +203 -0
  377. package/src/metrics/__tests__/metrics.test.ts +205 -0
  378. package/src/metrics/index.ts +13 -9
  379. package/src/metrics/metrics.ts +110 -239
  380. package/src/metrics/types.ts +63 -0
  381. package/src/store/index.ts +3 -64
  382. package/src/store/types/events.ts +5 -100
  383. package/src/store/types/index.ts +0 -3
  384. package/src/teams/__tests__/team-manager-v2.test.ts +425 -0
  385. package/src/teams/__tests__/team-runtime-v2.test.ts +402 -0
  386. package/src/teams/index.ts +0 -2
  387. package/src/teams/team-manager-v2.ts +268 -0
  388. package/src/teams/team-runtime-v2.ts +898 -0
  389. package/src/trigger/__tests__/trigger-system-v2.test.ts +257 -0
  390. package/src/trigger/index.ts +16 -31
  391. package/src/trigger/sources/cron/cron-service.ts +1 -1
  392. package/src/trigger/sources/webhook/webhook-handler.ts +1 -1
  393. package/src/trigger/strategies/ai-router.ts +170 -0
  394. package/src/trigger/trigger-system-v2.ts +536 -0
  395. package/src/trigger/types.ts +13 -0
  396. package/src/workspace/strategies/optimistic.ts +9 -6
  397. package/.claude/settings.local.json +0 -61
  398. package/dist/acp/websocket-stream.d.ts +0 -30
  399. package/dist/acp/websocket-stream.d.ts.map +0 -1
  400. package/dist/acp/websocket-stream.js +0 -118
  401. package/dist/acp/websocket-stream.js.map +0 -1
  402. package/dist/activity/deduplication.d.ts +0 -85
  403. package/dist/activity/deduplication.d.ts.map +0 -1
  404. package/dist/activity/deduplication.js +0 -149
  405. package/dist/activity/deduplication.js.map +0 -1
  406. package/dist/activity/index.d.ts +0 -16
  407. package/dist/activity/index.d.ts.map +0 -1
  408. package/dist/activity/index.js +0 -17
  409. package/dist/activity/index.js.map +0 -1
  410. package/dist/activity/relevance.d.ts +0 -81
  411. package/dist/activity/relevance.d.ts.map +0 -1
  412. package/dist/activity/relevance.js +0 -161
  413. package/dist/activity/relevance.js.map +0 -1
  414. package/dist/activity/types.d.ts +0 -169
  415. package/dist/activity/types.d.ts.map +0 -1
  416. package/dist/activity/types.js +0 -33
  417. package/dist/activity/types.js.map +0 -1
  418. package/dist/activity/watcher.d.ts +0 -64
  419. package/dist/activity/watcher.d.ts.map +0 -1
  420. package/dist/activity/watcher.js +0 -212
  421. package/dist/activity/watcher.js.map +0 -1
  422. package/dist/agent/wake.d.ts +0 -85
  423. package/dist/agent/wake.d.ts.map +0 -1
  424. package/dist/agent/wake.js +0 -278
  425. package/dist/agent/wake.js.map +0 -1
  426. package/dist/lifecycle/handlers/generic.d.ts +0 -27
  427. package/dist/lifecycle/handlers/generic.d.ts.map +0 -1
  428. package/dist/lifecycle/handlers/generic.js +0 -56
  429. package/dist/lifecycle/handlers/generic.js.map +0 -1
  430. package/dist/lifecycle/handlers/index.d.ts +0 -51
  431. package/dist/lifecycle/handlers/index.d.ts.map +0 -1
  432. package/dist/lifecycle/handlers/index.js +0 -110
  433. package/dist/lifecycle/handlers/index.js.map +0 -1
  434. package/dist/lifecycle/handlers/integrator.d.ts +0 -81
  435. package/dist/lifecycle/handlers/integrator.d.ts.map +0 -1
  436. package/dist/lifecycle/handlers/integrator.js +0 -451
  437. package/dist/lifecycle/handlers/integrator.js.map +0 -1
  438. package/dist/lifecycle/handlers/monitor.d.ts +0 -29
  439. package/dist/lifecycle/handlers/monitor.d.ts.map +0 -1
  440. package/dist/lifecycle/handlers/monitor.js +0 -79
  441. package/dist/lifecycle/handlers/monitor.js.map +0 -1
  442. package/dist/lifecycle/handlers/worker.d.ts +0 -56
  443. package/dist/lifecycle/handlers/worker.d.ts.map +0 -1
  444. package/dist/lifecycle/handlers/worker.js +0 -381
  445. package/dist/lifecycle/handlers/worker.js.map +0 -1
  446. package/dist/mail/conversation-map.d.ts +0 -33
  447. package/dist/mail/conversation-map.d.ts.map +0 -1
  448. package/dist/mail/conversation-map.js +0 -61
  449. package/dist/mail/conversation-map.js.map +0 -1
  450. package/dist/mail/index.d.ts +0 -11
  451. package/dist/mail/index.d.ts.map +0 -1
  452. package/dist/mail/index.js +0 -11
  453. package/dist/mail/index.js.map +0 -1
  454. package/dist/mail/mail-service.d.ts +0 -85
  455. package/dist/mail/mail-service.d.ts.map +0 -1
  456. package/dist/mail/mail-service.js +0 -121
  457. package/dist/mail/mail-service.js.map +0 -1
  458. package/dist/mail/stores/eventstore-conversation-store.d.ts +0 -40
  459. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +0 -1
  460. package/dist/mail/stores/eventstore-conversation-store.js +0 -131
  461. package/dist/mail/stores/eventstore-conversation-store.js.map +0 -1
  462. package/dist/mail/stores/eventstore-participant-store.d.ts +0 -43
  463. package/dist/mail/stores/eventstore-participant-store.d.ts.map +0 -1
  464. package/dist/mail/stores/eventstore-participant-store.js +0 -145
  465. package/dist/mail/stores/eventstore-participant-store.js.map +0 -1
  466. package/dist/mail/stores/eventstore-thread-store.d.ts +0 -46
  467. package/dist/mail/stores/eventstore-thread-store.d.ts.map +0 -1
  468. package/dist/mail/stores/eventstore-thread-store.js +0 -118
  469. package/dist/mail/stores/eventstore-thread-store.js.map +0 -1
  470. package/dist/mail/stores/eventstore-turn-store.d.ts +0 -47
  471. package/dist/mail/stores/eventstore-turn-store.d.ts.map +0 -1
  472. package/dist/mail/stores/eventstore-turn-store.js +0 -153
  473. package/dist/mail/stores/eventstore-turn-store.js.map +0 -1
  474. package/dist/mail/stores/index.d.ts +0 -12
  475. package/dist/mail/stores/index.d.ts.map +0 -1
  476. package/dist/mail/stores/index.js +0 -12
  477. package/dist/mail/stores/index.js.map +0 -1
  478. package/dist/mail/stores/types.d.ts +0 -146
  479. package/dist/mail/stores/types.d.ts.map +0 -1
  480. package/dist/mail/stores/types.js +0 -13
  481. package/dist/mail/stores/types.js.map +0 -1
  482. package/dist/mail/turn-recorder.d.ts +0 -30
  483. package/dist/mail/turn-recorder.d.ts.map +0 -1
  484. package/dist/mail/turn-recorder.js +0 -98
  485. package/dist/mail/turn-recorder.js.map +0 -1
  486. package/dist/map/adapter/acp-over-map.d.ts +0 -115
  487. package/dist/map/adapter/acp-over-map.d.ts.map +0 -1
  488. package/dist/map/adapter/acp-over-map.js +0 -1024
  489. package/dist/map/adapter/acp-over-map.js.map +0 -1
  490. package/dist/map/adapter/connection-manager.d.ts +0 -150
  491. package/dist/map/adapter/connection-manager.d.ts.map +0 -1
  492. package/dist/map/adapter/connection-manager.js +0 -207
  493. package/dist/map/adapter/connection-manager.js.map +0 -1
  494. package/dist/map/adapter/event-log.d.ts +0 -87
  495. package/dist/map/adapter/event-log.d.ts.map +0 -1
  496. package/dist/map/adapter/event-log.js +0 -122
  497. package/dist/map/adapter/event-log.js.map +0 -1
  498. package/dist/map/adapter/event-translator.d.ts +0 -85
  499. package/dist/map/adapter/event-translator.d.ts.map +0 -1
  500. package/dist/map/adapter/event-translator.js +0 -295
  501. package/dist/map/adapter/event-translator.js.map +0 -1
  502. package/dist/map/adapter/extensions/agent-detection.d.ts +0 -49
  503. package/dist/map/adapter/extensions/agent-detection.d.ts.map +0 -1
  504. package/dist/map/adapter/extensions/agent-detection.js +0 -91
  505. package/dist/map/adapter/extensions/agent-detection.js.map +0 -1
  506. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +0 -82
  507. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +0 -1
  508. package/dist/map/adapter/extensions/agent-lifecycle.js +0 -164
  509. package/dist/map/adapter/extensions/agent-lifecycle.js.map +0 -1
  510. package/dist/map/adapter/extensions/index.d.ts +0 -92
  511. package/dist/map/adapter/extensions/index.d.ts.map +0 -1
  512. package/dist/map/adapter/extensions/index.js +0 -214
  513. package/dist/map/adapter/extensions/index.js.map +0 -1
  514. package/dist/map/adapter/extensions/mcp-bridge.d.ts +0 -57
  515. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +0 -1
  516. package/dist/map/adapter/extensions/mcp-bridge.js +0 -745
  517. package/dist/map/adapter/extensions/mcp-bridge.js.map +0 -1
  518. package/dist/map/adapter/extensions/rename.d.ts +0 -29
  519. package/dist/map/adapter/extensions/rename.d.ts.map +0 -1
  520. package/dist/map/adapter/extensions/rename.js +0 -49
  521. package/dist/map/adapter/extensions/rename.js.map +0 -1
  522. package/dist/map/adapter/extensions/resume.d.ts +0 -47
  523. package/dist/map/adapter/extensions/resume.d.ts.map +0 -1
  524. package/dist/map/adapter/extensions/resume.js +0 -59
  525. package/dist/map/adapter/extensions/resume.js.map +0 -1
  526. package/dist/map/adapter/extensions/streams.d.ts +0 -95
  527. package/dist/map/adapter/extensions/streams.d.ts.map +0 -1
  528. package/dist/map/adapter/extensions/streams.js +0 -515
  529. package/dist/map/adapter/extensions/streams.js.map +0 -1
  530. package/dist/map/adapter/extensions/task.d.ts +0 -40
  531. package/dist/map/adapter/extensions/task.d.ts.map +0 -1
  532. package/dist/map/adapter/extensions/task.js +0 -197
  533. package/dist/map/adapter/extensions/task.js.map +0 -1
  534. package/dist/map/adapter/extensions/update-metadata.d.ts +0 -29
  535. package/dist/map/adapter/extensions/update-metadata.d.ts.map +0 -1
  536. package/dist/map/adapter/extensions/update-metadata.js +0 -67
  537. package/dist/map/adapter/extensions/update-metadata.js.map +0 -1
  538. package/dist/map/adapter/extensions/wake.d.ts +0 -60
  539. package/dist/map/adapter/extensions/wake.d.ts.map +0 -1
  540. package/dist/map/adapter/extensions/wake.js +0 -144
  541. package/dist/map/adapter/extensions/wake.js.map +0 -1
  542. package/dist/map/adapter/extensions/workspace-files.d.ts +0 -42
  543. package/dist/map/adapter/extensions/workspace-files.d.ts.map +0 -1
  544. package/dist/map/adapter/extensions/workspace-files.js +0 -338
  545. package/dist/map/adapter/extensions/workspace-files.js.map +0 -1
  546. package/dist/map/adapter/extensions/workspace.d.ts +0 -57
  547. package/dist/map/adapter/extensions/workspace.d.ts.map +0 -1
  548. package/dist/map/adapter/extensions/workspace.js +0 -81
  549. package/dist/map/adapter/extensions/workspace.js.map +0 -1
  550. package/dist/map/adapter/index.d.ts +0 -20
  551. package/dist/map/adapter/index.d.ts.map +0 -1
  552. package/dist/map/adapter/index.js +0 -40
  553. package/dist/map/adapter/index.js.map +0 -1
  554. package/dist/map/adapter/interface.d.ts +0 -450
  555. package/dist/map/adapter/interface.d.ts.map +0 -1
  556. package/dist/map/adapter/interface.js +0 -24
  557. package/dist/map/adapter/interface.js.map +0 -1
  558. package/dist/map/adapter/mail-handler-adapter.d.ts +0 -27
  559. package/dist/map/adapter/mail-handler-adapter.d.ts.map +0 -1
  560. package/dist/map/adapter/mail-handler-adapter.js +0 -292
  561. package/dist/map/adapter/mail-handler-adapter.js.map +0 -1
  562. package/dist/map/adapter/map-adapter.d.ts +0 -200
  563. package/dist/map/adapter/map-adapter.d.ts.map +0 -1
  564. package/dist/map/adapter/map-adapter.js +0 -1199
  565. package/dist/map/adapter/map-adapter.js.map +0 -1
  566. package/dist/map/adapter/rpc-handler.d.ts +0 -263
  567. package/dist/map/adapter/rpc-handler.d.ts.map +0 -1
  568. package/dist/map/adapter/rpc-handler.js +0 -365
  569. package/dist/map/adapter/rpc-handler.js.map +0 -1
  570. package/dist/map/adapter/subscription-manager.d.ts +0 -174
  571. package/dist/map/adapter/subscription-manager.d.ts.map +0 -1
  572. package/dist/map/adapter/subscription-manager.js +0 -248
  573. package/dist/map/adapter/subscription-manager.js.map +0 -1
  574. package/dist/map/adapter/types.d.ts +0 -194
  575. package/dist/map/adapter/types.d.ts.map +0 -1
  576. package/dist/map/adapter/types.js +0 -27
  577. package/dist/map/adapter/types.js.map +0 -1
  578. package/dist/map/adapter/websocket-integration.d.ts +0 -113
  579. package/dist/map/adapter/websocket-integration.d.ts.map +0 -1
  580. package/dist/map/adapter/websocket-integration.js +0 -134
  581. package/dist/map/adapter/websocket-integration.js.map +0 -1
  582. package/dist/map/federation/envelope.d.ts +0 -98
  583. package/dist/map/federation/envelope.d.ts.map +0 -1
  584. package/dist/map/federation/envelope.js +0 -160
  585. package/dist/map/federation/envelope.js.map +0 -1
  586. package/dist/map/federation/federation-handler.d.ts +0 -50
  587. package/dist/map/federation/federation-handler.d.ts.map +0 -1
  588. package/dist/map/federation/federation-handler.js +0 -306
  589. package/dist/map/federation/federation-handler.js.map +0 -1
  590. package/dist/map/federation/index.d.ts +0 -14
  591. package/dist/map/federation/index.d.ts.map +0 -1
  592. package/dist/map/federation/index.js +0 -13
  593. package/dist/map/federation/index.js.map +0 -1
  594. package/dist/map/federation/types.d.ts +0 -239
  595. package/dist/map/federation/types.d.ts.map +0 -1
  596. package/dist/map/federation/types.js +0 -23
  597. package/dist/map/federation/types.js.map +0 -1
  598. package/dist/map/utils/address-translation.d.ts +0 -99
  599. package/dist/map/utils/address-translation.d.ts.map +0 -1
  600. package/dist/map/utils/address-translation.js +0 -285
  601. package/dist/map/utils/address-translation.js.map +0 -1
  602. package/dist/map/utils/index.d.ts +0 -7
  603. package/dist/map/utils/index.d.ts.map +0 -1
  604. package/dist/map/utils/index.js +0 -7
  605. package/dist/map/utils/index.js.map +0 -1
  606. package/dist/mcp/map-client.d.ts +0 -39
  607. package/dist/mcp/map-client.d.ts.map +0 -1
  608. package/dist/mcp/map-client.js +0 -129
  609. package/dist/mcp/map-client.js.map +0 -1
  610. package/dist/mcp/mcp-server.d.ts +0 -72
  611. package/dist/mcp/mcp-server.d.ts.map +0 -1
  612. package/dist/mcp/mcp-server.js +0 -1024
  613. package/dist/mcp/mcp-server.js.map +0 -1
  614. package/dist/mcp/tools/claim_task.d.ts +0 -35
  615. package/dist/mcp/tools/claim_task.d.ts.map +0 -1
  616. package/dist/mcp/tools/claim_task.js +0 -58
  617. package/dist/mcp/tools/claim_task.js.map +0 -1
  618. package/dist/mcp/tools/done.d.ts +0 -102
  619. package/dist/mcp/tools/done.d.ts.map +0 -1
  620. package/dist/mcp/tools/done.js +0 -252
  621. package/dist/mcp/tools/done.js.map +0 -1
  622. package/dist/mcp/tools/inject_context.d.ts +0 -61
  623. package/dist/mcp/tools/inject_context.d.ts.map +0 -1
  624. package/dist/mcp/tools/inject_context.js +0 -123
  625. package/dist/mcp/tools/inject_context.js.map +0 -1
  626. package/dist/mcp/tools/list_claimable_tasks.d.ts +0 -38
  627. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +0 -1
  628. package/dist/mcp/tools/list_claimable_tasks.js +0 -63
  629. package/dist/mcp/tools/list_claimable_tasks.js.map +0 -1
  630. package/dist/mcp/tools/unclaim_task.d.ts +0 -31
  631. package/dist/mcp/tools/unclaim_task.d.ts.map +0 -1
  632. package/dist/mcp/tools/unclaim_task.js +0 -47
  633. package/dist/mcp/tools/unclaim_task.js.map +0 -1
  634. package/dist/mcp/tools/wait_for_activity.d.ts +0 -60
  635. package/dist/mcp/tools/wait_for_activity.d.ts.map +0 -1
  636. package/dist/mcp/tools/wait_for_activity.js +0 -135
  637. package/dist/mcp/tools/wait_for_activity.js.map +0 -1
  638. package/dist/monitor/health-check-service.d.ts +0 -143
  639. package/dist/monitor/health-check-service.d.ts.map +0 -1
  640. package/dist/monitor/health-check-service.js +0 -240
  641. package/dist/monitor/health-check-service.js.map +0 -1
  642. package/dist/monitor/index.d.ts +0 -14
  643. package/dist/monitor/index.d.ts.map +0 -1
  644. package/dist/monitor/index.js +0 -14
  645. package/dist/monitor/index.js.map +0 -1
  646. package/dist/monitor/stall-detector.d.ts +0 -109
  647. package/dist/monitor/stall-detector.d.ts.map +0 -1
  648. package/dist/monitor/stall-detector.js +0 -152
  649. package/dist/monitor/stall-detector.js.map +0 -1
  650. package/dist/peer/capability-manager.d.ts +0 -56
  651. package/dist/peer/capability-manager.d.ts.map +0 -1
  652. package/dist/peer/capability-manager.js +0 -186
  653. package/dist/peer/capability-manager.js.map +0 -1
  654. package/dist/peer/encapsulation-manager.d.ts +0 -190
  655. package/dist/peer/encapsulation-manager.d.ts.map +0 -1
  656. package/dist/peer/encapsulation-manager.js +0 -486
  657. package/dist/peer/encapsulation-manager.js.map +0 -1
  658. package/dist/peer/federation-manager.d.ts +0 -223
  659. package/dist/peer/federation-manager.d.ts.map +0 -1
  660. package/dist/peer/federation-manager.js +0 -528
  661. package/dist/peer/federation-manager.js.map +0 -1
  662. package/dist/peer/hierarchy-errors.d.ts +0 -208
  663. package/dist/peer/hierarchy-errors.d.ts.map +0 -1
  664. package/dist/peer/hierarchy-errors.js +0 -268
  665. package/dist/peer/hierarchy-errors.js.map +0 -1
  666. package/dist/peer/hierarchy-protocol.d.ts +0 -159
  667. package/dist/peer/hierarchy-protocol.d.ts.map +0 -1
  668. package/dist/peer/hierarchy-protocol.js +0 -142
  669. package/dist/peer/hierarchy-protocol.js.map +0 -1
  670. package/dist/peer/index.d.ts +0 -15
  671. package/dist/peer/index.d.ts.map +0 -1
  672. package/dist/peer/index.js +0 -15
  673. package/dist/peer/index.js.map +0 -1
  674. package/dist/peer/peer-manager.d.ts +0 -99
  675. package/dist/peer/peer-manager.d.ts.map +0 -1
  676. package/dist/peer/peer-manager.js +0 -333
  677. package/dist/peer/peer-manager.js.map +0 -1
  678. package/dist/peer/task-delegation.d.ts +0 -189
  679. package/dist/peer/task-delegation.d.ts.map +0 -1
  680. package/dist/peer/task-delegation.js +0 -303
  681. package/dist/peer/task-delegation.js.map +0 -1
  682. package/dist/peer/transports/index.d.ts +0 -8
  683. package/dist/peer/transports/index.d.ts.map +0 -1
  684. package/dist/peer/transports/index.js +0 -8
  685. package/dist/peer/transports/index.js.map +0 -1
  686. package/dist/peer/transports/local-transport.d.ts +0 -56
  687. package/dist/peer/transports/local-transport.d.ts.map +0 -1
  688. package/dist/peer/transports/local-transport.js +0 -263
  689. package/dist/peer/transports/local-transport.js.map +0 -1
  690. package/dist/peer/transports/websocket-transport.d.ts +0 -86
  691. package/dist/peer/transports/websocket-transport.d.ts.map +0 -1
  692. package/dist/peer/transports/websocket-transport.js +0 -338
  693. package/dist/peer/transports/websocket-transport.js.map +0 -1
  694. package/dist/peer/types.d.ts +0 -268
  695. package/dist/peer/types.d.ts.map +0 -1
  696. package/dist/peer/types.js +0 -36
  697. package/dist/peer/types.js.map +0 -1
  698. package/dist/router/address-resolver.d.ts +0 -102
  699. package/dist/router/address-resolver.d.ts.map +0 -1
  700. package/dist/router/address-resolver.js +0 -198
  701. package/dist/router/address-resolver.js.map +0 -1
  702. package/dist/router/broadcast.d.ts +0 -53
  703. package/dist/router/broadcast.d.ts.map +0 -1
  704. package/dist/router/broadcast.js +0 -75
  705. package/dist/router/broadcast.js.map +0 -1
  706. package/dist/router/channels.d.ts +0 -148
  707. package/dist/router/channels.d.ts.map +0 -1
  708. package/dist/router/channels.js +0 -126
  709. package/dist/router/channels.js.map +0 -1
  710. package/dist/router/index.d.ts +0 -21
  711. package/dist/router/index.d.ts.map +0 -1
  712. package/dist/router/index.js +0 -18
  713. package/dist/router/index.js.map +0 -1
  714. package/dist/router/message-router.d.ts +0 -197
  715. package/dist/router/message-router.d.ts.map +0 -1
  716. package/dist/router/message-router.js +0 -903
  717. package/dist/router/message-router.js.map +0 -1
  718. package/dist/router/message-types.d.ts +0 -183
  719. package/dist/router/message-types.d.ts.map +0 -1
  720. package/dist/router/message-types.js +0 -79
  721. package/dist/router/message-types.js.map +0 -1
  722. package/dist/router/role-resolver.d.ts +0 -67
  723. package/dist/router/role-resolver.d.ts.map +0 -1
  724. package/dist/router/role-resolver.js +0 -106
  725. package/dist/router/role-resolver.js.map +0 -1
  726. package/dist/router/signals.d.ts +0 -253
  727. package/dist/router/signals.d.ts.map +0 -1
  728. package/dist/router/signals.js +0 -53
  729. package/dist/router/signals.js.map +0 -1
  730. package/dist/router/types.d.ts +0 -191
  731. package/dist/router/types.d.ts.map +0 -1
  732. package/dist/router/types.js +0 -34
  733. package/dist/router/types.js.map +0 -1
  734. package/dist/router/wake.d.ts +0 -111
  735. package/dist/router/wake.d.ts.map +0 -1
  736. package/dist/router/wake.js +0 -180
  737. package/dist/router/wake.js.map +0 -1
  738. package/dist/server/combined-server.d.ts +0 -95
  739. package/dist/server/combined-server.d.ts.map +0 -1
  740. package/dist/server/combined-server.js +0 -335
  741. package/dist/server/combined-server.js.map +0 -1
  742. package/dist/steering/index.d.ts +0 -11
  743. package/dist/steering/index.d.ts.map +0 -1
  744. package/dist/steering/index.js +0 -11
  745. package/dist/steering/index.js.map +0 -1
  746. package/dist/steering/inject.d.ts +0 -39
  747. package/dist/steering/inject.d.ts.map +0 -1
  748. package/dist/steering/inject.js +0 -197
  749. package/dist/steering/inject.js.map +0 -1
  750. package/dist/steering/types.d.ts +0 -100
  751. package/dist/steering/types.d.ts.map +0 -1
  752. package/dist/steering/types.js +0 -11
  753. package/dist/steering/types.js.map +0 -1
  754. package/dist/store/backends/index.d.ts +0 -11
  755. package/dist/store/backends/index.d.ts.map +0 -1
  756. package/dist/store/backends/index.js +0 -15
  757. package/dist/store/backends/index.js.map +0 -1
  758. package/dist/store/backends/json-backend.d.ts +0 -23
  759. package/dist/store/backends/json-backend.d.ts.map +0 -1
  760. package/dist/store/backends/json-backend.js +0 -220
  761. package/dist/store/backends/json-backend.js.map +0 -1
  762. package/dist/store/backends/memory-backend.d.ts +0 -12
  763. package/dist/store/backends/memory-backend.d.ts.map +0 -1
  764. package/dist/store/backends/memory-backend.js +0 -205
  765. package/dist/store/backends/memory-backend.js.map +0 -1
  766. package/dist/store/backends/sqlite-backend.d.ts +0 -27
  767. package/dist/store/backends/sqlite-backend.d.ts.map +0 -1
  768. package/dist/store/backends/sqlite-backend.js +0 -231
  769. package/dist/store/backends/sqlite-backend.js.map +0 -1
  770. package/dist/store/backends/tinybase-backend.d.ts +0 -22
  771. package/dist/store/backends/tinybase-backend.d.ts.map +0 -1
  772. package/dist/store/backends/tinybase-backend.js +0 -203
  773. package/dist/store/backends/tinybase-backend.js.map +0 -1
  774. package/dist/store/backends/types.d.ts +0 -175
  775. package/dist/store/backends/types.d.ts.map +0 -1
  776. package/dist/store/backends/types.js +0 -28
  777. package/dist/store/backends/types.js.map +0 -1
  778. package/dist/store/event-store.d.ts +0 -128
  779. package/dist/store/event-store.d.ts.map +0 -1
  780. package/dist/store/event-store.js +0 -1746
  781. package/dist/store/event-store.js.map +0 -1
  782. package/dist/store/instance.d.ts +0 -283
  783. package/dist/store/instance.d.ts.map +0 -1
  784. package/dist/store/instance.js +0 -363
  785. package/dist/store/instance.js.map +0 -1
  786. package/dist/store/migrations.d.ts +0 -41
  787. package/dist/store/migrations.d.ts.map +0 -1
  788. package/dist/store/migrations.js +0 -79
  789. package/dist/store/migrations.js.map +0 -1
  790. package/dist/store/types/config.d.ts +0 -16
  791. package/dist/store/types/config.d.ts.map +0 -1
  792. package/dist/store/types/config.js +0 -8
  793. package/dist/store/types/config.js.map +0 -1
  794. package/dist/store/types/conversations.d.ts +0 -91
  795. package/dist/store/types/conversations.d.ts.map +0 -1
  796. package/dist/store/types/conversations.js +0 -8
  797. package/dist/store/types/conversations.js.map +0 -1
  798. package/dist/store/types/sessions.d.ts +0 -44
  799. package/dist/store/types/sessions.d.ts.map +0 -1
  800. package/dist/store/types/sessions.js +0 -9
  801. package/dist/store/types/sessions.js.map +0 -1
  802. package/dist/task/backend/index.d.ts +0 -93
  803. package/dist/task/backend/index.d.ts.map +0 -1
  804. package/dist/task/backend/index.js +0 -178
  805. package/dist/task/backend/index.js.map +0 -1
  806. package/dist/task/backend/memory.d.ts +0 -70
  807. package/dist/task/backend/memory.d.ts.map +0 -1
  808. package/dist/task/backend/memory.js +0 -621
  809. package/dist/task/backend/memory.js.map +0 -1
  810. package/dist/task/backend/opentasks/backend.d.ts +0 -140
  811. package/dist/task/backend/opentasks/backend.d.ts.map +0 -1
  812. package/dist/task/backend/opentasks/backend.js +0 -1023
  813. package/dist/task/backend/opentasks/backend.js.map +0 -1
  814. package/dist/task/backend/opentasks/client.d.ts +0 -337
  815. package/dist/task/backend/opentasks/client.d.ts.map +0 -1
  816. package/dist/task/backend/opentasks/client.js +0 -225
  817. package/dist/task/backend/opentasks/client.js.map +0 -1
  818. package/dist/task/backend/opentasks/daemon-manager.d.ts +0 -89
  819. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +0 -1
  820. package/dist/task/backend/opentasks/daemon-manager.js +0 -195
  821. package/dist/task/backend/opentasks/daemon-manager.js.map +0 -1
  822. package/dist/task/backend/opentasks/index.d.ts +0 -21
  823. package/dist/task/backend/opentasks/index.d.ts.map +0 -1
  824. package/dist/task/backend/opentasks/index.js +0 -21
  825. package/dist/task/backend/opentasks/index.js.map +0 -1
  826. package/dist/task/backend/opentasks/mapping.d.ts +0 -48
  827. package/dist/task/backend/opentasks/mapping.d.ts.map +0 -1
  828. package/dist/task/backend/opentasks/mapping.js +0 -77
  829. package/dist/task/backend/opentasks/mapping.js.map +0 -1
  830. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts +0 -54
  831. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts.map +0 -1
  832. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js +0 -88
  833. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js.map +0 -1
  834. package/dist/task/backend/sudocode/backend.d.ts +0 -155
  835. package/dist/task/backend/sudocode/backend.d.ts.map +0 -1
  836. package/dist/task/backend/sudocode/backend.js +0 -942
  837. package/dist/task/backend/sudocode/backend.js.map +0 -1
  838. package/dist/task/backend/sudocode/client.d.ts +0 -303
  839. package/dist/task/backend/sudocode/client.d.ts.map +0 -1
  840. package/dist/task/backend/sudocode/client.js +0 -101
  841. package/dist/task/backend/sudocode/client.js.map +0 -1
  842. package/dist/task/backend/sudocode/index.d.ts +0 -19
  843. package/dist/task/backend/sudocode/index.d.ts.map +0 -1
  844. package/dist/task/backend/sudocode/index.js +0 -17
  845. package/dist/task/backend/sudocode/index.js.map +0 -1
  846. package/dist/task/backend/sudocode/mapping.d.ts +0 -51
  847. package/dist/task/backend/sudocode/mapping.d.ts.map +0 -1
  848. package/dist/task/backend/sudocode/mapping.js +0 -86
  849. package/dist/task/backend/sudocode/mapping.js.map +0 -1
  850. package/dist/task/backend/sudocode/server-client.d.ts +0 -56
  851. package/dist/task/backend/sudocode/server-client.d.ts.map +0 -1
  852. package/dist/task/backend/sudocode/server-client.js +0 -367
  853. package/dist/task/backend/sudocode/server-client.js.map +0 -1
  854. package/dist/task/backend/sudocode/standalone-client.d.ts +0 -91
  855. package/dist/task/backend/sudocode/standalone-client.d.ts.map +0 -1
  856. package/dist/task/backend/sudocode/standalone-client.js +0 -476
  857. package/dist/task/backend/sudocode/standalone-client.js.map +0 -1
  858. package/dist/task/backend/sudocode/sync-policy.d.ts +0 -166
  859. package/dist/task/backend/sudocode/sync-policy.d.ts.map +0 -1
  860. package/dist/task/backend/sudocode/sync-policy.js +0 -221
  861. package/dist/task/backend/sudocode/sync-policy.js.map +0 -1
  862. package/dist/task/backend/sudocode/tools.d.ts +0 -87
  863. package/dist/task/backend/sudocode/tools.d.ts.map +0 -1
  864. package/dist/task/backend/sudocode/tools.js +0 -743
  865. package/dist/task/backend/sudocode/tools.js.map +0 -1
  866. package/dist/task/backend/tool-provider.d.ts +0 -56
  867. package/dist/task/backend/tool-provider.d.ts.map +0 -1
  868. package/dist/task/backend/tool-provider.js +0 -424
  869. package/dist/task/backend/tool-provider.js.map +0 -1
  870. package/dist/task/backend/types.d.ts +0 -297
  871. package/dist/task/backend/types.d.ts.map +0 -1
  872. package/dist/task/backend/types.js +0 -27
  873. package/dist/task/backend/types.js.map +0 -1
  874. package/dist/task/backend/unified-tool-provider.d.ts +0 -57
  875. package/dist/task/backend/unified-tool-provider.d.ts.map +0 -1
  876. package/dist/task/backend/unified-tool-provider.js +0 -623
  877. package/dist/task/backend/unified-tool-provider.js.map +0 -1
  878. package/dist/task/index.d.ts +0 -7
  879. package/dist/task/index.d.ts.map +0 -1
  880. package/dist/task/index.js +0 -7
  881. package/dist/task/index.js.map +0 -1
  882. package/dist/task/retry-policy.d.ts +0 -89
  883. package/dist/task/retry-policy.d.ts.map +0 -1
  884. package/dist/task/retry-policy.js +0 -160
  885. package/dist/task/retry-policy.js.map +0 -1
  886. package/dist/task/task-manager.d.ts +0 -70
  887. package/dist/task/task-manager.d.ts.map +0 -1
  888. package/dist/task/task-manager.js +0 -319
  889. package/dist/task/task-manager.js.map +0 -1
  890. package/dist/task/types.d.ts +0 -72
  891. package/dist/task/types.d.ts.map +0 -1
  892. package/dist/task/types.js +0 -33
  893. package/dist/task/types.js.map +0 -1
  894. package/dist/teams/team-manager.d.ts +0 -112
  895. package/dist/teams/team-manager.d.ts.map +0 -1
  896. package/dist/teams/team-manager.js +0 -305
  897. package/dist/teams/team-manager.js.map +0 -1
  898. package/dist/teams/team-runtime.d.ts +0 -245
  899. package/dist/teams/team-runtime.d.ts.map +0 -1
  900. package/dist/teams/team-runtime.js +0 -1023
  901. package/dist/teams/team-runtime.js.map +0 -1
  902. package/dist/trigger/router/index.d.ts +0 -11
  903. package/dist/trigger/router/index.d.ts.map +0 -1
  904. package/dist/trigger/router/index.js +0 -10
  905. package/dist/trigger/router/index.js.map +0 -1
  906. package/dist/trigger/router/strategies/ai-router-strategy.d.ts +0 -34
  907. package/dist/trigger/router/strategies/ai-router-strategy.d.ts.map +0 -1
  908. package/dist/trigger/router/strategies/ai-router-strategy.js +0 -359
  909. package/dist/trigger/router/strategies/ai-router-strategy.js.map +0 -1
  910. package/dist/trigger/router/strategies/direct-strategy.d.ts +0 -32
  911. package/dist/trigger/router/strategies/direct-strategy.d.ts.map +0 -1
  912. package/dist/trigger/router/strategies/direct-strategy.js +0 -119
  913. package/dist/trigger/router/strategies/direct-strategy.js.map +0 -1
  914. package/dist/trigger/router/strategies/index.d.ts +0 -11
  915. package/dist/trigger/router/strategies/index.d.ts.map +0 -1
  916. package/dist/trigger/router/strategies/index.js +0 -11
  917. package/dist/trigger/router/strategies/index.js.map +0 -1
  918. package/dist/trigger/router/strategies/role-strategy.d.ts +0 -39
  919. package/dist/trigger/router/strategies/role-strategy.d.ts.map +0 -1
  920. package/dist/trigger/router/strategies/role-strategy.js +0 -207
  921. package/dist/trigger/router/strategies/role-strategy.js.map +0 -1
  922. package/dist/trigger/router/trigger-router.d.ts +0 -54
  923. package/dist/trigger/router/trigger-router.d.ts.map +0 -1
  924. package/dist/trigger/router/trigger-router.js +0 -362
  925. package/dist/trigger/router/trigger-router.js.map +0 -1
  926. package/dist/trigger/router/types.d.ts +0 -225
  927. package/dist/trigger/router/types.d.ts.map +0 -1
  928. package/dist/trigger/router/types.js +0 -10
  929. package/dist/trigger/router/types.js.map +0 -1
  930. package/dist/trigger/trigger-system.d.ts +0 -77
  931. package/dist/trigger/trigger-system.d.ts.map +0 -1
  932. package/dist/trigger/trigger-system.js +0 -84
  933. package/dist/trigger/trigger-system.js.map +0 -1
  934. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  935. package/references/acp-factory-ref/LICENSE +0 -21
  936. package/references/acp-factory-ref/README.md +0 -341
  937. package/references/acp-factory-ref/package-lock.json +0 -3102
  938. package/references/acp-factory-ref/package.json +0 -96
  939. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  940. package/references/acp-factory-ref/python/LICENSE +0 -21
  941. package/references/acp-factory-ref/python/Makefile +0 -57
  942. package/references/acp-factory-ref/python/README.md +0 -253
  943. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  944. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  945. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  946. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  947. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  948. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  949. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  950. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  951. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  952. package/references/claude-code-acp/.prettierrc.json +0 -4
  953. package/references/claude-code-acp/CHANGELOG.md +0 -249
  954. package/references/claude-code-acp/LICENSE +0 -222
  955. package/references/claude-code-acp/README.md +0 -53
  956. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  957. package/references/claude-code-acp/eslint.config.js +0 -48
  958. package/references/claude-code-acp/package-lock.json +0 -4570
  959. package/references/claude-code-acp/package.json +0 -88
  960. package/references/claude-code-acp/scripts/release.sh +0 -119
  961. package/references/claude-code-acp/src/acp-agent.ts +0 -2076
  962. package/references/claude-code-acp/src/index.ts +0 -26
  963. package/references/claude-code-acp/src/lib.ts +0 -38
  964. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  965. package/references/claude-code-acp/src/settings.ts +0 -522
  966. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  967. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  968. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  969. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  970. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  971. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  972. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  973. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  974. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  975. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  976. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  977. package/references/claude-code-acp/src/tools.ts +0 -819
  978. package/references/claude-code-acp/src/utils.ts +0 -171
  979. package/references/claude-code-acp/tsconfig.json +0 -18
  980. package/references/claude-code-acp/vitest.config.ts +0 -19
  981. package/references/minimem/.claude/settings.json +0 -7
  982. package/references/minimem/.sudocode/issues.jsonl +0 -18
  983. package/references/minimem/.sudocode/specs.jsonl +0 -1
  984. package/references/minimem/CLAUDE.md +0 -310
  985. package/references/minimem/README.md +0 -562
  986. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
  987. package/references/minimem/claude-plugin/.mcp.json +0 -7
  988. package/references/minimem/claude-plugin/README.md +0 -158
  989. package/references/minimem/claude-plugin/commands/recall.md +0 -47
  990. package/references/minimem/claude-plugin/commands/remember.md +0 -41
  991. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
  992. package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
  993. package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
  994. package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
  995. package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
  996. package/references/minimem/media/banner.png +0 -0
  997. package/references/minimem/package-lock.json +0 -5373
  998. package/references/minimem/package.json +0 -72
  999. package/references/minimem/scripts/postbuild.js +0 -35
  1000. package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
  1001. package/references/minimem/src/__tests__/errors.test.ts +0 -265
  1002. package/references/minimem/src/__tests__/helpers.ts +0 -199
  1003. package/references/minimem/src/__tests__/internal.test.ts +0 -407
  1004. package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
  1005. package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
  1006. package/references/minimem/src/__tests__/session.test.ts +0 -190
  1007. package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
  1008. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
  1009. package/references/minimem/src/cli/commands/append.ts +0 -76
  1010. package/references/minimem/src/cli/commands/config.ts +0 -262
  1011. package/references/minimem/src/cli/commands/conflicts.ts +0 -413
  1012. package/references/minimem/src/cli/commands/daemon.ts +0 -169
  1013. package/references/minimem/src/cli/commands/index.ts +0 -12
  1014. package/references/minimem/src/cli/commands/init.ts +0 -88
  1015. package/references/minimem/src/cli/commands/mcp.ts +0 -177
  1016. package/references/minimem/src/cli/commands/push-pull.ts +0 -213
  1017. package/references/minimem/src/cli/commands/search.ts +0 -158
  1018. package/references/minimem/src/cli/commands/status.ts +0 -84
  1019. package/references/minimem/src/cli/commands/sync-init.ts +0 -290
  1020. package/references/minimem/src/cli/commands/sync.ts +0 -70
  1021. package/references/minimem/src/cli/commands/upsert.ts +0 -197
  1022. package/references/minimem/src/cli/config.ts +0 -584
  1023. package/references/minimem/src/cli/index.ts +0 -264
  1024. package/references/minimem/src/cli/shared.ts +0 -161
  1025. package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
  1026. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
  1027. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
  1028. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
  1029. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
  1030. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
  1031. package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
  1032. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
  1033. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
  1034. package/references/minimem/src/cli/sync/central.ts +0 -292
  1035. package/references/minimem/src/cli/sync/conflicts.ts +0 -204
  1036. package/references/minimem/src/cli/sync/daemon.ts +0 -407
  1037. package/references/minimem/src/cli/sync/detection.ts +0 -138
  1038. package/references/minimem/src/cli/sync/index.ts +0 -107
  1039. package/references/minimem/src/cli/sync/operations.ts +0 -373
  1040. package/references/minimem/src/cli/sync/registry.ts +0 -279
  1041. package/references/minimem/src/cli/sync/state.ts +0 -355
  1042. package/references/minimem/src/cli/sync/validation.ts +0 -206
  1043. package/references/minimem/src/cli/sync/watcher.ts +0 -234
  1044. package/references/minimem/src/cli/version.ts +0 -34
  1045. package/references/minimem/src/core/index.ts +0 -9
  1046. package/references/minimem/src/core/indexer.ts +0 -628
  1047. package/references/minimem/src/core/searcher.ts +0 -221
  1048. package/references/minimem/src/db/schema.ts +0 -183
  1049. package/references/minimem/src/db/sqlite-vec.ts +0 -24
  1050. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
  1051. package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
  1052. package/references/minimem/src/embeddings/batch-openai.ts +0 -409
  1053. package/references/minimem/src/embeddings/embeddings.ts +0 -434
  1054. package/references/minimem/src/index.ts +0 -109
  1055. package/references/minimem/src/internal.ts +0 -299
  1056. package/references/minimem/src/minimem.ts +0 -1276
  1057. package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
  1058. package/references/minimem/src/search/graph.ts +0 -234
  1059. package/references/minimem/src/search/hybrid.ts +0 -151
  1060. package/references/minimem/src/search/search.ts +0 -256
  1061. package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
  1062. package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
  1063. package/references/minimem/src/server/mcp.ts +0 -326
  1064. package/references/minimem/src/server/tools.ts +0 -720
  1065. package/references/minimem/src/session.ts +0 -460
  1066. package/references/minimem/tsconfig.json +0 -19
  1067. package/references/minimem/tsup.config.ts +0 -26
  1068. package/references/minimem/vitest.config.ts +0 -24
  1069. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -111
  1070. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
  1071. package/references/multi-agent-protocol/LICENSE +0 -21
  1072. package/references/multi-agent-protocol/README.md +0 -113
  1073. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -496
  1074. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  1075. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  1076. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  1077. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  1078. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  1079. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  1080. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  1081. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  1082. package/references/multi-agent-protocol/docs/09-authentication.md +0 -680
  1083. package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
  1084. package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
  1085. package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
  1086. package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
  1087. package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
  1088. package/references/multi-agent-protocol/docs-site/README.md +0 -82
  1089. package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
  1090. package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
  1091. package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
  1092. package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
  1093. package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
  1094. package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
  1095. package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
  1096. package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
  1097. package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
  1098. package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
  1099. package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
  1100. package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
  1101. package/references/multi-agent-protocol/docs-site/index.md +0 -136
  1102. package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
  1103. package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
  1104. package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
  1105. package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
  1106. package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
  1107. package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
  1108. package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
  1109. package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
  1110. package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
  1111. package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
  1112. package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
  1113. package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
  1114. package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
  1115. package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
  1116. package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
  1117. package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
  1118. package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
  1119. package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
  1120. package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
  1121. package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
  1122. package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
  1123. package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
  1124. package/references/multi-agent-protocol/package-lock.json +0 -3886
  1125. package/references/multi-agent-protocol/package.json +0 -56
  1126. package/references/multi-agent-protocol/schema/meta.json +0 -467
  1127. package/references/multi-agent-protocol/schema/schema.json +0 -2558
  1128. package/references/openteams/.claude/settings.json +0 -6
  1129. package/references/openteams/README.md +0 -1
  1130. package/references/openteams/SKILL.md +0 -341
  1131. package/references/openteams/design.md +0 -411
  1132. package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +0 -16
  1133. package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +0 -5
  1134. package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +0 -24
  1135. package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +0 -5
  1136. package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +0 -25
  1137. package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +0 -5
  1138. package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +0 -21
  1139. package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +0 -5
  1140. package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +0 -20
  1141. package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +0 -5
  1142. package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +0 -17
  1143. package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +0 -5
  1144. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +0 -23
  1145. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +0 -5
  1146. package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +0 -27
  1147. package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +0 -5
  1148. package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +0 -21
  1149. package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +0 -5
  1150. package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +0 -16
  1151. package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +0 -5
  1152. package/references/openteams/examples/bmad-method/roles/analyst.yaml +0 -9
  1153. package/references/openteams/examples/bmad-method/roles/architect.yaml +0 -9
  1154. package/references/openteams/examples/bmad-method/roles/developer.yaml +0 -8
  1155. package/references/openteams/examples/bmad-method/roles/master.yaml +0 -8
  1156. package/references/openteams/examples/bmad-method/roles/pm.yaml +0 -9
  1157. package/references/openteams/examples/bmad-method/roles/qa.yaml +0 -8
  1158. package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +0 -8
  1159. package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +0 -9
  1160. package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +0 -8
  1161. package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +0 -8
  1162. package/references/openteams/examples/bmad-method/team.yaml +0 -161
  1163. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +0 -17
  1164. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +0 -5
  1165. package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +0 -25
  1166. package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +0 -5
  1167. package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +0 -34
  1168. package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +0 -5
  1169. package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +0 -18
  1170. package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +0 -3
  1171. package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +0 -42
  1172. package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +0 -5
  1173. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +0 -15
  1174. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +0 -3
  1175. package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +0 -17
  1176. package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +0 -3
  1177. package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +0 -28
  1178. package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +0 -5
  1179. package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +0 -16
  1180. package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +0 -3
  1181. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +0 -13
  1182. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +0 -3
  1183. package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +0 -14
  1184. package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +0 -3
  1185. package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +0 -19
  1186. package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +0 -5
  1187. package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +0 -8
  1188. package/references/openteams/examples/get-shit-done/roles/debugger.yaml +0 -8
  1189. package/references/openteams/examples/get-shit-done/roles/executor.yaml +0 -8
  1190. package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +0 -8
  1191. package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +0 -9
  1192. package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +0 -7
  1193. package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +0 -8
  1194. package/references/openteams/examples/get-shit-done/roles/planner.yaml +0 -8
  1195. package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +0 -8
  1196. package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +0 -7
  1197. package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +0 -7
  1198. package/references/openteams/examples/get-shit-done/roles/verifier.yaml +0 -8
  1199. package/references/openteams/examples/get-shit-done/team.yaml +0 -154
  1200. package/references/openteams/package-lock.json +0 -2181
  1201. package/references/openteams/package.json +0 -48
  1202. package/references/openteams/schema/role.schema.json +0 -125
  1203. package/references/openteams/schema/team.schema.json +0 -284
  1204. package/references/openteams/src/cli/agent.ts +0 -104
  1205. package/references/openteams/src/cli/cli.test.ts +0 -381
  1206. package/references/openteams/src/cli/generate.ts +0 -220
  1207. package/references/openteams/src/cli/message.ts +0 -241
  1208. package/references/openteams/src/cli/task.ts +0 -154
  1209. package/references/openteams/src/cli/team.ts +0 -104
  1210. package/references/openteams/src/cli/template.ts +0 -207
  1211. package/references/openteams/src/cli.ts +0 -45
  1212. package/references/openteams/src/db/database.test.ts +0 -185
  1213. package/references/openteams/src/db/database.ts +0 -240
  1214. package/references/openteams/src/generators/agent-prompt-generator.test.ts +0 -332
  1215. package/references/openteams/src/generators/agent-prompt-generator.ts +0 -521
  1216. package/references/openteams/src/generators/package-generator.test.ts +0 -129
  1217. package/references/openteams/src/generators/package-generator.ts +0 -102
  1218. package/references/openteams/src/generators/skill-generator.test.ts +0 -246
  1219. package/references/openteams/src/generators/skill-generator.ts +0 -374
  1220. package/references/openteams/src/index.ts +0 -104
  1221. package/references/openteams/src/services/agent-service.test.ts +0 -158
  1222. package/references/openteams/src/services/agent-service.ts +0 -84
  1223. package/references/openteams/src/services/communication-service.test.ts +0 -455
  1224. package/references/openteams/src/services/communication-service.ts +0 -371
  1225. package/references/openteams/src/services/message-service.test.ts +0 -342
  1226. package/references/openteams/src/services/message-service.ts +0 -203
  1227. package/references/openteams/src/services/task-service.test.ts +0 -434
  1228. package/references/openteams/src/services/task-service.ts +0 -239
  1229. package/references/openteams/src/services/team-service.test.ts +0 -181
  1230. package/references/openteams/src/services/team-service.ts +0 -139
  1231. package/references/openteams/src/services/template-service.test.ts +0 -306
  1232. package/references/openteams/src/services/template-service.ts +0 -182
  1233. package/references/openteams/src/spawner/acp-factory.ts +0 -96
  1234. package/references/openteams/src/spawner/interface.ts +0 -31
  1235. package/references/openteams/src/spawner/mock.test.ts +0 -93
  1236. package/references/openteams/src/spawner/mock.ts +0 -59
  1237. package/references/openteams/src/template/loader.test.ts +0 -1319
  1238. package/references/openteams/src/template/loader.ts +0 -698
  1239. package/references/openteams/src/template/types.ts +0 -200
  1240. package/references/openteams/src/types.ts +0 -205
  1241. package/references/openteams/tsconfig.json +0 -18
  1242. package/references/openteams/vitest.config.ts +0 -9
  1243. package/references/skill-tree/.claude/settings.json +0 -6
  1244. package/references/skill-tree/.sudocode/issues.jsonl +0 -11
  1245. package/references/skill-tree/.sudocode/specs.jsonl +0 -1
  1246. package/references/skill-tree/CLAUDE.md +0 -150
  1247. package/references/skill-tree/README.md +0 -324
  1248. package/references/skill-tree/docs/GAPS_v1.md +0 -221
  1249. package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
  1250. package/references/skill-tree/docs/TODOS.md +0 -91
  1251. package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
  1252. package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
  1253. package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
  1254. package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
  1255. package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
  1256. package/references/skill-tree/docs/scraper/README.md +0 -170
  1257. package/references/skill-tree/examples/basic-usage.ts +0 -190
  1258. package/references/skill-tree/package-lock.json +0 -1509
  1259. package/references/skill-tree/package.json +0 -66
  1260. package/references/skill-tree/scraper/README.md +0 -123
  1261. package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
  1262. package/references/skill-tree/scraper/docs/PLAN.md +0 -336
  1263. package/references/skill-tree/scraper/drizzle.config.ts +0 -10
  1264. package/references/skill-tree/scraper/package-lock.json +0 -6329
  1265. package/references/skill-tree/scraper/package.json +0 -68
  1266. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
  1267. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
  1268. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
  1269. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
  1270. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
  1271. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
  1272. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
  1273. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
  1274. package/references/skill-tree/scraper/tsup.config.ts +0 -14
  1275. package/references/skill-tree/scraper/vitest.config.ts +0 -17
  1276. package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
  1277. package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
  1278. package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
  1279. package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
  1280. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
  1281. package/references/skill-tree/test/run-all.ts +0 -106
  1282. package/references/skill-tree/test/utils.ts +0 -128
  1283. package/references/skill-tree/vitest.config.ts +0 -16
  1284. package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +0 -761
  1285. package/src/__tests__/e2e/cascade-termination.e2e.test.ts +0 -588
  1286. package/src/__tests__/e2e/conflict-resolution-flow.e2e.test.ts +0 -790
  1287. package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +0 -714
  1288. package/src/__tests__/e2e/full-agent-orchestration.e2e.test.ts +0 -536
  1289. package/src/__tests__/e2e/mcp-server-debug.e2e.test.ts +0 -372
  1290. package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +0 -304
  1291. package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +0 -324
  1292. package/src/__tests__/e2e/multi-agent.e2e.test.ts +0 -1527
  1293. package/src/__tests__/e2e/multi-coordinator.e2e.test.ts +0 -602
  1294. package/src/__tests__/e2e/orchestration-flow.e2e.test.ts +0 -686
  1295. package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +0 -563
  1296. package/src/__tests__/e2e/steering-task.e2e.test.ts +0 -840
  1297. package/src/__tests__/integration.e2e.test.ts +0 -407
  1298. package/src/acp/__tests__/combined-websocket-server.test.ts +0 -260
  1299. package/src/acp/__tests__/history.test.ts +0 -530
  1300. package/src/acp/__tests__/integration.test.ts +0 -1049
  1301. package/src/acp/__tests__/multi-client-mounting.test.ts +0 -303
  1302. package/src/acp/__tests__/session-persistence.test.ts +0 -276
  1303. package/src/acp/__tests__/websocket-full.e2e.test.ts +0 -401
  1304. package/src/acp/__tests__/websocket-integration.test.ts +0 -484
  1305. package/src/acp/__tests__/websocket-stream.test.ts +0 -281
  1306. package/src/acp/__tests__/websocket.e2e.test.ts +0 -390
  1307. package/src/acp/websocket-stream.ts +0 -140
  1308. package/src/activity/__tests__/deduplication.test.ts +0 -345
  1309. package/src/activity/__tests__/relevance.test.ts +0 -347
  1310. package/src/activity/__tests__/watcher.test.ts +0 -344
  1311. package/src/activity/deduplication.ts +0 -219
  1312. package/src/activity/index.ts +0 -51
  1313. package/src/activity/relevance.ts +0 -258
  1314. package/src/activity/types.ts +0 -263
  1315. package/src/activity/watcher.ts +0 -345
  1316. package/src/agent/__tests__/agent-manager.test.ts +0 -1382
  1317. package/src/agent/__tests__/wake.test.ts +0 -768
  1318. package/src/agent/wake.ts +0 -357
  1319. package/src/api/__tests__/conversation-api.test.ts +0 -468
  1320. package/src/cli/__tests__/acp.test.ts +0 -214
  1321. package/src/lifecycle/__tests__/cascade-termination.test.ts +0 -919
  1322. package/src/lifecycle/__tests__/cascade.test.ts +0 -595
  1323. package/src/lifecycle/__tests__/cleanup.test.ts +0 -322
  1324. package/src/lifecycle/__tests__/handlers.test.ts +0 -1879
  1325. package/src/lifecycle/__tests__/lifecycle.e2e.test.ts +0 -354
  1326. package/src/lifecycle/__tests__/merge-queue.e2e.test.ts +0 -602
  1327. package/src/lifecycle/handlers/generic.ts +0 -87
  1328. package/src/lifecycle/handlers/index.ts +0 -183
  1329. package/src/lifecycle/handlers/integrator.ts +0 -672
  1330. package/src/lifecycle/handlers/monitor.ts +0 -114
  1331. package/src/lifecycle/handlers/worker.ts +0 -506
  1332. package/src/mail/__tests__/conversation-lifecycle.test.ts +0 -409
  1333. package/src/mail/__tests__/eventstore-stores.test.ts +0 -1073
  1334. package/src/mail/__tests__/mail-full-agent.e2e.test.ts +0 -575
  1335. package/src/mail/__tests__/mail-integration.test.ts +0 -759
  1336. package/src/mail/__tests__/mail-map-protocol.e2e.test.ts +0 -1068
  1337. package/src/mail/__tests__/mail-service.test.ts +0 -506
  1338. package/src/mail/__tests__/turn-recorder.test.ts +0 -328
  1339. package/src/mail/conversation-map.ts +0 -107
  1340. package/src/mail/index.ts +0 -25
  1341. package/src/mail/mail-service.ts +0 -257
  1342. package/src/mail/stores/eventstore-conversation-store.ts +0 -146
  1343. package/src/mail/stores/eventstore-participant-store.ts +0 -172
  1344. package/src/mail/stores/eventstore-thread-store.ts +0 -129
  1345. package/src/mail/stores/eventstore-turn-store.ts +0 -173
  1346. package/src/mail/stores/index.ts +0 -12
  1347. package/src/mail/stores/types.ts +0 -160
  1348. package/src/mail/turn-recorder.ts +0 -124
  1349. package/src/map/README.md +0 -79
  1350. package/src/map/__tests__/adapter-types.test.ts +0 -326
  1351. package/src/map/__tests__/interface-types.test.ts +0 -342
  1352. package/src/map/__tests__/types.test.ts +0 -411
  1353. package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +0 -820
  1354. package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +0 -355
  1355. package/src/map/adapter/__tests__/acp-over-map-history.test.ts +0 -1386
  1356. package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +0 -440
  1357. package/src/map/adapter/__tests__/connection-manager.test.ts +0 -344
  1358. package/src/map/adapter/__tests__/event-broadcast.test.ts +0 -420
  1359. package/src/map/adapter/__tests__/event-log.test.ts +0 -527
  1360. package/src/map/adapter/__tests__/event-translator.test.ts +0 -550
  1361. package/src/map/adapter/__tests__/extensions.test.ts +0 -1387
  1362. package/src/map/adapter/__tests__/map-adapter.test.ts +0 -926
  1363. package/src/map/adapter/__tests__/mcp-bridge.test.ts +0 -1187
  1364. package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +0 -711
  1365. package/src/map/adapter/__tests__/rpc-handler.test.ts +0 -644
  1366. package/src/map/adapter/__tests__/stream-extensions.test.ts +0 -494
  1367. package/src/map/adapter/__tests__/subscription-manager.test.ts +0 -536
  1368. package/src/map/adapter/__tests__/websocket-integration.test.ts +0 -487
  1369. package/src/map/adapter/__tests__/workspace-files.test.ts +0 -673
  1370. package/src/map/adapter/acp-over-map.ts +0 -1483
  1371. package/src/map/adapter/connection-manager.ts +0 -400
  1372. package/src/map/adapter/event-log.ts +0 -208
  1373. package/src/map/adapter/event-translator.ts +0 -415
  1374. package/src/map/adapter/extensions/agent-detection.ts +0 -201
  1375. package/src/map/adapter/extensions/agent-lifecycle.ts +0 -267
  1376. package/src/map/adapter/extensions/index.ts +0 -316
  1377. package/src/map/adapter/extensions/mcp-bridge.ts +0 -995
  1378. package/src/map/adapter/extensions/resume.ts +0 -114
  1379. package/src/map/adapter/extensions/streams.ts +0 -839
  1380. package/src/map/adapter/extensions/task.ts +0 -326
  1381. package/src/map/adapter/extensions/update-metadata.ts +0 -126
  1382. package/src/map/adapter/extensions/wake.ts +0 -239
  1383. package/src/map/adapter/extensions/workspace-files.ts +0 -449
  1384. package/src/map/adapter/extensions/workspace.ts +0 -176
  1385. package/src/map/adapter/index.ts +0 -163
  1386. package/src/map/adapter/interface.ts +0 -581
  1387. package/src/map/adapter/mail-handler-adapter.ts +0 -429
  1388. package/src/map/adapter/map-adapter.ts +0 -1749
  1389. package/src/map/adapter/rpc-handler.ts +0 -604
  1390. package/src/map/adapter/subscription-manager.ts +0 -474
  1391. package/src/map/adapter/types.ts +0 -266
  1392. package/src/map/adapter/websocket-integration.ts +0 -229
  1393. package/src/map/federation/__tests__/envelope.test.ts +0 -362
  1394. package/src/map/federation/__tests__/federation-handler.test.ts +0 -461
  1395. package/src/map/federation/envelope.ts +0 -243
  1396. package/src/map/federation/federation-handler.ts +0 -442
  1397. package/src/map/federation/index.ts +0 -65
  1398. package/src/map/federation/types.ts +0 -344
  1399. package/src/mcp/__tests__/map-client.test.ts +0 -386
  1400. package/src/mcp/__tests__/mcp-server-thin-client.test.ts +0 -368
  1401. package/src/mcp/__tests__/mcp-server.test.ts +0 -1002
  1402. package/src/mcp/map-client.ts +0 -177
  1403. package/src/mcp/mcp-server.ts +0 -1406
  1404. package/src/mcp/tools/__tests__/done.test.ts +0 -484
  1405. package/src/mcp/tools/claim_task.ts +0 -86
  1406. package/src/mcp/tools/done.ts +0 -357
  1407. package/src/mcp/tools/inject_context.ts +0 -173
  1408. package/src/mcp/tools/list_claimable_tasks.ts +0 -93
  1409. package/src/mcp/tools/unclaim_task.ts +0 -71
  1410. package/src/mcp/tools/wait_for_activity.ts +0 -185
  1411. package/src/monitor/__tests__/health-check-service.test.ts +0 -425
  1412. package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +0 -393
  1413. package/src/monitor/__tests__/stall-detector.test.ts +0 -395
  1414. package/src/monitor/health-check-service.ts +0 -359
  1415. package/src/monitor/index.ts +0 -28
  1416. package/src/monitor/stall-detector.ts +0 -238
  1417. package/src/peer/__tests__/capability-manager.test.ts +0 -454
  1418. package/src/peer/__tests__/encapsulation-manager.test.ts +0 -787
  1419. package/src/peer/__tests__/federation-manager.test.ts +0 -828
  1420. package/src/peer/__tests__/hierarchy-errors.test.ts +0 -307
  1421. package/src/peer/__tests__/peer-manager.test.ts +0 -535
  1422. package/src/peer/__tests__/task-delegation.test.ts +0 -741
  1423. package/src/peer/capability-manager.ts +0 -289
  1424. package/src/peer/encapsulation-manager.ts +0 -831
  1425. package/src/peer/federation-manager.ts +0 -897
  1426. package/src/peer/hierarchy-errors.ts +0 -382
  1427. package/src/peer/hierarchy-protocol.ts +0 -328
  1428. package/src/peer/index.ts +0 -15
  1429. package/src/peer/peer-manager.ts +0 -540
  1430. package/src/peer/task-delegation.ts +0 -594
  1431. package/src/peer/transports/__tests__/local-transport.test.ts +0 -355
  1432. package/src/peer/transports/__tests__/websocket-transport.test.ts +0 -270
  1433. package/src/peer/transports/index.ts +0 -18
  1434. package/src/peer/transports/local-transport.ts +0 -348
  1435. package/src/peer/transports/websocket-transport.ts +0 -452
  1436. package/src/peer/types.ts +0 -331
  1437. package/src/roles/__tests__/capability-enforcement.test.ts +0 -989
  1438. package/src/roles/__tests__/message-routing.e2e.test.ts +0 -464
  1439. package/src/roles/__tests__/role-resolution.test.ts +0 -576
  1440. package/src/router/README.md +0 -120
  1441. package/src/router/__tests__/address-resolver.test.ts +0 -340
  1442. package/src/router/__tests__/broadcast.test.ts +0 -185
  1443. package/src/router/__tests__/message-router.test.ts +0 -1070
  1444. package/src/router/__tests__/role-channel.test.ts +0 -213
  1445. package/src/router/__tests__/send-to-address.test.ts +0 -731
  1446. package/src/router/__tests__/wake.test.ts +0 -459
  1447. package/src/router/address-resolver.ts +0 -303
  1448. package/src/router/broadcast.ts +0 -117
  1449. package/src/router/channels.ts +0 -283
  1450. package/src/router/index.ts +0 -148
  1451. package/src/router/message-router.ts +0 -1392
  1452. package/src/router/message-types.ts +0 -294
  1453. package/src/router/role-resolver.ts +0 -164
  1454. package/src/router/signals.ts +0 -335
  1455. package/src/router/types.ts +0 -306
  1456. package/src/router/wake.ts +0 -270
  1457. package/src/server/__tests__/combined-server.test.ts +0 -360
  1458. package/src/server/combined-server.ts +0 -544
  1459. package/src/steering/__tests__/inject.test.ts +0 -405
  1460. package/src/steering/__tests__/injection.e2e.test.ts +0 -932
  1461. package/src/steering/__tests__/steering-integration.test.ts +0 -747
  1462. package/src/steering/index.ts +0 -25
  1463. package/src/steering/inject.ts +0 -262
  1464. package/src/steering/types.ts +0 -143
  1465. package/src/store/README.md +0 -134
  1466. package/src/store/__tests__/event-store-oob.test.ts +0 -109
  1467. package/src/store/__tests__/event-store.test.ts +0 -1446
  1468. package/src/store/__tests__/instance.test.ts +0 -556
  1469. package/src/store/__tests__/migrations.test.ts +0 -109
  1470. package/src/store/backends/__tests__/memory-backend.test.ts +0 -383
  1471. package/src/store/backends/__tests__/sqlite-backend.test.ts +0 -427
  1472. package/src/store/backends/index.ts +0 -42
  1473. package/src/store/backends/json-backend.ts +0 -295
  1474. package/src/store/backends/memory-backend.ts +0 -256
  1475. package/src/store/backends/sqlite-backend.ts +0 -337
  1476. package/src/store/backends/tinybase-backend.ts +0 -276
  1477. package/src/store/backends/types.ts +0 -252
  1478. package/src/store/event-store.ts +0 -2214
  1479. package/src/store/instance.ts +0 -681
  1480. package/src/store/migrations.ts +0 -96
  1481. package/src/store/types/config.ts +0 -19
  1482. package/src/store/types/conversations.ts +0 -129
  1483. package/src/store/types/sessions.ts +0 -53
  1484. package/src/task/__tests__/retry-policy.test.ts +0 -409
  1485. package/src/task/__tests__/task-integration.test.ts +0 -457
  1486. package/src/task/__tests__/task-manager.test.ts +0 -815
  1487. package/src/task/backend/__tests__/create-task-backend.test.ts +0 -225
  1488. package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +0 -524
  1489. package/src/task/backend/__tests__/memory-pull-mode.test.ts +0 -153
  1490. package/src/task/backend/__tests__/memory.test.ts +0 -1274
  1491. package/src/task/backend/__tests__/unified-tool-provider.test.ts +0 -579
  1492. package/src/task/backend/index.ts +0 -310
  1493. package/src/task/backend/memory.ts +0 -828
  1494. package/src/task/backend/opentasks/__tests__/backend.test.ts +0 -968
  1495. package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +0 -406
  1496. package/src/task/backend/opentasks/__tests__/mapping.test.ts +0 -84
  1497. package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +0 -1338
  1498. package/src/task/backend/opentasks/backend.ts +0 -1323
  1499. package/src/task/backend/opentasks/client.ts +0 -652
  1500. package/src/task/backend/opentasks/daemon-manager.ts +0 -256
  1501. package/src/task/backend/opentasks/index.ts +0 -69
  1502. package/src/task/backend/opentasks/mapping.ts +0 -94
  1503. package/src/task/backend/types.ts +0 -458
  1504. package/src/task/backend/unified-tool-provider.ts +0 -779
  1505. package/src/task/index.ts +0 -7
  1506. package/src/task/retry-policy.ts +0 -204
  1507. package/src/task/task-manager.ts +0 -515
  1508. package/src/task/types.ts +0 -136
  1509. package/src/teams/CLAUDE.md +0 -180
  1510. package/src/teams/__tests__/cross-subsystem.integration.test.ts +0 -983
  1511. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +0 -553
  1512. package/src/teams/__tests__/e2e/workspace-isolation.e2e.test.ts +0 -1263
  1513. package/src/teams/__tests__/team-manager.test.ts +0 -814
  1514. package/src/teams/__tests__/team-system.test.ts +0 -2563
  1515. package/src/teams/team-manager.ts +0 -387
  1516. package/src/teams/team-runtime.ts +0 -1198
  1517. package/src/trigger/CLAUDE.md +0 -308
  1518. package/src/trigger/README.md +0 -429
  1519. package/src/trigger/__tests__/macro-agent-regression.test.ts +0 -946
  1520. package/src/trigger/__tests__/routing-strategies.test.ts +0 -329
  1521. package/src/trigger/__tests__/trigger-router.test.ts +0 -433
  1522. package/src/trigger/__tests__/trigger-system-integration.test.ts +0 -581
  1523. package/src/trigger/router/index.ts +0 -36
  1524. package/src/trigger/router/strategies/ai-router-strategy.ts +0 -481
  1525. package/src/trigger/router/strategies/direct-strategy.ts +0 -162
  1526. package/src/trigger/router/strategies/index.ts +0 -26
  1527. package/src/trigger/router/strategies/role-strategy.ts +0 -274
  1528. package/src/trigger/router/trigger-router.ts +0 -463
  1529. package/src/trigger/router/types.ts +0 -273
  1530. package/src/trigger/trigger-system.ts +0 -206
  1531. package/src/workspace/__tests__/multi-coordinator.test.ts +0 -1005
  1532. package/src/workspace/__tests__/workspace-manager.test.ts +0 -391
  1533. package/src/workspace/__tests__/workspace.e2e.test.ts +0 -1155
  1534. package/src/workspace/merge-queue/__tests__/hierarchical-consolidation.e2e.test.ts +0 -414
  1535. package/test_fixtures/harness/__tests__/behavior-executor-and-stepper.test.ts +0 -714
  1536. package/test_fixtures/harness/__tests__/fixtures.test.ts +0 -347
  1537. package/test_fixtures/harness/__tests__/merge-queue-and-worktrees.test.ts +0 -452
  1538. package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -422
  1539. package/test_fixtures/harness/__tests__/test-harness-and-assertions.test.ts +0 -568
  1540. /package/{references/acp-factory-ref/python/tests/__init__.py → .opentasks/graph.jsonl} +0 -0
@@ -1,2563 +0,0 @@
1
- /**
2
- * Team System Tests
3
- *
4
- * Tests loading team templates, runtime initialization, bootstrap,
5
- * and integration between team subsystems (roles, communication,
6
- * strategies, task modes).
7
- */
8
-
9
- import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
10
- import * as path from "path";
11
- import { loadTeam } from "../team-loader.js";
12
- import { TeamRuntime, type TeamServices } from "../team-runtime.js";
13
- import { DefaultRoleRegistry } from "../../roles/registry.js";
14
- import type { RoleDefinition } from "../../roles/types.js";
15
- import type { AgentManager, SpawnInterceptor } from "../../agent/agent-manager.js";
16
- import type { MessageRouter } from "../../router/message-router.js";
17
- import type { EventStore } from "../../store/event-store.js";
18
- import type { SpawnAgentOptions } from "../../agent/types.js";
19
- import type { AgentId, Event } from "../../store/types/index.js";
20
- import { TeamLoadError } from "../types.js";
21
- import type { MacroResolvedTemplate, ResolvedTeamRole, McpServerEntry } from "../types.js";
22
-
23
- // =============================================================================
24
- // Helpers
25
- // =============================================================================
26
-
27
- const PROJECT_ROOT = path.resolve(import.meta.dirname, "../../..");
28
-
29
- function createMockEventStore(): EventStore {
30
- const events: Event[] = [];
31
- return {
32
- emit: vi.fn((input: Record<string, unknown>) => {
33
- const event = {
34
- id: `evt_${events.length}`,
35
- type: input.type,
36
- timestamp: Date.now(),
37
- source: input.source,
38
- target: input.target,
39
- payload: input.payload,
40
- } as unknown as Event;
41
- events.push(event);
42
- return event;
43
- }),
44
- persist: vi.fn().mockResolvedValue(undefined),
45
- close: vi.fn().mockResolvedValue(undefined),
46
- query: vi.fn().mockReturnValue([]),
47
- getAgent: vi.fn().mockReturnValue(null),
48
- getTask: vi.fn().mockReturnValue(null),
49
- listAgents: vi.fn().mockReturnValue([]),
50
- onAgentChange: vi.fn(),
51
- onTaskChange: vi.fn(),
52
- instanceId: "test-instance",
53
- _events: events,
54
- } as unknown as EventStore & { _events: Event[] };
55
- }
56
-
57
- function createMockMessageRouter(): MessageRouter {
58
- return {
59
- sendToAddress: vi.fn().mockResolvedValue({ delivered: true }),
60
- emitStatus: vi.fn(),
61
- getMessages: vi.fn().mockReturnValue([]),
62
- subscribe: vi.fn(),
63
- unsubscribe: vi.fn(),
64
- getSubscriptions: vi.fn().mockReturnValue([]),
65
- setupDefaultSubscriptions: vi.fn(),
66
- setSignalFilter: vi.fn(),
67
- setEmissionValidator: vi.fn(),
68
- } as unknown as MessageRouter;
69
- }
70
-
71
- let spawnCounter = 0;
72
- let capturedInterceptor: SpawnInterceptor | null = null;
73
- let interceptedSpawnOptions: SpawnAgentOptions[] = [];
74
-
75
- function createMockAgentManager(roleRegistry: DefaultRoleRegistry): AgentManager {
76
- capturedInterceptor = null;
77
- spawnCounter = 0;
78
- interceptedSpawnOptions = [];
79
-
80
- return {
81
- spawn: vi.fn(async (options: SpawnAgentOptions) => {
82
- // Apply interceptor if set and record the intercepted options
83
- const opts = capturedInterceptor ? capturedInterceptor(options) : options;
84
- interceptedSpawnOptions.push(opts);
85
- const id = `agent_${spawnCounter++}`;
86
- return {
87
- id,
88
- session_id: `session_${id}`,
89
- task: opts.task ?? "test",
90
- state: "running" as const,
91
- created_at: Date.now(),
92
- parent: opts.parent ?? null,
93
- role: opts.role,
94
- config: opts.config,
95
- _spawnOptions: opts,
96
- };
97
- }),
98
- terminate: vi.fn().mockResolvedValue(undefined),
99
- get: vi.fn().mockReturnValue(null),
100
- list: vi.fn().mockReturnValue([]),
101
- getChildren: vi.fn().mockReturnValue([]),
102
- getHierarchy: vi.fn().mockReturnValue(null),
103
- getSession: vi.fn().mockReturnValue(null),
104
- hasActiveSession: vi.fn().mockReturnValue(false),
105
- setSpawnInterceptor: vi.fn((interceptor: SpawnInterceptor | null) => {
106
- capturedInterceptor = interceptor;
107
- }),
108
- getRoleRegistry: vi.fn(() => roleRegistry),
109
- onLifecycleEvent: vi.fn(() => vi.fn()),
110
- continueAgent: vi.fn().mockResolvedValue({ id: "continued_0" }),
111
- close: vi.fn().mockResolvedValue(undefined),
112
- getOrCreateHeadManager: vi.fn(),
113
- prompt: vi.fn(),
114
- isPrompting: vi.fn().mockReturnValue(false),
115
- } as unknown as AgentManager;
116
- }
117
-
118
- // =============================================================================
119
- // Tests: Team Loading
120
- // =============================================================================
121
-
122
- describe("Team Template Loading", () => {
123
- let roleRegistry: DefaultRoleRegistry;
124
-
125
- beforeEach(() => {
126
- roleRegistry = new DefaultRoleRegistry();
127
- });
128
-
129
- it("loads self-driving team template", async () => {
130
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
131
-
132
- expect(manifest.name).toBe("self-driving");
133
- expect(manifest.version).toBe(1);
134
- expect(manifest.roles).toEqual(["planner", "grinder", "judge"]);
135
- });
136
-
137
- it("resolves self-driving roles with correct base roles", async () => {
138
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
139
-
140
- const planner = manifest._resolvedRoles.get("planner");
141
- expect(planner).toBeDefined();
142
- expect(planner!.baseRole).toBe("coordinator");
143
-
144
- const grinder = manifest._resolvedRoles.get("grinder");
145
- expect(grinder).toBeDefined();
146
- expect(grinder!.baseRole).toBe("worker");
147
-
148
- const judge = manifest._resolvedRoles.get("judge");
149
- expect(judge).toBeDefined();
150
- expect(judge!.baseRole).toBe("monitor");
151
- });
152
-
153
- it("resolves capability additions and removals", async () => {
154
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
155
-
156
- const planner = manifest._resolvedRoles.get("planner");
157
- expect(planner!.capabilities).toContain("task.claim");
158
- expect(planner!.capabilities).not.toContain("agent.spawn.integrator");
159
- expect(planner!.capabilities).not.toContain("agent.spawn.monitor");
160
-
161
- const grinder = manifest._resolvedRoles.get("grinder");
162
- expect(grinder!.capabilities).toContain("task.claim");
163
- expect(grinder!.capabilities).toContain("git.push");
164
- });
165
-
166
- it("translates spawn_rules into capabilities", async () => {
167
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
168
-
169
- const planner = manifest._resolvedRoles.get("planner");
170
- expect(planner!.capabilities).toContain("agent.spawn.grinder");
171
- expect(planner!.capabilities).toContain("agent.spawn.planner");
172
-
173
- // Judge and grinder have no spawn rules → no spawn capabilities
174
- const judge = manifest._resolvedRoles.get("judge");
175
- expect(judge!.capabilities.filter((c) => c.startsWith("agent.spawn."))).toEqual([]);
176
- });
177
-
178
- it("loads prompt files", async () => {
179
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
180
-
181
- expect(manifest._loadedPrompts.has("prompts/planner.md")).toBe(true);
182
- expect(manifest._loadedPrompts.has("prompts/grinder.md")).toBe(true);
183
- expect(manifest._loadedPrompts.has("prompts/judge.md")).toBe(true);
184
-
185
- const plannerPrompt = manifest._loadedPrompts.get("prompts/planner.md")!;
186
- expect(plannerPrompt).toContain("Planner");
187
- });
188
-
189
- it("parses macro_agent extensions", async () => {
190
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
191
-
192
- expect(manifest.macro_agent.task_assignment?.mode).toBe("pull");
193
- expect(manifest.macro_agent.integration?.strategy).toBe("trunk");
194
- expect(manifest.macro_agent.lifecycle?.continuations?.enabled).toBe(true);
195
- expect(manifest.macro_agent.lifecycle?.scaling?.max_workers).toBe(20);
196
- });
197
-
198
- it("validates communication topology", async () => {
199
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
200
-
201
- expect(manifest.communication.channels).toBeDefined();
202
- expect(Object.keys(manifest.communication.channels!)).toContain("task_updates");
203
- expect(Object.keys(manifest.communication.channels!)).toContain("work_coordination");
204
- expect(Object.keys(manifest.communication.channels!)).toContain("health");
205
-
206
- expect(manifest.communication.subscriptions?.planner).toBeDefined();
207
- expect(manifest.communication.emissions?.planner).toContain("TASK_CREATED");
208
- });
209
-
210
- it("loads structured team template", async () => {
211
- const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
212
-
213
- expect(manifest.name).toBe("structured");
214
- expect(manifest.roles).toEqual(["lead", "developer", "reviewer", "merger"]);
215
- expect(manifest.macro_agent.task_assignment?.mode).toBe("push");
216
- expect(manifest.macro_agent.integration?.strategy).toBe("queue");
217
- });
218
-
219
- it("resolves structured roles", async () => {
220
- const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
221
-
222
- const lead = manifest._resolvedRoles.get("lead");
223
- expect(lead!.baseRole).toBe("coordinator");
224
-
225
- const developer = manifest._resolvedRoles.get("developer");
226
- expect(developer!.baseRole).toBe("worker");
227
-
228
- const reviewer = manifest._resolvedRoles.get("reviewer");
229
- expect(reviewer!.baseRole).toBe("monitor");
230
- expect(reviewer!.capabilities).toContain("exec.build");
231
- expect(reviewer!.capabilities).toContain("exec.test");
232
- });
233
- });
234
-
235
- // =============================================================================
236
- // Tests: TeamRuntime
237
- // =============================================================================
238
-
239
- describe("TeamRuntime", () => {
240
- let roleRegistry: DefaultRoleRegistry;
241
- let agentManager: AgentManager;
242
- let messageRouter: MessageRouter;
243
- let eventStore: EventStore & { _events: Event[] };
244
- let services: TeamServices;
245
-
246
- beforeEach(() => {
247
- roleRegistry = new DefaultRoleRegistry();
248
- eventStore = createMockEventStore() as EventStore & { _events: Event[] };
249
- messageRouter = createMockMessageRouter();
250
- agentManager = createMockAgentManager(roleRegistry);
251
- services = { agentManager, messageRouter, eventStore };
252
- });
253
-
254
- describe("initialize()", () => {
255
- it("registers team roles in the role registry", async () => {
256
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
257
- const runtime = new TeamRuntime(manifest, services);
258
-
259
- await runtime.initialize();
260
-
261
- // Roles should be registered in the registry
262
- expect(roleRegistry.getRole("planner")).toBeDefined();
263
- expect(roleRegistry.getRole("grinder")).toBeDefined();
264
- expect(roleRegistry.getRole("judge")).toBeDefined();
265
- });
266
-
267
- it("emits team_config event to EventStore", async () => {
268
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
269
- const runtime = new TeamRuntime(manifest, services);
270
-
271
- await runtime.initialize();
272
-
273
- expect(eventStore.emit).toHaveBeenCalledWith(
274
- expect.objectContaining({
275
- type: "status",
276
- payload: expect.objectContaining({
277
- status_type: "discovery",
278
- team_config: expect.objectContaining({
279
- teamName: "self-driving",
280
- strategy: "trunk",
281
- taskMode: "pull",
282
- }),
283
- }),
284
- })
285
- );
286
- });
287
-
288
- it("does not install spawn interceptor directly (TeamManager responsibility)", async () => {
289
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
290
- const runtime = new TeamRuntime(manifest, services);
291
-
292
- await runtime.initialize();
293
-
294
- // initialize() no longer installs interceptor — that's TeamManager's job
295
- expect(agentManager.setSpawnInterceptor).not.toHaveBeenCalled();
296
- });
297
-
298
- it("installOnServices() sets spawn interceptor on agent manager", async () => {
299
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
300
- const runtime = new TeamRuntime(manifest, services);
301
-
302
- await runtime.initialize();
303
- runtime.installOnServices();
304
-
305
- expect(agentManager.setSpawnInterceptor).toHaveBeenCalledWith(
306
- expect.any(Function)
307
- );
308
- });
309
- });
310
-
311
- describe("bootstrap()", () => {
312
- it("spawns root and companion agents", async () => {
313
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
314
- const runtime = new TeamRuntime(manifest, services);
315
-
316
- await runtime.initialize();
317
- const result = await runtime.bootstrap();
318
-
319
- expect(result.rootId).toBeDefined();
320
- expect(result.companionIds).toHaveLength(1); // judge is the companion
321
-
322
- // Two spawn calls: planner (root) + judge (companion)
323
- expect(agentManager.spawn).toHaveBeenCalledTimes(2);
324
- });
325
-
326
- it("spawns root with correct role and model", async () => {
327
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
328
- const runtime = new TeamRuntime(manifest, services);
329
-
330
- await runtime.initialize();
331
- await runtime.bootstrap();
332
-
333
- const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
334
- const rootCall = spawnCalls[0][0];
335
-
336
- expect(rootCall.role).toBe("planner");
337
- expect(rootCall.config?.model).toBe("sonnet");
338
- expect(rootCall.parent).toBeNull();
339
- });
340
-
341
- it("spawns companion as peer (not child)", async () => {
342
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
343
- const runtime = new TeamRuntime(manifest, services);
344
-
345
- await runtime.initialize();
346
- await runtime.bootstrap();
347
-
348
- const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
349
- const companionCall = spawnCalls[1][0];
350
-
351
- expect(companionCall.role).toBe("judge");
352
- expect(companionCall.config?.model).toBe("haiku");
353
- expect(companionCall.parent).toBeNull();
354
- });
355
-
356
- it("wires config-driven peer subscriptions from routing.peers", async () => {
357
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
358
- const runtime = new TeamRuntime(manifest, services);
359
-
360
- await runtime.initialize();
361
- const result = await runtime.bootstrap();
362
-
363
- // self-driving has 2 peer entries: judge→planner + planner→judge, both via: "direct"
364
- // Each creates one directional subtree subscription
365
- expect(messageRouter.subscribe).toHaveBeenCalledTimes(2);
366
-
367
- // judge (agent_1) subscribes to planner's (agent_0) subtree
368
- expect(messageRouter.subscribe).toHaveBeenCalledWith(
369
- result.companionIds[0], // judge = agent_1
370
- { type: "subtree", target: result.rootId } // planner = agent_0
371
- );
372
-
373
- // planner (agent_0) subscribes to judge's (agent_1) subtree
374
- expect(messageRouter.subscribe).toHaveBeenCalledWith(
375
- result.rootId, // planner = agent_0
376
- { type: "subtree", target: result.companionIds[0] } // judge = agent_1
377
- );
378
- });
379
-
380
- it("injects interaction patterns for pull mode", async () => {
381
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
382
- const runtime = new TeamRuntime(manifest, services);
383
-
384
- await runtime.initialize();
385
- await runtime.bootstrap();
386
-
387
- const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
388
- const rootCall = spawnCalls[0][0];
389
-
390
- expect(rootCall.interactionPatterns).toBeDefined();
391
- expect(rootCall.interactionPatterns!.length).toBeGreaterThan(0);
392
- expect(rootCall.interactionPatterns!.some((p) => p.includes("PULL mode"))).toBe(true);
393
- expect(rootCall.interactionPatterns!.some((p) => p.includes("trunk"))).toBe(true);
394
- });
395
-
396
- it("provides team prompts to spawned agents", async () => {
397
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
398
- const runtime = new TeamRuntime(manifest, services);
399
-
400
- await runtime.initialize();
401
- await runtime.bootstrap();
402
-
403
- const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
404
- const rootCall = spawnCalls[0][0];
405
-
406
- expect(rootCall.customPrompt).toBeDefined();
407
- expect(rootCall.customPrompt).toContain("Planner");
408
- });
409
- });
410
-
411
- describe("spawn interceptor", () => {
412
- it("injects team topics into spawned agent options", async () => {
413
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
414
- const runtime = new TeamRuntime(manifest, services);
415
-
416
- await runtime.initialize();
417
- runtime.installOnServices();
418
- await runtime.bootstrap();
419
-
420
- // Now spawn a grinder through the interceptor
421
- await agentManager.spawn({
422
- task: "test grinder task",
423
- role: "grinder",
424
- parent: "agent_0",
425
- });
426
-
427
- // Check the intercepted options (not the original args)
428
- const lastOpts = interceptedSpawnOptions.at(-1)!;
429
- // Interceptor should have added topics for grinder subscriptions
430
- expect(lastOpts.topics).toBeDefined();
431
- expect(lastOpts.topics).toContain("work_coordination");
432
- });
433
-
434
- it("injects team environment variables", async () => {
435
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
436
- const runtime = new TeamRuntime(manifest, services);
437
-
438
- await runtime.initialize();
439
- runtime.installOnServices();
440
- await runtime.bootstrap();
441
-
442
- // Spawn a grinder
443
- await agentManager.spawn({
444
- task: "test task",
445
- role: "grinder",
446
- parent: "agent_0",
447
- });
448
-
449
- const lastOpts = interceptedSpawnOptions.at(-1)!;
450
- expect(lastOpts.config?.env?.MACRO_TEAM_NAME).toBe("self-driving");
451
- expect(lastOpts.config?.env?.MACRO_TASK_MODE).toBe("pull");
452
- expect(lastOpts.config?.env?.MACRO_INTEGRATION_STRATEGY).toBe("trunk");
453
- });
454
-
455
- it("does not override caller-provided options", async () => {
456
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
457
- const runtime = new TeamRuntime(manifest, services);
458
-
459
- await runtime.initialize();
460
- runtime.installOnServices();
461
- await runtime.bootstrap();
462
-
463
- const customPrompt = "My custom prompt";
464
- await agentManager.spawn({
465
- task: "test task",
466
- role: "grinder",
467
- parent: "agent_0",
468
- customPrompt,
469
- });
470
-
471
- const lastOpts = interceptedSpawnOptions.at(-1)!;
472
- expect(lastOpts.customPrompt).toBe(customPrompt);
473
- });
474
- });
475
-
476
- describe("getters", () => {
477
- it("returns task mode and strategy", async () => {
478
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
479
- const runtime = new TeamRuntime(manifest, services);
480
-
481
- expect(runtime.getTaskMode()).toBe("pull");
482
- expect(runtime.getStrategyName()).toBe("trunk");
483
- });
484
-
485
- it("returns agent IDs after bootstrap", async () => {
486
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
487
- const runtime = new TeamRuntime(manifest, services);
488
-
489
- await runtime.initialize();
490
- const result = await runtime.bootstrap();
491
-
492
- expect(runtime.getRootAgentId()).toBe(result.rootId);
493
- expect(runtime.getCompanionAgentIds()).toEqual(result.companionIds);
494
- });
495
- });
496
-
497
- describe("teardown()", () => {
498
- it("does not clear interceptor directly (caller responsibility)", async () => {
499
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
500
- const runtime = new TeamRuntime(manifest, services);
501
-
502
- await runtime.initialize();
503
- runtime.installOnServices();
504
- await runtime.bootstrap();
505
-
506
- // Reset mock to track only teardown-related calls
507
- vi.mocked(agentManager.setSpawnInterceptor).mockClear();
508
-
509
- await runtime.teardown();
510
-
511
- // teardown() no longer clears interceptor — that's the caller's responsibility
512
- expect(agentManager.setSpawnInterceptor).not.toHaveBeenCalled();
513
- });
514
-
515
- it("uninstallFromServices() clears spawn interceptor", async () => {
516
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
517
- const runtime = new TeamRuntime(manifest, services);
518
-
519
- await runtime.initialize();
520
- runtime.installOnServices();
521
- await runtime.bootstrap();
522
- await runtime.teardown();
523
- runtime.uninstallFromServices();
524
-
525
- expect(agentManager.setSpawnInterceptor).toHaveBeenLastCalledWith(null);
526
- });
527
- });
528
-
529
- describe("peer routing", () => {
530
- it("stores signal filters from peer connections", async () => {
531
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
532
- const runtime = new TeamRuntime(manifest, services);
533
-
534
- await runtime.initialize();
535
- const result = await runtime.bootstrap();
536
-
537
- const filters = runtime.getPeerSignalFilters();
538
-
539
- // judge→planner has signals: [FIXUP_CREATED, GREEN_SNAPSHOT]
540
- const judgeToPlanner = filters.get(`${result.companionIds[0]}→${result.rootId}`);
541
- expect(judgeToPlanner).toEqual(["FIXUP_CREATED", "GREEN_SNAPSHOT"]);
542
-
543
- // planner→judge has signals: [CONVERGENCE_CHECK]
544
- const plannerToJudge = filters.get(`${result.rootId}→${result.companionIds[0]}`);
545
- expect(plannerToJudge).toEqual(["CONVERGENCE_CHECK"]);
546
- });
547
-
548
- it("falls back to legacy subtree subscriptions when no peers config", async () => {
549
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
550
-
551
- // Remove routing.peers to test fallback
552
- manifest.communication.routing = { status: "upstream" };
553
-
554
- const runtime = new TeamRuntime(manifest, services);
555
-
556
- await runtime.initialize();
557
- const result = await runtime.bootstrap();
558
-
559
- // Legacy: 2 bidirectional subtree subs (root→companion + companion→root)
560
- expect(messageRouter.subscribe).toHaveBeenCalledTimes(2);
561
- expect(messageRouter.subscribe).toHaveBeenCalledWith(
562
- result.rootId,
563
- { type: "subtree", target: result.companionIds[0] }
564
- );
565
- expect(messageRouter.subscribe).toHaveBeenCalledWith(
566
- result.companionIds[0],
567
- { type: "subtree", target: result.rootId }
568
- );
569
- });
570
-
571
- it("defers wiring for roles not spawned at bootstrap", async () => {
572
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
573
-
574
- // Add a peer connection involving grinder (not spawned at bootstrap)
575
- manifest.communication.routing!.peers!.push({
576
- from: "grinder",
577
- to: "planner",
578
- via: "direct",
579
- signals: ["WORKER_DONE"],
580
- });
581
-
582
- const runtime = new TeamRuntime(manifest, services);
583
-
584
- await runtime.initialize();
585
- const result = await runtime.bootstrap();
586
-
587
- // 2 wired at bootstrap (judge↔planner) + 1 deferred (grinder→planner)
588
- expect(messageRouter.subscribe).toHaveBeenCalledTimes(2);
589
-
590
- // onLifecycleEvent should have been called twice: once for deferred wiring, once for continuations
591
- expect(agentManager.onLifecycleEvent).toHaveBeenCalledTimes(2);
592
-
593
- // Simulate grinder spawn via lifecycle event
594
- const lifecycleCallbacks = vi.mocked(agentManager.onLifecycleEvent).mock.calls;
595
- // The deferred wiring callback is the first one registered (wirePeerRoutes before monitorContinuations)
596
- const deferredCallback = lifecycleCallbacks[0][0];
597
-
598
- deferredCallback({
599
- type: "spawned",
600
- agent: { id: "grinder_agent", role: "grinder", state: "running" },
601
- } as any);
602
-
603
- // Now the deferred route should be wired
604
- expect(messageRouter.subscribe).toHaveBeenCalledTimes(3);
605
- expect(messageRouter.subscribe).toHaveBeenCalledWith(
606
- "grinder_agent",
607
- { type: "subtree", target: result.rootId }
608
- );
609
-
610
- // Signal filter should be stored
611
- const filters = runtime.getPeerSignalFilters();
612
- expect(filters.get(`grinder_agent→${result.rootId}`)).toEqual(["WORKER_DONE"]);
613
- });
614
-
615
- it("serializes peerRoutes in team_config event", async () => {
616
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
617
- const runtime = new TeamRuntime(manifest, services);
618
-
619
- await runtime.initialize();
620
-
621
- expect(eventStore.emit).toHaveBeenCalledWith(
622
- expect.objectContaining({
623
- type: "status",
624
- payload: expect.objectContaining({
625
- team_config: expect.objectContaining({
626
- peerRoutes: expect.arrayContaining([
627
- expect.objectContaining({
628
- from: "judge",
629
- to: "planner",
630
- via: "direct",
631
- signals: ["FIXUP_CREATED", "GREEN_SNAPSHOT"],
632
- }),
633
- ]),
634
- }),
635
- }),
636
- })
637
- );
638
- });
639
-
640
- it("teardown cleans up deferred wiring listener", async () => {
641
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
642
-
643
- // Add a deferred route to ensure the wiring listener is set up
644
- manifest.communication.routing!.peers!.push({
645
- from: "grinder",
646
- to: "judge",
647
- via: "direct",
648
- });
649
-
650
- const runtime = new TeamRuntime(manifest, services);
651
-
652
- await runtime.initialize();
653
- await runtime.bootstrap();
654
-
655
- // onLifecycleEvent called twice: deferred wiring + continuations
656
- expect(agentManager.onLifecycleEvent).toHaveBeenCalledTimes(2);
657
-
658
- // Both return unsubscribe fns (index 0 = deferred wiring, index 1 = continuations)
659
- const peerWiringUnsub = vi.mocked(agentManager.onLifecycleEvent).mock.results[0].value;
660
- const continuationsUnsub = vi.mocked(agentManager.onLifecycleEvent).mock.results[1].value;
661
-
662
- await runtime.teardown();
663
-
664
- // Both unsubscribe fns should be called
665
- expect(peerWiringUnsub).toHaveBeenCalled();
666
- expect(continuationsUnsub).toHaveBeenCalled();
667
- });
668
-
669
- it("via topic creates shared topic subscription", async () => {
670
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
671
-
672
- // Replace peers with a topic-based connection
673
- manifest.communication.routing!.peers = [
674
- { from: "planner", to: "judge", via: "topic" },
675
- ];
676
-
677
- const runtime = new TeamRuntime(manifest, services);
678
-
679
- await runtime.initialize();
680
- const result = await runtime.bootstrap();
681
-
682
- // Topic creates 2 subscriptions: both agents to the same topic
683
- expect(messageRouter.subscribe).toHaveBeenCalledTimes(2);
684
- expect(messageRouter.subscribe).toHaveBeenCalledWith(
685
- result.rootId, // planner
686
- { type: "topic", target: "peer:planner:judge" }
687
- );
688
- expect(messageRouter.subscribe).toHaveBeenCalledWith(
689
- result.companionIds[0], // judge
690
- { type: "topic", target: "peer:planner:judge" }
691
- );
692
- });
693
-
694
- it("via scope creates role subscription", async () => {
695
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
696
-
697
- // Replace peers with a scope-based connection
698
- manifest.communication.routing!.peers = [
699
- { from: "planner", to: "judge", via: "scope" },
700
- ];
701
-
702
- const runtime = new TeamRuntime(manifest, services);
703
-
704
- await runtime.initialize();
705
- const result = await runtime.bootstrap();
706
-
707
- // Scope creates 1 subscription: from subscribes to to's role channel
708
- expect(messageRouter.subscribe).toHaveBeenCalledTimes(1);
709
- expect(messageRouter.subscribe).toHaveBeenCalledWith(
710
- result.rootId, // planner
711
- { type: "role", target: "judge" }
712
- );
713
- });
714
- });
715
-
716
- describe("signal filtering", () => {
717
- it("installOnServices() installs signal filter on message router", async () => {
718
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
719
- const runtime = new TeamRuntime(manifest, services);
720
-
721
- await runtime.initialize();
722
- // bootstrap/initialize alone should NOT install filter
723
- await runtime.bootstrap();
724
- expect(messageRouter.setSignalFilter).not.toHaveBeenCalled();
725
-
726
- // installOnServices() installs the filter
727
- runtime.installOnServices();
728
- expect(messageRouter.setSignalFilter).toHaveBeenCalledTimes(1);
729
- expect(messageRouter.setSignalFilter).toHaveBeenCalledWith(expect.any(Function));
730
- });
731
-
732
- it("peer connection filter allows matching signals", async () => {
733
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
734
- const runtime = new TeamRuntime(manifest, services);
735
-
736
- await runtime.initialize();
737
- const result = await runtime.bootstrap();
738
- runtime.installOnServices();
739
-
740
- // Extract the installed filter
741
- const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
742
- from: string, to: string, signal: string | undefined
743
- ) => boolean;
744
-
745
- const judgeId = result.companionIds[0]; // judge
746
- const plannerId = result.rootId; // planner
747
-
748
- // judge→planner peer has signals: [FIXUP_CREATED, GREEN_SNAPSHOT]
749
- expect(filterFn(judgeId, plannerId, "FIXUP_CREATED")).toBe(true);
750
- expect(filterFn(judgeId, plannerId, "GREEN_SNAPSHOT")).toBe(true);
751
- });
752
-
753
- it("peer connection filter blocks non-matching signals", async () => {
754
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
755
- const runtime = new TeamRuntime(manifest, services);
756
-
757
- await runtime.initialize();
758
- const result = await runtime.bootstrap();
759
- runtime.installOnServices();
760
-
761
- const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
762
- from: string, to: string, signal: string | undefined
763
- ) => boolean;
764
-
765
- const judgeId = result.companionIds[0];
766
- const plannerId = result.rootId;
767
-
768
- // judge→planner peer does NOT include WORKER_DONE
769
- expect(filterFn(judgeId, plannerId, "WORKER_DONE")).toBe(false);
770
- });
771
-
772
- it("untagged status events always pass through", async () => {
773
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
774
- const runtime = new TeamRuntime(manifest, services);
775
-
776
- await runtime.initialize();
777
- const result = await runtime.bootstrap();
778
- runtime.installOnServices();
779
-
780
- const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
781
- from: string, to: string, signal: string | undefined
782
- ) => boolean;
783
-
784
- const judgeId = result.companionIds[0];
785
- const plannerId = result.rootId;
786
-
787
- // No signal (undefined) should always pass
788
- expect(filterFn(judgeId, plannerId, undefined)).toBe(true);
789
- });
790
-
791
- it("channel subscription filter allows role's configured signals", async () => {
792
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
793
- const runtime = new TeamRuntime(manifest, services);
794
-
795
- await runtime.initialize();
796
- const result = await runtime.bootstrap();
797
- runtime.installOnServices();
798
-
799
- const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
800
- from: string, to: string, signal: string | undefined
801
- ) => boolean;
802
-
803
- // Use a "grinder" agent as recipient - grinder only allows WORK_ASSIGNED
804
- // Simulate spawning a grinder by triggering deferred wiring
805
- // But grinder has no peer connection, so we test channel sub filter directly
806
- // by spawning through the lifecycle event to populate agentRoleMap
807
-
808
- // Add a grinder peer route so deferred wiring populates agentRoleMap
809
- manifest.communication.routing!.peers!.push({
810
- from: "grinder",
811
- to: "planner",
812
- via: "direct",
813
- });
814
-
815
- // Re-bootstrap with updated manifest
816
- const runtime2 = new TeamRuntime(manifest, services);
817
- await runtime2.initialize();
818
- const result2 = await runtime2.bootstrap();
819
- runtime2.installOnServices();
820
-
821
- // Simulate grinder spawn via lifecycle event
822
- const deferredCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls.at(-2)![0];
823
- deferredCallback({
824
- type: "spawned",
825
- agent: { id: "grinder_1", role: "grinder", state: "running" },
826
- } as any);
827
-
828
- // Get the latest filter (from runtime2's installSignalFilter)
829
- const filterFn2 = vi.mocked(messageRouter.setSignalFilter).mock.calls.at(-1)![0] as (
830
- from: string, to: string, signal: string | undefined
831
- ) => boolean;
832
-
833
- // grinder allows WORK_ASSIGNED from channel subs
834
- // But grinder→planner is a peer route (no signal filter), so test from a non-peer source
835
- // From planner to grinder_1 (no peer filter exists for this direction)
836
- expect(filterFn2(result2.rootId, "grinder_1", "WORK_ASSIGNED")).toBe(true);
837
- expect(filterFn2(result2.rootId, "grinder_1", "WORKER_DONE")).toBe(false);
838
- });
839
-
840
- it("roles with any unfiltered subscription receive all signals", async () => {
841
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
842
- const runtime = new TeamRuntime(manifest, services);
843
-
844
- await runtime.initialize();
845
- const result = await runtime.bootstrap();
846
- runtime.installOnServices();
847
-
848
- const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
849
- from: string, to: string, signal: string | undefined
850
- ) => boolean;
851
-
852
- // planner has task_updates subscription with no signals filter → receives all
853
- // But planner's peer connections have explicit filters, so test from a non-peer agent
854
- // From an unknown agent to planner — falls through to channel sub filter
855
- expect(filterFn("unknown_agent", result.rootId, "ANY_SIGNAL")).toBe(true);
856
- expect(filterFn("unknown_agent", result.rootId, "RANDOM")).toBe(true);
857
- });
858
-
859
- it("peer filter takes precedence over channel subscription filter", async () => {
860
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
861
- const runtime = new TeamRuntime(manifest, services);
862
-
863
- await runtime.initialize();
864
- const result = await runtime.bootstrap();
865
- runtime.installOnServices();
866
-
867
- const filterFn = vi.mocked(messageRouter.setSignalFilter).mock.calls[0][0] as (
868
- from: string, to: string, signal: string | undefined
869
- ) => boolean;
870
-
871
- const judgeId = result.companionIds[0];
872
- const plannerId = result.rootId;
873
-
874
- // judge→planner peer only allows FIXUP_CREATED, GREEN_SNAPSHOT
875
- // Even though planner's channel subs allow "all" (via unfiltered task_updates),
876
- // the peer filter takes precedence
877
- expect(filterFn(judgeId, plannerId, "TASK_CREATED")).toBe(false);
878
- });
879
- });
880
-
881
- describe("emission validation", () => {
882
- it("installOnServices() installs emission validator on message router", async () => {
883
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
884
- const runtime = new TeamRuntime(manifest, services);
885
-
886
- await runtime.initialize();
887
- await runtime.bootstrap();
888
- // bootstrap alone should NOT install validator
889
- expect(messageRouter.setEmissionValidator).not.toHaveBeenCalled();
890
-
891
- // installOnServices() installs the validator
892
- runtime.installOnServices();
893
- expect(messageRouter.setEmissionValidator).toHaveBeenCalledTimes(1);
894
- expect(messageRouter.setEmissionValidator).toHaveBeenCalledWith(expect.any(Function));
895
- });
896
-
897
- it("allows emissions in role's allowed list", async () => {
898
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
899
- const runtime = new TeamRuntime(manifest, services);
900
-
901
- await runtime.initialize();
902
- const result = await runtime.bootstrap();
903
- runtime.installOnServices();
904
-
905
- const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
906
- agentId: string, signal: string | undefined
907
- ) => { action: string; message?: string };
908
-
909
- const plannerId = result.rootId;
910
-
911
- // planner's emissions: [TASK_CREATED, WORK_ASSIGNED]
912
- expect(validatorFn(plannerId, "TASK_CREATED").action).toBe("allow");
913
- expect(validatorFn(plannerId, "WORK_ASSIGNED").action).toBe("allow");
914
- });
915
-
916
- it("rejects disallowed emissions in strict mode", async () => {
917
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
918
- manifest.communication.enforcement = "strict";
919
- const runtime = new TeamRuntime(manifest, services);
920
-
921
- await runtime.initialize();
922
- const result = await runtime.bootstrap();
923
- runtime.installOnServices();
924
-
925
- const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
926
- agentId: string, signal: string | undefined
927
- ) => { action: string; message?: string };
928
-
929
- const plannerId = result.rootId;
930
-
931
- // WORKER_DONE is not in planner's allowed emissions
932
- const res = validatorFn(plannerId, "WORKER_DONE");
933
- expect(res.action).toBe("reject");
934
- expect(res.message).toContain("WORKER_DONE");
935
- expect(res.message).toContain("planner");
936
- });
937
-
938
- it("warns on disallowed emissions in permissive mode", async () => {
939
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
940
- manifest.communication.enforcement = "permissive";
941
- const runtime = new TeamRuntime(manifest, services);
942
-
943
- await runtime.initialize();
944
- const result = await runtime.bootstrap();
945
- runtime.installOnServices();
946
-
947
- const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
948
- agentId: string, signal: string | undefined
949
- ) => { action: string; message?: string };
950
-
951
- const plannerId = result.rootId;
952
-
953
- const res = validatorFn(plannerId, "HEALTH_CHECK");
954
- expect(res.action).toBe("warn");
955
- expect(res.message).toContain("HEALTH_CHECK");
956
- });
957
-
958
- it("audits disallowed emissions in audit mode", async () => {
959
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
960
- manifest.communication.enforcement = "audit";
961
- const runtime = new TeamRuntime(manifest, services);
962
-
963
- await runtime.initialize();
964
- const result = await runtime.bootstrap();
965
- runtime.installOnServices();
966
-
967
- const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
968
- agentId: string, signal: string | undefined
969
- ) => { action: string; message?: string };
970
-
971
- const plannerId = result.rootId;
972
-
973
- const res = validatorFn(plannerId, "FORBIDDEN");
974
- expect(res.action).toBe("audit");
975
- expect(res.message).toContain("FORBIDDEN");
976
- });
977
-
978
- it("allows untagged emissions for any role", async () => {
979
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
980
- manifest.communication.enforcement = "strict";
981
- const runtime = new TeamRuntime(manifest, services);
982
-
983
- await runtime.initialize();
984
- const result = await runtime.bootstrap();
985
- runtime.installOnServices();
986
-
987
- const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
988
- agentId: string, signal: string | undefined
989
- ) => { action: string; message?: string };
990
-
991
- // Undefined signal always passes even in strict mode
992
- expect(validatorFn(result.rootId, undefined).action).toBe("allow");
993
- expect(validatorFn(result.companionIds[0], undefined).action).toBe("allow");
994
- });
995
-
996
- it("allows emissions from agents with no role mapping", async () => {
997
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
998
- manifest.communication.enforcement = "strict";
999
- const runtime = new TeamRuntime(manifest, services);
1000
-
1001
- await runtime.initialize();
1002
- await runtime.bootstrap();
1003
- runtime.installOnServices();
1004
-
1005
- const validatorFn = vi.mocked(messageRouter.setEmissionValidator).mock.calls[0][0] as (
1006
- agentId: string, signal: string | undefined
1007
- ) => { action: string; message?: string };
1008
-
1009
- // Unknown agent — no role mapping, so allowed
1010
- expect(validatorFn("unknown_agent", "ANYTHING").action).toBe("allow");
1011
- });
1012
-
1013
- it("does not install validator when no emissions config", async () => {
1014
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1015
- manifest.communication.emissions = undefined;
1016
- const runtime = new TeamRuntime(manifest, services);
1017
-
1018
- await runtime.initialize();
1019
- await runtime.bootstrap();
1020
- runtime.installOnServices();
1021
-
1022
- // createEmissionValidator() returns null when no emissions → setEmissionValidator not called
1023
- expect(messageRouter.setEmissionValidator).not.toHaveBeenCalled();
1024
- });
1025
-
1026
- it("serializes emissions in team_config event", async () => {
1027
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1028
- const runtime = new TeamRuntime(manifest, services);
1029
-
1030
- await runtime.initialize();
1031
-
1032
- expect(eventStore.emit).toHaveBeenCalledWith(
1033
- expect.objectContaining({
1034
- type: "status",
1035
- payload: expect.objectContaining({
1036
- team_config: expect.objectContaining({
1037
- emissions: expect.objectContaining({
1038
- planner: ["TASK_CREATED", "WORK_ASSIGNED"],
1039
- judge: ["HEALTH_CHECK", "GREEN_SNAPSHOT", "FIXUP_CREATED"],
1040
- grinder: ["WORKER_DONE"],
1041
- }),
1042
- }),
1043
- }),
1044
- })
1045
- );
1046
- });
1047
- });
1048
-
1049
- describe("exposed factory methods (for TeamManager)", () => {
1050
- it("createSpawnInterceptor() returns a function", async () => {
1051
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1052
- const runtime = new TeamRuntime(manifest, services);
1053
-
1054
- await runtime.initialize();
1055
-
1056
- const interceptor = runtime.createSpawnInterceptor();
1057
- expect(interceptor).toBeInstanceOf(Function);
1058
- });
1059
-
1060
- it("createSpawnInterceptor() injects team context", async () => {
1061
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1062
- const runtime = new TeamRuntime(manifest, services);
1063
-
1064
- await runtime.initialize();
1065
-
1066
- const interceptor = runtime.createSpawnInterceptor();
1067
- const result = interceptor({
1068
- task: "test",
1069
- role: "grinder",
1070
- parent: "agent_0",
1071
- });
1072
-
1073
- expect(result.config?.env?.MACRO_TEAM_NAME).toBe("self-driving");
1074
- expect(result.config?.env?.MACRO_TASK_MODE).toBe("pull");
1075
- expect(result.topics).toContain("work_coordination");
1076
- });
1077
-
1078
- it("createSignalFilter() returns a function", async () => {
1079
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1080
- const runtime = new TeamRuntime(manifest, services);
1081
-
1082
- await runtime.initialize();
1083
- await runtime.bootstrap();
1084
-
1085
- const filter = runtime.createSignalFilter();
1086
- expect(filter).toBeInstanceOf(Function);
1087
- });
1088
-
1089
- it("createEmissionValidator() returns a function when emissions exist", async () => {
1090
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1091
- const runtime = new TeamRuntime(manifest, services);
1092
-
1093
- await runtime.initialize();
1094
- await runtime.bootstrap();
1095
-
1096
- const validator = runtime.createEmissionValidator();
1097
- expect(validator).toBeInstanceOf(Function);
1098
- });
1099
-
1100
- it("createEmissionValidator() returns null when no emissions", async () => {
1101
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1102
- manifest.communication.emissions = undefined;
1103
- const runtime = new TeamRuntime(manifest, services);
1104
-
1105
- await runtime.initialize();
1106
- await runtime.bootstrap();
1107
-
1108
- const validator = runtime.createEmissionValidator();
1109
- expect(validator).toBeNull();
1110
- });
1111
-
1112
- it("getAgentRoleMap() returns role mappings after bootstrap", async () => {
1113
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1114
- const runtime = new TeamRuntime(manifest, services);
1115
-
1116
- await runtime.initialize();
1117
- const result = await runtime.bootstrap();
1118
-
1119
- const roleMap = runtime.getAgentRoleMap();
1120
- expect(roleMap.get(result.rootId as AgentId)).toBe("planner");
1121
- expect(roleMap.get(result.companionIds[0] as AgentId)).toBe("judge");
1122
- });
1123
-
1124
- it("registerAgent() adds agent to role map", async () => {
1125
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1126
- const runtime = new TeamRuntime(manifest, services);
1127
-
1128
- await runtime.initialize();
1129
- await runtime.bootstrap();
1130
-
1131
- runtime.registerAgent("new_agent" as AgentId, "grinder");
1132
-
1133
- const roleMap = runtime.getAgentRoleMap();
1134
- expect(roleMap.get("new_agent" as AgentId)).toBe("grinder");
1135
- });
1136
-
1137
- it("hasAgent() returns true for known agents", async () => {
1138
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1139
- const runtime = new TeamRuntime(manifest, services);
1140
-
1141
- await runtime.initialize();
1142
- const result = await runtime.bootstrap();
1143
-
1144
- expect(runtime.hasAgent(result.rootId)).toBe(true);
1145
- expect(runtime.hasAgent(result.companionIds[0])).toBe(true);
1146
- expect(runtime.hasAgent("unknown_agent")).toBe(false);
1147
- });
1148
-
1149
- it("hasAgent() includes dynamically registered agents", async () => {
1150
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1151
- const runtime = new TeamRuntime(manifest, services);
1152
-
1153
- await runtime.initialize();
1154
- await runtime.bootstrap();
1155
-
1156
- expect(runtime.hasAgent("dynamic_agent")).toBe(false);
1157
- runtime.registerAgent("dynamic_agent" as AgentId, "grinder");
1158
- expect(runtime.hasAgent("dynamic_agent")).toBe(true);
1159
- });
1160
- });
1161
-
1162
- describe("monitorContinuations()", () => {
1163
- it("auto-continues root agent on unexpected stop", async () => {
1164
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1165
- const runtime = new TeamRuntime(manifest, services);
1166
-
1167
- await runtime.initialize();
1168
- const result = await runtime.bootstrap();
1169
-
1170
- // Capture the lifecycle callback registered during bootstrap
1171
- const onLifecycleEventMock = vi.mocked(agentManager.onLifecycleEvent);
1172
- expect(onLifecycleEventMock).toHaveBeenCalled();
1173
- const lifecycleCallback = onLifecycleEventMock.mock.calls[0][0];
1174
-
1175
- // Simulate unexpected stop of root agent (no reason = unexpected)
1176
- lifecycleCallback({
1177
- type: "stopped",
1178
- agent: { id: result.rootId, role: "planner", state: "stopped" },
1179
- } as any);
1180
-
1181
- // Wait for the setTimeout (1s) + async continuation
1182
- await vi.waitFor(
1183
- () => {
1184
- expect(agentManager.continueAgent).toHaveBeenCalledWith(result.rootId);
1185
- },
1186
- { timeout: 3000 }
1187
- );
1188
-
1189
- // Root agent ID should be updated to the continued agent
1190
- expect(runtime.getRootAgentId()).toBe("continued_0");
1191
- });
1192
-
1193
- it("auto-continues companion agent on unexpected stop", async () => {
1194
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1195
- const runtime = new TeamRuntime(manifest, services);
1196
-
1197
- await runtime.initialize();
1198
- const result = await runtime.bootstrap();
1199
- const companionId = result.companionIds[0];
1200
-
1201
- const lifecycleCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls[0][0];
1202
-
1203
- // Simulate unexpected stop of companion
1204
- lifecycleCallback({
1205
- type: "stopped",
1206
- agent: { id: companionId, role: "judge", state: "stopped" },
1207
- } as any);
1208
-
1209
- await vi.waitFor(
1210
- () => {
1211
- expect(agentManager.continueAgent).toHaveBeenCalledWith(companionId);
1212
- },
1213
- { timeout: 3000 }
1214
- );
1215
-
1216
- // Companion ID should be updated
1217
- expect(runtime.getCompanionAgentIds()).toContain("continued_0");
1218
- });
1219
-
1220
- it("does NOT auto-continue on completed stop", async () => {
1221
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1222
- const runtime = new TeamRuntime(manifest, services);
1223
-
1224
- await runtime.initialize();
1225
- const result = await runtime.bootstrap();
1226
-
1227
- const lifecycleCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls[0][0];
1228
-
1229
- // Simulate completed stop (should NOT trigger continuation)
1230
- lifecycleCallback({
1231
- type: "stopped",
1232
- agent: { id: result.rootId, role: "planner", state: "stopped" },
1233
- reason: "completed",
1234
- } as any);
1235
-
1236
- // Wait a bit to ensure no continuation is triggered
1237
- await new Promise((resolve) => setTimeout(resolve, 1500));
1238
- expect(agentManager.continueAgent).not.toHaveBeenCalled();
1239
- });
1240
-
1241
- it("does NOT auto-continue on cancelled stop", async () => {
1242
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1243
- const runtime = new TeamRuntime(manifest, services);
1244
-
1245
- await runtime.initialize();
1246
- const result = await runtime.bootstrap();
1247
-
1248
- const lifecycleCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls[0][0];
1249
-
1250
- lifecycleCallback({
1251
- type: "stopped",
1252
- agent: { id: result.rootId, role: "planner", state: "stopped" },
1253
- reason: "cancelled",
1254
- } as any);
1255
-
1256
- await new Promise((resolve) => setTimeout(resolve, 1500));
1257
- expect(agentManager.continueAgent).not.toHaveBeenCalled();
1258
- });
1259
-
1260
- it("does NOT trigger for non-monitored agents", async () => {
1261
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1262
- const runtime = new TeamRuntime(manifest, services);
1263
-
1264
- await runtime.initialize();
1265
- await runtime.bootstrap();
1266
-
1267
- const lifecycleCallback = vi.mocked(agentManager.onLifecycleEvent).mock.calls[0][0];
1268
-
1269
- // Simulate stop of an unrelated agent
1270
- lifecycleCallback({
1271
- type: "stopped",
1272
- agent: { id: "unrelated_agent", role: "worker", state: "stopped" },
1273
- } as any);
1274
-
1275
- await new Promise((resolve) => setTimeout(resolve, 1500));
1276
- expect(agentManager.continueAgent).not.toHaveBeenCalled();
1277
- });
1278
-
1279
- it("unsubscribes lifecycle listener on teardown", async () => {
1280
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1281
- const runtime = new TeamRuntime(manifest, services);
1282
-
1283
- await runtime.initialize();
1284
- await runtime.bootstrap();
1285
-
1286
- // onLifecycleEvent returns an unsubscribe function
1287
- const unsubscribeFn = vi.mocked(agentManager.onLifecycleEvent).mock.results[0].value;
1288
-
1289
- await runtime.teardown();
1290
-
1291
- // The unsubscribe function should have been called
1292
- expect(unsubscribeFn).toHaveBeenCalled();
1293
- });
1294
- });
1295
-
1296
- describe("structured team", () => {
1297
- it("bootstraps with push mode and queue strategy", async () => {
1298
- const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
1299
- const runtime = new TeamRuntime(manifest, services);
1300
-
1301
- expect(runtime.getTaskMode()).toBe("push");
1302
- expect(runtime.getStrategyName()).toBe("queue");
1303
-
1304
- await runtime.initialize();
1305
- const result = await runtime.bootstrap();
1306
-
1307
- // Root (lead) + 2 companions (reviewer, merger)
1308
- expect(agentManager.spawn).toHaveBeenCalledTimes(3);
1309
- expect(result.companionIds).toHaveLength(2);
1310
-
1311
- // Verify no pull-mode interaction patterns injected
1312
- const rootCall = vi.mocked(agentManager.spawn).mock.calls[0][0];
1313
- const pullPatterns = rootCall.interactionPatterns?.filter((p) =>
1314
- p.includes("PULL mode")
1315
- ) ?? [];
1316
- expect(pullPatterns).toHaveLength(0);
1317
- });
1318
- });
1319
- });
1320
-
1321
- // =============================================================================
1322
- // Tests: Integration Strategies
1323
- // =============================================================================
1324
-
1325
- describe("Integration Strategies", () => {
1326
- it("imports trunk strategy module", async () => {
1327
- const { TrunkIntegrationStrategy } = await import(
1328
- "../../workspace/strategies/trunk.js"
1329
- );
1330
- const strategy = new TrunkIntegrationStrategy();
1331
- expect(strategy.name).toBe("trunk");
1332
- });
1333
-
1334
- it("imports optimistic strategy module", async () => {
1335
- const { OptimisticIntegrationStrategy } = await import(
1336
- "../../workspace/strategies/optimistic.js"
1337
- );
1338
- const strategy = new OptimisticIntegrationStrategy();
1339
- expect(strategy.name).toBe("optimistic");
1340
- });
1341
-
1342
- it("imports queue strategy module", async () => {
1343
- const { QueueIntegrationStrategy } = await import(
1344
- "../../workspace/strategies/queue.js"
1345
- );
1346
- const strategy = new QueueIntegrationStrategy();
1347
- expect(strategy.name).toBe("queue");
1348
- });
1349
-
1350
- it("registry provides all built-in strategies", async () => {
1351
- const { defaultStrategyRegistry } = await import(
1352
- "../../workspace/strategies/registry.js"
1353
- );
1354
- expect(defaultStrategyRegistry.has("queue")).toBe(true);
1355
- expect(defaultStrategyRegistry.has("trunk")).toBe(true);
1356
- expect(defaultStrategyRegistry.has("optimistic")).toBe(true);
1357
- });
1358
- });
1359
-
1360
- // =============================================================================
1361
- // Tests: Task Pull Model
1362
- // =============================================================================
1363
-
1364
- describe("Task Pull Model", () => {
1365
- it("claim_task tool module exports correctly", async () => {
1366
- const { CLAIM_TASK_TOOL_INFO, ClaimTaskSchema, createClaimTaskHandler } =
1367
- await import("../../mcp/tools/claim_task.js");
1368
-
1369
- expect(CLAIM_TASK_TOOL_INFO.name).toBe("claim_task");
1370
- expect(createClaimTaskHandler).toBeInstanceOf(Function);
1371
- expect(ClaimTaskSchema).toBeDefined();
1372
- });
1373
-
1374
- it("unclaim_task tool module exports correctly", async () => {
1375
- const { UNCLAIM_TASK_TOOL_INFO, createUnclaimTaskHandler } = await import(
1376
- "../../mcp/tools/unclaim_task.js"
1377
- );
1378
-
1379
- expect(UNCLAIM_TASK_TOOL_INFO.name).toBe("unclaim_task");
1380
- expect(createUnclaimTaskHandler).toBeInstanceOf(Function);
1381
- });
1382
-
1383
- it("list_claimable_tasks tool module exports correctly", async () => {
1384
- const { LIST_CLAIMABLE_TASKS_TOOL_INFO, createListClaimableTasksHandler } =
1385
- await import("../../mcp/tools/list_claimable_tasks.js");
1386
-
1387
- expect(LIST_CLAIMABLE_TASKS_TOOL_INFO.name).toBe("list_claimable_tasks");
1388
- expect(createListClaimableTasksHandler).toBeInstanceOf(Function);
1389
- });
1390
-
1391
- it("task.claim capability is registered", async () => {
1392
- const { TASK_CAPABILITIES, ALL_CAPABILITIES } = await import(
1393
- "../../roles/capabilities.js"
1394
- );
1395
-
1396
- expect(TASK_CAPABILITIES.CLAIM).toBe("task.claim");
1397
- expect(ALL_CAPABILITIES.has("task.claim")).toBe(true);
1398
- });
1399
- });
1400
-
1401
- // =============================================================================
1402
- // Tests: Metrics Module
1403
- // =============================================================================
1404
-
1405
- describe("Metrics Module", () => {
1406
- it("exports all metric functions", async () => {
1407
- const {
1408
- getThroughputMetrics,
1409
- getUtilizationMetrics,
1410
- getErrorMetrics,
1411
- } = await import("../../metrics/index.js");
1412
-
1413
- expect(getThroughputMetrics).toBeInstanceOf(Function);
1414
- expect(getUtilizationMetrics).toBeInstanceOf(Function);
1415
- expect(getErrorMetrics).toBeInstanceOf(Function);
1416
- });
1417
-
1418
- it("computes throughput metrics from empty store", async () => {
1419
- const { getThroughputMetrics } = await import("../../metrics/index.js");
1420
- const store = createMockEventStore();
1421
-
1422
- const metrics = getThroughputMetrics(store, 60000);
1423
-
1424
- expect(metrics.tasksCompleted).toBe(0);
1425
- expect(metrics.tasksFailed).toBe(0);
1426
- expect(metrics.tasksCreated).toBe(0);
1427
- expect(metrics.completedPerMinute).toBe(0);
1428
- expect(metrics.avgCompletionTimeMs).toBeNull();
1429
- });
1430
-
1431
- it("computes utilization metrics from empty store", async () => {
1432
- const { getUtilizationMetrics } = await import("../../metrics/index.js");
1433
- const store = createMockEventStore();
1434
-
1435
- const metrics = getUtilizationMetrics(store);
1436
-
1437
- expect(metrics.activeAgents).toBe(0);
1438
- expect(metrics.totalSpawned).toBe(0);
1439
- expect(metrics.totalStopped).toBe(0);
1440
- });
1441
-
1442
- it("computes error metrics from empty store", async () => {
1443
- const { getErrorMetrics } = await import("../../metrics/index.js");
1444
- const store = createMockEventStore();
1445
-
1446
- const metrics = getErrorMetrics(store);
1447
-
1448
- expect(metrics.totalErrors).toBe(0);
1449
- expect(metrics.recentErrors).toEqual([]);
1450
- });
1451
- });
1452
-
1453
- // =============================================================================
1454
- // Tests: openteams Migration — Loader Hooks & Error Mapping
1455
- // =============================================================================
1456
-
1457
- describe("openteams Migration: Team Loader", () => {
1458
- let roleRegistry: DefaultRoleRegistry;
1459
-
1460
- beforeEach(() => {
1461
- roleRegistry = new DefaultRoleRegistry();
1462
- });
1463
-
1464
- describe("buildResolvedTeamRole — enforcement fields", () => {
1465
- it("maps macro_agent.workspace from role YAML to RoleDefinition", async () => {
1466
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1467
-
1468
- // judge.yaml has workspace config
1469
- const judge = manifest._resolvedRoles.get("judge")!;
1470
- expect(judge.roleDefinition.workspace).toEqual({
1471
- type: "own",
1472
- branchPattern: "judge/{agent-id}",
1473
- cleanupOnTerminate: true,
1474
- });
1475
- });
1476
-
1477
- it("maps macro_agent.lifecycle from role YAML to RoleDefinition", async () => {
1478
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1479
-
1480
- // planner.yaml has lifecycle: type: daemon, cascade_terminate: true
1481
- const planner = manifest._resolvedRoles.get("planner")!;
1482
- expect(planner.roleDefinition.lifecycle).toEqual({
1483
- type: "daemon",
1484
- cascadeTerminate: true,
1485
- });
1486
-
1487
- // grinder.yaml has lifecycle: type: ephemeral, task_bound: false, max_duration_ms, self_cleanup
1488
- const grinder = manifest._resolvedRoles.get("grinder")!;
1489
- expect(grinder.roleDefinition.lifecycle).toEqual({
1490
- type: "ephemeral",
1491
- taskBound: false,
1492
- maxDurationMs: 3600000,
1493
- selfCleanup: true,
1494
- });
1495
- });
1496
-
1497
- it("falls back to parent role workspace/lifecycle when no macro_agent override", async () => {
1498
- const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
1499
-
1500
- // structured roles don't have macro_agent workspace/lifecycle in their YAML
1501
- // so they inherit from parent role definitions
1502
- const developer = manifest._resolvedRoles.get("developer")!;
1503
- // Worker parent has workspace config
1504
- const parentWorker = roleRegistry.resolveRole("worker");
1505
- expect(developer.roleDefinition.workspace).toEqual(parentWorker.workspace);
1506
- });
1507
-
1508
- it("preserves parent role tools and protocol", async () => {
1509
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1510
-
1511
- const grinder = manifest._resolvedRoles.get("grinder")!;
1512
- const parentWorker = roleRegistry.resolveRole("worker");
1513
- expect(grinder.roleDefinition.tools).toEqual(parentWorker.tools);
1514
- expect(grinder.roleDefinition.protocol).toEqual(parentWorker.protocol);
1515
- });
1516
-
1517
- it("sets correct baseRole from extends chain", async () => {
1518
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1519
-
1520
- // All roles should reference their base role
1521
- expect(manifest._resolvedRoles.get("planner")!.baseRole).toBe("coordinator");
1522
- expect(manifest._resolvedRoles.get("grinder")!.baseRole).toBe("worker");
1523
- expect(manifest._resolvedRoles.get("judge")!.baseRole).toBe("monitor");
1524
- });
1525
-
1526
- it("stores prompt file path in resolved role", async () => {
1527
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1528
-
1529
- const planner = manifest._resolvedRoles.get("planner")!;
1530
- expect(planner.prompt).toBe("prompts/planner.md");
1531
-
1532
- const grinder = manifest._resolvedRoles.get("grinder")!;
1533
- expect(grinder.prompt).toBe("prompts/grinder.md");
1534
- });
1535
- });
1536
-
1537
- describe("enrichRoleWithSpawnRules hook", () => {
1538
- it("adds agent.spawn.* capabilities from spawn_rules", async () => {
1539
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1540
-
1541
- // planner: [grinder, planner]
1542
- const planner = manifest._resolvedRoles.get("planner")!;
1543
- expect(planner.capabilities).toContain("agent.spawn.grinder");
1544
- expect(planner.capabilities).toContain("agent.spawn.planner");
1545
- });
1546
-
1547
- it("does not duplicate existing spawn capabilities", async () => {
1548
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1549
-
1550
- const planner = manifest._resolvedRoles.get("planner")!;
1551
- const spawnGrinderCount = planner.capabilities.filter(
1552
- (c) => c === "agent.spawn.grinder"
1553
- ).length;
1554
- expect(spawnGrinderCount).toBe(1);
1555
- });
1556
-
1557
- it("does not add spawn capabilities for roles with empty spawn_rules", async () => {
1558
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1559
-
1560
- // judge: [] in spawn_rules — should not have spawn caps added by enrichRoleWithSpawnRules
1561
- // (judge extends monitor which has no spawn caps)
1562
- const judge = manifest._resolvedRoles.get("judge")!;
1563
- const spawnCaps = judge.capabilities.filter((c) => c.startsWith("agent.spawn."));
1564
- expect(spawnCaps).toEqual([]);
1565
-
1566
- // grinder: [] in spawn_rules — grinder extends worker which has agent.spawn.worker
1567
- // from parent, but enrichRoleWithSpawnRules should NOT add any additional spawn caps
1568
- const grinder = manifest._resolvedRoles.get("grinder")!;
1569
- const grinderSpawnCaps = grinder.capabilities.filter((c) => c.startsWith("agent.spawn."));
1570
- // Only has parent-inherited spawn caps, not new ones from spawn_rules
1571
- expect(grinderSpawnCaps).not.toContain("agent.spawn.grinder");
1572
- expect(grinderSpawnCaps).not.toContain("agent.spawn.planner");
1573
- });
1574
- });
1575
-
1576
- describe("mapRegistryRole hook", () => {
1577
- it("resolves known registry roles for extends chains", async () => {
1578
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1579
-
1580
- // planner extends coordinator — coordinator should be resolvable
1581
- const planner = manifest._resolvedRoles.get("planner")!;
1582
- expect(planner.baseRole).toBe("coordinator");
1583
-
1584
- // Coordinator capabilities should be in the planner's set (minus removals, plus additions)
1585
- const coordinatorRole = roleRegistry.resolveRole("coordinator");
1586
- // planner should have coordinator capabilities minus removed ones
1587
- for (const cap of coordinatorRole.capabilities) {
1588
- if (cap !== "agent.spawn.integrator" && cap !== "agent.spawn.monitor") {
1589
- expect(planner.capabilities).toContain(cap);
1590
- }
1591
- }
1592
- });
1593
- });
1594
-
1595
- describe("prompt loading and assembly", () => {
1596
- it("loads prompts keyed by role promptFile path", async () => {
1597
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1598
-
1599
- // Prompts should be stored under the role's promptFile key
1600
- expect(manifest._loadedPrompts.has("prompts/planner.md")).toBe(true);
1601
- expect(manifest._loadedPrompts.has("prompts/grinder.md")).toBe(true);
1602
- expect(manifest._loadedPrompts.has("prompts/judge.md")).toBe(true);
1603
- });
1604
-
1605
- it("loads prompts keyed by topology node prompt path", async () => {
1606
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1607
-
1608
- // Root topology node has prompt: prompts/planner.md
1609
- // It should also be stored under that topology key
1610
- expect(manifest._loadedPrompts.get("prompts/planner.md")).toBeDefined();
1611
- expect(manifest._loadedPrompts.get("prompts/planner.md")!.length).toBeGreaterThan(0);
1612
- });
1613
-
1614
- it("prompt content matches actual file content", async () => {
1615
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1616
-
1617
- const plannerPrompt = manifest._loadedPrompts.get("prompts/planner.md")!;
1618
- // Should contain the role name from the actual prompt file
1619
- expect(plannerPrompt).toContain("Planner");
1620
- });
1621
- });
1622
-
1623
- describe("MCP server loading", () => {
1624
- it("provides _mcpServers map (even if empty)", async () => {
1625
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1626
-
1627
- expect(manifest._mcpServers).toBeDefined();
1628
- expect(manifest._mcpServers).toBeInstanceOf(Map);
1629
- });
1630
- });
1631
-
1632
- describe("error mapping", () => {
1633
- it("throws MANIFEST_NOT_FOUND for non-existent team", async () => {
1634
- await expect(
1635
- loadTeam("nonexistent-team", roleRegistry, PROJECT_ROOT)
1636
- ).rejects.toThrow(TeamLoadError);
1637
-
1638
- try {
1639
- await loadTeam("nonexistent-team", roleRegistry, PROJECT_ROOT);
1640
- } catch (e) {
1641
- const err = e as TeamLoadError;
1642
- expect(err.code).toBe("MANIFEST_NOT_FOUND");
1643
- expect(err.teamName).toBe("nonexistent-team");
1644
- }
1645
- });
1646
-
1647
- it("includes team name in error", async () => {
1648
- try {
1649
- await loadTeam("does-not-exist", roleRegistry, PROJECT_ROOT);
1650
- } catch (e) {
1651
- expect(e).toBeInstanceOf(TeamLoadError);
1652
- expect((e as TeamLoadError).teamName).toBe("does-not-exist");
1653
- }
1654
- });
1655
- });
1656
-
1657
- describe("communication validation", () => {
1658
- it("validates self-driving team communication topology", async () => {
1659
- // Should not throw — well-formed communication config
1660
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1661
- expect(manifest.communication).toBeDefined();
1662
- expect(manifest.communication.channels).toBeDefined();
1663
- expect(manifest.communication.subscriptions).toBeDefined();
1664
- expect(manifest.communication.emissions).toBeDefined();
1665
- expect(manifest.communication.routing).toBeDefined();
1666
- });
1667
-
1668
- it("validates structured team communication topology", async () => {
1669
- const manifest = await loadTeam("structured", roleRegistry, PROJECT_ROOT);
1670
- expect(manifest.communication.channels).toBeDefined();
1671
- expect(Object.keys(manifest.communication.channels!)).toContain("task_updates");
1672
- expect(Object.keys(manifest.communication.channels!)).toContain("merge_flow");
1673
- expect(Object.keys(manifest.communication.channels!)).toContain("review_flow");
1674
- });
1675
- });
1676
- });
1677
-
1678
- // =============================================================================
1679
- // Tests: openteams Migration — TeamRuntime Type Detection
1680
- // =============================================================================
1681
-
1682
- describe("openteams Migration: TeamRuntime", () => {
1683
- let roleRegistry: DefaultRoleRegistry;
1684
- let agentManager: AgentManager;
1685
- let messageRouter: MessageRouter;
1686
- let eventStore: EventStore & { _events: Event[] };
1687
- let services: TeamServices;
1688
-
1689
- beforeEach(() => {
1690
- roleRegistry = new DefaultRoleRegistry();
1691
- eventStore = createMockEventStore() as EventStore & { _events: Event[] };
1692
- messageRouter = createMockMessageRouter();
1693
- agentManager = createMockAgentManager(roleRegistry);
1694
- services = { agentManager, messageRouter, eventStore };
1695
- });
1696
-
1697
- describe("MacroResolvedTemplate input", () => {
1698
- it("accepts MacroResolvedTemplate directly", async () => {
1699
- // Build a MacroResolvedTemplate from a loaded manifest
1700
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1701
-
1702
- const resolved: MacroResolvedTemplate = {
1703
- template: {
1704
- manifest: {
1705
- name: manifest.name,
1706
- description: manifest.description,
1707
- version: manifest.version,
1708
- roles: manifest.roles,
1709
- topology: manifest.topology,
1710
- communication: manifest.communication,
1711
- },
1712
- roles: new Map(),
1713
- prompts: new Map(),
1714
- mcpServers: manifest._mcpServers,
1715
- sourcePath: "",
1716
- },
1717
- resolvedRoles: manifest._resolvedRoles,
1718
- macroAgent: manifest.macro_agent,
1719
- };
1720
-
1721
- // Should not throw
1722
- const runtime = new TeamRuntime(resolved, services);
1723
- expect(runtime.getTaskMode()).toBe("pull");
1724
- expect(runtime.getStrategyName()).toBe("trunk");
1725
- });
1726
-
1727
- it("getResolvedTemplate() returns the resolved template", async () => {
1728
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1729
-
1730
- const resolved: MacroResolvedTemplate = {
1731
- template: {
1732
- manifest: {
1733
- name: manifest.name,
1734
- description: manifest.description,
1735
- version: manifest.version,
1736
- roles: manifest.roles,
1737
- topology: manifest.topology,
1738
- communication: manifest.communication,
1739
- },
1740
- roles: new Map(),
1741
- prompts: new Map(),
1742
- mcpServers: manifest._mcpServers,
1743
- sourcePath: "",
1744
- },
1745
- resolvedRoles: manifest._resolvedRoles,
1746
- macroAgent: manifest.macro_agent,
1747
- };
1748
-
1749
- const runtime = new TeamRuntime(resolved, services);
1750
- const result = runtime.getResolvedTemplate();
1751
-
1752
- expect(result).toBe(resolved);
1753
- expect(result.resolvedRoles).toBe(manifest._resolvedRoles);
1754
- expect(result.macroAgent).toBe(manifest.macro_agent);
1755
- });
1756
-
1757
- it("initializes and bootstraps with MacroResolvedTemplate", async () => {
1758
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1759
-
1760
- const resolved: MacroResolvedTemplate = {
1761
- template: {
1762
- manifest: {
1763
- name: manifest.name,
1764
- description: manifest.description,
1765
- version: manifest.version,
1766
- roles: manifest.roles,
1767
- topology: manifest.topology,
1768
- communication: manifest.communication,
1769
- },
1770
- roles: new Map(),
1771
- prompts: new Map(),
1772
- mcpServers: manifest._mcpServers,
1773
- sourcePath: "",
1774
- },
1775
- resolvedRoles: manifest._resolvedRoles,
1776
- macroAgent: manifest.macro_agent,
1777
- };
1778
-
1779
- const runtime = new TeamRuntime(resolved, services);
1780
- await runtime.initialize();
1781
- const result = await runtime.bootstrap();
1782
-
1783
- expect(result.rootId).toBeDefined();
1784
- expect(result.companionIds).toHaveLength(1);
1785
- expect(agentManager.spawn).toHaveBeenCalledTimes(2);
1786
- });
1787
-
1788
- it("emits team_config event with MacroResolvedTemplate", async () => {
1789
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1790
-
1791
- const resolved: MacroResolvedTemplate = {
1792
- template: {
1793
- manifest: {
1794
- name: manifest.name,
1795
- description: manifest.description,
1796
- version: manifest.version,
1797
- roles: manifest.roles,
1798
- topology: manifest.topology,
1799
- communication: manifest.communication,
1800
- },
1801
- roles: new Map(),
1802
- prompts: new Map(),
1803
- mcpServers: manifest._mcpServers,
1804
- sourcePath: "",
1805
- },
1806
- resolvedRoles: manifest._resolvedRoles,
1807
- macroAgent: manifest.macro_agent,
1808
- };
1809
-
1810
- const runtime = new TeamRuntime(resolved, services);
1811
- await runtime.initialize();
1812
-
1813
- expect(eventStore.emit).toHaveBeenCalledWith(
1814
- expect.objectContaining({
1815
- type: "status",
1816
- payload: expect.objectContaining({
1817
- team_config: expect.objectContaining({
1818
- teamName: "self-driving",
1819
- strategy: "trunk",
1820
- taskMode: "pull",
1821
- }),
1822
- }),
1823
- })
1824
- );
1825
- });
1826
- });
1827
-
1828
- describe("manifestToResolved conversion", () => {
1829
- it("converts legacy TeamManifest to MacroResolvedTemplate internally", async () => {
1830
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1831
-
1832
- // Pass TeamManifest (legacy path)
1833
- const runtime = new TeamRuntime(manifest, services);
1834
- const resolved = runtime.getResolvedTemplate();
1835
-
1836
- // Should have been converted internally
1837
- expect(resolved.template.manifest.name).toBe("self-driving");
1838
- expect(resolved.resolvedRoles).toBe(manifest._resolvedRoles);
1839
- expect(resolved.macroAgent).toBe(manifest.macro_agent);
1840
- expect(resolved.template.mcpServers).toBe(manifest._mcpServers);
1841
- });
1842
-
1843
- it("preserves topology and communication in conversion", async () => {
1844
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1845
-
1846
- const runtime = new TeamRuntime(manifest, services);
1847
- const resolved = runtime.getResolvedTemplate();
1848
-
1849
- expect(resolved.template.manifest.topology).toBe(manifest.topology);
1850
- expect(resolved.template.manifest.communication).toBe(manifest.communication);
1851
- });
1852
- });
1853
-
1854
- describe("getManifest() backward compatibility", () => {
1855
- it("reconstructs TeamManifest from MacroResolvedTemplate", async () => {
1856
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1857
-
1858
- const resolved: MacroResolvedTemplate = {
1859
- template: {
1860
- manifest: {
1861
- name: manifest.name,
1862
- description: manifest.description,
1863
- version: manifest.version,
1864
- roles: manifest.roles,
1865
- topology: manifest.topology,
1866
- communication: manifest.communication,
1867
- },
1868
- roles: new Map(),
1869
- prompts: new Map(),
1870
- mcpServers: manifest._mcpServers,
1871
- sourcePath: "",
1872
- },
1873
- resolvedRoles: manifest._resolvedRoles,
1874
- macroAgent: manifest.macro_agent,
1875
- };
1876
-
1877
- const runtime = new TeamRuntime(resolved, services);
1878
- const backCompat = runtime.getManifest();
1879
-
1880
- expect(backCompat.name).toBe("self-driving");
1881
- expect(backCompat._resolvedRoles).toBe(manifest._resolvedRoles);
1882
- expect(backCompat._mcpServers).toBe(manifest._mcpServers);
1883
- expect(backCompat.macro_agent).toBe(manifest.macro_agent);
1884
- });
1885
-
1886
- it("reconstructs TeamManifest from legacy TeamManifest input", async () => {
1887
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1888
-
1889
- const runtime = new TeamRuntime(manifest, services);
1890
- const backCompat = runtime.getManifest();
1891
-
1892
- expect(backCompat.name).toBe("self-driving");
1893
- expect(backCompat._resolvedRoles).toBe(manifest._resolvedRoles);
1894
- expect(backCompat._loadedPrompts).toBe(manifest._loadedPrompts);
1895
- });
1896
- });
1897
-
1898
- describe("spawn interceptor with MacroResolvedTemplate", () => {
1899
- it("injects team context when using MacroResolvedTemplate", async () => {
1900
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1901
-
1902
- const resolved: MacroResolvedTemplate = {
1903
- template: {
1904
- manifest: {
1905
- name: manifest.name,
1906
- description: manifest.description,
1907
- version: manifest.version,
1908
- roles: manifest.roles,
1909
- topology: manifest.topology,
1910
- communication: manifest.communication,
1911
- },
1912
- roles: new Map(),
1913
- prompts: new Map(),
1914
- mcpServers: manifest._mcpServers,
1915
- sourcePath: "",
1916
- },
1917
- resolvedRoles: manifest._resolvedRoles,
1918
- macroAgent: manifest.macro_agent,
1919
- };
1920
-
1921
- const runtime = new TeamRuntime(resolved, services);
1922
- await runtime.initialize();
1923
- runtime.installOnServices();
1924
- await runtime.bootstrap();
1925
-
1926
- // Spawn a grinder through the interceptor
1927
- await agentManager.spawn({
1928
- task: "test grinder task",
1929
- role: "grinder",
1930
- parent: "agent_0",
1931
- });
1932
-
1933
- const lastOpts = interceptedSpawnOptions.at(-1)!;
1934
- expect(lastOpts.config?.env?.MACRO_TEAM_NAME).toBe("self-driving");
1935
- expect(lastOpts.config?.env?.MACRO_TASK_MODE).toBe("pull");
1936
- expect(lastOpts.topics).toContain("work_coordination");
1937
- });
1938
-
1939
- it("resolves MCP servers from MacroResolvedTemplate", async () => {
1940
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1941
-
1942
- // Add a mock MCP server for grinder
1943
- const mcpServers = new Map<string, McpServerEntry[]>();
1944
- mcpServers.set("grinder", [{
1945
- name: "test-server",
1946
- command: "node",
1947
- args: ["test.js"],
1948
- }]);
1949
-
1950
- const resolved: MacroResolvedTemplate = {
1951
- template: {
1952
- manifest: {
1953
- name: manifest.name,
1954
- description: manifest.description,
1955
- version: manifest.version,
1956
- roles: manifest.roles,
1957
- topology: manifest.topology,
1958
- communication: manifest.communication,
1959
- },
1960
- roles: new Map(),
1961
- prompts: new Map(),
1962
- mcpServers,
1963
- sourcePath: "",
1964
- },
1965
- resolvedRoles: manifest._resolvedRoles,
1966
- macroAgent: manifest.macro_agent,
1967
- };
1968
-
1969
- const runtime = new TeamRuntime(resolved, services);
1970
- await runtime.initialize();
1971
- runtime.installOnServices();
1972
- await runtime.bootstrap();
1973
-
1974
- // Spawn a grinder
1975
- await agentManager.spawn({
1976
- task: "test task",
1977
- role: "grinder",
1978
- parent: "agent_0",
1979
- });
1980
-
1981
- const lastOpts = interceptedSpawnOptions.at(-1)!;
1982
- expect(lastOpts.config?.mcpServers).toBeDefined();
1983
- expect(lastOpts.config?.mcpServers!.length).toBeGreaterThanOrEqual(1);
1984
- expect(lastOpts.config?.mcpServers!.some((s: any) => s.name === "test-server")).toBe(true);
1985
- });
1986
- });
1987
-
1988
- describe("serialized roles in team_config", () => {
1989
- it("serializes resolved roles with capabilities", async () => {
1990
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
1991
- const runtime = new TeamRuntime(manifest, services);
1992
-
1993
- await runtime.initialize();
1994
-
1995
- const emitCall = vi.mocked(eventStore.emit).mock.calls[0][0] as any;
1996
- const serializedRoles = emitCall.payload.team_config.roles;
1997
-
1998
- expect(serializedRoles.planner).toBeDefined();
1999
- expect(serializedRoles.planner.name).toBe("planner");
2000
- expect(serializedRoles.planner.capabilities).toContain("task.claim");
2001
- expect(serializedRoles.planner.capabilities).toContain("agent.spawn.grinder");
2002
-
2003
- expect(serializedRoles.grinder).toBeDefined();
2004
- expect(serializedRoles.grinder.name).toBe("grinder");
2005
- expect(serializedRoles.grinder.capabilities).toContain("task.claim");
2006
- expect(serializedRoles.grinder.capabilities).toContain("git.push");
2007
-
2008
- expect(serializedRoles.judge).toBeDefined();
2009
- expect(serializedRoles.judge.name).toBe("judge");
2010
- });
2011
-
2012
- it("includes lifecycle and description in serialized roles", async () => {
2013
- const manifest = await loadTeam("self-driving", roleRegistry, PROJECT_ROOT);
2014
- const runtime = new TeamRuntime(manifest, services);
2015
-
2016
- await runtime.initialize();
2017
-
2018
- const emitCall = vi.mocked(eventStore.emit).mock.calls[0][0] as any;
2019
- const serializedRoles = emitCall.payload.team_config.roles;
2020
-
2021
- // planner has lifecycle config
2022
- expect(serializedRoles.planner.lifecycle).toBeDefined();
2023
-
2024
- // All roles have descriptions
2025
- expect(serializedRoles.planner.description).toBeDefined();
2026
- expect(serializedRoles.grinder.description).toBeDefined();
2027
- expect(serializedRoles.judge.description).toBeDefined();
2028
- });
2029
- });
2030
- });
2031
-
2032
- // =============================================================================
2033
- // Tests: Auto-Scaling
2034
- // =============================================================================
2035
-
2036
- describe("TeamRuntime auto-scaling", () => {
2037
- let roleRegistry: DefaultRoleRegistry;
2038
- let agentManager: AgentManager;
2039
- let messageRouter: MessageRouter;
2040
- let eventStore: EventStore;
2041
-
2042
- beforeEach(() => {
2043
- roleRegistry = new DefaultRoleRegistry();
2044
- eventStore = createMockEventStore();
2045
- messageRouter = createMockMessageRouter();
2046
- agentManager = createMockAgentManager(roleRegistry);
2047
- vi.useFakeTimers();
2048
- });
2049
-
2050
- afterEach(() => {
2051
- vi.useRealTimers();
2052
- });
2053
-
2054
- function createScalingTemplate(scalingConfig: {
2055
- min_workers?: number;
2056
- max_workers?: number;
2057
- scale_on?: "task_queue_depth" | "manual";
2058
- idle_drain?: boolean;
2059
- }): MacroResolvedTemplate {
2060
- const workerRole: ResolvedTeamRole = {
2061
- name: "grinder",
2062
- baseRole: "worker",
2063
- capabilities: ["file.read", "file.write", "task.claim", "lifecycle.done"],
2064
- roleDefinition: {
2065
- name: "grinder",
2066
- capabilities: ["file.read", "file.write", "task.claim", "lifecycle.done"],
2067
- },
2068
- };
2069
-
2070
- const plannerRole: ResolvedTeamRole = {
2071
- name: "planner",
2072
- baseRole: "coordinator",
2073
- capabilities: ["*"],
2074
- roleDefinition: {
2075
- name: "planner",
2076
- capabilities: ["*"],
2077
- },
2078
- };
2079
-
2080
- return {
2081
- template: {
2082
- manifest: {
2083
- name: "test-scaling",
2084
- version: 1,
2085
- roles: ["planner", "grinder"],
2086
- topology: {
2087
- root: { role: "planner", prompt: "prompts/planner.md" },
2088
- spawn_rules: { planner: ["grinder"], grinder: [] },
2089
- },
2090
- },
2091
- roles: new Map(),
2092
- prompts: new Map(),
2093
- mcpServers: new Map<string, McpServerEntry[]>(),
2094
- sourcePath: "",
2095
- },
2096
- resolvedRoles: new Map<string, ResolvedTeamRole>([
2097
- ["planner", plannerRole],
2098
- ["grinder", workerRole],
2099
- ]),
2100
- macroAgent: {
2101
- task_assignment: { mode: "pull" as const },
2102
- lifecycle: { scaling: scalingConfig },
2103
- },
2104
- };
2105
- }
2106
-
2107
- it("spawns worker when task queue depth exceeds active workers", async () => {
2108
- const mockTaskBackend = {
2109
- listClaimable: vi.fn().mockResolvedValue([
2110
- { id: "t1", title: "Task 1" },
2111
- { id: "t2", title: "Task 2" },
2112
- ]),
2113
- };
2114
-
2115
- // No active workers initially
2116
- vi.mocked(agentManager.list).mockReturnValue([]);
2117
-
2118
- const services: TeamServices = {
2119
- agentManager, messageRouter, eventStore,
2120
- taskBackend: mockTaskBackend as any,
2121
- };
2122
-
2123
- const resolved = createScalingTemplate({
2124
- max_workers: 5,
2125
- scale_on: "task_queue_depth",
2126
- });
2127
- const runtime = new TeamRuntime(resolved, services);
2128
- await runtime.initialize();
2129
- await runtime.bootstrap();
2130
-
2131
- // Advance timer to trigger scaling check (5s interval)
2132
- await vi.advanceTimersByTimeAsync(5_100);
2133
-
2134
- // Should have spawned a grinder as child of root
2135
- const spawnCalls = vi.mocked(agentManager.spawn).mock.calls;
2136
- const scalingSpawn = spawnCalls.find(
2137
- call => call[0].role === "grinder" && call[0].parent !== null && call[0].task?.includes("auto-scaled")
2138
- );
2139
- expect(scalingSpawn).toBeDefined();
2140
-
2141
- await runtime.teardown();
2142
- });
2143
-
2144
- it("respects max_workers cap", async () => {
2145
- const mockTaskBackend = {
2146
- listClaimable: vi.fn().mockResolvedValue([
2147
- { id: "t1", title: "Task 1" },
2148
- { id: "t2", title: "Task 2" },
2149
- ]),
2150
- };
2151
-
2152
- // Already at max workers
2153
- vi.mocked(agentManager.list).mockReturnValue([
2154
- { id: "w1", role: "grinder", state: "running" } as any,
2155
- { id: "w2", role: "grinder", state: "running" } as any,
2156
- ]);
2157
-
2158
- const services: TeamServices = {
2159
- agentManager, messageRouter, eventStore,
2160
- taskBackend: mockTaskBackend as any,
2161
- };
2162
-
2163
- const resolved = createScalingTemplate({
2164
- max_workers: 2,
2165
- scale_on: "task_queue_depth",
2166
- });
2167
- const runtime = new TeamRuntime(resolved, services);
2168
- await runtime.initialize();
2169
- await runtime.bootstrap();
2170
-
2171
- // Register the workers in the runtime's agentRoleMap
2172
- runtime.registerAgent("w1" as AgentId, "grinder");
2173
- runtime.registerAgent("w2" as AgentId, "grinder");
2174
-
2175
- const spawnCountBefore = vi.mocked(agentManager.spawn).mock.calls.length;
2176
-
2177
- await vi.advanceTimersByTimeAsync(5_100);
2178
-
2179
- // No additional spawns — already at max
2180
- const scalingSpawns = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
2181
- call => call[0].task?.includes("auto-scaled")
2182
- );
2183
- expect(scalingSpawns).toHaveLength(0);
2184
-
2185
- await runtime.teardown();
2186
- });
2187
-
2188
- it("does not spawn when scale_on is not task_queue_depth", async () => {
2189
- const mockTaskBackend = {
2190
- listClaimable: vi.fn().mockResolvedValue([
2191
- { id: "t1", title: "Task 1" },
2192
- ]),
2193
- };
2194
-
2195
- const services: TeamServices = {
2196
- agentManager, messageRouter, eventStore,
2197
- taskBackend: mockTaskBackend as any,
2198
- };
2199
-
2200
- const resolved = createScalingTemplate({
2201
- max_workers: 5,
2202
- scale_on: "manual",
2203
- });
2204
- const runtime = new TeamRuntime(resolved, services);
2205
- await runtime.initialize();
2206
- await runtime.bootstrap();
2207
-
2208
- const spawnCountBefore = vi.mocked(agentManager.spawn).mock.calls.length;
2209
-
2210
- await vi.advanceTimersByTimeAsync(10_000);
2211
-
2212
- // No scaling spawns
2213
- const scalingSpawns = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
2214
- call => call[0].task?.includes("auto-scaled")
2215
- );
2216
- expect(scalingSpawns).toHaveLength(0);
2217
-
2218
- // listClaimable should not have been called
2219
- expect(mockTaskBackend.listClaimable).not.toHaveBeenCalled();
2220
-
2221
- await runtime.teardown();
2222
- });
2223
-
2224
- it("respects cooldown between scale-up actions", async () => {
2225
- const mockTaskBackend = {
2226
- listClaimable: vi.fn().mockResolvedValue([
2227
- { id: "t1" }, { id: "t2" }, { id: "t3" },
2228
- ]),
2229
- };
2230
-
2231
- vi.mocked(agentManager.list).mockReturnValue([]);
2232
-
2233
- const services: TeamServices = {
2234
- agentManager, messageRouter, eventStore,
2235
- taskBackend: mockTaskBackend as any,
2236
- };
2237
-
2238
- const resolved = createScalingTemplate({
2239
- max_workers: 10,
2240
- scale_on: "task_queue_depth",
2241
- });
2242
- const runtime = new TeamRuntime(resolved, services);
2243
- await runtime.initialize();
2244
- await runtime.bootstrap();
2245
-
2246
- const spawnCountBefore = vi.mocked(agentManager.spawn).mock.calls.length;
2247
-
2248
- // First tick at 5s — should spawn
2249
- await vi.advanceTimersByTimeAsync(5_100);
2250
- const afterFirst = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
2251
- call => call[0].task?.includes("auto-scaled")
2252
- );
2253
- expect(afterFirst).toHaveLength(1);
2254
-
2255
- // Second tick at 10s — cooldown (10s from first spawn) not elapsed
2256
- await vi.advanceTimersByTimeAsync(5_000);
2257
- const afterSecond = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
2258
- call => call[0].task?.includes("auto-scaled")
2259
- );
2260
- expect(afterSecond).toHaveLength(1); // Still just 1
2261
-
2262
- // Third tick at 15s — cooldown elapsed, should spawn again
2263
- await vi.advanceTimersByTimeAsync(5_100);
2264
- const afterThird = vi.mocked(agentManager.spawn).mock.calls.slice(spawnCountBefore).filter(
2265
- call => call[0].task?.includes("auto-scaled")
2266
- );
2267
- expect(afterThird).toHaveLength(2);
2268
-
2269
- await runtime.teardown();
2270
- });
2271
- });
2272
-
2273
- // =============================================================================
2274
- // Tests: Workspace Isolation (Capability-Based)
2275
- // =============================================================================
2276
-
2277
- describe("Workspace Isolation", () => {
2278
- let roleRegistry: DefaultRoleRegistry;
2279
- let agentManager: AgentManager;
2280
- let messageRouter: MessageRouter;
2281
- let eventStore: EventStore;
2282
-
2283
- beforeEach(() => {
2284
- roleRegistry = new DefaultRoleRegistry();
2285
- agentManager = createMockAgentManager(roleRegistry);
2286
- messageRouter = createMockMessageRouter();
2287
- eventStore = createMockEventStore();
2288
- });
2289
-
2290
- function createWorkspaceTemplate(): MacroResolvedTemplate {
2291
- const resolvedRoles = new Map<string, ResolvedTeamRole>();
2292
- resolvedRoles.set("lead", {
2293
- name: "lead",
2294
- baseRole: "coordinator",
2295
- capabilities: [
2296
- "file.read", "file.write", "task.create", "task.assign",
2297
- "agent.spawn.worker", "agent.terminate", "workspace.stream",
2298
- ],
2299
- roleDefinition: roleRegistry.resolveRole("coordinator"),
2300
- });
2301
- resolvedRoles.set("developer", {
2302
- name: "developer",
2303
- baseRole: "worker",
2304
- capabilities: [
2305
- "file.read", "file.write", "git.commit", "lifecycle.done",
2306
- "workspace.worktree",
2307
- ],
2308
- roleDefinition: roleRegistry.resolveRole("worker"),
2309
- });
2310
- resolvedRoles.set("merger", {
2311
- name: "merger",
2312
- baseRole: "integrator",
2313
- capabilities: [
2314
- "file.read", "file.write", "git.merge", "lifecycle.done",
2315
- "workspace.integrate",
2316
- ],
2317
- roleDefinition: roleRegistry.resolveRole("integrator"),
2318
- });
2319
- resolvedRoles.set("watcher", {
2320
- name: "watcher",
2321
- baseRole: "monitor",
2322
- capabilities: ["file.read", "msg.send"],
2323
- roleDefinition: roleRegistry.resolveRole("monitor"),
2324
- });
2325
-
2326
- return {
2327
- template: {
2328
- manifest: {
2329
- name: "workspace-test",
2330
- version: 1,
2331
- roles: ["lead", "developer", "merger", "watcher"],
2332
- topology: {
2333
- root: { role: "lead" },
2334
- companions: [{ role: "merger" }],
2335
- },
2336
- communication: {},
2337
- },
2338
- roles: new Map(),
2339
- prompts: new Map(),
2340
- mcpServers: new Map<string, McpServerEntry[]>(),
2341
- sourcePath: "",
2342
- },
2343
- resolvedRoles,
2344
- macroAgent: {
2345
- integration: { strategy: "queue" },
2346
- task_assignment: { mode: "push" as const },
2347
- },
2348
- };
2349
- }
2350
-
2351
- it("spawn interceptor injects streamId for role with workspace.worktree", async () => {
2352
- const template = createWorkspaceTemplate();
2353
- const mockWorkspaceManager = {
2354
- createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
2355
- getMergeQueue: vi.fn().mockReturnValue(null),
2356
- getWorkspace: vi.fn(),
2357
- };
2358
-
2359
- const services: TeamServices = {
2360
- agentManager,
2361
- messageRouter,
2362
- eventStore,
2363
- workspaceManager: mockWorkspaceManager as any,
2364
- };
2365
-
2366
- const runtime = new TeamRuntime(template, services);
2367
- await runtime.initialize();
2368
- await runtime.bootstrap();
2369
-
2370
- // Now spawn a developer (extends worker) through the interceptor
2371
- const interceptor = runtime.createSpawnInterceptor();
2372
- const result = interceptor({
2373
- task: "implement feature",
2374
- role: "developer",
2375
- parent: "agent_0",
2376
- });
2377
-
2378
- expect(result.streamId).toBe("stream-1");
2379
- expect(result.dataplaneTaskId).toBeDefined();
2380
- expect(result.capabilities).toContain("workspace.worktree");
2381
-
2382
- await runtime.teardown();
2383
- });
2384
-
2385
- it("spawn interceptor injects streamId for role with workspace.integrate", async () => {
2386
- const template = createWorkspaceTemplate();
2387
- const mockWorkspaceManager = {
2388
- createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
2389
- getMergeQueue: vi.fn().mockReturnValue(null),
2390
- getWorkspace: vi.fn(),
2391
- };
2392
-
2393
- const services: TeamServices = {
2394
- agentManager,
2395
- messageRouter,
2396
- eventStore,
2397
- workspaceManager: mockWorkspaceManager as any,
2398
- };
2399
-
2400
- const runtime = new TeamRuntime(template, services);
2401
- await runtime.initialize();
2402
- await runtime.bootstrap();
2403
-
2404
- const interceptor = runtime.createSpawnInterceptor();
2405
- const result = interceptor({
2406
- task: "merge changes",
2407
- role: "merger",
2408
- parent: "agent_0",
2409
- });
2410
-
2411
- expect(result.streamId).toBe("stream-1");
2412
- expect(result.dataplaneTaskId).toBeUndefined(); // Integrators don't get dataplaneTaskId
2413
- expect(result.capabilities).toContain("workspace.integrate");
2414
-
2415
- await runtime.teardown();
2416
- });
2417
-
2418
- it("spawn interceptor does NOT inject workspace fields for role without workspace capability", async () => {
2419
- const template = createWorkspaceTemplate();
2420
- const mockWorkspaceManager = {
2421
- createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
2422
- getMergeQueue: vi.fn().mockReturnValue(null),
2423
- getWorkspace: vi.fn(),
2424
- };
2425
-
2426
- const services: TeamServices = {
2427
- agentManager,
2428
- messageRouter,
2429
- eventStore,
2430
- workspaceManager: mockWorkspaceManager as any,
2431
- };
2432
-
2433
- const runtime = new TeamRuntime(template, services);
2434
- await runtime.initialize();
2435
- await runtime.bootstrap();
2436
-
2437
- const interceptor = runtime.createSpawnInterceptor();
2438
- const result = interceptor({
2439
- task: "monitor health",
2440
- role: "watcher",
2441
- parent: "agent_0",
2442
- });
2443
-
2444
- // Monitor role has no workspace capabilities
2445
- expect(result.streamId).toBeUndefined();
2446
- expect(result.streamConfig).toBeUndefined();
2447
- expect(result.dataplaneTaskId).toBeUndefined();
2448
-
2449
- await runtime.teardown();
2450
- });
2451
-
2452
- it("spawn interceptor does not overwrite explicit workspace values", async () => {
2453
- const template = createWorkspaceTemplate();
2454
- const mockWorkspaceManager = {
2455
- createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
2456
- getMergeQueue: vi.fn().mockReturnValue(null),
2457
- getWorkspace: vi.fn(),
2458
- };
2459
-
2460
- const services: TeamServices = {
2461
- agentManager,
2462
- messageRouter,
2463
- eventStore,
2464
- workspaceManager: mockWorkspaceManager as any,
2465
- };
2466
-
2467
- const runtime = new TeamRuntime(template, services);
2468
- await runtime.initialize();
2469
- await runtime.bootstrap();
2470
-
2471
- const interceptor = runtime.createSpawnInterceptor();
2472
- const result = interceptor({
2473
- task: "implement feature",
2474
- role: "developer",
2475
- parent: "agent_0",
2476
- streamId: "custom-stream",
2477
- dataplaneTaskId: "custom-task",
2478
- });
2479
-
2480
- // Explicit values should NOT be overwritten
2481
- expect(result.streamId).toBe("custom-stream");
2482
- expect(result.dataplaneTaskId).toBe("custom-task");
2483
-
2484
- await runtime.teardown();
2485
- });
2486
-
2487
- it("merge queue mr:submitted event wakes integrator agent", async () => {
2488
- const template = createWorkspaceTemplate();
2489
- let mergeQueueCallback: ((event: any) => void) | null = null;
2490
- const mockMergeQueue = {
2491
- onEvent: vi.fn((cb: (event: any) => void) => {
2492
- mergeQueueCallback = cb;
2493
- return () => { mergeQueueCallback = null; };
2494
- }),
2495
- };
2496
- const mockWorkspaceManager = {
2497
- createIntegrationStream: vi.fn().mockReturnValue("stream-1"),
2498
- getMergeQueue: vi.fn().mockReturnValue(mockMergeQueue),
2499
- getWorkspace: vi.fn(),
2500
- };
2501
-
2502
- const services: TeamServices = {
2503
- agentManager,
2504
- messageRouter,
2505
- eventStore,
2506
- workspaceManager: mockWorkspaceManager as any,
2507
- };
2508
-
2509
- const runtime = new TeamRuntime(template, services);
2510
- await runtime.initialize();
2511
- await runtime.bootstrap();
2512
-
2513
- // Verify merge queue subscription was set up
2514
- expect(mockMergeQueue.onEvent).toHaveBeenCalled();
2515
- expect(mergeQueueCallback).not.toBeNull();
2516
-
2517
- // Simulate a merge request submission
2518
- mergeQueueCallback!({
2519
- type: "mr:submitted",
2520
- data: {
2521
- mrId: "mr-123",
2522
- workerAgentId: "worker-1",
2523
- workerBranch: "worker/dev-1/task-1@123",
2524
- },
2525
- });
2526
-
2527
- // Should have prompted the merger agent (companion, agent_1)
2528
- expect(agentManager.prompt).toHaveBeenCalledWith(
2529
- "agent_1", // merger is the companion agent
2530
- expect.stringContaining("mr-123"),
2531
- );
2532
-
2533
- await runtime.teardown();
2534
- });
2535
-
2536
- it("creates integration stream during bootstrap when workspaceManager is available", async () => {
2537
- const template = createWorkspaceTemplate();
2538
- const mockWorkspaceManager = {
2539
- createIntegrationStream: vi.fn().mockReturnValue("stream-42"),
2540
- getMergeQueue: vi.fn().mockReturnValue(null),
2541
- getWorkspace: vi.fn(),
2542
- };
2543
-
2544
- const services: TeamServices = {
2545
- agentManager,
2546
- messageRouter,
2547
- eventStore,
2548
- workspaceManager: mockWorkspaceManager as any,
2549
- };
2550
-
2551
- const runtime = new TeamRuntime(template, services);
2552
- await runtime.initialize();
2553
- await runtime.bootstrap();
2554
-
2555
- expect(mockWorkspaceManager.createIntegrationStream).toHaveBeenCalledWith(
2556
- "agent_0", // root agent ID
2557
- { name: "workspace-test", forkFrom: "main" },
2558
- );
2559
- expect(runtime.getTeamStreamId()).toBe("stream-42");
2560
-
2561
- await runtime.teardown();
2562
- });
2563
- });