macro-agent 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1002) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +30 -56
  3. package/dist/acp/websocket-server.d.ts +6 -0
  4. package/dist/acp/websocket-server.d.ts.map +1 -1
  5. package/dist/acp/websocket-server.js +13 -0
  6. package/dist/acp/websocket-server.js.map +1 -1
  7. package/dist/acp/websocket-stream.d.ts +30 -0
  8. package/dist/acp/websocket-stream.d.ts.map +1 -0
  9. package/dist/acp/websocket-stream.js +118 -0
  10. package/dist/acp/websocket-stream.js.map +1 -0
  11. package/dist/activity/deduplication.d.ts +85 -0
  12. package/dist/activity/deduplication.d.ts.map +1 -0
  13. package/dist/activity/deduplication.js +149 -0
  14. package/dist/activity/deduplication.js.map +1 -0
  15. package/dist/activity/index.d.ts +16 -0
  16. package/dist/activity/index.d.ts.map +1 -0
  17. package/dist/activity/index.js +17 -0
  18. package/dist/activity/index.js.map +1 -0
  19. package/dist/activity/relevance.d.ts +81 -0
  20. package/dist/activity/relevance.d.ts.map +1 -0
  21. package/dist/activity/relevance.js +161 -0
  22. package/dist/activity/relevance.js.map +1 -0
  23. package/dist/activity/types.d.ts +169 -0
  24. package/dist/activity/types.d.ts.map +1 -0
  25. package/dist/activity/types.js +33 -0
  26. package/dist/activity/types.js.map +1 -0
  27. package/dist/activity/watcher.d.ts +64 -0
  28. package/dist/activity/watcher.d.ts.map +1 -0
  29. package/dist/activity/watcher.js +212 -0
  30. package/dist/activity/watcher.js.map +1 -0
  31. package/dist/adapters/federation.d.ts +8 -1
  32. package/dist/adapters/federation.d.ts.map +1 -1
  33. package/dist/adapters/federation.js +33 -2
  34. package/dist/adapters/federation.js.map +1 -1
  35. package/dist/agent/agent-manager-v2.d.ts.map +1 -1
  36. package/dist/agent/agent-manager-v2.js +189 -67
  37. package/dist/agent/agent-manager-v2.js.map +1 -1
  38. package/dist/agent/agent-manager.d.ts +17 -0
  39. package/dist/agent/agent-manager.d.ts.map +1 -1
  40. package/dist/agent/agent-manager.js.map +1 -1
  41. package/dist/agent/types.d.ts +21 -2
  42. package/dist/agent/types.d.ts.map +1 -1
  43. package/dist/agent/types.js.map +1 -1
  44. package/dist/agent/wake.d.ts +85 -0
  45. package/dist/agent/wake.d.ts.map +1 -0
  46. package/dist/agent/wake.js +278 -0
  47. package/dist/agent/wake.js.map +1 -0
  48. package/dist/api/server.d.ts.map +1 -1
  49. package/dist/api/server.js +41 -25
  50. package/dist/api/server.js.map +1 -1
  51. package/dist/api/types.d.ts +6 -0
  52. package/dist/api/types.d.ts.map +1 -1
  53. package/dist/auth/server-auth.d.ts +43 -0
  54. package/dist/auth/server-auth.d.ts.map +1 -0
  55. package/dist/auth/server-auth.js +80 -0
  56. package/dist/auth/server-auth.js.map +1 -0
  57. package/dist/auth/token.d.ts +4 -0
  58. package/dist/auth/token.d.ts.map +1 -1
  59. package/dist/auth/token.js +7 -6
  60. package/dist/auth/token.js.map +1 -1
  61. package/dist/boot-v2.d.ts +6 -3
  62. package/dist/boot-v2.d.ts.map +1 -1
  63. package/dist/boot-v2.js +44 -25
  64. package/dist/boot-v2.js.map +1 -1
  65. package/dist/cognitive/macro-agent-backend.d.ts.map +1 -1
  66. package/dist/cognitive/macro-agent-backend.js +37 -8
  67. package/dist/cognitive/macro-agent-backend.js.map +1 -1
  68. package/dist/cognitive/team-lifecycle.d.ts +82 -0
  69. package/dist/cognitive/team-lifecycle.d.ts.map +1 -0
  70. package/dist/cognitive/team-lifecycle.js +121 -0
  71. package/dist/cognitive/team-lifecycle.js.map +1 -0
  72. package/dist/cognitive/trajectory-extractor.d.ts +25 -0
  73. package/dist/cognitive/trajectory-extractor.d.ts.map +1 -0
  74. package/dist/cognitive/trajectory-extractor.js +134 -0
  75. package/dist/cognitive/trajectory-extractor.js.map +1 -0
  76. package/dist/cognitive/types.d.ts +24 -0
  77. package/dist/cognitive/types.d.ts.map +1 -1
  78. package/dist/control/control-server.d.ts.map +1 -1
  79. package/dist/control/control-server.js +10 -0
  80. package/dist/control/control-server.js.map +1 -1
  81. package/dist/dispatch/mail-inbound-consumer.d.ts.map +1 -1
  82. package/dist/dispatch/mail-inbound-consumer.js +43 -10
  83. package/dist/dispatch/mail-inbound-consumer.js.map +1 -1
  84. package/dist/index.d.ts +5 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +6 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/lifecycle/handlers/generic.d.ts +27 -0
  89. package/dist/lifecycle/handlers/generic.d.ts.map +1 -0
  90. package/dist/lifecycle/handlers/generic.js +56 -0
  91. package/dist/lifecycle/handlers/generic.js.map +1 -0
  92. package/dist/lifecycle/handlers/index.d.ts +51 -0
  93. package/dist/lifecycle/handlers/index.d.ts.map +1 -0
  94. package/dist/lifecycle/handlers/index.js +110 -0
  95. package/dist/lifecycle/handlers/index.js.map +1 -0
  96. package/dist/lifecycle/handlers/integrator.d.ts +81 -0
  97. package/dist/lifecycle/handlers/integrator.d.ts.map +1 -0
  98. package/dist/lifecycle/handlers/integrator.js +451 -0
  99. package/dist/lifecycle/handlers/integrator.js.map +1 -0
  100. package/dist/lifecycle/handlers/monitor.d.ts +29 -0
  101. package/dist/lifecycle/handlers/monitor.d.ts.map +1 -0
  102. package/dist/lifecycle/handlers/monitor.js +79 -0
  103. package/dist/lifecycle/handlers/monitor.js.map +1 -0
  104. package/dist/lifecycle/handlers/worker.d.ts +56 -0
  105. package/dist/lifecycle/handlers/worker.d.ts.map +1 -0
  106. package/dist/lifecycle/handlers/worker.js +381 -0
  107. package/dist/lifecycle/handlers/worker.js.map +1 -0
  108. package/dist/lifecycle/handlers-v2.d.ts +0 -2
  109. package/dist/lifecycle/handlers-v2.d.ts.map +1 -1
  110. package/dist/lifecycle/handlers-v2.js +4 -55
  111. package/dist/lifecycle/handlers-v2.js.map +1 -1
  112. package/dist/mail/conversation-map.d.ts +33 -0
  113. package/dist/mail/conversation-map.d.ts.map +1 -0
  114. package/dist/mail/conversation-map.js +61 -0
  115. package/dist/mail/conversation-map.js.map +1 -0
  116. package/dist/mail/index.d.ts +11 -0
  117. package/dist/mail/index.d.ts.map +1 -0
  118. package/dist/mail/index.js +11 -0
  119. package/dist/mail/index.js.map +1 -0
  120. package/dist/mail/mail-service.d.ts +85 -0
  121. package/dist/mail/mail-service.d.ts.map +1 -0
  122. package/dist/mail/mail-service.js +121 -0
  123. package/dist/mail/mail-service.js.map +1 -0
  124. package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
  125. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
  126. package/dist/mail/stores/eventstore-conversation-store.js +131 -0
  127. package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
  128. package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
  129. package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
  130. package/dist/mail/stores/eventstore-participant-store.js +145 -0
  131. package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
  132. package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
  133. package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
  134. package/dist/mail/stores/eventstore-thread-store.js +118 -0
  135. package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
  136. package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
  137. package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
  138. package/dist/mail/stores/eventstore-turn-store.js +153 -0
  139. package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
  140. package/dist/mail/stores/index.d.ts +12 -0
  141. package/dist/mail/stores/index.d.ts.map +1 -0
  142. package/dist/mail/stores/index.js +12 -0
  143. package/dist/mail/stores/index.js.map +1 -0
  144. package/dist/mail/stores/types.d.ts +146 -0
  145. package/dist/mail/stores/types.d.ts.map +1 -0
  146. package/dist/mail/stores/types.js +13 -0
  147. package/dist/mail/stores/types.js.map +1 -0
  148. package/dist/mail/turn-recorder.d.ts +30 -0
  149. package/dist/mail/turn-recorder.d.ts.map +1 -0
  150. package/dist/mail/turn-recorder.js +98 -0
  151. package/dist/mail/turn-recorder.js.map +1 -0
  152. package/dist/map/adapter/acp-over-map.d.ts +115 -0
  153. package/dist/map/adapter/acp-over-map.d.ts.map +1 -0
  154. package/dist/map/adapter/acp-over-map.js +1024 -0
  155. package/dist/map/adapter/acp-over-map.js.map +1 -0
  156. package/dist/map/adapter/connection-manager.d.ts +150 -0
  157. package/dist/map/adapter/connection-manager.d.ts.map +1 -0
  158. package/dist/map/adapter/connection-manager.js +207 -0
  159. package/dist/map/adapter/connection-manager.js.map +1 -0
  160. package/dist/map/adapter/event-log.d.ts +87 -0
  161. package/dist/map/adapter/event-log.d.ts.map +1 -0
  162. package/dist/map/adapter/event-log.js +122 -0
  163. package/dist/map/adapter/event-log.js.map +1 -0
  164. package/dist/map/adapter/event-translator.d.ts +85 -0
  165. package/dist/map/adapter/event-translator.d.ts.map +1 -0
  166. package/dist/map/adapter/event-translator.js +295 -0
  167. package/dist/map/adapter/event-translator.js.map +1 -0
  168. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  169. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  170. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  171. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  172. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  173. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  174. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  175. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  176. package/dist/map/adapter/extensions/cognitive.d.ts +27 -0
  177. package/dist/map/adapter/extensions/cognitive.d.ts.map +1 -0
  178. package/dist/map/adapter/extensions/cognitive.js +158 -0
  179. package/dist/map/adapter/extensions/cognitive.js.map +1 -0
  180. package/dist/map/adapter/extensions/index.d.ts +95 -0
  181. package/dist/map/adapter/extensions/index.d.ts.map +1 -0
  182. package/dist/map/adapter/extensions/index.js +228 -0
  183. package/dist/map/adapter/extensions/index.js.map +1 -0
  184. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  185. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  186. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  187. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  188. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  189. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  190. package/dist/map/adapter/extensions/resume.js +59 -0
  191. package/dist/map/adapter/extensions/resume.js.map +1 -0
  192. package/dist/map/adapter/extensions/streams.d.ts +95 -0
  193. package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
  194. package/dist/map/adapter/extensions/streams.js +515 -0
  195. package/dist/map/adapter/extensions/streams.js.map +1 -0
  196. package/dist/map/adapter/extensions/task.d.ts +40 -0
  197. package/dist/map/adapter/extensions/task.d.ts.map +1 -0
  198. package/dist/map/adapter/extensions/task.js +197 -0
  199. package/dist/map/adapter/extensions/task.js.map +1 -0
  200. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  201. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  202. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  203. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  204. package/dist/map/adapter/extensions/wake.d.ts +60 -0
  205. package/dist/map/adapter/extensions/wake.d.ts.map +1 -0
  206. package/dist/map/adapter/extensions/wake.js +144 -0
  207. package/dist/map/adapter/extensions/wake.js.map +1 -0
  208. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  209. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  210. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  211. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  212. package/dist/map/adapter/extensions/workspace.d.ts +57 -0
  213. package/dist/map/adapter/extensions/workspace.d.ts.map +1 -0
  214. package/dist/map/adapter/extensions/workspace.js +81 -0
  215. package/dist/map/adapter/extensions/workspace.js.map +1 -0
  216. package/dist/map/adapter/index.d.ts +20 -0
  217. package/dist/map/adapter/index.d.ts.map +1 -0
  218. package/dist/map/adapter/index.js +40 -0
  219. package/dist/map/adapter/index.js.map +1 -0
  220. package/dist/map/adapter/interface.d.ts +450 -0
  221. package/dist/map/adapter/interface.d.ts.map +1 -0
  222. package/dist/map/adapter/interface.js +24 -0
  223. package/dist/map/adapter/interface.js.map +1 -0
  224. package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
  225. package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
  226. package/dist/map/adapter/mail-handler-adapter.js +292 -0
  227. package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
  228. package/dist/map/adapter/map-adapter.d.ts +200 -0
  229. package/dist/map/adapter/map-adapter.d.ts.map +1 -0
  230. package/dist/map/adapter/map-adapter.js +1199 -0
  231. package/dist/map/adapter/map-adapter.js.map +1 -0
  232. package/dist/map/adapter/rpc-handler.d.ts +263 -0
  233. package/dist/map/adapter/rpc-handler.d.ts.map +1 -0
  234. package/dist/map/adapter/rpc-handler.js +365 -0
  235. package/dist/map/adapter/rpc-handler.js.map +1 -0
  236. package/dist/map/adapter/subscription-manager.d.ts +174 -0
  237. package/dist/map/adapter/subscription-manager.d.ts.map +1 -0
  238. package/dist/map/adapter/subscription-manager.js +248 -0
  239. package/dist/map/adapter/subscription-manager.js.map +1 -0
  240. package/dist/map/adapter/types.d.ts +194 -0
  241. package/dist/map/adapter/types.d.ts.map +1 -0
  242. package/dist/map/adapter/types.js +27 -0
  243. package/dist/map/adapter/types.js.map +1 -0
  244. package/dist/map/adapter/websocket-integration.d.ts +113 -0
  245. package/dist/map/adapter/websocket-integration.d.ts.map +1 -0
  246. package/dist/map/adapter/websocket-integration.js +134 -0
  247. package/dist/map/adapter/websocket-integration.js.map +1 -0
  248. package/dist/map/cascade-action-handler.d.ts.map +1 -1
  249. package/dist/map/cascade-action-handler.js +19 -5
  250. package/dist/map/cascade-action-handler.js.map +1 -1
  251. package/dist/map/federation/envelope.d.ts +98 -0
  252. package/dist/map/federation/envelope.d.ts.map +1 -0
  253. package/dist/map/federation/envelope.js +160 -0
  254. package/dist/map/federation/envelope.js.map +1 -0
  255. package/dist/map/federation/federation-handler.d.ts +50 -0
  256. package/dist/map/federation/federation-handler.d.ts.map +1 -0
  257. package/dist/map/federation/federation-handler.js +306 -0
  258. package/dist/map/federation/federation-handler.js.map +1 -0
  259. package/dist/map/federation/index.d.ts +14 -0
  260. package/dist/map/federation/index.d.ts.map +1 -0
  261. package/dist/map/federation/index.js +13 -0
  262. package/dist/map/federation/index.js.map +1 -0
  263. package/dist/map/federation/types.d.ts +239 -0
  264. package/dist/map/federation/types.d.ts.map +1 -0
  265. package/dist/map/federation/types.js +23 -0
  266. package/dist/map/federation/types.js.map +1 -0
  267. package/dist/map/mail-bridge.d.ts +7 -0
  268. package/dist/map/mail-bridge.d.ts.map +1 -1
  269. package/dist/map/mail-bridge.js +39 -9
  270. package/dist/map/mail-bridge.js.map +1 -1
  271. package/dist/map/server.d.ts.map +1 -1
  272. package/dist/map/server.js +17 -2
  273. package/dist/map/server.js.map +1 -1
  274. package/dist/map/types.d.ts +6 -0
  275. package/dist/map/types.d.ts.map +1 -1
  276. package/dist/mcp/map-client.d.ts +39 -0
  277. package/dist/mcp/map-client.d.ts.map +1 -0
  278. package/dist/mcp/map-client.js +129 -0
  279. package/dist/mcp/map-client.js.map +1 -0
  280. package/dist/mcp/mcp-server.d.ts +72 -0
  281. package/dist/mcp/mcp-server.d.ts.map +1 -0
  282. package/dist/mcp/mcp-server.js +1027 -0
  283. package/dist/mcp/mcp-server.js.map +1 -0
  284. package/dist/mcp/tools/claim_task.d.ts +35 -0
  285. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  286. package/dist/mcp/tools/claim_task.js +58 -0
  287. package/dist/mcp/tools/claim_task.js.map +1 -0
  288. package/dist/mcp/tools/done-v2.d.ts +0 -1
  289. package/dist/mcp/tools/done-v2.d.ts.map +1 -1
  290. package/dist/mcp/tools/done-v2.js +0 -1
  291. package/dist/mcp/tools/done-v2.js.map +1 -1
  292. package/dist/mcp/tools/done.d.ts +102 -0
  293. package/dist/mcp/tools/done.d.ts.map +1 -0
  294. package/dist/mcp/tools/done.js +253 -0
  295. package/dist/mcp/tools/done.js.map +1 -0
  296. package/dist/mcp/tools/inject_context.d.ts +61 -0
  297. package/dist/mcp/tools/inject_context.d.ts.map +1 -0
  298. package/dist/mcp/tools/inject_context.js +123 -0
  299. package/dist/mcp/tools/inject_context.js.map +1 -0
  300. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  301. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  302. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  303. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  304. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  305. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  306. package/dist/mcp/tools/unclaim_task.js +47 -0
  307. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  308. package/dist/mcp/tools/wait_for_activity.d.ts +60 -0
  309. package/dist/mcp/tools/wait_for_activity.d.ts.map +1 -0
  310. package/dist/mcp/tools/wait_for_activity.js +135 -0
  311. package/dist/mcp/tools/wait_for_activity.js.map +1 -0
  312. package/dist/monitor/health-check-service.d.ts +143 -0
  313. package/dist/monitor/health-check-service.d.ts.map +1 -0
  314. package/dist/monitor/health-check-service.js +240 -0
  315. package/dist/monitor/health-check-service.js.map +1 -0
  316. package/dist/monitor/index.d.ts +14 -0
  317. package/dist/monitor/index.d.ts.map +1 -0
  318. package/dist/monitor/index.js +14 -0
  319. package/dist/monitor/index.js.map +1 -0
  320. package/dist/monitor/stall-detector.d.ts +109 -0
  321. package/dist/monitor/stall-detector.d.ts.map +1 -0
  322. package/dist/monitor/stall-detector.js +152 -0
  323. package/dist/monitor/stall-detector.js.map +1 -0
  324. package/dist/peer/capability-manager.d.ts +56 -0
  325. package/dist/peer/capability-manager.d.ts.map +1 -0
  326. package/dist/peer/capability-manager.js +186 -0
  327. package/dist/peer/capability-manager.js.map +1 -0
  328. package/dist/peer/encapsulation-manager.d.ts +190 -0
  329. package/dist/peer/encapsulation-manager.d.ts.map +1 -0
  330. package/dist/peer/encapsulation-manager.js +486 -0
  331. package/dist/peer/encapsulation-manager.js.map +1 -0
  332. package/dist/peer/federation-manager.d.ts +223 -0
  333. package/dist/peer/federation-manager.d.ts.map +1 -0
  334. package/dist/peer/federation-manager.js +528 -0
  335. package/dist/peer/federation-manager.js.map +1 -0
  336. package/dist/peer/hierarchy-errors.d.ts +208 -0
  337. package/dist/peer/hierarchy-errors.d.ts.map +1 -0
  338. package/dist/peer/hierarchy-errors.js +268 -0
  339. package/dist/peer/hierarchy-errors.js.map +1 -0
  340. package/dist/peer/hierarchy-protocol.d.ts +159 -0
  341. package/dist/peer/hierarchy-protocol.d.ts.map +1 -0
  342. package/dist/peer/hierarchy-protocol.js +142 -0
  343. package/dist/peer/hierarchy-protocol.js.map +1 -0
  344. package/dist/peer/index.d.ts +15 -0
  345. package/dist/peer/index.d.ts.map +1 -0
  346. package/dist/peer/index.js +15 -0
  347. package/dist/peer/index.js.map +1 -0
  348. package/dist/peer/peer-manager.d.ts +99 -0
  349. package/dist/peer/peer-manager.d.ts.map +1 -0
  350. package/dist/peer/peer-manager.js +333 -0
  351. package/dist/peer/peer-manager.js.map +1 -0
  352. package/dist/peer/task-delegation.d.ts +189 -0
  353. package/dist/peer/task-delegation.d.ts.map +1 -0
  354. package/dist/peer/task-delegation.js +303 -0
  355. package/dist/peer/task-delegation.js.map +1 -0
  356. package/dist/peer/transports/index.d.ts +8 -0
  357. package/dist/peer/transports/index.d.ts.map +1 -0
  358. package/dist/peer/transports/index.js +8 -0
  359. package/dist/peer/transports/index.js.map +1 -0
  360. package/dist/peer/transports/local-transport.d.ts +56 -0
  361. package/dist/peer/transports/local-transport.d.ts.map +1 -0
  362. package/dist/peer/transports/local-transport.js +263 -0
  363. package/dist/peer/transports/local-transport.js.map +1 -0
  364. package/dist/peer/transports/websocket-transport.d.ts +86 -0
  365. package/dist/peer/transports/websocket-transport.d.ts.map +1 -0
  366. package/dist/peer/transports/websocket-transport.js +338 -0
  367. package/dist/peer/transports/websocket-transport.js.map +1 -0
  368. package/dist/peer/types.d.ts +268 -0
  369. package/dist/peer/types.d.ts.map +1 -0
  370. package/dist/peer/types.js +36 -0
  371. package/dist/peer/types.js.map +1 -0
  372. package/dist/router/address-resolver.d.ts +102 -0
  373. package/dist/router/address-resolver.d.ts.map +1 -0
  374. package/dist/router/address-resolver.js +198 -0
  375. package/dist/router/address-resolver.js.map +1 -0
  376. package/dist/router/broadcast.d.ts +53 -0
  377. package/dist/router/broadcast.d.ts.map +1 -0
  378. package/dist/router/broadcast.js +75 -0
  379. package/dist/router/broadcast.js.map +1 -0
  380. package/dist/router/channels.d.ts +148 -0
  381. package/dist/router/channels.d.ts.map +1 -0
  382. package/dist/router/channels.js +126 -0
  383. package/dist/router/channels.js.map +1 -0
  384. package/dist/router/index.d.ts +21 -0
  385. package/dist/router/index.d.ts.map +1 -0
  386. package/dist/router/index.js +18 -0
  387. package/dist/router/index.js.map +1 -0
  388. package/dist/router/message-router.d.ts +197 -0
  389. package/dist/router/message-router.d.ts.map +1 -0
  390. package/dist/router/message-router.js +903 -0
  391. package/dist/router/message-router.js.map +1 -0
  392. package/dist/router/message-types.d.ts +183 -0
  393. package/dist/router/message-types.d.ts.map +1 -0
  394. package/dist/router/message-types.js +79 -0
  395. package/dist/router/message-types.js.map +1 -0
  396. package/dist/router/role-resolver.d.ts +67 -0
  397. package/dist/router/role-resolver.d.ts.map +1 -0
  398. package/dist/router/role-resolver.js +106 -0
  399. package/dist/router/role-resolver.js.map +1 -0
  400. package/dist/router/signals.d.ts +253 -0
  401. package/dist/router/signals.d.ts.map +1 -0
  402. package/dist/router/signals.js +53 -0
  403. package/dist/router/signals.js.map +1 -0
  404. package/dist/router/types.d.ts +191 -0
  405. package/dist/router/types.d.ts.map +1 -0
  406. package/dist/router/types.js +34 -0
  407. package/dist/router/types.js.map +1 -0
  408. package/dist/router/wake.d.ts +111 -0
  409. package/dist/router/wake.d.ts.map +1 -0
  410. package/dist/router/wake.js +180 -0
  411. package/dist/router/wake.js.map +1 -0
  412. package/dist/server/combined-server.d.ts +95 -0
  413. package/dist/server/combined-server.d.ts.map +1 -0
  414. package/dist/server/combined-server.js +335 -0
  415. package/dist/server/combined-server.js.map +1 -0
  416. package/dist/steering/index.d.ts +11 -0
  417. package/dist/steering/index.d.ts.map +1 -0
  418. package/dist/steering/index.js +11 -0
  419. package/dist/steering/index.js.map +1 -0
  420. package/dist/steering/inject.d.ts +39 -0
  421. package/dist/steering/inject.d.ts.map +1 -0
  422. package/dist/steering/inject.js +197 -0
  423. package/dist/steering/inject.js.map +1 -0
  424. package/dist/steering/types.d.ts +100 -0
  425. package/dist/steering/types.d.ts.map +1 -0
  426. package/dist/steering/types.js +11 -0
  427. package/dist/steering/types.js.map +1 -0
  428. package/dist/store/backends/index.d.ts +11 -0
  429. package/dist/store/backends/index.d.ts.map +1 -0
  430. package/dist/store/backends/index.js +15 -0
  431. package/dist/store/backends/index.js.map +1 -0
  432. package/dist/store/backends/json-backend.d.ts +23 -0
  433. package/dist/store/backends/json-backend.d.ts.map +1 -0
  434. package/dist/store/backends/json-backend.js +220 -0
  435. package/dist/store/backends/json-backend.js.map +1 -0
  436. package/dist/store/backends/memory-backend.d.ts +12 -0
  437. package/dist/store/backends/memory-backend.d.ts.map +1 -0
  438. package/dist/store/backends/memory-backend.js +205 -0
  439. package/dist/store/backends/memory-backend.js.map +1 -0
  440. package/dist/store/backends/sqlite-backend.d.ts +27 -0
  441. package/dist/store/backends/sqlite-backend.d.ts.map +1 -0
  442. package/dist/store/backends/sqlite-backend.js +231 -0
  443. package/dist/store/backends/sqlite-backend.js.map +1 -0
  444. package/dist/store/backends/tinybase-backend.d.ts +22 -0
  445. package/dist/store/backends/tinybase-backend.d.ts.map +1 -0
  446. package/dist/store/backends/tinybase-backend.js +203 -0
  447. package/dist/store/backends/tinybase-backend.js.map +1 -0
  448. package/dist/store/backends/types.d.ts +175 -0
  449. package/dist/store/backends/types.d.ts.map +1 -0
  450. package/dist/store/backends/types.js +28 -0
  451. package/dist/store/backends/types.js.map +1 -0
  452. package/dist/store/event-store.d.ts +128 -0
  453. package/dist/store/event-store.d.ts.map +1 -0
  454. package/dist/store/event-store.js +1751 -0
  455. package/dist/store/event-store.js.map +1 -0
  456. package/dist/store/instance.d.ts +290 -0
  457. package/dist/store/instance.d.ts.map +1 -0
  458. package/dist/store/instance.js +363 -0
  459. package/dist/store/instance.js.map +1 -0
  460. package/dist/store/migrations.d.ts +41 -0
  461. package/dist/store/migrations.d.ts.map +1 -0
  462. package/dist/store/migrations.js +79 -0
  463. package/dist/store/migrations.js.map +1 -0
  464. package/dist/store/test-utils.d.ts +63 -0
  465. package/dist/store/test-utils.d.ts.map +1 -0
  466. package/dist/store/test-utils.js +63 -0
  467. package/dist/store/test-utils.js.map +1 -0
  468. package/dist/store/types/config.d.ts +16 -0
  469. package/dist/store/types/config.d.ts.map +1 -0
  470. package/dist/store/types/config.js +8 -0
  471. package/dist/store/types/config.js.map +1 -0
  472. package/dist/store/types/conversations.d.ts +91 -0
  473. package/dist/store/types/conversations.d.ts.map +1 -0
  474. package/dist/store/types/conversations.js +8 -0
  475. package/dist/store/types/conversations.js.map +1 -0
  476. package/dist/store/types/sessions.d.ts +44 -0
  477. package/dist/store/types/sessions.d.ts.map +1 -0
  478. package/dist/store/types/sessions.js +9 -0
  479. package/dist/store/types/sessions.js.map +1 -0
  480. package/dist/store/types.d.ts +115 -0
  481. package/dist/store/types.d.ts.map +1 -0
  482. package/dist/store/types.js +6 -0
  483. package/dist/store/types.js.map +1 -0
  484. package/dist/task/backend/index.d.ts +93 -0
  485. package/dist/task/backend/index.d.ts.map +1 -0
  486. package/dist/task/backend/index.js +178 -0
  487. package/dist/task/backend/index.js.map +1 -0
  488. package/dist/task/backend/memory.d.ts +70 -0
  489. package/dist/task/backend/memory.d.ts.map +1 -0
  490. package/dist/task/backend/memory.js +621 -0
  491. package/dist/task/backend/memory.js.map +1 -0
  492. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  493. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  494. package/dist/task/backend/opentasks/backend.js +1023 -0
  495. package/dist/task/backend/opentasks/backend.js.map +1 -0
  496. package/dist/task/backend/opentasks/client.d.ts +337 -0
  497. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  498. package/dist/task/backend/opentasks/client.js +225 -0
  499. package/dist/task/backend/opentasks/client.js.map +1 -0
  500. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  501. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  502. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  503. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  504. package/dist/task/backend/opentasks/index.d.ts +21 -0
  505. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  506. package/dist/task/backend/opentasks/index.js +21 -0
  507. package/dist/task/backend/opentasks/index.js.map +1 -0
  508. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  509. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  510. package/dist/task/backend/opentasks/mapping.js +77 -0
  511. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  512. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts +54 -0
  513. package/dist/task/backend/sudocode/__tests__/integration/test-utils.d.ts.map +1 -0
  514. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js +88 -0
  515. package/dist/task/backend/sudocode/__tests__/integration/test-utils.js.map +1 -0
  516. package/dist/task/backend/sudocode/backend.d.ts +155 -0
  517. package/dist/task/backend/sudocode/backend.d.ts.map +1 -0
  518. package/dist/task/backend/sudocode/backend.js +942 -0
  519. package/dist/task/backend/sudocode/backend.js.map +1 -0
  520. package/dist/task/backend/sudocode/client.d.ts +303 -0
  521. package/dist/task/backend/sudocode/client.d.ts.map +1 -0
  522. package/dist/task/backend/sudocode/client.js +101 -0
  523. package/dist/task/backend/sudocode/client.js.map +1 -0
  524. package/dist/task/backend/sudocode/index.d.ts +19 -0
  525. package/dist/task/backend/sudocode/index.d.ts.map +1 -0
  526. package/dist/task/backend/sudocode/index.js +17 -0
  527. package/dist/task/backend/sudocode/index.js.map +1 -0
  528. package/dist/task/backend/sudocode/mapping.d.ts +51 -0
  529. package/dist/task/backend/sudocode/mapping.d.ts.map +1 -0
  530. package/dist/task/backend/sudocode/mapping.js +86 -0
  531. package/dist/task/backend/sudocode/mapping.js.map +1 -0
  532. package/dist/task/backend/sudocode/server-client.d.ts +56 -0
  533. package/dist/task/backend/sudocode/server-client.d.ts.map +1 -0
  534. package/dist/task/backend/sudocode/server-client.js +367 -0
  535. package/dist/task/backend/sudocode/server-client.js.map +1 -0
  536. package/dist/task/backend/sudocode/standalone-client.d.ts +91 -0
  537. package/dist/task/backend/sudocode/standalone-client.d.ts.map +1 -0
  538. package/dist/task/backend/sudocode/standalone-client.js +476 -0
  539. package/dist/task/backend/sudocode/standalone-client.js.map +1 -0
  540. package/dist/task/backend/sudocode/sync-policy.d.ts +166 -0
  541. package/dist/task/backend/sudocode/sync-policy.d.ts.map +1 -0
  542. package/dist/task/backend/sudocode/sync-policy.js +221 -0
  543. package/dist/task/backend/sudocode/sync-policy.js.map +1 -0
  544. package/dist/task/backend/sudocode/tools.d.ts +87 -0
  545. package/dist/task/backend/sudocode/tools.d.ts.map +1 -0
  546. package/dist/task/backend/sudocode/tools.js +743 -0
  547. package/dist/task/backend/sudocode/tools.js.map +1 -0
  548. package/dist/task/backend/tool-provider.d.ts +56 -0
  549. package/dist/task/backend/tool-provider.d.ts.map +1 -0
  550. package/dist/task/backend/tool-provider.js +424 -0
  551. package/dist/task/backend/tool-provider.js.map +1 -0
  552. package/dist/task/backend/types.d.ts +297 -0
  553. package/dist/task/backend/types.d.ts.map +1 -0
  554. package/dist/task/backend/types.js +27 -0
  555. package/dist/task/backend/types.js.map +1 -0
  556. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  557. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  558. package/dist/task/backend/unified-tool-provider.js +623 -0
  559. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  560. package/dist/task/index.d.ts +7 -0
  561. package/dist/task/index.d.ts.map +1 -0
  562. package/dist/task/index.js +7 -0
  563. package/dist/task/index.js.map +1 -0
  564. package/dist/task/retry-policy.d.ts +89 -0
  565. package/dist/task/retry-policy.d.ts.map +1 -0
  566. package/dist/task/retry-policy.js +160 -0
  567. package/dist/task/retry-policy.js.map +1 -0
  568. package/dist/task/task-manager.d.ts +70 -0
  569. package/dist/task/task-manager.d.ts.map +1 -0
  570. package/dist/task/task-manager.js +319 -0
  571. package/dist/task/task-manager.js.map +1 -0
  572. package/dist/task/types.d.ts +72 -0
  573. package/dist/task/types.d.ts.map +1 -0
  574. package/dist/task/types.js +33 -0
  575. package/dist/task/types.js.map +1 -0
  576. package/dist/teams/team-loader.d.ts +2 -1
  577. package/dist/teams/team-loader.d.ts.map +1 -1
  578. package/dist/teams/team-loader.js +2 -1
  579. package/dist/teams/team-loader.js.map +1 -1
  580. package/dist/teams/team-manager.d.ts +101 -0
  581. package/dist/teams/team-manager.d.ts.map +1 -0
  582. package/dist/teams/team-manager.js +260 -0
  583. package/dist/teams/team-manager.js.map +1 -0
  584. package/dist/teams/team-runtime-v2.d.ts +0 -3
  585. package/dist/teams/team-runtime-v2.d.ts.map +1 -1
  586. package/dist/teams/team-runtime-v2.js +31 -93
  587. package/dist/teams/team-runtime-v2.js.map +1 -1
  588. package/dist/teams/team-runtime.d.ts +245 -0
  589. package/dist/teams/team-runtime.d.ts.map +1 -0
  590. package/dist/teams/team-runtime.js +1023 -0
  591. package/dist/teams/team-runtime.js.map +1 -0
  592. package/dist/trigger/router/index.d.ts +11 -0
  593. package/dist/trigger/router/index.d.ts.map +1 -0
  594. package/dist/trigger/router/index.js +10 -0
  595. package/dist/trigger/router/index.js.map +1 -0
  596. package/dist/trigger/router/strategies/ai-router-strategy.d.ts +34 -0
  597. package/dist/trigger/router/strategies/ai-router-strategy.d.ts.map +1 -0
  598. package/dist/trigger/router/strategies/ai-router-strategy.js +359 -0
  599. package/dist/trigger/router/strategies/ai-router-strategy.js.map +1 -0
  600. package/dist/trigger/router/strategies/direct-strategy.d.ts +32 -0
  601. package/dist/trigger/router/strategies/direct-strategy.d.ts.map +1 -0
  602. package/dist/trigger/router/strategies/direct-strategy.js +119 -0
  603. package/dist/trigger/router/strategies/direct-strategy.js.map +1 -0
  604. package/dist/trigger/router/strategies/index.d.ts +11 -0
  605. package/dist/trigger/router/strategies/index.d.ts.map +1 -0
  606. package/dist/trigger/router/strategies/index.js +11 -0
  607. package/dist/trigger/router/strategies/index.js.map +1 -0
  608. package/dist/trigger/router/strategies/role-strategy.d.ts +39 -0
  609. package/dist/trigger/router/strategies/role-strategy.d.ts.map +1 -0
  610. package/dist/trigger/router/strategies/role-strategy.js +207 -0
  611. package/dist/trigger/router/strategies/role-strategy.js.map +1 -0
  612. package/dist/trigger/router/trigger-router.d.ts +54 -0
  613. package/dist/trigger/router/trigger-router.d.ts.map +1 -0
  614. package/dist/trigger/router/trigger-router.js +362 -0
  615. package/dist/trigger/router/trigger-router.js.map +1 -0
  616. package/dist/trigger/router/types.d.ts +225 -0
  617. package/dist/trigger/router/types.d.ts.map +1 -0
  618. package/dist/trigger/router/types.js +10 -0
  619. package/dist/trigger/router/types.js.map +1 -0
  620. package/dist/trigger/sources/cron/cron-service.d.ts.map +1 -1
  621. package/dist/trigger/sources/cron/cron-service.js +6 -3
  622. package/dist/trigger/sources/cron/cron-service.js.map +1 -1
  623. package/dist/trigger/trigger-system.d.ts +77 -0
  624. package/dist/trigger/trigger-system.d.ts.map +1 -0
  625. package/dist/trigger/trigger-system.js +84 -0
  626. package/dist/trigger/trigger-system.js.map +1 -0
  627. package/dist/util/git-safety.d.ts +33 -0
  628. package/dist/util/git-safety.d.ts.map +1 -0
  629. package/dist/util/git-safety.js +94 -0
  630. package/dist/util/git-safety.js.map +1 -0
  631. package/dist/workspace/index.d.ts +0 -1
  632. package/dist/workspace/index.d.ts.map +1 -1
  633. package/dist/workspace/index.js +0 -2
  634. package/dist/workspace/index.js.map +1 -1
  635. package/dist/workspace/landing/direct-push.d.ts.map +1 -1
  636. package/dist/workspace/landing/direct-push.js +22 -7
  637. package/dist/workspace/landing/direct-push.js.map +1 -1
  638. package/dist/workspace/landing/queue-to-branch.d.ts.map +1 -1
  639. package/dist/workspace/landing/queue-to-branch.js +1 -3
  640. package/dist/workspace/landing/queue-to-branch.js.map +1 -1
  641. package/dist/workspace/types.d.ts +0 -13
  642. package/dist/workspace/types.d.ts.map +1 -1
  643. package/dist/workspace/workspace-manager.d.ts +0 -11
  644. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  645. package/dist/workspace/workspace-manager.js +0 -30
  646. package/dist/workspace/workspace-manager.js.map +1 -1
  647. package/package.json +28 -2
  648. package/templates/teams/self-driving/prompts/grinder.md +1 -0
  649. package/templates/teams/self-driving/prompts/judge.md +1 -0
  650. package/templates/teams/self-driving/prompts/planner.md +1 -0
  651. package/templates/teams/self-driving/roles/grinder.yaml +15 -0
  652. package/templates/teams/self-driving/roles/judge.yaml +10 -0
  653. package/templates/teams/self-driving/roles/planner.yaml +16 -0
  654. package/.claude/commands/openspec/apply.md +0 -23
  655. package/.claude/commands/openspec/archive.md +0 -27
  656. package/.claude/commands/openspec/proposal.md +0 -28
  657. package/.claude/settings.json +0 -133
  658. package/.gitattributes +0 -3
  659. package/.opentasks/config.json +0 -9
  660. package/.opentasks/graph.jsonl +0 -0
  661. package/.sessionlog/settings.json +0 -4
  662. package/.sudocode/issues.jsonl +0 -183
  663. package/.sudocode/specs.jsonl +0 -56
  664. package/AGENTS.md +0 -18
  665. package/CLAUDE.md +0 -923
  666. package/docs/architecture.md +0 -508
  667. package/docs/configuration.md +0 -323
  668. package/docs/conflict-recovery.md +0 -472
  669. package/docs/design/task-dispatcher.md +0 -880
  670. package/docs/design-subsystem-extraction.md +0 -627
  671. package/docs/git-cascade-integration-gaps.md +0 -678
  672. package/docs/implementation-details.md +0 -1127
  673. package/docs/implementation-summary.md +0 -448
  674. package/docs/lifecycle-events-design.md +0 -111
  675. package/docs/mail-integration.md +0 -608
  676. package/docs/openhive-capability-summary.md +0 -415
  677. package/docs/openhive-integration.md +0 -415
  678. package/docs/plan-self-driving-support.md +0 -433
  679. package/docs/roadmap-v2-gaps.md +0 -216
  680. package/docs/spec-self-driving-support.md +0 -462
  681. package/docs/team-templates.md +0 -860
  682. package/docs/teams.md +0 -306
  683. package/docs/trigger-system-design.md +0 -333
  684. package/docs/troubleshooting.md +0 -489
  685. package/docs/workspace-interfaces.md +0 -731
  686. package/docs/workspace-redesign-plan.md +0 -302
  687. package/examples/distributed-peer-communication.ts +0 -202
  688. package/examples/local-peer-communication.ts +0 -165
  689. package/index.js +0 -2
  690. package/mvp_docs/agent-execution-system.md +0 -347
  691. package/mvp_docs/agent-interface.md +0 -580
  692. package/mvp_docs/data-structures.md +0 -701
  693. package/mvp_docs/dynamic-meta-orchestration.md +0 -116
  694. package/mvp_docs/multi-agent-interaction-design.md +0 -779
  695. package/mvp_docs/mvp-implementation-plan.md +0 -1148
  696. package/renovate.json5 +0 -6
  697. package/scripts/test-acp-integration.ts +0 -422
  698. package/src/__tests__/boot-v2.test.ts +0 -631
  699. package/src/__tests__/e2e/acp-over-map-live.e2e.test.ts +0 -496
  700. package/src/__tests__/e2e/acp-over-map.e2e.test.ts +0 -457
  701. package/src/__tests__/e2e/agent-lifecycle.e2e.test.ts +0 -770
  702. package/src/__tests__/e2e/auto-sync.e2e.test.ts +0 -257
  703. package/src/__tests__/e2e/bootstrap.e2e.test.ts +0 -319
  704. package/src/__tests__/e2e/cascade-rebase.e2e.test.ts +0 -254
  705. package/src/__tests__/e2e/cc-swarm-bridge.e2e.test.ts +0 -253
  706. package/src/__tests__/e2e/cli-run.e2e.test.ts +0 -167
  707. package/src/__tests__/e2e/cognitive-workspace.e2e.test.ts +0 -282
  708. package/src/__tests__/e2e/dispatch-coordination.e2e.test.ts +0 -495
  709. package/src/__tests__/e2e/dispatch-live.e2e.test.ts +0 -564
  710. package/src/__tests__/e2e/dispatch-opentasks.e2e.test.ts +0 -496
  711. package/src/__tests__/e2e/dispatch-phase2-live.e2e.test.ts +0 -456
  712. package/src/__tests__/e2e/dispatch-phase2.e2e.test.ts +0 -386
  713. package/src/__tests__/e2e/dispatch.e2e.test.ts +0 -376
  714. package/src/__tests__/e2e/done-scenarios.e2e.test.ts +0 -322
  715. package/src/__tests__/e2e/live-agent.e2e.test.ts +0 -1330
  716. package/src/__tests__/e2e/map-server.e2e.test.ts +0 -128
  717. package/src/__tests__/e2e/map-sidecar.e2e.test.ts +0 -139
  718. package/src/__tests__/e2e/opentasks-integration.e2e.test.ts +0 -280
  719. package/src/__tests__/e2e/pull-mode.e2e.test.ts +0 -632
  720. package/src/__tests__/e2e/resume-continue.e2e.test.ts +0 -312
  721. package/src/__tests__/e2e/self-driving-v3.e2e.test.ts +0 -197
  722. package/src/__tests__/e2e/spawn-resolver.e2e.test.ts +0 -200
  723. package/src/__tests__/e2e/swarmkit-integration.e2e.test.ts +0 -562
  724. package/src/__tests__/e2e/swarmkit-live.e2e.test.ts +0 -1049
  725. package/src/__tests__/e2e/trajectory-tracking.e2e.test.ts +0 -258
  726. package/src/__tests__/e2e/trigger-wake.e2e.test.ts +0 -257
  727. package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +0 -383
  728. package/src/__tests__/e2e/workspace-v3.e2e.test.ts +0 -413
  729. package/src/acp/__tests__/claude-code-replay.test.ts +0 -225
  730. package/src/acp/__tests__/macro-agent.test.ts +0 -387
  731. package/src/acp/__tests__/session-mapper.test.ts +0 -152
  732. package/src/acp/__tests__/websocket-server.test.ts +0 -194
  733. package/src/acp/claude-code-replay.ts +0 -208
  734. package/src/acp/index.ts +0 -32
  735. package/src/acp/macro-agent.ts +0 -995
  736. package/src/acp/map-bridge.ts +0 -193
  737. package/src/acp/session-mapper.ts +0 -116
  738. package/src/acp/types.ts +0 -99
  739. package/src/acp/websocket-server.ts +0 -213
  740. package/src/adapters/__tests__/federation.test.ts +0 -256
  741. package/src/adapters/__tests__/inbox-adapter.test.ts +0 -316
  742. package/src/adapters/__tests__/tasks-adapter.test.ts +0 -270
  743. package/src/adapters/federation.ts +0 -185
  744. package/src/adapters/inbox-adapter.ts +0 -292
  745. package/src/adapters/inbox-client-adapter.ts +0 -173
  746. package/src/adapters/index.ts +0 -44
  747. package/src/adapters/opentasks-daemon.ts +0 -252
  748. package/src/adapters/tasks-adapter.ts +0 -330
  749. package/src/adapters/types.ts +0 -286
  750. package/src/agent/__tests__/agent-manager-topology.test.ts +0 -73
  751. package/src/agent/__tests__/agent-manager-v2.permission-interception.test.ts +0 -296
  752. package/src/agent/__tests__/agent-manager-v2.permissions.test.ts +0 -233
  753. package/src/agent/__tests__/agent-manager-v2.test.ts +0 -614
  754. package/src/agent/__tests__/agent-store.test.ts +0 -465
  755. package/src/agent/__tests__/task-ref-resolution.test.ts +0 -231
  756. package/src/agent/agent-manager-v2.ts +0 -2021
  757. package/src/agent/agent-manager.ts +0 -386
  758. package/src/agent/agent-store.ts +0 -409
  759. package/src/agent/index.ts +0 -7
  760. package/src/agent/prompts/coordinator-signals.ts +0 -115
  761. package/src/agent/prompts/index.ts +0 -7
  762. package/src/agent/system-prompt.ts +0 -298
  763. package/src/agent/types.ts +0 -459
  764. package/src/agent-detection/__tests__/command-builder.test.ts +0 -336
  765. package/src/agent-detection/__tests__/detector.test.ts +0 -768
  766. package/src/agent-detection/__tests__/registry.test.ts +0 -254
  767. package/src/agent-detection/command-builder.ts +0 -90
  768. package/src/agent-detection/detector.ts +0 -307
  769. package/src/agent-detection/index.ts +0 -36
  770. package/src/agent-detection/registry.ts +0 -200
  771. package/src/agent-detection/types.ts +0 -184
  772. package/src/api/__tests__/server.test.ts +0 -292
  773. package/src/api/index.ts +0 -8
  774. package/src/api/server.ts +0 -380
  775. package/src/api/types.ts +0 -39
  776. package/src/auth/__tests__/token.test.ts +0 -100
  777. package/src/auth/index.ts +0 -1
  778. package/src/auth/token.ts +0 -82
  779. package/src/boot-v2.ts +0 -1343
  780. package/src/cli/__tests__/stable-instance-id.test.ts +0 -57
  781. package/src/cli/acp.ts +0 -101
  782. package/src/cli/inbox-mcp-proxy.ts +0 -56
  783. package/src/cli/index.ts +0 -566
  784. package/src/cli/mcp.ts +0 -305
  785. package/src/cli/parse-args.ts +0 -54
  786. package/src/cli/stable-instance-id.ts +0 -14
  787. package/src/cognitive/__tests__/macro-agent-backend.test.ts +0 -520
  788. package/src/cognitive/__tests__/session-converter.test.ts +0 -423
  789. package/src/cognitive/__tests__/workspace-handler.test.ts +0 -221
  790. package/src/cognitive/analyst-role.ts +0 -59
  791. package/src/cognitive/index.ts +0 -49
  792. package/src/cognitive/macro-agent-backend.ts +0 -370
  793. package/src/cognitive/session-converter.ts +0 -151
  794. package/src/cognitive/types.ts +0 -163
  795. package/src/cognitive/workspace-handler.ts +0 -163
  796. package/src/config/index.ts +0 -9
  797. package/src/config/project-config.ts +0 -294
  798. package/src/control/__tests__/control-resilience.test.ts +0 -251
  799. package/src/control/__tests__/control-socket.test.ts +0 -240
  800. package/src/control/control-client.ts +0 -337
  801. package/src/control/control-server.ts +0 -298
  802. package/src/control/index.ts +0 -17
  803. package/src/control/types.ts +0 -95
  804. package/src/dispatch/CLAUDE.md +0 -129
  805. package/src/dispatch/__tests__/loadout-translation.test.ts +0 -141
  806. package/src/dispatch/__tests__/mail-inbound-consumer.integration.test.ts +0 -519
  807. package/src/dispatch/__tests__/mail-inbound-consumer.test.ts +0 -800
  808. package/src/dispatch/__tests__/mail-inbound-reuse-consumer.test.ts +0 -575
  809. package/src/dispatch/__tests__/permission-evaluator.test.ts +0 -196
  810. package/src/dispatch/__tests__/permission-overlay.test.ts +0 -56
  811. package/src/dispatch/__tests__/permissions-handler.test.ts +0 -168
  812. package/src/dispatch/__tests__/spawn-agent-handler.test.ts +0 -282
  813. package/src/dispatch/loadout-translation.ts +0 -138
  814. package/src/dispatch/mail-inbound-consumer.ts +0 -560
  815. package/src/dispatch/mail-inbound-reuse-consumer.ts +0 -479
  816. package/src/dispatch/permission-evaluator.ts +0 -191
  817. package/src/dispatch/permission-overlay.ts +0 -89
  818. package/src/dispatch/permissions-handler.ts +0 -112
  819. package/src/dispatch/spawn-agent-handler.ts +0 -160
  820. package/src/index.ts +0 -115
  821. package/src/integrations/__tests__/context-builder.test.ts +0 -218
  822. package/src/integrations/__tests__/sessionlog.test.ts +0 -498
  823. package/src/integrations/__tests__/skilltree.test.ts +0 -136
  824. package/src/integrations/context-builder.ts +0 -280
  825. package/src/integrations/sessionlog.ts +0 -194
  826. package/src/integrations/skilltree.ts +0 -184
  827. package/src/lifecycle/__tests__/cascade-consolidation.test.ts +0 -240
  828. package/src/lifecycle/__tests__/handlers-v2.test.ts +0 -565
  829. package/src/lifecycle/cascade.ts +0 -335
  830. package/src/lifecycle/cleanup.ts +0 -373
  831. package/src/lifecycle/handlers-v2.ts +0 -508
  832. package/src/lifecycle/index.ts +0 -76
  833. package/src/lifecycle/types.ts +0 -260
  834. package/src/map/__tests__/cascade-bridge.test.ts +0 -229
  835. package/src/map/__tests__/cascade-diff-server.test.ts +0 -434
  836. package/src/map/__tests__/emit-event.test.ts +0 -71
  837. package/src/map/__tests__/lifecycle-bridge.test.ts +0 -430
  838. package/src/map/__tests__/mail-bridge.test.ts +0 -284
  839. package/src/map/__tests__/permission-forwarding.test.ts +0 -143
  840. package/src/map/__tests__/sidecar-diff-install-smoke.test.ts +0 -90
  841. package/src/map/__tests__/sidecar-integration.test.ts +0 -190
  842. package/src/map/__tests__/task-bridge.test.ts +0 -153
  843. package/src/map/__tests__/trajectory-reporter.test.ts +0 -173
  844. package/src/map/acp-bridge.ts +0 -293
  845. package/src/map/cascade-action-handler.ts +0 -205
  846. package/src/map/cascade-bridge.ts +0 -339
  847. package/src/map/cascade-diff-server.ts +0 -404
  848. package/src/map/cc-swarm-hooks.ts +0 -242
  849. package/src/map/coordination-handler.ts +0 -232
  850. package/src/map/index.ts +0 -18
  851. package/src/map/lifecycle-bridge.ts +0 -236
  852. package/src/map/mail-bridge.ts +0 -215
  853. package/src/map/repo-workspace.ts +0 -82
  854. package/src/map/server.ts +0 -758
  855. package/src/map/sidecar.ts +0 -826
  856. package/src/map/task-bridge.ts +0 -89
  857. package/src/map/trajectory-reporter.ts +0 -124
  858. package/src/map/types.ts +0 -304
  859. package/src/mcp/__tests__/mcp-server-v2.test.ts +0 -236
  860. package/src/mcp/index.ts +0 -6
  861. package/src/mcp/mcp-server-v2.ts +0 -485
  862. package/src/mcp/tools/done-v2.ts +0 -213
  863. package/src/mcp/types.ts +0 -432
  864. package/src/metrics/__tests__/metrics.test.ts +0 -205
  865. package/src/metrics/index.ts +0 -13
  866. package/src/metrics/metrics.ts +0 -151
  867. package/src/metrics/types.ts +0 -63
  868. package/src/roles/__tests__/config-loader.test.ts +0 -540
  869. package/src/roles/builtin/coordinator.ts +0 -75
  870. package/src/roles/builtin/generic.ts +0 -39
  871. package/src/roles/builtin/index.ts +0 -51
  872. package/src/roles/builtin/integrator.ts +0 -62
  873. package/src/roles/builtin/monitor.ts +0 -65
  874. package/src/roles/builtin/worker.ts +0 -134
  875. package/src/roles/capabilities.ts +0 -257
  876. package/src/roles/config-loader.ts +0 -405
  877. package/src/roles/index.ts +0 -141
  878. package/src/roles/registry.ts +0 -713
  879. package/src/roles/types.ts +0 -344
  880. package/src/store/index.ts +0 -8
  881. package/src/store/types/agents.ts +0 -69
  882. package/src/store/types/events.ts +0 -91
  883. package/src/store/types/index.ts +0 -9
  884. package/src/store/types/messages.ts +0 -32
  885. package/src/store/types/primitives.ts +0 -9
  886. package/src/store/types/tasks.ts +0 -124
  887. package/src/teams/__tests__/team-manager-v2.test.ts +0 -425
  888. package/src/teams/__tests__/team-runtime-v2.test.ts +0 -402
  889. package/src/teams/index.ts +0 -29
  890. package/src/teams/seed-defaults.ts +0 -83
  891. package/src/teams/team-loader.ts +0 -476
  892. package/src/teams/team-manager-v2.ts +0 -343
  893. package/src/teams/team-runtime-v2.ts +0 -920
  894. package/src/teams/types.ts +0 -276
  895. package/src/trigger/__tests__/cron-service.test.ts +0 -548
  896. package/src/trigger/__tests__/scheduler.test.ts +0 -371
  897. package/src/trigger/__tests__/system-event-queue.test.ts +0 -147
  898. package/src/trigger/__tests__/trigger-system-v2.test.ts +0 -257
  899. package/src/trigger/__tests__/wake-manager.test.ts +0 -356
  900. package/src/trigger/__tests__/webhook-handler.test.ts +0 -567
  901. package/src/trigger/index.ts +0 -110
  902. package/src/trigger/queue/index.ts +0 -21
  903. package/src/trigger/queue/system-event-queue.ts +0 -232
  904. package/src/trigger/queue/types.ts +0 -149
  905. package/src/trigger/sources/cron/cron-service.ts +0 -499
  906. package/src/trigger/sources/cron/index.ts +0 -41
  907. package/src/trigger/sources/cron/scheduler.ts +0 -344
  908. package/src/trigger/sources/cron/types.ts +0 -333
  909. package/src/trigger/sources/index.ts +0 -10
  910. package/src/trigger/sources/webhook/index.ts +0 -25
  911. package/src/trigger/sources/webhook/types.ts +0 -205
  912. package/src/trigger/sources/webhook/webhook-handler.ts +0 -410
  913. package/src/trigger/strategies/ai-router.ts +0 -170
  914. package/src/trigger/trigger-system-v2.ts +0 -536
  915. package/src/trigger/types.ts +0 -228
  916. package/src/trigger/wake/index.ts +0 -22
  917. package/src/trigger/wake/types.ts +0 -162
  918. package/src/trigger/wake/wake-manager.ts +0 -390
  919. package/src/workspace/__tests__/git-cascade-adapter.test.ts +0 -563
  920. package/src/workspace/__tests__/land-dispatch.test.ts +0 -214
  921. package/src/workspace/__tests__/self-driving-yaml.test.ts +0 -122
  922. package/src/workspace/__tests__/shared-worktree-refcount.test.ts +0 -154
  923. package/src/workspace/__tests__/standalone-mode.test.ts +0 -118
  924. package/src/workspace/__tests__/workspace-manager-v3.test.ts +0 -245
  925. package/src/workspace/__tests__/yaml-schema.test.ts +0 -210
  926. package/src/workspace/config.ts +0 -165
  927. package/src/workspace/git-cascade-adapter.ts +0 -1213
  928. package/src/workspace/index.ts +0 -110
  929. package/src/workspace/landing/__tests__/strategies.test.ts +0 -184
  930. package/src/workspace/landing/direct-push.ts +0 -91
  931. package/src/workspace/landing/index.ts +0 -40
  932. package/src/workspace/landing/merge-to-parent.ts +0 -229
  933. package/src/workspace/landing/optimistic-push.ts +0 -36
  934. package/src/workspace/landing/queue-to-branch.ts +0 -108
  935. package/src/workspace/merge-queue/__tests__/conflict-resolution-git.e2e.test.ts +0 -641
  936. package/src/workspace/merge-queue/__tests__/conflict-resolution.test.ts +0 -707
  937. package/src/workspace/merge-queue/__tests__/merge-queue-concurrent.test.ts +0 -628
  938. package/src/workspace/merge-queue/__tests__/merge-queue-edge-cases.test.ts +0 -1217
  939. package/src/workspace/merge-queue/__tests__/merge-queue.test.ts +0 -506
  940. package/src/workspace/merge-queue/__tests__/real-git-operations.e2e.test.ts +0 -556
  941. package/src/workspace/merge-queue/__tests__/resolver-flow.test.ts +0 -472
  942. package/src/workspace/merge-queue/index.ts +0 -38
  943. package/src/workspace/merge-queue/merge-queue.ts +0 -585
  944. package/src/workspace/merge-queue/schema.ts +0 -98
  945. package/src/workspace/merge-queue/types.ts +0 -316
  946. package/src/workspace/pool/__tests__/worktree-pool.integration.test.ts +0 -1281
  947. package/src/workspace/pool/__tests__/worktree-pool.test.ts +0 -590
  948. package/src/workspace/pool/index.ts +0 -26
  949. package/src/workspace/pool/types.ts +0 -276
  950. package/src/workspace/pool/worktree-pool.ts +0 -659
  951. package/src/workspace/recovery/__tests__/auto-resolve-integration.test.ts +0 -127
  952. package/src/workspace/recovery/__tests__/spawn-resolver.test.ts +0 -139
  953. package/src/workspace/recovery/__tests__/strategies.test.ts +0 -145
  954. package/src/workspace/recovery/abandon.ts +0 -51
  955. package/src/workspace/recovery/auto-resolve.ts +0 -119
  956. package/src/workspace/recovery/defer.ts +0 -23
  957. package/src/workspace/recovery/escalate.ts +0 -30
  958. package/src/workspace/recovery/index.ts +0 -58
  959. package/src/workspace/recovery/spawn-resolver.ts +0 -152
  960. package/src/workspace/recovery/types.ts +0 -54
  961. package/src/workspace/strategies/index.ts +0 -18
  962. package/src/workspace/strategies/optimistic.ts +0 -139
  963. package/src/workspace/strategies/queue.ts +0 -81
  964. package/src/workspace/strategies/registry.ts +0 -89
  965. package/src/workspace/strategies/trunk.ts +0 -123
  966. package/src/workspace/strategies/types.ts +0 -145
  967. package/src/workspace/topology/__tests__/yaml-driven.test.ts +0 -345
  968. package/src/workspace/topology/index.ts +0 -18
  969. package/src/workspace/topology/no-workspace.ts +0 -39
  970. package/src/workspace/topology/types.ts +0 -116
  971. package/src/workspace/topology/yaml-driven.ts +0 -316
  972. package/src/workspace/types-v3.ts +0 -162
  973. package/src/workspace/types.ts +0 -541
  974. package/src/workspace/workspace-manager.ts +0 -1577
  975. package/src/workspace/yaml-schema.ts +0 -216
  976. package/test_fixtures/README.md +0 -425
  977. package/test_fixtures/fixtures/behaviors/coordinators.ts +0 -196
  978. package/test_fixtures/fixtures/behaviors/index.ts +0 -62
  979. package/test_fixtures/fixtures/behaviors/integrators.ts +0 -143
  980. package/test_fixtures/fixtures/behaviors/monitors.ts +0 -199
  981. package/test_fixtures/fixtures/behaviors/workers.ts +0 -348
  982. package/test_fixtures/fixtures/index.ts +0 -7
  983. package/test_fixtures/fixtures/projects/index.ts +0 -23
  984. package/test_fixtures/fixtures/projects/project-with-specs.ts +0 -44
  985. package/test_fixtures/fixtures/projects/typescript-project.ts +0 -200
  986. package/test_fixtures/fixtures/repos/index.ts +0 -6
  987. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -299
  988. package/test_fixtures/fixtures/repos/types.ts +0 -174
  989. package/test_fixtures/harness/assertions/harness-assertions.ts +0 -752
  990. package/test_fixtures/harness/assertions/index.ts +0 -8
  991. package/test_fixtures/harness/index.ts +0 -15
  992. package/test_fixtures/harness/simulator/agent-simulator.ts +0 -768
  993. package/test_fixtures/harness/simulator/behavior-executor.ts +0 -580
  994. package/test_fixtures/harness/simulator/index.ts +0 -14
  995. package/test_fixtures/harness/simulator/types.ts +0 -459
  996. package/test_fixtures/harness/test-harness.ts +0 -770
  997. package/test_fixtures/harness/timing/event-stepper.ts +0 -344
  998. package/test_fixtures/harness/timing/index.ts +0 -8
  999. package/tsconfig.json +0 -21
  1000. package/vitest.config.ts +0 -30
  1001. package/vitest.e2e.config.ts +0 -28
  1002. package/vitest.setup.ts +0 -12
