@overdeck/desktop 0.46.0 → 0.47.0

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 (387) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +4 -1
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-CCwFGICj.js → acceptance-criteria-10Ur5Dne.js} +2 -2
  4. package/server/{advancing-selfheal-De1L-Sb4.js → advancing-selfheal-BNwqxseD.js} +6 -6
  5. package/server/{agent-gc-CBULruzm.js → agent-gc-C3h9Or3a.js} +5 -5
  6. package/server/{agent-state-VQk8fY9F.js → agent-state-CYXJVG72.js} +1 -1
  7. package/server/agent-state-service-C63p_ftq.js +2 -0
  8. package/server/{agent-state-service-BlnSkRFA.js → agent-state-service-Ds6OeFvo.js} +15 -9
  9. package/server/{agents-C5rWYhb6.js → agents-J5mEnekq.js} +23 -16
  10. package/server/{agents-BKKkxKgK.js → agents-ePFVoZbu.js} +1 -1
  11. package/server/archive-planning-B2XplFzT.js +2 -0
  12. package/server/{archive-planning-C0lAbNB_.js → archive-planning-BwhxeP7C.js} +10 -6
  13. package/server/{artifact-index-jobs-ug6ZxIP5.js → artifact-index-jobs-D1q_vR3V.js} +2 -2
  14. package/server/{assemble-DnffNpOo.js → assemble-Bgwqv-Ro.js} +2 -2
  15. package/server/{tmux-dedup-DbN6MGzM.js → auto-spawn-consent-CQ9Bi9q6.js} +262 -13
  16. package/server/{backlog-auto-trigger-Dh-i9PQf.js → backlog-auto-trigger-n1lzPgN4.js} +3 -3
  17. package/server/{behavior-CfIg6pKp.js → behavior-td6-xhQk.js} +2 -2
  18. package/server/boot-reconciled-stop-events-C7gGe3oB.js +44 -0
  19. package/server/{bridge-pool-patrol-CUFmjVDN.js → bridge-pool-patrol-CYH2OLb5.js} +1 -1
  20. package/server/{briefing-freshness-DHmCSLar.js → briefing-freshness-DRqZ8lAz.js} +2 -2
  21. package/server/{build-info-CuFfxZxp.js → build-info-7yiEpl6u.js} +3 -3
  22. package/server/{build-info-BP160gU7.js → build-info-CpG__c63.js} +1 -1
  23. package/server/{checkpoint-manager-Dxh0FYsv.js → checkpoint-manager-CkKmB0wZ.js} +1 -1
  24. package/server/{checkpoint-manager-DEWD82qK.js → checkpoint-manager-DBcyNR8w.js} +2 -2
  25. package/server/checkpoint-worker.js +1 -1
  26. package/server/{checkpoints-CZvbtLnr.js → checkpoints-D95apurL.js} +2 -2
  27. package/server/{checkpoints-DMTgXuLG.js → checkpoints-Wm963lm8.js} +1 -1
  28. package/server/{claude-hooks-provision-CN-xo-do.js → claude-hooks-provision-4RPxNkE8.js} +1 -1
  29. package/server/{claude-hooks-provision-fvy4RD2b.js → claude-hooks-provision-Bjitl9aI.js} +2 -2
  30. package/server/{claude-permissions-CN0cSCPp.js → claude-permissions-CpbpvUQ2.js} +2 -2
  31. package/server/{claude-settings-overlay-Dabi9slj.js → claude-settings-overlay-BzkHYDwR.js} +1 -1
  32. package/server/{claude-settings-overlay-CJn35FHQ.js → claude-settings-overlay-_H9Yrzab.js} +2 -2
  33. package/server/cli-CjOCSnfj.js +3 -0
  34. package/server/{cli-oCWYA1pE.js → cli-Cte9ZFGn.js} +9 -9
  35. package/server/{cliproxy-C8mB3KuB.js → cliproxy-C5fMJ7rY.js} +2 -2
  36. package/server/{cliproxy-PGwTX_o8.js → cliproxy-DaAbWMjC.js} +1 -1
  37. package/server/{close-issue-D5MF5GqF.js → close-issue-BPh1ARCF.js} +5 -5
  38. package/server/{closed-issue-reaper-CJ24u0Zt.js → closed-issue-reaper-DHRfRMrp.js} +1 -1
  39. package/server/{closed-issue-reaper-Cltx86x5.js → closed-issue-reaper-DoOZqGFK.js} +62 -12
  40. package/server/{codex-Drlf5Xhf.js → codex-BzGDW_d3.js} +6 -6
  41. package/server/{codex-BdEsUFWh.js → codex-o8FJwzmy.js} +1 -1
  42. package/server/{codex-parser-DpB89Vqa.js → codex-parser-Dt-ycU8L.js} +2 -2
  43. package/server/{compaction-continuation-K2AxQX4H.js → compaction-continuation-CvXpbZ4w.js} +3 -3
  44. package/server/{config-B2IMcBxx.js → config-Bi3u1VK7.js} +2 -2
  45. package/server/{config-Dr3pW6w6.js → config-BvLe652W.js} +2 -2
  46. package/server/{config-DV-grfQc.js → config-CL3Gyvja.js} +1 -1
  47. package/server/{config-yaml-CmOPzmBb.js → config-yaml-CxdwhAIA.js} +10 -2
  48. package/server/conflict-gate-CX80JYYS.js +3 -0
  49. package/server/{conflict-gate-B9cN3SBi.js → conflict-gate-E4nt7ZeS.js} +59 -13
  50. package/server/{context-layers-dR5YxHYB.js → context-layers-C_IIysnm.js} +3 -3
  51. package/server/{context-layers-D6LZo3l1.js → context-layers-DAG83UZt.js} +2 -2
  52. package/server/{control-settings-C7DUehE1.js → control-settings-CiqGxXnc.js} +13 -6
  53. package/server/{conversation-compaction-Dj4FAKoZ.js → conversation-compaction-BE3CNtHF.js} +1 -1
  54. package/server/{conversation-compaction-BoqdDXWF.js → conversation-compaction-D6-yLtqt.js} +8 -8
  55. package/server/{conversation-service-5aCnq1zR.js → conversation-service-DBxoYMDl.js} +8 -7
  56. package/server/{conversation-service-BCxl4f8Z.js → conversation-service-D_TS2b1r.js} +1 -1
  57. package/server/{conversations-C34dyIb9.js → conversations-BKDVpB-3.js} +1 -1
  58. package/server/{conversations-BUpYsOZg.js → conversations-D0UEdLtk.js} +4 -4
  59. package/server/{cost-CvxRrucd.js → cost-DS1s0DbG.js} +3 -3
  60. package/server/{cost-Bgcub5kW.js → cost-DpgYmYqR.js} +2 -2
  61. package/server/{cost-sync-Dv3LUaNW.js → cost-sync-tOCCGnEt.js} +3 -3
  62. package/server/{dag-ombYYt4s.js → dag-BtkgLeqY.js} +2 -2
  63. package/server/{dangerous-git-ops-BcJPC5Rr.js → dangerous-git-ops-CFLykHWt.js} +1 -1
  64. package/server/dashboard-db-worker.js +7 -7
  65. package/server/{deacon-DrXqT9LQ.js → deacon-BIblC-WX.js} +3 -3
  66. package/server/{deacon-nudge-log-BNBebzeL.js → deacon-nudge-log-B08gF0mh.js} +3 -3
  67. package/server/{deacon-hi9KLPLT.js → deacon-pLRLbPvR.js} +548 -176
  68. package/server/{deacon-pending-lifecycle-Cpk0k7Hi.js → deacon-pending-lifecycle-B-Io84AP.js} +3 -3
  69. package/server/deacon-swarm-B1XkIvfr.js +2 -0
  70. package/server/{deacon-swarm-DBxUaO-A.js → deacon-swarm-v5PMun-m.js} +15 -14
  71. package/server/deacon.js +8 -8
  72. package/server/{dead-end-trip-CQcP70ND.js → dead-end-trip-D8A3msX9.js} +3 -3
  73. package/server/{delivery-Da0zEMY4.js → delivery-BX9HR4wQ.js} +1 -1
  74. package/server/{deploy-patrol-Df-Tmaq0.js → deploy-patrol-sYgOxLeb.js} +8 -8
  75. package/server/{deploy-queue-UjKGYsDe.js → deploy-queue-VfohaPN_.js} +2 -2
  76. package/server/{deploy-queue-9SrhZR63.js → deploy-queue-gHJBycaF.js} +1 -1
  77. package/server/{deploy-window-jOiPRHL0.js → deploy-window-CFRZ0-kt.js} +1 -1
  78. package/server/{deploy-window-rpqpWqHA.js → deploy-window-D4DQb8VP.js} +6 -6
  79. package/server/{dev-supervisor-CC46Ig8q.js → dev-supervisor-DiOBDM1c.js} +2 -2
  80. package/server/{devcontainer-renderer-68CSCRnu.js → devcontainer-renderer-BUOIlfgD.js} +3 -3
  81. package/server/dist-B3YPQa5A.js +3 -0
  82. package/server/{dist-CJy72uEg.js → dist-C3A8B8wM.js} +1 -1
  83. package/server/{dist-src-Bik83hFi.js → dist-src-C0adpegX.js} +1 -1
  84. package/server/{docker-Dam7mbIB.js → docker-BJzlkqYB.js} +2 -2
  85. package/server/{docker-BMVTSFL5.js → docker-Y3PElJb0.js} +1 -1
  86. package/server/{dod-Dar-yheg.js → dod-DlNtcH6n.js} +26 -5
  87. package/server/{durable-review-pipeline-CGZ5QBxh.js → durable-review-pipeline-Cibps-Rg.js} +5 -2
  88. package/server/durable-review-pipeline-DP6bIcOY.js +3 -0
  89. package/server/{ensure-devcontainer-B057YA81.js → ensure-devcontainer-BAofzBPv.js} +4 -4
  90. package/server/{ensure-devcontainer-C98V8yW-.js → ensure-devcontainer-DMAbWqtQ.js} +1 -1
  91. package/server/{esm-shims-Br9BPdkR.js → esm-shims-BeObUkaw.js} +1 -1
  92. package/server/{event-store-ELqkVOn0.js → event-store-5UKzh9Jf.js} +1 -1
  93. package/server/{event-store-zY5MJHgF.js → event-store-CrHcVC5_.js} +3 -3
  94. package/server/{events-D9PR1IC0.js → events-BNrvchBg.js} +3 -3
  95. package/server/{events-D6pyqhzM.js → events-CF8QDbuV.js} +1 -1
  96. package/server/{factory-CRoOpGsF.js → factory-Cmm9Hsho.js} +5 -5
  97. package/server/{feature-registry-population--YUXU999.js → feature-registry-population-B6HpNWRy.js} +4 -4
  98. package/server/{feature-registry-storage-BORBTo0y.js → feature-registry-storage-DJEFx1Pf.js} +2 -2
  99. package/server/{features--nFkJY8v.js → features-D5km80UI.js} +2 -2
  100. package/server/{feedback-target-C0ZzyHvU.js → feedback-target-BJ5ZADsu.js} +1 -1
  101. package/server/{feedback-target-Dt9BsapX.js → feedback-target-DSxEL6lP.js} +7 -7
  102. package/server/{feedback-writer-BG0RUZiu.js → feedback-writer-C27Hak8a.js} +5 -5
  103. package/server/{feedback-writer-D1fm-5Z8.js → feedback-writer-CoB9Z6aU.js} +1 -1
  104. package/server/{flywheel-BiT3odRb.js → flywheel-BHx8XuMr.js} +38 -19
  105. package/server/{flywheel-BekukH4i.js → flywheel-DZZdtiOL.js} +1 -1
  106. package/server/{flywheel-CLVB55Be.js → flywheel-f662Q-y2.js} +14 -14
  107. package/server/{flywheel-merge-order-BJv1DZz1.js → flywheel-merge-order-D_xLMbJU.js} +7 -7
  108. package/server/{flywheel-merge-order-BKw9o6ku.js → flywheel-merge-order-Dil0LmdN.js} +1 -1
  109. package/server/forge-B5o319qI.js +3 -0
  110. package/server/{forge-CZbSg6Ds.js → forge-BaKGCya6.js} +2 -2
  111. package/server/{from-D_4_dk7i.js → from-B3tZbB55.js} +1 -1
  112. package/server/fs-lock-Bre3sGoz.js +130 -0
  113. package/server/{fts-db-BeOomFa-.js → fts-db-IVc4_M3f.js} +2 -2
  114. package/server/{fts-operations-BdewJ_g9.js → fts-operations-B9jG8wa3.js} +2 -2
  115. package/server/{git-utils-ameCgDdy.js → git-utils-CsvYfJU3.js} +4 -4
  116. package/server/{git-utils-CI6cwyyC.js → git-utils-Xg4PFN45.js} +1 -1
  117. package/server/{github-app-DtAsvwzK.js → github-app-Bmg4R9mv.js} +1 -1
  118. package/server/{github-app-CQ1Lo6LA.js → github-app-CmNk0zLU.js} +2 -2
  119. package/server/{github-client-Cj0yl_07.js → github-client-B6KM9_wA.js} +1 -1
  120. package/server/{github-client-BfyDxuRN.js → github-client-qazkPrg0.js} +3 -3
  121. package/server/{github-pr-lookup-BDq6Wznz.js → github-pr-lookup-DAcVeRLK.js} +2 -2
  122. package/server/{harness-binary-DqkftwTb.js → harness-binary-BSpiXaLw.js} +2 -2
  123. package/server/{harness-resolve-CqMqM1Mb.js → harness-resolve-BAJu5MX8.js} +4 -4
  124. package/server/{health-events-_xfTaOUs.js → health-events-2Z6Wa9SM.js} +1 -1
  125. package/server/{health-events-CazRxJUS.js → health-events-BwX32k8d.js} +2 -2
  126. package/server/{hooks-BnJsxlSq.js → hooks-D1g1jKLI.js} +1 -1
  127. package/server/{hooks-BO3QT1sn.js → hooks-DbtbimEf.js} +2 -2
  128. package/server/{hume-CDYJxqx-.js → hume-DXNiu6nQ.js} +2 -2
  129. package/server/hume-VUCNbTgn.js +3 -0
  130. package/server/{idle-stack-reaper-BYqERdkE.js → idle-stack-reaper-CRA1e0jr.js} +1 -1
  131. package/server/{idle-stack-reaper-CnGx_PO_.js → idle-stack-reaper-Cy-dQzW4.js} +2 -2
  132. package/server/{in-flight-guard-Bq3epG58.js → in-flight-guard-D-sSkADM.js} +1 -1
  133. package/server/{infra-BjuxvjdS.js → infra-BDQDRopn.js} +15 -4
  134. package/server/{injection-UCf8EsjX.js → injection-6AGnXxlj.js} +7 -7
  135. package/server/{injection-DZxlV2al.js → injection-Bl8d_jHZ.js} +1 -1
  136. package/server/inspect-agent-CUwVmr2h.js +2 -0
  137. package/server/{inspect-agent-6kylZnrm.js → inspect-agent-nXdIptyh.js} +12 -12
  138. package/server/{internal-token-DvMTQSOS.js → internal-token-DzK385vD.js} +2 -2
  139. package/server/{internal-token-M9omeXM1.js → internal-token-Ias7N8Kg.js} +1 -1
  140. package/server/{io-VHvc0Ssp.js → io-B00PBNku.js} +4 -4
  141. package/server/{issue-closed-B6KJkmHZ.js → issue-closed-BehTG1be.js} +8 -8
  142. package/server/{issue-lifecycle-C4Zj0WmE.js → issue-lifecycle-Birk-ifu.js} +29 -23
  143. package/server/{issue-lifecycle-9gk3fnXN.js → issue-lifecycle-BqSuQvbn.js} +1 -1
  144. package/server/{issue-service-singleton-PMx8F1jr.js → issue-service-singleton-B2wXiIlw.js} +1 -1
  145. package/server/{issue-service-singleton-DmCh7EHj.js → issue-service-singleton-C6ZduvuY.js} +10 -10
  146. package/server/{issues-CgnQ1OGQ.js → issues-DQ5-LatB.js} +2 -2
  147. package/server/{jsonl-parser-DJOH_O-w.js → jsonl-parser-BDpnGFCl.js} +3 -3
  148. package/server/{label-cleanup-Dv7AV_R1.js → label-cleanup-Dwnky8FG.js} +3 -3
  149. package/server/{lifecycle-DDN8ApVY.js → lifecycle-B3s4sM1G.js} +6 -6
  150. package/server/{lifecycle-CTdOWYMi.js → lifecycle-B4Xdb4cY.js} +2 -2
  151. package/server/{lifecycle-io-D_zTLvP1.js → lifecycle-io-CzTHEooc.js} +1 -1
  152. package/server/{lifecycle-io-D-lGdzK3.js → lifecycle-io-DCo6s6ks.js} +5 -5
  153. package/server/{linear-client-BQU36QqE.js → linear-client-9uq7fhiV.js} +3 -3
  154. package/server/{linear-client-CY4O_Tu3.js → linear-client-CnbtHiic.js} +1 -1
  155. package/server/{linear-mcp-auth-BnU4TYfY.js → linear-mcp-auth-BxUOzswy.js} +5 -5
  156. package/server/{linear-mcp-auth-NYBq_oHZ.js → linear-mcp-auth-D46fBCLf.js} +1 -1
  157. package/server/memory-fts-worker.js +1 -1
  158. package/server/{merge-Bpx4jjht.js → merge-DiW9RdSB.js} +3 -3
  159. package/server/{merge-agent-DdMVSV2Y.js → merge-agent-BLUgRsz3.js} +31 -31
  160. package/server/{merge-agent-DrXa1CpW.js → merge-agent-DQTXZk8z.js} +1 -1
  161. package/server/{merge-batch-C5q1c1GX.js → merge-batch-Cp_j9BGk.js} +1 -1
  162. package/server/{merge-completeness-BMm8tMyZ.js → merge-completeness-B46KqhtY.js} +4 -4
  163. package/server/{merge-completeness-D0ljXbk3.js → merge-completeness-BLbB5-6n.js} +1 -1
  164. package/server/merge-ops-1abz6O_P.js +2 -0
  165. package/server/merge-rebase-CJJVAJuz.js +2 -0
  166. package/server/{merge-rebase-xLnMlw5h.js → merge-rebase-DIkBjgwq.js} +2 -2
  167. package/server/{merge-set-DH7ot3yz.js → merge-set-CBgHfwM0.js} +4 -4
  168. package/server/{merge-set-DzsOTBg5.js → merge-set-DeUxFsC3.js} +1 -1
  169. package/server/{merge-idOG--29.js → merge-sr8Nrnmi.js} +1 -1
  170. package/server/merge-sync-CpGmk6Ch.js +3 -0
  171. package/server/{merge-sync-CQ-LgZ1_.js → merge-sync-kr4vqyjM.js} +7 -4
  172. package/server/{merge-train-DTEMyIu4.js → merge-train-Dmrcus12.js} +4 -4
  173. package/server/{merge-train-deps-CNPJzepw.js → merge-train-deps-D_uGX91G.js} +21 -15
  174. package/server/{merge-verification-x3JO8Dtz.js → merge-verification-NvaAd8CZ.js} +6 -6
  175. package/server/{merged-docker-cleanup-worker-Cdi9apm-.js → merged-docker-cleanup-worker-DH_hrGPI.js} +1 -1
  176. package/server/{merged-docker-cleanup-worker-CTpC27Bs.js → merged-docker-cleanup-worker-Y1R06TEl.js} +3 -3
  177. package/server/{multipart-parser-IMSBfePV.js → multipart-parser-R-oC8dQg.js} +2 -2
  178. package/server/{no-resume-mode-C5ULAXwO.js → no-resume-mode-BgD0JUmM.js} +1 -1
  179. package/server/node_modules/.package-lock.json +4 -4
  180. package/server/node_modules/@types/node/README.md +1 -1
  181. package/server/node_modules/@types/node/crypto.d.ts +1 -1
  182. package/server/node_modules/@types/node/package.json +2 -2
  183. package/server/{orphan-proposed-reconciler-Dg6U4ADZ.js → orphan-proposed-reconciler-B6vJHxtX.js} +230 -31
  184. package/server/{orphan-proposed-reconciler-CWmOdM9-.js → orphan-proposed-reconciler-DcgTPPFY.js} +1 -1
  185. package/server/package-lock.json +5 -5
  186. package/server/package.json +1 -1
  187. package/server/{pan-dir-ubraCiUg.js → pan-dir-DMzF5wne.js} +4 -4
  188. package/server/{paths-cXmOwSbh.js → paths-sJBSb7Ul.js} +2 -2
  189. package/server/{pending-lifecycle-claim-DEteYdS9.js → pending-lifecycle-claim-DilzGfgk.js} +2 -2
  190. package/server/persistent-logger-H_VjuOu7.js +57 -0
  191. package/server/{pickup-D8xtG1J2.js → pickup-DWhqzliO.js} +4 -3
  192. package/server/{pipeline-membership-BGSvkT2M.js → pipeline-membership-C88VBnhJ.js} +1 -1
  193. package/server/{pipeline-membership-CrAPLYtf.js → pipeline-membership-D9SBvItj.js} +1 -1
  194. package/server/{pipeline-membership-gather-DTfcgxLl.js → pipeline-membership-gather-4eR-7Tqy.js} +1 -1
  195. package/server/{pipeline-membership-gather-CET40frr.js → pipeline-membership-gather-CeVGnNJ2.js} +114 -9
  196. package/server/{pipeline-notifier-BuQ0e4hF.js → pipeline-notifier-D0ALV6Nw.js} +2 -2
  197. package/server/{pipeline-notifier-ImNXknf0.js → pipeline-notifier-DT6xLFao.js} +1 -1
  198. package/server/{post-merge-lifecycle-worker-DbO10pum.js → post-merge-lifecycle-worker-8HIeS_J6.js} +3 -3
  199. package/server/{project-pipelines-Bim6bThI.js → project-pipelines-9SKt2bEc.js} +2 -2
  200. package/server/{project-repos-C0nuoBGv.js → project-repos-B5pIphKg.js} +2 -2
  201. package/server/{project-repos-CRE6Ykow.js → project-repos-DPjOdfPa.js} +1 -1
  202. package/server/{projects-B03Wr-xc.js → projects-_n3Zui6K.js} +1 -1
  203. package/server/{prompts-BEx08AIu.js → prompts-CgzMBvQF.js} +2 -2
  204. package/server/{providers-D7IluJe0.js → providers-BI1mOBQ4.js} +1 -1
  205. package/server/{providers-evXhiQeg.js → providers-BJQSnAAp.js} +7 -7
  206. package/server/public/assets/{chunk-BO2N2NFS-D1s4-Sqp.js → chunk-BO2N2NFS-D_pGACYN.js} +4 -4
  207. package/server/public/assets/{diagram-OG6HWLK6-1gdMoSF7.js → diagram-OG6HWLK6-BO6fe3hH.js} +1 -1
  208. package/server/public/assets/{dist-DqDRYW6P.js → dist-5zingMiA.js} +3 -3
  209. package/server/public/assets/{dist-CxAOHbil.js → dist-CVxhbI2E.js} +1 -1
  210. package/server/public/assets/{ganttDiagram-6RSMTGT7-BYex-Ec7.js → ganttDiagram-6RSMTGT7-Bgj4A7kp.js} +1 -1
  211. package/server/public/assets/{highlighted-body-OFNGDK62-DlVkiG0S.js → highlighted-body-OFNGDK62-DNPK7_cm.js} +1 -1
  212. package/server/public/assets/{index-K0hAYCgV.js → index-DEpY-D1O.js} +148 -148
  213. package/server/public/assets/index-Ddkcz3WT.css +1 -0
  214. package/server/public/assets/{linear-B4cuEFmO.js → linear-BB0jQT16.js} +1 -1
  215. package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +1 -0
  216. package/server/public/assets/{pieDiagram-4H26LBE5-CBHNBIJQ.js → pieDiagram-4H26LBE5-DeGIzzpZ.js} +1 -1
  217. package/server/public/assets/{prod-CN2nHBvX.js → prod-XBLvikex.js} +4 -4
  218. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bom87VOQ.js → quadrantDiagram-W4KKPZXB-BV9SLeWz.js} +1 -1
  219. package/server/public/assets/{sankeyDiagram-5OEKKPKP-UrBeyLxk.js → sankeyDiagram-5OEKKPKP-Dwja0gj8.js} +1 -1
  220. package/server/public/assets/{xychartDiagram-2RQKCTM6-DhkbrIxR.js → xychartDiagram-2RQKCTM6-DCB4qvfw.js} +1 -1
  221. package/server/public/index.html +2 -2
  222. package/server/{pull-requests-DHWiKxo7.js → pull-requests-7BgLDsIo.js} +3 -3
  223. package/server/{pull-requests-Cv7LxzUN.js → pull-requests-Dq0y6IxE.js} +1 -1
  224. package/server/{queries-DHJm7bTd.js → queries-C-MUZaIy.js} +266 -155
  225. package/server/{rally-B71M9f4o.js → rally-CPysR4T_.js} +3 -3
  226. package/server/rally-D_VW4bJv.js +3 -0
  227. package/server/{rally-api-Dkqmok65.js → rally-api-8Ptlp2os.js} +2 -2
  228. package/server/{rally-api-D5uXN08-.js → rally-api-CgosKdKL.js} +1 -1
  229. package/server/{rally-client-CxsA6ExK.js → rally-client-CCX0hADj.js} +1 -1
  230. package/server/{rally-client-Bfqm6XI4.js → rally-client-iYMHWQD7.js} +5 -5
  231. package/server/{reap-terminal-sessions-BQ23nriz.js → reap-terminal-sessions-4Xg9NGA8.js} +2 -2
  232. package/server/{reap-terminal-sessions-CvmwaqKv.js → reap-terminal-sessions-Qf-9LVQc.js} +2 -2
  233. package/server/{rebuild-stack-0EEYReVZ.js → rebuild-stack-CMdgaylx.js} +7 -7
  234. package/server/{rebuild-stack-qeRqHZxH.js → rebuild-stack-DqcOVmJO.js} +2 -2
  235. package/server/{reconstruct-cache-BbYFsqLa.js → reconstruct-cache-CMZJ_Vjq.js} +9 -8
  236. package/server/{record-CtroO946.js → record-BTwWhtBb.js} +1 -1
  237. package/server/{record-update-Z0QCxmMp.js → record-update-DaOKS7Wb.js} +5 -128
  238. package/server/{record-update-DH6dLJID.js → record-update-DhI7eySG.js} +1 -1
  239. package/server/{recovery-trip-eJe26h-f.js → recovery-trip-DDH-02ng.js} +2 -2
  240. package/server/{release-engine-lPUp-MTd.js → release-engine-B2X9AfFC.js} +5 -5
  241. package/server/{release-set-BwGeyZKX.js → release-set-G4XKyQ8K.js} +3 -3
  242. package/server/{remote-BCd02Es1.js → remote-BXarMvqf.js} +3 -3
  243. package/server/{remote-CVGUhXMV.js → remote-CUhyqjXk.js} +3 -3
  244. package/server/{remote-agents-C_VxssLU.js → remote-agents-Bba-MgSA.js} +17 -8
  245. package/server/{remote-agents-C1bssi41.js → remote-agents-CLZB3Coc.js} +1 -1
  246. package/server/{remote-completion-DAB0P706.js → remote-completion-CwAp79EC.js} +13 -13
  247. package/server/resume-mOREjlYu.js +3 -0
  248. package/server/{review-agent-CHhI66UP.js → review-agent--pOptAEV.js} +31 -29
  249. package/server/{review-agent-CD4RCI0Y.js → review-agent-BTCNkq2h.js} +1 -1
  250. package/server/{review-artifacts-DSMRIfuJ.js → review-artifacts-BNmw8dWE.js} +5 -5
  251. package/server/{review-context-oFuBbiEE.js → review-context-DFxYOOJW.js} +9 -9
  252. package/server/{review-convoy-liveness-CpzrcJ5F.js → review-convoy-liveness-BgU_1jJf.js} +2 -2
  253. package/server/{review-status-yljtTd-q.js → review-status-CGvlA4o_.js} +326 -110
  254. package/server/review-status-Dma9SFaN.js +3 -0
  255. package/server/{review-status-emit-CUExtHd5.js → review-status-emit-DURrmGYX.js} +3 -3
  256. package/server/{review-status-enrichment-QV_hQkgS.js → review-status-enrichment-8NiNXi5W.js} +3 -3
  257. package/server/{review-status-source-ylw5QZUR.js → review-status-source-BLx_1siH.js} +1 -1
  258. package/server/{review-status-source-CpvJnvnQ.js → review-status-source-DIk1JSow.js} +1 -1
  259. package/server/{review-status-sync-483sujRo.js → review-status-sync-0GxOqeqF.js} +11 -6
  260. package/server/{review-status-sync-NaWvI9Xf.js → review-status-sync-muT-EBp2.js} +1 -1
  261. package/server/{review-verdict-feedback-BPDn4li_.js → review-verdict-feedback-HwF6ODFy.js} +1 -1
  262. package/server/{review-verdict-feedback-CELeUinh.js → review-verdict-feedback-xJNdqBnX.js} +23 -9
  263. package/server/{rollup-DTNvelz9.js → rollup-BQaol5TX.js} +8 -8
  264. package/server/{rollup-DYZfq1c4.js → rollup-BR4t_wck.js} +1 -1
  265. package/server/{scanner-CV35oSn4.js → scanner-C-D2cFdX.js} +7 -7
  266. package/server/{sequence-io-DF_8iuhV.js → sequence-io-Bmf1EZM5.js} +4 -4
  267. package/server/{sequencer-agent-B2WeCtGi.js → sequencer-agent-CigMyKh2.js} +7 -6
  268. package/server/server.js +435 -418
  269. package/server/{service-Br9rpBNA.js → service-CD0DvFvD.js} +88 -59
  270. package/server/{session-fork-D0LY152N.js → session-fork-B6cQ5eya.js} +2 -2
  271. package/server/{session-history-BUyK29eq.js → session-history-3ON_IJjm.js} +7 -55
  272. package/server/settings-CVmWiJ-r.js +2 -0
  273. package/server/{settings-CvVGqNEs.js → settings-PilbFZAM.js} +2 -2
  274. package/server/{settings-Bse1Pdcj.js → settings-VN0qOh4U.js} +3 -3
  275. package/server/{shadow-engineering-BWLa8ODz.js → shadow-engineering-DXvx77oE.js} +3 -3
  276. package/server/{shadow-state-B4fpKxOO.js → shadow-state-BBk_zacw.js} +2 -2
  277. package/server/{shadow-state-FV6PHfEW.js → shadow-state-CZBp7pwq.js} +1 -1
  278. package/server/{shadow-utils-D7asqxOZ.js → shadow-utils-DdZ05AJS.js} +2 -2
  279. package/server/{ship-log-xplJ8t75.js → ship-log-7kJfjUX2.js} +1 -1
  280. package/server/{smart-compaction-CPp2Ykf6.js → smart-compaction-8fA5k5XN.js} +1 -1
  281. package/server/{smart-compaction-D3U_79f-.js → smart-compaction-ByhL9cRS.js} +7 -7
  282. package/server/{spawn-planning-session-DGfZ5B8D.js → spawn-planning-session-pcF-YeFE.js} +38 -50
  283. package/server/spawn-planning-session-vLUJoFjy.js +3 -0
  284. package/server/{specialist-completion-Br48eiDP.js → specialist-completion-B07XjWD2.js} +1 -1
  285. package/server/{specialist-context-cVbGnTa3.js → specialist-context-DJ-zFyL3.js} +5 -5
  286. package/server/{specialist-handoff-logger-DK-GTz4s.js → specialist-handoff-logger-aKSxbIgD.js} +2 -2
  287. package/server/{specialist-logs-Cl5-hqT8.js → specialist-logs-Dae-n52_.js} +3 -3
  288. package/server/{specialists-CNfYO3G2.js → specialists-6PWdtWcg.js} +298 -180
  289. package/server/{specialists-Tdezg_6N.js → specialists-Bz-wFT7R.js} +1 -1
  290. package/server/{specialists-Cicieuzu.js → specialists-DUiExaxb.js} +18 -18
  291. package/server/{specialists-JHsdU3pA.js → specialists-KR3pKulN.js} +1 -1
  292. package/server/specs--enInima.js +3 -0
  293. package/server/{src-CRmCHlma.js → src-B948bGVR.js} +57 -13
  294. package/server/{src-Ck028hjO.js → src-rac0Mepv.js} +6 -6
  295. package/server/{src-UWcGe0Ix.js → src-vHy2-oCv.js} +3 -3
  296. package/server/{stack-health-CJLMrLBl.js → stack-health-BikqHSjn.js} +1 -1
  297. package/server/{stack-health-DqSqx0zv.js → stack-health-DqLTiEu4.js} +2 -2
  298. package/server/{stale-task-claims-CYFOUNlT.js → stale-task-claims-Cab_Fo_Z.js} +5 -4
  299. package/server/{staleness-D47CUJok.js → staleness-C-a5rBxF.js} +1 -1
  300. package/server/{staleness-BQ-0gMYK.js → staleness-CGTZyp6V.js} +1 -1
  301. package/server/{state-home-BYV7qZTW.js → state-home-722Dkx92.js} +2 -2
  302. package/server/{state-mapping-BVldLhBf.js → state-mapping-CybR81Uf.js} +1 -1
  303. package/server/{state-migrate-CvvBtS0Y.js → state-migrate-2u8wIpoL.js} +4 -4
  304. package/server/{stuck-remediation-mkLC6G_t.js → stuck-remediation-CC6q3eqQ.js} +24 -23
  305. package/server/{stuck-remediation-Wt0UVvu1.js → stuck-remediation-r1TJu68G.js} +1 -1
  306. package/server/{substrate-bug-weights-service-XfLAKnmK.js → substrate-bug-weights-service-CzIyyWFT.js} +3 -3
  307. package/server/{summary-fork-CD7GOts0.js → summary-fork-BqgmgPDt.js} +2 -2
  308. package/server/{summary-fork-xiXBnWG9.js → summary-fork-Df2WFijM.js} +8 -8
  309. package/server/supervisor/{injection-budget-B5SbvDx2.js → injection-budget-Cg_KIb3o.js} +1 -1
  310. package/server/supervisor/{paths-K3noE4N_.js → paths-BBOnCYlO.js} +10 -2
  311. package/server/supervisor/pty-supervisor.js +4 -4
  312. package/server/supervisor/{pty-token-B7lp0ElT.js → pty-token-BbjwEUUM.js} +3 -3
  313. package/server/supervisor-B4anCCSm.js +2 -0
  314. package/server/{supervisor-DL788vos.js → supervisor-BxqSpjcN.js} +3 -3
  315. package/server/{swarm-readiness-BV14DF5N.js → swarm-readiness-DfFxa9-n.js} +3 -3
  316. package/server/{system-prerequisites-pdWG6ZQs.js → system-prerequisites-ICLSkhhZ.js} +2 -2
  317. package/server/{teardown-workspace-l2F4_zim.js → teardown-workspace-DRdi_CPa.js} +15 -15
  318. package/server/{test-agent-queue-qakFIIGz.js → test-agent-queue-A_-p-i0I.js} +8 -7
  319. package/server/{test-verdict-Gw-btEfb.js → test-verdict-BHgTAwIG.js} +1 -1
  320. package/server/{test-verdict-BJYDggMm.js → test-verdict-C4i9aqEP.js} +1 -1
  321. package/server/{tldr-daemon-BKOYB616.js → tldr-daemon-CvWXBhX1.js} +1 -1
  322. package/server/{tldr-daemon-CBaWkV9k.js → tldr-daemon-wvsU6bKv.js} +2 -2
  323. package/server/{tmux-B1Wbxz5o.js → tmux-CfDHob9M.js} +174 -4
  324. package/server/{tmux-DQ6jB76i.js → tmux-Ctk6RV5l.js} +1 -1
  325. package/server/{token-Cxbk023d.js → token-DrxwytsZ.js} +2 -2
  326. package/server/{token-util-CLq2MmQt.js → token-util-B48BlCba.js} +1 -1
  327. package/server/token-util-D411CAq9.js +3 -0
  328. package/server/{tracker-config-DZ8Zn2nQ.js → tracker-config-BcPMElRB.js} +2 -2
  329. package/server/{tracker-utils-L0FKtjq2.js → tracker-utils-CJ6BHjcD.js} +2 -2
  330. package/server/{traefik-connect-bNX6jKkb.js → traefik-connect-DZ6nMYMj.js} +1 -1
  331. package/server/{tunnel-CjSnHdTc.js → tunnel-Bp-dRHZz.js} +1 -1
  332. package/server/{tunnel-BAm1XgjG.js → tunnel-DUbUPElU.js} +3 -3
  333. package/server/{typed-errors-BHhE85Ul.js → typed-errors-CKeoDdU3.js} +1 -1
  334. package/server/{typed-errors-2BTMxkZq.js → typed-errors-DyjseiB6.js} +1 -1
  335. package/server/{types-hraoaQIp.js → types-Cm5ASJbq.js} +1 -1
  336. package/server/{types-q67TYYg5.js → types-Di8wdakq.js} +1 -1
  337. package/server/{uat-promote-verification-CKB9ZrKC.js → uat-promote-verification-CoJuh7XO.js} +5 -5
  338. package/server/{uat-train-D5UjcyAa.js → uat-train-4Q0k06CQ.js} +0 -0
  339. package/server/{uat-train-Cu-4nvbf.js → uat-train-Dewoatps.js} +1 -1
  340. package/server/{validate-Cxsx5Uz1.js → validate-B0C8p66t.js} +3 -3
  341. package/server/{validation-VZgJxmqc.js → validation-B_kIRfNe.js} +4 -4
  342. package/server/{validation-DEaTZafj.js → validation-hVOwQk8T.js} +1 -1
  343. package/server/{verification-artifact-C85cRTc_.js → verification-artifact-BxlxTiYK.js} +1 -1
  344. package/server/{verification-artifact-g3yuxQDL.js → verification-artifact-D70AtckY.js} +1 -1
  345. package/server/{verification-runner-DlZI8yhw.js → verification-runner-Bc3cJvpC.js} +1 -1
  346. package/server/{verification-runner-KDZIsBj4.js → verification-runner-KZTz6u72.js} +19 -19
  347. package/server/{vtt-parser-Jr94BF3Y.js → vtt-parser-CE_i3Bcw.js} +1 -1
  348. package/server/{work-agent-prompt-C-vuP3_J.js → work-agent-prompt-ByrPAzOy.js} +9 -9
  349. package/server/{workflows-D0oip4eV.js → workflows-D0vP1WrK.js} +113 -43
  350. package/server/workflows-DtDX08ed.js +2 -0
  351. package/server/{workspace-BqFg__wH.js → workspace-COWvdibH.js} +1 -1
  352. package/server/{workspace-C0fH3aek.js → workspace-DQkRPLlQ.js} +3 -3
  353. package/server/{workspace-anchor-drift-CZKofakh.js → workspace-anchor-drift-DXYIAHzr.js} +4 -4
  354. package/server/{workspace-anchor-drift-B4gMRHl4.js → workspace-anchor-drift-pwz23TI1.js} +1 -1
  355. package/server/{workspace-config-B123aZl-.js → workspace-config-BdZM4PvZ.js} +1 -1
  356. package/server/{workspace-manager-CwO-Hek7.js → workspace-manager-BPgTrG66.js} +13 -13
  357. package/server/{workspace-manager-CDTKjjdU.js → workspace-manager-C1F3XsnS.js} +1 -1
  358. package/server/{workspace-metadata-D4M8BM4W.js → workspace-metadata-CdjzAP8x.js} +1 -1
  359. package/server/{workspace-metadata-CQv00QwK.js → workspace-metadata-DkO_iTLo.js} +2 -2
  360. package/server/{workspaces-j1e_6aAT.js → workspaces-CRBJikLp.js} +136 -113
  361. package/sync-sources/skills/pan-merge/SKILL.md +7 -5
  362. package/sync-sources/skills/pan-release/SKILL.md +57 -0
  363. package/server/agent-state-service-hZpxIw1E.js +0 -2
  364. package/server/archive-planning-0FJ6Xd3b.js +0 -2
  365. package/server/cli-DmXETsw-.js +0 -3
  366. package/server/conflict-gate-Dh754uyA.js +0 -3
  367. package/server/deacon-swarm-I2JfX5Tg.js +0 -2
  368. package/server/dist-DSlxIU1H.js +0 -3
  369. package/server/durable-review-pipeline-jpgCJZFp.js +0 -3
  370. package/server/forge-DK3blQb_.js +0 -3
  371. package/server/hume-Dq--7rOQ.js +0 -3
  372. package/server/inspect-agent-BVwDrVrz.js +0 -2
  373. package/server/label-reconciler--F85rufp.js +0 -113
  374. package/server/merge-ops-DdpTiEMt.js +0 -2
  375. package/server/merge-rebase-DGQpYJU3.js +0 -2
  376. package/server/merge-sync-Ca7F5JnQ.js +0 -3
  377. package/server/public/assets/index-Cc7cnFC4.css +0 -1
  378. package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +0 -1
  379. package/server/rally-YDjU513q.js +0 -3
  380. package/server/resume-u9byntrq.js +0 -3
  381. package/server/review-status-BZH8h-6W.js +0 -3
  382. package/server/settings-CdvIF84R.js +0 -2
  383. package/server/spawn-planning-session-1nFi3gfk.js +0 -2
  384. package/server/specs-Bt7WJDoC.js +0 -3
  385. package/server/supervisor-UWiQNK-y.js +0 -2
  386. package/server/token-util-zlz9U0ki.js +0 -3
  387. package/server/workflows-CHrx_hcW.js +0 -2
