@overdeck/desktop 0.45.12 → 0.45.13

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 (323) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +33 -0
  2. package/package.json +7 -2
  3. package/server/{acceptance-criteria-1LHgD9vg.js → acceptance-criteria-CfujPRrz.js} +2 -2
  4. package/server/{advancing-selfheal-BqsLWqEM.js → advancing-selfheal-Bn5QiLtn.js} +4 -4
  5. package/server/{agent-gc-CUb52n7s.js → agent-gc-Cl9Nm0Zu.js} +3 -3
  6. package/server/{agent-state-D-moNwhA.js → agent-state-C6Rm6FPR.js} +1 -1
  7. package/server/{agent-state-service-BzESvLOf.js → agent-state-service-JhFzYCP_.js} +5 -5
  8. package/server/{agent-state-service-BaZH7sXJ.js → agent-state-service-U8feBf8t.js} +1 -1
  9. package/server/{agents-C4kZ8a2r.js → agents-CxbuBjID.js} +1 -1
  10. package/server/{agents-B5LfpLPv.js → agents-DqQa4Dq_.js} +88 -64
  11. package/server/{archive-planning-oX1pj6nY.js → archive-planning-CPitEZo4.js} +3 -3
  12. package/server/{archive-planning-BbZe-8IK.js → archive-planning-DmpT1_14.js} +1 -1
  13. package/server/{artifact-index-jobs-DGr6bxev.js → artifact-index-jobs-sMnNtPhy.js} +2 -2
  14. package/server/{auto-commit-CGQlb4rV.js → auto-commit-wZ9X7Isd.js} +1 -1
  15. package/server/{backlog-auto-trigger-BlJHikOm.js → backlog-auto-trigger-Cf9C8fwD.js} +2 -2
  16. package/server/{bd-process-lock-i3CYMS-B.js → bd-process-lock-D1aJxeYv.js} +2 -2
  17. package/server/{beads-BNU-fb48.js → beads-CivpXztb.js} +1 -1
  18. package/server/{beads-DD7fYCl5.js → beads-DRoj6-e1.js} +4 -4
  19. package/server/{beads-query-e6oku4P5.js → beads-query-tOsAYP5h.js} +2 -2
  20. package/server/{behavior-CPf0pbOt.js → behavior-D3d2mVyD.js} +3 -3
  21. package/server/{briefing-freshness-B2FdLwIv.js → briefing-freshness-BL3Q6p7R.js} +4 -4
  22. package/server/{checkpoint-manager-JryW6MpM.js → checkpoint-manager-DCxjQvP_.js} +2 -2
  23. package/server/{checkpoint-manager-eFgaMMu4.js → checkpoint-manager-j5URlFY7.js} +1 -1
  24. package/server/checkpoint-worker.js +1 -1
  25. package/server/{checkpoints-qvOqvMuC.js → checkpoints-BoX1H2Hf.js} +2 -2
  26. package/server/{checkpoints-BK17oicz.js → checkpoints-Bu_M_Q9W.js} +1 -1
  27. package/server/claude-hooks-provision-D-jGXmu1.js +360 -0
  28. package/server/{claude-permissions-B6bWGh9d.js → claude-permissions-DxIjkOVl.js} +2 -2
  29. package/server/{claude-settings-overlay-BPdhTPjo.js → claude-settings-overlay-5b9X2S0C.js} +1 -1
  30. package/server/{claude-settings-overlay-CRyyKKXQ.js → claude-settings-overlay-BPDS6GfE.js} +2 -2
  31. package/server/cli-CqgiSAU8.js +3 -0
  32. package/server/{cli-B75AieAM.js → cli-s7bPWy-E.js} +9 -9
  33. package/server/{cliproxy-CCzwuSNe.js → cliproxy-BituqWtR.js} +2 -2
  34. package/server/{cliproxy-DOQf66G9.js → cliproxy-D3sHB0sI.js} +1 -1
  35. package/server/{close-issue-_X3MXJyG.js → close-issue-CrBE7voz.js} +4 -4
  36. package/server/{closed-issue-reaper-CLR7ClsO.js → closed-issue-reaper-BRQBc7Xa.js} +1 -1
  37. package/server/{closed-issue-reaper-BsUfBSjM.js → closed-issue-reaper-DX9mYUji.js} +9 -9
  38. package/server/{codex-CY-QRuU9.js → codex-Bi1ITSOo.js} +1 -1
  39. package/server/{codex-B4KEpX5V.js → codex-CO0HrK3j.js} +5 -5
  40. package/server/{compact-beads-cZds2MTr.js → compact-beads-CrA8-k10.js} +1 -1
  41. package/server/{compact-beads-uEDccC76.js → compact-beads-DUkCUFxA.js} +3 -3
  42. package/server/{config-DARrpYWA.js → config-B4_d7z7z.js} +1 -1
  43. package/server/{config-8sjaU6jZ.js → config-DsCxzjXK.js} +2 -2
  44. package/server/{config-yaml-ClpGgrf6.js → config-yaml-C_djSurJ.js} +2 -2
  45. package/server/{conflict-gate-Ds9_2yjd.js → conflict-gate-CpOn9KC-.js} +1 -1
  46. package/server/{conflict-gate-BtB_o-Vi.js → conflict-gate-D47Kl78u.js} +3 -3
  47. package/server/{context-layers-r2ywnQYA.js → context-layers-BNhUBTkf.js} +3 -3
  48. package/server/{context-layers-CRCk1QG7.js → context-layers-CHl3Nroz.js} +2 -2
  49. package/server/{control-settings-D1B3u6HP.js → control-settings-KyYNXZLv.js} +4 -4
  50. package/server/{conversation-compaction-D86Zo2Ci.js → conversation-compaction-D3aS5PnS.js} +8 -8
  51. package/server/{conversation-compaction-CZRVk4hg.js → conversation-compaction-D4Wed1BJ.js} +1 -1
  52. package/server/{conversation-service-CuTVU8dV.js → conversation-service-CFZIjs-M.js} +5 -5
  53. package/server/{conversation-service-CkL-6MuG.js → conversation-service-DcDB5usR.js} +1 -1
  54. package/server/{conversations-DfJKBDwB.js → conversations-BSOU5qnu.js} +4 -4
  55. package/server/{conversations-BmWEluPL.js → conversations-BbDPrz89.js} +1 -1
  56. package/server/{cost-DAPYN6iA.js → cost-BE_ulOrw.js} +3 -3
  57. package/server/{cost-CCnqa5xK.js → cost-CaiG63FG.js} +2 -2
  58. package/server/{cost-sync-BDL10Nwu.js → cost-sync-D6AX8jv-.js} +3 -3
  59. package/server/{dag-Dv2r5bVD.js → dag-BQFtXOuJ.js} +3 -3
  60. package/server/{dangerous-git-ops-Dcw7PbYo.js → dangerous-git-ops-04Ba-Qu3.js} +1 -1
  61. package/server/dashboard-db-worker.js +6 -6
  62. package/server/{deacon-CM0MxbS8.js → deacon-2EvA9Ci3.js} +97 -97
  63. package/server/{deacon-DYnZH7kC.js → deacon-Bz-6Wjmn.js} +3 -3
  64. package/server/deacon-swarm-B8pgK2a7.js +2 -0
  65. package/server/{deacon-swarm-BstYoz8Q.js → deacon-swarm-DYYOzHRH.js} +10 -10
  66. package/server/deacon.js +7 -7
  67. package/server/{devcontainer-renderer-CaYOG9JN.js → devcontainer-renderer-Dx0C7VWJ.js} +2 -2
  68. package/server/dist-BYSj075e.js +3 -0
  69. package/server/{dist-BIC8spJ0.js → dist-ya66D9ze.js} +1 -1
  70. package/server/{docker-DDI1shu3.js → docker-D2TbXDO6.js} +2 -2
  71. package/server/{ensure-devcontainer-CbSXvN9W.js → ensure-devcontainer-BIShzs3M.js} +1 -1
  72. package/server/{ensure-devcontainer-DCAg3ksz.js → ensure-devcontainer-BTiMfFp5.js} +3 -3
  73. package/server/{event-store-DU3HkZlN.js → event-store-C02Gprug.js} +1 -1
  74. package/server/{event-store-DCMqyI07.js → event-store-C71x6h0i.js} +3 -3
  75. package/server/{events-BfiosVAn.js → events-BFDuPV6n.js} +3 -3
  76. package/server/{events-DLRxpSuV.js → events-D2gP2-Yv.js} +1 -1
  77. package/server/{factory-BMtWV9iv.js → factory-ByfbrCab.js} +4 -4
  78. package/server/{feature-registry-population-DA7bO6Zn.js → feature-registry-population-CSH66UO8.js} +4 -4
  79. package/server/{feature-registry-storage-nAY1fbBt.js → feature-registry-storage-DW7dUefc.js} +2 -2
  80. package/server/{features-DMu7eGmU.js → features-x_aLR7U9.js} +2 -2
  81. package/server/{feedback-target-DHqcw3cN.js → feedback-target-BFo9fScH.js} +6 -6
  82. package/server/{feedback-target-B2SEai8-.js → feedback-target-C4VMPTZu.js} +1 -1
  83. package/server/{feedback-writer-qvm7UON7.js → feedback-writer-B9ZqnnX3.js} +4 -4
  84. package/server/{feedback-writer-DMBdS_jL.js → feedback-writer-DCyd75yJ.js} +1 -1
  85. package/server/{flywheel-Dfpx4bIV.js → flywheel-D9NKvWqb.js} +11 -11
  86. package/server/{flywheel-k4FPtCQ_.js → flywheel-DB48X7Nn.js} +1 -1
  87. package/server/{flywheel-D2LdPSic.js → flywheel-DwQCoZQG.js} +13 -13
  88. package/server/{flywheel-merge-order-CB4lbXeJ.js → flywheel-merge-order-DrjmFXg4.js} +6 -6
  89. package/server/{flywheel-merge-order-CttTazRY.js → flywheel-merge-order-f1bi5XIf.js} +1 -1
  90. package/server/{forge-CoPFXFyl.js → forge-C-SoKy8U.js} +2 -2
  91. package/server/forge-CUCYK7h_.js +2 -0
  92. package/server/{from-B0YoJl9-.js → from-fu7ZumnY.js} +1 -1
  93. package/server/{fts-db-DAHW1yA_.js → fts-db-CL-YzSRG.js} +2 -2
  94. package/server/{fts-operations-DDXDBi0d.js → fts-operations-Bylu5NjM.js} +2 -2
  95. package/server/{git-utils-B90Zjzfl.js → git-utils-C8koBs8j.js} +2 -2
  96. package/server/{git-utils-DbfC0zls.js → git-utils-Ym380hJZ.js} +1 -1
  97. package/server/{github-app-C7lftMNj.js → github-app-DIr70YLg.js} +1 -1
  98. package/server/{github-app-BecAnXRX.js → github-app-DhycHVLF.js} +2 -2
  99. package/server/{github-client-D21rCIXk.js → github-client-7gkcXcBS.js} +2 -2
  100. package/server/{github-client-BwtKZtM0.js → github-client-Ji9lUTNF.js} +1 -1
  101. package/server/{github-pr-lookup-CzVWuysl.js → github-pr-lookup-rt7T9FwA.js} +2 -2
  102. package/server/{harness-resolve-SkRJm4a7.js → harness-resolve-CvGXUnAF.js} +3 -3
  103. package/server/{health-events-BT0aAfeA.js → health-events-D4E1DLN-.js} +2 -2
  104. package/server/{health-events-DA_JLpgZ.js → health-events-DDfkoO5a.js} +1 -1
  105. package/server/{hooks-DxEn2BoY.js → hooks-D_6pAbuJ.js} +2 -2
  106. package/server/{hooks-BQxRXtRb.js → hooks-DvdnCVv6.js} +1 -1
  107. package/server/{idle-stack-reaper-C7fJL8jH.js → idle-stack-reaper-DNbV9-fj.js} +1 -1
  108. package/server/{idle-stack-reaper-DGy7tvC9.js → idle-stack-reaper-cDRXDpgE.js} +2 -2
  109. package/server/{infra-DE3C4PMr.js → infra-Clew3DpF.js} +50 -3
  110. package/server/{injection-Dt22tGvS.js → injection-QCIHOpk6.js} +1 -1
  111. package/server/{injection-Cc4Qt8LZ.js → injection-ql0Nddcn.js} +7 -7
  112. package/server/inspect-agent-D8UBDgfR.js +2 -0
  113. package/server/{inspect-agent-DOaCDkCF.js → inspect-agent-DY18KEx4.js} +9 -9
  114. package/server/{internal-token-B_1YLWLI.js → internal-token-BeXjPLKy.js} +2 -2
  115. package/server/{internal-token-nobT6FhA.js → internal-token-C90jBp-y.js} +1 -1
  116. package/server/{io-A7ZuOBkz.js → io-CbAFXQge.js} +2 -2
  117. package/server/{issue-closed-Da3DeomA.js → issue-closed-BYC2TCk-.js} +4 -4
  118. package/server/{issue-lifecycle-543pQX9D.js → issue-lifecycle-BoJa6qIt.js} +21 -21
  119. package/server/{issue-lifecycle-Bd9XBJAQ.js → issue-lifecycle-CLHbj8RS.js} +1 -1
  120. package/server/{issue-service-singleton-BC2JLZi7.js → issue-service-singleton-3g_CCY-1.js} +1 -1
  121. package/server/{issue-service-singleton-Brc3t0SV.js → issue-service-singleton-BS9NENuR.js} +8 -8
  122. package/server/{issues-D3kt9UWE.js → issues-BPcqPqfV.js} +2 -2
  123. package/server/{label-cleanup-w9X_T3AQ.js → label-cleanup-CwiCSZrb.js} +2 -2
  124. package/server/{layers-Cwe1J-9o.js → layers-OHHLphl0.js} +2 -2
  125. package/server/{lifecycle-f1GbDK33.js → lifecycle-B8IdvUbt.js} +6 -6
  126. package/server/{lifecycle-io-D56q8zlO.js → lifecycle-io-BMCH1Bxg.js} +1 -1
  127. package/server/{lifecycle-io-Bqvj0m3i.js → lifecycle-io-C73m5e6R.js} +4 -4
  128. package/server/{linear-client-Bh4T4S-c.js → linear-client-BMxgycoy.js} +1 -1
  129. package/server/{linear-client-CfJMTAYd.js → linear-client-CgQlM4aT.js} +2 -2
  130. package/server/memory-fts-worker.js +1 -1
  131. package/server/{merge-ZrXFM3jv.js → merge-B7Oi-g6k.js} +3 -3
  132. package/server/{merge-DRMPa8CQ.js → merge-BRkVaIx-.js} +1 -1
  133. package/server/merge-agent-Bwm34MZ5.js +3 -0
  134. package/server/{merge-agent-CHHs5S_0.js → merge-agent-DNFFsiEm.js} +61 -26
  135. package/server/{merge-batch-BwhGdlh4.js → merge-batch-BpYXUaqJ.js} +1 -1
  136. package/server/{merge-blockers-BMhDpMl_.js → merge-blockers-DIOZmqdK.js} +2 -2
  137. package/server/merge-ops-B7m-hBEZ.js +2 -0
  138. package/server/{merge-rebase-R7MfqpiE.js → merge-rebase-C8WH39MB.js} +2 -2
  139. package/server/{merge-set-B3Breacq.js → merge-set-CsEE2CyQ.js} +9 -5
  140. package/server/{merge-set-D-iXNP0I.js → merge-set-DOsBTBQc.js} +1 -1
  141. package/server/{merge-sync-DHWbGtjR.js → merge-sync-C2B322Ot.js} +2 -2
  142. package/server/{merge-sync-bOOtfeXR.js → merge-sync-CcLM2vwW.js} +1 -1
  143. package/server/{merge-train-98ptZrPT.js → merge-train-BIm7-7cy.js} +3 -3
  144. package/server/{merge-train-deps-B5FWJTE2.js → merge-train-deps-DG1oQ2DT.js} +4 -4
  145. package/server/{merge-verification-BGiuiXAK.js → merge-verification-BAbjxEd5.js} +4 -4
  146. package/server/{multipart-parser-D7mzNNDm.js → multipart-parser-jKtKAXtl.js} +2 -2
  147. package/server/node_modules/.package-lock.json +1 -1
  148. package/server/{orphan-proposed-reconciler-CSuxivr9.js → orphan-proposed-reconciler-BqVGaOIj.js} +1 -1
  149. package/server/{orphan-proposed-reconciler-BSGCNJ6X.js → orphan-proposed-reconciler-zHrwJ3xr.js} +9 -9
  150. package/server/package-lock.json +2 -2
  151. package/server/package.json +1 -1
  152. package/server/{pan-dir-DoPtdHrp.js → pan-dir-BlNrLzW7.js} +3 -3
  153. package/server/{paths-CVDLPxXp.js → paths-CiVeo4N_.js} +2 -2
  154. package/server/{pipeline-notifier-WD2dnOsR.js → pipeline-notifier-DBF6dHxH.js} +2 -2
  155. package/server/{pipeline-notifier-BtYHbBPl.js → pipeline-notifier-nkWCe042.js} +1 -1
  156. package/server/{projects-Bqfwuqet.js → projects-BqRMlDOv.js} +1 -1
  157. package/server/{prompts-Cg7e9FPb.js → prompts-CXbQvevY.js} +2 -2
  158. package/server/{providers-fLduChnX.js → providers-CUdAb5Qu.js} +7 -7
  159. package/server/{providers-JjK6izqX.js → providers-gZ0cUgQM.js} +1 -1
  160. package/server/public/assets/{chunk-BO2N2NFS-aNlsGDCu.js → chunk-BO2N2NFS-C-6y8VFI.js} +4 -4
  161. package/server/public/assets/{diagram-OG6HWLK6-CnjkrvT8.js → diagram-OG6HWLK6-NACO1xW5.js} +1 -1
  162. package/server/public/assets/{dist-CGKBCieA.js → dist-D1FjqGgm.js} +1 -1
  163. package/server/public/assets/{dist-Bg3Sbsx4.js → dist-DQD-ZjQY.js} +3 -3
  164. package/server/public/assets/{ganttDiagram-6RSMTGT7-C8LLKj23.js → ganttDiagram-6RSMTGT7-CEMAKgmE.js} +1 -1
  165. package/server/public/assets/{highlighted-body-OFNGDK62-BSDEUvhW.js → highlighted-body-OFNGDK62-D5lC7FW8.js} +1 -1
  166. package/server/public/assets/{index-LQIfhmgI.js → index-BDqWyuZQ.js} +140 -140
  167. package/server/public/assets/{linear-DEbYZoxg.js → linear-DDHAMRPB.js} +1 -1
  168. package/server/public/assets/mermaid-GHXKKRXX-DRM2ANcR.js +1 -0
  169. package/server/public/assets/{pieDiagram-4H26LBE5-BtZL5pXE.js → pieDiagram-4H26LBE5-DwBdeKBb.js} +1 -1
  170. package/server/public/assets/{prod-DYVvIyuh.js → prod-DAZt0c4G.js} +4 -4
  171. package/server/public/assets/{quadrantDiagram-W4KKPZXB-a7vS8Jc8.js → quadrantDiagram-W4KKPZXB-CNDLp-_m.js} +1 -1
  172. package/server/public/assets/{sankeyDiagram-5OEKKPKP-Ckbq2SWH.js → sankeyDiagram-5OEKKPKP-oIUL_uO1.js} +1 -1
  173. package/server/public/assets/{xychartDiagram-2RQKCTM6-DJyeNa99.js → xychartDiagram-2RQKCTM6-B-IM6Cck.js} +1 -1
  174. package/server/public/index.html +1 -1
  175. package/server/{pull-requests-D2SjJIwY.js → pull-requests-DZ-V7_LB.js} +1 -1
  176. package/server/{pull-requests-1WXmTBlo.js → pull-requests-kTRl7cWC.js} +3 -3
  177. package/server/rally-CRteqXe0.js +3 -0
  178. package/server/{rally-api-H5I2CBO0.js → rally-api-DpZo3WwF.js} +2 -2
  179. package/server/{rally-api-BtvwdX6d.js → rally-api-jOk4vit_.js} +1 -1
  180. package/server/{rally-client-Bt-qHiOh.js → rally-client-BQjm3aaq.js} +1 -1
  181. package/server/{rally-client-33CYZYYu.js → rally-client-CoWZeVEj.js} +4 -4
  182. package/server/{rally-8aQlLLVj.js → rally-xCTZ-UcI.js} +3 -3
  183. package/server/{rebuild-stack-KHkkrGjx.js → rebuild-stack-BZ7j27xY.js} +5 -5
  184. package/server/{rebuild-stack-CXSgAGPR.js → rebuild-stack-r-cxcr26.js} +1 -1
  185. package/server/{reconstruct-cache-D_Ml65_6.js → reconstruct-cache-13EkMg_i.js} +6 -6
  186. package/server/{record-De2syxNB.js → record-CJsjvRO4.js} +1 -1
  187. package/server/release-engine-YLTnEO_K.js +306 -0
  188. package/server/release-set-DwvT_Opu.js +125 -0
  189. package/server/{remote-CGuognN3.js → remote-9u9WL0NJ.js} +3 -3
  190. package/server/{remote-D0Old0Cv.js → remote-B062S1Kc.js} +3 -3
  191. package/server/{remote-agents-UHoi4oGr.js → remote-agents-B4eWgwNd.js} +1 -1
  192. package/server/{remote-agents-DfhMq6kQ.js → remote-agents-BBTg-vLT.js} +5 -5
  193. package/server/{remote-completion-RZYePR_0.js → remote-completion-B0rmBnbL.js} +12 -12
  194. package/server/resume-R7xkSmLW.js +3 -0
  195. package/server/{review-agent-uwVftH98.js → review-agent-Bf9XjLnl.js} +1 -1
  196. package/server/{review-agent-sZBCpEVv.js → review-agent-tfR5RDzG.js} +22 -22
  197. package/server/{review-artifacts-C7a45b1_.js → review-artifacts-D0_IE6DQ.js} +6 -6
  198. package/server/{review-context-CErbQpKL.js → review-context-CXO5ml5D.js} +7 -7
  199. package/server/{review-monitor-DHD9m_kh.js → review-monitor-DfFUSx0J.js} +2 -2
  200. package/server/{review-status-JhQ3qlDS.js → review-status-B0Axo-Ma.js} +1 -1
  201. package/server/{review-status-gPndPUBc.js → review-status-BcfwcAcO.js} +23 -16
  202. package/server/{review-status-enrichment-qWvWckYN.js → review-status-enrichment-Cp5kFTGl.js} +3 -3
  203. package/server/{review-status-sync-B_GrEke8.js → review-status-sync-Bc0c_u12.js} +1 -1
  204. package/server/{review-status-sync-D3A9KX95.js → review-status-sync-CEFty1pW.js} +9 -5
  205. package/server/{review-verdict-feedback-4WZ5ZdbC.js → review-verdict-feedback-BOKRLLDf.js} +6 -6
  206. package/server/{review-verdict-feedback-Zo0r_z4m.js → review-verdict-feedback-BnGtT0vN.js} +1 -1
  207. package/server/{rollup-Bmhn80tB.js → rollup-BVqFuiS9.js} +1 -1
  208. package/server/{rollup-BrUIKMv_.js → rollup-C22QDVxh.js} +8 -8
  209. package/server/{scanner-BIGumel_.js → scanner-BLCnuXqY.js} +7 -7
  210. package/server/{sequence-io-DA0akEQN.js → sequence-io-BozlUb6f.js} +4 -4
  211. package/server/{sequencer-agent-DeflKafB.js → sequencer-agent-BEDEHfd2.js} +5 -5
  212. package/server/server.js +251 -160
  213. package/server/{service-V0sUK-OR.js → service-C8jKYZ0w.js} +42 -42
  214. package/server/{session-fork-Yx3UcAQf.js → session-fork-BDGksK4e.js} +2 -2
  215. package/server/{settings-CFEeQRj2.js → settings-CSLhh6qR.js} +2 -2
  216. package/server/settings-CSaXtkoA.js +2 -0
  217. package/server/{settings-CxVate0h.js → settings-DrRQCren.js} +3 -3
  218. package/server/{shadow-engineering-BRxnVSDk.js → shadow-engineering-BMcBN-Of.js} +2 -2
  219. package/server/{shadow-state-BiMwdyl1.js → shadow-state-B4ayC7nx.js} +2 -2
  220. package/server/{shadow-state-1aS8FijU.js → shadow-state-CHqWHD3T.js} +1 -1
  221. package/server/{ship-log-CMWH3H5-.js → ship-log-CDVmOlZP.js} +1 -1
  222. package/server/{smart-compaction-Bw1K_Sbl.js → smart-compaction-C-F5sP9P.js} +7 -7
  223. package/server/{smart-compaction-xblMyVpT.js → smart-compaction-V9DBrGcr.js} +1 -1
  224. package/server/{spawn-planning-session-CzDFSKAQ.js → spawn-planning-session-Bz4_JES2.js} +1 -1
  225. package/server/{spawn-planning-session-DxLxcM7m.js → spawn-planning-session-dSpOU0lP.js} +15 -15
  226. package/server/{specialist-completion-BiEXUHfD.js → specialist-completion-Coz3eTSr.js} +1 -1
  227. package/server/{specialist-context-BfkTA81h.js → specialist-context-fmb03vXQ.js} +5 -5
  228. package/server/{specialist-handoff-logger-BiKuLtNm.js → specialist-handoff-logger-B9HK_lRu.js} +2 -2
  229. package/server/{specialist-logs-CFJjGsLC.js → specialist-logs-B24R2B9Y.js} +3 -3
  230. package/server/{specialists-BLIreoE7.js → specialists-B6f5-5nG.js} +1 -1
  231. package/server/{specialists-DjHbwQ_p.js → specialists-BGNZ0_ZW.js} +18 -18
  232. package/server/{specialists-B4byf18k.js → specialists-CL7E8yUg.js} +75 -75
  233. package/server/{specialists-DdvpFNt1.js → specialists-Chvvwf5z.js} +1 -1
  234. package/server/specs-oaaYaA5c.js +3 -0
  235. package/server/{src-CALBEUMX.js → src-BVxZuHMg.js} +3 -3
  236. package/server/{src-mK_M_ZIj.js → src-D-VXCC9C.js} +5 -5
  237. package/server/{src-fgbU-jJ-.js → src-DGAEtABV.js} +13 -2
  238. package/server/{stack-health-BFM8YlHw.js → stack-health-BKbTTOT2.js} +1 -1
  239. package/server/{stack-health-Qd7rPiVe.js → stack-health-C-le5erA.js} +2 -2
  240. package/server/{state-home-C2Bicw9N.js → state-home-CoyWsECg.js} +6 -6
  241. package/server/{summary-fork-EWWBvzgE.js → summary-fork-BF_0vxrq.js} +2 -2
  242. package/server/{summary-fork-DezPkJSm.js → summary-fork-BlE30Q-I.js} +8 -8
  243. package/server/supervisor-03Tj_Wra.js +2 -0
  244. package/server/{supervisor-D5GC5jUM.js → supervisor-BSeML_p0.js} +2 -2
  245. package/server/{swarm-readiness-Cf9mommA.js → swarm-readiness-CQ4sjrXc.js} +3 -3
  246. package/server/{system-prerequisites-BsI9hxh9.js → system-prerequisites-DnmLYOnU.js} +13 -1
  247. package/server/{teardown-workspace-CWz1pbEK.js → teardown-workspace-CpcjDrZ4.js} +12 -12
  248. package/server/{test-agent-queue-TiVXe3ZT.js → test-agent-queue-Bq298zZl.js} +5 -5
  249. package/server/{tldr-daemon-C_1frSDj.js → tldr-daemon-CaSUXd9r.js} +2 -2
  250. package/server/{tldr-daemon-Big5IZ_M.js → tldr-daemon-Rn1Zue0P.js} +1 -1
  251. package/server/{tmux-D57f-XNv.js → tmux-BVc-NeKM.js} +2 -2
  252. package/server/{tmux-DClqWwb8.js → tmux-CbcrkUx5.js} +1 -1
  253. package/server/{token-_qujO3JZ.js → token-D2OC_9ms.js} +1 -1
  254. package/server/{tracker-config-BmdJU_w6.js → tracker-config-C1Y_2CIo.js} +2 -2
  255. package/server/{tracker-config-B_Ubts1Z.js → tracker-config-EsBoOWEy.js} +1 -1
  256. package/server/{tracker-utils-Bg-Sevcv.js → tracker-utils-DSb9cfrF.js} +1 -1
  257. package/server/{tracker-utils-CWFt6jjV.js → tracker-utils-lph9C3Pw.js} +2 -2
  258. package/server/{tunnel-UBf2vyAL.js → tunnel-BFBCeo97.js} +2 -2
  259. package/server/{tunnel-hOBNQbmF.js → tunnel-DDe-ATFF.js} +1 -1
  260. package/server/{uat-train-DGkIkLxu.js → uat-train-8T24rPzc.js} +1 -1
  261. package/server/{uat-train-qNanv5hN.js → uat-train-DtKHHy1U.js} +23 -23
  262. package/server/{validation-B0QaLIHP.js → validation-COOXwNXU.js} +1 -1
  263. package/server/{validation-C4wegCvH.js → validation-lyudzPvD.js} +3 -3
  264. package/server/{verification-runner-CntudBes.js → verification-runner-DO0nYTJx.js} +11 -11
  265. package/server/{verification-runner-DdleMNLq.js → verification-runner-Dd1FX8Qk.js} +1 -1
  266. package/server/{vtt-parser-CKc-smWM.js → vtt-parser-C57tEF7-.js} +1 -1
  267. package/server/{work-agent-prompt-CG5jFV9A.js → work-agent-prompt-B2F3ZwKm.js} +11 -11
  268. package/server/workflows-B4fIN8VP.js +2 -0
  269. package/server/{workflows-BK2xs_a8.js → workflows-Clz_AFwR.js} +13 -13
  270. package/server/{workspace-CLrSIRCx.js → workspace-CY_2-Ddv.js} +3 -3
  271. package/server/{workspace-C9lC5o3E.js → workspace-D0rCFemz.js} +1 -1
  272. package/server/{workspace-manager-Cb2a7bg9.js → workspace-manager-BIfpzqdU.js} +1 -1
  273. package/server/{workspace-manager-BJhW2sky.js → workspace-manager-D6NgGkiF.js} +10 -10
  274. package/server/{workspace-metadata-QQmo_Z0l.js → workspace-metadata-C8yn8kAH.js} +2 -2
  275. package/server/{workspace-metadata-CTRnr323.js → workspace-metadata-DfgR40YU.js} +1 -1
  276. package/server/{workspaces-Ca4zZs12.js → workspaces-DOeHyKmA.js} +104 -92
  277. package/sync-sources/hooks/ask-user-question-hook +87 -0
  278. package/sync-sources/hooks/auto-approve-hook +96 -0
  279. package/sync-sources/hooks/codex-notify-hook +62 -0
  280. package/sync-sources/hooks/gh-issue-trailer-hook +4 -0
  281. package/sync-sources/hooks/gh-issue-trailer-hook.d.ts +7 -0
  282. package/sync-sources/hooks/gh-issue-trailer-hook.d.ts.map +1 -0
  283. package/sync-sources/hooks/gh-issue-trailer-hook.js +239 -0
  284. package/sync-sources/hooks/gh-issue-trailer-hook.js.map +1 -0
  285. package/sync-sources/hooks/gh-issue-trailer-hook.ts +296 -0
  286. package/sync-sources/hooks/git-hooks/post-checkout +109 -0
  287. package/sync-sources/hooks/heartbeat-hook +113 -0
  288. package/sync-sources/hooks/notification-hook +70 -0
  289. package/sync-sources/hooks/notify-complete +79 -0
  290. package/sync-sources/hooks/pan-hook-lib.sh +153 -0
  291. package/sync-sources/hooks/permission-event-hook +24 -0
  292. package/sync-sources/hooks/post-compact-hook +25 -0
  293. package/sync-sources/hooks/pre-compact-hook +26 -0
  294. package/sync-sources/hooks/pre-tool-hook +35 -0
  295. package/sync-sources/hooks/record-cost-event.d.ts +1 -0
  296. package/sync-sources/hooks/record-cost-event.js +31858 -0
  297. package/sync-sources/hooks/record-cost-event.js.map +1 -0
  298. package/sync-sources/hooks/record-cost-event.ts +267 -0
  299. package/sync-sources/hooks/rtk-bash-filter +152 -0
  300. package/sync-sources/hooks/session-start-hook +80 -0
  301. package/sync-sources/hooks/specialist-stop-hook +106 -0
  302. package/sync-sources/hooks/statusline.sh +169 -0
  303. package/sync-sources/hooks/stop-hook +217 -0
  304. package/sync-sources/hooks/tldr-post-edit +72 -0
  305. package/sync-sources/hooks/tldr-read-enforcer +340 -0
  306. package/sync-sources/hooks/tmux-send-keys-guard +87 -0
  307. package/sync-sources/hooks/tsdown.config.ts +14 -0
  308. package/sync-sources/hooks/user-prompt-submit-hook +57 -0
  309. package/sync-sources/hooks/work-agent-stop-hook +424 -0
  310. package/server/cli-Ch_BWJB2.js +0 -3
  311. package/server/deacon-swarm-CSWGRfzr.js +0 -2
  312. package/server/dist-BUplB3Od.js +0 -3
  313. package/server/forge-IgLR0Ist.js +0 -2
  314. package/server/inspect-agent-CYoWAeeB.js +0 -2
  315. package/server/merge-agent-CfohxFWM.js +0 -3
  316. package/server/merge-ops-Czke6UAp.js +0 -2
  317. package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +0 -1
  318. package/server/rally-Ba9QoNYc.js +0 -3
  319. package/server/resume-CmxF3Kjz.js +0 -3
  320. package/server/settings-DEhYpW0k.js +0 -2
  321. package/server/specs-CVH1kvz3.js +0 -3
  322. package/server/supervisor-DQMK2e3I.js +0 -2
  323. package/server/workflows-pKw9yRSV.js +0 -2
