macro-agent 0.2.5 → 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 (992) 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 +7 -24
  37. package/dist/agent/agent-manager-v2.js.map +1 -1
  38. package/dist/agent/wake.d.ts +85 -0
  39. package/dist/agent/wake.d.ts.map +1 -0
  40. package/dist/agent/wake.js +278 -0
  41. package/dist/agent/wake.js.map +1 -0
  42. package/dist/api/server.d.ts.map +1 -1
  43. package/dist/api/server.js +41 -25
  44. package/dist/api/server.js.map +1 -1
  45. package/dist/api/types.d.ts +6 -0
  46. package/dist/api/types.d.ts.map +1 -1
  47. package/dist/auth/server-auth.d.ts +43 -0
  48. package/dist/auth/server-auth.d.ts.map +1 -0
  49. package/dist/auth/server-auth.js +80 -0
  50. package/dist/auth/server-auth.js.map +1 -0
  51. package/dist/auth/token.d.ts +4 -0
  52. package/dist/auth/token.d.ts.map +1 -1
  53. package/dist/auth/token.js +7 -6
  54. package/dist/auth/token.js.map +1 -1
  55. package/dist/boot-v2.d.ts +6 -3
  56. package/dist/boot-v2.d.ts.map +1 -1
  57. package/dist/boot-v2.js +44 -25
  58. package/dist/boot-v2.js.map +1 -1
  59. package/dist/cognitive/team-lifecycle.d.ts +82 -0
  60. package/dist/cognitive/team-lifecycle.d.ts.map +1 -0
  61. package/dist/cognitive/team-lifecycle.js +121 -0
  62. package/dist/cognitive/team-lifecycle.js.map +1 -0
  63. package/dist/cognitive/trajectory-extractor.d.ts +25 -0
  64. package/dist/cognitive/trajectory-extractor.d.ts.map +1 -0
  65. package/dist/cognitive/trajectory-extractor.js +134 -0
  66. package/dist/cognitive/trajectory-extractor.js.map +1 -0
  67. package/dist/control/control-server.d.ts.map +1 -1
  68. package/dist/control/control-server.js +10 -0
  69. package/dist/control/control-server.js.map +1 -1
  70. package/dist/dispatch/mail-inbound-consumer.d.ts.map +1 -1
  71. package/dist/dispatch/mail-inbound-consumer.js +43 -10
  72. package/dist/dispatch/mail-inbound-consumer.js.map +1 -1
  73. package/dist/index.d.ts +4 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +6 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/lifecycle/handlers/generic.d.ts +27 -0
  78. package/dist/lifecycle/handlers/generic.d.ts.map +1 -0
  79. package/dist/lifecycle/handlers/generic.js +56 -0
  80. package/dist/lifecycle/handlers/generic.js.map +1 -0
  81. package/dist/lifecycle/handlers/index.d.ts +51 -0
  82. package/dist/lifecycle/handlers/index.d.ts.map +1 -0
  83. package/dist/lifecycle/handlers/index.js +110 -0
  84. package/dist/lifecycle/handlers/index.js.map +1 -0
  85. package/dist/lifecycle/handlers/integrator.d.ts +81 -0
  86. package/dist/lifecycle/handlers/integrator.d.ts.map +1 -0
  87. package/dist/lifecycle/handlers/integrator.js +451 -0
  88. package/dist/lifecycle/handlers/integrator.js.map +1 -0
  89. package/dist/lifecycle/handlers/monitor.d.ts +29 -0
  90. package/dist/lifecycle/handlers/monitor.d.ts.map +1 -0
  91. package/dist/lifecycle/handlers/monitor.js +79 -0
  92. package/dist/lifecycle/handlers/monitor.js.map +1 -0
  93. package/dist/lifecycle/handlers/worker.d.ts +56 -0
  94. package/dist/lifecycle/handlers/worker.d.ts.map +1 -0
  95. package/dist/lifecycle/handlers/worker.js +381 -0
  96. package/dist/lifecycle/handlers/worker.js.map +1 -0
  97. package/dist/lifecycle/handlers-v2.d.ts +0 -2
  98. package/dist/lifecycle/handlers-v2.d.ts.map +1 -1
  99. package/dist/lifecycle/handlers-v2.js +4 -55
  100. package/dist/lifecycle/handlers-v2.js.map +1 -1
  101. package/dist/mail/conversation-map.d.ts +33 -0
  102. package/dist/mail/conversation-map.d.ts.map +1 -0
  103. package/dist/mail/conversation-map.js +61 -0
  104. package/dist/mail/conversation-map.js.map +1 -0
  105. package/dist/mail/index.d.ts +11 -0
  106. package/dist/mail/index.d.ts.map +1 -0
  107. package/dist/mail/index.js +11 -0
  108. package/dist/mail/index.js.map +1 -0
  109. package/dist/mail/mail-service.d.ts +85 -0
  110. package/dist/mail/mail-service.d.ts.map +1 -0
  111. package/dist/mail/mail-service.js +121 -0
  112. package/dist/mail/mail-service.js.map +1 -0
  113. package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
  114. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
  115. package/dist/mail/stores/eventstore-conversation-store.js +131 -0
  116. package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
  117. package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
  118. package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
  119. package/dist/mail/stores/eventstore-participant-store.js +145 -0
  120. package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
  121. package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
  122. package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
  123. package/dist/mail/stores/eventstore-thread-store.js +118 -0
  124. package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
  125. package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
  126. package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
  127. package/dist/mail/stores/eventstore-turn-store.js +153 -0
  128. package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
  129. package/dist/mail/stores/index.d.ts +12 -0
  130. package/dist/mail/stores/index.d.ts.map +1 -0
  131. package/dist/mail/stores/index.js +12 -0
  132. package/dist/mail/stores/index.js.map +1 -0
  133. package/dist/mail/stores/types.d.ts +146 -0
  134. package/dist/mail/stores/types.d.ts.map +1 -0
  135. package/dist/mail/stores/types.js +13 -0
  136. package/dist/mail/stores/types.js.map +1 -0
  137. package/dist/mail/turn-recorder.d.ts +30 -0
  138. package/dist/mail/turn-recorder.d.ts.map +1 -0
  139. package/dist/mail/turn-recorder.js +98 -0
  140. package/dist/mail/turn-recorder.js.map +1 -0
  141. package/dist/map/adapter/acp-over-map.d.ts +115 -0
  142. package/dist/map/adapter/acp-over-map.d.ts.map +1 -0
  143. package/dist/map/adapter/acp-over-map.js +1024 -0
  144. package/dist/map/adapter/acp-over-map.js.map +1 -0
  145. package/dist/map/adapter/connection-manager.d.ts +150 -0
  146. package/dist/map/adapter/connection-manager.d.ts.map +1 -0
  147. package/dist/map/adapter/connection-manager.js +207 -0
  148. package/dist/map/adapter/connection-manager.js.map +1 -0
  149. package/dist/map/adapter/event-log.d.ts +87 -0
  150. package/dist/map/adapter/event-log.d.ts.map +1 -0
  151. package/dist/map/adapter/event-log.js +122 -0
  152. package/dist/map/adapter/event-log.js.map +1 -0
  153. package/dist/map/adapter/event-translator.d.ts +85 -0
  154. package/dist/map/adapter/event-translator.d.ts.map +1 -0
  155. package/dist/map/adapter/event-translator.js +295 -0
  156. package/dist/map/adapter/event-translator.js.map +1 -0
  157. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  158. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  159. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  160. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  161. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  162. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  163. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  164. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  165. package/dist/map/adapter/extensions/cognitive.d.ts +27 -0
  166. package/dist/map/adapter/extensions/cognitive.d.ts.map +1 -0
  167. package/dist/map/adapter/extensions/cognitive.js +158 -0
  168. package/dist/map/adapter/extensions/cognitive.js.map +1 -0
  169. package/dist/map/adapter/extensions/index.d.ts +95 -0
  170. package/dist/map/adapter/extensions/index.d.ts.map +1 -0
  171. package/dist/map/adapter/extensions/index.js +228 -0
  172. package/dist/map/adapter/extensions/index.js.map +1 -0
  173. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  174. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  175. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  176. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  177. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  178. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  179. package/dist/map/adapter/extensions/resume.js +59 -0
  180. package/dist/map/adapter/extensions/resume.js.map +1 -0
  181. package/dist/map/adapter/extensions/streams.d.ts +95 -0
  182. package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
  183. package/dist/map/adapter/extensions/streams.js +515 -0
  184. package/dist/map/adapter/extensions/streams.js.map +1 -0
  185. package/dist/map/adapter/extensions/task.d.ts +40 -0
  186. package/dist/map/adapter/extensions/task.d.ts.map +1 -0
  187. package/dist/map/adapter/extensions/task.js +197 -0
  188. package/dist/map/adapter/extensions/task.js.map +1 -0
  189. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  190. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  191. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  192. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  193. package/dist/map/adapter/extensions/wake.d.ts +60 -0
  194. package/dist/map/adapter/extensions/wake.d.ts.map +1 -0
  195. package/dist/map/adapter/extensions/wake.js +144 -0
  196. package/dist/map/adapter/extensions/wake.js.map +1 -0
  197. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  198. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  199. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  200. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  201. package/dist/map/adapter/extensions/workspace.d.ts +57 -0
  202. package/dist/map/adapter/extensions/workspace.d.ts.map +1 -0
  203. package/dist/map/adapter/extensions/workspace.js +81 -0
  204. package/dist/map/adapter/extensions/workspace.js.map +1 -0
  205. package/dist/map/adapter/index.d.ts +20 -0
  206. package/dist/map/adapter/index.d.ts.map +1 -0
  207. package/dist/map/adapter/index.js +40 -0
  208. package/dist/map/adapter/index.js.map +1 -0
  209. package/dist/map/adapter/interface.d.ts +450 -0
  210. package/dist/map/adapter/interface.d.ts.map +1 -0
  211. package/dist/map/adapter/interface.js +24 -0
  212. package/dist/map/adapter/interface.js.map +1 -0
  213. package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
  214. package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
  215. package/dist/map/adapter/mail-handler-adapter.js +292 -0
  216. package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
  217. package/dist/map/adapter/map-adapter.d.ts +200 -0
  218. package/dist/map/adapter/map-adapter.d.ts.map +1 -0
  219. package/dist/map/adapter/map-adapter.js +1199 -0
  220. package/dist/map/adapter/map-adapter.js.map +1 -0
  221. package/dist/map/adapter/rpc-handler.d.ts +263 -0
  222. package/dist/map/adapter/rpc-handler.d.ts.map +1 -0
  223. package/dist/map/adapter/rpc-handler.js +365 -0
  224. package/dist/map/adapter/rpc-handler.js.map +1 -0
  225. package/dist/map/adapter/subscription-manager.d.ts +174 -0
  226. package/dist/map/adapter/subscription-manager.d.ts.map +1 -0
  227. package/dist/map/adapter/subscription-manager.js +248 -0
  228. package/dist/map/adapter/subscription-manager.js.map +1 -0
  229. package/dist/map/adapter/types.d.ts +194 -0
  230. package/dist/map/adapter/types.d.ts.map +1 -0
  231. package/dist/map/adapter/types.js +27 -0
  232. package/dist/map/adapter/types.js.map +1 -0
  233. package/dist/map/adapter/websocket-integration.d.ts +113 -0
  234. package/dist/map/adapter/websocket-integration.d.ts.map +1 -0
  235. package/dist/map/adapter/websocket-integration.js +134 -0
  236. package/dist/map/adapter/websocket-integration.js.map +1 -0
  237. package/dist/map/cascade-action-handler.d.ts.map +1 -1
  238. package/dist/map/cascade-action-handler.js +19 -5
  239. package/dist/map/cascade-action-handler.js.map +1 -1
  240. package/dist/map/federation/envelope.d.ts +98 -0
  241. package/dist/map/federation/envelope.d.ts.map +1 -0
  242. package/dist/map/federation/envelope.js +160 -0
  243. package/dist/map/federation/envelope.js.map +1 -0
  244. package/dist/map/federation/federation-handler.d.ts +50 -0
  245. package/dist/map/federation/federation-handler.d.ts.map +1 -0
  246. package/dist/map/federation/federation-handler.js +306 -0
  247. package/dist/map/federation/federation-handler.js.map +1 -0
  248. package/dist/map/federation/index.d.ts +14 -0
  249. package/dist/map/federation/index.d.ts.map +1 -0
  250. package/dist/map/federation/index.js +13 -0
  251. package/dist/map/federation/index.js.map +1 -0
  252. package/dist/map/federation/types.d.ts +239 -0
  253. package/dist/map/federation/types.d.ts.map +1 -0
  254. package/dist/map/federation/types.js +23 -0
  255. package/dist/map/federation/types.js.map +1 -0
  256. package/dist/map/server.d.ts.map +1 -1
  257. package/dist/map/server.js +17 -2
  258. package/dist/map/server.js.map +1 -1
  259. package/dist/map/types.d.ts +6 -0
  260. package/dist/map/types.d.ts.map +1 -1
  261. package/dist/mcp/map-client.d.ts +39 -0
  262. package/dist/mcp/map-client.d.ts.map +1 -0
  263. package/dist/mcp/map-client.js +129 -0
  264. package/dist/mcp/map-client.js.map +1 -0
  265. package/dist/mcp/mcp-server.d.ts +72 -0
  266. package/dist/mcp/mcp-server.d.ts.map +1 -0
  267. package/dist/mcp/mcp-server.js +1027 -0
  268. package/dist/mcp/mcp-server.js.map +1 -0
  269. package/dist/mcp/tools/claim_task.d.ts +35 -0
  270. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  271. package/dist/mcp/tools/claim_task.js +58 -0
  272. package/dist/mcp/tools/claim_task.js.map +1 -0
  273. package/dist/mcp/tools/done-v2.d.ts +0 -1
  274. package/dist/mcp/tools/done-v2.d.ts.map +1 -1
  275. package/dist/mcp/tools/done-v2.js +0 -1
  276. package/dist/mcp/tools/done-v2.js.map +1 -1
  277. package/dist/mcp/tools/done.d.ts +102 -0
  278. package/dist/mcp/tools/done.d.ts.map +1 -0
  279. package/dist/mcp/tools/done.js +253 -0
  280. package/dist/mcp/tools/done.js.map +1 -0
  281. package/dist/mcp/tools/inject_context.d.ts +61 -0
  282. package/dist/mcp/tools/inject_context.d.ts.map +1 -0
  283. package/dist/mcp/tools/inject_context.js +123 -0
  284. package/dist/mcp/tools/inject_context.js.map +1 -0
  285. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  286. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  287. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  288. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  289. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  290. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  291. package/dist/mcp/tools/unclaim_task.js +47 -0
  292. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  293. package/dist/mcp/tools/wait_for_activity.d.ts +60 -0
  294. package/dist/mcp/tools/wait_for_activity.d.ts.map +1 -0
  295. package/dist/mcp/tools/wait_for_activity.js +135 -0
  296. package/dist/mcp/tools/wait_for_activity.js.map +1 -0
  297. package/dist/monitor/health-check-service.d.ts +143 -0
  298. package/dist/monitor/health-check-service.d.ts.map +1 -0
  299. package/dist/monitor/health-check-service.js +240 -0
  300. package/dist/monitor/health-check-service.js.map +1 -0
  301. package/dist/monitor/index.d.ts +14 -0
  302. package/dist/monitor/index.d.ts.map +1 -0
  303. package/dist/monitor/index.js +14 -0
  304. package/dist/monitor/index.js.map +1 -0
  305. package/dist/monitor/stall-detector.d.ts +109 -0
  306. package/dist/monitor/stall-detector.d.ts.map +1 -0
  307. package/dist/monitor/stall-detector.js +152 -0
  308. package/dist/monitor/stall-detector.js.map +1 -0
  309. package/dist/peer/capability-manager.d.ts +56 -0
  310. package/dist/peer/capability-manager.d.ts.map +1 -0
  311. package/dist/peer/capability-manager.js +186 -0
  312. package/dist/peer/capability-manager.js.map +1 -0
  313. package/dist/peer/encapsulation-manager.d.ts +190 -0
  314. package/dist/peer/encapsulation-manager.d.ts.map +1 -0
  315. package/dist/peer/encapsulation-manager.js +486 -0
  316. package/dist/peer/encapsulation-manager.js.map +1 -0
  317. package/dist/peer/federation-manager.d.ts +223 -0
  318. package/dist/peer/federation-manager.d.ts.map +1 -0
  319. package/dist/peer/federation-manager.js +528 -0
  320. package/dist/peer/federation-manager.js.map +1 -0
  321. package/dist/peer/hierarchy-errors.d.ts +208 -0
  322. package/dist/peer/hierarchy-errors.d.ts.map +1 -0
  323. package/dist/peer/hierarchy-errors.js +268 -0
  324. package/dist/peer/hierarchy-errors.js.map +1 -0
  325. package/dist/peer/hierarchy-protocol.d.ts +159 -0
  326. package/dist/peer/hierarchy-protocol.d.ts.map +1 -0
  327. package/dist/peer/hierarchy-protocol.js +142 -0
  328. package/dist/peer/hierarchy-protocol.js.map +1 -0
  329. package/dist/peer/index.d.ts +15 -0
  330. package/dist/peer/index.d.ts.map +1 -0
  331. package/dist/peer/index.js +15 -0
  332. package/dist/peer/index.js.map +1 -0
  333. package/dist/peer/peer-manager.d.ts +99 -0
  334. package/dist/peer/peer-manager.d.ts.map +1 -0
  335. package/dist/peer/peer-manager.js +333 -0
  336. package/dist/peer/peer-manager.js.map +1 -0
  337. package/dist/peer/task-delegation.d.ts +189 -0
  338. package/dist/peer/task-delegation.d.ts.map +1 -0
  339. package/dist/peer/task-delegation.js +303 -0
  340. package/dist/peer/task-delegation.js.map +1 -0
  341. package/dist/peer/transports/index.d.ts +8 -0
  342. package/dist/peer/transports/index.d.ts.map +1 -0
  343. package/dist/peer/transports/index.js +8 -0
  344. package/dist/peer/transports/index.js.map +1 -0
  345. package/dist/peer/transports/local-transport.d.ts +56 -0
  346. package/dist/peer/transports/local-transport.d.ts.map +1 -0
  347. package/dist/peer/transports/local-transport.js +263 -0
  348. package/dist/peer/transports/local-transport.js.map +1 -0
  349. package/dist/peer/transports/websocket-transport.d.ts +86 -0
  350. package/dist/peer/transports/websocket-transport.d.ts.map +1 -0
  351. package/dist/peer/transports/websocket-transport.js +338 -0
  352. package/dist/peer/transports/websocket-transport.js.map +1 -0
  353. package/dist/peer/types.d.ts +268 -0
  354. package/dist/peer/types.d.ts.map +1 -0
  355. package/dist/peer/types.js +36 -0
  356. package/dist/peer/types.js.map +1 -0
  357. package/dist/router/address-resolver.d.ts +102 -0
  358. package/dist/router/address-resolver.d.ts.map +1 -0
  359. package/dist/router/address-resolver.js +198 -0
  360. package/dist/router/address-resolver.js.map +1 -0
  361. package/dist/router/broadcast.d.ts +53 -0
  362. package/dist/router/broadcast.d.ts.map +1 -0
  363. package/dist/router/broadcast.js +75 -0
  364. package/dist/router/broadcast.js.map +1 -0
  365. package/dist/router/channels.d.ts +148 -0
  366. package/dist/router/channels.d.ts.map +1 -0
  367. package/dist/router/channels.js +126 -0
  368. package/dist/router/channels.js.map +1 -0
  369. package/dist/router/index.d.ts +21 -0
  370. package/dist/router/index.d.ts.map +1 -0
  371. package/dist/router/index.js +18 -0
  372. package/dist/router/index.js.map +1 -0
  373. package/dist/router/message-router.d.ts +197 -0
  374. package/dist/router/message-router.d.ts.map +1 -0
  375. package/dist/router/message-router.js +903 -0
  376. package/dist/router/message-router.js.map +1 -0
  377. package/dist/router/message-types.d.ts +183 -0
  378. package/dist/router/message-types.d.ts.map +1 -0
  379. package/dist/router/message-types.js +79 -0
  380. package/dist/router/message-types.js.map +1 -0
  381. package/dist/router/role-resolver.d.ts +67 -0
  382. package/dist/router/role-resolver.d.ts.map +1 -0
  383. package/dist/router/role-resolver.js +106 -0
  384. package/dist/router/role-resolver.js.map +1 -0
  385. package/dist/router/signals.d.ts +253 -0
  386. package/dist/router/signals.d.ts.map +1 -0
  387. package/dist/router/signals.js +53 -0
  388. package/dist/router/signals.js.map +1 -0
  389. package/dist/router/types.d.ts +191 -0
  390. package/dist/router/types.d.ts.map +1 -0
  391. package/dist/router/types.js +34 -0
  392. package/dist/router/types.js.map +1 -0
  393. package/dist/router/wake.d.ts +111 -0
  394. package/dist/router/wake.d.ts.map +1 -0
  395. package/dist/router/wake.js +180 -0
  396. package/dist/router/wake.js.map +1 -0
  397. package/dist/server/combined-server.d.ts +95 -0
  398. package/dist/server/combined-server.d.ts.map +1 -0
  399. package/dist/server/combined-server.js +335 -0
  400. package/dist/server/combined-server.js.map +1 -0
  401. package/dist/steering/index.d.ts +11 -0
  402. package/dist/steering/index.d.ts.map +1 -0
  403. package/dist/steering/index.js +11 -0
  404. package/dist/steering/index.js.map +1 -0
  405. package/dist/steering/inject.d.ts +39 -0
  406. package/dist/steering/inject.d.ts.map +1 -0
  407. package/dist/steering/inject.js +197 -0
  408. package/dist/steering/inject.js.map +1 -0
  409. package/dist/steering/types.d.ts +100 -0
  410. package/dist/steering/types.d.ts.map +1 -0
  411. package/dist/steering/types.js +11 -0
  412. package/dist/steering/types.js.map +1 -0
  413. package/dist/store/backends/index.d.ts +11 -0
  414. package/dist/store/backends/index.d.ts.map +1 -0
  415. package/dist/store/backends/index.js +15 -0
  416. package/dist/store/backends/index.js.map +1 -0
  417. package/dist/store/backends/json-backend.d.ts +23 -0
  418. package/dist/store/backends/json-backend.d.ts.map +1 -0
  419. package/dist/store/backends/json-backend.js +220 -0
  420. package/dist/store/backends/json-backend.js.map +1 -0
  421. package/dist/store/backends/memory-backend.d.ts +12 -0
  422. package/dist/store/backends/memory-backend.d.ts.map +1 -0
  423. package/dist/store/backends/memory-backend.js +205 -0
  424. package/dist/store/backends/memory-backend.js.map +1 -0
  425. package/dist/store/backends/sqlite-backend.d.ts +27 -0
  426. package/dist/store/backends/sqlite-backend.d.ts.map +1 -0
  427. package/dist/store/backends/sqlite-backend.js +231 -0
  428. package/dist/store/backends/sqlite-backend.js.map +1 -0
  429. package/dist/store/backends/tinybase-backend.d.ts +22 -0
  430. package/dist/store/backends/tinybase-backend.d.ts.map +1 -0
  431. package/dist/store/backends/tinybase-backend.js +203 -0
  432. package/dist/store/backends/tinybase-backend.js.map +1 -0
  433. package/dist/store/backends/types.d.ts +175 -0
  434. package/dist/store/backends/types.d.ts.map +1 -0
  435. package/dist/store/backends/types.js +28 -0
  436. package/dist/store/backends/types.js.map +1 -0
  437. package/dist/store/event-store.d.ts +128 -0
  438. package/dist/store/event-store.d.ts.map +1 -0
  439. package/dist/store/event-store.js +1751 -0
  440. package/dist/store/event-store.js.map +1 -0
  441. package/dist/store/instance.d.ts +290 -0
  442. package/dist/store/instance.d.ts.map +1 -0
  443. package/dist/store/instance.js +363 -0
  444. package/dist/store/instance.js.map +1 -0
  445. package/dist/store/migrations.d.ts +41 -0
  446. package/dist/store/migrations.d.ts.map +1 -0
  447. package/dist/store/migrations.js +79 -0
  448. package/dist/store/migrations.js.map +1 -0
  449. package/dist/store/test-utils.d.ts +63 -0
  450. package/dist/store/test-utils.d.ts.map +1 -0
  451. package/dist/store/test-utils.js +63 -0
  452. package/dist/store/test-utils.js.map +1 -0
  453. package/dist/store/types/config.d.ts +16 -0
  454. package/dist/store/types/config.d.ts.map +1 -0
  455. package/dist/store/types/config.js +8 -0
  456. package/dist/store/types/config.js.map +1 -0
  457. package/dist/store/types/conversations.d.ts +91 -0
  458. package/dist/store/types/conversations.d.ts.map +1 -0
  459. package/dist/store/types/conversations.js +8 -0
  460. package/dist/store/types/conversations.js.map +1 -0
  461. package/dist/store/types/sessions.d.ts +44 -0
  462. package/dist/store/types/sessions.d.ts.map +1 -0
  463. package/dist/store/types/sessions.js +9 -0
  464. package/dist/store/types/sessions.js.map +1 -0
  465. package/dist/store/types.d.ts +115 -0
  466. package/dist/store/types.d.ts.map +1 -0
  467. package/dist/store/types.js +6 -0
  468. package/dist/store/types.js.map +1 -0
  469. package/dist/task/backend/index.d.ts +93 -0
  470. package/dist/task/backend/index.d.ts.map +1 -0
  471. package/dist/task/backend/index.js +178 -0
  472. package/dist/task/backend/index.js.map +1 -0
  473. package/dist/task/backend/memory.d.ts +70 -0
  474. package/dist/task/backend/memory.d.ts.map +1 -0
  475. package/dist/task/backend/memory.js +621 -0
  476. package/dist/task/backend/memory.js.map +1 -0
  477. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  478. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  479. package/dist/task/backend/opentasks/backend.js +1023 -0
  480. package/dist/task/backend/opentasks/backend.js.map +1 -0
  481. package/dist/task/backend/opentasks/client.d.ts +337 -0
  482. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  483. package/dist/task/backend/opentasks/client.js +225 -0
  484. package/dist/task/backend/opentasks/client.js.map +1 -0
  485. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  486. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  487. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  488. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  489. package/dist/task/backend/opentasks/index.d.ts +21 -0
  490. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  491. package/dist/task/backend/opentasks/index.js +21 -0
  492. package/dist/task/backend/opentasks/index.js.map +1 -0
  493. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  494. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  495. package/dist/task/backend/opentasks/mapping.js +77 -0
  496. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  497. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts +54 -0
  498. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts.map +1 -0
  499. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js +88 -0
  500. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js.map +1 -0
  501. package/dist/task/backend/sudocode/backend.d.ts +155 -0
  502. package/dist/task/backend/sudocode/backend.d.ts.map +1 -0
  503. package/dist/task/backend/sudocode/backend.js +942 -0
  504. package/dist/task/backend/sudocode/backend.js.map +1 -0
  505. package/dist/task/backend/sudocode/client.d.ts +303 -0
  506. package/dist/task/backend/sudocode/client.d.ts.map +1 -0
  507. package/dist/task/backend/sudocode/client.js +101 -0
  508. package/dist/task/backend/sudocode/client.js.map +1 -0
  509. package/dist/task/backend/sudocode/index.d.ts +19 -0
  510. package/dist/task/backend/sudocode/index.d.ts.map +1 -0
  511. package/dist/task/backend/sudocode/index.js +17 -0
  512. package/dist/task/backend/sudocode/index.js.map +1 -0
  513. package/dist/task/backend/sudocode/mapping.d.ts +51 -0
  514. package/dist/task/backend/sudocode/mapping.d.ts.map +1 -0
  515. package/dist/task/backend/sudocode/mapping.js +86 -0
  516. package/dist/task/backend/sudocode/mapping.js.map +1 -0
  517. package/dist/task/backend/sudocode/server-client.d.ts +56 -0
  518. package/dist/task/backend/sudocode/server-client.d.ts.map +1 -0
  519. package/dist/task/backend/sudocode/server-client.js +367 -0
  520. package/dist/task/backend/sudocode/server-client.js.map +1 -0
  521. package/dist/task/backend/sudocode/standalone-client.d.ts +91 -0
  522. package/dist/task/backend/sudocode/standalone-client.d.ts.map +1 -0
  523. package/dist/task/backend/sudocode/standalone-client.js +476 -0
  524. package/dist/task/backend/sudocode/standalone-client.js.map +1 -0
  525. package/dist/task/backend/sudocode/sync-policy.d.ts +166 -0
  526. package/dist/task/backend/sudocode/sync-policy.d.ts.map +1 -0
  527. package/dist/task/backend/sudocode/sync-policy.js +221 -0
  528. package/dist/task/backend/sudocode/sync-policy.js.map +1 -0
  529. package/dist/task/backend/sudocode/tools.d.ts +87 -0
  530. package/dist/task/backend/sudocode/tools.d.ts.map +1 -0
  531. package/dist/task/backend/sudocode/tools.js +743 -0
  532. package/dist/task/backend/sudocode/tools.js.map +1 -0
  533. package/dist/task/backend/tool-provider.d.ts +56 -0
  534. package/dist/task/backend/tool-provider.d.ts.map +1 -0
  535. package/dist/task/backend/tool-provider.js +424 -0
  536. package/dist/task/backend/tool-provider.js.map +1 -0
  537. package/dist/task/backend/types.d.ts +297 -0
  538. package/dist/task/backend/types.d.ts.map +1 -0
  539. package/dist/task/backend/types.js +27 -0
  540. package/dist/task/backend/types.js.map +1 -0
  541. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  542. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  543. package/dist/task/backend/unified-tool-provider.js +623 -0
  544. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  545. package/dist/task/index.d.ts +7 -0
  546. package/dist/task/index.d.ts.map +1 -0
  547. package/dist/task/index.js +7 -0
  548. package/dist/task/index.js.map +1 -0
  549. package/dist/task/retry-policy.d.ts +89 -0
  550. package/dist/task/retry-policy.d.ts.map +1 -0
  551. package/dist/task/retry-policy.js +160 -0
  552. package/dist/task/retry-policy.js.map +1 -0
  553. package/dist/task/task-manager.d.ts +70 -0
  554. package/dist/task/task-manager.d.ts.map +1 -0
  555. package/dist/task/task-manager.js +319 -0
  556. package/dist/task/task-manager.js.map +1 -0
  557. package/dist/task/types.d.ts +72 -0
  558. package/dist/task/types.d.ts.map +1 -0
  559. package/dist/task/types.js +33 -0
  560. package/dist/task/types.js.map +1 -0
  561. package/dist/teams/team-loader.d.ts +2 -1
  562. package/dist/teams/team-loader.d.ts.map +1 -1
  563. package/dist/teams/team-loader.js +2 -1
  564. package/dist/teams/team-loader.js.map +1 -1
  565. package/dist/teams/team-manager.d.ts +101 -0
  566. package/dist/teams/team-manager.d.ts.map +1 -0
  567. package/dist/teams/team-manager.js +260 -0
  568. package/dist/teams/team-manager.js.map +1 -0
  569. package/dist/teams/team-runtime-v2.d.ts +0 -3
  570. package/dist/teams/team-runtime-v2.d.ts.map +1 -1
  571. package/dist/teams/team-runtime-v2.js +8 -87
  572. package/dist/teams/team-runtime-v2.js.map +1 -1
  573. package/dist/teams/team-runtime.d.ts +245 -0
  574. package/dist/teams/team-runtime.d.ts.map +1 -0
  575. package/dist/teams/team-runtime.js +1023 -0
  576. package/dist/teams/team-runtime.js.map +1 -0
  577. package/dist/trigger/router/index.d.ts +11 -0
  578. package/dist/trigger/router/index.d.ts.map +1 -0
  579. package/dist/trigger/router/index.js +10 -0
  580. package/dist/trigger/router/index.js.map +1 -0
  581. package/dist/trigger/router/strategies/ai-router-strategy.d.ts +34 -0
  582. package/dist/trigger/router/strategies/ai-router-strategy.d.ts.map +1 -0
  583. package/dist/trigger/router/strategies/ai-router-strategy.js +359 -0
  584. package/dist/trigger/router/strategies/ai-router-strategy.js.map +1 -0
  585. package/dist/trigger/router/strategies/direct-strategy.d.ts +32 -0
  586. package/dist/trigger/router/strategies/direct-strategy.d.ts.map +1 -0
  587. package/dist/trigger/router/strategies/direct-strategy.js +119 -0
  588. package/dist/trigger/router/strategies/direct-strategy.js.map +1 -0
  589. package/dist/trigger/router/strategies/index.d.ts +11 -0
  590. package/dist/trigger/router/strategies/index.d.ts.map +1 -0
  591. package/dist/trigger/router/strategies/index.js +11 -0
  592. package/dist/trigger/router/strategies/index.js.map +1 -0
  593. package/dist/trigger/router/strategies/role-strategy.d.ts +39 -0
  594. package/dist/trigger/router/strategies/role-strategy.d.ts.map +1 -0
  595. package/dist/trigger/router/strategies/role-strategy.js +207 -0
  596. package/dist/trigger/router/strategies/role-strategy.js.map +1 -0
  597. package/dist/trigger/router/trigger-router.d.ts +54 -0
  598. package/dist/trigger/router/trigger-router.d.ts.map +1 -0
  599. package/dist/trigger/router/trigger-router.js +362 -0
  600. package/dist/trigger/router/trigger-router.js.map +1 -0
  601. package/dist/trigger/router/types.d.ts +225 -0
  602. package/dist/trigger/router/types.d.ts.map +1 -0
  603. package/dist/trigger/router/types.js +10 -0
  604. package/dist/trigger/router/types.js.map +1 -0
  605. package/dist/trigger/sources/cron/cron-service.d.ts.map +1 -1
  606. package/dist/trigger/sources/cron/cron-service.js +6 -3
  607. package/dist/trigger/sources/cron/cron-service.js.map +1 -1
  608. package/dist/trigger/trigger-system.d.ts +77 -0
  609. package/dist/trigger/trigger-system.d.ts.map +1 -0
  610. package/dist/trigger/trigger-system.js +84 -0
  611. package/dist/trigger/trigger-system.js.map +1 -0
  612. package/dist/util/git-safety.d.ts +33 -0
  613. package/dist/util/git-safety.d.ts.map +1 -0
  614. package/dist/util/git-safety.js +94 -0
  615. package/dist/util/git-safety.js.map +1 -0
  616. package/dist/workspace/dataplane-adapter.d.ts +260 -0
  617. package/dist/workspace/dataplane-adapter.d.ts.map +1 -0
  618. package/dist/workspace/dataplane-adapter.js +416 -0
  619. package/dist/workspace/dataplane-adapter.js.map +1 -0
  620. package/dist/workspace/index.d.ts +0 -1
  621. package/dist/workspace/index.d.ts.map +1 -1
  622. package/dist/workspace/index.js +0 -2
  623. package/dist/workspace/index.js.map +1 -1
  624. package/dist/workspace/landing/direct-push.d.ts.map +1 -1
  625. package/dist/workspace/landing/direct-push.js +22 -7
  626. package/dist/workspace/landing/direct-push.js.map +1 -1
  627. package/dist/workspace/landing/queue-to-branch.d.ts.map +1 -1
  628. package/dist/workspace/landing/queue-to-branch.js +1 -3
  629. package/dist/workspace/landing/queue-to-branch.js.map +1 -1
  630. package/dist/workspace/types.d.ts +0 -13
  631. package/dist/workspace/types.d.ts.map +1 -1
  632. package/dist/workspace/workspace-manager.d.ts +0 -11
  633. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  634. package/dist/workspace/workspace-manager.js +0 -30
  635. package/dist/workspace/workspace-manager.js.map +1 -1
  636. package/package.json +28 -2
  637. package/templates/teams/self-driving/prompts/grinder.md +1 -0
  638. package/templates/teams/self-driving/prompts/judge.md +1 -0
  639. package/templates/teams/self-driving/prompts/planner.md +1 -0
  640. package/templates/teams/self-driving/roles/grinder.yaml +15 -0
  641. package/templates/teams/self-driving/roles/judge.yaml +10 -0
  642. package/templates/teams/self-driving/roles/planner.yaml +16 -0
  643. package/.claude/commands/openspec/apply.md +0 -23
  644. package/.claude/commands/openspec/archive.md +0 -27
  645. package/.claude/commands/openspec/proposal.md +0 -28
  646. package/.claude/settings.json +0 -133
  647. package/.gitattributes +0 -3
  648. package/.opentasks/config.json +0 -9
  649. package/.opentasks/graph.jsonl +0 -0
  650. package/.sessionlog/settings.json +0 -4
  651. package/.sudocode/issues.jsonl +0 -183
  652. package/.sudocode/specs.jsonl +0 -56
  653. package/AGENTS.md +0 -18
  654. package/CLAUDE.md +0 -923
  655. package/docs/architecture.md +0 -508
  656. package/docs/configuration.md +0 -323
  657. package/docs/conflict-recovery.md +0 -472
  658. package/docs/design/task-dispatcher.md +0 -880
  659. package/docs/design-subsystem-extraction.md +0 -627
  660. package/docs/git-cascade-integration-gaps.md +0 -678
  661. package/docs/implementation-details.md +0 -1127
  662. package/docs/implementation-summary.md +0 -448
  663. package/docs/lifecycle-events-design.md +0 -111
  664. package/docs/mail-integration.md +0 -608
  665. package/docs/openhive-capability-summary.md +0 -415
  666. package/docs/openhive-integration.md +0 -415
  667. package/docs/plan-self-driving-support.md +0 -433
  668. package/docs/roadmap-v2-gaps.md +0 -216
  669. package/docs/spec-self-driving-support.md +0 -462
  670. package/docs/team-templates.md +0 -860
  671. package/docs/teams.md +0 -306
  672. package/docs/trigger-system-design.md +0 -333
  673. package/docs/troubleshooting.md +0 -489
  674. package/docs/workspace-interfaces.md +0 -731
  675. package/docs/workspace-redesign-plan.md +0 -302
  676. package/examples/distributed-peer-communication.ts +0 -202
  677. package/examples/local-peer-communication.ts +0 -165
  678. package/index.js +0 -2
  679. package/mvp_docs/agent-execution-system.md +0 -347
  680. package/mvp_docs/agent-interface.md +0 -580
  681. package/mvp_docs/data-structures.md +0 -701
  682. package/mvp_docs/dynamic-meta-orchestration.md +0 -116
  683. package/mvp_docs/multi-agent-interaction-design.md +0 -779
  684. package/mvp_docs/mvp-implementation-plan.md +0 -1148
  685. package/renovate.json5 +0 -6
  686. package/scripts/test-acp-integration.ts +0 -422
  687. package/src/__tests__/boot-v2.test.ts +0 -631
  688. package/src/__tests__/e2e/acp-over-map-live.e2e.test.ts +0 -496
  689. package/src/__tests__/e2e/acp-over-map.e2e.test.ts +0 -457
  690. package/src/__tests__/e2e/agent-lifecycle.e2e.test.ts +0 -770
  691. package/src/__tests__/e2e/auto-sync.e2e.test.ts +0 -257
  692. package/src/__tests__/e2e/bootstrap.e2e.test.ts +0 -319
  693. package/src/__tests__/e2e/cascade-rebase.e2e.test.ts +0 -254
  694. package/src/__tests__/e2e/cc-swarm-bridge.e2e.test.ts +0 -253
  695. package/src/__tests__/e2e/cli-run.e2e.test.ts +0 -167
  696. package/src/__tests__/e2e/cognitive-workspace.e2e.test.ts +0 -282
  697. package/src/__tests__/e2e/dispatch-coordination.e2e.test.ts +0 -495
  698. package/src/__tests__/e2e/dispatch-live.e2e.test.ts +0 -564
  699. package/src/__tests__/e2e/dispatch-opentasks.e2e.test.ts +0 -496
  700. package/src/__tests__/e2e/dispatch-phase2-live.e2e.test.ts +0 -456
  701. package/src/__tests__/e2e/dispatch-phase2.e2e.test.ts +0 -386
  702. package/src/__tests__/e2e/dispatch.e2e.test.ts +0 -376
  703. package/src/__tests__/e2e/done-scenarios.e2e.test.ts +0 -322
  704. package/src/__tests__/e2e/live-agent.e2e.test.ts +0 -1330
  705. package/src/__tests__/e2e/map-server.e2e.test.ts +0 -128
  706. package/src/__tests__/e2e/map-sidecar.e2e.test.ts +0 -139
  707. package/src/__tests__/e2e/opentasks-integration.e2e.test.ts +0 -280
  708. package/src/__tests__/e2e/pull-mode.e2e.test.ts +0 -632
  709. package/src/__tests__/e2e/resume-continue.e2e.test.ts +0 -312
  710. package/src/__tests__/e2e/self-driving-v3.e2e.test.ts +0 -197
  711. package/src/__tests__/e2e/spawn-resolver.e2e.test.ts +0 -200
  712. package/src/__tests__/e2e/swarmkit-integration.e2e.test.ts +0 -562
  713. package/src/__tests__/e2e/swarmkit-live.e2e.test.ts +0 -1049
  714. package/src/__tests__/e2e/trajectory-tracking.e2e.test.ts +0 -258
  715. package/src/__tests__/e2e/trigger-wake.e2e.test.ts +0 -257
  716. package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +0 -383
  717. package/src/__tests__/e2e/workspace-v3.e2e.test.ts +0 -413
  718. package/src/acp/__tests__/claude-code-replay.test.ts +0 -225
  719. package/src/acp/__tests__/macro-agent.test.ts +0 -387
  720. package/src/acp/__tests__/session-mapper.test.ts +0 -152
  721. package/src/acp/__tests__/websocket-server.test.ts +0 -194
  722. package/src/acp/claude-code-replay.ts +0 -208
  723. package/src/acp/index.ts +0 -32
  724. package/src/acp/macro-agent.ts +0 -995
  725. package/src/acp/map-bridge.ts +0 -193
  726. package/src/acp/session-mapper.ts +0 -116
  727. package/src/acp/types.ts +0 -99
  728. package/src/acp/websocket-server.ts +0 -213
  729. package/src/adapters/__tests__/federation.test.ts +0 -256
  730. package/src/adapters/__tests__/inbox-adapter.test.ts +0 -316
  731. package/src/adapters/__tests__/tasks-adapter.test.ts +0 -270
  732. package/src/adapters/federation.ts +0 -185
  733. package/src/adapters/inbox-adapter.ts +0 -292
  734. package/src/adapters/inbox-client-adapter.ts +0 -173
  735. package/src/adapters/index.ts +0 -44
  736. package/src/adapters/opentasks-daemon.ts +0 -252
  737. package/src/adapters/tasks-adapter.ts +0 -330
  738. package/src/adapters/types.ts +0 -286
  739. package/src/agent/__tests__/agent-manager-topology.test.ts +0 -73
  740. package/src/agent/__tests__/agent-manager-v2.completion-signal.test.ts +0 -284
  741. package/src/agent/__tests__/agent-manager-v2.permission-interception.test.ts +0 -296
  742. package/src/agent/__tests__/agent-manager-v2.permissions.test.ts +0 -233
  743. package/src/agent/__tests__/agent-manager-v2.test.ts +0 -614
  744. package/src/agent/__tests__/agent-store.test.ts +0 -465
  745. package/src/agent/__tests__/task-ref-resolution.test.ts +0 -231
  746. package/src/agent/agent-manager-v2.ts +0 -2187
  747. package/src/agent/agent-manager.ts +0 -403
  748. package/src/agent/agent-store.ts +0 -409
  749. package/src/agent/index.ts +0 -7
  750. package/src/agent/prompts/coordinator-signals.ts +0 -115
  751. package/src/agent/prompts/index.ts +0 -7
  752. package/src/agent/system-prompt.ts +0 -298
  753. package/src/agent/types.ts +0 -480
  754. package/src/agent-detection/__tests__/command-builder.test.ts +0 -336
  755. package/src/agent-detection/__tests__/detector.test.ts +0 -768
  756. package/src/agent-detection/__tests__/registry.test.ts +0 -254
  757. package/src/agent-detection/command-builder.ts +0 -90
  758. package/src/agent-detection/detector.ts +0 -307
  759. package/src/agent-detection/index.ts +0 -36
  760. package/src/agent-detection/registry.ts +0 -200
  761. package/src/agent-detection/types.ts +0 -184
  762. package/src/api/__tests__/server.test.ts +0 -292
  763. package/src/api/index.ts +0 -8
  764. package/src/api/server.ts +0 -380
  765. package/src/api/types.ts +0 -39
  766. package/src/auth/__tests__/token.test.ts +0 -100
  767. package/src/auth/index.ts +0 -1
  768. package/src/auth/token.ts +0 -82
  769. package/src/boot-v2.ts +0 -1343
  770. package/src/cli/__tests__/stable-instance-id.test.ts +0 -57
  771. package/src/cli/acp.ts +0 -101
  772. package/src/cli/inbox-mcp-proxy.ts +0 -56
  773. package/src/cli/index.ts +0 -566
  774. package/src/cli/mcp.ts +0 -305
  775. package/src/cli/parse-args.ts +0 -54
  776. package/src/cli/stable-instance-id.ts +0 -14
  777. package/src/cognitive/__tests__/macro-agent-backend.test.ts +0 -673
  778. package/src/cognitive/__tests__/session-converter.test.ts +0 -423
  779. package/src/cognitive/__tests__/workspace-handler.test.ts +0 -221
  780. package/src/cognitive/analyst-role.ts +0 -59
  781. package/src/cognitive/index.ts +0 -49
  782. package/src/cognitive/macro-agent-backend.ts +0 -402
  783. package/src/cognitive/session-converter.ts +0 -151
  784. package/src/cognitive/types.ts +0 -187
  785. package/src/cognitive/workspace-handler.ts +0 -163
  786. package/src/config/index.ts +0 -9
  787. package/src/config/project-config.ts +0 -294
  788. package/src/control/__tests__/control-resilience.test.ts +0 -251
  789. package/src/control/__tests__/control-socket.test.ts +0 -240
  790. package/src/control/control-client.ts +0 -337
  791. package/src/control/control-server.ts +0 -298
  792. package/src/control/index.ts +0 -17
  793. package/src/control/types.ts +0 -95
  794. package/src/dispatch/CLAUDE.md +0 -129
  795. package/src/dispatch/__tests__/loadout-translation.test.ts +0 -141
  796. package/src/dispatch/__tests__/mail-inbound-consumer.integration.test.ts +0 -519
  797. package/src/dispatch/__tests__/mail-inbound-consumer.test.ts +0 -800
  798. package/src/dispatch/__tests__/mail-inbound-reuse-consumer.test.ts +0 -575
  799. package/src/dispatch/__tests__/permission-evaluator.test.ts +0 -196
  800. package/src/dispatch/__tests__/permission-overlay.test.ts +0 -56
  801. package/src/dispatch/__tests__/permissions-handler.test.ts +0 -168
  802. package/src/dispatch/__tests__/spawn-agent-handler.test.ts +0 -282
  803. package/src/dispatch/loadout-translation.ts +0 -138
  804. package/src/dispatch/mail-inbound-consumer.ts +0 -560
  805. package/src/dispatch/mail-inbound-reuse-consumer.ts +0 -479
  806. package/src/dispatch/permission-evaluator.ts +0 -191
  807. package/src/dispatch/permission-overlay.ts +0 -89
  808. package/src/dispatch/permissions-handler.ts +0 -112
  809. package/src/dispatch/spawn-agent-handler.ts +0 -160
  810. package/src/index.ts +0 -117
  811. package/src/integrations/__tests__/context-builder.test.ts +0 -218
  812. package/src/integrations/__tests__/sessionlog.test.ts +0 -498
  813. package/src/integrations/__tests__/skilltree.test.ts +0 -136
  814. package/src/integrations/context-builder.ts +0 -280
  815. package/src/integrations/sessionlog.ts +0 -194
  816. package/src/integrations/skilltree.ts +0 -184
  817. package/src/lifecycle/__tests__/cascade-consolidation.test.ts +0 -240
  818. package/src/lifecycle/__tests__/handlers-v2.test.ts +0 -565
  819. package/src/lifecycle/cascade.ts +0 -335
  820. package/src/lifecycle/cleanup.ts +0 -373
  821. package/src/lifecycle/handlers-v2.ts +0 -508
  822. package/src/lifecycle/index.ts +0 -76
  823. package/src/lifecycle/types.ts +0 -260
  824. package/src/map/__tests__/cascade-bridge.test.ts +0 -229
  825. package/src/map/__tests__/cascade-diff-server.test.ts +0 -434
  826. package/src/map/__tests__/emit-event.test.ts +0 -71
  827. package/src/map/__tests__/lifecycle-bridge.test.ts +0 -430
  828. package/src/map/__tests__/mail-bridge.test.ts +0 -321
  829. package/src/map/__tests__/permission-forwarding.test.ts +0 -143
  830. package/src/map/__tests__/sidecar-diff-install-smoke.test.ts +0 -90
  831. package/src/map/__tests__/sidecar-integration.test.ts +0 -190
  832. package/src/map/__tests__/task-bridge.test.ts +0 -153
  833. package/src/map/__tests__/trajectory-reporter.test.ts +0 -173
  834. package/src/map/acp-bridge.ts +0 -293
  835. package/src/map/cascade-action-handler.ts +0 -205
  836. package/src/map/cascade-bridge.ts +0 -339
  837. package/src/map/cascade-diff-server.ts +0 -404
  838. package/src/map/cc-swarm-hooks.ts +0 -242
  839. package/src/map/coordination-handler.ts +0 -232
  840. package/src/map/index.ts +0 -18
  841. package/src/map/lifecycle-bridge.ts +0 -236
  842. package/src/map/mail-bridge.ts +0 -263
  843. package/src/map/repo-workspace.ts +0 -82
  844. package/src/map/server.ts +0 -758
  845. package/src/map/sidecar.ts +0 -826
  846. package/src/map/task-bridge.ts +0 -89
  847. package/src/map/trajectory-reporter.ts +0 -124
  848. package/src/map/types.ts +0 -304
  849. package/src/mcp/__tests__/mcp-server-v2.test.ts +0 -236
  850. package/src/mcp/index.ts +0 -6
  851. package/src/mcp/mcp-server-v2.ts +0 -485
  852. package/src/mcp/tools/done-v2.ts +0 -213
  853. package/src/mcp/types.ts +0 -432
  854. package/src/metrics/__tests__/metrics.test.ts +0 -205
  855. package/src/metrics/index.ts +0 -13
  856. package/src/metrics/metrics.ts +0 -151
  857. package/src/metrics/types.ts +0 -63
  858. package/src/roles/__tests__/config-loader.test.ts +0 -540
  859. package/src/roles/builtin/coordinator.ts +0 -75
  860. package/src/roles/builtin/generic.ts +0 -39
  861. package/src/roles/builtin/index.ts +0 -51
  862. package/src/roles/builtin/integrator.ts +0 -62
  863. package/src/roles/builtin/monitor.ts +0 -65
  864. package/src/roles/builtin/worker.ts +0 -134
  865. package/src/roles/capabilities.ts +0 -257
  866. package/src/roles/config-loader.ts +0 -405
  867. package/src/roles/index.ts +0 -141
  868. package/src/roles/registry.ts +0 -713
  869. package/src/roles/types.ts +0 -344
  870. package/src/store/index.ts +0 -8
  871. package/src/store/types/agents.ts +0 -69
  872. package/src/store/types/events.ts +0 -91
  873. package/src/store/types/index.ts +0 -9
  874. package/src/store/types/messages.ts +0 -32
  875. package/src/store/types/primitives.ts +0 -9
  876. package/src/store/types/tasks.ts +0 -124
  877. package/src/teams/__tests__/team-manager-v2.test.ts +0 -425
  878. package/src/teams/__tests__/team-runtime-v2.test.ts +0 -402
  879. package/src/teams/index.ts +0 -29
  880. package/src/teams/seed-defaults.ts +0 -83
  881. package/src/teams/team-loader.ts +0 -476
  882. package/src/teams/team-manager-v2.ts +0 -343
  883. package/src/teams/team-runtime-v2.ts +0 -943
  884. package/src/teams/types.ts +0 -276
  885. package/src/trigger/__tests__/cron-service.test.ts +0 -548
  886. package/src/trigger/__tests__/scheduler.test.ts +0 -371
  887. package/src/trigger/__tests__/system-event-queue.test.ts +0 -147
  888. package/src/trigger/__tests__/trigger-system-v2.test.ts +0 -257
  889. package/src/trigger/__tests__/wake-manager.test.ts +0 -356
  890. package/src/trigger/__tests__/webhook-handler.test.ts +0 -567
  891. package/src/trigger/index.ts +0 -110
  892. package/src/trigger/queue/index.ts +0 -21
  893. package/src/trigger/queue/system-event-queue.ts +0 -232
  894. package/src/trigger/queue/types.ts +0 -149
  895. package/src/trigger/sources/cron/cron-service.ts +0 -499
  896. package/src/trigger/sources/cron/index.ts +0 -41
  897. package/src/trigger/sources/cron/scheduler.ts +0 -344
  898. package/src/trigger/sources/cron/types.ts +0 -333
  899. package/src/trigger/sources/index.ts +0 -10
  900. package/src/trigger/sources/webhook/index.ts +0 -25
  901. package/src/trigger/sources/webhook/types.ts +0 -205
  902. package/src/trigger/sources/webhook/webhook-handler.ts +0 -410
  903. package/src/trigger/strategies/ai-router.ts +0 -170
  904. package/src/trigger/trigger-system-v2.ts +0 -536
  905. package/src/trigger/types.ts +0 -228
  906. package/src/trigger/wake/index.ts +0 -22
  907. package/src/trigger/wake/types.ts +0 -162
  908. package/src/trigger/wake/wake-manager.ts +0 -390
  909. package/src/workspace/__tests__/git-cascade-adapter.test.ts +0 -563
  910. package/src/workspace/__tests__/land-dispatch.test.ts +0 -214
  911. package/src/workspace/__tests__/self-driving-yaml.test.ts +0 -122
  912. package/src/workspace/__tests__/shared-worktree-refcount.test.ts +0 -154
  913. package/src/workspace/__tests__/standalone-mode.test.ts +0 -118
  914. package/src/workspace/__tests__/workspace-manager-v3.test.ts +0 -245
  915. package/src/workspace/__tests__/yaml-schema.test.ts +0 -210
  916. package/src/workspace/config.ts +0 -165
  917. package/src/workspace/git-cascade-adapter.ts +0 -1213
  918. package/src/workspace/index.ts +0 -110
  919. package/src/workspace/landing/__tests__/strategies.test.ts +0 -184
  920. package/src/workspace/landing/direct-push.ts +0 -91
  921. package/src/workspace/landing/index.ts +0 -40
  922. package/src/workspace/landing/merge-to-parent.ts +0 -229
  923. package/src/workspace/landing/optimistic-push.ts +0 -36
  924. package/src/workspace/landing/queue-to-branch.ts +0 -108
  925. package/src/workspace/merge-queue/__tests__/conflict-resolution-git.e2e.test.ts +0 -641
  926. package/src/workspace/merge-queue/__tests__/conflict-resolution.test.ts +0 -707
  927. package/src/workspace/merge-queue/__tests__/merge-queue-concurrent.test.ts +0 -628
  928. package/src/workspace/merge-queue/__tests__/merge-queue-edge-cases.test.ts +0 -1217
  929. package/src/workspace/merge-queue/__tests__/merge-queue.test.ts +0 -506
  930. package/src/workspace/merge-queue/__tests__/real-git-operations.e2e.test.ts +0 -556
  931. package/src/workspace/merge-queue/__tests__/resolver-flow.test.ts +0 -472
  932. package/src/workspace/merge-queue/index.ts +0 -38
  933. package/src/workspace/merge-queue/merge-queue.ts +0 -585
  934. package/src/workspace/merge-queue/schema.ts +0 -98
  935. package/src/workspace/merge-queue/types.ts +0 -316
  936. package/src/workspace/pool/__tests__/worktree-pool.integration.test.ts +0 -1281
  937. package/src/workspace/pool/__tests__/worktree-pool.test.ts +0 -590
  938. package/src/workspace/pool/index.ts +0 -26
  939. package/src/workspace/pool/types.ts +0 -276
  940. package/src/workspace/pool/worktree-pool.ts +0 -659
  941. package/src/workspace/recovery/__tests__/auto-resolve-integration.test.ts +0 -127
  942. package/src/workspace/recovery/__tests__/spawn-resolver.test.ts +0 -139
  943. package/src/workspace/recovery/__tests__/strategies.test.ts +0 -145
  944. package/src/workspace/recovery/abandon.ts +0 -51
  945. package/src/workspace/recovery/auto-resolve.ts +0 -119
  946. package/src/workspace/recovery/defer.ts +0 -23
  947. package/src/workspace/recovery/escalate.ts +0 -30
  948. package/src/workspace/recovery/index.ts +0 -58
  949. package/src/workspace/recovery/spawn-resolver.ts +0 -152
  950. package/src/workspace/recovery/types.ts +0 -54
  951. package/src/workspace/strategies/index.ts +0 -18
  952. package/src/workspace/strategies/optimistic.ts +0 -139
  953. package/src/workspace/strategies/queue.ts +0 -81
  954. package/src/workspace/strategies/registry.ts +0 -89
  955. package/src/workspace/strategies/trunk.ts +0 -123
  956. package/src/workspace/strategies/types.ts +0 -145
  957. package/src/workspace/topology/__tests__/yaml-driven.test.ts +0 -345
  958. package/src/workspace/topology/index.ts +0 -18
  959. package/src/workspace/topology/no-workspace.ts +0 -39
  960. package/src/workspace/topology/types.ts +0 -116
  961. package/src/workspace/topology/yaml-driven.ts +0 -316
  962. package/src/workspace/types-v3.ts +0 -162
  963. package/src/workspace/types.ts +0 -541
  964. package/src/workspace/workspace-manager.ts +0 -1577
  965. package/src/workspace/yaml-schema.ts +0 -216
  966. package/test_fixtures/README.md +0 -425
  967. package/test_fixtures/fixtures/behaviors/coordinators.ts +0 -196
  968. package/test_fixtures/fixtures/behaviors/index.ts +0 -62
  969. package/test_fixtures/fixtures/behaviors/integrators.ts +0 -143
  970. package/test_fixtures/fixtures/behaviors/monitors.ts +0 -199
  971. package/test_fixtures/fixtures/behaviors/workers.ts +0 -348
  972. package/test_fixtures/fixtures/index.ts +0 -7
  973. package/test_fixtures/fixtures/projects/index.ts +0 -23
  974. package/test_fixtures/fixtures/projects/project-with-specs.ts +0 -44
  975. package/test_fixtures/fixtures/projects/typescript-project.ts +0 -200
  976. package/test_fixtures/fixtures/repos/index.ts +0 -6
  977. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -299
  978. package/test_fixtures/fixtures/repos/types.ts +0 -174
  979. package/test_fixtures/harness/assertions/harness-assertions.ts +0 -752
  980. package/test_fixtures/harness/assertions/index.ts +0 -8
  981. package/test_fixtures/harness/index.ts +0 -15
  982. package/test_fixtures/harness/simulator/agent-simulator.ts +0 -768
  983. package/test_fixtures/harness/simulator/behavior-executor.ts +0 -580
  984. package/test_fixtures/harness/simulator/index.ts +0 -14
  985. package/test_fixtures/harness/simulator/types.ts +0 -459
  986. package/test_fixtures/harness/test-harness.ts +0 -770
  987. package/test_fixtures/harness/timing/event-stepper.ts +0 -344
  988. package/test_fixtures/harness/timing/index.ts +0 -8
  989. package/tsconfig.json +0 -21
  990. package/vitest.config.ts +0 -30
  991. package/vitest.e2e.config.ts +0 -28
  992. 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
- });