@overdeck/desktop 0.45.21 → 0.45.22

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 (344) hide show
  1. package/package.json +1 -1
  2. package/server/{acceptance-criteria-CJIFA8Vg.js → acceptance-criteria-BH7ac_1G.js} +2 -2
  3. package/server/{advancing-selfheal-CPOBO5ZS.js → advancing-selfheal-cSvXNZLZ.js} +6 -6
  4. package/server/{agent-gc-D6PUckBB.js → agent-gc-Dj2gncak.js} +4 -4
  5. package/server/{agent-state-BV_6RHnO.js → agent-state-Co5Sy2Fw.js} +1 -1
  6. package/server/{agent-state-service-DHwemt96.js → agent-state-service-CsQ07Pxe.js} +1 -1
  7. package/server/{agent-state-service-6MFQqnFy.js → agent-state-service-DistflNn.js} +5 -5
  8. package/server/{agents-DbrHWunF.js → agents-DXdHmRTC.js} +4 -4
  9. package/server/{agents-Czz6R57Z.js → agents-DyHKlq1I.js} +1 -1
  10. package/server/{archive-planning-BOnwJq8M.js → archive-planning-BvDuWNMo.js} +5 -5
  11. package/server/{archive-planning-MPpvQJL4.js → archive-planning-Cp_DC1j-.js} +1 -1
  12. package/server/{artifact-index-jobs-BOoySTKD.js → artifact-index-jobs-CDBFL4OU.js} +2 -2
  13. package/server/{backlog-auto-trigger-BUaFI44J.js → backlog-auto-trigger-DmA1IbYf.js} +3 -3
  14. package/server/{behavior-Dg-D8eBG.js → behavior-CGj16clS.js} +2 -2
  15. package/server/{briefing-freshness-OouGbJ7d.js → briefing-freshness-C12WgkaB.js} +2 -2
  16. package/server/{build-info-Cv6CI7Gu.js → build-info-BRpqQvNd.js} +1 -1
  17. package/server/{build-info-27NlbKhV.js → build-info-NU3KbXYw.js} +3 -3
  18. package/server/{checkpoint-manager-D64fCC4p.js → checkpoint-manager-CTPjAmtH.js} +2 -2
  19. package/server/{checkpoint-manager-C7mFCY_E.js → checkpoint-manager-rOgT98WY.js} +1 -1
  20. package/server/checkpoint-worker.js +1 -1
  21. package/server/{checkpoints-DwZqT2qQ.js → checkpoints-B5jFNi2G.js} +1 -1
  22. package/server/{checkpoints-Vh-J15ge.js → checkpoints-BJum14fs.js} +2 -2
  23. package/server/{claude-hooks-provision-CS5W_dhI.js → claude-hooks-provision-BhwWK-TQ.js} +1 -1
  24. package/server/{claude-hooks-provision-BVLGfHrv.js → claude-hooks-provision-D7p5WcKZ.js} +2 -2
  25. package/server/{claude-permissions-C2OrLYKL.js → claude-permissions-nSFKH78M.js} +2 -2
  26. package/server/{claude-settings-overlay-DX-fMFpC.js → claude-settings-overlay-BI_UIke0.js} +2 -2
  27. package/server/{claude-settings-overlay-DWXjafJh.js → claude-settings-overlay-DHBwjS1X.js} +1 -1
  28. package/server/cli-BRORS9qY.js +3 -0
  29. package/server/{cli-mvpEOb3w.js → cli-CbKNkFE5.js} +9 -9
  30. package/server/{cliproxy-Dvsr4ZkW.js → cliproxy-Brf_5MuG.js} +2 -2
  31. package/server/{cliproxy-7g1nObvB.js → cliproxy-bONZDBbC.js} +1 -1
  32. package/server/{close-issue-8F6uawYj.js → close-issue-CxReRxIc.js} +5 -5
  33. package/server/{closed-issue-reaper-BaYQYF6w.js → closed-issue-reaper-CQ3kqha7.js} +9 -9
  34. package/server/{closed-issue-reaper-BhV-r-tC.js → closed-issue-reaper-DXP2Xyv3.js} +1 -1
  35. package/server/{codex-D_UBEOwL.js → codex-CbmztVcc.js} +9 -6
  36. package/server/{codex-BBeZ8c3s.js → codex-DNyiQDKW.js} +1 -1
  37. package/server/{codex-parser-BTzlOZiV.js → codex-parser-jl8AeAmB.js} +2 -2
  38. package/server/{config-nAB_F-Gp.js → config-BJKocXKd.js} +1 -1
  39. package/server/{config-G1TOMJZA.js → config-DeTsoZdR.js} +2 -2
  40. package/server/{config-CrduXs4a.js → config-q4Gvd8dq.js} +2 -2
  41. package/server/{config-yaml-Ciyp2mYe.js → config-yaml-ig8Nwtiw.js} +124 -27
  42. package/server/{conflict-gate-BLUNMs1i.js → conflict-gate-CFqPVxEg.js} +3 -3
  43. package/server/{conflict-gate-BKalpcjL.js → conflict-gate-CHU9K1vU.js} +1 -1
  44. package/server/{context-layers-Cg9ZgVfx.js → context-layers-15gDOk20.js} +3 -3
  45. package/server/{context-layers-YNpf6Q_I.js → context-layers-DlQKkHH2.js} +2 -2
  46. package/server/{control-settings-D_79A6gp.js → control-settings-D_odMIaC.js} +4 -4
  47. package/server/{conversation-compaction-DiuZbIUB.js → conversation-compaction-B6YSRLda.js} +8 -8
  48. package/server/{conversation-compaction-CMIeWW4_.js → conversation-compaction-CN4-5YYt.js} +1 -1
  49. package/server/{conversation-service-DQybSPUK.js → conversation-service-C3avRVEr.js} +6 -6
  50. package/server/{conversation-service-CWk8mEym.js → conversation-service-Dq33SYEj.js} +1 -1
  51. package/server/{conversations-BJ-t3BRm.js → conversations-H9if0bCQ.js} +1 -1
  52. package/server/{conversations-BUgGvqVL.js → conversations-bYpM9-kZ.js} +4 -4
  53. package/server/{cost-Drm7qeD5.js → cost-Codk1pc2.js} +2 -2
  54. package/server/{cost-sync-DzHP6zaR.js → cost-sync-D_cre6WM.js} +3 -3
  55. package/server/{cost-jJ2cgDcG.js → cost-wH46-WsJ.js} +3 -3
  56. package/server/{dag-DIji6O2b.js → dag-CJpgf9A3.js} +2 -2
  57. package/server/{dangerous-git-ops-BebB-61h.js → dangerous-git-ops-D6AF-Hg_.js} +1 -1
  58. package/server/dashboard-db-worker.js +7 -7
  59. package/server/{deacon-pleYrvIm.js → deacon-B8HbQdqU.js} +3 -3
  60. package/server/{deacon-1s7bM5zn.js → deacon-CkT_kznS.js} +1377 -407
  61. package/server/{deacon-nudge-log-C5VCKtyi.js → deacon-nudge-log-D6K9K-rE.js} +3 -3
  62. package/server/{deacon-swarm-DmA3rJ7k.js → deacon-swarm-BryRr6AO.js} +13 -13
  63. package/server/deacon-swarm-CV54eNmU.js +2 -0
  64. package/server/deacon.js +8 -8
  65. package/server/{deploy-patrol-DmM6F-yw.js → deploy-patrol-1IrZxicY.js} +6 -6
  66. package/server/{deploy-window-ClLq1RYf.js → deploy-window-7ZYHh7Zp.js} +1 -1
  67. package/server/{deploy-window-jw4S_Y-c.js → deploy-window-wDf4UgHt.js} +6 -6
  68. package/server/{dev-supervisor-Do2Stz49.js → dev-supervisor-C7p9kEpc.js} +2 -2
  69. package/server/{devcontainer-renderer-D8ylupco.js → devcontainer-renderer-CNmQy0pL.js} +3 -3
  70. package/server/{dist-yfR7G1BL.js → dist-D-Ed5yVw.js} +1 -1
  71. package/server/dist-j64RzSrQ.js +3 -0
  72. package/server/{docker-ClwPQaba.js → docker-BCZ89M9X.js} +2 -2
  73. package/server/{dod-BLphkhjs.js → dod-DbJLYcHv.js} +1 -1
  74. package/server/{ensure-devcontainer-BA3bICoY.js → ensure-devcontainer-Cs6W9Yzj.js} +1 -1
  75. package/server/{ensure-devcontainer-CFpQatOc.js → ensure-devcontainer-V5JWaAva.js} +4 -4
  76. package/server/{esm-shims-BZw-fTQ6.js → esm-shims-dTeNdq7X.js} +1 -1
  77. package/server/{event-store-DABarGNz.js → event-store-CpBGsO6_.js} +1 -1
  78. package/server/{event-store-BVnON3vf.js → event-store-TnWdydfB.js} +3 -3
  79. package/server/{events-CmERlnwn.js → events-DSUdR-04.js} +3 -3
  80. package/server/{events-LGeUehYW.js → events-Dsuv6qyB.js} +1 -1
  81. package/server/{factory-CQNprtHe.js → factory-BMrK4TrE.js} +4 -4
  82. package/server/{feature-registry-population-D9Z3tYSa.js → feature-registry-population-B-CI9hgE.js} +4 -4
  83. package/server/{feature-registry-storage-BWymOgXE.js → feature-registry-storage-B972ph_A.js} +2 -2
  84. package/server/{features--fOza5g5.js → features-Bc-Bmiye.js} +2 -2
  85. package/server/{feedback-target-Dn9vfPpz.js → feedback-target-DS6NUuSs.js} +1 -1
  86. package/server/{feedback-target-Dqik2WTe.js → feedback-target-DZ-iAnAa.js} +7 -7
  87. package/server/{feedback-writer-Wlq5-qgS.js → feedback-writer-BXP6g75N.js} +4 -4
  88. package/server/{feedback-writer-DDQNV8uc.js → feedback-writer-Bx5z11mF.js} +1 -1
  89. package/server/{flywheel-DPUc8r3V.js → flywheel-6WHU4O7A.js} +14 -14
  90. package/server/{flywheel-1Wd8WDlh.js → flywheel-COR0mbRI.js} +12 -12
  91. package/server/{flywheel-Q-38YhZG.js → flywheel-Ctr5uuvo.js} +1 -1
  92. package/server/{flywheel-merge-order-CeBuX0EJ.js → flywheel-merge-order-CNKAY489.js} +1 -1
  93. package/server/{flywheel-merge-order-4SqOXFAr.js → flywheel-merge-order-CTgHeg-W.js} +7 -7
  94. package/server/forge-B0_opi-V.js +2 -0
  95. package/server/{forge-DBbDpiYc.js → forge-B1S_KZv4.js} +2 -2
  96. package/server/{from-hh6vTBGl.js → from-DpwQ-sc3.js} +1 -1
  97. package/server/{fts-db-6ponMie2.js → fts-db-DmAcuCkV.js} +2 -2
  98. package/server/{fts-operations-KIRK165y.js → fts-operations-7d_RkmWp.js} +2 -2
  99. package/server/git-utils-Cc3FHDKd.js +198 -0
  100. package/server/{git-utils-DmF5xkj8.js → git-utils-CsKGnzFA.js} +1 -1
  101. package/server/{github-app-B3yfECo8.js → github-app-CDPtGF7J.js} +2 -2
  102. package/server/{github-app-CeSVFL6C.js → github-app-CU14oYzP.js} +1 -1
  103. package/server/{github-client-4A6FgA8O.js → github-client-CwBZZ3t7.js} +1 -1
  104. package/server/{github-client-Dslipypz.js → github-client-XjTJbBm7.js} +2 -2
  105. package/server/{github-pr-lookup-DBP0YHMr.js → github-pr-lookup-CFGeVhqv.js} +2 -2
  106. package/server/harness-binary-B2CTcD84.js +106 -0
  107. package/server/{harness-resolve-BGpO-OVM.js → harness-resolve-D5FVQTmy.js} +9 -15
  108. package/server/{health-events-CnwV_SSz.js → health-events-C1whmd58.js} +1 -1
  109. package/server/{health-events-CZGZ5I-A.js → health-events-DREeevle.js} +2 -2
  110. package/server/{hooks-DvX33gY_.js → hooks-B-HItBiS.js} +1 -1
  111. package/server/{hooks-CoNscX84.js → hooks-yxRsjk-z.js} +2 -2
  112. package/server/hume-BmhvfVbV.js +3 -0
  113. package/server/{hume-DSJt5eA_.js → hume-Dz_OymXE.js} +2 -2
  114. package/server/{idle-stack-reaper-5DVRoY6P.js → idle-stack-reaper-DrCv0OAG.js} +1 -1
  115. package/server/{idle-stack-reaper-BfL8HqYy.js → idle-stack-reaper-Yf34xXxY.js} +2 -2
  116. package/server/{in-flight-guard-tVGiI5ee.js → in-flight-guard-BoWm66Kh.js} +2 -2
  117. package/server/{infra-DN2wSxle.js → infra-D4iNWMA5.js} +4 -4
  118. package/server/{injection-DK9zh_HL.js → injection-BVNa4MQW.js} +1 -1
  119. package/server/{injection-DtlT8Akv.js → injection-D7T75Pye.js} +7 -7
  120. package/server/{inspect-agent-DKByUS_F.js → inspect-agent-BXCgNeZ4.js} +13 -9
  121. package/server/inspect-agent-Dq0z1k3H.js +2 -0
  122. package/server/{internal-token-7bYL5v6K.js → internal-token-C9DdEOKY.js} +1 -1
  123. package/server/{internal-token-DhfFiwW7.js → internal-token-CXsfxslp.js} +2 -2
  124. package/server/{io-BiM-7Zsx.js → io-DQR9PMgS.js} +3 -3
  125. package/server/{issue-closed-Dfw3QDyZ.js → issue-closed-DtmJM0D0.js} +7 -7
  126. package/server/{issue-lifecycle-ytsEdDlK.js → issue-lifecycle-8PSS9Anq.js} +1 -1
  127. package/server/{issue-lifecycle-B7HZWnTA.js → issue-lifecycle-CeyW_HoD.js} +21 -21
  128. package/server/{issue-service-singleton-D5EB5eYr.js → issue-service-singleton-DBZabEl7.js} +1 -1
  129. package/server/{issue-service-singleton-CPESc4Or.js → issue-service-singleton-D_RVYBuL.js} +8 -8
  130. package/server/{issues-XYtFMxrH.js → issues-pDW9VUNz.js} +2 -2
  131. package/server/{jsonl-parser-DJV2eZUP.js → jsonl-parser-C3HVNR5d.js} +3 -3
  132. package/server/{label-cleanup-CJ4m8iRU.js → label-cleanup-DPwiZlWo.js} +3 -3
  133. package/server/{label-reconciler-CNf3Ylm3.js → label-reconciler-Df1ZduPH.js} +4 -4
  134. package/server/{launcher-generator-5DJRiovn.js → launcher-generator-COgR2By1.js} +6 -6
  135. package/server/{layers-cZx7ibtV.js → layers-Cp1To4L8.js} +2 -2
  136. package/server/{lifecycle-CE7619Xw.js → lifecycle-CtPDcZ9u.js} +6 -6
  137. package/server/{lifecycle-io-CUpsxG0p.js → lifecycle-io-DmY2qwCn.js} +1 -1
  138. package/server/{lifecycle-io-DMurK4oM.js → lifecycle-io-taIb0PoH.js} +4 -4
  139. package/server/{linear-client-BLyN-NiP.js → linear-client-DsFkIxee.js} +2 -2
  140. package/server/{linear-client-Bj1l4FOA.js → linear-client-YwZMDIwQ.js} +1 -1
  141. package/server/memory-fts-worker.js +1 -1
  142. package/server/{merge-CwX2_AWm.js → merge-BwsyNRJV.js} +1 -1
  143. package/server/{merge-hSC2BENe.js → merge-C1t-bspg.js} +3 -3
  144. package/server/{merge-agent-CnORPiri.js → merge-agent-B-SnXOoc.js} +1 -1
  145. package/server/{merge-agent-DnBsms_V.js → merge-agent-DDiIjzk-.js} +369 -213
  146. package/server/{merge-batch-C2w2U2eK.js → merge-batch-Byt-QnEl.js} +1 -1
  147. package/server/{merge-blockers-DhRgh76x.js → merge-blockers-BYjeXrVN.js} +2 -2
  148. package/server/merge-ops-DwWCkSgo.js +2 -0
  149. package/server/{merge-rebase-CE-ZyOMY.js → merge-rebase-Cm6fXaZN.js} +2 -2
  150. package/server/{merge-set-DHkzPCJU.js → merge-set-6LEglm6o.js} +1 -1
  151. package/server/{merge-set-D7YNU1ZB.js → merge-set-DiISXcC-.js} +3 -3
  152. package/server/{merge-sync-CpGA9Kg7.js → merge-sync-B95_4in_.js} +1 -1
  153. package/server/{merge-sync-De1FYva5.js → merge-sync-Do8_q32h.js} +2 -2
  154. package/server/{merge-train-SvkRJZ-k.js → merge-train-CKana8EH.js} +3 -3
  155. package/server/{merge-train-deps-CECJTElu.js → merge-train-deps-BgmqwIfA.js} +4 -4
  156. package/server/{merge-verification-B3meGcXF.js → merge-verification-CqnUzGEK.js} +4 -4
  157. package/server/{multipart-parser-ByTMgYV5.js → multipart-parser-tdOQDJ3o.js} +2 -2
  158. package/server/{no-resume-mode-BnInAFKs.js → no-resume-mode-BWOSZjWd.js} +1 -1
  159. package/server/node_modules/.package-lock.json +5 -5
  160. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +3 -3
  161. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
  162. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +2 -2
  163. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
  164. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +5 -5
  165. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +6 -8
  166. package/server/{orphan-proposed-reconciler-CAfuWTA1.js → orphan-proposed-reconciler-DSvsJ5M7.js} +1 -1
  167. package/server/{orphan-proposed-reconciler-AxAGUouN.js → orphan-proposed-reconciler-xklgvNA7.js} +19 -12
  168. package/server/package-lock.json +6 -6
  169. package/server/package.json +1 -1
  170. package/server/{pan-dir-Rw17YjT1.js → pan-dir-DOcf6ug3.js} +4 -4
  171. package/server/{paths-FP8v3lTz.js → paths-DooHpt9p.js} +2 -2
  172. package/server/{pickup-xi3KTLaJ.js → pickup-CaskQ7j6.js} +2 -2
  173. package/server/{pipeline-membership-BtKMNY7v.js → pipeline-membership-1LGRjo-k.js} +11 -8
  174. package/server/{pipeline-notifier-BM2HLF7B.js → pipeline-notifier-B6FVsYF9.js} +2 -2
  175. package/server/{pipeline-notifier-dQ-U4NSb.js → pipeline-notifier-CZsrU_nj.js} +1 -1
  176. package/server/{project-pipelines-B59NfN44.js → project-pipelines-CtNG_rvs.js} +2 -2
  177. package/server/projects-BKkwpH6q.js +3 -0
  178. package/server/{prompts-CbqaVjbe.js → prompts-EvhMeeHG.js} +2 -2
  179. package/server/{providers-d3pwXGVE.js → providers-BDDPULlp.js} +7 -7
  180. package/server/providers-DNSQqy2V.js +3 -0
  181. package/server/public/assets/{chunk-BO2N2NFS-BxYSL7J-.js → chunk-BO2N2NFS-sym_ufXe.js} +4 -4
  182. package/server/public/assets/{diagram-OG6HWLK6-C_F9Q2as.js → diagram-OG6HWLK6-CQJPBNBu.js} +1 -1
  183. package/server/public/assets/{dist-DQNg4CiF.js → dist-Bio7THQU.js} +1 -1
  184. package/server/public/assets/{dist-CLSlc6cV.js → dist-DukGS2YZ.js} +3 -3
  185. package/server/public/assets/{ganttDiagram-6RSMTGT7-Cq0my-0C.js → ganttDiagram-6RSMTGT7-D4lWwte3.js} +1 -1
  186. package/server/public/assets/{highlighted-body-OFNGDK62-eZC03dGh.js → highlighted-body-OFNGDK62-CaLboCt5.js} +1 -1
  187. package/server/public/assets/{index-C6NLz_1S.css → index-Bdc4V9ba.css} +1 -1
  188. package/server/public/assets/{index-SLYGA8AQ.js → index-Bwejq-5s.js} +147 -145
  189. package/server/public/assets/{linear-6Fi3qnGg.js → linear-qUWmMZ-c.js} +1 -1
  190. package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +1 -0
  191. package/server/public/assets/{pieDiagram-4H26LBE5-Dpmc6xsv.js → pieDiagram-4H26LBE5-C4zYulEm.js} +1 -1
  192. package/server/public/assets/{prod-ojHllFvN.js → prod-C8VtLuWC.js} +4 -4
  193. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Ulr9gON5.js → quadrantDiagram-W4KKPZXB-qP04zyZC.js} +1 -1
  194. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CwdHGXfL.js → sankeyDiagram-5OEKKPKP-eMPTX_cG.js} +1 -1
  195. package/server/public/assets/{xychartDiagram-2RQKCTM6-r-bEDzJh.js → xychartDiagram-2RQKCTM6-Dme1PIt6.js} +1 -1
  196. package/server/public/index.html +54 -10
  197. package/server/{pull-requests-CjjPj7v6.js → pull-requests-8z2N1UOV.js} +3 -3
  198. package/server/{pull-requests-D3N6HQzI.js → pull-requests-By_BteaL.js} +1 -1
  199. package/server/{queries-B5hl7lMQ.js → queries-ZABd5aXP.js} +95 -71
  200. package/server/rally-OSJXdiHK.js +3 -0
  201. package/server/{rally-api-DGaFz5L5.js → rally-api-DqKqIMNR.js} +2 -2
  202. package/server/{rally-api-CKr0O4DJ.js → rally-api-xHazRk0d.js} +1 -1
  203. package/server/{rally-client-Cqf6EX_r.js → rally-client-CGWEHaPd.js} +1 -1
  204. package/server/{rally-client-SVbjGvqj.js → rally-client-COYz1vYR.js} +4 -4
  205. package/server/{rally-Dp0Gb1DN.js → rally-i_goYmiA.js} +3 -3
  206. package/server/reap-terminal-sessions-CaMkFOIH.js +4 -0
  207. package/server/{reap-terminal-sessions-CjqRAGw7.js → reap-terminal-sessions-DG9eiMVz.js} +11 -28
  208. package/server/{rebuild-stack-DjdpALr1.js → rebuild-stack-CKjJAI8L.js} +1 -1
  209. package/server/{rebuild-stack-DHqCLvLX.js → rebuild-stack-JUm0jqYP.js} +6 -6
  210. package/server/{reconstruct-cache-BqrCQt0o.js → reconstruct-cache-wU79aCee.js} +6 -6
  211. package/server/record-rwK-nKv_.js +3 -0
  212. package/server/{record-update-RviRDSNs.js → record-update-Crz74r-6.js} +2 -2
  213. package/server/{record-update-BlB8mpKO.js → record-update-D3N6WMFR.js} +1 -1
  214. package/server/{recovery-trip-l1Hsi37x.js → recovery-trip-DkzJSej9.js} +2 -2
  215. package/server/{release-engine-CSI4K6Oj.js → release-engine-DMINVN8S.js} +5 -5
  216. package/server/{release-set-BywwggrE.js → release-set-DeUSOEHy.js} +3 -3
  217. package/server/{remote-DYziAkiZ.js → remote-Dr5kGYSZ.js} +3 -3
  218. package/server/{remote-agents-CZ2rc8I0.js → remote-agents-Ct_WOyke.js} +6 -6
  219. package/server/{remote-agents-BNORDWAX.js → remote-agents-D6O_zETW.js} +1 -1
  220. package/server/{remote-cnoeuDWn.js → remote-b-c5bOce.js} +3 -3
  221. package/server/{remote-completion-W67FNQ-A.js → remote-completion-Dca3hAaa.js} +13 -13
  222. package/server/resume-wZZsWtzz.js +3 -0
  223. package/server/{review-agent-CSswH985.js → review-agent-CCum8sGe.js} +1 -1
  224. package/server/{review-agent-CqSqSHkU.js → review-agent-CThvgK2r.js} +23 -23
  225. package/server/{review-artifacts-BBgnd5df.js → review-artifacts-CXywD0F2.js} +5 -5
  226. package/server/{review-context-Ctp9BdNJ.js → review-context-OYfKUprb.js} +8 -8
  227. package/server/{review-status-DXeqFpk5.js → review-status-Bnh-rdkY.js} +1 -1
  228. package/server/{review-status-CCgPVK1h.js → review-status-DFRjDFef.js} +21 -37
  229. package/server/{review-status-enrichment-DtDRGpst.js → review-status-enrichment-crNAtIpL.js} +3 -3
  230. package/server/review-status-source-CxuEjLGg.js +39 -0
  231. package/server/{review-status-sync-C792ksoJ.js → review-status-sync-D60PJWNL.js} +1 -1
  232. package/server/{review-status-sync-jnLgd04F.js → review-status-sync-DpAMD_WO.js} +2 -2
  233. package/server/{review-verdict-feedback-CMsIpTpy.js → review-verdict-feedback-CpUZl5aE.js} +7 -7
  234. package/server/{review-verdict-feedback-D5lW0o3k.js → review-verdict-feedback-JImjut0z.js} +1 -1
  235. package/server/{rollup-B3kQmNpl.js → rollup-CZ02qgxk.js} +1 -1
  236. package/server/{rollup-CLj_AK9f.js → rollup-SyuF09e4.js} +8 -8
  237. package/server/{scanner-C4NeC4FE.js → scanner-Br0Z5S6R.js} +7 -7
  238. package/server/{sequence-io-Ce-6grIY.js → sequence-io-fxU0DlwW.js} +4 -4
  239. package/server/{sequencer-agent-Bpz0yGmG.js → sequencer-agent-B5YC5XVP.js} +5 -5
  240. package/server/server.js +583 -387
  241. package/server/{service-CqAY8Kmk.js → service-Bagb90KZ.js} +150 -47
  242. package/server/{session-fork-uNo4rMRA.js → session-fork-BqQxd-V6.js} +2 -2
  243. package/server/{session-history-DUehL3KN.js → session-history-XdS0JKp3.js} +4 -4
  244. package/server/{settings-DP2OYLXL.js → settings-BNbocWOg.js} +3 -3
  245. package/server/settings-BlUsVaUc.js +2 -0
  246. package/server/{settings-D9grjmaP.js → settings-uLc6DEYI.js} +2 -2
  247. package/server/{shadow-engineering-Bi_oIMtF.js → shadow-engineering-D4X_s3fA.js} +3 -3
  248. package/server/{shadow-state-a_ztFBJe.js → shadow-state-C_NkP-sa.js} +2 -2
  249. package/server/{shadow-state-CDxEuPlE.js → shadow-state-CbvsN3qG.js} +1 -1
  250. package/server/{shadow-utils-CyOg6_Xq.js → shadow-utils-CYMRPeRT.js} +2 -2
  251. package/server/{ship-log-DDcueaIR.js → ship-log-__QtAFXG.js} +1 -1
  252. package/server/{smart-compaction--Oj65Uov.js → smart-compaction-CLZOWin1.js} +7 -7
  253. package/server/{smart-compaction-C1_VVLEd.js → smart-compaction-jdMkG1vo.js} +1 -1
  254. package/server/{spawn-planning-session-LFtK2QCE.js → spawn-planning-session-8D6mE033.js} +1 -1
  255. package/server/{spawn-planning-session-AiUSsBnH.js → spawn-planning-session-D5OXo8pT.js} +19 -15
  256. package/server/{specialist-completion-qOgqdqXH.js → specialist-completion-CqmduO92.js} +1 -1
  257. package/server/{specialist-context-gjj8Z4Ii.js → specialist-context-CJ-QjFR-.js} +5 -5
  258. package/server/{specialist-handoff-logger-BsBNvVZv.js → specialist-handoff-logger-Dnjlwt7g.js} +2 -2
  259. package/server/{specialist-logs-CSLtvPx6.js → specialist-logs-CQnKzuZs.js} +3 -3
  260. package/server/{specialists-DAegTvRt.js → specialists-Bg9v4z3F.js} +122 -94
  261. package/server/{specialists-CYRwELzc.js → specialists-CwZHb5cb.js} +18 -18
  262. package/server/{specialists-D0VBf8g_.js → specialists-D0gGXMZx.js} +1 -1
  263. package/server/{specialists-C6WkeKFK.js → specialists-Dqe6_HE5.js} +1 -1
  264. package/server/specs-BhOKBzqk.js +3 -0
  265. package/server/{src-OLoJhUiJ.js → src-BMMoA_ba.js} +6 -6
  266. package/server/{src-BqTcrfO_.js → src-Bqdtd6po.js} +3 -3
  267. package/server/{src-Dpq1yFIl.js → src-k039WVYY.js} +337 -4
  268. package/server/{stack-health-I713ELld.js → stack-health-Bd06frFn.js} +1 -1
  269. package/server/{stack-health-DV_f-lK0.js → stack-health-C-ifC7b0.js} +2 -2
  270. package/server/{stale-task-claims-CQSKZVq0.js → stale-task-claims-L7pJkQFL.js} +4 -4
  271. package/server/{staleness-BbsGxmF2.js → staleness-BID1BKdr.js} +1 -1
  272. package/server/{staleness-zGp4P1hd.js → staleness-_Tr-GwdA.js} +1 -1
  273. package/server/{state-home-DixkE-up.js → state-home-CONQvZR0.js} +36 -23
  274. package/server/state-migrate-BeBW0KXA.js +478 -0
  275. package/server/{stuck-remediation-BWkK_O7A.js → stuck-remediation-CKnIryGT.js} +20 -18
  276. package/server/{stuck-remediation-CTPRC2S5.js → stuck-remediation-CsGD5Ksb.js} +1 -1
  277. package/server/{substrate-bug-weights-service-DXd0ID83.js → substrate-bug-weights-service-CpIZILj9.js} +3 -3
  278. package/server/{summary-fork-CdLn8Chr.js → summary-fork-agEMsPSo.js} +2 -2
  279. package/server/{summary-fork-f3DpgjXh.js → summary-fork-bX6ax6X7.js} +8 -8
  280. package/server/supervisor-COVHrBTg.js +2 -0
  281. package/server/{supervisor-Ch8CDuoF.js → supervisor-Ctt4eRYz.js} +3 -3
  282. package/server/{swarm-readiness-C9P2iPap.js → swarm-readiness-DdmJVX7y.js} +3 -3
  283. package/server/{system-prerequisites-DkoQBn1q.js → system-prerequisites-DSXBvffY.js} +24 -44
  284. package/server/{teardown-workspace-D-5yMyit.js → teardown-workspace-DDCf5n-a.js} +15 -15
  285. package/server/{test-agent-queue-BwpUpu-o.js → test-agent-queue-BJZ9Nfcc.js} +6 -6
  286. package/server/{test-verdict-BRiSu7eW.js → test-verdict-Cp5tljlJ.js} +1 -1
  287. package/server/{test-verdict-BQ1yx7d4.js → test-verdict-D_-sXIz_.js} +1 -1
  288. package/server/{tldr-daemon-BJA7TkqS.js → tldr-daemon-B8_oT5gx.js} +1 -1
  289. package/server/{tldr-daemon-DjxP5g6Y.js → tldr-daemon-BQFmmFp0.js} +2 -2
  290. package/server/{tmux-HQLgwo_C.js → tmux-BAvtac_u.js} +1 -1
  291. package/server/{tmux-y1blSxks.js → tmux-L5LgvGLp.js} +2 -2
  292. package/server/{token-LUrbM9sU.js → token-BkQLy4yS.js} +2 -2
  293. package/server/token-util-BArZLN6w.js +3 -0
  294. package/server/{token-util-BZaDAQ8S.js → token-util-DI8sGlmF.js} +1 -1
  295. package/server/{tracker-config-DSFZBdXP.js → tracker-config-DdT-nUAM.js} +2 -2
  296. package/server/{tracker-utils-DiceZN3a.js → tracker-utils-CawsPSS2.js} +2 -2
  297. package/server/{tracker-utils-WtP_V-yn.js → tracker-utils-DV3h1FYG.js} +1 -1
  298. package/server/{traefik-connect-BXqfOP4-.js → traefik-connect-C6mJckNs.js} +1 -1
  299. package/server/{tunnel-WcJImbAC.js → tunnel-BIFl98rc.js} +1 -1
  300. package/server/{tunnel-DTng1rfQ.js → tunnel-IdK1iTHx.js} +3 -3
  301. package/server/{types-BjaZ1oqH.js → types-7-GnJn0t.js} +1 -1
  302. package/server/{types-DqeBMmJN.js → types-hraoaQIp.js} +1 -1
  303. package/server/{uat-train-Wismge7h.js → uat-train-0Ujk8GCv.js} +1 -1
  304. package/server/{uat-train-BpLnp7Cx.js → uat-train-j0cPeMSj.js} +25 -25
  305. package/server/{validation-BA4e5EGm.js → validation-CabEISJT.js} +4 -4
  306. package/server/{validation-CUWamZ4X.js → validation-DcAgXTQp.js} +1 -1
  307. package/server/{verification-artifact-Dr_0g9nb.js → verification-artifact-BuTA1QbL.js} +1 -1
  308. package/server/{verification-artifact-CrbI4tJE.js → verification-artifact-Ck1tefmz.js} +1 -1
  309. package/server/{verification-runner-Dcksl_P-.js → verification-runner-DlJezzef.js} +1 -1
  310. package/server/{verification-runner-gAzh3cVD.js → verification-runner-FiuAZ-H2.js} +15 -14
  311. package/server/{vtt-parser-3VZKsmSm.js → vtt-parser-BnRsYzcz.js} +1 -1
  312. package/server/{work-agent-prompt-ULdcANl5.js → work-agent-prompt-DLthEPAq.js} +12 -11
  313. package/server/{workflows-B8ROFlfw.js → workflows-BZNNYkGC.js} +18 -18
  314. package/server/workflows-C4mR0Reb.js +2 -0
  315. package/server/{workspace-DSjUJaJN.js → workspace-3IC-UkAi.js} +1 -1
  316. package/server/{workspace-DhTDA8nB.js → workspace-D9ppycdg.js} +3 -3
  317. package/server/{workspace-config-BAAsAv-o.js → workspace-config-Bigl_-Lk.js} +1 -1
  318. package/server/{workspace-manager-CcujONCR.js → workspace-manager-B1WOfKvB.js} +1 -1
  319. package/server/{workspace-manager-DsN52IMG.js → workspace-manager-ClkCIWTe.js} +13 -13
  320. package/server/{workspace-metadata-CftOpNLs.js → workspace-metadata-BE0efUv_.js} +1 -1
  321. package/server/{workspace-metadata-DIL5_U4c.js → workspace-metadata-tiSRIWJP.js} +2 -2
  322. package/server/{workspaces-Dmlh1YXm.js → workspaces-CFPcL0vl.js} +96 -96
  323. package/sync-sources/skills/pan-start/SKILL.md +23 -0
  324. package/server/cli-ChErG518.js +0 -3
  325. package/server/deacon-swarm-uudlSCLM.js +0 -2
  326. package/server/dist-BEDL2alY.js +0 -3
  327. package/server/forge-DbhJyH6u.js +0 -2
  328. package/server/git-utils-Bkxzr1Xf.js +0 -129
  329. package/server/hume-BrA1tUuk.js +0 -3
  330. package/server/inspect-agent-CyXNo9fM.js +0 -2
  331. package/server/merge-ops-BpTtuO8x.js +0 -2
  332. package/server/projects-IRHJIPYC.js +0 -3
  333. package/server/providers-BqCdTryq.js +0 -3
  334. package/server/public/assets/mermaid-GHXKKRXX-BNwFoQsf.js +0 -1
  335. package/server/rally-DGimSRBQ.js +0 -3
  336. package/server/reap-terminal-sessions-C1mfzoZo.js +0 -3
  337. package/server/record-us0YECMO.js +0 -3
  338. package/server/resume-OyN3dEXE.js +0 -3
  339. package/server/settings-BaPXXJsT.js +0 -2
  340. package/server/specs-BsNcum0h.js +0 -3
  341. package/server/state-migrate-_zJJ6XKE.js +0 -362
  342. package/server/supervisor-Qy1QecAs.js +0 -2
  343. package/server/token-util-Cg-QnowA.js +0 -3
  344. package/server/workflows-C5c-RPsY.js +0 -2
