macro-agent 0.2.5 → 0.2.6

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