@@ -1,42 +1,43 @@
1
- import { $n as extractPrefixSync, Br as getOverdeckHome, Dn as getProjectSync, Gn as resolveProjectFromIssueSync, Ln as listProjectsSync, Lr as encodeClaudeProjectDir, Nn as init_projects, Qn as extractNumberSync, Sn as findProjectByTeamSync, Vr as init_paths, cr as FsError, er as init_issue_id, ln as init_state_plane, lr as GitError, nr as parseIssueIdSync, un as isStatePlaneOnlyStatus, vn as extractTeamPrefix, vr as init_errors } from "./config-yaml-ClpGgrf6.js";
2
- import { D as jsonResponse, E as httpHandler, S as normalizeOrigin, b as getTrustedOrigins, f as getWorkAgentLifecycleStateSync, n as _serverManagedMerges, y as getHeaderFromMap } from "./specialists-B4byf18k.js";
1
+ import { $n as extractPrefixSync, Dn as getProjectSync, Gn as resolveProjectFromIssueSync, Hr as init_paths, Ln as listProjectsSync, Nn as init_projects, Qn as extractNumberSync, Rr as encodeClaudeProjectDir, Sn as findProjectByTeamSync, Vr as getOverdeckHome, er as init_issue_id, ir as resolveIssueIdSync, ln as init_state_plane, lr as FsError, nr as parseIssueIdSync, un as isStatePlaneOnlyStatus, ur as GitError, vn as extractTeamPrefix, yr as init_errors } from "./config-yaml-C_djSurJ.js";
2
+ import { D as jsonResponse, E as httpHandler, S as normalizeOrigin, b as getTrustedOrigins, f as getWorkAgentLifecycleStateSync, n as _serverManagedMerges, y as getHeaderFromMap } from "./specialists-CL7E8yUg.js";
3
3
  import { a as init_activity_logger, n as emitActivityEntrySync } from "./activity-logger-pcbf-e30.js";
