macro-agent 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1002) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +30 -56
  3. package/dist/acp/websocket-server.d.ts +6 -0
  4. package/dist/acp/websocket-server.d.ts.map +1 -1
  5. package/dist/acp/websocket-server.js +13 -0
  6. package/dist/acp/websocket-server.js.map +1 -1
  7. package/dist/acp/websocket-stream.d.ts +30 -0
  8. package/dist/acp/websocket-stream.d.ts.map +1 -0
  9. package/dist/acp/websocket-stream.js +118 -0
  10. package/dist/acp/websocket-stream.js.map +1 -0
  11. package/dist/activity/deduplication.d.ts +85 -0
  12. package/dist/activity/deduplication.d.ts.map +1 -0
  13. package/dist/activity/deduplication.js +149 -0
  14. package/dist/activity/deduplication.js.map +1 -0
  15. package/dist/activity/index.d.ts +16 -0
  16. package/dist/activity/index.d.ts.map +1 -0
  17. package/dist/activity/index.js +17 -0
  18. package/dist/activity/index.js.map +1 -0
  19. package/dist/activity/relevance.d.ts +81 -0
  20. package/dist/activity/relevance.d.ts.map +1 -0
  21. package/dist/activity/relevance.js +161 -0
  22. package/dist/activity/relevance.js.map +1 -0
  23. package/dist/activity/types.d.ts +169 -0
  24. package/dist/activity/types.d.ts.map +1 -0
  25. package/dist/activity/types.js +33 -0
  26. package/dist/activity/types.js.map +1 -0
  27. package/dist/activity/watcher.d.ts +64 -0
  28. package/dist/activity/watcher.d.ts.map +1 -0
  29. package/dist/activity/watcher.js +212 -0
  30. package/dist/activity/watcher.js.map +1 -0
  31. package/dist/adapters/federation.d.ts +8 -1
  32. package/dist/adapters/federation.d.ts.map +1 -1
  33. package/dist/adapters/federation.js +33 -2
  34. package/dist/adapters/federation.js.map +1 -1
  35. package/dist/agent/agent-manager-v2.d.ts.map +1 -1
  36. package/dist/agent/agent-manager-v2.js +189 -67
  37. package/dist/agent/agent-manager-v2.js.map +1 -1
  38. package/dist/agent/agent-manager.d.ts +17 -0
  39. package/dist/agent/agent-manager.d.ts.map +1 -1
  40. package/dist/agent/agent-manager.js.map +1 -1
  41. package/dist/agent/types.d.ts +21 -2
  42. package/dist/agent/types.d.ts.map +1 -1
  43. package/dist/agent/types.js.map +1 -1
  44. package/dist/agent/wake.d.ts +85 -0
  45. package/dist/agent/wake.d.ts.map +1 -0
  46. package/dist/agent/wake.js +278 -0
  47. package/dist/agent/wake.js.map +1 -0
  48. package/dist/api/server.d.ts.map +1 -1
  49. package/dist/api/server.js +41 -25
  50. package/dist/api/server.js.map +1 -1
  51. package/dist/api/types.d.ts +6 -0
  52. package/dist/api/types.d.ts.map +1 -1
  53. package/dist/auth/server-auth.d.ts +43 -0
  54. package/dist/auth/server-auth.d.ts.map +1 -0
  55. package/dist/auth/server-auth.js +80 -0
  56. package/dist/auth/server-auth.js.map +1 -0
  57. package/dist/auth/token.d.ts +4 -0
  58. package/dist/auth/token.d.ts.map +1 -1
  59. package/dist/auth/token.js +7 -6
  60. package/dist/auth/token.js.map +1 -1
  61. package/dist/boot-v2.d.ts +6 -3
  62. package/dist/boot-v2.d.ts.map +1 -1
  63. package/dist/boot-v2.js +44 -25
  64. package/dist/boot-v2.js.map +1 -1
  65. package/dist/cognitive/macro-agent-backend.d.ts.map +1 -1
  66. package/dist/cognitive/macro-agent-backend.js +37 -8
  67. package/dist/cognitive/macro-agent-backend.js.map +1 -1
  68. package/dist/cognitive/team-lifecycle.d.ts +82 -0
  69. package/dist/cognitive/team-lifecycle.d.ts.map +1 -0
  70. package/dist/cognitive/team-lifecycle.js +121 -0
  71. package/dist/cognitive/team-lifecycle.js.map +1 -0
  72. package/dist/cognitive/trajectory-extractor.d.ts +25 -0
  73. package/dist/cognitive/trajectory-extractor.d.ts.map +1 -0
  74. package/dist/cognitive/trajectory-extractor.js +134 -0
  75. package/dist/cognitive/trajectory-extractor.js.map +1 -0
  76. package/dist/cognitive/types.d.ts +24 -0
  77. package/dist/cognitive/types.d.ts.map +1 -1
  78. package/dist/control/control-server.d.ts.map +1 -1
  79. package/dist/control/control-server.js +10 -0
  80. package/dist/control/control-server.js.map +1 -1
  81. package/dist/dispatch/mail-inbound-consumer.d.ts.map +1 -1
  82. package/dist/dispatch/mail-inbound-consumer.js +43 -10
  83. package/dist/dispatch/mail-inbound-consumer.js.map +1 -1
  84. package/dist/index.d.ts +5 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +6 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/lifecycle/handlers/generic.d.ts +27 -0
  89. package/dist/lifecycle/handlers/generic.d.ts.map +1 -0
  90. package/dist/lifecycle/handlers/generic.js +56 -0
  91. package/dist/lifecycle/handlers/generic.js.map +1 -0
  92. package/dist/lifecycle/handlers/index.d.ts +51 -0
  93. package/dist/lifecycle/handlers/index.d.ts.map +1 -0
  94. package/dist/lifecycle/handlers/index.js +110 -0
  95. package/dist/lifecycle/handlers/index.js.map +1 -0
  96. package/dist/lifecycle/handlers/integrator.d.ts +81 -0
  97. package/dist/lifecycle/handlers/integrator.d.ts.map +1 -0
  98. package/dist/lifecycle/handlers/integrator.js +451 -0
  99. package/dist/lifecycle/handlers/integrator.js.map +1 -0
  100. package/dist/lifecycle/handlers/monitor.d.ts +29 -0
  101. package/dist/lifecycle/handlers/monitor.d.ts.map +1 -0
  102. package/dist/lifecycle/handlers/monitor.js +79 -0
  103. package/dist/lifecycle/handlers/monitor.js.map +1 -0
  104. package/dist/lifecycle/handlers/worker.d.ts +56 -0
  105. package/dist/lifecycle/handlers/worker.d.ts.map +1 -0
  106. package/dist/lifecycle/handlers/worker.js +381 -0
  107. package/dist/lifecycle/handlers/worker.js.map +1 -0
  108. package/dist/lifecycle/handlers-v2.d.ts +0 -2
  109. package/dist/lifecycle/handlers-v2.d.ts.map +1 -1
  110. package/dist/lifecycle/handlers-v2.js +4 -55
  111. package/dist/lifecycle/handlers-v2.js.map +1 -1
  112. package/dist/mail/conversation-map.d.ts +33 -0
  113. package/dist/mail/conversation-map.d.ts.map +1 -0
  114. package/dist/mail/conversation-map.js +61 -0
  115. package/dist/mail/conversation-map.js.map +1 -0
  116. package/dist/mail/index.d.ts +11 -0
  117. package/dist/mail/index.d.ts.map +1 -0
  118. package/dist/mail/index.js +11 -0
  119. package/dist/mail/index.js.map +1 -0
  120. package/dist/mail/mail-service.d.ts +85 -0
  121. package/dist/mail/mail-service.d.ts.map +1 -0
  122. package/dist/mail/mail-service.js +121 -0
  123. package/dist/mail/mail-service.js.map +1 -0
  124. package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
  125. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
  126. package/dist/mail/stores/eventstore-conversation-store.js +131 -0
  127. package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
  128. package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
  129. package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
  130. package/dist/mail/stores/eventstore-participant-store.js +145 -0
  131. package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
  132. package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
  133. package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
  134. package/dist/mail/stores/eventstore-thread-store.js +118 -0
  135. package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
  136. package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
  137. package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
  138. package/dist/mail/stores/eventstore-turn-store.js +153 -0
  139. package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
  140. package/dist/mail/stores/index.d.ts +12 -0
  141. package/dist/mail/stores/index.d.ts.map +1 -0
  142. package/dist/mail/stores/index.js +12 -0
  143. package/dist/mail/stores/index.js.map +1 -0
  144. package/dist/mail/stores/types.d.ts +146 -0
  145. package/dist/mail/stores/types.d.ts.map +1 -0
  146. package/dist/mail/stores/types.js +13 -0
  147. package/dist/mail/stores/types.js.map +1 -0
  148. package/dist/mail/turn-recorder.d.ts +30 -0
  149. package/dist/mail/turn-recorder.d.ts.map +1 -0
  150. package/dist/mail/turn-recorder.js +98 -0
  151. package/dist/mail/turn-recorder.js.map +1 -0
  152. package/dist/map/adapter/acp-over-map.d.ts +115 -0
  153. package/dist/map/adapter/acp-over-map.d.ts.map +1 -0
  154. package/dist/map/adapter/acp-over-map.js +1024 -0
  155. package/dist/map/adapter/acp-over-map.js.map +1 -0
  156. package/dist/map/adapter/connection-manager.d.ts +150 -0
  157. package/dist/map/adapter/connection-manager.d.ts.map +1 -0
  158. package/dist/map/adapter/connection-manager.js +207 -0
  159. package/dist/map/adapter/connection-manager.js.map +1 -0
  160. package/dist/map/adapter/event-log.d.ts +87 -0
  161. package/dist/map/adapter/event-log.d.ts.map +1 -0
  162. package/dist/map/adapter/event-log.js +122 -0
  163. package/dist/map/adapter/event-log.js.map +1 -0
  164. package/dist/map/adapter/event-translator.d.ts +85 -0
  165. package/dist/map/adapter/event-translator.d.ts.map +1 -0
  166. package/dist/map/adapter/event-translator.js +295 -0
  167. package/dist/map/adapter/event-translator.js.map +1 -0
  168. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  169. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  170. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  171. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  172. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  173. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  174. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  175. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  176. package/dist/map/adapter/extensions/cognitive.d.ts +27 -0
  177. package/dist/map/adapter/extensions/cognitive.d.ts.map +1 -0
  178. package/dist/map/adapter/extensions/cognitive.js +158 -0
  179. package/dist/map/adapter/extensions/cognitive.js.map +1 -0
  180. package/dist/map/adapter/extensions/index.d.ts +95 -0
  181. package/dist/map/adapter/extensions/index.d.ts.map +1 -0
  182. package/dist/map/adapter/extensions/index.js +228 -0
  183. package/dist/map/adapter/extensions/index.js.map +1 -0
  184. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  185. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  186. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  187. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  188. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  189. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  190. package/dist/map/adapter/extensions/resume.js +59 -0
  191. package/dist/map/adapter/extensions/resume.js.map +1 -0
  192. package/dist/map/adapter/extensions/streams.d.ts +95 -0
  193. package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
  194. package/dist/map/adapter/extensions/streams.js +515 -0
  195. package/dist/map/adapter/extensions/streams.js.map +1 -0
  196. package/dist/map/adapter/extensions/task.d.ts +40 -0
  197. package/dist/map/adapter/extensions/task.d.ts.map +1 -0
  198. package/dist/map/adapter/extensions/task.js +197 -0
  199. package/dist/map/adapter/extensions/task.js.map +1 -0
  200. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  201. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  202. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  203. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  204. package/dist/map/adapter/extensions/wake.d.ts +60 -0
  205. package/dist/map/adapter/extensions/wake.d.ts.map +1 -0
  206. package/dist/map/adapter/extensions/wake.js +144 -0
  207. package/dist/map/adapter/extensions/wake.js.map +1 -0
  208. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  209. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  210. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  211. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  212. package/dist/map/adapter/extensions/workspace.d.ts +57 -0
  213. package/dist/map/adapter/extensions/workspace.d.ts.map +1 -0
  214. package/dist/map/adapter/extensions/workspace.js +81 -0
  215. package/dist/map/adapter/extensions/workspace.js.map +1 -0
  216. package/dist/map/adapter/index.d.ts +20 -0
  217. package/dist/map/adapter/index.d.ts.map +1 -0
  218. package/dist/map/adapter/index.js +40 -0
  219. package/dist/map/adapter/index.js.map +1 -0
  220. package/dist/map/adapter/interface.d.ts +450 -0
  221. package/dist/map/adapter/interface.d.ts.map +1 -0
  222. package/dist/map/adapter/interface.js +24 -0
  223. package/dist/map/adapter/interface.js.map +1 -0
  224. package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
  225. package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
  226. package/dist/map/adapter/mail-handler-adapter.js +292 -0
  227. package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
  228. package/dist/map/adapter/map-adapter.d.ts +200 -0
  229. package/dist/map/adapter/map-adapter.d.ts.map +1 -0
  230. package/dist/map/adapter/map-adapter.js +1199 -0
  231. package/dist/map/adapter/map-adapter.js.map +1 -0
  232. package/dist/map/adapter/rpc-handler.d.ts +263 -0
  233. package/dist/map/adapter/rpc-handler.d.ts.map +1 -0
  234. package/dist/map/adapter/rpc-handler.js +365 -0
  235. package/dist/map/adapter/rpc-handler.js.map +1 -0
  236. package/dist/map/adapter/subscription-manager.d.ts +174 -0
  237. package/dist/map/adapter/subscription-manager.d.ts.map +1 -0
  238. package/dist/map/adapter/subscription-manager.js +248 -0
  239. package/dist/map/adapter/subscription-manager.js.map +1 -0
  240. package/dist/map/adapter/types.d.ts +194 -0
  241. package/dist/map/adapter/types.d.ts.map +1 -0
  242. package/dist/map/adapter/types.js +27 -0
  243. package/dist/map/adapter/types.js.map +1 -0
  244. package/dist/map/adapter/websocket-integration.d.ts +113 -0
  245. package/dist/map/adapter/websocket-integration.d.ts.map +1 -0
  246. package/dist/map/adapter/websocket-integration.js +134 -0
  247. package/dist/map/adapter/websocket-integration.js.map +1 -0
  248. package/dist/map/cascade-action-handler.d.ts.map +1 -1
  249. package/dist/map/cascade-action-handler.js +19 -5
  250. package/dist/map/cascade-action-handler.js.map +1 -1
  251. package/dist/map/federation/envelope.d.ts +98 -0
  252. package/dist/map/federation/envelope.d.ts.map +1 -0
  253. package/dist/map/federation/envelope.js +160 -0
  254. package/dist/map/federation/envelope.js.map +1 -0
  255. package/dist/map/federation/federation-handler.d.ts +50 -0
  256. package/dist/map/federation/federation-handler.d.ts.map +1 -0
  257. package/dist/map/federation/federation-handler.js +306 -0
  258. package/dist/map/federation/federation-handler.js.map +1 -0
  259. package/dist/map/federation/index.d.ts +14 -0
  260. package/dist/map/federation/index.d.ts.map +1 -0
  261. package/dist/map/federation/index.js +13 -0
  262. package/dist/map/federation/index.js.map +1 -0
  263. package/dist/map/federation/types.d.ts +239 -0
  264. package/dist/map/federation/types.d.ts.map +1 -0
  265. package/dist/map/federation/types.js +23 -0
  266. package/dist/map/federation/types.js.map +1 -0
  267. package/dist/map/mail-bridge.d.ts +7 -0
  268. package/dist/map/mail-bridge.d.ts.map +1 -1
  269. package/dist/map/mail-bridge.js +39 -9
  270. package/dist/map/mail-bridge.js.map +1 -1
  271. package/dist/map/server.d.ts.map +1 -1
  272. package/dist/map/server.js +17 -2
  273. package/dist/map/server.js.map +1 -1
  274. package/dist/map/types.d.ts +6 -0
  275. package/dist/map/types.d.ts.map +1 -1
  276. package/dist/mcp/map-client.d.ts +39 -0
  277. package/dist/mcp/map-client.d.ts.map +1 -0
  278. package/dist/mcp/map-client.js +129 -0
  279. package/dist/mcp/map-client.js.map +1 -0
  280. package/dist/mcp/mcp-server.d.ts +72 -0
  281. package/dist/mcp/mcp-server.d.ts.map +1 -0
  282. package/dist/mcp/mcp-server.js +1027 -0
  283. package/dist/mcp/mcp-server.js.map +1 -0
  284. package/dist/mcp/tools/claim_task.d.ts +35 -0
  285. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  286. package/dist/mcp/tools/claim_task.js +58 -0
  287. package/dist/mcp/tools/claim_task.js.map +1 -0
  288. package/dist/mcp/tools/done-v2.d.ts +0 -1
  289. package/dist/mcp/tools/done-v2.d.ts.map +1 -1
  290. package/dist/mcp/tools/done-v2.js +0 -1
  291. package/dist/mcp/tools/done-v2.js.map +1 -1
  292. package/dist/mcp/tools/done.d.ts +102 -0
  293. package/dist/mcp/tools/done.d.ts.map +1 -0
  294. package/dist/mcp/tools/done.js +253 -0
  295. package/dist/mcp/tools/done.js.map +1 -0
  296. package/dist/mcp/tools/inject_context.d.ts +61 -0
  297. package/dist/mcp/tools/inject_context.d.ts.map +1 -0
  298. package/dist/mcp/tools/inject_context.js +123 -0
  299. package/dist/mcp/tools/inject_context.js.map +1 -0
  300. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  301. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  302. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  303. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  304. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  305. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  306. package/dist/mcp/tools/unclaim_task.js +47 -0
  307. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  308. package/dist/mcp/tools/wait_for_activity.d.ts +60 -0
  309. package/dist/mcp/tools/wait_for_activity.d.ts.map +1 -0
  310. package/dist/mcp/tools/wait_for_activity.js +135 -0
  311. package/dist/mcp/tools/wait_for_activity.js.map +1 -0
  312. package/dist/monitor/health-check-service.d.ts +143 -0
  313. package/dist/monitor/health-check-service.d.ts.map +1 -0
  314. package/dist/monitor/health-check-service.js +240 -0
  315. package/dist/monitor/health-check-service.js.map +1 -0
  316. package/dist/monitor/index.d.ts +14 -0
  317. package/dist/monitor/index.d.ts.map +1 -0
  318. package/dist/monitor/index.js +14 -0
  319. package/dist/monitor/index.js.map +1 -0
  320. package/dist/monitor/stall-detector.d.ts +109 -0
  321. package/dist/monitor/stall-detector.d.ts.map +1 -0
  322. package/dist/monitor/stall-detector.js +152 -0
  323. package/dist/monitor/stall-detector.js.map +1 -0
  324. package/dist/peer/capability-manager.d.ts +56 -0
  325. package/dist/peer/capability-manager.d.ts.map +1 -0
  326. package/dist/peer/capability-manager.js +186 -0
  327. package/dist/peer/capability-manager.js.map +1 -0
  328. package/dist/peer/encapsulation-manager.d.ts +190 -0
  329. package/dist/peer/encapsulation-manager.d.ts.map +1 -0
  330. package/dist/peer/encapsulation-manager.js +486 -0
  331. package/dist/peer/encapsulation-manager.js.map +1 -0
  332. package/dist/peer/federation-manager.d.ts +223 -0
  333. package/dist/peer/federation-manager.d.ts.map +1 -0
  334. package/dist/peer/federation-manager.js +528 -0
  335. package/dist/peer/federation-manager.js.map +1 -0
  336. package/dist/peer/hierarchy-errors.d.ts +208 -0
  337. package/dist/peer/hierarchy-errors.d.ts.map +1 -0
  338. package/dist/peer/hierarchy-errors.js +268 -0
  339. package/dist/peer/hierarchy-errors.js.map +1 -0
  340. package/dist/peer/hierarchy-protocol.d.ts +159 -0
  341. package/dist/peer/hierarchy-protocol.d.ts.map +1 -0
  342. package/dist/peer/hierarchy-protocol.js +142 -0
  343. package/dist/peer/hierarchy-protocol.js.map +1 -0
  344. package/dist/peer/index.d.ts +15 -0
  345. package/dist/peer/index.d.ts.map +1 -0
  346. package/dist/peer/index.js +15 -0
  347. package/dist/peer/index.js.map +1 -0
  348. package/dist/peer/peer-manager.d.ts +99 -0
  349. package/dist/peer/peer-manager.d.ts.map +1 -0
  350. package/dist/peer/peer-manager.js +333 -0
  351. package/dist/peer/peer-manager.js.map +1 -0
  352. package/dist/peer/task-delegation.d.ts +189 -0
  353. package/dist/peer/task-delegation.d.ts.map +1 -0
  354. package/dist/peer/task-delegation.js +303 -0
  355. package/dist/peer/task-delegation.js.map +1 -0
  356. package/dist/peer/transports/index.d.ts +8 -0
  357. package/dist/peer/transports/index.d.ts.map +1 -0
  358. package/dist/peer/transports/index.js +8 -0
  359. package/dist/peer/transports/index.js.map +1 -0
  360. package/dist/peer/transports/local-transport.d.ts +56 -0
  361. package/dist/peer/transports/local-transport.d.ts.map +1 -0
  362. package/dist/peer/transports/local-transport.js +263 -0
  363. package/dist/peer/transports/local-transport.js.map +1 -0
  364. package/dist/peer/transports/websocket-transport.d.ts +86 -0
  365. package/dist/peer/transports/websocket-transport.d.ts.map +1 -0
  366. package/dist/peer/transports/websocket-transport.js +338 -0
  367. package/dist/peer/transports/websocket-transport.js.map +1 -0
  368. package/dist/peer/types.d.ts +268 -0
  369. package/dist/peer/types.d.ts.map +1 -0
  370. package/dist/peer/types.js +36 -0
  371. package/dist/peer/types.js.map +1 -0
  372. package/dist/router/address-resolver.d.ts +102 -0
  373. package/dist/router/address-resolver.d.ts.map +1 -0
  374. package/dist/router/address-resolver.js +198 -0
  375. package/dist/router/address-resolver.js.map +1 -0
  376. package/dist/router/broadcast.d.ts +53 -0
  377. package/dist/router/broadcast.d.ts.map +1 -0
  378. package/dist/router/broadcast.js +75 -0
  379. package/dist/router/broadcast.js.map +1 -0
  380. package/dist/router/channels.d.ts +148 -0
  381. package/dist/router/channels.d.ts.map +1 -0
  382. package/dist/router/channels.js +126 -0
  383. package/dist/router/channels.js.map +1 -0
  384. package/dist/router/index.d.ts +21 -0
  385. package/dist/router/index.d.ts.map +1 -0
  386. package/dist/router/index.js +18 -0
  387. package/dist/router/index.js.map +1 -0
  388. package/dist/router/message-router.d.ts +197 -0
  389. package/dist/router/message-router.d.ts.map +1 -0
  390. package/dist/router/message-router.js +903 -0
  391. package/dist/router/message-router.js.map +1 -0
  392. package/dist/router/message-types.d.ts +183 -0
  393. package/dist/router/message-types.d.ts.map +1 -0
  394. package/dist/router/message-types.js +79 -0
  395. package/dist/router/message-types.js.map +1 -0
  396. package/dist/router/role-resolver.d.ts +67 -0
  397. package/dist/router/role-resolver.d.ts.map +1 -0
  398. package/dist/router/role-resolver.js +106 -0
  399. package/dist/router/role-resolver.js.map +1 -0
  400. package/dist/router/signals.d.ts +253 -0
  401. package/dist/router/signals.d.ts.map +1 -0
  402. package/dist/router/signals.js +53 -0
  403. package/dist/router/signals.js.map +1 -0
  404. package/dist/router/types.d.ts +191 -0
  405. package/dist/router/types.d.ts.map +1 -0
  406. package/dist/router/types.js +34 -0
  407. package/dist/router/types.js.map +1 -0
  408. package/dist/router/wake.d.ts +111 -0
  409. package/dist/router/wake.d.ts.map +1 -0
  410. package/dist/router/wake.js +180 -0
  411. package/dist/router/wake.js.map +1 -0
  412. package/dist/server/combined-server.d.ts +95 -0
  413. package/dist/server/combined-server.d.ts.map +1 -0
  414. package/dist/server/combined-server.js +335 -0
  415. package/dist/server/combined-server.js.map +1 -0
  416. package/dist/steering/index.d.ts +11 -0
  417. package/dist/steering/index.d.ts.map +1 -0
  418. package/dist/steering/index.js +11 -0
  419. package/dist/steering/index.js.map +1 -0
  420. package/dist/steering/inject.d.ts +39 -0
  421. package/dist/steering/inject.d.ts.map +1 -0
  422. package/dist/steering/inject.js +197 -0
  423. package/dist/steering/inject.js.map +1 -0
  424. package/dist/steering/types.d.ts +100 -0
  425. package/dist/steering/types.d.ts.map +1 -0
  426. package/dist/steering/types.js +11 -0
  427. package/dist/steering/types.js.map +1 -0
  428. package/dist/store/backends/index.d.ts +11 -0
  429. package/dist/store/backends/index.d.ts.map +1 -0
  430. package/dist/store/backends/index.js +15 -0
  431. package/dist/store/backends/index.js.map +1 -0
  432. package/dist/store/backends/json-backend.d.ts +23 -0
  433. package/dist/store/backends/json-backend.d.ts.map +1 -0
  434. package/dist/store/backends/json-backend.js +220 -0
  435. package/dist/store/backends/json-backend.js.map +1 -0
  436. package/dist/store/backends/memory-backend.d.ts +12 -0
  437. package/dist/store/backends/memory-backend.d.ts.map +1 -0
  438. package/dist/store/backends/memory-backend.js +205 -0
  439. package/dist/store/backends/memory-backend.js.map +1 -0
  440. package/dist/store/backends/sqlite-backend.d.ts +27 -0
  441. package/dist/store/backends/sqlite-backend.d.ts.map +1 -0
  442. package/dist/store/backends/sqlite-backend.js +231 -0
  443. package/dist/store/backends/sqlite-backend.js.map +1 -0
  444. package/dist/store/backends/tinybase-backend.d.ts +22 -0
  445. package/dist/store/backends/tinybase-backend.d.ts.map +1 -0
  446. package/dist/store/backends/tinybase-backend.js +203 -0
  447. package/dist/store/backends/tinybase-backend.js.map +1 -0
  448. package/dist/store/backends/types.d.ts +175 -0
  449. package/dist/store/backends/types.d.ts.map +1 -0
  450. package/dist/store/backends/types.js +28 -0
  451. package/dist/store/backends/types.js.map +1 -0
  452. package/dist/store/event-store.d.ts +128 -0
  453. package/dist/store/event-store.d.ts.map +1 -0
  454. package/dist/store/event-store.js +1751 -0
  455. package/dist/store/event-store.js.map +1 -0
  456. package/dist/store/instance.d.ts +290 -0
  457. package/dist/store/instance.d.ts.map +1 -0
  458. package/dist/store/instance.js +363 -0
  459. package/dist/store/instance.js.map +1 -0
  460. package/dist/store/migrations.d.ts +41 -0
  461. package/dist/store/migrations.d.ts.map +1 -0
  462. package/dist/store/migrations.js +79 -0
  463. package/dist/store/migrations.js.map +1 -0
  464. package/dist/store/test-utils.d.ts +63 -0
  465. package/dist/store/test-utils.d.ts.map +1 -0
  466. package/dist/store/test-utils.js +63 -0
  467. package/dist/store/test-utils.js.map +1 -0
  468. package/dist/store/types/config.d.ts +16 -0
  469. package/dist/store/types/config.d.ts.map +1 -0
  470. package/dist/store/types/config.js +8 -0
  471. package/dist/store/types/config.js.map +1 -0
  472. package/dist/store/types/conversations.d.ts +91 -0
  473. package/dist/store/types/conversations.d.ts.map +1 -0
  474. package/dist/store/types/conversations.js +8 -0
  475. package/dist/store/types/conversations.js.map +1 -0
  476. package/dist/store/types/sessions.d.ts +44 -0
  477. package/dist/store/types/sessions.d.ts.map +1 -0
  478. package/dist/store/types/sessions.js +9 -0
  479. package/dist/store/types/sessions.js.map +1 -0
  480. package/dist/store/types.d.ts +115 -0
  481. package/dist/store/types.d.ts.map +1 -0
  482. package/dist/store/types.js +6 -0
  483. package/dist/store/types.js.map +1 -0
  484. package/dist/task/backend/index.d.ts +93 -0
  485. package/dist/task/backend/index.d.ts.map +1 -0
  486. package/dist/task/backend/index.js +178 -0
  487. package/dist/task/backend/index.js.map +1 -0
  488. package/dist/task/backend/memory.d.ts +70 -0
  489. package/dist/task/backend/memory.d.ts.map +1 -0
  490. package/dist/task/backend/memory.js +621 -0
  491. package/dist/task/backend/memory.js.map +1 -0
  492. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  493. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  494. package/dist/task/backend/opentasks/backend.js +1023 -0
  495. package/dist/task/backend/opentasks/backend.js.map +1 -0
  496. package/dist/task/backend/opentasks/client.d.ts +337 -0
  497. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  498. package/dist/task/backend/opentasks/client.js +225 -0
  499. package/dist/task/backend/opentasks/client.js.map +1 -0
  500. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  501. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  502. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  503. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  504. package/dist/task/backend/opentasks/index.d.ts +21 -0
  505. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  506. package/dist/task/backend/opentasks/index.js +21 -0
  507. package/dist/task/backend/opentasks/index.js.map +1 -0
  508. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  509. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  510. package/dist/task/backend/opentasks/mapping.js +77 -0
  511. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  512. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts +54 -0
  513. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts.map +1 -0
  514. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js +88 -0
  515. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js.map +1 -0
  516. package/dist/task/backend/sudocode/backend.d.ts +155 -0
  517. package/dist/task/backend/sudocode/backend.d.ts.map +1 -0
  518. package/dist/task/backend/sudocode/backend.js +942 -0
  519. package/dist/task/backend/sudocode/backend.js.map +1 -0
  520. package/dist/task/backend/sudocode/client.d.ts +303 -0
  521. package/dist/task/backend/sudocode/client.d.ts.map +1 -0
  522. package/dist/task/backend/sudocode/client.js +101 -0
  523. package/dist/task/backend/sudocode/client.js.map +1 -0
  524. package/dist/task/backend/sudocode/index.d.ts +19 -0
  525. package/dist/task/backend/sudocode/index.d.ts.map +1 -0
  526. package/dist/task/backend/sudocode/index.js +17 -0
  527. package/dist/task/backend/sudocode/index.js.map +1 -0
  528. package/dist/task/backend/sudocode/mapping.d.ts +51 -0
  529. package/dist/task/backend/sudocode/mapping.d.ts.map +1 -0
  530. package/dist/task/backend/sudocode/mapping.js +86 -0
  531. package/dist/task/backend/sudocode/mapping.js.map +1 -0
  532. package/dist/task/backend/sudocode/server-client.d.ts +56 -0
  533. package/dist/task/backend/sudocode/server-client.d.ts.map +1 -0
  534. package/dist/task/backend/sudocode/server-client.js +367 -0
  535. package/dist/task/backend/sudocode/server-client.js.map +1 -0
  536. package/dist/task/backend/sudocode/standalone-client.d.ts +91 -0
  537. package/dist/task/backend/sudocode/standalone-client.d.ts.map +1 -0
  538. package/dist/task/backend/sudocode/standalone-client.js +476 -0
  539. package/dist/task/backend/sudocode/standalone-client.js.map +1 -0
  540. package/dist/task/backend/sudocode/sync-policy.d.ts +166 -0
  541. package/dist/task/backend/sudocode/sync-policy.d.ts.map +1 -0
  542. package/dist/task/backend/sudocode/sync-policy.js +221 -0
  543. package/dist/task/backend/sudocode/sync-policy.js.map +1 -0
  544. package/dist/task/backend/sudocode/tools.d.ts +87 -0
  545. package/dist/task/backend/sudocode/tools.d.ts.map +1 -0
  546. package/dist/task/backend/sudocode/tools.js +743 -0
  547. package/dist/task/backend/sudocode/tools.js.map +1 -0
  548. package/dist/task/backend/tool-provider.d.ts +56 -0
  549. package/dist/task/backend/tool-provider.d.ts.map +1 -0
  550. package/dist/task/backend/tool-provider.js +424 -0
  551. package/dist/task/backend/tool-provider.js.map +1 -0
  552. package/dist/task/backend/types.d.ts +297 -0
  553. package/dist/task/backend/types.d.ts.map +1 -0
  554. package/dist/task/backend/types.js +27 -0
  555. package/dist/task/backend/types.js.map +1 -0
  556. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  557. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  558. package/dist/task/backend/unified-tool-provider.js +623 -0
  559. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  560. package/dist/task/index.d.ts +7 -0
  561. package/dist/task/index.d.ts.map +1 -0
  562. package/dist/task/index.js +7 -0
  563. package/dist/task/index.js.map +1 -0
  564. package/dist/task/retry-policy.d.ts +89 -0
  565. package/dist/task/retry-policy.d.ts.map +1 -0
  566. package/dist/task/retry-policy.js +160 -0
  567. package/dist/task/retry-policy.js.map +1 -0
  568. package/dist/task/task-manager.d.ts +70 -0
  569. package/dist/task/task-manager.d.ts.map +1 -0
  570. package/dist/task/task-manager.js +319 -0
  571. package/dist/task/task-manager.js.map +1 -0
  572. package/dist/task/types.d.ts +72 -0
  573. package/dist/task/types.d.ts.map +1 -0
  574. package/dist/task/types.js +33 -0
  575. package/dist/task/types.js.map +1 -0
  576. package/dist/teams/team-loader.d.ts +2 -1
  577. package/dist/teams/team-loader.d.ts.map +1 -1
  578. package/dist/teams/team-loader.js +2 -1
  579. package/dist/teams/team-loader.js.map +1 -1
  580. package/dist/teams/team-manager.d.ts +101 -0
  581. package/dist/teams/team-manager.d.ts.map +1 -0
  582. package/dist/teams/team-manager.js +260 -0
  583. package/dist/teams/team-manager.js.map +1 -0
  584. package/dist/teams/team-runtime-v2.d.ts +0 -3
  585. package/dist/teams/team-runtime-v2.d.ts.map +1 -1
  586. package/dist/teams/team-runtime-v2.js +31 -93
  587. package/dist/teams/team-runtime-v2.js.map +1 -1
  588. package/dist/teams/team-runtime.d.ts +245 -0
  589. package/dist/teams/team-runtime.d.ts.map +1 -0
  590. package/dist/teams/team-runtime.js +1023 -0
  591. package/dist/teams/team-runtime.js.map +1 -0
  592. package/dist/trigger/router/index.d.ts +11 -0
  593. package/dist/trigger/router/index.d.ts.map +1 -0
  594. package/dist/trigger/router/index.js +10 -0
  595. package/dist/trigger/router/index.js.map +1 -0
  596. package/dist/trigger/router/strategies/ai-router-strategy.d.ts +34 -0
  597. package/dist/trigger/router/strategies/ai-router-strategy.d.ts.map +1 -0
  598. package/dist/trigger/router/strategies/ai-router-strategy.js +359 -0
  599. package/dist/trigger/router/strategies/ai-router-strategy.js.map +1 -0
  600. package/dist/trigger/router/strategies/direct-strategy.d.ts +32 -0
  601. package/dist/trigger/router/strategies/direct-strategy.d.ts.map +1 -0
  602. package/dist/trigger/router/strategies/direct-strategy.js +119 -0
  603. package/dist/trigger/router/strategies/direct-strategy.js.map +1 -0
  604. package/dist/trigger/router/strategies/index.d.ts +11 -0
  605. package/dist/trigger/router/strategies/index.d.ts.map +1 -0
  606. package/dist/trigger/router/strategies/index.js +11 -0
  607. package/dist/trigger/router/strategies/index.js.map +1 -0
  608. package/dist/trigger/router/strategies/role-strategy.d.ts +39 -0
  609. package/dist/trigger/router/strategies/role-strategy.d.ts.map +1 -0
  610. package/dist/trigger/router/strategies/role-strategy.js +207 -0
  611. package/dist/trigger/router/strategies/role-strategy.js.map +1 -0
  612. package/dist/trigger/router/trigger-router.d.ts +54 -0
  613. package/dist/trigger/router/trigger-router.d.ts.map +1 -0
  614. package/dist/trigger/router/trigger-router.js +362 -0
  615. package/dist/trigger/router/trigger-router.js.map +1 -0
  616. package/dist/trigger/router/types.d.ts +225 -0
  617. package/dist/trigger/router/types.d.ts.map +1 -0
  618. package/dist/trigger/router/types.js +10 -0
  619. package/dist/trigger/router/types.js.map +1 -0
  620. package/dist/trigger/sources/cron/cron-service.d.ts.map +1 -1
  621. package/dist/trigger/sources/cron/cron-service.js +6 -3
  622. package/dist/trigger/sources/cron/cron-service.js.map +1 -1
  623. package/dist/trigger/trigger-system.d.ts +77 -0
  624. package/dist/trigger/trigger-system.d.ts.map +1 -0
  625. package/dist/trigger/trigger-system.js +84 -0
  626. package/dist/trigger/trigger-system.js.map +1 -0
  627. package/dist/util/git-safety.d.ts +33 -0
  628. package/dist/util/git-safety.d.ts.map +1 -0
  629. package/dist/util/git-safety.js +94 -0
  630. package/dist/util/git-safety.js.map +1 -0
  631. package/dist/workspace/index.d.ts +0 -1
  632. package/dist/workspace/index.d.ts.map +1 -1
  633. package/dist/workspace/index.js +0 -2
  634. package/dist/workspace/index.js.map +1 -1
  635. package/dist/workspace/landing/direct-push.d.ts.map +1 -1
  636. package/dist/workspace/landing/direct-push.js +22 -7
  637. package/dist/workspace/landing/direct-push.js.map +1 -1
  638. package/dist/workspace/landing/queue-to-branch.d.ts.map +1 -1
  639. package/dist/workspace/landing/queue-to-branch.js +1 -3
  640. package/dist/workspace/landing/queue-to-branch.js.map +1 -1
  641. package/dist/workspace/types.d.ts +0 -13
  642. package/dist/workspace/types.d.ts.map +1 -1
  643. package/dist/workspace/workspace-manager.d.ts +0 -11
  644. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  645. package/dist/workspace/workspace-manager.js +0 -30
  646. package/dist/workspace/workspace-manager.js.map +1 -1
  647. package/package.json +28 -2
  648. package/templates/teams/self-driving/prompts/grinder.md +1 -0
  649. package/templates/teams/self-driving/prompts/judge.md +1 -0
  650. package/templates/teams/self-driving/prompts/planner.md +1 -0
  651. package/templates/teams/self-driving/roles/grinder.yaml +15 -0
  652. package/templates/teams/self-driving/roles/judge.yaml +10 -0
  653. package/templates/teams/self-driving/roles/planner.yaml +16 -0
  654. package/.claude/commands/openspec/apply.md +0 -23
  655. package/.claude/commands/openspec/archive.md +0 -27
  656. package/.claude/commands/openspec/proposal.md +0 -28
  657. package/.claude/settings.json +0 -133
  658. package/.gitattributes +0 -3
  659. package/.opentasks/config.json +0 -9
  660. package/.opentasks/graph.jsonl +0 -0
  661. package/.sessionlog/settings.json +0 -4
  662. package/.sudocode/issues.jsonl +0 -183
  663. package/.sudocode/specs.jsonl +0 -56
  664. package/AGENTS.md +0 -18
  665. package/CLAUDE.md +0 -923
  666. package/docs/architecture.md +0 -508
  667. package/docs/configuration.md +0 -323
  668. package/docs/conflict-recovery.md +0 -472
  669. package/docs/design/task-dispatcher.md +0 -880
  670. package/docs/design-subsystem-extraction.md +0 -627
  671. package/docs/git-cascade-integration-gaps.md +0 -678
  672. package/docs/implementation-details.md +0 -1127
  673. package/docs/implementation-summary.md +0 -448
  674. package/docs/lifecycle-events-design.md +0 -111
  675. package/docs/mail-integration.md +0 -608
  676. package/docs/openhive-capability-summary.md +0 -415
  677. package/docs/openhive-integration.md +0 -415
  678. package/docs/plan-self-driving-support.md +0 -433
  679. package/docs/roadmap-v2-gaps.md +0 -216
  680. package/docs/spec-self-driving-support.md +0 -462
  681. package/docs/team-templates.md +0 -860
  682. package/docs/teams.md +0 -306
  683. package/docs/trigger-system-design.md +0 -333
  684. package/docs/troubleshooting.md +0 -489
  685. package/docs/workspace-interfaces.md +0 -731
  686. package/docs/workspace-redesign-plan.md +0 -302
  687. package/examples/distributed-peer-communication.ts +0 -202
  688. package/examples/local-peer-communication.ts +0 -165
  689. package/index.js +0 -2
  690. package/mvp_docs/agent-execution-system.md +0 -347
  691. package/mvp_docs/agent-interface.md +0 -580
  692. package/mvp_docs/data-structures.md +0 -701
  693. package/mvp_docs/dynamic-meta-orchestration.md +0 -116
  694. package/mvp_docs/multi-agent-interaction-design.md +0 -779
  695. package/mvp_docs/mvp-implementation-plan.md +0 -1148
  696. package/renovate.json5 +0 -6
  697. package/scripts/test-acp-integration.ts +0 -422
  698. package/src/__tests__/boot-v2.test.ts +0 -631
  699. package/src/__tests__/e2e/acp-over-map-live.e2e.test.ts +0 -496
  700. package/src/__tests__/e2e/acp-over-map.e2e.test.ts +0 -457
  701. package/src/__tests__/e2e/agent-lifecycle.e2e.test.ts +0 -770
  702. package/src/__tests__/e2e/auto-sync.e2e.test.ts +0 -257
  703. package/src/__tests__/e2e/bootstrap.e2e.test.ts +0 -319
  704. package/src/__tests__/e2e/cascade-rebase.e2e.test.ts +0 -254
  705. package/src/__tests__/e2e/cc-swarm-bridge.e2e.test.ts +0 -253
  706. package/src/__tests__/e2e/cli-run.e2e.test.ts +0 -167
  707. package/src/__tests__/e2e/cognitive-workspace.e2e.test.ts +0 -282
  708. package/src/__tests__/e2e/dispatch-coordination.e2e.test.ts +0 -495
  709. package/src/__tests__/e2e/dispatch-live.e2e.test.ts +0 -564
  710. package/src/__tests__/e2e/dispatch-opentasks.e2e.test.ts +0 -496
  711. package/src/__tests__/e2e/dispatch-phase2-live.e2e.test.ts +0 -456
  712. package/src/__tests__/e2e/dispatch-phase2.e2e.test.ts +0 -386
  713. package/src/__tests__/e2e/dispatch.e2e.test.ts +0 -376
  714. package/src/__tests__/e2e/done-scenarios.e2e.test.ts +0 -322
  715. package/src/__tests__/e2e/live-agent.e2e.test.ts +0 -1330
  716. package/src/__tests__/e2e/map-server.e2e.test.ts +0 -128
  717. package/src/__tests__/e2e/map-sidecar.e2e.test.ts +0 -139
  718. package/src/__tests__/e2e/opentasks-integration.e2e.test.ts +0 -280
  719. package/src/__tests__/e2e/pull-mode.e2e.test.ts +0 -632
  720. package/src/__tests__/e2e/resume-continue.e2e.test.ts +0 -312
  721. package/src/__tests__/e2e/self-driving-v3.e2e.test.ts +0 -197
  722. package/src/__tests__/e2e/spawn-resolver.e2e.test.ts +0 -200
  723. package/src/__tests__/e2e/swarmkit-integration.e2e.test.ts +0 -562
  724. package/src/__tests__/e2e/swarmkit-live.e2e.test.ts +0 -1049
  725. package/src/__tests__/e2e/trajectory-tracking.e2e.test.ts +0 -258
  726. package/src/__tests__/e2e/trigger-wake.e2e.test.ts +0 -257
  727. package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +0 -383
  728. package/src/__tests__/e2e/workspace-v3.e2e.test.ts +0 -413
  729. package/src/acp/__tests__/claude-code-replay.test.ts +0 -225
  730. package/src/acp/__tests__/macro-agent.test.ts +0 -387
  731. package/src/acp/__tests__/session-mapper.test.ts +0 -152
  732. package/src/acp/__tests__/websocket-server.test.ts +0 -194
  733. package/src/acp/claude-code-replay.ts +0 -208
  734. package/src/acp/index.ts +0 -32
  735. package/src/acp/macro-agent.ts +0 -995
  736. package/src/acp/map-bridge.ts +0 -193
  737. package/src/acp/session-mapper.ts +0 -116
  738. package/src/acp/types.ts +0 -99
  739. package/src/acp/websocket-server.ts +0 -213
  740. package/src/adapters/__tests__/federation.test.ts +0 -256
  741. package/src/adapters/__tests__/inbox-adapter.test.ts +0 -316
  742. package/src/adapters/__tests__/tasks-adapter.test.ts +0 -270
  743. package/src/adapters/federation.ts +0 -185
  744. package/src/adapters/inbox-adapter.ts +0 -292
  745. package/src/adapters/inbox-client-adapter.ts +0 -173
  746. package/src/adapters/index.ts +0 -44
  747. package/src/adapters/opentasks-daemon.ts +0 -252
  748. package/src/adapters/tasks-adapter.ts +0 -330
  749. package/src/adapters/types.ts +0 -286
  750. package/src/agent/__tests__/agent-manager-topology.test.ts +0 -73
  751. package/src/agent/__tests__/agent-manager-v2.permission-interception.test.ts +0 -296
  752. package/src/agent/__tests__/agent-manager-v2.permissions.test.ts +0 -233
  753. package/src/agent/__tests__/agent-manager-v2.test.ts +0 -614
  754. package/src/agent/__tests__/agent-store.test.ts +0 -465
  755. package/src/agent/__tests__/task-ref-resolution.test.ts +0 -231
  756. package/src/agent/agent-manager-v2.ts +0 -2021
  757. package/src/agent/agent-manager.ts +0 -386
  758. package/src/agent/agent-store.ts +0 -409
  759. package/src/agent/index.ts +0 -7
  760. package/src/agent/prompts/coordinator-signals.ts +0 -115
  761. package/src/agent/prompts/index.ts +0 -7
  762. package/src/agent/system-prompt.ts +0 -298
  763. package/src/agent/types.ts +0 -459
  764. package/src/agent-detection/__tests__/command-builder.test.ts +0 -336
  765. package/src/agent-detection/__tests__/detector.test.ts +0 -768
  766. package/src/agent-detection/__tests__/registry.test.ts +0 -254
  767. package/src/agent-detection/command-builder.ts +0 -90
  768. package/src/agent-detection/detector.ts +0 -307
  769. package/src/agent-detection/index.ts +0 -36
  770. package/src/agent-detection/registry.ts +0 -200
  771. package/src/agent-detection/types.ts +0 -184
  772. package/src/api/__tests__/server.test.ts +0 -292
  773. package/src/api/index.ts +0 -8
  774. package/src/api/server.ts +0 -380
  775. package/src/api/types.ts +0 -39
  776. package/src/auth/__tests__/token.test.ts +0 -100
  777. package/src/auth/index.ts +0 -1
  778. package/src/auth/token.ts +0 -82
  779. package/src/boot-v2.ts +0 -1343
  780. package/src/cli/__tests__/stable-instance-id.test.ts +0 -57
  781. package/src/cli/acp.ts +0 -101
  782. package/src/cli/inbox-mcp-proxy.ts +0 -56
  783. package/src/cli/index.ts +0 -566
  784. package/src/cli/mcp.ts +0 -305
  785. package/src/cli/parse-args.ts +0 -54
  786. package/src/cli/stable-instance-id.ts +0 -14
  787. package/src/cognitive/__tests__/macro-agent-backend.test.ts +0 -520
  788. package/src/cognitive/__tests__/session-converter.test.ts +0 -423
  789. package/src/cognitive/__tests__/workspace-handler.test.ts +0 -221
  790. package/src/cognitive/analyst-role.ts +0 -59
  791. package/src/cognitive/index.ts +0 -49
  792. package/src/cognitive/macro-agent-backend.ts +0 -370
  793. package/src/cognitive/session-converter.ts +0 -151
  794. package/src/cognitive/types.ts +0 -163
  795. package/src/cognitive/workspace-handler.ts +0 -163
  796. package/src/config/index.ts +0 -9
  797. package/src/config/project-config.ts +0 -294
  798. package/src/control/__tests__/control-resilience.test.ts +0 -251
  799. package/src/control/__tests__/control-socket.test.ts +0 -240
  800. package/src/control/control-client.ts +0 -337
  801. package/src/control/control-server.ts +0 -298
  802. package/src/control/index.ts +0 -17
  803. package/src/control/types.ts +0 -95
  804. package/src/dispatch/CLAUDE.md +0 -129
  805. package/src/dispatch/__tests__/loadout-translation.test.ts +0 -141
  806. package/src/dispatch/__tests__/mail-inbound-consumer.integration.test.ts +0 -519
  807. package/src/dispatch/__tests__/mail-inbound-consumer.test.ts +0 -800
  808. package/src/dispatch/__tests__/mail-inbound-reuse-consumer.test.ts +0 -575
  809. package/src/dispatch/__tests__/permission-evaluator.test.ts +0 -196
  810. package/src/dispatch/__tests__/permission-overlay.test.ts +0 -56
  811. package/src/dispatch/__tests__/permissions-handler.test.ts +0 -168
  812. package/src/dispatch/__tests__/spawn-agent-handler.test.ts +0 -282
  813. package/src/dispatch/loadout-translation.ts +0 -138
  814. package/src/dispatch/mail-inbound-consumer.ts +0 -560
  815. package/src/dispatch/mail-inbound-reuse-consumer.ts +0 -479
  816. package/src/dispatch/permission-evaluator.ts +0 -191
  817. package/src/dispatch/permission-overlay.ts +0 -89
  818. package/src/dispatch/permissions-handler.ts +0 -112
  819. package/src/dispatch/spawn-agent-handler.ts +0 -160
  820. package/src/index.ts +0 -115
  821. package/src/integrations/__tests__/context-builder.test.ts +0 -218
  822. package/src/integrations/__tests__/sessionlog.test.ts +0 -498
  823. package/src/integrations/__tests__/skilltree.test.ts +0 -136
  824. package/src/integrations/context-builder.ts +0 -280
  825. package/src/integrations/sessionlog.ts +0 -194
  826. package/src/integrations/skilltree.ts +0 -184
  827. package/src/lifecycle/__tests__/cascade-consolidation.test.ts +0 -240
  828. package/src/lifecycle/__tests__/handlers-v2.test.ts +0 -565
  829. package/src/lifecycle/cascade.ts +0 -335
  830. package/src/lifecycle/cleanup.ts +0 -373
  831. package/src/lifecycle/handlers-v2.ts +0 -508
  832. package/src/lifecycle/index.ts +0 -76
  833. package/src/lifecycle/types.ts +0 -260
  834. package/src/map/__tests__/cascade-bridge.test.ts +0 -229
  835. package/src/map/__tests__/cascade-diff-server.test.ts +0 -434
  836. package/src/map/__tests__/emit-event.test.ts +0 -71
  837. package/src/map/__tests__/lifecycle-bridge.test.ts +0 -430
  838. package/src/map/__tests__/mail-bridge.test.ts +0 -284
  839. package/src/map/__tests__/permission-forwarding.test.ts +0 -143
  840. package/src/map/__tests__/sidecar-diff-install-smoke.test.ts +0 -90
  841. package/src/map/__tests__/sidecar-integration.test.ts +0 -190
  842. package/src/map/__tests__/task-bridge.test.ts +0 -153
  843. package/src/map/__tests__/trajectory-reporter.test.ts +0 -173
  844. package/src/map/acp-bridge.ts +0 -293
  845. package/src/map/cascade-action-handler.ts +0 -205
  846. package/src/map/cascade-bridge.ts +0 -339
  847. package/src/map/cascade-diff-server.ts +0 -404
  848. package/src/map/cc-swarm-hooks.ts +0 -242
  849. package/src/map/coordination-handler.ts +0 -232
  850. package/src/map/index.ts +0 -18
  851. package/src/map/lifecycle-bridge.ts +0 -236
  852. package/src/map/mail-bridge.ts +0 -215
  853. package/src/map/repo-workspace.ts +0 -82
  854. package/src/map/server.ts +0 -758
  855. package/src/map/sidecar.ts +0 -826
  856. package/src/map/task-bridge.ts +0 -89
  857. package/src/map/trajectory-reporter.ts +0 -124
  858. package/src/map/types.ts +0 -304
  859. package/src/mcp/__tests__/mcp-server-v2.test.ts +0 -236
  860. package/src/mcp/index.ts +0 -6
  861. package/src/mcp/mcp-server-v2.ts +0 -485
  862. package/src/mcp/tools/done-v2.ts +0 -213
  863. package/src/mcp/types.ts +0 -432
  864. package/src/metrics/__tests__/metrics.test.ts +0 -205
  865. package/src/metrics/index.ts +0 -13
  866. package/src/metrics/metrics.ts +0 -151
  867. package/src/metrics/types.ts +0 -63
  868. package/src/roles/__tests__/config-loader.test.ts +0 -540
  869. package/src/roles/builtin/coordinator.ts +0 -75
  870. package/src/roles/builtin/generic.ts +0 -39
  871. package/src/roles/builtin/index.ts +0 -51
  872. package/src/roles/builtin/integrator.ts +0 -62
  873. package/src/roles/builtin/monitor.ts +0 -65
  874. package/src/roles/builtin/worker.ts +0 -134
  875. package/src/roles/capabilities.ts +0 -257
  876. package/src/roles/config-loader.ts +0 -405
  877. package/src/roles/index.ts +0 -141
  878. package/src/roles/registry.ts +0 -713
  879. package/src/roles/types.ts +0 -344
  880. package/src/store/index.ts +0 -8
  881. package/src/store/types/agents.ts +0 -69
  882. package/src/store/types/events.ts +0 -91
  883. package/src/store/types/index.ts +0 -9
  884. package/src/store/types/messages.ts +0 -32
  885. package/src/store/types/primitives.ts +0 -9
  886. package/src/store/types/tasks.ts +0 -124
  887. package/src/teams/__tests__/team-manager-v2.test.ts +0 -425
  888. package/src/teams/__tests__/team-runtime-v2.test.ts +0 -402
  889. package/src/teams/index.ts +0 -29
  890. package/src/teams/seed-defaults.ts +0 -83
  891. package/src/teams/team-loader.ts +0 -476
  892. package/src/teams/team-manager-v2.ts +0 -343
  893. package/src/teams/team-runtime-v2.ts +0 -920
  894. package/src/teams/types.ts +0 -276
  895. package/src/trigger/__tests__/cron-service.test.ts +0 -548
  896. package/src/trigger/__tests__/scheduler.test.ts +0 -371
  897. package/src/trigger/__tests__/system-event-queue.test.ts +0 -147
  898. package/src/trigger/__tests__/trigger-system-v2.test.ts +0 -257
  899. package/src/trigger/__tests__/wake-manager.test.ts +0 -356
  900. package/src/trigger/__tests__/webhook-handler.test.ts +0 -567
  901. package/src/trigger/index.ts +0 -110
  902. package/src/trigger/queue/index.ts +0 -21
  903. package/src/trigger/queue/system-event-queue.ts +0 -232
  904. package/src/trigger/queue/types.ts +0 -149
  905. package/src/trigger/sources/cron/cron-service.ts +0 -499
  906. package/src/trigger/sources/cron/index.ts +0 -41
  907. package/src/trigger/sources/cron/scheduler.ts +0 -344
  908. package/src/trigger/sources/cron/types.ts +0 -333
  909. package/src/trigger/sources/index.ts +0 -10
  910. package/src/trigger/sources/webhook/index.ts +0 -25
  911. package/src/trigger/sources/webhook/types.ts +0 -205
  912. package/src/trigger/sources/webhook/webhook-handler.ts +0 -410
  913. package/src/trigger/strategies/ai-router.ts +0 -170
  914. package/src/trigger/trigger-system-v2.ts +0 -536
  915. package/src/trigger/types.ts +0 -228
  916. package/src/trigger/wake/index.ts +0 -22
  917. package/src/trigger/wake/types.ts +0 -162
  918. package/src/trigger/wake/wake-manager.ts +0 -390
  919. package/src/workspace/__tests__/git-cascade-adapter.test.ts +0 -563
  920. package/src/workspace/__tests__/land-dispatch.test.ts +0 -214
  921. package/src/workspace/__tests__/self-driving-yaml.test.ts +0 -122
  922. package/src/workspace/__tests__/shared-worktree-refcount.test.ts +0 -154
  923. package/src/workspace/__tests__/standalone-mode.test.ts +0 -118
  924. package/src/workspace/__tests__/workspace-manager-v3.test.ts +0 -245
  925. package/src/workspace/__tests__/yaml-schema.test.ts +0 -210
  926. package/src/workspace/config.ts +0 -165
  927. package/src/workspace/git-cascade-adapter.ts +0 -1213
  928. package/src/workspace/index.ts +0 -110
  929. package/src/workspace/landing/__tests__/strategies.test.ts +0 -184
  930. package/src/workspace/landing/direct-push.ts +0 -91
  931. package/src/workspace/landing/index.ts +0 -40
  932. package/src/workspace/landing/merge-to-parent.ts +0 -229
  933. package/src/workspace/landing/optimistic-push.ts +0 -36
  934. package/src/workspace/landing/queue-to-branch.ts +0 -108
  935. package/src/workspace/merge-queue/__tests__/conflict-resolution-git.e2e.test.ts +0 -641
  936. package/src/workspace/merge-queue/__tests__/conflict-resolution.test.ts +0 -707
  937. package/src/workspace/merge-queue/__tests__/merge-queue-concurrent.test.ts +0 -628
  938. package/src/workspace/merge-queue/__tests__/merge-queue-edge-cases.test.ts +0 -1217
  939. package/src/workspace/merge-queue/__tests__/merge-queue.test.ts +0 -506
  940. package/src/workspace/merge-queue/__tests__/real-git-operations.e2e.test.ts +0 -556
  941. package/src/workspace/merge-queue/__tests__/resolver-flow.test.ts +0 -472
  942. package/src/workspace/merge-queue/index.ts +0 -38
  943. package/src/workspace/merge-queue/merge-queue.ts +0 -585
  944. package/src/workspace/merge-queue/schema.ts +0 -98
  945. package/src/workspace/merge-queue/types.ts +0 -316
  946. package/src/workspace/pool/__tests__/worktree-pool.integration.test.ts +0 -1281
  947. package/src/workspace/pool/__tests__/worktree-pool.test.ts +0 -590
  948. package/src/workspace/pool/index.ts +0 -26
  949. package/src/workspace/pool/types.ts +0 -276
  950. package/src/workspace/pool/worktree-pool.ts +0 -659
  951. package/src/workspace/recovery/__tests__/auto-resolve-integration.test.ts +0 -127
  952. package/src/workspace/recovery/__tests__/spawn-resolver.test.ts +0 -139
  953. package/src/workspace/recovery/__tests__/strategies.test.ts +0 -145
  954. package/src/workspace/recovery/abandon.ts +0 -51
  955. package/src/workspace/recovery/auto-resolve.ts +0 -119
  956. package/src/workspace/recovery/defer.ts +0 -23
  957. package/src/workspace/recovery/escalate.ts +0 -30
  958. package/src/workspace/recovery/index.ts +0 -58
  959. package/src/workspace/recovery/spawn-resolver.ts +0 -152
  960. package/src/workspace/recovery/types.ts +0 -54
  961. package/src/workspace/strategies/index.ts +0 -18
  962. package/src/workspace/strategies/optimistic.ts +0 -139
  963. package/src/workspace/strategies/queue.ts +0 -81
  964. package/src/workspace/strategies/registry.ts +0 -89
  965. package/src/workspace/strategies/trunk.ts +0 -123
  966. package/src/workspace/strategies/types.ts +0 -145
  967. package/src/workspace/topology/__tests__/yaml-driven.test.ts +0 -345
  968. package/src/workspace/topology/index.ts +0 -18
  969. package/src/workspace/topology/no-workspace.ts +0 -39
  970. package/src/workspace/topology/types.ts +0 -116
  971. package/src/workspace/topology/yaml-driven.ts +0 -316
  972. package/src/workspace/types-v3.ts +0 -162
  973. package/src/workspace/types.ts +0 -541
  974. package/src/workspace/workspace-manager.ts +0 -1577
  975. package/src/workspace/yaml-schema.ts +0 -216
  976. package/test_fixtures/README.md +0 -425
  977. package/test_fixtures/fixtures/behaviors/coordinators.ts +0 -196
  978. package/test_fixtures/fixtures/behaviors/index.ts +0 -62
  979. package/test_fixtures/fixtures/behaviors/integrators.ts +0 -143
  980. package/test_fixtures/fixtures/behaviors/monitors.ts +0 -199
  981. package/test_fixtures/fixtures/behaviors/workers.ts +0 -348
  982. package/test_fixtures/fixtures/index.ts +0 -7
  983. package/test_fixtures/fixtures/projects/index.ts +0 -23
  984. package/test_fixtures/fixtures/projects/project-with-specs.ts +0 -44
  985. package/test_fixtures/fixtures/projects/typescript-project.ts +0 -200
  986. package/test_fixtures/fixtures/repos/index.ts +0 -6
  987. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -299
  988. package/test_fixtures/fixtures/repos/types.ts +0 -174
  989. package/test_fixtures/harness/assertions/harness-assertions.ts +0 -752
  990. package/test_fixtures/harness/assertions/index.ts +0 -8
  991. package/test_fixtures/harness/index.ts +0 -15
  992. package/test_fixtures/harness/simulator/agent-simulator.ts +0 -768
  993. package/test_fixtures/harness/simulator/behavior-executor.ts +0 -580
  994. package/test_fixtures/harness/simulator/index.ts +0 -14
  995. package/test_fixtures/harness/simulator/types.ts +0 -459
  996. package/test_fixtures/harness/test-harness.ts +0 -770
  997. package/test_fixtures/harness/timing/event-stepper.ts +0 -344
  998. package/test_fixtures/harness/timing/index.ts +0 -8
  999. package/tsconfig.json +0 -21
  1000. package/vitest.config.ts +0 -30
  1001. package/vitest.e2e.config.ts +0 -28
  1002. package/vitest.setup.ts +0 -12