@@ -1,52 +1,57 @@
1
1
  import { i as __require, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Fr as init_errors, Gn as init_projects, Gr as OVERDECK_HOME, Ir as AGENTS_DIR, Pt as init_record, Yn as listProjectsSync, ar as resolveProjectFromIssueSync, b as DEFAULT_CONFIG$1, ci as init_paths, dn as reconcileStatePlaneDrift, f as loadConfigSync, fi as sessionFilePath, hn as init_state_plane, ln as init_auto_commit, mn as getMainDivergence, s as init_load, x as init_defaults, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CmOPzmBb.js";
3
- import { n as init_build_info, t as getBuildInfo } from "./build-info-CuFfxZxp.js";
4
- import { n as getDashboardIdentity, t as recordDeaconNudge } from "./deacon-nudge-log-BNBebzeL.js";
2
+ import { Fr as init_errors, Gn as init_projects, Gr as OVERDECK_HOME, Ir as AGENTS_DIR, Pt as init_record, Yn as listProjectsSync, Zn as loadProjectsConfigSync, ar as resolveProjectFromIssueSync, b as DEFAULT_CONFIG$1, dn as reconcileStatePlaneDrift, f as loadConfigSync, hn as init_state_plane, li as init_paths, ln as init_auto_commit, mn as getMainDivergence, or as resolveProjectPath, pi as sessionFilePath, s as init_load, x as init_defaults, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CxdwhAIA.js";
3
+ import { n as init_build_info, t as getBuildInfo } from "./build-info-7yiEpl6u.js";
4
+ import { n as getDashboardIdentity, t as recordDeaconNudge } from "./deacon-nudge-log-B08gF0mh.js";
5
5
  import { i as emitActivityTtsSync, o as init_activity_logger, r as emitActivityEntrySync } from "./activity-logger-CyteR4JO.js";
6
- import { i as updateIssueRecord, r as init_record_update } from "./record-update-Z0QCxmMp.js";
7
- import { A as listPaneValues, B as sendKeysAsync, D as killSession, E as isPaneDead, H as sessionExists, I as querySessionSync, M as listSessionNames, N as listSessions, U as sessionExistsSync, i as capturePane, w as init_tmux, z as sendKeys } from "./tmux-B1Wbxz5o.js";
8
- import { a as init_event_store, i as initEventStore } from "./event-store-zY5MJHgF.js";
9
- import { D as projectLegacySystemHealthSummary, t as init_src } from "./src-CRmCHlma.js";
10
- import { L as init_review_dispatch_decision, R as needsReviewDispatch, S as setReviewStatusSync, f as init_review_status, m as loadReviewStatuses, u as getReviewStatusSync, z as reviewGatesPassedSync } from "./review-status-yljtTd-q.js";
11
- import { c as listAllAgentsSync, d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-C5rWYhb6.js";
12
- import { $n as getAgentDir, Bt as init_transcript_landing, Ct as resetPatrolDispatchBudget, Et as workResumeSlotsAvailable, Fr as getAgentRuntimeState, G as resumeAgent, Ir as getAgentRuntimeStateSync, J as isContextOverflowTail, K as init_context_overflow, Ln as buildResumeContinueMessage, Lr as init_runtime_state, Ot as init_memory_verdict_cache, Pt as deliverInitialPromptWithRetry, Rr as saveAgentRuntimeState, Ur as init_codex_auth, Vr as applyCodexAuthBurnFlag, Wr as paneShowsCodexAuthBurn, X as messageAgent, Xn as clearAgentTroubledSync, Y as init_messaging, Zn as clearYieldForResumeSync, _ as init_linux, _r as saveAgentStateSync, _t as describeRunningAgents, a as listRunningAgentsSync, b as init_agents$1, br as setAgentYieldedSync, bt as init_concurrency, c as getRuntimeCensus, fr as recordAgentFailure, ft as init_termination, g as LINUX_MEMORY_PRESSURE_DEFAULTS, gr as saveAgentState, h as init_collector, hr as resetAgentFailureCount, ht as countRunningAgents, i as listRunningAgents, ir as init_agent_state, kt as setCachedMemoryVerdict, lr as markAgentRunningState, m as createHostHealthCollector, n as init_queries, pt as stopAgent, r as listAgentStates, rr as getAgentStateSync, s as descendantPidsForSession, tr as getAgentState, u as init_runtime_census, v as DARWIN_MEMORY_PRESSURE_DEFAULTS, wt as tryReserveAdvancingSlot, xt as releaseAdvancingSlot, y as init_darwin, yr as setAgentPausedSync, yt as getConcurrencyLimits, zt as captureTranscriptUserRecordSnapshot } from "./queries-DHJm7bTd.js";
13
- import { c as logDeaconEventSync, l as getRuntimeSnapshot, o as init_persistent_logger, s as logAgentLifecycleSync, u as init_agent_runtime_mirror } from "./session-history-BUyK29eq.js";
14
- import { n as resolveGitHubIssueSync, t as init_tracker_utils } from "./tracker-utils-L0FKtjq2.js";
15
- import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-DvMTQSOS.js";
16
- import { c as init_review_status_sync, l as markWorkspaceStuck } from "./review-status-sync-483sujRo.js";
17
- import { i as readReviewStatusMap, n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-CpvJnvnQ.js";
18
- import { i as init_merge_set, r as getMergeSetSync } from "./merge-set-DH7ot3yz.js";
19
- import { m as readWorkspacePlanSync, o as init_io } from "./io-VHvc0Ssp.js";
20
- import { f as init_config, m as loadConfigSync$1, p as loadConfig$1 } from "./config-Dr3pW6w6.js";
21
- import { E as stampBootReconciliation, g as setBootReconciliationGrace, h as setBootReconciliationDecision, l as isDeaconGloballyPaused, r as getBootReconciliationState, s as init_control_settings } from "./control-settings-C7DUehE1.js";
22
- import { d as init_docker_stats, u as DockerStatsCollector } from "./stack-health-DqSqx0zv.js";
23
- import { l as init_dag, o as getDispatchableItems } from "./dag-ombYYt4s.js";
24
- import { a as loadCloisterConfigSync, i as loadCloisterConfig, r as init_config$1 } from "./config-B2IMcBxx.js";
25
- import { a as findRecreatedLegacyStatePaths, o as init_state_home } from "./state-home-BYV7qZTW.js";
26
- import { M as withConcurrencyLimit, j as init_concurrency$1 } from "./github-app-CQ1Lo6LA.js";
27
- import { a as isAgentIdleForNudge, t as checkStuckAgentRemediation } from "./stuck-remediation-mkLC6G_t.js";
28
- import { n as __filename, r as init_esm_shims } from "./esm-shims-Br9BPdkR.js";
29
- import { i as init_staleness, r as computeBuildStaleness } from "./staleness-D47CUJok.js";
30
- import { a as pidsWithCwdUnder, i as sweepAutoCloseOutCache, n as pruneTerminalStoppedAgents, r as getAutoCloseOutCanonicalState } from "./agent-gc-CBULruzm.js";
31
- import { n as init_issue_closed, r as isIssueClosed } from "./issue-closed-B6KJkmHZ.js";
32
- import { a as observeForgeMergeState, i as init_merge_completeness } from "./merge-completeness-BMm8tMyZ.js";
33
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-BG0RUZiu.js";
34
- import { r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-Dt9BsapX.js";
35
- import { a as init_review_monitor, i as REVIEW_SUB_ROLES, n as init_review_convoy_liveness, r as reviewTimestampMs, t as evaluateReviewConvoyLiveness } from "./review-convoy-liveness-CpzrcJ5F.js";
36
- import { J as parseReviewerSessionName, U as getTmuxSessionName, g as getAllProjectSpecialistStatuses, t as init_specialists } from "./specialists-Cicieuzu.js";
37
- import { a as inferBranchFromWorkspace, i as findWorkspacePath } from "./archive-planning-C0lAbNB_.js";
38
- import { n as init_merge_verification, r as shouldSkipDispatchAsMerged } from "./merge-verification-x3JO8Dtz.js";
39
- import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-CELeUinh.js";
40
- import { n as reconcileTraefikNetworks, t as init_traefik_connect } from "./traefik-connect-bNX6jKkb.js";
41
- import { g as decideAgentAutonomousRedrive, r as coordinateSwarmSlots, y as listFeatureWorkspaces } from "./deacon-swarm-DBxUaO-A.js";
42
- import { n as isExplicitNoResumeRequest, t as init_no_resume_mode } from "./no-resume-mode-C5ULAXwO.js";
43
- import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-Bq3epG58.js";
44
- import { n as reconcileClosedIssueAgents } from "./closed-issue-reaper-Cltx86x5.js";
45
- import { n as init_label_reconciler, r as reconcilePipelineLabelsPatrol } from "./label-reconciler--F85rufp.js";
46
- import { t as recordDeadEndNeedsYou } from "./dead-end-trip-CQcP70ND.js";
47
- import { a as spawnWorkAgentThroughAgentsEndpoint, i as reconcileOrphanProposedSpecs, o as triggerRebuildAndStart } from "./orphan-proposed-reconciler-Dg6U4ADZ.js";
48
- import { n as reconcileIdleWorkspaceStacks } from "./idle-stack-reaper-CnGx_PO_.js";
49
- import { i as readTestVerdictArtifact, n as decideUnsignaledTestAction, r as init_test_verdict } from "./test-verdict-BJYDggMm.js";
6
+ import { i as updateIssueRecord, r as init_record_update } from "./record-update-DaOKS7Wb.js";
7
+ import { A as listPaneValues, B as sendKeysAsync, D as killSession, E as isPaneDead, H as sessionExists, I as querySessionSync, M as listSessionNames, N as listSessions, U as sessionExistsSync, i as capturePane, w as init_tmux, z as sendKeys } from "./tmux-CfDHob9M.js";
8
+ import { a as init_event_store, i as initEventStore } from "./event-store-CrHcVC5_.js";
9
+ import { D as projectLegacySystemHealthSummary, t as init_src } from "./src-B948bGVR.js";
10
+ import { B as reviewGatesPassedSync, C as setReviewStatusSync, H as findBlockingFindings, K as readJournalStatusSync, R as init_review_dispatch_decision, U as init_review_findings, W as init_review_status_record_sync, d as getReviewStatusSync, h as loadReviewStatuses, p as init_review_status, z as needsReviewDispatch } from "./review-status-CGvlA4o_.js";
11
+ import { n as logAgentLifecycleSync, r as logDeaconEventSync, t as init_persistent_logger } from "./persistent-logger-H_VjuOu7.js";
12
+ import { c as listAllAgentsSync, d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-J5mEnekq.js";
13
+ import { $n as getAgentDir, Br as saveAgentRuntimeState, Bt as init_transcript_landing, Ct as resetPatrolDispatchBudget, Et as workResumeSlotsAvailable, G as resumeAgent, Gr as init_codex_auth, J as isContextOverflowTail, K as init_context_overflow, Kr as paneShowsCodexAuthBurn, Ln as buildResumeContinueMessage, Lr as getAgentRuntimeState, Ot as init_memory_verdict_cache, Pt as deliverInitialPromptWithRetry, Rr as getAgentRuntimeStateSync, Ur as applyCodexAuthBurnFlag, X as messageAgent, Xn as clearAgentTroubledSync, Y as init_messaging, Zn as clearYieldForResumeSync, _ as init_linux, _r as saveAgentStateSync, _t as describeRunningAgents, a as listRunningAgentsSync, b as init_agents$1, br as setAgentYieldedSync, bt as init_concurrency, c as getRuntimeCensus, fr as recordAgentFailure, ft as init_termination, g as LINUX_MEMORY_PRESSURE_DEFAULTS, gr as saveAgentState, h as init_collector, hr as resetAgentFailureCount, ht as countRunningAgents, i as listRunningAgents, ir as init_agent_state, kt as setCachedMemoryVerdict, lr as markAgentRunningState, m as createHostHealthCollector, n as init_queries, pt as stopAgent, r as listAgentStates, rr as getAgentStateSync, s as descendantPidsForSession, tr as getAgentState, u as init_runtime_census, v as DARWIN_MEMORY_PRESSURE_DEFAULTS, wt as tryReserveAdvancingSlot, xt as releaseAdvancingSlot, y as init_darwin, yr as setAgentPausedSync, yt as getConcurrencyLimits, zr as init_runtime_state, zt as captureTranscriptUserRecordSnapshot } from "./queries-C-MUZaIy.js";
14
+ import { o as getRuntimeSnapshot, s as init_agent_runtime_mirror } from "./session-history-3ON_IJjm.js";
15
+ import { n as resolveGitHubIssueSync, t as init_tracker_utils } from "./tracker-utils-CJ6BHjcD.js";
16
+ import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-DzK385vD.js";
17
+ import { c as init_review_status_sync, l as markWorkspaceStuck } from "./review-status-sync-0GxOqeqF.js";
18
+ import { i as readReviewStatusMap, n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-DIk1JSow.js";
19
+ import { _ as markMerged, c as init_merge_sync, f as listActiveAutoMerges, m as listProblemAutoMerges, t as cancelPending } from "./merge-sync-kr4vqyjM.js";
20
+ import { i as init_merge_set, r as getMergeSetSync } from "./merge-set-CBgHfwM0.js";
21
+ import { m as readWorkspacePlanSync, o as init_io } from "./io-B00PBNku.js";
22
+ import { f as init_config, m as loadConfigSync$1, p as loadConfig$1 } from "./config-BvLe652W.js";
23
+ import { D as setSetting, O as stampBootReconciliation, _ as setBootReconciliationGrace, c as init_control_settings, g as setBootReconciliationDecision, o as getLastCleanShutdownAt, r as getBootReconciliationState, s as getSetting, u as isDeaconGloballyPaused } from "./control-settings-CiqGxXnc.js";
24
+ import { d as init_docker_stats, u as DockerStatsCollector } from "./stack-health-DqLTiEu4.js";
25
+ import { l as init_dag, o as getDispatchableItems } from "./dag-BtkgLeqY.js";
26
+ import { a as loadCloisterConfigSync, i as loadCloisterConfig, r as init_config$1 } from "./config-Bi3u1VK7.js";
27
+ import { a as findRecreatedLegacyStatePaths, o as init_state_home } from "./state-home-722Dkx92.js";
28
+ import { M as withConcurrencyLimit, j as init_concurrency$1 } from "./github-app-CmNk0zLU.js";
29
+ import { a as isAgentIdleForNudge, t as checkStuckAgentRemediation } from "./stuck-remediation-CC6q3eqQ.js";
30
+ import { n as __filename, r as init_esm_shims } from "./esm-shims-BeObUkaw.js";
31
+ import { i as init_staleness, r as computeBuildStaleness } from "./staleness-C-a5rBxF.js";
32
+ import { a as pidsWithCwdUnder, i as sweepAutoCloseOutCache, n as pruneTerminalStoppedAgents, r as getAutoCloseOutCanonicalState } from "./agent-gc-C3h9Or3a.js";
33
+ import { n as init_issue_closed, r as isIssueClosed } from "./issue-closed-BehTG1be.js";
34
+ import { n as getForgeAdapter, r as init_forge } from "./forge-BaKGCya6.js";
35
+ import { a as observeForgeMergeState, i as init_merge_completeness } from "./merge-completeness-B46KqhtY.js";
36
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-C27Hak8a.js";
37
+ import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-DSxEL6lP.js";
38
+ import { a as init_review_monitor, i as REVIEW_SUB_ROLES, n as init_review_convoy_liveness, r as reviewTimestampMs, t as evaluateReviewConvoyLiveness } from "./review-convoy-liveness-BgU_1jJf.js";
39
+ import { J as parseReviewerSessionName, U as getTmuxSessionName, g as getAllProjectSpecialistStatuses, t as init_specialists } from "./specialists-DUiExaxb.js";
40
+ import { a as inferBranchFromWorkspace, i as findWorkspacePath } from "./archive-planning-BwhxeP7C.js";
41
+ import { n as init_merge_verification, r as shouldSkipDispatchAsMerged } from "./merge-verification-NvaAd8CZ.js";
42
+ import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-xJNdqBnX.js";
43
+ import { _ as init_label_reconciler, a as gatherProjectLensSignals, s as init_pipeline_membership_gather, v as reconcilePipelineLabelsPatrol } from "./pipeline-membership-gather-CeVGnNJ2.js";
44
+ import { n as init_pipeline_membership, r as resolvePipelineMembership } from "./pipeline-membership-D9SBvItj.js";
45
+ import { i as init_conflict_gate, o as probeBranchConflictPaths } from "./conflict-gate-E4nt7ZeS.js";
46
+ import { n as reconcileTraefikNetworks, t as init_traefik_connect } from "./traefik-connect-DZ6nMYMj.js";
47
+ import { g as decideAgentAutonomousRedrive, r as coordinateSwarmSlots, y as listFeatureWorkspaces } from "./deacon-swarm-v5PMun-m.js";
48
+ import { n as isExplicitNoResumeRequest, t as init_no_resume_mode } from "./no-resume-mode-BgD0JUmM.js";
49
+ import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-D-sSkADM.js";
50
+ import { r as reconcileClosedIssueAgents } from "./closed-issue-reaper-DoOZqGFK.js";
51
+ import { t as recordDeadEndNeedsYou } from "./dead-end-trip-D8A3msX9.js";
52
+ import { a as spawnWorkAgentThroughAgentsEndpoint, i as reconcileOrphanProposedSpecs, o as triggerRebuildAndStart } from "./orphan-proposed-reconciler-B6vJHxtX.js";
53
+ import { n as reconcileIdleWorkspaceStacks } from "./idle-stack-reaper-Cy-dQzW4.js";
54
+ import { i as readTestVerdictArtifact, n as decideUnsignaledTestAction, r as init_test_verdict } from "./test-verdict-C4i9aqEP.js";
50
55
  import { createRequire } from "node:module";
51
56
  import { join } from "node:path";
52
57
  import { Effect } from "effect";
@@ -67,15 +72,20 @@ init_paths();
67
72
  init_errors();
68
73
  init_activity_logger();
69
74
  init_projects();
75
+ init_state_plane();
76
+ init_auto_commit();
77
+ init_record();
70
78
  init_tmux();
71
79
  init_src();
80
+ init_persistent_logger();
72
81
  init_agents();
73
82
  init_agent_runtime_mirror();
74
- init_persistent_logger();
75
83
  init_tracker_utils();
76
84
  init_review_status_sync();
77
85
  init_review_status_source();
86
+ init_merge_sync();
78
87
  init_merge_set();
88
+ init_review_status_record_sync();
79
89
  init_review_dispatch_decision();
80
90
  init_review_status();
81
91
  init_codex_auth();
@@ -22432,7 +22442,7 @@ function acceptedReasons(state, hostReasons, agents, services) {
22432
22442
  //#endregion
22433
22443
  //#region services/system-health-service.ts
22434
22444
  init_review_status_source();
22435
- const execAsync$3 = promisify(exec);
22445
+ const execAsync$4 = promisify(exec);
22436
22446
  const KB = 1024;
22437
22447
  const GIB$1 = 1024 ** 3;
22438
22448
  function parseMemoryPsi(content) {
@@ -22560,7 +22570,7 @@ async function readProcMemoryDarwin() {
22560
22570
  let memAvailable = freemem$1();
22561
22571
  let memFree = freemem$1();
22562
22572
  try {
22563
- const { stdout } = await execAsync$3("vm_stat", {
22573
+ const { stdout } = await execAsync$4("vm_stat", {
22564
22574
  encoding: "utf-8",
22565
22575
  timeout: 5e3
22566
22576
  });
@@ -22580,7 +22590,7 @@ async function readProcMemoryDarwin() {
22580
22590
  let swapTotal = 0;
22581
22591
  let swapFree = 0;
22582
22592
  try {
22583
- const { stdout } = await execAsync$3("sysctl -n vm.swapusage", {
22593
+ const { stdout } = await execAsync$4("sysctl -n vm.swapusage", {
22584
22594
  encoding: "utf-8",
22585
22595
  timeout: 5e3
22586
22596
  });
@@ -23148,11 +23158,10 @@ async function assessMemoryPressure() {
23148
23158
  }
23149
23159
  //#endregion
23150
23160
  //#region ../../lib/cloister/agent-grace.ts
23151
- init_state_plane();
23152
- init_auto_commit();
23153
- init_record();
23154
23161
  init_record_update();
23155
23162
  init_internal_token();
23163
+ init_review_findings();
23164
+ init_control_settings();
23156
23165
  const WORK_LAUNCHER_GRACE_MS = 12e4;
23157
23166
  function isStartingWithinGrace(state, now = Date.now(), graceMs = WORK_LAUNCHER_GRACE_MS) {
23158
23167
  if (state.status !== "starting") return false;
@@ -23202,7 +23211,7 @@ async function checkInspectAgentTimeouts(now = /* @__PURE__ */ new Date()) {
23202
23211
  console.warn(`[deacon] Failed to kill inspect session ${sessionName}: ${msg}`);
23203
23212
  });
23204
23213
  try {
23205
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
23214
+ const { messageAgent } = await import("./agents-ePFVoZbu.js");
23206
23215
  await messageAgent(`agent-${issueId.toLowerCase()}`, verdict, "deacon:inspect-watchdog");
23207
23216
  } catch (err) {
23208
23217
  const msg = err instanceof Error ? err.message : String(err);
@@ -23396,7 +23405,7 @@ async function maybeProactivelyCompactContext(sessionName, now) {
23396
23405
  if (!agentState?.workspace || !sessionId || !agentState.model) return null;
23397
23406
  let usage = null;
23398
23407
  try {
23399
- const { computeContextUsage } = await import("./conversation-service-BCxl4f8Z.js");
23408
+ const { computeContextUsage } = await import("./conversation-service-D_TS2b1r.js");
23400
23409
  usage = await computeContextUsage(sessionFilePath(agentState.workspace, sessionId), agentState.model);
23401
23410
  } catch {
23402
23411
  return null;
@@ -23495,9 +23504,9 @@ async function checkApiErrorAgents() {
23495
23504
  }
23496
23505
  if (!tmuxOutput.includes("❯")) continue;
23497
23506
  try {
23498
- const { maybeContinueCompactedAgent } = await import("./compaction-continuation-K2AxQX4H.js");
23499
- const { findLastCompactBoundary } = await import("./conversation-service-BCxl4f8Z.js");
23500
- const { deliverAgentMessage } = await import("./delivery-Da0zEMY4.js");
23507
+ const { maybeContinueCompactedAgent } = await import("./compaction-continuation-CvXpbZ4w.js");
23508
+ const { findLastCompactBoundary } = await import("./conversation-service-D_TS2b1r.js");
23509
+ const { deliverAgentMessage } = await import("./delivery-BX9HR4wQ.js");
23501
23510
  const continued = await maybeContinueCompactedAgent({
23502
23511
  agentId: sessionName,
23503
23512
  tmuxOutput,
@@ -23548,13 +23557,13 @@ async function checkApiErrorAgents() {
23548
23557
  const st = getAgentStateSync(sessionName);
23549
23558
  const sid = st?.sessionId ?? runtimeState?.claudeSessionId;
23550
23559
  if (st?.workspace && sid && st.model) {
23551
- const { computeContextUsage } = await import("./conversation-service-BCxl4f8Z.js");
23560
+ const { computeContextUsage } = await import("./conversation-service-D_TS2b1r.js");
23552
23561
  const usage = await computeContextUsage(sessionFilePath(st.workspace, sid), st.model);
23553
23562
  if (usage && usage.percentUsed < 85) recoveredPct = usage.percentUsed;
23554
23563
  }
23555
23564
  } catch {}
23556
23565
  if (recoveredPct !== null) {
23557
- const { clearWorkspaceStuck } = await import("./review-status-sync-NaWvI9Xf.js");
23566
+ const { clearWorkspaceStuck } = await import("./review-status-sync-muT-EBp2.js");
23558
23567
  clearWorkspaceStuck(issueId);
23559
23568
  stuckOverflowNativeRecoveryState.delete(sessionName);
23560
23569
  actions.push(`Context overflow recovery: cleared stuck flag for ${sessionName} (context back to ${Math.round(recoveredPct)}%)`);
@@ -23570,7 +23579,7 @@ async function checkApiErrorAgents() {
23570
23579
  rec.attempts += 1;
23571
23580
  rec.lastAttempt = now;
23572
23581
  stuckOverflowNativeRecoveryState.set(sessionName, rec);
23573
- const { resumeAgent } = await import("./agents-BKKkxKgK.js");
23582
+ const { resumeAgent } = await import("./agents-ePFVoZbu.js");
23574
23583
  const recovered = await resumeAgent(sessionName, void 0, { compact: true });
23575
23584
  if (recovered.success) {
23576
23585
  stuckOverflowNativeRecoveryState.delete(sessionName);
@@ -23618,7 +23627,7 @@ async function checkApiErrorAgents() {
23618
23627
  }
23619
23628
  const compactAttempts = (ov?.compactAttempts ?? 0) + 1;
23620
23629
  if (issueId !== null) {
23621
- const { resumeAgent } = await import("./agents-BKKkxKgK.js");
23630
+ const { resumeAgent } = await import("./agents-ePFVoZbu.js");
23622
23631
  const resumeResult = await resumeAgent(sessionName, void 0, { compact: true });
23623
23632
  contextOverflowRecoveryState.set(sessionName, {
23624
23633
  lastAttempt: now,
@@ -23737,7 +23746,7 @@ function isStuckMergingState(status, now) {
23737
23746
  }
23738
23747
  async function readSpecStatus(projectPath, issueId) {
23739
23748
  try {
23740
- const { findSpecByIssue } = await import("./specs-Bt7WJDoC.js");
23749
+ const { findSpecByIssue } = await import("./specs--enInima.js");
23741
23750
  return (await Effect.runPromise(findSpecByIssue(projectPath, issueId)))?.status;
23742
23751
  } catch {
23743
23752
  return;
@@ -23819,13 +23828,151 @@ async function reconcileStuckMergingStates() {
23819
23828
  reviewGatesPassed: reviewGatesPassedSync,
23820
23829
  setReviewStatus: setReviewStatusSync,
23821
23830
  enqueuePostMerge: async (issueId, projectPath, branch) => {
23822
- const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-DbO10pum.js");
23831
+ const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-8HIeS_J6.js");
23823
23832
  return enqueuePostMergeLifecycle(issueId, projectPath, branch);
23824
23833
  },
23825
23834
  warn: (message) => console.warn(message)
23826
23835
  });
23827
23836
  }
23828
23837
  //#endregion
23838
+ //#region ../../lib/cloister/deacon-auto-merge-reconcile.ts
23839
+ init_forge();
23840
+ init_merge_set();
23841
+ init_projects();
23842
+ const AUTO_MERGE_RECONCILE_COOLDOWN_MS = 600 * 1e3;
23843
+ const UNBOUNDED_ROW_LIMIT = -1;
23844
+ const autoMergeReconcileCooldowns = /* @__PURE__ */ new Map();
23845
+ const autoMergeLastCheckedAt = /* @__PURE__ */ new Map();
23846
+ function groupByIssue(rows) {
23847
+ const grouped = /* @__PURE__ */ new Map();
23848
+ for (const row of rows) {
23849
+ const issueRows = grouped.get(row.issueId) ?? [];
23850
+ issueRows.push(row);
23851
+ grouped.set(row.issueId, issueRows);
23852
+ }
23853
+ return grouped;
23854
+ }
23855
+ function normalizeArtifactUrl(url) {
23856
+ return url.replace(/[?#].*$/, "").replace(/\/+$/, "");
23857
+ }
23858
+ function repositoryFromArtifactUrl(url, forge) {
23859
+ try {
23860
+ const parsed = new URL(url);
23861
+ if (forge === "github" && parsed.hostname.toLowerCase() !== "github.com") return void 0;
23862
+ const marker = forge === "gitlab" ? "/-/merge_requests/" : "/pull/";
23863
+ const markerIndex = parsed.pathname.indexOf(marker);
23864
+ if (markerIndex <= 1) return void 0;
23865
+ return parsed.pathname.slice(1, markerIndex);
23866
+ } catch {
23867
+ return;
23868
+ }
23869
+ }
23870
+ function pruneTracking(activeIssueIds) {
23871
+ for (const issueId of autoMergeReconcileCooldowns.keys()) if (!activeIssueIds.has(issueId)) autoMergeReconcileCooldowns.delete(issueId);
23872
+ for (const issueId of autoMergeLastCheckedAt.keys()) if (!activeIssueIds.has(issueId)) autoMergeLastCheckedAt.delete(issueId);
23873
+ }
23874
+ async function reconcileForgeCandidate(candidate, deps, now) {
23875
+ const { issueId, problemRows, representative, artifactRepo, projectPath } = candidate;
23876
+ autoMergeLastCheckedAt.set(issueId, now);
23877
+ try {
23878
+ const repository = repositoryFromArtifactUrl(representative.prUrl, representative.forge);
23879
+ if (!await deps.getForgeAdapter(representative.forge).findMergedArtifact({
23880
+ sourceBranch: artifactRepo?.sourceBranch ?? `feature/${issueId.toLowerCase()}`,
23881
+ ...artifactRepo?.targetBranch ? { targetBranch: artifactRepo.targetBranch } : {},
23882
+ artifactUrl: representative.prUrl,
23883
+ ...artifactRepo?.artifactId ? { artifactId: artifactRepo.artifactId } : {},
23884
+ ...repository ? { repository } : {},
23885
+ cwd: artifactRepo?.repoPath ?? projectPath
23886
+ })) {
23887
+ autoMergeReconcileCooldowns.set(issueId, now + AUTO_MERGE_RECONCILE_COOLDOWN_MS);
23888
+ return [];
23889
+ }
23890
+ const actions = [];
23891
+ for (const row of problemRows) {
23892
+ if (!deps.markMerged(row.id)) continue;
23893
+ const action = `Reconciled auto-merge row ${row.id} for ${issueId} — forge confirms the merge`;
23894
+ actions.push(action);
23895
+ deps.log(`[deacon] ${action}`);
23896
+ }
23897
+ autoMergeReconcileCooldowns.delete(issueId);
23898
+ return actions;
23899
+ } catch (error) {
23900
+ autoMergeReconcileCooldowns.set(issueId, now + AUTO_MERGE_RECONCILE_COOLDOWN_MS);
23901
+ deps.warn(`[deacon] Auto-merge row reconciliation failed for ${issueId}: ${error instanceof Error ? error.message : String(error)}`);
23902
+ return [];
23903
+ }
23904
+ }
23905
+ async function reconcileAutoMergeRowsWithDeps(deps) {
23906
+ const actions = [];
23907
+ const now = deps.now();
23908
+ let rows;
23909
+ try {
23910
+ rows = [...deps.listProblemAutoMerges(UNBOUNDED_ROW_LIMIT), ...deps.listActiveAutoMerges(UNBOUNDED_ROW_LIMIT).filter((row) => row.status === "pending")];
23911
+ } catch (error) {
23912
+ deps.warn(`[deacon] Auto-merge row reconciliation failed to list rows: ${error instanceof Error ? error.message : String(error)}`);
23913
+ return actions;
23914
+ }
23915
+ const grouped = groupByIssue(rows);
23916
+ pruneTracking(new Set(grouped.keys()));
23917
+ const forgeCandidates = [];
23918
+ for (const [issueId, issueRows] of grouped) {
23919
+ const cooledUntil = autoMergeReconcileCooldowns.get(issueId);
23920
+ if (cooledUntil && now < cooledUntil) continue;
23921
+ try {
23922
+ if (deps.readJournalStatus(issueId)?.durable.closedOut === true) {
23923
+ for (const row of issueRows) {
23924
+ if (!deps.cancelPending(row.id, "auto-merge-reconciler")) continue;
23925
+ const action = `Cancelled closed-out auto-merge row ${row.id} for ${issueId}`;
23926
+ actions.push(action);
23927
+ deps.log(`[deacon] ${action}`);
23928
+ }
23929
+ autoMergeReconcileCooldowns.delete(issueId);
23930
+ autoMergeLastCheckedAt.delete(issueId);
23931
+ continue;
23932
+ }
23933
+ const problemRows = issueRows.filter((row) => row.status === "blocked" || row.status === "failed");
23934
+ if (problemRows.length === 0) continue;
23935
+ const representative = problemRows.reduce((latest, row) => row.id > latest.id ? row : latest);
23936
+ const project = deps.resolveProject(issueId);
23937
+ if (!project) throw new Error(`project resolution failed for ${issueId}`);
23938
+ const artifactUrl = normalizeArtifactUrl(representative.prUrl);
23939
+ const artifactRepo = deps.getMergeSet(issueId)?.repos.find((repo) => repo.forge === representative.forge && repo.artifactUrl !== void 0 && normalizeArtifactUrl(repo.artifactUrl) === artifactUrl);
23940
+ forgeCandidates.push({
23941
+ issueId,
23942
+ problemRows,
23943
+ representative,
23944
+ artifactRepo,
23945
+ projectPath: project.projectPath
23946
+ });
23947
+ } catch (error) {
23948
+ autoMergeReconcileCooldowns.set(issueId, now + AUTO_MERGE_RECONCILE_COOLDOWN_MS);
23949
+ deps.warn(`[deacon] Auto-merge row reconciliation failed for ${issueId}: ${error instanceof Error ? error.message : String(error)}`);
23950
+ }
23951
+ }
23952
+ forgeCandidates.sort((left, right) => {
23953
+ return (autoMergeLastCheckedAt.get(left.issueId) ?? 0) - (autoMergeLastCheckedAt.get(right.issueId) ?? 0) || left.representative.id - right.representative.id;
23954
+ });
23955
+ const batch = forgeCandidates.slice(0, 4);
23956
+ const reconciled = await Promise.all(batch.map((candidate) => reconcileForgeCandidate(candidate, deps, now)));
23957
+ for (const candidateActions of reconciled) actions.push(...candidateActions);
23958
+ return actions;
23959
+ }
23960
+ async function reconcileAutoMergeRows() {
23961
+ return reconcileAutoMergeRowsWithDeps({
23962
+ now: Date.now,
23963
+ listProblemAutoMerges,
23964
+ listActiveAutoMerges,
23965
+ cancelPending,
23966
+ markMerged,
23967
+ readJournalStatus: readJournalStatusSync,
23968
+ getMergeSet: getMergeSetSync,
23969
+ resolveProject: resolveProjectFromIssueSync,
23970
+ getForgeAdapter,
23971
+ log: (message) => console.log(message),
23972
+ warn: (message) => console.warn(message)
23973
+ });
23974
+ }
23975
+ //#endregion
23829
23976
  //#region ../../lib/cloister/deacon-merge.ts
23830
23977
  init_paths();
23831
23978
  init_activity_logger();
@@ -23836,7 +23983,7 @@ init_tracker_utils();
23836
23983
  init_merge_set();
23837
23984
  init_tmux();
23838
23985
  init_config$1();
23839
- const execAsync$2 = promisify$1(exec);
23986
+ const execAsync$3 = promisify$1(exec);
23840
23987
  const execFileAsync$4 = promisify$1(execFile);
23841
23988
  const ciRetryMap = /* @__PURE__ */ new Map();
23842
23989
  const MERGE_READY_REMINDER_MS = 3600 * 1e3;
@@ -23926,7 +24073,7 @@ async function reconcileStaleMergeStatus() {
23926
24073
  ].includes(status.mergeStatus ?? "") || ["merging", "failed"].includes(mergeSet?.status ?? "");
23927
24074
  let specStatus;
23928
24075
  try {
23929
- const { findSpecByIssue } = await import("./specs-Bt7WJDoC.js");
24076
+ const { findSpecByIssue } = await import("./specs--enInima.js");
23930
24077
  const spec = await Effect.runPromise(findSpecByIssue(project.projectPath, issueId));
23931
24078
  specStatus = spec?.status;
23932
24079
  if (spec && (spec.status === "completed" || spec.status === "cancelled")) {
@@ -23936,7 +24083,7 @@ async function reconcileStaleMergeStatus() {
23936
24083
  } catch {}
23937
24084
  const branch = `feature/${issueId.toLowerCase()}`;
23938
24085
  if (postMergeIncomplete) {
23939
- const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-DbO10pum.js");
24086
+ const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-8HIeS_J6.js");
23940
24087
  const action = enqueuePostMergeLifecycle(issueId, project.projectPath, branch);
23941
24088
  if (action) actions.push(action);
23942
24089
  continue;
@@ -23948,7 +24095,7 @@ async function reconcileStaleMergeStatus() {
23948
24095
  } catch {}
23949
24096
  if (!isMerged) isMerged = (await observeGitHubBranchMerge(issueId, branch, project.projectPath)).merged;
23950
24097
  if (shouldObserveForge && mergeRelevant) try {
23951
- const observation = await (await import("./merge-completeness-D0ljXbk3.js")).observeForgeMergeState(issueId);
24098
+ const observation = await (await import("./merge-completeness-BLbB5-6n.js")).observeForgeMergeState(issueId);
23952
24099
  const blocker = observation.repos.find((repo) => repo.state === "unverifiable");
23953
24100
  if (blocker) {
23954
24101
  console.warn(`[deacon] ${issueId}: forge merge state is unverifiable — ${blocker.reason}`);
@@ -23975,7 +24122,7 @@ async function reconcileStaleMergeStatus() {
23975
24122
  const msg = `Reconciled stale mergeStatus for ${issueId} — branch ${branch} is merged to main`;
23976
24123
  actions.push(msg);
23977
24124
  console.log(`[deacon] ${msg}`);
23978
- const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-DbO10pum.js");
24125
+ const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-8HIeS_J6.js");
23979
24126
  const action = enqueuePostMergeLifecycle(issueId, project.projectPath, branch);
23980
24127
  if (action) actions.push(action);
23981
24128
  }
@@ -23998,7 +24145,7 @@ const falseMergedReset = /* @__PURE__ */ new Set();
23998
24145
  async function reconcileFalseMerged() {
23999
24146
  const actions = [];
24000
24147
  try {
24001
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-DtAsvwzK.js");
24148
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-Bmg4R9mv.js");
24002
24149
  if (!isGitHubAppConfigured()) return actions;
24003
24150
  const statuses = loadReviewStatuses();
24004
24151
  for (const [issueId, status] of Object.entries(statuses)) {
@@ -24043,7 +24190,7 @@ const CLOSED_PR_RECONCILE_COOLDOWN_MS = 600 * 1e3;
24043
24190
  async function reconcileClosedPrReadyForMerge() {
24044
24191
  const actions = [];
24045
24192
  try {
24046
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-DtAsvwzK.js");
24193
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-Bmg4R9mv.js");
24047
24194
  if (!isGitHubAppConfigured()) return actions;
24048
24195
  const statuses = loadReviewStatuses();
24049
24196
  const now = Date.now();
@@ -24115,7 +24262,7 @@ const STALE_MERGE_BLOCKER_COOLDOWN_MS = 120 * 1e3;
24115
24262
  async function reconcileStaleMergeBlockers() {
24116
24263
  const actions = [];
24117
24264
  try {
24118
- const { resolveConflictGate, buildRealConflictGateDeps } = await import("./conflict-gate-Dh754uyA.js");
24265
+ const { resolveConflictGate, buildRealConflictGateDeps } = await import("./conflict-gate-CX80JYYS.js");
24119
24266
  const statuses = loadReviewStatuses();
24120
24267
  const now = Date.now();
24121
24268
  const deps = buildRealConflictGateDeps();
@@ -24258,7 +24405,7 @@ async function checkFailedMergeRetry() {
24258
24405
  if (ciEntry.count === 5) {
24259
24406
  console.log(`[deacon] CI check failure for ${issueId} — retries exhausted, notifying work agent`);
24260
24407
  const ciNotes = status.mergeNotes || "CI checks are failing on the PR";
24261
- const { writeFeedbackFile } = await import("./feedback-writer-D1fm-5Z8.js");
24408
+ const { writeFeedbackFile } = await import("./feedback-writer-CoB9Z6aU.js");
24262
24409
  const ciFileResult = await Effect.runPromise(writeFeedbackFile({
24263
24410
  issueId,
24264
24411
  specialist: "merge-agent",
@@ -24290,7 +24437,7 @@ async function checkFailedMergeRetry() {
24290
24437
  ciRetryMap.set(issueId, ciEntry);
24291
24438
  console.log(`[deacon] CI check failure for ${issueId} — notifying agent to re-submit (attempt ${ciEntry.count}/5)`);
24292
24439
  const ciNotes = status.mergeNotes || "CI checks are failing on the PR";
24293
- const { writeFeedbackFile } = await import("./feedback-writer-D1fm-5Z8.js");
24440
+ const { writeFeedbackFile } = await import("./feedback-writer-CoB9Z6aU.js");
24294
24441
  const ciFileResult2 = await Effect.runPromise(writeFeedbackFile({
24295
24442
  issueId,
24296
24443
  specialist: "merge-agent",
@@ -24318,7 +24465,7 @@ async function checkFailedMergeRetry() {
24318
24465
  const lastNudge = timeoutNudgeCooldowns.get(issueIdForFb);
24319
24466
  if (!lastNudge || now - lastNudge >= TIMEOUT_NUDGE_COOLDOWN_MS) {
24320
24467
  const timeoutNotes = status.mergeNotes;
24321
- const { writeFeedbackFile } = await import("./feedback-writer-D1fm-5Z8.js");
24468
+ const { writeFeedbackFile } = await import("./feedback-writer-CoB9Z6aU.js");
24322
24469
  await Effect.runPromise(writeFeedbackFile({
24323
24470
  issueId: issueIdForFb,
24324
24471
  specialist: "merge-agent",
@@ -24423,7 +24570,7 @@ async function autoCloseOut(now = /* @__PURE__ */ new Date()) {
24423
24570
  } } : {}
24424
24571
  };
24425
24572
  try {
24426
- const { closeOut } = await import("./workflows-CHrx_hcW.js");
24573
+ const { closeOut } = await import("./workflows-DtDX08ed.js");
24427
24574
  const result = await Effect.runPromise(closeOut(ctx));
24428
24575
  if (!result.success) {
24429
24576
  const failed = result.steps.find((step) => !step.success && !step.skipped);
@@ -24509,13 +24656,13 @@ async function checkFirstCompletionAgents() {
24509
24656
  if (!agentState?.workspace || !existsSync(agentState.workspace)) continue;
24510
24657
  let hasCommits = false;
24511
24658
  try {
24512
- const { stdout: gitLog } = await execAsync$2("git log --oneline -3 2>/dev/null", { cwd: agentState.workspace });
24659
+ const { stdout: gitLog } = await execAsync$3("git log --oneline -3 2>/dev/null", { cwd: agentState.workspace });
24513
24660
  hasCommits = gitLog.trim().length > 0;
24514
24661
  } catch {
24515
24662
  try {
24516
24663
  const subdirs = readdirSync(agentState.workspace, { withFileTypes: true }).filter((d) => d.isDirectory() && !d.name.startsWith("."));
24517
24664
  for (const sub of subdirs) try {
24518
- const { stdout: subLog } = await execAsync$2("git log --oneline -3 2>/dev/null", { cwd: join$1(agentState.workspace, sub.name) });
24665
+ const { stdout: subLog } = await execAsync$3("git log --oneline -3 2>/dev/null", { cwd: join$1(agentState.workspace, sub.name) });
24519
24666
  if (subLog.trim().length > 0) {
24520
24667
  hasCommits = true;
24521
24668
  break;
@@ -24736,7 +24883,7 @@ async function checkPostReviewCommits() {
24736
24883
  const actions = [];
24737
24884
  try {
24738
24885
  const statuses = loadReviewStatuses();
24739
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
24886
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
24740
24887
  for (const [issueId, status] of Object.entries(statuses)) {
24741
24888
  const isBlocked = status.reviewStatus === "blocked";
24742
24889
  if (!isBlocked) blockedReviewDriftObservations.delete(issueId);
@@ -24766,8 +24913,8 @@ async function checkPostReviewCommits() {
24766
24913
  if (!project) continue;
24767
24914
  const workspacePath = join$1(project.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
24768
24915
  if (!existsSync(workspacePath)) continue;
24769
- const { formatAnchorShort, rehydrateHeadAnchor } = await import("./git-utils-CI6cwyyC.js");
24770
- const { evaluateWorkspaceAnchorDrift } = await import("./workspace-anchor-drift-B4gMRHl4.js");
24916
+ const { formatAnchorShort, rehydrateHeadAnchor } = await import("./git-utils-Xg4PFN45.js");
24917
+ const { evaluateWorkspaceAnchorDrift } = await import("./workspace-anchor-drift-pwz23TI1.js");
24771
24918
  const verdict = await evaluateWorkspaceAnchorDrift(issueId, workspacePath, rehydrateHeadAnchor(reviewedAnchor));
24772
24919
  if (verdict.kind === "unreadable" || verdict.kind === "current") {
24773
24920
  blockedReviewDriftObservations.delete(issueId);
@@ -24817,7 +24964,7 @@ async function checkPostReviewCommits() {
24817
24964
  actions.push(`Deferred post-review re-dispatch for ${issueId} — advancing-role concurrency ceiling reached`);
24818
24965
  logDeaconEventSync(`checkPostReviewCommits: deferred review for ${issueId} — advancing ceiling reached (PAN-1665) — ${describeRunningAgents()}`);
24819
24966
  } else if (freshStatus?.reviewStatus === "pending") {
24820
- const { spawnReviewRoleForIssue } = await import("./review-agent-CD4RCI0Y.js");
24967
+ const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
24821
24968
  const branch = `feature/${issueId.toLowerCase()}`;
24822
24969
  const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
24823
24970
  issueId,
@@ -25198,7 +25345,7 @@ function reviewConvoyLiveness(issueId) {
25198
25345
  */
25199
25346
  async function recoverUnhealthyTestStack(issueId, workspacePath) {
25200
25347
  const key = issueId.toUpperCase();
25201
- const { getWorkspaceStackHealth } = await import("./stack-health-CJLMrLBl.js");
25348
+ const { getWorkspaceStackHealth } = await import("./stack-health-BikqHSjn.js");
25202
25349
  const health = await Effect.runPromise(getWorkspaceStackHealth(issueId, { workspacePath }));
25203
25350
  if (health.healthy) {
25204
25351
  testStackRebuildState.delete(key);
@@ -25230,7 +25377,7 @@ async function recoverUnhealthyTestStack(issueId, workspacePath) {
25230
25377
  record.attempts += 1;
25231
25378
  testStackRebuildState.set(key, record);
25232
25379
  console.log(`[deacon] Test stack for ${key} unhealthy (${health.reasons.join("; ")}) — rebuilding (attempt ${record.attempts}/${TEST_STACK_REBUILD_MAX_ATTEMPTS})`);
25233
- const { rebuildWorkspaceStack } = await import("./rebuild-stack-qeRqHZxH.js");
25380
+ const { rebuildWorkspaceStack } = await import("./rebuild-stack-DqcOVmJO.js");
25234
25381
  const result = await Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[deacon] ${key} stack rebuild: ${m}`) }));
25235
25382
  if (!result.success) {
25236
25383
  console.warn(`[deacon] Test stack rebuild failed for ${key}: ${result.error}`);
@@ -25398,7 +25545,7 @@ async function handleReviewCoordinatorDied(issueId, _sessionName, _reason) {
25398
25545
  return actions;
25399
25546
  }
25400
25547
  try {
25401
- const { spawnReviewRoleForIssue } = await import("./review-agent-CD4RCI0Y.js");
25548
+ const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
25402
25549
  const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
25403
25550
  issueId,
25404
25551
  workspace,
@@ -25473,7 +25620,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
25473
25620
  const issueLower = issueId.toLowerCase();
25474
25621
  const workspace = getAgentStateSync(`agent-${issueLower}`)?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
25475
25622
  if (workspace) try {
25476
- if ((options.readWorkspaceHead ? await options.readWorkspaceHead(workspace) : await (await import("./git-utils-CI6cwyyC.js")).snapshotWorkspaceHeadsPromise(issueId, workspace)) === status.lastVerifiedCommit) {
25623
+ if ((options.readWorkspaceHead ? await options.readWorkspaceHead(workspace) : await (await import("./git-utils-Xg4PFN45.js")).snapshotWorkspaceHeadsPromise(issueId, workspace)) === status.lastVerifiedCommit) {
25477
25624
  setReviewStatusSync(issueId, {
25478
25625
  reviewStatus: "pending",
25479
25626
  reviewNotes: void 0
@@ -25495,7 +25642,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
25495
25642
  if (project) {
25496
25643
  const workspacePath = join$1(project.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
25497
25644
  if (existsSync(workspacePath)) {
25498
- const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-CI6cwyyC.js");
25645
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Xg4PFN45.js");
25499
25646
  reviewUpdate["reviewedAtCommit"] = await snapshotWorkspaceHeadsPromise(issueId, workspacePath);
25500
25647
  }
25501
25648
  }
@@ -25550,7 +25697,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
25550
25697
  const workspace = agentState?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
25551
25698
  if (workspace && resolved && !tryReserveAdvancingSlot() && !await tryYieldForAdvancingDispatch("review", issueId)) actions.push(`Deferred review re-dispatch for ${issueId} — advancing-role concurrency ceiling reached`);
25552
25699
  else if (workspace && resolved) try {
25553
- const { spawnReviewRoleForIssue } = await import("./review-agent-CD4RCI0Y.js");
25700
+ const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
25554
25701
  const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
25555
25702
  issueId,
25556
25703
  workspace,
@@ -25575,8 +25722,8 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
25575
25722
  const workspace = agentState?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
25576
25723
  if (workspace && resolved) {
25577
25724
  const branch = `feature/${issueLower}`;
25578
- const { spawnRun } = await import("./agents-BKKkxKgK.js");
25579
- const { buildTestRolePrompt } = await import("./test-agent-queue-qakFIIGz.js");
25725
+ const { spawnRun } = await import("./agents-ePFVoZbu.js");
25726
+ const { buildTestRolePrompt } = await import("./test-agent-queue-A_-p-i0I.js");
25580
25727
  const stackRecovery = await recoverUnhealthyTestStack(issueId, workspace);
25581
25728
  if (stackRecovery === "cooldown" || stackRecovery === "exhausted") {
25582
25729
  setReviewStatusSync(issueId, { testStatus: "dispatch_failed" });
@@ -25592,7 +25739,8 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
25592
25739
  issueId,
25593
25740
  workspace,
25594
25741
  branch
25595
- })
25742
+ }),
25743
+ startedBy: "deacon:orphan-test-recovery"
25596
25744
  });
25597
25745
  testStackRebuildState.delete(issueId.toUpperCase());
25598
25746
  setReviewStatusSync(issueId, { testStatus: "testing" });
@@ -25714,7 +25862,7 @@ async function recoverStalledReviewConvoys(getCanonicalState = getAutoCloseOutCa
25714
25862
  record.lastAttempt = now;
25715
25863
  record.attempts += 1;
25716
25864
  stalledReviewConvoyRecoveryState.set(key, record);
25717
- const { spawnReviewRoleForIssue } = await import("./review-agent-CD4RCI0Y.js");
25865
+ const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
25718
25866
  try {
25719
25867
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
25720
25868
  issueId,
@@ -25785,7 +25933,7 @@ async function checkMissingReviewStatuses() {
25785
25933
  continue;
25786
25934
  }
25787
25935
  try {
25788
- const { spawnReviewRoleForIssue } = await import("./review-agent-CD4RCI0Y.js");
25936
+ const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
25789
25937
  await Effect.runPromise(spawnReviewRoleForIssue({
25790
25938
  issueId,
25791
25939
  workspace,
@@ -25836,7 +25984,7 @@ async function checkStuckReviewing() {
25836
25984
  const actions = [];
25837
25985
  const REVIEW_STUCK_THRESHOLD_MS = 1800 * 1e3;
25838
25986
  try {
25839
- const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-BZH8h-6W.js");
25987
+ const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
25840
25988
  const statuses = loadReviewStatuses();
25841
25989
  const now = Date.now();
25842
25990
  const activeReviewIssues = /* @__PURE__ */ new Set();
@@ -25981,7 +26129,7 @@ async function checkCompletedButUnsignaledReviews() {
25981
26129
  }
25982
26130
  const nudge = `Your review synthesis is already written and saved. Your ONLY remaining task is to execute this Bash command immediately — do not analyze, do not summarize, do not ask questions, just run it:\n\n${`pan admin specialists done review ${issueId} --status ${verdict}${verdict === "blocked" || verdict === "failed" ? ` --notes "${topBlocker || "See synthesis.md"}"` : ""} --run-id "${basename$1(latestDir)}"`}\n\nRun this command NOW. Do not write any other response before executing it.`;
25983
26131
  try {
25984
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
26132
+ const { messageAgent } = await import("./agents-ePFVoZbu.js");
25985
26133
  await messageAgent(reviewSession, nudge);
25986
26134
  unsignaledReviewNudges.set(latestDir, now);
25987
26135
  actions.push(`Nudged ${reviewSession} to signal ${verdict} (synthesis written ${Math.round((now - latestMtime) / 6e4)}min ago)`);
@@ -26018,19 +26166,6 @@ init_codex_auth();
26018
26166
  const REVIEWER_IDLE_FAILURE_MS = 180 * 1e3;
26019
26167
  const REVIEW_REPORTS_PRESENT_NUDGE_COOLDOWN_MS = 60 * 1e3;
26020
26168
  const reviewReportsPresentNudges = /* @__PURE__ */ new Map();
26021
- function extractMarkdownSection(markdown, heading) {
26022
- const pattern = new RegExp(`^##\\s+${heading}\\s*\\r?\\n([\\s\\S]*?)(?=^##\\s+|(?![\\s\\S]))`, "im");
26023
- return markdown.match(pattern)?.[1]?.trim() ?? "";
26024
- }
26025
- function findBlockingFindings(markdown) {
26026
- const findings = extractMarkdownSection(markdown, "Findings");
26027
- if (!findings || /^none\.?$/i.test(findings)) return [];
26028
- const blockers = [];
26029
- const headingPattern = /^###\s*(?:!|⊗)\s+(.+)$/gm;
26030
- let match;
26031
- while ((match = headingPattern.exec(findings)) !== null) blockers.push(match[1].trim());
26032
- return blockers;
26033
- }
26034
26169
  function synthesizeReviewFromReports(opts) {
26035
26170
  const blockers = opts.reports.flatMap((report) => findBlockingFindings(report.body).map((title) => ({
26036
26171
  subRole: report.subRole,
@@ -26103,7 +26238,7 @@ async function respawnIdleReviewer(state, agentId) {
26103
26238
  return false;
26104
26239
  }
26105
26240
  try {
26106
- const { spawnReviewSubRoleForIssue } = await import("./review-agent-CD4RCI0Y.js");
26241
+ const { spawnReviewSubRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
26107
26242
  const contextManifestPath = join$1(dirname$1(outputPath), "context.json");
26108
26243
  const result = await Effect.runPromise(spawnReviewSubRoleForIssue({
26109
26244
  issueId: state.issueId,
@@ -26189,7 +26324,7 @@ async function nudgeSynthesisForCompleteReviewerReports(states) {
26189
26324
  writeFileSync(join$1(reviewDir, "synthesis.md"), synthesis.body);
26190
26325
  let fallbackHead;
26191
26326
  try {
26192
- const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-CI6cwyyC.js");
26327
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Xg4PFN45.js");
26193
26328
  fallbackHead = await snapshotWorkspaceHeadsPromise(state.issueId, state.workspace);
26194
26329
  } catch {}
26195
26330
  const anchoredVerdicts = Object.fromEntries(Object.entries(synthesis.reviewerVerdicts).map(([subRole, v]) => [subRole, {
@@ -26228,7 +26363,7 @@ async function nudgeSynthesisForCompleteReviewerReports(states) {
26228
26363
  "Read the four reports, write synthesis.md, then signal review status exactly as roles/review.md instructs."
26229
26364
  ].join("\n");
26230
26365
  try {
26231
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
26366
+ const { messageAgent } = await import("./agents-ePFVoZbu.js");
26232
26367
  await messageAgent(state.id, message);
26233
26368
  reviewReportsPresentNudges.set(nudgeKey, now);
26234
26369
  const action = `Nudged ${state.id} to synthesize from ${REVIEW_SUB_ROLES.length} reviewer reports`;
@@ -26314,7 +26449,7 @@ async function monitorReviewConvoySignals() {
26314
26449
  if (!signal) continue;
26315
26450
  const message = signal === "ready" ? `REVIEWER_READY ${state.reviewSubRole} ${outputPath}` : signal === "timeout" ? `REVIEWER_TIMEOUT ${state.reviewSubRole} ${reason}` : `REVIEWER_FAILED ${state.reviewSubRole} ${reason}`;
26316
26451
  try {
26317
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
26452
+ const { messageAgent } = await import("./agents-ePFVoZbu.js");
26318
26453
  await messageAgent(state.reviewSynthesisAgentId, message);
26319
26454
  state.reviewMonitorSignaled = signal;
26320
26455
  saveAgentStateSync(state);
@@ -26322,7 +26457,7 @@ async function monitorReviewConvoySignals() {
26322
26457
  actions.push(action);
26323
26458
  logDeaconEventSync(`monitorReviewConvoySignals: ${action}`);
26324
26459
  if (signal === "ready") try {
26325
- const { notifyPipelineSync } = await import("./pipeline-notifier-ImNXknf0.js");
26460
+ const { notifyPipelineSync } = await import("./pipeline-notifier-DT6xLFao.js");
26326
26461
  notifyPipelineSync({
26327
26462
  type: "reviewer_completed",
26328
26463
  issueId: state.issueId,
@@ -26330,7 +26465,7 @@ async function monitorReviewConvoySignals() {
26330
26465
  });
26331
26466
  } catch {}
26332
26467
  else if (signal === "timeout") try {
26333
- const { notifyPipelineSync } = await import("./pipeline-notifier-ImNXknf0.js");
26468
+ const { notifyPipelineSync } = await import("./pipeline-notifier-DT6xLFao.js");
26334
26469
  notifyPipelineSync({
26335
26470
  type: "reviewer_timed_out",
26336
26471
  issueId: state.issueId,
@@ -26430,7 +26565,7 @@ const FORK_CACHE_CHECK_DELAY_MS = 180 * 1e3;
26430
26565
  async function checkStalledReviewDiscovery() {
26431
26566
  const actions = [];
26432
26567
  try {
26433
- const { listAgentStates } = await import("./agents-BKKkxKgK.js");
26568
+ const { listAgentStates } = await import("./agents-ePFVoZbu.js");
26434
26569
  const states = listAgentStates();
26435
26570
  const now = Date.now();
26436
26571
  for (const state of states) {
@@ -26439,7 +26574,7 @@ async function checkStalledReviewDiscovery() {
26439
26574
  const aged = Number.isFinite(startedMs) && now - startedMs > 48e4;
26440
26575
  const dead = !await Effect.runPromise(sessionExists(state.id)).catch(() => false) || await Effect.runPromise(isPaneDead(state.id)).catch(() => true);
26441
26576
  if (!aged && !dead) continue;
26442
- const { handleReviewDiscoveryReady } = await import("./review-agent-CD4RCI0Y.js");
26577
+ const { handleReviewDiscoveryReady } = await import("./review-agent-BTCNkq2h.js");
26443
26578
  const result = await handleReviewDiscoveryReady(state.issueId, { source: dead ? "deacon-backstop (parent dead)" : "deacon-backstop (discovery timeout)" });
26444
26579
  actions.push(result.message);
26445
26580
  logDeaconEventSync(`checkStalledReviewDiscovery: ${result.message}`);
@@ -26462,8 +26597,8 @@ async function checkStalledReviewDiscovery() {
26462
26597
  async function checkStalledReviewParents() {
26463
26598
  const actions = [];
26464
26599
  try {
26465
- const { listAgentStates, markAgentStoppedState } = await import("./agents-BKKkxKgK.js");
26466
- const { PARENT_REVIEW_TIMEOUT_MS } = await import("./review-agent-CD4RCI0Y.js");
26600
+ const { listAgentStates, markAgentStoppedState } = await import("./agents-ePFVoZbu.js");
26601
+ const { PARENT_REVIEW_TIMEOUT_MS } = await import("./review-agent-BTCNkq2h.js");
26467
26602
  const states = listAgentStates();
26468
26603
  const now = Date.now();
26469
26604
  for (const state of states) {
@@ -26512,8 +26647,8 @@ async function checkStalledReviewParents() {
26512
26647
  async function checkReviewForkCacheMisses() {
26513
26648
  const actions = [];
26514
26649
  try {
26515
- const { listAgentStates, saveAgentState } = await import("./agents-BKKkxKgK.js");
26516
- const { readEventsSync } = await import("./events-D6pyqhzM.js");
26650
+ const { listAgentStates, saveAgentState } = await import("./agents-ePFVoZbu.js");
26651
+ const { readEventsSync } = await import("./events-CF8QDbuV.js");
26517
26652
  const { emitActivityEntrySync } = await import("./activity-logger-CMthG6Vd.js");
26518
26653
  const states = listAgentStates();
26519
26654
  const now = Date.now();
@@ -26560,8 +26695,213 @@ async function checkReviewForkCacheMisses() {
26560
26695
  return actions;
26561
26696
  }
26562
26697
  //#endregion
26698
+ //#region ../../lib/cloister/branch-invalidation.ts
26699
+ /**
26700
+ * PAN-3154: notify the pipeline when a merge to main invalidates open branches.
26701
+ *
26702
+ * Watches each project's origin/main head SHA on a cooldown; when it moves,
26703
+ * probes every in-pipeline branch of that project for newly-created conflicts
26704
+ * and marks them with a merge_conflict blocker + conflictsSince, so the
26705
+ * existing conflict-gate machinery (review-dispatch defer, resolver dispatch,
26706
+ * dashboard stuckReason) picks them up without further work.
26707
+ */
26708
+ init_activity_logger();
26709
+ init_agents();
26710
+ init_messaging();
26711
+ init_review_status();
26712
+ init_projects();
26713
+ init_pipeline_membership_gather();
26714
+ init_pipeline_membership();
26715
+ init_conflict_gate();
26716
+ init_feedback_target();
26717
+ const execAsync$2 = promisify(exec);
26718
+ const GIT_TIMEOUT_MS = 3e4;
26719
+ const GIT_MAX_BUFFER = 4 * 1024 * 1024;
26720
+ const PROJECT_COOLDOWN_MS = 120 * 1e3;
26721
+ const projectCooldowns = /* @__PURE__ */ new Map();
26722
+ async function lsRemoteMainShaReal(projectPath) {
26723
+ const options = {
26724
+ cwd: projectPath,
26725
+ encoding: "utf-8",
26726
+ timeout: GIT_TIMEOUT_MS,
26727
+ maxBuffer: GIT_MAX_BUFFER
26728
+ };
26729
+ try {
26730
+ const { stdout } = await execAsync$2("git ls-remote origin refs/heads/main", options);
26731
+ const sha = String(stdout).trim().split(/\s+/)[0];
26732
+ return sha && /^[0-9a-f]{7,40}$/i.test(sha) ? sha : null;
26733
+ } catch {
26734
+ return null;
26735
+ }
26736
+ }
26737
+ function buildRealBranchInvalidationDeps() {
26738
+ return {
26739
+ listProjects: () => Object.entries(loadProjectsConfigSync().projects).map(([projectKey, projectConfig]) => ({
26740
+ projectKey,
26741
+ projectPath: resolveProjectPath(projectConfig),
26742
+ projectConfig
26743
+ })),
26744
+ gatherPipelineMembership: (projectConfig) => gatherProjectLensSignals(projectConfig).then((signals) => signals.map(resolvePipelineMembership)),
26745
+ listAgentWorkspaces: listAllAgentsSync,
26746
+ existsSync: existsSync$1,
26747
+ readdirSync: (path) => readdirSync$1(path),
26748
+ getSetting,
26749
+ setSetting,
26750
+ getReviewStatus: getReviewStatusSync,
26751
+ setReviewStatus: setReviewStatusSync,
26752
+ emitActivityEntry: emitActivityEntrySync,
26753
+ lsRemoteMainSha: lsRemoteMainShaReal,
26754
+ probeConflictPaths: (workspacePath, targetBranch) => probeBranchConflictPaths(workspacePath, targetBranch),
26755
+ resolveFeedbackTarget: resolveIssueFeedbackTarget,
26756
+ messageAgent: (agentId, message, caller) => messageAgent(agentId, message, caller),
26757
+ now: () => Date.now()
26758
+ };
26759
+ }
26760
+ /**
26761
+ * Resolve an issue's workspace: prefer the agents-table workspace column (fast,
26762
+ * covers -strike/-slot-N by construction), else the first existing
26763
+ * `feature-<issueLower>*` directory (prefix scan; a plain `feature-<issueLower>`
26764
+ * sorts before any `-strike`/`-slot-N` suffix). Agent-table rows and the
26765
+ * workspaces-directory listing are preloaded once per project sweep by the
26766
+ * caller — this function does no I/O beyond the `existsSync` check.
26767
+ */
26768
+ function resolveWorkspacePath(deps, agentWorkspaces, workspacesDirEntries, projectPath, issueId) {
26769
+ const upperIssueId = issueId.toUpperCase();
26770
+ const agentWorkspace = agentWorkspaces.find((a) => a.issueId.toUpperCase() === upperIssueId)?.workspace;
26771
+ if (agentWorkspace && deps.existsSync(agentWorkspace)) return agentWorkspace;
26772
+ const prefix = `feature-${issueId.toLowerCase()}`;
26773
+ const matches = workspacesDirEntries.filter((name) => name === prefix || name.startsWith(`${prefix}-`)).sort();
26774
+ if (matches.length === 0) return null;
26775
+ return join(projectPath, "workspaces", matches[0]);
26776
+ }
26777
+ function formatPathSummary(paths) {
26778
+ const shown = paths.slice(0, 3).join(", ");
26779
+ return paths.length > 3 ? `${shown}, …` : shown;
26780
+ }
26781
+ /**
26782
+ * Notify the live owning agent that main moved and now conflicts with its
26783
+ * branch. Skips silently when no agent is live (needsYou) — the blocker plus
26784
+ * the existing conflict-resolver dispatch already cover stopped agents; this
26785
+ * is not a second nudge channel.
26786
+ */
26787
+ async function notifyBranchInvalidated(deps, issueId, info) {
26788
+ const target = await deps.resolveFeedbackTarget(issueId);
26789
+ if ("needsYou" in target) return;
26790
+ const message = [
26791
+ `main moved: merge ${info.sha.slice(0, 7)} now conflicts with your branch in: ${info.paths.join(", ")}.`,
26792
+ `Rebase onto the new main NOW while the conflict is small — run \`pan sync-main ${issueId}\`,`,
26793
+ "resolve preserving BOTH intents, then continue your current task."
26794
+ ].join(" ");
26795
+ await deps.messageAgent(target.agentId, message, "internal");
26796
+ }
26797
+ async function sweepProject(deps, project, nowMs, actions) {
26798
+ const { projectKey, projectPath, projectConfig } = project;
26799
+ const newSha = await deps.lsRemoteMainSha(projectPath);
26800
+ if (!newSha) return;
26801
+ const settingKey = `branch_invalidation.main_head.${projectKey}`;
26802
+ const lastSha = deps.getSetting(settingKey);
26803
+ if (lastSha === newSha) return;
26804
+ if (lastSha === null) {
26805
+ deps.setSetting(settingKey, newSha);
26806
+ return;
26807
+ }
26808
+ let memberships;
26809
+ try {
26810
+ memberships = await deps.gatherPipelineMembership(projectConfig);
26811
+ } catch (membershipErr) {
26812
+ console.warn(`[deacon] reconcileBranchInvalidation: ${projectKey} membership gather failed: ${membershipErr instanceof Error ? membershipErr.message : String(membershipErr)}`);
26813
+ return;
26814
+ }
26815
+ const issueIds = memberships.filter((m) => m.inPipeline).map((m) => m.issueId);
26816
+ const shortSha = newSha.slice(0, 7);
26817
+ const newlyMarkedIssueIds = [];
26818
+ let hadUnknownProbe = false;
26819
+ const agentWorkspaces = deps.listAgentWorkspaces();
26820
+ const workspacesDir = join(projectPath, "workspaces");
26821
+ const workspacesDirEntries = deps.existsSync(workspacesDir) ? deps.readdirSync(workspacesDir) : [];
26822
+ for (const issueId of issueIds) {
26823
+ const workspacePath = resolveWorkspacePath(deps, agentWorkspaces, workspacesDirEntries, projectPath, issueId);
26824
+ if (!workspacePath) continue;
26825
+ const probe = await deps.probeConflictPaths(workspacePath, "main");
26826
+ if (probe.mergeability === "unknown") {
26827
+ hadUnknownProbe = true;
26828
+ continue;
26829
+ }
26830
+ if (probe.mergeability !== "conflicts") continue;
26831
+ const freshStatus = deps.getReviewStatus(issueId);
26832
+ if (freshStatus?.mergeStatus === "merged") continue;
26833
+ if (freshStatus?.conflictsSince?.sha === newSha) continue;
26834
+ const detectedAt = new Date(nowMs).toISOString();
26835
+ const nonMergeBlockers = (freshStatus?.blockerReasons ?? []).filter((b) => b.type !== "merge_conflict" && b.type !== "not_mergeable");
26836
+ const mergeConflictBlocker = {
26837
+ type: "merge_conflict",
26838
+ summary: `Conflicts with main since ${shortSha} (${probe.paths.length} path${probe.paths.length === 1 ? "" : "s"}): ${formatPathSummary(probe.paths)}`,
26839
+ detectedAt
26840
+ };
26841
+ deps.setReviewStatus(issueId, {
26842
+ conflictsSince: {
26843
+ sha: newSha,
26844
+ detectedAt,
26845
+ paths: probe.paths
26846
+ },
26847
+ blockerReasons: [...nonMergeBlockers, mergeConflictBlocker]
26848
+ }, freshStatus ?? void 0);
26849
+ deps.emitActivityEntry({
26850
+ source: "cloister",
26851
+ level: "warn",
26852
+ issueId,
26853
+ message: `main moved: ${issueId} now conflicts with main (${shortSha}) in ${formatPathSummary(probe.paths)}`
26854
+ });
26855
+ try {
26856
+ await notifyBranchInvalidated(deps, issueId, {
26857
+ sha: newSha,
26858
+ paths: probe.paths
26859
+ });
26860
+ } catch (notifyErr) {
26861
+ console.warn(`[deacon] reconcileBranchInvalidation: ${issueId} notify failed: ${notifyErr instanceof Error ? notifyErr.message : String(notifyErr)}`);
26862
+ }
26863
+ newlyMarkedIssueIds.push(issueId);
26864
+ actions.push(`Marked ${issueId} conflicting with main since ${shortSha}`);
26865
+ }
26866
+ if (!hadUnknownProbe) deps.setSetting(settingKey, newSha);
26867
+ if (newlyMarkedIssueIds.length > 0) {
26868
+ const summaryMessage = `main ${shortSha} invalidated ${newlyMarkedIssueIds.length} branch(es): ${newlyMarkedIssueIds.join(", ")}`;
26869
+ deps.emitActivityEntry({
26870
+ source: "cloister",
26871
+ level: "warn",
26872
+ message: summaryMessage
26873
+ });
26874
+ actions.push(summaryMessage);
26875
+ }
26876
+ }
26877
+ /**
26878
+ * Deacon patrol reconciler (PAN-3154): fan out a conflict probe to every
26879
+ * in-pipeline branch of a project whenever that project's origin/main head
26880
+ * moves. Never throws — errors are logged and the patrol continues.
26881
+ */
26882
+ async function reconcileBranchInvalidation(deps = buildRealBranchInvalidationDeps()) {
26883
+ const actions = [];
26884
+ try {
26885
+ const nowMs = deps.now();
26886
+ const projects = deps.listProjects();
26887
+ for (const project of projects) {
26888
+ const cooledUntil = projectCooldowns.get(project.projectKey);
26889
+ if (cooledUntil && nowMs < cooledUntil) continue;
26890
+ projectCooldowns.set(project.projectKey, nowMs + PROJECT_COOLDOWN_MS);
26891
+ try {
26892
+ await sweepProject(deps, project, nowMs, actions);
26893
+ } catch (projectErr) {
26894
+ console.warn(`[deacon] reconcileBranchInvalidation: ${project.projectKey} sweep failed: ${projectErr instanceof Error ? projectErr.message : String(projectErr)}`);
26895
+ }
26896
+ }
26897
+ } catch (err) {
26898
+ console.warn(`[deacon] Error in reconcileBranchInvalidation: ${err instanceof Error ? err.message : String(err)}`);
26899
+ }
26900
+ return actions;
26901
+ }
26902
+ //#endregion
26563
26903
  //#region ../../lib/cloister/boot-reconciliation-predicates.ts
26564
- init_control_settings();
26904
+ init_label_reconciler();
26565
26905
  init_traefik_connect();
26566
26906
  init_no_resume_mode();
26567
26907
  init_agent_state();
@@ -26577,6 +26917,7 @@ function bootReconciliationSkipReason(agent) {
26577
26917
  }
26578
26918
  //#endregion
26579
26919
  //#region ../../lib/cloister/boot-reconciliation.ts
26920
+ init_control_settings();
26580
26921
  init_agents();
26581
26922
  init_persistent_logger();
26582
26923
  init_config$1();
@@ -26587,10 +26928,6 @@ let graceTimer = null;
26587
26928
  * the boot path wires the apply step.
26588
26929
  */
26589
26930
  let graceExpiryHook = null;
26590
- function hasCompletionMarker(workspace) {
26591
- if (!workspace) return false;
26592
- return existsSync$1(join(workspace, ".pan", "completed")) || existsSync$1(join(workspace, ".pan", "completed.processed"));
26593
- }
26594
26931
  function newestAgentTimestampMs(agent) {
26595
26932
  const timestamps = [
26596
26933
  agent.lastActivity,
@@ -26606,6 +26943,13 @@ function isRecentBootCandidate(agent) {
26606
26943
  if (!Number.isFinite(bootStartedAtMs) || newestTimestampMs == null) return false;
26607
26944
  return newestTimestampMs >= bootStartedAtMs - getBootReconciliationMaxCandidateAgeSeconds() * 1e3;
26608
26945
  }
26946
+ function isCleanShutdownBoot() {
26947
+ const state = getBootReconciliationState();
26948
+ const bootStartedAtMs = state.bootStartedAt == null ? NaN : Date.parse(state.bootStartedAt);
26949
+ const marker = getLastCleanShutdownAt();
26950
+ const markerMs = marker == null ? NaN : Date.parse(marker);
26951
+ return Number.isFinite(bootStartedAtMs) && Number.isFinite(markerMs) && bootStartedAtMs - markerMs <= 18e5;
26952
+ }
26609
26953
  function getBootReconciliationGraceSeconds() {
26610
26954
  const value = loadCloisterConfigSync().startup.reconciliation_grace_secs;
26611
26955
  return Number.isFinite(value) && value > 0 ? value : 120;
@@ -26614,10 +26958,12 @@ function getBootReconciliationMaxCandidateAgeSeconds() {
26614
26958
  const value = loadCloisterConfigSync().startup.reconciliation_max_candidate_age_secs;
26615
26959
  return Number.isFinite(value) && value > 0 ? value : getBootReconciliationGraceSeconds() * 2;
26616
26960
  }
26961
+ function isAutoResumableRole(role) {
26962
+ return role === "work" || role === "strike";
26963
+ }
26617
26964
  function isBootReconciliationCandidate(agent) {
26618
- if (agent.role !== "work" || agent.status !== "stopped") return false;
26965
+ if (!isAutoResumableRole(agent.role) || agent.status !== "stopped") return false;
26619
26966
  if (agent.paused === true || agent.troubled === true) return false;
26620
- if (agent.stoppedByUser === true && !hasCompletionMarker(agent.workspace)) return false;
26621
26967
  if (!isRecentBootCandidate(agent)) return false;
26622
26968
  if (bootReconciliationSkipReason(agent) !== null) return false;
26623
26969
  if (!agent.workspace || !existsSync$1(agent.workspace)) return false;
@@ -26697,8 +27043,17 @@ function armBootReconciliationGraceTimer(graceDeadline, onGraceExpired = () => v
26697
27043
  graceTimer = setTimeout(() => {
26698
27044
  graceTimer = null;
26699
27045
  if (getBootReconciliationState().decision !== "pending") return;
26700
- setBootReconciliationDecision("hold_all");
26701
- logDeaconEventSync("boot reconciliation grace expired — decision set to hold_all");
27046
+ if (listBootReconciliationCandidateIds().length === 0) {
27047
+ setBootReconciliationDecision("resume_all");
27048
+ logDeaconEventSync("boot reconciliation grace expired — vacuous hold auto-released (0 candidates)");
27049
+ Promise.resolve(onGraceExpired()).catch((err) => {
27050
+ logDeaconEventSync(`boot reconciliation grace expiry apply hook failed: ${err instanceof Error ? err.message : String(err)}`);
27051
+ });
27052
+ return;
27053
+ }
27054
+ const decision = isCleanShutdownBoot() ? "resume_all" : "hold_all";
27055
+ setBootReconciliationDecision(decision);
27056
+ logDeaconEventSync(decision === "resume_all" ? "boot reconciliation grace expired — clean shutdown within 30m, decision set to resume_all" : "boot reconciliation grace expired — no clean shutdown marker (crash boot), decision set to hold_all");
26702
27057
  Promise.resolve(onGraceExpired()).catch((err) => {
26703
27058
  logDeaconEventSync(`boot reconciliation grace expiry apply hook failed: ${err instanceof Error ? err.message : String(err)}`);
26704
27059
  });
@@ -27156,7 +27511,7 @@ async function nudgeStalledResumeWorkAgents() {
27156
27511
  const message = buildStalledResumePrompt(state);
27157
27512
  if (!message) continue;
27158
27513
  try {
27159
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
27514
+ const { messageAgent } = await import("./agents-ePFVoZbu.js");
27160
27515
  await messageAgent(agentId, message);
27161
27516
  recordCooldown(agentId, ".last-stalled-resume-nudge");
27162
27517
  const action = `Re-sent stalled resume prompt to ${agentId} (${state.issueId})`;
@@ -27270,7 +27625,7 @@ async function nudgeIdleWorkAgentsWithOpenBeads() {
27270
27625
  "Continue the per-item workflow without asking — claim it (`pan task claim <item-id>`), implement, commit, push, then complete it through `pan task done <item-id>`. Inspection is conditional on metadata.requiresInspection (default false; check the plan item before deciding to call `pan inspect`). Do NOT end your turn with a multi-paragraph summary; just advance to the next bead."
27271
27626
  ].join("\n");
27272
27627
  try {
27273
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
27628
+ const { messageAgent } = await import("./agents-ePFVoZbu.js");
27274
27629
  await messageAgent(agentId, message);
27275
27630
  writeFileSync(join$1(getAgentDir(agentId), ".last-bead-nudge"), String(Date.now()), "utf-8");
27276
27631
  const action = `Nudged idle ${agentId} (${state.issueId}) — ${openTasks.length} ready task(s)`;
@@ -27316,7 +27671,7 @@ function shouldRetryUndeliveredKickoff(state) {
27316
27671
  * Does not enumerate directories — it evaluates the single agent ID it was given.
27317
27672
  */
27318
27673
  async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
27319
- const { skipGlobalGates = false, context = "event" } = opts;
27674
+ const { skipGlobalGates = false, context = "event", overrideStoppedByUser = false } = opts;
27320
27675
  const state = getAgentStateSync(agentId);
27321
27676
  if (!state) {
27322
27677
  logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — no state`);
@@ -27326,8 +27681,8 @@ async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
27326
27681
  logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — status=${state.status} (not stopped)`);
27327
27682
  return null;
27328
27683
  }
27329
- if (state.role !== "work") {
27330
- logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — role=${state.role} (not work)`);
27684
+ if (!isAutoResumableRole(state.role)) {
27685
+ logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — role=${state.role} (not auto-resumable)`);
27331
27686
  return null;
27332
27687
  }
27333
27688
  if (getBootReconciliationHeldResumeSet().has(agentId)) {
@@ -27386,7 +27741,9 @@ async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
27386
27741
  return null;
27387
27742
  }
27388
27743
  const hasPendingReviewFeedback = review?.reviewStatus === "blocked" || review?.reviewStatus === "failed" || review?.testStatus === "failed" || review?.verificationStatus === "failed";
27389
- if (state.stoppedByUser === true && !(handedOffViaDone && hasPendingReviewFeedback)) {
27744
+ const deliberatelyStopped = state.stoppedByUser === true;
27745
+ if (deliberatelyStopped && overrideStoppedByUser) logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} resuming despite stoppedByUser — explicit operator resume_all override`);
27746
+ else if (deliberatelyStopped && !(handedOffViaDone && hasPendingReviewFeedback)) {
27390
27747
  logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — deliberately stopped by user (stoppedByUser=true)`);
27391
27748
  return null;
27392
27749
  }
@@ -27418,7 +27775,7 @@ async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
27418
27775
  const runtimeStateForLog = getAgentRuntimeStateSync(agentId);
27419
27776
  logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} candidate — calling resumeAgent (issueId=${state.issueId}, runtime.state=${runtimeStateForLog?.state || "null"})`);
27420
27777
  try {
27421
- const result = await resumeAgent(agentId);
27778
+ const result = await resumeAgent(agentId, void 0, { startedBy: "deacon:auto-resume" });
27422
27779
  if (result.success) {
27423
27780
  const resumedState = await Effect.runPromise(getAgentState(agentId));
27424
27781
  if (resumedState) deps.notifyAgentStatusChanged(resumedState, state.status, true);
@@ -27541,7 +27898,8 @@ function bootReconciliationDecisionKey() {
27541
27898
  if (!state.decision || state.decision === "pending") return null;
27542
27899
  return `${state.bootId ?? "boot"}:${state.decision}:${JSON.stringify(state.perAgent)}`;
27543
27900
  }
27544
- async function applyBootReconciliationDecision$1(deps) {
27901
+ async function applyBootReconciliationDecision$1(deps, opts = {}) {
27902
+ const origin = opts.origin ?? "auto";
27545
27903
  const decisionKey = bootReconciliationDecisionKey();
27546
27904
  if (!decisionKey) return emptyBootReconciliationApplyResult();
27547
27905
  if (appliedBootReconciliationDecisions.has(decisionKey)) {
@@ -27555,6 +27913,12 @@ async function applyBootReconciliationDecision$1(deps) {
27555
27913
  return emptyBootReconciliationApplyResult();
27556
27914
  }
27557
27915
  let candidates = listBootReconciliationCandidates();
27916
+ if (origin === "auto") {
27917
+ const candidateCount = candidates.length;
27918
+ candidates = candidates.filter((agent) => agent.stoppedByUser !== true);
27919
+ const filteredCount = candidateCount - candidates.length;
27920
+ if (filteredCount > 0) logDeaconEventSync(`applyBootReconciliationDecision: auto origin filtered ${filteredCount} stoppedByUser candidate(s)`);
27921
+ }
27558
27922
  if (state.decision === "per_agent") candidates = candidates.filter((agent) => state.perAgent[agent.issueId] === "resume");
27559
27923
  const resumed = [];
27560
27924
  const outcomes = [];
@@ -27599,7 +27963,8 @@ async function applyBootReconciliationDecision$1(deps) {
27599
27963
  if (resumeAttempts > 0) await new Promise((r) => setTimeout(r, 150));
27600
27964
  const result = await handleAgentStoppedEvent$1(agent.id, {
27601
27965
  skipGlobalGates: true,
27602
- context: "boot-reconciliation"
27966
+ context: "boot-reconciliation",
27967
+ ...origin === "operator" ? { overrideStoppedByUser: true } : {}
27603
27968
  }, deps);
27604
27969
  if (result) {
27605
27970
  resumed.push(result);
@@ -27686,7 +28051,6 @@ async function recordMainDivergenceHealth(state, projects = listProjectsSync(),
27686
28051
  }
27687
28052
  //#endregion
27688
28053
  //#region ../../lib/cloister/patrol-cadence.ts
27689
- init_label_reconciler();
27690
28054
  function shouldRunRecoveryJanitor(janitor, patrolCycle) {
27691
28055
  return patrolCycle % (janitor === "feedback" ? 5 : 60) === 0;
27692
28056
  }
@@ -28479,8 +28843,8 @@ async function cleanupStaleAgentState() {
28479
28843
  */
28480
28844
  async function cleanupAbandonedFeedback() {
28481
28845
  const actions = [];
28482
- const { getReviewStatusSync } = await import("./review-status-BZH8h-6W.js");
28483
- const { clearFeedbackFiles } = await import("./feedback-writer-D1fm-5Z8.js");
28846
+ const { getReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
28847
+ const { clearFeedbackFiles } = await import("./feedback-writer-CoB9Z6aU.js");
28484
28848
  for (const { issueId, workspacePath } of listFeatureWorkspaces()) {
28485
28849
  const panFeedbackDir = join$1(workspacePath, ".pan", "feedback");
28486
28850
  if (!existsSync(panFeedbackDir)) continue;
@@ -28551,7 +28915,7 @@ async function handleOrphanReviewerSession(sessionName, sessions, creationTimes,
28551
28915
  if (!issueId) return null;
28552
28916
  const agentSession = `agent-${issueId.toLowerCase()}`;
28553
28917
  if (sessions.includes(agentSession)) return null;
28554
- const { getReviewStatusSync } = await import("./review-status-BZH8h-6W.js");
28918
+ const { getReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
28555
28919
  try {
28556
28920
  if (getReviewStatusSync(issueId)?.reviewStatus === "reviewing") return null;
28557
28921
  } catch {}
@@ -28673,7 +29037,7 @@ async function checkOrphanedCompletions() {
28673
29037
  async function checkPendingTestDispatch() {
28674
29038
  const actions = [];
28675
29039
  try {
28676
- const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-BZH8h-6W.js");
29040
+ const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
28677
29041
  const statuses = loadReviewStatuses();
28678
29042
  const now = Date.now();
28679
29043
  for (const [issueId, status] of Object.entries(statuses)) {
@@ -28706,7 +29070,7 @@ async function checkPendingTestDispatch() {
28706
29070
  console.log(`[deacon] ${issueId}: skipping test re-dispatch — issue is closed`);
28707
29071
  continue;
28708
29072
  }
28709
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
29073
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
28710
29074
  const resolved = resolveProjectFromIssueSync(issueId);
28711
29075
  if (!resolved) continue;
28712
29076
  const issueLower = issueId.toLowerCase();
@@ -28721,8 +29085,8 @@ async function checkPendingTestDispatch() {
28721
29085
  logDeaconEventSync(`checkPendingTestDispatch: deferred test for ${issueId} — advancing ceiling reached (PAN-1665) — ${describeRunningAgents()}`);
28722
29086
  continue;
28723
29087
  }
28724
- const { spawnRun } = await import("./agents-BKKkxKgK.js");
28725
- const { buildTestRolePrompt } = await import("./test-agent-queue-qakFIIGz.js");
29088
+ const { spawnRun } = await import("./agents-ePFVoZbu.js");
29089
+ const { buildTestRolePrompt } = await import("./test-agent-queue-A_-p-i0I.js");
28726
29090
  try {
28727
29091
  const run = await spawnRun(issueId, "test", {
28728
29092
  workspace,
@@ -28730,7 +29094,8 @@ async function checkPendingTestDispatch() {
28730
29094
  issueId,
28731
29095
  workspace,
28732
29096
  branch
28733
- })
29097
+ }),
29098
+ startedBy: "deacon:test-retry"
28734
29099
  });
28735
29100
  setReviewStatusSync(issueId, {
28736
29101
  testStatus: "testing",
@@ -28845,7 +29210,7 @@ async function checkCompletedButUnsignaledTests() {
28845
29210
  const cmd = `pan admin specialists done test ${issueId} --status ${decision.status}${noteArg}`;
28846
29211
  const nudge = `Your test verdict (${decision.status}) is already written to .pan/test/result.json. Your ONLY remaining task is to execute this Bash command immediately — do not analyze, do not summarize, do not ask questions, just run it:\n\n${cmd}\n\nRun this command NOW. Do not write any other response before executing it.`;
28847
29212
  try {
28848
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
29213
+ const { messageAgent } = await import("./agents-ePFVoZbu.js");
28849
29214
  await messageAgent(testSession, nudge);
28850
29215
  unsignaledTestNudges.set(testSession, now);
28851
29216
  const msg = `Nudged ${testSession} to signal ${decision.status} (verdict artifact present)`;
@@ -28859,7 +29224,7 @@ async function checkCompletedButUnsignaledTests() {
28859
29224
  case "nudge-write": {
28860
29225
  const nudge = `Your test run for ${issueId} looks finished but no verdict was recorded. Decide the verdict from the gates/UAT you ran, then do BOTH of these now: (1) write the workspace file .pan/test/result.json as {"status":"passed"|"failed","notes":"<evidence>"}, and (2) run: pan admin specialists done test ${issueId} --status passed|failed. Do this immediately — do not summarize or ask questions, just write the file and run the command.`;
28861
29226
  try {
28862
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
29227
+ const { messageAgent } = await import("./agents-ePFVoZbu.js");
28863
29228
  await messageAgent(testSession, nudge);
28864
29229
  unsignaledTestNudges.set(testSession, now);
28865
29230
  const msg = `Nudged ${testSession} to write+signal a test verdict (no artifact yet)`;
@@ -28882,8 +29247,8 @@ async function checkCompletedButUnsignaledTests() {
28882
29247
  async function checkVerificationReviewContradiction() {
28883
29248
  const actions = [];
28884
29249
  try {
28885
- const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-BZH8h-6W.js");
28886
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
29250
+ const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
29251
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
28887
29252
  const statuses = loadReviewStatuses();
28888
29253
  for (const [issueId, status] of Object.entries(statuses)) if (status.verificationStatus === "passed" && status.reviewStatus === "reviewing" && status.stuckReason === "review_infrastructure_failure") {
28889
29254
  let reviewedAtCommit;
@@ -28892,7 +29257,7 @@ async function checkVerificationReviewContradiction() {
28892
29257
  if (project) {
28893
29258
  const workspacePath = join$1(project.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
28894
29259
  if (existsSync(workspacePath)) {
28895
- const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-CI6cwyyC.js");
29260
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Xg4PFN45.js");
28896
29261
  reviewedAtCommit = await snapshotWorkspaceHeadsPromise(issueId, workspacePath);
28897
29262
  }
28898
29263
  }
@@ -28956,8 +29321,8 @@ async function cleanupOrphanedPlanningSessions() {
28956
29321
  async function handleAgentStoppedEvent(agentId, opts = {}) {
28957
29322
  return handleAgentStoppedEvent$1(agentId, opts, autoResumeNotifierDeps());
28958
29323
  }
28959
- async function applyBootReconciliationDecision() {
28960
- return applyBootReconciliationDecision$1(autoResumeNotifierDeps());
29324
+ async function applyBootReconciliationDecision(opts = {}) {
29325
+ return applyBootReconciliationDecision$1(autoResumeNotifierDeps(), opts);
28961
29326
  }
28962
29327
  async function reconcileAgentLiveness() {
28963
29328
  if (isDeaconGloballyPaused()) {
@@ -28988,7 +29353,7 @@ async function checkReadyForMergeStuck() {
28988
29353
  const testStatusGreenCiReconcileCooldowns = /* @__PURE__ */ new Map();
28989
29354
  const TEST_STATUS_GREEN_CI_RECONCILE_COOLDOWN_MS = 300 * 1e3;
28990
29355
  async function reconcileTestStatusFromGreenCi() {
28991
- const { getCiCheckRunsState, getPullRequestHeadState, isGitHubAppConfigured } = await import("./github-app-DtAsvwzK.js");
29356
+ const { getCiCheckRunsState, getPullRequestHeadState, isGitHubAppConfigured } = await import("./github-app-Bmg4R9mv.js");
28992
29357
  return reconcileTestStatusFromGreenCiWithDeps({
28993
29358
  isGitHubAppConfigured,
28994
29359
  loadReviewStatuses,
@@ -29009,7 +29374,7 @@ async function reconcileTestStatusFromGreenCi() {
29009
29374
  */
29010
29375
  async function clearStaleCiFeedback(issueId) {
29011
29376
  const { readdir, rm } = await import("fs/promises");
29012
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
29377
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
29013
29378
  const projectConfig = resolveProjectFromIssueSync(issueId);
29014
29379
  if (!projectConfig) return;
29015
29380
  const repoDir = projectConfig.projectPath;
@@ -29305,7 +29670,7 @@ async function checkWorkspaceContainerHealth(sharedState) {
29305
29670
  }
29306
29671
  }
29307
29672
  try {
29308
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
29673
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
29309
29674
  const resolved = resolveProjectFromIssueSync(issueLower.toUpperCase());
29310
29675
  if (resolved) await killOrphanedWorkspaceProcesses(`${resolved.projectPath}/workspaces/feature-${issueLower}`);
29311
29676
  } catch {}
@@ -29354,8 +29719,8 @@ async function checkWorkspaceContainerHealth(sharedState) {
29354
29719
  async function checkMergedWorkSessions() {
29355
29720
  const actions = [];
29356
29721
  try {
29357
- const { selectMergedWorkSessions } = await import("./reap-terminal-sessions-BQ23nriz.js");
29358
- const { setAgentPaused } = await import("./agents-BKKkxKgK.js");
29722
+ const { selectMergedWorkSessions } = await import("./reap-terminal-sessions-4Xg9NGA8.js");
29723
+ const { setAgentPaused } = await import("./agents-ePFVoZbu.js");
29359
29724
  const toKill = selectMergedWorkSessions(loadReviewStatuses(), [...await Effect.runPromise(listSessionNames())]);
29360
29725
  for (const session of toKill) try {
29361
29726
  await Effect.runPromise(setAgentPaused(session, "merged — awaiting close-out (verify on main)", true));
@@ -29395,7 +29760,7 @@ const AWAITING_TEST_IDLE_REAP_MS = 600 * 1e3;
29395
29760
  async function checkAwaitingTestWorkSessions() {
29396
29761
  const actions = [];
29397
29762
  try {
29398
- const { selectAwaitingTestWorkSessions } = await import("./reap-terminal-sessions-BQ23nriz.js");
29763
+ const { selectAwaitingTestWorkSessions } = await import("./reap-terminal-sessions-4Xg9NGA8.js");
29399
29764
  const candidates = selectAwaitingTestWorkSessions(loadReviewStatuses(), [...await Effect.runPromise(listSessionNames())]);
29400
29765
  const now = Date.now();
29401
29766
  for (const session of candidates) {
@@ -29448,26 +29813,26 @@ async function runPatrol() {
29448
29813
  hasLoggedGlobalPauseSkip = false;
29449
29814
  addLog("info", `Patrol cycle ${state.patrolCycle} — checking per-project specialists`, state.patrolCycle);
29450
29815
  console.log(`[deacon] Patrol cycle ${state.patrolCycle} - checking per-project specialists`);
29451
- for (const a of await (await import("./stale-task-claims-CYFOUNlT.js")).patrolStaleTaskClaims()) {
29816
+ for (const a of await (await import("./stale-task-claims-Cab_Fo_Z.js")).patrolStaleTaskClaims()) {
29452
29817
  actions.push(a);
29453
29818
  addLog("action", a, state.patrolCycle);
29454
29819
  }
29455
29820
  const stuckRemediationActions = await checkStuckAgentRemediation();
29456
29821
  actions.push(...stuckRemediationActions);
29457
29822
  for (const a of stuckRemediationActions) addLog("action", a, state.patrolCycle);
29458
- const { reconcileInFlightJournals } = await import("./advancing-selfheal-De1L-Sb4.js");
29823
+ const { reconcileInFlightJournals } = await import("./advancing-selfheal-BNwqxseD.js");
29459
29824
  const reconciledJournalActions = await reconcileInFlightJournals();
29460
29825
  actions.push(...reconciledJournalActions);
29461
29826
  for (const a of reconciledJournalActions) addLog("action", a, state.patrolCycle);
29462
29827
  try {
29463
29828
  const pendingFile = join$1(OVERDECK_HOME, "pending-post-merge.json");
29464
- const { processPendingLifecycleForPatrol } = await import("./deacon-pending-lifecycle-Cpk0k7Hi.js");
29829
+ const { processPendingLifecycleForPatrol } = await import("./deacon-pending-lifecycle-B-Io84AP.js");
29465
29830
  const action = await processPendingLifecycleForPatrol(pendingFile);
29466
29831
  if (action) actions.push(action);
29467
29832
  } catch (err) {
29468
29833
  console.warn(`[deacon] Failed to process pending lifecycle: ${err.message}`);
29469
29834
  }
29470
- if (state.patrolCycle % 5 === 0) await (await import("./deploy-patrol-Df-Tmaq0.js")).runScheduledDeployPatrol();
29835
+ if (state.patrolCycle % 5 === 0) await (await import("./deploy-patrol-sYgOxLeb.js")).runScheduledDeployPatrol();
29471
29836
  const livenessActions = await reconcileAgentLiveness();
29472
29837
  actions.push(...livenessActions);
29473
29838
  for (const a of livenessActions) addLog("action", a, state.patrolCycle);
@@ -29483,7 +29848,7 @@ async function runPatrol() {
29483
29848
  const idleStackActions = await reconcileIdleWorkspaceStacks();
29484
29849
  actions.push(...idleStackActions);
29485
29850
  for (const a of idleStackActions) addLog("action", a, state.patrolCycle);
29486
- for (const a of await (await import("./bridge-pool-patrol-CUFmjVDN.js")).patrolDockerBridgePool()) {
29851
+ for (const a of await (await import("./bridge-pool-patrol-CYH2OLb5.js")).patrolDockerBridgePool()) {
29487
29852
  actions.push(a);
29488
29853
  addLog("action", a, state.patrolCycle);
29489
29854
  }
@@ -29503,7 +29868,7 @@ async function runPatrol() {
29503
29868
  actions.push(...suspendActions);
29504
29869
  for (const a of suspendActions) addLog("action", a, state.patrolCycle);
29505
29870
  try {
29506
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
29871
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
29507
29872
  const allStatuses = loadReviewStatuses();
29508
29873
  for (const [issueId, status] of Object.entries(allStatuses)) {
29509
29874
  if (!status.readyForMerge || status.mergeStatus === "merged") continue;
@@ -29523,7 +29888,7 @@ async function runPatrol() {
29523
29888
  } catch (err) {
29524
29889
  console.warn(`[deacon] Failed to check workspace existence: ${err.message}`);
29525
29890
  }
29526
- const { checkMergedAdvancingSessions } = await import("./advancing-selfheal-De1L-Sb4.js");
29891
+ const { checkMergedAdvancingSessions } = await import("./advancing-selfheal-BNwqxseD.js");
29527
29892
  const reapedWorkActions = await checkMergedWorkSessions();
29528
29893
  actions.push(...reapedWorkActions);
29529
29894
  for (const a of reapedWorkActions) addLog("action", a, state.patrolCycle);
@@ -29531,7 +29896,7 @@ async function runPatrol() {
29531
29896
  actions.push(...reapedMergedAdvancingActions);
29532
29897
  for (const a of reapedMergedAdvancingActions) addLog("action", a, state.patrolCycle);
29533
29898
  try {
29534
- const { refreshClaudeCredentialsForActiveRemoteAgents } = await import("./remote-completion-DAB0P706.js");
29899
+ const { refreshClaudeCredentialsForActiveRemoteAgents } = await import("./remote-completion-CwAp79EC.js");
29535
29900
  const remoteCredentialActions = await refreshClaudeCredentialsForActiveRemoteAgents();
29536
29901
  actions.push(...remoteCredentialActions);
29537
29902
  for (const a of remoteCredentialActions) addLog(a.includes("failed") ? "warn" : "action", a, state.patrolCycle);
@@ -29539,7 +29904,7 @@ async function runPatrol() {
29539
29904
  addLog("warn", `Remote credential refresh patrol failed: ${err.message}`, state.patrolCycle);
29540
29905
  }
29541
29906
  try {
29542
- const { refreshHostHeartbeatForEphemeralVms } = await import("./remote-agents-C1bssi41.js");
29907
+ const { refreshHostHeartbeatForEphemeralVms } = await import("./remote-agents-CLZB3Coc.js");
29543
29908
  const heartbeatActions = await refreshHostHeartbeatForEphemeralVms();
29544
29909
  actions.push(...heartbeatActions);
29545
29910
  for (const a of heartbeatActions) addLog(a.includes("failed") ? "warn" : "action", a, state.patrolCycle);
@@ -29547,7 +29912,7 @@ async function runPatrol() {
29547
29912
  addLog("warn", `Remote heartbeat refresh patrol failed: ${err.message}`, state.patrolCycle);
29548
29913
  }
29549
29914
  try {
29550
- const { reapCompletedRemoteAgents } = await import("./remote-completion-DAB0P706.js");
29915
+ const { reapCompletedRemoteAgents } = await import("./remote-completion-CwAp79EC.js");
29551
29916
  const remoteReap = await reapCompletedRemoteAgents();
29552
29917
  for (const r of remoteReap) if (r.status === "handed-off" || r.status === "error") {
29553
29918
  const msg = `Remote reap ${r.issueId}: ${r.status} (${r.details.join("; ")})`;
@@ -29649,9 +30014,16 @@ async function runPatrol() {
29649
30014
  const closedPrReadyActions = await reconcileClosedPrReadyForMerge();
29650
30015
  actions.push(...closedPrReadyActions);
29651
30016
  for (const a of closedPrReadyActions) addLog("action", a, state.patrolCycle);
30017
+ for (const a of await reconcileAutoMergeRows()) {
30018
+ actions.push(a);
30019
+ addLog("action", a, state.patrolCycle);
30020
+ }
29652
30021
  const staleMergeBlockerActions = await reconcileStaleMergeBlockers();
29653
30022
  actions.push(...staleMergeBlockerActions);
29654
30023
  for (const a of staleMergeBlockerActions) addLog("action", a, state.patrolCycle);
30024
+ const branchInvalidationActions = await reconcileBranchInvalidation();
30025
+ actions.push(...branchInvalidationActions);
30026
+ for (const a of branchInvalidationActions) addLog("action", a, state.patrolCycle);
29655
30027
  const stuckReadyActions = reconcileStuckReadyForMerge();
29656
30028
  actions.push(...stuckReadyActions);
29657
30029
  for (const a of stuckReadyActions) addLog("action", a, state.patrolCycle);
@@ -29733,7 +30105,7 @@ async function runPatrol() {
29733
30105
  const issueId = runtimeState.currentIssue;
29734
30106
  try {
29735
30107
  if (getReviewStatusSync(issueId)?.mergeStatus === "merging") {
29736
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
30108
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
29737
30109
  const resolved = resolveProjectFromIssueSync(issueId);
29738
30110
  if (resolved) {
29739
30111
  const branch = `feature/${issueId.toLowerCase()}`;
@@ -29747,7 +30119,7 @@ async function runPatrol() {
29747
30119
  mergeStatus: "merged",
29748
30120
  readyForMerge: false
29749
30121
  });
29750
- const { postMergeLifecycle } = await import("./merge-agent-DrXa1CpW.js");
30122
+ const { postMergeLifecycle } = await import("./merge-agent-DQTXZk8z.js");
29751
30123
  postMergeLifecycle(issueId, resolved.projectPath).catch((err) => console.warn(`[deacon] postMergeLifecycle failed for ${issueId}: ${err}`));
29752
30124
  actions.push(`Auto-completed stale merge for ${issueId}`);
29753
30125
  } else {
@@ -29927,7 +30299,7 @@ function startDeacon() {
29927
30299
  logDeaconEventSync(`startDeacon: health monitor starting (patrol every ${config.patrolIntervalMs / 1e3}s)`);
29928
30300
  (async () => {
29929
30301
  await reconcileAgentLiveness();
29930
- const { runBootAdvancingSelfHeal } = await import("./advancing-selfheal-De1L-Sb4.js");
30302
+ const { runBootAdvancingSelfHeal } = await import("./advancing-selfheal-BNwqxseD.js");
29931
30303
  await runBootAdvancingSelfHeal();
29932
30304
  runScheduledPatrol("startup");
29933
30305
  })().catch((err) => {
@@ -29997,6 +30369,6 @@ function assessDeaconPatrolFreshness(params) {
29997
30369
  };
29998
30370
  }
29999
30371
  //#endregion
30000
- export { isSynthesisForActiveReviewRun as $, reconcileTestStatusFromGreenCi as A, formatUptime as At, isRapidPostResumeDeath as B, classifyAgentHealth as Bt, handleAgentHeartbeatDeadEvent as C, deliverOrchestratedCompact as Ct, loadConfig as D, WORK_LAUNCHER_GRACE_MS as Dt, isDeaconRunning as E, checkInspectAgentTimeouts as Et, setAgentStoppedNotifier as F, getResourceConfig as Ft, isBootReconciliationCandidate as G, nudgeStalledResumeWorkAgents as H, setMergeReadyNotifier as I, getSystemHealthEvidenceSnapshot as It, cleanupOrphanedReviewSessions as J, listBootReconciliationCandidates as K, startDeacon as L, getSystemHealthSnapshot as Lt, runPatrol as M, getCurrentDockerStats as Mt, saveState as N, getAcceptedSystemHealthSnapshot as Nt, loadState as O, classifyMemoryPressure as Ot, setAgentStatusChangedNotifier as P, getDeployStaleness as Pt, checkStuckReviewing as Q, stopDeacon as R, isSmeeConfiguredSync as Rt, getLastPatrolResult as S, stuckOverflowNativeRecoveryState as St, handleAgentStoppedForOrphanReviewerSessions as T, INSPECT_TIMEOUT_MS as Tt, redeliverUndeliveredKickoffs as U, nudgeIdleWorkAgentsWithOpenBeads as V, extendBootReconciliationGrace as W, synthesizeReviewFromReports as X, monitorReviewConvoySignals as Y, checkCompletedButUnsignaledReviews as Z, cleanupOrphanedPlanningSessions as _, reconcileStuckReadyForMerge as _t, checkCompletedButUnsignaledTests as a, reviewConvoyLiveness as at, getDeaconLogs as b, contextOverflowRecoveryState as bt, checkMergedWorkSessions as c, autoCloseOut as ct, checkReadyForMergeStuck as d, ciRetryMap as dt, checkMissingReviewStatuses as et, checkStuckWorkAgents as f, reconcileClosedPrReadyForMerge as ft, cleanupOrphanReviewerSessions as g, reconcileStaleMergeStatus as gt, cleanupAbandonedFeedback as h, reconcileStaleMergeBlockers as ht, checkAwaitingTestWorkSessions as i, recoverStalledReviewConvoys as it, resetPatrolHeartbeatForStartup as j, getContainerHistory as jt, reconcileAgentLiveness as k, getResourceStacks as kt, checkOrphanedCompletions as l, checkFailedMergeRetry as lt, checkWorkspaceContainerHealth as m, reconcileMergedButReviewing as mt, assessDeaconPatrolFreshness as n, handleReviewCoordinatorDied as nt, checkDeadEndAgents as o, stalledReviewConvoyRecoveryState as ot, checkVerificationReviewContradiction as p, reconcileFalseMerged as pt, startBootReconciliation as q, checkAndSuspendIdleAgents as r, handleWorkCompleted as rt, checkMassDeath as s, checkPostReviewCommits as st, applyBootReconciliationDecision as t, checkOrphanedReviewStatuses as tt, checkPendingTestDispatch as u, checkFirstCompletionAgents as ut, cleanupStaleAgentState as v, reconcileStuckMergingStates as vt, handleAgentStoppedEvent as w, paneShowsClaudeBootBlockingScreen as wt, getDeaconStatus as x, contextProactiveCompactState as xt, containerRestartBackoffMs as y, checkApiErrorAgents as yt, isPreKickoffLaunchDeath as z, startSmeeProcessSync as zt };
30372
+ export { checkStuckReviewing as $, reconcileTestStatusFromGreenCi as A, classifyMemoryPressure as At, isRapidPostResumeDeath as B, isSmeeConfiguredSync as Bt, handleAgentHeartbeatDeadEvent as C, contextProactiveCompactState as Ct, loadConfig as D, INSPECT_TIMEOUT_MS as Dt, isDeaconRunning as E, paneShowsClaudeBootBlockingScreen as Et, setAgentStoppedNotifier as F, getAcceptedSystemHealthSnapshot as Ft, isAutoResumableRole as G, nudgeStalledResumeWorkAgents as H, classifyAgentHealth as Ht, setMergeReadyNotifier as I, getDeployStaleness as It, startBootReconciliation as J, isBootReconciliationCandidate as K, startDeacon as L, getResourceConfig as Lt, runPatrol as M, formatUptime as Mt, saveState as N, getContainerHistory as Nt, loadState as O, checkInspectAgentTimeouts as Ot, setAgentStatusChangedNotifier as P, getCurrentDockerStats as Pt, checkCompletedButUnsignaledReviews as Q, stopDeacon as R, getSystemHealthEvidenceSnapshot as Rt, getLastPatrolResult as S, contextOverflowRecoveryState as St, handleAgentStoppedForOrphanReviewerSessions as T, deliverOrchestratedCompact as Tt, redeliverUndeliveredKickoffs as U, nudgeIdleWorkAgentsWithOpenBeads as V, startSmeeProcessSync as Vt, extendBootReconciliationGrace as W, monitorReviewConvoySignals as X, cleanupOrphanedReviewSessions as Y, synthesizeReviewFromReports as Z, cleanupOrphanedPlanningSessions as _, reconcileStaleMergeStatus as _t, checkCompletedButUnsignaledTests as a, recoverStalledReviewConvoys as at, getDeaconLogs as b, reconcileStuckMergingStates as bt, checkMergedWorkSessions as c, checkPostReviewCommits as ct, checkReadyForMergeStuck as d, checkFirstCompletionAgents as dt, isSynthesisForActiveReviewRun as et, checkStuckWorkAgents as f, ciRetryMap as ft, cleanupOrphanReviewerSessions as g, reconcileStaleMergeBlockers as gt, cleanupAbandonedFeedback as h, reconcileMergedButReviewing as ht, checkAwaitingTestWorkSessions as i, handleWorkCompleted as it, resetPatrolHeartbeatForStartup as j, getResourceStacks as jt, reconcileAgentLiveness as k, WORK_LAUNCHER_GRACE_MS as kt, checkOrphanedCompletions as l, autoCloseOut as lt, checkWorkspaceContainerHealth as m, reconcileFalseMerged as mt, assessDeaconPatrolFreshness as n, checkOrphanedReviewStatuses as nt, checkDeadEndAgents as o, reviewConvoyLiveness as ot, checkVerificationReviewContradiction as p, reconcileClosedPrReadyForMerge as pt, listBootReconciliationCandidates as q, checkAndSuspendIdleAgents as r, handleReviewCoordinatorDied as rt, checkMassDeath as s, stalledReviewConvoyRecoveryState as st, applyBootReconciliationDecision as t, checkMissingReviewStatuses as tt, checkPendingTestDispatch as u, checkFailedMergeRetry as ut, cleanupStaleAgentState as v, reconcileStuckReadyForMerge as vt, handleAgentStoppedEvent as w, stuckOverflowNativeRecoveryState as wt, getDeaconStatus as x, checkApiErrorAgents as xt, containerRestartBackoffMs as y, reconcileAutoMergeRows as yt, isPreKickoffLaunchDeath as z, getSystemHealthSnapshot as zt };
30001
30373
 
30002
- //# sourceMappingURL=deacon-hi9KLPLT.js.map
30374
+ //# sourceMappingURL=deacon-pLRLbPvR.js.map