@overdeck/desktop 0.45.21 → 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 (387) hide show
  1. package/package.json +1 -1
  2. package/server/{acceptance-criteria-CJIFA8Vg.js → acceptance-criteria-DOA0KgXx.js} +5 -5
  3. package/server/{advancing-selfheal-CPOBO5ZS.js → advancing-selfheal-BBu6DSNm.js} +6 -6
  4. package/server/{agent-gc-D6PUckBB.js → agent-gc-BV1q_2EV.js} +4 -4
  5. package/server/agent-state-Bg0lhqwj.js +3 -0
  6. package/server/{agent-state-service-DHwemt96.js → agent-state-service-CnzFKSAQ.js} +1 -1
  7. package/server/{agent-state-service-6MFQqnFy.js → agent-state-service-HoK8U4jW.js} +5 -5
  8. package/server/{agents-DbrHWunF.js → agents-B4Bjbkfv.js} +4 -4
  9. package/server/agents-FlIgQ3ql.js +3 -0
  10. package/server/{archive-planning-BOnwJq8M.js → archive-planning-DYrYojxl.js} +31 -7
  11. package/server/{archive-planning-MPpvQJL4.js → archive-planning-zkJb3BeM.js} +1 -1
  12. package/server/{artifact-index-jobs-BOoySTKD.js → artifact-index-jobs-C-xy7Z5v.js} +2 -2
  13. package/server/{backlog-auto-trigger-BUaFI44J.js → backlog-auto-trigger-GtG71X8H.js} +3 -3
  14. package/server/{behavior-Dg-D8eBG.js → behavior-B_-4EKF3.js} +2 -2
  15. package/server/{briefing-freshness-OouGbJ7d.js → briefing-freshness-DWdW7vUm.js} +2 -2
  16. package/server/{build-info-27NlbKhV.js → build-info-BT096lEl.js} +3 -3
  17. package/server/{build-info-Cv6CI7Gu.js → build-info-DgTqZkL5.js} +1 -1
  18. package/server/{checkpoint-manager-C7mFCY_E.js → checkpoint-manager-B7Bt29J0.js} +1 -1
  19. package/server/{checkpoint-manager-D64fCC4p.js → checkpoint-manager-DDqcGyu8.js} +2 -2
  20. package/server/checkpoint-worker.js +1 -1
  21. package/server/{checkpoints-Vh-J15ge.js → checkpoints-C-AXLfYT.js} +2 -2
  22. package/server/{checkpoints-DwZqT2qQ.js → checkpoints-CpgCjAlN.js} +1 -1
  23. package/server/{claude-hooks-provision-CS5W_dhI.js → claude-hooks-provision-C8wdRnN1.js} +1 -1
  24. package/server/{claude-hooks-provision-BVLGfHrv.js → claude-hooks-provision-but-_qGY.js} +2 -2
  25. package/server/{claude-permissions-C2OrLYKL.js → claude-permissions-H_5wHQZQ.js} +2 -2
  26. package/server/{claude-settings-overlay-DWXjafJh.js → claude-settings-overlay-BTENVmYf.js} +1 -1
  27. package/server/{claude-settings-overlay-DX-fMFpC.js → claude-settings-overlay-CbSz0Dvb.js} +2 -2
  28. package/server/cli-BsVIHwzC.js +3 -0
  29. package/server/{cli-mvpEOb3w.js → cli-vBeXbPrq.js} +9 -9
  30. package/server/{cliproxy-Dvsr4ZkW.js → cliproxy-Bgb2XCqi.js} +2 -2
  31. package/server/{cliproxy-7g1nObvB.js → cliproxy-DW0V86F8.js} +1 -1
  32. package/server/{close-issue-8F6uawYj.js → close-issue-Dn_4c4G8.js} +5 -5
  33. package/server/{closed-issue-reaper-BhV-r-tC.js → closed-issue-reaper-CWpY2uBw.js} +1 -1
  34. package/server/{closed-issue-reaper-BaYQYF6w.js → closed-issue-reaper-hANY_ehE.js} +9 -9
  35. package/server/codex-Dg7Is5yb.js +3 -0
  36. package/server/{codex-D_UBEOwL.js → codex-TmSi-yTv.js} +30 -8
  37. package/server/{codex-parser-BTzlOZiV.js → codex-parser-C4gSH-IR.js} +2 -2
  38. package/server/{config-CrduXs4a.js → config-CCvjQf27.js} +2 -2
  39. package/server/{config-nAB_F-Gp.js → config-DUIhMN_T.js} +1 -1
  40. package/server/{config-G1TOMJZA.js → config-DjLOdbgT.js} +2 -2
  41. package/server/{config-yaml-Ciyp2mYe.js → config-yaml-DvyMuOle.js} +177 -211
  42. package/server/{conflict-gate-BKalpcjL.js → conflict-gate-BSJkNTdp.js} +1 -1
  43. package/server/{conflict-gate-BLUNMs1i.js → conflict-gate-CmrYpa47.js} +3 -3
  44. package/server/{context-layers-YNpf6Q_I.js → context-layers-B3Nt58jl.js} +2 -2
  45. package/server/{context-layers-Cg9ZgVfx.js → context-layers-ZYFcWiyc.js} +3 -3
  46. package/server/{control-settings-D_79A6gp.js → control-settings-aP1ANIlI.js} +4 -4
  47. package/server/{conversation-compaction-DiuZbIUB.js → conversation-compaction-CNbTLB86.js} +8 -8
  48. package/server/{conversation-compaction-CMIeWW4_.js → conversation-compaction-DiG5zWQq.js} +1 -1
  49. package/server/{conversation-service-DQybSPUK.js → conversation-service-Du-MTNpJ.js} +6 -6
  50. package/server/{conversation-service-CWk8mEym.js → conversation-service-Up7FEzIC.js} +1 -1
  51. package/server/{conversations-BJ-t3BRm.js → conversations-6mPANqvL.js} +1 -1
  52. package/server/{conversations-BUgGvqVL.js → conversations-DbOs1e9Q.js} +4 -4
  53. package/server/{cost-jJ2cgDcG.js → cost-CW4WSe72.js} +3 -3
  54. package/server/{cost-Drm7qeD5.js → cost-Ca0YTWDw.js} +18 -2
  55. package/server/{cost-sync-DzHP6zaR.js → cost-sync-C0VdGme1.js} +3 -3
  56. package/server/{dag-DIji6O2b.js → dag-CdOjJVDT.js} +9 -9
  57. package/server/{dangerous-git-ops-BebB-61h.js → dangerous-git-ops-CT-IypG3.js} +1 -1
  58. package/server/dashboard-db-worker.js +7 -7
  59. package/server/{deacon-pleYrvIm.js → deacon-DYSEJb48.js} +3 -3
  60. package/server/{deacon-nudge-log-C5VCKtyi.js → deacon-nudge-log-Bjg8U4Y9.js} +3 -3
  61. package/server/{deacon-1s7bM5zn.js → deacon-pRnyD5w9.js} +1133 -474
  62. package/server/deacon-swarm-9jRLS5Ke.js +2 -0
  63. package/server/{deacon-swarm-DmA3rJ7k.js → deacon-swarm-DftYRDo8.js} +17 -17
  64. package/server/deacon.js +8 -8
  65. package/server/{deploy-patrol-DmM6F-yw.js → deploy-patrol-Bjsho_ha.js} +136 -19
  66. package/server/{deploy-window-ClLq1RYf.js → deploy-window-CM6W1-c6.js} +1 -1
  67. package/server/{deploy-window-jw4S_Y-c.js → deploy-window-DeP_OIRk.js} +77 -10
  68. package/server/{dev-supervisor-Do2Stz49.js → dev-supervisor-BpMoHlkR.js} +2 -2
  69. package/server/{devcontainer-renderer-D8ylupco.js → devcontainer-renderer-CtUgrVKW.js} +3 -3
  70. package/server/dist-Bd3vn0Hw.js +3 -0
  71. package/server/{dist-yfR7G1BL.js → dist-DyRx4cI7.js} +1 -1
  72. package/server/{docker-ClwPQaba.js → docker-BK7HIcBj.js} +2 -2
  73. package/server/{dod-BLphkhjs.js → dod-BrSfUHm0.js} +1 -1
  74. package/server/{ensure-devcontainer-BA3bICoY.js → ensure-devcontainer-DRqaAkBR.js} +1 -1
  75. package/server/{ensure-devcontainer-CFpQatOc.js → ensure-devcontainer-DseivYEy.js} +4 -4
  76. package/server/{esm-shims-BZw-fTQ6.js → esm-shims-CbI3BVkl.js} +1 -1
  77. package/server/{event-store-DABarGNz.js → event-store-Cr5PQwFC.js} +1 -1
  78. package/server/{event-store-BVnON3vf.js → event-store-tdiY5eDZ.js} +3 -3
  79. package/server/{events-CmERlnwn.js → events-CC1dgUpx.js} +3 -3
  80. package/server/{events-LGeUehYW.js → events-CvvGK6LT.js} +1 -1
  81. package/server/{factory-CQNprtHe.js → factory-CynerjXO.js} +50 -13
  82. package/server/{feature-registry-population-D9Z3tYSa.js → feature-registry-population-B0pmAz0a.js} +4 -4
  83. package/server/{feature-registry-storage-BWymOgXE.js → feature-registry-storage-_wUBRD3J.js} +2 -2
  84. package/server/{features--fOza5g5.js → features-Dhxz-wLc.js} +2 -2
  85. package/server/{feedback-target-Dqik2WTe.js → feedback-target-CPS15Vte.js} +7 -7
  86. package/server/{feedback-target-Dn9vfPpz.js → feedback-target-iygZwmMc.js} +1 -1
  87. package/server/{feedback-writer-Wlq5-qgS.js → feedback-writer-C9b6ccN1.js} +6 -5
  88. package/server/{feedback-writer-DDQNV8uc.js → feedback-writer-qmiMbqTZ.js} +1 -1
  89. package/server/{flywheel-Q-38YhZG.js → flywheel-DMCUzDWg.js} +1 -1
  90. package/server/{flywheel-1Wd8WDlh.js → flywheel-DSSpWmqF.js} +13 -13
  91. package/server/{flywheel-DPUc8r3V.js → flywheel-DcBkQvgE.js} +14 -14
  92. package/server/{flywheel-merge-order-CeBuX0EJ.js → flywheel-merge-order-C-6zRLvM.js} +1 -1
  93. package/server/{flywheel-merge-order-4SqOXFAr.js → flywheel-merge-order-DxbQKE1d.js} +8 -8
  94. package/server/forge-B-ZWyTRm.js +2 -0
  95. package/server/{forge-DBbDpiYc.js → forge-Ch9gCFod.js} +2 -2
  96. package/server/{from-hh6vTBGl.js → from-CJ_aH5jD.js} +1 -1
  97. package/server/{fts-db-6ponMie2.js → fts-db-CKgg0VKg.js} +2 -2
  98. package/server/{fts-operations-KIRK165y.js → fts-operations-BrL_VTRr.js} +2 -2
  99. package/server/git-utils-BVa07a4a.js +198 -0
  100. package/server/{git-utils-DmF5xkj8.js → git-utils-Dry_Ka_D.js} +1 -1
  101. package/server/{github-app-B3yfECo8.js → github-app-CMBdIFBQ.js} +11 -3
  102. package/server/{github-app-CeSVFL6C.js → github-app-CPfoFAdV.js} +1 -1
  103. package/server/{github-client-Dslipypz.js → github-client--XVlDpwM.js} +2 -2
  104. package/server/{github-client-4A6FgA8O.js → github-client-B4QsdE-X.js} +1 -1
  105. package/server/{github-pr-lookup-DBP0YHMr.js → github-pr-lookup-BRbDW-qk.js} +2 -2
  106. package/server/harness-binary-CVio2m-u.js +106 -0
  107. package/server/{harness-resolve-BGpO-OVM.js → harness-resolve-qHJBhy3Z.js} +9 -15
  108. package/server/{health-events-CZGZ5I-A.js → health-events-C9B8y1Hm.js} +2 -2
  109. package/server/{health-events-CnwV_SSz.js → health-events-CpfvuVmm.js} +1 -1
  110. package/server/{hooks-CoNscX84.js → hooks-DUXw8A0-.js} +2 -2
  111. package/server/{hooks-DvX33gY_.js → hooks-ltecuFqZ.js} +1 -1
  112. package/server/{hume-DSJt5eA_.js → hume-BEq0bUDg.js} +2 -2
  113. package/server/hume-B_DbflNM.js +3 -0
  114. package/server/{idle-stack-reaper-5DVRoY6P.js → idle-stack-reaper-D7w9t3fE.js} +1 -1
  115. package/server/{idle-stack-reaper-BfL8HqYy.js → idle-stack-reaper-w1ISSlhs.js} +2 -2
  116. package/server/{in-flight-guard-tVGiI5ee.js → in-flight-guard-aQ1IxeI3.js} +2 -2
  117. package/server/{infra-DN2wSxle.js → infra-CzaSOgul.js} +4 -4
  118. package/server/{injection-DtlT8Akv.js → injection-DZ0PfYa4.js} +7 -7
  119. package/server/{injection-DK9zh_HL.js → injection-oNZeoDhL.js} +1 -1
  120. package/server/{inspect-agent-DKByUS_F.js → inspect-agent-DJKLWcVT.js} +15 -11
  121. package/server/inspect-agent-ch-F-5Ci.js +2 -0
  122. package/server/{internal-token-DhfFiwW7.js → internal-token-Bb4XeV2x.js} +2 -2
  123. package/server/{internal-token-7bYL5v6K.js → internal-token-DXdfprGr.js} +1 -1
  124. package/server/{io-BiM-7Zsx.js → io-B3_AHDfr.js} +160 -184
  125. package/server/{issue-closed-Dfw3QDyZ.js → issue-closed-zhdvQicO.js} +7 -7
  126. package/server/{issue-lifecycle-B7HZWnTA.js → issue-lifecycle-CreaCkjW.js} +22 -22
  127. package/server/{issue-lifecycle-ytsEdDlK.js → issue-lifecycle-Dy4vd0Oa.js} +1 -1
  128. package/server/{issue-service-singleton-CPESc4Or.js → issue-service-singleton-B5ushCvE.js} +8 -8
  129. package/server/{issue-service-singleton-D5EB5eYr.js → issue-service-singleton-DabvBWUp.js} +1 -1
  130. package/server/{issues-XYtFMxrH.js → issues-B6ToV6x1.js} +2 -2
  131. package/server/{jsonl-parser-DJV2eZUP.js → jsonl-parser-Dhflo1SH.js} +3 -3
  132. package/server/{label-cleanup-CJ4m8iRU.js → label-cleanup-BKPJm4Hv.js} +3 -3
  133. package/server/{label-reconciler-CNf3Ylm3.js → label-reconciler-DdWbHEBu.js} +4 -4
  134. package/server/{launcher-generator-5DJRiovn.js → launcher-generator-CHVm7bGT.js} +10 -9
  135. package/server/{layers-cZx7ibtV.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-DMurK4oM.js → lifecycle-io-D8iNBcux.js} +37 -37
  139. package/server/{lifecycle-CE7619Xw.js → lifecycle-sycO16hj.js} +6 -6
  140. package/server/{linear-client-BLyN-NiP.js → linear-client-D4zqMnX7.js} +2 -2
  141. package/server/{linear-client-Bj1l4FOA.js → linear-client-DqhDQO9k.js} +1 -1
  142. package/server/memory-fts-worker.js +1 -1
  143. package/server/{merge-hSC2BENe.js → merge-C_ZEhbqI.js} +3 -3
  144. package/server/{merge-CwX2_AWm.js → merge-DK23JEdS.js} +1 -1
  145. package/server/{merge-agent-CnORPiri.js → merge-agent-BQM3a8z5.js} +1 -1
  146. package/server/{merge-agent-DnBsms_V.js → merge-agent-XrB80vfT.js} +369 -213
  147. package/server/{merge-batch-C2w2U2eK.js → merge-batch-Bwoyr8Je.js} +1 -1
  148. package/server/{merge-blockers-DhRgh76x.js → merge-blockers-BsFjGrQ8.js} +2 -2
  149. package/server/merge-ops-DlB1IM0Y.js +2 -0
  150. package/server/{merge-rebase-CE-ZyOMY.js → merge-rebase-C1KIVr0s.js} +2 -2
  151. package/server/{merge-set-D7YNU1ZB.js → merge-set-DLz0MkGT.js} +3 -3
  152. package/server/{merge-set-DHkzPCJU.js → merge-set-DnSYdBEp.js} +1 -1
  153. package/server/{merge-sync-De1FYva5.js → merge-sync-DZ9dojJn.js} +2 -2
  154. package/server/{merge-sync-CpGA9Kg7.js → merge-sync-SSv3E-pl.js} +1 -1
  155. package/server/{merge-train-SvkRJZ-k.js → merge-train-DxDfBTjr.js} +3 -3
  156. package/server/{merge-train-deps-CECJTElu.js → merge-train-deps-CyYQUksx.js} +4 -4
  157. package/server/{merge-verification-B3meGcXF.js → merge-verification-CSizH3HY.js} +4 -4
  158. package/server/{multipart-parser-ByTMgYV5.js → multipart-parser-Dt8YPN5S.js} +2 -2
  159. package/server/{no-resume-mode-BnInAFKs.js → no-resume-mode-Cx3K0hHi.js} +11 -8
  160. package/server/node_modules/.package-lock.json +5 -5
  161. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +3 -3
  162. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
  163. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +2 -2
  164. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
  165. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +5 -5
  166. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +6 -8
  167. package/server/{orphan-proposed-reconciler-CAfuWTA1.js → orphan-proposed-reconciler-BTkDrl4R.js} +1 -1
  168. package/server/{orphan-proposed-reconciler-AxAGUouN.js → orphan-proposed-reconciler-neK8dHQk.js} +23 -14
  169. package/server/package-lock.json +6 -6
  170. package/server/package.json +1 -1
  171. package/server/{pan-dir-Rw17YjT1.js → pan-dir-DeVUgwA7.js} +78 -58
  172. package/server/{paths-FP8v3lTz.js → paths-_zEts6wc.js} +2 -2
  173. package/server/{pickup-xi3KTLaJ.js → pickup-Dd0Znxxy.js} +2 -2
  174. package/server/{pipeline-membership-BtKMNY7v.js → pipeline-membership-0HaEGDlH.js} +190 -68
  175. package/server/{pipeline-notifier-dQ-U4NSb.js → pipeline-notifier-6iCJplFZ.js} +1 -1
  176. package/server/{pipeline-notifier-BM2HLF7B.js → pipeline-notifier-D0ykk59O.js} +2 -2
  177. package/server/{project-pipelines-B59NfN44.js → project-pipelines-2sK1apsO.js} +2 -2
  178. package/server/projects-9SkRpES9.js +3 -0
  179. package/server/{prompts-CbqaVjbe.js → prompts-Dp4Tpk39.js} +2 -2
  180. package/server/providers-DKkBXhxU.js +3 -0
  181. package/server/{providers-d3pwXGVE.js → providers-DV7ec8l7.js} +7 -7
  182. package/server/public/assets/{chunk-BO2N2NFS-BxYSL7J-.js → chunk-BO2N2NFS-CltymLRg.js} +4 -4
  183. package/server/public/assets/{diagram-OG6HWLK6-C_F9Q2as.js → diagram-OG6HWLK6-D2f6pjgA.js} +1 -1
  184. package/server/public/assets/{dist-DQNg4CiF.js → dist-BWR4qFiV.js} +1 -1
  185. package/server/public/assets/{dist-CLSlc6cV.js → dist-DEmlBBNQ.js} +3 -3
  186. package/server/public/assets/{ganttDiagram-6RSMTGT7-Cq0my-0C.js → ganttDiagram-6RSMTGT7-DnfiViPK.js} +1 -1
  187. package/server/public/assets/{highlighted-body-OFNGDK62-eZC03dGh.js → highlighted-body-OFNGDK62-B8Wrmj9H.js} +1 -1
  188. package/server/public/assets/index-CUr1xv8w.css +1 -0
  189. package/server/public/assets/{index-SLYGA8AQ.js → index-CsSuZQBI.js} +148 -145
  190. package/server/public/assets/{linear-6Fi3qnGg.js → linear-C9zFQpkX.js} +1 -1
  191. package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +1 -0
  192. package/server/public/assets/{pieDiagram-4H26LBE5-Dpmc6xsv.js → pieDiagram-4H26LBE5-lR8H7Yjd.js} +1 -1
  193. package/server/public/assets/{prod-ojHllFvN.js → prod-B1jCQihw.js} +4 -4
  194. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Ulr9gON5.js → quadrantDiagram-W4KKPZXB-CVQ2guem.js} +1 -1
  195. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CwdHGXfL.js → sankeyDiagram-5OEKKPKP-eD1RB4gm.js} +1 -1
  196. package/server/public/assets/{xychartDiagram-2RQKCTM6-r-bEDzJh.js → xychartDiagram-2RQKCTM6-ChEC6dQn.js} +1 -1
  197. package/server/public/index.html +54 -10
  198. package/server/{pull-requests-D3N6HQzI.js → pull-requests--Ib2jTgy.js} +1 -1
  199. package/server/{pull-requests-CjjPj7v6.js → pull-requests-CXIhdCYD.js} +13 -11
  200. package/server/{queries-B5hl7lMQ.js → queries-6d7Cdtm7.js} +723 -110
  201. package/server/{rally-Dp0Gb1DN.js → rally-B708-nZn.js} +3 -3
  202. package/server/{rally-api-DGaFz5L5.js → rally-api-nY0ZANw3.js} +2 -2
  203. package/server/{rally-api-CKr0O4DJ.js → rally-api-yjQ0TfHd.js} +1 -1
  204. package/server/{rally-client-SVbjGvqj.js → rally-client-B1EJhfV0.js} +4 -4
  205. package/server/{rally-client-Cqf6EX_r.js → rally-client-CULK2XAY.js} +1 -1
  206. package/server/rally-njs_mJrt.js +3 -0
  207. package/server/reap-terminal-sessions-MWnqdLCJ.js +4 -0
  208. package/server/{reap-terminal-sessions-CjqRAGw7.js → reap-terminal-sessions-N3BTkmX_.js} +11 -28
  209. package/server/{rebuild-stack-DHqCLvLX.js → rebuild-stack-Dp4eLkt4.js} +6 -6
  210. package/server/{rebuild-stack-DjdpALr1.js → rebuild-stack-kA7XngID.js} +1 -1
  211. package/server/{reconstruct-cache-BqrCQt0o.js → reconstruct-cache-uWbZfjms.js} +6 -6
  212. package/server/record-t6V-3Dcj.js +3 -0
  213. package/server/{record-update-BlB8mpKO.js → record-update-DACtKh6_.js} +1 -1
  214. package/server/record-update-Dq0t2uBG.js +310 -0
  215. package/server/{recovery-trip-l1Hsi37x.js → recovery-trip-BJtIQuag.js} +2 -2
  216. package/server/{release-engine-CSI4K6Oj.js → release-engine-DZpmGGzb.js} +5 -5
  217. package/server/{release-set-BywwggrE.js → release-set-hnXd_kga.js} +3 -3
  218. package/server/{remote-DYziAkiZ.js → remote-4tiENDaI.js} +3 -3
  219. package/server/{remote-cnoeuDWn.js → remote-Br-ZWVIP.js} +3 -3
  220. package/server/{remote-agents-BNORDWAX.js → remote-agents-CRCg1L4H.js} +1 -1
  221. package/server/{remote-agents-CZ2rc8I0.js → remote-agents-nmty1mLu.js} +6 -6
  222. package/server/{remote-completion-W67FNQ-A.js → remote-completion-BbWNd10K.js} +13 -13
  223. package/server/resume-CcKqnTvE.js +3 -0
  224. package/server/{review-agent-CSswH985.js → review-agent-DJRO8EG8.js} +1 -1
  225. package/server/{review-agent-CqSqSHkU.js → review-agent-sKkE1FEL.js} +23 -23
  226. package/server/{review-artifacts-BBgnd5df.js → review-artifacts-BLbSC4ke.js} +5 -5
  227. package/server/{review-context-Ctp9BdNJ.js → review-context-BgX3lcCx.js} +9 -9
  228. package/server/{review-status-CCgPVK1h.js → review-status-A7quS5KJ.js} +56 -39
  229. package/server/review-status-C6n6-9f_.js +3 -0
  230. package/server/{review-status-enrichment-DtDRGpst.js → review-status-enrichment-tbOn_A_u.js} +3 -3
  231. package/server/review-status-source-CxuEjLGg.js +39 -0
  232. package/server/{review-status-sync-jnLgd04F.js → review-status-sync-BhSQ0d0l.js} +2 -2
  233. package/server/{review-status-sync-C792ksoJ.js → review-status-sync-To3-iS-N.js} +1 -1
  234. package/server/{review-verdict-feedback-D5lW0o3k.js → review-verdict-feedback-C1Kg8n7t.js} +1 -1
  235. package/server/{review-verdict-feedback-CMsIpTpy.js → review-verdict-feedback-CTRNtzXO.js} +7 -7
  236. package/server/{rollup-B3kQmNpl.js → rollup-B53Y81xK.js} +1 -1
  237. package/server/{rollup-CLj_AK9f.js → rollup-WA0VD-Rr.js} +8 -8
  238. package/server/{scanner-C4NeC4FE.js → scanner-D2743cp8.js} +11 -7
  239. package/server/{sequence-io-Ce-6grIY.js → sequence-io-Cg0zYj_E.js} +4 -4
  240. package/server/{sequencer-agent-Bpz0yGmG.js → sequencer-agent-BGY8gjg-.js} +5 -5
  241. package/server/server.js +1348 -963
  242. package/server/{service-CqAY8Kmk.js → service-DCpB_SGd.js} +154 -51
  243. package/server/{session-fork-uNo4rMRA.js → session-fork-BQ8_6H32.js} +2 -2
  244. package/server/{session-history-DUehL3KN.js → session-history-CVZDpS3c.js} +4 -4
  245. package/server/{settings-DP2OYLXL.js → settings-BZ5m1UCl.js} +3 -3
  246. package/server/settings-D0OSwos5.js +2 -0
  247. package/server/{settings-D9grjmaP.js → settings-ylxwqwQG.js} +2 -2
  248. package/server/{shadow-engineering-Bi_oIMtF.js → shadow-engineering-BlxG6Xye.js} +3 -3
  249. package/server/{shadow-state-CDxEuPlE.js → shadow-state-C2_epgx2.js} +1 -1
  250. package/server/{shadow-state-a_ztFBJe.js → shadow-state-Dh-HzF2J.js} +2 -2
  251. package/server/{shadow-utils-CyOg6_Xq.js → shadow-utils-4bvjn9b3.js} +2 -2
  252. package/server/{ship-log-DDcueaIR.js → ship-log-ClSMIzZX.js} +1 -1
  253. package/server/{smart-compaction-C1_VVLEd.js → smart-compaction-CHIxLr_d.js} +1 -1
  254. package/server/{smart-compaction--Oj65Uov.js → smart-compaction-r4pHQBIr.js} +7 -7
  255. package/server/{spawn-planning-session-AiUSsBnH.js → spawn-planning-session-DWAorh2B.js} +25 -20
  256. package/server/{spawn-planning-session-LFtK2QCE.js → spawn-planning-session-KC_UduxD.js} +1 -1
  257. package/server/{specialist-completion-qOgqdqXH.js → specialist-completion-BXhav38U.js} +1 -1
  258. package/server/{specialist-context-gjj8Z4Ii.js → specialist-context-DtrYvGJ-.js} +5 -5
  259. package/server/{specialist-handoff-logger-BsBNvVZv.js → specialist-handoff-logger-C45ouoZ6.js} +2 -2
  260. package/server/{specialist-logs-CSLtvPx6.js → specialist-logs-DJ3RzKxW.js} +3 -3
  261. package/server/{specialists-D0VBf8g_.js → specialists-D5fRZXmN.js} +1 -1
  262. package/server/specialists-DVj0hvaL.js +3 -0
  263. package/server/{specialists-CYRwELzc.js → specialists-DyFeedjn.js} +66 -76
  264. package/server/{specialists-DAegTvRt.js → specialists-JVO00bs7.js} +374 -220
  265. package/server/specs-nN45DG2X.js +3 -0
  266. package/server/{src-OLoJhUiJ.js → src-CG9mCkP6.js} +6 -6
  267. package/server/{src-BqTcrfO_.js → src-CMTQGyCK.js} +3 -3
  268. package/server/{src-Dpq1yFIl.js → src-U7_kTPEE.js} +338 -4
  269. package/server/{stack-health-I713ELld.js → stack-health-Df0YEZKa.js} +1 -1
  270. package/server/{stack-health-DV_f-lK0.js → stack-health-puygdaMd.js} +2 -2
  271. package/server/{stale-task-claims-CQSKZVq0.js → stale-task-claims-BbFwCTb0.js} +4 -4
  272. package/server/{staleness-BbsGxmF2.js → staleness-Bpy41ngS.js} +15 -3
  273. package/server/{staleness-zGp4P1hd.js → staleness-Cbl_w4Bw.js} +1 -1
  274. package/server/{state-home-DixkE-up.js → state-home-CIGjwNfJ.js} +119 -54
  275. package/server/state-migrate-Dkzaxvny.js +487 -0
  276. package/server/{stuck-remediation-BWkK_O7A.js → stuck-remediation-CzEov_fq.js} +27 -21
  277. package/server/{stuck-remediation-CTPRC2S5.js → stuck-remediation-sY_MHHgQ.js} +1 -1
  278. package/server/{substrate-bug-weights-service-DXd0ID83.js → substrate-bug-weights-service-BH66lhm7.js} +3 -3
  279. package/server/{summary-fork-CdLn8Chr.js → summary-fork-D8bXjCr7.js} +2 -2
  280. package/server/{summary-fork-f3DpgjXh.js → summary-fork-DHhJIsAL.js} +8 -8
  281. package/server/{supervisor-Ch8CDuoF.js → supervisor-BO-Zk_h-.js} +3 -3
  282. package/server/supervisor-BPy-o1A8.js +2 -0
  283. package/server/{swarm-readiness-C9P2iPap.js → swarm-readiness-CQ_fwUWF.js} +4 -4
  284. package/server/{system-prerequisites-DkoQBn1q.js → system-prerequisites-Bza0ffAh.js} +24 -44
  285. package/server/{teardown-workspace-D-5yMyit.js → teardown-workspace-CEgauF4U.js} +15 -15
  286. package/server/{test-agent-queue-BwpUpu-o.js → test-agent-queue-DXDt0Xa-.js} +7 -7
  287. package/server/{test-verdict-BRiSu7eW.js → test-verdict-CmUBK5cT.js} +1 -1
  288. package/server/{test-verdict-BQ1yx7d4.js → test-verdict-DFjjIHR5.js} +1 -1
  289. package/server/{tldr-daemon-DjxP5g6Y.js → tldr-daemon-BDtLOIlO.js} +2 -2
  290. package/server/{tldr-daemon-BJA7TkqS.js → tldr-daemon-DL566HbH.js} +1 -1
  291. package/server/tmux-DoThH6aj.js +3 -0
  292. package/server/{tmux-y1blSxks.js → tmux-ftABRAmc.js} +76 -44
  293. package/server/{token-LUrbM9sU.js → token-CsOhvw42.js} +2 -2
  294. package/server/{token-util-BZaDAQ8S.js → token-util-CTmczIfW.js} +1 -1
  295. package/server/token-util-DrHg8abn.js +3 -0
  296. package/server/{tracker-config-DSFZBdXP.js → tracker-config-B4itFzDo.js} +2 -2
  297. package/server/{tracker-utils-WtP_V-yn.js → tracker-utils-BePq_oj-.js} +1 -1
  298. package/server/{tracker-utils-DiceZN3a.js → tracker-utils-tnxxqROg.js} +2 -2
  299. package/server/{traefik-connect-BXqfOP4-.js → traefik-connect-m73vGebA.js} +1 -1
  300. package/server/{tunnel-DTng1rfQ.js → tunnel-B2vxjx_b.js} +3 -3
  301. package/server/{tunnel-WcJImbAC.js → tunnel-Cgj-IGIl.js} +1 -1
  302. package/server/{types-BjaZ1oqH.js → types-BBNjPcqU.js} +1 -1
  303. package/server/{types-DqeBMmJN.js → types-hraoaQIp.js} +1 -1
  304. package/server/{uat-train-BpLnp7Cx.js → uat-train-CuEn0t9M.js} +28 -28
  305. package/server/{uat-train-Wismge7h.js → uat-train-cKfM-_WW.js} +1 -1
  306. package/server/{validation-BA4e5EGm.js → validation-B5JxoPUS.js} +259 -9
  307. package/server/{validation-CUWamZ4X.js → validation-CIi6pnI2.js} +1 -1
  308. package/server/{verification-artifact-Dr_0g9nb.js → verification-artifact-BcnIbigL.js} +1 -1
  309. package/server/{verification-artifact-CrbI4tJE.js → verification-artifact-C-lIHfUa.js} +1 -1
  310. package/server/{verification-runner-gAzh3cVD.js → verification-runner-Br0S_Ous.js} +103 -37
  311. package/server/{verification-runner-Dcksl_P-.js → verification-runner-CDj4lD4t.js} +1 -1
  312. package/server/{vtt-parser-3VZKsmSm.js → vtt-parser-DKpNNW5i.js} +1 -1
  313. package/server/{work-agent-prompt-ULdcANl5.js → work-agent-prompt-Yb2bd3Fq.js} +16 -15
  314. package/server/{workflows-B8ROFlfw.js → workflows-C9WmILql.js} +39 -77
  315. package/server/workflows-D90rMOya.js +2 -0
  316. package/server/{workspace-DhTDA8nB.js → workspace-BVl4rihN.js} +3 -3
  317. package/server/{workspace-DSjUJaJN.js → workspace-DuUdndHe.js} +1 -1
  318. package/server/{workspace-config-BAAsAv-o.js → workspace-config-cEGcO6UT.js} +1 -1
  319. package/server/{workspace-manager-CcujONCR.js → workspace-manager-ZTdJAy9M.js} +1 -1
  320. package/server/{workspace-manager-DsN52IMG.js → workspace-manager-hLUv3ADC.js} +23 -16
  321. package/server/{workspace-metadata-DIL5_U4c.js → workspace-metadata-CskwzzhL.js} +2 -2
  322. package/server/{workspace-metadata-CftOpNLs.js → workspace-metadata-DNpMixRq.js} +1 -1
  323. package/server/{workspaces-Dmlh1YXm.js → workspaces-hWvy9eKs.js} +276 -110
  324. package/sync-sources/agents/pan-inspect-agent.md +1 -1
  325. package/sync-sources/agents/pan-merge-agent.md +1 -1
  326. package/sync-sources/agents/pan-planning-agent.md +4 -4
  327. package/sync-sources/agents/pan-work-agent.md +1 -1
  328. package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
  329. package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
  330. package/sync-sources/hooks/record-cost-event.js +363 -71
  331. package/sync-sources/hooks/session-start-hook +7 -0
  332. package/sync-sources/hooks/work-agent-stop-hook +1 -1
  333. package/sync-sources/rules/per-bead-durability.md +1 -1
  334. package/sync-sources/rules/prd-authoring.md +1 -1
  335. package/sync-sources/skills/feature-work/SKILL.md +1 -1
  336. package/sync-sources/skills/pan/SKILL.md +2 -2
  337. package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
  338. package/sync-sources/skills/pan-approve/SKILL.md +1 -1
  339. package/sync-sources/skills/pan-close/SKILL.md +1 -1
  340. package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
  341. package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
  342. package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
  343. package/sync-sources/skills/pan-plan/SKILL.md +6 -6
  344. package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
  345. package/sync-sources/skills/pan-recap/SKILL.md +2 -2
  346. package/sync-sources/skills/pan-review/SKILL.md +1 -1
  347. package/sync-sources/skills/pan-start/SKILL.md +26 -3
  348. package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
  349. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  350. package/sync-sources/skills/pan-task/SKILL.md +2 -2
  351. package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
  352. package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
  353. package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
  354. package/sync-sources/skills/plan/SKILL.md +11 -11
  355. package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
  356. package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
  357. package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
  358. package/server/agent-state-BV_6RHnO.js +0 -3
  359. package/server/agents-Czz6R57Z.js +0 -3
  360. package/server/cli-ChErG518.js +0 -3
  361. package/server/codex-BBeZ8c3s.js +0 -3
  362. package/server/deacon-swarm-uudlSCLM.js +0 -2
  363. package/server/dist-BEDL2alY.js +0 -3
  364. package/server/forge-DbhJyH6u.js +0 -2
  365. package/server/git-utils-Bkxzr1Xf.js +0 -129
  366. package/server/hume-BrA1tUuk.js +0 -3
  367. package/server/inspect-agent-CyXNo9fM.js +0 -2
  368. package/server/lifecycle-io-CUpsxG0p.js +0 -3
  369. package/server/merge-ops-BpTtuO8x.js +0 -2
  370. package/server/projects-IRHJIPYC.js +0 -3
  371. package/server/providers-BqCdTryq.js +0 -3
  372. package/server/public/assets/index-C6NLz_1S.css +0 -1
  373. package/server/public/assets/mermaid-GHXKKRXX-BNwFoQsf.js +0 -1
  374. package/server/rally-DGimSRBQ.js +0 -3
  375. package/server/reap-terminal-sessions-C1mfzoZo.js +0 -3
  376. package/server/record-update-RviRDSNs.js +0 -168
  377. package/server/record-us0YECMO.js +0 -3
  378. package/server/resume-OyN3dEXE.js +0 -3
  379. package/server/review-status-DXeqFpk5.js +0 -3
  380. package/server/settings-BaPXXJsT.js +0 -2
  381. package/server/specialists-C6WkeKFK.js +0 -3
  382. package/server/specs-BsNcum0h.js +0 -3
  383. package/server/state-migrate-_zJJ6XKE.js +0 -362
  384. package/server/supervisor-Qy1QecAs.js +0 -2
  385. package/server/tmux-HQLgwo_C.js +0 -3
  386. package/server/token-util-Cg-QnowA.js +0 -3
  387. package/server/workflows-C5c-RPsY.js +0 -2
