@overdeck/desktop 0.45.6 → 0.45.8

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 (304) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +483 -0
  2. package/package.json +16 -4
  3. package/server/{acceptance-criteria-DYffaKI9.js → acceptance-criteria-l0DSvFFS.js} +2 -2
  4. package/server/{activity-logger-DO27GsPa.js → activity-logger-DvYvFhwZ.js} +1 -1
  5. package/server/{activity-logger-Dm95Ua07.js → activity-logger-pcbf-e30.js} +3 -2
  6. package/server/{advancing-selfheal-n8tAeFwE.js → advancing-selfheal-CMlGznKv.js} +11 -66
  7. package/server/{agent-gc-CIFaa2vJ.js → agent-gc-BtAzj8QN.js} +3 -3
  8. package/server/{agent-state-service-BqVDA9b8.js → agent-state-service-5ge9xxhx.js} +5 -5
  9. package/server/{agent-state-service-CLifyinO.js → agent-state-service-C1iUF9Ft.js} +1 -1
  10. package/server/agent-state-xk_G8t90.js +3 -0
  11. package/server/{agents-KaEsWZ8D.js → agents-BIggLvi_.js} +1 -1
  12. package/server/{agents-D_x5BSZM.js → agents-DHvsjsuP.js} +129 -61
  13. package/server/{archive-planning-CFxmeFKh.js → archive-planning-B4Qi02bk.js} +1 -1
  14. package/server/{archive-planning-DVUXlRBs.js → archive-planning-zTvWWHG_.js} +4 -4
  15. package/server/{artifact-index-jobs-ChUgzZah.js → artifact-index-jobs-BrByqVkB.js} +2 -2
  16. package/server/{auto-commit-2KiBFh-K.js → auto-commit-DoIPFoEs.js} +1 -1
  17. package/server/{backlog-auto-trigger-DoTEMZMl.js → backlog-auto-trigger-COm_R96V.js} +3 -3
  18. package/server/{bd-mutex-CE6P_MlD.js → bd-mutex-BItGvLQ8.js} +2 -2
  19. package/server/{bd-process-lock-Ch3WNHS9.js → bd-process-lock-CJkoG7hW.js} +2 -2
  20. package/server/{beads-B43pgBIy.js → beads-AmCXEv_E.js} +1 -1
  21. package/server/{beads-BugPvtWp.js → beads-DlZm-vrG.js} +5 -5
  22. package/server/{beads-query-CtqWakL6.js → beads-query-BrVNWoSL.js} +2 -2
  23. package/server/{beads-restore-BqTMSQi-.js → beads-restore-CMbDSB5R.js} +1 -1
  24. package/server/{behavior-vk1sixby.js → behavior-By-2Wipv.js} +3 -3
  25. package/server/{briefing-freshness-B3YxHQ-L.js → briefing-freshness-CXhZdnB8.js} +4 -4
  26. package/server/{checkpoint-manager-CdrwLsQh.js → checkpoint-manager-CPw51H2n.js} +1 -1
  27. package/server/{checkpoint-manager-Dg6cWZz3.js → checkpoint-manager-CfNpHOp4.js} +11 -2
  28. package/server/checkpoint-worker.js +1 -1
  29. package/server/{checkpoints-DDd-0doa.js → checkpoints-BbfH1EIy.js} +2 -2
  30. package/server/{checkpoints-dBCJr0dC.js → checkpoints-BjlBWOA8.js} +1 -1
  31. package/server/{claude-permissions-BpwIcIR7.js → claude-permissions-DrRAs_0F.js} +3 -3
  32. package/server/{claude-settings-overlay-DnraWcz6.js → claude-settings-overlay-BSeS7Ki3.js} +2 -2
  33. package/server/{claude-settings-overlay-xD_Vu420.js → claude-settings-overlay-CEWlIFL-.js} +1 -1
  34. package/server/cli-CJDWXE_Y.js +3 -0
  35. package/server/{cli-BmzYZZKi.js → cli-CvK9xuSS.js} +9 -9
  36. package/server/{cliproxy-DYWdJKZ1.js → cliproxy-BOcmOK6l.js} +1 -1
  37. package/server/{cliproxy-CE2GDY7x.js → cliproxy-J-_1iIXe.js} +2 -2
  38. package/server/{close-issue-CpJd4SOL.js → close-issue-BnpErnD1.js} +5 -5
  39. package/server/{closed-issue-reaper-QpcvCDeE.js → closed-issue-reaper-BLCQwTpF.js} +1 -1
  40. package/server/{closed-issue-reaper-DubXY9Zg.js → closed-issue-reaper-DRqK5k39.js} +10 -10
  41. package/server/{codex-j8aVgRou.js → codex-BUZjrnqH.js} +1 -1
  42. package/server/{codex-B3J1TXo7.js → codex-DcInrhok.js} +5 -5
  43. package/server/{compact-beads-CqhLqG-k.js → compact-beads-RFwdZFPA.js} +4 -4
  44. package/server/{compact-beads-BeilHCdj.js → compact-beads-omhUgj5b.js} +1 -1
  45. package/server/{config-DHU0j_pS.js → config-CzcWQ24p.js} +1 -1
  46. package/server/{config-DkEhJM0h.js → config-oWoKf5jO.js} +4 -4
  47. package/server/{config-yaml-DbdN9Fuq.js → config-yaml-DPAieL_G.js} +3 -2
  48. package/server/{conflict-gate-CgOtMo8i.js → conflict-gate-BhKvrPxn.js} +4 -4
  49. package/server/{conflict-gate-D00zFjeu.js → conflict-gate-JdFuhKuF.js} +1 -1
  50. package/server/{context-layers-BHEjT8Cn.js → context-layers-CTjQwcEQ.js} +3 -3
  51. package/server/{context-layers-0Lgq-SE_.js → context-layers-DxKsseHI.js} +2 -2
  52. package/server/{control-settings-CYv732Gs.js → control-settings-BMqUkXmR.js} +4 -4
  53. package/server/{conversation-compaction-Dbw03b-X.js → conversation-compaction-Ba5aZdrb.js} +1 -1
  54. package/server/{conversation-compaction-DKXvmX50.js → conversation-compaction-C5o_eKEm.js} +8 -8
  55. package/server/{conversation-service-BwKUeEvn.js → conversation-service-DvG8vZSV.js} +5 -5
  56. package/server/{conversation-service-kYYeRp9B.js → conversation-service-WKl-sw58.js} +1 -1
  57. package/server/{conversations-Dwr1jHrO.js → conversations-DL_BAWVk.js} +4 -4
  58. package/server/{conversations-D-uOnA8T.js → conversations-Dcx6LeIh.js} +1 -1
  59. package/server/{cost-DiSDkYe7.js → cost-C2CuA66z.js} +2 -2
  60. package/server/{cost-DNIyZH1X.js → cost-DaOG8sUB.js} +3 -3
  61. package/server/{cost-sync-CfXu-3TF.js → cost-sync-8lkDeL9g.js} +3 -3
  62. package/server/{dag-DZBowTd2.js → dag-jH8ZkewR.js} +3 -3
  63. package/server/{dangerous-git-ops-Pongxg2d.js → dangerous-git-ops-Dcw7PbYo.js} +1 -1
  64. package/server/dashboard-db-worker.js +6 -6
  65. package/server/{deacon-DT0BsVyE.js → deacon-Cv2RMfHs.js} +3 -3
  66. package/server/{deacon-f0yvsG5S.js → deacon-j3qSZ7--.js} +222 -110
  67. package/server/{deacon-nudge-log-Cmcch2Av.js → deacon-nudge-log-CJGA6aSQ.js} +1 -1
  68. package/server/deacon-swarm-D1iAUX-P.js +2 -0
  69. package/server/{deacon-swarm-BBGnhvD2.js → deacon-swarm-DadWNi5J.js} +88 -43
  70. package/server/deacon.js +8 -8
  71. package/server/{devcontainer-renderer-Cpz7XBj0.js → devcontainer-renderer-DUJYYRQB.js} +3 -3
  72. package/server/{dist-DypOkJv9.js → dist-BIC8spJ0.js} +1 -1
  73. package/server/dist-BUplB3Od.js +3 -0
  74. package/server/{docker-DARVx0OZ.js → docker-Q4bphryk.js} +2 -2
  75. package/server/{ensure-devcontainer-Dmdw4BxF.js → ensure-devcontainer-BCB6fHp9.js} +1 -1
  76. package/server/{ensure-devcontainer-BJssuBG6.js → ensure-devcontainer-XLL0vtgV.js} +4 -4
  77. package/server/{esm-shims-Crmvo9Ln.js → esm-shims-DiV9jHa_.js} +1 -1
  78. package/server/{event-store-BeEE8pW5.js → event-store-DIk9wvnS.js} +1 -1
  79. package/server/{event-store-DrfTJZ1_.js → event-store-DTJXZjCl.js} +4 -4
  80. package/server/events-BlzVUyTx.js +3 -0
  81. package/server/{events-BbClwoM-.js → events-DGWZzye2.js} +4 -4
  82. package/server/{factory-DVv9cpG5.js → factory-rG4T40su.js} +4 -4
  83. package/server/{feature-registry-population-C6eVdq4J.js → feature-registry-population-Dwyj9gEM.js} +4 -4
  84. package/server/{feature-registry-storage-ByBosRId.js → feature-registry-storage-CnGyNgAq.js} +2 -2
  85. package/server/{features-EZfSwuqq.js → features-CYY2_Eeh.js} +2 -2
  86. package/server/{feedback-target-DENaINE6.js → feedback-target-C4DaDSZ8.js} +1 -1
  87. package/server/{feedback-target-Dv4VnbQl.js → feedback-target-oE4-Esxl.js} +48 -17
  88. package/server/{feedback-writer-Dxg8qM8i.js → feedback-writer-DMaO0XXa.js} +4 -4
  89. package/server/{feedback-writer-BvHE1I-3.js → feedback-writer-thrdxYpK.js} +1 -1
  90. package/server/{flywheel-Akbd9VNM.js → flywheel-BqDdGvrQ.js} +1 -1
  91. package/server/{flywheel-B4KN9BmW.js → flywheel-ClMjGW_u.js} +11 -11
  92. package/server/{flywheel-ByZyAv3P.js → flywheel-DefHRzY4.js} +13 -13
  93. package/server/{flywheel-merge-order-DPFZbt-w.js → flywheel-merge-order-B6YDSElh.js} +1 -1
  94. package/server/{flywheel-merge-order-BYUPxqgx.js → flywheel-merge-order-CuDcqTRJ.js} +7 -7
  95. package/server/forge-BfP7OJwK.js +2 -0
  96. package/server/{forge-BnTExkbK.js → forge-BixzckB0.js} +2 -2
  97. package/server/{from-B2i_NgIH.js → from-D4xmArTA.js} +1 -1
  98. package/server/{fts-db-dnCj-PD3.js → fts-db-DPtxOAjp.js} +2 -2
  99. package/server/{fts-operations-CAAofsTQ.js → fts-operations-VrGjsT0w.js} +2 -2
  100. package/server/{git-utils-CB3gDSM-.js → git-utils-D_cax3fD.js} +2 -2
  101. package/server/{git-utils-Bk7sJZru.js → git-utils-RAmTwjFB.js} +1 -1
  102. package/server/{github-app-CIhMNI4C.js → github-app-B5PDHMyn.js} +1 -1
  103. package/server/{github-app-BIU8a93o.js → github-app-FMXgo3vK.js} +2 -2
  104. package/server/{github-client-DmZgsnYP.js → github-client-VRiB6N-4.js} +1 -1
  105. package/server/{github-client-zREpj5HA.js → github-client-yjbXaqpR.js} +2 -2
  106. package/server/{github-pr-lookup-CPri6JR1.js → github-pr-lookup-t8X8R0c0.js} +2 -2
  107. package/server/{harness-resolve-TzYAiXzZ.js → harness-resolve-DKeSVsJL.js} +3 -3
  108. package/server/{health-events-CDWk8Oz4.js → health-events-CD6q47ub.js} +1 -1
  109. package/server/{health-events-Dd0FuKrE.js → health-events-DaLX4-0a.js} +2 -2
  110. package/server/{hooks-C6HBXlVm.js → hooks-CmHFSj_Z.js} +2 -2
  111. package/server/{hooks-DRLzoFof.js → hooks-D-cbMUzQ.js} +1 -1
  112. package/server/{hume-Bb91r_2I.js → hume-DkVOs1Qi.js} +2 -2
  113. package/server/hume-x9voULey.js +3 -0
  114. package/server/{idle-stack-reaper-BPHnItVj.js → idle-stack-reaper-DBKQ9SKu.js} +3 -3
  115. package/server/{idle-stack-reaper-D5bwmuwX.js → idle-stack-reaper-DdnERp3G.js} +1 -1
  116. package/server/{infra-CCTzpcuJ.js → infra-CpKlYZA9.js} +3 -3
  117. package/server/{injection-D6L7D_w0.js → injection-CszhePD2.js} +7 -7
  118. package/server/{injection-CBrN8UxB.js → injection-DKzL2Axk.js} +1 -1
  119. package/server/{inspect-agent-CSYyFWqP.js → inspect-agent-BKKc0XnB.js} +9 -9
  120. package/server/inspect-agent-vm88mLYr.js +2 -0
  121. package/server/{internal-token-DWhBqgIk.js → internal-token-CQUx9YLc.js} +2 -2
  122. package/server/{internal-token-DCrCAG_M.js → internal-token-DrGdpLFo.js} +1 -1
  123. package/server/{io-DtAQ_2hp.js → io-Wy8YpFeP.js} +2 -2
  124. package/server/{issue-closed-0Zx72zXf.js → issue-closed-BO84g03t.js} +4 -4
  125. package/server/{issue-lifecycle-ZTt6kP_K.js → issue-lifecycle-DnhQgddB.js} +22 -22
  126. package/server/{issue-lifecycle-CJ7-D4XX.js → issue-lifecycle-nY4esZn8.js} +1 -1
  127. package/server/{issue-service-singleton-DNh4RRI7.js → issue-service-singleton-Bnqv1uaa.js} +1 -1
  128. package/server/{issue-service-singleton-DRE7S-Zg.js → issue-service-singleton-_AquSBTl.js} +8 -8
  129. package/server/{issues-CGc8Aaxm.js → issues-ChNcfHta.js} +2 -2
  130. package/server/{label-cleanup-CNsPlXy6.js → label-cleanup-bVXCGWBM.js} +3 -3
  131. package/server/{layers-CO_VLcSv.js → layers-vdvlpFki.js} +2 -2
  132. package/server/{lifecycle-B_NFvTj9.js → lifecycle-CGKm7doE.js} +7 -7
  133. package/server/{lifecycle-io-D0FftBLy.js → lifecycle-io-CdqPkCyk.js} +1 -1
  134. package/server/{lifecycle-io-WDGwa1vV.js → lifecycle-io-DSrv9xGh.js} +4 -4
  135. package/server/{linear-client-MvjflCXs.js → linear-client-BxKvL6U8.js} +1 -1
  136. package/server/{linear-client-CSgH24Ym.js → linear-client-E0HdXtWs.js} +2 -2
  137. package/server/memory-fts-worker.js +1 -1
  138. package/server/{merge-DltB-RGV.js → merge-D3wEbmUJ.js} +1 -1
  139. package/server/{merge-Ce9DHBXM.js → merge-UlAwCk80.js} +4 -4
  140. package/server/{merge-agent-Rv0bNQNU.js → merge-agent-BcgAYStl.js} +27 -27
  141. package/server/{merge-agent-DRXwKxmb.js → merge-agent-Dh8Y9PDO.js} +1 -1
  142. package/server/{merge-batch-LLp_cXUR.js → merge-batch-BwhGdlh4.js} +1 -1
  143. package/server/{merge-blockers-BqYUtLBd.js → merge-blockers-DwdQNsYD.js} +2 -2
  144. package/server/merge-ops-QdBiQ8XB.js +2 -0
  145. package/server/{merge-rebase-AiSEs4QB.js → merge-rebase-CH12_ufi.js} +2 -2
  146. package/server/{merge-set-CUY9msG9.js → merge-set-TRxJwR-w.js} +3 -3
  147. package/server/{merge-set-CSJoIpKB.js → merge-set-rXK3ehnB.js} +1 -1
  148. package/server/{merge-sync-CAjbJeTp.js → merge-sync-BKLKu9kz.js} +1 -1
  149. package/server/{merge-sync-CuyWzzZK.js → merge-sync-CaLRt2cB.js} +2 -2
  150. package/server/{merge-train-DndZCAiv.js → merge-train-DmxlYbEo.js} +3 -3
  151. package/server/{merge-train-deps-Bsy90Q7t.js → merge-train-deps-DBHsOWt9.js} +4 -4
  152. package/server/{merge-verification-Kvh4WViS.js → merge-verification-DA9rvqsE.js} +4 -4
  153. package/server/{multipart-parser-BWnfyoyz.js → multipart-parser-DtIEUW2B.js} +2 -2
  154. package/server/{no-resume-mode-CKy2bwZL.js → no-resume-mode-yrPEQ_pC.js} +1 -1
  155. package/server/{orphan-proposed-reconciler-Cg5_uVy1.js → orphan-proposed-reconciler-Db8tUhce.js} +10 -10
  156. package/server/{orphan-proposed-reconciler-CjUuBs6J.js → orphan-proposed-reconciler-mXV--tcB.js} +1 -1
  157. package/server/{pan-dir-Cn3NUnxU.js → pan-dir-BgBeeZDX.js} +3 -3
  158. package/server/{paths-Bo-kA9ta.js → paths-TE1GOZDr.js} +2 -2
  159. package/server/{pickup-DRn-XNXS.js → pickup-KLRUhThD.js} +1 -1
  160. package/server/{pipeline-notifier-BbGQtvKM.js → pipeline-notifier-aX_5EqQO.js} +2 -2
  161. package/server/{pipeline-notifier-DQsOtdjZ.js → pipeline-notifier-lwMa--Gz.js} +1 -1
  162. package/server/{projects-CKTA6Klk.js → projects-BNmVxnNt.js} +1 -1
  163. package/server/{prompts-CVncQg4P.js → prompts-CelsUdrx.js} +2 -2
  164. package/server/{providers-uPI9uU7Q.js → providers-4-xOzHQu.js} +7 -7
  165. package/server/{providers-CapuDkKX.js → providers-BOnRq5XK.js} +1 -1
  166. package/server/public/assets/{chunk-BO2N2NFS-CaAvtgHW.js → chunk-BO2N2NFS-jJsbVwoD.js} +4 -4
  167. package/server/public/assets/{diagram-OG6HWLK6-C4flU2X9.js → diagram-OG6HWLK6-Cp1aNi3v.js} +1 -1
  168. package/server/public/assets/{dist-DXAnG2e9.js → dist-B2-Oc7J1.js} +1 -1
  169. package/server/public/assets/{dist-DygIHsen.js → dist-Dbb8vdyE.js} +3 -3
  170. package/server/public/assets/{ganttDiagram-6RSMTGT7-BJY25etK.js → ganttDiagram-6RSMTGT7-rujV2mSn.js} +1 -1
  171. package/server/public/assets/{highlighted-body-OFNGDK62-DIEQLSG_.js → highlighted-body-OFNGDK62-Df3Exbbt.js} +1 -1
  172. package/server/public/assets/{index-BsKNi2y5.js → index-rQPa7qlV.js} +88 -88
  173. package/server/public/assets/{linear-CRa2o9KP.js → linear-Ctp3LAJ5.js} +1 -1
  174. package/server/public/assets/mermaid-GHXKKRXX-BnC2HrDq.js +1 -0
  175. package/server/public/assets/{pieDiagram-4H26LBE5-Cb6OrK_c.js → pieDiagram-4H26LBE5-K-m6VCum.js} +1 -1
  176. package/server/public/assets/{prod-DWpuiL-y.js → prod-jqZ3zqVg.js} +4 -4
  177. package/server/public/assets/{quadrantDiagram-W4KKPZXB-DhZzzcAO.js → quadrantDiagram-W4KKPZXB-DXcFax_1.js} +1 -1
  178. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CVe6lE5A.js → sankeyDiagram-5OEKKPKP-DnD_J_rB.js} +1 -1
  179. package/server/public/assets/{xychartDiagram-2RQKCTM6-zukUz5pI.js → xychartDiagram-2RQKCTM6-Dx25iKVp.js} +1 -1
  180. package/server/public/index.html +1 -1
  181. package/server/{pull-requests-C3csHJsc.js → pull-requests-CH4iBFLl.js} +3 -3
  182. package/server/{pull-requests-MeAgb3Ax.js → pull-requests-DL_4klIb.js} +1 -1
  183. package/server/{rally-nalS21zz.js → rally-D0mKv2t8.js} +3 -3
  184. package/server/rally-DffLLIdl.js +3 -0
  185. package/server/{rally-api-DzQryQi8.js → rally-api-CcCdecF-.js} +1 -1
  186. package/server/{rally-api-DdY4ebu3.js → rally-api-DgAt6FbN.js} +2 -2
  187. package/server/{rally-client-9duSds1_.js → rally-client-DYjtgTOu.js} +4 -4
  188. package/server/{rally-client-B16-bZk9.js → rally-client-X0bEEN2B.js} +1 -1
  189. package/server/reap-terminal-sessions-BwJb2DLJ.js +3 -0
  190. package/server/{reap-terminal-sessions-C6rD1pDT.js → reap-terminal-sessions-CAmURC2h.js} +12 -62
  191. package/server/{rebuild-stack-D9qBmVcM.js → rebuild-stack-BLG3rlWa.js} +6 -6
  192. package/server/{rebuild-stack-DrWMHxoY.js → rebuild-stack-ByFCMqTK.js} +1 -1
  193. package/server/{reconstruct-cache--H2QBooC.js → reconstruct-cache-_tDZ2D72.js} +6 -6
  194. package/server/{record-fn7uPjsl.js → record-DjPikotp.js} +1 -1
  195. package/server/{remote-BEkHf2HO.js → remote-B1Trmr0N.js} +3 -3
  196. package/server/{remote-Dl6Hn0zz.js → remote-TN0cV8k-.js} +3 -3
  197. package/server/{remote-agents-DNdP4sew.js → remote-agents-CmbIKw7E.js} +5 -5
  198. package/server/{remote-agents-OB4zwVHz.js → remote-agents-DNuaAgU6.js} +1 -1
  199. package/server/{remote-completion-BINc1Y8c.js → remote-completion-Bklh6loJ.js} +12 -12
  200. package/server/resume-DnIsmIgC.js +3 -0
  201. package/server/review-agent-DgySDb-G.js +3 -0
  202. package/server/{review-agent-C-A6IgXc.js → review-agent-phzqNqIs.js} +599 -197
  203. package/server/{review-artifacts-DTTdAYsU.js → review-artifacts-BGc69epg.js} +7 -7
  204. package/server/{review-context-De14xPtc.js → review-context-CCq56O_Y.js} +7 -7
  205. package/server/{review-monitor-BNV3kjLq.js → review-monitor-BKG2ubt5.js} +2 -2
  206. package/server/{review-status-DWAsTqfJ.js → review-status-BQjqQXZG.js} +160 -52
  207. package/server/{review-status-mo3tyc8L.js → review-status-bBkqUj5i.js} +1 -1
  208. package/server/{review-status-enrichment-C6sr9wOI.js → review-status-enrichment-CGlcApSn.js} +3 -3
  209. package/server/{review-status-sync-D-p7TQit.js → review-status-sync-BWHnrq-k.js} +3 -3
  210. package/server/{review-status-sync-MvYGQLDD.js → review-status-sync-BxHBVH8s.js} +1 -1
  211. package/server/{review-verdict-feedback-BbIfN5Vg.js → review-verdict-feedback-cZh9Wi9G.js} +1 -1
  212. package/server/{review-verdict-feedback-Cfc-THvz.js → review-verdict-feedback-wqnikhMK.js} +16 -36
  213. package/server/{rollup-DgWlrSBc.js → rollup-BJE-Vc7H.js} +8 -8
  214. package/server/{rollup-CxR6GMTe.js → rollup-DBNy1yFB.js} +1 -1
  215. package/server/{scanner-6OmIn5XE.js → scanner-CUGpdp4i.js} +7 -7
  216. package/server/{sequence-io-CxiPMMKM.js → sequence-io-B2GmilSI.js} +4 -4
  217. package/server/{sequencer-agent--xPlSfR2.js → sequencer-agent-D8pW2aU_.js} +5 -5
  218. package/server/server.js +166 -162
  219. package/server/{service-CXje28KS.js → service-CILd-uOt.js} +46 -45
  220. package/server/session-fork-DDSDVoIK.js +99 -0
  221. package/server/{settings-ChvoXExM.js → settings-CBrei_kx.js} +2 -2
  222. package/server/{settings-DZq_bi-B.js → settings-D2wt4nku.js} +3 -3
  223. package/server/settings-vLoKyghx.js +2 -0
  224. package/server/{shadow-engineering-BHeyD5bL.js → shadow-engineering-Ba1D0QUN.js} +2 -2
  225. package/server/{shadow-state-p3YTxrJ5.js → shadow-state-BOaq8BrD.js} +1 -1
  226. package/server/{shadow-state-3L0eHQNE.js → shadow-state-DTC7AMHc.js} +2 -2
  227. package/server/{ship-log-B2EEH__n.js → ship-log-CMWH3H5-.js} +1 -1
  228. package/server/{smart-compaction-DRXK5_io.js → smart-compaction-Bgp_gwcA.js} +1 -1
  229. package/server/{smart-compaction-DMB4hv07.js → smart-compaction-CrP90OFE.js} +7 -7
  230. package/server/{spawn-planning-session-BZfVvIi3.js → spawn-planning-session-BmJWHSCu.js} +15 -15
  231. package/server/{spawn-planning-session-BBUzeHJQ.js → spawn-planning-session-D15KbPOy.js} +1 -1
  232. package/server/{specialist-completion-BAZHHbmp.js → specialist-completion-BiEXUHfD.js} +1 -1
  233. package/server/{specialist-context-DgdhI7rm.js → specialist-context-CwKkcXL9.js} +5 -5
  234. package/server/{specialist-handoff-logger-CH1nC8fq.js → specialist-handoff-logger-B_2VsWli.js} +2 -2
  235. package/server/{specialist-logs-DynFhFXg.js → specialist-logs-CvDxquV_.js} +3 -3
  236. package/server/{specialists-LJ9MZMCz.js → specialists-BCjcG4uE.js} +1 -1
  237. package/server/{specialists-BUKBHtmQ.js → specialists-BYi0k8CZ.js} +18 -18
  238. package/server/{specialists-e0Jmecc1.js → specialists-D07ybnam.js} +78 -85
  239. package/server/{specialists-CF02f9p2.js → specialists-F2uMO4QS.js} +1 -1
  240. package/server/specs-DeS98l_p.js +3 -0
  241. package/server/{src-CNLON0co.js → src-BswtmojL.js} +6 -6
  242. package/server/{src-DhJeCV1p.js → src-Dp0WHgDZ.js} +3 -3
  243. package/server/{src-AXK4mjue.js → src-fgbU-jJ-.js} +6 -3
  244. package/server/{stack-health-8jZH0Lgk.js → stack-health-BJVh1TCg.js} +3 -3
  245. package/server/{stack-health-CXYHwv5D.js → stack-health-Deel1mSW.js} +1 -1
  246. package/server/{state-home-XkLSsJCD.js → state-home-Bgj7i-C7.js} +8 -7
  247. package/server/{summary-fork-shfA2XOf.js → summary-fork-DedqguZb.js} +2 -2
  248. package/server/{summary-fork-BWa0ECGL.js → summary-fork-EjvOkEPl.js} +12 -91
  249. package/server/{supervisor-owMkHcx8.js → supervisor-0oXvLwyC.js} +3 -3
  250. package/server/supervisor-D1-XwmZ7.js +2 -0
  251. package/server/{swarm-readiness-BACUsKOx.js → swarm-readiness-OBgamRql.js} +3 -3
  252. package/server/{teardown-workspace-CYt_PBaq.js → teardown-workspace-5LCVbjfq.js} +14 -14
  253. package/server/{test-agent-queue-C1s6mB8C.js → test-agent-queue-qfsq6uaC.js} +6 -6
  254. package/server/{test-verdict-CmxX3KEf.js → test-verdict-BkubHtti.js} +1 -1
  255. package/server/{test-verdict-njEv9ZY2.js → test-verdict-D3Il7cBK.js} +1 -1
  256. package/server/{tldr-daemon-CEUflKr2.js → tldr-daemon-CJW_P4On.js} +2 -2
  257. package/server/{tldr-daemon-HIo0dwDB.js → tldr-daemon-CJqGsDFh.js} +1 -1
  258. package/server/tmux-CeDD14p1.js +3 -0
  259. package/server/{tmux-CBYZ5lKF.js → tmux-ePNhMIMU.js} +2 -2
  260. package/server/{token-CiS3w6Ma.js → token-_qujO3JZ.js} +1 -1
  261. package/server/{tracker-config-CVCoeaaL.js → tracker-config-C3hiPVAM.js} +2 -2
  262. package/server/{tracker-config-Bx50plWp.js → tracker-config-Drt_tx4D.js} +1 -1
  263. package/server/{tracker-utils-C2Lg4RoB.js → tracker-utils-D6B8scEw.js} +1 -1
  264. package/server/{tracker-utils-mI4d-vh8.js → tracker-utils-bpWs7Xyx.js} +2 -2
  265. package/server/{traefik-connect-D21-YEyX.js → traefik-connect-5EP1WS_Z.js} +1 -1
  266. package/server/{tunnel-BK4PVyb0.js → tunnel-3Ve8BS4H.js} +3 -3
  267. package/server/{tunnel-CcHkuRIS.js → tunnel-AporWhoi.js} +1 -1
  268. package/server/{types-DoPMvws2.js → types-B5u3NxMl.js} +1 -1
  269. package/server/{uat-train-BLFPxqLx.js → uat-train-C3hWXtip.js} +1 -1
  270. package/server/{uat-train-CQ_E-2ei.js → uat-train-CtNGgXxj.js} +27 -27
  271. package/server/{validation-Dab3bnSN.js → validation-BmUB-26g.js} +4 -4
  272. package/server/{validation-1QnjDMc0.js → validation-CbqP_dze.js} +1 -1
  273. package/server/{verification-runner-BO8TgZWA.js → verification-runner-BPAhPWR7.js} +11 -11
  274. package/server/{verification-runner-UhAAqOio.js → verification-runner-DuZRHjPU.js} +1 -1
  275. package/server/{vtt-parser-D-q5-8il.js → vtt-parser-CKc-smWM.js} +1 -1
  276. package/server/{work-agent-prompt-D_7T1xw5.js → work-agent-prompt-DCdHsm-V.js} +11 -11
  277. package/server/workflows-Cz8OtiB4.js +2 -0
  278. package/server/{workflows-CB5SWd0B.js → workflows-H-COJ84X.js} +14 -14
  279. package/server/{workspace-C4Avf_Tp.js → workspace-4ZufqeMe.js} +3 -3
  280. package/server/{workspace--XWYPbn1.js → workspace-DYv9kBg6.js} +1 -1
  281. package/server/{workspace-config-BwJB-bLH.js → workspace-config-DA8U97k9.js} +1 -1
  282. package/server/{workspace-manager-_6zbrhNF.js → workspace-manager-B3PqQQSM.js} +1 -1
  283. package/server/{workspace-manager-BE3OznLY.js → workspace-manager-CEWK-OXd.js} +12 -12
  284. package/server/{workspace-metadata-BCgODi1j.js → workspace-metadata-1eu1RvAT.js} +2 -2
  285. package/server/{workspace-metadata-wKPgY8PN.js → workspace-metadata-C0I-nIDL.js} +1 -1
  286. package/server/{workspaces-DpMiZ9BP.js → workspaces-CRU9_vRn.js} +154 -106
  287. package/server/agent-state-DTZCqWx5.js +0 -3
  288. package/server/cli-wyiCmp7b.js +0 -3
  289. package/server/deacon-swarm-jDiQ0kKk.js +0 -2
  290. package/server/dist-CnkaBMG-.js +0 -3
  291. package/server/forge-D2QLGWK9.js +0 -2
  292. package/server/hume-sCsuupWb.js +0 -3
  293. package/server/inspect-agent-DnspoIls.js +0 -2
  294. package/server/merge-ops-B6xc_Irj.js +0 -2
  295. package/server/public/assets/mermaid-GHXKKRXX-uIkd-n0c.js +0 -1
  296. package/server/rally-BJiyvz3w.js +0 -3
  297. package/server/reap-terminal-sessions-mW7SPDtP.js +0 -2
  298. package/server/resume-Pur3Z2e8.js +0 -3
  299. package/server/review-agent-BRSSFv7e.js +0 -3
  300. package/server/settings-D0XXIUQ0.js +0 -2
  301. package/server/specs-COn3zZ2Q.js +0 -3
  302. package/server/supervisor-DwGIhpXk.js +0 -2
  303. package/server/tmux-DNmHGMEv.js +0 -3
  304. package/server/workflows-Plo_VxeO.js +0 -2
