@overdeck/desktop 0.45.22 → 0.45.23

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 (375) hide show
  1. package/package.json +1 -1
  2. package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DOA0KgXx.js} +5 -5
  3. package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BBu6DSNm.js} +6 -6
  4. package/server/{agent-gc-Dj2gncak.js → agent-gc-BV1q_2EV.js} +4 -4
  5. package/server/agent-state-Bg0lhqwj.js +3 -0
  6. package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-CnzFKSAQ.js} +1 -1
  7. package/server/{agent-state-service-DistflNn.js → agent-state-service-HoK8U4jW.js} +5 -5
  8. package/server/{agents-DXdHmRTC.js → agents-B4Bjbkfv.js} +4 -4
  9. package/server/agents-FlIgQ3ql.js +3 -0
  10. package/server/{archive-planning-BvDuWNMo.js → archive-planning-DYrYojxl.js} +30 -6
  11. package/server/{archive-planning-Cp_DC1j-.js → archive-planning-zkJb3BeM.js} +1 -1
  12. package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-C-xy7Z5v.js} +2 -2
  13. package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-GtG71X8H.js} +3 -3
  14. package/server/{behavior-CGj16clS.js → behavior-B_-4EKF3.js} +2 -2
  15. package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-DWdW7vUm.js} +2 -2
  16. package/server/{build-info-NU3KbXYw.js → build-info-BT096lEl.js} +3 -3
  17. package/server/{build-info-BRpqQvNd.js → build-info-DgTqZkL5.js} +1 -1
  18. package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-B7Bt29J0.js} +1 -1
  19. package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-DDqcGyu8.js} +2 -2
  20. package/server/checkpoint-worker.js +1 -1
  21. package/server/{checkpoints-BJum14fs.js → checkpoints-C-AXLfYT.js} +2 -2
  22. package/server/{checkpoints-B5jFNi2G.js → checkpoints-CpgCjAlN.js} +1 -1
  23. package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-C8wdRnN1.js} +1 -1
  24. package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-but-_qGY.js} +2 -2
  25. package/server/{claude-permissions-nSFKH78M.js → claude-permissions-H_5wHQZQ.js} +2 -2
  26. package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-BTENVmYf.js} +1 -1
  27. package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CbSz0Dvb.js} +2 -2
  28. package/server/cli-BsVIHwzC.js +3 -0
  29. package/server/{cli-CbKNkFE5.js → cli-vBeXbPrq.js} +9 -9
  30. package/server/{cliproxy-Brf_5MuG.js → cliproxy-Bgb2XCqi.js} +2 -2
  31. package/server/{cliproxy-bONZDBbC.js → cliproxy-DW0V86F8.js} +1 -1
  32. package/server/{close-issue-CxReRxIc.js → close-issue-Dn_4c4G8.js} +5 -5
  33. package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CWpY2uBw.js} +1 -1
  34. package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-hANY_ehE.js} +9 -9
  35. package/server/codex-Dg7Is5yb.js +3 -0
  36. package/server/{codex-CbmztVcc.js → codex-TmSi-yTv.js} +27 -8
  37. package/server/{codex-parser-jl8AeAmB.js → codex-parser-C4gSH-IR.js} +2 -2
  38. package/server/{config-q4Gvd8dq.js → config-CCvjQf27.js} +2 -2
  39. package/server/{config-BJKocXKd.js → config-DUIhMN_T.js} +1 -1
  40. package/server/{config-DeTsoZdR.js → config-DjLOdbgT.js} +2 -2
  41. package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DvyMuOle.js} +55 -186
  42. package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BSJkNTdp.js} +1 -1
  43. package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-CmrYpa47.js} +3 -3
  44. package/server/{context-layers-DlQKkHH2.js → context-layers-B3Nt58jl.js} +2 -2
  45. package/server/{context-layers-15gDOk20.js → context-layers-ZYFcWiyc.js} +3 -3
  46. package/server/{control-settings-D_odMIaC.js → control-settings-aP1ANIlI.js} +4 -4
  47. package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CNbTLB86.js} +8 -8
  48. package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-DiG5zWQq.js} +1 -1
  49. package/server/{conversation-service-C3avRVEr.js → conversation-service-Du-MTNpJ.js} +6 -6
  50. package/server/{conversation-service-Dq33SYEj.js → conversation-service-Up7FEzIC.js} +1 -1
  51. package/server/{conversations-H9if0bCQ.js → conversations-6mPANqvL.js} +1 -1
  52. package/server/{conversations-bYpM9-kZ.js → conversations-DbOs1e9Q.js} +4 -4
  53. package/server/{cost-wH46-WsJ.js → cost-CW4WSe72.js} +3 -3
  54. package/server/{cost-Codk1pc2.js → cost-Ca0YTWDw.js} +18 -2
  55. package/server/{cost-sync-D_cre6WM.js → cost-sync-C0VdGme1.js} +3 -3
  56. package/server/{dag-CJpgf9A3.js → dag-CdOjJVDT.js} +9 -9
  57. package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-CT-IypG3.js} +1 -1
  58. package/server/dashboard-db-worker.js +7 -7
  59. package/server/{deacon-B8HbQdqU.js → deacon-DYSEJb48.js} +3 -3
  60. package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-Bjg8U4Y9.js} +3 -3
  61. package/server/{deacon-CkT_kznS.js → deacon-pRnyD5w9.js} +266 -577
  62. package/server/deacon-swarm-9jRLS5Ke.js +2 -0
  63. package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-DftYRDo8.js} +17 -17
  64. package/server/deacon.js +8 -8
  65. package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-Bjsho_ha.js} +136 -19
  66. package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-CM6W1-c6.js} +1 -1
  67. package/server/{deploy-window-wDf4UgHt.js → deploy-window-DeP_OIRk.js} +77 -10
  68. package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-BpMoHlkR.js} +2 -2
  69. package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-CtUgrVKW.js} +3 -3
  70. package/server/dist-Bd3vn0Hw.js +3 -0
  71. package/server/{dist-D-Ed5yVw.js → dist-DyRx4cI7.js} +1 -1
  72. package/server/{docker-BCZ89M9X.js → docker-BK7HIcBj.js} +2 -2
  73. package/server/{dod-DbJLYcHv.js → dod-BrSfUHm0.js} +1 -1
  74. package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-DRqaAkBR.js} +1 -1
  75. package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DseivYEy.js} +4 -4
  76. package/server/{esm-shims-dTeNdq7X.js → esm-shims-CbI3BVkl.js} +1 -1
  77. package/server/{event-store-CpBGsO6_.js → event-store-Cr5PQwFC.js} +1 -1
  78. package/server/{event-store-TnWdydfB.js → event-store-tdiY5eDZ.js} +3 -3
  79. package/server/{events-DSUdR-04.js → events-CC1dgUpx.js} +3 -3
  80. package/server/{events-Dsuv6qyB.js → events-CvvGK6LT.js} +1 -1
  81. package/server/{factory-BMrK4TrE.js → factory-CynerjXO.js} +50 -13
  82. package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-B0pmAz0a.js} +4 -4
  83. package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-_wUBRD3J.js} +2 -2
  84. package/server/{features-Bc-Bmiye.js → features-Dhxz-wLc.js} +2 -2
  85. package/server/{feedback-target-DZ-iAnAa.js → feedback-target-CPS15Vte.js} +7 -7
  86. package/server/{feedback-target-DS6NUuSs.js → feedback-target-iygZwmMc.js} +1 -1
  87. package/server/{feedback-writer-BXP6g75N.js → feedback-writer-C9b6ccN1.js} +6 -5
  88. package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-qmiMbqTZ.js} +1 -1
  89. package/server/{flywheel-Ctr5uuvo.js → flywheel-DMCUzDWg.js} +1 -1
  90. package/server/{flywheel-COR0mbRI.js → flywheel-DSSpWmqF.js} +13 -13
  91. package/server/{flywheel-6WHU4O7A.js → flywheel-DcBkQvgE.js} +14 -14
  92. package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-C-6zRLvM.js} +1 -1
  93. package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-DxbQKE1d.js} +8 -8
  94. package/server/forge-B-ZWyTRm.js +2 -0
  95. package/server/{forge-B1S_KZv4.js → forge-Ch9gCFod.js} +2 -2
  96. package/server/{from-DpwQ-sc3.js → from-CJ_aH5jD.js} +1 -1
  97. package/server/{fts-db-DmAcuCkV.js → fts-db-CKgg0VKg.js} +2 -2
  98. package/server/{fts-operations-7d_RkmWp.js → fts-operations-BrL_VTRr.js} +2 -2
  99. package/server/{git-utils-Cc3FHDKd.js → git-utils-BVa07a4a.js} +2 -2
  100. package/server/{git-utils-CsKGnzFA.js → git-utils-Dry_Ka_D.js} +1 -1
  101. package/server/{github-app-CDPtGF7J.js → github-app-CMBdIFBQ.js} +11 -3
  102. package/server/{github-app-CU14oYzP.js → github-app-CPfoFAdV.js} +1 -1
  103. package/server/{github-client-XjTJbBm7.js → github-client--XVlDpwM.js} +2 -2
  104. package/server/{github-client-CwBZZ3t7.js → github-client-B4QsdE-X.js} +1 -1
  105. package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-BRbDW-qk.js} +2 -2
  106. package/server/{harness-binary-B2CTcD84.js → harness-binary-CVio2m-u.js} +1 -1
  107. package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-qHJBhy3Z.js} +4 -4
  108. package/server/{health-events-DREeevle.js → health-events-C9B8y1Hm.js} +2 -2
  109. package/server/{health-events-C1whmd58.js → health-events-CpfvuVmm.js} +1 -1
  110. package/server/{hooks-yxRsjk-z.js → hooks-DUXw8A0-.js} +2 -2
  111. package/server/{hooks-B-HItBiS.js → hooks-ltecuFqZ.js} +1 -1
  112. package/server/{hume-Dz_OymXE.js → hume-BEq0bUDg.js} +2 -2
  113. package/server/hume-B_DbflNM.js +3 -0
  114. package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-D7w9t3fE.js} +1 -1
  115. package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-w1ISSlhs.js} +2 -2
  116. package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-aQ1IxeI3.js} +2 -2
  117. package/server/{infra-D4iNWMA5.js → infra-CzaSOgul.js} +4 -4
  118. package/server/{injection-D7T75Pye.js → injection-DZ0PfYa4.js} +7 -7
  119. package/server/{injection-BVNa4MQW.js → injection-oNZeoDhL.js} +1 -1
  120. package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-DJKLWcVT.js} +12 -12
  121. package/server/inspect-agent-ch-F-5Ci.js +2 -0
  122. package/server/{internal-token-CXsfxslp.js → internal-token-Bb4XeV2x.js} +2 -2
  123. package/server/{internal-token-C9DdEOKY.js → internal-token-DXdfprGr.js} +1 -1
  124. package/server/{io-DQR9PMgS.js → io-B3_AHDfr.js} +160 -184
  125. package/server/{issue-closed-DtmJM0D0.js → issue-closed-zhdvQicO.js} +7 -7
  126. package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-CreaCkjW.js} +22 -22
  127. package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-Dy4vd0Oa.js} +1 -1
  128. package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-B5ushCvE.js} +8 -8
  129. package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-DabvBWUp.js} +1 -1
  130. package/server/{issues-pDW9VUNz.js → issues-B6ToV6x1.js} +2 -2
  131. package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-Dhflo1SH.js} +3 -3
  132. package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-BKPJm4Hv.js} +3 -3
  133. package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-DdWbHEBu.js} +4 -4
  134. package/server/{launcher-generator-COgR2By1.js → launcher-generator-CHVm7bGT.js} +10 -9
  135. package/server/{layers-Cp1To4L8.js → layers-DzxSTGNA.js} +2 -2
  136. package/server/lifecycle-DfeyBDwA.js +121 -0
  137. package/server/lifecycle-io-Bsnr2K4F.js +3 -0
  138. package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-D8iNBcux.js} +37 -37
  139. package/server/{lifecycle-CtPDcZ9u.js → lifecycle-sycO16hj.js} +6 -6
  140. package/server/{linear-client-DsFkIxee.js → linear-client-D4zqMnX7.js} +2 -2
  141. package/server/{linear-client-YwZMDIwQ.js → linear-client-DqhDQO9k.js} +1 -1
  142. package/server/memory-fts-worker.js +1 -1
  143. package/server/{merge-C1t-bspg.js → merge-C_ZEhbqI.js} +3 -3
  144. package/server/{merge-BwsyNRJV.js → merge-DK23JEdS.js} +1 -1
  145. package/server/{merge-agent-B-SnXOoc.js → merge-agent-BQM3a8z5.js} +1 -1
  146. package/server/{merge-agent-DDiIjzk-.js → merge-agent-XrB80vfT.js} +28 -28
  147. package/server/{merge-batch-Byt-QnEl.js → merge-batch-Bwoyr8Je.js} +1 -1
  148. package/server/{merge-blockers-BYjeXrVN.js → merge-blockers-BsFjGrQ8.js} +2 -2
  149. package/server/merge-ops-DlB1IM0Y.js +2 -0
  150. package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-C1KIVr0s.js} +2 -2
  151. package/server/{merge-set-DiISXcC-.js → merge-set-DLz0MkGT.js} +3 -3
  152. package/server/{merge-set-6LEglm6o.js → merge-set-DnSYdBEp.js} +1 -1
  153. package/server/{merge-sync-Do8_q32h.js → merge-sync-DZ9dojJn.js} +2 -2
  154. package/server/{merge-sync-B95_4in_.js → merge-sync-SSv3E-pl.js} +1 -1
  155. package/server/{merge-train-CKana8EH.js → merge-train-DxDfBTjr.js} +3 -3
  156. package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-CyYQUksx.js} +4 -4
  157. package/server/{merge-verification-CqnUzGEK.js → merge-verification-CSizH3HY.js} +4 -4
  158. package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-Dt8YPN5S.js} +2 -2
  159. package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Cx3K0hHi.js} +11 -8
  160. package/server/node_modules/.package-lock.json +1 -1
  161. package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-BTkDrl4R.js} +1 -1
  162. package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-neK8dHQk.js} +15 -13
  163. package/server/package-lock.json +2 -2
  164. package/server/package.json +1 -1
  165. package/server/{pan-dir-DOcf6ug3.js → pan-dir-DeVUgwA7.js} +78 -58
  166. package/server/{paths-DooHpt9p.js → paths-_zEts6wc.js} +2 -2
  167. package/server/{pickup-CaskQ7j6.js → pickup-Dd0Znxxy.js} +1 -1
  168. package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-0HaEGDlH.js} +186 -67
  169. package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-6iCJplFZ.js} +1 -1
  170. package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-D0ykk59O.js} +2 -2
  171. package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-2sK1apsO.js} +2 -2
  172. package/server/projects-9SkRpES9.js +3 -0
  173. package/server/{prompts-EvhMeeHG.js → prompts-Dp4Tpk39.js} +2 -2
  174. package/server/{providers-DNSQqy2V.js → providers-DKkBXhxU.js} +1 -1
  175. package/server/{providers-BDDPULlp.js → providers-DV7ec8l7.js} +7 -7
  176. package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-CltymLRg.js} +4 -4
  177. package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-D2f6pjgA.js} +1 -1
  178. package/server/public/assets/{dist-Bio7THQU.js → dist-BWR4qFiV.js} +1 -1
  179. package/server/public/assets/{dist-DukGS2YZ.js → dist-DEmlBBNQ.js} +3 -3
  180. package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-DnfiViPK.js} +1 -1
  181. package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-B8Wrmj9H.js} +1 -1
  182. package/server/public/assets/index-CUr1xv8w.css +1 -0
  183. package/server/public/assets/{index-Bwejq-5s.js → index-CsSuZQBI.js} +145 -144
  184. package/server/public/assets/{linear-qUWmMZ-c.js → linear-C9zFQpkX.js} +1 -1
  185. package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +1 -0
  186. package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-lR8H7Yjd.js} +1 -1
  187. package/server/public/assets/{prod-C8VtLuWC.js → prod-B1jCQihw.js} +4 -4
  188. package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-CVQ2guem.js} +1 -1
  189. package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-eD1RB4gm.js} +1 -1
  190. package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-ChEC6dQn.js} +1 -1
  191. package/server/public/index.html +2 -2
  192. package/server/{pull-requests-By_BteaL.js → pull-requests--Ib2jTgy.js} +1 -1
  193. package/server/{pull-requests-8z2N1UOV.js → pull-requests-CXIhdCYD.js} +13 -11
  194. package/server/{queries-ZABd5aXP.js → queries-6d7Cdtm7.js} +693 -104
  195. package/server/{rally-i_goYmiA.js → rally-B708-nZn.js} +3 -3
  196. package/server/{rally-api-DqKqIMNR.js → rally-api-nY0ZANw3.js} +2 -2
  197. package/server/{rally-api-xHazRk0d.js → rally-api-yjQ0TfHd.js} +1 -1
  198. package/server/{rally-client-COYz1vYR.js → rally-client-B1EJhfV0.js} +4 -4
  199. package/server/{rally-client-CGWEHaPd.js → rally-client-CULK2XAY.js} +1 -1
  200. package/server/rally-njs_mJrt.js +3 -0
  201. package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-MWnqdLCJ.js} +1 -1
  202. package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-N3BTkmX_.js} +1 -1
  203. package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-Dp4eLkt4.js} +6 -6
  204. package/server/{rebuild-stack-CKjJAI8L.js → rebuild-stack-kA7XngID.js} +1 -1
  205. package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-uWbZfjms.js} +6 -6
  206. package/server/record-t6V-3Dcj.js +3 -0
  207. package/server/{record-update-D3N6WMFR.js → record-update-DACtKh6_.js} +1 -1
  208. package/server/record-update-Dq0t2uBG.js +310 -0
  209. package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BJtIQuag.js} +2 -2
  210. package/server/{release-engine-DMINVN8S.js → release-engine-DZpmGGzb.js} +5 -5
  211. package/server/{release-set-DeUSOEHy.js → release-set-hnXd_kga.js} +3 -3
  212. package/server/{remote-Dr5kGYSZ.js → remote-4tiENDaI.js} +3 -3
  213. package/server/{remote-b-c5bOce.js → remote-Br-ZWVIP.js} +3 -3
  214. package/server/{remote-agents-D6O_zETW.js → remote-agents-CRCg1L4H.js} +1 -1
  215. package/server/{remote-agents-Ct_WOyke.js → remote-agents-nmty1mLu.js} +6 -6
  216. package/server/{remote-completion-Dca3hAaa.js → remote-completion-BbWNd10K.js} +12 -12
  217. package/server/resume-CcKqnTvE.js +3 -0
  218. package/server/{review-agent-CCum8sGe.js → review-agent-DJRO8EG8.js} +1 -1
  219. package/server/{review-agent-CThvgK2r.js → review-agent-sKkE1FEL.js} +22 -22
  220. package/server/{review-artifacts-CXywD0F2.js → review-artifacts-BLbSC4ke.js} +5 -5
  221. package/server/{review-context-OYfKUprb.js → review-context-BgX3lcCx.js} +8 -8
  222. package/server/{review-status-DFRjDFef.js → review-status-A7quS5KJ.js} +54 -21
  223. package/server/review-status-C6n6-9f_.js +3 -0
  224. package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-tbOn_A_u.js} +3 -3
  225. package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BhSQ0d0l.js} +2 -2
  226. package/server/{review-status-sync-D60PJWNL.js → review-status-sync-To3-iS-N.js} +1 -1
  227. package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-C1Kg8n7t.js} +1 -1
  228. package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CTRNtzXO.js} +6 -6
  229. package/server/{rollup-CZ02qgxk.js → rollup-B53Y81xK.js} +1 -1
  230. package/server/{rollup-SyuF09e4.js → rollup-WA0VD-Rr.js} +8 -8
  231. package/server/{scanner-Br0Z5S6R.js → scanner-D2743cp8.js} +11 -7
  232. package/server/{sequence-io-fxU0DlwW.js → sequence-io-Cg0zYj_E.js} +4 -4
  233. package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-BGY8gjg-.js} +5 -5
  234. package/server/server.js +941 -752
  235. package/server/{service-Bagb90KZ.js → service-DCpB_SGd.js} +53 -53
  236. package/server/{session-fork-BqQxd-V6.js → session-fork-BQ8_6H32.js} +2 -2
  237. package/server/{session-history-XdS0JKp3.js → session-history-CVZDpS3c.js} +4 -4
  238. package/server/{settings-BNbocWOg.js → settings-BZ5m1UCl.js} +3 -3
  239. package/server/settings-D0OSwos5.js +2 -0
  240. package/server/{settings-uLc6DEYI.js → settings-ylxwqwQG.js} +2 -2
  241. package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BlxG6Xye.js} +2 -2
  242. package/server/{shadow-state-CbvsN3qG.js → shadow-state-C2_epgx2.js} +1 -1
  243. package/server/{shadow-state-C_NkP-sa.js → shadow-state-Dh-HzF2J.js} +2 -2
  244. package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-4bvjn9b3.js} +2 -2
  245. package/server/{ship-log-__QtAFXG.js → ship-log-ClSMIzZX.js} +1 -1
  246. package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CHIxLr_d.js} +1 -1
  247. package/server/{smart-compaction-CLZOWin1.js → smart-compaction-r4pHQBIr.js} +7 -7
  248. package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DWAorh2B.js} +22 -21
  249. package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-KC_UduxD.js} +1 -1
  250. package/server/{specialist-completion-CqmduO92.js → specialist-completion-BXhav38U.js} +1 -1
  251. package/server/{specialist-context-CJ-QjFR-.js → specialist-context-DtrYvGJ-.js} +5 -5
  252. package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-C45ouoZ6.js} +2 -2
  253. package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-DJ3RzKxW.js} +3 -3
  254. package/server/{specialists-D0gGXMZx.js → specialists-D5fRZXmN.js} +1 -1
  255. package/server/specialists-DVj0hvaL.js +3 -0
  256. package/server/{specialists-CwZHb5cb.js → specialists-DyFeedjn.js} +66 -76
  257. package/server/{specialists-Bg9v4z3F.js → specialists-JVO00bs7.js} +340 -214
  258. package/server/specs-nN45DG2X.js +3 -0
  259. package/server/{src-BMMoA_ba.js → src-CG9mCkP6.js} +6 -6
  260. package/server/{src-Bqdtd6po.js → src-CMTQGyCK.js} +3 -3
  261. package/server/{src-k039WVYY.js → src-U7_kTPEE.js} +2 -1
  262. package/server/{stack-health-Bd06frFn.js → stack-health-Df0YEZKa.js} +1 -1
  263. package/server/{stack-health-C-ifC7b0.js → stack-health-puygdaMd.js} +2 -2
  264. package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-BbFwCTb0.js} +4 -4
  265. package/server/{staleness-BID1BKdr.js → staleness-Bpy41ngS.js} +15 -3
  266. package/server/{staleness-_Tr-GwdA.js → staleness-Cbl_w4Bw.js} +1 -1
  267. package/server/{state-home-CONQvZR0.js → state-home-CIGjwNfJ.js} +96 -44
  268. package/server/{state-migrate-BeBW0KXA.js → state-migrate-Dkzaxvny.js} +12 -3
  269. package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-CzEov_fq.js} +26 -22
  270. package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-sY_MHHgQ.js} +1 -1
  271. package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-BH66lhm7.js} +3 -3
  272. package/server/{summary-fork-agEMsPSo.js → summary-fork-D8bXjCr7.js} +2 -2
  273. package/server/{summary-fork-bX6ax6X7.js → summary-fork-DHhJIsAL.js} +8 -8
  274. package/server/{supervisor-Ctt4eRYz.js → supervisor-BO-Zk_h-.js} +3 -3
  275. package/server/supervisor-BPy-o1A8.js +2 -0
  276. package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-CQ_fwUWF.js} +4 -4
  277. package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-Bza0ffAh.js} +2 -2
  278. package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-CEgauF4U.js} +15 -15
  279. package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-DXDt0Xa-.js} +7 -7
  280. package/server/{test-verdict-Cp5tljlJ.js → test-verdict-CmUBK5cT.js} +1 -1
  281. package/server/{test-verdict-D_-sXIz_.js → test-verdict-DFjjIHR5.js} +1 -1
  282. package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-BDtLOIlO.js} +2 -2
  283. package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-DL566HbH.js} +1 -1
  284. package/server/tmux-DoThH6aj.js +3 -0
  285. package/server/{tmux-L5LgvGLp.js → tmux-ftABRAmc.js} +76 -44
  286. package/server/{token-BkQLy4yS.js → token-CsOhvw42.js} +2 -2
  287. package/server/{token-util-DI8sGlmF.js → token-util-CTmczIfW.js} +1 -1
  288. package/server/token-util-DrHg8abn.js +3 -0
  289. package/server/{tracker-config-DdT-nUAM.js → tracker-config-B4itFzDo.js} +2 -2
  290. package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-BePq_oj-.js} +1 -1
  291. package/server/{tracker-utils-CawsPSS2.js → tracker-utils-tnxxqROg.js} +2 -2
  292. package/server/{traefik-connect-C6mJckNs.js → traefik-connect-m73vGebA.js} +1 -1
  293. package/server/{tunnel-IdK1iTHx.js → tunnel-B2vxjx_b.js} +3 -3
  294. package/server/{tunnel-BIFl98rc.js → tunnel-Cgj-IGIl.js} +1 -1
  295. package/server/{types-7-GnJn0t.js → types-BBNjPcqU.js} +1 -1
  296. package/server/{uat-train-j0cPeMSj.js → uat-train-CuEn0t9M.js} +28 -28
  297. package/server/{uat-train-0Ujk8GCv.js → uat-train-cKfM-_WW.js} +1 -1
  298. package/server/{validation-CabEISJT.js → validation-B5JxoPUS.js} +259 -9
  299. package/server/{validation-DcAgXTQp.js → validation-CIi6pnI2.js} +1 -1
  300. package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-BcnIbigL.js} +1 -1
  301. package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-C-lIHfUa.js} +1 -1
  302. package/server/{verification-runner-FiuAZ-H2.js → verification-runner-Br0S_Ous.js} +102 -37
  303. package/server/{verification-runner-DlJezzef.js → verification-runner-CDj4lD4t.js} +1 -1
  304. package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DKpNNW5i.js} +1 -1
  305. package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Yb2bd3Fq.js} +13 -13
  306. package/server/{workflows-BZNNYkGC.js → workflows-C9WmILql.js} +39 -77
  307. package/server/workflows-D90rMOya.js +2 -0
  308. package/server/{workspace-D9ppycdg.js → workspace-BVl4rihN.js} +3 -3
  309. package/server/{workspace-3IC-UkAi.js → workspace-DuUdndHe.js} +1 -1
  310. package/server/{workspace-config-Bigl_-Lk.js → workspace-config-cEGcO6UT.js} +1 -1
  311. package/server/{workspace-manager-B1WOfKvB.js → workspace-manager-ZTdJAy9M.js} +1 -1
  312. package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-hLUv3ADC.js} +22 -15
  313. package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-CskwzzhL.js} +2 -2
  314. package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-DNpMixRq.js} +1 -1
  315. package/server/{workspaces-CFPcL0vl.js → workspaces-hWvy9eKs.js} +275 -109
  316. package/sync-sources/agents/pan-inspect-agent.md +1 -1
  317. package/sync-sources/agents/pan-merge-agent.md +1 -1
  318. package/sync-sources/agents/pan-planning-agent.md +4 -4
  319. package/sync-sources/agents/pan-work-agent.md +1 -1
  320. package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
  321. package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
  322. package/sync-sources/hooks/record-cost-event.js +363 -71
  323. package/sync-sources/hooks/session-start-hook +7 -0
  324. package/sync-sources/hooks/work-agent-stop-hook +1 -1
  325. package/sync-sources/rules/per-bead-durability.md +1 -1
  326. package/sync-sources/rules/prd-authoring.md +1 -1
  327. package/sync-sources/skills/feature-work/SKILL.md +1 -1
  328. package/sync-sources/skills/pan/SKILL.md +2 -2
  329. package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
  330. package/sync-sources/skills/pan-approve/SKILL.md +1 -1
  331. package/sync-sources/skills/pan-close/SKILL.md +1 -1
  332. package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
  333. package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
  334. package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
  335. package/sync-sources/skills/pan-plan/SKILL.md +6 -6
  336. package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
  337. package/sync-sources/skills/pan-recap/SKILL.md +2 -2
  338. package/sync-sources/skills/pan-review/SKILL.md +1 -1
  339. package/sync-sources/skills/pan-start/SKILL.md +3 -3
  340. package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
  341. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  342. package/sync-sources/skills/pan-task/SKILL.md +2 -2
  343. package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
  344. package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
  345. package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
  346. package/sync-sources/skills/plan/SKILL.md +11 -11
  347. package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
  348. package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
  349. package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
  350. package/server/agent-state-Co5Sy2Fw.js +0 -3
  351. package/server/agents-DyHKlq1I.js +0 -3
  352. package/server/cli-BRORS9qY.js +0 -3
  353. package/server/codex-DNyiQDKW.js +0 -3
  354. package/server/deacon-swarm-CV54eNmU.js +0 -2
  355. package/server/dist-j64RzSrQ.js +0 -3
  356. package/server/forge-B0_opi-V.js +0 -2
  357. package/server/hume-BmhvfVbV.js +0 -3
  358. package/server/inspect-agent-Dq0z1k3H.js +0 -2
  359. package/server/lifecycle-io-DmY2qwCn.js +0 -3
  360. package/server/merge-ops-DwWCkSgo.js +0 -2
  361. package/server/projects-BKkwpH6q.js +0 -3
  362. package/server/public/assets/index-Bdc4V9ba.css +0 -1
  363. package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
  364. package/server/rally-OSJXdiHK.js +0 -3
  365. package/server/record-rwK-nKv_.js +0 -3
  366. package/server/record-update-Crz74r-6.js +0 -168
  367. package/server/resume-wZZsWtzz.js +0 -3
  368. package/server/review-status-Bnh-rdkY.js +0 -3
  369. package/server/settings-BlUsVaUc.js +0 -2
  370. package/server/specialists-Dqe6_HE5.js +0 -3
  371. package/server/specs-BhOKBzqk.js +0 -3
  372. package/server/supervisor-COVHrBTg.js +0 -2
  373. package/server/tmux-BAvtac_u.js +0 -3
  374. package/server/token-util-BArZLN6w.js +0 -3
  375. package/server/workflows-C4mR0Reb.js +0 -2
