macro-agent 0.2.4 → 0.2.6

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 (1002) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +30 -56
  3. package/dist/acp/websocket-server.d.ts +6 -0
  4. package/dist/acp/websocket-server.d.ts.map +1 -1
  5. package/dist/acp/websocket-server.js +13 -0
  6. package/dist/acp/websocket-server.js.map +1 -1
  7. package/dist/acp/websocket-stream.d.ts +30 -0
  8. package/dist/acp/websocket-stream.d.ts.map +1 -0
  9. package/dist/acp/websocket-stream.js +118 -0
  10. package/dist/acp/websocket-stream.js.map +1 -0
  11. package/dist/activity/deduplication.d.ts +85 -0
  12. package/dist/activity/deduplication.d.ts.map +1 -0
  13. package/dist/activity/deduplication.js +149 -0
  14. package/dist/activity/deduplication.js.map +1 -0
  15. package/dist/activity/index.d.ts +16 -0
  16. package/dist/activity/index.d.ts.map +1 -0
  17. package/dist/activity/index.js +17 -0
  18. package/dist/activity/index.js.map +1 -0
  19. package/dist/activity/relevance.d.ts +81 -0
  20. package/dist/activity/relevance.d.ts.map +1 -0
  21. package/dist/activity/relevance.js +161 -0
  22. package/dist/activity/relevance.js.map +1 -0
  23. package/dist/activity/types.d.ts +169 -0
  24. package/dist/activity/types.d.ts.map +1 -0
  25. package/dist/activity/types.js +33 -0
  26. package/dist/activity/types.js.map +1 -0
  27. package/dist/activity/watcher.d.ts +64 -0
  28. package/dist/activity/watcher.d.ts.map +1 -0
  29. package/dist/activity/watcher.js +212 -0
  30. package/dist/activity/watcher.js.map +1 -0
  31. package/dist/adapters/federation.d.ts +8 -1
  32. package/dist/adapters/federation.d.ts.map +1 -1
  33. package/dist/adapters/federation.js +33 -2
  34. package/dist/adapters/federation.js.map +1 -1
  35. package/dist/agent/agent-manager-v2.d.ts.map +1 -1
  36. package/dist/agent/agent-manager-v2.js +189 -67
  37. package/dist/agent/agent-manager-v2.js.map +1 -1
  38. package/dist/agent/agent-manager.d.ts +17 -0
  39. package/dist/agent/agent-manager.d.ts.map +1 -1
  40. package/dist/agent/agent-manager.js.map +1 -1
  41. package/dist/agent/types.d.ts +21 -2
  42. package/dist/agent/types.d.ts.map +1 -1
  43. package/dist/agent/types.js.map +1 -1
  44. package/dist/agent/wake.d.ts +85 -0
  45. package/dist/agent/wake.d.ts.map +1 -0
  46. package/dist/agent/wake.js +278 -0
  47. package/dist/agent/wake.js.map +1 -0
  48. package/dist/api/server.d.ts.map +1 -1
  49. package/dist/api/server.js +41 -25
  50. package/dist/api/server.js.map +1 -1
  51. package/dist/api/types.d.ts +6 -0
  52. package/dist/api/types.d.ts.map +1 -1
  53. package/dist/auth/server-auth.d.ts +43 -0
  54. package/dist/auth/server-auth.d.ts.map +1 -0
  55. package/dist/auth/server-auth.js +80 -0
  56. package/dist/auth/server-auth.js.map +1 -0
  57. package/dist/auth/token.d.ts +4 -0
  58. package/dist/auth/token.d.ts.map +1 -1
  59. package/dist/auth/token.js +7 -6
  60. package/dist/auth/token.js.map +1 -1
  61. package/dist/boot-v2.d.ts +6 -3
  62. package/dist/boot-v2.d.ts.map +1 -1
  63. package/dist/boot-v2.js +44 -25
  64. package/dist/boot-v2.js.map +1 -1
  65. package/dist/cognitive/macro-agent-backend.d.ts.map +1 -1
  66. package/dist/cognitive/macro-agent-backend.js +37 -8
  67. package/dist/cognitive/macro-agent-backend.js.map +1 -1
  68. package/dist/cognitive/team-lifecycle.d.ts +82 -0
  69. package/dist/cognitive/team-lifecycle.d.ts.map +1 -0
  70. package/dist/cognitive/team-lifecycle.js +121 -0
  71. package/dist/cognitive/team-lifecycle.js.map +1 -0
  72. package/dist/cognitive/trajectory-extractor.d.ts +25 -0
  73. package/dist/cognitive/trajectory-extractor.d.ts.map +1 -0
  74. package/dist/cognitive/trajectory-extractor.js +134 -0
  75. package/dist/cognitive/trajectory-extractor.js.map +1 -0
  76. package/dist/cognitive/types.d.ts +24 -0
  77. package/dist/cognitive/types.d.ts.map +1 -1
  78. package/dist/control/control-server.d.ts.map +1 -1
  79. package/dist/control/control-server.js +10 -0
  80. package/dist/control/control-server.js.map +1 -1
  81. package/dist/dispatch/mail-inbound-consumer.d.ts.map +1 -1
  82. package/dist/dispatch/mail-inbound-consumer.js +43 -10
  83. package/dist/dispatch/mail-inbound-consumer.js.map +1 -1
  84. package/dist/index.d.ts +5 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +6 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/lifecycle/handlers/generic.d.ts +27 -0
  89. package/dist/lifecycle/handlers/generic.d.ts.map +1 -0
  90. package/dist/lifecycle/handlers/generic.js +56 -0
  91. package/dist/lifecycle/handlers/generic.js.map +1 -0
  92. package/dist/lifecycle/handlers/index.d.ts +51 -0
  93. package/dist/lifecycle/handlers/index.d.ts.map +1 -0
  94. package/dist/lifecycle/handlers/index.js +110 -0
  95. package/dist/lifecycle/handlers/index.js.map +1 -0
  96. package/dist/lifecycle/handlers/integrator.d.ts +81 -0
  97. package/dist/lifecycle/handlers/integrator.d.ts.map +1 -0
  98. package/dist/lifecycle/handlers/integrator.js +451 -0
  99. package/dist/lifecycle/handlers/integrator.js.map +1 -0
  100. package/dist/lifecycle/handlers/monitor.d.ts +29 -0
  101. package/dist/lifecycle/handlers/monitor.d.ts.map +1 -0
  102. package/dist/lifecycle/handlers/monitor.js +79 -0
  103. package/dist/lifecycle/handlers/monitor.js.map +1 -0
  104. package/dist/lifecycle/handlers/worker.d.ts +56 -0
  105. package/dist/lifecycle/handlers/worker.d.ts.map +1 -0
  106. package/dist/lifecycle/handlers/worker.js +381 -0
  107. package/dist/lifecycle/handlers/worker.js.map +1 -0
  108. package/dist/lifecycle/handlers-v2.d.ts +0 -2
  109. package/dist/lifecycle/handlers-v2.d.ts.map +1 -1
  110. package/dist/lifecycle/handlers-v2.js +4 -55
  111. package/dist/lifecycle/handlers-v2.js.map +1 -1
  112. package/dist/mail/conversation-map.d.ts +33 -0
  113. package/dist/mail/conversation-map.d.ts.map +1 -0
  114. package/dist/mail/conversation-map.js +61 -0
  115. package/dist/mail/conversation-map.js.map +1 -0
  116. package/dist/mail/index.d.ts +11 -0
  117. package/dist/mail/index.d.ts.map +1 -0
  118. package/dist/mail/index.js +11 -0
  119. package/dist/mail/index.js.map +1 -0
  120. package/dist/mail/mail-service.d.ts +85 -0
  121. package/dist/mail/mail-service.d.ts.map +1 -0
  122. package/dist/mail/mail-service.js +121 -0
  123. package/dist/mail/mail-service.js.map +1 -0
  124. package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
  125. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
  126. package/dist/mail/stores/eventstore-conversation-store.js +131 -0
  127. package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
  128. package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
  129. package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
  130. package/dist/mail/stores/eventstore-participant-store.js +145 -0
  131. package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
  132. package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
  133. package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
  134. package/dist/mail/stores/eventstore-thread-store.js +118 -0
  135. package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
  136. package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
  137. package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
  138. package/dist/mail/stores/eventstore-turn-store.js +153 -0
  139. package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
  140. package/dist/mail/stores/index.d.ts +12 -0
  141. package/dist/mail/stores/index.d.ts.map +1 -0
  142. package/dist/mail/stores/index.js +12 -0
  143. package/dist/mail/stores/index.js.map +1 -0
  144. package/dist/mail/stores/types.d.ts +146 -0
  145. package/dist/mail/stores/types.d.ts.map +1 -0
  146. package/dist/mail/stores/types.js +13 -0
  147. package/dist/mail/stores/types.js.map +1 -0
  148. package/dist/mail/turn-recorder.d.ts +30 -0
  149. package/dist/mail/turn-recorder.d.ts.map +1 -0
  150. package/dist/mail/turn-recorder.js +98 -0
  151. package/dist/mail/turn-recorder.js.map +1 -0
  152. package/dist/map/adapter/acp-over-map.d.ts +115 -0
  153. package/dist/map/adapter/acp-over-map.d.ts.map +1 -0
  154. package/dist/map/adapter/acp-over-map.js +1024 -0
  155. package/dist/map/adapter/acp-over-map.js.map +1 -0
  156. package/dist/map/adapter/connection-manager.d.ts +150 -0
  157. package/dist/map/adapter/connection-manager.d.ts.map +1 -0
  158. package/dist/map/adapter/connection-manager.js +207 -0
  159. package/dist/map/adapter/connection-manager.js.map +1 -0
  160. package/dist/map/adapter/event-log.d.ts +87 -0
  161. package/dist/map/adapter/event-log.d.ts.map +1 -0
  162. package/dist/map/adapter/event-log.js +122 -0
  163. package/dist/map/adapter/event-log.js.map +1 -0
  164. package/dist/map/adapter/event-translator.d.ts +85 -0
  165. package/dist/map/adapter/event-translator.d.ts.map +1 -0
  166. package/dist/map/adapter/event-translator.js +295 -0
  167. package/dist/map/adapter/event-translator.js.map +1 -0
  168. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  169. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  170. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  171. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  172. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  173. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  174. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  175. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  176. package/dist/map/adapter/extensions/cognitive.d.ts +27 -0
  177. package/dist/map/adapter/extensions/cognitive.d.ts.map +1 -0
  178. package/dist/map/adapter/extensions/cognitive.js +158 -0
  179. package/dist/map/adapter/extensions/cognitive.js.map +1 -0
  180. package/dist/map/adapter/extensions/index.d.ts +95 -0
  181. package/dist/map/adapter/extensions/index.d.ts.map +1 -0
  182. package/dist/map/adapter/extensions/index.js +228 -0
  183. package/dist/map/adapter/extensions/index.js.map +1 -0
  184. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  185. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  186. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  187. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  188. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  189. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  190. package/dist/map/adapter/extensions/resume.js +59 -0
  191. package/dist/map/adapter/extensions/resume.js.map +1 -0
  192. package/dist/map/adapter/extensions/streams.d.ts +95 -0
  193. package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
  194. package/dist/map/adapter/extensions/streams.js +515 -0
  195. package/dist/map/adapter/extensions/streams.js.map +1 -0
  196. package/dist/map/adapter/extensions/task.d.ts +40 -0
  197. package/dist/map/adapter/extensions/task.d.ts.map +1 -0
  198. package/dist/map/adapter/extensions/task.js +197 -0
  199. package/dist/map/adapter/extensions/task.js.map +1 -0
  200. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  201. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  202. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  203. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  204. package/dist/map/adapter/extensions/wake.d.ts +60 -0
  205. package/dist/map/adapter/extensions/wake.d.ts.map +1 -0
  206. package/dist/map/adapter/extensions/wake.js +144 -0
  207. package/dist/map/adapter/extensions/wake.js.map +1 -0
  208. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  209. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  210. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  211. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  212. package/dist/map/adapter/extensions/workspace.d.ts +57 -0
  213. package/dist/map/adapter/extensions/workspace.d.ts.map +1 -0
  214. package/dist/map/adapter/extensions/workspace.js +81 -0
  215. package/dist/map/adapter/extensions/workspace.js.map +1 -0
  216. package/dist/map/adapter/index.d.ts +20 -0
  217. package/dist/map/adapter/index.d.ts.map +1 -0
  218. package/dist/map/adapter/index.js +40 -0
  219. package/dist/map/adapter/index.js.map +1 -0
  220. package/dist/map/adapter/interface.d.ts +450 -0
  221. package/dist/map/adapter/interface.d.ts.map +1 -0
  222. package/dist/map/adapter/interface.js +24 -0
  223. package/dist/map/adapter/interface.js.map +1 -0
  224. package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
  225. package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
  226. package/dist/map/adapter/mail-handler-adapter.js +292 -0
  227. package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
  228. package/dist/map/adapter/map-adapter.d.ts +200 -0
  229. package/dist/map/adapter/map-adapter.d.ts.map +1 -0
  230. package/dist/map/adapter/map-adapter.js +1199 -0
  231. package/dist/map/adapter/map-adapter.js.map +1 -0
  232. package/dist/map/adapter/rpc-handler.d.ts +263 -0
  233. package/dist/map/adapter/rpc-handler.d.ts.map +1 -0
  234. package/dist/map/adapter/rpc-handler.js +365 -0
  235. package/dist/map/adapter/rpc-handler.js.map +1 -0
  236. package/dist/map/adapter/subscription-manager.d.ts +174 -0
  237. package/dist/map/adapter/subscription-manager.d.ts.map +1 -0
  238. package/dist/map/adapter/subscription-manager.js +248 -0
  239. package/dist/map/adapter/subscription-manager.js.map +1 -0
  240. package/dist/map/adapter/types.d.ts +194 -0
  241. package/dist/map/adapter/types.d.ts.map +1 -0
  242. package/dist/map/adapter/types.js +27 -0
  243. package/dist/map/adapter/types.js.map +1 -0
  244. package/dist/map/adapter/websocket-integration.d.ts +113 -0
  245. package/dist/map/adapter/websocket-integration.d.ts.map +1 -0
  246. package/dist/map/adapter/websocket-integration.js +134 -0
  247. package/dist/map/adapter/websocket-integration.js.map +1 -0
  248. package/dist/map/cascade-action-handler.d.ts.map +1 -1
  249. package/dist/map/cascade-action-handler.js +19 -5
  250. package/dist/map/cascade-action-handler.js.map +1 -1
  251. package/dist/map/federation/envelope.d.ts +98 -0
  252. package/dist/map/federation/envelope.d.ts.map +1 -0
  253. package/dist/map/federation/envelope.js +160 -0
  254. package/dist/map/federation/envelope.js.map +1 -0
  255. package/dist/map/federation/federation-handler.d.ts +50 -0
  256. package/dist/map/federation/federation-handler.d.ts.map +1 -0
  257. package/dist/map/federation/federation-handler.js +306 -0
  258. package/dist/map/federation/federation-handler.js.map +1 -0
  259. package/dist/map/federation/index.d.ts +14 -0
  260. package/dist/map/federation/index.d.ts.map +1 -0
  261. package/dist/map/federation/index.js +13 -0
  262. package/dist/map/federation/index.js.map +1 -0
  263. package/dist/map/federation/types.d.ts +239 -0
  264. package/dist/map/federation/types.d.ts.map +1 -0
  265. package/dist/map/federation/types.js +23 -0
  266. package/dist/map/federation/types.js.map +1 -0
  267. package/dist/map/mail-bridge.d.ts +7 -0
  268. package/dist/map/mail-bridge.d.ts.map +1 -1
  269. package/dist/map/mail-bridge.js +39 -9
  270. package/dist/map/mail-bridge.js.map +1 -1
  271. package/dist/map/server.d.ts.map +1 -1
  272. package/dist/map/server.js +17 -2
  273. package/dist/map/server.js.map +1 -1
  274. package/dist/map/types.d.ts +6 -0
  275. package/dist/map/types.d.ts.map +1 -1
  276. package/dist/mcp/map-client.d.ts +39 -0
  277. package/dist/mcp/map-client.d.ts.map +1 -0
  278. package/dist/mcp/map-client.js +129 -0
  279. package/dist/mcp/map-client.js.map +1 -0
  280. package/dist/mcp/mcp-server.d.ts +72 -0
  281. package/dist/mcp/mcp-server.d.ts.map +1 -0
  282. package/dist/mcp/mcp-server.js +1027 -0
  283. package/dist/mcp/mcp-server.js.map +1 -0
  284. package/dist/mcp/tools/claim_task.d.ts +35 -0
  285. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  286. package/dist/mcp/tools/claim_task.js +58 -0
  287. package/dist/mcp/tools/claim_task.js.map +1 -0
  288. package/dist/mcp/tools/done-v2.d.ts +0 -1
  289. package/dist/mcp/tools/done-v2.d.ts.map +1 -1
  290. package/dist/mcp/tools/done-v2.js +0 -1
  291. package/dist/mcp/tools/done-v2.js.map +1 -1
  292. package/dist/mcp/tools/done.d.ts +102 -0
  293. package/dist/mcp/tools/done.d.ts.map +1 -0
  294. package/dist/mcp/tools/done.js +253 -0
  295. package/dist/mcp/tools/done.js.map +1 -0
  296. package/dist/mcp/tools/inject_context.d.ts +61 -0
  297. package/dist/mcp/tools/inject_context.d.ts.map +1 -0
  298. package/dist/mcp/tools/inject_context.js +123 -0
  299. package/dist/mcp/tools/inject_context.js.map +1 -0
  300. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  301. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  302. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  303. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  304. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  305. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  306. package/dist/mcp/tools/unclaim_task.js +47 -0
  307. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  308. package/dist/mcp/tools/wait_for_activity.d.ts +60 -0
  309. package/dist/mcp/tools/wait_for_activity.d.ts.map +1 -0
  310. package/dist/mcp/tools/wait_for_activity.js +135 -0
  311. package/dist/mcp/tools/wait_for_activity.js.map +1 -0
  312. package/dist/monitor/health-check-service.d.ts +143 -0
  313. package/dist/monitor/health-check-service.d.ts.map +1 -0
  314. package/dist/monitor/health-check-service.js +240 -0
  315. package/dist/monitor/health-check-service.js.map +1 -0
  316. package/dist/monitor/index.d.ts +14 -0
  317. package/dist/monitor/index.d.ts.map +1 -0
  318. package/dist/monitor/index.js +14 -0
  319. package/dist/monitor/index.js.map +1 -0
  320. package/dist/monitor/stall-detector.d.ts +109 -0
  321. package/dist/monitor/stall-detector.d.ts.map +1 -0
  322. package/dist/monitor/stall-detector.js +152 -0
  323. package/dist/monitor/stall-detector.js.map +1 -0
  324. package/dist/peer/capability-manager.d.ts +56 -0
  325. package/dist/peer/capability-manager.d.ts.map +1 -0
  326. package/dist/peer/capability-manager.js +186 -0
  327. package/dist/peer/capability-manager.js.map +1 -0
  328. package/dist/peer/encapsulation-manager.d.ts +190 -0
  329. package/dist/peer/encapsulation-manager.d.ts.map +1 -0
  330. package/dist/peer/encapsulation-manager.js +486 -0
  331. package/dist/peer/encapsulation-manager.js.map +1 -0
  332. package/dist/peer/federation-manager.d.ts +223 -0
  333. package/dist/peer/federation-manager.d.ts.map +1 -0
  334. package/dist/peer/federation-manager.js +528 -0
  335. package/dist/peer/federation-manager.js.map +1 -0
  336. package/dist/peer/hierarchy-errors.d.ts +208 -0
  337. package/dist/peer/hierarchy-errors.d.ts.map +1 -0
  338. package/dist/peer/hierarchy-errors.js +268 -0
  339. package/dist/peer/hierarchy-errors.js.map +1 -0
  340. package/dist/peer/hierarchy-protocol.d.ts +159 -0
  341. package/dist/peer/hierarchy-protocol.d.ts.map +1 -0
  342. package/dist/peer/hierarchy-protocol.js +142 -0
  343. package/dist/peer/hierarchy-protocol.js.map +1 -0
  344. package/dist/peer/index.d.ts +15 -0
  345. package/dist/peer/index.d.ts.map +1 -0
  346. package/dist/peer/index.js +15 -0
  347. package/dist/peer/index.js.map +1 -0
  348. package/dist/peer/peer-manager.d.ts +99 -0
  349. package/dist/peer/peer-manager.d.ts.map +1 -0
  350. package/dist/peer/peer-manager.js +333 -0
  351. package/dist/peer/peer-manager.js.map +1 -0
  352. package/dist/peer/task-delegation.d.ts +189 -0
  353. package/dist/peer/task-delegation.d.ts.map +1 -0
  354. package/dist/peer/task-delegation.js +303 -0
  355. package/dist/peer/task-delegation.js.map +1 -0
  356. package/dist/peer/transports/index.d.ts +8 -0
  357. package/dist/peer/transports/index.d.ts.map +1 -0
  358. package/dist/peer/transports/index.js +8 -0
  359. package/dist/peer/transports/index.js.map +1 -0
  360. package/dist/peer/transports/local-transport.d.ts +56 -0
  361. package/dist/peer/transports/local-transport.d.ts.map +1 -0
  362. package/dist/peer/transports/local-transport.js +263 -0
  363. package/dist/peer/transports/local-transport.js.map +1 -0
  364. package/dist/peer/transports/websocket-transport.d.ts +86 -0
  365. package/dist/peer/transports/websocket-transport.d.ts.map +1 -0
  366. package/dist/peer/transports/websocket-transport.js +338 -0
  367. package/dist/peer/transports/websocket-transport.js.map +1 -0
  368. package/dist/peer/types.d.ts +268 -0
  369. package/dist/peer/types.d.ts.map +1 -0
  370. package/dist/peer/types.js +36 -0
  371. package/dist/peer/types.js.map +1 -0
  372. package/dist/router/address-resolver.d.ts +102 -0
  373. package/dist/router/address-resolver.d.ts.map +1 -0
  374. package/dist/router/address-resolver.js +198 -0
  375. package/dist/router/address-resolver.js.map +1 -0
  376. package/dist/router/broadcast.d.ts +53 -0
  377. package/dist/router/broadcast.d.ts.map +1 -0
  378. package/dist/router/broadcast.js +75 -0
  379. package/dist/router/broadcast.js.map +1 -0
  380. package/dist/router/channels.d.ts +148 -0
  381. package/dist/router/channels.d.ts.map +1 -0
  382. package/dist/router/channels.js +126 -0
  383. package/dist/router/channels.js.map +1 -0
  384. package/dist/router/index.d.ts +21 -0
  385. package/dist/router/index.d.ts.map +1 -0
  386. package/dist/router/index.js +18 -0
  387. package/dist/router/index.js.map +1 -0
  388. package/dist/router/message-router.d.ts +197 -0
  389. package/dist/router/message-router.d.ts.map +1 -0
  390. package/dist/router/message-router.js +903 -0
  391. package/dist/router/message-router.js.map +1 -0
  392. package/dist/router/message-types.d.ts +183 -0
  393. package/dist/router/message-types.d.ts.map +1 -0
  394. package/dist/router/message-types.js +79 -0
  395. package/dist/router/message-types.js.map +1 -0
  396. package/dist/router/role-resolver.d.ts +67 -0
  397. package/dist/router/role-resolver.d.ts.map +1 -0
  398. package/dist/router/role-resolver.js +106 -0
  399. package/dist/router/role-resolver.js.map +1 -0
  400. package/dist/router/signals.d.ts +253 -0
  401. package/dist/router/signals.d.ts.map +1 -0
  402. package/dist/router/signals.js +53 -0
  403. package/dist/router/signals.js.map +1 -0
  404. package/dist/router/types.d.ts +191 -0
  405. package/dist/router/types.d.ts.map +1 -0
  406. package/dist/router/types.js +34 -0
  407. package/dist/router/types.js.map +1 -0
  408. package/dist/router/wake.d.ts +111 -0
  409. package/dist/router/wake.d.ts.map +1 -0
  410. package/dist/router/wake.js +180 -0
  411. package/dist/router/wake.js.map +1 -0
  412. package/dist/server/combined-server.d.ts +95 -0
  413. package/dist/server/combined-server.d.ts.map +1 -0
  414. package/dist/server/combined-server.js +335 -0
  415. package/dist/server/combined-server.js.map +1 -0
  416. package/dist/steering/index.d.ts +11 -0
  417. package/dist/steering/index.d.ts.map +1 -0
  418. package/dist/steering/index.js +11 -0
  419. package/dist/steering/index.js.map +1 -0
  420. package/dist/steering/inject.d.ts +39 -0
  421. package/dist/steering/inject.d.ts.map +1 -0
  422. package/dist/steering/inject.js +197 -0
  423. package/dist/steering/inject.js.map +1 -0
  424. package/dist/steering/types.d.ts +100 -0
  425. package/dist/steering/types.d.ts.map +1 -0
  426. package/dist/steering/types.js +11 -0
  427. package/dist/steering/types.js.map +1 -0
  428. package/dist/store/backends/index.d.ts +11 -0
  429. package/dist/store/backends/index.d.ts.map +1 -0
  430. package/dist/store/backends/index.js +15 -0
  431. package/dist/store/backends/index.js.map +1 -0
  432. package/dist/store/backends/json-backend.d.ts +23 -0
  433. package/dist/store/backends/json-backend.d.ts.map +1 -0
  434. package/dist/store/backends/json-backend.js +220 -0
  435. package/dist/store/backends/json-backend.js.map +1 -0
  436. package/dist/store/backends/memory-backend.d.ts +12 -0
  437. package/dist/store/backends/memory-backend.d.ts.map +1 -0
  438. package/dist/store/backends/memory-backend.js +205 -0
  439. package/dist/store/backends/memory-backend.js.map +1 -0
  440. package/dist/store/backends/sqlite-backend.d.ts +27 -0
  441. package/dist/store/backends/sqlite-backend.d.ts.map +1 -0
  442. package/dist/store/backends/sqlite-backend.js +231 -0
  443. package/dist/store/backends/sqlite-backend.js.map +1 -0
  444. package/dist/store/backends/tinybase-backend.d.ts +22 -0
  445. package/dist/store/backends/tinybase-backend.d.ts.map +1 -0
  446. package/dist/store/backends/tinybase-backend.js +203 -0
  447. package/dist/store/backends/tinybase-backend.js.map +1 -0
  448. package/dist/store/backends/types.d.ts +175 -0
  449. package/dist/store/backends/types.d.ts.map +1 -0
  450. package/dist/store/backends/types.js +28 -0
  451. package/dist/store/backends/types.js.map +1 -0
  452. package/dist/store/event-store.d.ts +128 -0
  453. package/dist/store/event-store.d.ts.map +1 -0
  454. package/dist/store/event-store.js +1751 -0
  455. package/dist/store/event-store.js.map +1 -0
  456. package/dist/store/instance.d.ts +290 -0
  457. package/dist/store/instance.d.ts.map +1 -0
  458. package/dist/store/instance.js +363 -0
  459. package/dist/store/instance.js.map +1 -0
  460. package/dist/store/migrations.d.ts +41 -0
  461. package/dist/store/migrations.d.ts.map +1 -0
  462. package/dist/store/migrations.js +79 -0
  463. package/dist/store/migrations.js.map +1 -0
  464. package/dist/store/test-utils.d.ts +63 -0
  465. package/dist/store/test-utils.d.ts.map +1 -0
  466. package/dist/store/test-utils.js +63 -0
  467. package/dist/store/test-utils.js.map +1 -0
  468. package/dist/store/types/config.d.ts +16 -0
  469. package/dist/store/types/config.d.ts.map +1 -0
  470. package/dist/store/types/config.js +8 -0
  471. package/dist/store/types/config.js.map +1 -0
  472. package/dist/store/types/conversations.d.ts +91 -0
  473. package/dist/store/types/conversations.d.ts.map +1 -0
  474. package/dist/store/types/conversations.js +8 -0
  475. package/dist/store/types/conversations.js.map +1 -0
  476. package/dist/store/types/sessions.d.ts +44 -0
  477. package/dist/store/types/sessions.d.ts.map +1 -0
  478. package/dist/store/types/sessions.js +9 -0
  479. package/dist/store/types/sessions.js.map +1 -0
  480. package/dist/store/types.d.ts +115 -0
  481. package/dist/store/types.d.ts.map +1 -0
  482. package/dist/store/types.js +6 -0
  483. package/dist/store/types.js.map +1 -0
  484. package/dist/task/backend/index.d.ts +93 -0
  485. package/dist/task/backend/index.d.ts.map +1 -0
  486. package/dist/task/backend/index.js +178 -0
  487. package/dist/task/backend/index.js.map +1 -0
  488. package/dist/task/backend/memory.d.ts +70 -0
  489. package/dist/task/backend/memory.d.ts.map +1 -0
  490. package/dist/task/backend/memory.js +621 -0
  491. package/dist/task/backend/memory.js.map +1 -0
  492. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  493. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  494. package/dist/task/backend/opentasks/backend.js +1023 -0
  495. package/dist/task/backend/opentasks/backend.js.map +1 -0
  496. package/dist/task/backend/opentasks/client.d.ts +337 -0
  497. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  498. package/dist/task/backend/opentasks/client.js +225 -0
  499. package/dist/task/backend/opentasks/client.js.map +1 -0
  500. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  501. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  502. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  503. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  504. package/dist/task/backend/opentasks/index.d.ts +21 -0
  505. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  506. package/dist/task/backend/opentasks/index.js +21 -0
  507. package/dist/task/backend/opentasks/index.js.map +1 -0
  508. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  509. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  510. package/dist/task/backend/opentasks/mapping.js +77 -0
  511. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  512. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts +54 -0
  513. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts.map +1 -0
  514. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js +88 -0
  515. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js.map +1 -0
  516. package/dist/task/backend/sudocode/backend.d.ts +155 -0
  517. package/dist/task/backend/sudocode/backend.d.ts.map +1 -0
  518. package/dist/task/backend/sudocode/backend.js +942 -0
  519. package/dist/task/backend/sudocode/backend.js.map +1 -0
  520. package/dist/task/backend/sudocode/client.d.ts +303 -0
  521. package/dist/task/backend/sudocode/client.d.ts.map +1 -0
  522. package/dist/task/backend/sudocode/client.js +101 -0
  523. package/dist/task/backend/sudocode/client.js.map +1 -0
  524. package/dist/task/backend/sudocode/index.d.ts +19 -0
  525. package/dist/task/backend/sudocode/index.d.ts.map +1 -0
  526. package/dist/task/backend/sudocode/index.js +17 -0
  527. package/dist/task/backend/sudocode/index.js.map +1 -0
  528. package/dist/task/backend/sudocode/mapping.d.ts +51 -0
  529. package/dist/task/backend/sudocode/mapping.d.ts.map +1 -0
  530. package/dist/task/backend/sudocode/mapping.js +86 -0
  531. package/dist/task/backend/sudocode/mapping.js.map +1 -0
  532. package/dist/task/backend/sudocode/server-client.d.ts +56 -0
  533. package/dist/task/backend/sudocode/server-client.d.ts.map +1 -0
  534. package/dist/task/backend/sudocode/server-client.js +367 -0
  535. package/dist/task/backend/sudocode/server-client.js.map +1 -0
  536. package/dist/task/backend/sudocode/standalone-client.d.ts +91 -0
  537. package/dist/task/backend/sudocode/standalone-client.d.ts.map +1 -0
  538. package/dist/task/backend/sudocode/standalone-client.js +476 -0
  539. package/dist/task/backend/sudocode/standalone-client.js.map +1 -0
  540. package/dist/task/backend/sudocode/sync-policy.d.ts +166 -0
  541. package/dist/task/backend/sudocode/sync-policy.d.ts.map +1 -0
  542. package/dist/task/backend/sudocode/sync-policy.js +221 -0
  543. package/dist/task/backend/sudocode/sync-policy.js.map +1 -0
  544. package/dist/task/backend/sudocode/tools.d.ts +87 -0
  545. package/dist/task/backend/sudocode/tools.d.ts.map +1 -0
  546. package/dist/task/backend/sudocode/tools.js +743 -0
  547. package/dist/task/backend/sudocode/tools.js.map +1 -0
  548. package/dist/task/backend/tool-provider.d.ts +56 -0
  549. package/dist/task/backend/tool-provider.d.ts.map +1 -0
  550. package/dist/task/backend/tool-provider.js +424 -0
  551. package/dist/task/backend/tool-provider.js.map +1 -0
  552. package/dist/task/backend/types.d.ts +297 -0
  553. package/dist/task/backend/types.d.ts.map +1 -0
  554. package/dist/task/backend/types.js +27 -0
  555. package/dist/task/backend/types.js.map +1 -0
  556. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  557. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  558. package/dist/task/backend/unified-tool-provider.js +623 -0
  559. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  560. package/dist/task/index.d.ts +7 -0
  561. package/dist/task/index.d.ts.map +1 -0
  562. package/dist/task/index.js +7 -0
  563. package/dist/task/index.js.map +1 -0
  564. package/dist/task/retry-policy.d.ts +89 -0
  565. package/dist/task/retry-policy.d.ts.map +1 -0
  566. package/dist/task/retry-policy.js +160 -0
  567. package/dist/task/retry-policy.js.map +1 -0
  568. package/dist/task/task-manager.d.ts +70 -0
  569. package/dist/task/task-manager.d.ts.map +1 -0
  570. package/dist/task/task-manager.js +319 -0
  571. package/dist/task/task-manager.js.map +1 -0
  572. package/dist/task/types.d.ts +72 -0
  573. package/dist/task/types.d.ts.map +1 -0
  574. package/dist/task/types.js +33 -0
  575. package/dist/task/types.js.map +1 -0
  576. package/dist/teams/team-loader.d.ts +2 -1
  577. package/dist/teams/team-loader.d.ts.map +1 -1
  578. package/dist/teams/team-loader.js +2 -1
  579. package/dist/teams/team-loader.js.map +1 -1
  580. package/dist/teams/team-manager.d.ts +101 -0
  581. package/dist/teams/team-manager.d.ts.map +1 -0
  582. package/dist/teams/team-manager.js +260 -0
  583. package/dist/teams/team-manager.js.map +1 -0
  584. package/dist/teams/team-runtime-v2.d.ts +0 -3
  585. package/dist/teams/team-runtime-v2.d.ts.map +1 -1
  586. package/dist/teams/team-runtime-v2.js +31 -93
  587. package/dist/teams/team-runtime-v2.js.map +1 -1
  588. package/dist/teams/team-runtime.d.ts +245 -0
  589. package/dist/teams/team-runtime.d.ts.map +1 -0
  590. package/dist/teams/team-runtime.js +1023 -0
  591. package/dist/teams/team-runtime.js.map +1 -0
  592. package/dist/trigger/router/index.d.ts +11 -0
  593. package/dist/trigger/router/index.d.ts.map +1 -0
  594. package/dist/trigger/router/index.js +10 -0
  595. package/dist/trigger/router/index.js.map +1 -0
  596. package/dist/trigger/router/strategies/ai-router-strategy.d.ts +34 -0
  597. package/dist/trigger/router/strategies/ai-router-strategy.d.ts.map +1 -0
  598. package/dist/trigger/router/strategies/ai-router-strategy.js +359 -0
  599. package/dist/trigger/router/strategies/ai-router-strategy.js.map +1 -0
  600. package/dist/trigger/router/strategies/direct-strategy.d.ts +32 -0
  601. package/dist/trigger/router/strategies/direct-strategy.d.ts.map +1 -0
  602. package/dist/trigger/router/strategies/direct-strategy.js +119 -0
  603. package/dist/trigger/router/strategies/direct-strategy.js.map +1 -0
  604. package/dist/trigger/router/strategies/index.d.ts +11 -0
  605. package/dist/trigger/router/strategies/index.d.ts.map +1 -0
  606. package/dist/trigger/router/strategies/index.js +11 -0
  607. package/dist/trigger/router/strategies/index.js.map +1 -0
  608. package/dist/trigger/router/strategies/role-strategy.d.ts +39 -0
  609. package/dist/trigger/router/strategies/role-strategy.d.ts.map +1 -0
  610. package/dist/trigger/router/strategies/role-strategy.js +207 -0
  611. package/dist/trigger/router/strategies/role-strategy.js.map +1 -0
  612. package/dist/trigger/router/trigger-router.d.ts +54 -0
  613. package/dist/trigger/router/trigger-router.d.ts.map +1 -0
  614. package/dist/trigger/router/trigger-router.js +362 -0
  615. package/dist/trigger/router/trigger-router.js.map +1 -0
  616. package/dist/trigger/router/types.d.ts +225 -0
  617. package/dist/trigger/router/types.d.ts.map +1 -0
  618. package/dist/trigger/router/types.js +10 -0
  619. package/dist/trigger/router/types.js.map +1 -0
  620. package/dist/trigger/sources/cron/cron-service.d.ts.map +1 -1
  621. package/dist/trigger/sources/cron/cron-service.js +6 -3
  622. package/dist/trigger/sources/cron/cron-service.js.map +1 -1
  623. package/dist/trigger/trigger-system.d.ts +77 -0
  624. package/dist/trigger/trigger-system.d.ts.map +1 -0
  625. package/dist/trigger/trigger-system.js +84 -0
  626. package/dist/trigger/trigger-system.js.map +1 -0
  627. package/dist/util/git-safety.d.ts +33 -0
  628. package/dist/util/git-safety.d.ts.map +1 -0
  629. package/dist/util/git-safety.js +94 -0
  630. package/dist/util/git-safety.js.map +1 -0
  631. package/dist/workspace/index.d.ts +0 -1
  632. package/dist/workspace/index.d.ts.map +1 -1
  633. package/dist/workspace/index.js +0 -2
  634. package/dist/workspace/index.js.map +1 -1
  635. package/dist/workspace/landing/direct-push.d.ts.map +1 -1
  636. package/dist/workspace/landing/direct-push.js +22 -7
  637. package/dist/workspace/landing/direct-push.js.map +1 -1
  638. package/dist/workspace/landing/queue-to-branch.d.ts.map +1 -1
  639. package/dist/workspace/landing/queue-to-branch.js +1 -3
  640. package/dist/workspace/landing/queue-to-branch.js.map +1 -1
  641. package/dist/workspace/types.d.ts +0 -13
  642. package/dist/workspace/types.d.ts.map +1 -1
  643. package/dist/workspace/workspace-manager.d.ts +0 -11
  644. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  645. package/dist/workspace/workspace-manager.js +0 -30
  646. package/dist/workspace/workspace-manager.js.map +1 -1
  647. package/package.json +28 -2
  648. package/templates/teams/self-driving/prompts/grinder.md +1 -0
  649. package/templates/teams/self-driving/prompts/judge.md +1 -0
  650. package/templates/teams/self-driving/prompts/planner.md +1 -0
  651. package/templates/teams/self-driving/roles/grinder.yaml +15 -0
  652. package/templates/teams/self-driving/roles/judge.yaml +10 -0
  653. package/templates/teams/self-driving/roles/planner.yaml +16 -0
  654. package/.claude/commands/openspec/apply.md +0 -23
  655. package/.claude/commands/openspec/archive.md +0 -27
  656. package/.claude/commands/openspec/proposal.md +0 -28
  657. package/.claude/settings.json +0 -133
  658. package/.gitattributes +0 -3
  659. package/.opentasks/config.json +0 -9
  660. package/.opentasks/graph.jsonl +0 -0
  661. package/.sessionlog/settings.json +0 -4
  662. package/.sudocode/issues.jsonl +0 -183
  663. package/.sudocode/specs.jsonl +0 -56
  664. package/AGENTS.md +0 -18
  665. package/CLAUDE.md +0 -923
  666. package/docs/architecture.md +0 -508
  667. package/docs/configuration.md +0 -323
  668. package/docs/conflict-recovery.md +0 -472
  669. package/docs/design/task-dispatcher.md +0 -880
  670. package/docs/design-subsystem-extraction.md +0 -627
  671. package/docs/git-cascade-integration-gaps.md +0 -678
  672. package/docs/implementation-details.md +0 -1127
  673. package/docs/implementation-summary.md +0 -448
  674. package/docs/lifecycle-events-design.md +0 -111
  675. package/docs/mail-integration.md +0 -608
  676. package/docs/openhive-capability-summary.md +0 -415
  677. package/docs/openhive-integration.md +0 -415
  678. package/docs/plan-self-driving-support.md +0 -433
  679. package/docs/roadmap-v2-gaps.md +0 -216
  680. package/docs/spec-self-driving-support.md +0 -462
  681. package/docs/team-templates.md +0 -860
  682. package/docs/teams.md +0 -306
  683. package/docs/trigger-system-design.md +0 -333
  684. package/docs/troubleshooting.md +0 -489
  685. package/docs/workspace-interfaces.md +0 -731
  686. package/docs/workspace-redesign-plan.md +0 -302
  687. package/examples/distributed-peer-communication.ts +0 -202
  688. package/examples/local-peer-communication.ts +0 -165
  689. package/index.js +0 -2
  690. package/mvp_docs/agent-execution-system.md +0 -347
  691. package/mvp_docs/agent-interface.md +0 -580
  692. package/mvp_docs/data-structures.md +0 -701
  693. package/mvp_docs/dynamic-meta-orchestration.md +0 -116
  694. package/mvp_docs/multi-agent-interaction-design.md +0 -779
  695. package/mvp_docs/mvp-implementation-plan.md +0 -1148
  696. package/renovate.json5 +0 -6
  697. package/scripts/test-acp-integration.ts +0 -422
  698. package/src/__tests__/boot-v2.test.ts +0 -631
  699. package/src/__tests__/e2e/acp-over-map-live.e2e.test.ts +0 -496
  700. package/src/__tests__/e2e/acp-over-map.e2e.test.ts +0 -457
  701. package/src/__tests__/e2e/agent-lifecycle.e2e.test.ts +0 -770
  702. package/src/__tests__/e2e/auto-sync.e2e.test.ts +0 -257
  703. package/src/__tests__/e2e/bootstrap.e2e.test.ts +0 -319
  704. package/src/__tests__/e2e/cascade-rebase.e2e.test.ts +0 -254
  705. package/src/__tests__/e2e/cc-swarm-bridge.e2e.test.ts +0 -253
  706. package/src/__tests__/e2e/cli-run.e2e.test.ts +0 -167
  707. package/src/__tests__/e2e/cognitive-workspace.e2e.test.ts +0 -282
  708. package/src/__tests__/e2e/dispatch-coordination.e2e.test.ts +0 -495
  709. package/src/__tests__/e2e/dispatch-live.e2e.test.ts +0 -564
  710. package/src/__tests__/e2e/dispatch-opentasks.e2e.test.ts +0 -496
  711. package/src/__tests__/e2e/dispatch-phase2-live.e2e.test.ts +0 -456
  712. package/src/__tests__/e2e/dispatch-phase2.e2e.test.ts +0 -386
  713. package/src/__tests__/e2e/dispatch.e2e.test.ts +0 -376
  714. package/src/__tests__/e2e/done-scenarios.e2e.test.ts +0 -322
  715. package/src/__tests__/e2e/live-agent.e2e.test.ts +0 -1330
  716. package/src/__tests__/e2e/map-server.e2e.test.ts +0 -128
  717. package/src/__tests__/e2e/map-sidecar.e2e.test.ts +0 -139
  718. package/src/__tests__/e2e/opentasks-integration.e2e.test.ts +0 -280
  719. package/src/__tests__/e2e/pull-mode.e2e.test.ts +0 -632
  720. package/src/__tests__/e2e/resume-continue.e2e.test.ts +0 -312
  721. package/src/__tests__/e2e/self-driving-v3.e2e.test.ts +0 -197
  722. package/src/__tests__/e2e/spawn-resolver.e2e.test.ts +0 -200
  723. package/src/__tests__/e2e/swarmkit-integration.e2e.test.ts +0 -562
  724. package/src/__tests__/e2e/swarmkit-live.e2e.test.ts +0 -1049
  725. package/src/__tests__/e2e/trajectory-tracking.e2e.test.ts +0 -258
  726. package/src/__tests__/e2e/trigger-wake.e2e.test.ts +0 -257
  727. package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +0 -383
  728. package/src/__tests__/e2e/workspace-v3.e2e.test.ts +0 -413
  729. package/src/acp/__tests__/claude-code-replay.test.ts +0 -225
  730. package/src/acp/__tests__/macro-agent.test.ts +0 -387
  731. package/src/acp/__tests__/session-mapper.test.ts +0 -152
  732. package/src/acp/__tests__/websocket-server.test.ts +0 -194
  733. package/src/acp/claude-code-replay.ts +0 -208
  734. package/src/acp/index.ts +0 -32
  735. package/src/acp/macro-agent.ts +0 -995
  736. package/src/acp/map-bridge.ts +0 -193
  737. package/src/acp/session-mapper.ts +0 -116
  738. package/src/acp/types.ts +0 -99
  739. package/src/acp/websocket-server.ts +0 -213
  740. package/src/adapters/__tests__/federation.test.ts +0 -256
  741. package/src/adapters/__tests__/inbox-adapter.test.ts +0 -316
  742. package/src/adapters/__tests__/tasks-adapter.test.ts +0 -270
  743. package/src/adapters/federation.ts +0 -185
  744. package/src/adapters/inbox-adapter.ts +0 -292
  745. package/src/adapters/inbox-client-adapter.ts +0 -173
  746. package/src/adapters/index.ts +0 -44
  747. package/src/adapters/opentasks-daemon.ts +0 -252
  748. package/src/adapters/tasks-adapter.ts +0 -330
  749. package/src/adapters/types.ts +0 -286
  750. package/src/agent/__tests__/agent-manager-topology.test.ts +0 -73
  751. package/src/agent/__tests__/agent-manager-v2.permission-interception.test.ts +0 -296
  752. package/src/agent/__tests__/agent-manager-v2.permissions.test.ts +0 -233
  753. package/src/agent/__tests__/agent-manager-v2.test.ts +0 -614
  754. package/src/agent/__tests__/agent-store.test.ts +0 -465
  755. package/src/agent/__tests__/task-ref-resolution.test.ts +0 -231
  756. package/src/agent/agent-manager-v2.ts +0 -2021
  757. package/src/agent/agent-manager.ts +0 -386
  758. package/src/agent/agent-store.ts +0 -409
  759. package/src/agent/index.ts +0 -7
  760. package/src/agent/prompts/coordinator-signals.ts +0 -115
  761. package/src/agent/prompts/index.ts +0 -7
  762. package/src/agent/system-prompt.ts +0 -298
  763. package/src/agent/types.ts +0 -459
  764. package/src/agent-detection/__tests__/command-builder.test.ts +0 -336
  765. package/src/agent-detection/__tests__/detector.test.ts +0 -768
  766. package/src/agent-detection/__tests__/registry.test.ts +0 -254
  767. package/src/agent-detection/command-builder.ts +0 -90
  768. package/src/agent-detection/detector.ts +0 -307
  769. package/src/agent-detection/index.ts +0 -36
  770. package/src/agent-detection/registry.ts +0 -200
  771. package/src/agent-detection/types.ts +0 -184
  772. package/src/api/__tests__/server.test.ts +0 -292
  773. package/src/api/index.ts +0 -8
  774. package/src/api/server.ts +0 -380
  775. package/src/api/types.ts +0 -39
  776. package/src/auth/__tests__/token.test.ts +0 -100
  777. package/src/auth/index.ts +0 -1
  778. package/src/auth/token.ts +0 -82
  779. package/src/boot-v2.ts +0 -1343
  780. package/src/cli/__tests__/stable-instance-id.test.ts +0 -57
  781. package/src/cli/acp.ts +0 -101
  782. package/src/cli/inbox-mcp-proxy.ts +0 -56
  783. package/src/cli/index.ts +0 -566
  784. package/src/cli/mcp.ts +0 -305
  785. package/src/cli/parse-args.ts +0 -54
  786. package/src/cli/stable-instance-id.ts +0 -14
  787. package/src/cognitive/__tests__/macro-agent-backend.test.ts +0 -520
  788. package/src/cognitive/__tests__/session-converter.test.ts +0 -423
  789. package/src/cognitive/__tests__/workspace-handler.test.ts +0 -221
  790. package/src/cognitive/analyst-role.ts +0 -59
  791. package/src/cognitive/index.ts +0 -49
  792. package/src/cognitive/macro-agent-backend.ts +0 -370
  793. package/src/cognitive/session-converter.ts +0 -151
  794. package/src/cognitive/types.ts +0 -163
  795. package/src/cognitive/workspace-handler.ts +0 -163
  796. package/src/config/index.ts +0 -9
  797. package/src/config/project-config.ts +0 -294
  798. package/src/control/__tests__/control-resilience.test.ts +0 -251
  799. package/src/control/__tests__/control-socket.test.ts +0 -240
  800. package/src/control/control-client.ts +0 -337
  801. package/src/control/control-server.ts +0 -298
  802. package/src/control/index.ts +0 -17
  803. package/src/control/types.ts +0 -95
  804. package/src/dispatch/CLAUDE.md +0 -129
  805. package/src/dispatch/__tests__/loadout-translation.test.ts +0 -141
  806. package/src/dispatch/__tests__/mail-inbound-consumer.integration.test.ts +0 -519
  807. package/src/dispatch/__tests__/mail-inbound-consumer.test.ts +0 -800
  808. package/src/dispatch/__tests__/mail-inbound-reuse-consumer.test.ts +0 -575
  809. package/src/dispatch/__tests__/permission-evaluator.test.ts +0 -196
  810. package/src/dispatch/__tests__/permission-overlay.test.ts +0 -56
  811. package/src/dispatch/__tests__/permissions-handler.test.ts +0 -168
  812. package/src/dispatch/__tests__/spawn-agent-handler.test.ts +0 -282
  813. package/src/dispatch/loadout-translation.ts +0 -138
  814. package/src/dispatch/mail-inbound-consumer.ts +0 -560
  815. package/src/dispatch/mail-inbound-reuse-consumer.ts +0 -479
  816. package/src/dispatch/permission-evaluator.ts +0 -191
  817. package/src/dispatch/permission-overlay.ts +0 -89
  818. package/src/dispatch/permissions-handler.ts +0 -112
  819. package/src/dispatch/spawn-agent-handler.ts +0 -160
  820. package/src/index.ts +0 -115
  821. package/src/integrations/__tests__/context-builder.test.ts +0 -218
  822. package/src/integrations/__tests__/sessionlog.test.ts +0 -498
  823. package/src/integrations/__tests__/skilltree.test.ts +0 -136
  824. package/src/integrations/context-builder.ts +0 -280
  825. package/src/integrations/sessionlog.ts +0 -194
  826. package/src/integrations/skilltree.ts +0 -184
  827. package/src/lifecycle/__tests__/cascade-consolidation.test.ts +0 -240
  828. package/src/lifecycle/__tests__/handlers-v2.test.ts +0 -565
  829. package/src/lifecycle/cascade.ts +0 -335
  830. package/src/lifecycle/cleanup.ts +0 -373
  831. package/src/lifecycle/handlers-v2.ts +0 -508
  832. package/src/lifecycle/index.ts +0 -76
  833. package/src/lifecycle/types.ts +0 -260
  834. package/src/map/__tests__/cascade-bridge.test.ts +0 -229
  835. package/src/map/__tests__/cascade-diff-server.test.ts +0 -434
  836. package/src/map/__tests__/emit-event.test.ts +0 -71
  837. package/src/map/__tests__/lifecycle-bridge.test.ts +0 -430
  838. package/src/map/__tests__/mail-bridge.test.ts +0 -284
  839. package/src/map/__tests__/permission-forwarding.test.ts +0 -143
  840. package/src/map/__tests__/sidecar-diff-install-smoke.test.ts +0 -90
  841. package/src/map/__tests__/sidecar-integration.test.ts +0 -190
  842. package/src/map/__tests__/task-bridge.test.ts +0 -153
  843. package/src/map/__tests__/trajectory-reporter.test.ts +0 -173
  844. package/src/map/acp-bridge.ts +0 -293
  845. package/src/map/cascade-action-handler.ts +0 -205
  846. package/src/map/cascade-bridge.ts +0 -339
  847. package/src/map/cascade-diff-server.ts +0 -404
  848. package/src/map/cc-swarm-hooks.ts +0 -242
  849. package/src/map/coordination-handler.ts +0 -232
  850. package/src/map/index.ts +0 -18
  851. package/src/map/lifecycle-bridge.ts +0 -236
  852. package/src/map/mail-bridge.ts +0 -215
  853. package/src/map/repo-workspace.ts +0 -82
  854. package/src/map/server.ts +0 -758
  855. package/src/map/sidecar.ts +0 -826
  856. package/src/map/task-bridge.ts +0 -89
  857. package/src/map/trajectory-reporter.ts +0 -124
  858. package/src/map/types.ts +0 -304
  859. package/src/mcp/__tests__/mcp-server-v2.test.ts +0 -236
  860. package/src/mcp/index.ts +0 -6
  861. package/src/mcp/mcp-server-v2.ts +0 -485
  862. package/src/mcp/tools/done-v2.ts +0 -213
  863. package/src/mcp/types.ts +0 -432
  864. package/src/metrics/__tests__/metrics.test.ts +0 -205
  865. package/src/metrics/index.ts +0 -13
  866. package/src/metrics/metrics.ts +0 -151
  867. package/src/metrics/types.ts +0 -63
  868. package/src/roles/__tests__/config-loader.test.ts +0 -540
  869. package/src/roles/builtin/coordinator.ts +0 -75
  870. package/src/roles/builtin/generic.ts +0 -39
  871. package/src/roles/builtin/index.ts +0 -51
  872. package/src/roles/builtin/integrator.ts +0 -62
  873. package/src/roles/builtin/monitor.ts +0 -65
  874. package/src/roles/builtin/worker.ts +0 -134
  875. package/src/roles/capabilities.ts +0 -257
  876. package/src/roles/config-loader.ts +0 -405
  877. package/src/roles/index.ts +0 -141
  878. package/src/roles/registry.ts +0 -713
  879. package/src/roles/types.ts +0 -344
  880. package/src/store/index.ts +0 -8
  881. package/src/store/types/agents.ts +0 -69
  882. package/src/store/types/events.ts +0 -91
  883. package/src/store/types/index.ts +0 -9
  884. package/src/store/types/messages.ts +0 -32
  885. package/src/store/types/primitives.ts +0 -9
  886. package/src/store/types/tasks.ts +0 -124
  887. package/src/teams/__tests__/team-manager-v2.test.ts +0 -425
  888. package/src/teams/__tests__/team-runtime-v2.test.ts +0 -402
  889. package/src/teams/index.ts +0 -29
  890. package/src/teams/seed-defaults.ts +0 -83
  891. package/src/teams/team-loader.ts +0 -476
  892. package/src/teams/team-manager-v2.ts +0 -343
  893. package/src/teams/team-runtime-v2.ts +0 -920
  894. package/src/teams/types.ts +0 -276
  895. package/src/trigger/__tests__/cron-service.test.ts +0 -548
  896. package/src/trigger/__tests__/scheduler.test.ts +0 -371
  897. package/src/trigger/__tests__/system-event-queue.test.ts +0 -147
  898. package/src/trigger/__tests__/trigger-system-v2.test.ts +0 -257
  899. package/src/trigger/__tests__/wake-manager.test.ts +0 -356
  900. package/src/trigger/__tests__/webhook-handler.test.ts +0 -567
  901. package/src/trigger/index.ts +0 -110
  902. package/src/trigger/queue/index.ts +0 -21
  903. package/src/trigger/queue/system-event-queue.ts +0 -232
  904. package/src/trigger/queue/types.ts +0 -149
  905. package/src/trigger/sources/cron/cron-service.ts +0 -499
  906. package/src/trigger/sources/cron/index.ts +0 -41
  907. package/src/trigger/sources/cron/scheduler.ts +0 -344
  908. package/src/trigger/sources/cron/types.ts +0 -333
  909. package/src/trigger/sources/index.ts +0 -10
  910. package/src/trigger/sources/webhook/index.ts +0 -25
  911. package/src/trigger/sources/webhook/types.ts +0 -205
  912. package/src/trigger/sources/webhook/webhook-handler.ts +0 -410
  913. package/src/trigger/strategies/ai-router.ts +0 -170
  914. package/src/trigger/trigger-system-v2.ts +0 -536
  915. package/src/trigger/types.ts +0 -228
  916. package/src/trigger/wake/index.ts +0 -22
  917. package/src/trigger/wake/types.ts +0 -162
  918. package/src/trigger/wake/wake-manager.ts +0 -390
  919. package/src/workspace/__tests__/git-cascade-adapter.test.ts +0 -563
  920. package/src/workspace/__tests__/land-dispatch.test.ts +0 -214
  921. package/src/workspace/__tests__/self-driving-yaml.test.ts +0 -122
  922. package/src/workspace/__tests__/shared-worktree-refcount.test.ts +0 -154
  923. package/src/workspace/__tests__/standalone-mode.test.ts +0 -118
  924. package/src/workspace/__tests__/workspace-manager-v3.test.ts +0 -245
  925. package/src/workspace/__tests__/yaml-schema.test.ts +0 -210
  926. package/src/workspace/config.ts +0 -165
  927. package/src/workspace/git-cascade-adapter.ts +0 -1213
  928. package/src/workspace/index.ts +0 -110
  929. package/src/workspace/landing/__tests__/strategies.test.ts +0 -184
  930. package/src/workspace/landing/direct-push.ts +0 -91
  931. package/src/workspace/landing/index.ts +0 -40
  932. package/src/workspace/landing/merge-to-parent.ts +0 -229
  933. package/src/workspace/landing/optimistic-push.ts +0 -36
  934. package/src/workspace/landing/queue-to-branch.ts +0 -108
  935. package/src/workspace/merge-queue/__tests__/conflict-resolution-git.e2e.test.ts +0 -641
  936. package/src/workspace/merge-queue/__tests__/conflict-resolution.test.ts +0 -707
  937. package/src/workspace/merge-queue/__tests__/merge-queue-concurrent.test.ts +0 -628
  938. package/src/workspace/merge-queue/__tests__/merge-queue-edge-cases.test.ts +0 -1217
  939. package/src/workspace/merge-queue/__tests__/merge-queue.test.ts +0 -506
  940. package/src/workspace/merge-queue/__tests__/real-git-operations.e2e.test.ts +0 -556
  941. package/src/workspace/merge-queue/__tests__/resolver-flow.test.ts +0 -472
  942. package/src/workspace/merge-queue/index.ts +0 -38
  943. package/src/workspace/merge-queue/merge-queue.ts +0 -585
  944. package/src/workspace/merge-queue/schema.ts +0 -98
  945. package/src/workspace/merge-queue/types.ts +0 -316
  946. package/src/workspace/pool/__tests__/worktree-pool.integration.test.ts +0 -1281
  947. package/src/workspace/pool/__tests__/worktree-pool.test.ts +0 -590
  948. package/src/workspace/pool/index.ts +0 -26
  949. package/src/workspace/pool/types.ts +0 -276
  950. package/src/workspace/pool/worktree-pool.ts +0 -659
  951. package/src/workspace/recovery/__tests__/auto-resolve-integration.test.ts +0 -127
  952. package/src/workspace/recovery/__tests__/spawn-resolver.test.ts +0 -139
  953. package/src/workspace/recovery/__tests__/strategies.test.ts +0 -145
  954. package/src/workspace/recovery/abandon.ts +0 -51
  955. package/src/workspace/recovery/auto-resolve.ts +0 -119
  956. package/src/workspace/recovery/defer.ts +0 -23
  957. package/src/workspace/recovery/escalate.ts +0 -30
  958. package/src/workspace/recovery/index.ts +0 -58
  959. package/src/workspace/recovery/spawn-resolver.ts +0 -152
  960. package/src/workspace/recovery/types.ts +0 -54
  961. package/src/workspace/strategies/index.ts +0 -18
  962. package/src/workspace/strategies/optimistic.ts +0 -139
  963. package/src/workspace/strategies/queue.ts +0 -81
  964. package/src/workspace/strategies/registry.ts +0 -89
  965. package/src/workspace/strategies/trunk.ts +0 -123
  966. package/src/workspace/strategies/types.ts +0 -145
  967. package/src/workspace/topology/__tests__/yaml-driven.test.ts +0 -345
  968. package/src/workspace/topology/index.ts +0 -18
  969. package/src/workspace/topology/no-workspace.ts +0 -39
  970. package/src/workspace/topology/types.ts +0 -116
  971. package/src/workspace/topology/yaml-driven.ts +0 -316
  972. package/src/workspace/types-v3.ts +0 -162
  973. package/src/workspace/types.ts +0 -541
  974. package/src/workspace/workspace-manager.ts +0 -1577
  975. package/src/workspace/yaml-schema.ts +0 -216
  976. package/test_fixtures/README.md +0 -425
  977. package/test_fixtures/fixtures/behaviors/coordinators.ts +0 -196
  978. package/test_fixtures/fixtures/behaviors/index.ts +0 -62
  979. package/test_fixtures/fixtures/behaviors/integrators.ts +0 -143
  980. package/test_fixtures/fixtures/behaviors/monitors.ts +0 -199
  981. package/test_fixtures/fixtures/behaviors/workers.ts +0 -348
  982. package/test_fixtures/fixtures/index.ts +0 -7
  983. package/test_fixtures/fixtures/projects/index.ts +0 -23
  984. package/test_fixtures/fixtures/projects/project-with-specs.ts +0 -44
  985. package/test_fixtures/fixtures/projects/typescript-project.ts +0 -200
  986. package/test_fixtures/fixtures/repos/index.ts +0 -6
  987. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -299
  988. package/test_fixtures/fixtures/repos/types.ts +0 -174
  989. package/test_fixtures/harness/assertions/harness-assertions.ts +0 -752
  990. package/test_fixtures/harness/assertions/index.ts +0 -8
  991. package/test_fixtures/harness/index.ts +0 -15
  992. package/test_fixtures/harness/simulator/agent-simulator.ts +0 -768
  993. package/test_fixtures/harness/simulator/behavior-executor.ts +0 -580
  994. package/test_fixtures/harness/simulator/index.ts +0 -14
  995. package/test_fixtures/harness/simulator/types.ts +0 -459
  996. package/test_fixtures/harness/test-harness.ts +0 -770
  997. package/test_fixtures/harness/timing/event-stepper.ts +0 -344
  998. package/test_fixtures/harness/timing/index.ts +0 -8
  999. package/tsconfig.json +0 -21
  1000. package/vitest.config.ts +0 -30
  1001. package/vitest.e2e.config.ts +0 -28
  1002. package/vitest.setup.ts +0 -12