@@ -1,42 +1,44 @@
1
1
  import { a as __toCommonJS } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { $n as resolveProjectFromIssueSync, A as init_harness_policy, B as init_providers, C as init_tier_table, E as resolveTieredExecutionEnabledForIssue, Nn as getProjectSync, O as canUseHarnessSync, Or as init_errors, P as UnknownModelError, Q as resolveModel, T as resolveTieredExecutionEnabled, Un as listProjectsSync, V as piProviderForModel, c as isClaudeCodeChannelsEnabled, cr as extractPrefixSync, dr as parseIssueIdSync, ei as getOverdeckHome, f as loadConfigSync, gn as init_state_read_home, ii as resolveOhmypiExtensionPath, lr as init_issue_id, qr as encodeClaudeProjectDir, ri as packageRoot, t as init_config_yaml, ti as init_paths, vn as shouldCommitLegacyWorkspaceArtifacts, vr as FsError, z as getProviderForModelSync, zn as init_projects } from "./config-yaml-Ciyp2mYe.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-DN2wSxle.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-y1blSxks.js";
6
- import { a as init_event_store, n as getEventStore } from "./event-store-BVnON3vf.js";
7
- import { C as normalizeChannelReplyPayload, a as getHarnessBehavior, b as DomainEvent, t as init_src } from "./src-Dpq1yFIl.js";
8
- import { A as stateToOverdeckParamsForDb, D as init_agent_state_sync, T as AGENT_COLUMNS_FOR_DB, c as init_review_status, s as getReviewStatusSync, u as loadReviewStatuses, y as setReviewStatusSync } from "./review-status-CCgPVK1h.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-B7HZWnTA.js";
10
- import { d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-DbrHWunF.js";
11
- import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-OouGbJ7d.js";
12
- import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-Drm7qeD5.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-B5hl7lMQ.js";
14
- import { a as performHandoff, i as checkAllTriggers, s as getAgentHealth, t as getCloisterService } from "./service-CqAY8Kmk.js";
15
- import { o as init_persistent_logger, s as logAgentLifecycleSync } from "./session-history-DUehL3KN.js";
16
- import { t as init_behavior } from "./behavior-Dg-D8eBG.js";
17
- import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-DSFZBdXP.js";
18
- import { n as init_issue_service_singleton, r as issue_service_singleton_exports } from "./issue-service-singleton-CPESc4Or.js";
19
- import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-DhfFiwW7.js";
20
- import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-DqeBMmJN.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-BiM-7Zsx.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-BUgGvqVL.js";
23
- import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-D9Z3tYSa.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-5DJRiovn.js";
25
- import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-C2OrLYKL.js";
26
- import { h as workspaceContextFile, l as piGlobalContextFile, o as init_layers } from "./layers-cZx7ibtV.js";
27
- import { a as init_stack_health, i as getWorkspaceStackHealth } from "./stack-health-DV_f-lK0.js";
28
- import { l as init_dag, o as getDispatchableItems } from "./dag-DIji6O2b.js";
29
- import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BGpO-OVM.js";
30
- import { a as loadCloisterConfigSync, r as init_config } from "./config-G1TOMJZA.js";
31
- import { c as isStateMigrated, o as init_state_home } from "./state-home-DixkE-up.js";
32
- import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionVBriefOnMain } from "./lifecycle-io-DMurK4oM.js";
33
- 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-DQybSPUK.js";
34
- 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-BWkK_O7A.js";
35
- import { At as getSystemHealthSnapshot, kt as getResourceConfig, wt as classifyMemoryPressure } from "./deacon-1s7bM5zn.js";
36
- import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-DsN52IMG.js";
37
- import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-DJV2eZUP.js";
38
- import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-tVGiI5ee.js";
39
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-DIL5_U4c.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
+ import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-hraoaQIp.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";
40
42
  import { basename, delimiter, dirname, join, resolve } from "node:path";