@@ -0,0 +1,942 @@
1
+ /**
2
+ * SudocodeTaskBackend Implementation
3
+ *
4
+ * Implements TaskBackend using EventStore for local task storage and
5
+ * SudocodeClient for external issue data and dependency tracking.
6
+ *
7
+ * @module task/backend/sudocode/backend
8
+ * @see s-8472 Pluggable Task Backend Integration with Sudocode
9
+ * @see i-2gwa 7A.5: Implement SudocodeTaskBackend core
10
+ */
11
+ import { nanoid } from "nanoid";
12
+ import { mapSudocodeStatus, isIssueComplete } from "./mapping.js";
13
+ import { createSyncPolicyEngine, } from "./sync-policy.js";
14
+ // Valid status transitions
15
+ const VALID_STATUS_TRANSITIONS = {
16
+ pending: ["assigned", "in_progress", "failed"],
17
+ assigned: ["in_progress", "pending", "failed"],
18
+ in_progress: ["completed", "failed", "pending"],
19
+ completed: [],
20
+ failed: ["pending"],
21
+ };
22
+ /**
23
+ * Error thrown by SudocodeTaskBackend operations
24
+ */
25
+ export class SudocodeTaskBackendError extends Error {
26
+ code;
27
+ taskId;
28
+ constructor(message, code, taskId) {
29
+ super(message);
30
+ this.code = code;
31
+ this.taskId = taskId;
32
+ this.name = "SudocodeTaskBackendError";
33
+ }
34
+ }
35
+ const DEFAULT_CONFIG = {
36
+ projectPath: process.cwd(),
37
+ syncStatus: true,
38
+ autoCloseIssues: false,
39
+ };
40
+ /**
41
+ * SudocodeTaskBackend implements TaskBackend using:
42
+ * - EventStore for local task storage and events
43
+ * - SudocodeClient for issue data and dependency tracking
44
+ *
45
+ * Key features:
46
+ * - Tasks can be bound to sudocode issues via external_id
47
+ * - isBlocked computed from sudocode's issue blockers
48
+ * - listReady uses sudocode's ready issues API
49
+ * - Status changes can optionally sync to issues
50
+ */
51
+ export class SudocodeTaskBackend {
52
+ eventStore;
53
+ client;
54
+ config;
55
+ tasksByIssue = new Map();
56
+ issueByTask = new Map();
57
+ syncEngine;
58
+ issueChangeUnsubscribe;
59
+ constructor(eventStore, client, config) {
60
+ this.eventStore = eventStore;
61
+ this.client = client;
62
+ this.config = { ...DEFAULT_CONFIG, ...config };
63
+ this.syncEngine = createSyncPolicyEngine(config?.syncPolicy ?? {}, this);
64
+ this.rebuildIndex();
65
+ this.subscribeToIssueChanges();
66
+ }
67
+ // ─────────────────────────────────────────────────────────────────────────────
68
+ // Index Management
69
+ // ─────────────────────────────────────────────────────────────────────────────
70
+ /**
71
+ * Rebuild the task-by-issue index from existing tasks
72
+ */
73
+ rebuildIndex() {
74
+ this.tasksByIssue.clear();
75
+ this.issueByTask.clear();
76
+ const tasks = this.eventStore.listTasks();
77
+ for (const task of tasks) {
78
+ const externalId = this.getTaskExternalId(task);
79
+ if (externalId) {
80
+ this.addToIndex(externalId, task.id);
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Add a task to the issue index
86
+ */
87
+ addToIndex(issueId, taskId) {
88
+ // Update issue -> tasks map
89
+ if (!this.tasksByIssue.has(issueId)) {
90
+ this.tasksByIssue.set(issueId, new Set());
91
+ }
92
+ this.tasksByIssue.get(issueId).add(taskId);
93
+ // Update task -> issue map
94
+ this.issueByTask.set(taskId, issueId);
95
+ }
96
+ /**
97
+ * Remove a task from the issue index
98
+ */
99
+ removeFromIndex(issueId, taskId) {
100
+ // Update issue -> tasks map
101
+ const tasks = this.tasksByIssue.get(issueId);
102
+ if (tasks) {
103
+ tasks.delete(taskId);
104
+ if (tasks.size === 0) {
105
+ this.tasksByIssue.delete(issueId);
106
+ }
107
+ }
108
+ // Update task -> issue map
109
+ this.issueByTask.delete(taskId);
110
+ }
111
+ /**
112
+ * Get tasks bound to an issue
113
+ */
114
+ getTasksByIssue(issueId) {
115
+ return Array.from(this.tasksByIssue.get(issueId) ?? []);
116
+ }
117
+ /**
118
+ * Get the issue a task is bound to
119
+ */
120
+ getIssueForTask(taskId) {
121
+ return this.issueByTask.get(taskId);
122
+ }
123
+ /**
124
+ * Bind a task to a sudocode issue.
125
+ * @param taskId Task ID to bind
126
+ * @param issueId Issue ID to bind to
127
+ * @throws If task or issue not found
128
+ */
129
+ async bindToIssue(taskId, issueId) {
130
+ const task = this.eventStore.getTask(taskId);
131
+ if (!task) {
132
+ throw new SudocodeTaskBackendError(`Task not found: ${taskId}`, "TASK_NOT_FOUND", taskId);
133
+ }
134
+ // Verify issue exists
135
+ const issue = await this.client.getIssue(issueId);
136
+ if (!issue) {
137
+ throw new SudocodeTaskBackendError(`Issue not found: ${issueId}`, "ISSUE_NOT_FOUND");
138
+ }
139
+ // Check if already bound to a different issue
140
+ const currentIssue = this.getIssueForTask(taskId);
141
+ if (currentIssue && currentIssue !== issueId) {
142
+ // Remove from old index
143
+ this.removeFromIndex(currentIssue, taskId);
144
+ }
145
+ // Update task with external_id
146
+ this.eventStore.emit({
147
+ type: "task",
148
+ source: { agent_id: task.assigned_agent ?? task.created_by },
149
+ payload: {
150
+ task_id: taskId,
151
+ action: "status_change",
152
+ details: {
153
+ outputs: { external_id: issueId },
154
+ },
155
+ },
156
+ });
157
+ // Update index
158
+ this.addToIndex(issueId, taskId);
159
+ }
160
+ /**
161
+ * Unbind a task from its current issue.
162
+ * @param taskId Task ID to unbind
163
+ * @throws If task not found
164
+ */
165
+ async unbindFromIssue(taskId) {
166
+ const task = this.eventStore.getTask(taskId);
167
+ if (!task) {
168
+ throw new SudocodeTaskBackendError(`Task not found: ${taskId}`, "TASK_NOT_FOUND", taskId);
169
+ }
170
+ const issueId = this.getIssueForTask(taskId);
171
+ if (!issueId) {
172
+ // Not bound, nothing to do
173
+ return;
174
+ }
175
+ // Clear external_id in task outputs
176
+ this.eventStore.emit({
177
+ type: "task",
178
+ source: { agent_id: task.assigned_agent ?? task.created_by },
179
+ payload: {
180
+ task_id: taskId,
181
+ action: "status_change",
182
+ details: {
183
+ outputs: { external_id: null },
184
+ },
185
+ },
186
+ });
187
+ // Remove from index
188
+ this.removeFromIndex(issueId, taskId);
189
+ }
190
+ // ─────────────────────────────────────────────────────────────────────────────
191
+ // Issue Change Subscription
192
+ // ─────────────────────────────────────────────────────────────────────────────
193
+ /**
194
+ * Subscribe to sudocode issue changes for status sync
195
+ */
196
+ subscribeToIssueChanges() {
197
+ if (!this.config.syncStatus)
198
+ return;
199
+ const callback = (event) => {
200
+ // Handle via sync policy engine
201
+ this.syncEngine.handleIssueChange(event).catch(() => {
202
+ // Ignore errors from sync engine
203
+ });
204
+ // Additionally handle status mapping for non-closed status changes
205
+ // (closed status is handled by the sync engine based on policy)
206
+ if (event.type === "status_changed" &&
207
+ event.issue &&
208
+ event.issue.status !== "closed") {
209
+ const taskIds = this.getTasksByIssue(event.issueId);
210
+ const newStatus = mapSudocodeStatus(event.issue.status);
211
+ for (const taskId of taskIds) {
212
+ const task = this.eventStore.getTask(taskId);
213
+ if (task && task.status !== newStatus) {
214
+ // Only update if the task isn't in a terminal state
215
+ // Also preserve "assigned" status - it's a macro-agent concept
216
+ // that will transition to in_progress when start() is called
217
+ if (task.status !== "completed" &&
218
+ task.status !== "failed" &&
219
+ task.status !== "assigned") {
220
+ // Emit status change event
221
+ this.eventStore.emit({
222
+ type: "task",
223
+ source: { agent_id: task.assigned_agent ?? task.created_by },
224
+ payload: {
225
+ task_id: taskId,
226
+ action: "status_change",
227
+ details: { status: newStatus },
228
+ },
229
+ });
230
+ }
231
+ }
232
+ }
233
+ }
234
+ };
235
+ this.issueChangeUnsubscribe = this.client.onIssueChange(callback);
236
+ }
237
+ // ─────────────────────────────────────────────────────────────────────────────
238
+ // Lifecycle
239
+ // ─────────────────────────────────────────────────────────────────────────────
240
+ async create(options) {
241
+ const taskId = `task_${nanoid(12)}`;
242
+ // Validate parent task exists if specified
243
+ if (options.parent_task) {
244
+ const parent = this.eventStore.getTask(options.parent_task);
245
+ if (!parent) {
246
+ throw new SudocodeTaskBackendError(`Parent task not found: ${options.parent_task}`, "PARENT_TASK_NOT_FOUND", options.parent_task);
247
+ }
248
+ }
249
+ // Validate external_id (issue) exists if specified
250
+ if (options.external_id) {
251
+ const issue = await this.client.getIssue(options.external_id);
252
+ if (!issue) {
253
+ throw new SudocodeTaskBackendError(`Issue not found: ${options.external_id}`, "ISSUE_NOT_FOUND");
254
+ }
255
+ }
256
+ // Emit task created event
257
+ this.eventStore.emit({
258
+ type: "task",
259
+ source: { agent_id: options.created_by },
260
+ payload: {
261
+ task_id: taskId,
262
+ action: "created",
263
+ details: {
264
+ description: options.description,
265
+ parent_task: options.parent_task,
266
+ external_id: options.external_id,
267
+ },
268
+ },
269
+ });
270
+ // Update parent's subtasks array if this is a subtask
271
+ if (options.parent_task) {
272
+ this.eventStore.emit({
273
+ type: "task",
274
+ source: { agent_id: options.created_by },
275
+ payload: {
276
+ task_id: options.parent_task,
277
+ action: "status_change",
278
+ details: {
279
+ subtask_added: taskId,
280
+ },
281
+ },
282
+ });
283
+ }
284
+ // Add to issue index if bound
285
+ if (options.external_id) {
286
+ this.addToIndex(options.external_id, taskId);
287
+ }
288
+ const task = this.eventStore.getTask(taskId);
289
+ return this.toExtendedTask(task);
290
+ }
291
+ async get(id) {
292
+ const task = this.eventStore.getTask(id);
293
+ if (!task)
294
+ return null;
295
+ return this.toExtendedTask(task);
296
+ }
297
+ async update(id, updates) {
298
+ const task = this.eventStore.getTask(id);
299
+ if (!task) {
300
+ throw new SudocodeTaskBackendError(`Task not found: ${id}`, "TASK_NOT_FOUND", id);
301
+ }
302
+ const source = task.assigned_agent ?? task.created_by;
303
+ // Handle status update with validation
304
+ if (updates.status !== undefined) {
305
+ const validTransitions = VALID_STATUS_TRANSITIONS[task.status];
306
+ if (!validTransitions.includes(updates.status)) {
307
+ throw new SudocodeTaskBackendError(`Invalid status transition: ${task.status} -> ${updates.status}`, "INVALID_STATUS_TRANSITION", id);
308
+ }
309
+ this.eventStore.emit({
310
+ type: "task",
311
+ source: { agent_id: source },
312
+ payload: {
313
+ task_id: id,
314
+ action: "status_change",
315
+ details: { status: updates.status },
316
+ },
317
+ });
318
+ }
319
+ // Handle other updates
320
+ if (updates.outputs !== undefined) {
321
+ this.eventStore.emit({
322
+ type: "task",
323
+ source: { agent_id: source },
324
+ payload: {
325
+ task_id: id,
326
+ action: "status_change",
327
+ details: { outputs: updates.outputs },
328
+ },
329
+ });
330
+ }
331
+ if (updates.artifacts !== undefined) {
332
+ this.eventStore.emit({
333
+ type: "task",
334
+ source: { agent_id: source },
335
+ payload: {
336
+ task_id: id,
337
+ action: "status_change",
338
+ details: { artifacts: updates.artifacts },
339
+ },
340
+ });
341
+ }
342
+ if (updates.description !== undefined) {
343
+ this.eventStore.emit({
344
+ type: "task",
345
+ source: { agent_id: source },
346
+ payload: {
347
+ task_id: id,
348
+ action: "status_change",
349
+ details: { description: updates.description },
350
+ },
351
+ });
352
+ }
353
+ const updated = this.eventStore.getTask(id);
354
+ return this.toExtendedTask(updated);
355
+ }
356
+ async delete(_id) {
357
+ // Tasks are immutable in event-sourced system - no delete operation
358
+ // This matches InMemoryTaskBackend behavior for backend parity
359
+ throw new SudocodeTaskBackendError("Delete operation not supported - tasks are immutable", "NOT_SUPPORTED");
360
+ }
361
+ // ─────────────────────────────────────────────────────────────────────────────
362
+ // Status Transitions
363
+ // ─────────────────────────────────────────────────────────────────────────────
364
+ async assign(id, agentId, options) {
365
+ const task = this.eventStore.getTask(id);
366
+ if (!task) {
367
+ throw new SudocodeTaskBackendError(`Task not found: ${id}`, "TASK_NOT_FOUND", id);
368
+ }
369
+ this.eventStore.emit({
370
+ type: "task",
371
+ source: { agent_id: agentId },
372
+ payload: {
373
+ task_id: id,
374
+ action: "assigned",
375
+ details: {
376
+ agent_id: agentId,
377
+ role: options?.role,
378
+ },
379
+ },
380
+ });
381
+ // Note: We don't sync to sudocode on assign because "assigned" is a
382
+ // macro-agent concept (task has a worker but work hasn't started).
383
+ // Sudocode "in_progress" is synced when start() is called.
384
+ }
385
+ async unassign(id) {
386
+ const task = this.eventStore.getTask(id);
387
+ if (!task) {
388
+ throw new SudocodeTaskBackendError(`Task not found: ${id}`, "TASK_NOT_FOUND", id);
389
+ }
390
+ if (!task.assigned_agent) {
391
+ throw new SudocodeTaskBackendError(`Task is not assigned: ${id}`, "TASK_NOT_ASSIGNED", id);
392
+ }
393
+ this.eventStore.emit({
394
+ type: "task",
395
+ source: { agent_id: task.assigned_agent },
396
+ payload: {
397
+ task_id: id,
398
+ action: "unassigned",
399
+ details: {
400
+ agent_id: task.assigned_agent,
401
+ },
402
+ },
403
+ });
404
+ }
405
+ async start(id) {
406
+ const task = this.eventStore.getTask(id);
407
+ if (!task) {
408
+ throw new SudocodeTaskBackendError(`Task not found: ${id}`, "TASK_NOT_FOUND", id);
409
+ }
410
+ const validTransitions = VALID_STATUS_TRANSITIONS[task.status];
411
+ if (!validTransitions.includes("in_progress")) {
412
+ throw new SudocodeTaskBackendError(`Invalid status transition: ${task.status} -> in_progress`, "INVALID_STATUS_TRANSITION", id);
413
+ }
414
+ this.eventStore.emit({
415
+ type: "task",
416
+ source: { agent_id: task.assigned_agent ?? task.created_by },
417
+ payload: {
418
+ task_id: id,
419
+ action: "status_change",
420
+ details: { status: "in_progress" },
421
+ },
422
+ });
423
+ // Update issue status
424
+ const externalId = this.getTaskExternalId(task);
425
+ if (externalId && this.config.syncStatus) {
426
+ try {
427
+ await this.client.updateIssue(externalId, { status: "in_progress" });
428
+ }
429
+ catch {
430
+ // Ignore errors syncing to sudocode
431
+ }
432
+ }
433
+ }
434
+ async complete(id, outputs) {
435
+ const task = this.eventStore.getTask(id);
436
+ if (!task) {
437
+ throw new SudocodeTaskBackendError(`Task not found: ${id}`, "TASK_NOT_FOUND", id);
438
+ }
439
+ const validTransitions = VALID_STATUS_TRANSITIONS[task.status];
440
+ if (!validTransitions.includes("completed")) {
441
+ throw new SudocodeTaskBackendError(`Invalid status transition: ${task.status} -> completed`, "INVALID_STATUS_TRANSITION", id);
442
+ }
443
+ // Add outputs if provided
444
+ if (outputs) {
445
+ if (outputs.data) {
446
+ this.eventStore.emit({
447
+ type: "task",
448
+ source: { agent_id: task.assigned_agent ?? task.created_by },
449
+ payload: {
450
+ task_id: id,
451
+ action: "status_change",
452
+ details: { outputs: outputs.data },
453
+ },
454
+ });
455
+ }
456
+ if (outputs.artifacts) {
457
+ this.eventStore.emit({
458
+ type: "task",
459
+ source: { agent_id: task.assigned_agent ?? task.created_by },
460
+ payload: {
461
+ task_id: id,
462
+ action: "status_change",
463
+ details: { artifacts: outputs.artifacts },
464
+ },
465
+ });
466
+ }
467
+ }
468
+ this.eventStore.emit({
469
+ type: "task",
470
+ source: { agent_id: task.assigned_agent ?? task.created_by },
471
+ payload: {
472
+ task_id: id,
473
+ action: "completed",
474
+ details: {},
475
+ },
476
+ });
477
+ // Optionally close the issue
478
+ const externalId = this.getTaskExternalId(task);
479
+ if (externalId && this.config.autoCloseIssues) {
480
+ try {
481
+ await this.client.updateIssue(externalId, { status: "closed" });
482
+ }
483
+ catch {
484
+ // Ignore errors syncing to sudocode
485
+ }
486
+ }
487
+ }
488
+ async fail(id, error) {
489
+ const task = this.eventStore.getTask(id);
490
+ if (!task) {
491
+ throw new SudocodeTaskBackendError(`Task not found: ${id}`, "TASK_NOT_FOUND", id);
492
+ }
493
+ const validTransitions = VALID_STATUS_TRANSITIONS[task.status];
494
+ if (!validTransitions.includes("failed")) {
495
+ throw new SudocodeTaskBackendError(`Invalid status transition: ${task.status} -> failed`, "INVALID_STATUS_TRANSITION", id);
496
+ }
497
+ // Store error info in outputs
498
+ this.eventStore.emit({
499
+ type: "task",
500
+ source: { agent_id: task.assigned_agent ?? task.created_by },
501
+ payload: {
502
+ task_id: id,
503
+ action: "status_change",
504
+ details: {
505
+ outputs: {
506
+ error: {
507
+ message: error.message,
508
+ code: error.code,
509
+ details: error.details,
510
+ },
511
+ },
512
+ },
513
+ },
514
+ });
515
+ this.eventStore.emit({
516
+ type: "task",
517
+ source: { agent_id: task.assigned_agent ?? task.created_by },
518
+ payload: {
519
+ task_id: id,
520
+ action: "failed",
521
+ details: {},
522
+ },
523
+ });
524
+ }
525
+ // ─────────────────────────────────────────────────────────────────────────────
526
+ // Queries
527
+ // ─────────────────────────────────────────────────────────────────────────────
528
+ async list(filter) {
529
+ let tasks = this.eventStore.listTasks();
530
+ if (filter) {
531
+ // Filter by status
532
+ if (filter.status) {
533
+ const statuses = Array.isArray(filter.status)
534
+ ? filter.status
535
+ : [filter.status];
536
+ tasks = tasks.filter((t) => statuses.includes(t.status));
537
+ }
538
+ if (filter.assigned_agent) {
539
+ tasks = tasks.filter((t) => t.assigned_agent === filter.assigned_agent);
540
+ }
541
+ if (filter.parent_task) {
542
+ tasks = tasks.filter((t) => t.parent_task === filter.parent_task);
543
+ }
544
+ if (filter.created_by) {
545
+ tasks = tasks.filter((t) => t.created_by === filter.created_by);
546
+ }
547
+ if (filter.rootTasksOnly) {
548
+ tasks = tasks.filter((t) => !t.parent_task);
549
+ }
550
+ }
551
+ // Convert to ExtendedTask (async because of issue lookups)
552
+ const extended = await Promise.all(tasks.map((t) => this.toExtendedTask(t)));
553
+ // Filter blocked if needed
554
+ if (!filter?.includeBlocked) {
555
+ return extended.filter((t) => !t.isBlocked);
556
+ }
557
+ return extended;
558
+ }
559
+ async listReady(filter) {
560
+ // Get pending/assigned tasks with isBlocked computed
561
+ const tasks = await this.list({
562
+ ...filter,
563
+ status: filter?.status ?? ["pending", "assigned"],
564
+ includeBlocked: true, // We'll filter manually
565
+ });
566
+ // Filter to ready tasks
567
+ // isBlocked already checks both local and sudocode blockers,
568
+ // respecting local task completion over stale sudocode state.
569
+ const readyTasks = [];
570
+ for (const task of tasks) {
571
+ if (task.isBlocked) {
572
+ continue;
573
+ }
574
+ // For bound tasks, also check issue status directly
575
+ // (excludes tasks bound to issues with "blocked" status)
576
+ if (task.external_id) {
577
+ try {
578
+ const issue = await this.client.getIssue(task.external_id);
579
+ if (issue && issue.status === "blocked") {
580
+ continue;
581
+ }
582
+ }
583
+ catch {
584
+ // If we can't fetch issue, include the task
585
+ }
586
+ }
587
+ readyTasks.push(task);
588
+ }
589
+ return readyTasks;
590
+ }
591
+ async getChildren(parentId) {
592
+ const tasks = this.eventStore.listTasks();
593
+ const children = tasks.filter((t) => t.parent_task === parentId);
594
+ return Promise.all(children.map((t) => this.toExtendedTask(t)));
595
+ }
596
+ async getSubtaskStatus(parentId) {
597
+ const children = await this.getChildren(parentId);
598
+ const status = {
599
+ total: children.length,
600
+ pending: 0,
601
+ assigned: 0,
602
+ in_progress: 0,
603
+ completed: 0,
604
+ failed: 0,
605
+ allCompleted: false,
606
+ anyFailed: false,
607
+ };
608
+ for (const task of children) {
609
+ switch (task.status) {
610
+ case "pending":
611
+ status.pending++;
612
+ break;
613
+ case "assigned":
614
+ status.assigned++;
615
+ break;
616
+ case "in_progress":
617
+ status.in_progress++;
618
+ break;
619
+ case "completed":
620
+ status.completed++;
621
+ break;
622
+ case "failed":
623
+ status.failed++;
624
+ break;
625
+ }
626
+ }
627
+ status.allCompleted =
628
+ status.total > 0 && status.completed === status.total;
629
+ status.anyFailed = status.failed > 0;
630
+ return status;
631
+ }
632
+ // ─────────────────────────────────────────────────────────────────────────────
633
+ // Hierarchy
634
+ // ─────────────────────────────────────────────────────────────────────────────
635
+ async createSubtask(parentId, options) {
636
+ return this.create({
637
+ ...options,
638
+ parent_task: parentId,
639
+ });
640
+ }
641
+ // ─────────────────────────────────────────────────────────────────────────────
642
+ // Dependencies
643
+ // ─────────────────────────────────────────────────────────────────────────────
644
+ async addBlocker(taskId, blockerId) {
645
+ const task = this.eventStore.getTask(taskId);
646
+ if (!task) {
647
+ throw new SudocodeTaskBackendError(`Task not found: ${taskId}`, "TASK_NOT_FOUND", taskId);
648
+ }
649
+ const blocker = this.eventStore.getTask(blockerId);
650
+ if (!blocker) {
651
+ throw new SudocodeTaskBackendError(`Blocker task not found: ${blockerId}`, "TASK_NOT_FOUND", blockerId);
652
+ }
653
+ // Always track locally via EventStore
654
+ this.eventStore.emit({
655
+ type: "task",
656
+ source: { agent_id: task.assigned_agent ?? task.created_by },
657
+ payload: {
658
+ task_id: taskId,
659
+ action: "blocker_added",
660
+ details: { blocker_id: blockerId },
661
+ },
662
+ });
663
+ // If both tasks are bound to sudocode issues, create a sudocode relationship
664
+ const taskIssueId = this.getIssueForTask(taskId);
665
+ const blockerIssueId = this.getIssueForTask(blockerId);
666
+ if (taskIssueId && blockerIssueId) {
667
+ try {
668
+ // In sudocode, "A blocks B" means A must complete before B
669
+ // So we create: blockerIssue blocks taskIssue
670
+ await this.client.createLink(blockerIssueId, taskIssueId, "blocks");
671
+ }
672
+ catch {
673
+ // Log but don't fail - local tracking is the source of truth
674
+ }
675
+ }
676
+ }
677
+ async removeBlocker(taskId, blockerId) {
678
+ const task = this.eventStore.getTask(taskId);
679
+ if (!task) {
680
+ throw new SudocodeTaskBackendError(`Task not found: ${taskId}`, "TASK_NOT_FOUND", taskId);
681
+ }
682
+ // Always update local EventStore tracking
683
+ this.eventStore.emit({
684
+ type: "task",
685
+ source: { agent_id: task.assigned_agent ?? task.created_by },
686
+ payload: {
687
+ task_id: taskId,
688
+ action: "blocker_removed",
689
+ details: { blocker_id: blockerId },
690
+ },
691
+ });
692
+ // If both tasks are bound to sudocode issues, remove the sudocode relationship
693
+ const taskIssueId = this.getIssueForTask(taskId);
694
+ const blockerIssueId = this.getIssueForTask(blockerId);
695
+ if (taskIssueId && blockerIssueId) {
696
+ try {
697
+ await this.client.removeLink(blockerIssueId, taskIssueId, "blocks");
698
+ }
699
+ catch {
700
+ // Log but don't fail - local tracking is the source of truth
701
+ }
702
+ }
703
+ }
704
+ async getBlockers(taskId) {
705
+ const task = this.eventStore.getTask(taskId);
706
+ if (!task) {
707
+ throw new SudocodeTaskBackendError(`Task not found: ${taskId}`, "TASK_NOT_FOUND", taskId);
708
+ }
709
+ // Track blockers by ID to avoid duplicates
710
+ const blockerMap = new Map();
711
+ // Get local task blockers
712
+ const localBlockerIds = task.blockers ?? [];
713
+ for (const blockerId of localBlockerIds) {
714
+ const blocker = this.eventStore.getTask(blockerId);
715
+ if (blocker && !blockerMap.has(blockerId)) {
716
+ blockerMap.set(blockerId, await this.toExtendedTask(blocker));
717
+ }
718
+ }
719
+ // If task is bound to an issue, also get sudocode blockers
720
+ const taskIssueId = this.getIssueForTask(taskId);
721
+ if (taskIssueId) {
722
+ try {
723
+ const issueBlockers = await this.client.getBlockers(taskIssueId);
724
+ for (const issueBlocker of issueBlockers) {
725
+ // Find tasks bound to this blocking issue
726
+ const blockerTaskIds = this.getTasksByIssue(issueBlocker.id);
727
+ for (const blockerTaskId of blockerTaskIds) {
728
+ if (!blockerMap.has(blockerTaskId)) {
729
+ const blockerTask = this.eventStore.getTask(blockerTaskId);
730
+ if (blockerTask) {
731
+ blockerMap.set(blockerTaskId, await this.toExtendedTask(blockerTask));
732
+ }
733
+ }
734
+ }
735
+ }
736
+ }
737
+ catch {
738
+ // Ignore errors fetching sudocode blockers - local is source of truth
739
+ }
740
+ }
741
+ return Array.from(blockerMap.values());
742
+ }
743
+ async getBlocking(taskId) {
744
+ const task = this.eventStore.getTask(taskId);
745
+ if (!task) {
746
+ throw new SudocodeTaskBackendError(`Task not found: ${taskId}`, "TASK_NOT_FOUND", taskId);
747
+ }
748
+ // Track blocked tasks by ID to avoid duplicates
749
+ const blockingMap = new Map();
750
+ // Find all local tasks that have this task in their blockers
751
+ const allTasks = this.eventStore.listTasks();
752
+ const localBlocking = allTasks.filter((t) => t.blockers?.includes(taskId));
753
+ for (const blockedTask of localBlocking) {
754
+ if (!blockingMap.has(blockedTask.id)) {
755
+ blockingMap.set(blockedTask.id, await this.toExtendedTask(blockedTask));
756
+ }
757
+ }
758
+ // If task is bound to an issue, also get sudocode blocking
759
+ const taskIssueId = this.getIssueForTask(taskId);
760
+ if (taskIssueId) {
761
+ try {
762
+ const issueBlocking = await this.client.getBlocking(taskIssueId);
763
+ for (const blockedIssue of issueBlocking) {
764
+ // Find tasks bound to this blocked issue
765
+ const blockedTaskIds = this.getTasksByIssue(blockedIssue.id);
766
+ for (const blockedTaskId of blockedTaskIds) {
767
+ if (!blockingMap.has(blockedTaskId)) {
768
+ const blockedTask = this.eventStore.getTask(blockedTaskId);
769
+ if (blockedTask) {
770
+ blockingMap.set(blockedTaskId, await this.toExtendedTask(blockedTask));
771
+ }
772
+ }
773
+ }
774
+ }
775
+ }
776
+ catch {
777
+ // Ignore errors fetching sudocode blocking - local is source of truth
778
+ }
779
+ }
780
+ return Array.from(blockingMap.values());
781
+ }
782
+ // ─────────────────────────────────────────────────────────────────────────────
783
+ // History
784
+ // ─────────────────────────────────────────────────────────────────────────────
785
+ async getAgentHistory(taskId) {
786
+ const task = this.eventStore.getTask(taskId);
787
+ if (!task) {
788
+ throw new SudocodeTaskBackendError(`Task not found: ${taskId}`, "TASK_NOT_FOUND", taskId);
789
+ }
790
+ return task.agent_history ?? [];
791
+ }
792
+ onTaskChange(callbackOrTaskId, maybeCallback) {
793
+ const filterTaskId = typeof callbackOrTaskId === "string" ? callbackOrTaskId : undefined;
794
+ const callback = typeof callbackOrTaskId === "function"
795
+ ? callbackOrTaskId
796
+ : maybeCallback;
797
+ // Wrap EventStore's onTaskChange
798
+ return this.eventStore.onTaskChange((taskId, task) => {
799
+ if (filterTaskId && taskId !== filterTaskId) {
800
+ return;
801
+ }
802
+ // Build TaskChangeEvent using sync conversion (checks local blockers only)
803
+ const event = {
804
+ type: task ? "updated" : "deleted",
805
+ taskId,
806
+ task: task ? this.toExtendedTaskSync(task) : {},
807
+ };
808
+ callback(event);
809
+ });
810
+ }
811
+ // ─────────────────────────────────────────────────────────────────────────────
812
+ // Sync Policy
813
+ // ─────────────────────────────────────────────────────────────────────────────
814
+ /**
815
+ * Get the current sync policy
816
+ */
817
+ getSyncPolicy() {
818
+ return this.syncEngine.getPolicy();
819
+ }
820
+ /**
821
+ * Subscribe to sync events from the policy engine
822
+ */
823
+ onSyncEvent(callback) {
824
+ return this.syncEngine.onSyncEvent(callback);
825
+ }
826
+ // ─────────────────────────────────────────────────────────────────────────────
827
+ // Cleanup
828
+ // ─────────────────────────────────────────────────────────────────────────────
829
+ /**
830
+ * Close the backend and release resources
831
+ */
832
+ close() {
833
+ if (this.issueChangeUnsubscribe) {
834
+ this.issueChangeUnsubscribe();
835
+ }
836
+ }
837
+ // ─────────────────────────────────────────────────────────────────────────────
838
+ // Private Helpers
839
+ // ─────────────────────────────────────────────────────────────────────────────
840
+ /**
841
+ * Get the external_id from a task (if stored in outputs)
842
+ */
843
+ getTaskExternalId(task) {
844
+ // First check in-memory index (populated during create and rebuildIndex)
845
+ const fromIndex = this.issueByTask.get(task.id);
846
+ if (fromIndex) {
847
+ return fromIndex;
848
+ }
849
+ // Fall back to checking outputs (for persistence after restart via bindToIssue)
850
+ const outputs = task.outputs;
851
+ if (outputs?.external_id && typeof outputs.external_id === "string") {
852
+ return outputs.external_id;
853
+ }
854
+ return undefined;
855
+ }
856
+ /**
857
+ * Convert a Task to ExtendedTask with computed isBlocked field.
858
+ * Checks both local blockers and sudocode issue blockers.
859
+ *
860
+ * For sudocode issue blockers, a blocker is considered resolved if:
861
+ * 1. The issue itself is closed/completed, OR
862
+ * 2. Any local task bound to that issue is completed (local takes precedence)
863
+ */
864
+ async toExtendedTask(task) {
865
+ let isBlocked = false;
866
+ // Check local blockers first
867
+ const localBlockerIds = task.blockers ?? [];
868
+ for (const blockerId of localBlockerIds) {
869
+ const blocker = this.eventStore.getTask(blockerId);
870
+ if (blocker && blocker.status !== "completed") {
871
+ isBlocked = true;
872
+ break;
873
+ }
874
+ }
875
+ // Check sudocode issue blockers if task is bound
876
+ if (!isBlocked) {
877
+ const externalId = this.getTaskExternalId(task);
878
+ if (externalId) {
879
+ try {
880
+ const issueBlockers = await this.client.getBlockers(externalId);
881
+ for (const blocker of issueBlockers) {
882
+ // Check if any local task bound to this blocking issue is completed
883
+ // Local task completion takes precedence over issue status
884
+ const localTasksForBlocker = this.getTasksByIssue(blocker.id);
885
+ const hasCompletedLocalTask = localTasksForBlocker.some((taskId) => {
886
+ const blockerTask = this.eventStore.getTask(taskId);
887
+ return blockerTask && blockerTask.status === "completed";
888
+ });
889
+ // Blocker is unresolved if:
890
+ // - No local task is completed for this issue, AND
891
+ // - The issue itself is not complete
892
+ if (!hasCompletedLocalTask && !isIssueComplete(blocker.status)) {
893
+ isBlocked = true;
894
+ break;
895
+ }
896
+ }
897
+ }
898
+ catch {
899
+ // If we can't fetch blockers, assume not blocked
900
+ }
901
+ }
902
+ }
903
+ return {
904
+ ...task,
905
+ isBlocked,
906
+ external_id: this.getTaskExternalId(task),
907
+ };
908
+ }
909
+ /**
910
+ * Synchronous version of toExtendedTask that only checks local blockers.
911
+ * Used in callbacks where async is not possible.
912
+ * Note: Does not check sudocode issue blockers - only local task blockers.
913
+ */
914
+ toExtendedTaskSync(task) {
915
+ let isBlocked = false;
916
+ // Check local blockers only (sync operation)
917
+ const localBlockerIds = task.blockers ?? [];
918
+ for (const blockerId of localBlockerIds) {
919
+ const blocker = this.eventStore.getTask(blockerId);
920
+ if (blocker && blocker.status !== "completed") {
921
+ isBlocked = true;
922
+ break;
923
+ }
924
+ }
925
+ return {
926
+ ...task,
927
+ isBlocked,
928
+ external_id: this.getTaskExternalId(task),
929
+ };
930
+ }
931
+ }
932
+ /**
933
+ * Create a SudocodeTaskBackend instance.
934
+ *
935
+ * @param eventStore - EventStore for local task storage
936
+ * @param client - SudocodeClient for issue access
937
+ * @param config - Optional configuration
938
+ */
939
+ export function createSudocodeTaskBackend(eventStore, client, config) {
940
+ return new SudocodeTaskBackend(eventStore, client, config);
941
+ }
942
+ //# sourceMappingURL=backend.js.map