@@ -25,4 +25,4 @@ function recordDeaconNudge(nudge) {
25
25
  //#endregion
26
26
  export { recordDeaconNudge as t };
27
27
 
28
- //# sourceMappingURL=deacon-nudge-log-Cmcch2Av.js.map
28
+ //# sourceMappingURL=deacon-nudge-log-CJGA6aSQ.js.map
@@ -0,0 +1,2 @@
1
+ import { r as coordinateSwarmSlots } from "./deacon-swarm-DadWNi5J.js";
2
+ export { coordinateSwarmSlots };
@@ -1,11 +1,11 @@
1
- import { C as resolveTieredExecutionEnabled, Ln as listProjectsSync, Mt as readIssueRecordForWorkspaceSync, Nn as init_projects, Ot as init_record, Rt as writeIssueRecordForWorkspaceSync, S as init_tier_table, Tt as getIssueRecordPathForWorkspace, f as loadConfigSync, ln as init_state_plane, t as init_config_yaml, un as isStatePlaneOnlyStatus } from "./config-yaml-DbdN9Fuq.js";
2
- import { C as isPaneDead, E as listPaneValues, L as sessionExists, O as listSessionNames, i as capturePane, x as init_tmux } from "./tmux-CBYZ5lKF.js";
3
- import { c as init_review_status, s as getReviewStatusSync, y as setReviewStatusSync } from "./review-status-DWAsTqfJ.js";
4
- import { A as init_messaging, Fn as init_agent_state, Ft as init_spawn_prep, G as init_termination, H as init_spawn, Ht as resolveTier, K as stopAgent, Pn as getAgentStateSync, Pt as defaultRunWorkspace, Vt as init_resolve_tier, W as spawnRun, _ as init_slot_reconcile, _r as getAgentRuntimeSnapshot, _t as init_config, at as init_concurrency, c as init_tier_supervisor, d as spawnTierSupervisor, f as supervisorAgentId, ft as getCachedMemoryVerdict, it as getConcurrencyLimits, j as messageAgent, jn as getAgentResumeGateBlockReason, kn as decideResumeGate, l as loadPrdDraft, m as init_tier_feed, p as broadcastCommit, pt as init_memory_verdict_cache, s as deliverCommitForReview, st as releaseSwarmSlot, tt as countRunningSwarmSlotsForIssue, u as shouldSupervise, ut as tryReserveSwarmSlot, v as listSlotAssignments, vr as init_agent_runtime, y as reconcileSlotState, yt as loadCloisterConfigSync } from "./agents-D_x5BSZM.js";
5
- import { C as findSpecByIssue, T as init_specs, n as applyStatusOverrides, o as init_io } from "./io-DtAQ_2hp.js";
6
- import { s as init_control_settings, u as isDeaconGloballyPausedSync } from "./control-settings-CYv732Gs.js";
7
- import { a as createActiveSlice, n as applyTaskOperationToPlanFile, r as blockingParentCount, s as getDispatchableItems, u as init_dag } from "./dag-DZBowTd2.js";
8
- import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-BACUsKOx.js";
1
+ import { C as resolveTieredExecutionEnabled, Ln as listProjectsSync, Mt as readIssueRecordForWorkspaceSync, Nn as init_projects, Ot as init_record, Rt as writeIssueRecordForWorkspaceSync, S as init_tier_table, Tt as getIssueRecordPathForWorkspace, f as loadConfigSync, ln as init_state_plane, t as init_config_yaml, un as isStatePlaneOnlyStatus } from "./config-yaml-DPAieL_G.js";
2
+ import { C as isPaneDead, E as listPaneValues, L as sessionExists, O as listSessionNames, i as capturePane, x as init_tmux } from "./tmux-ePNhMIMU.js";
3
+ import { c as init_review_status, s as getReviewStatusSync, y as setReviewStatusSync } from "./review-status-BQjqQXZG.js";
4
+ import { A as init_messaging, Fn as init_agent_state, Ft as init_spawn_prep, G as init_termination, H as init_spawn, Ht as resolveTier, K as stopAgent, Pn as getAgentStateSync, Pt as defaultRunWorkspace, Vt as init_resolve_tier, W as spawnRun, _ as init_slot_reconcile, _r as getAgentRuntimeSnapshot, _t as init_config, at as init_concurrency, c as init_tier_supervisor, d as spawnTierSupervisor, f as supervisorAgentId, ft as getCachedMemoryVerdict, it as getConcurrencyLimits, j as messageAgent, jn as getAgentResumeGateBlockReason, kn as decideResumeGate, l as loadPrdDraft, m as init_tier_feed, p as broadcastCommit, pt as init_memory_verdict_cache, s as deliverCommitForReview, st as releaseSwarmSlot, tt as countRunningSwarmSlotsForIssue, u as shouldSupervise, ut as tryReserveSwarmSlot, v as listSlotAssignments, vr as init_agent_runtime, y as reconcileSlotState, yt as loadCloisterConfigSync } from "./agents-DHvsjsuP.js";
5
+ import { C as findSpecByIssue, T as init_specs, n as applyStatusOverrides, o as init_io } from "./io-Wy8YpFeP.js";
6
+ import { s as init_control_settings, u as isDeaconGloballyPausedSync } from "./control-settings-BMqUkXmR.js";
7
+ import { a as createActiveSlice, n as applyTaskOperationToPlanFile, r as blockingParentCount, s as getDispatchableItems, u as init_dag } from "./dag-jH8ZkewR.js";
8
+ import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-OBgamRql.js";
9
9
  import { Effect } from "effect";
10
10
  import { existsSync, readdirSync } from "fs";
11
11
  import { join } from "path";
@@ -303,7 +303,7 @@ async function defaultRequestIssueReview(issueId, workspacePath) {
303
303
  autoRequeueCount: 0,
304
304
  reviewRequestedAt: (/* @__PURE__ */ new Date()).toISOString()
305
305
  });