package/server/server.js CHANGED
@@ -1,107 +1,110 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { $ as MODEL_CAPABILITIES, $n as resolveProjectFromIssueSync, $r as getLegacyHome, A as init_harness_policy, An as getIssuePrefix, At as init_record, B as init_providers, C as init_tier_table, D as validateTieredExecutionConfig, En as findProjectByPathSync, Er as TrackerError, Ft as readIssueRecordSync, Gr as SYNC_SOURCES, Hn as listProjects, I as getBuiltInDefaultHarness, J as DEFAULT_ROLES, Jn as registerProjectSync, Jr as getDocsBudgetStatePath, K as defaultBackgroundAiFeatures, L as getKimiAnthropicBaseUrl, Lr as LOGS_DIR, Nn as getProjectSync, O as canUseHarnessSync, On as findProjectByTeamSync, Or as init_errors, Ot as getIssueWorkspacePath, P as UnknownModelError, Pr as CLAUDE_DIR, Q as resolveModel, Qn as resolveProjectFromIssue, Rr as OVERDECK_HOME, S as TieredExecutionConfigError, Sn as ProjectRenameError, T as resolveTieredExecutionEnabled, Un as listProjectsSync, X as computeModelOrigin, Xr as getDocsIndexPath, Y as DEFAULT_WORKHORSES, Yn as renameProject, Yr as getDocsDisableStatePath, Zn as resolveInfraRepo, Zr as getDocsTelemetryPath, _ as getDefaultDocsConfig, ai as sessionFilePath, an as init_auto_commit, at as modelSupportsImagesSync, br as GitHubApiError, cr as extractPrefixSync, d as loadConfigNoMigration, dr as parseIssueIdSync, dt as PARENT_MODEL_REF, ei as getOverdeckHome, et as MODEL_DEPRECATIONS, f as loadConfigSync, ft as ROLE_EFFORTS, g as mergeConfigs, h as jsYaml, i as getConversationsConfig, in as flushAutoCommits, ir as setProjectSwarmPolicySync, it as init_model_capabilities, kr as AGENTS_DIR, lr as init_issue_id, m as init_js_yaml, mr as require_dist$1, n as clearConfigCache, ni as isDevMode, nt as getModelEffortLevelsSync, o as getGlobalConfigPath, ot as resolveModelIdSync, p as updateConversationsConfig, q as init_registry, qr as encodeClaudeProjectDir, r as getConversationSearchConfigSync, ri as packageRoot, rn as flushAllPendingAutoCommits, rr as setProjectAutoMergeDefaultSync, rt as hasModelCapabilitySync, s as init_load, t as init_config_yaml, ti as init_paths, u as isTldrEnabledSync, ut as COMPLIANCE_MODES, v as getDefaultTtsDaemonConfig, vr as FsError, w as resolveTieredExecutionBlock, wn as extractTeamPrefix, wr as ProcessSpawnError, y as mergeTtsDaemonConfigs, z as getProviderForModelSync, zn as init_projects } from "./config-yaml-Ciyp2mYe.js";
3
- import { a as shouldRefuseHostDashboardPort, i as readHostDashboardApiPort, n as getDashboardIdentity, r as isNonPrimaryCheckoutRoot } from "./deacon-nudge-log-C5VCKtyi.js";
4
- import { $ as runInBatches, A as handleConversationDelete, B as stopConversationRuntime, C as isPiControlChannelHarness, D as conversationNeedsRunningRepair, E as validateConversationControlAckOrigin, F as isInsideGitWorkTree, G as cleanupOrphanedConversationAttachments, H as waitForPiTuiReady, I as resolveAllowedHarness, J as extractConversationAttachmentPaths, K as cleanupUnreferencedConversationAttachments, L as shouldReportUnresolvedLiveSession, M as handleConversationResume, N as handleConversationStop, O as conversationSessionAliveFromState, P as handleConversationSwitchModel, Q as removeConversationAttachment, R as spawnConversationSession, S as handleConversationThinkingLevel, T as resolveConversationDeliveryMethod, U as waitForTmuxSession$1, V as tmuxSessionExists, W as cleanupConversationAttachments, X as hasConversationAttachment, Y as getConversationAttachmentsRoot, Z as isManagedConversationAttachmentPath, _ as handleConversationCodexApproval, _t as validateOrigin$1, a as agentsRouteLayer, at as panCliInvocation, b as handleConversationDeliveryMethod, bt as getDefaultCwd, c as hasDashboardInternalToken, ct as resolveAgentHarness, d as rejectUnsafeDashboardMutationRequest, dt as resolveJsonlPath, et as evaluateSpawnGuardrails, f as saveAgentStateAndEmitEvent, ft as resolvePiSessionPath, g as handleConversationAbort, gt as isTrustedOriginForHost, h as deliverConversationViaControlChannel, ht as getHeaderFromMap, j as handleConversationRestartAll, k as handleConversationCreate, l as rejectUnauthorizedDashboardRequest, lt as resolveClaudeSessionId, m as codexConversationPendingInput, mt as waitForSessionRespawn, nt as resolveAgentGitInfo, o as dashboardCsrfToken, p as saveAgentStateAndEmitEventProgram, pt as isRespawnPending, q as ensureConversationAttachmentDir, rt as resolveConversationGitInfo, s as dashboardSessionCookieHeader, st as readLauncherPinnedSessionId, t as specialistsRouteLayer, tt as invalidateAgentsCache, u as rejectUnauthorizedDashboardSessionMintRequest, ut as resolveCodexRolloutPath, v as handleConversationCompact, vt as validateOriginHeaders, w as pickDeliverAs, x as handleConversationPlanAction, xt as jsonResponse, y as handleConversationControlAck, yt as httpHandler, z as startConversationModelBackfill } from "./specialists-DAegTvRt.js";
2
+ import { $r as getDocsIndexPath, A as canUseHarnessSync, Br as LOGS_DIR, Cr as GitHubApiError, D as resolveTieredExecutionEnabled, Dn as extractTeamPrefix, Dr as ProcessSpawnError, E as resolveTieredExecutionBlock, Gn as listProjects, H as init_providers, Hn as init_projects, I as UnknownModelError, In as getProjectSync, J as defaultBackgroundAiFeatures, Jr as SYNC_SOURCES, Kn as listProjectsSync, Lr as CLAUDE_DIR, M as init_harness_policy, Mr as AGENTS_DIR, Nn as getIssuePrefix, Nt as init_record, Q as computeModelOrigin, Qn as renameProject, Qr as getDocsDisableStatePath, R as getBuiltInDefaultHarness, Rt as readIssueRecordSync, T as init_tier_table, Tn as ProjectRenameError, V as getProviderForModelSync, Vr as OVERDECK_HOME, X as DEFAULT_ROLES, Xr as encodeClaudeProjectDir, Y as init_registry, Z as DEFAULT_WORKHORSES, Zn as registerProjectSync, Zr as getDocsBudgetStatePath, _ as getDefaultDocsConfig, _r as require_dist$1, ai as isDevMode, at as getModelEffortLevelsSync, ci as sessionFilePath, cn as init_auto_commit, ct as modelSupportsImagesSync, d as loadConfigNoMigration, dr as extractPrefixSync, ei as getDocsTelemetryPath, er as resolveInfraRepo, f as loadConfigSync, fr as init_issue_id, g as mergeConfigs, h as jsYaml, ht as ROLE_EFFORTS, i as getConversationsConfig, ii as init_paths, jn as findProjectByTeamSync, jr as init_errors, jt as getIssueWorkspacePath, k as validateTieredExecutionConfig, kn as findProjectByPathSync, kr as TrackerError, lt as resolveModelIdSync, m as init_js_yaml, mr as parseIssueIdSync, mt as PARENT_MODEL_REF, n as clearConfigCache, ni as getLegacyHome, nr as resolveProjectFromIssueSync, nt as MODEL_CAPABILITIES, o as getGlobalConfigPath, oi as packageRoot, on as flushAllPendingAutoCommits, or as setProjectAutoMergeDefaultSync, ot as hasModelCapabilitySync, p as updateConversationsConfig, pt as COMPLIANCE_MODES, r as getConversationSearchConfigSync, ri as getOverdeckHome, rt as MODEL_DEPRECATIONS, s as init_load, sn as flushAutoCommits, sr as setProjectSwarmPolicySync, st as init_model_capabilities, t as init_config_yaml, tr as resolveProjectFromIssue, tt as resolveModel, u as isTldrEnabledSync, v as getDefaultTtsDaemonConfig, w as TieredExecutionConfigError, xr as FsError, y as mergeTtsDaemonConfigs, z as getKimiAnthropicBaseUrl } from "./config-yaml-ig8Nwtiw.js";
3
+ import { a as shouldRefuseHostDashboardPort, i as readHostDashboardApiPort, n as getDashboardIdentity, r as isNonPrimaryCheckoutRoot } from "./deacon-nudge-log-D6K9K-rE.js";
4
+ import { $ as runInBatches, A as handleConversationDelete, B as stopConversationRuntime, C as isPiControlChannelHarness, D as conversationNeedsRunningRepair, E as validateConversationControlAckOrigin, F as isInsideGitWorkTree, G as cleanupOrphanedConversationAttachments, H as waitForPiTuiReady, I as resolveAllowedHarness, J as extractConversationAttachmentPaths, K as cleanupUnreferencedConversationAttachments, L as shouldReportUnresolvedLiveSession, M as handleConversationResume, N as handleConversationStop, O as conversationSessionAliveFromState, P as handleConversationSwitchModel, Q as removeConversationAttachment, R as spawnConversationSession, S as handleConversationThinkingLevel, T as resolveConversationDeliveryMethod, U as waitForTmuxSession$1, V as tmuxSessionExists, W as cleanupConversationAttachments, X as hasConversationAttachment, Y as getConversationAttachmentsRoot, Z as isManagedConversationAttachmentPath, _ as handleConversationCodexApproval, _t as validateOrigin$1, a as agentsRouteLayer, at as panCliInvocation, b as handleConversationDeliveryMethod, bt as getDefaultCwd, c as hasDashboardInternalToken, ct as resolveAgentHarness, d as rejectUnsafeDashboardMutationRequest, dt as resolveJsonlPath, et as evaluateSpawnGuardrails, f as saveAgentStateAndEmitEvent, ft as resolvePiSessionPath, g as handleConversationAbort, gt as isTrustedOriginForHost, h as deliverConversationViaControlChannel, ht as getHeaderFromMap, j as handleConversationRestartAll, k as handleConversationCreate, l as rejectUnauthorizedDashboardRequest, lt as resolveClaudeSessionId, m as codexConversationPendingInput, mt as waitForSessionRespawn, nt as resolveAgentGitInfo, o as dashboardCsrfToken, p as saveAgentStateAndEmitEventProgram, pt as isRespawnPending, q as ensureConversationAttachmentDir, rt as resolveConversationGitInfo, s as dashboardSessionCookieHeader, st as readLauncherPinnedSessionId, t as specialistsRouteLayer, tt as invalidateAgentsCache, u as rejectUnauthorizedDashboardSessionMintRequest, ut as resolveCodexRolloutPath, v as handleConversationCompact, vt as validateOriginHeaders, w as pickDeliverAs, x as handleConversationPlanAction, xt as jsonResponse, y as handleConversationControlAck, yt as httpHandler, z as startConversationModelBackfill } from "./specialists-Bg9v4z3F.js";
5
5
  import { a as init_activity_logger, i as emitDashboardLifecycleSync, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-DDlOIAML.js";
6
- import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-DN2wSxle.js";
6
+ import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-D4iNWMA5.js";
7
7
  import { n as openDatabase, t as init_driver } from "./driver-CKVGi51s.js";
8
- import { n as updateIssueRecord, t as init_record_update } from "./record-update-RviRDSNs.js";
9
- import { C as getWindowDimensions, D as killSession, I as resizeWindow, K as init_ui_theme, M as listSessions, R as sendKeys, T as isHarnessProcessAlive, V as sessionExists, X as buildChildEnvWithoutTmuxSync, Y as buildChildEnvSync, Z as init_child_env, d as ensureManagedTmuxContextOnce, i as capturePane, j as listSessionNames, k as listPaneValues, l as deliveryVerifyLine, n as buildTmuxArgs, o as capturePaneText, q as setUiTheme, s as createSession, w as init_tmux, z as sendKeysAsync } from "./tmux-y1blSxks.js";
10
- import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-BVnON3vf.js";
11
- import { _ as FlywheelRunId, a as getHarnessBehavior, b as DomainEvent, c as FlywheelStats, g as WS_METHODS, h as PanRpcGroup, m as PanRpcError, o as ContextLayerSaveRequest, s as ContextPreviewRequest, t as init_src, v as FlywheelStatus, x as MemoryObservation, y as EDITORS } from "./src-Dpq1yFIl.js";
12
- import { a as fixStuckReadyForMerge, c as init_review_status, i as fixStuckCommentedReviews, l as loadReadyForMergeFlags, n as clearReviewStatus, o as getReviewStatus, r as clearStuckMergeStatuses, s as getReviewStatusSync, u as loadReviewStatuses, v as setReviewStatus, y as setReviewStatusSync } from "./review-status-CCgPVK1h.js";
13
- import { a as EventStoreService, c as ReadModelService, d as init_read_model, f as toAgentResolution, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentStatus, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-B7HZWnTA.js";
14
- import { c as listAllAgentsSync, n as AgentsResolverLive, o as init_agents } from "./agents-DbrHWunF.js";
15
- import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-FP8v3lTz.js";
16
- import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-OouGbJ7d.js";
17
- import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-BWymOgXE.js";
18
- import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-D64fCC4p.js";
19
- import { An as getAgentStateFilePath, Ct as probeTranscriptSince, Dn as getAgentDir, Gn as saveAgentStateSync, Gt as getProviderAuthMode, It as resolveImplicitStaffing, Jt as injectPiConversationMemory, L as messageAgent, Pt as init_staffing, Qn as readAgentHarnessModelRecordSync, R as init_operator_interventions, St as init_transcript_landing, Zn as init_agent_record_sync, _r as init_codex_auth, a as listRunningAgentsSync, ar as normalizeAgentId, cr as waitForReadySignal, dn as getOpenAIAuthStatus, fn as init_openai_auth, gr as checkCodexAuthStatus, gt as deliverAgentMessage, i as listRunningAgents, it as emergencyBrake, jn as getAgentStateSync, kn as getAgentState, lr as getAgentRuntimeState, m as init_tier_supervisor, n as init_queries, nn as init_claude_auth, on as getProviderEnvForModel, ot as init_concurrency, p as deliverCommitForReview, r as listAgentStates, s as init_agents$1, tn as getClaudeAuthStatus, ur as getAgentRuntimeStateSync, v as supervisorAgentId, xt as captureTranscriptUserRecordSnapshot, z as operatorInterventionEvent } from "./queries-B5hl7lMQ.js";
20
- import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-DzHP6zaR.js";
21
- import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-CqAY8Kmk.js";
22
- import { t as init_behavior } from "./behavior-Dg-D8eBG.js";
23
- import { n as AgentStateServiceLive } from "./agent-state-service-6MFQqnFy.js";
24
- import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-DSFZBdXP.js";
8
+ import { n as updateIssueRecord, t as init_record_update } from "./record-update-Crz74r-6.js";
9
+ import { C as getWindowDimensions, D as killSession, I as resizeWindow, K as init_ui_theme, M as listSessions, R as sendKeys, T as isHarnessProcessAlive, V as sessionExists, X as buildChildEnvWithoutTmuxSync, Y as buildChildEnvSync, Z as init_child_env, d as ensureManagedTmuxContextOnce, i as capturePane, j as listSessionNames, k as listPaneValues, l as deliveryVerifyLine, n as buildTmuxArgs, o as capturePaneText, q as setUiTheme, s as createSession, w as init_tmux, z as sendKeysAsync } from "./tmux-L5LgvGLp.js";
10
+ import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-TnWdydfB.js";
11
+ import { D as AgentSnapshot, E as AgentRuntimeSnapshot, O as ReviewStatusSnapshot, S as SystemHealthSnapshot, _ as WS_METHODS, b as EDITORS, c as ContextPreviewRequest, g as PanRpcGroup, h as PanRpcError, l as FlywheelStats, n as compareIssueIds, o as getHarnessBehavior, s as ContextLayerSaveRequest, t as init_src, v as FlywheelRunId, w as MemoryObservation, x as DomainEvent, y as FlywheelStatus } from "./src-k039WVYY.js";
12
+ import { a as fixStuckReadyForMerge, c as init_review_status, i as fixStuckCommentedReviews, l as loadReadyForMergeFlags, n as clearReviewStatus, o as getReviewStatus, r as clearStuckMergeStatuses, s as getReviewStatusSync, u as loadReviewStatuses, v as setReviewStatus, y as setReviewStatusSync } from "./review-status-DFRjDFef.js";
13
+ import { a as EventStoreService, c as ReadModelService, d as init_read_model, f as toAgentResolution, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentStatus, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-CeyW_HoD.js";
14
+ import { c as listAllAgentsSync, n as AgentsResolverLive, o as init_agents } from "./agents-DXdHmRTC.js";
15
+ import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-DooHpt9p.js";
16
+ import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-C12WgkaB.js";
17
+ import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-B972ph_A.js";
18
+ import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-CTPjAmtH.js";
19
+ import { Ct as probeTranscriptSince, Dn as getAgentDir, Gn as saveAgentStateSync, Gt as getProviderAuthMode, It as resolveImplicitStaffing, Jt as injectPiConversationMemory, L as messageAgent, Pt as init_staffing, Qn as readAgentHarnessModelRecordSync, R as init_operator_interventions, St as init_transcript_landing, Zn as init_agent_record_sync, _r as init_codex_auth, a as listRunningAgentsSync, ar as normalizeAgentId, cr as waitForReadySignal, dn as getOpenAIAuthStatus, fn as init_openai_auth, gr as checkCodexAuthStatus, gt as deliverAgentMessage, i as listRunningAgents, it as emergencyBrake, jn as getAgentStateSync, kn as getAgentState, lr as getAgentRuntimeState, m as init_tier_supervisor, n as init_queries, nn as init_claude_auth, on as getProviderEnvForModel, ot as init_concurrency, p as deliverCommitForReview, r as listAgentStates, s as init_agents$1, tn as getClaudeAuthStatus, ur as getAgentRuntimeStateSync, v as supervisorAgentId, xt as captureTranscriptUserRecordSnapshot, z as operatorInterventionEvent } from "./queries-ZABd5aXP.js";
20
+ import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-D_cre6WM.js";
21
+ import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-Bagb90KZ.js";
22
+ import { u as init_agent_runtime_mirror } from "./session-history-XdS0JKp3.js";
23
+ import { t as init_behavior } from "./behavior-CGj16clS.js";
24
+ import { n as AgentStateServiceLive } from "./agent-state-service-DistflNn.js";
25
+ import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-DdT-nUAM.js";
25
26
  import { d as init_typed_errors, i as PlanEmpty, l as WorkspaceCreateError, n as AgentStartError, s as TrackerApiError, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-2BTMxkZq.js";
26
- import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-BLyN-NiP.js";
27
- import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-Dslipypz.js";
28
- import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-SVbjGvqj.js";
29
- import { a as resolveTrackerTypeSync, i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-DiceZN3a.js";
30
- import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-CPESc4Or.js";
31
- import { i as ensureInternalTokenSync, s as init_internal_token } from "./internal-token-DhfFiwW7.js";
32
- import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-BM2HLF7B.js";
33
- import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-jnLgd04F.js";
34
- import { a as PAN_DIRNAME, d as WORKSPACE_RUNTIME_DIRNAME, f as asPanSpecDocument, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-DqeBMmJN.js";
35
- import { C as transitionToMerging, _ as markFailed, c as isFlywheelGloballyPaused, d as listDuePendingAutoMerges, f as listProblemAutoMerges, g as markBlocked, n as getActionableAutoMerge, o as init_merge_sync, t as cancelPending, u as listActiveAutoMerges, v as markMerged, x as scheduleAutoMergeWithResult, y as requeueToPending } from "./merge-sync-De1FYva5.js";
36
- import { C as init_specs, D as writeSpecDocument, O as writeSpecForIssue, a as findWorkspaceDraftPlan, m as readWorkspacePlanSync, o as init_io, p as readWorkspacePlan, r as findPlan, s as isPlanningComplete, u as readPlan, v as init_types$1, x as findSpecByIssue, y as subItemsOf } from "./io-BiM-7Zsx.js";
37
- import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-Dvsr4ZkW.js";
38
- import { $ as updateConversationForkFallbackReason, A as isAgentConversationName, B as removeFavorite, C as getConversationByTmuxSession, D as importLegacyConversation, F as markConversationEnded, H as setClearedToConvId, I as markConversationRunning, J as setForkRequest, M as listConversations, N as listFavoritedIds, O as incrementForkRetryCount, P as markConversationActive, S as getConversationByName, T as getStuckForks, U as setConversationClaudeSessionId, X as unarchiveConversation, Y as setImportedConversationLinks, Z as updateConversationCost, _ as canRefineTitle, b as getConversationByClaudeSessionId, et as updateConversationTitle, gt as getDiscoveredSessionBySessionId, h as archiveConversation, j as listArchivedConversationsWithEnrichment, k as init_conversations, q as setFavorite, tt as updateForkStatus, v as canReplaceTitle, w as getConversationLedgerCosts, x as getConversationById, y as createConversation, yt as init_discovered_sessions, z as recordConversationHandoff } from "./conversations-BUgGvqVL.js";
39
- import { n as isBackgroundFeatureEnabled, t as init_features } from "./features--fOza5g5.js";
40
- import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-DP2OYLXL.js";
41
- import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-d3pwXGVE.js";
42
- import { i as normalizeModelOverrideSync, n as init_launcher_generator, r as init_model_validation, t as generateLauncherScriptSync } from "./launcher-generator-5DJRiovn.js";
43
- import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-C2OrLYKL.js";
44
- import { a as globalContextFile$1, f as resolveProjectContextFile, h as workspaceContextFile, n as codexGlobalContextFile, o as init_layers, p as resolveWorkspaceContextFile, r as ensureProjectLayer } from "./layers-cZx7ibtV.js";
45
- import { l as init_codex, s as findRolloutPath } from "./codex-D_UBEOwL.js";
46
- import { f as init_config, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-CrduXs4a.js";
47
- import { C as setMergeTrainEnabled, S as setFlywheelRequireUatBeforeMerge, b as setFlywheelAutoPickupBacklog, c as isCloisterSpawnsPausedSync, d as isFlywheelAutoPickupBacklog, f as isFlywheelGloballyPaused$1, g as setCloisterSpawnsPausedSync, h as setBootReconciliationDecision, m as isMergeTrainEnabled, o as getSetting, p as isFlywheelRequireUatBeforeMerge, r as getBootReconciliationState, s as init_control_settings, u as isDeaconGloballyPausedSync, v as setDeaconGloballyPausedSync, w as setSetting } from "./control-settings-D_79A6gp.js";
48
- import { l as init_dag, r as compileGlob } from "./dag-DIji6O2b.js";
49
- import { a as loadCloisterConfigSync, i as loadCloisterConfig, o as saveCloisterConfigSync, r as init_config$1, s as shouldAutoStart } from "./config-G1TOMJZA.js";
50
- import { c as isStateMigrated, i as ensureStateWorktree, o as init_state_home, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-DixkE-up.js";
51
- import { i as checkPrdGateSync, t as init_pan_dir } from "./pan-dir-Rw17YjT1.js";
52
- import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-DMurK4oM.js";
53
- import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-C9P2iPap.js";
54
- import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-BZaDAQ8S.js";
55
- import { _ as init_codex_conversation_parser, a as contextUsageFromParseResult, c as parseEntireConversation, d as init_pi_conversation_parser, f as isPiSessionFile, g as parseOhmypiConversationMessages, h as isOhmypiSessionFile, i as computeContextUsage, l as parseFromLastCompactBoundary, m as init_ohmypi_conversation_parser, n as gateSnapshotEmission, o as summarizeConversationActivity, p as parsePiConversationMessages, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages } from "./conversation-service-DQybSPUK.js";
56
- import { c as countPendingAskUserQuestionsForAgent, h as detectAwaitingInputFromPaneSync, l as getAgentJsonlMtime, m as detectAwaitingInputForAgent, o as getRuntimeForAgent, p as scanPendingInputsPromise, s as computeAgentEnrichment } from "./stuck-remediation-BWkK_O7A.js";
57
- import { i as CostThresholdError, l as embed, s as parseRelativeTime } from "./scanner-C4NeC4FE.js";
58
- import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-CmERlnwn.js";
59
- import { n as recordBackgroundAiCost, t as init_cost } from "./cost-jJ2cgDcG.js";
60
- import { a as getByIssueId, i as parseFlywheelStatsWindow, n as derivePipelineRunStatsInputs, o as markFixed, r as computeFlywheelStats, s as upsert } from "./substrate-bug-weights-service-DXd0ID83.js";
61
- import { c as startUatTrainReconciler, d as openFlywheelRunReportForDashboard, f as pauseFlywheelRunForDashboard, g as runDashboardDbJob, h as startFlywheelRunForDashboard, l as stopUatTrainReconciler, m as resumeFlywheelRunForDashboard, p as readCurrentFlywheelStatusForDashboard, u as abortFlywheelRunForDashboard } from "./uat-train-BpLnp7Cx.js";
62
- import { C as writeLatestFlywheelStatus, b as resolveLiveFlywheelRunId, g as listFlywheelRuns, h as isFlywheelRunId, p as getFlywheelRunDetail, u as buildClassifyLookups, v as readCurrentLatestFlywheelStatus, x as subscribeLatestFlywheelStatus } from "./flywheel-1Wd8WDlh.js";
63
- import { C as getWorkspacePathForIssue, S as resolveIssueHeadlineCost, _ as getCostsForIssueSync, b as processPendingFeedbackDeliveries, d as resumeQueuedMerges, f as syncWalFromAllProjects, g as migrateAllSessionsSync, h as reclassifyUnknownCostEventsSync, l as internalEventsRouteLayer, m as reconcilePiTranscripts, p as reconcile$1, t as workspacesRouteLayer, u as eventsRouteLayer, v as rebuildCacheSync, x as getCachedRunningAgents, y as syncCacheSync } from "./workspaces-Dmlh1YXm.js";
64
- import { At as getSystemHealthSnapshot, Dt as getContainerHistory, Et as formatUptime, F as setAgentStatusChangedNotifier, G as isBootReconciliationCandidate, I as setAgentStoppedNotifier, K as listBootReconciliationCandidates, L as setMergeReadyNotifier, Mt as startSmeeProcessSync, O as loadConfig, Ot as getCurrentDockerStats, Tt as getResourceStacks, jt as isSmeeConfiguredSync, k as loadState, n as assessDeaconPatrolFreshness, q as startBootReconciliation, t as applyBootReconciliationDecision, x as getDeaconLogs, xt as paneShowsClaudeBootBlockingScreen } from "./deacon-1s7bM5zn.js";
65
- import { l as detectPlatform, u as init_platform } from "./workspace-manager-DsN52IMG.js";
66
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-Wlq5-qgS.js";
67
- import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-tVGiI5ee.js";
68
- import { t as init_specialists, z as getReviewerSessionName } from "./specialists-CYRwELzc.js";
69
- import { c as findPrdAtStatusSync, l as init_prd_locations } from "./archive-planning-BOnwJq8M.js";
70
- import { a as getShadowState, s as init_shadow_state } from "./shadow-state-a_ztFBJe.js";
71
- import { A as withConcurrencyLimit, D as createPromiseConcurrencyLimiter, E as verifyAppCanMerge, O as createSettledTtlPromiseCache, d as getPullRequestState, f as init_github_app, k as init_concurrency$1, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-B3yfECo8.js";
72
- import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-Dfw3QDyZ.js";
73
- import { b as resolveSwarmPolicy } from "./deacon-swarm-DmA3rJ7k.js";
74
- import { a as init_boot_gates, i as formatBootGateState, o as resolveBootGates } from "./no-resume-mode-BnInAFKs.js";
75
- import { c as computeCohort, d as computeStats, f as computeWaves, g as selectNeedsPlanning, h as normalizeGate, l as computeEpicGroups, p as init_pickup, s as classifyIssue, u as computeLanes } from "./pickup-xi3KTLaJ.js";
76
- import { a as applyIssueObjectionLabel, c as applyIssueReleasedLabel, d as removeIssueBlocksMainLabel, f as removeIssueObjectionLabel, g as removeIssueVetoedLabel, h as removeIssueReleasedLabel, i as applyIssueBlocksMainLabel, l as applyIssueVetoedLabel, m as removeIssueReadyLabel, o as applyIssueParkedLabel, p as removeIssueParkedLabel, s as applyIssueReadyLabel, u as init_label_ops } from "./label-reconciler-CNf3Ylm3.js";
77
- import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-Ce-6grIY.js";
78
- import { a as init_pipeline_membership_gather, c as parseIssueIdFromTextSync, n as resolvePipelineMembership, o as listOpenPullRequestsSnapshot, r as gatherProjectLensSignals, s as init_resource_utils, t as init_pipeline_membership } from "./pipeline-membership-BtKMNY7v.js";
79
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-DIL5_U4c.js";
80
- import { i as resolveAutoSpawnOnFinalize, o as spawnPlanningSession } from "./spawn-planning-session-AiUSsBnH.js";
81
- import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-CZ2rc8I0.js";
82
- import { r as spawnInspectAgent } from "./inspect-agent-DKByUS_F.js";
83
- import { n as init_github_pr_lookup, r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-DBP0YHMr.js";
84
- import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, d as setCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, o as init_pull_requests, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as init_pr_tab_cache } from "./pull-requests-CjjPj7v6.js";
85
- import { t as DOD_ROWS } from "./dod-BLphkhjs.js";
86
- import { t as enrichReviewStatus } from "./review-status-enrichment-DtDRGpst.js";
87
- import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-6ponMie2.js";
88
- import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-CLj_AK9f.js";
89
- import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-DjxP5g6Y.js";
90
- import { T as listGitOperationsSync, w as init_git_activity } from "./merge-agent-DnBsms_V.js";
91
- import { t as readVerificationArtifact } from "./verification-artifact-Dr_0g9nb.js";
92
- import { t as getAgentCommandSync } from "./settings-D9grjmaP.js";
93
- import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-CqSqSHkU.js";
94
- import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-cnoeuDWn.js";
95
- import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-DX-fMFpC.js";
96
- import { a as init_query_expansion, i as clearQueryExpansionCache, n as init_injection, o as buildMatchQuery, r as injectPromptTimeMemory, s as init_search } from "./injection-DtlT8Akv.js";
97
- import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-f3DpgjXh.js";
98
- import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-DiuZbIUB.js";
99
- import { a as init_render, d as validateTemplate, i as hasManagedRegion, l as init_harness, o as userContentOutsideRegion, t as init_context_layers, u as renderForHarness } from "./context-layers-Cg9ZgVfx.js";
100
- import { r as parseArtifactRef } from "./forge-DBbDpiYc.js";
101
- import { t as getMergeBlockersPayload } from "./merge-blockers-DhRgh76x.js";
102
- import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-Bpz0yGmG.js";
103
- import "./supervisor-Ch8CDuoF.js";
104
- import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-Vh-J15ge.js";
27
+ import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-DsFkIxee.js";
28
+ import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-XjTJbBm7.js";
29
+ import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-COYz1vYR.js";
30
+ import { a as resolveTrackerTypeSync, i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-CawsPSS2.js";
31
+ import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-D_RVYBuL.js";
32
+ import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-CXsfxslp.js";
33
+ import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-B6FVsYF9.js";
34
+ import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-DpAMD_WO.js";
35
+ import { n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-CxuEjLGg.js";
36
+ import { a as PAN_DIRNAME, d as WORKSPACE_RUNTIME_DIRNAME, f as asPanSpecDocument, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-hraoaQIp.js";
37
+ import { C as transitionToMerging, _ as markFailed, c as isFlywheelGloballyPaused, d as listDuePendingAutoMerges, f as listProblemAutoMerges, g as markBlocked, n as getActionableAutoMerge, o as init_merge_sync, t as cancelPending, u as listActiveAutoMerges, v as markMerged, x as scheduleAutoMergeWithResult, y as requeueToPending } from "./merge-sync-Do8_q32h.js";
38
+ import { C as init_specs, D as writeSpecDocument, O as writeSpecForIssue, a as findWorkspaceDraftPlan, m as readWorkspacePlanSync, o as init_io, p as readWorkspacePlan, r as findPlan, s as isPlanningComplete, u as readPlan, v as init_types$1, x as findSpecByIssue, y as subItemsOf } from "./io-DQR9PMgS.js";
39
+ import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-Brf_5MuG.js";
40
+ import { $ as updateConversationForkFallbackReason, A as isAgentConversationName, B as removeFavorite, C as getConversationByTmuxSession, D as importLegacyConversation, F as markConversationEnded, H as setClearedToConvId, I as markConversationRunning, J as setForkRequest, M as listConversations, N as listFavoritedIds, O as incrementForkRetryCount, P as markConversationActive, S as getConversationByName, T as getStuckForks, U as setConversationClaudeSessionId, X as unarchiveConversation, Y as setImportedConversationLinks, Z as updateConversationCost, _ as canRefineTitle, b as getConversationByClaudeSessionId, et as updateConversationTitle, gt as getDiscoveredSessionBySessionId, h as archiveConversation, j as listArchivedConversationsWithEnrichment, k as init_conversations, q as setFavorite, tt as updateForkStatus, v as canReplaceTitle, w as getConversationLedgerCosts, x as getConversationById, y as createConversation, yt as init_discovered_sessions, z as recordConversationHandoff } from "./conversations-bYpM9-kZ.js";
41
+ import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-Bc-Bmiye.js";
42
+ import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-BNbocWOg.js";
43
+ import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-BDDPULlp.js";
44
+ import { i as normalizeModelOverrideSync, n as init_launcher_generator, r as init_model_validation, t as generateLauncherScriptSync } from "./launcher-generator-COgR2By1.js";
45
+ import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-nSFKH78M.js";
46
+ import { a as globalContextFile$1, f as resolveProjectContextFile, h as workspaceContextFile, n as codexGlobalContextFile, o as init_layers, p as resolveWorkspaceContextFile, r as ensureProjectLayer } from "./layers-Cp1To4L8.js";
47
+ import { l as init_codex, s as findRolloutPath } from "./codex-CbmztVcc.js";
48
+ import { n as init_harness_binary, r as prepareHarnessLaunch } from "./harness-binary-B2CTcD84.js";
49
+ import { f as init_config, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-q4Gvd8dq.js";
50
+ import { C as setMergeTrainEnabled, S as setFlywheelRequireUatBeforeMerge, b as setFlywheelAutoPickupBacklog, c as isCloisterSpawnsPausedSync, d as isFlywheelAutoPickupBacklog, f as isFlywheelGloballyPaused$1, g as setCloisterSpawnsPausedSync, h as setBootReconciliationDecision, m as isMergeTrainEnabled, o as getSetting, p as isFlywheelRequireUatBeforeMerge, r as getBootReconciliationState, s as init_control_settings, u as isDeaconGloballyPausedSync, v as setDeaconGloballyPausedSync, w as setSetting } from "./control-settings-D_odMIaC.js";
51
+ import { l as init_dag, r as compileGlob } from "./dag-CJpgf9A3.js";
52
+ import { a as loadCloisterConfigSync, o as saveCloisterConfigSync, r as init_config$1, s as shouldAutoStart } from "./config-DeTsoZdR.js";
53
+ import { c as isStateMigrated, i as ensureStateWorktree, o as init_state_home, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-CONQvZR0.js";
54
+ import { i as checkPrdGateSync, t as init_pan_dir } from "./pan-dir-DOcf6ug3.js";
55
+ import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-taIb0PoH.js";
56
+ import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-DdmJVX7y.js";
57
+ import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-DI8sGlmF.js";
58
+ import { _ as init_codex_conversation_parser, a as contextUsageFromParseResult, c as parseEntireConversation, d as init_pi_conversation_parser, f as isPiSessionFile, g as parseOhmypiConversationMessages, h as isOhmypiSessionFile, i as computeContextUsage, l as parseFromLastCompactBoundary, m as init_ohmypi_conversation_parser, n as gateSnapshotEmission, o as summarizeConversationActivity, p as parsePiConversationMessages, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages } from "./conversation-service-C3avRVEr.js";
59
+ import { c as countPendingAskUserQuestionsForAgent, h as detectAwaitingInputFromPaneSync, l as getAgentJsonlMtime, m as detectAwaitingInputForAgent, o as getRuntimeForAgent, p as scanPendingInputsPromise, s as computeAgentEnrichment } from "./stuck-remediation-CKnIryGT.js";
60
+ import { i as CostThresholdError, l as embed, s as parseRelativeTime } from "./scanner-Br0Z5S6R.js";
61
+ import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-DSUdR-04.js";
62
+ import { n as recordBackgroundAiCost, t as init_cost } from "./cost-wH46-WsJ.js";
63
+ import { a as getByIssueId, i as parseFlywheelStatsWindow, n as derivePipelineRunStatsInputs, o as markFixed, r as computeFlywheelStats, s as upsert } from "./substrate-bug-weights-service-CpIZILj9.js";
64
+ import { c as startUatTrainReconciler, d as openFlywheelRunReportForDashboard, f as pauseFlywheelRunForDashboard, g as runDashboardDbJob, h as startFlywheelRunForDashboard, l as stopUatTrainReconciler, m as resumeFlywheelRunForDashboard, p as readCurrentFlywheelStatusForDashboard, u as abortFlywheelRunForDashboard } from "./uat-train-j0cPeMSj.js";
65
+ import { C as writeLatestFlywheelStatus, b as resolveLiveFlywheelRunId, g as listFlywheelRuns, h as isFlywheelRunId, p as getFlywheelRunDetail, u as buildClassifyLookups, v as readCurrentLatestFlywheelStatus, x as subscribeLatestFlywheelStatus } from "./flywheel-COR0mbRI.js";
66
+ import { C as getWorkspacePathForIssue, S as resolveIssueHeadlineCost, _ as getCostsForIssueSync, b as processPendingFeedbackDeliveries, d as resumeQueuedMerges, f as syncWalFromAllProjects, g as migrateAllSessionsSync, h as reclassifyUnknownCostEventsSync, l as internalEventsRouteLayer, m as reconcilePiTranscripts, p as reconcile$1, t as workspacesRouteLayer, u as eventsRouteLayer, v as rebuildCacheSync, x as getCachedRunningAgents, y as syncCacheSync } from "./workspaces-CFPcL0vl.js";
67
+ import { At as getAcceptedSystemHealthSnapshot, Dt as formatUptime, Et as getResourceStacks, F as setAgentStatusChangedNotifier, Ft as isSmeeConfiguredSync, I as setAgentStoppedNotifier, It as startSmeeProcessSync, J as startBootReconciliation, K as isBootReconciliationCandidate, L as setMergeReadyNotifier, Lt as classifyAgentHealth, Nt as getSystemHealthEvidenceSnapshot, O as loadConfig, Ot as getContainerHistory, St as paneShowsClaudeBootBlockingScreen, jt as getDeployStaleness, k as loadState, kt as getCurrentDockerStats, n as assessDeaconPatrolFreshness, q as listBootReconciliationCandidates, t as applyBootReconciliationDecision, x as getDeaconLogs } from "./deacon-CkT_kznS.js";
68
+ import { l as detectPlatform, u as init_platform } from "./workspace-manager-ClkCIWTe.js";
69
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-BXP6g75N.js";
70
+ import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-BoWm66Kh.js";
71
+ import { t as init_specialists, z as getReviewerSessionName } from "./specialists-CwZHb5cb.js";
72
+ import { c as findPrdAtStatusSync, l as init_prd_locations } from "./archive-planning-BvDuWNMo.js";
73
+ import { a as getShadowState, s as init_shadow_state } from "./shadow-state-C_NkP-sa.js";
74
+ import { A as withConcurrencyLimit, D as createPromiseConcurrencyLimiter, E as verifyAppCanMerge, O as createSettledTtlPromiseCache, d as getPullRequestState, f as init_github_app, k as init_concurrency$1, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-CDPtGF7J.js";
75
+ import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-DtmJM0D0.js";
76
+ import { b as resolveSwarmPolicy } from "./deacon-swarm-BryRr6AO.js";
77
+ import { a as init_boot_gates, i as formatBootGateState, o as resolveBootGates } from "./no-resume-mode-BWOSZjWd.js";
78
+ import { _ as selectNeedsPlanning, c as classifyIssue, d as computeLanes, f as computeStats, g as normalizeGate, l as computeCohort, m as init_pickup, p as computeWaves, u as computeEpicGroups } from "./pickup-CaskQ7j6.js";
79
+ import { a as applyIssueObjectionLabel, c as applyIssueReleasedLabel, d as removeIssueBlocksMainLabel, f as removeIssueObjectionLabel, g as removeIssueVetoedLabel, h as removeIssueReleasedLabel, i as applyIssueBlocksMainLabel, l as applyIssueVetoedLabel, m as removeIssueReadyLabel, o as applyIssueParkedLabel, p as removeIssueParkedLabel, s as applyIssueReadyLabel, u as init_label_ops } from "./label-reconciler-Df1ZduPH.js";
80
+ import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-fxU0DlwW.js";
81
+ import { c as init_resource_utils, i as gatherProjectLensSignals, l as parseIssueIdFromTextSync, n as init_pipeline_membership, o as init_pipeline_membership_gather, r as resolvePipelineMembership, s as listOpenPullRequestsSnapshot } from "./pipeline-membership-1LGRjo-k.js";
82
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-tiSRIWJP.js";
83
+ import { i as resolveAutoSpawnOnFinalize, o as spawnPlanningSession } from "./spawn-planning-session-D5OXo8pT.js";
84
+ import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-Ct_WOyke.js";
85
+ import { r as spawnInspectAgent } from "./inspect-agent-BXCgNeZ4.js";
86
+ import { n as init_github_pr_lookup, r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-CFGeVhqv.js";
87
+ import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, d as setCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, o as init_pull_requests, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as init_pr_tab_cache } from "./pull-requests-8z2N1UOV.js";
88
+ import { t as DOD_ROWS } from "./dod-DbJLYcHv.js";
89
+ import { t as enrichReviewStatus } from "./review-status-enrichment-crNAtIpL.js";
90
+ import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-DmAcuCkV.js";
91
+ import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-SyuF09e4.js";
92
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-BQFmmFp0.js";
93
+ import { T as listGitOperationsSync, w as init_git_activity } from "./merge-agent-DDiIjzk-.js";
94
+ import { t as readVerificationArtifact } from "./verification-artifact-BuTA1QbL.js";
95
+ import { t as getAgentCommandSync } from "./settings-uLc6DEYI.js";
96
+ import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-CThvgK2r.js";
97
+ import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-b-c5bOce.js";
98
+ import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-BI_UIke0.js";
99
+ import { a as init_query_expansion, i as clearQueryExpansionCache, n as init_injection, o as buildMatchQuery, r as injectPromptTimeMemory, s as init_search } from "./injection-D7T75Pye.js";
100
+ import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-bX6ax6X7.js";
101
+ import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-B6YSRLda.js";
102
+ import { a as init_render, d as validateTemplate, i as hasManagedRegion, l as init_harness, o as userContentOutsideRegion, t as init_context_layers, u as renderForHarness } from "./context-layers-15gDOk20.js";
103
+ import { r as parseArtifactRef } from "./forge-B1S_KZv4.js";
104
+ import { t as getMergeBlockersPayload } from "./merge-blockers-BYjeXrVN.js";
105
+ import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-B5YC5XVP.js";
106
+ import "./supervisor-Ctt4eRYz.js";
107
+ import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-BJum14fs.js";
105
108
  import { createRequire } from "node:module";
106
109
  import * as sp from "node:path";
107
110
  import { basename, delimiter, dirname, extname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
@@ -109,7 +112,7 @@ import { Cause, Context, Data, Duration, Effect, Exit, Fiber, FileSystem, Layer,
109
112
  import { createReadStream, createWriteStream, existsSync, fstatSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "fs";
110
113
  import { basename as basename$1, dirname as dirname$1, join as join$1, resolve as resolve$1 } from "path";
111
114
  import { homedir } from "os";
112
- import { freemem as freemem$1, homedir as homedir$1, loadavg as loadavg$1, totalmem as totalmem$1, type } from "node:os";
115
+ import { homedir as homedir$1, type } from "node:os";
113
116
  import { constants, createReadStream as createReadStream$1, existsSync as existsSync$1, mkdirSync as mkdirSync$1, promises as promises$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, readlinkSync, renameSync as renameSync$1, rmSync as rmSync$1, stat, statSync as statSync$1, symlinkSync as symlinkSync$1, unwatchFile, watch, watchFile } from "node:fs";
114
117
  import { FetchHttpClient, HttpRouter, HttpServer, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
115
118
  import { EventEmitter } from "node:events";
@@ -688,7 +691,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
688
691
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
689
692
  const plan = readWorkspacePlanSync(workspacePath);
690
693
  if (!plan || plan.plan.items.length === 0) throw new PlanEmpty({ id: issueId });
691
- const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-Czz6R57Z.js");
694
+ const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-DyHKlq1I.js");
692
695
  const normalizedId = normalizeAgentId(issueId);
693
696
  if ((await Effect.runPromise(getAgentState(normalizedId)))?.status === "running") throw new AgentAlreadyRunning({ id: issueId });
694
697
  return {
@@ -719,7 +722,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
719
722
  const { workspacePath, projectPath, issue } = opts;
720
723
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
721
724
  const sessionName = opts.sessionName ?? `planning-${issueId.toLowerCase()}`;
722
- const { spawnPlanningSession } = await import("./spawn-planning-session-LFtK2QCE.js");
725
+ const { spawnPlanningSession } = await import("./spawn-planning-session-8D6mE033.js");
723
726
  const result = await spawnPlanningSession({
724
727
  issue: {
725
728
  id: issue.id,
@@ -752,14 +755,14 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
752
755
  }),
753
756
  kill: (agentId) => Effect.tryPromise({
754
757
  try: async () => {
755
- const { stopAgent } = await import("./agents-Czz6R57Z.js");
758
+ const { stopAgent } = await import("./agents-DyHKlq1I.js");
756
759
  await Effect.runPromise(stopAgent(agentId));
757
760
  },
758
761
  catch: () => void 0
759
762
  }).pipe(Effect.ignore),
760
763
  message: (agentId, msg) => Effect.tryPromise({
761
764
  try: async () => {
762
- const { messageAgent } = await import("./agents-Czz6R57Z.js");
765
+ const { messageAgent } = await import("./agents-DyHKlq1I.js");
763
766
  await messageAgent(agentId, msg);
764
767
  },
765
768
  catch: (err) => new AgentStartError({
@@ -770,8 +773,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
770
773
  }),
771
774
  deepWipe: (issueId, opts) => Effect.tryPromise({
772
775
  try: async () => {
773
- const { deepWipe } = await import("./workflows-C5c-RPsY.js");
774
- const { resolveProjectFromIssueSync } = await import("./projects-IRHJIPYC.js");
776
+ const { deepWipe } = await import("./workflows-C4mR0Reb.js");
777
+ const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
775
778
  const project = resolveProjectFromIssueSync(issueId);
776
779
  const projectPath = project?.projectPath ?? process.cwd();
777
780
  await Effect.runPromise(deepWipe({
@@ -830,8 +833,8 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
830
833
  const { workspacePath, branch } = getWorkspacePath(issueId);
831
834
  const issueLower = issueId.toLowerCase();
832
835
  if (existsSync$1(workspacePath)) return workspacePath;
833
- const { createWorkspace } = await import("./workspace-manager-CcujONCR.js");
834
- const { loadProjectsConfigSync } = await import("./projects-IRHJIPYC.js");
836
+ const { createWorkspace } = await import("./workspace-manager-B1WOfKvB.js");
837
+ const { loadProjectsConfigSync } = await import("./projects-BKkwpH6q.js");
835
838
  const { projects } = loadProjectsConfigSync();
836
839
  const project = resolveProjectFromIssueSync(issueId);
837
840
  if (!project) throw new WorkspaceCreateError({
@@ -866,7 +869,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
866
869
  const { workspacePath } = getWorkspacePath(issueId);
867
870
  const issueLower = issueId.toLowerCase();
868
871
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
869
- const { removeWorkspace } = await import("./workspace-manager-CcujONCR.js");
872
+ const { removeWorkspace } = await import("./workspace-manager-B1WOfKvB.js");
870
873
  const project = resolveProjectFromIssueSync(issueId);
871
874
  if (!project) throw new WorkspaceCreateError({
872
875
  id: issueId,
@@ -897,7 +900,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
897
900
  try: async () => {
898
901
  const { workspacePath } = getWorkspacePath(issueId);
899
902
  const issueLower = issueId.toLowerCase();
900
- const { stopWorkspaceDocker } = await import("./workspace-manager-CcujONCR.js");
903
+ const { stopWorkspaceDocker } = await import("./workspace-manager-B1WOfKvB.js");
901
904
  await Effect.runPromise(stopWorkspaceDocker(workspacePath, issueLower));
902
905
  },
903
906
  catch: () => void 0
@@ -966,7 +969,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
966
969
  join(workspacePath, ".devcontainer", "docker-compose.devcontainer.yml")
967
970
  ];
968
971
  if (!composePaths.find((p) => existsSync$1(p))) {
969
- const { ensureDevcontainerSync } = await import("./ensure-devcontainer-BA3bICoY.js");
972
+ const { ensureDevcontainerSync } = await import("./ensure-devcontainer-Cs6W9Yzj.js");
970
973
  const ensure = ensureDevcontainerSync({
971
974
  workspacePath,
972
975
  issueId
@@ -5451,6 +5454,7 @@ function setupTerminalWebSocket(server) {
5451
5454
  //#endregion
5452
5455
  //#region ../../../node_modules/.bun/@ai-sdk+provider@3.0.10/node_modules/@ai-sdk/provider/dist/index.mjs
5453
5456
  init_briefing_freshness();
5457
+ init_agent_runtime_mirror();
5454
5458
  init_behavior();
5455
5459
  init_discovered_sessions();
5456
5460
  init_conversations();
@@ -5460,6 +5464,7 @@ init_openai_auth();
5460
5464
  init_claude_permissions();
5461
5465
  init_claude_auth();
5462
5466
  init_layers();
5467
+ init_harness_binary();
5463
5468
  init_codex();
5464
5469
  init_launcher_generator();
5465
5470
  init_transcript_landing();
@@ -15944,7 +15949,7 @@ var require_get_vercel_oidc_token = /* @__PURE__ */ __commonJSMin(((exports, mod
15944
15949
  err = error;
15945
15950
  }
15946
15951
  try {
15947
- const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-Cg-QnowA.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-LUrbM9sU.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
15952
+ const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-BArZLN6w.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-BkQLy4yS.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
15948
15953
  if (!token || isExpired(getTokenPayload(token), options?.expirationBufferMs)) {
15949
15954
  await refreshToken(options);
15950
15955
  token = getVercelOidcTokenSync();
@@ -27778,7 +27783,7 @@ function randomId() {
27778
27783
  function randomNonce() {
27779
27784
  return Math.floor(Math.random() * 2147483647);
27780
27785
  }
27781
- function finiteNumber(value, fallback) {
27786
+ function finiteNumber$1(value, fallback) {
27782
27787
  return typeof value === "number" && Number.isFinite(value) ? value : fallback;
27783
27788
  }
27784
27789
  function normalizeExcalidrawElement(element) {
@@ -27786,12 +27791,12 @@ function normalizeExcalidrawElement(element) {
27786
27791
  ...element,
27787
27792
  id: typeof element.id === "string" && element.id ? element.id : randomId(),
27788
27793
  type: typeof element.type === "string" && element.type ? element.type : "rectangle",
27789
- x: finiteNumber(element.x, 0),
27790
- y: finiteNumber(element.y, 0),
27791
- width: Math.max(1, finiteNumber(element.width, 100)),
27792
- height: Math.max(1, finiteNumber(element.height, 100)),
27793
- version: Math.max(1, Math.trunc(finiteNumber(element.version, 1))),
27794
- versionNonce: Math.trunc(finiteNumber(element.versionNonce, randomNonce())),
27794
+ x: finiteNumber$1(element.x, 0),
27795
+ y: finiteNumber$1(element.y, 0),
27796
+ width: Math.max(1, finiteNumber$1(element.width, 100)),
27797
+ height: Math.max(1, finiteNumber$1(element.height, 100)),
27798
+ version: Math.max(1, Math.trunc(finiteNumber$1(element.version, 1))),
27799
+ versionNonce: Math.trunc(finiteNumber$1(element.versionNonce, randomNonce())),
27795
27800
  isDeleted: element.isDeleted === true
27796
27801
  };
27797
27802
  if (Math.abs(normalized.x) > VISIBLE_CANVAS_LIMIT || Math.abs(normalized.y) > VISIBLE_CANVAS_LIMIT) console.warn(`Excalidraw element ${normalized.id} has coordinates outside visible canvas range`);
@@ -28261,7 +28266,7 @@ var GoogleCloudTranscription = class {
28261
28266
  }
28262
28267
  async start(apiKey, model) {
28263
28268
  try {
28264
- const { SpeechClient } = await import("./src-OLoJhUiJ.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
28269
+ const { SpeechClient } = await import("./src-BMMoA_ba.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
28265
28270
  if (this.closed) return;
28266
28271
  const stream = new SpeechClient({ apiKey }).streamingRecognize({
28267
28272
  config: {
@@ -30040,6 +30045,7 @@ const websocketRpcRouteLayer = Layer.unwrap(Effect.gen(function* () {
30040
30045
  }));
30041
30046
  //#endregion
30042
30047
  //#region ../../lib/vbrief/quality-lint.ts
30048
+ init_internal_token();
30043
30049
  init_state_home();
30044
30050
  init_pan_dir();
30045
30051
  init_in_flight_guard();
@@ -30416,13 +30422,12 @@ init_concurrency$1();
30416
30422
  init_github_app();
30417
30423
  init_resource_utils();
30418
30424
  init_pipeline_membership_gather();
30425
+ init_pipeline_membership();
30419
30426
  init_review_status();
30420
30427
  //#endregion
30421
30428
  //#region services/pipeline-membership.ts
30422
- init_internal_token();
30423
30429
  init_pipeline_notifier();
30424
30430
  init_review_status_sync();
30425
- init_pipeline_membership();
30426
30431
  const PIPELINE_MEMBERSHIP_TTL_MS = 3e4;
30427
30432
  function createPipelineMembershipService(deps = {
30428
30433
  gather: gatherProjectLensSignals,
@@ -30520,8 +30525,10 @@ function unavailablePipelineMembership() {
30520
30525
  }
30521
30526
  //#endregion
30522
30527
  //#region services/resource-discovery.ts
30528
+ init_src();
30523
30529
  init_conversations();
30524
30530
  init_projects();
30531
+ init_pipeline_membership();
30525
30532
  init_pipeline_membership_gather();
30526
30533
  init_tmux();
30527
30534
  const execFileAsync$18 = promisify(execFile);
@@ -30639,7 +30646,7 @@ function isDiscoverableAgentSession(sessionName) {
30639
30646
  async function loadTrackerIssues() {
30640
30647
  const map = /* @__PURE__ */ new Map();
30641
30648
  try {
30642
- const { getSharedIssueService } = await import("./issue-service-singleton-D5EB5eYr.js");
30649
+ const { getSharedIssueService } = await import("./issue-service-singleton-DBZabEl7.js");
30643
30650
  const issues = (await getSharedIssueService()).getIssues();
30644
30651
  for (const issue of issues) if (issue.identifier) map.set(issue.identifier.toUpperCase(), issue);
30645
30652
  } catch {
@@ -30910,7 +30917,7 @@ async function computeResourceAllocatedIssues() {
30910
30917
  });
30911
30918
  }
30912
30919
  try {
30913
- const { listActiveRemoteAgentStates } = await import("./remote-agents-BNORDWAX.js");
30920
+ const { listActiveRemoteAgentStates } = await import("./remote-agents-D6O_zETW.js");
30914
30921
  for (const remoteState of listActiveRemoteAgentStates()) {
30915
30922
  const issue = ensureIssue(remoteState.issueId);
30916
30923
  if (!issue) continue;
@@ -31030,9 +31037,10 @@ async function computeResourceAllocatedIssues() {
31030
31037
  resourceDetails: issue.resourceDetails,
31031
31038
  taskTotals: issue.taskTotals,
31032
31039
  pipelineBucket: membership.bucket,
31040
+ specOnlyPlanned: membership.bucket === "planned_backlog" && membership.reasons.includes("open issue with a vBRIEF spec but no branch/PR — planned work whose plan encodes code paths that age; needs starting or re-planning"),
31033
31041
  resourceDrift: !membership.inPipeline
31034
31042
  };
31035
- }).sort((a, b) => a.issueId.localeCompare(b.issueId));
31043
+ }).sort((a, b) => compareIssueIds(a.issueId, b.issueId));
31036
31044
  }
31037
31045
  function toPublicResourceIssue(issue) {
31038
31046
  return {
@@ -31122,7 +31130,7 @@ function groupResourceAllocatedIssuesByProject(issues) {
31122
31130
  }
31123
31131
  return [...projectTree.values()].map((project) => ({
31124
31132
  ...project,
31125
- features: project.features.sort((a, b) => a.issueId.localeCompare(b.issueId))
31133
+ features: project.features.sort((a, b) => compareIssueIds(a.issueId, b.issueId))
31126
31134
  })).sort((a, b) => a.name.localeCompare(b.name));
31127
31135
  }
31128
31136
  //#endregion
@@ -31584,25 +31592,32 @@ function getInternalDashboardOrigin() {
31584
31592
  }
31585
31593
  function classifyAutoSpawnSkip(status, body) {
31586
31594
  const error = typeof body["error"] === "string" ? body["error"] : "";
31595
+ if (status === 401 || status === 403) return "unauthorized";
31587
31596
  if (body["stackHealth"] || /workspace docker stack/i.test(error)) return "stack-unhealthy";
31588
31597
  if (body["paused"] === true) return "paused";
31589
31598
  if (body["troubled"] === true) return "troubled";
31590
31599
  if (body["guardrails"] || body["requiresAcknowledgement"] === true || status === 409) return "guardrails";
31591
31600
  return "spawn-failed";
31592
31601
  }
31602
+ function resolveCompletePlanningTerminalStatus(autoSpawnRequested, autoSpawnResult) {
31603
+ return autoSpawnRequested && autoSpawnResult?.workAgentSpawned !== true ? "failure" : "success";
31604
+ }
31593
31605
  async function completePlanningAutoSpawn(options) {
31594
31606
  if (options.autoSpawn !== true) {
31595
31607
  emitCompletePlanningPhase(options.issueId, "autoSpawn", "skipped", "autoSpawn not requested");
31596
31608
  return null;
31597
31609
  }
31598
31610
  const dashboardOrigin = options.dashboardOrigin ?? getInternalDashboardOrigin();
31611
+ const internalToken = getInternalTokenSync();
31612
+ const internalTokenHeaders = internalToken ? { [INTERNAL_TOKEN_HEADER]: internalToken } : {};
31599
31613
  emitCompletePlanningPhase(options.issueId, "autoSpawn", "start", "posting work-agent spawn request", { dashboardOrigin });
31600
31614
  try {
31601
31615
  const response = await (options.fetchImpl ?? fetch)(new URL("/api/agents", dashboardOrigin), {
31602
31616
  method: "POST",
31603
31617
  headers: {
31604
31618
  "content-type": "application/json",
31605
- origin: dashboardOrigin
31619
+ origin: dashboardOrigin,
31620
+ ...internalTokenHeaders
31606
31621
  },
31607
31622
  body: JSON.stringify({
31608
31623
  issueId: options.issueId,
@@ -31623,7 +31638,10 @@ async function completePlanningAutoSpawn(options) {
31623
31638
  if (skipReason === "stack-unhealthy") {
31624
31639
  const recovery = await (options.fetchImpl ?? fetch)(new URL(`/api/workspaces/${encodeURIComponent(options.issueId)}/rebuild-and-start`, dashboardOrigin), {
31625
31640
  method: "POST",
31626
- headers: { origin: dashboardOrigin }
31641
+ headers: {
31642
+ origin: dashboardOrigin,
31643
+ ...internalTokenHeaders
31644
+ }
31627
31645
  });
31628
31646
  const recoveryBody = await recovery.json().catch(() => ({}));
31629
31647
  if (recovery.ok && recoveryBody["success"] !== false) {
@@ -31969,7 +31987,7 @@ async function completePlanningForIssue(options) {
31969
31987
  skipKill,
31970
31988
  sessionName
31971
31989
  });
31972
- emitCompletePlanningPhase(id, "terminal", "success", autoSpawnResult?.workAgentSpawned ? "planning complete and work agent spawn requested" : autoSpawnResult?.workAgentSkipReason ?? "planning complete", {
31990
+ emitCompletePlanningPhase(id, "terminal", resolveCompletePlanningTerminalStatus(effectiveAutoSpawn, autoSpawnResult), autoSpawnResult?.workAgentSpawned ? "planning complete and work agent spawn requested" : autoSpawnResult?.workAgentSkipReason ?? "planning complete", {
31973
31991
  autoSpawn: effectiveAutoSpawn,
31974
31992
  workAgentSpawned: autoSpawnResult?.workAgentSpawned ?? false,
31975
31993
  workAgentSkipReason: autoSpawnResult?.workAgentSkipReason
@@ -32134,7 +32152,7 @@ async function closeIssuePullRequest(issueId, reason = "Canceled via Overdeck")
32134
32152
  timeout: 15e3
32135
32153
  });
32136
32154
  try {
32137
- const { setReviewStatusSync } = await import("./review-status-DXeqFpk5.js");
32155
+ const { setReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
32138
32156
  setReviewStatusSync(issueId.toUpperCase(), { prUrl: void 0 });
32139
32157
  } catch {}
32140
32158
  return [`Closed PR #${prNumber} on ${githubCheck.owner}/${githubCheck.repo}`];
@@ -32188,7 +32206,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
32188
32206
  const { ctx, projectConfig } = buildLifecycleContext(id, getIssueDataService$8().getIssueSource(id) ?? void 0);
32189
32207
  const deleteWorkspace = opts.deleteWorkspace ?? true;
32190
32208
  cleanupLog.push(...await closeIssuePullRequest(id, mode === "cancel" ? "Canceled via Overdeck" : "Reset to Todo via Overdeck"));
32191
- const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-CE7619Xw.js");
32209
+ const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-CtPDcZ9u.js");
32192
32210
  const workflow = mode === "cancel" ? cancelIssueWorkflow : resetToTodo;
32193
32211
  const result = await Effect.runPromise(workflow(ctx, {
32194
32212
  deleteWorkspace,
@@ -32203,7 +32221,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
32203
32221
  }));
32204
32222
  cleanupLog.push(...result.steps.flatMap((step) => step.details || [step.error].filter(Boolean)));
32205
32223
  if (mode === "cancel") try {
32206
- const { transitionVBriefOnMain } = await import("./lifecycle-io-CUpsxG0p.js");
32224
+ const { transitionVBriefOnMain } = await import("./lifecycle-io-DmY2qwCn.js");
32207
32225
  const tx = await Effect.runPromise(transitionVBriefOnMain(ctx.projectPath, id, "cancelled", "cancelled", `scope: cancel ${id.toUpperCase()} vBRIEF`));
32208
32226
  if (tx.moved) cleanupLog.push(`vBRIEF moved ${tx.fromDir} → cancelled`);
32209
32227
  if (tx.committed) cleanupLog.push(`Committed vBRIEF cancellation on main`);
@@ -32211,8 +32229,8 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
32211
32229
  cleanupLog.push(`vBRIEF cancel transition failed (non-fatal): ${err?.message ?? err}`);
32212
32230
  }
32213
32231
  try {
32214
- const { killAllReviewerSessions } = await import("./review-agent-CSswH985.js");
32215
- const { resolveProjectFromIssueSync } = await import("./projects-IRHJIPYC.js");
32232
+ const { killAllReviewerSessions } = await import("./review-agent-CCum8sGe.js");
32233
+ const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
32216
32234
  const projectKey = resolveProjectFromIssueSync(id)?.projectKey;
32217
32235
  if (projectKey) {
32218
32236
  const { killed } = await Effect.runPromise(killAllReviewerSessions(projectKey, id.toUpperCase()));
@@ -32226,7 +32244,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
32226
32244
  cleanupLog.push("Cleared review status");
32227
32245
  } catch {}
32228
32246
  try {
32229
- const { resetPostMergeState } = await import("./merge-agent-CnORPiri.js");
32247
+ const { resetPostMergeState } = await import("./merge-agent-B-SnXOoc.js");
32230
32248
  resetPostMergeState(id);
32231
32249
  resetPostMergeState(id.toUpperCase());
32232
32250
  cleanupLog.push("Cleared merge state");
@@ -32246,7 +32264,7 @@ function closeIssueTransition(options) {
32246
32264
  const { issueId, body, eventStore } = options;
32247
32265
  const { reason } = body;
32248
32266
  const projectPath = getProjectPath$3(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]);
32249
- const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-CE7619Xw.js"));
32267
+ const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-CtPDcZ9u.js"));
32250
32268
  const githubCheck = isGitHubIssue$4(issueId);
32251
32269
  const issueDataService = getIssueDataService$8();
32252
32270
  const issueSource = issueDataService.getIssueSource(issueId);
@@ -32513,7 +32531,7 @@ function reopenIssueTransition(options) {
32513
32531
  else clearReviewStatus(id.toUpperCase());
32514
32532
  } catch {}
32515
32533
  try {
32516
- const { resetPostMergeState } = await import("./merge-agent-CnORPiri.js");
32534
+ const { resetPostMergeState } = await import("./merge-agent-B-SnXOoc.js");
32517
32535
  resetPostMergeState(id);
32518
32536
  resetPostMergeState(id.toUpperCase());
32519
32537
  } catch {}
@@ -32577,7 +32595,7 @@ function moveIssueStatus(options) {
32577
32595
  "done"
32578
32596
  ];
32579
32597
  if (!targetStatus || !validStatuses.includes(targetStatus)) return jsonResponse({ error: `Invalid targetStatus. Must be one of: ${validStatuses.join(", ")}` }, { status: 400 });
32580
- const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-CDxEuPlE.js"));
32598
+ const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-CbvsN3qG.js"));
32581
32599
  const issueState = {
32582
32600
  backlog: "open",
32583
32601
  todo: "open",
@@ -32804,7 +32822,7 @@ async function copySettingsToWorkspace(id) {
32804
32822
  success: false,
32805
32823
  error: "Workspace not found"
32806
32824
  }, { status: 404 });
32807
- const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-CcujONCR.js");
32825
+ const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-B1WOfKvB.js");
32808
32826
  const result = copyOverdeckSettingsToWorkspaceSync(workspacePath);
32809
32827
  return jsonResponse({
32810
32828
  success: result.errors.length === 0 || result.copied.length > 0,
@@ -33267,7 +33285,7 @@ function restartFromPlan(options) {
33267
33285
  });
33268
33286
  const resetResult = yield* Effect.promise(async () => {
33269
33287
  try {
33270
- const { runGitResetHard } = await import("./dangerous-git-ops-BebB-61h.js");
33288
+ const { runGitResetHard } = await import("./dangerous-git-ops-D6AF-Hg_.js");
33271
33289
  async function findPlanningCommit(grep, label) {
33272
33290
  try {
33273
33291
  const { stdout } = await execAsync$6(`git log --grep="${grep.replace(/"/g, "\\\"")}" --format=%H -1`, {
@@ -33720,7 +33738,7 @@ function closeOutIssue(id, opts = {}) {
33720
33738
  }
33721
33739
  const closeOutResult = yield* Effect.promise(async () => {
33722
33740
  try {
33723
- const { closeOut } = await import("./lifecycle-CE7619Xw.js");
33741
+ const { closeOut } = await import("./lifecycle-CtPDcZ9u.js");
33724
33742
  return {
33725
33743
  ok: true,
33726
33744
  result: await Effect.runPromise(closeOut(ctx, {
@@ -33809,7 +33827,7 @@ function bulkCloseOut(body) {
33809
33827
  const invalidIds = issueIds.filter((id) => !isValidIssueId(id));
33810
33828
  if (invalidIds.length > 0) return jsonResponse({ error: `Invalid issue ID format: ${invalidIds.join(", ")}` }, { status: 400 });
33811
33829
  const eventStore = yield* EventStoreService;
33812
- const { closeOut } = yield* Effect.promise(() => import("./lifecycle-CE7619Xw.js"));
33830
+ const { closeOut } = yield* Effect.promise(() => import("./lifecycle-CtPDcZ9u.js"));
33813
33831
  const issueDataService = getIssueDataService$5();
33814
33832
  const tasks = [];
33815
33833
  const agentChecks = yield* withConcurrencyLimit(issueIds.map((id) => Effect.promise(async () => {
@@ -34035,8 +34053,8 @@ const getIssueShipLogRoute = HttpRouter.add("GET", "/api/issues/:id/ship-log", h
34035
34053
  const id = (yield* HttpRouter.params)["id"] ?? "";
34036
34054
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
34037
34055
  return yield* Effect.promise(async () => {
34038
- const { getShipLog } = await import("./ship-log-DDcueaIR.js");
34039
- const { getReviewStatusSync } = await import("./review-status-DXeqFpk5.js");
34056
+ const { getShipLog } = await import("./ship-log-__QtAFXG.js");
34057
+ const { getReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
34040
34058
  const log = getShipLog(id);
34041
34059
  const rs = getReviewStatusSync(id);
34042
34060
  return jsonResponse({
@@ -34051,8 +34069,8 @@ const getIssueVerificationRoute = HttpRouter.add("GET", "/api/issues/:id/verific
34051
34069
  const id = (yield* HttpRouter.params)["id"] ?? "";
34052
34070
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
34053
34071
  return yield* Effect.promise(async () => {
34054
- const { readVerificationArtifact } = await import("./verification-artifact-CrbI4tJE.js");
34055
- const { getReviewStatusSync } = await import("./review-status-DXeqFpk5.js");
34072
+ const { readVerificationArtifact } = await import("./verification-artifact-Ck1tefmz.js");
34073
+ const { getReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
34056
34074
  const { join } = await import("node:path");
34057
34075
  const resolved = resolveProjectFromIssueSync(id);
34058
34076
  const workspacePath = resolved ? join(resolved.projectPath, "workspaces", `feature-${id.toLowerCase()}`) : null;
@@ -35165,7 +35183,7 @@ function buildProcessTotalsByRoot(roots, processes) {
35165
35183
  }
35166
35184
  totals.set(root.rootPid, {
35167
35185
  processCount: seen.size,
35168
- cpuPercent: roundOneDecimal$3(cpuPercent),
35186
+ cpuPercent: roundOneDecimal$2(cpuPercent),
35169
35187
  memoryBytes
35170
35188
  });
35171
35189
  }
@@ -35199,7 +35217,7 @@ function getIdleMinutes(lastActivity, nowMs) {
35199
35217
  if (!Number.isFinite(lastActivityMs)) return 0;
35200
35218
  return Math.max(0, Math.floor((nowMs - lastActivityMs) / 6e4));
35201
35219
  }
35202
- function roundOneDecimal$3(value) {
35220
+ function roundOneDecimal$2(value) {
35203
35221
  return Math.round(value * 10) / 10;
35204
35222
  }
35205
35223
  function roundCurrency(value) {
@@ -35357,7 +35375,7 @@ function aggregateSupportFleet(processes) {
35357
35375
  const supportProcesses = processes.filter(isSupportFleetProcess);
35358
35376
  const members = supportProcesses.map((process) => process.command);
35359
35377
  return {
35360
- cpuPercent: roundOneDecimal$2(supportProcesses.reduce((sum, process) => sum + process.cpuPercent, 0)),
35378
+ cpuPercent: roundOneDecimal$1(supportProcesses.reduce((sum, process) => sum + process.cpuPercent, 0)),
35361
35379
  memoryBytes: supportProcesses.reduce((sum, process) => sum + process.memoryBytes, 0),
35362
35380
  memberCount: supportProcesses.length,
35363
35381
  members
@@ -35384,7 +35402,7 @@ function formatDuration(totalSeconds) {
35384
35402
  if (minutes > 0) return `${minutes}m ${seconds}s`;
35385
35403
  return `${seconds}s`;
35386
35404
  }
35387
- function roundOneDecimal$2(value) {
35405
+ function roundOneDecimal$1(value) {
35388
35406
  return Math.round(value * 10) / 10;
35389
35407
  }
35390
35408
  //#endregion
@@ -35410,7 +35428,7 @@ function buildCapacityForecast(stacks, options) {
35410
35428
  }),
35411
35429
  headroom: {
35412
35430
  freeRamBytes: options.hostVitals.mem.availableBytes,
35413
- loadHeadroom: Math.max(0, 100 - options.hostVitals.cpu.percent)
35431
+ loadHeadroom: options.hostVitals.cpu.percent === null ? null : Math.max(0, 100 - options.hostVitals.cpu.percent)
35414
35432
  }
35415
35433
  };
35416
35434
  }
@@ -35481,8 +35499,8 @@ function buildHostProcesses(processes, options = {}) {
35481
35499
  const row = {
35482
35500
  ...group,
35483
35501
  pids: group.pids.sort((a, b) => a - b),
35484
- cpuPercent: roundOneDecimal$1(group.cpuPercent),
35485
- peakCpuPercent: roundOneDecimal$1(peakCpuPercent),
35502
+ cpuPercent: roundOneDecimal(group.cpuPercent),
35503
+ peakCpuPercent: roundOneDecimal(peakCpuPercent),
35486
35504
  peakMemoryBytes
35487
35505
  };
35488
35506
  if (peakCpuPercent >= burstCpuThreshold) retainedBursts.set(group.id, {
@@ -35557,7 +35575,7 @@ function selectTopRows(rows, limit) {
35557
35575
  for (const row of [...topByCpu, ...topByMemory]) merged.set(row.id, row);
35558
35576
  return [...merged.values()].sort((a, b) => b.cpuPercent - a.cpuPercent || b.peakCpuPercent - a.peakCpuPercent).slice(0, limit);
35559
35577
  }
35560
- function roundOneDecimal$1(value) {
35578
+ function roundOneDecimal(value) {
35561
35579
  return Math.round(value * 10) / 10;
35562
35580
  }
35563
35581
  //#endregion
@@ -35575,12 +35593,20 @@ let cachedDockerCounts = {
35575
35593
  }
35576
35594
  };
35577
35595
  function buildHostVitalsSnapshot(options = {}) {
35578
- const cpuPercent = roundOneDecimal(options.cpuPercent ?? 0);
35579
- cpuSpark.push(cpuPercent);
35580
- cpuSpark = cpuSpark.slice(-CPU_SPARK_MAX);
35596
+ const metrics = options.hostMetrics;
35597
+ const cpuPercent = metrics?.cpuPercent ?? null;
35598
+ if (cpuPercent !== null) {
35599
+ cpuSpark.push(cpuPercent);
35600
+ cpuSpark = cpuSpark.slice(-CPU_SPARK_MAX);
35601
+ }
35581
35602
  const dockerCounts = options.dockerStale ? cachedDockerCounts : computeDockerCounts(options.containers ?? [], options.networkCount ?? 0, options.networkPoolTotal ?? 31);
35582
35603
  if (!options.dockerStale) cachedDockerCounts = dockerCounts;
35583
- const memory = options.mem ?? getDefaultMemoryVitals();
35604
+ const memory = {
35605
+ usedBytes: metrics?.usedMemoryBytes ?? null,
35606
+ availableBytes: metrics?.availableMemoryBytes ?? null,
35607
+ swapUsedBytes: metrics?.swapUsedBytes ?? null,
35608
+ swapTotalBytes: metrics?.swapTotalBytes ?? null
35609
+ };
35584
35610
  const disk = options.disk ?? {
35585
35611
  usedBytes: 0,
35586
35612
  freeBytes: 0,
@@ -35591,7 +35617,11 @@ function buildHostVitalsSnapshot(options = {}) {
35591
35617
  stale: options.dockerStale === true,
35592
35618
  cpu: {
35593
35619
  percent: cpuPercent,
35594
- load: options.load ?? normalizeLoad(loadavg$1()),
35620
+ load: [
35621
+ metrics?.loadAverage1m ?? null,
35622
+ null,
35623
+ null
35624
+ ],
35595
35625
  spark: [...cpuSpark]
35596
35626
  },
35597
35627
  mem: memory,
@@ -35637,26 +35667,6 @@ function computeAgentCounts(agents, fleet, nowMs) {
35637
35667
  totalUsd: fleet.totalUsd ?? 0
35638
35668
  };
35639
35669
  }
35640
- function getDefaultMemoryVitals() {
35641
- const total = totalmem$1();
35642
- const available = freemem$1();
35643
- return {
35644
- usedBytes: Math.max(0, total - available),
35645
- availableBytes: available,
35646
- swapUsedBytes: 0,
35647
- swapTotalBytes: 0
35648
- };
35649
- }
35650
- function normalizeLoad(load) {
35651
- return [
35652
- roundOneDecimal(load[0] ?? 0),
35653
- roundOneDecimal(load[1] ?? 0),
35654
- roundOneDecimal(load[2] ?? 0)
35655
- ];
35656
- }
35657
- function roundOneDecimal(value) {
35658
- return Math.round(value * 10) / 10;
35659
- }
35660
35670
  //#endregion
35661
35671
  //#region routes/resources/limits.ts
35662
35672
  const OOM_WINDOW_MS = 1440 * 60 * 1e3;
@@ -35767,32 +35777,97 @@ function isClosedReviewStatus(issueId) {
35767
35777
  }
35768
35778
  //#endregion
35769
35779
  //#region routes/resources/spawn-gate.ts
35770
- let readSystemHealthSnapshot = () => getSystemHealthSnapshot();
35771
- function mapSpawnGateDecision(decision) {
35772
- const reason = decision.error ?? decision.warnings[0]?.message ?? "";
35780
+ let readSystemHealthEvidenceSnapshot = () => getSystemHealthEvidenceSnapshot();
35781
+ function mapSpawnGateDecision(decision, accepted) {
35782
+ if (decision.health.freshness.status !== "fresh") {
35783
+ const reason = decision.health.freshness.status === "stale" ? {
35784
+ code: "admission.snapshot.stale",
35785
+ domain: "admission",
35786
+ severity: "critical",
35787
+ message: decision.error ?? `Spawn gate health is stale: ${decision.health.freshness.reason.message}`
35788
+ } : {
35789
+ code: "admission.snapshot.measuring",
35790
+ domain: "admission",
35791
+ severity: "info",
35792
+ message: decision.error ?? "Spawn gate health is still measuring."
35793
+ };
35794
+ return unavailableSpawnGate(accepted ?? null, reason, decision.warnings);
35795
+ }
35796
+ const admission = accepted?.admission;
35797
+ const state = admission ? strongestAdmissionState(admission.state, decision.blocked ? "blocked" : decision.requiresAcknowledgement ? "soft" : "open") : decision.blocked ? "blocked" : decision.requiresAcknowledgement ? "soft" : "open";
35798
+ const reasons = mergeAdmissionReasons(admission?.reasons ?? [], decision.warnings.map((warning) => ({
35799
+ code: warning.code,
35800
+ domain: "admission",
35801
+ severity: warning.severity,
35802
+ message: warning.message
35803
+ })));
35773
35804
  return {
35774
- state: decision.blocked ? "BLOCKED" : decision.requiresAcknowledgement ? "SOFT" : "OPEN",
35775
- reason,
35805
+ state,
35806
+ reason: decision.error ?? decision.warnings[0]?.message ?? reasons[0]?.message ?? "",
35807
+ reasons,
35808
+ admittedWorkAgentCount: admission?.admittedWorkAgentCount ?? decision.health.summary.workAgentCount,
35776
35809
  warnings: decision.warnings,
35777
- pressure: spawnGatePressure(decision)
35810
+ pressure: spawnGatePressure(state)
35778
35811
  };
35779
35812
  }
35780
- function getSpawnGatePayloadEffect() {
35813
+ function getResourcesHealthEvidenceEffect() {
35781
35814
  return Effect.tryPromise({
35782
- try: () => readSystemHealthSnapshot(),
35815
+ try: () => readSystemHealthEvidenceSnapshot(),
35783
35816
  catch: (error) => error
35784
- }).pipe(Effect.map((health) => mapSpawnGateDecision(evaluateSpawnGuardrails(health))), Effect.catch(() => Effect.succeed({
35785
- state: "SOFT",
35786
- reason: "Spawn gate health is unavailable.",
35787
- warnings: [],
35817
+ }).pipe(Effect.map(({ accepted, compatibility }) => ({
35818
+ accepted,
35819
+ decision: evaluateSpawnGuardrails(compatibility)
35820
+ })), Effect.catch(() => Effect.succeed({
35821
+ accepted: null,
35822
+ decision: null
35823
+ })));
35824
+ }
35825
+ function getSpawnGatePayloadEffect(evidence) {
35826
+ return (evidence ? Effect.succeed(evidence) : getResourcesHealthEvidenceEffect()).pipe(Effect.map(({ accepted, decision }) => {
35827
+ if (!accepted || !decision) return unavailableSpawnGate(accepted);
35828
+ return mapSpawnGateDecision(decision, accepted);
35829
+ }));
35830
+ }
35831
+ function unavailableSpawnGate(accepted, unavailableReason, warnings = []) {
35832
+ const reasons = unavailableReason ? [unavailableReason] : accepted?.admission.reasons.length ? [...accepted.admission.reasons] : [{
35833
+ code: "admission.snapshot.unavailable",
35834
+ domain: "admission",
35835
+ severity: "critical",
35836
+ message: "Spawn gate health is unavailable."
35837
+ }];
35838
+ return {
35839
+ state: "unavailable",
35840
+ reason: reasons[0]?.message ?? "Spawn gate health is unavailable.",
35841
+ reasons,
35842
+ admittedWorkAgentCount: accepted?.admission.admittedWorkAgentCount ?? null,
35843
+ warnings,
35788
35844
  pressure: 0,
35789
35845
  stale: true
35790
- })));
35846
+ };
35847
+ }
35848
+ function mergeAdmissionReasons(...reasonGroups) {
35849
+ const seen = /* @__PURE__ */ new Set();
35850
+ return reasonGroups.flatMap((reasons) => reasons).filter((reason) => {
35851
+ const key = `${reason.code}::${reason.message}`;
35852
+ if (seen.has(key)) return false;
35853
+ seen.add(key);
35854
+ return true;
35855
+ });
35856
+ }
35857
+ function strongestAdmissionState(accepted, enforced) {
35858
+ if (accepted === "unavailable") return accepted;
35859
+ const rank = {
35860
+ open: 0,
35861
+ soft: 1,
35862
+ blocked: 2
35863
+ };
35864
+ return rank[accepted] >= rank[enforced] ? accepted : enforced;
35791
35865
  }
35792
- function spawnGatePressure(decision) {
35793
- if (decision.blocked) return 100;
35794
- if (decision.requiresAcknowledgement) return 67;
35795
- return 12;
35866
+ function spawnGatePressure(state) {
35867
+ if (state === "blocked") return 100;
35868
+ if (state === "soft") return 67;
35869
+ if (state === "open") return 12;
35870
+ return 0;
35796
35871
  }
35797
35872
  //#endregion
35798
35873
  //#region routes/resources/snapshot.ts
@@ -35803,7 +35878,8 @@ function getResourcesEffect() {
35803
35878
  return Effect.gen(function* () {
35804
35879
  const containers = enrichContainersWithLimits(getCurrentDockerStats());
35805
35880
  const agentStats = yield* getAgentStatsSnapshotEffect();
35806
- const spawnGate = yield* getSpawnGatePayloadEffect();
35881
+ const healthEvidence = yield* getResourcesHealthEvidenceEffect();
35882
+ const spawnGate = yield* getSpawnGatePayloadEffect(healthEvidence);
35807
35883
  const stoppedContainers = [];
35808
35884
  const sessions = yield* listSessions().pipe(Effect.catch(() => Effect.succeed([])));
35809
35885
  const tmuxSessionNames = new Set(sessions.map((s) => s.name));
@@ -35813,6 +35889,7 @@ function getResourcesEffect() {
35813
35889
  }));
35814
35890
  const agentStatsById = new Map(agentStats.agents.map((agent) => [agent.id, agent]));
35815
35891
  const baseHostVitals = buildHostVitalsSnapshot({
35892
+ hostMetrics: healthEvidence.accepted?.host.metrics,
35816
35893
  containers,
35817
35894
  agents: agents.map((agent) => ({
35818
35895
  id: String(agent.id),
@@ -38574,7 +38651,7 @@ Be specific: reference actual file names, function names, requirement text, disc
38574
38651
  const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
38575
38652
  const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
38576
38653
  const promptFile = join(planningDir, ".status-review-prompt.tmp");
38577
- const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-BqCdTryq.js");
38654
+ const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-DNSQqy2V.js");
38578
38655
  let providerEnvStr = "";
38579
38656
  let providerEnv = {};
38580
38657
  const statusProvider = getProviderForModelSync(statusModelId);
@@ -38657,7 +38734,7 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
38657
38734
  let safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "-");
38658
38735
  let processedContent = content;
38659
38736
  if (safeName.endsWith(".vtt")) {
38660
- const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-3VZKsmSm.js"));
38737
+ const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-BnRsYzcz.js"));
38661
38738
  processedContent = vttToMarkdown(content);
38662
38739
  safeName = safeName.replace(/\.vtt$/, ".md");
38663
38740
  }
@@ -44484,7 +44561,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
44484
44561
  }, { status: 400 });
44485
44562
  return yield* Effect.promise(async () => {
44486
44563
  try {
44487
- const { RallyRestApi } = await import("./rally-api-CKr0O4DJ.js");
44564
+ const { RallyRestApi } = await import("./rally-api-xHazRk0d.js");
44488
44565
  const api = new RallyRestApi({
44489
44566
  apiKey,
44490
44567
  server: server || "https://rally1.rallydev.com"
@@ -44516,15 +44593,9 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
44516
44593
  const trackersRouteLayer = Layer.mergeAll(postTrackersRefreshRoute, getTrackerStatusRoute, postRallyValidateRoute);
44517
44594
  //#endregion
44518
44595
  //#region ../lib/health-filtering.ts
44519
- /**
44520
- * Health filtering logic for dashboard health API
44521
- * Determines which agents should be visible in health checks
44522
- */
44523
- init_config$1();
44524
44596
  init_tmux();
44525
- const KICKOFF_STALL_GRACE_MS = 300 * 1e3;
44526
44597
  /**
44527
- * Check if agent tmux session is alive
44598
+ * Check if agent tmux session is alive.
44528
44599
  */
44529
44600
  const checkAgentHealth = (agentId) => Effect.gen(function* () {
44530
44601
  if (!(yield* sessionExists(agentId))) return { alive: false };
@@ -44533,133 +44604,191 @@ const checkAgentHealth = (agentId) => Effect.gen(function* () {
44533
44604
  lastOutput: (yield* capturePane(agentId, 5)).trim()
44534
44605
  };
44535
44606
  }).pipe(Effect.catch(() => Effect.succeed({ alive: false })));
44536
- /**
44537
- * Determine health status based on activity
44538
- * Returns null if agent should be hidden (completed/stopped/no state.json)
44539
- *
44540
- * `liveSessions` is REQUIRED — pass the session list fetched once per request.
44541
- * Iterating ~150 agent dirs and spawning a tmux subprocess per agent was pinning
44542
- * the dashboard process at 100% CPU on every 5s `/api/health/agents` poll.
44543
- * State is also read before the tmux check so stopped/completed/missing
44544
- * agents short-circuit without any extra work.
44545
- */
44546
- const determineHealthStatus = (agentId, stateFile, liveSessions) => Effect.gen(function* () {
44547
- let agentStatus;
44548
- let lastActivity = null;
44549
- let contextSaturatedAt;
44550
- if (!existsSync(stateFile)) return null;
44551
- const state = yield* Effect.tryPromise({
44552
- try: () => readFile$1(stateFile, "utf-8").then((content) => JSON.parse(content)),
44553
- catch: () => null
44554
- }).pipe(Effect.catch(() => Effect.succeed(null)));
44555
- if (state === null) return null;
44556
- agentStatus = state.status;
44557
- lastActivity = state.lastActivity ? new Date(state.lastActivity) : null;
44558
- if (!agentStatus) return null;
44559
- if (agentStatus === "stopped" || agentStatus === "completed") return null;
44560
- const runtimeFile = stateFile.replace("state.json", "runtime.json");
44561
- if (existsSync(runtimeFile)) {
44562
- const runtime = yield* Effect.tryPromise({
44563
- try: () => readFile$1(runtimeFile, "utf-8").then((content) => JSON.parse(content)),
44564
- catch: () => null
44565
- }).pipe(Effect.catch(() => Effect.succeed(null)));
44566
- if (runtime?.lastActivity) {
44567
- const runtimeDate = new Date(runtime.lastActivity);
44568
- if (!lastActivity || runtimeDate > lastActivity) lastActivity = runtimeDate;
44569
- }
44570
- if (runtime?.contextSaturatedAt) contextSaturatedAt = runtime.contextSaturatedAt;
44571
- }
44572
- if (!liveSessions.has(agentId)) {
44573
- const STALE_THRESHOLD_MS = ((yield* loadCloisterConfig()).retention?.health_staleness_hours ?? 24) * 60 * 60 * 1e3;
44574
- if (lastActivity) {
44575
- if (Date.now() - lastActivity.getTime() > STALE_THRESHOLD_MS) return null;
44576
- } else return null;
44577
- return {
44578
- status: "dead",
44579
- reason: "Agent crashed unexpectedly"
44580
- };
44581
- }
44582
- if (contextSaturatedAt) return {
44583
- status: "wedged",
44584
- reason: "Context window exhausted (400) — recovery in progress"
44585
- };
44586
- const startedAtMs = typeof state.startedAt === "string" ? Date.parse(state.startedAt) : NaN;
44587
- if (state.role === "work" && agentStatus === "running" && state.kickoffDelivered === false && Number.isFinite(startedAtMs) && Date.now() - startedAtMs > KICKOFF_STALL_GRACE_MS) return {
44588
- status: "stalled",
44589
- reason: "Work agent running with no kickoff delivered since spawn"
44590
- };
44591
- if (lastActivity) {
44592
- const ageMinutes = (Date.now() - lastActivity.getTime()) / (1e3 * 60);
44593
- if (ageMinutes > 30) return {
44594
- status: "stuck",
44595
- reason: `No activity for ${Math.round(ageMinutes)} minutes`
44596
- };
44597
- else if (ageMinutes > 15) return {
44598
- status: "warning",
44599
- reason: `Low activity (${Math.round(ageMinutes)} minutes)`
44600
- };
44601
- }
44602
- return { status: "healthy" };
44603
- });
44604
44607
  //#endregion
44605
44608
  //#region routes/misc/health.ts
44606
- init_agents$1();
44609
+ init_src();
44610
+ init_review_status_source();
44611
+ init_paths();
44607
44612
  init_tmux();
44608
44613
  init_read_model();
44609
- const getSystemHealthRoute = HttpRouter.add("GET", "/api/system/health", httpHandler(Effect.gen(function* () {
44610
- return jsonResponse(yield* (yield* ReadModelService).getSnapshot.pipe(Effect.flatMap((snapshot) => Effect.promise(() => getSystemHealthSnapshot(snapshot)))));
44611
- })));
44612
- const getGodviewSystemHealthRoute = HttpRouter.add("GET", "/api/godview/system-health", httpHandler(Effect.gen(function* () {
44613
- const health = yield* (yield* ReadModelService).getSnapshot.pipe(Effect.flatMap((snapshot) => Effect.promise(() => getSystemHealthSnapshot(snapshot))));
44614
+ function unavailableSystemHealthResponse() {
44614
44615
  return jsonResponse({
44615
- cpu: health.summary.cpuPercent,
44616
- memPercent: health.summary.memoryUsedPercent,
44617
- memUsed: health.summary.usedMemoryBytes,
44618
- memTotal: health.summary.totalMemoryBytes,
44619
- updatedAt: health.updatedAt
44616
+ status: "unavailable",
44617
+ reasons: [{
44618
+ code: "system.health_snapshot.unavailable",
44619
+ domain: "host",
44620
+ severity: "critical",
44621
+ message: "The accepted system health snapshot could not be produced or decoded."
44622
+ }]
44623
+ }, { status: 503 });
44624
+ }
44625
+ function decodeAcceptedSystemHealth(value) {
44626
+ const decoded = Schema.decodeUnknownResult(SystemHealthSnapshot)(value);
44627
+ if (decoded._tag === "Failure") throw new Error("The accepted system health snapshot failed shared-contract decoding.");
44628
+ return decoded.success;
44629
+ }
44630
+ function buildSystemHealthResponse(dependencies) {
44631
+ return dependencies.snapshot.pipe(Effect.map((snapshot) => jsonResponse(decodeAcceptedSystemHealth(snapshot))), Effect.catchCause(() => Effect.succeed(unavailableSystemHealthResponse())));
44632
+ }
44633
+ function buildGodviewSystemHealthResponse(dependencies) {
44634
+ return dependencies.snapshot.pipe(Effect.map((snapshot) => {
44635
+ const health = decodeAcceptedSystemHealth(snapshot);
44636
+ return jsonResponse({
44637
+ ...health,
44638
+ cpu: health.summary.cpuPercent,
44639
+ memPercent: health.summary.memoryUsedPercent,
44640
+ memUsed: health.summary.usedMemoryBytes,
44641
+ memTotal: health.summary.totalMemoryBytes,
44642
+ updatedAt: health.updatedAt
44643
+ });
44644
+ }), Effect.catchCause(() => Effect.succeed(unavailableSystemHealthResponse())));
44645
+ }
44646
+ const getSystemHealthRoute = HttpRouter.add("GET", "/api/system/health", httpHandler(buildSystemHealthResponse({ snapshot: Effect.promise(() => getAcceptedSystemHealthSnapshot()) })));
44647
+ const getGodviewSystemHealthRoute = HttpRouter.add("GET", "/api/godview/system-health", httpHandler(buildGodviewSystemHealthResponse({ snapshot: Effect.promise(() => getAcceptedSystemHealthSnapshot()) })));
44648
+ const getDeployStalenessRoute = HttpRouter.add("GET", "/api/deploy/staleness", Effect.promise(async () => jsonResponse(await getDeployStaleness())));
44649
+ function finiteNumber(value) {
44650
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
44651
+ }
44652
+ async function readAgentHealthObservations(agentId) {
44653
+ if (!/^[A-Za-z0-9._-]+$/.test(agentId) || agentId.includes("..")) return {};
44654
+ const agentDir = join(getOverdeckHome(), "agents", agentId);
44655
+ const observations = {};
44656
+ try {
44657
+ const stored = JSON.parse(await readFile(join(agentDir, "health.json"), "utf-8"));
44658
+ if (stored && typeof stored === "object" && !Array.isArray(stored)) {
44659
+ const record = stored;
44660
+ const consecutiveFailures = finiteNumber(record["consecutiveFailures"]);
44661
+ const killCount = finiteNumber(record["killCount"]);
44662
+ if (consecutiveFailures !== void 0) observations.consecutiveFailures = consecutiveFailures;
44663
+ if (killCount !== void 0) observations.killCount = killCount;
44664
+ }
44665
+ } catch {}
44666
+ try {
44667
+ const raw = (await readFile(join(agentDir, "context-pct"), "utf-8")).trim();
44668
+ const contextPercent = raw === "" ? NaN : Number(raw);
44669
+ if (Number.isFinite(contextPercent)) observations.contextPercent = contextPercent;
44670
+ } catch {}
44671
+ return observations;
44672
+ }
44673
+ function runtimeHealthState(runtime) {
44674
+ if (!runtime) return null;
44675
+ switch (runtime.activity) {
44676
+ case "working":
44677
+ case "thinking": return {
44678
+ state: "active",
44679
+ lastActivity: runtime.lastActivity,
44680
+ contextSaturatedAt: runtime.contextSaturatedAt
44681
+ };
44682
+ case "waiting": return {
44683
+ state: "waiting-on-human",
44684
+ lastActivity: runtime.lastActivity,
44685
+ contextSaturatedAt: runtime.contextSaturatedAt
44686
+ };
44687
+ case "idle": return {
44688
+ state: "idle",
44689
+ lastActivity: runtime.lastActivity,
44690
+ contextSaturatedAt: runtime.contextSaturatedAt
44691
+ };
44692
+ case "stopped": return {
44693
+ state: "stopped",
44694
+ lastActivity: runtime.lastActivity,
44695
+ contextSaturatedAt: runtime.contextSaturatedAt
44696
+ };
44697
+ }
44698
+ }
44699
+ function decodeReviewStatuses(value) {
44700
+ const statuses = /* @__PURE__ */ new Map();
44701
+ for (const candidate of value ?? []) {
44702
+ const decoded = Schema.decodeUnknownResult(ReviewStatusSnapshot)(candidate);
44703
+ if (decoded._tag === "Success") statuses.set(decoded.success.issueId.toUpperCase(), decoded.success);
44704
+ }
44705
+ return statuses;
44706
+ }
44707
+ function reviewLifecycle(agent, statuses, tmuxActive) {
44708
+ if (agent.role !== "review" && agent.role !== "test" && agent.role !== "ship") return "unknown";
44709
+ return classifyAdvancingSessionLifecycle(agent.role, statuses.get(agent.issueId.toUpperCase()), tmuxActive);
44710
+ }
44711
+ function snapshotSource(value) {
44712
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("The canonical read model did not return an object.");
44713
+ const candidate = value;
44714
+ if (!Array.isArray(candidate["agents"])) throw new Error("The canonical read model did not return an agent array.");
44715
+ return {
44716
+ agents: candidate["agents"],
44717
+ agentRuntimeById: candidate["agentRuntimeById"],
44718
+ reviewStatuses: Array.isArray(candidate["reviewStatuses"]) ? candidate["reviewStatuses"] : void 0
44719
+ };
44720
+ }
44721
+ function runtimeRecord(value) {
44722
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
44723
+ }
44724
+ async function projectAgentHealth(snapshotValue, sessionNames, readObservations, nowMs) {
44725
+ const snapshot = snapshotSource(snapshotValue);
44726
+ const liveSessions = new Set(sessionNames);
44727
+ const runtimes = runtimeRecord(snapshot.agentRuntimeById);
44728
+ const reviewStatuses = decodeReviewStatuses(snapshot.reviewStatuses);
44729
+ return Promise.all(snapshot.agents.map(async (candidate, index) => {
44730
+ const decoded = Schema.decodeUnknownResult(AgentSnapshot)(candidate);
44731
+ if (decoded._tag === "Failure") {
44732
+ const candidateId = candidate && typeof candidate === "object" && !Array.isArray(candidate) ? candidate["id"] : void 0;
44733
+ return classifyAgentHealth({
44734
+ agentId: typeof candidateId === "string" ? candidateId : `unavailable-agent-${index + 1}`,
44735
+ persisted: {
44736
+ status: "unavailable",
44737
+ reason: "The canonical agent snapshot could not be decoded."
44738
+ },
44739
+ runtime: null,
44740
+ liveSessions,
44741
+ reviewLifecycle: "unknown",
44742
+ nowMs
44743
+ });
44744
+ }
44745
+ const agent = decoded.success;
44746
+ const runtimeCandidate = Schema.decodeUnknownResult(AgentRuntimeSnapshot)(runtimes[agent.id]);
44747
+ const runtime = runtimeCandidate._tag === "Success" ? runtimeCandidate.success : null;
44748
+ const observations = await readObservations(agent.id).catch(() => ({}));
44749
+ return classifyAgentHealth({
44750
+ agentId: agent.id,
44751
+ persisted: {
44752
+ status: "available",
44753
+ value: {
44754
+ id: agent.id,
44755
+ issueId: agent.issueId,
44756
+ role: agent.role,
44757
+ status: agent.status,
44758
+ startedAt: agent.startedAt,
44759
+ lastActivity: agent.lastActivity,
44760
+ paused: agent.paused,
44761
+ stoppedByUser: agent.stoppedByUser,
44762
+ consecutiveFailures: agent.consecutiveFailures
44763
+ }
44764
+ },
44765
+ runtime: runtimeHealthState(runtime),
44766
+ liveSessions,
44767
+ reviewLifecycle: reviewLifecycle(agent, reviewStatuses, liveSessions.has(agent.id)),
44768
+ observations,
44769
+ nowMs
44770
+ });
44771
+ }));
44772
+ }
44773
+ function buildHealthAgentsResponse(dependencies) {
44774
+ return Effect.all({
44775
+ snapshot: dependencies.snapshot,
44776
+ sessionNames: dependencies.sessionNames
44777
+ }).pipe(Effect.flatMap(({ snapshot, sessionNames }) => Effect.promise(async () => jsonResponse(await projectAgentHealth(snapshot, sessionNames, dependencies.readObservations ?? readAgentHealthObservations, dependencies.nowMs ?? Date.now())))), Effect.catchCause(() => Effect.succeed(jsonResponse({
44778
+ status: "unavailable",
44779
+ reasons: [{
44780
+ code: "agent.health_snapshot.unavailable",
44781
+ domain: "agent",
44782
+ severity: "critical",
44783
+ message: "The canonical agent health snapshot could not be loaded."
44784
+ }]
44785
+ }, { status: 503 }))));
44786
+ }
44787
+ const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.gen(function* () {
44788
+ return yield* buildHealthAgentsResponse({
44789
+ snapshot: (yield* ReadModelService).getSnapshot,
44790
+ sessionNames: listSessionNames()
44620
44791
  });
44621
- })));
44622
- const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.promise(async () => {
44623
- try {
44624
- const agentsDir = join(homedir$1(), ".overdeck", "agents");
44625
- if (!existsSync$1(agentsDir)) return jsonResponse([]);
44626
- const agentNames = (await readdir(agentsDir)).filter((name) => name.startsWith("agent-") || name.startsWith("planning-") || name.startsWith("specialist-"));
44627
- const liveSessions = new Set(await Effect.runPromise(listSessionNames()));
44628
- return jsonResponse((await Promise.all(agentNames.map(async (name) => {
44629
- const stateFile = getAgentStateFilePath(name);
44630
- const healthFile = join(agentsDir, name, "health.json");
44631
- const healthStatus = await Effect.runPromise(determineHealthStatus(name, stateFile, liveSessions));
44632
- if (!healthStatus) return null;
44633
- let storedHealth = {
44634
- consecutiveFailures: 0,
44635
- killCount: 0
44636
- };
44637
- try {
44638
- const healthContent = await readFile(healthFile, "utf-8");
44639
- storedHealth = {
44640
- ...storedHealth,
44641
- ...JSON.parse(healthContent)
44642
- };
44643
- } catch {}
44644
- let contextPercent = null;
44645
- try {
44646
- const ctxContent = await readFile(join(agentsDir, name, "context-pct"), "utf-8");
44647
- contextPercent = parseInt(ctxContent.trim(), 10) || null;
44648
- } catch {}
44649
- return {
44650
- agentId: name,
44651
- status: healthStatus.status,
44652
- reason: healthStatus.reason,
44653
- lastPing: (/* @__PURE__ */ new Date()).toISOString(),
44654
- consecutiveFailures: storedHealth.consecutiveFailures,
44655
- killCount: storedHealth.killCount,
44656
- contextPercent
44657
- };
44658
- }))).filter((agent) => agent !== null));
44659
- } catch (error) {
44660
- console.error("Error fetching health:", error);
44661
- return jsonResponse([]);
44662
- }
44663
44792
  }));
44664
44793
  const postHealthAgentPingRoute = HttpRouter.add("POST", "/api/health/agents/:id/ping", Effect.gen(function* () {
44665
44794
  const request = yield* HttpServerRequest.HttpServerRequest;
@@ -44681,7 +44810,7 @@ const postHealthAgentPingRoute = HttpRouter.add("POST", "/api/health/agents/:id/
44681
44810
  }
44682
44811
  });
44683
44812
  }));
44684
- const healthRouteLayer$1 = Layer.mergeAll(getSystemHealthRoute, getGodviewSystemHealthRoute, getHealthAgentsRoute, postHealthAgentPingRoute);
44813
+ const healthRouteLayer$1 = Layer.mergeAll(getSystemHealthRoute, getGodviewSystemHealthRoute, getDeployStalenessRoute, getHealthAgentsRoute, postHealthAgentPingRoute);
44685
44814
  //#endregion
44686
44815
  //#region routes/misc/deacon.ts
44687
44816
  init_control_settings();
@@ -44812,7 +44941,7 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
44812
44941
  const remoteState = loadRemoteAgentState(sessionName);
44813
44942
  const isRemote = !!remoteState;
44814
44943
  const vmName = remoteState?.vmName ?? "";
44815
- const { getAgentStateSync } = await import("./agents-Czz6R57Z.js");
44944
+ const { getAgentStateSync } = await import("./agents-DyHKlq1I.js");
44816
44945
  const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
44817
44946
  let tmuxSessionAlive = false;
44818
44947
  if (!isRemote) try {
@@ -44954,8 +45083,9 @@ ${message}
44954
45083
  Continue the PLANNING session. Do NOT implement anything.
44955
45084
  `);
44956
45085
  const agentCwd = workspacePath;
45086
+ const harnessLaunch = await prepareHarnessLaunch("claude-code");
44957
45087
  if (existsSync$1(outputFile)) await rename(outputFile, join(planningDir, `output-${Date.now()}.jsonl`));
44958
- const { getAgentCommandSync } = await import("./settings-BaPXXJsT.js");
45088
+ const { getAgentCommandSync } = await import("./settings-BlUsVaUc.js");
44959
45089
  let msgPlanningModel = "claude-sonnet-5";
44960
45090
  try {
44961
45091
  msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
@@ -44969,6 +45099,7 @@ Continue the PLANNING session. Do NOT implement anything.
44969
45099
  role: "plan",
44970
45100
  workingDir: agentCwd,
44971
45101
  baseCommand: msgCmdWithArgs,
45102
+ extraEnvExports: [harnessLaunch.pathExport],
44972
45103
  appendSystemPromptFiles: await claudePlanningSystemPromptFiles(agentCwd),
44973
45104
  promptInline: `Please read the continuation prompt at ${continuationPromptPath} and continue the planning session.`
44974
45105
  }), { mode: 493 });
@@ -45076,7 +45207,7 @@ async function getIndexStats(rootPath, isMain) {
45076
45207
  }
45077
45208
  const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
45078
45209
  try {
45079
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BJA7TkqS.js");
45210
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
45080
45211
  const projectRoot = process.cwd();
45081
45212
  const venvPath = join(projectRoot, ".venv");
45082
45213
  const results = [];
@@ -45121,7 +45252,7 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
45121
45252
  }));
45122
45253
  const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
45123
45254
  try {
45124
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BJA7TkqS.js");
45255
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
45125
45256
  const projectRoot = process.cwd();
45126
45257
  const venvPath = join(projectRoot, ".venv");
45127
45258
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -45138,7 +45269,7 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
45138
45269
  }));
45139
45270
  const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
45140
45271
  try {
45141
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BJA7TkqS.js");
45272
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
45142
45273
  const projectRoot = process.cwd();
45143
45274
  const venvPath = join(projectRoot, ".venv");
45144
45275
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -45155,7 +45286,7 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
45155
45286
  }));
45156
45287
  const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
45157
45288
  try {
45158
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BJA7TkqS.js");
45289
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
45159
45290
  const enabled = isTldrEnabledSync();
45160
45291
  const projectRoot = process.cwd();
45161
45292
  const targets = [];
@@ -45343,7 +45474,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
45343
45474
  const version = await getOverdeckVersion();
45344
45475
  let supervisorUrl = null;
45345
45476
  try {
45346
- const { getSupervisorUrlSync } = await import("./supervisor-Qy1QecAs.js");
45477
+ const { getSupervisorUrlSync } = await import("./supervisor-COVHrBTg.js");
45347
45478
  supervisorUrl = getSupervisorUrlSync();
45348
45479
  } catch {}
45349
45480
  return jsonResponse({
@@ -45353,11 +45484,11 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
45353
45484
  });
45354
45485
  }));
45355
45486
  const getPrerequisitesRoute = HttpRouter.add("GET", "/api/prerequisites", Effect.promise(async () => {
45356
- const { checkSystemPrerequisites } = await import("./system-prerequisites-DkoQBn1q.js");
45487
+ const { checkSystemPrerequisites } = await import("./system-prerequisites-DSXBvffY.js");
45357
45488
  return jsonResponse(await checkSystemPrerequisites());
45358
45489
  }));
45359
45490
  const getSetupDiagnosticsRoute = HttpRouter.add("GET", "/api/diagnostics/setup", Effect.promise(async () => {
45360
- const { collectSetupDiagnostics } = await import("./system-prerequisites-DkoQBn1q.js");
45491
+ const { collectSetupDiagnostics } = await import("./system-prerequisites-DSXBvffY.js");
45361
45492
  return jsonResponse(await collectSetupDiagnostics(await getOverdeckVersion()));
45362
45493
  }));
45363
45494
  const getSyncStatusRoute = HttpRouter.add("GET", "/api/sync-status", Effect.sync(() => {
@@ -45537,7 +45668,7 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
45537
45668
  const projectPath = await getProjectPath(issuePrefix);
45538
45669
  const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
45539
45670
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
45540
- const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-Bi_oIMtF.js");
45671
+ const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-D4X_s3fA.js");
45541
45672
  const config = {
45542
45673
  issueId,
45543
45674
  workspacePath,
@@ -45567,7 +45698,7 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
45567
45698
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
45568
45699
  const ghConfig = getGitHubConfig();
45569
45700
  if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
45570
- const { runObserverCycle } = await import("./shadow-engineering-Bi_oIMtF.js");
45701
+ const { runObserverCycle } = await import("./shadow-engineering-D4X_s3fA.js");
45571
45702
  const firstRepo = ghConfig.repos[0];
45572
45703
  const config = {
45573
45704
  issueId,
@@ -48735,7 +48866,7 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
48735
48866
  let mergeState;
48736
48867
  let isDraft;
48737
48868
  let checksFailed;
48738
- const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-CeSVFL6C.js");
48869
+ const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-CU14oYzP.js");
48739
48870
  if (isGitHubAppConfigured()) {
48740
48871
  const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
48741
48872
  mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
@@ -48884,8 +49015,8 @@ async function handlePullRequestPromise(payload) {
48884
49015
  bumpIssuePrTabCacheGeneration(issueId);
48885
49016
  const repo = payload.repository.full_name;
48886
49017
  if (payload.action === "closed" && pr.merged === true) try {
48887
- const { postMergeLifecycle } = await import("./merge-agent-CnORPiri.js");
48888
- const { resolveProjectFromIssueSync } = await import("./projects-IRHJIPYC.js");
49018
+ const { postMergeLifecycle } = await import("./merge-agent-B-SnXOoc.js");
49019
+ const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
48889
49020
  const project = resolveProjectFromIssueSync(issueId);
48890
49021
  if (project) {
48891
49022
  const branchName = pr.head.ref;
@@ -50281,7 +50412,7 @@ async function registerProjectFromPath(opts) {
50281
50412
  registerProjectSync(key, projectConfig);
50282
50413
  const seededContextLayer = ensureProjectLayer(fullPath);
50283
50414
  try {
50284
- const { preTrustDirectorySync } = await import("./workspace-manager-CcujONCR.js");
50415
+ const { preTrustDirectorySync } = await import("./workspace-manager-B1WOfKvB.js");
50285
50416
  preTrustDirectorySync(fullPath);
50286
50417
  } catch {}
50287
50418
  let hooksInstalled = 0;
@@ -50311,6 +50442,7 @@ init_issue_id();
50311
50442
  init_tmux();
50312
50443
  init_concurrency$1();
50313
50444
  init_read_model();
50445
+ init_src();
50314
50446
  init_agents$1();
50315
50447
  init_pan_dir();
50316
50448
  init_io();
@@ -50318,7 +50450,7 @@ init_specs();
50318
50450
  init_paths();
50319
50451
  const execAsync$2 = promisify(exec);
50320
50452
  async function getIssueDataService() {
50321
- const { getSharedIssueService } = await import("./issue-service-singleton-D5EB5eYr.js");
50453
+ const { getSharedIssueService } = await import("./issue-service-singleton-DBZabEl7.js");
50322
50454
  return getSharedIssueService();
50323
50455
  }
50324
50456
  /** Returns true if the path exists (any type). */
@@ -50733,7 +50865,7 @@ async function fetchProjectSessionTree(projectKey, sharedContext) {
50733
50865
  })), 15));
50734
50866
  features.push(...results.filter((f) => f !== null));
50735
50867
  }
50736
- features.sort((a, b) => a.issueId.localeCompare(b.issueId));
50868
+ features.sort((a, b) => compareIssueIds(a.issueId, b.issueId));
50737
50869
  return {
50738
50870
  projectKey,
50739
50871
  features
@@ -50775,7 +50907,7 @@ const getProjectReleaseStatusRoute = HttpRouter.add("GET", "/api/projects/:proje
50775
50907
  const projectKey = (yield* HttpRouter.params)["projectKey"] ?? "";
50776
50908
  return jsonResponse(yield* Effect.tryPromise({
50777
50909
  try: async () => {
50778
- const { fetchProjectReleaseStatus } = await import("./project-pipelines-B59NfN44.js");
50910
+ const { fetchProjectReleaseStatus } = await import("./project-pipelines-CtNG_rvs.js");
50779
50911
  return fetchProjectReleaseStatus(projectKey);
50780
50912
  },
50781
50913
  catch: (err) => new Error(err instanceof Error ? err.message : String(err))
@@ -51590,6 +51722,35 @@ async function checkCommand(cmd, args = ["--version"]) {
51590
51722
  return false;
51591
51723
  }
51592
51724
  }
51725
+ const LINUX_PACKAGE_MANAGERS = [
51726
+ "pacman",
51727
+ "dnf",
51728
+ "zypper",
51729
+ "apk",
51730
+ "apt-get"
51731
+ ];
51732
+ async function detectLinuxPackageManager(commandAvailable = checkCommand) {
51733
+ for (const packageManager of LINUX_PACKAGE_MANAGERS) if (await commandAvailable(packageManager)) return packageManager;
51734
+ return null;
51735
+ }
51736
+ function getLinuxInstallCommand(tool, packageManager) {
51737
+ switch (packageManager) {
51738
+ case "pacman": return `sudo pacman -S --noconfirm ${tool}`;
51739
+ case "dnf": return `sudo dnf install -y ${tool}`;
51740
+ case "zypper": return `sudo zypper install -y ${tool}`;
51741
+ case "apk": return `sudo apk add ${tool}`;
51742
+ case "apt-get": return `sudo apt-get update && sudo apt-get install -y ${tool}`;
51743
+ }
51744
+ }
51745
+ function getLinuxManualInstallHint(tool, packageManager) {
51746
+ if (packageManager) return getLinuxInstallCommand(tool, packageManager);
51747
+ return `${tool} — download from ${tool === "jq" ? "https://jqlang.github.io/jq/download/" : "https://github.com/tmux/tmux/wiki/Installing"}`;
51748
+ }
51749
+ async function installLinuxPackage(tool) {
51750
+ const packageManager = await detectLinuxPackageManager();
51751
+ if (!packageManager) throw new Error(`No supported Linux package manager found. Install ${getLinuxManualInstallHint(tool, null)}`);
51752
+ await execAsync$1(getLinuxInstallCommand(tool, packageManager), { timeout: 12e4 });
51753
+ }
51593
51754
  async function isToolInstalled(tool) {
51594
51755
  if (tool === "docker") return checkCommand("docker", ["info"]);
51595
51756
  if (tool === "traefik") try {
@@ -51632,7 +51793,7 @@ async function installTool(tool) {
51632
51793
  }
51633
51794
  async function installTmux() {
51634
51795
  if (await Effect.runPromise(detectPlatform()) === "darwin") await execAsync$1("brew install tmux", { timeout: 12e4 });
51635
- else await execAsync$1("sudo apt-get update && sudo apt-get install -y tmux", { timeout: 12e4 });
51796
+ else await installLinuxPackage("tmux");
51636
51797
  return {
51637
51798
  tool: "tmux",
51638
51799
  success: true,
@@ -51682,7 +51843,7 @@ async function installMkcert() {
51682
51843
  }
51683
51844
  async function installJq() {
51684
51845
  if (await Effect.runPromise(detectPlatform()) === "darwin") await execAsync$1("brew install jq", { timeout: 12e4 });
51685
- else await execAsync$1("sudo apt-get update && sudo apt-get install -y jq", { timeout: 12e4 });
51846
+ else await installLinuxPackage("jq");
51686
51847
  return {
51687
51848
  tool: "jq",
51688
51849
  success: true,
@@ -52417,7 +52578,7 @@ function getCheckpointWorker() {
52417
52578
  return worker;
52418
52579
  }
52419
52580
  async function runInline(operation, payload) {
52420
- const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-DwZqT2qQ.js");
52581
+ const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-B5jFNi2G.js");
52421
52582
  switch (operation) {
52422
52583
  case "claimTranscriptRange": return claimTranscriptRange(payload);
52423
52584
  case "commitTranscriptRange": return commitTranscriptRange(payload);
@@ -53571,7 +53732,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
53571
53732
  };
53572
53733
  }
53573
53734
  async function emitMemoryObservationCreated(observation, timestamp) {
53574
- const { initEventStore } = await import("./event-store-DABarGNz.js");
53735
+ const { initEventStore } = await import("./event-store-CpBGsO6_.js");
53575
53736
  await (await initEventStore()).appendAsync({
53576
53737
  type: "memory.observation_created",
53577
53738
  timestamp,
@@ -56583,7 +56744,7 @@ async function getFlywheelConversationPayload() {
56583
56744
  };
56584
56745
  }
56585
56746
  async function postFlywheelReportPayload() {
56586
- const { flywheelReportCommand } = await import("./flywheel-DPUc8r3V.js");
56747
+ const { flywheelReportCommand } = await import("./flywheel-6WHU4O7A.js");
56587
56748
  await flywheelReportCommand({ cwd: process.cwd() });
56588
56749
  return {
56589
56750
  status: 200,
@@ -56741,11 +56902,11 @@ const getMergeBlockersRoute = HttpRouter.add("GET", "/api/flywheel/merge-blocker
56741
56902
  async function defaultGetOrderedIssueIds() {
56742
56903
  const status = await readCurrentFlywheelStatusForDashboard();
56743
56904
  if (!status) return [];
56744
- const { computeMergeQueue } = await import("./flywheel-merge-order-CeBuX0EJ.js");
56905
+ const { computeMergeQueue } = await import("./flywheel-merge-order-CNKAY489.js");
56745
56906
  return (await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd()).pipe(Effect.provide(layer)))).map((i) => i.issueId);
56746
56907
  }
56747
56908
  async function defaultMergeOne(issueId) {
56748
- const { triggerMerge } = await import("./merge-ops-BpTtuO8x.js");
56909
+ const { triggerMerge } = await import("./merge-ops-DwWCkSgo.js");
56749
56910
  const r = await triggerMerge(issueId);
56750
56911
  return r.success ? { ok: true } : {
56751
56912
  ok: false,
@@ -56765,7 +56926,7 @@ async function postFlywheelMergeNextPayload(payload, deps = {}) {
56765
56926
  body: { error: "n must be a positive integer" }
56766
56927
  };
56767
56928
  const issueIds = (await (deps.getOrderedIssueIds ?? defaultGetOrderedIssueIds)()).slice(0, n);
56768
- const { shipMergeBatch } = await import("./merge-batch-C2w2U2eK.js");
56929
+ const { shipMergeBatch } = await import("./merge-batch-Byt-QnEl.js");
56769
56930
  return {
56770
56931
  status: 200,
56771
56932
  body: { outcomes: await shipMergeBatch(issueIds, { merge: deps.merge ?? defaultMergeOne }) }
@@ -56922,7 +57083,7 @@ const getFlywheelMergeQueueRoute = HttpRouter.add("GET", "/api/flywheel/merge-qu
56922
57083
  return yield* Effect.promise(async () => {
56923
57084
  const status = await readCurrentFlywheelStatusForDashboard();
56924
57085
  if (!status) return jsonResponse([]);
56925
- const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-CeBuX0EJ.js");
57086
+ const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-CNKAY489.js");
56926
57087
  return jsonResponse(await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd(), { getPrUrl: resolveMergeQueuePrUrl }).pipe(Effect.provide(layer))));
56927
57088
  });
56928
57089
  })));
@@ -56936,18 +57097,18 @@ function uatGenerationNameFromParam(param) {
56936
57097
  return decoded.startsWith("uat/") ? decoded : `uat/${decoded}`;
56937
57098
  }
56938
57099
  const getUatGenerationsRoute = HttpRouter.add("GET", "/api/flywheel/uat-generations", httpHandler(Effect.gen(function* () {
56939
- const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-Wismge7h.js"));
57100
+ const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
56940
57101
  return jsonResponse(yield* Effect.promise(() => getUatGenerationsPayload()));
56941
57102
  })));
56942
57103
  const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
56943
- const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-Wismge7h.js"));
57104
+ const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
56944
57105
  return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
56945
57106
  })));
56946
57107
  const postUatGenerationStackRoute = HttpRouter.add("POST", "/api/flywheel/uat-generations/:name/stack", httpHandler(Effect.gen(function* () {
56947
57108
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
56948
57109
  if (authError) return authError;
56949
57110
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
56950
- const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-Wismge7h.js"));
57111
+ const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
56951
57112
  const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
56952
57113
  if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
56953
57114
  return jsonResponse({
@@ -56959,8 +57120,8 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
56959
57120
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
56960
57121
  if (authError) return authError;
56961
57122
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
56962
- const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-Wismge7h.js"));
56963
- const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-D0VBf8g_.js"));
57123
+ const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
57124
+ const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-D0gGXMZx.js"));
56964
57125
  const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle));
56965
57126
  if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
56966
57127
  return jsonResponse(result);
@@ -56973,7 +57134,7 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
56973
57134
  const postFlywheelAssembleUatRoute = HttpRouter.add("POST", "/api/flywheel/assemble-uat", httpHandler(Effect.gen(function* () {
56974
57135
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
56975
57136
  if (authError) return authError;
56976
- const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-Wismge7h.js"));
57137
+ const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
56977
57138
  return jsonResponse(yield* Effect.promise(() => runUatTrainReconcile({ force: true })));
56978
57139
  })));
56979
57140
  const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
@@ -60646,7 +60807,7 @@ async function pollOnce(state) {
60646
60807
  try {
60647
60808
  const remoteState = await readFile(join(homedir$1(), ".overdeck", "agents", agentId, "remote-state.json"), "utf-8").then((text) => JSON.parse(text)).catch(() => null);
60648
60809
  if (remoteState?.location === "remote" && remoteState?.vmName) {
60649
- const { getRemoteAgentOutput } = await import("./remote-agents-BNORDWAX.js");
60810
+ const { getRemoteAgentOutput } = await import("./remote-agents-D6O_zETW.js");
60650
60811
  stdout = await getRemoteAgentOutput(agentId, remoteState.vmName, 50);
60651
60812
  } else stdout = await Effect.runPromise(capturePane(agentId, 50));
60652
60813
  } catch {
@@ -61852,7 +62013,7 @@ const RESTART_MARKER = join$1(homedir(), ".overdeck", "dashboard-restarting.json
61852
62013
  * loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
61853
62014
  */
61854
62015
  async function defaultLifecycleRunner(pending) {
61855
- const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-CnORPiri.js");
62016
+ const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-B-SnXOoc.js");
61856
62017
  await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
61857
62018
  if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
61858
62019
  }
@@ -62173,7 +62334,7 @@ function failureReason(result) {
62173
62334
  return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
62174
62335
  }
62175
62336
  async function defaultMergeIssue(issueId) {
62176
- const { triggerMerge } = await import("./merge-ops-BpTtuO8x.js");
62337
+ const { triggerMerge } = await import("./merge-ops-DwWCkSgo.js");
62177
62338
  return triggerMerge(issueId);
62178
62339
  }
62179
62340
  function defaultAnnounceFailure(issueId, reason) {
@@ -62401,24 +62562,27 @@ init_projects();
62401
62562
  init_state_home();
62402
62563
  const execFileAsync = promisify(execFile);
62403
62564
  const inFlight = /* @__PURE__ */ new Map();
62404
- async function pathIsGitWorkTree(path) {
62565
+ async function pathIsGitWorkTree(path, signal) {
62405
62566
  try {
62567
+ signal?.throwIfAborted();
62406
62568
  const { stdout } = await execFileAsync("git", ["rev-parse", "--is-inside-work-tree"], {
62407
62569
  cwd: path,
62408
62570
  encoding: "utf8",
62409
- timeout: 15e3
62571
+ timeout: 15e3,
62572
+ signal
62410
62573
  });
62411
62574
  return stdout.trim() === "true";
62412
62575
  } catch {
62576
+ signal?.throwIfAborted();
62413
62577
  return false;
62414
62578
  }
62415
62579
  }
62416
62580
  const defaultDependencies = {
62417
62581
  inspect: inspectStateMigration,
62418
62582
  ensureWorktree: ensureStateWorktree,
62419
- migrate: async (projectKey, project) => {
62420
- const { migrateProjectState } = await import("./state-migrate-_zJJ6XKE.js");
62421
- await migrateProjectState(projectKey, {}, project);
62583
+ migrate: async (projectKey, project, signal) => {
62584
+ const { migrateProjectState } = await import("./state-migrate-BeBW0KXA.js");
62585
+ await migrateProjectState(projectKey, { signal }, project);
62422
62586
  },
62423
62587
  clearCache: clearStateMigrationCache,
62424
62588
  isGitWorkTree: pathIsGitWorkTree
@@ -62445,16 +62609,19 @@ function blocked(projectKey, error) {
62445
62609
  function worktreeBlockReason(status) {
62446
62610
  return `The canonical overdeck-state worktree is ${status.status}: ${status.detail}`;
62447
62611
  }
62448
- async function reconcile(projectKey, project, dependencies) {
62612
+ async function reconcile(projectKey, project, dependencies, signal) {
62449
62613
  try {
62450
- if (!(await dependencies.inspect(project)).migrated) {
62614
+ if (!(await dependencies.inspect(project, { signal })).migrated) {
62451
62615
  const { repoPath } = resolveInfraRepo(project);
62452
- if (!await dependencies.isGitWorkTree(repoPath)) return blocked(projectKey, describeUnmigratableProjectPath(projectKey, project, repoPath));
62453
- await dependencies.migrate(projectKey, project);
62616
+ if (!await dependencies.isGitWorkTree(repoPath, signal)) return blocked(projectKey, describeUnmigratableProjectPath(projectKey, project, repoPath));
62617
+ await dependencies.migrate(projectKey, project, signal);
62454
62618
  dependencies.clearCache();
62455
- if (!(await dependencies.inspect(project)).migrated) return blocked(projectKey, "Migration completed without a valid marker on origin/overdeck-state.");
62619
+ if (!(await dependencies.inspect(project, { signal })).migrated) return blocked(projectKey, "Migration completed without a valid marker on origin/overdeck-state.");
62456
62620
  }
62457
- const worktree = await dependencies.ensureWorktree(project, { projectKey });
62621
+ const worktree = await dependencies.ensureWorktree(project, {
62622
+ projectKey,
62623
+ signal
62624
+ });
62458
62625
  if (worktree.status === "dirty" || worktree.status === "error") return blocked(projectKey, worktreeBlockReason(worktree));
62459
62626
  if (worktree.status === "legacy") return blocked(projectKey, "The remote migration marker is valid but the local state worktree still resolves to the legacy project checkout.");
62460
62627
  return {
@@ -62463,6 +62630,7 @@ async function reconcile(projectKey, project, dependencies) {
62463
62630
  worktree: worktree.status
62464
62631
  };
62465
62632
  } catch (error) {
62633
+ signal.throwIfAborted();
62466
62634
  return blocked(projectKey, error);
62467
62635
  }
62468
62636
  }
@@ -62471,12 +62639,39 @@ async function reconcile(projectKey, project, dependencies) {
62471
62639
  * state. Concurrent dashboard/CLI callers on this process share one attempt;
62472
62640
  * the migration command supplies the cross-process lock and no-loss gates.
62473
62641
  */
62474
- function ensureAutomaticStateMigration(projectKey, project, dependencies = defaultDependencies) {
62475
- const existing = inFlight.get(projectKey);
62476
- if (existing) return existing;
62477
- const task = reconcile(projectKey, project, dependencies).finally(() => inFlight.delete(projectKey));
62478
- inFlight.set(projectKey, task);
62479
- return task;
62642
+ function ensureAutomaticStateMigration(projectKey, project, dependencies = defaultDependencies, signal) {
62643
+ signal?.throwIfAborted();
62644
+ let entry = inFlight.get(projectKey);
62645
+ if (!entry) {
62646
+ const controller = new AbortController();
62647
+ const task = reconcile(projectKey, project, dependencies, controller.signal).finally(() => inFlight.delete(projectKey));
62648
+ entry = {
62649
+ controller,
62650
+ persistentOwner: signal === void 0,
62651
+ waiters: /* @__PURE__ */ new Map(),
62652
+ task
62653
+ };
62654
+ inFlight.set(projectKey, entry);
62655
+ } else if (!signal) entry.persistentOwner = true;
62656
+ if (!signal) return entry.task;
62657
+ const token = Symbol(projectKey);
62658
+ entry.waiters.set(token, false);
62659
+ const maybeAbortSharedMigration = () => {
62660
+ entry?.waiters.set(token, true);
62661
+ if (!entry?.persistentOwner && [...entry.waiters.values()].every(Boolean)) entry.controller.abort(signal.reason);
62662
+ };
62663
+ signal.addEventListener("abort", maybeAbortSharedMigration, { once: true });
62664
+ if (signal.aborted) maybeAbortSharedMigration();
62665
+ return entry.task.then((result) => {
62666
+ signal.throwIfAborted();
62667
+ return result;
62668
+ }, (error) => {
62669
+ signal.throwIfAborted();
62670
+ throw error;
62671
+ }).finally(() => {
62672
+ signal.removeEventListener("abort", maybeAbortSharedMigration);
62673
+ entry?.waiters.delete(token);
62674
+ });
62480
62675
  }
62481
62676
  function formatAutomaticStateMigrationBlock(result) {
62482
62677
  return `State migration for ${result.projectKey} is blocked: ${result.reason} Overdeck will not start pipeline work because that would write permanent state into the legacy project checkout. Resolve the stated prerequisite, then run "pan sync"; do not commit project-root .pan/ or .beads/ files.`;
@@ -62514,6 +62709,7 @@ function decideDeaconBootGate(migrations) {
62514
62709
  //#region main.ts
62515
62710
  init_issue_service_singleton();
62516
62711
  init_tracker_config();
62712
+ init_internal_token();
62517
62713
  init_review_status();
62518
62714
  init_event_store();
62519
62715
  init_activity_logger();
@@ -62575,7 +62771,7 @@ if (shouldStartStaleCheckRetriggerService()) {
62575
62771
  }
62576
62772
  if (process.env.OVERDECK_MODE === "desktop") (async () => {
62577
62773
  try {
62578
- const { provisionClaudeHooks } = await import("./claude-hooks-provision-CS5W_dhI.js");
62774
+ const { provisionClaudeHooks } = await import("./claude-hooks-provision-BhwWK-TQ.js");
62579
62775
  const result = await provisionClaudeHooks();
62580
62776
  if (!result.ok) console.warn(`[overdeck] Claude hook provisioning skipped: ${result.reason}`);
62581
62777
  else if (result.changed) console.log(`[overdeck] Claude hooks provisioned: ${result.binariesSynced} scripts, registered ${result.registered.length} hook(s)${result.pruned.length ? `, pruned ${result.pruned.length} stale` : ""}`);
@@ -62893,7 +63089,7 @@ const handleShutdownSignal = async (signal) => {
62893
63089
  stopRestartAnnouncer();
62894
63090
  await stopDeaconChild().catch((err) => console.warn("[deacon-supervisor] child shutdown failed:", err?.message ?? err));
62895
63091
  try {
62896
- const { killAllGateProcessGroups } = await import("./validation-CUWamZ4X.js");
63092
+ const { killAllGateProcessGroups } = await import("./validation-DcAgXTQp.js");
62897
63093
  const reaped = killAllGateProcessGroups();
62898
63094
  if (reaped > 0) console.log(`[overdeck] reaped ${reaped} in-flight gate process group(s)`);
62899
63095
  } catch (err) {
@@ -62948,7 +63144,7 @@ reconcileStaleGitHubBlockers().then((n) => {
62948
63144
  }
62949
63145
  }).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
62950
63146
  try {
62951
- const { resetProcessingToQueued } = await import("./merge-sync-CpGA9Kg7.js");
63147
+ const { resetProcessingToQueued } = await import("./merge-sync-B95_4in_.js");
62952
63148
  const resetCount = resetProcessingToQueued();
62953
63149
  if (resetCount > 0) {
62954
63150
  console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);
@@ -62970,7 +63166,7 @@ else {
62970
63166
  console.log("[overdeck] Auto-merge executor started");
62971
63167
  }
62972
63168
  try {
62973
- const { reconcileInterruptedVerifications } = await import("./verification-runner-Dcksl_P-.js");
63169
+ const { reconcileInterruptedVerifications } = await import("./verification-runner-DlJezzef.js");
62974
63170
  const interrupted = reconcileInterruptedVerifications();
62975
63171
  if (interrupted > 0) console.log(`[overdeck] recovered ${interrupted} orphaned verification worker(s)`);
62976
63172
  } catch (err) {