4
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-DE3C4PMr.js";
5
- import { K as buildChildEnvWithoutTmuxSync, L as sessionExists, O as listSessionNames, i as capturePane, q as init_child_env, x as init_tmux } from "./tmux-D57f-XNv.js";
6
- import { _ as setDeaconIgnored, c as init_review_status, f as markWorkspaceStuck, g as setAutoMerge, s as getReviewStatusSync, u as loadReviewStatuses, y as setReviewStatusSync } from "./review-status-gPndPUBc.js";
7
- import { _ as init_queue_position, a as EventStoreService, g as findPositionInQueueSync, h as computeQueuePositionFromStatusSync, s as init_domain_services } from "./issue-lifecycle-543pQX9D.js";
8
- import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CCnqa5xK.js";
9
- import { Mn as getAgentState, Rt as transitionIssueToInReview, U as spawnAgent, Z as listRunningAgents, gr as getAgentRuntimeStateSync, j as messageAgent, t as init_agents, vr as saveAgentRuntimeState } from "./agents-B5LfpLPv.js";
10
- import { f as CostWriter, l as CostDoorLive } from "./service-V0sUK-OR.js";
11
- import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-BmdJU_w6.js";
12
- import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-CWFt6jjV.js";
13
- import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-B_1YLWLI.js";
4
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-Clew3DpF.js";
5
+ import { K as buildChildEnvWithoutTmuxSync, L as sessionExists, O as listSessionNames, i as capturePane, q as init_child_env, x as init_tmux } from "./tmux-BVc-NeKM.js";
6
+ import { _ as setDeaconIgnored, c as init_review_status, f as markWorkspaceStuck, g as setAutoMerge, s as getReviewStatusSync, u as loadReviewStatuses, y as setReviewStatusSync } from "./review-status-BcfwcAcO.js";
7
+ import { _ as init_queue_position, a as EventStoreService, g as findPositionInQueueSync, h as computeQueuePositionFromStatusSync, s as init_domain_services } from "./issue-lifecycle-BoJa6qIt.js";
8
+ import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CaiG63FG.js";
9
+ import { Mn as getAgentState, Rt as transitionIssueToInReview, U as spawnAgent, Z as listRunningAgents, gr as getAgentRuntimeStateSync, j as messageAgent, t as init_agents, vr as saveAgentRuntimeState } from "./agents-DqQa4Dq_.js";
10
+ import { f as CostWriter, l as CostDoorLive } from "./service-C8jKYZ0w.js";
11
+ import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-C1Y_2CIo.js";
12
+ import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-lph9C3Pw.js";
13
+ import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-BeXjPLKy.js";
14
14
  import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-CE1m_daD.js";