@@ -1,43 +1,44 @@
1
1
  import { a as __toCommonJS } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { A as canUseHarnessSync, D as resolveTieredExecutionEnabled, H as init_providers, Hn as init_projects, I as UnknownModelError, In as getProjectSync, Kn as listProjectsSync, M as init_harness_policy, O as resolveTieredExecutionEnabledForIssue, T as init_tier_table, U as piProviderForModel, V as getProviderForModelSync, Xr as encodeClaudeProjectDir, c as isClaudeCodeChannelsEnabled, dr as extractPrefixSync, f as loadConfigSync, fr as init_issue_id, ii as init_paths, jr as init_errors, mr as parseIssueIdSync, nr as resolveProjectFromIssueSync, oi as packageRoot, ri as getOverdeckHome, si as resolveOhmypiExtensionPath, t as init_config_yaml, tt as resolveModel, xn as shouldCommitLegacyWorkspaceArtifacts, xr as FsError, yn as init_state_read_home } from "./config-yaml-ig8Nwtiw.js";
2
+ import { A as canUseHarnessSync, Br as getOverdeckHome, D as resolveTieredExecutionEnabled, H as init_providers, I as UnknownModelError, Jn as extractPrefixSync, M as init_harness_policy, Nr as encodeClaudeProjectDir, O as resolveTieredExecutionEnabledForIssue, Qt as parsePorcelainStatusPaths, T as init_tier_table, Tn as init_projects, U as piProviderForModel, Ur as packageRoot, V as getProviderForModelSync, Vr as init_paths, Wr as resolveOhmypiExtensionPath, Yn as init_issue_id, Yt as init_state_plane, Zn as parseIssueIdSync, c as isClaudeCodeChannelsEnabled, f as loadConfigSync, in as shouldCommitLegacyWorkspaceArtifacts, ir as FsError, kn as listProjectsSync, mr as init_errors, nn as init_state_read_home, t as init_config_yaml, tt as resolveModel, yn as getProjectSync, zn as resolveProjectFromIssueSync } from "./config-yaml-DvyMuOle.js";
3
3
  import { a as init_activity_logger, n as emitActivityEntrySync } from "./activity-logger-DDlOIAML.js";