41
43
  import { Cause, Data, Effect, Layer, Option, Schema, Stream } from "effect";
42
44
  import { join as join$1 } from "path";
@@ -98,9 +100,8 @@ init_cost();
98
100
  init_behavior();
99
101
  init_persistent_logger();
100
102
  init_tracker_config();
101
- init_types();
102
- init_review_status();
103
103
  init_lifecycle();
104
+ init_review_status();
104
105
  init_io();
105
106
  /**
106
107
  * Resolve the default cwd used when no project is selected — the "devroot"
@@ -196,6 +197,7 @@ init_model_validation();
196
197
  init_provider_health();
197
198
  init_claude_permissions();
198
199
  init_layers();
200
+ init_harness_binary();
199
201
  init_ohmypi_fifo();
200
202
  init_pi_fifo();
201
203
  init_stack_health();
@@ -579,7 +581,7 @@ async function resolveCodexRolloutPath(agentId, opts = {}) {
579
581
  const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
580
582
  const codexHome = join(agentDir, "codex-home");
581
583
  if (!await pathExists$1(codexHome)) return null;
582
- const { findRolloutPath, findLatestRollout } = await import("./codex-BBeZ8c3s.js");
584
+ const { findRolloutPath, findLatestRollout } = await import("./codex-Dg7Is5yb.js");
583
585
  const threadId = (await readOptional(join(agentDir, "codex-thread-id")))?.trim();
584
586
  if (threadId) {
585
587
  const rollout = findRolloutPath(codexHome, threadId);
@@ -640,12 +642,13 @@ async function resolveJsonlPath(agentId, workspacePath, opts = {}) {
640
642
  logTranscriptResolution(agentId, `missing-session-id:${harness ?? "unknown"}`, `failed harness=${harness ?? "unknown"} reason=no-session-id checked=session.id,sessions.json,runtime-state`, opts);
641
643
  return null;
642
644
  }
643
- 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`);
644
647
  if (await pathExists$1(jsonlPath)) {
645
648
  logTranscriptResolution(agentId, `resolved:${jsonlPath}`, `resolved harness=${harness ?? "claude-code"} sessionId=${claudeSessionId} path=${jsonlPath}`, opts);
646
649
  return jsonlPath;
647
650
  }
648
- 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);
649
652
  return null;
650
653
  }
651
654
  //#endregion
@@ -832,15 +835,14 @@ const getWorkAgentLifecycleState = (agentOrIssueId) => Effect.promise(() => getW
832
835
  * expected feature branch. Reports drift and missing-workspace state
833
836
  * because both are silent failure modes today.
834
837
  *
835
- * Cache: in-memory, 30s TTL, keyed by absolute path. Cache entries are
836
- * invalidated when the mtime of <path>/.git/HEAD changes, so a checkout
837
- * under a live conversation is picked up on the next list call without
838
- * 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.
839
842
  *
840
843
  * All I/O is async (execFile / fs.promises). No execSync, no readFileSync.
841
844
  */