15
- import { o as init_merge_sync, r as getAllActiveQueues } from "./merge-sync-DHWbGtjR.js";
16
- import { A as findVBriefByIssue, N as readVBriefDocument, b as init_types$1, c as mergeRecordStatusOverrides, j as init_vbrief_index, o as init_io, r as findPlan, s as isPlanningComplete, u as readPlan, y as VBRIEF_INSPECTION_POLICIES } from "./io-A7ZuOBkz.js";
17
- import { f as init_config, m as loadConfigSync$1 } from "./config-8sjaU6jZ.js";
18
- import { it as findConversationForCostSessionSync, k as init_conversations } from "./conversations-DfJKBDwB.js";
19
- import { a as init_stack_health, i as getWorkspaceStackHealth, n as collectDockerContainerLifecycleSnapshot } from "./stack-health-Qd7rPiVe.js";
20
- import { o as criticalPath, t as actionableDoc, u as init_dag } from "./dag-Dv2r5bVD.js";
21
- import { a as queryBeadsForIssue, r as init_beads_query } from "./beads-query-e6oku4P5.js";
22
- import { a as readEventsFromLineSync, i as init_events, l as init_wal, o as readEventsSync, r as getLastEventMetadataSync, t as appendCostEventSync } from "./events-BfiosVAn.js";
23
- import { n as getContainersReferencingWorkspacePath, r as init_workspace_manager } from "./workspace-manager-BJhW2sky.js";
24
- import { r as init_devcontainer_renderer, t as DEVCONTAINER_DIRNAME } from "./devcontainer-renderer-CaYOG9JN.js";
25
- import { at as init_jsonl_parser, nt as getActiveSessionModelSync } from "./specialists-DjHbwQ_p.js";
15
+ import { o as init_merge_sync, r as getAllActiveQueues } from "./merge-sync-C2B322Ot.js";
16
+ import { A as findVBriefByIssue, N as readVBriefDocument, b as init_types$1, c as mergeRecordStatusOverrides, j as init_vbrief_index, o as init_io, r as findPlan, s as isPlanningComplete, u as readPlan, y as VBRIEF_INSPECTION_POLICIES } from "./io-CbAFXQge.js";
17
+ import { f as init_config, m as loadConfigSync$1 } from "./config-DsCxzjXK.js";
18
+ import { it as findConversationForCostSessionSync, k as init_conversations } from "./conversations-BSOU5qnu.js";
19
+ import { a as init_stack_health, i as getWorkspaceStackHealth, n as collectDockerContainerLifecycleSnapshot } from "./stack-health-C-le5erA.js";
20
+ import { o as criticalPath, t as actionableDoc, u as init_dag } from "./dag-BQFtXOuJ.js";
21
+ import { a as queryBeadsForIssue, r as init_beads_query } from "./beads-query-tOsAYP5h.js";
22
+ import { a as readEventsFromLineSync, i as init_events, l as init_wal, o as readEventsSync, r as getLastEventMetadataSync, t as appendCostEventSync } from "./events-BFDuPV6n.js";
23
+ import { n as getContainersReferencingWorkspacePath, r as init_workspace_manager } from "./workspace-manager-D6NgGkiF.js";
24
+ import { r as init_devcontainer_renderer, t as DEVCONTAINER_DIRNAME } from "./devcontainer-renderer-Dx0C7VWJ.js";
25
+ import { at as init_jsonl_parser, nt as getActiveSessionModelSync } from "./specialists-BGNZ0_ZW.js";
26
26
  import { n as restoreTrackedBeadsExport, t as init_beads_restore } from "./beads-restore-CMbDSB5R.js";
