@overdeck/desktop 0.45.22 → 0.45.24

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 (429) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +2 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DDCnXF58.js} +5 -5
  4. package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BVwW4qRn.js} +6 -6
  5. package/server/{agent-gc-Dj2gncak.js → agent-gc-CHcnvonI.js} +4 -4
  6. package/server/agent-state-Bc3tzUC8.js +3 -0
  7. package/server/{agent-state-service-DistflNn.js → agent-state-service-BsgWxZuB.js} +5 -5
  8. package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-D5UGKIJL.js} +1 -1
  9. package/server/{agents-DXdHmRTC.js → agents-EbI0zCJl.js} +4 -4
  10. package/server/agents-wi9NWzs2.js +3 -0
  11. package/server/{archive-planning-Cp_DC1j-.js → archive-planning-BZDgzoEj.js} +1 -1
  12. package/server/{archive-planning-BvDuWNMo.js → archive-planning-Du25Jtst.js} +30 -6
  13. package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-CbEDfCDu.js} +2 -2
  14. package/server/assemble-J2ZZ2C15.js +339 -0
  15. package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-2R2jog7n.js} +3 -3
  16. package/server/{behavior-CGj16clS.js → behavior-B3exJ42O.js} +2 -2
  17. package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-D1wzUIWv.js} +2 -2
  18. package/server/{build-info-BRpqQvNd.js → build-info-CZk_TITh.js} +1 -1
  19. package/server/{build-info-NU3KbXYw.js → build-info-Ie_D0_BT.js} +3 -3
  20. package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-BI1Wxoku.js} +2 -2
  21. package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-DwbQoqrC.js} +1 -1
  22. package/server/checkpoint-worker.js +1 -1
  23. package/server/{checkpoints-B5jFNi2G.js → checkpoints-BJIs5QIA.js} +1 -1
  24. package/server/{checkpoints-BJum14fs.js → checkpoints-CQB1h765.js} +2 -2
  25. package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-8Ngo8TpT.js} +1 -1
  26. package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-D8GXF3_s.js} +2 -2
  27. package/server/{claude-permissions-nSFKH78M.js → claude-permissions-DNWEVV6z.js} +2 -2
  28. package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CEdaqpWI.js} +2 -2
  29. package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-DWy-Bb4Y.js} +1 -1
  30. package/server/cli-B86rejVV.js +3 -0
  31. package/server/{cli-CbKNkFE5.js → cli-RoOx5DUf.js} +9 -9
  32. package/server/{cliproxy-Brf_5MuG.js → cliproxy-C8a1vtTU.js} +2 -2
  33. package/server/{cliproxy-bONZDBbC.js → cliproxy-fHfIeiGd.js} +1 -1
  34. package/server/{close-issue-CxReRxIc.js → close-issue-DoOifFIK.js} +5 -5
  35. package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-Bk3SU4RC.js} +9 -9
  36. package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CktPXo8m.js} +1 -1
  37. package/server/{codex-CbmztVcc.js → codex-BZXGhUVB.js} +27 -8
  38. package/server/codex-GcHuUF-k.js +3 -0
  39. package/server/{codex-parser-jl8AeAmB.js → codex-parser-CFZ1_1Jl.js} +2 -2
  40. package/server/{config-q4Gvd8dq.js → config-BZ0sHTju.js} +2 -2
  41. package/server/{config-DeTsoZdR.js → config-CKxYiCmX.js} +2 -2
  42. package/server/{config-BJKocXKd.js → config-DzV30TOm.js} +1 -1
  43. package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DySPNmKN.js} +77 -194
  44. package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-BaCVrH-N.js} +3 -3
  45. package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BhAY7TUd.js} +1 -1
  46. package/server/context-layers-BrPmE__h.js +4 -0
  47. package/server/context-layers-igZ4FI4_.js +37 -0
  48. package/server/{control-settings-D_odMIaC.js → control-settings-BQp7_4uD.js} +4 -4
  49. package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CgrR8YYp.js} +8 -8
  50. package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-eQB5CkOe.js} +1 -1
  51. package/server/{conversation-service-Dq33SYEj.js → conversation-service-BLd3MYsG.js} +1 -1
  52. package/server/{conversation-service-C3avRVEr.js → conversation-service-DPJ71F33.js} +329 -19
  53. package/server/{conversations-bYpM9-kZ.js → conversations-6AfUfbwc.js} +5 -5
  54. package/server/{conversations-H9if0bCQ.js → conversations-CAsJF9kh.js} +1 -1
  55. package/server/{cost-Codk1pc2.js → cost-B2ddP6wq.js} +18 -2
  56. package/server/{cost-wH46-WsJ.js → cost-R-m6Yi-W.js} +3 -3
  57. package/server/{cost-sync-D_cre6WM.js → cost-sync-BsN6ER0n.js} +3 -3
  58. package/server/{dag-CJpgf9A3.js → dag-B1ucnjDU.js} +9 -9
  59. package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-BXqeWVSf.js} +1 -1
  60. package/server/dashboard-db-worker.js +7 -7
  61. package/server/{deacon-CkT_kznS.js → deacon-CU_cAYSR.js} +406 -607
  62. package/server/{deacon-B8HbQdqU.js → deacon-kiQrb4ZT.js} +3 -3
  63. package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-6wVqAaqz.js} +3 -3
  64. package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-BXZZ1Z2-.js} +17 -17
  65. package/server/deacon-swarm-C-GwfjJy.js +2 -0
  66. package/server/deacon.js +8 -8
  67. package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-AiFoP8dw.js} +136 -19
  68. package/server/{deploy-window-wDf4UgHt.js → deploy-window-C3F-tihF.js} +77 -10
  69. package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-DkZraDyj.js} +1 -1
  70. package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-bcOWqdQE.js} +2 -2
  71. package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-_d6XhyND.js} +3 -3
  72. package/server/dist-Bzy0y69j.js +3 -0
  73. package/server/{dist-D-Ed5yVw.js → dist-Cb_0uvpS.js} +1 -1
  74. package/server/{docker-BCZ89M9X.js → docker-DcMTFTUC.js} +2 -2
  75. package/server/{dod-DbJLYcHv.js → dod-C6n9RV3G.js} +1 -1
  76. package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-BZgOhRo7.js} +1 -1
  77. package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DNi-ono3.js} +4 -4
  78. package/server/{esm-shims-dTeNdq7X.js → esm-shims-OSHAYaS1.js} +1 -1
  79. package/server/{event-store-TnWdydfB.js → event-store-CQL6NeqB.js} +3 -3
  80. package/server/{event-store-CpBGsO6_.js → event-store-EV2cMiXj.js} +1 -1
  81. package/server/{events-Dsuv6qyB.js → events-BTdrdEq8.js} +1 -1
  82. package/server/{events-DSUdR-04.js → events-DTfAe4My.js} +3 -3
  83. package/server/{factory-BMrK4TrE.js → factory-CFibJuaw.js} +50 -13
  84. package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-DKZFMbFt.js} +4 -4
  85. package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-BdPuLcBX.js} +2 -2
  86. package/server/{features-Bc-Bmiye.js → features-ez2271oH.js} +2 -2
  87. package/server/{feedback-target-DZ-iAnAa.js → feedback-target-7mqqwrX6.js} +7 -7
  88. package/server/{feedback-target-DS6NUuSs.js → feedback-target-CoFDHiM8.js} +1 -1
  89. package/server/{feedback-writer-BXP6g75N.js → feedback-writer-CY5L1lB7.js} +6 -5
  90. package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-D3a22RCd.js} +1 -1
  91. package/server/flywheel-DHrgCphM.js +1084 -0
  92. package/server/flywheel-DzGtWnJ1.js +477 -0
  93. package/server/flywheel-SVF02Jpq.js +2 -0
  94. package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-UU0tiUld.js} +10 -9
  95. package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-UUcsCDb6.js} +1 -1
  96. package/server/{forge-B1S_KZv4.js → forge-CNFnyqps.js} +2 -2
  97. package/server/forge-DXnS_YFH.js +2 -0
  98. package/server/{from-DpwQ-sc3.js → from-kNxT0bZC.js} +1 -1
  99. package/server/{fts-db-DmAcuCkV.js → fts-db-CE46vDkZ.js} +2 -2
  100. package/server/{fts-operations-7d_RkmWp.js → fts-operations-CqY6zl-i.js} +2 -2
  101. package/server/{git-utils-Cc3FHDKd.js → git-utils-CRw2zLPC.js} +68 -3
  102. package/server/git-utils-D0_yhCgF.js +3 -0
  103. package/server/{github-app-CDPtGF7J.js → github-app-C3QrAUd0.js} +27 -8
  104. package/server/{github-app-CU14oYzP.js → github-app-ClZ2lk8D.js} +1 -1
  105. package/server/{github-client-XjTJbBm7.js → github-client-BnIsSrEN.js} +2 -2
  106. package/server/{github-client-CwBZZ3t7.js → github-client-DfQYVUaw.js} +1 -1
  107. package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-D16NGsSO.js} +2 -2
  108. package/server/{harness-binary-B2CTcD84.js → harness-binary-DPUi-Pv8.js} +32 -6
  109. package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-3lNZkyT4.js} +18 -9
  110. package/server/{health-events-DREeevle.js → health-events-BBcTYQKU.js} +2 -2
  111. package/server/{health-events-C1whmd58.js → health-events-BDOHby5Q.js} +1 -1
  112. package/server/{hooks-yxRsjk-z.js → hooks-CKZgXlJb.js} +2 -2
  113. package/server/{hooks-B-HItBiS.js → hooks-DPVX1rwQ.js} +1 -1
  114. package/server/{hume-Dz_OymXE.js → hume-Cz8igP9E.js} +2 -2
  115. package/server/hume-ccTf4wTX.js +3 -0
  116. package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-CuLF0j2H.js} +1 -1
  117. package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-DDIRwxUY.js} +2 -2
  118. package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-CAAkqPLu.js} +2 -2
  119. package/server/{infra-D4iNWMA5.js → infra-BEqFxlJc.js} +14 -4
  120. package/server/{injection-D7T75Pye.js → injection-C8aiVJrF.js} +191 -183
  121. package/server/{injection-BVNa4MQW.js → injection-CPUIqNhI.js} +1 -1
  122. package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-BLuJ1AkT.js} +137 -81
  123. package/server/inspect-agent-Brtz0URj.js +2 -0
  124. package/server/{internal-token-C9DdEOKY.js → internal-token-BrcU6qfe.js} +1 -1
  125. package/server/{internal-token-CXsfxslp.js → internal-token-s0-oKybJ.js} +2 -2
  126. package/server/{io-DQR9PMgS.js → io-C9kF1wtJ.js} +160 -184
  127. package/server/{issue-closed-DtmJM0D0.js → issue-closed-CDJk4pIp.js} +7 -7
  128. package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-B8sZHVHh.js} +1 -1
  129. package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-ojZAzDBP.js} +22 -22
  130. package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-BvJ09SaR.js} +1 -1
  131. package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-Yx5DdmVJ.js} +8 -8
  132. package/server/{issues-pDW9VUNz.js → issues-BMmP_77e.js} +2 -2
  133. package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-BXSlHwEh.js} +3 -3
  134. package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-B0UJwnv5.js} +3 -3
  135. package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-B4iOAjlC.js} +4 -4
  136. package/server/{launcher-generator-COgR2By1.js → launcher-generator-BBWG_SiS.js} +105 -10
  137. package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-BREGpnLk.js} +37 -37
  138. package/server/lifecycle-io-DPo7x11I.js +3 -0
  139. package/server/{lifecycle-CtPDcZ9u.js → lifecycle-xmBfK2GJ.js} +6 -6
  140. package/server/lifecycle-yPd___5E.js +121 -0
  141. package/server/{linear-client-DsFkIxee.js → linear-client-BsuUvkdA.js} +2 -2
  142. package/server/{linear-client-YwZMDIwQ.js → linear-client-CTskEeT_.js} +1 -1
  143. package/server/memory-fts-worker.js +1 -1
  144. package/server/{merge-BwsyNRJV.js → merge-B1DiziGU.js} +1 -1
  145. package/server/{merge-C1t-bspg.js → merge-CefQNAnq.js} +3 -3
  146. package/server/{merge-agent-DDiIjzk-.js → merge-agent-4WOWlSYA.js} +28 -28
  147. package/server/{merge-agent-B-SnXOoc.js → merge-agent-CKkgIBPB.js} +1 -1
  148. package/server/{merge-batch-Byt-QnEl.js → merge-batch-ClFn2T-y.js} +1 -1
  149. package/server/merge-ops-CR44oU9-.js +2 -0
  150. package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-BfaTyXsw.js} +2 -2
  151. package/server/merge-set-DJ8-UErs.js +83 -0
  152. package/server/{merge-set-6LEglm6o.js → merge-set-bUqbm3yc.js} +1 -1
  153. package/server/{merge-sync-B95_4in_.js → merge-sync-BJYeOODr.js} +1 -1
  154. package/server/{merge-sync-Do8_q32h.js → merge-sync-VPV28g0g.js} +2 -2
  155. package/server/{merge-train-CKana8EH.js → merge-train-CHopycP0.js} +3 -3
  156. package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-D1cOZzy2.js} +4 -4
  157. package/server/{merge-verification-CqnUzGEK.js → merge-verification-BkaOqPsw.js} +4 -4
  158. package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-duPAfSBw.js} +2 -2
  159. package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Nw29vaFb.js} +11 -8
  160. package/server/node_modules/.package-lock.json +8 -8
  161. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  162. package/server/node_modules/undici/README.md +5 -0
  163. package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
  164. package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
  165. package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
  166. package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
  167. package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
  168. package/server/node_modules/undici/docs/docs/index.md +5 -0
  169. package/server/node_modules/undici/lib/core/request.js +1 -1
  170. package/server/node_modules/undici/lib/core/util.js +6 -1
  171. package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
  172. package/server/node_modules/undici/lib/dispatcher/client-h1.js +31 -6
  173. package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
  174. package/server/node_modules/undici/lib/handler/cache-handler.js +93 -5
  175. package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
  176. package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
  177. package/server/node_modules/undici/lib/handler/retry-handler.js +6 -4
  178. package/server/node_modules/undici/lib/interceptor/cache.js +21 -4
  179. package/server/node_modules/undici/lib/interceptor/decompress.js +4 -0
  180. package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
  181. package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
  182. package/server/node_modules/undici/lib/util/cache.js +49 -7
  183. package/server/node_modules/undici/lib/web/fetch/body.js +2 -1
  184. package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
  185. package/server/node_modules/undici/package.json +2 -2
  186. package/server/node_modules/undici/types/client.d.ts +2 -2
  187. package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
  188. package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
  189. package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-BvKkWMJQ.js} +15 -13
  190. package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-CTSGcK8p.js} +1 -1
  191. package/server/package-lock.json +9 -9
  192. package/server/package.json +1 -1
  193. package/server/{pan-dir-DOcf6ug3.js → pan-dir-B0c3w0Ya.js} +78 -58
  194. package/server/{paths-DooHpt9p.js → paths-D-xWGHdh.js} +2 -2
  195. package/server/{pickup-CaskQ7j6.js → pickup-DUCLWrJY.js} +17 -16
  196. package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-mY3GprlK.js} +186 -67
  197. package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-BJr8gQX6.js} +1 -1
  198. package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-BXkJzDC4.js} +2 -2
  199. package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-C0MWUeCU.js} +2 -2
  200. package/server/project-repos-B6GycDh9.js +94 -0
  201. package/server/project-repos-DXKQsc_m.js +3 -0
  202. package/server/projects-vjjcmiN8.js +3 -0
  203. package/server/{prompts-EvhMeeHG.js → prompts-DxzFXuLl.js} +2 -2
  204. package/server/{providers-BDDPULlp.js → providers-qQAwGQDW.js} +7 -7
  205. package/server/{providers-DNSQqy2V.js → providers-u4Ga0jOr.js} +1 -1
  206. package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-BamJdinX.js} +4 -4
  207. package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-DfOB8-w4.js} +1 -1
  208. package/server/public/assets/{dist-DukGS2YZ.js → dist-ByIuzMQW.js} +3 -3
  209. package/server/public/assets/{dist-Bio7THQU.js → dist-D7zYSEA6.js} +1 -1
  210. package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-EdmRyXL3.js} +1 -1
  211. package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-MerOfTX8.js} +1 -1
  212. package/server/public/assets/{index-Bwejq-5s.js → index-CWeMerGO.js} +147 -144
  213. package/server/public/assets/index-CenuJ3Cw.css +1 -0
  214. package/server/public/assets/{linear-qUWmMZ-c.js → linear-BBbArIcK.js} +1 -1
  215. package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +1 -0
  216. package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-BKIddiJN.js} +1 -1
  217. package/server/public/assets/{prod-C8VtLuWC.js → prod-B8vYiu52.js} +4 -4
  218. package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-D6RtoULk.js} +1 -1
  219. package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-CLrCedZX.js} +1 -1
  220. package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-hznR8DYl.js} +1 -1
  221. package/server/public/index.html +2 -2
  222. package/server/{pull-requests-By_BteaL.js → pull-requests-7N8WKseP.js} +1 -1
  223. package/server/{pull-requests-8z2N1UOV.js → pull-requests-_lHueOHW.js} +13 -11
  224. package/server/{queries-ZABd5aXP.js → queries-CjNIf-Ub.js} +1200 -201
  225. package/server/{rally-i_goYmiA.js → rally-CyWT_lNO.js} +3 -3
  226. package/server/{rally-api-DqKqIMNR.js → rally-api-C8e_1JRi.js} +2 -2
  227. package/server/{rally-api-xHazRk0d.js → rally-api-ClOSd-Tt.js} +1 -1
  228. package/server/{rally-client-COYz1vYR.js → rally-client-lc-nokqr.js} +4 -4
  229. package/server/{rally-client-CGWEHaPd.js → rally-client-sgtVqzNU.js} +1 -1
  230. package/server/rally-zhhtXuDP.js +3 -0
  231. package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-7KeHv1R1.js} +1 -1
  232. package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-BtHPo6Xc.js} +1 -1
  233. package/server/rebuild-stack-CFvcBHsS.js +4 -0
  234. package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-lwtsW0GO.js} +26 -35
  235. package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-C3Ui7ojV.js} +6 -6
  236. package/server/record-CN0pj4_5.js +3 -0
  237. package/server/{record-update-D3N6WMFR.js → record-update-bLJxAXH4.js} +1 -1
  238. package/server/record-update-dE1Aw83j.js +310 -0
  239. package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BvRWfUXM.js} +2 -2
  240. package/server/{release-engine-DMINVN8S.js → release-engine-Cx48W7z8.js} +5 -5
  241. package/server/{release-set-DeUSOEHy.js → release-set-CQfuN9-v.js} +3 -3
  242. package/server/{remote-b-c5bOce.js → remote-C_2hasl7.js} +3 -3
  243. package/server/{remote-Dr5kGYSZ.js → remote-ChgimyYa.js} +3 -3
  244. package/server/{remote-agents-Ct_WOyke.js → remote-agents-By1ige5O.js} +6 -6
  245. package/server/{remote-agents-D6O_zETW.js → remote-agents-CA3Ihlxj.js} +1 -1
  246. package/server/{remote-completion-Dca3hAaa.js → remote-completion-fVe9e_3u.js} +12 -12
  247. package/server/resume-BFv1PGpA.js +3 -0
  248. package/server/{review-agent-CThvgK2r.js → review-agent-CIGOQYBD.js} +29 -25
  249. package/server/{review-agent-CCum8sGe.js → review-agent-DNboMyW4.js} +1 -1
  250. package/server/{review-artifacts-CXywD0F2.js → review-artifacts-nRDPuMxd.js} +5 -5
  251. package/server/{review-context-OYfKUprb.js → review-context-2uj-YQ8J.js} +70 -26
  252. package/server/review-status-btEYlaxA.js +3 -0
  253. package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-Dci-ZwEt.js} +3 -3
  254. package/server/{review-status-DFRjDFef.js → review-status-kZj_KyCk.js} +77 -28
  255. package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BTOpxtTC.js} +10 -5
  256. package/server/{review-status-sync-D60PJWNL.js → review-status-sync-DSDK3OMy.js} +1 -1
  257. package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CCjVA7Uk.js} +6 -6
  258. package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-CTd4QMBu.js} +1 -1
  259. package/server/{rollup-CZ02qgxk.js → rollup-BKQC7jp4.js} +1 -1
  260. package/server/{rollup-SyuF09e4.js → rollup-FGsKki9R.js} +8 -8
  261. package/server/{scanner-Br0Z5S6R.js → scanner-CnqEZeDy.js} +45 -14
  262. package/server/{sequence-io-fxU0DlwW.js → sequence-io-D909zgeH.js} +4 -4
  263. package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-CzkcK6P5.js} +5 -5
  264. package/server/server.js +2961 -919
  265. package/server/{service-Bagb90KZ.js → service-CLeAoU6G.js} +55 -54
  266. package/server/{session-fork-BqQxd-V6.js → session-fork-CHI1XvL9.js} +2 -2
  267. package/server/{session-history-XdS0JKp3.js → session-history-BT3IvqhC.js} +4 -4
  268. package/server/settings-66A6uvIA.js +2 -0
  269. package/server/{settings-BNbocWOg.js → settings-BTMvpNFU.js} +3 -3
  270. package/server/{settings-uLc6DEYI.js → settings-C0zgxOGf.js} +2 -2
  271. package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BJfgm-hX.js} +2 -2
  272. package/server/{shadow-state-C_NkP-sa.js → shadow-state-7a-524T8.js} +2 -2
  273. package/server/{shadow-state-CbvsN3qG.js → shadow-state-DnDyjujH.js} +1 -1
  274. package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-Db3oroFG.js} +2 -2
  275. package/server/{ship-log-__QtAFXG.js → ship-log-D9MlVzYU.js} +1 -1
  276. package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CV2ukKND.js} +1 -1
  277. package/server/{smart-compaction-CLZOWin1.js → smart-compaction-KCYScAU1.js} +7 -7
  278. package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DKpdFyOC.js} +35 -27
  279. package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-qUC2VWu3.js} +1 -1
  280. package/server/{specialist-completion-CqmduO92.js → specialist-completion-Ky9wCDpb.js} +1 -1
  281. package/server/{specialist-context-CJ-QjFR-.js → specialist-context-Bn3dCGS2.js} +5 -5
  282. package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-CMEwYxa2.js} +2 -2
  283. package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-C5p8G7tx.js} +3 -3
  284. package/server/{specialists-Bg9v4z3F.js → specialists-CC4r-c2s.js} +1015 -460
  285. package/server/{specialists-D0gGXMZx.js → specialists-CShuVGWT.js} +1 -1
  286. package/server/specialists-DM6bWjsi.js +3 -0
  287. package/server/{specialists-CwZHb5cb.js → specialists-jiuuyVkp.js} +66 -74
  288. package/server/specs-C8Wsn2XO.js +3 -0
  289. package/server/{src-BMMoA_ba.js → src-CXmtj0im.js} +6 -6
  290. package/server/{src-Bqdtd6po.js → src-CdmnTM2m.js} +5 -5
  291. package/server/{src-k039WVYY.js → src-DtcUOZCq.js} +112 -18
  292. package/server/stack-health-Bn3o8FBX.js +3 -0
  293. package/server/{stack-health-C-ifC7b0.js → stack-health-DxSdG9cW.js} +63 -9
  294. package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-KJKxxiiQ.js} +4 -4
  295. package/server/{staleness-_Tr-GwdA.js → staleness-CT34nwr9.js} +1 -1
  296. package/server/{staleness-BID1BKdr.js → staleness-DPm7ClwA.js} +15 -3
  297. package/server/{state-home-CONQvZR0.js → state-home-Cn_Qu8IX.js} +96 -44
  298. package/server/{state-migrate-BeBW0KXA.js → state-migrate-BGg2ZaOt.js} +12 -3
  299. package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-DYuPRYYw.js} +307 -26
  300. package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-s9_2qfi6.js} +1 -1
  301. package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-B-FwCs5V.js} +3 -3
  302. package/server/{summary-fork-bX6ax6X7.js → summary-fork-D1RAk9rJ.js} +78 -12
  303. package/server/{summary-fork-agEMsPSo.js → summary-fork-DpcxN9tf.js} +2 -2
  304. package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-Csw5tqfJ.js} +2 -41
  305. package/server/supervisor/pty-supervisor.js +2 -1
  306. package/server/supervisor/pty-token-x-ea28Us.js +43 -0
  307. package/server/supervisor-FTJAIsAK.js +2 -0
  308. package/server/{supervisor-Ctt4eRYz.js → supervisor-wM4ooB5O.js} +3 -3
  309. package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-DlP_UjHq.js} +4 -4
  310. package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-DUDj1YHf.js} +56 -29
  311. package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-DeTTImn-.js} +15 -15
  312. package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-MbxX5vqq.js} +7 -7
  313. package/server/{test-verdict-Cp5tljlJ.js → test-verdict-bWYBtqBg.js} +1 -1
  314. package/server/{test-verdict-D_-sXIz_.js → test-verdict-gscuksPv.js} +1 -1
  315. package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-BYFkts95.js} +1 -1
  316. package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-C-69c3OI.js} +2 -2
  317. package/server/tmux-B6z7h_vZ.js +3 -0
  318. package/server/{tmux-L5LgvGLp.js → tmux-R7N7y-Mh.js} +76 -44
  319. package/server/{token-BkQLy4yS.js → token-BK6t8BIT.js} +2 -2
  320. package/server/token-util-DuPuNriz.js +3 -0
  321. package/server/{token-util-DI8sGlmF.js → token-util-DxXu-vd1.js} +1 -1
  322. package/server/{tracker-config-DdT-nUAM.js → tracker-config-G6latr8C.js} +2 -2
  323. package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-B4ylXZQK.js} +1 -1
  324. package/server/{tracker-utils-CawsPSS2.js → tracker-utils-DHv5pSDT.js} +2 -2
  325. package/server/{traefik-connect-C6mJckNs.js → traefik-connect-Df2uXPsQ.js} +1 -1
  326. package/server/{tunnel-IdK1iTHx.js → tunnel-CDVKJpRv.js} +3 -3
  327. package/server/{tunnel-BIFl98rc.js → tunnel-DGdUkGoZ.js} +1 -1
  328. package/server/{types-7-GnJn0t.js → types-5M0lupud.js} +1 -1
  329. package/server/{uat-train-0Ujk8GCv.js → uat-train-B05BWkp-.js} +1 -1
  330. package/server/{uat-train-j0cPeMSj.js → uat-train-DDSrSoV1.js} +28 -28
  331. package/server/validate-IfDGkaVR.js +177 -0
  332. package/server/{validation-DcAgXTQp.js → validation-CC9OPqJZ.js} +1 -1
  333. package/server/{validation-CabEISJT.js → validation-Dw1pzDzr.js} +259 -9
  334. package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-B3itKTxu.js} +1 -1
  335. package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-TVFSz_q1.js} +1 -1
  336. package/server/{verification-runner-DlJezzef.js → verification-runner-BW4HOKAz.js} +1 -1
  337. package/server/{verification-runner-FiuAZ-H2.js → verification-runner-CkgX6EtI.js} +174 -124
  338. package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DYPbKcIJ.js} +1 -1
  339. package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Du8Vh2aJ.js} +13 -13
  340. package/server/workflows-BQu4RFQ-.js +2 -0
  341. package/server/{workflows-BZNNYkGC.js → workflows-mbQzh6mQ.js} +39 -77
  342. package/server/{workspace-3IC-UkAi.js → workspace--8tnhDI0.js} +1 -1
  343. package/server/{workspace-D9ppycdg.js → workspace-BPUws1-_.js} +3 -3
  344. package/server/{workspace-config-Bigl_-Lk.js → workspace-config-CIVWZOQr.js} +1 -1
  345. package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-CBhNdzE4.js} +76 -18
  346. package/server/workspace-manager-CWT55qeI.js +3 -0
  347. package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-BzHnwwX4.js} +1 -1
  348. package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-_WygnyoX.js} +2 -2
  349. package/server/{workspaces-CFPcL0vl.js → workspaces-Do_9J0LQ.js} +309 -124
  350. package/sync-sources/agents/pan-inspect-agent.md +1 -1
  351. package/sync-sources/agents/pan-merge-agent.md +1 -1
  352. package/sync-sources/agents/pan-planning-agent.md +4 -4
  353. package/sync-sources/agents/pan-work-agent.md +1 -1
  354. package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
  355. package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
  356. package/sync-sources/hooks/record-cost-event.js +369 -75
  357. package/sync-sources/hooks/session-start-hook +7 -0
  358. package/sync-sources/hooks/work-agent-stop-hook +1 -1
  359. package/sync-sources/rules/per-bead-durability.md +1 -1
  360. package/sync-sources/rules/prd-authoring.md +1 -1
  361. package/sync-sources/skills/feature-work/SKILL.md +1 -1
  362. package/sync-sources/skills/okf/README.md +11 -3
  363. package/sync-sources/skills/okf/SKILL.md +12 -1
  364. package/sync-sources/skills/okf/docs/USAGE.md +15 -0
  365. package/sync-sources/skills/okf/references/overdeck.md +28 -0
  366. package/sync-sources/skills/pan/SKILL.md +2 -2
  367. package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
  368. package/sync-sources/skills/pan-approve/SKILL.md +1 -1
  369. package/sync-sources/skills/pan-close/SKILL.md +1 -1
  370. package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
  371. package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
  372. package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
  373. package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
  374. package/sync-sources/skills/pan-orders/SKILL.md +33 -0
  375. package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
  376. package/sync-sources/skills/pan-plan/SKILL.md +6 -6
  377. package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
  378. package/sync-sources/skills/pan-recap/SKILL.md +2 -2
  379. package/sync-sources/skills/pan-review/SKILL.md +1 -1
  380. package/sync-sources/skills/pan-start/SKILL.md +7 -3
  381. package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
  382. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  383. package/sync-sources/skills/pan-task/SKILL.md +2 -2
  384. package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
  385. package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
  386. package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
  387. package/sync-sources/skills/plan/SKILL.md +11 -11
  388. package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
  389. package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
  390. package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
  391. package/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
  392. package/server/agent-state-Co5Sy2Fw.js +0 -3
  393. package/server/agents-DyHKlq1I.js +0 -3
  394. package/server/cli-BRORS9qY.js +0 -3
  395. package/server/codex-DNyiQDKW.js +0 -3
  396. package/server/context-layers-15gDOk20.js +0 -165
  397. package/server/context-layers-DlQKkHH2.js +0 -4
  398. package/server/deacon-swarm-CV54eNmU.js +0 -2
  399. package/server/dist-j64RzSrQ.js +0 -3
  400. package/server/flywheel-6WHU4O7A.js +0 -207
  401. package/server/flywheel-COR0mbRI.js +0 -522
  402. package/server/flywheel-Ctr5uuvo.js +0 -2
  403. package/server/forge-B0_opi-V.js +0 -2
  404. package/server/git-utils-CsKGnzFA.js +0 -3
  405. package/server/hume-BmhvfVbV.js +0 -3
  406. package/server/inspect-agent-Dq0z1k3H.js +0 -2
  407. package/server/layers-Cp1To4L8.js +0 -93
  408. package/server/lifecycle-io-DmY2qwCn.js +0 -3
  409. package/server/merge-blockers-BYjeXrVN.js +0 -41
  410. package/server/merge-ops-DwWCkSgo.js +0 -2
  411. package/server/merge-set-DiISXcC-.js +0 -139
  412. package/server/projects-BKkwpH6q.js +0 -3
  413. package/server/public/assets/index-Bdc4V9ba.css +0 -1
  414. package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
  415. package/server/rally-OSJXdiHK.js +0 -3
  416. package/server/rebuild-stack-CKjJAI8L.js +0 -3
  417. package/server/record-rwK-nKv_.js +0 -3
  418. package/server/record-update-Crz74r-6.js +0 -168
  419. package/server/resume-wZZsWtzz.js +0 -3
  420. package/server/review-status-Bnh-rdkY.js +0 -3
  421. package/server/settings-BlUsVaUc.js +0 -2
  422. package/server/specialists-Dqe6_HE5.js +0 -3
  423. package/server/specs-BhOKBzqk.js +0 -3
  424. package/server/stack-health-Bd06frFn.js +0 -3
  425. package/server/supervisor-COVHrBTg.js +0 -2
  426. package/server/tmux-BAvtac_u.js +0 -3
  427. package/server/token-util-BArZLN6w.js +0 -3
  428. package/server/workflows-C4mR0Reb.js +0 -2
  429. package/server/workspace-manager-B1WOfKvB.js +0 -3