306
- const { spawnReviewRoleForIssue } = await import("./review-agent-BRSSFv7e.js");
306
+ const { spawnReviewRoleForIssue } = await import("./review-agent-DgySDb-G.js");
307
307
  return Effect.runPromise(spawnReviewRoleForIssue({
308
308
  issueId,
309
309
  workspace: workspacePath,
@@ -645,10 +645,14 @@ async function archiveFailedSwarmSlot(issueId, workspacePath, slot, deps, now =
645
645
  deps.clearSlotAssignment(workspacePath, normalized, slot.slotIndex, slot.itemId);
646
646
  return attempt;
647
647
  }
648
- async function requeueFailedSwarmSlots(issueId, workspacePath, classified, doc, reconciled, deps) {
648
+ async function requeueFailedSwarmSlots(issueId, workspacePath, classified, doc, reconciled, deps, blockedSlotIndexes = /* @__PURE__ */ new Set()) {
649
649
  let nextDoc = doc;
650
650
  const actions = [];
651
651
  for (const slot of classified.filter((candidate) => candidate.lifecycle === "failed")) {
652
+ if (blockedSlotIndexes.has(slot.slotIndex)) {
653
+ actions.push(`[swarm] skipped requeue slot ${slot.slotIndex} (item ${slot.itemId}) for ${issueId}: failed-merge block — awaiting operator recovery`);
654
+ continue;
655
+ }
652
656
  const admission = decideAutonomousRedrive(slot.agentId ? getAgentStateSync(slot.agentId) ?? {} : {}, { owesRework: true });
653
657
  if (admission.decision === "defer") {
654
658
  actions.push(`[swarm] deferred failed slot ${slot.slotIndex}: ${admission.reason}`);
@@ -802,10 +806,12 @@ async function coordinateSwarmSlots(opts = {}, deps = defaultDeps) {
802
806
  actions.push(`[swarm] deferred ${issueId}: advance backoff active`);
803
807
  continue;
804
808
  }
805
- const failedMergeBlock = getFailedMergeBlock(issueId, workspace.workspacePath);
806
- if (failedMergeBlock) {
807
- actions.push(`[swarm] blocked ${issueId}: failed-merge slot ${failedMergeBlock.slotIndex} (item ${failedMergeBlock.itemId})`);
808
- continue;
809
+ const failedMergeBlocks = getFailedMergeBlocks(issueId, workspace.workspacePath);
810
+ const blockedSlotIndexes = new Set(failedMergeBlocks.map((block) => block.slotIndex));
811
+ const blockedItemIds = new Set(failedMergeBlocks.map((block) => block.itemId));
812
+ if (failedMergeBlocks.length > 0) {
813
+ const slots = failedMergeBlocks.map((block) => `slot ${block.slotIndex} (item ${block.itemId})`).join(", ");
814
+ actions.push(`[swarm] blocked slots for ${issueId}: ${slots} — other slots continue; run \`pan swarm recover ${issueId} <slot>\``);
809
815
  }
810
816
  try {
811
817
  const spec = await Effect.runPromise(findSpecByIssue(workspace.projectPath, issueId));
@@ -836,14 +842,14 @@ async function coordinateSwarmSlots(opts = {}, deps = defaultDeps) {
836
842
  actions.push(`[swarm] ${issueId} slot ${slot.slotIndex} ${slot.lifecycle}${slot.signal ? ` signal: ${slot.signal}` : ""}`);
837
843
  if (slot.actions) actions.push(...slot.actions);
838
844
  }
839
- const requeue = await requeueFailedSwarmSlots(issueId, workspace.workspacePath, classified, doc, reconciled, deps);
845
+ const requeue = await requeueFailedSwarmSlots(issueId, workspace.workspacePath, classified, doc, reconciled, deps, blockedSlotIndexes);
840
846
  actions.push(...requeue.actions);
841
847
  actions.push(...recordStalledSlotRecovery(issueId, classified, workspace.workspacePath));
842
- actions.push(...await mergeReadySlots(issueId, workspace.workspacePath, doc, classified, deps));
848
+ actions.push(...await mergeReadySlots(issueId, workspace.workspacePath, doc, classified, deps, blockedSlotIndexes));
843
849
  actions.push(...await gcMergedSlots(issueId, workspace.workspacePath, reconciled.merged, deps));
844
850
  actions.push(...await gcOrphanedSlots(issueId, workspace.workspacePath, reconciled, deps));
845
851
  actions.push(...await finalizeSwarmIssueIfComplete(issueId, workspace.workspacePath, spec.document, deps));
846
- if (dispatchEligible) actions.push(...await dispatchNextWave(issueId, workspace.workspacePath, requeue.doc, reconciled, analyzeSwarmReadiness(requeue.doc), deps));
852
+ if (dispatchEligible) actions.push(...await dispatchNextWave(issueId, workspace.workspacePath, requeue.doc, reconciled, analyzeSwarmReadiness(requeue.doc), deps, blockedSlotIndexes, blockedItemIds));
847
853
  recordSwarmAdvanceSuccess(issueId);
848
854
  } catch (err) {
849
855
  recordSwarmAdvanceFailure(issueId);
@@ -975,12 +981,16 @@ function swarmStallThresholdMs() {
975
981
  const parsed = Number(raw);
976
982
  return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_SWARM_STALL_THRESHOLD_MS;
977
983
  }
978
- async function mergeReadySlots(issueId, workspacePath, doc, slots, deps = defaultDeps) {
984
+ async function mergeReadySlots(issueId, workspacePath, doc, slots, deps = defaultDeps, blockedSlotIndexes = /* @__PURE__ */ new Set()) {
979
985
  const actions = [];
980
986
  const itemsById = new Map(doc.plan.items.map((item) => [item.id, item]));
981
987
  const planPath = join(workspacePath, ".pan", "spec.vbrief.json");
982
988
  for (const slot of slots) {
983
989
  if (slot.lifecycle !== "ready-to-merge") continue;
990
+ if (blockedSlotIndexes.has(slot.slotIndex)) {
991
+ actions.push(`[swarm] skipped merge slot ${slot.slotIndex} (item ${slot.itemId}) for ${issueId}: failed-merge block — awaiting \`pan swarm recover\``);
992
+ continue;
993
+ }
984
994
  const item = itemsById.get(slot.itemId);
985
995
  if (!item) {
986
996
  actions.push(`[swarm] cannot merge slot ${slot.slotIndex} for ${issueId}: itemId "${slot.itemId}" not in the current plan (spec drift?) — needs operator attention`);
@@ -1047,16 +1057,42 @@ function isSwarmAdvanceCoolingDown(issueId, now = Date.now()) {
1047
1057
  const record = issueAdvanceFailures.get(issueId.toUpperCase());
1048
1058
  return record !== void 0 && record.cooldownUntil > now;
1049
1059
  }
1050
- function getFailedMergeBlock(issueId, workspacePath) {
1060
+ function getFailedMergeBlock(issueId, slotIndex, workspacePath) {
1051
1061
  const normalized = issueId.toUpperCase();
1052
1062
  if (workspacePath) {
1053
- const durable = readIssueRecordForWorkspaceSync(workspacePath, normalized)?.swarm?.failedMergeBlock;
1054
- if (durable) return {
1055
- ...durable,
1056
- issueId: durable.issueId.toUpperCase()
1063
+ const swarm = readIssueRecordForWorkspaceSync(workspacePath, normalized)?.swarm;
1064
+ const keyed = swarm?.failedMergeBlocks?.[String(slotIndex)];
1065
+ if (keyed) return {
1066
+ ...keyed,
1067
+ issueId: keyed.issueId.toUpperCase()
1068
+ };
1069
+ const legacy = swarm?.failedMergeBlock;
1070
+ if (legacy && legacy.slotIndex === slotIndex) return {
1071
+ ...legacy,
1072
+ issueId: legacy.issueId.toUpperCase()
1057
1073
  };
1058
1074
  }
1059
- return failedMergeBlocks.get(normalized);
1075
+ return failedMergeBlocks.get(`${normalized}:${slotIndex}`);
1076
+ }
1077
+ function getFailedMergeBlocks(issueId, workspacePath) {
1078
+ const normalized = issueId.toUpperCase();
1079
+ const bySlot = /* @__PURE__ */ new Map();
1080
+ if (workspacePath) {
1081
+ const swarm = readIssueRecordForWorkspaceSync(workspacePath, normalized)?.swarm;
1082
+ if (swarm?.failedMergeBlock) {
1083
+ const legacy = swarm.failedMergeBlock;
1084
+ bySlot.set(legacy.slotIndex, {
1085
+ ...legacy,
1086
+ issueId: legacy.issueId.toUpperCase()
1087
+ });
1088
+ }
1089
+ if (swarm?.failedMergeBlocks) for (const [key, block] of Object.entries(swarm.failedMergeBlocks)) bySlot.set(Number(key), {
1090
+ ...block,
1091
+ issueId: block.issueId.toUpperCase()
1092
+ });
1093
+ }
1094
+ for (const [key, block] of failedMergeBlocks.entries()) if (key.startsWith(`${normalized}:`) && !bySlot.has(block.slotIndex)) bySlot.set(block.slotIndex, { ...block });
1095
+ return [...bySlot.values()].sort((a, b) => a.slotIndex - b.slotIndex);
1060
1096
  }
1061
1097
  function getSwarmFinalizedAt(issueId, workspacePath) {
1062
1098
  return workspacePath ? readIssueRecordForWorkspaceSync(workspacePath, issueId.toUpperCase())?.swarm?.finalizedAt : void 0;
@@ -1069,33 +1105,40 @@ function recordFailedMergeBlock(block, workspacePath) {
1069
1105
  ...block,
1070
1106
  issueId: block.issueId.toUpperCase()
1071
1107
  };
1072
- failedMergeBlocks.set(normalizedBlock.issueId, normalizedBlock);
1073
- if (workspacePath) writeSwarmFailedMergeBlock(workspacePath, normalizedBlock.issueId, normalizedBlock);
1108
+ failedMergeBlocks.set(`${normalizedBlock.issueId}:${normalizedBlock.slotIndex}`, normalizedBlock);
1109
+ if (workspacePath) writeSwarmFailedMergeBlock(workspacePath, normalizedBlock.issueId, normalizedBlock.slotIndex, normalizedBlock);
1074
1110
  }
1075
1111
  function recordStalledSlotRecovery(issueId, slots, workspacePath) {
1076
1112
  const actions = [];
1077
1113
  const normalizedIssueId = issueId.toUpperCase();
1078
- if (getFailedMergeBlock(normalizedIssueId, workspacePath)) return actions;
1079
- const stalled = slots.find((slot) => slot.lifecycle === "stalled");
1080
- if (!stalled) return actions;
1081
- recordFailedMergeBlock({
1082
- issueId: normalizedIssueId,
1083
- itemId: stalled.itemId,
1084
- slotIndex: stalled.slotIndex,
1085
- branch: stalled.branch,
1086
- note: `Slot ${stalled.slotIndex} stalled with no branch commit or pane output progress`
1087
- }, workspacePath);
1088
- actions.push(`[swarm] stalled slot ${stalled.slotIndex} (item ${stalled.itemId}) for ${normalizedIssueId}: recovery required`);
1114
+ for (const slot of slots.filter((s) => s.lifecycle === "stalled")) {
1115
+ if (getFailedMergeBlock(normalizedIssueId, slot.slotIndex, workspacePath)) continue;
1116
+ recordFailedMergeBlock({
1117
+ issueId: normalizedIssueId,
1118
+ itemId: slot.itemId,
1119
+ slotIndex: slot.slotIndex,
1120
+ branch: slot.branch,
1121
+ note: `Slot ${slot.slotIndex} stalled with no branch commit or pane output progress`
1122
+ }, workspacePath);
1123
+ actions.push(`[swarm] stalled slot ${slot.slotIndex} (item ${slot.itemId}) for ${normalizedIssueId}: recovery required`);
1124
+ }
1089
1125
  return actions;
1090
1126
  }
1091
- function writeSwarmFailedMergeBlock(workspacePath, issueId, block) {
1127
+ function writeSwarmFailedMergeBlock(workspacePath, issueId, slotIndex, block) {
1092
1128
  const normalizedIssueId = issueId.toUpperCase();
1093
1129
  const record = readIssueRecordForWorkspaceSync(workspacePath, normalizedIssueId) ?? createMinimalIssueRecord(normalizedIssueId);
1130
+ const existingSwarm = record.swarm ?? {};
1131
+ const foldedBlocks = { ...existingSwarm.failedMergeBlocks ?? {} };
1132
+ if (existingSwarm.failedMergeBlock) foldedBlocks[String(existingSwarm.failedMergeBlock.slotIndex)] = existingSwarm.failedMergeBlock;
1133
+ const nextBlocks = { ...foldedBlocks };
1134
+ if (block) nextBlocks[String(slotIndex)] = block;
1135
+ else delete nextBlocks[String(slotIndex)];
1094
1136
  writeIssueRecordForWorkspaceSync(workspacePath, normalizedIssueId, {
1095
1137
  ...record,
1096
1138
  swarm: {
1097
- ...record.swarm ?? {},
1098
- failedMergeBlock: block
1139
+ ...existingSwarm,
1140
+ failedMergeBlocks: nextBlocks,
1141
+ failedMergeBlock: void 0
1099
1142
  }
1100
1143
  });
1101
1144
  }
@@ -1109,12 +1152,13 @@ function isSlotMergeCoolingDown(branchKey, now = Date.now()) {
1109
1152
  recentSlotMergeFires.delete(branchKey);
1110
1153
  return false;
1111
1154
  }
1112
- async function dispatchNextWave(issueId, workspacePath, doc, reconciled, readiness, deps = defaultDeps) {
1155
+ async function dispatchNextWave(issueId, workspacePath, doc, reconciled, readiness, deps = defaultDeps, blockedSlotIndexes = /* @__PURE__ */ new Set(), blockedItemIds = /* @__PURE__ */ new Set()) {
1113
1156
  const actions = [];
1114
1157
  const mergedItemIds = new Set(reconciled.merged.map((slot) => slot.itemId));
1115
1158
  const slotEligibleIds = new Set(readiness.items.filter((item) => item.slotEligible).map((item) => item.id));
1116
1159
  const configuredMaxSlotIndex = Math.max(1, Math.floor((deps.getMaxSlotIndex ?? defaultGetMaxSlotIndex)()));
1117
1160
  const occupiedSlotIndexes = new Set([
1161
+ ...blockedSlotIndexes,
1118
1162
  ...reconciled.inFlight.map((slot) => slot.slotIndex),
1119
1163
  ...reconciled.branches.map((branch) => branch.slotIndex),
1120
1164
  ...reconciled.agents.map((agent) => agent.slotIndex),
@@ -1130,6 +1174,7 @@ async function dispatchNextWave(issueId, workspacePath, doc, reconciled, readine
1130
1174
  const selectedItemIds = [];
1131
1175
  const planPath = join(workspacePath, ".pan", "spec.vbrief.json");
1132
1176
  for (const item of getDispatchableItems(doc, mergedItemIds)) {
1177
+ if (blockedItemIds.has(item.id)) continue;
1133
1178
  if (!slotEligibleIds.has(item.id)) continue;
1134
1179
  if (inFlightItemIds.has(item.id)) continue;
1135
1180
  const overlapItemId = firstOverlappingItemId(item.id, [...inFlightItemIds, ...selectedItemIds], readiness);
@@ -1291,6 +1336,6 @@ function registeredSlotCapacityAvailable(issueId, selectedCount, liveSlotCount =
1291
1336
  return liveSlotCount + selectedCount < limits.reservedSwarmSlots;
1292
1337
  }
1293
1338
  //#endregion
1294
- export { gcMergedSlots as _, getFailedMergeBlock as a, mergeReadySlots as c, recordSwarmAdvanceFailure as d, recordSwarmAdvanceSuccess as f, recordRecoveryFailure as g, decideAgentAutonomousRedrive as h, dispatchNextWave as i, recordFailedMergeBlock as l, registeredSlotCapacityAvailable as m, classifyInFlightSlots as n, getSwarmFinalizedAt as o, recordSwarmFinalizedAt as p, coordinateSwarmSlots as r, isSwarmAdvanceCoolingDown as s, allocateSlotIndex as t, recordStalledSlotRecovery as u, gcOrphanedSlots as v, listFeatureWorkspaces as y };
1339
+ export { recordRecoveryFailure as _, getFailedMergeBlock as a, listFeatureWorkspaces as b, isSwarmAdvanceCoolingDown as c, recordStalledSlotRecovery as d, recordSwarmAdvanceFailure as f, decideAgentAutonomousRedrive as g, registeredSlotCapacityAvailable as h, dispatchNextWave as i, mergeReadySlots as l, recordSwarmFinalizedAt as m, classifyInFlightSlots as n, getFailedMergeBlocks as o, recordSwarmAdvanceSuccess as p, coordinateSwarmSlots as r, getSwarmFinalizedAt as s, allocateSlotIndex as t, recordFailedMergeBlock as u, gcMergedSlots as v, gcOrphanedSlots as y };
1295
1340
 
1296
- //# sourceMappingURL=deacon-swarm-BBGnhvD2.js.map
1341
+ //# sourceMappingURL=deacon-swarm-DadWNi5J.js.map
package/server/deacon.js CHANGED
@@ -1,11 +1,11 @@
1
- import { rn as init_auto_commit, tn as flushAllPendingAutoCommits } from "./config-yaml-DbdN9Fuq.js";
2
- import { a as init_activity_logger, o as setActivityEventStoreProvider } from "./activity-logger-Dm95Ua07.js";
3
- import { c as init_review_status, s as getReviewStatusSync } from "./review-status-DWAsTqfJ.js";
4
- import { Mn as getAgentState, t as init_agents } from "./agents-D_x5BSZM.js";
5
- import { r as setCloisterEventStoreProvider, t as getCloisterService } from "./service-CXje28KS.js";
6
- import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-DWhBqgIk.js";
7
- import { F as setAgentStatusChangedNotifier, I as setAgentStoppedNotifier, L as setMergeReadyNotifier, M as resetPatrolHeartbeatForStartup, N as runPatrol } from "./deacon-f0yvsG5S.js";
8
- import { t as enrichReviewStatus } from "./review-status-enrichment-C6sr9wOI.js";
1
+ import { rn as init_auto_commit, tn as flushAllPendingAutoCommits } from "./config-yaml-DPAieL_G.js";
2
+ import { a as init_activity_logger, o as setActivityEventStoreProvider } from "./activity-logger-pcbf-e30.js";
3
+ import { c as init_review_status, s as getReviewStatusSync } from "./review-status-BQjqQXZG.js";
4
+ import { Mn as getAgentState, t as init_agents } from "./agents-DHvsjsuP.js";
5
+ import { r as setCloisterEventStoreProvider, t as getCloisterService } from "./service-CILd-uOt.js";
6
+ import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-CQUx9YLc.js";
7
+ import { F as setAgentStatusChangedNotifier, I as setAgentStoppedNotifier, L as setMergeReadyNotifier, M as resetPatrolHeartbeatForStartup, N as runPatrol } from "./deacon-j3qSZ7--.js";
8
+ import { t as enrichReviewStatus } from "./review-status-enrichment-CGlcApSn.js";
9
9
  import { Effect } from "effect";
10
10
  import { randomUUID } from "node:crypto";
11
11
  //#region ../../lib/cloister/deacon-event-client.ts
@@ -1,6 +1,6 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { vr as init_errors } from "./config-yaml-DbdN9Fuq.js";
3
- import { n as init_workspace_config, r as replacePlaceholdersSync } from "./workspace-config-BwJB-bLH.js";
2
+ import { vr as init_errors } from "./config-yaml-DPAieL_G.js";
3
+ import { n as init_workspace_config, r as replacePlaceholdersSync } from "./workspace-config-DA8U97k9.js";
4
4
  import "effect";
5
5
  import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, symlinkSync, writeFileSync } from "fs";
6
6
  import { basename, dirname, join } from "path";
@@ -166,4 +166,4 @@ var init_devcontainer_renderer = __esmMin((() => {
166
166
  //#endregion
167
167
  export { renderDevcontainerSync as a, processTemplatesSync as i, createWorkspacePlaceholdersSync as n, sanitizeComposeFileSync as o, init_devcontainer_renderer as r, DEVCONTAINER_DIRNAME as t };
168
168
 
169
- //# sourceMappingURL=devcontainer-renderer-Cpz7XBj0.js.map
169
+ //# sourceMappingURL=devcontainer-renderer-DUJYYRQB.js.map
@@ -1238,4 +1238,4 @@ var require_dist = /* @__PURE__ */ __commonJSMin(((exports) => {
1238
1238
  //#endregion
1239
1239
  export { require_dist$1 as n, require_src as r, require_dist as t };
1240
1240
 
1241
- //# sourceMappingURL=dist-DypOkJv9.js.map
1241
+ //# sourceMappingURL=dist-BIC8spJ0.js.map
@@ -0,0 +1,3 @@
1
+ import { t as require_dist } from "./dist-BIC8spJ0.js";
2
+ export default require_dist();
3
+ export {};
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { r as init_devcontainer_renderer, t as DEVCONTAINER_DIRNAME } from "./devcontainer-renderer-Cpz7XBj0.js";
2
+ import { r as init_devcontainer_renderer, t as DEVCONTAINER_DIRNAME } from "./devcontainer-renderer-DUJYYRQB.js";
3
3
  import { existsSync, readFileSync } from "fs";
4
4
  import { join } from "path";
5
5
  import { exec } from "child_process";
@@ -156,4 +156,4 @@ var init_docker = __esmMin((() => {
156
156
  //#endregion
157
157
  export { teardownWorkspaceDockerByNamePromise as i, init_docker as n, stopWorkspaceDockerPromise as r, getContainersReferencingWorkspacePathPromise as t };
158
158
 
159
- //# sourceMappingURL=docker-DARVx0OZ.js.map
159
+ //# sourceMappingURL=docker-Q4bphryk.js.map
@@ -1,3 +1,3 @@
1
- import { n as ensureDevcontainerSync, r as init_ensure_devcontainer, t as ensureDevcontainer } from "./ensure-devcontainer-BJssuBG6.js";
1
+ import { n as ensureDevcontainerSync, r as init_ensure_devcontainer, t as ensureDevcontainer } from "./ensure-devcontainer-XLL0vtgV.js";
2
2
  init_ensure_devcontainer();
3
3
  export { ensureDevcontainer, ensureDevcontainerSync };
@@ -1,7 +1,7 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Dn as getProjectSync, Gn as resolveProjectFromIssueSync, Nn as init_projects } from "./config-yaml-DbdN9Fuq.js";
3
- import { a as renderDevcontainerSync, r as init_devcontainer_renderer } from "./devcontainer-renderer-Cpz7XBj0.js";
4
- import { a as stepSkipped, i as stepOk, n as init_types, r as stepFailed } from "./types-DoPMvws2.js";
2
+ import { Dn as getProjectSync, Gn as resolveProjectFromIssueSync, Nn as init_projects } from "./config-yaml-DPAieL_G.js";
3
+ import { a as renderDevcontainerSync, r as init_devcontainer_renderer } from "./devcontainer-renderer-DUJYYRQB.js";
4
+ import { a as stepSkipped, i as stepOk, n as init_types, r as stepFailed } from "./types-B5u3NxMl.js";
5
5
  import { Effect } from "effect";
6
6
  import { existsSync } from "fs";
7
7
  import { basename, join } from "path";
@@ -107,4 +107,4 @@ var init_ensure_devcontainer = __esmMin((() => {
107
107
  //#endregion
108
108
  export { ensureDevcontainerSync as n, init_ensure_devcontainer as r, ensureDevcontainer as t };
109
109
 
110
- //# sourceMappingURL=ensure-devcontainer-BJssuBG6.js.map
110
+ //# sourceMappingURL=ensure-devcontainer-XLL0vtgV.js.map
@@ -12,4 +12,4 @@ var init_esm_shims = __esmMin((() => {
12
12
  //#endregion
13
13
  export { __filename as n, init_esm_shims as r, __dirname as t };
14
14
 
15
- //# sourceMappingURL=esm-shims-Crmvo9Ln.js.map
15
+ //# sourceMappingURL=esm-shims-DiV9jHa_.js.map
@@ -1,3 +1,3 @@
1
- import { a as init_event_store, i as initEventStore, n as getEventStore, o as openEventDb, r as getSharedDb, t as createEventStore } from "./event-store-DrfTJZ1_.js";
1
+ import { a as init_event_store, i as initEventStore, n as getEventStore, o as openEventDb, r as getSharedDb, t as createEventStore } from "./event-store-DTJXZjCl.js";
2
2
  init_event_store();
3
3
  export { createEventStore, getEventStore, getSharedDb, initEventStore, openEventDb };
@@ -1,7 +1,7 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Br as getOverdeckHome, Vr as init_paths } from "./config-yaml-DbdN9Fuq.js";
3
- import { a as init_activity_logger, o as setActivityEventStoreProvider } from "./activity-logger-Dm95Ua07.js";
4
- import { A as init_paths$1, d as getOverdeckDatabaseSync, f as init_infra, k as getOverdeckDatabasePath } from "./infra-CCTzpcuJ.js";
2
+ import { Br as getOverdeckHome, Vr as init_paths } from "./config-yaml-DPAieL_G.js";
3
+ import { a as init_activity_logger, o as setActivityEventStoreProvider } from "./activity-logger-pcbf-e30.js";
4
+ import { A as init_paths$1, d as getOverdeckDatabaseSync, f as init_infra, k as getOverdeckDatabasePath } from "./infra-CpKlYZA9.js";
5
5
  import { existsSync } from "node:fs";
6
6
  import { EventEmitter } from "node:events";
7
7
  import { mkdir } from "node:fs/promises";
@@ -236,4 +236,4 @@ var init_event_store = __esmMin((() => {
236
236
  //#endregion
237
237
  export { init_event_store as a, initEventStore as i, getEventStore as n, openEventDb as o, getSharedDb as r, createEventStore as t };
238
238
 
239
- //# sourceMappingURL=event-store-DrfTJZ1_.js.map
239
+ //# sourceMappingURL=event-store-DTJXZjCl.js.map
@@ -0,0 +1,3 @@
1
+ import { i as init_events, o as readEventsSync } from "./events-DGWZzye2.js";
2
+ init_events();
3
+ export { readEventsSync };
@@ -1,6 +1,6 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { $n as extractPrefixSync, Ln as listProjectsSync, Nn as init_projects, er as init_issue_id, vr as init_errors } from "./config-yaml-DbdN9Fuq.js";
3
- import { d as init_cost_sync, f as insertCostEventSync } from "./cost-sync-CfXu-3TF.js";
2
+ import { $n as extractPrefixSync, Ln as listProjectsSync, Nn as init_projects, er as init_issue_id, vr as init_errors } from "./config-yaml-DPAieL_G.js";
3
+ import { d as init_cost_sync, f as insertCostEventSync } from "./cost-sync-8lkDeL9g.js";
4
4
  import "effect";
5
5
  import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "fs";
6
6
  import { join } from "path";
@@ -243,6 +243,6 @@ var init_events = __esmMin((() => {
243
243
  init_errors();
244
244
  }));
245
245
  //#endregion
246
- export { readEventsFromLineSync as a, init_wal as c, init_events as i, deduplicateEventsSync as n, readEventsSync as o, getLastEventMetadataSync as r, tailEventsSync as s, appendCostEventSync as t };
246
+ export { readEventsFromLineSync as a, tailEventsSync as c, init_events as i, init_wal as l, deduplicateEventsSync as n, readEventsSync as o, getLastEventMetadataSync as r, replaceEventsFileSync as s, appendCostEventSync as t };
247
247
 
248
- //# sourceMappingURL=events-BbClwoM-.js.map
248
+ //# sourceMappingURL=events-DGWZzye2.js.map
@@ -1,8 +1,8 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { f as loadConfigSync, fr as LinearApiError, t as init_config_yaml, ur as GitHubApiError, vr as init_errors } from "./config-yaml-DbdN9Fuq.js";
2
+ import { f as loadConfigSync, fr as LinearApiError, t as init_config_yaml, ur as GitHubApiError, vr as init_errors } from "./config-yaml-DPAieL_G.js";
3
3
  import { n as init_dist_src, t as Octokit } from "./dist-src-Byxt1ifL.js";
4
- import { a as TrackerAuthError, i as NotImplementedError, o as init_interface, r as IssueNotFoundError } from "./rally-api-DdY4ebu3.js";
5
- import { n as init_rally, t as RallyTracker } from "./rally-nalS21zz.js";
4
+ import { a as TrackerAuthError, i as NotImplementedError, o as init_interface, r as IssueNotFoundError } from "./rally-api-DgAt6FbN.js";
5
+ import { n as init_rally, t as RallyTracker } from "./rally-D0mKv2t8.js";
6
6
  import { Effect } from "effect";
7
7
  import { LinearClient } from "@linear/sdk";
8
8
  //#region ../../lib/tracker/linear.ts
@@ -679,4 +679,4 @@ var init_factory = __esmMin((() => {
679
679
  //#endregion
680
680
  export { createTrackerFromConfig as n, init_factory as r, createTracker as t };
681
681
 
682
- //# sourceMappingURL=factory-DVv9cpG5.js.map
682
+ //# sourceMappingURL=factory-rG4T40su.js.map
@@ -1,7 +1,7 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { t as init_config_yaml } from "./config-yaml-DbdN9Fuq.js";
3
- import { r as updateFeatureRegistryOwnership, t as init_feature_registry_storage } from "./feature-registry-storage-ByBosRId.js";
4
- import { t as init_providers } from "./providers-uPI9uU7Q.js";
2
+ import { t as init_config_yaml } from "./config-yaml-DPAieL_G.js";
3
+ import { r as updateFeatureRegistryOwnership, t as init_feature_registry_storage } from "./feature-registry-storage-CnGyNgAq.js";
4
+ import { t as init_providers } from "./providers-4-xOzHQu.js";
5
5
  import { Schema } from "effect";
6
6
  import { basename } from "node:path";
7
7
  //#region ../../lib/registry/feature-registry-population.ts
@@ -40,4 +40,4 @@ var init_feature_registry_population = __esmMin((() => {
40
40
  //#endregion
41
41
  export { recordFeatureRegistryLifecycle as n, init_feature_registry_population as t };
42
42
 
43
- //# sourceMappingURL=feature-registry-population-C6eVdq4J.js.map
43
+ //# sourceMappingURL=feature-registry-population-Dwyj9gEM.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Br as getOverdeckHome, Vr as init_paths } from "./config-yaml-DbdN9Fuq.js";
2
+ import { Br as getOverdeckHome, Vr as init_paths } from "./config-yaml-DPAieL_G.js";
3
3
  import { n as openDatabase, t as init_driver } from "./driver-D-HBOQa_.js";
4
4
  import { mkdirSync } from "node:fs";
5
5
  import { dirname, join } from "node:path";
@@ -263,4 +263,4 @@ var init_feature_registry_storage = __esmMin((() => {
263
263
  //#endregion
264
264
  export { listFeatureRegistryEntries as n, updateFeatureRegistryOwnership as r, init_feature_registry_storage as t };
265
265
 
266
- //# sourceMappingURL=feature-registry-storage-ByBosRId.js.map
266
+ //# sourceMappingURL=feature-registry-storage-CnGyNgAq.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { f as loadConfigSync, t as init_config_yaml } from "./config-yaml-DbdN9Fuq.js";
2
+ import { f as loadConfigSync, t as init_config_yaml } from "./config-yaml-DPAieL_G.js";
3
3
  //#region ../../lib/background-ai/features.ts
4
4
  /**
5
5
  * The single gate every background AI caller must consult before invoking a
@@ -18,4 +18,4 @@ var init_features = __esmMin((() => {
18
18
  //#endregion
19
19
  export { isBackgroundFeatureEnabled as n, init_features as t };
20
20
 
21
- //# sourceMappingURL=features-EZfSwuqq.js.map
21
+ //# sourceMappingURL=features-CYY2_Eeh.js.map
@@ -1,3 +1,3 @@
1
- import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-Dv4VnbQl.js";
1
+ import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-oE4-Esxl.js";
2
2
  init_feedback_target();
3
3
  export { resolveIssueFeedbackTarget, surfaceIssueFeedbackNeedsYou };
@@ -1,6 +1,6 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Dn as getProjectSync, Gn as resolveProjectFromIssueSync, Nn as init_projects, Nt as readIssueRecordSync, Ot as init_record, zt as writeIssueRecordSync } from "./config-yaml-DbdN9Fuq.js";
3
- import { L as sessionExists, O as listSessionNames, x as init_tmux } from "./tmux-CBYZ5lKF.js";
2
+ import { Dn as getProjectSync, Gn as resolveProjectFromIssueSync, Nn as init_projects, Nt as readIssueRecordSync, Ot as init_record, zt as writeIssueRecordSync } from "./config-yaml-DPAieL_G.js";
3
+ import { L as sessionExists, O as listSessionNames, x as init_tmux } from "./tmux-ePNhMIMU.js";
4
4
  import { Effect } from "effect";
5
5
  //#region ../../lib/cloister/feedback-target.ts
6
6
  async function isLiveSession(agentId) {
@@ -73,40 +73,71 @@ async function resolveIssueFeedbackTarget(issueId, opts = {}) {
73
73
  return { agentId: fallback.agentId };
74
74
  }
75
75
  }
76
- if (await (opts.revivePipelinePausedAgent ?? revivePipelinePausedAgent)(wholeIssueAgentId, normalizedIssue)) return { agentId: wholeIssueAgentId };
76
+ const revive = opts.revivePipelinePausedAgent ?? resurrectAgentForFeedback;
77
+ const candidates = [wholeIssueAgentId];
78
+ if (requestedItemId) {
79
+ const assigned = assignments.find((a) => a.itemId === requestedItemId);
80
+ if (assigned) candidates.push(slotAgentId(normalizedIssue, assigned.slotIndex, assigned.agentId));
81
+ }
82
+ for (const assignment of assignments) candidates.push(slotAgentId(normalizedIssue, assignment.slotIndex, assignment.agentId));
83
+ const attempted = /* @__PURE__ */ new Set();
84
+ for (const candidate of candidates) {
85
+ if (attempted.has(candidate)) continue;
86
+ attempted.add(candidate);
87
+ if (await revive(candidate, normalizedIssue)) return { agentId: candidate };
88
+ }
77
89
  return {
78
90
  needsYou: true,
79
- reason: `No live feedback target for ${normalizedIssue}${requestedItemId ? ` for item ${requestedItemId}` : ""}: ${wholeIssueAgentId} is not running and no assigned swarm slot has a live tmux session.`
91
+ reason: `No live feedback target for ${normalizedIssue}${requestedItemId ? ` for item ${requestedItemId}` : ""}: ${wholeIssueAgentId} is not running, no assigned swarm slot has a live tmux session, and resurrection of ${attempted.size} candidate agent(s) failed.`
80
92
  };
81
93
  }
82
94
  /**
83
- * PAN-2461: unpause + resume an agent that the PIPELINE paused (pausedReason
84
- * starts with "needs-you:") so feedback can be delivered to it. Returns true
85
- * when the agent is live again. Operator pauses are left untouched.
95
+ * PAN-2209 + PAN-2461: bring a non-running agent back to life so feedback can be
96
+ * delivered to it. Returns true when the agent is live again. Gate handling:
97
+ *
98
+ * - Pipeline pauses (`needs-you:*`, `[governor-slot]*`, scheduler yields) → unpause +
99
+ * resume. A gate the pipeline set must never deadlock the pipeline's own delivery
100
+ * (PAN-2461); the operator explicitly prefers briefly exceeding memory targets over
101
+ * undelivered work↔review feedback.
102
+ * - Troubled / failure-backoff → clear the gate loudly and attempt ONE resume. The
103
+ * failure-tracking machinery re-trips the gate if the agent crashes again, so this
104
+ * cannot loop unboundedly.
105
+ * - Plain stopped/completed/crashed → resume.
106
+ * - OPERATOR pauses (pan pause, any non-pipeline pausedReason) are never overridden.
86
107
  */
87
- async function revivePipelinePausedAgent(agentId, issueId) {
108
+ async function resurrectAgentForFeedback(agentId, issueId) {
88
109
  try {
89
- const { getAgentStateSync, clearAgentPausedSync } = await import("./agent-state-DTZCqWx5.js");
110
+ const { getAgentStateSync, clearAgentPausedSync, clearAgentTroubledSync } = await import("./agent-state-xk_G8t90.js");
90
111
  const state = getAgentStateSync(agentId);
91
112
  if (!state) return false;
92
- if (state.paused !== true || !state.pausedReason?.startsWith("needs-you:")) return false;
93
- console.log(`[feedback-target] ${agentId} is pipeline-paused (${state.pausedReason}) — unpausing to deliver feedback for ${issueId}`);
94
- clearAgentPausedSync(agentId);
95
- const { resumeAgent } = await import("./resume-Pur3Z2e8.js");
113
+ if (state.paused === true) {
114
+ const reason = state.pausedReason ?? "";
115
+ if (!(reason.startsWith("needs-you:") || reason.startsWith("[governor-slot]") || state.yieldedByScheduler === true)) {
116
+ console.log(`[feedback-target] ${agentId} is operator-paused (${reason || "no reason"}) — not overriding to deliver ${issueId} feedback`);
117
+ return false;
118
+ }
119
+ console.log(`[feedback-target] ${agentId} is pipeline-paused (${reason || "scheduler yield"}) — unpausing to deliver feedback for ${issueId}`);
120
+ clearAgentPausedSync(agentId);
121
+ }
122
+ if (state.troubled === true || (state.consecutiveFailures ?? 0) > 0) {
123
+ console.warn(`[feedback-target] ${agentId} is gated (troubled=${state.troubled === true}, failures=${state.consecutiveFailures ?? 0}) — clearing for one resurrection attempt to deliver ${issueId} feedback; failure tracking re-trips the gate on another crash`);
124
+ clearAgentTroubledSync(agentId);
125
+ }
126
+ const { resumeAgent } = await import("./resume-DnIsmIgC.js");
96
127
  const result = await resumeAgent(agentId);
97
128
  if (!result.success) {
98
- console.warn(`[feedback-target] Failed to revive ${agentId}: ${result.error}`);
129
+ console.warn(`[feedback-target] Failed to resurrect ${agentId} for ${issueId} feedback: ${result.error}`);
99
130
  return false;
100
131
  }
101
132
  return isLiveSession(agentId);
102
133
  } catch (err) {
103
- console.warn(`[feedback-target] revivePipelinePausedAgent(${agentId}) failed: ${err instanceof Error ? err.message : String(err)}`);
134
+ console.warn(`[feedback-target] resurrectAgentForFeedback(${agentId}) failed: ${err instanceof Error ? err.message : String(err)}`);
104
135
  return false;
105
136
  }
106
137
  }
107
138
  async function surfaceIssueFeedbackNeedsYou(issueId, reason, details = {}) {
108
139
  try {
109
- const { markWorkspaceStuck } = await import("./review-status-mo3tyc8L.js");
140
+ const { markWorkspaceStuck } = await import("./review-status-bBkqUj5i.js");
110
141
  markWorkspaceStuck(issueId, "feedback_delivery_needs_you", {
111
142
  reason,
112
143
  ...details
@@ -124,4 +155,4 @@ var init_feedback_target = __esmMin((() => {
124
155
  //#endregion
125
156
  export { resolveIssueFeedbackTarget as n, surfaceIssueFeedbackNeedsYou as r, init_feedback_target as t };
126
157
 
127
- //# sourceMappingURL=feedback-target-Dv4VnbQl.js.map
158
+ //# sourceMappingURL=feedback-target-oE4-Esxl.js.map
@@ -1,7 +1,7 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Gn as resolveProjectFromIssueSync, Nn as init_projects } from "./config-yaml-DbdN9Fuq.js";
3
- import { a as clearFeedback, o as readFeedback, s as writeFeedback, t as init_pan_dir, u as getWorkspacePanPaths } from "./pan-dir-Cn3NUnxU.js";
4
- import { a as init_lifecycle_io, n as appendFeedbackEntryForIssue, o as readContinueStateForIssue, r as clearFeedbackForIssue, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-WDGwa1vV.js";
2
+ import { Gn as resolveProjectFromIssueSync, Nn as init_projects } from "./config-yaml-DPAieL_G.js";
3
+ import { a as clearFeedback, o as readFeedback, s as writeFeedback, t as init_pan_dir, u as getWorkspacePanPaths } from "./pan-dir-BgBeeZDX.js";
4
+ import { a as init_lifecycle_io, n as appendFeedbackEntryForIssue, o as readContinueStateForIssue, r as clearFeedbackForIssue, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-DSrv9xGh.js";
5
5
  import { Data, Effect } from "effect";
6
6
  import { existsSync } from "fs";
7
7
  import { join } from "path";
@@ -148,4 +148,4 @@ var init_feedback_writer = __esmMin((() => {
148
148
  //#endregion
149
149
  export { writeFeedbackFile as a, init_feedback_writer as i, archiveFeedbackFiles as n, clearFeedbackFiles as r, FeedbackWriteError as t };
150
150
 
151
- //# sourceMappingURL=feedback-writer-Dxg8qM8i.js.map
151
+ //# sourceMappingURL=feedback-writer-DMaO0XXa.js.map
@@ -1,3 +1,3 @@
1
- import { a as writeFeedbackFile, i as init_feedback_writer, n as archiveFeedbackFiles, r as clearFeedbackFiles, t as FeedbackWriteError } from "./feedback-writer-Dxg8qM8i.js";
1
+ import { a as writeFeedbackFile, i as init_feedback_writer, n as archiveFeedbackFiles, r as clearFeedbackFiles, t as FeedbackWriteError } from "./feedback-writer-DMaO0XXa.js";
2
2
  init_feedback_writer();
3
3
  export { FeedbackWriteError, archiveFeedbackFiles, clearFeedbackFiles, writeFeedbackFile };
@@ -1,2 +1,2 @@
1
- import { a as pauseFlywheel, o as resumeFlywheel } from "./flywheel-B4KN9BmW.js";
1
+ import { a as pauseFlywheel, o as resumeFlywheel } from "./flywheel-ClMjGW_u.js";
2
2
  export { pauseFlywheel, resumeFlywheel };