@@ -1,1281 +0,0 @@
1
- /**
2
- * Worktree Pool Integration Tests
3
- *
4
- * Comprehensive integration tests that exercise the full worktree pool
5
- * functionality with real git operations including:
6
- * - Actual worktree creation and deletion
7
- * - All allocation strategies (reject, queue, steal)
8
- * - Orphan recovery with real orphaned worktrees
9
- * - Pool integration with WorkspaceManager
10
- * - Concurrent operations
11
- */
12
-
13
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
14
- import * as fs from 'fs';
15
- import * as path from 'path';
16
- import * as os from 'os';
17
- import { execSync } from 'child_process';
18
- import Database from 'better-sqlite3';
19
- import { WorktreePool } from '../worktree-pool.js';
20
- import { createWorkspaceManager, DefaultWorkspaceManager } from '../../workspace-manager.js';
21
- import { createGitCascadeAdapter, GitCascadeAdapter } from '../../git-cascade-adapter.js';
22
- import type { PoolEvent, PoolStats } from '../types.js';
23
- import type { WorkerWorkspace, IntegratorWorkspace, CoordinatorWorkspace } from '../../types.js';
24
-
25
- describe('WorktreePool Integration', () => {
26
- let tempDir: string;
27
- let repoPath: string;
28
- let worktreeBaseDir: string;
29
- let dbPath: string;
30
-
31
- /**
32
- * Helper to run git commands
33
- */
34
- function git(args: string, cwd: string = repoPath): string {
35
- return execSync(`git ${args}`, { cwd, stdio: 'pipe', encoding: 'utf8' }).trim();
36
- }
37
-
38
- /**
39
- * Helper to list all worktrees
40
- * Uses realpath to handle macOS /var -> /private/var symlink
41
- */
42
- function listWorktrees(): string[] {
43
- return git('worktree list --porcelain')
44
- .split('\n')
45
- .filter((line) => line.startsWith('worktree '))
46
- .map((line) => {
47
- const wtPath = line.replace('worktree ', '');
48
- try {
49
- return fs.realpathSync(wtPath);
50
- } catch {
51
- return wtPath;
52
- }
53
- });
54
- }
55
-
56
- /**
57
- * Helper to normalize path for comparison (handles macOS symlinks)
58
- */
59
- function normalizePath(p: string): string {
60
- try {
61
- return fs.realpathSync(p);
62
- } catch {
63
- return p;
64
- }
65
- }
66
-
67
- /**
68
- * Helper to get current branch in a worktree
69
- */
70
- function getCurrentBranch(cwd: string): string {
71
- try {
72
- return git('rev-parse --abbrev-ref HEAD', cwd);
73
- } catch {
74
- return 'HEAD'; // Detached
75
- }
76
- }
77
-
78
- /**
79
- * Helper to check if worktree has uncommitted changes
80
- */
81
- function hasUncommittedChanges(cwd: string): boolean {
82
- const status = git('status --porcelain', cwd);
83
- return status.length > 0;
84
- }
85
-
86
- /**
87
- * Helper to cleanup all worktrees before removing temp dir
88
- */
89
- function cleanupWorktrees(): void {
90
- if (!repoPath || !fs.existsSync(repoPath)) return;
91
-
92
- try {
93
- const worktrees = listWorktrees().filter((wt) => wt !== repoPath);
94
- for (const wt of worktrees) {
95
- try {
96
- execSync(`git worktree remove --force "${wt}"`, {
97
- cwd: repoPath,
98
- stdio: 'pipe',
99
- });
100
- } catch {
101
- // Ignore errors
102
- }
103
- }
104
- } catch {
105
- // Ignore errors
106
- }
107
- }
108
-
109
- beforeEach(() => {
110
- // Create temp directory
111
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pool-integration-test-'));
112
- repoPath = path.join(tempDir, 'repo');
113
- worktreeBaseDir = path.join(tempDir, '.worktrees');
114
- dbPath = path.join(tempDir, 'test.db');
115
- fs.mkdirSync(repoPath);
116
-
117
- // Initialize git repo
118
- git('init');
119
- git('config user.email "test@test.com"');
120
- git('config user.name "Test User"');
121
-
122
- // Create initial commit with some files
123
- fs.writeFileSync(path.join(repoPath, 'README.md'), '# Test Project\n');
124
- fs.mkdirSync(path.join(repoPath, 'src'), { recursive: true });
125
- fs.writeFileSync(path.join(repoPath, 'src/index.ts'), 'export const version = "1.0.0";\n');
126
- git('add .');
127
- git('commit -m "Initial commit"');
128
- });
129
-
130
- afterEach(() => {
131
- cleanupWorktrees();
132
-
133
- // Clean up temp directory
134
- if (tempDir && fs.existsSync(tempDir)) {
135
- fs.rmSync(tempDir, { recursive: true, force: true });
136
- }
137
- });
138
-
139
- // ═══════════════════════════════════════════════════════════════════════════
140
- // Real Worktree Operations
141
- // ═══════════════════════════════════════════════════════════════════════════
142
-
143
- describe('real worktree creation', () => {
144
- it('should create actual git worktrees on acquire', async () => {
145
- const pool = new WorktreePool(repoPath, {
146
- worktreeBaseDir,
147
- maxSize: 3,
148
- recoverOrphans: false,
149
- });
150
-
151
- try {
152
- const result = await pool.acquire({
153
- agentId: 'worker-1',
154
- role: 'worker',
155
- });
156
-
157
- expect(result.success).toBe(true);
158
- expect(result.worktree).toBeDefined();
159
-
160
- // Verify the worktree was actually created
161
- const wtPath = result.worktree!.path;
162
- expect(fs.existsSync(wtPath)).toBe(true);
163
- expect(fs.existsSync(path.join(wtPath, '.git'))).toBe(true);
164
-
165
- // Verify git recognizes it as a worktree
166
- const worktrees = listWorktrees();
167
- expect(worktrees).toContain(normalizePath(wtPath));
168
-
169
- // Verify the repo files are present
170
- expect(fs.existsSync(path.join(wtPath, 'README.md'))).toBe(true);
171
- expect(fs.existsSync(path.join(wtPath, 'src/index.ts'))).toBe(true);
172
- } finally {
173
- await pool.close();
174
- }
175
- });
176
-
177
- it('should create worktrees with detached HEAD', async () => {
178
- const pool = new WorktreePool(repoPath, {
179
- worktreeBaseDir,
180
- maxSize: 3,
181
- recoverOrphans: false,
182
- });
183
-
184
- try {
185
- const result = await pool.acquire({
186
- agentId: 'worker-1',
187
- role: 'worker',
188
- });
189
-
190
- const branch = getCurrentBranch(result.worktree!.path);
191
- expect(branch).toBe('HEAD'); // Detached HEAD
192
- } finally {
193
- await pool.close();
194
- }
195
- });
196
-
197
- it('should allow file operations in worktrees', async () => {
198
- const pool = new WorktreePool(repoPath, {
199
- worktreeBaseDir,
200
- maxSize: 3,
201
- recoverOrphans: false,
202
- });
203
-
204
- try {
205
- const result = await pool.acquire({
206
- agentId: 'worker-1',
207
- role: 'worker',
208
- });
209
-
210
- const wtPath = result.worktree!.path;
211
-
212
- // Write a file
213
- fs.writeFileSync(path.join(wtPath, 'new-file.ts'), 'export const test = true;');
214
-
215
- // Verify it exists
216
- expect(fs.existsSync(path.join(wtPath, 'new-file.ts'))).toBe(true);
217
-
218
- // Stage and commit
219
- git('add .', wtPath);
220
- git('commit -m "Add test file"', wtPath);
221
-
222
- // Verify commit
223
- const log = git('log --oneline -1', wtPath);
224
- expect(log).toContain('Add test file');
225
- } finally {
226
- await pool.close();
227
- }
228
- });
229
-
230
- it('should create multiple independent worktrees', async () => {
231
- const pool = new WorktreePool(repoPath, {
232
- worktreeBaseDir,
233
- maxSize: 5,
234
- recoverOrphans: false,
235
- });
236
-
237
- try {
238
- const result1 = await pool.acquire({ agentId: 'worker-1', role: 'worker' });
239
- const result2 = await pool.acquire({ agentId: 'worker-2', role: 'worker' });
240
- const result3 = await pool.acquire({ agentId: 'worker-3', role: 'worker' });
241
-
242
- // All should succeed
243
- expect(result1.success).toBe(true);
244
- expect(result2.success).toBe(true);
245
- expect(result3.success).toBe(true);
246
-
247
- // All paths should be different
248
- const paths = [
249
- result1.worktree!.path,
250
- result2.worktree!.path,
251
- result3.worktree!.path,
252
- ];
253
- expect(new Set(paths).size).toBe(3);
254
-
255
- // Write different files to each
256
- fs.writeFileSync(path.join(paths[0], 'worker1.txt'), 'worker 1');
257
- fs.writeFileSync(path.join(paths[1], 'worker2.txt'), 'worker 2');
258
- fs.writeFileSync(path.join(paths[2], 'worker3.txt'), 'worker 3');
259
-
260
- // Verify isolation - each only sees its own file
261
- expect(fs.existsSync(path.join(paths[0], 'worker1.txt'))).toBe(true);
262
- expect(fs.existsSync(path.join(paths[0], 'worker2.txt'))).toBe(false);
263
- expect(fs.existsSync(path.join(paths[0], 'worker3.txt'))).toBe(false);
264
-
265
- expect(fs.existsSync(path.join(paths[1], 'worker1.txt'))).toBe(false);
266
- expect(fs.existsSync(path.join(paths[1], 'worker2.txt'))).toBe(true);
267
- expect(fs.existsSync(path.join(paths[1], 'worker3.txt'))).toBe(false);
268
- } finally {
269
- await pool.close();
270
- }
271
- });
272
- });
273
-
274
- // ═══════════════════════════════════════════════════════════════════════════
275
- // Release and Cleanup
276
- // ═══════════════════════════════════════════════════════════════════════════
277
-
278
- describe('release and cleanup', () => {
279
- it('should clean worktree state on release', async () => {
280
- const pool = new WorktreePool(repoPath, {
281
- worktreeBaseDir,
282
- maxSize: 3,
283
- recoverOrphans: false,
284
- });
285
-
286
- try {
287
- const result = await pool.acquire({ agentId: 'worker-1', role: 'worker' });
288
- const wtPath = result.worktree!.path;
289
-
290
- // Create uncommitted changes
291
- fs.writeFileSync(path.join(wtPath, 'dirty.txt'), 'dirty content');
292
- git('add dirty.txt', wtPath);
293
-
294
- // Verify dirty state
295
- expect(hasUncommittedChanges(wtPath)).toBe(true);
296
-
297
- // Release with clean
298
- await pool.release('worker-1', { clean: true, force: true });
299
-
300
- // Verify worktree is cleaned
301
- expect(hasUncommittedChanges(wtPath)).toBe(false);
302
- expect(fs.existsSync(path.join(wtPath, 'dirty.txt'))).toBe(false);
303
- } finally {
304
- await pool.close();
305
- }
306
- });
307
-
308
- it('should reuse worktree after release', async () => {
309
- const pool = new WorktreePool(repoPath, {
310
- worktreeBaseDir,
311
- maxSize: 2,
312
- recoverOrphans: false,
313
- });
314
-
315
- try {
316
- // Acquire both slots
317
- const result1 = await pool.acquire({ agentId: 'worker-1', role: 'worker' });
318
- await pool.acquire({ agentId: 'worker-2', role: 'worker' });
319
-
320
- const originalPath = result1.worktree!.path;
321
- const originalSlotId = result1.worktree!.slotId;
322
-
323
- // Release first worker
324
- await pool.release('worker-1');
325
-
326
- // Acquire with new agent - should get the released slot
327
- const result3 = await pool.acquire({
328
- agentId: 'worker-3',
329
- role: 'worker',
330
- preferredSlot: originalSlotId,
331
- });
332
-
333
- // Should reuse the same worktree path
334
- expect(result3.success).toBe(true);
335
- expect(result3.worktree!.path).toBe(originalPath);
336
- expect(result3.worktree!.slotId).toBe(originalSlotId);
337
- } finally {
338
- await pool.close();
339
- }
340
- });
341
-
342
- it('should persist worktree directory after release (for reuse)', async () => {
343
- const pool = new WorktreePool(repoPath, {
344
- worktreeBaseDir,
345
- maxSize: 3,
346
- recoverOrphans: false,
347
- });
348
-
349
- try {
350
- const result = await pool.acquire({ agentId: 'worker-1', role: 'worker' });
351
- const wtPath = result.worktree!.path;
352
-
353
- await pool.release('worker-1');
354
-
355
- // Worktree directory should still exist (for reuse)
356
- expect(fs.existsSync(wtPath)).toBe(true);
357
-
358
- // But it should be available for re-acquisition
359
- const stats = pool.getStats();
360
- expect(stats.availableSlots).toBe(3);
361
- } finally {
362
- await pool.close();
363
- }
364
- });
365
- });
366
-
367
- // ═══════════════════════════════════════════════════════════════════════════
368
- // Allocation Strategies
369
- // ═══════════════════════════════════════════════════════════════════════════
370
-
371
- describe('allocation strategies', () => {
372
- describe('reject strategy', () => {
373
- it('should reject immediately when pool is full', async () => {
374
- const pool = new WorktreePool(repoPath, {
375
- worktreeBaseDir,
376
- maxSize: 2,
377
- recoverOrphans: false,
378
- defaultStrategy: 'reject',
379
- });
380
-
381
- try {
382
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
383
- await pool.acquire({ agentId: 'worker-2', role: 'worker' });
384
-
385
- const result = await pool.acquire({
386
- agentId: 'worker-3',
387
- role: 'worker',
388
- strategy: 'reject',
389
- });
390
-
391
- expect(result.success).toBe(false);
392
- expect(result.error).toContain('Pool exhausted');
393
- } finally {
394
- await pool.close();
395
- }
396
- });
397
-
398
- it('should emit pool:exhausted event on reject', async () => {
399
- const pool = new WorktreePool(repoPath, {
400
- worktreeBaseDir,
401
- maxSize: 1,
402
- recoverOrphans: false,
403
- });
404
-
405
- const events: PoolEvent[] = [];
406
- pool.onEvent((e) => events.push(e));
407
-
408
- try {
409
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
410
- await pool.acquire({
411
- agentId: 'worker-2',
412
- role: 'worker',
413
- strategy: 'reject',
414
- });
415
-
416
- const exhaustedEvent = events.find((e) => e.type === 'pool:exhausted');
417
- expect(exhaustedEvent).toBeDefined();
418
- expect(exhaustedEvent!.data.strategy).toBe('reject');
419
- } finally {
420
- await pool.close();
421
- }
422
- });
423
- });
424
-
425
- describe('queue strategy', () => {
426
- it('should wait and succeed when slot becomes available', async () => {
427
- const pool = new WorktreePool(repoPath, {
428
- worktreeBaseDir,
429
- maxSize: 1,
430
- recoverOrphans: false,
431
- });
432
-
433
- try {
434
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
435
-
436
- // Start waiting for a slot
437
- const queuePromise = pool.acquire({
438
- agentId: 'worker-2',
439
- role: 'worker',
440
- strategy: 'queue',
441
- timeout: 5000,
442
- });
443
-
444
- // Release after a short delay
445
- setTimeout(() => {
446
- pool.release('worker-1');
447
- }, 100);
448
-
449
- const result = await queuePromise;
450
- expect(result.success).toBe(true);
451
- expect(result.worktree!.allocatedTo).toBe('worker-2');
452
- } finally {
453
- await pool.close();
454
- }
455
- });
456
-
457
- it('should timeout when no slot becomes available', async () => {
458
- const pool = new WorktreePool(repoPath, {
459
- worktreeBaseDir,
460
- maxSize: 1,
461
- recoverOrphans: false,
462
- });
463
-
464
- try {
465
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
466
-
467
- const result = await pool.acquire({
468
- agentId: 'worker-2',
469
- role: 'worker',
470
- strategy: 'queue',
471
- timeout: 100,
472
- });
473
-
474
- expect(result.success).toBe(false);
475
- expect(result.queued).toBe(true);
476
- expect(result.error).toContain('timed out');
477
- } finally {
478
- await pool.close();
479
- }
480
- });
481
-
482
- it('should process queue in FIFO order', async () => {
483
- const pool = new WorktreePool(repoPath, {
484
- worktreeBaseDir,
485
- maxSize: 1,
486
- recoverOrphans: false,
487
- });
488
-
489
- try {
490
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
491
-
492
- const queue2 = pool.acquire({
493
- agentId: 'worker-2',
494
- role: 'worker',
495
- strategy: 'queue',
496
- timeout: 5000,
497
- });
498
-
499
- const queue3 = pool.acquire({
500
- agentId: 'worker-3',
501
- role: 'worker',
502
- strategy: 'queue',
503
- timeout: 5000,
504
- });
505
-
506
- // Release worker-1
507
- await pool.release('worker-1');
508
-
509
- const result2 = await queue2;
510
- expect(result2.success).toBe(true);
511
- expect(result2.worktree!.allocatedTo).toBe('worker-2');
512
-
513
- // Release worker-2 for worker-3
514
- await pool.release('worker-2');
515
-
516
- const result3 = await queue3;
517
- expect(result3.success).toBe(true);
518
- expect(result3.worktree!.allocatedTo).toBe('worker-3');
519
- } finally {
520
- await pool.close();
521
- }
522
- });
523
- });
524
-
525
- describe('steal strategy', () => {
526
- it('should steal from oldest allocation', async () => {
527
- const pool = new WorktreePool(repoPath, {
528
- worktreeBaseDir,
529
- maxSize: 2,
530
- recoverOrphans: false,
531
- });
532
-
533
- try {
534
- // Acquire in order with delay
535
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
536
- await new Promise((r) => setTimeout(r, 50));
537
- await pool.acquire({ agentId: 'worker-2', role: 'worker' });
538
-
539
- // Steal
540
- const result = await pool.acquire({
541
- agentId: 'worker-3',
542
- role: 'worker',
543
- strategy: 'steal',
544
- });
545
-
546
- expect(result.success).toBe(true);
547
-
548
- // worker-1 should have been evicted (oldest)
549
- expect(pool.getWorktree('worker-1')).toBeNull();
550
- expect(pool.getWorktree('worker-2')).not.toBeNull();
551
- expect(pool.getWorktree('worker-3')).not.toBeNull();
552
- } finally {
553
- await pool.close();
554
- }
555
- });
556
-
557
- it('should clean stolen worktree before reallocation', async () => {
558
- const pool = new WorktreePool(repoPath, {
559
- worktreeBaseDir,
560
- maxSize: 1,
561
- recoverOrphans: false,
562
- });
563
-
564
- try {
565
- const result1 = await pool.acquire({ agentId: 'worker-1', role: 'worker' });
566
- const wtPath = result1.worktree!.path;
567
-
568
- // Create dirty state
569
- fs.writeFileSync(path.join(wtPath, 'dirty.txt'), 'dirty');
570
- git('add dirty.txt', wtPath);
571
-
572
- // Steal
573
- const result2 = await pool.acquire({
574
- agentId: 'worker-2',
575
- role: 'worker',
576
- strategy: 'steal',
577
- });
578
-
579
- expect(result2.success).toBe(true);
580
-
581
- // Should be clean
582
- expect(fs.existsSync(path.join(wtPath, 'dirty.txt'))).toBe(false);
583
- expect(hasUncommittedChanges(wtPath)).toBe(false);
584
- } finally {
585
- await pool.close();
586
- }
587
- });
588
- });
589
- });
590
-
591
- // ═══════════════════════════════════════════════════════════════════════════
592
- // Orphan Recovery
593
- // ═══════════════════════════════════════════════════════════════════════════
594
-
595
- describe('orphan recovery', () => {
596
- it('should recover orphaned worktrees on initialization', async () => {
597
- // Create orphaned worktrees manually
598
- fs.mkdirSync(worktreeBaseDir, { recursive: true });
599
-
600
- const orphan1Path = path.join(worktreeBaseDir, 'slot-01');
601
- const orphan2Path = path.join(worktreeBaseDir, 'slot-02');
602
-
603
- git(`worktree add --detach "${orphan1Path}"`);
604
- git(`worktree add --detach "${orphan2Path}"`);
605
-
606
- // Verify orphans exist
607
- const worktreesBefore = listWorktrees();
608
- expect(worktreesBefore).toContain(normalizePath(orphan1Path));
609
- expect(worktreesBefore).toContain(normalizePath(orphan2Path));
610
-
611
- // Create pool with recovery enabled
612
- const pool = new WorktreePool(repoPath, {
613
- worktreeBaseDir,
614
- maxSize: 3,
615
- recoverOrphans: true,
616
- });
617
-
618
- const events: PoolEvent[] = [];
619
- pool.onEvent((e) => events.push(e));
620
-
621
- try {
622
- // Trigger initialization by acquiring
623
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
624
-
625
- // Should have recovered the orphans
626
- const recoveryEvent = events.find((e) => e.type === 'pool:recovered');
627
- expect(recoveryEvent).toBeDefined();
628
- expect(recoveryEvent!.data.orphansFound).toBeGreaterThan(0);
629
-
630
- // Orphan slots should now be available
631
- const stats = pool.getStats();
632
- expect(stats.totalSlots).toBe(3);
633
- expect(stats.allocatedSlots).toBe(1); // Only worker-1
634
- expect(stats.availableSlots).toBe(2);
635
- } finally {
636
- await pool.close();
637
- }
638
- });
639
-
640
- it('should remove unknown orphaned worktrees', async () => {
641
- // Create an orphaned worktree with unknown slot name
642
- fs.mkdirSync(worktreeBaseDir, { recursive: true });
643
- const unknownPath = path.join(worktreeBaseDir, 'unknown-orphan');
644
- git(`worktree add --detach "${unknownPath}"`);
645
-
646
- const pool = new WorktreePool(repoPath, {
647
- worktreeBaseDir,
648
- maxSize: 3,
649
- recoverOrphans: true,
650
- });
651
-
652
- try {
653
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
654
-
655
- // Unknown orphan should be removed
656
- const worktreesAfter = listWorktrees();
657
- expect(worktreesAfter).not.toContain(unknownPath);
658
- } finally {
659
- await pool.close();
660
- }
661
- });
662
-
663
- it('should recover manually via recoverOrphans()', async () => {
664
- // Create pool without auto-recovery
665
- const pool = new WorktreePool(repoPath, {
666
- worktreeBaseDir,
667
- maxSize: 3,
668
- recoverOrphans: false,
669
- });
670
-
671
- try {
672
- // Acquire to initialize
673
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
674
- const slot1Path = pool.getWorktree('worker-1')!.path;
675
-
676
- // Release it
677
- await pool.release('worker-1');
678
-
679
- // Now there's an "orphan" - a slot with existing worktree but no allocation
680
- const result = await pool.recoverOrphans();
681
-
682
- // Should have found and cleaned the orphan
683
- expect(result.orphansFound).toBeGreaterThan(0);
684
- expect(result.orphansCleaned).toBeGreaterThan(0);
685
- } finally {
686
- await pool.close();
687
- }
688
- });
689
- });
690
-
691
- // ═══════════════════════════════════════════════════════════════════════════
692
- // WorkspaceManager Integration
693
- // ═══════════════════════════════════════════════════════════════════════════
694
-
695
- describe('WorkspaceManager integration', () => {
696
- let db: Database.Database;
697
- let adapter: GitCascadeAdapter;
698
- let manager: DefaultWorkspaceManager;
699
-
700
- beforeEach(() => {
701
- db = new Database(dbPath);
702
- adapter = createGitCascadeAdapter({
703
- enabled: true,
704
- repoPath,
705
- db,
706
- skipRecovery: true,
707
- });
708
- });
709
-
710
- afterEach(async () => {
711
- if (manager) {
712
- await manager.closeAsync();
713
- }
714
- if (adapter) {
715
- adapter.close();
716
- }
717
- if (db) {
718
- db.close();
719
- }
720
- });
721
-
722
- it('should create WorkspaceManager with pool enabled', () => {
723
- manager = createWorkspaceManager({
724
- enabled: true,
725
- repoPath,
726
- db,
727
- skipRecovery: true,
728
- worktreeBaseDir,
729
- pool: {
730
- enabled: true,
731
- maxSize: 5,
732
- defaultStrategy: 'reject',
733
- },
734
- });
735
-
736
- expect(manager.isPoolEnabled()).toBe(true);
737
- expect(manager.getPool()).not.toBeNull();
738
- });
739
-
740
- it('should create worker workspace from pool', async () => {
741
- manager = createWorkspaceManager({
742
- enabled: true,
743
- repoPath,
744
- db,
745
- skipRecovery: true,
746
- worktreeBaseDir,
747
- pool: {
748
- enabled: true,
749
- maxSize: 5,
750
- },
751
- });
752
-
753
- const coordinatorId = 'coordinator-1';
754
- const streamId = manager.createIntegrationStream(coordinatorId, {
755
- name: 'feature/pool-test',
756
- });
757
-
758
- const taskId = manager.createTask(streamId, { title: 'Test task' });
759
-
760
- const workspace = await manager.createWorkerWorkspaceFromPool(
761
- 'worker-1',
762
- taskId,
763
- streamId
764
- );
765
-
766
- expect(workspace).toBeDefined();
767
- expect(workspace.role).toBe('worker');
768
- expect(workspace.agentId).toBe('worker-1');
769
- expect(fs.existsSync(workspace.path)).toBe(true);
770
-
771
- // Verify pool stats
772
- const poolStats = manager.getPool()!.getStats();
773
- expect(poolStats.allocatedSlots).toBe(1);
774
- expect(poolStats.byRole.worker).toBe(1);
775
- });
776
-
777
- it('should create integrator workspace from pool', async () => {
778
- manager = createWorkspaceManager({
779
- enabled: true,
780
- repoPath,
781
- db,
782
- skipRecovery: true,
783
- worktreeBaseDir,
784
- pool: {
785
- enabled: true,
786
- maxSize: 5,
787
- },
788
- });
789
-
790
- const coordinatorId = 'coordinator-1';
791
- const streamId = manager.createIntegrationStream(coordinatorId, {
792
- name: 'feature/integrator-pool',
793
- });
794
-
795
- const workspace = await manager.createIntegratorWorkspaceFromPool(
796
- 'integrator-1',
797
- streamId
798
- ) as IntegratorWorkspace;
799
-
800
- expect(workspace).toBeDefined();
801
- expect(workspace.role).toBe('integrator');
802
- expect(workspace.coordinatorId).toBe(coordinatorId);
803
- expect(fs.existsSync(workspace.path)).toBe(true);
804
-
805
- const poolStats = manager.getPool()!.getStats();
806
- expect(poolStats.byRole.integrator).toBe(1);
807
- });
808
-
809
- it('should create coordinator workspace from pool', async () => {
810
- manager = createWorkspaceManager({
811
- enabled: true,
812
- repoPath,
813
- db,
814
- skipRecovery: true,
815
- worktreeBaseDir,
816
- pool: {
817
- enabled: true,
818
- maxSize: 5,
819
- },
820
- });
821
-
822
- const coordinatorId = 'coordinator-1';
823
- const streamId = manager.createIntegrationStream(coordinatorId, {
824
- name: 'feature/coordinator-pool',
825
- });
826
-
827
- const workspace = await manager.createCoordinatorWorkspaceFromPool(
828
- coordinatorId,
829
- streamId
830
- ) as CoordinatorWorkspace;
831
-
832
- expect(workspace).toBeDefined();
833
- expect(workspace.role).toBe('coordinator');
834
- expect(fs.existsSync(workspace.path)).toBe(true);
835
-
836
- const poolStats = manager.getPool()!.getStats();
837
- expect(poolStats.byRole.coordinator).toBe(1);
838
- });
839
-
840
- it('should release workspace back to pool on deallocateAsync', async () => {
841
- manager = createWorkspaceManager({
842
- enabled: true,
843
- repoPath,
844
- db,
845
- skipRecovery: true,
846
- worktreeBaseDir,
847
- pool: {
848
- enabled: true,
849
- maxSize: 5,
850
- },
851
- });
852
-
853
- const coordinatorId = 'coordinator-1';
854
- const streamId = manager.createIntegrationStream(coordinatorId, {
855
- name: 'feature/dealloc-pool',
856
- });
857
-
858
- const taskId = manager.createTask(streamId, { title: 'Test task' });
859
- await manager.createWorkerWorkspaceFromPool('worker-1', taskId, streamId);
860
-
861
- // Verify allocated
862
- let poolStats = manager.getPool()!.getStats();
863
- expect(poolStats.allocatedSlots).toBe(1);
864
-
865
- // Deallocate
866
- await manager.deallocateWorkspaceAsync('worker-1');
867
-
868
- // Verify released
869
- poolStats = manager.getPool()!.getStats();
870
- expect(poolStats.allocatedSlots).toBe(0);
871
- expect(poolStats.availableSlots).toBe(5);
872
- expect(manager.getWorkspace('worker-1')).toBeNull();
873
- });
874
-
875
- it('should handle pool exhaustion with reject strategy', async () => {
876
- manager = createWorkspaceManager({
877
- enabled: true,
878
- repoPath,
879
- db,
880
- skipRecovery: true,
881
- worktreeBaseDir,
882
- pool: {
883
- enabled: true,
884
- maxSize: 2,
885
- defaultStrategy: 'reject',
886
- },
887
- });
888
-
889
- const coordinatorId = 'coordinator-1';
890
- const streamId = manager.createIntegrationStream(coordinatorId, {
891
- name: 'feature/exhaustion',
892
- });
893
-
894
- const task1Id = manager.createTask(streamId, { title: 'Task 1' });
895
- const task2Id = manager.createTask(streamId, { title: 'Task 2' });
896
- const task3Id = manager.createTask(streamId, { title: 'Task 3' });
897
-
898
- await manager.createWorkerWorkspaceFromPool('worker-1', task1Id, streamId);
899
- await manager.createWorkerWorkspaceFromPool('worker-2', task2Id, streamId);
900
-
901
- // Third should fail
902
- await expect(
903
- manager.createWorkerWorkspaceFromPool('worker-3', task3Id, streamId)
904
- ).rejects.toThrow('Pool exhausted');
905
- });
906
-
907
- it('should fall back to non-pooled allocation when pool disabled', async () => {
908
- manager = createWorkspaceManager({
909
- enabled: true,
910
- repoPath,
911
- db,
912
- skipRecovery: true,
913
- worktreeBaseDir,
914
- pool: {
915
- enabled: false, // Pool disabled
916
- },
917
- });
918
-
919
- expect(manager.isPoolEnabled()).toBe(false);
920
- expect(manager.getPool()).toBeNull();
921
-
922
- const coordinatorId = 'coordinator-1';
923
- const streamId = manager.createIntegrationStream(coordinatorId, {
924
- name: 'feature/no-pool',
925
- });
926
-
927
- const taskId = manager.createTask(streamId, { title: 'Task' });
928
-
929
- // Should fall back to regular non-pooled creation
930
- const workspace = await manager.createWorkerWorkspaceFromPool(
931
- 'worker-1',
932
- taskId,
933
- streamId
934
- );
935
-
936
- expect(workspace).toBeDefined();
937
- expect(fs.existsSync(workspace.path)).toBe(true);
938
- });
939
- });
940
-
941
- // ═══════════════════════════════════════════════════════════════════════════
942
- // Full Lifecycle with Pool
943
- // ═══════════════════════════════════════════════════════════════════════════
944
-
945
- describe('full lifecycle with pool', () => {
946
- let db: Database.Database;
947
- let adapter: GitCascadeAdapter;
948
- let manager: DefaultWorkspaceManager;
949
-
950
- beforeEach(() => {
951
- db = new Database(dbPath);
952
- adapter = createGitCascadeAdapter({
953
- enabled: true,
954
- repoPath,
955
- db,
956
- skipRecovery: true,
957
- });
958
- manager = createWorkspaceManager({
959
- enabled: true,
960
- repoPath,
961
- db,
962
- skipRecovery: true,
963
- worktreeBaseDir,
964
- pool: {
965
- enabled: true,
966
- maxSize: 10,
967
- defaultStrategy: 'reject',
968
- recoverOrphans: true,
969
- },
970
- });
971
- });
972
-
973
- afterEach(async () => {
974
- if (manager) {
975
- await manager.closeAsync();
976
- }
977
- if (adapter) {
978
- adapter.close();
979
- }
980
- if (db) {
981
- db.close();
982
- }
983
- });
984
-
985
- it('should complete full workflow: create → work → merge → cleanup', async () => {
986
- // ═══════════════════════════════════════════════════════════════════════
987
- // Phase 1: Setup stream and tasks
988
- // ═══════════════════════════════════════════════════════════════════════
989
- const coordinatorId = 'coordinator-001';
990
- const streamId = manager.createIntegrationStream(coordinatorId, {
991
- name: 'feature/full-lifecycle-pool',
992
- });
993
-
994
- const task1Id = manager.createTask(streamId, { title: 'Implement feature A' });
995
- const task2Id = manager.createTask(streamId, { title: 'Implement feature B' });
996
-
997
- // ═══════════════════════════════════════════════════════════════════════
998
- // Phase 2: Create workers from pool
999
- // ═══════════════════════════════════════════════════════════════════════
1000
- const worker1Workspace = await manager.createWorkerWorkspaceFromPool(
1001
- 'worker-1',
1002
- task1Id,
1003
- streamId
1004
- );
1005
-
1006
- const worker2Workspace = await manager.createWorkerWorkspaceFromPool(
1007
- 'worker-2',
1008
- task2Id,
1009
- streamId
1010
- );
1011
-
1012
- // Verify pool stats
1013
- let poolStats = manager.getPool()!.getStats();
1014
- expect(poolStats.allocatedSlots).toBe(2);
1015
- expect(poolStats.byRole.worker).toBe(2);
1016
-
1017
- // ═══════════════════════════════════════════════════════════════════════
1018
- // Phase 3: Workers claim tasks and make changes
1019
- // ═══════════════════════════════════════════════════════════════════════
1020
- const start1 = manager.claimTask(task1Id, 'worker-1', worker1Workspace.path);
1021
- const start2 = manager.claimTask(task2Id, 'worker-2', worker2Workspace.path);
1022
-
1023
- // Worker 1 makes changes
1024
- fs.writeFileSync(
1025
- path.join(worker1Workspace.path, 'src/featureA.ts'),
1026
- 'export const featureA = true;'
1027
- );
1028
- git('add .', worker1Workspace.path);
1029
- git('commit -m "feat: implement feature A"', worker1Workspace.path);
1030
-
1031
- // Worker 2 makes changes
1032
- fs.writeFileSync(
1033
- path.join(worker2Workspace.path, 'src/featureB.ts'),
1034
- 'export const featureB = true;'
1035
- );
1036
- git('add .', worker2Workspace.path);
1037
- git('commit -m "feat: implement feature B"', worker2Workspace.path);
1038
-
1039
- // ═══════════════════════════════════════════════════════════════════════
1040
- // Phase 4: Release workers back to pool
1041
- // ═══════════════════════════════════════════════════════════════════════
1042
- await manager.deallocateWorkspaceAsync('worker-1');
1043
- await manager.deallocateWorkspaceAsync('worker-2');
1044
-
1045
- poolStats = manager.getPool()!.getStats();
1046
- expect(poolStats.allocatedSlots).toBe(0);
1047
- expect(poolStats.availableSlots).toBe(10);
1048
-
1049
- // ═══════════════════════════════════════════════════════════════════════
1050
- // Phase 5: Create integrator from pool to merge
1051
- // ═══════════════════════════════════════════════════════════════════════
1052
- const integratorWorkspace = await manager.createIntegratorWorkspaceFromPool(
1053
- 'integrator-1',
1054
- streamId
1055
- );
1056
-
1057
- poolStats = manager.getPool()!.getStats();
1058
- expect(poolStats.allocatedSlots).toBe(1);
1059
- expect(poolStats.byRole.integrator).toBe(1);
1060
-
1061
- // Complete tasks (merge worker branches)
1062
- adapter.completeTask({ taskId: task1Id, worktree: integratorWorkspace.path });
1063
- adapter.completeTask({ taskId: task2Id, worktree: integratorWorkspace.path });
1064
-
1065
- // Verify both features are in the integration branch
1066
- const files = git('ls-tree -r HEAD --name-only', integratorWorkspace.path).split('\n');
1067
- expect(files).toContain('src/featureA.ts');
1068
- expect(files).toContain('src/featureB.ts');
1069
-
1070
- // ═══════════════════════════════════════════════════════════════════════
1071
- // Phase 6: Cleanup
1072
- // ═══════════════════════════════════════════════════════════════════════
1073
- await manager.deallocateWorkspaceAsync('integrator-1');
1074
-
1075
- poolStats = manager.getPool()!.getStats();
1076
- expect(poolStats.allocatedSlots).toBe(0);
1077
- expect(poolStats.availableSlots).toBe(10);
1078
-
1079
- // Clean up worker branches
1080
- const cleanupResult = manager.cleanupWorkerBranches({ olderThanMs: 0 });
1081
- expect(cleanupResult.deleted.length).toBe(2);
1082
- });
1083
-
1084
- it('should handle concurrent workers efficiently with pool', async () => {
1085
- const coordinatorId = 'coordinator-001';
1086
- const streamId = manager.createIntegrationStream(coordinatorId, {
1087
- name: 'feature/concurrent-pool',
1088
- });
1089
-
1090
- const workerCount = 5;
1091
- const taskIds: string[] = [];
1092
- for (let i = 0; i < workerCount; i++) {
1093
- taskIds.push(manager.createTask(streamId, { title: `Task ${i}` }));
1094
- }
1095
-
1096
- // Create all workers concurrently from pool
1097
- const workerPromises = taskIds.map(async (taskId, i) => {
1098
- const workspace = await manager.createWorkerWorkspaceFromPool(
1099
- `worker-${i}`,
1100
- taskId,
1101
- streamId
1102
- );
1103
- return { id: `worker-${i}`, workspace };
1104
- });
1105
-
1106
- const workers = await Promise.all(workerPromises);
1107
-
1108
- // Verify all workers have unique paths
1109
- const paths = workers.map((w) => w.workspace.path);
1110
- expect(new Set(paths).size).toBe(workerCount);
1111
-
1112
- // Verify pool stats
1113
- const poolStats = manager.getPool()!.getStats();
1114
- expect(poolStats.allocatedSlots).toBe(workerCount);
1115
- expect(poolStats.byRole.worker).toBe(workerCount);
1116
-
1117
- // Release all workers
1118
- for (const worker of workers) {
1119
- await manager.deallocateWorkspaceAsync(worker.id);
1120
- }
1121
-
1122
- // Verify all released
1123
- const finalStats = manager.getPool()!.getStats();
1124
- expect(finalStats.allocatedSlots).toBe(0);
1125
- });
1126
-
1127
- it('should emit correct events throughout lifecycle', async () => {
1128
- const events: PoolEvent[] = [];
1129
- manager.getPool()!.onEvent((e) => events.push(e));
1130
-
1131
- const coordinatorId = 'coordinator-001';
1132
- const streamId = manager.createIntegrationStream(coordinatorId, {
1133
- name: 'feature/events-pool',
1134
- });
1135
-
1136
- const taskId = manager.createTask(streamId, { title: 'Task' });
1137
-
1138
- // Acquire
1139
- await manager.createWorkerWorkspaceFromPool('worker-1', taskId, streamId);
1140
-
1141
- // Release
1142
- await manager.deallocateWorkspaceAsync('worker-1');
1143
-
1144
- // Check events
1145
- const eventTypes = events.map((e) => e.type);
1146
- expect(eventTypes).toContain('pool:initialized');
1147
- expect(eventTypes).toContain('worktree:acquired');
1148
- expect(eventTypes).toContain('worktree:released');
1149
- });
1150
- });
1151
-
1152
- // ═══════════════════════════════════════════════════════════════════════════
1153
- // Edge Cases and Error Handling
1154
- // ═══════════════════════════════════════════════════════════════════════════
1155
-
1156
- describe('edge cases', () => {
1157
- it('should handle close with pending queue requests', async () => {
1158
- const pool = new WorktreePool(repoPath, {
1159
- worktreeBaseDir,
1160
- maxSize: 1,
1161
- recoverOrphans: false,
1162
- });
1163
-
1164
- try {
1165
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
1166
-
1167
- // Start a queued request
1168
- const queuePromise = pool.acquire({
1169
- agentId: 'worker-2',
1170
- role: 'worker',
1171
- strategy: 'queue',
1172
- timeout: 60000,
1173
- });
1174
-
1175
- // Wait for the queue request to be added (needs microtask to complete)
1176
- await new Promise((resolve) => setImmediate(resolve));
1177
-
1178
- // Close the pool
1179
- await pool.close();
1180
-
1181
- // Queued request should be rejected
1182
- await expect(queuePromise).rejects.toThrow('Pool is closing');
1183
- } catch {
1184
- await pool.close();
1185
- }
1186
- });
1187
-
1188
- it('should prevent operations after close', async () => {
1189
- const pool = new WorktreePool(repoPath, {
1190
- worktreeBaseDir,
1191
- maxSize: 3,
1192
- recoverOrphans: false,
1193
- });
1194
-
1195
- await pool.close();
1196
-
1197
- await expect(
1198
- pool.acquire({ agentId: 'worker-1', role: 'worker' })
1199
- ).rejects.toThrow('Pool is closed');
1200
- });
1201
-
1202
- it('should handle release of unknown agent gracefully', async () => {
1203
- const pool = new WorktreePool(repoPath, {
1204
- worktreeBaseDir,
1205
- maxSize: 3,
1206
- recoverOrphans: false,
1207
- });
1208
-
1209
- try {
1210
- // Initialize pool
1211
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
1212
-
1213
- // Release unknown agent - should not throw
1214
- await expect(pool.release('unknown-agent')).resolves.toBeUndefined();
1215
- } finally {
1216
- await pool.close();
1217
- }
1218
- });
1219
-
1220
- it('should handle getWorktree for unknown agent', async () => {
1221
- const pool = new WorktreePool(repoPath, {
1222
- worktreeBaseDir,
1223
- maxSize: 3,
1224
- recoverOrphans: false,
1225
- });
1226
-
1227
- try {
1228
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
1229
-
1230
- const worktree = pool.getWorktree('unknown');
1231
- expect(worktree).toBeNull();
1232
- } finally {
1233
- await pool.close();
1234
- }
1235
- });
1236
-
1237
- it('should correctly track stats through various operations', async () => {
1238
- const pool = new WorktreePool(repoPath, {
1239
- worktreeBaseDir,
1240
- maxSize: 5,
1241
- recoverOrphans: false,
1242
- });
1243
-
1244
- try {
1245
- // Initial stats (after first acquire initializes)
1246
- await pool.acquire({ agentId: 'worker-1', role: 'worker' });
1247
- let stats = pool.getStats();
1248
- expect(stats.totalSlots).toBe(5);
1249
- expect(stats.allocatedSlots).toBe(1);
1250
- expect(stats.availableSlots).toBe(4);
1251
-
1252
- // Add more
1253
- await pool.acquire({ agentId: 'integrator-1', role: 'integrator' });
1254
- await pool.acquire({ agentId: 'coordinator-1', role: 'coordinator' });
1255
-
1256
- stats = pool.getStats();
1257
- expect(stats.allocatedSlots).toBe(3);
1258
- expect(stats.availableSlots).toBe(2);
1259
- expect(stats.byRole.worker).toBe(1);
1260
- expect(stats.byRole.integrator).toBe(1);
1261
- expect(stats.byRole.coordinator).toBe(1);
1262
-
1263
- // Release some
1264
- await pool.release('worker-1');
1265
- stats = pool.getStats();
1266
- expect(stats.allocatedSlots).toBe(2);
1267
- expect(stats.availableSlots).toBe(3);
1268
- expect(stats.byRole.worker).toBe(0);
1269
-
1270
- // Release all
1271
- await pool.release('integrator-1');
1272
- await pool.release('coordinator-1');
1273
- stats = pool.getStats();
1274
- expect(stats.allocatedSlots).toBe(0);
1275
- expect(stats.availableSlots).toBe(5);
1276
- } finally {
1277
- await pool.close();
1278
- }
1279
- });
1280
- });
1281
- });