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
@@ -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