842
845
  const execFileAsync$3 = promisify(execFile);
843
- const GIT_INFO_TTL_MS = 3e4;
844
846
  const GIT_INFO_TIMEOUT_MS = 2e3;
845
847
  const cache = /* @__PURE__ */ new Map();
846
848
  /**
@@ -915,22 +917,20 @@ async function readGitInfoFresh(absPath) {
915
917
  };
916
918
  }
917
919
  /**
918
- * Resolve branch + worktree status for a conversation cwd. Cached for
919
- * 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.
920
922
  */
921
923
  async function resolveConversationGitInfo(absPath) {
922
- const now = Date.now();
923
924
  const headMtimeMs = await readHeadMtimeMs(absPath);
924
925
  if (headMtimeMs === null) return {
925
926
  branch: null,
926
927
  isWorktree: false
927
928
  };
928
929
  const cached = cache.get(absPath);
929
- if (cached && cached.expiresAt > now && cached.headMtimeMs === headMtimeMs) return cached.value;
930
+ if (cached && cached.headMtimeMs === headMtimeMs) return cached.value;
930
931
  const value = await readGitInfoFresh(absPath);
931
932
  cache.set(absPath, {
932
933
  value,
933
- expiresAt: now + GIT_INFO_TTL_MS,
934
934
  headMtimeMs
935
935
  });
936
936
  return value;
@@ -1375,8 +1375,31 @@ function hasActiveAgentGateOrRetry(state, nowMs = Date.now()) {
1375
1375
  }
1376
1376
  function evaluateSpawnGuardrails(health) {
1377
1377
  const warnings = [];
1378
+ if (health.freshness.status !== "fresh") {
1379
+ const message = health.freshness.status === "stale" ? `System health evidence is stale: ${health.freshness.reason.message}` : "System health is still measuring; fresh admission evidence is not available yet.";
1380
+ warnings.push({
1381
+ severity: "critical",
1382
+ code: "health_snapshot_unavailable",
1383
+ message
1384
+ });
1385
+ return {
1386
+ blocked: true,
1387
+ requiresAcknowledgement: false,
1388
+ status: 503,
1389
+ error: message,
1390
+ hint: "Wait for a fresh system health assessment before starting this agent.",
1391
+ warnings,
1392
+ health: {
1393
+ severity: health.severity,
1394
+ summary: health.summary,
1395
+ reasons: health.reasons,
1396
+ leakedSpecialists: health.leakedSpecialists,
1397
+ freshness: health.freshness
1398
+ }
1399
+ };
1400
+ }
1378
1401
  const availableGb = Math.round(health.summary.availableMemoryBytes / 1024 ** 3 * 10) / 10;
1379
- const workAgentCount = health.summary.workAgentCount;
1402
+ const workAgentCount = health.admission.admittedWorkAgentCount;
1380
1403
  const leakedSpecialists = health.leakedSpecialists;
1381
1404
  const resourceConfig = getResourceConfig();
1382
1405
  const hardWorkAgentLimit = resolveAgentCountEnv("PAN_AGENT_BLOCK_COUNT", resourceConfig.agentBlockCount);
@@ -1424,7 +1447,8 @@ function evaluateSpawnGuardrails(health) {
1424
1447
  severity: health.severity,
1425
1448
  summary: health.summary,
1426
1449
  reasons: health.reasons,
1427
- leakedSpecialists: health.leakedSpecialists
1450
+ leakedSpecialists: health.leakedSpecialists,
1451
+ freshness: health.freshness
1428
1452
  }
1429
1453
  };
1430
1454
  }