27
- import { i as findWorkspacePath, o as init_archive_planning } from "./archive-planning-oX1pj6nY.js";
28
- import { T as verifyAppCanMerge, f as init_github_app, m as isIntegrationPermissionError } from "./github-app-BecAnXRX.js";
29
- import { a as loadWorkspaceMetadataSync, i as listWorkspaceMetadataSync } from "./workspace-metadata-QQmo_Z0l.js";
30
- import { n as enrichReviewStatusFromSessions } from "./review-status-enrichment-qWvWckYN.js";
31
- import { n as generateDailySummary, r as init_cli } from "./cli-B75AieAM.js";
32
- import { a as getDiffStat, i as getDiffBase, o as init_review_context, r as getChangedFiles } from "./review-context-CErbQpKL.js";
33
- import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-C_1frSDj.js";
34
- import { C as init_git_activity, S as init_operations, a as init_merge_agent, b as MainDivergedError, w as listGitOperationsSync, x as gitPush, y as syncMainIntoWorkspace } from "./merge-agent-CHHs5S_0.js";
35
- import { F as enqueueMerge, I as getAllActiveQueues$1, L as getCurrentMerge, P as dequeueMerge, z as markMergeProcessing } from "./merge-ZrXFM3jv.js";
36
- import { i as init_conflict_gate, r as getCachedConflictGateMergeability } from "./conflict-gate-BtB_o-Vi.js";
37
- import { n as runVerificationForIssue } from "./verification-runner-CntudBes.js";
38
- import { t as teardownWorkspace } from "./teardown-workspace-CWz1pbEK.js";
39
- import { n as init_rebuild_stack, t as composeProjectNameForWorkspace } from "./rebuild-stack-KHkkrGjx.js";
27
+ import { i as findWorkspacePath, o as init_archive_planning } from "./archive-planning-CPitEZo4.js";
28
+ import { T as verifyAppCanMerge, f as init_github_app, m as isIntegrationPermissionError } from "./github-app-DhycHVLF.js";
29
+ import { a as loadWorkspaceMetadataSync, i as listWorkspaceMetadataSync } from "./workspace-metadata-C8yn8kAH.js";
30
+ import { n as enrichReviewStatusFromSessions } from "./review-status-enrichment-Cp5kFTGl.js";
31
+ import { n as generateDailySummary, r as init_cli } from "./cli-s7bPWy-E.js";
32
+ import { a as getDiffStat, i as getDiffBase, o as init_review_context, r as getChangedFiles } from "./review-context-CXO5ml5D.js";
33
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-CaSUXd9r.js";
34
+ import { C as init_operations, S as gitPush, T as listGitOperationsSync, a as init_merge_agent, w as init_git_activity, x as MainDivergedError, y as syncMainIntoWorkspace } from "./merge-agent-DNFFsiEm.js";
35
+ import { F as enqueueMerge, I as getAllActiveQueues$1, L as getCurrentMerge, P as dequeueMerge, z as markMergeProcessing } from "./merge-B7Oi-g6k.js";
36
+ import { n as init_release_set, t as getReleaseSetSync } from "./release-set-DwvT_Opu.js";
37
+ import { i as init_conflict_gate, r as getCachedConflictGateMergeability } from "./conflict-gate-D47Kl78u.js";
38
+ import { n as runVerificationForIssue } from "./verification-runner-DO0nYTJx.js";
39
+ import { t as teardownWorkspace } from "./teardown-workspace-CpcjDrZ4.js";
40
+ import { n as init_rebuild_stack, t as composeProjectNameForWorkspace } from "./rebuild-stack-BZ7j27xY.js";
40
41
  import { basename, dirname, join, resolve, sep } from "node:path";
41
42
  import { Effect, Layer, Option } from "effect";
42
43
  import { closeSync, existsSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, readdirSync, renameSync, writeFileSync } from "fs";
@@ -973,7 +974,7 @@ const postWorkspaceContainerActionRoute = HttpRouter.add("POST", "/api/workspace
973
974
  }
974
975
  if (!workspacePath) return jsonResponse({ error: `Workspace not found for ${issueId}` }, { status: 404 });