@@ -1,1217 +0,0 @@
1
- /**
2
- * MergeQueue Edge Cases and Bug-Finding Tests
3
- *
4
- * These tests focus on:
5
- * - Edge cases that might reveal bugs
6
- * - Concurrent operations and race conditions
7
- * - Invalid input handling
8
- * - State transition edge cases
9
- * - Resolver flow (or lack thereof)
10
- *
11
- * @see s-1zcx Testing Strategy spec
12
- * @see s-bcqm Change Management spec
13
- */
14
-
15
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
16
- import Database from 'better-sqlite3';
17
- import {
18
- MergeQueue,
19
- createMergeQueue,
20
- MergeRequestNotFoundError,
21
- MergeRequestStateError,
22
- } from '../merge-queue.js';
23
- import type { MergeRequest, MergeQueueEvent } from '../types.js';
24
-
25
- describe('MergeQueue Edge Cases', () => {
26
- let db: Database.Database;
27
- let queue: MergeQueue;
28
-
29
- beforeEach(() => {
30
- db = new Database(':memory:');
31
- queue = createMergeQueue({ db });
32
- });
33
-
34
- afterEach(() => {
35
- queue.close();
36
- db.close();
37
- });
38
-
39
- // ===========================================================================
40
- // Priority Edge Cases
41
- // ===========================================================================
42
-
43
- describe('priority edge cases', () => {
44
- it('should handle priority of 0', () => {
45
- const mr1 = queue.submit({
46
- streamId: 'stream-1',
47
- taskId: 'task-1',
48
- workerBranch: 'branch-1',
49
- workerAgentId: 'agent-1',
50
- priority: 0,
51
- });
52
-
53
- const mr = queue.get(mr1);
54
- expect(mr!.priority).toBe(0);
55
- });
56
-
57
- it('should handle negative priority', () => {
58
- const mrNegative = queue.submit({
59
- streamId: 'stream-1',
60
- taskId: 'task-negative',
61
- workerBranch: 'branch-negative',
62
- workerAgentId: 'agent-1',
63
- priority: -10,
64
- });
65
-
66
- const mrPositive = queue.submit({
67
- streamId: 'stream-1',
68
- taskId: 'task-positive',
69
- workerBranch: 'branch-positive',
70
- workerAgentId: 'agent-2',
71
- priority: 10,
72
- });
73
-
74
- const mr = queue.get(mrNegative);
75
- expect(mr!.priority).toBe(-10);
76
-
77
- // Negative priority should be processed first (lower = higher priority)
78
- const next = queue.getNext('stream-1');
79
- expect(next!.taskId).toBe('task-negative');
80
- });
81
-
82
- it('should handle very large priority values', () => {
83
- const mrId = queue.submit({
84
- streamId: 'stream-1',
85
- taskId: 'task-1',
86
- workerBranch: 'branch-1',
87
- workerAgentId: 'agent-1',
88
- priority: Number.MAX_SAFE_INTEGER,
89
- });
90
-
91
- const mr = queue.get(mrId);
92
- expect(mr!.priority).toBe(Number.MAX_SAFE_INTEGER);
93
- });
94
-
95
- it('should handle floating point priority', () => {
96
- const mrId = queue.submit({
97
- streamId: 'stream-1',
98
- taskId: 'task-1',
99
- workerBranch: 'branch-1',
100
- workerAgentId: 'agent-1',
101
- priority: 10.5,
102
- });
103
-
104
- const mr = queue.get(mrId);
105
- // SQLite may truncate or store as float
106
- expect(mr!.priority).toBe(10.5);
107
- });
108
-
109
- it('should correctly order MRs with same priority by submission time', async () => {
110
- const mr1 = queue.submit({
111
- streamId: 'stream-1',
112
- taskId: 'task-1',
113
- workerBranch: 'branch-1',
114
- workerAgentId: 'agent-1',
115
- priority: 50,
116
- });
117
-
118
- // Ensure different timestamp
119
- await new Promise((resolve) => setTimeout(resolve, 5));
120
-
121
- const mr2 = queue.submit({
122
- streamId: 'stream-1',
123
- taskId: 'task-2',
124
- workerBranch: 'branch-2',
125
- workerAgentId: 'agent-2',
126
- priority: 50,
127
- });
128
-
129
- const next = queue.getNext('stream-1');
130
- expect(next!.id).toBe(mr1); // First submitted should be first
131
- });
132
- });
133
-
134
- // ===========================================================================
135
- // Position Edge Cases
136
- // ===========================================================================
137
-
138
- describe('position edge cases', () => {
139
- it('should handle position of 0', () => {
140
- const mr1 = queue.submit({
141
- streamId: 'stream-1',
142
- taskId: 'task-1',
143
- workerBranch: 'branch-1',
144
- workerAgentId: 'agent-1',
145
- });
146
-
147
- const mr2 = queue.submit({
148
- streamId: 'stream-1',
149
- taskId: 'task-2',
150
- workerBranch: 'branch-2',
151
- workerAgentId: 'agent-2',
152
- });
153
-
154
- // Set position 0 on second MR
155
- queue.reposition(mr2, 0);
156
-
157
- const next = queue.getNext('stream-1');
158
- expect(next!.id).toBe(mr2); // Position 0 should be first
159
- });
160
-
161
- it('should handle negative position', () => {
162
- const mr1 = queue.submit({
163
- streamId: 'stream-1',
164
- taskId: 'task-1',
165
- workerBranch: 'branch-1',
166
- workerAgentId: 'agent-1',
167
- });
168
-
169
- const mr2 = queue.submit({
170
- streamId: 'stream-1',
171
- taskId: 'task-2',
172
- workerBranch: 'branch-2',
173
- workerAgentId: 'agent-2',
174
- });
175
-
176
- // Set negative position
177
- queue.reposition(mr2, -100);
178
-
179
- const next = queue.getNext('stream-1');
180
- expect(next!.id).toBe(mr2); // Negative position should be first
181
- });
182
-
183
- it('should handle very large position values', () => {
184
- const mr1 = queue.submit({
185
- streamId: 'stream-1',
186
- taskId: 'task-1',
187
- workerBranch: 'branch-1',
188
- workerAgentId: 'agent-1',
189
- });
190
-
191
- const mr2 = queue.submit({
192
- streamId: 'stream-1',
193
- taskId: 'task-2',
194
- workerBranch: 'branch-2',
195
- workerAgentId: 'agent-2',
196
- });
197
-
198
- queue.reposition(mr1, Number.MAX_SAFE_INTEGER);
199
- queue.reposition(mr2, 1);
200
-
201
- const next = queue.getNext('stream-1');
202
- expect(next!.id).toBe(mr2); // Lower position first
203
- });
204
-
205
- it('should handle multiple MRs with same position', () => {
206
- const mr1 = queue.submit({
207
- streamId: 'stream-1',
208
- taskId: 'task-1',
209
- workerBranch: 'branch-1',
210
- workerAgentId: 'agent-1',
211
- priority: 100,
212
- });
213
-
214
- const mr2 = queue.submit({
215
- streamId: 'stream-1',
216
- taskId: 'task-2',
217
- workerBranch: 'branch-2',
218
- workerAgentId: 'agent-2',
219
- priority: 10, // Higher priority
220
- });
221
-
222
- // Both at position 1
223
- queue.reposition(mr1, 1);
224
- queue.reposition(mr2, 1);
225
-
226
- // Should fall back to priority ordering when positions are equal
227
- const next = queue.getNext('stream-1');
228
- expect(next!.taskId).toBe('task-2'); // Higher priority (10 < 100)
229
- });
230
- });
231
-
232
- // ===========================================================================
233
- // State Transition Edge Cases
234
- // ===========================================================================
235
-
236
- describe('state transition edge cases', () => {
237
- it('should reject abandoned → abandoned transition', () => {
238
- const mrId = queue.submit({
239
- streamId: 'stream-1',
240
- taskId: 'task-1',
241
- workerBranch: 'branch-1',
242
- workerAgentId: 'agent-1',
243
- });
244
-
245
- queue.markAbandoned(mrId);
246
-
247
- // Should throw MergeRequestStateError on second abandon
248
- expect(() => queue.markAbandoned(mrId)).toThrow(MergeRequestStateError);
249
- expect(() => queue.markAbandoned(mrId)).toThrow(/must be 'pending' or 'processing'/);
250
- });
251
-
252
- it('should reject conflict → abandoned transition', () => {
253
- const mrId = queue.submit({
254
- streamId: 'stream-1',
255
- taskId: 'task-1',
256
- workerBranch: 'branch-1',
257
- workerAgentId: 'agent-1',
258
- });
259
-
260
- queue.markProcessing(mrId);
261
- queue.markConflict(mrId, ['file.ts']);
262
-
263
- // Conflict is a terminal state requiring resolution via markResolverComplete
264
- expect(() => queue.markAbandoned(mrId)).toThrow(MergeRequestStateError);
265
- expect(() => queue.markAbandoned(mrId)).toThrow(/must be 'pending' or 'processing'/);
266
-
267
- // Status should remain conflict
268
- const mr = queue.get(mrId);
269
- expect(mr!.status).toBe('conflict');
270
- });
271
-
272
- it('should not allow processing → processing (double processing)', () => {
273
- const mrId = queue.submit({
274
- streamId: 'stream-1',
275
- taskId: 'task-1',
276
- workerBranch: 'branch-1',
277
- workerAgentId: 'agent-1',
278
- });
279
-
280
- queue.markProcessing(mrId);
281
-
282
- // Already processing - should throw
283
- expect(() => queue.markProcessing(mrId)).toThrow(MergeRequestStateError);
284
- });
285
-
286
- it('should not allow merged → conflict', () => {
287
- const mrId = queue.submit({
288
- streamId: 'stream-1',
289
- taskId: 'task-1',
290
- workerBranch: 'branch-1',
291
- workerAgentId: 'agent-1',
292
- });
293
-
294
- queue.markProcessing(mrId);
295
- queue.markMerged(mrId, 'abc123');
296
-
297
- // Already merged - should throw
298
- expect(() => queue.markConflict(mrId, ['file.ts'])).toThrow(
299
- MergeRequestStateError
300
- );
301
- });
302
-
303
- it('should not allow conflict → merged', () => {
304
- const mrId = queue.submit({
305
- streamId: 'stream-1',
306
- taskId: 'task-1',
307
- workerBranch: 'branch-1',
308
- workerAgentId: 'agent-1',
309
- });
310
-
311
- queue.markProcessing(mrId);
312
- queue.markConflict(mrId, ['file.ts']);
313
-
314
- // Already conflicted - should throw when trying to merge
315
- expect(() => queue.markMerged(mrId, 'abc123')).toThrow(
316
- MergeRequestStateError
317
- );
318
- });
319
- });
320
-
321
- // ===========================================================================
322
- // Metadata Edge Cases
323
- // ===========================================================================
324
-
325
- describe('metadata edge cases', () => {
326
- it('should handle empty metadata object', () => {
327
- const mrId = queue.submit({
328
- streamId: 'stream-1',
329
- taskId: 'task-1',
330
- workerBranch: 'branch-1',
331
- workerAgentId: 'agent-1',
332
- metadata: {},
333
- });
334
-
335
- const mr = queue.get(mrId);
336
- expect(mr!.metadata).toEqual({});
337
- });
338
-
339
- it('should handle nested metadata objects', () => {
340
- const metadata = {
341
- nested: {
342
- deeply: {
343
- value: 'test',
344
- },
345
- },
346
- array: [1, 2, 3],
347
- };
348
-
349
- const mrId = queue.submit({
350
- streamId: 'stream-1',
351
- taskId: 'task-1',
352
- workerBranch: 'branch-1',
353
- workerAgentId: 'agent-1',
354
- metadata,
355
- });
356
-
357
- const mr = queue.get(mrId);
358
- expect(mr!.metadata).toEqual(metadata);
359
- });
360
-
361
- it('should handle metadata with special characters', () => {
362
- const metadata = {
363
- 'key-with-dash': 'value',
364
- 'key.with.dots': 'value',
365
- 'key with spaces': 'value',
366
- unicode: '日本語',
367
- emoji: '🚀',
368
- };
369
-
370
- const mrId = queue.submit({
371
- streamId: 'stream-1',
372
- taskId: 'task-1',
373
- workerBranch: 'branch-1',
374
- workerAgentId: 'agent-1',
375
- metadata,
376
- });
377
-
378
- const mr = queue.get(mrId);
379
- expect(mr!.metadata).toEqual(metadata);
380
- });
381
-
382
- it('should handle large metadata objects', () => {
383
- const largeMetadata: Record<string, string> = {};
384
- for (let i = 0; i < 1000; i++) {
385
- largeMetadata[`key_${i}`] = `value_${i}_${'x'.repeat(100)}`;
386
- }
387
-
388
- const mrId = queue.submit({
389
- streamId: 'stream-1',
390
- taskId: 'task-1',
391
- workerBranch: 'branch-1',
392
- workerAgentId: 'agent-1',
393
- metadata: largeMetadata,
394
- });
395
-
396
- const mr = queue.get(mrId);
397
- expect(Object.keys(mr!.metadata).length).toBe(1000);
398
- });
399
- });
400
-
401
- // ===========================================================================
402
- // Duplicate and Uniqueness Tests
403
- // ===========================================================================
404
-
405
- describe('duplicate handling', () => {
406
- it('should allow duplicate taskId in same stream', () => {
407
- // This might be a bug - should we allow this?
408
- queue.submit({
409
- streamId: 'stream-1',
410
- taskId: 'task-1',
411
- workerBranch: 'branch-1',
412
- workerAgentId: 'agent-1',
413
- });
414
-
415
- // Second submission with same taskId
416
- const mr2 = queue.submit({
417
- streamId: 'stream-1',
418
- taskId: 'task-1', // Same task ID!
419
- workerBranch: 'branch-2',
420
- workerAgentId: 'agent-2',
421
- });
422
-
423
- // This creates a duplicate - getByTask will only return one
424
- const byTask = queue.getByTask('task-1');
425
- expect(byTask).not.toBeNull();
426
-
427
- // But queue depth is 2
428
- expect(queue.getQueueDepth('stream-1')).toBe(2);
429
- });
430
-
431
- it('should allow same taskId in different streams', () => {
432
- queue.submit({
433
- streamId: 'stream-1',
434
- taskId: 'task-1',
435
- workerBranch: 'branch-1',
436
- workerAgentId: 'agent-1',
437
- });
438
-
439
- queue.submit({
440
- streamId: 'stream-2',
441
- taskId: 'task-1', // Same task ID, different stream
442
- workerBranch: 'branch-2',
443
- workerAgentId: 'agent-2',
444
- });
445
-
446
- expect(queue.getQueueDepth('stream-1')).toBe(1);
447
- expect(queue.getQueueDepth('stream-2')).toBe(1);
448
- });
449
- });
450
-
451
- // ===========================================================================
452
- // Event System Edge Cases
453
- // ===========================================================================
454
-
455
- describe('event system edge cases', () => {
456
- it('should handle event listener that throws error', () => {
457
- const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
458
-
459
- queue.onEvent(() => {
460
- throw new Error('Listener error');
461
- });
462
-
463
- // Should not throw, should log error
464
- expect(() => {
465
- queue.submit({
466
- streamId: 'stream-1',
467
- taskId: 'task-1',
468
- workerBranch: 'branch-1',
469
- workerAgentId: 'agent-1',
470
- });
471
- }).not.toThrow();
472
-
473
- expect(errorSpy).toHaveBeenCalled();
474
- errorSpy.mockRestore();
475
- });
476
-
477
- it('should continue calling other listeners after one throws', () => {
478
- const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
479
- const events: MergeQueueEvent[] = [];
480
-
481
- // First listener throws
482
- queue.onEvent(() => {
483
- throw new Error('Listener error');
484
- });
485
-
486
- // Second listener should still receive events
487
- queue.onEvent((event) => {
488
- events.push(event);
489
- });
490
-
491
- queue.submit({
492
- streamId: 'stream-1',
493
- taskId: 'task-1',
494
- workerBranch: 'branch-1',
495
- workerAgentId: 'agent-1',
496
- });
497
-
498
- expect(events.length).toBe(1);
499
- expect(events[0].type).toBe('mr:submitted');
500
- errorSpy.mockRestore();
501
- });
502
-
503
- it('should handle unsubscribe during event emission', () => {
504
- const events: MergeQueueEvent[] = [];
505
- let unsubscribe: () => void;
506
-
507
- unsubscribe = queue.onEvent((event) => {
508
- events.push(event);
509
- unsubscribe(); // Unsubscribe during callback
510
- });
511
-
512
- queue.submit({
513
- streamId: 'stream-1',
514
- taskId: 'task-1',
515
- workerBranch: 'branch-1',
516
- workerAgentId: 'agent-1',
517
- });
518
-
519
- queue.submit({
520
- streamId: 'stream-1',
521
- taskId: 'task-2',
522
- workerBranch: 'branch-2',
523
- workerAgentId: 'agent-2',
524
- });
525
-
526
- // Should only receive first event
527
- expect(events.length).toBe(1);
528
- });
529
- });
530
-
531
- // ===========================================================================
532
- // Conflict Files Edge Cases
533
- // ===========================================================================
534
-
535
- describe('conflict files edge cases', () => {
536
- it('should handle empty conflict files array', () => {
537
- const mrId = queue.submit({
538
- streamId: 'stream-1',
539
- taskId: 'task-1',
540
- workerBranch: 'branch-1',
541
- workerAgentId: 'agent-1',
542
- });
543
-
544
- queue.markProcessing(mrId);
545
- queue.markConflict(mrId, []);
546
-
547
- const mr = queue.get(mrId);
548
- expect(mr!.conflictFiles).toEqual([]);
549
- });
550
-
551
- it('should handle conflict files with special characters', () => {
552
- const mrId = queue.submit({
553
- streamId: 'stream-1',
554
- taskId: 'task-1',
555
- workerBranch: 'branch-1',
556
- workerAgentId: 'agent-1',
557
- });
558
-
559
- const files = [
560
- 'path/with spaces/file.ts',
561
- 'path-with-dashes/file.ts',
562
- 'unicode/日本語/file.ts',
563
- 'emoji/🚀/file.ts',
564
- ];
565
-
566
- queue.markProcessing(mrId);
567
- queue.markConflict(mrId, files);
568
-
569
- const mr = queue.get(mrId);
570
- expect(mr!.conflictFiles).toEqual(files);
571
- });
572
-
573
- it('should handle many conflict files', () => {
574
- const mrId = queue.submit({
575
- streamId: 'stream-1',
576
- taskId: 'task-1',
577
- workerBranch: 'branch-1',
578
- workerAgentId: 'agent-1',
579
- });
580
-
581
- const files = Array.from({ length: 500 }, (_, i) => `path/to/file${i}.ts`);
582
-
583
- queue.markProcessing(mrId);
584
- queue.markConflict(mrId, files);
585
-
586
- const mr = queue.get(mrId);
587
- expect(mr!.conflictFiles!.length).toBe(500);
588
- });
589
- });
590
-
591
- // ===========================================================================
592
- // Resolver Task ID Tests (Missing Feature Tests)
593
- // ===========================================================================
594
-
595
- describe('resolver task ID handling', () => {
596
- it('should store resolver task ID when conflict is marked', () => {
597
- const mrId = queue.submit({
598
- streamId: 'stream-1',
599
- taskId: 'task-1',
600
- workerBranch: 'branch-1',
601
- workerAgentId: 'agent-1',
602
- });
603
-
604
- queue.markProcessing(mrId);
605
- queue.markConflict(mrId, ['file.ts'], 'resolver-task-123');
606
-
607
- const mr = queue.get(mrId);
608
- expect(mr!.resolverTaskId).toBe('resolver-task-123');
609
- });
610
-
611
- it('should emit resolver task ID in conflict event', () => {
612
- const events: MergeQueueEvent[] = [];
613
- queue.onEvent((event) => events.push(event));
614
-
615
- const mrId = queue.submit({
616
- streamId: 'stream-1',
617
- taskId: 'task-1',
618
- workerBranch: 'branch-1',
619
- workerAgentId: 'agent-1',
620
- });
621
-
622
- queue.markProcessing(mrId);
623
- queue.markConflict(mrId, ['file.ts'], 'resolver-task-456');
624
-
625
- const conflictEvent = events.find((e) => e.type === 'mr:conflict');
626
- expect(conflictEvent).toBeDefined();
627
- expect(conflictEvent!.data.resolverTaskId).toBe('resolver-task-456');
628
- });
629
-
630
- it('should handle undefined resolver task ID', () => {
631
- const mrId = queue.submit({
632
- streamId: 'stream-1',
633
- taskId: 'task-1',
634
- workerBranch: 'branch-1',
635
- workerAgentId: 'agent-1',
636
- });
637
-
638
- queue.markProcessing(mrId);
639
- queue.markConflict(mrId, ['file.ts']); // No resolver task ID
640
-
641
- const mr = queue.get(mrId);
642
- expect(mr!.resolverTaskId).toBeNull();
643
- });
644
-
645
- // This is an important test - the current implementation doesn't spawn resolvers
646
- it('should be possible to query MRs in conflict state awaiting resolution', () => {
647
- // Create multiple MRs, some with conflicts
648
- const mr1 = queue.submit({
649
- streamId: 'stream-1',
650
- taskId: 'task-1',
651
- workerBranch: 'branch-1',
652
- workerAgentId: 'agent-1',
653
- });
654
- const mr2 = queue.submit({
655
- streamId: 'stream-1',
656
- taskId: 'task-2',
657
- workerBranch: 'branch-2',
658
- workerAgentId: 'agent-2',
659
- });
660
- const mr3 = queue.submit({
661
- streamId: 'stream-1',
662
- taskId: 'task-3',
663
- workerBranch: 'branch-3',
664
- workerAgentId: 'agent-3',
665
- });
666
-
667
- // Process and mark some as conflict
668
- queue.markProcessing(mr1);
669
- queue.markMerged(mr1, 'commit1');
670
-
671
- queue.markProcessing(mr2);
672
- queue.markConflict(mr2, ['file.ts'], 'resolver-1');
673
-
674
- queue.markProcessing(mr3);
675
- queue.markConflict(mr3, ['other.ts']); // No resolver
676
-
677
- // Query conflicts with resolver
678
- const conflictsWithResolver = queue.getPending('stream-1', {
679
- status: 'conflict',
680
- });
681
-
682
- expect(conflictsWithResolver.length).toBe(2);
683
-
684
- // Filter to those with resolvers
685
- const withResolver = conflictsWithResolver.filter(
686
- (mr) => mr.resolverTaskId !== null
687
- );
688
- expect(withResolver.length).toBe(1);
689
- expect(withResolver[0].resolverTaskId).toBe('resolver-1');
690
- });
691
- });
692
-
693
- // ===========================================================================
694
- // Stress Tests
695
- // ===========================================================================
696
-
697
- describe('stress tests', () => {
698
- it('should handle 100 concurrent submissions', () => {
699
- for (let i = 0; i < 100; i++) {
700
- queue.submit({
701
- streamId: 'stream-1',
702
- taskId: `task-${i}`,
703
- workerBranch: `branch-${i}`,
704
- workerAgentId: `agent-${i}`,
705
- priority: Math.floor(Math.random() * 100),
706
- });
707
- }
708
-
709
- expect(queue.getQueueDepth('stream-1')).toBe(100);
710
-
711
- // Process all
712
- const processed: string[] = [];
713
- while (true) {
714
- const next = queue.getNext('stream-1');
715
- if (!next) break;
716
-
717
- queue.markProcessing(next.id);
718
- queue.markMerged(next.id, `commit-${processed.length}`);
719
- processed.push(next.id);
720
- }
721
-
722
- expect(processed.length).toBe(100);
723
- expect(queue.getQueueDepth('stream-1')).toBe(0);
724
- });
725
-
726
- it('should handle many streams', () => {
727
- // Create 50 streams with 10 MRs each
728
- for (let s = 0; s < 50; s++) {
729
- for (let i = 0; i < 10; i++) {
730
- queue.submit({
731
- streamId: `stream-${s}`,
732
- taskId: `task-${s}-${i}`,
733
- workerBranch: `branch-${s}-${i}`,
734
- workerAgentId: `agent-${i}`,
735
- });
736
- }
737
- }
738
-
739
- // Check each stream
740
- for (let s = 0; s < 50; s++) {
741
- expect(queue.getQueueDepth(`stream-${s}`)).toBe(10);
742
- }
743
-
744
- // Process a single stream
745
- let processed = 0;
746
- while (true) {
747
- const next = queue.getNext('stream-25');
748
- if (!next) break;
749
- queue.markProcessing(next.id);
750
- queue.markMerged(next.id, `commit-${processed}`);
751
- processed++;
752
- }
753
-
754
- expect(processed).toBe(10);
755
- expect(queue.getQueueDepth('stream-25')).toBe(0);
756
- // Other streams untouched
757
- expect(queue.getQueueDepth('stream-0')).toBe(10);
758
- });
759
- });
760
-
761
- // ===========================================================================
762
- // Branch Name Edge Cases
763
- // ===========================================================================
764
-
765
- describe('branch name edge cases', () => {
766
- it('should handle branch names with slashes', () => {
767
- const mrId = queue.submit({
768
- streamId: 'stream-1',
769
- taskId: 'task-1',
770
- workerBranch: 'feature/user/auth/login',
771
- workerAgentId: 'agent-1',
772
- });
773
-
774
- const mr = queue.get(mrId);
775
- expect(mr!.workerBranch).toBe('feature/user/auth/login');
776
- });
777
-
778
- it('should handle branch names with special characters', () => {
779
- const mrId = queue.submit({
780
- streamId: 'stream-1',
781
- taskId: 'task-1',
782
- workerBranch: 'worker/agent-1/task-1@timestamp',
783
- workerAgentId: 'agent-1',
784
- });
785
-
786
- const mr = queue.get(mrId);
787
- expect(mr!.workerBranch).toBe('worker/agent-1/task-1@timestamp');
788
- });
789
-
790
- it('should handle very long branch names', () => {
791
- const longBranchName = 'feature/' + 'a'.repeat(200);
792
- const mrId = queue.submit({
793
- streamId: 'stream-1',
794
- taskId: 'task-1',
795
- workerBranch: longBranchName,
796
- workerAgentId: 'agent-1',
797
- });
798
-
799
- const mr = queue.get(mrId);
800
- expect(mr!.workerBranch).toBe(longBranchName);
801
- });
802
- });
803
-
804
- // ===========================================================================
805
- // Timing and Timestamps
806
- // ===========================================================================
807
-
808
- describe('timestamps', () => {
809
- it('should record accurate submittedAt timestamp', () => {
810
- const before = Date.now();
811
- const mrId = queue.submit({
812
- streamId: 'stream-1',
813
- taskId: 'task-1',
814
- workerBranch: 'branch-1',
815
- workerAgentId: 'agent-1',
816
- });
817
- const after = Date.now();
818
-
819
- const mr = queue.get(mrId);
820
- expect(mr!.submittedAt).toBeGreaterThanOrEqual(before);
821
- expect(mr!.submittedAt).toBeLessThanOrEqual(after);
822
- });
823
-
824
- it('should record accurate startedAt timestamp', () => {
825
- const mrId = queue.submit({
826
- streamId: 'stream-1',
827
- taskId: 'task-1',
828
- workerBranch: 'branch-1',
829
- workerAgentId: 'agent-1',
830
- });
831
-
832
- const before = Date.now();
833
- queue.markProcessing(mrId);
834
- const after = Date.now();
835
-
836
- const mr = queue.get(mrId);
837
- expect(mr!.startedAt).toBeGreaterThanOrEqual(before);
838
- expect(mr!.startedAt).toBeLessThanOrEqual(after);
839
- });
840
-
841
- it('should record accurate completedAt timestamp', () => {
842
- const mrId = queue.submit({
843
- streamId: 'stream-1',
844
- taskId: 'task-1',
845
- workerBranch: 'branch-1',
846
- workerAgentId: 'agent-1',
847
- });
848
-
849
- queue.markProcessing(mrId);
850
-
851
- const before = Date.now();
852
- queue.markMerged(mrId, 'commit123');
853
- const after = Date.now();
854
-
855
- const mr = queue.get(mrId);
856
- expect(mr!.completedAt).toBeGreaterThanOrEqual(before);
857
- expect(mr!.completedAt).toBeLessThanOrEqual(after);
858
- });
859
- });
860
-
861
- // ===========================================================================
862
- // Query Edge Cases
863
- // ===========================================================================
864
-
865
- describe('query edge cases', () => {
866
- it('should return empty array for getPending on empty stream', () => {
867
- const pending = queue.getPending('nonexistent-stream');
868
- expect(pending).toEqual([]);
869
- });
870
-
871
- it('should return 0 for getQueueDepth on empty stream', () => {
872
- const depth = queue.getQueueDepth('nonexistent-stream');
873
- expect(depth).toBe(0);
874
- });
875
-
876
- it('should return null for getNext on empty stream', () => {
877
- const next = queue.getNext('nonexistent-stream');
878
- expect(next).toBeNull();
879
- });
880
-
881
- it('should return null for getByTask with nonexistent task', () => {
882
- const mr = queue.getByTask('nonexistent-task');
883
- expect(mr).toBeNull();
884
- });
885
-
886
- it('should return first matching MR when multiple MRs have same taskId', () => {
887
- // This is an edge case - taskId should be unique, but what happens if it's not?
888
- // Submit two MRs with the same taskId
889
- const mr1 = queue.submit({
890
- streamId: 'stream-1',
891
- taskId: 'duplicate-task',
892
- workerBranch: 'branch-1',
893
- workerAgentId: 'agent-1',
894
- });
895
- const mr2 = queue.submit({
896
- streamId: 'stream-1',
897
- taskId: 'duplicate-task', // Same task ID
898
- workerBranch: 'branch-2',
899
- workerAgentId: 'agent-2',
900
- });
901
-
902
- // getByTask should return one of them (implementation detail: likely first)
903
- const result = queue.getByTask('duplicate-task');
904
- expect(result).not.toBeNull();
905
- expect(result!.taskId).toBe('duplicate-task');
906
- // Note: The returned MR could be either mr1 or mr2 depending on DB query order
907
- expect([mr1, mr2]).toContain(result!.id);
908
- });
909
- });
910
-
911
- // ===========================================================================
912
- // Position Ordering Edge Cases
913
- // ===========================================================================
914
-
915
- describe('position ordering edge cases', () => {
916
- it('should handle position gaps correctly (1, 3, 5)', () => {
917
- // Create MRs with non-contiguous positions
918
- const mr1 = queue.submit({
919
- streamId: 'stream-1',
920
- taskId: 'task-1',
921
- workerBranch: 'branch-1',
922
- workerAgentId: 'agent-1',
923
- });
924
- const mr2 = queue.submit({
925
- streamId: 'stream-1',
926
- taskId: 'task-2',
927
- workerBranch: 'branch-2',
928
- workerAgentId: 'agent-2',
929
- });
930
- const mr3 = queue.submit({
931
- streamId: 'stream-1',
932
- taskId: 'task-3',
933
- workerBranch: 'branch-3',
934
- workerAgentId: 'agent-3',
935
- });
936
-
937
- // Set non-contiguous positions
938
- queue.reposition(mr1, 1);
939
- queue.reposition(mr2, 5);
940
- queue.reposition(mr3, 3);
941
-
942
- // Verify ordering: position 1 < 3 < 5
943
- const next1 = queue.getNext('stream-1');
944
- expect(next1!.id).toBe(mr1);
945
- queue.markProcessing(mr1);
946
- queue.markMerged(mr1, 'commit1');
947
-
948
- const next2 = queue.getNext('stream-1');
949
- expect(next2!.id).toBe(mr3); // Position 3 comes before position 5
950
- queue.markProcessing(mr3);
951
- queue.markMerged(mr3, 'commit3');
952
-
953
- const next3 = queue.getNext('stream-1');
954
- expect(next3!.id).toBe(mr2);
955
- });
956
-
957
- it('should handle mix of positioned and non-positioned MRs', () => {
958
- // MRs with positions should come before those without
959
- const mr1 = queue.submit({
960
- streamId: 'stream-1',
961
- taskId: 'task-1',
962
- workerBranch: 'branch-1',
963
- workerAgentId: 'agent-1',
964
- priority: 1, // High priority but no position
965
- });
966
- const mr2 = queue.submit({
967
- streamId: 'stream-1',
968
- taskId: 'task-2',
969
- workerBranch: 'branch-2',
970
- workerAgentId: 'agent-2',
971
- priority: 100, // Low priority but has position
972
- });
973
- const mr3 = queue.submit({
974
- streamId: 'stream-1',
975
- taskId: 'task-3',
976
- workerBranch: 'branch-3',
977
- workerAgentId: 'agent-3',
978
- priority: 50, // Medium priority, no position
979
- });
980
-
981
- // Set position only on mr2
982
- queue.reposition(mr2, 10);
983
-
984
- // MR with position (mr2) should come first, then priority-ordered (mr1, mr3)
985
- const next1 = queue.getNext('stream-1');
986
- expect(next1!.id).toBe(mr2); // Positioned first
987
- queue.markProcessing(mr2);
988
- queue.markMerged(mr2, 'commit2');
989
-
990
- const next2 = queue.getNext('stream-1');
991
- expect(next2!.id).toBe(mr1); // Then priority 1
992
- queue.markProcessing(mr1);
993
- queue.markMerged(mr1, 'commit1');
994
-
995
- const next3 = queue.getNext('stream-1');
996
- expect(next3!.id).toBe(mr3); // Then priority 50
997
- });
998
- });
999
-
1000
- // ===========================================================================
1001
- // Performance / Scale Tests
1002
- // ===========================================================================
1003
-
1004
- describe('performance at scale', () => {
1005
- it('should handle 1000 MRs in a single stream', () => {
1006
- const count = 1000;
1007
- const mrIds: string[] = [];
1008
-
1009
- // Submit many MRs
1010
- const submitStart = Date.now();
1011
- for (let i = 0; i < count; i++) {
1012
- const mrId = queue.submit({
1013
- streamId: 'stream-1',
1014
- taskId: `task-${i}`,
1015
- workerBranch: `branch-${i}`,
1016
- workerAgentId: `agent-${i % 10}`,
1017
- priority: Math.floor(Math.random() * 100),
1018
- });
1019
- mrIds.push(mrId);
1020
- }
1021
- const submitTime = Date.now() - submitStart;
1022
-
1023
- // Verify count
1024
- expect(queue.getQueueDepth('stream-1')).toBe(count);
1025
-
1026
- // Test getNext performance
1027
- const getNextStart = Date.now();
1028
- for (let i = 0; i < 100; i++) {
1029
- queue.getNext('stream-1');
1030
- }
1031
- const getNextTime = Date.now() - getNextStart;
1032
-
1033
- // Test getPending performance
1034
- const getPendingStart = Date.now();
1035
- const pending = queue.getPending('stream-1', { limit: 100 });
1036
- const getPendingTime = Date.now() - getPendingStart;
1037
-
1038
- expect(pending.length).toBe(100);
1039
-
1040
- // Log performance metrics (informational)
1041
- console.log(`Performance: submit ${count} MRs: ${submitTime}ms, 100 getNext: ${getNextTime}ms, getPending(100): ${getPendingTime}ms`);
1042
-
1043
- // Sanity check: operations should complete in reasonable time
1044
- expect(submitTime).toBeLessThan(5000); // 5 seconds for 1000 inserts
1045
- expect(getNextTime).toBeLessThan(1000); // 1 second for 100 queries
1046
- expect(getPendingTime).toBeLessThan(500); // 500ms for single query
1047
- });
1048
-
1049
- it('should maintain consistency during rapid status transitions', () => {
1050
- const mrIds: string[] = [];
1051
-
1052
- // Submit 100 MRs
1053
- for (let i = 0; i < 100; i++) {
1054
- mrIds.push(
1055
- queue.submit({
1056
- streamId: 'stream-1',
1057
- taskId: `task-${i}`,
1058
- workerBranch: `branch-${i}`,
1059
- workerAgentId: 'agent-1',
1060
- })
1061
- );
1062
- }
1063
-
1064
- // Rapidly transition all through the state machine
1065
- for (const mrId of mrIds) {
1066
- queue.markProcessing(mrId);
1067
- queue.markMerged(mrId, `commit-${mrId}`);
1068
- }
1069
-
1070
- // Verify all are merged
1071
- expect(queue.getQueueDepth('stream-1')).toBe(0);
1072
- for (const mrId of mrIds) {
1073
- const mr = queue.get(mrId);
1074
- expect(mr!.status).toBe('merged');
1075
- expect(mr!.mergeCommit).toBe(`commit-${mrId}`);
1076
- }
1077
- });
1078
- });
1079
-
1080
- // ===========================================================================
1081
- // Stale Processing Detection
1082
- // ===========================================================================
1083
-
1084
- describe('stale processing detection', () => {
1085
- it('should identify MRs stuck in processing state', () => {
1086
- // This tests a common operational scenario: MRs that never complete
1087
-
1088
- const mr1 = queue.submit({
1089
- streamId: 'stream-1',
1090
- taskId: 'task-1',
1091
- workerBranch: 'branch-1',
1092
- workerAgentId: 'agent-1',
1093
- });
1094
- const mr2 = queue.submit({
1095
- streamId: 'stream-1',
1096
- taskId: 'task-2',
1097
- workerBranch: 'branch-2',
1098
- workerAgentId: 'agent-2',
1099
- });
1100
-
1101
- // Mark as processing but never complete
1102
- queue.markProcessing(mr1);
1103
- queue.markProcessing(mr2);
1104
-
1105
- // Query for processing MRs (using getPending with status filter)
1106
- // Note: getPending name is misleading - it can filter by any status
1107
- const processing = queue.getPending('stream-1', { status: 'processing' });
1108
- expect(processing.length).toBe(2);
1109
-
1110
- // In real usage, you'd check startedAt to find stale ones
1111
- for (const mr of processing) {
1112
- expect(mr.startedAt).not.toBeNull();
1113
- expect(mr.status).toBe('processing');
1114
- // Could implement: const isStale = Date.now() - mr.startedAt! > TIMEOUT;
1115
- }
1116
- });
1117
-
1118
- it('should allow abandoning stale processing MRs', () => {
1119
- const mrId = queue.submit({
1120
- streamId: 'stream-1',
1121
- taskId: 'task-1',
1122
- workerBranch: 'branch-1',
1123
- workerAgentId: 'agent-1',
1124
- });
1125
-
1126
- queue.markProcessing(mrId);
1127
-
1128
- // Simulate stale detection and recovery
1129
- const mr = queue.get(mrId);
1130
- expect(mr!.status).toBe('processing');
1131
-
1132
- // Mark as abandoned to recover
1133
- queue.markAbandoned(mrId);
1134
-
1135
- const updated = queue.get(mrId);
1136
- expect(updated!.status).toBe('abandoned');
1137
- expect(updated!.completedAt).not.toBeNull();
1138
-
1139
- // Queue is now clear
1140
- expect(queue.getQueueDepth('stream-1')).toBe(0);
1141
- });
1142
- });
1143
-
1144
- // ===========================================================================
1145
- // markResolverComplete Edge Cases
1146
- // ===========================================================================
1147
-
1148
- describe('markResolverComplete edge cases', () => {
1149
- it('should allow resolver completion without resolverBranch', () => {
1150
- const mrId = queue.submit({
1151
- streamId: 'stream-1',
1152
- taskId: 'task-1',
1153
- workerBranch: 'branch-1',
1154
- workerAgentId: 'agent-1',
1155
- });
1156
- queue.markProcessing(mrId);
1157
- queue.markConflict(mrId, ['file.ts'], 'resolver-task-1');
1158
-
1159
- // Complete without resolverBranch
1160
- queue.markResolverComplete(mrId, 'resolved-commit');
1161
-
1162
- const mr = queue.get(mrId);
1163
- expect(mr!.status).toBe('merged');
1164
- expect(mr!.mergeCommit).toBe('resolved-commit');
1165
- });
1166
-
1167
- it('should emit mr:resolved event with all data', () => {
1168
- const events: MergeQueueEvent[] = [];
1169
- queue.onEvent((e) => events.push(e));
1170
-
1171
- const mrId = queue.submit({
1172
- streamId: 'stream-1',
1173
- taskId: 'task-1',
1174
- workerBranch: 'branch-1',
1175
- workerAgentId: 'agent-1',
1176
- });
1177
- queue.markProcessing(mrId);
1178
- queue.markConflict(mrId, ['file.ts', 'file2.ts'], 'resolver-task-1');
1179
- queue.markResolverComplete(mrId, 'resolved-commit', 'resolver/mr-abc@123');
1180
-
1181
- const resolvedEvent = events.find((e) => e.type === 'mr:resolved');
1182
- expect(resolvedEvent).toBeDefined();
1183
- expect(resolvedEvent!.data).toMatchObject({
1184
- mrId,
1185
- streamId: 'stream-1',
1186
- taskId: 'task-1',
1187
- mergeCommit: 'resolved-commit',
1188
- resolverTaskId: 'resolver-task-1',
1189
- resolverBranch: 'resolver/mr-abc@123',
1190
- });
1191
- });
1192
-
1193
- it('should handle resolver completion on conflict without resolverTaskId', () => {
1194
- const mrId = queue.submit({
1195
- streamId: 'stream-1',
1196
- taskId: 'task-1',
1197
- workerBranch: 'branch-1',
1198
- workerAgentId: 'agent-1',
1199
- });
1200
- queue.markProcessing(mrId);
1201
- queue.markConflict(mrId, ['file.ts']); // No resolver task ID
1202
-
1203
- // Still should be able to complete
1204
- queue.markResolverComplete(mrId, 'manual-resolve-commit');
1205
-
1206
- const mr = queue.get(mrId);
1207
- expect(mr!.status).toBe('merged');
1208
- expect(mr!.resolverTaskId).toBeNull();
1209
- });
1210
-
1211
- it('should reject resolver completion on non-existent MR', () => {
1212
- expect(() => queue.markResolverComplete('nonexistent', 'commit')).toThrow(
1213
- MergeRequestNotFoundError
1214
- );
1215
- });
1216
- });
1217
- });