4
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-D4iNWMA5.js";
5
- import { B as sendRawKeystroke, D as killSession, H as sessionExistsSync, J as BLANKED_PROVIDER_ENV, M as listSessions, T as isHarnessProcessAlive, U as setOption, V as sessionExists, X as buildChildEnvWithoutTmuxSync, Z as init_child_env, g as findManagedServerPidSync, i as capturePane, j as listSessionNames, m as exactPaneTarget, s as createSession, w as init_tmux, z as sendKeysAsync } from "./tmux-L5LgvGLp.js";
6
- import { a as init_event_store, n as getEventStore } from "./event-store-TnWdydfB.js";
7
- import { k as normalizeChannelReplyPayload, o as getHarnessBehavior, t as init_src, x as DomainEvent } from "./src-k039WVYY.js";
8
- import { C as AGENT_COLUMNS_FOR_DB, O as stateToOverdeckParamsForDb, T as init_agent_state_sync, c as init_review_status, s as getReviewStatusSync, u as loadReviewStatuses, y as setReviewStatusSync } from "./review-status-DFRjDFef.js";
9
- import { a as EventStoreService, c as ReadModelService, d as init_read_model, i as init_issue_lifecycle, s as init_domain_services, t as IssueLifecycle, u as getClosedIssueIdsForReadSource } from "./issue-lifecycle-CeyW_HoD.js";
10
- import { d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-DXdHmRTC.js";
11
- import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-C12WgkaB.js";
12
- import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-Codk1pc2.js";
13
- import { $ as stopAgent, $n as init_pty_token, $t as init_ohmypi_fifo, Cn as clearAgentTroubled, Dn as getAgentDir, Et as writeBridgeTokenSync, Gn as saveAgentStateSync, Gt as getProviderAuthMode, H as getLatestSessionId, Ht as getAgentRuntimeBaseCommand, K as saveSessionId, Kn as setAgentPaused, L as messageAgent, Lt as resolveStaffing, M as resumeAgent, Mt as transitionIssueToInProgress, O as recoverAgent, Pt as init_staffing, Qt as piFifoPaths, R as init_operator_interventions, Rn as markAgentStoppedState, S as init_tier_escalation, Tt as init_bridge_token, U as getLatestSessionIdSync, V as getActivity, W as getSessionId, Wn as saveAgentState, Xn as writeAgentStateJsonSync, Yn as wipeAgentStateDirs, Zt as init_pi_fifo, _n as writeChannelsBridgeMcpConfig, _r as init_codex_auth, _t as deliverAgentPermissionDecision, an as determineModel, ar as normalizeAgentId, bt as setAgentDeliveryMethod, cr as waitForReadySignal, en as ohmypiFifoPaths, er as writePtyToken, fr as saveAgentRuntimeState, gn as dismissDevChannelsDialog, gr as checkCodexAuthStatus, gt as deliverAgentMessage, i as listRunningAgents, jn as getAgentStateSync, k as restartAgent, kn as getAgentState, ln as init_provider_health, lr as getAgentRuntimeState, nr as resolvePtySupervisorScriptPath, on as getProviderEnvForModel, r as listAgentStates, rr as clearReadySignal, s as init_agents$1, sn as getProviderExportsForModel, tr as init_pty_supervisor_locate, un as validateProviderHealth, ur as getAgentRuntimeStateSync, wt as BRIDGE_TOKEN_HEADER, x as decideEscalation, xn as clearAgentPaused, z as operatorInterventionEvent } from "./queries-ZABd5aXP.js";
14
- import { a as performHandoff, i as checkAllTriggers, s as getAgentHealth, t as getCloisterService } from "./service-Bagb90KZ.js";
15
- import { o as init_persistent_logger, s as logAgentLifecycleSync } from "./session-history-XdS0JKp3.js";
16
- import { t as init_behavior } from "./behavior-CGj16clS.js";
17
- import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-DdT-nUAM.js";
18
- import { n as init_issue_service_singleton, r as issue_service_singleton_exports } from "./issue-service-singleton-D_RVYBuL.js";
19
- import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-CXsfxslp.js";
4
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CzaSOgul.js";
5
+ import { $ as init_child_env, B as sendKeysAsync, D as killSession, H as sessionExists, M as listSessionNames, N as listSessions, Q as buildChildEnvWithoutTmuxSync, T as isHarnessProcessAlive, U as sessionExistsSync, V as sendRawKeystroke, W as setOption, X as BLANKED_PROVIDER_ENV, g as findManagedServerPidSync, i as capturePane, m as exactPaneTarget, s as createSession, w as init_tmux } from "./tmux-ftABRAmc.js";
6
+ import { a as init_event_store, n as getEventStore } from "./event-store-tdiY5eDZ.js";
7
+ import { k as normalizeChannelReplyPayload, o as getHarnessBehavior, t as init_src, x as DomainEvent } from "./src-U7_kTPEE.js";
8
+ import { E as init_agent_state_sync, b as setReviewStatusSync, c as getReviewStatusSync, d as loadReviewStatuses, i as clearWorkspaceStuck, k as stateToOverdeckParamsForDb, l as init_review_status, w as AGENT_COLUMNS_FOR_DB } from "./review-status-A7quS5KJ.js";
9
+ import { a as EventStoreService, c as ReadModelService, d as init_read_model, i as init_issue_lifecycle, s as init_domain_services, t as IssueLifecycle, u as getClosedIssueIdsForReadSource } from "./issue-lifecycle-CreaCkjW.js";
10
+ import { d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-B4Bjbkfv.js";
11
+ import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-DWdW7vUm.js";
12
+ import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-Ca0YTWDw.js";
13
+ import { An as writeChannelsBridgeMcpConfig, Ar as init_codex_auth, At as deliverAgentPermissionDecision, Bn as getAgentDir, Cn as validateProviderHealth, Cr as getAgentRuntimeStateSync, F as init_tier_escalation, G as resumeAgent, Gt as transitionIssueToInProgress, H as restartAgent, Hn as getAgentState, In as clearAgentTroubled, Lt as BRIDGE_TOKEN_HEADER, Nt as setAgentDeliveryMethod, P as decideEscalation, Pn as clearAgentPaused, Q as operatorInterventionEvent, Rt as init_bridge_token, Sn as init_provider_health, Sr as getAgentRuntimeState, Tr as saveAgentRuntimeState, V as recoverAgent, Wn as getAgentStateSync, X as messageAgent, Xt as resolveStaffing, Z as init_operator_interventions, Zn as markAgentStoppedState, ar as setAgentPaused, at as saveSessionId, b as init_agents$1, bn as getProviderExportsForModel, cr as wipeAgentStateDirs, dn as piFifoPaths, et as getActivity, fn as init_ohmypi_fifo, fr as init_pty_token, ft as stopAgent, gr as clearReadySignal, hr as resolvePtySupervisorScriptPath, i as listRunningAgents, in as getProviderAuthMode, ir as saveAgentStateSync, kn as dismissDevChannelsDialog, kr as checkCodexAuthStatus, kt as deliverAgentMessage, lr as writeAgentStateJsonSync, mr as init_pty_supervisor_locate, nt as getLatestSessionIdSync, pn as ohmypiFifoPaths, pr as writePtyToken, qt as init_staffing, r as listAgentStates, rr as saveAgentState, rt as getSessionId, tn as getAgentRuntimeBaseCommand, tt as getLatestSessionId, un as init_pi_fifo, vn as determineModel, vr as normalizeAgentId, xr as waitForReadySignal, yn as getProviderEnvForModel, zt as writeBridgeTokenSync } from "./queries-6d7Cdtm7.js";
14
+ import { a as performHandoff, i as checkAllTriggers, s as getAgentHealth, t as getCloisterService } from "./service-DCpB_SGd.js";
15
+ import { o as init_persistent_logger, s as logAgentLifecycleSync } from "./session-history-CVZDpS3c.js";
16
+ import { t as init_behavior } from "./behavior-B_-4EKF3.js";
17
+ import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-B4itFzDo.js";
18
+ import { n as init_issue_service_singleton, r as issue_service_singleton_exports } from "./issue-service-singleton-B5ushCvE.js";
19
+ import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-Bb4XeV2x.js";
20
20
  import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-hraoaQIp.js";
21
- import { F as generateVBriefFilename, I as init_lifecycle, f as readTierOverrides, g as serializeVBriefDocument, h as recordTierPromotion, m as readWorkspacePlanSync, o as init_io, r as findPlan, u as readPlan } from "./io-DQR9PMgS.js";
22
- import { B as removeFavorite, E as hasOtherActiveConversationOnTmuxSession, F as markConversationEnded, G as setConversationHarness, K as setConversationModel, M as listConversations, P as markConversationActive, Q as updateConversationDeliveryMethod, S as getConversationByName, W as setConversationEffort, g as backfillConversationModel, h as archiveConversation, k as init_conversations, nt as updateLastAttached, rt as updateSpawnError, x as getConversationById, y as createConversation } from "./conversations-bYpM9-kZ.js";
23
- import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-B-CI9hgE.js";
24
- import { a as requireModelOverrideSync, i as normalizeModelOverrideSync, n as init_launcher_generator, r as init_model_validation, t as generateLauncherScriptSync } from "./launcher-generator-COgR2By1.js";
25
- import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-nSFKH78M.js";
26
- import { h as workspaceContextFile, l as piGlobalContextFile, o as init_layers } from "./layers-Cp1To4L8.js";
27
- import { n as init_harness_binary, r as prepareHarnessLaunch } from "./harness-binary-B2CTcD84.js";
28
- import { a as init_stack_health, i as getWorkspaceStackHealth } from "./stack-health-C-ifC7b0.js";
29
- import { l as init_dag, o as getDispatchableItems } from "./dag-CJpgf9A3.js";
30
- import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-D5FVQTmy.js";
31
- import { a as loadCloisterConfigSync, r as init_config } from "./config-DeTsoZdR.js";
32
- import { c as isStateMigrated, o as init_state_home } from "./state-home-CONQvZR0.js";
33
- import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionVBriefOnMain } from "./lifecycle-io-taIb0PoH.js";
34
- import { _ as init_codex_conversation_parser, c as parseEntireConversation, d as init_pi_conversation_parser, g as parseOhmypiConversationMessages, m as init_ohmypi_conversation_parser, p as parsePiConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages } from "./conversation-service-C3avRVEr.js";
35
- import { _ as parseCodexApprovalPrompt, d as getAgentPendingQuestions$1, f as getAgentWorkspace$1, g as normalizeAwaitingInputPrompt, m as detectAwaitingInputForAgent, o as getRuntimeForAgent, p as scanPendingInputsPromise, s as computeAgentEnrichment, u as getAgentJsonlPath$1 } from "./stuck-remediation-CKnIryGT.js";
36
- import { Mt as getResourceConfig, Pt as getSystemHealthSnapshot, Tt as classifyMemoryPressure } from "./deacon-CkT_kznS.js";
37
- import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-ClkCIWTe.js";
38
- import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-C3HVNR5d.js";
39
- import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-BoWm66Kh.js";
40
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-tiSRIWJP.js";
21
+ import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-DfeyBDwA.js";
22
+ import { f as readTierOverrides, g as serializeXBriefDocument, h as recordTierPromotion, m as readWorkspacePlanSync, o as init_io, r as findPlan, u as readPlan } from "./io-B3_AHDfr.js";
23
+ import { B as removeFavorite, E as hasOtherActiveConversationOnTmuxSession, F as markConversationEnded, G as setConversationHarness, K as setConversationModel, M as listConversations, P as markConversationActive, Q as updateConversationDeliveryMethod, S as getConversationByName, W as setConversationEffort, g as backfillConversationModel, h as archiveConversation, k as init_conversations, nt as updateLastAttached, rt as updateSpawnError, x as getConversationById, y as createConversation } from "./conversations-DbOs1e9Q.js";
24
+ import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-B0pmAz0a.js";
25
+ import { a as requireModelOverrideSync, i as normalizeModelOverrideSync, n as init_launcher_generator, r as init_model_validation, t as generateLauncherScriptSync } from "./launcher-generator-CHVm7bGT.js";
26
+ import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-H_5wHQZQ.js";
27
+ import { h as workspaceContextFile, l as piGlobalContextFile, o as init_layers } from "./layers-DzxSTGNA.js";
28
+ import { n as init_harness_binary, r as prepareHarnessLaunch } from "./harness-binary-CVio2m-u.js";
29
+ import { a as init_stack_health, i as getWorkspaceStackHealth } from "./stack-health-puygdaMd.js";
30
+ import { l as init_dag, o as getDispatchableItems } from "./dag-CdOjJVDT.js";
31
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-qHJBhy3Z.js";
32
+ import { a as loadCloisterConfigSync, r as init_config } from "./config-DjLOdbgT.js";
33
+ import { c as isStateMigrated, o as init_state_home } from "./state-home-CIGjwNfJ.js";
34
+ import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-D8iNBcux.js";
35
+ import { _ as init_codex_conversation_parser, c as parseEntireConversation, d as init_pi_conversation_parser, g as parseOhmypiConversationMessages, m as init_ohmypi_conversation_parser, p as parsePiConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages } from "./conversation-service-Du-MTNpJ.js";
36
+ import { _ as parseCodexApprovalPrompt, d as getAgentPendingQuestions$1, f as getAgentWorkspace$1, g as normalizeAwaitingInputPrompt, m as detectAwaitingInputForAgent, o as getRuntimeForAgent, p as scanPendingInputsPromise, s as computeAgentEnrichment, u as getAgentJsonlPath$1 } from "./stuck-remediation-CzEov_fq.js";
37
+ import { Dt as classifyMemoryPressure, It as getSystemHealthSnapshot, Pt as getResourceConfig } from "./deacon-pRnyD5w9.js";
38
+ import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-hLUv3ADC.js";
39
+ import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-Dhflo1SH.js";
40
+ import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-aQ1IxeI3.js";
41
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-CskwzzhL.js";
41
42
  import { basename, delimiter, dirname, join, resolve } from "node:path";
42
43
  import { Cause, Data, Effect, Layer, Option, Schema, Stream } from "effect";
43
44
  import { join as join$1 } from "path";
@@ -99,9 +100,8 @@ init_cost();
99
100
  init_behavior();
100
101
  init_persistent_logger();
101
102
  init_tracker_config();
102
- init_types();
103
- init_review_status();
104
103
  init_lifecycle();
104
+ init_review_status();
105
105
  init_io();
106
106
  /**
107
107
  * Resolve the default cwd used when no project is selected — the "devroot"
@@ -581,7 +581,7 @@ async function resolveCodexRolloutPath(agentId, opts = {}) {
581
581
  const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
582
582
  const codexHome = join(agentDir, "codex-home");
583
583
  if (!await pathExists$1(codexHome)) return null;
584
- const { findRolloutPath, findLatestRollout } = await import("./codex-DNyiQDKW.js");
584
+ const { findRolloutPath, findLatestRollout } = await import("./codex-Dg7Is5yb.js");
585
585
  const threadId = (await readOptional(join(agentDir, "codex-thread-id")))?.trim();
586
586
  if (threadId) {
587
587
  const rollout = findRolloutPath(codexHome, threadId);
@@ -642,12 +642,13 @@ async function resolveJsonlPath(agentId, workspacePath, opts = {}) {
642
642
  logTranscriptResolution(agentId, `missing-session-id:${harness ?? "unknown"}`, `failed harness=${harness ?? "unknown"} reason=no-session-id checked=session.id,sessions.json,runtime-state`, opts);
643
643
  return null;
644
644
  }
645
- const jsonlPath = join(opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects"), encodeClaudeProjectDir(workspacePath), `${claudeSessionId}.jsonl`);
645
+ const effectiveWorkspacePath = (await readRecordedState(agentId, opts)).workspace ?? workspacePath;
646
+ const jsonlPath = join(opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects"), encodeClaudeProjectDir(effectiveWorkspacePath), `${claudeSessionId}.jsonl`);
646
647
  if (await pathExists$1(jsonlPath)) {
647
648
  logTranscriptResolution(agentId, `resolved:${jsonlPath}`, `resolved harness=${harness ?? "claude-code"} sessionId=${claudeSessionId} path=${jsonlPath}`, opts);
648
649
  return jsonlPath;
649
650
  }
650
- logTranscriptResolution(agentId, `missing-jsonl:${jsonlPath}`, `failed harness=${harness ?? "claude-code"} reason=jsonl-missing sessionId=${claudeSessionId} workspace=${workspacePath} expectedPath=${jsonlPath}`, opts);
651
+ logTranscriptResolution(agentId, `missing-jsonl:${jsonlPath}`, `failed harness=${harness ?? "claude-code"} reason=jsonl-missing sessionId=${claudeSessionId} workspace=${effectiveWorkspacePath} expectedPath=${jsonlPath}`, opts);
651
652
  return null;
652
653
  }
653
654
  //#endregion
@@ -834,15 +835,14 @@ const getWorkAgentLifecycleState = (agentOrIssueId) => Effect.promise(() => getW
834
835
  * expected feature branch. Reports drift and missing-workspace state
835
836
  * because both are silent failure modes today.
836
837
  *
837
- * Cache: in-memory, 30s TTL, keyed by absolute path. Cache entries are
838
- * invalidated when the mtime of <path>/.git/HEAD changes, so a checkout
839
- * under a live conversation is picked up on the next list call without
840
- * waiting for TTL.
838
+ * Cache: in-memory, keyed by absolute path and invalidated when the mtime of
839
+ * <path>/.git/HEAD changes. Every read still stats HEAD, so a checkout under a
840
+ * live conversation is picked up immediately without periodically respawning
841
+ * two git processes for every unchanged workspace.
841
842
  *
842
843
  * All I/O is async (execFile / fs.promises). No execSync, no readFileSync.
843
844
  */
844
845
  const execFileAsync$3 = promisify(execFile);
845
- const GIT_INFO_TTL_MS = 3e4;
846
846
  const GIT_INFO_TIMEOUT_MS = 2e3;
847
847
  const cache = /* @__PURE__ */ new Map();
848
848
  /**
@@ -917,22 +917,20 @@ async function readGitInfoFresh(absPath) {
917
917
  };
918
918
  }
919
919
  /**
920
- * Resolve branch + worktree status for a conversation cwd. Cached for
921
- * GIT_INFO_TTL_MS, invalidated on HEAD mtime change.
920
+ * Resolve branch + worktree status for a conversation cwd. Cached until the
921
+ * HEAD mtime changes.
922
922
  */
923
923
  async function resolveConversationGitInfo(absPath) {
924
- const now = Date.now();
925
924
  const headMtimeMs = await readHeadMtimeMs(absPath);
926
925
  if (headMtimeMs === null) return {
927
926
  branch: null,
928
927
  isWorktree: false
929
928
  };
930
929
  const cached = cache.get(absPath);
931
- if (cached && cached.expiresAt > now && cached.headMtimeMs === headMtimeMs) return cached.value;
930
+ if (cached && cached.headMtimeMs === headMtimeMs) return cached.value;
932
931
  const value = await readGitInfoFresh(absPath);
933
932
  cache.set(absPath, {
934
933
  value,
935
- expiresAt: now + GIT_INFO_TTL_MS,
936
934
  headMtimeMs
937
935
  });
938
936
  return value;
@@ -1727,7 +1725,7 @@ const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", http
1727
1725
  } catch {}
1728
1726
  let stdout;
1729
1727
  if (isRemote && vmName) {
1730
- const { getRemoteAgentOutput } = await import("./remote-agents-D6O_zETW.js");
1728
+ const { getRemoteAgentOutput } = await import("./remote-agents-CRCg1L4H.js");
1731
1729
  stdout = await getRemoteAgentOutput(id, vmName, parseInt(String(lines), 10) || 100);
1732
1730
  } else stdout = await Effect.runPromise(capturePane(id, parseInt(String(lines), 10) || 100));
1733
1731
  if (!stdout || stdout.trim() === "" || stdout.trim() === "Session not found") {
@@ -1907,7 +1905,7 @@ const postAgentTellRoute = postAgentMessageLikeRoute("/api/agents/:id/tell");
1907
1905
  const postAgentPokeRoute = HttpRouter.add("POST", "/api/agents/:id/poke", httpHandler(Effect.gen(function* () {
1908
1906
  const id = (yield* HttpRouter.params)["id"] ?? "";
1909
1907
  const { message } = yield* readJsonBody$1;
1910
- const pokeMsg = message || "You seem to have been inactive for a while. If you're stuck:\n1. Check your current task in continue.vbrief.json\n2. Try an alternative approach if blocked\n3. Ask for help if needed\n\nWhat's your current status?";
1908
+ const pokeMsg = message || "You seem to have been inactive for a while. If you're stuck:\n1. Check your current xBRIEF task with `pan task show <issue> <item-id>`\n2. Try an alternative approach if blocked\n3. Ask for help if needed\n\nWhat's your current status?";
1911
1909
  yield* Effect.promise(() => messageAgent(id, pokeMsg));
1912
1910
  return jsonResponse({
1913
1911
  success: true,
@@ -2148,7 +2146,7 @@ async function cleanupConversationAttachments(name) {
2148
2146
  * sessions that the lifecycle poller missed. */
2149
2147
  async function cleanupOrphanedConversationAttachments() {
2150
2148
  try {
2151
- const { listConversations } = await import("./conversations-H9if0bCQ.js");
2149
+ const { listConversations } = await import("./conversations-6mPANqvL.js");
2152
2150
  const convNames = new Set(listConversations().map((c) => c.name));
2153
2151
  const root = getConversationAttachmentsRoot();
2154
2152
  await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join(root, entry.name)), 10, (path) => rm(path, {
@@ -2727,7 +2725,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
2727
2725
  const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
2728
2726
  const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
2729
2727
  const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
2730
- const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-DNyiQDKW.js");
2728
+ const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-Dg7Is5yb.js");
2731
2729
  initCodexHome(codexHome, {
2732
2730
  trustedDir: cwd,
2733
2731
  approvalPolicy: codexApprovalPolicy,
@@ -2796,7 +2794,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
2796
2794
  } catch {}
2797
2795
  console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
2798
2796
  try {
2799
- const { preTrustDirectory } = await import("./workspace-manager-B1WOfKvB.js");
2797
+ const { preTrustDirectory } = await import("./workspace-manager-ZTdJAy9M.js");
2800
2798
  preTrustDirectory(cwd);
2801
2799
  } catch {}
2802
2800
  try {
@@ -2813,7 +2811,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
2813
2811
  const codexHomeDir = codexFields.codexHome;
2814
2812
  (async () => {
2815
2813
  try {
2816
- const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-DNyiQDKW.js");
2814
+ const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-Dg7Is5yb.js");
2817
2815
  const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
2818
2816
  if (rollout) {
2819
2817
  const threadId = extractThreadIdFromRollout(rollout);
@@ -3692,7 +3690,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
3692
3690
  error: "missing agent id"
3693
3691
  }, { status: 400 });
3694
3692
  const request = yield* HttpServerRequest.HttpServerRequest;
3695
- const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-C9DdEOKY.js"));
3693
+ const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-DXdfprGr.js"));
3696
3694
  const expected = getInternalTokenSync();
3697
3695
  if (!expected) return jsonResponse({
3698
3696
  ok: false,
@@ -3959,7 +3957,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
3959
3957
  const request = yield* HttpServerRequest.HttpServerRequest;
3960
3958
  const urlOpt = HttpServerRequest.toURL(request);
3961
3959
  const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
3962
- const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-C1whmd58.js"));
3960
+ const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-CpfvuVmm.js"));
3963
3961
  const endTime = /* @__PURE__ */ new Date();
3964
3962
  const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
3965
3963
  const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
@@ -4000,7 +3998,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
4000
3998
  detail: String(decoded.failure)
4001
3999
  }, { status: 400 })
4002
4000
  };
4003
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CsQ07Pxe.js"));
4001
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CnzFKSAQ.js"));
4004
4002
  yield* (yield* AgentStateService).emit(decoded.success);
4005
4003
  return {
4006
4004
  ok: true,
@@ -4082,7 +4080,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
4082
4080
  success: false,
4083
4081
  error: "missing agent id"
4084
4082
  }, { status: 400 });
4085
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CsQ07Pxe.js"));
4083
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CnzFKSAQ.js"));
4086
4084
  const snapshot = yield* (yield* AgentStateService).get(id);
4087
4085
  if (!snapshot) return jsonResponse({
4088
4086
  success: false,
@@ -4146,35 +4144,107 @@ function saveAgentStateAndEmitEvent(state, event) {
4146
4144
  function saveAgentStateAndEmitEventProgram(state, event) {
4147
4145
  return Effect.sync(() => saveAgentStateAndEmitEvent(state, event));
4148
4146
  }
4149
- /**
4150
- * Dependency-injected variant for tests.
4151
- */
4152
- function saveAgentStateAndEmitEventWithDeps(db, eventStore, state, event) {
4153
- prepareAgentStateForSave(state);
4154
- writeAgentStateJsonSync(state);
4147
+ function writeProjectionRows(db, state, event) {
4155
4148
  const record = event;
4156
4149
  const timestamp = record["timestamp"] ?? (/* @__PURE__ */ new Date()).toISOString();
4157
4150
  const timestampMs = new Date(timestamp).getTime();
4158
4151
  const payload = JSON.stringify(record["payload"] ?? {});
4159
4152
  const updatedAt = Date.now();
4153
+ db.prepare(`INSERT OR IGNORE INTO issues (id, stage, updated_at) VALUES (?, 'working', ?)`).run(state.issueId, updatedAt);
4154
+ db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
4155
+ db.prepare(`INSERT INTO events (type, timestamp, payload) VALUES (?, ?, ?)`).run(event.type, timestampMs, payload);
4156
+ const sequence = db.prepare(`SELECT last_insert_rowid() AS sequence`).get()?.sequence ?? 0;
4157
+ return {
4158
+ sequence,
4159
+ stored: buildStoredEvent(event, sequence)
4160
+ };
4161
+ }
4162
+ function emitCommittedProjection(eventStore, state, event, rows) {
4163
+ eventStore.emitStored(rows.stored);
4164
+ logAgentLifecycleSync(state.id, `projected ${event.type} (seq=${rows.sequence}) for ${state.id}`);
4165
+ return { sequence: rows.sequence };
4166
+ }
4167
+ function rollbackTransaction(db) {
4168
+ try {
4169
+ db.exec("ROLLBACK");
4170
+ } catch {}
4171
+ }
4172
+ function saveAgentStateAndEmitEventWithDeps(db, eventStore, state, event) {
4173
+ prepareAgentStateForSave(state);
4174
+ writeAgentStateJsonSync(state);
4160
4175
  db.exec("BEGIN IMMEDIATE");
4161
4176
  try {
4162
- db.prepare(`INSERT OR IGNORE INTO issues (id, stage, updated_at) VALUES (?, 'working', ?)`).run(state.issueId, updatedAt);
4163
- db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
4164
- db.prepare(`INSERT INTO events (type, timestamp, payload) VALUES (?, ?, ?)`).run(event.type, timestampMs, payload);
4165
- const sequence = db.prepare(`SELECT last_insert_rowid() AS sequence`).get()?.sequence ?? 0;
4177
+ const rows = writeProjectionRows(db, state, event);
4166
4178
  db.exec("COMMIT");
4167
- const stored = buildStoredEvent(event, sequence);
4168
- eventStore.emitStored(stored);
4169
- logAgentLifecycleSync(state.id, `projected ${event.type} (seq=${sequence}) for ${state.id}`);
4170
- return { sequence };
4179
+ return emitCommittedProjection(eventStore, state, event, rows);
4171
4180
  } catch (err) {
4172
- try {
4173
- db.exec("ROLLBACK");
4174
- } catch {}
4181
+ rollbackTransaction(db);
4182
+ throw err;
4183
+ }
4184
+ }
4185
+ /**
4186
+ * Claim the single in-flight work-spawn slot and project its starting state.
4187
+ * The SQLite write lock makes the status check and placeholder insert one
4188
+ * operation, so concurrent dashboard requests cannot both launch `pan start`.
4189
+ */
4190
+ function claimAgentStartPlaceholderWithDeps(db, eventStore, state, event, hasLiveTmuxSession) {
4191
+ if (hasLiveTmuxSession) return {
4192
+ claimed: false,
4193
+ reason: "live-session"
4194
+ };
4195
+ prepareAgentStateForSave(state);
4196
+ db.exec("BEGIN IMMEDIATE");
4197
+ try {
4198
+ const current = db.prepare(`SELECT status, started_at AS startedAt FROM agents WHERE id = ?`).get(state.id);
4199
+ const startingWithinGrace = current?.status === "starting" && current.startedAt !== null && Date.now() - current.startedAt < 12e4;
4200
+ if (current?.status === "running" || startingWithinGrace) {
4201
+ rollbackTransaction(db);
4202
+ return {
4203
+ claimed: false,
4204
+ reason: "active-state"
4205
+ };
4206
+ }
4207
+ writeAgentStateJsonSync(state);
4208
+ const rows = writeProjectionRows(db, state, event);
4209
+ db.exec("COMMIT");
4210
+ emitCommittedProjection(eventStore, state, event, rows);
4211
+ return { claimed: true };
4212
+ } catch (err) {
4213
+ rollbackTransaction(db);
4175
4214
  throw err;
4176
4215
  }
4177
4216
  }
4217
+ function claimAgentStartPlaceholderProgram(state, event, hasLiveTmuxSession) {
4218
+ return Effect.sync(() => claimAgentStartPlaceholderWithDeps(getOverdeckDatabaseSync(), getEventStore(), state, event, hasLiveTmuxSession));
4219
+ }
4220
+ /**
4221
+ * Roll back only the placeholder owned by this failed spawn attempt. If the
4222
+ * agent has already advanced to a real running state, the compare fails and
4223
+ * the successful concurrent launch is left untouched.
4224
+ */
4225
+ function rollbackAgentStartPlaceholderWithDeps(db, eventStore, placeholder, fallback, event) {
4226
+ prepareAgentStateForSave(fallback);
4227
+ db.exec("BEGIN IMMEDIATE");
4228
+ try {
4229
+ const current = db.prepare(`SELECT status, model, started_at AS startedAt FROM agents WHERE id = ?`).get(placeholder.id);
4230
+ const placeholderStartedAt = new Date(placeholder.startedAt).getTime();
4231
+ if (!(current?.status === "starting" && current.model === "pending-work-spawn" && current.startedAt === placeholderStartedAt)) {
4232
+ rollbackTransaction(db);
4233
+ return false;
4234
+ }
4235
+ writeAgentStateJsonSync(fallback);
4236
+ const rows = writeProjectionRows(db, fallback, event);
4237
+ db.exec("COMMIT");
4238
+ emitCommittedProjection(eventStore, fallback, event, rows);
4239
+ return true;
4240
+ } catch (err) {
4241
+ rollbackTransaction(db);
4242
+ throw err;
4243
+ }
4244
+ }
4245
+ function rollbackAgentStartPlaceholderProgram(placeholder, fallback, event) {
4246
+ return Effect.sync(() => rollbackAgentStartPlaceholderWithDeps(getOverdeckDatabaseSync(), getEventStore(), placeholder, fallback, event));
4247
+ }
4178
4248
  //#endregion
4179
4249
  //#region routes/agents/lifecycle-stop.ts
4180
4250
  init_agents$1();
@@ -4195,8 +4265,8 @@ function createAgentStopHandler(lifecycleEvent) {
4195
4265
  yield* stopAgent(id);
4196
4266
  if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
4197
4267
  try {
4198
- const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
4199
- const { findWorkspacePath } = await import("./archive-planning-Cp_DC1j-.js");
4268
+ const { resolveProjectFromIssueSync } = await import("./projects-9SkRpES9.js");
4269
+ const { findWorkspacePath } = await import("./archive-planning-zkJb3BeM.js");
4200
4270
  const issueLower = stateBeforeStop.issueId.toLowerCase();
4201
4271
  const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
4202
4272
  if (workspacePath) {
@@ -5174,8 +5244,10 @@ const postAgentSwitchModelRoute = HttpRouter.add("POST", "/api/agents/:id/switch
5174
5244
  return jsonResponse({ error: `Agent ${(yield* HttpRouter.params)["id"] ?? ""} model is locked once the agent is spawned` }, { status: 409 });
5175
5245
  })));
5176
5246
  //#endregion
5177
- //#region ../../lib/vbrief/auto-synthesize.ts
5247
+ //#region ../../lib/xbrief/auto-synthesize.ts
5178
5248
  init_state_read_home();
5249
+ init_state_plane();
5250
+ init_types();
5179
5251
  init_codex_auth();
5180
5252
  init_state_home();
5181
5253
  init_io();
@@ -5198,7 +5270,7 @@ function extractAcceptanceCriteriaFromIssue(title, body) {
5198
5270
  }
5199
5271
  return [`Issue's stated fix implemented with tests`];
5200
5272
  }
5201
- function synthesizeMinimalVBrief(issue) {
5273
+ function synthesizeMinimalXBrief(issue) {
5202
5274
  const issueId = issue.issueId.toUpperCase();
5203
5275
  const issueLabel = issueId.toLowerCase();
5204
5276
  const now = (/* @__PURE__ */ new Date()).toISOString();
@@ -5209,9 +5281,9 @@ function synthesizeMinimalVBrief(issue) {
5209
5281
  created: now,
5210
5282
  metadata: { kind: "acceptance_criterion" }
5211
5283
  }));
5212
- const canonicalFilename = generateVBriefFilename(issueId, issue.title, now);
5284
+ const canonicalFilename = generateXBriefFilename(issueId, issue.title, now);
5213
5285
  return {
5214
- vBRIEFInfo: {
5286
+ xBRIEFInfo: {
5215
5287
  version: "0.8",
5216
5288
  created: now,
5217
5289
  updated: now,
@@ -5258,8 +5330,8 @@ function synthesizeMinimalVBrief(issue) {
5258
5330
  }
5259
5331
  };
5260
5332
  }
5261
- async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
5262
- const document = synthesizeMinimalVBrief(issue);
5333
+ async function writeAutoStartXBriefPromise(projectRoot, workspacePath, issue) {
5334
+ const document = synthesizeMinimalXBrief(issue);
5263
5335
  const canonicalFilename = document.plan.metadata?.canonicalFilename;
5264
5336
  const projectSpecsDir = join$1(projectRoot, ".pan", "specs");
5265
5337
  const projectSpecPath = join$1(projectSpecsDir, canonicalFilename);
@@ -5271,7 +5343,7 @@ async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
5271
5343
  }
5272
5344
  };
5273
5345
  await mkdir$1(projectSpecsDir, { recursive: true });
5274
- await writeFile$1(projectSpecPath, serializeVBriefDocument(projectDocument), "utf-8");
5346
+ await writeFile$1(projectSpecPath, serializeXBriefDocument(projectDocument), "utf-8");
5275
5347
  return {
5276
5348
  document,
5277
5349
  workspaceSpecPath: projectSpecPath,
@@ -5280,15 +5352,15 @@ async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
5280
5352
  };
5281
5353
  }
5282
5354
  /**
5283
- * Effect variant of writeAutoStartVBrief. Wraps mkdir + writeFile in a typed
5355
+ * Effect variant of writeAutoStartXBrief. Wraps mkdir + writeFile in a typed
5284
5356
  * FsError channel so callers in Effect-native code can compose with this
5285
5357
  * synthesis step without losing failure typing.
5286
5358
  */
5287
- const writeAutoStartVBrief = (projectRoot, workspacePath, issue) => Effect.tryPromise({
5288
- try: () => writeAutoStartVBriefPromise(projectRoot, workspacePath, issue),
5359
+ const writeAutoStartXBrief = (projectRoot, workspacePath, issue) => Effect.tryPromise({
5360
+ try: () => writeAutoStartXBriefPromise(projectRoot, workspacePath, issue),
5289
5361
  catch: (cause) => new FsError({
5290
5362
  path: projectRoot,
5291
- operation: "writeAutoStartVBrief",
5363
+ operation: "writeAutoStartXBrief",
5292
5364
  cause
5293
5365
  })
5294
5366
  });
@@ -5500,15 +5572,15 @@ init_agents$1();
5500
5572
  function handleRemoteAgentSpawn(input) {
5501
5573
  return Effect.gen(function* () {
5502
5574
  const { issueId, workspacePath, workspaceMetadata, spawnModel, projectPath, spawnGuardrails, lifecycle } = input;
5503
- const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-D6O_zETW.js"));
5504
- const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-Dr5kGYSZ.js"));
5505
- const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-BJKocXKd.js"));
5575
+ const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-CRCg1L4H.js"));
5576
+ const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-4tiENDaI.js"));
5577
+ const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-DUIhMN_T.js"));
5506
5578
  const panConfig = loadPanConfig();
5507
5579
  const spendCap = checkRemoteSpendCap(panConfig);
5508
5580
  if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
5509
5581
  const fly = createFlyProviderFromConfig(panConfig.remote);
5510
5582
  yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
5511
- const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-DLthEPAq.js"));
5583
+ const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-Yb2bd3Fq.js"));
5512
5584
  const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
5513
5585
  const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
5514
5586
  issueId,
@@ -5829,6 +5901,7 @@ init_child_env();
5829
5901
  init_harness_policy();
5830
5902
  init_activity_logger();
5831
5903
  init_projects();
5904
+ init_review_status();
5832
5905
  init_io();
5833
5906
  init_read_model();
5834
5907
  init_domain_services();
@@ -5852,6 +5925,25 @@ function emitDirtyWorkspaceRefusalActivity(issueId, porcelain) {
5852
5925
  });
5853
5926
  } catch {}
5854
5927
  }
5928
+ const LEGACY_WORKSPACE_RUNTIME_FILES = new Set([
5929
+ ".pan/continue.json",
5930
+ ".pan/spec.vbrief.json",
5931
+ ".pan/kickoff.md",
5932
+ ".pan/sessions.jsonl",
5933
+ ".pan/pipeline-verdict.json",
5934
+ ".pan/verification-latest.json",
5935
+ ".pan/agent-mcp.json"
5936
+ ]);
5937
+ function isOverdeckWorkspaceRuntimePath(path) {
5938
+ if (path === ".overdeck" || path.startsWith(".overdeck/")) return true;
5939
+ if (path === ".pan" || path === ".pan/") return true;
5940
+ if (LEGACY_WORKSPACE_RUNTIME_FILES.has(path)) return true;
5941
+ return path.startsWith(".pan/feedback/") || path.startsWith(".pan/review/") || path.startsWith(".pan/test/") || path.startsWith(".pan/handoff-");
5942
+ }
5943
+ /** True when git porcelain contains only Overdeck-owned workspace runtime files. */
5944
+ function isOnlyOverdeckRuntimeWorkspaceChanges(porcelain) {
5945
+ return parsePorcelainStatusPaths(porcelain).every(isOverdeckWorkspaceRuntimePath);
5946
+ }
5855
5947
  function spawnGuardrailResourcesHint(hint) {
5856
5948
  const resourcesHint = "Open /resources to inspect Machine Room pressure before retrying.";
5857
5949
  return hint ? `${hint} ${resourcesHint}` : resourcesHint;
@@ -5956,7 +6048,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
5956
6048
  const workspacePanContinuePath = join(workspacePanDir, PAN_CONTINUE_FILENAME);
5957
6049
  let planPath = yield* findPlan(workspacePath);
5958
6050
  if (autoStart && !planPath) {
5959
- yield* writeAutoStartVBrief(projectPath, workspacePath, {
6051
+ yield* writeAutoStartXBrief(projectPath, workspacePath, {
5960
6052
  issueId,
5961
6053
  title: cachedIssue?.title || issueId,
5962
6054
  body: cachedIssue?.description || "",
@@ -5965,7 +6057,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
5965
6057
  planPath = yield* findPlan(workspacePath);
5966
6058
  }
5967
6059
  if (!planPath) return jsonResponse({
5968
- error: `No workspace vBRIEF found for ${issueId}. Work agents require a finalized plan.`,
6060
+ error: `No workspace xBRIEF found for ${issueId}. Work agents require a finalized plan.`,
5969
6061
  hint: "Run planning first, or use auto-start to synthesize a plan before starting the work agent.",
5970
6062
  issueId
5971
6063
  }, { status: 422 });
@@ -5982,8 +6074,8 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
5982
6074
  if (planReadResult._tag === "failure") {
5983
6075
  const { planErr } = planReadResult;
5984
6076
  return jsonResponse({
5985
- error: `Could not read workspace vBRIEF for ${issueId}: ${planErr instanceof Error ? planErr.message : String(planErr)}`,
5986
- hint: "Re-run planning to produce a readable vBRIEF before starting the work agent.",
6077
+ error: `Could not read workspace xBRIEF for ${issueId}: ${planErr instanceof Error ? planErr.message : String(planErr)}`,
6078
+ hint: "Re-run planning to produce a readable xBRIEF before starting the work agent.",
5987
6079
  issueId
5988
6080
  }, { status: 422 });
5989
6081
  }
@@ -6146,33 +6238,6 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6146
6238
  }).unref();
6147
6239
  }
6148
6240
  }).pipe(Effect.catch(() => Effect.void));
6149
- yield* transitionVBriefOnMain(projectPath, issueId, "active", "approved", `scope: approve ${issueId.toUpperCase()} vBRIEF`).pipe(Effect.match({
6150
- onSuccess: (result) => {
6151
- if (result.moved) console.log(`[start-agent] vBRIEF moved ${result.fromDir} → active for ${issueId}`);
6152
- if (result.committed) console.log(`[start-agent] Committed approval transition on main for ${issueId}`);
6153
- },
6154
- onFailure: (err) => {
6155
- console.warn(`[start-agent] vBRIEF approval transition failed (non-fatal): ${err?.message ?? err}`);
6156
- }
6157
- }));
6158
- if (existsSync(planPath)) try {
6159
- updatePlanStatus(planPath, "running");
6160
- console.log(`[start-agent] Set plan.status=running for ${issueId}`);
6161
- } catch (planStatusErr) {
6162
- console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
6163
- }
6164
- try {
6165
- const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = yield* Effect.promise(() => import("./record-rwK-nKv_.js"));
6166
- const recordProject = resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath);
6167
- yield* Effect.promise(() => appendSessionEntry(recordProject, issueId, {
6168
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6169
- reason: "start",
6170
- agentModel: spawnModel
6171
- }));
6172
- console.log(`[start-agent] Wrote start session entry to record for ${issueId}`);
6173
- } catch (continueErr) {
6174
- console.warn(`[start-agent] Failed to write start entry to record (non-fatal): ${continueErr?.message ?? continueErr}`);
6175
- }
6176
6241
  let gatesCommitted = false;
6177
6242
  const commitClearedGates = async () => {
6178
6243
  if (!startGateBlock || gatesCommitted) return;
@@ -6193,6 +6258,38 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6193
6258
  troubled: startGateBlock.troubled
6194
6259
  });
6195
6260
  };
6261
+ let workStartAccepted = false;
6262
+ const markWorkStartAccepted = async () => {
6263
+ if (workStartAccepted) return;
6264
+ workStartAccepted = true;
6265
+ await Effect.runPromise(transitionXBriefOnMain(projectPath, issueId, "active", "approved", `scope: approve ${issueId.toUpperCase()} xBRIEF`).pipe(Effect.match({
6266
+ onSuccess: (result) => {
6267
+ if (result.moved) console.log(`[start-agent] xBRIEF moved ${result.fromDir} → active for ${issueId}`);
6268
+ if (result.committed) console.log(`[start-agent] Committed approval transition for ${issueId}`);
6269
+ },
6270
+ onFailure: (err) => {
6271
+ console.warn(`[start-agent] xBRIEF approval transition failed (non-fatal): ${err?.message ?? err}`);
6272
+ }
6273
+ })));
6274
+ if (existsSync(planPath)) try {
6275
+ updatePlanStatus(planPath, "running");
6276
+ console.log(`[start-agent] Set plan.status=running for ${issueId}`);
6277
+ } catch (planStatusErr) {
6278
+ console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
6279
+ }
6280
+ try {
6281
+ const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-t6V-3Dcj.js");
6282
+ await appendSessionEntry(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId, {
6283
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6284
+ reason: "start",
6285
+ agentModel: spawnModel
6286
+ });
6287
+ console.log(`[start-agent] Wrote start session entry to record for ${issueId}`);
6288
+ } catch (continueErr) {
6289
+ console.warn(`[start-agent] Failed to write start entry to record (non-fatal): ${continueErr?.message ?? continueErr}`);
6290
+ }
6291
+ if (getReviewStatusSync(issueId)?.stuckReason === "planning_auto_handoff_failed") clearWorkspaceStuck(issueId);
6292
+ };
6196
6293
  if (isRemote && workspaceMetadata) {
6197
6294
  const response = yield* Effect.promise(() => spawnAfterClearingStartGates({
6198
6295
  agentSessionName,
@@ -6211,6 +6308,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6211
6308
  }));
6212
6309
  if (response.status < 200 || response.status >= 300) return response;
6213
6310
  yield* Effect.promise(commitClearedGates);
6311
+ yield* Effect.promise(markWorkStartAccepted);
6214
6312
  return response;
6215
6313
  }
6216
6314
  const devScript = join(workspacePath, "dev");
@@ -6242,11 +6340,11 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6242
6340
  console.log(`[start-agent] Killed stale tmux session ${agentSessionName}`);
6243
6341
  }).pipe(Effect.catch(() => Effect.void));
6244
6342
  if (!(body.acknowledgeDirtyWorkspace === true)) try {
6245
- const { stdout: statusOut } = yield* Effect.promise(() => execAsync$2("git status --porcelain", {
6343
+ const { stdout: statusOut } = yield* Effect.promise(() => execAsync$2("git status --porcelain --untracked-files=all", {
6246
6344
  cwd: workspacePath,
6247
6345
  encoding: "utf-8"
6248
6346
  }));
6249
- if (statusOut.trim()) {
6347
+ if (statusOut.trim() && !isOnlyOverdeckRuntimeWorkspaceChanges(statusOut)) {
6250
6348
  const { stdout: diffOut } = yield* Effect.promise(() => execAsync$2("git diff HEAD --stat", {
6251
6349
  cwd: workspacePath,
6252
6350
  encoding: "utf-8"
@@ -6313,7 +6411,58 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6313
6411
  spawnPanCommand,
6314
6412
  updateIssueStatus
6315
6413
  });
6316
- if (containerResponse) return containerResponse;
6414
+ if (containerResponse) {
6415
+ if (containerResponse.status >= 200 && containerResponse.status < 300) yield* Effect.promise(markWorkStartAccepted);
6416
+ return containerResponse;
6417
+ }
6418
+ const placeholderStartedAt = (/* @__PURE__ */ new Date()).toISOString();
6419
+ const placeholderState = {
6420
+ id: agentSessionName,
6421
+ issueId,
6422
+ workspace: workspacePath,
6423
+ role,
6424
+ ...effectiveHarness ? { harness: effectiveHarness } : {},
6425
+ model: "pending-work-spawn",
6426
+ status: "starting",
6427
+ startedAt: placeholderStartedAt,
6428
+ hostOverride: allowHost || void 0
6429
+ };
6430
+ const hasLiveTmuxSession = yield* sessionExists(agentSessionName).pipe(Effect.catch(() => Effect.succeed(true)));
6431
+ const placeholderClaim = yield* claimAgentStartPlaceholderProgram(placeholderState, {
6432
+ type: "agent.started",
6433
+ timestamp: placeholderStartedAt,
6434
+ payload: {
6435
+ agentId: agentSessionName,
6436
+ issueId,
6437
+ agent: {
6438
+ id: agentSessionName,
6439
+ issueId,
6440
+ workspace: workspacePath,
6441
+ status: "starting",
6442
+ startedAt: placeholderStartedAt,
6443
+ role,
6444
+ ...effectiveHarness ? { runtime: effectiveHarness } : {}
6445
+ }
6446
+ }
6447
+ }, hasLiveTmuxSession);
6448
+ if (!placeholderClaim.claimed) {
6449
+ yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.start_placeholder_blocked", {
6450
+ issueId,
6451
+ role,
6452
+ workspacePath,
6453
+ reason: placeholderClaim.reason
6454
+ }));
6455
+ return jsonResponse({
6456
+ error: `Agent ${agentSessionName} is already starting or running.`,
6457
+ code: "AGENT_START_IN_FLIGHT"
6458
+ }, { status: 409 });
6459
+ }
6460
+ yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.start_placeholder_created", {
6461
+ issueId,
6462
+ role,
6463
+ workspacePath,
6464
+ startedAt: placeholderStartedAt
6465
+ }));
6317
6466
  yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.work_spawn_requested", {
6318
6467
  issueId,
6319
6468
  role,
@@ -6328,11 +6477,35 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6328
6477
  harness: effectiveHarness,
6329
6478
  allowHost
6330
6479
  }), workspacePath));
6480
+ yield* Effect.promise(markWorkStartAccepted);
6331
6481
  emitStartAgentPhase(issueId, "spawn", "success", "local work agent spawn requested", {
6332
6482
  workspacePath,
6333
6483
  activityId
6334
6484
  });
6335
6485
  } catch (error) {
6486
+ const initialStateIsPlaceholder = initialAgentState?.model.startsWith("pending-") === true;
6487
+ const fallbackState = initialAgentState && !initialStateIsPlaceholder ? { ...initialAgentState } : {
6488
+ ...placeholderState,
6489
+ model: spawnModel,
6490
+ status: "stopped",
6491
+ stoppedAt: (/* @__PURE__ */ new Date()).toISOString()
6492
+ };
6493
+ const rolledBack = yield* rollbackAgentStartPlaceholderProgram(placeholderState, fallbackState, {
6494
+ type: "agent.status_changed",
6495
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6496
+ payload: {
6497
+ agentId: agentSessionName,
6498
+ status: fallbackState.status,
6499
+ previousStatus: "starting",
6500
+ hasLiveTmuxSession: false
6501
+ }
6502
+ });
6503
+ yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.start_placeholder_rollback", {
6504
+ issueId,
6505
+ rolledBack,
6506
+ fallbackStatus: fallbackState.status
6507
+ }));
6508
+ invalidateAgentsCache();
6336
6509
  const output = String(error?.output ?? error?.message ?? "");
6337
6510
  if (output.includes(`Workspace docker stack for ${issueId}`) && output.includes("is not healthy")) {
6338
6511
  const failedStackHealth = yield* getWorkspaceStackHealth(issueId, {
@@ -6376,55 +6549,8 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6376
6549
  activityId: error?.activityId
6377
6550
  }, { status: 500 });
6378
6551
  }
6379
- const earlyAgentId = agentSessionName;
6380
- const earlyStateDir = join(homedir(), ".overdeck", "agents", earlyAgentId);
6381
- yield* Effect.promise(() => mkdir(earlyStateDir, { recursive: true }));
6382
- saveAgentStateSync({
6383
- id: earlyAgentId,
6384
- issueId,
6385
- ...effectiveHarness ? { harness: effectiveHarness } : {},
6386
- model: "pending-work-spawn",
6387
- status: "starting",
6388
- startedAt: (/* @__PURE__ */ new Date()).toISOString(),
6389
- workspace: workspacePath,
6390
- role,
6391
- hostOverride: allowHost || void 0
6392
- });
6393
- updateRegistryForAgentStart(issueId, workspacePath, earlyAgentId);
6394
- yield* Effect.promise(() => appendAgentLifecycleLog(earlyAgentId, "agent.start_placeholder_created", {
6395
- issueId,
6396
- role,
6397
- workspacePath,
6398
- activityId
6399
- }));
6552
+ updateRegistryForAgentStart(issueId, workspacePath, agentSessionName);
6400
6553
  yield* Effect.promise(() => updateIssueStatus());
6401
- yield* saveAgentStateAndEmitEventProgram({
6402
- id: earlyAgentId,
6403
- issueId,
6404
- workspace: workspacePath,
6405
- role,
6406
- ...effectiveHarness ? { harness: effectiveHarness } : {},
6407
- model: "pending-work-spawn",
6408
- status: "starting",
6409
- startedAt: (/* @__PURE__ */ new Date()).toISOString(),
6410
- hostOverride: allowHost || void 0
6411
- }, {
6412
- type: "agent.started",
6413
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6414
- payload: {
6415
- agentId: earlyAgentId,
6416
- issueId,
6417
- agent: {
6418
- id: earlyAgentId,
6419
- issueId,
6420
- workspace: workspacePath,
6421
- status: "starting",
6422
- startedAt: (/* @__PURE__ */ new Date()).toISOString(),
6423
- role,
6424
- ...effectiveHarness ? { runtime: effectiveHarness } : {}
6425
- }
6426
- }
6427
- });
6428
6554
  try {
6429
6555
  getIssueDataService().patchIssue(issueId, {
6430
6556
  status: "In Progress",
@@ -6589,10 +6715,10 @@ const _serverManagedMerges = /* @__PURE__ */ new Set();
6589
6715
  function firePostMergeLifecycle(issueId, options) {
6590
6716
  const started = postMergeGuard.run(issueId, async () => {
6591
6717
  const projectPath = getProjectPathForIssue(extractPrefixSync(issueId) ?? issueId.split("-")[0]);
6592
- const { postMergeLifecycle } = await import("./merge-agent-B-SnXOoc.js");
6718
+ const { postMergeLifecycle } = await import("./merge-agent-BQM3a8z5.js");
6593
6719
  await postMergeLifecycle(issueId, projectPath, options?.sourceBranch, options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : void 0);
6594
6720
  console.log(`[merge] post-merge lifecycle completed for ${issueId}`);
6595
- const { runMergeTrainReconcile } = await import("./merge-train-CKana8EH.js");
6721
+ const { runMergeTrainReconcile } = await import("./merge-train-DxDfBTjr.js");
6596
6722
  const outcomes = await runMergeTrainReconcile(issueId);
6597
6723
  if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${issueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
6598
6724
  }, (err) => console.error(`[merge] post-merge lifecycle failed for ${issueId}:`, err));
@@ -6613,15 +6739,15 @@ init_io();
6613
6739
  init_domain_services();
6614
6740
  init_tmux();
6615
6741
  const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
6616
- const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
6742
+ const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
6617
6743
  return jsonResponse({
6618
6744
  specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
6619
6745
  projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
6620
6746
  });
6621
6747
  })));
6622
6748
  const postSpecialistsResetAllRoute = HttpRouter.add("POST", "/api/specialists/reset-all", httpHandler(Effect.gen(function* () {
6623
- const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
6624
- const { clearHookSync } = yield* Effect.promise(() => import("./hooks-B-HItBiS.js"));
6749
+ const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
6750
+ const { clearHookSync } = yield* Effect.promise(() => import("./hooks-ltecuFqZ.js"));
6625
6751
  const specialists = getAllSpecialists();
6626
6752
  const results = [];
6627
6753
  for (const specialist of specialists) {
@@ -6673,11 +6799,11 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6673
6799
  if (!itemId) return jsonResponse({ error: "itemId is required for a passed inspect verdict" }, { status: 400 });
6674
6800
  const project = resolveProjectFromIssueSync(normalizedIssueId);
6675
6801
  const workspacePath = project && join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
6676
- if (!(workspacePath ? readWorkspacePlanSync(workspacePath) : void 0)?.plan.items.some((item) => item.id === itemId)) return jsonResponse({ error: `Item "${itemId}" does not exist in the vBRIEF for ${normalizedIssueId}` }, { status: 400 });
6802
+ if (!(workspacePath ? readWorkspacePlanSync(workspacePath) : void 0)?.plan.items.some((item) => item.id === itemId)) return jsonResponse({ error: `Item "${itemId}" does not exist in the xBRIEF for ${normalizedIssueId}` }, { status: 400 });
6677
6803
  }
6678
6804
  console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
6679
6805
  if (specialist === "merge") {
6680
- const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-CqmduO92.js"));
6806
+ const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-BXhav38U.js"));
6681
6807
  if (yield* reportSpecialistCompletion(normalizedIssueId, {
6682
6808
  status,
6683
6809
  notes
@@ -6724,7 +6850,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6724
6850
  if (specialist === "inspect" && status === "failed") yield* Effect.promise(() => reportTieredInspectFailureEscalation(normalizedIssueId, notes));
6725
6851
  yield* Effect.promise(async () => {
6726
6852
  try {
6727
- const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-Dqe6_HE5.js");
6853
+ const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-DVj0hvaL.js");
6728
6854
  const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
6729
6855
  const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
6730
6856
  saveAgentRuntimeState(tmuxSession, {
@@ -6743,7 +6869,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6743
6869
  });
6744
6870
  console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
6745
6871
  }
6746
- const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-Dnjlwt7g.js");
6872
+ const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-C45ouoZ6.js");
6747
6873
  if (await Effect.runPromise(updateSpecialistHandoffStatus(normalizedIssueId, `${specialist}-agent`, status === "passed" ? "completed" : "failed", status === "passed" ? "success" : "failure"))) console.log(`[specialists/done] Updated handoff log: ${specialist}-agent ${normalizedIssueId} → ${status}`);
6748
6874
  } catch (err) {
6749
6875
  console.error(`[specialists/done] Error managing specialist state:`, err);
@@ -6755,7 +6881,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6755
6881
  if (project) {
6756
6882
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
6757
6883
  if (existsSync(workspacePath)) {
6758
- const { getWorkspaceGitInfo } = await import("./git-utils-CsKGnzFA.js");
6884
+ const { getWorkspaceGitInfo } = await import("./git-utils-Dry_Ka_D.js");
6759
6885
  const { HEAD } = await Effect.runPromise(getWorkspaceGitInfo(workspacePath));
6760
6886
  setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: HEAD });
6761
6887
  console.log(`[specialists/done] Snapshotted reviewedAtCommit=${HEAD.substring(0, 8)} for ${normalizedIssueId}`);
@@ -6767,7 +6893,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6767
6893
  });
6768
6894
  if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
6769
6895
  try {
6770
- const { onInspectComplete } = await import("./inspect-agent-Dq0z1k3H.js");
6896
+ const { onInspectComplete } = await import("./inspect-agent-ch-F-5Ci.js");
6771
6897
  const project = resolveProjectFromIssueSync(normalizedIssueId);
6772
6898
  if (project) {
6773
6899
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
@@ -6783,7 +6909,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6783
6909
  if (project) {
6784
6910
  if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
6785
6911
  setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
6786
- const { initEventStore } = await import("./event-store-CpBGsO6_.js");
6912
+ const { initEventStore } = await import("./event-store-Cr5PQwFC.js");
6787
6913
  await (await initEventStore()).appendAsync({
6788
6914
  type: "test.passed",
6789
6915
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -6836,8 +6962,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6836
6962
  if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
6837
6963
  try {
6838
6964
  const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
6839
- const { sessionExists } = await import("./tmux-BAvtac_u.js");
6840
- const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-DyHKlq1I.js");
6965
+ const { sessionExists } = await import("./tmux-DoThH6aj.js");
6966
+ const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-FlIgQ3ql.js");
6841
6967
  if (await Effect.runPromise(sessionExists(workAgentId))) {
6842
6968
  await messageAgent(workAgentId, `MERGE CONFLICT: The merge-agent could not rebase your branch onto main due to conflicts. Please fix this now:\n\n1. git fetch origin main\n2. git rebase origin/main\n3. Resolve any conflicts (git add <file> && git rebase --continue)\n4. git push --force-with-lease\n5. Resubmit: curl -s -X POST http://localhost:3011/api/review/${normalizedIssueId}/request -H "Content-Type: application/json" -d "{}"\n\nConflict details: ${notes}`);
6843
6969
  console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
@@ -6851,7 +6977,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6851
6977
  try {
6852
6978
  const project = resolveProjectFromIssueSync(normalizedIssueId);
6853
6979
  const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
6854
- const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-JImjut0z.js");
6980
+ const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-C1Kg8n7t.js");
6855
6981
  const result = await Effect.runPromise(deliverReviewVerdictFeedback({
6856
6982
  issueId: normalizedIssueId,
6857
6983
  verdict: status === "failed" ? "failed" : "blocked",
@@ -6892,7 +7018,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6892
7018
  });
6893
7019
  })));
6894
7020
  const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
6895
- const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-CQnKzuZs.js"));
7021
+ const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
6896
7022
  const results = cleanupAllLogsSync();
6897
7023
  return jsonResponse({
6898
7024
  success: true,
@@ -6902,7 +7028,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
6902
7028
  });
6903
7029
  })));
6904
7030
  const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
6905
- const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7031
+ const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
6906
7032
  return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
6907
7033
  })));
6908
7034
  const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
@@ -6946,7 +7072,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
6946
7072
  "blocked",
6947
7073
  "failed"
6948
7074
  ].includes(status)) {
6949
- const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7075
+ const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
6950
7076
  saveAgentRuntimeState(getTmuxSessionName(name), {
6951
7077
  state: "idle",
6952
7078
  lastActivity: (/* @__PURE__ */ new Date()).toISOString()
@@ -7067,7 +7193,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
7067
7193
  const issueId = params["issueId"];
7068
7194
  const type = params["type"];
7069
7195
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7070
- const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7196
+ const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7071
7197
  const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
7072
7198
  yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
7073
7199
  saveAgentRuntimeState(tmuxSession, {
@@ -7094,7 +7220,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
7094
7220
  if (limitParam) limit = parseInt(limitParam, 10);
7095
7221
  if (offsetParam) offset = parseInt(offsetParam, 10);
7096
7222
  }
7097
- const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-CQnKzuZs.js"));
7223
+ const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
7098
7224
  return jsonResponse(listRunLogsSync(project, type, {
7099
7225
  limit,
7100
7226
  offset
@@ -7105,7 +7231,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
7105
7231
  const project = params["project"];
7106
7232
  const type = params["type"];
7107
7233
  const runId = params["runId"];
7108
- const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-CQnKzuZs.js"));
7234
+ const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
7109
7235
  const logPath = getRunLogPath(project, type, runId);
7110
7236
  if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
7111
7237
  const encoder = new TextEncoder();
@@ -7164,7 +7290,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
7164
7290
  const project = params["project"];
7165
7291
  const type = params["type"];
7166
7292
  const runId = params["runId"];
7167
- const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-CQnKzuZs.js"));
7293
+ const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
7168
7294
  const content = getRunLogSync(project, type, runId);
7169
7295
  if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
7170
7296
  return jsonResponse({
@@ -7178,7 +7304,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
7178
7304
  const project = params["project"];
7179
7305
  const type = params["type"];
7180
7306
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7181
- const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7307
+ const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7182
7308
  yield* Effect.promise(() => terminateSpecialist(project, type));
7183
7309
  return jsonResponse({
7184
7310
  success: true,
@@ -7190,7 +7316,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
7190
7316
  const project = params["project"];
7191
7317
  const type = params["type"];
7192
7318
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7193
- const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7319
+ const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7194
7320
  if (pauseGracePeriod(project, type)) return jsonResponse({
7195
7321
  success: true,
7196
7322
  message: "Grace period paused"
@@ -7202,7 +7328,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
7202
7328
  const project = params["project"];
7203
7329
  const type = params["type"];
7204
7330
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7205
- const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7331
+ const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7206
7332
  if (resumeGracePeriod(project, type)) return jsonResponse({
7207
7333
  success: true,
7208
7334
  message: "Grace period resumed"
@@ -7214,7 +7340,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
7214
7340
  const project = params["project"];
7215
7341
  const type = params["type"];
7216
7342
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7217
- const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7343
+ const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7218
7344
  exitGracePeriod(project, type);
7219
7345
  return jsonResponse({
7220
7346
  success: true,
@@ -7226,7 +7352,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
7226
7352
  const project = params["project"];
7227
7353
  const type = params["type"];
7228
7354
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7229
- const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7355
+ const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7230
7356
  const state = getGracePeriodState(project, type);
7231
7357
  if (state) return jsonResponse(state);
7232
7358
  else return jsonResponse({ error: "No active grace period" }, { status: 404 });
@@ -7235,7 +7361,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
7235
7361
  const params = yield* HttpRouter.params;
7236
7362
  const project = params["project"];
7237
7363
  const type = params["type"];
7238
- const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-CJ-QjFR-.js"));
7364
+ const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-DtrYvGJ-.js"));
7239
7365
  const digest = loadContextDigest(project, type);
7240
7366
  if (digest) return jsonResponse({ digest });
7241
7367
  else return jsonResponse({ error: "No context digest found" }, { status: 404 });
@@ -7244,7 +7370,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
7244
7370
  const params = yield* HttpRouter.params;
7245
7371
  const project = params["project"];
7246
7372
  const type = params["type"];
7247
- const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-CJ-QjFR-.js"));
7373
+ const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-DtrYvGJ-.js"));
7248
7374
  const digest = yield* Effect.promise(() => regenerateContextDigest(project, type));
7249
7375
  if (digest) return jsonResponse({
7250
7376
  digest,
@@ -7263,7 +7389,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
7263
7389
  "blocked"
7264
7390
  ].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
7265
7391
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7266
- const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-Dqe6_HE5.js"));
7392
+ const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7267
7393
  signalSpecialistCompletion(project, type, {
7268
7394
  status,
7269
7395
  notes
@@ -7297,8 +7423,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
7297
7423
  const params = yield* HttpRouter.params;
7298
7424
  const project = params["project"];
7299
7425
  const type = params["type"];
7300
- const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-CQnKzuZs.js"));
7301
- const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-BKkwpH6q.js"));
7426
+ const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
7427
+ const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-9SkRpES9.js"));
7302
7428
  const retention = getSpecialistRetention(project);
7303
7429
  const deleted = cleanupOldLogsSync(project, type, {
7304
7430
  maxDays: retention.max_days,
@@ -7319,7 +7445,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
7319
7445
  const project = params["project"];
7320
7446
  const issueId = params["issueId"];
7321
7447
  const { model, harness } = yield* readJsonBody;
7322
- const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-CCum8sGe.js"));
7448
+ const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-DJRO8EG8.js"));
7323
7449
  const killResult = yield* killAllReviewerSessions(project, issueId);
7324
7450
  const projectConfig = resolveProjectFromIssueSync(issueId);
7325
7451
  if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
@@ -7333,7 +7459,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
7333
7459
  }));
7334
7460
  branch = stdout.trim() || "unknown";
7335
7461
  } catch {}
7336
- const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-CCum8sGe.js"));
7462
+ const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-DJRO8EG8.js"));
7337
7463
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
7338
7464
  const result = yield* spawnReviewRoleForIssue({
7339
7465
  issueId,
@@ -7482,6 +7608,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
7482
7608
  */
7483
7609
  const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
7484
7610
  //#endregion
7485
- export { runInBatches as $, handleConversationDelete as A, stopConversationRuntime as B, isPiControlChannelHarness as C, conversationNeedsRunningRepair as D, validateConversationControlAckOrigin as E, isInsideGitWorkTree as F, cleanupOrphanedConversationAttachments as G, waitForPiTuiReady as H, resolveAllowedHarness as I, extractConversationAttachmentPaths as J, cleanupUnreferencedConversationAttachments as K, shouldReportUnresolvedLiveSession as L, handleConversationResume as M, handleConversationStop as N, conversationSessionAliveFromState as O, handleConversationSwitchModel as P, removeConversationAttachment as Q, spawnConversationSession as R, handleConversationThinkingLevel as S, resolveConversationDeliveryMethod as T, waitForTmuxSession as U, tmuxSessionExists as V, cleanupConversationAttachments as W, hasConversationAttachment as X, getConversationAttachmentsRoot as Y, isManagedConversationAttachmentPath as Z, handleConversationCodexApproval as _, validateOrigin as _t, agentsRouteLayer as a, panCliInvocation as at, handleConversationDeliveryMethod as b, getDefaultCwd as bt, hasDashboardInternalToken as c, resolveAgentHarness as ct, rejectUnsafeDashboardMutationRequest as d, resolveJsonlPath as dt, evaluateSpawnGuardrails as et, saveAgentStateAndEmitEvent as f, resolvePiSessionPath as ft, handleConversationAbort as g, isTrustedOriginForHost as gt, deliverConversationViaControlChannel as h, getHeaderFromMap as ht, validateSpecialistAutoCompleteMetadata as i, getWorkAgentLifecycleStateSync as it, handleConversationRestartAll as j, handleConversationCreate as k, rejectUnauthorizedDashboardRequest as l, resolveClaudeSessionId as lt, codexConversationPendingInput as m, waitForSessionRespawn as mt, _serverManagedMerges as n, resolveAgentGitInfo as nt, dashboardCsrfToken as o, spawnPanCli as ot, saveAgentStateAndEmitEventProgram as p, isRespawnPending as pt, ensureConversationAttachmentDir as q, firePostMergeLifecycle as r, resolveConversationGitInfo as rt, dashboardSessionCookieHeader as s, readLauncherPinnedSessionId as st, specialistsRouteLayer as t, invalidateAgentsCache as tt, rejectUnauthorizedDashboardSessionMintRequest as u, resolveCodexRolloutPath as ut, handleConversationCompact as v, validateOriginHeaders as vt, pickDeliverAs as w, handleConversationPlanAction as x, jsonResponse as xt, handleConversationControlAck as y, httpHandler as yt, startConversationModelBackfill as z };
7611
+ export { runInBatches as $, handleConversationDelete as A, stopConversationRuntime as B, isPiControlChannelHarness as C, conversationNeedsRunningRepair as D, validateConversationControlAckOrigin as E, isInsideGitWorkTree as F, cleanupOrphanedConversationAttachments as G, waitForPiTuiReady as H, resolveAllowedHarness as I, extractConversationAttachmentPaths as J, cleanupUnreferencedConversationAttachments as K, shouldReportUnresolvedLiveSession as L, handleConversationResume as M, handleConversationStop as N, conversationSessionAliveFromState as O, handleConversationSwitchModel as P, removeConversationAttachment as Q, spawnConversationSession as R, handleConversationThinkingLevel as S, jsonStringResponse as St, resolveConversationDeliveryMethod as T, waitForTmuxSession as U, tmuxSessionExists as V, cleanupConversationAttachments as W, hasConversationAttachment as X, getConversationAttachmentsRoot as Y, isManagedConversationAttachmentPath as Z, handleConversationCodexApproval as _, validateOrigin as _t, agentsRouteLayer as a, panCliInvocation as at, handleConversationDeliveryMethod as b, getDefaultCwd as bt, hasDashboardInternalToken as c, resolveAgentHarness as ct, rejectUnsafeDashboardMutationRequest as d, resolveJsonlPath as dt, evaluateSpawnGuardrails as et, saveAgentStateAndEmitEvent as f, resolvePiSessionPath as ft, handleConversationAbort as g, isTrustedOriginForHost as gt, deliverConversationViaControlChannel as h, getHeaderFromMap as ht, validateSpecialistAutoCompleteMetadata as i, getWorkAgentLifecycleStateSync as it, handleConversationRestartAll as j, handleConversationCreate as k, rejectUnauthorizedDashboardRequest as l, resolveClaudeSessionId as lt, codexConversationPendingInput as m, waitForSessionRespawn as mt, _serverManagedMerges as n, resolveAgentGitInfo as nt, dashboardCsrfToken as o, spawnPanCli as ot, saveAgentStateAndEmitEventProgram as p, isRespawnPending as pt, ensureConversationAttachmentDir as q, firePostMergeLifecycle as r, resolveConversationGitInfo as rt, dashboardSessionCookieHeader as s, readLauncherPinnedSessionId as st, specialistsRouteLayer as t, invalidateAgentsCache as tt, rejectUnauthorizedDashboardSessionMintRequest as u, resolveCodexRolloutPath as ut, handleConversationCompact as v, validateOriginHeaders as vt, pickDeliverAs as w, handleConversationPlanAction as x, jsonResponse as xt, handleConversationControlAck as y, httpHandler as yt, startConversationModelBackfill as z };
7486
7612
 
7487
- //# sourceMappingURL=specialists-Bg9v4z3F.js.map
7613
+ //# sourceMappingURL=specialists-JVO00bs7.js.map