@@ -1438,7 +1462,8 @@ function evaluateSpawnGuardrails(health) {
1438
1462
  severity: health.severity,
1439
1463
  summary: health.summary,
1440
1464
  reasons: health.reasons,
1441
- leakedSpecialists: health.leakedSpecialists
1465
+ leakedSpecialists: health.leakedSpecialists,
1466
+ freshness: health.freshness
1442
1467
  }
1443
1468
  };
1444
1469
  }
@@ -1700,7 +1725,7 @@ const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", http
1700
1725
  } catch {}
1701
1726
  let stdout;
1702
1727
  if (isRemote && vmName) {
1703
- const { getRemoteAgentOutput } = await import("./remote-agents-BNORDWAX.js");
1728
+ const { getRemoteAgentOutput } = await import("./remote-agents-CRCg1L4H.js");
1704
1729
  stdout = await getRemoteAgentOutput(id, vmName, parseInt(String(lines), 10) || 100);
1705
1730
  } else stdout = await Effect.runPromise(capturePane(id, parseInt(String(lines), 10) || 100));
1706
1731
  if (!stdout || stdout.trim() === "" || stdout.trim() === "Session not found") {
@@ -1880,7 +1905,7 @@ const postAgentTellRoute = postAgentMessageLikeRoute("/api/agents/:id/tell");
1880
1905
  const postAgentPokeRoute = HttpRouter.add("POST", "/api/agents/:id/poke", httpHandler(Effect.gen(function* () {
1881
1906
  const id = (yield* HttpRouter.params)["id"] ?? "";
1882
1907
  const { message } = yield* readJsonBody$1;
1883
- 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?";
1884
1909
  yield* Effect.promise(() => messageAgent(id, pokeMsg));
1885
1910
  return jsonResponse({
1886
1911
  success: true,
@@ -2121,7 +2146,7 @@ async function cleanupConversationAttachments(name) {
2121
2146
  * sessions that the lifecycle poller missed. */
2122
2147
  async function cleanupOrphanedConversationAttachments() {
2123
2148
  try {
2124
- const { listConversations } = await import("./conversations-BJ-t3BRm.js");
2149
+ const { listConversations } = await import("./conversations-6mPANqvL.js");
2125
2150
  const convNames = new Set(listConversations().map((c) => c.name));
2126
2151
  const root = getConversationAttachmentsRoot();
2127
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, {
@@ -2652,6 +2677,7 @@ function isNotFound(error) {
2652
2677
  }
2653
2678
  async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model, effort, issueId, resume = false, harness = "claude-code", plainFork = false) {
2654
2679
  const behavior = getHarnessBehavior(harness);
2680
+ const harnessLaunch = await prepareHarnessLaunch(harness);
2655
2681
  const stateDir = join(getOverdeckHome(), "conversations", tmuxSession);
2656
2682
  await mkdir(stateDir, { recursive: true });
2657
2683
  clearReadySignal(tmuxSession);
@@ -2699,7 +2725,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
2699
2725
  const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
2700
2726
  const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
2701
2727
  const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
2702
- const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-BBeZ8c3s.js");
2728
+ const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-Dg7Is5yb.js");
2703
2729
  initCodexHome(codexHome, {
2704
2730
  trustedDir: cwd,
2705
2731
  approvalPolicy: codexApprovalPolicy,
@@ -2745,7 +2771,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
2745
2771
  ...issueId ? { issueId } : {},
2746
2772
  ...piFields || codexFields || useSupervisor ? { agentId: tmuxSession } : {}
2747
2773
  },
2748
- extraEnvExports: [`export OVERDECK_DASHBOARD_URL="http://127.0.0.1:${process.env["API_PORT"] ?? process.env["PORT"] ?? "3011"}"`],
2774
+ extraEnvExports: [harnessLaunch.pathExport, `export OVERDECK_DASHBOARD_URL="http://127.0.0.1:${process.env["API_PORT"] ?? process.env["PORT"] ?? "3011"}"`],
2749
2775
  providerExports: providerExportsStr || void 0,
2750
2776
  trapHup: true,
2751
2777
  baseCommand: runtimeCommand,
@@ -2768,7 +2794,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
2768
2794
  } catch {}
2769
2795
  console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
2770
2796
  try {
2771
- const { preTrustDirectory } = await import("./workspace-manager-CcujONCR.js");
2797
+ const { preTrustDirectory } = await import("./workspace-manager-ZTdJAy9M.js");
2772
2798
  preTrustDirectory(cwd);
2773
2799
  } catch {}
2774
2800
  try {
@@ -2785,7 +2811,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
2785
2811
  const codexHomeDir = codexFields.codexHome;
2786
2812
  (async () => {
2787
2813
  try {
2788
- const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-BBeZ8c3s.js");
2814
+ const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-Dg7Is5yb.js");
2789
2815
  const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
2790
2816
  if (rollout) {
2791
2817
  const threadId = extractThreadIdFromRollout(rollout);
@@ -3664,7 +3690,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
3664
3690
  error: "missing agent id"
3665
3691
  }, { status: 400 });
3666
3692
  const request = yield* HttpServerRequest.HttpServerRequest;
3667
- const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-7bYL5v6K.js"));
3693
+ const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-DXdfprGr.js"));
3668
3694
  const expected = getInternalTokenSync();
3669
3695
  if (!expected) return jsonResponse({
3670
3696
  ok: false,
@@ -3931,7 +3957,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
3931
3957
  const request = yield* HttpServerRequest.HttpServerRequest;
3932
3958
  const urlOpt = HttpServerRequest.toURL(request);
3933
3959
  const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
3934
- const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-CnwV_SSz.js"));
3960
+ const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-CpfvuVmm.js"));
3935
3961
  const endTime = /* @__PURE__ */ new Date();
3936
3962
  const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
3937
3963
  const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
@@ -3972,7 +3998,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
3972
3998
  detail: String(decoded.failure)
3973
3999
  }, { status: 400 })
3974
4000
  };
3975
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DHwemt96.js"));
4001
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CnzFKSAQ.js"));
3976
4002
  yield* (yield* AgentStateService).emit(decoded.success);
3977
4003
  return {
3978
4004
  ok: true,
@@ -4054,7 +4080,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
4054
4080
  success: false,
4055
4081
  error: "missing agent id"
4056
4082
  }, { status: 400 });
4057
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DHwemt96.js"));
4083
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CnzFKSAQ.js"));
4058
4084
  const snapshot = yield* (yield* AgentStateService).get(id);
4059
4085
  if (!snapshot) return jsonResponse({
4060
4086
  success: false,
@@ -4118,35 +4144,107 @@ function saveAgentStateAndEmitEvent(state, event) {
4118
4144
  function saveAgentStateAndEmitEventProgram(state, event) {
4119
4145
  return Effect.sync(() => saveAgentStateAndEmitEvent(state, event));
4120
4146
  }
4121
- /**
4122
- * Dependency-injected variant for tests.
4123
- */
4124
- function saveAgentStateAndEmitEventWithDeps(db, eventStore, state, event) {
4125
- prepareAgentStateForSave(state);
4126
- writeAgentStateJsonSync(state);
4147
+ function writeProjectionRows(db, state, event) {
4127
4148
  const record = event;
4128
4149
  const timestamp = record["timestamp"] ?? (/* @__PURE__ */ new Date()).toISOString();
4129
4150
  const timestampMs = new Date(timestamp).getTime();
4130
4151
  const payload = JSON.stringify(record["payload"] ?? {});
4131
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);
4132
4175
  db.exec("BEGIN IMMEDIATE");
4133
4176
  try {
4134
- db.prepare(`INSERT OR IGNORE INTO issues (id, stage, updated_at) VALUES (?, 'working', ?)`).run(state.issueId, updatedAt);
4135
- db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
4136
- db.prepare(`INSERT INTO events (type, timestamp, payload) VALUES (?, ?, ?)`).run(event.type, timestampMs, payload);
4137
- const sequence = db.prepare(`SELECT last_insert_rowid() AS sequence`).get()?.sequence ?? 0;
4177
+ const rows = writeProjectionRows(db, state, event);
4138
4178
  db.exec("COMMIT");
4139
- const stored = buildStoredEvent(event, sequence);
4140
- eventStore.emitStored(stored);
4141
- logAgentLifecycleSync(state.id, `projected ${event.type} (seq=${sequence}) for ${state.id}`);
4142
- return { sequence };
4179
+ return emitCommittedProjection(eventStore, state, event, rows);
4143
4180
  } catch (err) {
4144
- try {
4145
- db.exec("ROLLBACK");
4146
- } 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);
4214
+ throw err;
4215
+ }
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);
4147
4242
  throw err;
4148
4243
  }
4149
4244
  }
4245
+ function rollbackAgentStartPlaceholderProgram(placeholder, fallback, event) {
4246
+ return Effect.sync(() => rollbackAgentStartPlaceholderWithDeps(getOverdeckDatabaseSync(), getEventStore(), placeholder, fallback, event));
4247
+ }
4150
4248
  //#endregion
4151
4249
  //#region routes/agents/lifecycle-stop.ts
4152
4250
  init_agents$1();
@@ -4167,8 +4265,8 @@ function createAgentStopHandler(lifecycleEvent) {
4167
4265
  yield* stopAgent(id);
4168
4266
  if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
4169
4267
  try {
4170
- const { resolveProjectFromIssueSync } = await import("./projects-IRHJIPYC.js");
4171
- const { findWorkspacePath } = await import("./archive-planning-MPpvQJL4.js");
4268
+ const { resolveProjectFromIssueSync } = await import("./projects-9SkRpES9.js");
4269
+ const { findWorkspacePath } = await import("./archive-planning-zkJb3BeM.js");
4172
4270
  const issueLower = stateBeforeStop.issueId.toLowerCase();
4173
4271
  const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
4174
4272
  if (workspacePath) {
@@ -5146,8 +5244,10 @@ const postAgentSwitchModelRoute = HttpRouter.add("POST", "/api/agents/:id/switch
5146
5244
  return jsonResponse({ error: `Agent ${(yield* HttpRouter.params)["id"] ?? ""} model is locked once the agent is spawned` }, { status: 409 });
5147
5245
  })));
5148
5246
  //#endregion
5149
- //#region ../../lib/vbrief/auto-synthesize.ts
5247
+ //#region ../../lib/xbrief/auto-synthesize.ts
5150
5248
  init_state_read_home();
5249
+ init_state_plane();
5250
+ init_types();
5151
5251
  init_codex_auth();
5152
5252
  init_state_home();
5153
5253
  init_io();
@@ -5170,7 +5270,7 @@ function extractAcceptanceCriteriaFromIssue(title, body) {
5170
5270
  }
5171
5271
  return [`Issue's stated fix implemented with tests`];
5172
5272
  }
5173
- function synthesizeMinimalVBrief(issue) {
5273
+ function synthesizeMinimalXBrief(issue) {
5174
5274
  const issueId = issue.issueId.toUpperCase();
5175
5275
  const issueLabel = issueId.toLowerCase();
5176
5276
  const now = (/* @__PURE__ */ new Date()).toISOString();
@@ -5181,9 +5281,9 @@ function synthesizeMinimalVBrief(issue) {
5181
5281
  created: now,
5182
5282
  metadata: { kind: "acceptance_criterion" }
5183
5283
  }));
5184
- const canonicalFilename = generateVBriefFilename(issueId, issue.title, now);
5284
+ const canonicalFilename = generateXBriefFilename(issueId, issue.title, now);
5185
5285
  return {
5186
- vBRIEFInfo: {
5286
+ xBRIEFInfo: {
5187
5287
  version: "0.8",
5188
5288
  created: now,
5189
5289
  updated: now,
@@ -5230,8 +5330,8 @@ function synthesizeMinimalVBrief(issue) {
5230
5330
  }
5231
5331
  };
5232
5332
  }
5233
- async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
5234
- const document = synthesizeMinimalVBrief(issue);
5333
+ async function writeAutoStartXBriefPromise(projectRoot, workspacePath, issue) {
5334
+ const document = synthesizeMinimalXBrief(issue);
5235
5335
  const canonicalFilename = document.plan.metadata?.canonicalFilename;
5236
5336
  const projectSpecsDir = join$1(projectRoot, ".pan", "specs");
5237
5337
  const projectSpecPath = join$1(projectSpecsDir, canonicalFilename);
@@ -5243,7 +5343,7 @@ async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
5243
5343
  }
5244
5344
  };
5245
5345
  await mkdir$1(projectSpecsDir, { recursive: true });
5246
- await writeFile$1(projectSpecPath, serializeVBriefDocument(projectDocument), "utf-8");
5346
+ await writeFile$1(projectSpecPath, serializeXBriefDocument(projectDocument), "utf-8");
5247
5347
  return {
5248
5348
  document,
5249
5349
  workspaceSpecPath: projectSpecPath,
@@ -5252,15 +5352,15 @@ async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
5252
5352
  };
5253
5353
  }
5254
5354
  /**
5255
- * Effect variant of writeAutoStartVBrief. Wraps mkdir + writeFile in a typed
5355
+ * Effect variant of writeAutoStartXBrief. Wraps mkdir + writeFile in a typed
5256
5356
  * FsError channel so callers in Effect-native code can compose with this
5257
5357
  * synthesis step without losing failure typing.
5258
5358
  */
5259
- const writeAutoStartVBrief = (projectRoot, workspacePath, issue) => Effect.tryPromise({
5260
- try: () => writeAutoStartVBriefPromise(projectRoot, workspacePath, issue),
5359
+ const writeAutoStartXBrief = (projectRoot, workspacePath, issue) => Effect.tryPromise({
5360
+ try: () => writeAutoStartXBriefPromise(projectRoot, workspacePath, issue),
5261
5361
  catch: (cause) => new FsError({
5262
5362
  path: projectRoot,
5263
- operation: "writeAutoStartVBrief",
5363
+ operation: "writeAutoStartXBrief",
5264
5364
  cause
5265
5365
  })
5266
5366
  });
@@ -5472,15 +5572,15 @@ init_agents$1();
5472
5572
  function handleRemoteAgentSpawn(input) {
5473
5573
  return Effect.gen(function* () {
5474
5574
  const { issueId, workspacePath, workspaceMetadata, spawnModel, projectPath, spawnGuardrails, lifecycle } = input;
5475
- const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-BNORDWAX.js"));
5476
- const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-DYziAkiZ.js"));
5477
- const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-nAB_F-Gp.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"));
5478
5578
  const panConfig = loadPanConfig();
5479
5579
  const spendCap = checkRemoteSpendCap(panConfig);
5480
5580
  if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
5481
5581
  const fly = createFlyProviderFromConfig(panConfig.remote);
5482
5582
  yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
5483
- const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-ULdcANl5.js"));
5583
+ const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-Yb2bd3Fq.js"));
5484
5584
  const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
5485
5585
  const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
5486
5586
  issueId,
@@ -5801,6 +5901,7 @@ init_child_env();
5801
5901
  init_harness_policy();
5802
5902
  init_activity_logger();
5803
5903
  init_projects();
5904
+ init_review_status();
5804
5905
  init_io();
5805
5906
  init_read_model();
5806
5907
  init_domain_services();
@@ -5824,6 +5925,25 @@ function emitDirtyWorkspaceRefusalActivity(issueId, porcelain) {
5824
5925
  });
5825
5926
  } catch {}
5826
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
+ }
5827
5947
  function spawnGuardrailResourcesHint(hint) {
5828
5948
  const resourcesHint = "Open /resources to inspect Machine Room pressure before retrying.";
5829
5949
  return hint ? `${hint} ${resourcesHint}` : resourcesHint;
@@ -5850,7 +5970,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
5850
5970
  const body = yield* readJsonBody$1;
5851
5971
  const eventStore = yield* EventStoreService;
5852
5972
  const lifecycle = yield* IssueLifecycle;
5853
- const readModel = yield* ReadModelService;
5973
+ yield* ReadModelService;
5854
5974
  const { issueId, projectId } = body;
5855
5975
  const autoStart = body.auto === true;
5856
5976
  const guardrailAcknowledged = body.guardrailAcknowledged === true;
@@ -5928,7 +6048,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
5928
6048
  const workspacePanContinuePath = join(workspacePanDir, PAN_CONTINUE_FILENAME);
5929
6049
  let planPath = yield* findPlan(workspacePath);
5930
6050
  if (autoStart && !planPath) {
5931
- yield* writeAutoStartVBrief(projectPath, workspacePath, {
6051
+ yield* writeAutoStartXBrief(projectPath, workspacePath, {
5932
6052
  issueId,
5933
6053
  title: cachedIssue?.title || issueId,
5934
6054
  body: cachedIssue?.description || "",
@@ -5937,7 +6057,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
5937
6057
  planPath = yield* findPlan(workspacePath);
5938
6058
  }
5939
6059
  if (!planPath) return jsonResponse({
5940
- 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.`,
5941
6061
  hint: "Run planning first, or use auto-start to synthesize a plan before starting the work agent.",
5942
6062
  issueId
5943
6063
  }, { status: 422 });
@@ -5954,8 +6074,8 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
5954
6074
  if (planReadResult._tag === "failure") {
5955
6075
  const { planErr } = planReadResult;
5956
6076
  return jsonResponse({
5957
- error: `Could not read workspace vBRIEF for ${issueId}: ${planErr instanceof Error ? planErr.message : String(planErr)}`,
5958
- 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.",
5959
6079
  issueId
5960
6080
  }, { status: 422 });
5961
6081
  }
@@ -5973,7 +6093,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
5973
6093
  hint: "Re-run planning to produce a plan with tasks and acceptance criteria.",
5974
6094
  issueId
5975
6095
  }, { status: 422 });
5976
- const health = yield* readModel.getSnapshot.pipe(Effect.flatMap((snapshot) => Effect.promise(() => getSystemHealthSnapshot(snapshot))));
6096
+ const health = yield* Effect.promise(() => getSystemHealthSnapshot());
5977
6097
  emitStartAgentPhase(issueId, "guardrails", "start", "evaluating spawn guardrails");
5978
6098
  const spawnGuardrails = evaluateSpawnGuardrails(health);
5979
6099
  if (spawnGuardrails.blocked) {
@@ -6118,33 +6238,6 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6118
6238
  }).unref();
6119
6239
  }
6120
6240
  }).pipe(Effect.catch(() => Effect.void));
6121
- yield* transitionVBriefOnMain(projectPath, issueId, "active", "approved", `scope: approve ${issueId.toUpperCase()} vBRIEF`).pipe(Effect.match({
6122
- onSuccess: (result) => {
6123
- if (result.moved) console.log(`[start-agent] vBRIEF moved ${result.fromDir} → active for ${issueId}`);
6124
- if (result.committed) console.log(`[start-agent] Committed approval transition on main for ${issueId}`);
6125
- },
6126
- onFailure: (err) => {
6127
- console.warn(`[start-agent] vBRIEF approval transition failed (non-fatal): ${err?.message ?? err}`);
6128
- }
6129
- }));
6130
- if (existsSync(planPath)) try {
6131
- updatePlanStatus(planPath, "running");
6132
- console.log(`[start-agent] Set plan.status=running for ${issueId}`);
6133
- } catch (planStatusErr) {
6134
- console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
6135
- }
6136
- try {
6137
- const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = yield* Effect.promise(() => import("./record-us0YECMO.js"));
6138
- const recordProject = resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath);
6139
- yield* Effect.promise(() => appendSessionEntry(recordProject, issueId, {
6140
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6141
- reason: "start",
6142
- agentModel: spawnModel
6143
- }));
6144
- console.log(`[start-agent] Wrote start session entry to record for ${issueId}`);
6145
- } catch (continueErr) {
6146
- console.warn(`[start-agent] Failed to write start entry to record (non-fatal): ${continueErr?.message ?? continueErr}`);
6147
- }
6148
6241
  let gatesCommitted = false;
6149
6242
  const commitClearedGates = async () => {
6150
6243
  if (!startGateBlock || gatesCommitted) return;
@@ -6165,6 +6258,38 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6165
6258
  troubled: startGateBlock.troubled
6166
6259
  });
6167
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
+ };
6168
6293
  if (isRemote && workspaceMetadata) {
6169
6294
  const response = yield* Effect.promise(() => spawnAfterClearingStartGates({
6170
6295
  agentSessionName,
@@ -6183,6 +6308,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6183
6308
  }));
6184
6309
  if (response.status < 200 || response.status >= 300) return response;
6185
6310
  yield* Effect.promise(commitClearedGates);
6311
+ yield* Effect.promise(markWorkStartAccepted);
6186
6312
  return response;
6187
6313
  }
6188
6314
  const devScript = join(workspacePath, "dev");
@@ -6214,11 +6340,11 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6214
6340
  console.log(`[start-agent] Killed stale tmux session ${agentSessionName}`);
6215
6341
  }).pipe(Effect.catch(() => Effect.void));
6216
6342
  if (!(body.acknowledgeDirtyWorkspace === true)) try {
6217
- 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", {
6218
6344
  cwd: workspacePath,
6219
6345
  encoding: "utf-8"
6220
6346
  }));
6221
- if (statusOut.trim()) {
6347
+ if (statusOut.trim() && !isOnlyOverdeckRuntimeWorkspaceChanges(statusOut)) {
6222
6348
  const { stdout: diffOut } = yield* Effect.promise(() => execAsync$2("git diff HEAD --stat", {
6223
6349
  cwd: workspacePath,
6224
6350
  encoding: "utf-8"
@@ -6285,7 +6411,58 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6285
6411
  spawnPanCommand,
6286
6412
  updateIssueStatus
6287
6413
  });
6288
- 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
+ }));
6289
6466
  yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.work_spawn_requested", {
6290
6467
  issueId,
6291
6468
  role,
@@ -6300,11 +6477,35 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6300
6477
  harness: effectiveHarness,
6301
6478
  allowHost
6302
6479
  }), workspacePath));
6480
+ yield* Effect.promise(markWorkStartAccepted);
6303
6481
  emitStartAgentPhase(issueId, "spawn", "success", "local work agent spawn requested", {
6304
6482
  workspacePath,
6305
6483
  activityId
6306
6484
  });
6307
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();
6308
6509
  const output = String(error?.output ?? error?.message ?? "");
6309
6510
  if (output.includes(`Workspace docker stack for ${issueId}`) && output.includes("is not healthy")) {
6310
6511
  const failedStackHealth = yield* getWorkspaceStackHealth(issueId, {
@@ -6348,55 +6549,8 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
6348
6549
  activityId: error?.activityId
6349
6550
  }, { status: 500 });
6350
6551
  }
6351
- const earlyAgentId = agentSessionName;
6352
- const earlyStateDir = join(homedir(), ".overdeck", "agents", earlyAgentId);
6353
- yield* Effect.promise(() => mkdir(earlyStateDir, { recursive: true }));
6354
- saveAgentStateSync({
6355
- id: earlyAgentId,
6356
- issueId,
6357
- ...effectiveHarness ? { harness: effectiveHarness } : {},
6358
- model: "pending-work-spawn",
6359
- status: "starting",
6360
- startedAt: (/* @__PURE__ */ new Date()).toISOString(),
6361
- workspace: workspacePath,
6362
- role,
6363
- hostOverride: allowHost || void 0
6364
- });
6365
- updateRegistryForAgentStart(issueId, workspacePath, earlyAgentId);
6366
- yield* Effect.promise(() => appendAgentLifecycleLog(earlyAgentId, "agent.start_placeholder_created", {
6367
- issueId,
6368
- role,
6369
- workspacePath,
6370
- activityId
6371
- }));
6552
+ updateRegistryForAgentStart(issueId, workspacePath, agentSessionName);
6372
6553
  yield* Effect.promise(() => updateIssueStatus());
6373
- yield* saveAgentStateAndEmitEventProgram({
6374
- id: earlyAgentId,
6375
- issueId,
6376
- workspace: workspacePath,
6377
- role,
6378
- ...effectiveHarness ? { harness: effectiveHarness } : {},
6379
- model: "pending-work-spawn",
6380
- status: "starting",
6381
- startedAt: (/* @__PURE__ */ new Date()).toISOString(),
6382
- hostOverride: allowHost || void 0
6383
- }, {
6384
- type: "agent.started",
6385
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6386
- payload: {
6387
- agentId: earlyAgentId,
6388
- issueId,
6389
- agent: {
6390
- id: earlyAgentId,
6391
- issueId,
6392
- workspace: workspacePath,
6393
- status: "starting",
6394
- startedAt: (/* @__PURE__ */ new Date()).toISOString(),
6395
- role,
6396
- ...effectiveHarness ? { runtime: effectiveHarness } : {}
6397
- }
6398
- }
6399
- });
6400
6554
  try {
6401
6555
  getIssueDataService().patchIssue(issueId, {
6402
6556
  status: "In Progress",
@@ -6561,10 +6715,10 @@ const _serverManagedMerges = /* @__PURE__ */ new Set();
6561
6715
  function firePostMergeLifecycle(issueId, options) {
6562
6716
  const started = postMergeGuard.run(issueId, async () => {
6563
6717
  const projectPath = getProjectPathForIssue(extractPrefixSync(issueId) ?? issueId.split("-")[0]);
6564
- const { postMergeLifecycle } = await import("./merge-agent-CnORPiri.js");
6718
+ const { postMergeLifecycle } = await import("./merge-agent-BQM3a8z5.js");
6565
6719
  await postMergeLifecycle(issueId, projectPath, options?.sourceBranch, options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : void 0);
6566
6720
  console.log(`[merge] post-merge lifecycle completed for ${issueId}`);
6567
- const { runMergeTrainReconcile } = await import("./merge-train-SvkRJZ-k.js");
6721
+ const { runMergeTrainReconcile } = await import("./merge-train-DxDfBTjr.js");
6568
6722
  const outcomes = await runMergeTrainReconcile(issueId);
6569
6723
  if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${issueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
6570
6724
  }, (err) => console.error(`[merge] post-merge lifecycle failed for ${issueId}:`, err));
@@ -6585,15 +6739,15 @@ init_io();
6585
6739
  init_domain_services();
6586
6740
  init_tmux();
6587
6741
  const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
6588
- const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
6742
+ const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
6589
6743
  return jsonResponse({
6590
6744
  specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
6591
6745
  projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
6592
6746
  });
6593
6747
  })));
6594
6748
  const postSpecialistsResetAllRoute = HttpRouter.add("POST", "/api/specialists/reset-all", httpHandler(Effect.gen(function* () {
6595
- const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
6596
- const { clearHookSync } = yield* Effect.promise(() => import("./hooks-DvX33gY_.js"));
6749
+ const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
6750
+ const { clearHookSync } = yield* Effect.promise(() => import("./hooks-ltecuFqZ.js"));
6597
6751
  const specialists = getAllSpecialists();
6598
6752
  const results = [];
6599
6753
  for (const specialist of specialists) {
@@ -6645,11 +6799,11 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6645
6799
  if (!itemId) return jsonResponse({ error: "itemId is required for a passed inspect verdict" }, { status: 400 });
6646
6800
  const project = resolveProjectFromIssueSync(normalizedIssueId);
6647
6801
  const workspacePath = project && join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
6648
- 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 });
6649
6803
  }
6650
6804
  console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
6651
6805
  if (specialist === "merge") {
6652
- const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-qOgqdqXH.js"));
6806
+ const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-BXhav38U.js"));
6653
6807
  if (yield* reportSpecialistCompletion(normalizedIssueId, {
6654
6808
  status,
6655
6809
  notes
@@ -6696,7 +6850,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6696
6850
  if (specialist === "inspect" && status === "failed") yield* Effect.promise(() => reportTieredInspectFailureEscalation(normalizedIssueId, notes));
6697
6851
  yield* Effect.promise(async () => {
6698
6852
  try {
6699
- const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-C6WkeKFK.js");
6853
+ const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-DVj0hvaL.js");
6700
6854
  const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
6701
6855
  const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
6702
6856
  saveAgentRuntimeState(tmuxSession, {
@@ -6715,7 +6869,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6715
6869
  });
6716
6870
  console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
6717
6871
  }
6718
- const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-BsBNvVZv.js");
6872
+ const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-C45ouoZ6.js");
6719
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}`);
6720
6874
  } catch (err) {
6721
6875
  console.error(`[specialists/done] Error managing specialist state:`, err);
@@ -6727,7 +6881,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6727
6881
  if (project) {
6728
6882
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
6729
6883
  if (existsSync(workspacePath)) {
6730
- const { getWorkspaceGitInfo } = await import("./git-utils-DmF5xkj8.js");
6884
+ const { getWorkspaceGitInfo } = await import("./git-utils-Dry_Ka_D.js");
6731
6885
  const { HEAD } = await Effect.runPromise(getWorkspaceGitInfo(workspacePath));
6732
6886
  setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: HEAD });
6733
6887
  console.log(`[specialists/done] Snapshotted reviewedAtCommit=${HEAD.substring(0, 8)} for ${normalizedIssueId}`);
@@ -6739,7 +6893,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6739
6893
  });
6740
6894
  if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
6741
6895
  try {
6742
- const { onInspectComplete } = await import("./inspect-agent-CyXNo9fM.js");
6896
+ const { onInspectComplete } = await import("./inspect-agent-ch-F-5Ci.js");
6743
6897
  const project = resolveProjectFromIssueSync(normalizedIssueId);
6744
6898
  if (project) {
6745
6899
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
@@ -6755,7 +6909,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6755
6909
  if (project) {
6756
6910
  if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
6757
6911
  setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
6758
- const { initEventStore } = await import("./event-store-DABarGNz.js");
6912
+ const { initEventStore } = await import("./event-store-Cr5PQwFC.js");
6759
6913
  await (await initEventStore()).appendAsync({
6760
6914
  type: "test.passed",
6761
6915
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -6808,8 +6962,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6808
6962
  if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
6809
6963
  try {
6810
6964
  const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
6811
- const { sessionExists } = await import("./tmux-HQLgwo_C.js");
6812
- const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-Czz6R57Z.js");
6965
+ const { sessionExists } = await import("./tmux-DoThH6aj.js");
6966
+ const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-FlIgQ3ql.js");
6813
6967
  if (await Effect.runPromise(sessionExists(workAgentId))) {
6814
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}`);
6815
6969
  console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
@@ -6823,7 +6977,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6823
6977
  try {
6824
6978
  const project = resolveProjectFromIssueSync(normalizedIssueId);
6825
6979
  const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
6826
- const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-D5lW0o3k.js");
6980
+ const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-C1Kg8n7t.js");
6827
6981
  const result = await Effect.runPromise(deliverReviewVerdictFeedback({
6828
6982
  issueId: normalizedIssueId,
6829
6983
  verdict: status === "failed" ? "failed" : "blocked",
@@ -6864,7 +7018,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
6864
7018
  });
6865
7019
  })));
6866
7020
  const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
6867
- const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-CSLtvPx6.js"));
7021
+ const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
6868
7022
  const results = cleanupAllLogsSync();
6869
7023
  return jsonResponse({
6870
7024
  success: true,
@@ -6874,7 +7028,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
6874
7028
  });
6875
7029
  })));
6876
7030
  const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
6877
- const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7031
+ const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
6878
7032
  return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
6879
7033
  })));
6880
7034
  const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
@@ -6918,7 +7072,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
6918
7072
  "blocked",
6919
7073
  "failed"
6920
7074
  ].includes(status)) {
6921
- const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7075
+ const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
6922
7076
  saveAgentRuntimeState(getTmuxSessionName(name), {
6923
7077
  state: "idle",
6924
7078
  lastActivity: (/* @__PURE__ */ new Date()).toISOString()
@@ -7039,7 +7193,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
7039
7193
  const issueId = params["issueId"];
7040
7194
  const type = params["type"];
7041
7195
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7042
- const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7196
+ const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7043
7197
  const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
7044
7198
  yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
7045
7199
  saveAgentRuntimeState(tmuxSession, {
@@ -7066,7 +7220,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
7066
7220
  if (limitParam) limit = parseInt(limitParam, 10);
7067
7221
  if (offsetParam) offset = parseInt(offsetParam, 10);
7068
7222
  }
7069
- const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-CSLtvPx6.js"));
7223
+ const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
7070
7224
  return jsonResponse(listRunLogsSync(project, type, {
7071
7225
  limit,
7072
7226
  offset
@@ -7077,7 +7231,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
7077
7231
  const project = params["project"];
7078
7232
  const type = params["type"];
7079
7233
  const runId = params["runId"];
7080
- const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-CSLtvPx6.js"));
7234
+ const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
7081
7235
  const logPath = getRunLogPath(project, type, runId);
7082
7236
  if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
7083
7237
  const encoder = new TextEncoder();
@@ -7136,7 +7290,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
7136
7290
  const project = params["project"];
7137
7291
  const type = params["type"];
7138
7292
  const runId = params["runId"];
7139
- const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-CSLtvPx6.js"));
7293
+ const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
7140
7294
  const content = getRunLogSync(project, type, runId);
7141
7295
  if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
7142
7296
  return jsonResponse({
@@ -7150,7 +7304,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
7150
7304
  const project = params["project"];
7151
7305
  const type = params["type"];
7152
7306
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7153
- const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7307
+ const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7154
7308
  yield* Effect.promise(() => terminateSpecialist(project, type));
7155
7309
  return jsonResponse({
7156
7310
  success: true,
@@ -7162,7 +7316,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
7162
7316
  const project = params["project"];
7163
7317
  const type = params["type"];
7164
7318
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7165
- const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7319
+ const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7166
7320
  if (pauseGracePeriod(project, type)) return jsonResponse({
7167
7321
  success: true,
7168
7322
  message: "Grace period paused"
@@ -7174,7 +7328,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
7174
7328
  const project = params["project"];
7175
7329
  const type = params["type"];
7176
7330
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7177
- const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7331
+ const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7178
7332
  if (resumeGracePeriod(project, type)) return jsonResponse({
7179
7333
  success: true,
7180
7334
  message: "Grace period resumed"
@@ -7186,7 +7340,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
7186
7340
  const project = params["project"];
7187
7341
  const type = params["type"];
7188
7342
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7189
- const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7343
+ const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7190
7344
  exitGracePeriod(project, type);
7191
7345
  return jsonResponse({
7192
7346
  success: true,
@@ -7198,7 +7352,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
7198
7352
  const project = params["project"];
7199
7353
  const type = params["type"];
7200
7354
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7201
- const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7355
+ const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7202
7356
  const state = getGracePeriodState(project, type);
7203
7357
  if (state) return jsonResponse(state);
7204
7358
  else return jsonResponse({ error: "No active grace period" }, { status: 404 });
@@ -7207,7 +7361,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
7207
7361
  const params = yield* HttpRouter.params;
7208
7362
  const project = params["project"];
7209
7363
  const type = params["type"];
7210
- const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-gjj8Z4Ii.js"));
7364
+ const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-DtrYvGJ-.js"));
7211
7365
  const digest = loadContextDigest(project, type);
7212
7366
  if (digest) return jsonResponse({ digest });
7213
7367
  else return jsonResponse({ error: "No context digest found" }, { status: 404 });
@@ -7216,7 +7370,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
7216
7370
  const params = yield* HttpRouter.params;
7217
7371
  const project = params["project"];
7218
7372
  const type = params["type"];
7219
- const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-gjj8Z4Ii.js"));
7373
+ const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-DtrYvGJ-.js"));
7220
7374
  const digest = yield* Effect.promise(() => regenerateContextDigest(project, type));
7221
7375
  if (digest) return jsonResponse({
7222
7376
  digest,
@@ -7235,7 +7389,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
7235
7389
  "blocked"
7236
7390
  ].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
7237
7391
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
7238
- const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-C6WkeKFK.js"));
7392
+ const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
7239
7393
  signalSpecialistCompletion(project, type, {
7240
7394
  status,
7241
7395
  notes
@@ -7269,8 +7423,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
7269
7423
  const params = yield* HttpRouter.params;
7270
7424
  const project = params["project"];
7271
7425
  const type = params["type"];
7272
- const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-CSLtvPx6.js"));
7273
- const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-IRHJIPYC.js"));
7426
+ const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
7427
+ const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-9SkRpES9.js"));
7274
7428
  const retention = getSpecialistRetention(project);
7275
7429
  const deleted = cleanupOldLogsSync(project, type, {
7276
7430
  maxDays: retention.max_days,
@@ -7291,7 +7445,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
7291
7445
  const project = params["project"];
7292
7446
  const issueId = params["issueId"];
7293
7447
  const { model, harness } = yield* readJsonBody;
7294
- const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-CSswH985.js"));
7448
+ const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-DJRO8EG8.js"));
7295
7449
  const killResult = yield* killAllReviewerSessions(project, issueId);
7296
7450
  const projectConfig = resolveProjectFromIssueSync(issueId);
7297
7451
  if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
@@ -7305,7 +7459,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
7305
7459
  }));
7306
7460
  branch = stdout.trim() || "unknown";
7307
7461
  } catch {}
7308
- const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-CSswH985.js"));
7462
+ const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-DJRO8EG8.js"));
7309
7463
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
7310
7464
  const result = yield* spawnReviewRoleForIssue({
7311
7465
  issueId,
@@ -7454,6 +7608,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
7454
7608
  */
7455
7609
  const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
7456
7610
  //#endregion
7457
- 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 };
7458
7612
 
7459
- //# sourceMappingURL=specialists-DAegTvRt.js.map
7613
+ //# sourceMappingURL=specialists-JVO00bs7.js.map