@@ -1,60 +1,60 @@
1
1
  import { i as __require, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Hn as init_projects, In as getProjectSync, Kn as listProjectsSync, Mr as AGENTS_DIR, Nt as init_record, Rt as readIssueRecordSync, Vr as OVERDECK_HOME, b as DEFAULT_CONFIG$1, ci as sessionFilePath, cn as init_auto_commit, f as loadConfigSync, fn as STATE_PLANE_PATHS, gn as isStatePlanePath, ii as init_paths, jr as init_errors, mn as init_state_plane, nr as resolveProjectFromIssueSync, pn as getMainDivergence, s as init_load, un as reconcileStatePlaneDrift, x as init_defaults } from "./config-yaml-ig8Nwtiw.js";
3
- import { n as init_build_info, t as getBuildInfo } from "./build-info-NU3KbXYw.js";
4
- import { n as getDashboardIdentity, t as recordDeaconNudge } from "./deacon-nudge-log-D6K9K-rE.js";
2
+ import { Gr as sessionFilePath, Gt as reconcileStatePlaneDrift, Jt as getMainDivergence, Nt as readIssueRecordSync, Ot as init_record, Tn as init_projects, Ut as init_auto_commit, Vr as init_paths, Yt as init_state_plane, Zt as isStatePlanePath, b as DEFAULT_CONFIG$1, f as loadConfigSync, hr as AGENTS_DIR, kn as listProjectsSync, mr as init_errors, qt as STATE_PLANE_PATHS, s as init_load, wr as OVERDECK_HOME, x as init_defaults, yn as getProjectSync, zn as resolveProjectFromIssueSync } from "./config-yaml-DySPNmKN.js";
3
+ import { n as init_build_info, t as getBuildInfo } from "./build-info-Ie_D0_BT.js";
4
+ import { n as getDashboardIdentity, t as recordDeaconNudge } from "./deacon-nudge-log-6wVqAaqz.js";
5
5
  import { a as init_activity_logger, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-DDlOIAML.js";
6
- import { n as updateIssueRecord, t as init_record_update } from "./record-update-Crz74r-6.js";
7
- import { D as killSession, E as isPaneDead, F as querySessionSync, H as sessionExistsSync, M as listSessions, R as sendKeys, V as sessionExists, i as capturePane, j as listSessionNames, k as listPaneValues, w as init_tmux, z as sendKeysAsync } from "./tmux-L5LgvGLp.js";
8
- import { a as init_event_store, i as initEventStore } from "./event-store-TnWdydfB.js";
9
- import { C as projectLegacySystemHealthSummary, t as init_src } from "./src-k039WVYY.js";
10
- import { S as needsReviewDispatch, c as init_review_status, h as reviewGatesPassedSync, s as getReviewStatusSync, u as loadReviewStatuses, x as init_review_dispatch_decision, y as setReviewStatusSync } from "./review-status-DFRjDFef.js";
11
- import { c as listAllAgentsSync, d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-DXdHmRTC.js";
12
- import { $ as stopAgent, Bn as recordAgentFailure, Dn as getAgentDir, F as isContextOverflowTail, Gn as saveAgentStateSync, I as init_messaging, Jn as setAgentYieldedSync, L as messageAgent, Ln as markAgentRunningState, M as resumeAgent, Mn as init_agent_state, N as init_context_overflow, Q as init_termination, St as init_transcript_landing, Tn as clearYieldForResumeSync, Un as resetAgentFailureCount, Wn as saveAgentState, _r as init_codex_auth, a as listRunningAgentsSync, at as getConcurrencyLimits, dr as init_runtime_state, fr as saveAgentRuntimeState, ft as workResumeSlotsAvailable, hr as applyCodexAuthBurnFlag, ht as setCachedMemoryVerdict, i as listRunningAgents, jn as getAgentStateSync, kn as getAgentState, lr as getAgentRuntimeState, lt as resetPatrolDispatchBudget, mt as init_memory_verdict_cache, n as init_queries, ot as init_concurrency, pn as buildDefaultResumeContinueMessage, qn as setAgentPausedSync, r as listAgentStates, rt as describeRunningAgents, s as init_agents$1, st as releaseAdvancingSlot, tt as countRunningAgents, ur as getAgentRuntimeStateSync, ut as tryReserveAdvancingSlot, vr as paneShowsCodexAuthBurn, vt as deliverInitialPromptWithRetry, wn as clearAgentTroubledSync, xt as captureTranscriptUserRecordSnapshot } from "./queries-ZABd5aXP.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-XdS0JKp3.js";
14
- import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-CawsPSS2.js";
15
- import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-CXsfxslp.js";
16
- import { c as init_review_status_sync, l as markWorkspaceStuck } from "./review-status-sync-DpAMD_WO.js";
6
+ import { n as updateIssueRecord, t as init_record_update } from "./record-update-dE1Aw83j.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-R7N7y-Mh.js";
8
+ import { a as init_event_store, i as initEventStore } from "./event-store-CQL6NeqB.js";
9
+ import { E as projectLegacySystemHealthSummary, t as init_src } from "./src-DtcUOZCq.js";
10
+ import { C as needsReviewDispatch, S as init_review_dispatch_decision, b as setReviewStatusSync, c as getReviewStatusSync, d as loadReviewStatuses, g as reviewGatesPassedSync, l as init_review_status } from "./review-status-kZj_KyCk.js";
11
+ import { c as listAllAgentsSync, d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-EbI0zCJl.js";
12
+ import { Ar as saveAgentRuntimeState, Ct as tryReserveAdvancingSlot, Dr as getAgentRuntimeState, Dt as init_memory_verdict_cache, Fr as init_codex_auth, Ft as init_transcript_landing, G as resumeAgent, Gn as getAgentDir, Hn as clearAgentTroubledSync, Ir as paneShowsCodexAuthBurn, J as isContextOverflowTail, K as init_context_overflow, Nr as applyCodexAuthBurnFlag, Or as getAgentRuntimeStateSync, Ot as setCachedMemoryVerdict, Pt as captureTranscriptUserRecordSnapshot, St as resetPatrolDispatchBudget, Tt as workResumeSlotsAvailable, Un as clearYieldForResumeSync, X as messageAgent, Xn as init_agent_state, Y as init_messaging, Yn as getAgentStateSync, _ as init_linux, a as listRunningAgentsSync, b as init_agents$1, bt as releaseAdvancingSlot, c as getRuntimeCensus, cr as saveAgentState, dr as setAgentPausedSync, dt as init_termination, fr as setAgentYieldedSync, ft as stopAgent, g as LINUX_MEMORY_PRESSURE_DEFAULTS, gt as describeRunningAgents, h as init_collector, i as listRunningAgents, ir as recordAgentFailure, jn as buildResumeContinueMessage, jt as deliverInitialPromptWithRetry, kr as init_runtime_state, lr as saveAgentStateSync, m as createHostHealthCollector, mt as countRunningAgents, n as init_queries, qn as getAgentState, r as listAgentStates, s as descendantPidsForSession, sr as resetAgentFailureCount, tr as markAgentRunningState, u as init_runtime_census, v as DARWIN_MEMORY_PRESSURE_DEFAULTS, vt as getConcurrencyLimits, y as init_darwin, yt as init_concurrency } from "./queries-CjNIf-Ub.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-BT3IvqhC.js";
14
+ import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-DHv5pSDT.js";
15
+ import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-s0-oKybJ.js";
16
+ import { c as init_review_status_sync, l as markWorkspaceStuck } from "./review-status-sync-BTOpxtTC.js";
17
17
  import { i as readReviewStatusMap, n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-CxuEjLGg.js";
18
- import { m as readWorkspacePlanSync, o as init_io } from "./io-DQR9PMgS.js";
19
- import { f as init_config, m as loadConfigSync$1, p as loadConfig$1 } from "./config-q4Gvd8dq.js";
20
- import { T as stampBootReconciliation, h as setBootReconciliationDecision, l as isDeaconGloballyPaused, r as getBootReconciliationState, s as init_control_settings } from "./control-settings-D_odMIaC.js";
21
- import { c as init_docker_stats, s as DockerStatsCollector } from "./stack-health-C-ifC7b0.js";
22
- import { l as init_dag, o as getDispatchableItems } from "./dag-CJpgf9A3.js";
23
- import { a as loadCloisterConfigSync, i as loadCloisterConfig, r as init_config$1 } from "./config-DeTsoZdR.js";
24
- import { a as findRecreatedLegacyStatePaths, o as init_state_home } from "./state-home-CONQvZR0.js";
25
- import { a as isAgentIdleForNudge, t as checkStuckAgentRemediation } from "./stuck-remediation-CKnIryGT.js";
26
- import { n as __filename, r as init_esm_shims } from "./esm-shims-dTeNdq7X.js";
27
- import { i as init_staleness, r as computeBuildStaleness } from "./staleness-BID1BKdr.js";
28
- import { a as pidsWithCwdUnder, i as sweepAutoCloseOutCache, n as pruneTerminalStoppedAgents, r as getAutoCloseOutCanonicalState } from "./agent-gc-Dj2gncak.js";
29
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-BXP6g75N.js";
30
- import { r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-DZ-iAnAa.js";
31
- import { a as init_review_convoy_liveness, c as init_review_monitor, i as evaluateReviewConvoyLiveness, o as reviewTimestampMs, r as init_in_flight_guard, s as REVIEW_SUB_ROLES, t as createInFlightGuard } from "./in-flight-guard-BoWm66Kh.js";
32
- import { H as getTmuxSessionName, J as parseReviewerSessionName, _ as getAllProjectSpecialistStatuses, t as init_specialists } from "./specialists-CwZHb5cb.js";
33
- import { a as inferBranchFromWorkspace, i as findWorkspacePath, o as init_archive_planning } from "./archive-planning-BvDuWNMo.js";
34
- import { A as withConcurrencyLimit, k as init_concurrency$1 } from "./github-app-CDPtGF7J.js";
35
- import { n as init_issue_closed, r as isIssueClosed } from "./issue-closed-DtmJM0D0.js";
36
- import { n as shouldSkipDispatchAsMerged, t as init_merge_verification } from "./merge-verification-CqnUzGEK.js";
37
- import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-CpUZl5aE.js";
38
- import { n as reconcileTraefikNetworks, t as init_traefik_connect } from "./traefik-connect-C6mJckNs.js";
39
- import { g as decideAgentAutonomousRedrive, r as coordinateSwarmSlots, y as listFeatureWorkspaces } from "./deacon-swarm-BryRr6AO.js";
40
- import { t as recordRecoveryFailure } from "./recovery-trip-DkzJSej9.js";
41
- import { n as isExplicitNoResumeRequest, t as init_no_resume_mode } from "./no-resume-mode-BWOSZjWd.js";
42
- import { n as reconcileClosedIssueAgents } from "./closed-issue-reaper-CQ3kqha7.js";
43
- import { n as init_label_reconciler, r as reconcilePipelineLabelsPatrol } from "./label-reconciler-Df1ZduPH.js";
44
- import { a as spawnWorkAgentThroughAgentsEndpoint, i as reconcileOrphanProposedSpecs, o as triggerRebuildAndStart } from "./orphan-proposed-reconciler-xklgvNA7.js";
45
- import { n as reconcileIdleWorkspaceStacks } from "./idle-stack-reaper-Yf34xXxY.js";
46
- import { i as readTestVerdictArtifact, n as decideUnsignaledTestAction, r as init_test_verdict } from "./test-verdict-Cp5tljlJ.js";
18
+ import { m as readWorkspacePlanSync, o as init_io } from "./io-C9kF1wtJ.js";
19
+ import { f as init_config, m as loadConfigSync$1, p as loadConfig$1 } from "./config-BZ0sHTju.js";
20
+ import { T as stampBootReconciliation, h as setBootReconciliationDecision, l as isDeaconGloballyPaused, r as getBootReconciliationState, s as init_control_settings } from "./control-settings-BQp7_4uD.js";
21
+ import { d as init_docker_stats, u as DockerStatsCollector } from "./stack-health-DxSdG9cW.js";
22
+ import { l as init_dag, o as getDispatchableItems } from "./dag-B1ucnjDU.js";
23
+ import { a as loadCloisterConfigSync, i as loadCloisterConfig, r as init_config$1 } from "./config-CKxYiCmX.js";
24
+ import { a as findRecreatedLegacyStatePaths, o as init_state_home } from "./state-home-Cn_Qu8IX.js";
25
+ import { M as withConcurrencyLimit, j as init_concurrency$1 } from "./github-app-C3QrAUd0.js";
26
+ import { a as isAgentIdleForNudge, t as checkStuckAgentRemediation } from "./stuck-remediation-DYuPRYYw.js";
27
+ import { n as __filename, r as init_esm_shims } from "./esm-shims-OSHAYaS1.js";
28
+ import { i as init_staleness, r as computeBuildStaleness } from "./staleness-DPm7ClwA.js";
29
+ import { a as pidsWithCwdUnder, i as sweepAutoCloseOutCache, n as pruneTerminalStoppedAgents, r as getAutoCloseOutCanonicalState } from "./agent-gc-CHcnvonI.js";
30
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-CY5L1lB7.js";
31
+ import { r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-7mqqwrX6.js";
32
+ import { a as init_review_convoy_liveness, c as init_review_monitor, i as evaluateReviewConvoyLiveness, o as reviewTimestampMs, r as init_in_flight_guard, s as REVIEW_SUB_ROLES, t as createInFlightGuard } from "./in-flight-guard-CAAkqPLu.js";
33
+ import { J as parseReviewerSessionName, U as getTmuxSessionName, g as getAllProjectSpecialistStatuses, t as init_specialists } from "./specialists-jiuuyVkp.js";
34
+ import { a as inferBranchFromWorkspace, i as findWorkspacePath, o as init_archive_planning } from "./archive-planning-Du25Jtst.js";
35
+ import { n as init_issue_closed, r as isIssueClosed } from "./issue-closed-CDJk4pIp.js";
36
+ import { n as shouldSkipDispatchAsMerged, t as init_merge_verification } from "./merge-verification-BkaOqPsw.js";
37
+ import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-CCjVA7Uk.js";
38
+ import { n as reconcileTraefikNetworks, t as init_traefik_connect } from "./traefik-connect-Df2uXPsQ.js";
39
+ import { g as decideAgentAutonomousRedrive, r as coordinateSwarmSlots, y as listFeatureWorkspaces } from "./deacon-swarm-BXZZ1Z2-.js";
40
+ import { t as recordRecoveryFailure } from "./recovery-trip-BvRWfUXM.js";
41
+ import { n as isExplicitNoResumeRequest, t as init_no_resume_mode } from "./no-resume-mode-Nw29vaFb.js";
42
+ import { n as reconcileClosedIssueAgents } from "./closed-issue-reaper-Bk3SU4RC.js";
43
+ import { n as init_label_reconciler, r as reconcilePipelineLabelsPatrol } from "./label-reconciler-B4iOAjlC.js";
44
+ import { a as spawnWorkAgentThroughAgentsEndpoint, i as reconcileOrphanProposedSpecs, o as triggerRebuildAndStart } from "./orphan-proposed-reconciler-BvKkWMJQ.js";
45
+ import { n as reconcileIdleWorkspaceStacks } from "./idle-stack-reaper-DDIRwxUY.js";
46
+ import { i as readTestVerdictArtifact, n as decideUnsignaledTestAction, r as init_test_verdict } from "./test-verdict-bWYBtqBg.js";
47
47
  import { createRequire } from "node:module";
48
48
  import { join } from "node:path";
49
49
  import { Effect } from "effect";
50
50
  import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "fs";
51
51
  import { dirname as dirname$1, join as join$1 } from "path";
52
52
  import { cpus, loadavg } from "os";
53
- import { cpus as cpus$1, freemem as freemem$1, homedir as homedir$1, loadavg as loadavg$1, platform as platform$1, totalmem as totalmem$1 } from "node:os";
53
+ import { freemem as freemem$1, homedir as homedir$1, platform as platform$1, totalmem as totalmem$1 } from "node:os";
54
54
  import { closeSync as closeSync$1, existsSync as existsSync$1, openSync as openSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, unlinkSync as unlinkSync$1, writeFileSync as writeFileSync$1 } from "node:fs";
55
55
  import { readFile } from "node:fs/promises";
56
56
  import { readFile as readFile$1, readdir as readdir$1, writeFile as writeFile$1 } from "fs/promises";
57
- import { exec, execFile, spawn } from "node:child_process";
57
+ import { exec, execFile, execFileSync, spawn } from "node:child_process";
58
58
  import { promisify } from "node:util";
59
59
  import { exec as exec$1, execFile as execFile$1, spawn as spawn$1 } from "child_process";
60
60
  import { promisify as promisify$1 } from "util";
@@ -89,6 +89,10 @@ init_termination();
89
89
  init_messaging();
90
90
  init_context_overflow();
91
91
  init_agents$1();
92
+ init_darwin();
93
+ init_linux();
94
+ init_collector();
95
+ init_runtime_census();
92
96
  init_queries();
93
97
  const STARTUP_GRACE_MS = 300 * 1e3;
94
98
  const ACTIVITY_WARNING_MS = 900 * 1e3;
@@ -22038,401 +22042,6 @@ function resolveSystemHealthConfig(options = {}) {
22038
22042
  }, options.warn);
22039
22043
  }
22040
22044
  //#endregion
22041
- //#region ../../lib/system-health/types.ts
22042
- function available(value) {
22043
- return {
22044
- status: "available",
22045
- value
22046
- };
22047
- }
22048
- function unavailable(reason) {
22049
- return {
22050
- status: "unavailable",
22051
- reason
22052
- };
22053
- }
22054
- //#endregion
22055
- //#region ../../lib/system-health/darwin.ts
22056
- const execFileAsync$8 = promisify(execFile);
22057
- const COMMAND_TIMEOUT_MS = 5e3;
22058
- const MIB = 1024 ** 2;
22059
- const DARWIN_MEMORY_PRESSURE_DEFAULTS = Object.freeze({
22060
- warningFreePercent: 10,
22061
- criticalFreePercent: 5,
22062
- swapActivityWarningBytesPerMinute: 64 * MIB,
22063
- swapActivityCriticalBytesPerMinute: 256 * MIB
22064
- });
22065
- function parseDarwinMemoryPressure(content) {
22066
- for (const pattern of [/System-wide memory free percentage:\s*([\d.]+)\s*%/i, /System-wide memory free percentage\s*=\s*([\d.]+)\s*%?/i]) {
22067
- const match = content.match(pattern);
22068
- if (!match) continue;
22069
- const value = Number(match[1]);
22070
- if (Number.isFinite(value) && value >= 0 && value <= 100) return value;
22071
- }
22072
- return null;
22073
- }
22074
- function parseDarwinVmStat(content) {
22075
- const pageSizeMatch = content.match(/page size of\s+(\d+)\s+bytes/i);
22076
- if (!pageSizeMatch) return null;
22077
- const pageSizeBytes = Number(pageSizeMatch[1]);
22078
- if (!Number.isFinite(pageSizeBytes) || pageSizeBytes <= 0) return null;
22079
- const pages = /* @__PURE__ */ new Map();
22080
- for (const line of content.split("\n")) {
22081
- const match = line.match(/^([^:]+):\s+(\d+)\.?$/);
22082
- if (!match) continue;
22083
- const value = Number(match[2]);
22084
- if (Number.isFinite(value)) pages.set(match[1].trim(), value);
22085
- }
22086
- const availablePageNames = [
22087
- "Pages free",
22088
- "Pages inactive",
22089
- "Pages speculative"
22090
- ];
22091
- const availablePages = availablePageNames.every((name) => pages.has(name)) ? availablePageNames.reduce((sum, name) => sum + pages.get(name), 0) : void 0;
22092
- const swapIn = pages.get("Swapins");
22093
- const swapOut = pages.get("Swapouts");
22094
- return {
22095
- pageSizeBytes,
22096
- availableMemoryBytes: availablePages == null ? void 0 : availablePages * pageSizeBytes,
22097
- swap: swapIn == null || swapOut == null ? void 0 : {
22098
- pagesIn: swapIn,
22099
- pagesOut: swapOut
22100
- }
22101
- };
22102
- }
22103
- function unitBytes(value, unit) {
22104
- const parsed = Number(value);
22105
- if (!Number.isFinite(parsed) || parsed < 0) return null;
22106
- const multiplier = unit.toUpperCase() === "G" ? 1024 ** 3 : unit.toUpperCase() === "K" ? 1024 : MIB;
22107
- return Math.round(parsed * multiplier);
22108
- }
22109
- function parseDarwinSwapUsage(content) {
22110
- const total = content.match(/total\s*=\s*([\d.]+)([KMG])/i);
22111
- const used = content.match(/used\s*=\s*([\d.]+)([KMG])/i);
22112
- const free = content.match(/free\s*=\s*([\d.]+)([KMG])/i);
22113
- if (!total || !used || !free) return null;
22114
- const totalBytes = unitBytes(total[1], total[2]);
22115
- const usedBytes = unitBytes(used[1], used[2]);
22116
- const freeBytes = unitBytes(free[1], free[2]);
22117
- return totalBytes == null || usedBytes == null || freeBytes == null ? null : {
22118
- totalBytes,
22119
- usedBytes,
22120
- freeBytes
22121
- };
22122
- }
22123
- function aggregateDarwinCpuCounters(cpuInfo) {
22124
- if (cpuInfo.length === 0) return null;
22125
- let idle = 0;
22126
- let total = 0;
22127
- for (const cpu of cpuInfo) {
22128
- const values = Object.values(cpu.times);
22129
- if (values.some((value) => !Number.isFinite(value) || value < 0)) return null;
22130
- idle += cpu.times.idle;
22131
- total += values.reduce((sum, value) => sum + value, 0);
22132
- }
22133
- return {
22134
- idle,
22135
- total
22136
- };
22137
- }
22138
- function computeCpuPercent$1(current, previous) {
22139
- if (!previous) return unavailable("A previous CPU time sample is required.");
22140
- const totalDelta = current.total - previous.total;
22141
- const idleDelta = current.idle - previous.idle;
22142
- if (totalDelta <= 0 || idleDelta < 0 || idleDelta > totalDelta) return unavailable("CPU times did not advance monotonically.");
22143
- return available(Math.round((totalDelta - idleDelta) / totalDelta * 1e3) / 10);
22144
- }
22145
- function computeSwapActivity(current, previous, elapsedMs, pageSizeBytes) {
22146
- if (!previous) return unavailable("A previous swap counter sample is required.");
22147
- const pages = current.pagesIn - previous.pagesIn + current.pagesOut - previous.pagesOut;
22148
- if (pages < 0 || elapsedMs <= 0) return unavailable("Swap counters or sample timing were invalid.");
22149
- return available(Math.round(pages * pageSizeBytes * 6e4 / elapsedMs));
22150
- }
22151
- function percent$1(part, total) {
22152
- if (total <= 0) return 0;
22153
- return Math.round(part / total * 1e3) / 10;
22154
- }
22155
- const defaultAdapters$1 = {
22156
- execFile: async (command, args, timeoutMs) => {
22157
- const { stdout } = await execFileAsync$8(command, [...args], {
22158
- encoding: "utf-8",
22159
- timeout: timeoutMs
22160
- });
22161
- return stdout;
22162
- },
22163
- cpus: cpus$1,
22164
- loadAverage1m: () => loadavg$1()[0] ?? 0,
22165
- totalMemoryBytes: totalmem$1,
22166
- now: () => Date.now()
22167
- };
22168
- async function command(adapters, executable, args) {
22169
- try {
22170
- return await adapters.execFile(executable, args, COMMAND_TIMEOUT_MS);
22171
- } catch {
22172
- return null;
22173
- }
22174
- }
22175
- function createDarwinHostHealthCollector(adapters = defaultAdapters$1) {
22176
- return {
22177
- platform: "darwin",
22178
- async sample(previous) {
22179
- const sampledAtMs = adapters.now();
22180
- const [pressureOutput, vmStatOutput, swapOutput] = await Promise.all([
22181
- command(adapters, "memory_pressure", ["-Q"]),
22182
- command(adapters, "vm_stat", []),
22183
- command(adapters, "sysctl", ["-n", "vm.swapusage"])
22184
- ]);
22185
- const pressureFreePercent = pressureOutput == null ? null : parseDarwinMemoryPressure(pressureOutput);
22186
- const vmStat = vmStatOutput == null ? null : parseDarwinVmStat(vmStatOutput);
22187
- const swapUsage = swapOutput == null ? null : parseDarwinSwapUsage(swapOutput);
22188
- const cpuInfo = adapters.cpus();
22189
- const cpuCounters = aggregateDarwinCpuCounters(cpuInfo);
22190
- const totalMemoryBytes = adapters.totalMemoryBytes();
22191
- const availableMemoryBytes = pressureFreePercent != null ? Math.round(totalMemoryBytes * pressureFreePercent / 100) : vmStat?.availableMemoryBytes ?? null;
22192
- const usedMemoryBytes = Number.isFinite(totalMemoryBytes) && availableMemoryBytes != null ? Math.max(totalMemoryBytes - availableMemoryBytes, 0) : null;
22193
- const loadAverage1m = adapters.loadAverage1m();
22194
- const elapsedMs = previous ? sampledAtMs - previous.sampledAtMs : 0;
22195
- return {
22196
- platform: "darwin",
22197
- sampledAtMs,
22198
- cpuPercent: cpuCounters ? computeCpuPercent$1(cpuCounters, previous?.counters.cpu) : unavailable("macOS CPU times are unavailable."),
22199
- loadAverage1m: Number.isFinite(loadAverage1m) && loadAverage1m >= 0 ? available(loadAverage1m) : unavailable("The one-minute load average is unavailable."),
22200
- loadPerCore1m: Number.isFinite(loadAverage1m) && loadAverage1m >= 0 && cpuInfo.length > 0 ? available(Math.round(loadAverage1m / cpuInfo.length * 100) / 100) : unavailable("Load average or CPU core count is unavailable."),
22201
- totalMemoryBytes: Number.isFinite(totalMemoryBytes) && totalMemoryBytes > 0 ? available(totalMemoryBytes) : unavailable("Total memory is unavailable."),
22202
- usedMemoryBytes: usedMemoryBytes == null ? unavailable("Used memory cannot be derived.") : available(usedMemoryBytes),
22203
- availableMemoryBytes: availableMemoryBytes == null ? unavailable("Available memory is unavailable.") : available(availableMemoryBytes),
22204
- memoryUsedPercent: usedMemoryBytes == null ? unavailable("Memory utilization cannot be derived.") : available(percent$1(usedMemoryBytes, totalMemoryBytes)),
22205
- memoryPressureSomeAvg10: unavailable("macOS does not expose Linux memory PSI."),
22206
- memoryPressureFullAvg10: unavailable("macOS does not expose Linux memory PSI."),
22207
- memoryPressureFreePercent: pressureFreePercent == null ? unavailable("memory_pressure did not report a recognized free percentage.") : available(pressureFreePercent),
22208
- swapTotalBytes: swapUsage ? available(swapUsage.totalBytes) : unavailable("vm.swapusage is unavailable."),
22209
- swapUsedBytes: swapUsage ? available(swapUsage.usedBytes) : unavailable("vm.swapusage is unavailable."),
22210
- swapUsedPercent: swapUsage ? available(percent$1(swapUsage.usedBytes, swapUsage.totalBytes)) : unavailable("vm.swapusage is unavailable."),
22211
- swapActivityBytesPerMinute: vmStat?.swap ? computeSwapActivity(vmStat.swap, previous?.counters.swap, elapsedMs, vmStat.pageSizeBytes) : unavailable("vm_stat swap activity counters are unavailable."),
22212
- committedMemoryBytes: unavailable("macOS does not expose Linux Committed_AS."),
22213
- commitLimitBytes: unavailable("macOS does not expose Linux CommitLimit."),
22214
- virtualCommitmentPercent: unavailable("macOS virtual commitment is unavailable."),
22215
- counters: {
22216
- cpu: cpuCounters,
22217
- swap: vmStat?.swap ?? null
22218
- }
22219
- };
22220
- }
22221
- };
22222
- }
22223
- //#endregion
22224
- //#region ../../lib/system-health/linux.ts
22225
- const execFileAsync$7 = promisify(execFile);
22226
- const KB$1 = 1024;
22227
- const LINUX_MEMORY_PRESSURE_DEFAULTS = Object.freeze({
22228
- someWarningAvg10: 5,
22229
- fullCriticalAvg10: 1,
22230
- swapActivityWarningBytesPerMinute: 64 * 1024 ** 2,
22231
- swapActivityCriticalBytesPerMinute: 256 * 1024 ** 2
22232
- });
22233
- function parseMemInfo(content) {
22234
- const values = /* @__PURE__ */ new Map();
22235
- for (const line of content.split("\n")) {
22236
- const match = line.match(/^(\w+):\s+(\d+)\s+kB$/);
22237
- if (!match) continue;
22238
- const value = Number(match[2]);
22239
- if (Number.isFinite(value)) values.set(match[1], value * KB$1);
22240
- }
22241
- return {
22242
- memTotalBytes: values.get("MemTotal"),
22243
- memAvailableBytes: values.get("MemAvailable"),
22244
- swapTotalBytes: values.get("SwapTotal"),
22245
- swapFreeBytes: values.get("SwapFree"),
22246
- committedMemoryBytes: values.get("Committed_AS"),
22247
- commitLimitBytes: values.get("CommitLimit")
22248
- };
22249
- }
22250
- function parseProcStat(content) {
22251
- const lines = content.split("\n");
22252
- const cpuLine = lines.find((line) => line.startsWith("cpu "));
22253
- if (!cpuLine) return null;
22254
- const values = cpuLine.trim().split(/\s+/).slice(1).map(Number);
22255
- if (values.length < 4 || values.some((value) => !Number.isFinite(value))) return null;
22256
- const idle = values[3] + (values[4] ?? 0);
22257
- const total = values.reduce((sum, value) => sum + value, 0);
22258
- const coreCount = lines.filter((line) => /^cpu\d+\s/.test(line)).length;
22259
- if (total < 0 || idle < 0) return null;
22260
- return {
22261
- cpu: {
22262
- idle,
22263
- total
22264
- },
22265
- coreCount: Math.max(coreCount, 1)
22266
- };
22267
- }
22268
- function parseMemoryPressure(content) {
22269
- const result = {};
22270
- for (const line of content.split("\n")) {
22271
- const match = line.match(/^(some|full)\s+.*\bavg10=([^\s]+)/);
22272
- if (!match) continue;
22273
- const value = Number(match[2]);
22274
- if (!Number.isFinite(value) || value < 0) continue;
22275
- if (match[1] === "some") result.someAvg10 = value;
22276
- if (match[1] === "full") result.fullAvg10 = value;
22277
- }
22278
- return result;
22279
- }
22280
- function parseVmstat(content) {
22281
- let pagesIn = null;
22282
- let pagesOut = null;
22283
- for (const line of content.split("\n")) {
22284
- const match = line.match(/^(pswpin|pswpout)\s+(\d+)$/);
22285
- if (!match) continue;
22286
- const value = Number(match[2]);
22287
- if (!Number.isFinite(value)) continue;
22288
- if (match[1] === "pswpin") pagesIn = value;
22289
- if (match[1] === "pswpout") pagesOut = value;
22290
- }
22291
- return pagesIn == null || pagesOut == null ? null : {
22292
- pagesIn,
22293
- pagesOut
22294
- };
22295
- }
22296
- function parseLoadAverage(content) {
22297
- const value = Number(content.trim().split(/\s+/)[0]);
22298
- return Number.isFinite(value) && value >= 0 ? value : null;
22299
- }
22300
- function computeCpuPercent(current, previous) {
22301
- if (!previous) return unavailable("A previous CPU counter sample is required.");
22302
- const totalDelta = current.total - previous.total;
22303
- const idleDelta = current.idle - previous.idle;
22304
- if (totalDelta <= 0 || idleDelta < 0 || idleDelta > totalDelta) return unavailable("CPU counters did not advance monotonically.");
22305
- return available(Math.round((totalDelta - idleDelta) / totalDelta * 1e3) / 10);
22306
- }
22307
- function computeSwapActivityBytesPerMinute(current, previous, elapsedMs, pageSizeBytes) {
22308
- if (!previous) return unavailable("A previous swap counter sample is required.");
22309
- const pageDelta = current.pagesIn - previous.pagesIn + current.pagesOut - previous.pagesOut;
22310
- if (pageDelta < 0 || elapsedMs <= 0 || !Number.isFinite(pageSizeBytes) || pageSizeBytes <= 0) return unavailable("Swap counters or sample timing were invalid.");
22311
- return available(Math.round(pageDelta * pageSizeBytes * 6e4 / elapsedMs));
22312
- }
22313
- const defaultAdapters = {
22314
- readFile: (path) => readFile(path, "utf-8"),
22315
- readPageSizeBytes: async () => {
22316
- const { stdout } = await execFileAsync$7("getconf", ["PAGESIZE"], {
22317
- encoding: "utf-8",
22318
- timeout: 5e3
22319
- });
22320
- const value = Number(stdout.trim());
22321
- if (!Number.isFinite(value) || value <= 0) throw new Error("getconf returned an invalid page size");
22322
- return value;
22323
- },
22324
- now: () => Date.now()
22325
- };
22326
- async function readParsed(adapters, path, parse) {
22327
- try {
22328
- return parse(await adapters.readFile(path));
22329
- } catch {
22330
- return null;
22331
- }
22332
- }
22333
- function percent(part, total) {
22334
- if (total <= 0) return 0;
22335
- return Math.round(part / total * 1e3) / 10;
22336
- }
22337
- function createLinuxHostHealthCollector(adapters = defaultAdapters) {
22338
- return {
22339
- platform: "linux",
22340
- async sample(previous) {
22341
- const sampledAtMs = adapters.now();
22342
- const [memInfo, procStat, pressure, vmstat, loadAverage, pageSizeBytes] = await Promise.all([
22343
- readParsed(adapters, "/proc/meminfo", parseMemInfo),
22344
- readParsed(adapters, "/proc/stat", parseProcStat),
22345
- readParsed(adapters, "/proc/pressure/memory", parseMemoryPressure),
22346
- readParsed(adapters, "/proc/vmstat", parseVmstat),
22347
- readParsed(adapters, "/proc/loadavg", parseLoadAverage),
22348
- adapters.readPageSizeBytes().catch(() => null)
22349
- ]);
22350
- const totalMemoryBytes = memInfo?.memTotalBytes;
22351
- const availableMemoryBytes = memInfo?.memAvailableBytes;
22352
- const usedMemoryBytes = totalMemoryBytes != null && availableMemoryBytes != null ? Math.max(totalMemoryBytes - availableMemoryBytes, 0) : null;
22353
- const swapTotalBytes = memInfo?.swapTotalBytes;
22354
- const swapFreeBytes = memInfo?.swapFreeBytes;
22355
- const swapUsedBytes = swapTotalBytes != null && swapFreeBytes != null ? Math.max(swapTotalBytes - swapFreeBytes, 0) : null;
22356
- const committedMemoryBytes = memInfo?.committedMemoryBytes;
22357
- const commitLimitBytes = memInfo?.commitLimitBytes;
22358
- const cpuCounters = procStat?.cpu ?? null;
22359
- const swapCounters = vmstat ?? null;
22360
- const elapsedMs = previous ? sampledAtMs - previous.sampledAtMs : 0;
22361
- return {
22362
- platform: "linux",
22363
- sampledAtMs,
22364
- cpuPercent: cpuCounters ? computeCpuPercent(cpuCounters, previous?.counters.cpu) : unavailable("The aggregate CPU counters are unavailable."),
22365
- loadAverage1m: loadAverage == null ? unavailable("The one-minute load average is unavailable.") : available(loadAverage),
22366
- loadPerCore1m: loadAverage == null || !procStat ? unavailable("Load average or CPU core count is unavailable.") : available(Math.round(loadAverage / procStat.coreCount * 100) / 100),
22367
- totalMemoryBytes: totalMemoryBytes == null ? unavailable("MemTotal is unavailable.") : available(totalMemoryBytes),
22368
- usedMemoryBytes: usedMemoryBytes == null ? unavailable("Used memory cannot be derived without MemTotal and MemAvailable.") : available(usedMemoryBytes),
22369
- availableMemoryBytes: availableMemoryBytes == null ? unavailable("MemAvailable is unavailable.") : available(availableMemoryBytes),
22370
- memoryUsedPercent: usedMemoryBytes == null || totalMemoryBytes == null ? unavailable("Memory utilization cannot be derived.") : available(percent(usedMemoryBytes, totalMemoryBytes)),
22371
- memoryPressureSomeAvg10: pressure?.someAvg10 == null ? unavailable("Linux memory PSI some.avg10 is unavailable.") : available(pressure.someAvg10),
22372
- memoryPressureFullAvg10: pressure?.fullAvg10 == null ? unavailable("Linux memory PSI full.avg10 is unavailable.") : available(pressure.fullAvg10),
22373
- memoryPressureFreePercent: unavailable("Linux reports memory pressure through PSI."),
22374
- swapTotalBytes: swapTotalBytes == null ? unavailable("SwapTotal is unavailable.") : available(swapTotalBytes),
22375
- swapUsedBytes: swapUsedBytes == null ? unavailable("Swap usage cannot be derived without SwapTotal and SwapFree.") : available(swapUsedBytes),
22376
- swapUsedPercent: swapUsedBytes == null || swapTotalBytes == null ? unavailable("Swap utilization cannot be derived.") : available(percent(swapUsedBytes, swapTotalBytes)),
22377
- swapActivityBytesPerMinute: swapCounters && pageSizeBytes != null ? computeSwapActivityBytesPerMinute(swapCounters, previous?.counters.swap, elapsedMs, pageSizeBytes) : unavailable("Linux swap activity counters are unavailable."),
22378
- committedMemoryBytes: committedMemoryBytes == null ? unavailable("Committed_AS is unavailable.") : available(committedMemoryBytes),
22379
- commitLimitBytes: commitLimitBytes == null ? unavailable("CommitLimit is unavailable.") : available(commitLimitBytes),
22380
- virtualCommitmentPercent: committedMemoryBytes == null || commitLimitBytes == null ? unavailable("Virtual commitment cannot be derived.") : available(percent(committedMemoryBytes, commitLimitBytes)),
22381
- counters: {
22382
- cpu: cpuCounters,
22383
- swap: swapCounters
22384
- }
22385
- };
22386
- }
22387
- };
22388
- }
22389
- //#endregion
22390
- //#region ../../lib/system-health/collector.ts
22391
- /**
22392
- * Selects the platform host-health collector. Linux and macOS expose native
22393
- * current-pressure signals; unsupported platforms return unavailable signals
22394
- * so callers never mistake missing measurements for measured zeroes.
22395
- */
22396
- function createUnsupportedCollector(platform = "unsupported") {
22397
- const signal = () => unavailable("Host health collection is unsupported on this platform.");
22398
- return {
22399
- platform,
22400
- async sample() {
22401
- return {
22402
- platform,
22403
- sampledAtMs: Date.now(),
22404
- cpuPercent: signal(),
22405
- loadAverage1m: signal(),
22406
- loadPerCore1m: signal(),
22407
- totalMemoryBytes: signal(),
22408
- usedMemoryBytes: signal(),
22409
- availableMemoryBytes: signal(),
22410
- memoryUsedPercent: signal(),
22411
- memoryPressureSomeAvg10: signal(),
22412
- memoryPressureFullAvg10: signal(),
22413
- memoryPressureFreePercent: signal(),
22414
- swapTotalBytes: signal(),
22415
- swapUsedBytes: signal(),
22416
- swapUsedPercent: signal(),
22417
- swapActivityBytesPerMinute: signal(),
22418
- committedMemoryBytes: signal(),
22419
- commitLimitBytes: signal(),
22420
- virtualCommitmentPercent: signal(),
22421
- counters: {
22422
- cpu: null,
22423
- swap: null
22424
- }
22425
- };
22426
- }
22427
- };
22428
- }
22429
- function createHostHealthCollector(selection = {}) {
22430
- const platform = selection.platform ?? platform$1();
22431
- if (platform === "linux") return selection.linux ?? createLinuxHostHealthCollector();
22432
- if (platform === "darwin") return selection.darwin ?? createDarwinHostHealthCollector();
22433
- return createUnsupportedCollector();
22434
- }
22435
- //#endregion
22436
22045
  //#region ../../lib/system-health/evaluate.ts
22437
22046
  function value(signal) {
22438
22047
  return signal.status === "available" ? signal.value : null;
@@ -22800,7 +22409,7 @@ function acceptedReasons(state, hostReasons, agents, services) {
22800
22409
  //#endregion
22801
22410
  //#region services/system-health-service.ts
22802
22411
  init_review_status_source();
22803
- const execAsync$4 = promisify(exec);
22412
+ const execAsync$3 = promisify(exec);
22804
22413
  const KB = 1024;
22805
22414
  const GIB$1 = 1024 ** 3;
22806
22415
  let dockerStatsCollector$1 = null;
@@ -22903,7 +22512,7 @@ async function readProcMemoryDarwin() {
22903
22512
  let memAvailable = freemem$1();
22904
22513
  let memFree = freemem$1();
22905
22514
  try {
22906
- const { stdout } = await execAsync$4("vm_stat", {
22515
+ const { stdout } = await execAsync$3("vm_stat", {
22907
22516
  encoding: "utf-8",
22908
22517
  timeout: 5e3
22909
22518
  });
@@ -22923,7 +22532,7 @@ async function readProcMemoryDarwin() {
22923
22532
  let swapTotal = 0;
22924
22533
  let swapFree = 0;
22925
22534
  try {
22926
- const { stdout } = await execAsync$4("sysctl -n vm.swapusage", {
22535
+ const { stdout } = await execAsync$3("sysctl -n vm.swapusage", {
22927
22536
  encoding: "utf-8",
22928
22537
  timeout: 5e3
22929
22538
  });
@@ -22945,47 +22554,6 @@ async function readProcMemoryDarwin() {
22945
22554
  async function readProcMemory() {
22946
22555
  return platform$1() === "darwin" ? readProcMemoryDarwin() : readProcMemoryLinux();
22947
22556
  }
22948
- async function readProcessTable() {
22949
- const { stdout } = await execAsync$4("ps -eo pid=,ppid=,rss=,args=", {
22950
- encoding: "utf-8",
22951
- timeout: 1e4
22952
- });
22953
- const rows = /* @__PURE__ */ new Map();
22954
- for (const line of stdout.split("\n")) {
22955
- const trimmed = line.trim();
22956
- if (!trimmed) continue;
22957
- const match = trimmed.match(/^(\d+)\s+(\d+)\s+(\d+)\s+(.+)$/);
22958
- if (!match) continue;
22959
- const pid = Number(match[1]);
22960
- const ppid = Number(match[2]);
22961
- const rssKb = Number(match[3]);
22962
- const command = match[4] ?? "";
22963
- if (!Number.isFinite(pid) || !Number.isFinite(ppid) || !Number.isFinite(rssKb)) continue;
22964
- rows.set(pid, {
22965
- pid,
22966
- ppid,
22967
- rssKb,
22968
- command
22969
- });
22970
- }
22971
- return rows;
22972
- }
22973
- function getDescendantPids(rootPid, processes) {
22974
- const descendants = /* @__PURE__ */ new Set();
22975
- const queue = [rootPid];
22976
- while (queue.length > 0) {
22977
- const pid = queue.shift();
22978
- if (!pid || descendants.has(pid)) continue;
22979
- descendants.add(pid);
22980
- for (const process of processes.values()) if (process.ppid === pid && !descendants.has(process.pid)) queue.push(process.pid);
22981
- }
22982
- return descendants;
22983
- }
22984
- function sumProcessMemory(descendants, processes) {
22985
- let totalRssKb = 0;
22986
- for (const pid of descendants) totalRssKb += processes.get(pid)?.rssKb ?? 0;
22987
- return totalRssKb * KB;
22988
- }
22989
22557
  function buildLeakedSpecialists(agents) {
22990
22558
  return agents.filter((agent) => agent.kind === "specialist" && agent.lifecycle === "orphaned").map((agent) => ({
22991
22559
  name: agent.id,
@@ -23030,14 +22598,11 @@ async function collectAgentProcesses() {
23030
22598
  const admittedWorkAgentCount = countAdmittedWorkAgents(registeredAgents, nowMs);
23031
22599
  const activeAgents = registeredAgents.filter((agent) => agent.status !== "stopped");
23032
22600
  const liveSessions = new Set(registeredAgents.filter((agent) => agent.tmuxActive).map((agent) => agent.id));
23033
- const processTable = await readProcessTable().catch(() => /* @__PURE__ */ new Map());
22601
+ const runtimeCensus = await getRuntimeCensus();
23034
22602
  const reviewStatuses = reviewStatusMap();
23035
22603
  const collected = await Promise.all(activeAgents.map(async (agent) => {
23036
22604
  const [runtimeState, runtimeSnapshot] = await Promise.all([Effect.runPromise(getAgentRuntimeState(agent.id)).catch(() => null), Effect.runPromise(getRuntimeSnapshot(agent.id)).catch(() => null)]);
23037
- const panePidValue = (await Effect.runPromise(listPaneValues(agent.id, "#{pane_pid}")))[0];
23038
- const panePid = Number(panePidValue ?? "0");
23039
- const descendants = Number.isFinite(panePid) && panePid > 0 ? getDescendantPids(panePid, processTable) : /* @__PURE__ */ new Set();
23040
- const memoryBytes = descendants.size > 0 ? sumProcessMemory(descendants, processTable) : 0;
22605
+ const memoryBytes = [...descendantPidsForSession(runtimeCensus, agent.id)].reduce((sum, pid) => sum + (runtimeCensus.processesByPid.get(pid)?.rssBytes ?? 0), 0);
23041
22606
  const lifecycle = agentLifecycle(agent.role, agent.issueId, agent.tmuxActive, reviewStatuses);
23042
22607
  return {
23043
22608
  process: {
@@ -23505,9 +23070,18 @@ async function assessMemoryPressure() {
23505
23070
  return verdict;
23506
23071
  }
23507
23072
  //#endregion
23073
+ //#region ../../lib/cloister/agent-grace.ts
23074
+ init_tracker_utils();
23075
+ init_concurrency$1();
23076
+ const WORK_LAUNCHER_GRACE_MS = 12e4;
23077
+ function isStartingWithinGrace(state, now = Date.now(), graceMs = WORK_LAUNCHER_GRACE_MS) {
23078
+ if (state.status !== "starting") return false;
23079
+ const startedMs = Date.parse(state.startedAt ?? "");
23080
+ return Number.isFinite(startedMs) && now - startedMs < graceMs;
23081
+ }
23082
+ //#endregion
23508
23083
  //#region ../../lib/cloister/deacon-inspect.ts
23509
23084
  init_review_status();
23510
- init_tmux();
23511
23085
  /**
23512
23086
  * Inspect prompts state a 10-minute budget. Deacon gives the agent a small
23513
23087
  * grace window beyond that, then fails loud so the parent work agent never waits
@@ -23548,7 +23122,7 @@ async function checkInspectAgentTimeouts(now = /* @__PURE__ */ new Date()) {
23548
23122
  console.warn(`[deacon] Failed to kill inspect session ${sessionName}: ${msg}`);
23549
23123
  });
23550
23124
  try {
23551
- const { messageAgent } = await import("./agents-DyHKlq1I.js");
23125
+ const { messageAgent } = await import("./agents-wi9NWzs2.js");
23552
23126
  await messageAgent(`agent-${issueId.toLowerCase()}`, verdict, "deacon:inspect-watchdog");
23553
23127
  } catch (err) {
23554
23128
  const msg = err instanceof Error ? err.message : String(err);
@@ -23601,8 +23175,50 @@ async function handleKnownAgentModal(agentId, deps = defaultDeps$1, initialPane)
23601
23175
  await deps.settle();
23602
23176
  return modal.matches(await deps.capturePane(agentId)) ? "needs-you" : "handled";
23603
23177
  }
23178
+ const ORCHESTRATED_COMPACTION_CONTINUE_MESSAGE = "Compaction complete. Continue from the compacted summary now. Re-read your current xBRIEF item and latest feedback file if needed, then resume work; do not wait for further input.";
23179
+ const orchestratedCompactionContinuations = /* @__PURE__ */ new Map();
23180
+ function scheduleOrchestratedCompactionContinuation(sessionName, requestedAt = Date.now()) {
23181
+ orchestratedCompactionContinuations.set(sessionName, {
23182
+ requestedAt,
23183
+ observedBusy: false
23184
+ });
23185
+ }
23186
+ function cancelOrchestratedCompactionContinuation(sessionName) {
23187
+ orchestratedCompactionContinuations.delete(sessionName);
23188
+ }
23189
+ function hasOrchestratedCompactionContinuation(sessionName) {
23190
+ return orchestratedCompactionContinuations.has(sessionName);
23191
+ }
23192
+ async function deliverOrchestratedCompact(sessionName, deliver) {
23193
+ scheduleOrchestratedCompactionContinuation(sessionName);
23194
+ try {
23195
+ await deliver();
23196
+ } catch (error) {
23197
+ cancelOrchestratedCompactionContinuation(sessionName);
23198
+ throw error;
23199
+ }
23200
+ }
23201
+ async function maybeContinueOrchestratedCompaction(args) {
23202
+ const pending = orchestratedCompactionContinuations.get(args.sessionName);
23203
+ if (!pending) return false;
23204
+ const elapsed = (args.now ?? Date.now()) - pending.requestedAt;
23205
+ if (!args.tmuxOutput.includes("❯")) {
23206
+ pending.observedBusy = true;
23207
+ if (elapsed >= 15e4) orchestratedCompactionContinuations.delete(args.sessionName);
23208
+ return false;
23209
+ }
23210
+ if (isContextOverflowTail(args.tmuxOutput)) {
23211
+ if (elapsed >= 15e4) orchestratedCompactionContinuations.delete(args.sessionName);
23212
+ return false;
23213
+ }
23214
+ if (!pending.observedBusy && elapsed < 3e4) return false;
23215
+ await args.send(args.sessionName, ORCHESTRATED_COMPACTION_CONTINUE_MESSAGE);
23216
+ orchestratedCompactionContinuations.delete(args.sessionName);
23217
+ return true;
23218
+ }
23604
23219
  //#endregion
23605
23220
  //#region ../../lib/cloister/deacon-api-recovery.ts
23221
+ init_context_overflow();
23606
23222
  init_agents$1();
23607
23223
  init_review_status();
23608
23224
  init_tmux();
@@ -23700,13 +23316,13 @@ async function maybeProactivelyCompactContext(sessionName, now) {
23700
23316
  if (!agentState?.workspace || !sessionId || !agentState.model) return null;
23701
23317
  let usage = null;
23702
23318
  try {
23703
- const { computeContextUsage } = await import("./conversation-service-Dq33SYEj.js");
23319
+ const { computeContextUsage } = await import("./conversation-service-BLd3MYsG.js");
23704
23320
  usage = await computeContextUsage(sessionFilePath(agentState.workspace, sessionId), agentState.model);
23705
23321
  } catch {
23706
23322
  return null;
23707
23323
  }
23708
23324
  if (!usage || usage.percentUsed < 85) return null;
23709
- await Effect.runPromise(sendKeys(sessionName, "/compact"));
23325
+ await deliverOrchestratedCompact(sessionName, () => Effect.runPromise(sendKeys(sessionName, "/compact")));
23710
23326
  contextProactiveCompactState.set(sessionName, { lastAttempt: now });
23711
23327
  try {
23712
23328
  await writeFile$1(join$1(getAgentDir(sessionName), PROACTIVE_COMPACT_STAMP_FILE), new Date(now).toISOString(), "utf-8");
@@ -23736,10 +23352,11 @@ async function checkApiErrorAgents() {
23736
23352
  } catch {
23737
23353
  return actions;
23738
23354
  }
23739
- const nonReviewerSessions = sessionNames.filter((name) => name.startsWith("agent-") || name.startsWith("specialist-") || name.startsWith("planning-")).filter((name) => !/^agent-.*-review-(?:security|correctness|performance|requirements)$/.test(name));
23740
- for (const sessionName of nonReviewerSessions) {
23355
+ const sessionsToInspect = sessionNames.filter((name) => name.startsWith("agent-") || name.startsWith("specialist-") || name.startsWith("planning-")).filter((name) => !/^agent-.*-review-(?:security|correctness|performance|requirements)$/.test(name) || hasOrchestratedCompactionContinuation(name));
23356
+ for (const sessionName of sessionsToInspect) {
23357
+ const compactionPendingAtStart = hasOrchestratedCompactionContinuation(sessionName);
23741
23358
  const recovery = apiErrorRecoveryState.get(sessionName);
23742
- if (recovery && now - recovery.lastAttempt < API_ERROR_RECOVERY_COOLDOWN_MS) continue;
23359
+ if (!compactionPendingAtStart && recovery && now - recovery.lastAttempt < API_ERROR_RECOVERY_COOLDOWN_MS) continue;
23743
23360
  let tmuxOutput;
23744
23361
  try {
23745
23362
  tmuxOutput = await Effect.runPromise(capturePane(sessionName, 100));
@@ -23779,6 +23396,23 @@ async function checkApiErrorAgents() {
23779
23396
  continue;
23780
23397
  }
23781
23398
  }
23399
+ if (compactionPendingAtStart || hasOrchestratedCompactionContinuation(sessionName)) {
23400
+ try {
23401
+ if (await maybeContinueOrchestratedCompaction({
23402
+ sessionName,
23403
+ tmuxOutput,
23404
+ now,
23405
+ send: (target, message) => Effect.runPromise(sendKeys(target, message))
23406
+ })) {
23407
+ contextOverflowRecoveryState.delete(sessionName);
23408
+ actions.push(`Context compaction recovery: resumed ${sessionName} after compaction`);
23409
+ continue;
23410
+ }
23411
+ } catch (err) {
23412
+ console.error(`[deacon] Failed to resume ${sessionName} after orchestrated compaction:`, err);
23413
+ }
23414
+ if (hasOrchestratedCompactionContinuation(sessionName)) continue;
23415
+ }
23782
23416
  if (!tmuxOutput.includes("❯")) continue;
23783
23417
  {
23784
23418
  const issueId = sessionName.startsWith("agent-") ? sessionName.replace("agent-", "").toUpperCase() : null;
@@ -23810,13 +23444,13 @@ async function checkApiErrorAgents() {
23810
23444
  const st = getAgentStateSync(sessionName);
23811
23445
  const sid = st?.sessionId ?? runtimeState?.claudeSessionId;
23812
23446
  if (st?.workspace && sid && st.model) {
23813
- const { computeContextUsage } = await import("./conversation-service-Dq33SYEj.js");
23447
+ const { computeContextUsage } = await import("./conversation-service-BLd3MYsG.js");
23814
23448
  const usage = await computeContextUsage(sessionFilePath(st.workspace, sid), st.model);
23815
23449
  if (usage && usage.percentUsed < 85) recoveredPct = usage.percentUsed;
23816
23450
  }
23817
23451
  } catch {}
23818
23452
  if (recoveredPct !== null) {
23819
- const { clearWorkspaceStuck } = await import("./review-status-sync-D60PJWNL.js");
23453
+ const { clearWorkspaceStuck } = await import("./review-status-sync-DSDK3OMy.js");
23820
23454
  clearWorkspaceStuck(issueId);
23821
23455
  stuckOverflowNativeRecoveryState.delete(sessionName);
23822
23456
  actions.push(`Context overflow recovery: cleared stuck flag for ${sessionName} (context back to ${Math.round(recoveredPct)}%)`);
@@ -23832,7 +23466,7 @@ async function checkApiErrorAgents() {
23832
23466
  rec.attempts += 1;
23833
23467
  rec.lastAttempt = now;
23834
23468
  stuckOverflowNativeRecoveryState.set(sessionName, rec);
23835
- const { resumeAgent } = await import("./agents-DyHKlq1I.js");
23469
+ const { resumeAgent } = await import("./agents-wi9NWzs2.js");
23836
23470
  const recovered = await resumeAgent(sessionName, void 0, { compact: true });
23837
23471
  if (recovered.success) {
23838
23472
  stuckOverflowNativeRecoveryState.delete(sessionName);
@@ -23880,7 +23514,7 @@ async function checkApiErrorAgents() {
23880
23514
  }
23881
23515
  const compactAttempts = (ov?.compactAttempts ?? 0) + 1;
23882
23516
  if (issueId !== null) {
23883
- const { resumeAgent } = await import("./agents-DyHKlq1I.js");
23517
+ const { resumeAgent } = await import("./agents-wi9NWzs2.js");
23884
23518
  const resumeResult = await resumeAgent(sessionName, void 0, { compact: true });
23885
23519
  contextOverflowRecoveryState.set(sessionName, {
23886
23520
  lastAttempt: now,
@@ -23909,7 +23543,7 @@ async function checkApiErrorAgents() {
23909
23543
  continue;
23910
23544
  }
23911
23545
  try {
23912
- await Effect.runPromise(sendKeys(sessionName, "/compact"));
23546
+ await deliverOrchestratedCompact(sessionName, () => Effect.runPromise(sendKeys(sessionName, "/compact")));
23913
23547
  contextOverflowRecoveryState.set(sessionName, {
23914
23548
  lastAttempt: now,
23915
23549
  compactAttempts,
@@ -23986,6 +23620,7 @@ async function requestStrikeMerge(issueId, request, options = {}) {
23986
23620
  } catch (error) {
23987
23621
  return {
23988
23622
  success: false,
23623
+ transport: true,
23989
23624
  error: `Strike merge request failed: ${error instanceof Error ? error.message : String(error)}`
23990
23625
  };
23991
23626
  }
@@ -24049,7 +23684,10 @@ function defaultDeps() {
24049
23684
  isPersistentlyOwned: () => false
24050
23685
  };
24051
23686
  }
24052
- const NON_ACTIONABLE = /permission|merge guard|configured project|integration|infrastructure|unavailable|not registered|workspace does not exist/i;
23687
+ const TRANSPORT_BACKOFF_BASE_MS = 6e4;
23688
+ const TRANSPORT_BACKOFF_CAP_MS = 18e5;
23689
+ const MAX_TRANSPORT_RETRIES = 10;
23690
+ const NON_ACTIONABLE = /permission|merge guard|configured project|integration|infrastructure|unavailable|not registered|workspace does not exist|fetch failed|ECONNREFUSED|ECONNRESET|socket hang up|ETIMEDOUT|EAI_AGAIN/i;
24053
23691
  function attemptHistory(attempts) {
24054
23692
  return attempts.map((attempt, index) => `${index + 1}. strike ${attempt.strikeHead}; main ${attempt.mainHead}; ${attempt.outcome}: ${attempt.detail}`).join("\n");
24055
23693
  }
@@ -24070,14 +23708,21 @@ async function handleFailure(issueId, head, detail, projectPath, workspacePath,
24070
23708
  const recoveryCount = (status.strikeRecoveryCount ?? 0) + 1;
24071
23709
  const recoveryMessage = `Strike landing failed for ${issueId} at ${head}.\n\nCurrent main: ${mainHead}\nFailure: ${detail}\n\nFetch origin, rebase strike/${issueId.toLowerCase()} onto current origin/main, resolve every conflict, rerun the configured gates, push only strike/${issueId.toLowerCase()}, then run pan strike-ready ${issueId}. A fresh pushed HEAD is required before another landing attempt.`;
24072
23710
  if (!NON_ACTIONABLE.test(detail) && recoveryCount < 3) try {
24073
- await deps.deliverRecovery(`strike-${issueId.toLowerCase()}`, recoveryMessage);
24074
- deps.setStatus(issueId, {
24075
- strikeLandingState: "recovering",
24076
- strikeRecoveryCount: recoveryCount,
24077
- strikeLandingAttempts: attempts,
24078
- mergeNotes: detail
24079
- });
24080
- return `[strike-landing] ${issueId} at ${head} recovering (${recoveryCount}/3)`;
23711
+ const outcome = await deps.deliverRecovery(`strike-${issueId.toLowerCase()}`, recoveryMessage);
23712
+ if (outcome.delivered) {
23713
+ deps.setStatus(issueId, {
23714
+ strikeLandingState: "recovering",
23715
+ strikeRecoveryCount: recoveryCount,
23716
+ strikeLandingAttempts: attempts,
23717
+ mergeNotes: detail
23718
+ });
23719
+ return `[strike-landing] ${issueId} at ${head} recovering (${recoveryCount}/3)`;
23720
+ }
23721
+ detail += `; recovery not delivered: ${outcome.reason ?? "queued to mail only"}`;
23722
+ attempts[attempts.length - 1] = {
23723
+ ...attempts[attempts.length - 1],
23724
+ detail
23725
+ };
24081
23726
  } catch (error) {
24082
23727
  detail += `; recovery delivery failed: ${error instanceof Error ? error.message : String(error)}`;
24083
23728
  attempts[attempts.length - 1] = {
@@ -24096,6 +23741,50 @@ async function handleFailure(issueId, head, detail, projectPath, workspacePath,
24096
23741
  await deps.needsYou(issueId, reason, { attempts });
24097
23742
  return `[strike-landing] ${issueId} at ${head} needs-you`;
24098
23743
  }
23744
+ async function handleTransportFailure(issueId, head, detail, status, deps) {
23745
+ const timestamp = deps.now();
23746
+ const project = deps.resolveProject(issueId);
23747
+ const projectPath = project?.projectPath ?? "";
23748
+ const workspacePath = project ? join(projectPath, "workspaces", `feature-${issueId.toLowerCase()}-strike`) : "";
23749
+ let mainHead = "unknown";
23750
+ try {
23751
+ if (projectPath) mainHead = await deps.getMainHead(projectPath);
23752
+ } catch (error) {
23753
+ detail += `; main HEAD unavailable: ${error instanceof Error ? error.message : String(error)}`;
23754
+ }
23755
+ const attempts = [...status.strikeLandingAttempts ?? [], {
23756
+ timestamp,
23757
+ strikeHead: head,
23758
+ mainHead,
23759
+ outcome: "transport-failed",
23760
+ detail
23761
+ }];
23762
+ const retryCount = (status.strikeTransportRetryCount ?? 0) + 1;
23763
+ if (retryCount < MAX_TRANSPORT_RETRIES) {
23764
+ const delayMs = Math.min(TRANSPORT_BACKOFF_CAP_MS, TRANSPORT_BACKOFF_BASE_MS * 2 ** (retryCount - 1));
23765
+ const nextAttemptAt = new Date(Date.parse(timestamp) + delayMs).toISOString();
23766
+ deps.setStatus(issueId, {
23767
+ strikeLandingState: "ready",
23768
+ strikeReadyHead: head,
23769
+ strikeTransportRetryCount: retryCount,
23770
+ strikeNextAttemptAt: nextAttemptAt,
23771
+ strikeLandingAttempts: attempts,
23772
+ mergeNotes: detail
23773
+ });
23774
+ return `[strike-landing] ${issueId} at ${head} transport retry ${retryCount}/${MAX_TRANSPORT_RETRIES} after ${nextAttemptAt}`;
23775
+ }
23776
+ const reason = `Strike landing for ${issueId} needs operator attention after ${retryCount} transport attempt(s).\n${attemptHistory(attempts)}`;
23777
+ deps.setStatus(issueId, {
23778
+ strikeLandingState: "needs_you",
23779
+ strikeTransportRetryCount: retryCount,
23780
+ strikeNextAttemptAt: void 0,
23781
+ strikeLandingAttempts: attempts,
23782
+ mergeNotes: detail
23783
+ });
23784
+ await deps.writeFeedback(issueId, workspacePath, `## Strike landing needs operator attention\n\n${reason}`);
23785
+ await deps.needsYou(issueId, reason, { attempts });
23786
+ return `[strike-landing] ${issueId} at ${head} needs-you`;
23787
+ }
24099
23788
  async function patrolStrikeLandings(overrides = {}) {
24100
23789
  const deps = {
24101
23790
  ...defaultDeps(),
@@ -24106,6 +23795,7 @@ async function patrolStrikeLandings(overrides = {}) {
24106
23795
  const issueId = (candidate.issueId || key).toUpperCase();
24107
23796
  const head = candidate.strikeReadyHead;
24108
23797
  if (!head || candidate.strikeLandingState !== "ready" && candidate.strikeLandingState !== "landing") continue;
23798
+ if (candidate.strikeNextAttemptAt && candidate.strikeNextAttemptAt > deps.now()) continue;
24109
23799
  if (candidate.deaconIgnored || candidate.stuck || candidate.mergeStatus === "merged") continue;
24110
23800
  const current = deps.getStatus(issueId);
24111
23801
  if (current?.strikeReadyHead !== head || current.strikeLandingState !== "ready" && current.strikeLandingState !== "landing") continue;
@@ -24151,10 +23841,25 @@ async function executeStrikeLanding(issueId, head, claimed, deps) {
24151
23841
  if (result.mergeStatus === "merged") deps.setStatus(issueId, {
24152
23842
  strikeLandingState: "landed",
24153
23843
  strikeReadyHead: void 0,
24154
- strikeReadyAt: void 0
23844
+ strikeReadyAt: void 0,
23845
+ strikeTransportRetryCount: void 0,
23846
+ strikeNextAttemptAt: void 0
24155
23847
  });
24156
23848
  else if (result.success || result.mergeStatus === "queued" || result.mergeStatus === "merging" || result.mergeStatus === "merged") return;
24157
- else await handleFailure(issueId, head, result.error ?? "Strike landing failed", project.projectPath, request.workspacePath, claimed, deps);
23849
+ else if (result.transport) {
23850
+ const current = deps.getStatus(issueId) ?? claimed;
23851
+ if (current.mergeStatus === "merged" || current.strikeLandingState === "landed") {
23852
+ deps.setStatus(issueId, {
23853
+ strikeLandingState: "landed",
23854
+ strikeReadyHead: void 0,
23855
+ strikeReadyAt: void 0,
23856
+ strikeTransportRetryCount: void 0,
23857
+ strikeNextAttemptAt: void 0
23858
+ });
23859
+ return;
23860
+ }
23861
+ await handleTransportFailure(issueId, head, result.error ?? "Strike landing transport failed", current, deps);
23862
+ } else await handleFailure(issueId, head, result.error ?? "Strike landing failed", project.projectPath, request.workspacePath, claimed, deps);
24158
23863
  }
24159
23864
  //#endregion
24160
23865
  //#region ../../lib/cloister/preemption.ts
@@ -24340,7 +24045,7 @@ init_archive_planning();
24340
24045
  init_issue_closed();
24341
24046
  init_merge_verification();
24342
24047
  init_review_convoy_liveness();
24343
- const execAsync$3 = promisify$1(exec$1);
24048
+ promisify$1(exec$1);
24344
24049
  /**
24345
24050
  * Check for orphaned review/test statuses (PAN-88 follow-up)
24346
24051
  *
@@ -24403,7 +24108,7 @@ function reviewConvoyLiveness(issueId) {
24403
24108
  */
24404
24109
  async function recoverUnhealthyTestStack(issueId, workspacePath) {
24405
24110
  const key = issueId.toUpperCase();
24406
- const { getWorkspaceStackHealth } = await import("./stack-health-Bd06frFn.js");
24111
+ const { getWorkspaceStackHealth } = await import("./stack-health-Bn3o8FBX.js");
24407
24112
  const health = await Effect.runPromise(getWorkspaceStackHealth(issueId, { workspacePath }));
24408
24113
  if (health.healthy) {
24409
24114
  testStackRebuildState.delete(key);
@@ -24435,7 +24140,7 @@ async function recoverUnhealthyTestStack(issueId, workspacePath) {
24435
24140
  record.attempts += 1;
24436
24141
  testStackRebuildState.set(key, record);
24437
24142
  console.log(`[deacon] Test stack for ${key} unhealthy (${health.reasons.join("; ")}) — rebuilding (attempt ${record.attempts}/${TEST_STACK_REBUILD_MAX_ATTEMPTS})`);
24438
- const { rebuildWorkspaceStack } = await import("./rebuild-stack-CKjJAI8L.js");
24143
+ const { rebuildWorkspaceStack } = await import("./rebuild-stack-CFvcBHsS.js");
24439
24144
  const result = await Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[deacon] ${key} stack rebuild: ${m}`) }));
24440
24145
  if (!result.success) {
24441
24146
  console.warn(`[deacon] Test stack rebuild failed for ${key}: ${result.error}`);
@@ -24603,7 +24308,7 @@ async function handleReviewCoordinatorDied(issueId, _sessionName, _reason) {
24603
24308
  return actions;
24604
24309
  }
24605
24310
  try {
24606
- const { spawnReviewRoleForIssue } = await import("./review-agent-CCum8sGe.js");
24311
+ const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
24607
24312
  const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
24608
24313
  issueId,
24609
24314
  workspace,
@@ -24678,7 +24383,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
24678
24383
  const issueLower = issueId.toLowerCase();
24679
24384
  const workspace = getAgentStateSync(`agent-${issueLower}`)?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
24680
24385
  if (workspace) try {
24681
- if ((options.readWorkspaceHead ? await options.readWorkspaceHead(workspace) : (await execAsync$3("git rev-parse HEAD", { cwd: workspace })).stdout.trim()) === status.lastVerifiedCommit) {
24386
+ if ((options.readWorkspaceHead ? await options.readWorkspaceHead(workspace) : await (await import("./git-utils-D0_yhCgF.js")).snapshotWorkspaceHeadsPromise(issueId, workspace)) === status.lastVerifiedCommit) {
24682
24387
  setReviewStatusSync(issueId, {
24683
24388
  reviewStatus: "pending",
24684
24389
  reviewNotes: void 0
@@ -24700,8 +24405,8 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
24700
24405
  if (project) {
24701
24406
  const workspacePath = join$1(project.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
24702
24407
  if (existsSync(workspacePath)) {
24703
- const { stdout } = await execAsync$3("git rev-parse HEAD", { cwd: workspacePath });
24704
- reviewUpdate["reviewedAtCommit"] = stdout.trim();
24408
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-D0_yhCgF.js");
24409
+ reviewUpdate["reviewedAtCommit"] = await snapshotWorkspaceHeadsPromise(issueId, workspacePath);
24705
24410
  }
24706
24411
  }
24707
24412
  } catch {}
@@ -24755,7 +24460,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
24755
24460
  const workspace = agentState?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
24756
24461
  if (workspace && resolved && !tryReserveAdvancingSlot() && !await tryYieldForAdvancingDispatch("review", issueId)) actions.push(`Deferred review re-dispatch for ${issueId} — advancing-role concurrency ceiling reached`);
24757
24462
  else if (workspace && resolved) try {
24758
- const { spawnReviewRoleForIssue } = await import("./review-agent-CCum8sGe.js");
24463
+ const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
24759
24464
  const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
24760
24465
  issueId,
24761
24466
  workspace,
@@ -24780,8 +24485,8 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
24780
24485
  const workspace = agentState?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
24781
24486
  if (workspace && resolved) {
24782
24487
  const branch = `feature/${issueLower}`;
24783
- const { spawnRun } = await import("./agents-DyHKlq1I.js");
24784
- const { buildTestRolePrompt } = await import("./test-agent-queue-BJZ9Nfcc.js");
24488
+ const { spawnRun } = await import("./agents-wi9NWzs2.js");
24489
+ const { buildTestRolePrompt } = await import("./test-agent-queue-MbxX5vqq.js");
24785
24490
  const stackRecovery = await recoverUnhealthyTestStack(issueId, workspace);
24786
24491
  if (stackRecovery === "cooldown" || stackRecovery === "exhausted") {
24787
24492
  setReviewStatusSync(issueId, { testStatus: "dispatch_failed" });
@@ -24919,7 +24624,7 @@ async function recoverStalledReviewConvoys(getCanonicalState = getAutoCloseOutCa
24919
24624
  record.lastAttempt = now;
24920
24625
  record.attempts += 1;
24921
24626
  stalledReviewConvoyRecoveryState.set(key, record);
24922
- const { spawnReviewRoleForIssue } = await import("./review-agent-CCum8sGe.js");
24627
+ const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
24923
24628
  try {
24924
24629
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
24925
24630
  issueId,
@@ -24990,7 +24695,7 @@ async function checkMissingReviewStatuses() {
24990
24695
  continue;
24991
24696
  }
24992
24697
  try {
24993
- const { spawnReviewRoleForIssue } = await import("./review-agent-CCum8sGe.js");
24698
+ const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
24994
24699
  await Effect.runPromise(spawnReviewRoleForIssue({
24995
24700
  issueId,
24996
24701
  workspace,
@@ -25017,7 +24722,6 @@ async function checkMissingReviewStatuses() {
25017
24722
  }
25018
24723
  //#endregion
25019
24724
  //#region ../../lib/cloister/deacon-review-unsignaled.ts
25020
- init_tracker_utils();
25021
24725
  init_agents$1();
25022
24726
  init_projects();
25023
24727
  init_review_status();
@@ -25043,7 +24747,7 @@ async function checkStuckReviewing() {
25043
24747
  const actions = [];
25044
24748
  const REVIEW_STUCK_THRESHOLD_MS = 1800 * 1e3;
25045
24749
  try {
25046
- const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
24750
+ const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-btEYlaxA.js");
25047
24751
  const statuses = loadReviewStatuses();
25048
24752
  const now = Date.now();
25049
24753
  const activeReviewIssues = /* @__PURE__ */ new Set();
@@ -25188,7 +24892,7 @@ async function checkCompletedButUnsignaledReviews() {
25188
24892
  }
25189
24893
  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"}"` : ""}`}\n\nRun this command NOW. Do not write any other response before executing it.`;
25190
24894
  try {
25191
- const { messageAgent } = await import("./agents-DyHKlq1I.js");
24895
+ const { messageAgent } = await import("./agents-wi9NWzs2.js");
25192
24896
  await messageAgent(reviewSession, nudge);
25193
24897
  unsignaledReviewNudges.set(latestDir, now);
25194
24898
  actions.push(`Nudged ${reviewSession} to signal ${verdict} (synthesis written ${Math.round((now - latestMtime) / 6e4)}min ago)`);
@@ -25310,7 +25014,7 @@ async function respawnIdleReviewer(state, agentId) {
25310
25014
  return false;
25311
25015
  }
25312
25016
  try {
25313
- const { spawnReviewSubRoleForIssue } = await import("./review-agent-CCum8sGe.js");
25017
+ const { spawnReviewSubRoleForIssue } = await import("./review-agent-DNboMyW4.js");
25314
25018
  const contextManifestPath = join$1(dirname$1(outputPath), "context.json");
25315
25019
  const result = await Effect.runPromise(spawnReviewSubRoleForIssue({
25316
25020
  issueId: state.issueId,
@@ -25396,14 +25100,8 @@ async function nudgeSynthesisForCompleteReviewerReports(states) {
25396
25100
  writeFileSync(join$1(reviewDir, "synthesis.md"), synthesis.body);
25397
25101
  let fallbackHead;
25398
25102
  try {
25399
- const { execFile } = await import("node:child_process");
25400
- const { promisify } = await import("node:util");
25401
- const { stdout } = await promisify(execFile)("git", ["rev-parse", "HEAD"], {
25402
- cwd: state.workspace,
25403
- encoding: "utf-8",
25404
- timeout: 1e4
25405
- });
25406
- fallbackHead = stdout.trim() || void 0;
25103
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-D0_yhCgF.js");
25104
+ fallbackHead = await snapshotWorkspaceHeadsPromise(state.issueId, state.workspace);
25407
25105
  } catch {}
25408
25106
  const anchoredVerdicts = Object.fromEntries(Object.entries(synthesis.reviewerVerdicts).map(([subRole, v]) => [subRole, {
25409
25107
  ...v,
@@ -25439,7 +25137,7 @@ async function nudgeSynthesisForCompleteReviewerReports(states) {
25439
25137
  "Read the four reports, write synthesis.md, then signal review status exactly as roles/review.md instructs."
25440
25138
  ].join("\n");
25441
25139
  try {
25442
- const { messageAgent } = await import("./agents-DyHKlq1I.js");
25140
+ const { messageAgent } = await import("./agents-wi9NWzs2.js");
25443
25141
  await messageAgent(state.id, message);
25444
25142
  reviewReportsPresentNudges.set(nudgeKey, now);
25445
25143
  const action = `Nudged ${state.id} to synthesize from ${REVIEW_SUB_ROLES.length} reviewer reports`;
@@ -25525,7 +25223,7 @@ async function monitorReviewConvoySignals() {
25525
25223
  if (!signal) continue;
25526
25224
  const message = signal === "ready" ? `REVIEWER_READY ${state.reviewSubRole} ${outputPath}` : signal === "timeout" ? `REVIEWER_TIMEOUT ${state.reviewSubRole} ${reason}` : `REVIEWER_FAILED ${state.reviewSubRole} ${reason}`;
25527
25225
  try {
25528
- const { messageAgent } = await import("./agents-DyHKlq1I.js");
25226
+ const { messageAgent } = await import("./agents-wi9NWzs2.js");
25529
25227
  await messageAgent(state.reviewSynthesisAgentId, message);
25530
25228
  state.reviewMonitorSignaled = signal;
25531
25229
  saveAgentStateSync(state);
@@ -25533,7 +25231,7 @@ async function monitorReviewConvoySignals() {
25533
25231
  actions.push(action);
25534
25232
  logDeaconEventSync(`monitorReviewConvoySignals: ${action}`);
25535
25233
  if (signal === "ready") try {
25536
- const { notifyPipelineSync } = await import("./pipeline-notifier-CZsrU_nj.js");
25234
+ const { notifyPipelineSync } = await import("./pipeline-notifier-BJr8gQX6.js");
25537
25235
  notifyPipelineSync({
25538
25236
  type: "reviewer_completed",
25539
25237
  issueId: state.issueId,
@@ -25541,7 +25239,7 @@ async function monitorReviewConvoySignals() {
25541
25239
  });
25542
25240
  } catch {}
25543
25241
  else if (signal === "timeout") try {
25544
- const { notifyPipelineSync } = await import("./pipeline-notifier-CZsrU_nj.js");
25242
+ const { notifyPipelineSync } = await import("./pipeline-notifier-BJr8gQX6.js");
25545
25243
  notifyPipelineSync({
25546
25244
  type: "reviewer_timed_out",
25547
25245
  issueId: state.issueId,
@@ -25641,7 +25339,7 @@ const FORK_CACHE_CHECK_DELAY_MS = 180 * 1e3;
25641
25339
  async function checkStalledReviewDiscovery() {
25642
25340
  const actions = [];
25643
25341
  try {
25644
- const { listAgentStates } = await import("./agents-DyHKlq1I.js");
25342
+ const { listAgentStates } = await import("./agents-wi9NWzs2.js");
25645
25343
  const states = listAgentStates();
25646
25344
  const now = Date.now();
25647
25345
  for (const state of states) {
@@ -25650,7 +25348,7 @@ async function checkStalledReviewDiscovery() {
25650
25348
  const aged = Number.isFinite(startedMs) && now - startedMs > 48e4;
25651
25349
  const dead = !await Effect.runPromise(sessionExists(state.id)).catch(() => false) || await Effect.runPromise(isPaneDead(state.id)).catch(() => true);
25652
25350
  if (!aged && !dead) continue;
25653
- const { handleReviewDiscoveryReady } = await import("./review-agent-CCum8sGe.js");
25351
+ const { handleReviewDiscoveryReady } = await import("./review-agent-DNboMyW4.js");
25654
25352
  const result = await handleReviewDiscoveryReady(state.issueId, { source: dead ? "deacon-backstop (parent dead)" : "deacon-backstop (discovery timeout)" });
25655
25353
  actions.push(result.message);
25656
25354
  logDeaconEventSync(`checkStalledReviewDiscovery: ${result.message}`);
@@ -25673,8 +25371,8 @@ async function checkStalledReviewDiscovery() {
25673
25371
  async function checkStalledReviewParents() {
25674
25372
  const actions = [];
25675
25373
  try {
25676
- const { listAgentStates, markAgentStoppedState } = await import("./agents-DyHKlq1I.js");
25677
- const { PARENT_REVIEW_TIMEOUT_MS } = await import("./review-agent-CCum8sGe.js");
25374
+ const { listAgentStates, markAgentStoppedState } = await import("./agents-wi9NWzs2.js");
25375
+ const { PARENT_REVIEW_TIMEOUT_MS } = await import("./review-agent-DNboMyW4.js");
25678
25376
  const states = listAgentStates();
25679
25377
  const now = Date.now();
25680
25378
  for (const state of states) {
@@ -25723,8 +25421,8 @@ async function checkStalledReviewParents() {
25723
25421
  async function checkReviewForkCacheMisses() {
25724
25422
  const actions = [];
25725
25423
  try {
25726
- const { listAgentStates, saveAgentState } = await import("./agents-DyHKlq1I.js");
25727
- const { readEventsSync } = await import("./events-Dsuv6qyB.js");
25424
+ const { listAgentStates, saveAgentState } = await import("./agents-wi9NWzs2.js");
25425
+ const { readEventsSync } = await import("./events-BTdrdEq8.js");
25728
25426
  const { emitActivityEntrySync } = await import("./activity-logger-OEUBdfZ8.js");
25729
25427
  const states = listAgentStates();
25730
25428
  const now = Date.now();
@@ -25775,7 +25473,6 @@ async function checkReviewForkCacheMisses() {
25775
25473
  init_paths();
25776
25474
  init_activity_logger();
25777
25475
  init_agents$1();
25778
- init_concurrency$1();
25779
25476
  init_review_status();
25780
25477
  init_projects();
25781
25478
  init_tmux();
@@ -25860,7 +25557,7 @@ async function reconcileStaleMergeStatus() {
25860
25557
  if (!project) continue;
25861
25558
  let specStatus;
25862
25559
  try {
25863
- const { findSpecByIssue } = await import("./specs-BhOKBzqk.js");
25560
+ const { findSpecByIssue } = await import("./specs-C8Wsn2XO.js");
25864
25561
  const spec = await Effect.runPromise(findSpecByIssue(project.projectPath, issueId));
25865
25562
  specStatus = spec?.status;
25866
25563
  if (spec && (spec.status === "completed" || spec.status === "cancelled")) {
@@ -25875,7 +25572,7 @@ async function reconcileStaleMergeStatus() {
25875
25572
  if (branchTip.stdout.trim() === mainTip.stdout.trim()) console.log(`[deacon] ${issueId}: branch ${branch} points at main; not treating zero-commit branch as merged`);
25876
25573
  } catch {}
25877
25574
  if (!isMerged) {
25878
- const { resolveGitHubIssueSync: _resolveGitHubIssue } = await import("./tracker-utils-DV3h1FYG.js");
25575
+ const { resolveGitHubIssueSync: _resolveGitHubIssue } = await import("./tracker-utils-B4ylXZQK.js");
25879
25576
  const ghResolved = _resolveGitHubIssue(issueId);
25880
25577
  if (ghResolved.isGitHub) try {
25881
25578
  const { stdout } = await execFileAsync$4("gh", [
@@ -25912,7 +25609,7 @@ async function reconcileStaleMergeStatus() {
25912
25609
  actions.push(msg);
25913
25610
  console.log(`[deacon] ${msg}`);
25914
25611
  try {
25915
- const { postMergeLifecycle } = await import("./merge-agent-B-SnXOoc.js");
25612
+ const { postMergeLifecycle } = await import("./merge-agent-CKkgIBPB.js");
25916
25613
  postMergeLifecycle(issueId, project.projectPath, branch, { skipDeploy: true }).catch((err) => console.warn(`[deacon] postMergeLifecycle (reconcile) failed for ${issueId}: ${err}`));
25917
25614
  } catch (err) {
25918
25615
  console.warn(`[deacon] Could not import postMergeLifecycle: ${err}`);
@@ -25937,7 +25634,7 @@ const falseMergedReset = /* @__PURE__ */ new Set();
25937
25634
  async function reconcileFalseMerged() {
25938
25635
  const actions = [];
25939
25636
  try {
25940
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-CU14oYzP.js");
25637
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-ClZ2lk8D.js");
25941
25638
  if (!isGitHubAppConfigured()) return actions;
25942
25639
  const statuses = loadReviewStatuses();
25943
25640
  for (const [issueId, status] of Object.entries(statuses)) {
@@ -25982,7 +25679,7 @@ const CLOSED_PR_RECONCILE_COOLDOWN_MS = 600 * 1e3;
25982
25679
  async function reconcileClosedPrReadyForMerge() {
25983
25680
  const actions = [];
25984
25681
  try {
25985
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-CU14oYzP.js");
25682
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-ClZ2lk8D.js");
25986
25683
  if (!isGitHubAppConfigured()) return actions;
25987
25684
  const statuses = loadReviewStatuses();
25988
25685
  const now = Date.now();
@@ -26054,7 +25751,7 @@ const STALE_MERGE_BLOCKER_COOLDOWN_MS = 120 * 1e3;
26054
25751
  async function reconcileStaleMergeBlockers() {
26055
25752
  const actions = [];
26056
25753
  try {
26057
- const { resolveConflictGate, buildRealConflictGateDeps } = await import("./conflict-gate-CHU9K1vU.js");
25754
+ const { resolveConflictGate, buildRealConflictGateDeps } = await import("./conflict-gate-BhAY7TUd.js");
26058
25755
  const statuses = loadReviewStatuses();
26059
25756
  const now = Date.now();
26060
25757
  const deps = buildRealConflictGateDeps();
@@ -26197,7 +25894,7 @@ async function checkFailedMergeRetry() {
26197
25894
  if (ciEntry.count === 5) {
26198
25895
  console.log(`[deacon] CI check failure for ${issueId} — retries exhausted, notifying work agent`);
26199
25896
  const ciNotes = status.mergeNotes || "CI checks are failing on the PR";
26200
- const { writeFeedbackFile } = await import("./feedback-writer-Bx5z11mF.js");
25897
+ const { writeFeedbackFile } = await import("./feedback-writer-D3a22RCd.js");
26201
25898
  const ciFileResult = await Effect.runPromise(writeFeedbackFile({
26202
25899
  issueId,
26203
25900
  specialist: "merge-agent",
@@ -26229,7 +25926,7 @@ async function checkFailedMergeRetry() {
26229
25926
  ciRetryMap.set(issueId, ciEntry);
26230
25927
  console.log(`[deacon] CI check failure for ${issueId} — notifying agent to re-submit (attempt ${ciEntry.count}/5)`);
26231
25928
  const ciNotes = status.mergeNotes || "CI checks are failing on the PR";
26232
- const { writeFeedbackFile } = await import("./feedback-writer-Bx5z11mF.js");
25929
+ const { writeFeedbackFile } = await import("./feedback-writer-D3a22RCd.js");
26233
25930
  const ciFileResult2 = await Effect.runPromise(writeFeedbackFile({
26234
25931
  issueId,
26235
25932
  specialist: "merge-agent",
@@ -26257,7 +25954,7 @@ async function checkFailedMergeRetry() {
26257
25954
  const lastNudge = timeoutNudgeCooldowns.get(issueIdForFb);
26258
25955
  if (!lastNudge || now - lastNudge >= TIMEOUT_NUDGE_COOLDOWN_MS) {
26259
25956
  const timeoutNotes = status.mergeNotes;
26260
- const { writeFeedbackFile } = await import("./feedback-writer-Bx5z11mF.js");
25957
+ const { writeFeedbackFile } = await import("./feedback-writer-D3a22RCd.js");
26261
25958
  await Effect.runPromise(writeFeedbackFile({
26262
25959
  issueId: issueIdForFb,
26263
25960
  specialist: "merge-agent",
@@ -26362,7 +26059,7 @@ async function autoCloseOut(now = /* @__PURE__ */ new Date()) {
26362
26059
  } } : {}
26363
26060
  };
26364
26061
  try {
26365
- const { closeOut } = await import("./workflows-C4mR0Reb.js");
26062
+ const { closeOut } = await import("./workflows-BQu4RFQ-.js");
26366
26063
  const result = await Effect.runPromise(closeOut(ctx));
26367
26064
  if (!result.success) {
26368
26065
  const failed = result.steps.find((step) => !step.success && !step.skipped);
@@ -26414,7 +26111,8 @@ async function checkFirstCompletionAgents() {
26414
26111
  if (existsSync(completedFile) || existsSync(processedMarker)) continue;
26415
26112
  if (!isAgentIdleForNudge(agent.id, FIRST_COMPLETION_IDLE_MS)) continue;
26416
26113
  const runtimeState = getAgentRuntimeStateSync(agent.id);
26417
- const idleMs = now - new Date(runtimeState.lastActivity).getTime();
26114
+ if (!runtimeState) continue;
26115
+ const idleMs = now - new Date(runtimeState.lastActivity ?? 0).getTime();
26418
26116
  if (idleMs < FIRST_COMPLETION_IDLE_MS) continue;
26419
26117
  const lastNudge = firstCompletionCooldowns.get(agent.id);
26420
26118
  if (lastNudge && now - lastNudge < FIRST_COMPLETION_COOLDOWN_MS) continue;
@@ -26481,16 +26179,8 @@ async function checkFirstCompletionAgents() {
26481
26179
  return actions;
26482
26180
  }
26483
26181
  //#endregion
26484
- //#region ../../lib/cloister/agent-grace.ts
26485
- init_traefik_connect();
26486
- const WORK_LAUNCHER_GRACE_MS = 12e4;
26487
- function isStartingWithinGrace(state, now = Date.now(), graceMs = WORK_LAUNCHER_GRACE_MS) {
26488
- if (state.status !== "starting") return false;
26489
- const startedMs = Date.parse(state.startedAt ?? "");
26490
- return Number.isFinite(startedMs) && now - startedMs < graceMs;
26491
- }
26492
- //#endregion
26493
26182
  //#region ../../lib/cloister/boot-reconciliation-outcomes.ts
26183
+ init_traefik_connect();
26494
26184
  function resumedBootReconciliationOutcome(agent) {
26495
26185
  return {
26496
26186
  id: agent.id,
@@ -26658,9 +26348,106 @@ function startBootReconciliation(options = {}) {
26658
26348
  };
26659
26349
  }
26660
26350
  //#endregion
26661
- //#region ../../lib/cloister/confirmed-session-query.ts
26351
+ //#region ../../lib/agents/pinned-launch.ts
26662
26352
  init_io();
26663
26353
  init_dag();
26354
+ init_agent_state();
26355
+ function parseFlagValue(content, flag) {
26356
+ const escapedFlag = flag.replace("-", "\\-");
26357
+ const quoted = content.match(new RegExp(`${escapedFlag}\\s+'([^']+)'`)) ?? content.match(new RegExp(`${escapedFlag}\\s+"([^"]+)"`));
26358
+ if (quoted?.[1]) return quoted[1];
26359
+ return content.match(new RegExp(`${escapedFlag}\\s+([^\\s'"\\\\]+)`))?.[1] ?? null;
26360
+ }
26361
+ function parsePinnedAgentLaunch(launcher, sessionId) {
26362
+ const pinnedSessionId = sessionId.trim();
26363
+ if (!pinnedSessionId) return null;
26364
+ const harness = launcher.includes("codex-app-server-host.js") || /(?:^|\s)(?:exec\s+)?codex(?:\s|$)/m.test(launcher) ? "codex" : /(?:^|\s)(?:exec\s+)?omp\s+--mode\s+rpc(?:\s|$)/m.test(launcher) ? "ohmypi" : /(?:^|\s)claude(?:\s|$)/m.test(launcher) ? "claude-code" : null;
26365
+ const model = parseFlagValue(launcher, "--model") ?? parseFlagValue(launcher, "-m");
26366
+ if (!harness || !model || model.startsWith("pending-")) return null;
26367
+ return {
26368
+ sessionId: pinnedSessionId,
26369
+ model,
26370
+ harness
26371
+ };
26372
+ }
26373
+ function readPinnedAgentLaunchSync(agentId) {
26374
+ const agentDir = getAgentDir(agentId);
26375
+ const launcherPath = join(agentDir, "launcher.sh");
26376
+ const sessionIdPath = join(agentDir, "session.id");
26377
+ if (!existsSync$1(launcherPath) || !existsSync$1(sessionIdPath)) return null;
26378
+ try {
26379
+ return parsePinnedAgentLaunch(readFileSync$1(launcherPath, "utf8"), readFileSync$1(sessionIdPath, "utf8"));
26380
+ } catch {
26381
+ return null;
26382
+ }
26383
+ }
26384
+ //#endregion
26385
+ //#region ../../lib/agents/placeholder-reconciliation.ts
26386
+ init_persistent_logger();
26387
+ init_agent_state();
26388
+ function defaultPlaceholderReconciliationDeps() {
26389
+ return {
26390
+ readPinnedLaunch: readPinnedAgentLaunchSync,
26391
+ markRunning: markAgentRunningState,
26392
+ saveState: (state) => Effect.runPromise(saveAgentState(state)),
26393
+ logDeacon: logDeaconEventSync,
26394
+ logAgent: logAgentLifecycleSync
26395
+ };
26396
+ }
26397
+ async function reconcileLiveWorkSpawnPlaceholder(state, notifyStatusChanged, deps) {
26398
+ if (state.model !== "pending-work-spawn") return null;
26399
+ const resolvedDeps = deps ?? defaultPlaceholderReconciliationDeps();
26400
+ const pinnedLaunch = resolvedDeps.readPinnedLaunch(state.id);
26401
+ if (!pinnedLaunch) return null;
26402
+ const previousStatus = state.status;
26403
+ state.model = pinnedLaunch.model;
26404
+ state.harness = pinnedLaunch.harness;
26405
+ state.sessionId = pinnedLaunch.sessionId;
26406
+ resolvedDeps.markRunning(state);
26407
+ await resolvedDeps.saveState(state);
26408
+ notifyStatusChanged(state, previousStatus, true);
26409
+ const message = `Reconciled ${state.id} placeholder to running (${pinnedLaunch.harness}/${pinnedLaunch.model})`;
26410
+ resolvedDeps.logDeacon(`handleAgentHeartbeatDeadEvent: ${message}`);
26411
+ resolvedDeps.logAgent(state.id, message);
26412
+ return message;
26413
+ }
26414
+ //#endregion
26415
+ //#region ../../lib/agents/supervisor-liveness.ts
26416
+ /**
26417
+ * PAN-3002: supervisor-delivered agents (pty-supervisor, deliveryMethod:
26418
+ * supervisor) keep working after their tmux session dies — the worker holds
26419
+ * the pty and detaches. A tmux-only liveness check then declares a healthy
26420
+ * agent dead and marks it stopped, splitting state from reality: MIN-882 ran
26421
+ * 36h untracked ($166, 35MB transcript) while the pipeline showed "Planned
26422
+ * idle", and PAN-2997 was killed 41s after a healthy resume.
26423
+ *
26424
+ * A live pty-supervisor process carrying `--name <agentId>` is positive proof
26425
+ * of life regardless of tmux. The deacon's liveness arbiter consults this
26426
+ * before declaring an agent orphaned.
26427
+ */
26428
+ const defaultPgrep = (pattern) => {
26429
+ try {
26430
+ execFileSync("pgrep", ["-f", pattern], { stdio: [
26431
+ "ignore",
26432
+ "ignore",
26433
+ "ignore"
26434
+ ] });
26435
+ return true;
26436
+ } catch {
26437
+ return false;
26438
+ }
26439
+ };
26440
+ /**
26441
+ * True when a pty-supervisor process for this agent is alive. `--name` is
26442
+ * boundary-anchored so `agent-min-882` does not match `agent-min-882-review`.
26443
+ * Agent ids are `[a-z0-9-]` by construction, so the pattern needs no escaping.
26444
+ */
26445
+ function supervisorProcessAliveSync(agentId, pgrep = defaultPgrep) {
26446
+ if (!agentId) return false;
26447
+ return pgrep(`pty-supervisor\\.js.*--name ${agentId}(\\s|$)`);
26448
+ }
26449
+ //#endregion
26450
+ //#region ../../lib/cloister/confirmed-session-query.ts
26664
26451
  init_tmux();
26665
26452
  const consecutiveMisses = /* @__PURE__ */ new Map();
26666
26453
  function queryConfirmedSession(agentId) {
@@ -26673,6 +26460,10 @@ function queryConfirmedSession(agentId) {
26673
26460
  consecutiveMisses.delete(agentId);
26674
26461
  return [query];
26675
26462
  }
26463
+ if (supervisorProcessAliveSync(agentId)) {
26464
+ consecutiveMisses.delete(agentId);
26465
+ return [query, `retained — live pty-supervisor process despite missing tmux session (PAN-3002)`];
26466
+ }
26676
26467
  const missCount = (consecutiveMisses.get(agentId) ?? 0) + 1;
26677
26468
  consecutiveMisses.set(agentId, missCount);
26678
26469
  return missCount < 2 ? [query, `retained after first confirmed tmux miss (${query.detail})`] : [query];
@@ -26802,7 +26593,10 @@ async function handleAgentHeartbeatDeadEvent$1(agentId, context, deps) {
26802
26593
  } catch {
26803
26594
  return [];
26804
26595
  }
26805
- else return [];
26596
+ else {
26597
+ const action = await reconcileLiveWorkSpawnPlaceholder(state, deps.notifyAgentStatusChanged);
26598
+ return action ? [action] : [];
26599
+ }
26806
26600
  else if (state.status === "starting") {
26807
26601
  if (isStartingWithinGrace(state)) return [];
26808
26602
  }
@@ -26935,7 +26729,7 @@ function buildStalledResumePrompt(state) {
26935
26729
  return null;
26936
26730
  }
26937
26731
  }
26938
- return buildDefaultResumeContinueMessage(state.issueId);
26732
+ return buildResumeContinueMessage(state);
26939
26733
  }
26940
26734
  function readyTaskLine(item) {
26941
26735
  return `${item.id} ${item.title}`.trim();
@@ -26960,7 +26754,7 @@ async function nudgeStalledResumeWorkAgents() {
26960
26754
  const message = buildStalledResumePrompt(state);
26961
26755
  if (!message) continue;
26962
26756
  try {
26963
- const { messageAgent } = await import("./agents-DyHKlq1I.js");
26757
+ const { messageAgent } = await import("./agents-wi9NWzs2.js");
26964
26758
  await messageAgent(agentId, message);
26965
26759
  recordCooldown(agentId, ".last-stalled-resume-nudge");
26966
26760
  const action = `Re-sent stalled resume prompt to ${agentId} (${state.issueId})`;
@@ -27069,12 +26863,12 @@ async function nudgeIdleWorkAgentsWithOpenBeads() {
27069
26863
  ``,
27070
26864
  `Next ready task: ${firstTask}`,
27071
26865
  ``,
27072
- `If you don't already have your full brief for ${state.issueId} in context (work-agent role instructions, the vBRIEF plan, recorded decisions & hazards), re-read it now — it is on disk at ${briefPath}, plus .pan/continue.json and .pan/spec.vbrief.json in your workspace. Startup kickoff delivery can silently fail on large briefs, so do not assume you received it.`,
26866
+ `If you don't already have your full brief for ${state.issueId} in context (work-agent role instructions, the xBRIEF plan, recorded decisions & hazards), re-read it now — it is on disk at ${briefPath}, plus .pan/continue.json and .pan/spec.vbrief.json in your workspace. Startup kickoff delivery can silently fail on large briefs, so do not assume you received it.`,
27073
26867
  ``,
27074
26868
  "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."
27075
26869
  ].join("\n");
27076
26870
  try {
27077
- const { messageAgent } = await import("./agents-DyHKlq1I.js");
26871
+ const { messageAgent } = await import("./agents-wi9NWzs2.js");
27078
26872
  await messageAgent(agentId, message);
27079
26873
  writeFileSync(join$1(getAgentDir(agentId), ".last-bead-nudge"), String(Date.now()), "utf-8");
27080
26874
  const action = `Nudged idle ${agentId} (${state.issueId}) — ${openTasks.length} ready task(s)`;
@@ -27139,6 +26933,11 @@ async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
27139
26933
  logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — held by boot reconciliation decision`);
27140
26934
  return null;
27141
26935
  }
26936
+ const bootDecision = getBootReconciliationState().decision;
26937
+ if (!skipGlobalGates && (bootDecision === "pending" || bootDecision === "hold_all")) {
26938
+ logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} held — boot reconciliation ${bootDecision} (late-arriving candidate, evaluated with the batch)`);
26939
+ return null;
26940
+ }
27142
26941
  if (state.paused === true) {
27143
26942
  logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — ${isVerifyPausedAgentState(state) ? "verify-paused" : "manually-paused"} (${state.pausedReason ?? "no reason"})`);
27144
26943
  return null;
@@ -28298,7 +28097,7 @@ async function cleanupStaleAgentState() {
28298
28097
  try {
28299
28098
  if (await Effect.runPromise(sessionExists(dir.name))) continue;
28300
28099
  } catch {}
28301
- if (dir.name.startsWith("agent-")) {
28100
+ if (dir.name.startsWith("agent-") || dir.name.startsWith("strike-")) {
28302
28101
  if (await Effect.runPromise(getAgentState(dir.name).pipe(Effect.catch(() => Effect.succeed(null)))) != null) continue;
28303
28102
  }
28304
28103
  const ageMs = now - statSync(agentDir).mtimeMs;
@@ -28343,8 +28142,8 @@ async function cleanupStaleAgentState() {
28343
28142
  */
28344
28143
  async function cleanupAbandonedFeedback() {
28345
28144
  const actions = [];
28346
- const { getReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
28347
- const { clearFeedbackFiles } = await import("./feedback-writer-Bx5z11mF.js");
28145
+ const { getReviewStatusSync } = await import("./review-status-btEYlaxA.js");
28146
+ const { clearFeedbackFiles } = await import("./feedback-writer-D3a22RCd.js");
28348
28147
  for (const { issueId, workspacePath } of listFeatureWorkspaces()) {
28349
28148
  const panFeedbackDir = join$1(workspacePath, ".pan", "feedback");
28350
28149
  if (!existsSync(panFeedbackDir)) continue;
@@ -28415,7 +28214,7 @@ async function handleOrphanReviewerSession(sessionName, sessions, creationTimes,
28415
28214
  if (!issueId) return null;
28416
28215
  const agentSession = `agent-${issueId.toLowerCase()}`;
28417
28216
  if (sessions.includes(agentSession)) return null;
28418
- const { getReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
28217
+ const { getReviewStatusSync } = await import("./review-status-btEYlaxA.js");
28419
28218
  try {
28420
28219
  if (getReviewStatusSync(issueId)?.reviewStatus === "reviewing") return null;
28421
28220
  } catch {}
@@ -28537,7 +28336,7 @@ async function checkOrphanedCompletions() {
28537
28336
  async function checkPendingTestDispatch() {
28538
28337
  const actions = [];
28539
28338
  try {
28540
- const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
28339
+ const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-btEYlaxA.js");
28541
28340
  const statuses = loadReviewStatuses();
28542
28341
  const now = Date.now();
28543
28342
  for (const [issueId, status] of Object.entries(statuses)) {
@@ -28570,7 +28369,7 @@ async function checkPendingTestDispatch() {
28570
28369
  console.log(`[deacon] ${issueId}: skipping test re-dispatch — issue is closed`);
28571
28370
  continue;
28572
28371
  }
28573
- const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
28372
+ const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
28574
28373
  const resolved = resolveProjectFromIssueSync(issueId);
28575
28374
  if (!resolved) continue;
28576
28375
  const issueLower = issueId.toLowerCase();
@@ -28585,8 +28384,8 @@ async function checkPendingTestDispatch() {
28585
28384
  logDeaconEventSync(`checkPendingTestDispatch: deferred test for ${issueId} — advancing ceiling reached (PAN-1665) — ${describeRunningAgents()}`);
28586
28385
  continue;
28587
28386
  }
28588
- const { spawnRun } = await import("./agents-DyHKlq1I.js");
28589
- const { buildTestRolePrompt } = await import("./test-agent-queue-BJZ9Nfcc.js");
28387
+ const { spawnRun } = await import("./agents-wi9NWzs2.js");
28388
+ const { buildTestRolePrompt } = await import("./test-agent-queue-MbxX5vqq.js");
28590
28389
  try {
28591
28390
  const run = await spawnRun(issueId, "test", {
28592
28391
  workspace,
@@ -28709,7 +28508,7 @@ async function checkCompletedButUnsignaledTests() {
28709
28508
  const cmd = `pan admin specialists done test ${issueId} --status ${decision.status}${noteArg}`;
28710
28509
  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.`;
28711
28510
  try {
28712
- const { messageAgent } = await import("./agents-DyHKlq1I.js");
28511
+ const { messageAgent } = await import("./agents-wi9NWzs2.js");
28713
28512
  await messageAgent(testSession, nudge);
28714
28513
  unsignaledTestNudges.set(testSession, now);
28715
28514
  const msg = `Nudged ${testSession} to signal ${decision.status} (verdict artifact present)`;
@@ -28723,7 +28522,7 @@ async function checkCompletedButUnsignaledTests() {
28723
28522
  case "nudge-write": {
28724
28523
  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.`;
28725
28524
  try {
28726
- const { messageAgent } = await import("./agents-DyHKlq1I.js");
28525
+ const { messageAgent } = await import("./agents-wi9NWzs2.js");
28727
28526
  await messageAgent(testSession, nudge);
28728
28527
  unsignaledTestNudges.set(testSession, now);
28729
28528
  const msg = `Nudged ${testSession} to write+signal a test verdict (no artifact yet)`;
@@ -28746,8 +28545,8 @@ async function checkCompletedButUnsignaledTests() {
28746
28545
  async function checkVerificationReviewContradiction() {
28747
28546
  const actions = [];
28748
28547
  try {
28749
- const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
28750
- const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
28548
+ const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-btEYlaxA.js");
28549
+ const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
28751
28550
  const statuses = loadReviewStatuses();
28752
28551
  for (const [issueId, status] of Object.entries(statuses)) if (status.verificationStatus === "passed" && status.reviewStatus === "reviewing" && status.stuckReason === "review_infrastructure_failure") {
28753
28552
  let reviewedAtCommit;
@@ -28796,7 +28595,7 @@ async function checkPostReviewCommits() {
28796
28595
  const actions = [];
28797
28596
  try {
28798
28597
  const statuses = loadReviewStatuses();
28799
- const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
28598
+ const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
28800
28599
  for (const [issueId, status] of Object.entries(statuses)) {
28801
28600
  if (status.mergeStatus === "merged") continue;
28802
28601
  if (!status.reviewedAtCommit) continue;
@@ -28851,7 +28650,7 @@ async function checkPostReviewCommits() {
28851
28650
  actions.push(`Deferred post-review re-dispatch for ${issueId} — advancing-role concurrency ceiling reached`);
28852
28651
  logDeaconEventSync(`checkPostReviewCommits: deferred review for ${issueId} — advancing ceiling reached (PAN-1665) — ${describeRunningAgents()}`);
28853
28652
  } else if (freshStatus?.reviewStatus === "pending") {
28854
- const { spawnReviewRoleForIssue } = await import("./review-agent-CCum8sGe.js");
28653
+ const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
28855
28654
  const branch = `feature/${issueId.toLowerCase()}`;
28856
28655
  const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
28857
28656
  issueId,
@@ -28951,7 +28750,7 @@ async function checkReadyForMergeStuck() {
28951
28750
  const testStatusGreenCiReconcileCooldowns = /* @__PURE__ */ new Map();
28952
28751
  const TEST_STATUS_GREEN_CI_RECONCILE_COOLDOWN_MS = 300 * 1e3;
28953
28752
  async function reconcileTestStatusFromGreenCi() {
28954
- const { getCiCheckRunsState, getPullRequestHeadState, isGitHubAppConfigured } = await import("./github-app-CU14oYzP.js");
28753
+ const { getCiCheckRunsState, getPullRequestHeadState, isGitHubAppConfigured } = await import("./github-app-ClZ2lk8D.js");
28955
28754
  return reconcileTestStatusFromGreenCiWithDeps({
28956
28755
  isGitHubAppConfigured,
28957
28756
  loadReviewStatuses,
@@ -28972,7 +28771,7 @@ async function reconcileTestStatusFromGreenCi() {
28972
28771
  */
28973
28772
  async function clearStaleCiFeedback(issueId) {
28974
28773
  const { readdir, rm } = await import("fs/promises");
28975
- const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
28774
+ const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
28976
28775
  const projectConfig = resolveProjectFromIssueSync(issueId);
28977
28776
  if (!projectConfig) return;
28978
28777
  const repoDir = projectConfig.projectPath;
@@ -29268,7 +29067,7 @@ async function checkWorkspaceContainerHealth(sharedState) {
29268
29067
  }
29269
29068
  }
29270
29069
  try {
29271
- const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
29070
+ const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
29272
29071
  const resolved = resolveProjectFromIssueSync(issueLower.toUpperCase());
29273
29072
  if (resolved) await killOrphanedWorkspaceProcesses(`${resolved.projectPath}/workspaces/feature-${issueLower}`);
29274
29073
  } catch {}
@@ -29317,8 +29116,8 @@ async function checkWorkspaceContainerHealth(sharedState) {
29317
29116
  async function checkMergedWorkSessions() {
29318
29117
  const actions = [];
29319
29118
  try {
29320
- const { selectMergedWorkSessions } = await import("./reap-terminal-sessions-CaMkFOIH.js");
29321
- const { setAgentPaused } = await import("./agents-DyHKlq1I.js");
29119
+ const { selectMergedWorkSessions } = await import("./reap-terminal-sessions-7KeHv1R1.js");
29120
+ const { setAgentPaused } = await import("./agents-wi9NWzs2.js");
29322
29121
  const toKill = selectMergedWorkSessions(loadReviewStatuses(), [...await Effect.runPromise(listSessionNames())]);
29323
29122
  for (const session of toKill) try {
29324
29123
  await Effect.runPromise(setAgentPaused(session, "merged — awaiting close-out (verify on main)", true));
@@ -29358,7 +29157,7 @@ const AWAITING_TEST_IDLE_REAP_MS = 600 * 1e3;
29358
29157
  async function checkAwaitingTestWorkSessions() {
29359
29158
  const actions = [];
29360
29159
  try {
29361
- const { selectAwaitingTestWorkSessions } = await import("./reap-terminal-sessions-CaMkFOIH.js");
29160
+ const { selectAwaitingTestWorkSessions } = await import("./reap-terminal-sessions-7KeHv1R1.js");
29362
29161
  const candidates = selectAwaitingTestWorkSessions(loadReviewStatuses(), [...await Effect.runPromise(listSessionNames())]);
29363
29162
  const now = Date.now();
29364
29163
  for (const session of candidates) {
@@ -29411,14 +29210,14 @@ async function runPatrol() {
29411
29210
  hasLoggedGlobalPauseSkip = false;
29412
29211
  addLog("info", `Patrol cycle ${state.patrolCycle} — checking per-project specialists`, state.patrolCycle);
29413
29212
  console.log(`[deacon] Patrol cycle ${state.patrolCycle} - checking per-project specialists`);
29414
- for (const a of await (await import("./stale-task-claims-L7pJkQFL.js")).patrolStaleTaskClaims()) {
29213
+ for (const a of await (await import("./stale-task-claims-KJKxxiiQ.js")).patrolStaleTaskClaims()) {
29415
29214
  actions.push(a);
29416
29215
  addLog("action", a, state.patrolCycle);
29417
29216
  }
29418
29217
  const stuckRemediationActions = await checkStuckAgentRemediation();
29419
29218
  actions.push(...stuckRemediationActions);
29420
29219
  for (const a of stuckRemediationActions) addLog("action", a, state.patrolCycle);
29421
- const { reconcileInFlightJournals } = await import("./advancing-selfheal-cSvXNZLZ.js");
29220
+ const { reconcileInFlightJournals } = await import("./advancing-selfheal-BVwW4qRn.js");
29422
29221
  const reconciledJournalActions = await reconcileInFlightJournals();
29423
29222
  actions.push(...reconciledJournalActions);
29424
29223
  for (const a of reconciledJournalActions) addLog("action", a, state.patrolCycle);
@@ -29430,7 +29229,7 @@ async function runPatrol() {
29430
29229
  const age = Date.now() - (pending.timestamp ?? 0);
29431
29230
  if (age < 3600 * 1e3) {
29432
29231
  console.log(`[deacon] Processing pending post-merge lifecycle for ${pending.issueId} (age: ${Math.round(age / 1e3)}s)`);
29433
- const { postMergeLifecycle } = await import("./merge-agent-B-SnXOoc.js");
29232
+ const { postMergeLifecycle } = await import("./merge-agent-CKkgIBPB.js");
29434
29233
  const { unlinkSync } = await import("fs");
29435
29234
  unlinkSync(pendingFile);
29436
29235
  await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
@@ -29444,7 +29243,7 @@ async function runPatrol() {
29444
29243
  } catch (err) {
29445
29244
  console.warn(`[deacon] Failed to process pending lifecycle: ${err.message}`);
29446
29245
  }
29447
- if (state.patrolCycle % 5 === 0) await (await import("./deploy-patrol-1IrZxicY.js")).runScheduledDeployPatrol();
29246
+ if (state.patrolCycle % 5 === 0) await (await import("./deploy-patrol-AiFoP8dw.js")).runScheduledDeployPatrol();
29448
29247
  const livenessActions = await reconcileAgentLiveness();
29449
29248
  actions.push(...livenessActions);
29450
29249
  for (const a of livenessActions) addLog("action", a, state.patrolCycle);
@@ -29476,7 +29275,7 @@ async function runPatrol() {
29476
29275
  actions.push(...suspendActions);
29477
29276
  for (const a of suspendActions) addLog("action", a, state.patrolCycle);
29478
29277
  try {
29479
- const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
29278
+ const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
29480
29279
  const allStatuses = loadReviewStatuses();
29481
29280
  for (const [issueId, status] of Object.entries(allStatuses)) {
29482
29281
  if (!status.readyForMerge || status.mergeStatus === "merged") continue;
@@ -29496,7 +29295,7 @@ async function runPatrol() {
29496
29295
  } catch (err) {
29497
29296
  console.warn(`[deacon] Failed to check workspace existence: ${err.message}`);
29498
29297
  }
29499
- const { checkMergedAdvancingSessions } = await import("./advancing-selfheal-cSvXNZLZ.js");
29298
+ const { checkMergedAdvancingSessions } = await import("./advancing-selfheal-BVwW4qRn.js");
29500
29299
  const reapedWorkActions = await checkMergedWorkSessions();
29501
29300
  actions.push(...reapedWorkActions);
29502
29301
  for (const a of reapedWorkActions) addLog("action", a, state.patrolCycle);
@@ -29504,7 +29303,7 @@ async function runPatrol() {
29504
29303
  actions.push(...reapedMergedAdvancingActions);
29505
29304
  for (const a of reapedMergedAdvancingActions) addLog("action", a, state.patrolCycle);
29506
29305
  try {
29507
- const { refreshClaudeCredentialsForActiveRemoteAgents } = await import("./remote-completion-Dca3hAaa.js");
29306
+ const { refreshClaudeCredentialsForActiveRemoteAgents } = await import("./remote-completion-fVe9e_3u.js");
29508
29307
  const remoteCredentialActions = await refreshClaudeCredentialsForActiveRemoteAgents();
29509
29308
  actions.push(...remoteCredentialActions);
29510
29309
  for (const a of remoteCredentialActions) addLog(a.includes("failed") ? "warn" : "action", a, state.patrolCycle);
@@ -29512,7 +29311,7 @@ async function runPatrol() {
29512
29311
  addLog("warn", `Remote credential refresh patrol failed: ${err.message}`, state.patrolCycle);
29513
29312
  }
29514
29313
  try {
29515
- const { refreshHostHeartbeatForEphemeralVms } = await import("./remote-agents-D6O_zETW.js");
29314
+ const { refreshHostHeartbeatForEphemeralVms } = await import("./remote-agents-CA3Ihlxj.js");
29516
29315
  const heartbeatActions = await refreshHostHeartbeatForEphemeralVms();
29517
29316
  actions.push(...heartbeatActions);
29518
29317
  for (const a of heartbeatActions) addLog(a.includes("failed") ? "warn" : "action", a, state.patrolCycle);
@@ -29520,7 +29319,7 @@ async function runPatrol() {
29520
29319
  addLog("warn", `Remote heartbeat refresh patrol failed: ${err.message}`, state.patrolCycle);
29521
29320
  }
29522
29321
  try {
29523
- const { reapCompletedRemoteAgents } = await import("./remote-completion-Dca3hAaa.js");
29322
+ const { reapCompletedRemoteAgents } = await import("./remote-completion-fVe9e_3u.js");
29524
29323
  const remoteReap = await reapCompletedRemoteAgents();
29525
29324
  for (const r of remoteReap) if (r.status === "handed-off" || r.status === "error") {
29526
29325
  const msg = `Remote reap ${r.issueId}: ${r.status} (${r.details.join("; ")})`;
@@ -29705,7 +29504,7 @@ async function runPatrol() {
29705
29504
  const issueId = runtimeState.currentIssue;
29706
29505
  try {
29707
29506
  if (getReviewStatusSync(issueId)?.mergeStatus === "merging") {
29708
- const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
29507
+ const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
29709
29508
  const resolved = resolveProjectFromIssueSync(issueId);
29710
29509
  if (resolved) {
29711
29510
  const branch = `feature/${issueId.toLowerCase()}`;
@@ -29719,7 +29518,7 @@ async function runPatrol() {
29719
29518
  mergeStatus: "merged",
29720
29519
  readyForMerge: false
29721
29520
  });
29722
- const { postMergeLifecycle } = await import("./merge-agent-B-SnXOoc.js");
29521
+ const { postMergeLifecycle } = await import("./merge-agent-CKkgIBPB.js");
29723
29522
  postMergeLifecycle(issueId, resolved.projectPath).catch((err) => console.warn(`[deacon] postMergeLifecycle failed for ${issueId}: ${err}`));
29724
29523
  actions.push(`Auto-completed stale merge for ${issueId}`);
29725
29524
  } else {
@@ -29899,7 +29698,7 @@ function startDeacon() {
29899
29698
  logDeaconEventSync(`startDeacon: health monitor starting (patrol every ${config.patrolIntervalMs / 1e3}s)`);
29900
29699
  (async () => {
29901
29700
  await reconcileAgentLiveness();
29902
- const { runBootAdvancingSelfHeal } = await import("./advancing-selfheal-cSvXNZLZ.js");
29701
+ const { runBootAdvancingSelfHeal } = await import("./advancing-selfheal-BVwW4qRn.js");
29903
29702
  await runBootAdvancingSelfHeal();
29904
29703
  runScheduledPatrol("startup");
29905
29704
  })().catch((err) => {
@@ -29969,6 +29768,6 @@ function assessDeaconPatrolFreshness(params) {
29969
29768
  };
29970
29769
  }
29971
29770
  //#endregion
29972
- export { reconcileClosedPrReadyForMerge as $, reconcileAgentLiveness as A, getAcceptedSystemHealthSnapshot as At, recordDeadEndNeedsYou as B, getLastPatrolResult as C, INSPECT_TIMEOUT_MS as Ct, isDeaconRunning as D, formatUptime as Dt, handleAgentStoppedForOrphanReviewerSessions as E, getResourceStacks as Et, setAgentStatusChangedNotifier as F, isSmeeConfiguredSync as Ft, redeliverUndeliveredKickoffs as G, isRapidPostResumeDeath as H, setAgentStoppedNotifier as I, startSmeeProcessSync as It, startBootReconciliation as J, isBootReconciliationCandidate as K, setMergeReadyNotifier as L, classifyAgentHealth as Lt, resetPatrolHeartbeatForStartup as M, getResourceConfig as Mt, runPatrol as N, getSystemHealthEvidenceSnapshot as Nt, loadConfig as O, getContainerHistory as Ot, saveState as P, getSystemHealthSnapshot as Pt, ciRetryMap as Q, startDeacon as R, getDeaconStatus as S, paneShowsClaudeBootBlockingScreen as St, handleAgentStoppedEvent as T, classifyMemoryPressure as Tt, nudgeIdleWorkAgentsWithOpenBeads as U, isPreKickoffLaunchDeath as V, nudgeStalledResumeWorkAgents as W, checkFailedMergeRetry as X, autoCloseOut as Y, checkFirstCompletionAgents as Z, cleanupOrphanReviewerSessions as _, stalledReviewConvoyRecoveryState as _t, checkCompletedButUnsignaledTests as a, cleanupOrphanedReviewSessions as at, containerRestartBackoffMs as b, contextProactiveCompactState as bt, checkMergedWorkSessions as c, checkCompletedButUnsignaledReviews as ct, checkPostReviewCommits as d, checkMissingReviewStatuses as dt, reconcileFalseMerged as et, checkReadyForMergeStuck as f, checkOrphanedReviewStatuses as ft, cleanupAbandonedFeedback as g, reviewConvoyLiveness as gt, checkWorkspaceContainerHealth as h, recoverStalledReviewConvoys as ht, checkAwaitingTestWorkSessions as i, reconcileStuckReadyForMerge as it, reconcileTestStatusFromGreenCi as j, getDeployStaleness as jt, loadState as k, getCurrentDockerStats as kt, checkOrphanedCompletions as l, checkStuckReviewing as lt, checkVerificationReviewContradiction as m, handleWorkCompleted as mt, assessDeaconPatrolFreshness as n, reconcileStaleMergeBlockers as nt, checkDeadEndAgents as o, monitorReviewConvoySignals as ot, checkStuckWorkAgents as p, handleReviewCoordinatorDied as pt, listBootReconciliationCandidates as q, checkAndSuspendIdleAgents as r, reconcileStaleMergeStatus as rt, checkMassDeath as s, synthesizeReviewFromReports as st, applyBootReconciliationDecision as t, reconcileMergedButReviewing as tt, checkPendingTestDispatch as u, isSynthesisForActiveReviewRun as ut, cleanupOrphanedPlanningSessions as v, checkApiErrorAgents as vt, handleAgentHeartbeatDeadEvent as w, checkInspectAgentTimeouts as wt, getDeaconLogs as x, stuckOverflowNativeRecoveryState as xt, cleanupStaleAgentState as y, contextOverflowRecoveryState as yt, stopDeacon as z };
29771
+ export { reconcileClosedPrReadyForMerge as $, reconcileAgentLiveness as A, getContainerHistory as At, recordDeadEndNeedsYou as B, getLastPatrolResult as C, paneShowsClaudeBootBlockingScreen as Ct, isDeaconRunning as D, classifyMemoryPressure as Dt, handleAgentStoppedForOrphanReviewerSessions as E, WORK_LAUNCHER_GRACE_MS as Et, setAgentStatusChangedNotifier as F, getSystemHealthEvidenceSnapshot as Ft, redeliverUndeliveredKickoffs as G, isRapidPostResumeDeath as H, setAgentStoppedNotifier as I, getSystemHealthSnapshot as It, startBootReconciliation as J, isBootReconciliationCandidate as K, setMergeReadyNotifier as L, isSmeeConfiguredSync as Lt, resetPatrolHeartbeatForStartup as M, getAcceptedSystemHealthSnapshot as Mt, runPatrol as N, getDeployStaleness as Nt, loadConfig as O, getResourceStacks as Ot, saveState as P, getResourceConfig as Pt, ciRetryMap as Q, startDeacon as R, startSmeeProcessSync as Rt, getDeaconStatus as S, deliverOrchestratedCompact as St, handleAgentStoppedEvent as T, checkInspectAgentTimeouts as Tt, nudgeIdleWorkAgentsWithOpenBeads as U, isPreKickoffLaunchDeath as V, nudgeStalledResumeWorkAgents as W, checkFailedMergeRetry as X, autoCloseOut as Y, checkFirstCompletionAgents as Z, cleanupOrphanReviewerSessions as _, stalledReviewConvoyRecoveryState as _t, checkCompletedButUnsignaledTests as a, cleanupOrphanedReviewSessions as at, containerRestartBackoffMs as b, contextProactiveCompactState as bt, checkMergedWorkSessions as c, checkCompletedButUnsignaledReviews as ct, checkPostReviewCommits as d, checkMissingReviewStatuses as dt, reconcileFalseMerged as et, checkReadyForMergeStuck as f, checkOrphanedReviewStatuses as ft, cleanupAbandonedFeedback as g, reviewConvoyLiveness as gt, checkWorkspaceContainerHealth as h, recoverStalledReviewConvoys as ht, checkAwaitingTestWorkSessions as i, reconcileStuckReadyForMerge as it, reconcileTestStatusFromGreenCi as j, getCurrentDockerStats as jt, loadState as k, formatUptime as kt, checkOrphanedCompletions as l, checkStuckReviewing as lt, checkVerificationReviewContradiction as m, handleWorkCompleted as mt, assessDeaconPatrolFreshness as n, reconcileStaleMergeBlockers as nt, checkDeadEndAgents as o, monitorReviewConvoySignals as ot, checkStuckWorkAgents as p, handleReviewCoordinatorDied as pt, listBootReconciliationCandidates as q, checkAndSuspendIdleAgents as r, reconcileStaleMergeStatus as rt, checkMassDeath as s, synthesizeReviewFromReports as st, applyBootReconciliationDecision as t, reconcileMergedButReviewing as tt, checkPendingTestDispatch as u, isSynthesisForActiveReviewRun as ut, cleanupOrphanedPlanningSessions as v, checkApiErrorAgents as vt, handleAgentHeartbeatDeadEvent as w, INSPECT_TIMEOUT_MS as wt, getDeaconLogs as x, stuckOverflowNativeRecoveryState as xt, cleanupStaleAgentState as y, contextOverflowRecoveryState as yt, stopDeacon as z, classifyAgentHealth as zt };
29973
29772
 
29974
- //# sourceMappingURL=deacon-CkT_kznS.js.map
29773
+ //# sourceMappingURL=deacon-CU_cAYSR.js.map