975
976
  if (!composeFile && ["start", "restart"].includes(action)) {
976
- const { ensureDevcontainerSync } = yield* Effect.promise(() => import("./ensure-devcontainer-CbSXvN9W.js"));
977
+ const { ensureDevcontainerSync } = yield* Effect.promise(() => import("./ensure-devcontainer-BIShzs3M.js"));
977
978
  if (ensureDevcontainerSync({
978
979
  workspacePath,
979
980
  issueId
@@ -2593,7 +2594,7 @@ async function reconcileGitHubMergeStatus(issueId, status) {
2593
2594
  const prRef = parseGitHubPullRequestUrl(status.prUrl);
2594
2595
  if (!prRef) return false;
2595
2596
  try {
2596
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-C7lftMNj.js");
2597
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-DIr70YLg.js");
2597
2598
  if (!isGitHubAppConfigured()) return false;
2598
2599
  const prState = await Effect.runPromise(getPullRequestState(prRef.owner, prRef.repo, prRef.number));
2599
2600
  console.log(`[merge] reconcileGitHubMergeStatus: ${issueId} PR #${prRef.number} merged=${prState.merged} state=${prState.state}`);
@@ -2871,8 +2872,8 @@ async function triggerMerge(issueId) {
2871
2872
  try {
2872
2873
  if (workspaceInfo.isRemote && workspaceInfo.vmName) {
2873
2874
  console.log(`[merge] Remote workspace detected for ${issueId}, using review artifact merge...`);
2874
- const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-D-iXNP0I.js");
2875
- const { getForgeAdapter } = await import("./forge-IgLR0Ist.js");
2875
+ const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-DOsBTBQc.js");
2876
+ const { getForgeAdapter } = await import("./forge-CUCYK7h_.js");
2876
2877
  const remotePrimaryRepo = (getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId))?.repos[0];
2877
2878
  const remoteTargetBranch = remotePrimaryRepo?.targetBranch || "main";
2878
2879
  const remoteForge = remotePrimaryRepo?.forge || "github";
@@ -2907,7 +2908,7 @@ async function triggerMerge(issueId) {
2907
2908
  readyForMerge: false
2908
2909
  });
2909
2910
  completePendingOperation(issueId, null);
2910
- const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
2911
+ const { postMergeLifecycle } = await import("./merge-agent-Bwm34MZ5.js");
2911
2912
  await postMergeLifecycle(issueId, projectPath);
2912
2913
  return {
2913
2914
  success: true,
@@ -2944,10 +2945,10 @@ async function triggerMerge(issueId) {
2944
2945
  const projectConfig = findProjectByTeamSync(issuePrefix);
2945
2946
  if (projectConfig?.workspace?.type === "polyrepo" && projectConfig?.workspace?.repos) {
2946
2947
  console.log(`[merge] Polyrepo detected for ${issueId}, coordinating merge set...`);
2947
- const { getMergeSetSync, ensureMergeSetForIssueSync, upsertMergeSetSync, withRepoStateSync } = await import("./merge-set-D-iXNP0I.js");
2948
- const { runQualityGates } = await import("./validation-B0QaLIHP.js");
2949
- const { getForgeAdapter } = await import("./forge-IgLR0Ist.js");
2950
- const { messageAgent } = await import("./agents-C4kZ8a2r.js");
2948
+ const { getMergeSetSync, ensureMergeSetForIssueSync, upsertMergeSetSync, withRepoStateSync } = await import("./merge-set-DOsBTBQc.js");
2949
+ const { runQualityGates } = await import("./validation-COOXwNXU.js");
2950
+ const { getForgeAdapter } = await import("./forge-CUCYK7h_.js");
2951
+ const { messageAgent } = await import("./agents-CxbuBjID.js");
2951
2952
  let mergeSet = getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId);
2952
2953
  if (!mergeSet) {
2953
2954
  const error = `No merge set found for ${issueId}`;
@@ -3217,7 +3218,7 @@ async function triggerMerge(issueId) {
3217
3218
  readyForMerge: false
3218
3219
  });
3219
3220
  completePendingOperation(issueId, null);
3220
- const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
3221
+ const { postMergeLifecycle } = await import("./merge-agent-Bwm34MZ5.js");
3221
3222
  advanceQueue();
3222
3223
  await postMergeLifecycle(issueId, projectPath);
3223
3224
  return {
@@ -3228,8 +3229,8 @@ async function triggerMerge(issueId) {
3228
3229
  repos: mergeResults
3229
3230
  };
3230
3231
  }
3231
- const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-D-iXNP0I.js");
3232
- const { getForgeAdapter } = await import("./forge-IgLR0Ist.js");
3232
+ const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-DOsBTBQc.js");
3233
+ const { getForgeAdapter } = await import("./forge-CUCYK7h_.js");
3233
3234
  const primaryRepo = (getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId))?.repos[0];
3234
3235
  const targetBranch = primaryRepo?.targetBranch || "main";
3235
3236
  const primaryForge = primaryRepo?.forge || "github";
@@ -3271,7 +3272,7 @@ async function triggerMerge(issueId) {
3271
3272
  };
3272
3273
  }
3273
3274
  if (githubPrRef) try {
3274
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-C7lftMNj.js");
3275
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-DIr70YLg.js");
3275
3276
  if (isGitHubAppConfigured()) {
3276
3277
  const prState = await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number));
3277
3278
  if (prState.state !== "OPEN" && !prState.merged) {
@@ -3332,7 +3333,7 @@ async function triggerMerge(issueId) {
3332
3333
  readyForMerge: false
3333
3334
  });
3334
3335
  completePendingOperation(issueId, null);
3335
- const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
3336
+ const { postMergeLifecycle } = await import("./merge-agent-Bwm34MZ5.js");
3336
3337
  await postMergeLifecycle(issueId, projectPath, branchName);
3337
3338
  return {
3338
3339
  success: true,
@@ -3346,13 +3347,13 @@ async function triggerMerge(issueId) {
3346
3347
  } catch (prStateErr) {
3347
3348
  console.warn(`[merge] Pre-merge PR state check failed for ${issueId}: ${prStateErr.message} — proceeding (check is best-effort)`);
3348
3349
  }
3349
- const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
3350
+ const { postMergeLifecycle } = await import("./merge-agent-Bwm34MZ5.js");
3350
3351
  const agentId = `agent-${issueId.toLowerCase()}`;
3351
3352
  const rebaseMsg = `MERGE REQUESTED: The human has clicked MERGE for ${issueId}. Please rebase onto ${targetBranch} and push:\n\n1. git fetch origin ${targetBranch}\n2. git rebase origin/${targetBranch}\n3. If conflicts: resolve them, git add, git rebase --continue\n4. git push --force-with-lease\n\nAfter pushing, the server will handle verification and merge automatically. Do NOT run gh pr merge yourself.`;
3352
3353
  setReviewStatus(issueId, { mergeStep: "rebasing" });
3353
3354
  console.log(`[merge] Rebasing ${branchName} onto ${targetBranch} for ${issueId} (agent=${await Effect.runPromise(sessionExists(agentId)) ? "running" : "stopped"})...`);
3354
3355
  {
3355
- const { beginShipLog, appendShipLog } = await import("./ship-log-CMWH3H5-.js");
3356
+ const { beginShipLog, appendShipLog } = await import("./ship-log-CDVmOlZP.js");
3356
3357
  beginShipLog(issueId);
3357
3358
  appendShipLog(issueId, `Ship started: rebasing ${branchName} onto ${targetBranch}…`, "rebasing");
3358
3359
  }
@@ -3480,7 +3481,7 @@ async function triggerMerge(issueId) {
3480
3481
  });
3481
3482
  let skipLocalVerification = false;
3482
3483
  if (primaryForge === "github" && artifactUrl) try {
3483
- const { parsePullRequestRef, getCiCheckRunsStatePromise, isGitHubAppConfigured } = await import("./github-app-C7lftMNj.js");
3484
+ const { parsePullRequestRef, getCiCheckRunsStatePromise, isGitHubAppConfigured } = await import("./github-app-DIr70YLg.js");
3484
3485
  if (isGitHubAppConfigured()) {
3485
3486
  const ref = parsePullRequestRef({ url: artifactUrl });
3486
3487
  if (ref) {
@@ -3501,12 +3502,12 @@ async function triggerMerge(issueId) {
3501
3502
  } catch (ciErr) {
3502
3503
  console.warn(`[merge] CI-state check failed (${ciErr.message?.slice(0, 120)}) — falling back to local verification for ${issueId}`);
3503
3504
  }
3504
- const { appendShipLog } = await import("./ship-log-CMWH3H5-.js");
3505
+ const { appendShipLog } = await import("./ship-log-CDVmOlZP.js");
3505
3506
  if (skipLocalVerification) appendShipLog(issueId, "✓ Local verification skipped — CI already green on this exact commit", "verifying");
3506
3507
  const verifyResult = skipLocalVerification ? { outcome: "passed" } : await (async () => {
3507
3508
  console.log(`[merge] Running post-rebase verification for ${issueId}...`);
3508
3509
  appendShipLog(issueId, "Running post-rebase verification (full quality-gate suite)…", "verifying");
3509
- const { runVerificationForIssue } = await import("./verification-runner-DdleMNLq.js");
3510
+ const { runVerificationForIssue } = await import("./verification-runner-Dd1FX8Qk.js");
3510
3511
  return Effect.runPromise(runVerificationForIssue(issueId, workspacePath, { isRemote: false }, "merge-verify", {
3511
3512
  syncTargetBranch: false,
3512
3513
  onGateLog: (line) => appendShipLog(issueId, line, "verifying")
@@ -3539,7 +3540,7 @@ async function triggerMerge(issueId) {
3539
3540
  console.log(`[merge] Post-rebase verification ${verifyResult.outcome} for ${issueId}`);
3540
3541
  setReviewStatus(issueId, { mergeStep: "reporting-statuses" });
3541
3542
  try {
3542
- const { getPullRequestState, isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-C7lftMNj.js");
3543
+ const { getPullRequestState, isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-DIr70YLg.js");
3543
3544
  if (githubPrRef && isGitHubAppConfigured()) {
3544
3545
  const sha = (await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number))).headSha.trim();
3545
3546
  if (sha) {
@@ -3567,7 +3568,7 @@ async function triggerMerge(issueId) {
3567
3568
  } catch (prMergeErr) {
3568
3569
  console.error(`[merge] Review artifact merge threw for ${issueId}:`, prMergeErr);
3569
3570
  try {
3570
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-C7lftMNj.js");
3571
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-DIr70YLg.js");
3571
3572
  if (githubPrRef && isGitHubAppConfigured()) {
3572
3573
  artifactMerged = (await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number))).merged;
3573
3574
  if (artifactMerged) console.log(`[merge] Race-detected: PR #${githubPrRef.number} for ${issueId} was already merged despite thrown error; proceeding`);
@@ -3684,8 +3685,8 @@ const postForgeApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge
3684
3685
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
3685
3686
  if (!/^[A-Z]+-\d+$/i.test(issueId)) return jsonResponse({ error: "Invalid issue ID format" }, { status: 400 });
3686
3687
  return yield* Effect.promise(async () => {
3687
- const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-D-iXNP0I.js");
3688
- const { getForgeAdapter } = await import("./forge-IgLR0Ist.js");
3688
+ const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-DOsBTBQc.js");
3689
+ const { getForgeAdapter } = await import("./forge-CUCYK7h_.js");
3689
3690
  let mergeSet = getMergeSetSync(issueId);
3690
3691
  if (!mergeSet) return jsonResponse({ error: `No merge set found for ${issueId}` }, { status: 404 });
3691
3692
  const results = [];
@@ -3773,8 +3774,8 @@ const postForgeMergeRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge-m
3773
3774
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
3774
3775
  if (!/^[A-Z]+-\d+$/i.test(issueId)) return jsonResponse({ error: "Invalid issue ID format" }, { status: 400 });
3775
3776
  return yield* Effect.promise(async () => {
3776
- const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-D-iXNP0I.js");
3777
- const { getForgeAdapter } = await import("./forge-IgLR0Ist.js");
3777
+ const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-DOsBTBQc.js");
3778
+ const { getForgeAdapter } = await import("./forge-CUCYK7h_.js");
3778
3779
  let mergeSet = getMergeSetSync(issueId);
3779
3780
  if (!mergeSet) return jsonResponse({ error: `No merge set found for ${issueId}` }, { status: 404 });
3780
3781
  const results = [];
@@ -3967,7 +3968,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
3967
3968
  console.log(`[approve] Starting role pipeline for ${issueId}...`);
3968
3969
  let reviewResult;
3969
3970
  try {
3970
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
3971
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Bf9XjLnl.js");
3971
3972
  reviewResult = await Effect.runPromise(spawnReviewRoleForIssue({
3972
3973
  issueId,
3973
3974
  workspace: workspacePath,
@@ -4014,7 +4015,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
4014
4015
  }
4015
4016
  console.log(`[approve] Step 3/3: Running server-side rebase for ${issueId}...`);
4016
4017
  try {
4017
- const { rebaseFeatureBranch } = await import("./merge-rebase-R7MfqpiE.js");
4018
+ const { rebaseFeatureBranch } = await import("./merge-rebase-C8WH39MB.js");
4018
4019
  const workspacePathForRebase = join(projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
4019
4020
  const rebaseResult = await Effect.runPromise(rebaseFeatureBranch(workspacePathForRebase, branchName, "main", issueId));
4020
4021
  if (!rebaseResult.success) {
@@ -4034,7 +4035,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
4034
4035
  completePendingOperation(issueId, pushResult.error);
4035
4036
  return jsonResponse({ error: pushResult.error }, { status: pushResult.httpStatus });
4036
4037
  }
4037
- const { approve: lifecycleApprove } = await import("./lifecycle-f1GbDK33.js");
4038
+ const { approve: lifecycleApprove } = await import("./lifecycle-B8IdvUbt.js");
4038
4039
  const ghResolved = resolveGitHubIssueSync(issueId);
4039
4040
  const isGitHubIssueFlag = ghResolved.isGitHub;
4040
4041
  const lifecycleCtx = {
@@ -4068,7 +4069,7 @@ const getMergeQueueRoute = HttpRouter.add("GET", "/api/merge-queue", httpHandler
4068
4069
  })));
4069
4070
  const postInternalPipelineNotifyRoute = HttpRouter.add("POST", "/api/internal/pipeline/notify", httpHandler(Effect.gen(function* () {
4070
4071
  const request = yield* HttpServerRequest.HttpServerRequest;
4071
- const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-nobT6FhA.js"));
4072
+ const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-C90jBp-y.js"));
4072
4073
  const expected = getInternalTokenSync();
4073
4074
  if (!expected) return jsonResponse({
4074
4075
  ok: false,
@@ -4082,7 +4083,7 @@ const postInternalPipelineNotifyRoute = HttpRouter.add("POST", "/api/internal/pi
4082
4083
  }, 403);
4083
4084
  const event = yield* readJsonBody;
4084
4085
  const type = event.type;
4085
- const { notifyPipelineSync } = yield* Effect.promise(() => import("./pipeline-notifier-BtYHbBPl.js"));
4086
+ const { notifyPipelineSync } = yield* Effect.promise(() => import("./pipeline-notifier-nkWCe042.js"));
4086
4087
  switch (type) {
4087
4088
  case "status_changed": {
4088
4089
  const issueId = event.issueId;
@@ -4857,7 +4858,7 @@ const patchWorkspaceTieredExecutionRoute = HttpRouter.add("PATCH", "/api/workspa
4857
4858
  if (override !== "on" && override !== "off" && override !== null && override !== void 0) return jsonResponse({ error: "Invalid tiered-execution override" }, { status: 400 });
4858
4859
  const project = getProjectSync(extractPrefixSync(issueId) ?? issueId.split("-")[0]);
4859
4860
  if (!project) return jsonResponse({ error: "Project not found" }, { status: 404 });
4860
- yield* Effect.promise(() => import("./record-De2syxNB.js").then((m) => m.writeRecordTieredExecutionOverride(project, issueId, override)));
4861
+ yield* Effect.promise(() => import("./record-CJsjvRO4.js").then((m) => m.writeRecordTieredExecutionOverride(project, issueId, override)));
4861
4862
  const projectPath = project.path;
4862
4863
  const location = yield* resolvePlanLocation(projectPath, issueId);
4863
4864
  if (!location) return jsonResponse({ error: "No vBRIEF plan found for this workspace" }, { status: 404 });
@@ -5153,6 +5154,9 @@ const stashCleanRouteLayer = Layer.mergeAll(getWorkspaceStashesRoute, postWorksp
5153
5154
  * POST /api/review/:issueId/trigger
5154
5155
  * POST /api/review/:issueId/request
5155
5156
  *
5157
+ * Release read endpoint:
5158
+ * GET /api/workspaces/:issueId/release
5159
+ *
5156
5160
  * The cancel/control routes (reset, purge, abort, pending, unstick,
5157
5161
  * deacon-ignore, auto-merge) live in review-control.ts. Shared singletons
5158
5162
  * (review-status wrapper, pending-ops cluster, project path, readJsonBody,
@@ -5163,6 +5167,7 @@ init_projects();
5163
5167
  init_state_plane();
5164
5168
  init_domain_services();
5165
5169
  init_review_status();
5170
+ init_release_set();
5166
5171
  init_conflict_gate();
5167
5172
  init_beads_restore();
5168
5173
  init_agents();
@@ -5290,7 +5295,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
5290
5295
  console.log(`Feature branch push note: ${errorMessage(pushErr)}`);
5291
5296
  }
5292
5297
  try {
5293
- const { createReviewArtifactsForIssue } = await import("./review-artifacts-C7a45b1_.js");
5298
+ const { createReviewArtifactsForIssue } = await import("./review-artifacts-D0_IE6DQ.js");
5294
5299
  const artifactResult = await Effect.runPromise(createReviewArtifactsForIssue(issueId, workspacePath));
5295
5300
  const primaryArtifact = artifactResult.mergeSet?.repos.find((repo) => !!repo.artifactUrl);
5296
5301
  artifactResult.mergeSet?.repos.find((repo) => repo.mergeStatus !== "skipped")?.targetBranch;
@@ -5345,7 +5350,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
5345
5350
  } catch {}
5346
5351
  return;
5347
5352
  }
5348
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
5353
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Bf9XjLnl.js");
5349
5354
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
5350
5355
  const reviewResult = await Effect.runPromise(spawnReviewRoleForIssue({
5351
5356
  issueId,
@@ -5485,7 +5490,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
5485
5490
  console.log(`[request-review] Feature branch push note: ${errorMessage(pushErr)}`);
5486
5491
  }
5487
5492
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
5488
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
5493
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Bf9XjLnl.js");
5489
5494
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
5490
5495
  issueId,
5491
5496
  workspace: workspacePathRerun,
@@ -5535,7 +5540,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
5535
5540
  });
5536
5541
  } else {
5537
5542
  const workspacePath = join(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
5538
- const { spawnRun } = yield* Effect.promise(() => import("./agents-C4kZ8a2r.js"));
5543
+ const { spawnRun } = yield* Effect.promise(() => import("./agents-CxbuBjID.js"));
5539
5544
  try {
5540
5545
  const testRun = yield* Effect.promise(() => spawnRun(issueId, "test", { workspace: workspacePath }));
5541
5546
  setReviewStatus(issueId, { testStatus: "testing" });
@@ -5624,7 +5629,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
5624
5629
  autoRequeueCount: newCount
5625
5630
  }, { status: 500 });
5626
5631
  const result = yield* Effect.promise(async () => {
5627
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
5632
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Bf9XjLnl.js");
5628
5633
  return await Effect.runPromise(spawnReviewRoleForIssue({
5629
5634
  issueId,
5630
5635
  workspace: workspacePath,
@@ -5688,7 +5693,14 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
5688
5693
  }, { status: 500 });
5689
5694
  }
5690
5695
  })));
5691
- const reviewPipelineRouteLayer = Layer.mergeAll(postWorkspaceReviewRoute, postWorkspaceRequestReviewRoute);
5696
+ const getReleaseSetRoute = HttpRouter.add("GET", "/api/workspaces/:issueId/release", httpHandler(Effect.gen(function* () {
5697
+ const rawIssueId = (yield* HttpRouter.params)["issueId"] ?? "";
5698
+ if (!parseIssueIdSync(rawIssueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
5699
+ const releaseSet = getReleaseSetSync(resolveIssueIdSync(rawIssueId));
5700
+ if (!releaseSet) return jsonResponse({ error: "Release set not found" }, { status: 404 });
5701
+ return jsonResponse(releaseSet);
5702
+ })));
5703
+ const reviewPipelineRouteLayer = Layer.mergeAll(postWorkspaceReviewRoute, postWorkspaceRequestReviewRoute, getReleaseSetRoute);
5692
5704
  //#endregion
5693
5705
  //#region routes/workspaces/review-control.ts
5694
5706
  /**
@@ -5921,7 +5933,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
5921
5933
  const result = processResetReviewPipeline(issueId, resetWorkspace.exists);
5922
5934
  if (result.httpStatus !== 200) return jsonResponse(result.body, { status: result.httpStatus });
5923
5935
  try {
5924
- const { resetPostMergeState } = yield* Effect.promise(() => import("./merge-agent-CfohxFWM.js"));
5936
+ const { resetPostMergeState } = yield* Effect.promise(() => import("./merge-agent-Bwm34MZ5.js"));
5925
5937
  resetPostMergeState(issueId);
5926
5938
  } catch (err) {
5927
5939
  console.warn(`[reset-review] resetPostMergeState best-effort failed for ${issueId}:`, err);
@@ -5930,7 +5942,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
5930
5942
  const rerun = body?.rerun === true;
5931
5943
  if (rerun) try {
5932
5944
  yield* Effect.promise(async () => {
5933
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
5945
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Bf9XjLnl.js");
5934
5946
  const dispatchArgs = buildReviewRedispatchArgs(issueId, resetWorkspace, workspaceInfo, resolved);
5935
5947
  if (dispatchArgs) {
5936
5948
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
@@ -5959,7 +5971,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
5959
5971
  const postWorkspaceReviewPurgeRoute = HttpRouter.add("POST", "/api/review/:issueId/purge", httpHandler(Effect.gen(function* () {
5960
5972
  const issueId = (yield* HttpRouter.params)["issueId"] ?? "";
5961
5973
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
5962
- const { purgeReviewAgentsForIssue } = yield* Effect.promise(() => import("./review-agent-uwVftH98.js"));
5974
+ const { purgeReviewAgentsForIssue } = yield* Effect.promise(() => import("./review-agent-Bf9XjLnl.js"));
5963
5975
  const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
5964
5976
  const purge = yield* Effect.promise(() => purgeReviewAgentsForIssue(projectKey, issueId));
5965
5977
  const workspaceInfo = getWorkspaceInfoForIssue(issueId);
@@ -5989,8 +6001,8 @@ const postWorkspaceAbortReviewRoute = HttpRouter.add("POST", "/api/review/:issue
5989
6001
  success: false,
5990
6002
  error: "Workspace does not exist"
5991
6003
  }, { status: 400 });
5992
- const { resolveProjectFromIssueSync } = yield* Effect.promise(() => import("./projects-Bqfwuqet.js"));
5993
- const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-uwVftH98.js"));
6004
+ const { resolveProjectFromIssueSync } = yield* Effect.promise(() => import("./projects-BqRMlDOv.js"));
6005
+ const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-Bf9XjLnl.js"));
5994
6006
  const { killed, failed } = yield* killAllReviewerSessions(resolveProjectFromIssueSync(issueId)?.projectKey, issueId);
5995
6007
  setReviewStatus(issueId, {
5996
6008
  reviewStatus: "pending",
@@ -6062,8 +6074,8 @@ const getReviewConfigRoute = HttpRouter.add("GET", "/api/review/:issueId/config"
6062
6074
  const issueId = ((yield* HttpRouter.params)["issueId"] ?? "").toUpperCase();
6063
6075
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
6064
6076
  return jsonResponse(yield* Effect.promise(async () => {
6065
- const { readIssueRecordSync, resolveProjectForIssue } = await import("./record-De2syxNB.js");
6066
- const { resolveReviewMode, resolveReReviewScope } = await import("./review-agent-uwVftH98.js");
6077
+ const { readIssueRecordSync, resolveProjectForIssue } = await import("./record-CJsjvRO4.js");
6078
+ const { resolveReviewMode, resolveReReviewScope } = await import("./review-agent-Bf9XjLnl.js");
6067
6079
  const project = resolveProjectForIssue(issueId);
6068
6080
  const record = project ? readIssueRecordSync(project, issueId) : null;
6069
6081
  return {
@@ -6089,8 +6101,8 @@ const postReviewConfigRoute = HttpRouter.add("POST", "/api/review/:issueId/confi
6089
6101
  if (hasMode && body.reviewMode !== null && body.reviewMode !== "quick" && body.reviewMode !== "full" && body.reviewMode !== "none") return jsonResponse({ error: "reviewMode must be quick, full, none, or null" }, { status: 400 });
6090
6102
  if (hasScope && body.reReviewScope !== null && body.reReviewScope !== "all" && body.reReviewScope !== "changed" && body.reReviewScope !== "blockers") return jsonResponse({ error: "reReviewScope must be all, changed, blockers, or null" }, { status: 400 });
6091
6103
  return jsonResponse(yield* Effect.promise(async () => {
6092
- const { ensureIssueRecordSync, readIssueRecordSync, resolveProjectForIssue, writeIssueRecordSync } = await import("./record-De2syxNB.js");
6093
- const { resolveReviewMode, resolveReReviewScope } = await import("./review-agent-uwVftH98.js");
6104
+ const { ensureIssueRecordSync, readIssueRecordSync, resolveProjectForIssue, writeIssueRecordSync } = await import("./record-CJsjvRO4.js");
6105
+ const { resolveReviewMode, resolveReReviewScope } = await import("./review-agent-Bf9XjLnl.js");
6094
6106
  const project = resolveProjectForIssue(issueId);
6095
6107
  const record = readIssueRecordSync(project, issueId) ?? ensureIssueRecordSync(project, issueId);
6096
6108
  if (hasMode) if (body.reviewMode === null) delete record.reviewMode;
@@ -6484,7 +6496,7 @@ async function readWorkspacePlanningMarkdown(issueId, fileName) {
6484
6496
  */
6485
6497
  async function readWorkspaceContinueFile(_projectPath, workspacePath, issueId) {
6486
6498
  try {
6487
- const { readRecordContinueViewSync, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-De2syxNB.js");
6499
+ const { readRecordContinueViewSync, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-CJsjvRO4.js");
6488
6500
  const recordView = readRecordContinueViewSync(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId);
6489
6501
  return recordView ? JSON.stringify(recordView, null, 2) : null;
6490
6502
  } catch {
@@ -7253,7 +7265,7 @@ const getWorkspaceReviewStatusRoute = HttpRouter.add("GET", "/api/review/:issueI
7253
7265
  if (queuePosition === null) try {
7254
7266
  const resolved = resolveProjectFromIssueSync(issueId);
7255
7267
  if (resolved) {
7256
- const { getQueueForProject } = yield* Effect.promise(() => import("./merge-DRMPa8CQ.js"));
7268
+ const { getQueueForProject } = yield* Effect.promise(() => import("./merge-BRkVaIx-.js"));
7257
7269
  const mergePos = findPositionInQueueSync(issueId, getQueueForProject(resolved.projectKey).map((e) => ({
7258
7270
  id: String(e.id),
7259
7271
  type: "task",
@@ -7291,7 +7303,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7291
7303
  const workspaceInfo = getWorkspaceInfoForIssue(issueId);
7292
7304
  if (workspaceInfo.exists && workspaceInfo.localPath) {
7293
7305
  const localPath = workspaceInfo.localPath;
7294
- const { getWorkspaceGitInfo } = yield* Effect.promise(() => import("./git-utils-DbfC0zls.js"));
7306
+ const { getWorkspaceGitInfo } = yield* Effect.promise(() => import("./git-utils-Ym380hJZ.js"));
7295
7307
  try {
7296
7308
  const gitInfo = yield* getWorkspaceGitInfo(localPath);
7297
7309
  if (gitInfo.HEAD) update.reviewedAtCommit = gitInfo.HEAD;
@@ -7306,7 +7318,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7306
7318
  if (verificationStatus) update.verificationStatus = verificationStatus;
7307
7319
  if (readyForMerge !== void 0) update.readyForMerge = readyForMerge;
7308
7320
  const status = setReviewStatus(issueId, update);
7309
- const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DdvpFNt1.js"));
7321
+ const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-Chvvwf5z.js"));
7310
7322
  const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
7311
7323
  if (reviewStatus && [
7312
7324
  "passed",
@@ -7324,7 +7336,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7324
7336
  const agentId = `agent-${issueId.toLowerCase()}`;
7325
7337
  const feedbackBody = `CODE REVIEW ${reviewStatus.toUpperCase()} for ${issueId}:\n\n${reviewNotes}\n\n## REQUIRED: Fix ALL issues above, then invoke the /rebase-and-submit skill\n\n1. Read each blocking issue carefully\n2. Fix the code for EVERY issue listed\n3. Run tests locally to verify your fixes\n4. Commit every change\n5. Invoke the /rebase-and-submit skill for ${issueId} — this is an atomic task that runs pan done (which handles rebase + push + re-submit internally)\n\nDo NOT stop between steps. Do NOT run git push manually — the skill handles it. Do NOT stop until pan done has completed successfully.`;
7326
7338
  try {
7327
- const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-DMBdS_jL.js"));
7339
+ const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-DCyd75yJ.js"));
7328
7340
  const wsInfo = getWorkspaceInfoForIssue(issueId);
7329
7341
  const fileResult = yield* Effect.promise(() => writeFeedbackFile({
7330
7342
  issueId,
@@ -7388,7 +7400,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7388
7400
  const agentId = `agent-${issueId.toLowerCase()}`;
7389
7401
  const feedbackBody = `TESTS FAILED for ${issueId}:\n\n${testNotes}\n\n## REQUIRED: Fix ALL test failures, then invoke the /rebase-and-submit skill\n\n1. Read each test failure carefully\n2. Fix the code causing EVERY failure\n3. Run the test suite locally to verify your fixes pass\n4. Commit every change\n5. Invoke the /rebase-and-submit skill for ${issueId} — this is an atomic task that runs pan done (which handles rebase + push + re-submit internally)\n\nDo NOT stop between steps. Do NOT run git push manually — the skill handles it. Do NOT stop until pan done has completed successfully.`;
7390
7402
  try {
7391
- const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-DMBdS_jL.js"));
7403
+ const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-DCyd75yJ.js"));
7392
7404
  const wsInfo = getWorkspaceInfoForIssue(issueId);
7393
7405
  const fileResult = yield* Effect.promise(() => writeFeedbackFile({
7394
7406
  issueId,
@@ -7413,14 +7425,14 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7413
7425
  console.log(`[review-status] ${issueId} marked ready for merge after test=passed`);
7414
7426
  yield* Effect.promise(async () => {
7415
7427
  try {
7416
- const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-Bqfwuqet.js");
7428
+ const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-BqRMlDOv.js");
7417
7429
  const project = resolveProjectFromIssueSync(issueId);
7418
7430
  const repo = (project ? getProjectSync(project.projectKey) : null)?.github_repo;
7419
7431
  if (!repo || !repo.includes("/")) return;
7420
7432
  const [owner, name] = repo.split("/");
7421
7433
  const wsInfo = getWorkspaceInfoForIssue(issueId);
7422
7434
  if (!wsInfo?.localPath) return;
7423
- const { postOverdeckTestsStatus } = await import("./github-app-C7lftMNj.js");
7435
+ const { postOverdeckTestsStatus } = await import("./github-app-DIr70YLg.js");
7424
7436
  await postOverdeckTestsStatus(wsInfo.localPath, owner, name, "success", "Test specialist passed");
7425
7437
  } catch (err) {
7426
7438
  console.warn(`[review-status] Failed to post overdeck/tests for ${issueId}: ${err.message}`);
@@ -7462,7 +7474,7 @@ const postWorkspaceRefreshTokenRoute = HttpRouter.add("POST", "/api/workspaces/:
7462
7474
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
7463
7475
  const issueLower = issueId.toLowerCase();
7464
7476
  const workspacePath = join(getProjectPath(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`);
7465
- const { refreshWorkspaceToken, isGitHubAppConfigured } = yield* Effect.promise(() => import("./github-app-C7lftMNj.js"));
7477
+ const { refreshWorkspaceToken, isGitHubAppConfigured } = yield* Effect.promise(() => import("./github-app-DIr70YLg.js"));
7466
7478
  if (!isGitHubAppConfigured()) return jsonResponse({
7467
7479
  success: false,
7468
7480
  error: "GitHub App not configured"
@@ -7477,4 +7489,4 @@ const workspacesRouteLayer = Layer.mergeAll(workspaceDataRouteLayer, postWorkspa
7477
7489
  //#endregion
7478
7490
  export { hasDashboardInternalToken as C, getWorkspacePathForIssue as D, rejectUnsafeDashboardMutationRequest as E, dashboardSessionCookieHeader as S, rejectUnauthorizedDashboardSessionMintRequest as T, syncCacheSync as _, pushApproveMain as a, resolveIssueHeadlineCost as b, triggerMerge as c, reconcile as d, reconcilePiTranscripts as f, rebuildCacheSync as g, getCostsForIssueSync as h, mergeOpsRouteLayer as i, resumeQueuedMerges as l, migrateAllSessionsSync as m, buildRichPRBody as n, reconcileGitHubMergeStatus as o, reclassifyUnknownCostEventsSync as p, isBranchAlreadyRebased as r, shouldBlockApproveForDirtyStatus as s, workspacesRouteLayer as t, syncWalFromAllProjects as u, processPendingFeedbackDeliveries as v, rejectUnauthorizedDashboardRequest as w, dashboardCsrfToken as x, getCachedRunningAgents as y };
7479
7491
 
7480
- //# sourceMappingURL=workspaces-Ca4zZs12.js.map
7492
+ //# sourceMappingURL=workspaces-DOeHyKmA.js.map
@@ -0,0 +1,87 @@
1
+ #!/bin/bash
2
+ # ~/.overdeck/bin/ask-user-question-hook (PAN-1520)
3
+ #
4
+ # PreToolUse hook on AskUserQuestion — denies the tool call to prevent the
5
+ # upstream Claude Code silent-corruption bug (anthropics/claude-code#10229,
6
+ # #10400) where AskUserQuestion's choice menu does not render under
7
+ # --dangerously-skip-permissions and the harness returns option #1's literal
8
+ # label as the tool_result, fabricating an operator answer that never happened.
9
+ #
10
+ # Until the dashboard surfaces AskUserQuestion options interactively (the rest
11
+ # of PAN-1520), the only safe failure mode is "block until the agent re-asks
12
+ # in plain prose". This hook converts silent corruption -> visible block by
13
+ # returning a deny verdict with the full question text + option labels as
14
+ # additionalContext, so the agent restates the choice to the operator as
15
+ # regular text and waits for a normal response.
16
+ #
17
+ # Never breaks Claude Code: on any error the hook exits 0 silently (which
18
+ # lets the original AskUserQuestion call through — preserving the prior
19
+ # behaviour rather than introducing a new hang).
20
+
21
+ set +e
22
+
23
+ INPUT=$(cat 2>/dev/null || echo '{}')
24
+
25
+ if ! command -v jq >/dev/null 2>&1; then
26
+ # Without jq we cannot safely parse the question payload. Allow the call.
27
+ exit 0
28
+ fi
29
+
30
+ TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
31
+ if [ "$TOOL_NAME" != "AskUserQuestion" ]; then
32
+ exit 0
33
+ fi
34
+
35
+ # Emit an awareness event to the dashboard via the standard hook lib so the
36
+ # operator can see the question was asked, even though the tool call is denied.
37
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
38
+ # shellcheck source=pan-hook-lib.sh
39
+ . "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || true
40
+ if declare -f pan_resolve_agent_id >/dev/null && pan_resolve_agent_id; then
41
+ TS=$(date -Iseconds)
42
+ EVENT_BODY=$(echo "$INPUT" | jq --arg ts "$TS" '{
43
+ kind: "ask_user_question_blocked",
44
+ timestamp: $ts,
45
+ questions: (.tool_input.questions // [])
46
+ }' 2>/dev/null)
47
+ if [ -n "$EVENT_BODY" ] && declare -f pan_emit_event >/dev/null; then
48
+ pan_emit_event "$AGENT_ID" "$EVENT_BODY" 2>/dev/null || true
49
+ fi
50
+ fi
51
+
52
+ REASON='Your question has been surfaced to the operator in the Overdeck dashboard, where they answer it directly. Restate the question and its options to the operator as a short plain-text message and wait for their reply (it arrives as a normal user message).'
53
+
54
+ CONTEXT=$(echo "$INPUT" | jq -r '
55
+ def fmt_option:
56
+ " - " + (.label // "(no label)")
57
+ + (if .description then ": " + .description else "" end);
58
+ def fmt_question:
59
+ "Question: " + (.question // "(no question text)")
60
+ + (if .header then "\nHeader: " + .header else "" end)
61
+ + "\nOptions:\n" + ((.options // []) | map(fmt_option) | join("\n"));
62
+ (.tool_input.questions // [])
63
+ | map(fmt_question)
64
+ | join("\n\n")
65
+ ' 2>/dev/null)
66
+
67
+ if [ -z "$CONTEXT" ]; then
68
+ CONTEXT="(failed to parse questions payload — restate your question to the operator as plain text)"
69
+ fi
70
+
71
+ INSTRUCTION="Restate the following to the operator as a plain-text message, listing the options as a numbered list, and wait for their normal response. Do not call AskUserQuestion again."
72
+
73
+ jq -n \
74
+ --arg reason "$REASON" \
75
+ --arg context "${INSTRUCTION}
76
+
77
+ ${CONTEXT}" \
78
+ '{
79
+ hookSpecificOutput: {
80
+ hookEventName: "PreToolUse",
81
+ permissionDecision: "deny",
82
+ permissionDecisionReason: $reason,
83
+ additionalContext: $context
84
+ }
85
+ }'
86
+
87
+ exit 0