@overdeck/desktop 0.45.12 → 0.45.15

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 (355) 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-DHZk2ceV.js} +2 -2
  4. package/server/{advancing-selfheal-BqsLWqEM.js → advancing-selfheal-CSuZ31bB.js} +5 -5
  5. package/server/{agent-gc-CUb52n7s.js → agent-gc-D_DxfBHR.js} +3 -3
  6. package/server/{agent-state-D-moNwhA.js → agent-state-EP2QFV9n.js} +1 -1
  7. package/server/{agent-state-service-BzESvLOf.js → agent-state-service-BZkvgQf4.js} +5 -5
  8. package/server/{agent-state-service-BaZH7sXJ.js → agent-state-service-C_2ZAQRP.js} +1 -1
  9. package/server/{agents-B5LfpLPv.js → agents-CsOzAmRg.js} +145 -78
  10. package/server/{agents-C4kZ8a2r.js → agents-DCvyTXNU.js} +1 -1
  11. package/server/{archive-planning-BbZe-8IK.js → archive-planning-CTILQRnV.js} +1 -1
  12. package/server/{archive-planning-oX1pj6nY.js → archive-planning-DkivCk1A.js} +4 -4
  13. package/server/{artifact-index-jobs-DGr6bxev.js → artifact-index-jobs-CmsvQ1ey.js} +2 -2
  14. package/server/auto-commit-QAfsu3Sb.js +3 -0
  15. package/server/{backlog-auto-trigger-BlJHikOm.js → backlog-auto-trigger-ueRaT8Dy.js} +2 -2
  16. package/server/{bd-process-lock-i3CYMS-B.js → bd-process-lock-D3S4T4o-.js} +32 -11
  17. package/server/{beads-DD7fYCl5.js → beads-BGGxrkZ5.js} +96 -196
  18. package/server/{beads-BNU-fb48.js → beads-CYsLiyIM.js} +1 -1
  19. package/server/{beads-query-e6oku4P5.js → beads-query-B1DlJVp9.js} +24 -99
  20. package/server/beads-restore-CyygSmmn.js +23 -0
  21. package/server/{behavior-CPf0pbOt.js → behavior-Cpj03N4v.js} +3 -3
  22. package/server/{briefing-freshness-B2FdLwIv.js → briefing-freshness-Kh5V8RTh.js} +4 -4
  23. package/server/{checkpoint-manager-eFgaMMu4.js → checkpoint-manager-CAFos8e1.js} +1 -1
  24. package/server/{checkpoint-manager-JryW6MpM.js → checkpoint-manager-fu9oVsR-.js} +2 -2
  25. package/server/checkpoint-worker.js +1 -1
  26. package/server/{checkpoints-qvOqvMuC.js → checkpoints-1BqOlS4q.js} +2 -2
  27. package/server/{checkpoints-BK17oicz.js → checkpoints-DvhGi8P_.js} +1 -1
  28. package/server/claude-hooks-provision-s_wdpeVj.js +360 -0
  29. package/server/{claude-permissions-B6bWGh9d.js → claude-permissions-CaWqysff.js} +2 -2
  30. package/server/{claude-settings-overlay-BPdhTPjo.js → claude-settings-overlay-BbA4FbVI.js} +1 -1
  31. package/server/{claude-settings-overlay-CRyyKKXQ.js → claude-settings-overlay-CcTf0xzG.js} +2 -2
  32. package/server/{cli-B75AieAM.js → cli-BwCvCUBK.js} +9 -9
  33. package/server/cli-ClIQwgMI.js +3 -0
  34. package/server/{cliproxy-CCzwuSNe.js → cliproxy-BsoNNDAj.js} +2 -2
  35. package/server/{cliproxy-DOQf66G9.js → cliproxy-C2xC-3vH.js} +1 -1
  36. package/server/{close-issue-_X3MXJyG.js → close-issue-BleIwP3f.js} +5 -5
  37. package/server/{closed-issue-reaper-CLR7ClsO.js → closed-issue-reaper-BwUUvjEW.js} +1 -1
  38. package/server/{closed-issue-reaper-BsUfBSjM.js → closed-issue-reaper-mC5pujeb.js} +102 -30
  39. package/server/{codex-CY-QRuU9.js → codex-B7DTpwEw.js} +1 -1
  40. package/server/{codex-B4KEpX5V.js → codex-DW60_5j2.js} +5 -5
  41. package/server/{compact-beads-cZds2MTr.js → compact-beads-CK_hHEnB.js} +1 -1
  42. package/server/{compact-beads-uEDccC76.js → compact-beads-DKL54y6j.js} +15 -8
  43. package/server/{config-DARrpYWA.js → config-BRNQJXhA.js} +1 -1
  44. package/server/{config-8sjaU6jZ.js → config-ZNnMpIlh.js} +2 -2
  45. package/server/{config-yaml-ClpGgrf6.js → config-yaml-Dcz-8uit.js} +29 -3
  46. package/server/{conflict-gate-Ds9_2yjd.js → conflict-gate-DGT8jCLp.js} +1 -1
  47. package/server/{conflict-gate-BtB_o-Vi.js → conflict-gate-DTje2Ll7.js} +3 -3
  48. package/server/{context-layers-r2ywnQYA.js → context-layers-BdUCQ-cl.js} +3 -3
  49. package/server/{context-layers-CRCk1QG7.js → context-layers-ByOWUjUg.js} +2 -2
  50. package/server/{control-settings-D1B3u6HP.js → control-settings-DwkAeooY.js} +4 -4
  51. package/server/{conversation-compaction-D86Zo2Ci.js → conversation-compaction-OTYgd6eg.js} +8 -8
  52. package/server/{conversation-compaction-CZRVk4hg.js → conversation-compaction-WYQZUVDm.js} +1 -1
  53. package/server/{conversation-service-CuTVU8dV.js → conversation-service-BR1OgvxO.js} +5 -5
  54. package/server/{conversation-service-CkL-6MuG.js → conversation-service-C_kNZPLx.js} +1 -1
  55. package/server/{conversations-DfJKBDwB.js → conversations-DG2M8WnT.js} +4 -4
  56. package/server/{conversations-BmWEluPL.js → conversations-izHvSoAR.js} +1 -1
  57. package/server/{cost-DAPYN6iA.js → cost-B2mj17iG.js} +3 -3
  58. package/server/{cost-CCnqa5xK.js → cost-DQ2ajr_m.js} +2 -2
  59. package/server/{cost-sync-BDL10Nwu.js → cost-sync-gTayEuWP.js} +3 -3
  60. package/server/{dag-Dv2r5bVD.js → dag-CqTehWpY.js} +3 -3
  61. package/server/{dangerous-git-ops-Dcw7PbYo.js → dangerous-git-ops-DDWQlPC3.js} +1 -1
  62. package/server/dashboard-db-worker.js +6 -6
  63. package/server/{deacon-DYnZH7kC.js → deacon-BqW9HMew.js} +3 -3
  64. package/server/{deacon-CM0MxbS8.js → deacon-DrKDBeJL.js} +161 -1594
  65. package/server/{deacon-nudge-log-B-naf89q.js → deacon-nudge-log-D1wEK6zF.js} +1 -1
  66. package/server/deacon-swarm-BY5hKNaU.js +2 -0
  67. package/server/{deacon-swarm-BstYoz8Q.js → deacon-swarm-CO_A7xyd.js} +12 -105
  68. package/server/deacon.js +7 -7
  69. package/server/{devcontainer-renderer-CaYOG9JN.js → devcontainer-renderer-BQolp_qZ.js} +3 -3
  70. package/server/{dist-BIC8spJ0.js → dist-Bc32rWJB.js} +1 -1
  71. package/server/dist-DGTwcZhI.js +3 -0
  72. package/server/{docker-DDI1shu3.js → docker-s-esqZ__.js} +67 -28
  73. package/server/{ensure-devcontainer-DCAg3ksz.js → ensure-devcontainer-DA4-jF6R.js} +4 -4
  74. package/server/{ensure-devcontainer-CbSXvN9W.js → ensure-devcontainer-pUVaT0h3.js} +1 -1
  75. package/server/{esm-shims-DiV9jHa_.js → esm-shims-CJHy8CZY.js} +1 -1
  76. package/server/{event-store-DU3HkZlN.js → event-store-CcJAhKCl.js} +1 -1
  77. package/server/{event-store-DCMqyI07.js → event-store-DRte2Rwt.js} +3 -3
  78. package/server/{events-BfiosVAn.js → events-Bej1w_k8.js} +3 -3
  79. package/server/{events-DLRxpSuV.js → events-CtsLScn8.js} +1 -1
  80. package/server/export-Dx_qJ3h8.js +87 -0
  81. package/server/{factory-BMtWV9iv.js → factory-FN727tWr.js} +4 -4
  82. package/server/{feature-registry-population-DA7bO6Zn.js → feature-registry-population-ie-yBcQC.js} +4 -4
  83. package/server/{feature-registry-storage-nAY1fbBt.js → feature-registry-storage-CkZTFSsn.js} +2 -2
  84. package/server/{features-DMu7eGmU.js → features-Dtm9ABuz.js} +2 -2
  85. package/server/{feedback-target-DHqcw3cN.js → feedback-target-BYtpyt1i.js} +6 -6
  86. package/server/{feedback-target-B2SEai8-.js → feedback-target-DVJQDiE4.js} +1 -1
  87. package/server/{feedback-writer-DMBdS_jL.js → feedback-writer-DOUhyIW2.js} +1 -1
  88. package/server/{feedback-writer-qvm7UON7.js → feedback-writer-fdE1BzeL.js} +4 -4
  89. package/server/{flywheel-k4FPtCQ_.js → flywheel-Bi82iiNl.js} +1 -1
  90. package/server/{flywheel-Dfpx4bIV.js → flywheel-Bv3wv2S6.js} +23 -15
  91. package/server/{flywheel-D2LdPSic.js → flywheel-CUErLAyN.js} +13 -13
  92. package/server/{flywheel-merge-order-CB4lbXeJ.js → flywheel-merge-order-BaEN3iyN.js} +7 -7
  93. package/server/{flywheel-merge-order-CttTazRY.js → flywheel-merge-order-DXjeBnJ1.js} +1 -1
  94. package/server/{forge-CoPFXFyl.js → forge-ButEdJ31.js} +2 -2
  95. package/server/forge-XlDgPQWs.js +2 -0
  96. package/server/{from-B0YoJl9-.js → from-CbtTxftl.js} +1 -1
  97. package/server/{fts-db-DAHW1yA_.js → fts-db-CBgBLZcL.js} +2 -2
  98. package/server/{fts-operations-DDXDBi0d.js → fts-operations-CI9Xuo_1.js} +2 -2
  99. package/server/{git-utils-DbfC0zls.js → git-utils-BCLRWQ-y.js} +1 -1
  100. package/server/{git-utils-B90Zjzfl.js → git-utils-ClfpP47N.js} +2 -2
  101. package/server/{github-app-C7lftMNj.js → github-app-DRD2woO0.js} +1 -1
  102. package/server/{github-app-BecAnXRX.js → github-app-DscZ0_B6.js} +2 -2
  103. package/server/{github-client-D21rCIXk.js → github-client-DpiZnxGH.js} +2 -2
  104. package/server/{github-client-BwtKZtM0.js → github-client-iFRw8f7e.js} +1 -1
  105. package/server/{github-pr-lookup-CzVWuysl.js → github-pr-lookup-D-EBexxC.js} +2 -2
  106. package/server/{harness-resolve-SkRJm4a7.js → harness-resolve-iMjyNUJ2.js} +3 -3
  107. package/server/{health-events-DA_JLpgZ.js → health-events-B_WsQyYm.js} +1 -1
  108. package/server/{health-events-BT0aAfeA.js → health-events-CRdxDFN2.js} +2 -2
  109. package/server/{hooks-BQxRXtRb.js → hooks-C1ScyVxP.js} +1 -1
  110. package/server/{hooks-DxEn2BoY.js → hooks-C9b7Vqpw.js} +2 -2
  111. package/server/hume-K1pi8jC4.js +3 -0
  112. package/server/{hume-DkVOs1Qi.js → hume-TQ5pvOZ_.js} +2 -2
  113. package/server/{idle-stack-reaper-DGy7tvC9.js → idle-stack-reaper-B1kG7B_X.js} +2 -2
  114. package/server/{idle-stack-reaper-C7fJL8jH.js → idle-stack-reaper-iFVOAoJy.js} +1 -1
  115. package/server/{infra-DE3C4PMr.js → infra-bpq1MHKU.js} +50 -3
  116. package/server/{injection-Dt22tGvS.js → injection-BLWfwTVZ.js} +1 -1
  117. package/server/{injection-Cc4Qt8LZ.js → injection-DJqWld1v.js} +7 -7
  118. package/server/inspect-agent-477VxQim.js +2 -0
  119. package/server/{inspect-agent-DOaCDkCF.js → inspect-agent-DytCsltn.js} +9 -9
  120. package/server/{internal-token-nobT6FhA.js → internal-token-CCaWaTwE.js} +1 -1
  121. package/server/{internal-token-B_1YLWLI.js → internal-token-CjlhdufS.js} +2 -2
  122. package/server/{io-A7ZuOBkz.js → io-BiQ2Cs3k.js} +2 -2
  123. package/server/{issue-closed-Da3DeomA.js → issue-closed-FApNiOOs.js} +4 -4
  124. package/server/{issue-lifecycle-Bd9XBJAQ.js → issue-lifecycle-BkFWNjlD.js} +1 -1
  125. package/server/{issue-lifecycle-543pQX9D.js → issue-lifecycle-C-K53ASY.js} +21 -21
  126. package/server/{issue-service-singleton-Brc3t0SV.js → issue-service-singleton-CuHGpJJP.js} +8 -8
  127. package/server/{issue-service-singleton-BC2JLZi7.js → issue-service-singleton-bG1WdSdQ.js} +1 -1
  128. package/server/{issues-D3kt9UWE.js → issues-CwQMphDH.js} +2 -2
  129. package/server/jsonl-parser-dNIjHgym.js +245 -0
  130. package/server/{label-cleanup-w9X_T3AQ.js → label-cleanup-DYvAZknd.js} +3 -3
  131. package/server/{layers-Cwe1J-9o.js → layers-CD6FysRU.js} +2 -2
  132. package/server/{lifecycle-f1GbDK33.js → lifecycle-C_73gi-C.js} +7 -7
  133. package/server/{lifecycle-io-D56q8zlO.js → lifecycle-io-C_Wu0_i-.js} +1 -1
  134. package/server/{lifecycle-io-Bqvj0m3i.js → lifecycle-io-CeYxP3cE.js} +4 -4
  135. package/server/{linear-client-Bh4T4S-c.js → linear-client-4qoKnuQu.js} +1 -1
  136. package/server/{linear-client-CfJMTAYd.js → linear-client-EtVyblVz.js} +2 -2
  137. package/server/memory-fts-worker.js +1 -1
  138. package/server/{merge-ZrXFM3jv.js → merge-7rqkTUm2.js} +3 -3
  139. package/server/merge-agent-36wfYm2u.js +3 -0
  140. package/server/{merge-agent-CHHs5S_0.js → merge-agent-4Zhlgvqp.js} +62 -27
  141. package/server/{merge-batch-BwhGdlh4.js → merge-batch-itfnwdsT.js} +1 -1
  142. package/server/{merge-blockers-BMhDpMl_.js → merge-blockers-Bto_Oe_o.js} +2 -2
  143. package/server/{merge-DRMPa8CQ.js → merge-brm721Es.js} +1 -1
  144. package/server/merge-ops-PzqsW69V.js +2 -0
  145. package/server/{merge-rebase-R7MfqpiE.js → merge-rebase-Czfqfe4q.js} +2 -2
  146. package/server/{merge-set-B3Breacq.js → merge-set-BIkGQL9j.js} +9 -5
  147. package/server/{merge-set-D-iXNP0I.js → merge-set-G1RHcu3D.js} +1 -1
  148. package/server/{merge-sync-DHWbGtjR.js → merge-sync-B43Dybea.js} +2 -2
  149. package/server/{merge-sync-bOOtfeXR.js → merge-sync-DIrmlZUr.js} +1 -1
  150. package/server/{merge-train-98ptZrPT.js → merge-train-DGqVuNZV.js} +3 -3
  151. package/server/{merge-train-deps-B5FWJTE2.js → merge-train-deps-q15XLnAS.js} +4 -4
  152. package/server/{merge-verification-BGiuiXAK.js → merge-verification-Cqfxx6bE.js} +4 -4
  153. package/server/{multipart-parser-D7mzNNDm.js → multipart-parser-CiPxxfUH.js} +2 -2
  154. package/server/node_modules/.package-lock.json +1 -1
  155. package/server/{orphan-proposed-reconciler-BSGCNJ6X.js → orphan-proposed-reconciler-BWWHn4Lr.js} +15 -39
  156. package/server/{orphan-proposed-reconciler-CSuxivr9.js → orphan-proposed-reconciler-DAD9FJtQ.js} +1 -1
  157. package/server/package-lock.json +2 -2
  158. package/server/package.json +1 -1
  159. package/server/{pan-dir-DoPtdHrp.js → pan-dir-Bj7Hy8iu.js} +3 -3
  160. package/server/{paths-CVDLPxXp.js → paths-C9DkhIOT.js} +2 -2
  161. package/server/{pickup-KLRUhThD.js → pickup-CKRuGDsB.js} +1 -1
  162. package/server/{pipeline-notifier-BtYHbBPl.js → pipeline-notifier-BkKbQ8ji.js} +1 -1
  163. package/server/{pipeline-notifier-WD2dnOsR.js → pipeline-notifier-CAurUste.js} +2 -2
  164. package/server/project-pipelines-BRWaGmI4.js +162 -0
  165. package/server/projects-KJ94e50I.js +3 -0
  166. package/server/{prompts-Cg7e9FPb.js → prompts-DfI5qbTW.js} +2 -2
  167. package/server/{providers-fLduChnX.js → providers-CWDXoaMA.js} +7 -7
  168. package/server/providers-D-5txBRc.js +3 -0
  169. package/server/public/assets/{chunk-BO2N2NFS-aNlsGDCu.js → chunk-BO2N2NFS-ClukPsZQ.js} +4 -4
  170. package/server/public/assets/{diagram-OG6HWLK6-CnjkrvT8.js → diagram-OG6HWLK6-Avtvq2qI.js} +1 -1
  171. package/server/public/assets/{dist-Bg3Sbsx4.js → dist-BEHQuasD.js} +3 -3
  172. package/server/public/assets/{dist-CGKBCieA.js → dist-BvmY-qb1.js} +1 -1
  173. package/server/public/assets/{ganttDiagram-6RSMTGT7-C8LLKj23.js → ganttDiagram-6RSMTGT7-7KhCd0fH.js} +1 -1
  174. package/server/public/assets/{highlighted-body-OFNGDK62-BSDEUvhW.js → highlighted-body-OFNGDK62-iQoBMTf0.js} +1 -1
  175. package/server/public/assets/index-DUFDmvmH.css +1 -0
  176. package/server/public/assets/index-DnTZ2QeN.js +796 -0
  177. package/server/public/assets/{linear-DEbYZoxg.js → linear-CiJHW9g5.js} +1 -1
  178. package/server/public/assets/mermaid-GHXKKRXX-DZJOwgBG.js +1 -0
  179. package/server/public/assets/{pieDiagram-4H26LBE5-BtZL5pXE.js → pieDiagram-4H26LBE5-BOhmvUhW.js} +1 -1
  180. package/server/public/assets/{prod-DYVvIyuh.js → prod-DmLBBqat.js} +4 -4
  181. package/server/public/assets/{quadrantDiagram-W4KKPZXB-a7vS8Jc8.js → quadrantDiagram-W4KKPZXB-Cjku660G.js} +1 -1
  182. package/server/public/assets/{sankeyDiagram-5OEKKPKP-Ckbq2SWH.js → sankeyDiagram-5OEKKPKP-D52w5oPh.js} +1 -1
  183. package/server/public/assets/{xychartDiagram-2RQKCTM6-DJyeNa99.js → xychartDiagram-2RQKCTM6-BTO07_Iv.js} +1 -1
  184. package/server/public/index.html +2 -2
  185. package/server/{pull-requests-1WXmTBlo.js → pull-requests-Bmre-Xlz.js} +3 -3
  186. package/server/{pull-requests-D2SjJIwY.js → pull-requests-CKZPWhjD.js} +1 -1
  187. package/server/{rally-8aQlLLVj.js → rally-BBd9tQ__.js} +3 -3
  188. package/server/rally-Dc2Wnxw2.js +3 -0
  189. package/server/{rally-api-BtvwdX6d.js → rally-api-DDc85HIz.js} +1 -1
  190. package/server/{rally-api-H5I2CBO0.js → rally-api-DxZFObI_.js} +2 -2
  191. package/server/{rally-client-Bt-qHiOh.js → rally-client-BADHn0m_.js} +1 -1
  192. package/server/{rally-client-33CYZYYu.js → rally-client-DvvLiAQP.js} +4 -4
  193. package/server/{reap-terminal-sessions-CAmURC2h.js → reap-terminal-sessions-D6JDJsqF.js} +1 -1
  194. package/server/{reap-terminal-sessions-BwJb2DLJ.js → reap-terminal-sessions-D_xvy-Mk.js} +1 -1
  195. package/server/{rebuild-stack-KHkkrGjx.js → rebuild-stack-D19i080j.js} +6 -6
  196. package/server/{rebuild-stack-CXSgAGPR.js → rebuild-stack-GOsWqXi3.js} +1 -1
  197. package/server/{reconstruct-cache-D_Ml65_6.js → reconstruct-cache-lQrG4xGg.js} +6 -6
  198. package/server/record-pyB6VA32.js +3 -0
  199. package/server/recovery-trip-Dfh1tNHn.js +98 -0
  200. package/server/release-engine-DxcMWRuK.js +306 -0
  201. package/server/release-set-BYsgX7o6.js +125 -0
  202. package/server/{remote-CGuognN3.js → remote-8W2Yhygw.js} +3 -3
  203. package/server/{remote-D0Old0Cv.js → remote-DmeL21dF.js} +3 -3
  204. package/server/{remote-agents-DfhMq6kQ.js → remote-agents-BfQBE6MN.js} +5 -5
  205. package/server/{remote-agents-UHoi4oGr.js → remote-agents-DlvbzO7m.js} +1 -1
  206. package/server/{remote-completion-RZYePR_0.js → remote-completion-BgkiSQmx.js} +12 -12
  207. package/server/resolver-dTpSSzaH.js +158 -0
  208. package/server/resume-DhcIqsTm.js +3 -0
  209. package/server/{review-agent-sZBCpEVv.js → review-agent-D025Wt7w.js} +22 -22
  210. package/server/{review-agent-uwVftH98.js → review-agent-Rub0OpZc.js} +1 -1
  211. package/server/{review-artifacts-C7a45b1_.js → review-artifacts-CX951jTU.js} +6 -6
  212. package/server/{review-context-CErbQpKL.js → review-context-DGGGR_w5.js} +7 -7
  213. package/server/{review-monitor-DHD9m_kh.js → review-monitor-0_qqMcnS.js} +2 -2
  214. package/server/{review-status-gPndPUBc.js → review-status-4qqLkRMu.js} +24 -17
  215. package/server/{review-status-JhQ3qlDS.js → review-status-Br6lAFGO.js} +1 -1
  216. package/server/{review-status-enrichment-qWvWckYN.js → review-status-enrichment-Cr8m3uVL.js} +3 -3
  217. package/server/{review-status-sync-B_GrEke8.js → review-status-sync-D3KUhsdA.js} +1 -1
  218. package/server/{review-status-sync-D3A9KX95.js → review-status-sync-OC-l1lNt.js} +9 -5
  219. package/server/{review-verdict-feedback-4WZ5ZdbC.js → review-verdict-feedback-DrWMuRaj.js} +6 -6
  220. package/server/{review-verdict-feedback-Zo0r_z4m.js → review-verdict-feedback-YOzmsq9G.js} +1 -1
  221. package/server/{rollup-BrUIKMv_.js → rollup-CnxbwaLH.js} +8 -8
  222. package/server/{rollup-Bmhn80tB.js → rollup-DmazRY0j.js} +1 -1
  223. package/server/{scanner-BIGumel_.js → scanner-DE1MqAaF.js} +7 -7
  224. package/server/{sequence-io-DA0akEQN.js → sequence-io-C0uoqfGx.js} +4 -4
  225. package/server/{sequencer-agent-DeflKafB.js → sequencer-agent-i-b2u4SJ.js} +10 -6
  226. package/server/server.js +1115 -297
  227. package/server/{service-V0sUK-OR.js → service-D0_gh2tl.js} +1668 -1408
  228. package/server/{session-fork-Yx3UcAQf.js → session-fork-DZ12vipL.js} +2 -2
  229. package/server/{settings-CFEeQRj2.js → settings-ByqjPtFO.js} +2 -2
  230. package/server/{settings-CxVate0h.js → settings-DCC4BAqj.js} +3 -3
  231. package/server/settings-yydgaqhv.js +2 -0
  232. package/server/{shadow-engineering-BRxnVSDk.js → shadow-engineering-BhnmtW5m.js} +2 -2
  233. package/server/{shadow-state-1aS8FijU.js → shadow-state-ByXZehsy.js} +1 -1
  234. package/server/{shadow-state-BiMwdyl1.js → shadow-state-CKm8xWX9.js} +2 -2
  235. package/server/{ship-log-CMWH3H5-.js → ship-log-DE_0Cv_i.js} +1 -1
  236. package/server/{smart-compaction-Bw1K_Sbl.js → smart-compaction-D5Zen3AA.js} +7 -7
  237. package/server/{smart-compaction-xblMyVpT.js → smart-compaction-h4_ca6Uk.js} +1 -1
  238. package/server/{spawn-planning-session-CzDFSKAQ.js → spawn-planning-session-Bgi7Ub02.js} +1 -1
  239. package/server/{spawn-planning-session-DxLxcM7m.js → spawn-planning-session-Dueit4WX.js} +15 -15
  240. package/server/{specialist-completion-BiEXUHfD.js → specialist-completion-BZ8M-WZ0.js} +1 -1
  241. package/server/{specialist-context-BfkTA81h.js → specialist-context-BMq83C58.js} +5 -5
  242. package/server/{specialist-handoff-logger-BiKuLtNm.js → specialist-handoff-logger-BxX1YefH.js} +2 -2
  243. package/server/{specialist-logs-CFJjGsLC.js → specialist-logs-BWZYcJ6P.js} +3 -3
  244. package/server/{specialists-DdvpFNt1.js → specialists-8ZAguXef.js} +1 -1
  245. package/server/{specialists-B4byf18k.js → specialists-BudKrjOu.js} +76 -76
  246. package/server/{specialists-DjHbwQ_p.js → specialists-DrPrC9Y9.js} +20 -256
  247. package/server/{specialists-BLIreoE7.js → specialists-ZkW4Mb7U.js} +1 -1
  248. package/server/specs-DwoAEGrW.js +3 -0
  249. package/server/{src-fgbU-jJ-.js → src-DHn4Rd2F.js} +25 -3
  250. package/server/{src-mK_M_ZIj.js → src-DNUUqkec.js} +6 -6
  251. package/server/{src-CALBEUMX.js → src-Dv6L03vW.js} +3 -3
  252. package/server/{stack-health-BFM8YlHw.js → stack-health-Dclm7_tu.js} +1 -1
  253. package/server/{stack-health-Qd7rPiVe.js → stack-health-DxsTx7II.js} +2 -2
  254. package/server/{state-home-C2Bicw9N.js → state-home-CRowbXqU.js} +6 -6
  255. package/server/stuck-remediation-CFWUP8_I.js +1491 -0
  256. package/server/stuck-remediation-CLHd-lrF.js +2 -0
  257. package/server/{summary-fork-EWWBvzgE.js → summary-fork-CKc01Our.js} +2 -2
  258. package/server/{summary-fork-DezPkJSm.js → summary-fork-CtCwBJ2Z.js} +8 -8
  259. package/server/{supervisor-D5GC5jUM.js → supervisor-BA5D72Qa.js} +2 -2
  260. package/server/supervisor-DHjumXlL.js +2 -0
  261. package/server/{swarm-readiness-Cf9mommA.js → swarm-readiness-CL5sM9B1.js} +3 -3
  262. package/server/{system-prerequisites-BsI9hxh9.js → system-prerequisites-DmFSXIE5.js} +13 -1
  263. package/server/{teardown-workspace-CWz1pbEK.js → teardown-workspace-DWmFJzTw.js} +37 -68
  264. package/server/{test-agent-queue-TiVXe3ZT.js → test-agent-queue-DjsQoV5X.js} +6 -6
  265. package/server/{test-verdict-CCDd25uN.js → test-verdict-BSqsQp3G.js} +1 -1
  266. package/server/{test-verdict-Bm4uv_AA.js → test-verdict-D1AmZ2c0.js} +1 -1
  267. package/server/{tldr-daemon-C_1frSDj.js → tldr-daemon-C-MGomL8.js} +2 -2
  268. package/server/{tldr-daemon-Big5IZ_M.js → tldr-daemon-DD9rI5gA.js} +1 -1
  269. package/server/{tmux-D57f-XNv.js → tmux-C_d-lSIq.js} +2 -2
  270. package/server/{tmux-DClqWwb8.js → tmux-x291Gjjb.js} +1 -1
  271. package/server/{token-_qujO3JZ.js → token-DfBf1bsd.js} +1 -1
  272. package/server/{tracker-config-BmdJU_w6.js → tracker-config-CNODpd11.js} +2 -2
  273. package/server/{tracker-config-B_Ubts1Z.js → tracker-config-DItsdelv.js} +1 -1
  274. package/server/{tracker-utils-Bg-Sevcv.js → tracker-utils-B9ZoVA9b.js} +1 -1
  275. package/server/{tracker-utils-CWFt6jjV.js → tracker-utils-Ch2_5GGf.js} +2 -2
  276. package/server/{traefik-connect-5EP1WS_Z.js → traefik-connect-BF4x_LUQ.js} +1 -1
  277. package/server/{tunnel-hOBNQbmF.js → tunnel-YD80_IHr.js} +1 -1
  278. package/server/{tunnel-UBf2vyAL.js → tunnel-r_5nHAI6.js} +3 -3
  279. package/server/{types-B5u3NxMl.js → types-33JEP4LZ.js} +1 -1
  280. package/server/{uat-train-DGkIkLxu.js → uat-train-DDI00aqD.js} +1 -1
  281. package/server/{uat-train-qNanv5hN.js → uat-train-DjkFWXge.js} +25 -25
  282. package/server/{validation-C4wegCvH.js → validation-DUTiJnyz.js} +4 -4
  283. package/server/{validation-B0QaLIHP.js → validation-ict8hnXk.js} +1 -1
  284. package/server/{verification-runner-DdleMNLq.js → verification-runner-ATaLbpr5.js} +1 -1
  285. package/server/{verification-runner-CntudBes.js → verification-runner-inLgeQux.js} +12 -12
  286. package/server/{vtt-parser-CKc-smWM.js → vtt-parser-QnRfcjiU.js} +1 -1
  287. package/server/{work-agent-prompt-CG5jFV9A.js → work-agent-prompt-fZljjA1_.js} +12 -12
  288. package/server/{workflows-BK2xs_a8.js → workflows-oBnJ7Tm0.js} +14 -14
  289. package/server/workflows-tU7KKxQi.js +2 -0
  290. package/server/{workspace-C9lC5o3E.js → workspace-B2WOW9Hw.js} +1 -1
  291. package/server/{workspace-CLrSIRCx.js → workspace-CNuW2j41.js} +3 -3
  292. package/server/{workspace-config-DA8U97k9.js → workspace-config-CBgMGhWs.js} +1 -1
  293. package/server/{workspace-manager-BJhW2sky.js → workspace-manager-CB-R07R3.js} +12 -12
  294. package/server/{workspace-manager-Cb2a7bg9.js → workspace-manager-DjUAJCSs.js} +1 -1
  295. package/server/{workspace-metadata-QQmo_Z0l.js → workspace-metadata-9Nn5kgRl.js} +2 -2
  296. package/server/{workspace-metadata-CTRnr323.js → workspace-metadata-Fd58uUQG.js} +1 -1
  297. package/server/{workspaces-Ca4zZs12.js → workspaces-BjWXntty.js} +106 -120
  298. package/server/writer-CQMGzEkw.js +3 -0
  299. package/server/writer-fe1-8iGc.js +251 -0
  300. package/sync-sources/hooks/ask-user-question-hook +87 -0
  301. package/sync-sources/hooks/auto-approve-hook +96 -0
  302. package/sync-sources/hooks/codex-notify-hook +62 -0
  303. package/sync-sources/hooks/gh-issue-trailer-hook +4 -0
  304. package/sync-sources/hooks/gh-issue-trailer-hook.d.ts +7 -0
  305. package/sync-sources/hooks/gh-issue-trailer-hook.d.ts.map +1 -0
  306. package/sync-sources/hooks/gh-issue-trailer-hook.js +239 -0
  307. package/sync-sources/hooks/gh-issue-trailer-hook.js.map +1 -0
  308. package/sync-sources/hooks/gh-issue-trailer-hook.ts +296 -0
  309. package/sync-sources/hooks/git-hooks/post-checkout +109 -0
  310. package/sync-sources/hooks/heartbeat-hook +113 -0
  311. package/sync-sources/hooks/notification-hook +70 -0
  312. package/sync-sources/hooks/notify-complete +79 -0
  313. package/sync-sources/hooks/pan-hook-lib.sh +153 -0
  314. package/sync-sources/hooks/permission-event-hook +24 -0
  315. package/sync-sources/hooks/post-compact-hook +25 -0
  316. package/sync-sources/hooks/pre-compact-hook +26 -0
  317. package/sync-sources/hooks/pre-tool-hook +35 -0
  318. package/sync-sources/hooks/record-cost-event.d.ts +1 -0
  319. package/sync-sources/hooks/record-cost-event.js +31859 -0
  320. package/sync-sources/hooks/record-cost-event.js.map +1 -0
  321. package/sync-sources/hooks/record-cost-event.ts +267 -0
  322. package/sync-sources/hooks/rtk-bash-filter +152 -0
  323. package/sync-sources/hooks/session-start-hook +80 -0
  324. package/sync-sources/hooks/specialist-stop-hook +106 -0
  325. package/sync-sources/hooks/statusline.sh +169 -0
  326. package/sync-sources/hooks/stop-hook +217 -0
  327. package/sync-sources/hooks/tldr-post-edit +72 -0
  328. package/sync-sources/hooks/tldr-read-enforcer +340 -0
  329. package/sync-sources/hooks/tmux-send-keys-guard +87 -0
  330. package/sync-sources/hooks/tsdown.config.ts +14 -0
  331. package/sync-sources/hooks/user-prompt-submit-hook +57 -0
  332. package/sync-sources/hooks/work-agent-stop-hook +424 -0
  333. package/server/auto-commit-CGQlb4rV.js +0 -3
  334. package/server/bd-mutex-BItGvLQ8.js +0 -35
  335. package/server/beads-restore-CMbDSB5R.js +0 -60
  336. package/server/cli-Ch_BWJB2.js +0 -3
  337. package/server/deacon-swarm-CSWGRfzr.js +0 -2
  338. package/server/dist-BUplB3Od.js +0 -3
  339. package/server/forge-IgLR0Ist.js +0 -2
  340. package/server/hume-x9voULey.js +0 -3
  341. package/server/inspect-agent-CYoWAeeB.js +0 -2
  342. package/server/merge-agent-CfohxFWM.js +0 -3
  343. package/server/merge-ops-Czke6UAp.js +0 -2
  344. package/server/projects-Bqfwuqet.js +0 -3
  345. package/server/providers-JjK6izqX.js +0 -3
  346. package/server/public/assets/index-CZiADHcL.css +0 -1
  347. package/server/public/assets/index-LQIfhmgI.js +0 -796
  348. package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +0 -1
  349. package/server/rally-Ba9QoNYc.js +0 -3
  350. package/server/record-De2syxNB.js +0 -3
  351. package/server/resume-CmxF3Kjz.js +0 -3
  352. package/server/settings-DEhYpW0k.js +0 -2
  353. package/server/specs-CVH1kvz3.js +0 -3
  354. package/server/supervisor-DQMK2e3I.js +0 -2
  355. 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 extractNumberSync, Cn as findProjectByTeamSync, Kn as resolveProjectFromIssueSync, Kr as getOverdeckHome, On as getProjectSync, Pn as init_projects, Rn as listProjectsSync, ar as resolveIssueIdSync, br as init_errors, dn as isStatePlaneOnlyStatus, dr as GitError, er as extractPrefixSync, qr as init_paths, rr as parseIssueIdSync, tr as init_issue_id, un as init_state_plane, ur as FsError, yn as extractTeamPrefix, zr as encodeClaudeProjectDir } from "./config-yaml-Dcz-8uit.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-BudKrjOu.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-bpq1MHKU.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-C_d-lSIq.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-4qqLkRMu.js";
7
+ import { _ as init_queue_position, a as EventStoreService, g as findPositionInQueueSync, h as computeQueuePositionFromStatusSync, s as init_domain_services } from "./issue-lifecycle-C-K53ASY.js";
8
+ import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-DQ2ajr_m.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-CsOzAmRg.js";
10
+ import { f as CostWriter, l as CostDoorLive } from "./service-D0_gh2tl.js";
11
+ import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-CNODpd11.js";
12
+ import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-Ch2_5GGf.js";
13
+ import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-CjlhdufS.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";
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";
15
+ import { o as init_merge_sync, r as getAllActiveQueues } from "./merge-sync-B43Dybea.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-BiQ2Cs3k.js";
17
+ import { f as init_config, m as loadConfigSync$1 } from "./config-ZNnMpIlh.js";
18
+ import { it as findConversationForCostSessionSync, k as init_conversations } from "./conversations-DG2M8WnT.js";
19
+ import { a as init_stack_health, i as getWorkspaceStackHealth, n as collectDockerContainerLifecycleSnapshot } from "./stack-health-DxsTx7II.js";
20
+ import { o as criticalPath, t as actionableDoc, u as init_dag } from "./dag-CqTehWpY.js";
21
+ import { a as queryBeadsForIssue, r as init_beads_query } from "./beads-query-B1DlJVp9.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-Bej1w_k8.js";
23
+ import { n as getContainersReferencingWorkspacePath, r as init_workspace_manager } from "./workspace-manager-CB-R07R3.js";
24
+ import { r as init_devcontainer_renderer, t as DEVCONTAINER_DIRNAME } from "./devcontainer-renderer-BQolp_qZ.js";
25
+ import { a as init_jsonl_parser, t as getActiveSessionModelSync } from "./jsonl-parser-dNIjHgym.js";
26
+ import { i as findWorkspacePath, o as init_archive_planning } from "./archive-planning-DkivCk1A.js";
27
+ import { T as verifyAppCanMerge, f as init_github_app, m as isIntegrationPermissionError } from "./github-app-DscZ0_B6.js";
28
+ import { a as loadWorkspaceMetadataSync, i as listWorkspaceMetadataSync } from "./workspace-metadata-9Nn5kgRl.js";
29
+ import { n as restoreTrackedBeadsExport, t as init_beads_restore } from "./beads-restore-CyygSmmn.js";
30
+ import { n as enrichReviewStatusFromSessions } from "./review-status-enrichment-Cr8m3uVL.js";
31
+ import { n as generateDailySummary, r as init_cli } from "./cli-BwCvCUBK.js";
32
+ import { a as getDiffStat, i as getDiffBase, o as init_review_context, r as getChangedFiles } from "./review-context-DGGGR_w5.js";
33
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-C-MGomL8.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-4Zhlgvqp.js";
35
+ import { F as enqueueMerge, I as getAllActiveQueues$1, L as getCurrentMerge, P as dequeueMerge, z as markMergeProcessing } from "./merge-7rqkTUm2.js";
36
+ import { n as init_release_set, t as getReleaseSetSync } from "./release-set-BYsgX7o6.js";
37
+ import { i as init_conflict_gate, r as getCachedConflictGateMergeability } from "./conflict-gate-DTje2Ll7.js";
38
+ import { n as runVerificationForIssue } from "./verification-runner-inLgeQux.js";
39
+ import { t as teardownWorkspace } from "./teardown-workspace-DWmFJzTw.js";
40
+ import { n as init_rebuild_stack, t as composeProjectNameForWorkspace } from "./rebuild-stack-D19i080j.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-pUVaT0h3.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-DRD2woO0.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}`);
@@ -2610,31 +2611,6 @@ async function reconcileGitHubMergeStatus(issueId, status) {
2610
2611
  return false;
2611
2612
  }
2612
2613
  }
2613
- async function readBeadsFromJsonl(workspacePath, issueId) {
2614
- try {
2615
- const jsonlPath = join(workspacePath, ".beads", "issues.jsonl");
2616
- if (!existsSync$1(jsonlPath)) return [];
2617
- const raw = await readFile(jsonlPath, "utf-8");
2618
- const issueLower = issueId.toLowerCase();
2619
- const beads = [];
2620
- for (const line of raw.split("\n")) {
2621
- if (!line.trim()) continue;
2622
- try {
2623
- const entry = JSON.parse(line);
2624
- const labels = Array.isArray(entry.labels) ? entry.labels : [];
2625
- if (labels.some((l) => l.toLowerCase() === issueLower)) beads.push({
2626
- id: String(entry.id ?? ""),
2627
- title: String(entry.title ?? ""),
2628
- status: String(entry.status ?? "open"),
2629
- labels
2630
- });
2631
- } catch {}
2632
- }
2633
- return beads;
2634
- } catch {
2635
- return [];
2636
- }
2637
- }
2638
2614
  /**
2639
2615
  * Build a rich PR body with issue link, beads task summary, and AC checklist
2640
2616
  * from the vBRIEF plan. Exported for testing.
@@ -2660,8 +2636,7 @@ async function buildRichPRBody(issueId, workspacePath) {
2660
2636
  }
2661
2637
  } catch {}
2662
2638
  try {
2663
- let beads = (await Effect.runPromise(queryBeadsForIssue(workspacePath, issueId, { acquisitionTimeoutMs: 500 }))).beads;
2664
- if (beads.length === 0) beads = await readBeadsFromJsonl(workspacePath, issueId);
2639
+ const beads = (await Effect.runPromise(queryBeadsForIssue(workspacePath, issueId, { acquisitionTimeoutMs: 500 }))).beads;
2665
2640
  if (beads.length > 0) {
2666
2641
  lines.push("## Implementation Tasks");
2667
2642
  lines.push("");
@@ -2871,8 +2846,8 @@ async function triggerMerge(issueId) {
2871
2846
  try {
2872
2847
  if (workspaceInfo.isRemote && workspaceInfo.vmName) {
2873
2848
  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");
2849
+ const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-G1RHcu3D.js");
2850
+ const { getForgeAdapter } = await import("./forge-XlDgPQWs.js");
2876
2851
  const remotePrimaryRepo = (getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId))?.repos[0];
2877
2852
  const remoteTargetBranch = remotePrimaryRepo?.targetBranch || "main";
2878
2853
  const remoteForge = remotePrimaryRepo?.forge || "github";
@@ -2907,7 +2882,7 @@ async function triggerMerge(issueId) {
2907
2882
  readyForMerge: false
2908
2883
  });
2909
2884
  completePendingOperation(issueId, null);
2910
- const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
2885
+ const { postMergeLifecycle } = await import("./merge-agent-36wfYm2u.js");
2911
2886
  await postMergeLifecycle(issueId, projectPath);
2912
2887
  return {
2913
2888
  success: true,
@@ -2944,10 +2919,10 @@ async function triggerMerge(issueId) {
2944
2919
  const projectConfig = findProjectByTeamSync(issuePrefix);
2945
2920
  if (projectConfig?.workspace?.type === "polyrepo" && projectConfig?.workspace?.repos) {
2946
2921
  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");
2922
+ const { getMergeSetSync, ensureMergeSetForIssueSync, upsertMergeSetSync, withRepoStateSync } = await import("./merge-set-G1RHcu3D.js");
2923
+ const { runQualityGates } = await import("./validation-ict8hnXk.js");
2924
+ const { getForgeAdapter } = await import("./forge-XlDgPQWs.js");
2925
+ const { messageAgent } = await import("./agents-DCvyTXNU.js");
2951
2926
  let mergeSet = getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId);
2952
2927
  if (!mergeSet) {
2953
2928
  const error = `No merge set found for ${issueId}`;
@@ -3217,7 +3192,7 @@ async function triggerMerge(issueId) {
3217
3192
  readyForMerge: false
3218
3193
  });
3219
3194
  completePendingOperation(issueId, null);
3220
- const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
3195
+ const { postMergeLifecycle } = await import("./merge-agent-36wfYm2u.js");
3221
3196
  advanceQueue();
3222
3197
  await postMergeLifecycle(issueId, projectPath);
3223
3198
  return {
@@ -3228,8 +3203,8 @@ async function triggerMerge(issueId) {
3228
3203
  repos: mergeResults
3229
3204
  };
3230
3205
  }
3231
- const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-D-iXNP0I.js");
3232
- const { getForgeAdapter } = await import("./forge-IgLR0Ist.js");
3206
+ const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-G1RHcu3D.js");
3207
+ const { getForgeAdapter } = await import("./forge-XlDgPQWs.js");
3233
3208
  const primaryRepo = (getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId))?.repos[0];
3234
3209
  const targetBranch = primaryRepo?.targetBranch || "main";
3235
3210
  const primaryForge = primaryRepo?.forge || "github";
@@ -3271,7 +3246,7 @@ async function triggerMerge(issueId) {
3271
3246
  };
3272
3247
  }
3273
3248
  if (githubPrRef) try {
3274
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-C7lftMNj.js");
3249
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-DRD2woO0.js");
3275
3250
  if (isGitHubAppConfigured()) {
3276
3251
  const prState = await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number));
3277
3252
  if (prState.state !== "OPEN" && !prState.merged) {
@@ -3332,7 +3307,7 @@ async function triggerMerge(issueId) {
3332
3307
  readyForMerge: false
3333
3308
  });
3334
3309
  completePendingOperation(issueId, null);
3335
- const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
3310
+ const { postMergeLifecycle } = await import("./merge-agent-36wfYm2u.js");
3336
3311
  await postMergeLifecycle(issueId, projectPath, branchName);
3337
3312
  return {
3338
3313
  success: true,
@@ -3346,13 +3321,13 @@ async function triggerMerge(issueId) {
3346
3321
  } catch (prStateErr) {
3347
3322
  console.warn(`[merge] Pre-merge PR state check failed for ${issueId}: ${prStateErr.message} — proceeding (check is best-effort)`);
3348
3323
  }
3349
- const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
3324
+ const { postMergeLifecycle } = await import("./merge-agent-36wfYm2u.js");
3350
3325
  const agentId = `agent-${issueId.toLowerCase()}`;
3351
3326
  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
3327
  setReviewStatus(issueId, { mergeStep: "rebasing" });
3353
3328
  console.log(`[merge] Rebasing ${branchName} onto ${targetBranch} for ${issueId} (agent=${await Effect.runPromise(sessionExists(agentId)) ? "running" : "stopped"})...`);
3354
3329
  {
3355
- const { beginShipLog, appendShipLog } = await import("./ship-log-CMWH3H5-.js");
3330
+ const { beginShipLog, appendShipLog } = await import("./ship-log-DE_0Cv_i.js");
3356
3331
  beginShipLog(issueId);
3357
3332
  appendShipLog(issueId, `Ship started: rebasing ${branchName} onto ${targetBranch}…`, "rebasing");
3358
3333
  }
@@ -3480,7 +3455,7 @@ async function triggerMerge(issueId) {
3480
3455
  });
3481
3456
  let skipLocalVerification = false;
3482
3457
  if (primaryForge === "github" && artifactUrl) try {
3483
- const { parsePullRequestRef, getCiCheckRunsStatePromise, isGitHubAppConfigured } = await import("./github-app-C7lftMNj.js");
3458
+ const { parsePullRequestRef, getCiCheckRunsStatePromise, isGitHubAppConfigured } = await import("./github-app-DRD2woO0.js");
3484
3459
  if (isGitHubAppConfigured()) {
3485
3460
  const ref = parsePullRequestRef({ url: artifactUrl });
3486
3461
  if (ref) {
@@ -3501,12 +3476,12 @@ async function triggerMerge(issueId) {
3501
3476
  } catch (ciErr) {
3502
3477
  console.warn(`[merge] CI-state check failed (${ciErr.message?.slice(0, 120)}) — falling back to local verification for ${issueId}`);
3503
3478
  }
3504
- const { appendShipLog } = await import("./ship-log-CMWH3H5-.js");
3479
+ const { appendShipLog } = await import("./ship-log-DE_0Cv_i.js");
3505
3480
  if (skipLocalVerification) appendShipLog(issueId, "✓ Local verification skipped — CI already green on this exact commit", "verifying");
3506
3481
  const verifyResult = skipLocalVerification ? { outcome: "passed" } : await (async () => {
3507
3482
  console.log(`[merge] Running post-rebase verification for ${issueId}...`);
3508
3483
  appendShipLog(issueId, "Running post-rebase verification (full quality-gate suite)…", "verifying");
3509
- const { runVerificationForIssue } = await import("./verification-runner-DdleMNLq.js");
3484
+ const { runVerificationForIssue } = await import("./verification-runner-ATaLbpr5.js");
3510
3485
  return Effect.runPromise(runVerificationForIssue(issueId, workspacePath, { isRemote: false }, "merge-verify", {
3511
3486
  syncTargetBranch: false,
3512
3487
  onGateLog: (line) => appendShipLog(issueId, line, "verifying")
@@ -3539,7 +3514,7 @@ async function triggerMerge(issueId) {
3539
3514
  console.log(`[merge] Post-rebase verification ${verifyResult.outcome} for ${issueId}`);
3540
3515
  setReviewStatus(issueId, { mergeStep: "reporting-statuses" });
3541
3516
  try {
3542
- const { getPullRequestState, isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-C7lftMNj.js");
3517
+ const { getPullRequestState, isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-DRD2woO0.js");
3543
3518
  if (githubPrRef && isGitHubAppConfigured()) {
3544
3519
  const sha = (await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number))).headSha.trim();
3545
3520
  if (sha) {
@@ -3567,7 +3542,7 @@ async function triggerMerge(issueId) {
3567
3542
  } catch (prMergeErr) {
3568
3543
  console.error(`[merge] Review artifact merge threw for ${issueId}:`, prMergeErr);
3569
3544
  try {
3570
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-C7lftMNj.js");
3545
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-DRD2woO0.js");
3571
3546
  if (githubPrRef && isGitHubAppConfigured()) {
3572
3547
  artifactMerged = (await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number))).merged;
3573
3548
  if (artifactMerged) console.log(`[merge] Race-detected: PR #${githubPrRef.number} for ${issueId} was already merged despite thrown error; proceeding`);
@@ -3684,8 +3659,8 @@ const postForgeApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge
3684
3659
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
3685
3660
  if (!/^[A-Z]+-\d+$/i.test(issueId)) return jsonResponse({ error: "Invalid issue ID format" }, { status: 400 });
3686
3661
  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");
3662
+ const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-G1RHcu3D.js");
3663
+ const { getForgeAdapter } = await import("./forge-XlDgPQWs.js");
3689
3664
  let mergeSet = getMergeSetSync(issueId);
3690
3665
  if (!mergeSet) return jsonResponse({ error: `No merge set found for ${issueId}` }, { status: 404 });
3691
3666
  const results = [];
@@ -3773,8 +3748,8 @@ const postForgeMergeRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge-m
3773
3748
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
3774
3749
  if (!/^[A-Z]+-\d+$/i.test(issueId)) return jsonResponse({ error: "Invalid issue ID format" }, { status: 400 });
3775
3750
  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");
3751
+ const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-G1RHcu3D.js");
3752
+ const { getForgeAdapter } = await import("./forge-XlDgPQWs.js");
3778
3753
  let mergeSet = getMergeSetSync(issueId);
3779
3754
  if (!mergeSet) return jsonResponse({ error: `No merge set found for ${issueId}` }, { status: 404 });
3780
3755
  const results = [];
@@ -3967,7 +3942,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
3967
3942
  console.log(`[approve] Starting role pipeline for ${issueId}...`);
3968
3943
  let reviewResult;
3969
3944
  try {
3970
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
3945
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Rub0OpZc.js");
3971
3946
  reviewResult = await Effect.runPromise(spawnReviewRoleForIssue({
3972
3947
  issueId,
3973
3948
  workspace: workspacePath,
@@ -4014,7 +3989,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
4014
3989
  }
4015
3990
  console.log(`[approve] Step 3/3: Running server-side rebase for ${issueId}...`);
4016
3991
  try {
4017
- const { rebaseFeatureBranch } = await import("./merge-rebase-R7MfqpiE.js");
3992
+ const { rebaseFeatureBranch } = await import("./merge-rebase-Czfqfe4q.js");
4018
3993
  const workspacePathForRebase = join(projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
4019
3994
  const rebaseResult = await Effect.runPromise(rebaseFeatureBranch(workspacePathForRebase, branchName, "main", issueId));
4020
3995
  if (!rebaseResult.success) {
@@ -4034,7 +4009,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
4034
4009
  completePendingOperation(issueId, pushResult.error);
4035
4010
  return jsonResponse({ error: pushResult.error }, { status: pushResult.httpStatus });
4036
4011
  }
4037
- const { approve: lifecycleApprove } = await import("./lifecycle-f1GbDK33.js");
4012
+ const { approve: lifecycleApprove } = await import("./lifecycle-C_73gi-C.js");
4038
4013
  const ghResolved = resolveGitHubIssueSync(issueId);
4039
4014
  const isGitHubIssueFlag = ghResolved.isGitHub;
4040
4015
  const lifecycleCtx = {
@@ -4068,7 +4043,7 @@ const getMergeQueueRoute = HttpRouter.add("GET", "/api/merge-queue", httpHandler
4068
4043
  })));
4069
4044
  const postInternalPipelineNotifyRoute = HttpRouter.add("POST", "/api/internal/pipeline/notify", httpHandler(Effect.gen(function* () {
4070
4045
  const request = yield* HttpServerRequest.HttpServerRequest;
4071
- const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-nobT6FhA.js"));
4046
+ const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-CCaWaTwE.js"));
4072
4047
  const expected = getInternalTokenSync();
4073
4048
  if (!expected) return jsonResponse({
4074
4049
  ok: false,
@@ -4082,7 +4057,7 @@ const postInternalPipelineNotifyRoute = HttpRouter.add("POST", "/api/internal/pi
4082
4057
  }, 403);
4083
4058
  const event = yield* readJsonBody;
4084
4059
  const type = event.type;
4085
- const { notifyPipelineSync } = yield* Effect.promise(() => import("./pipeline-notifier-BtYHbBPl.js"));
4060
+ const { notifyPipelineSync } = yield* Effect.promise(() => import("./pipeline-notifier-BkKbQ8ji.js"));
4086
4061
  switch (type) {
4087
4062
  case "status_changed": {
4088
4063
  const issueId = event.issueId;
@@ -4857,7 +4832,7 @@ const patchWorkspaceTieredExecutionRoute = HttpRouter.add("PATCH", "/api/workspa
4857
4832
  if (override !== "on" && override !== "off" && override !== null && override !== void 0) return jsonResponse({ error: "Invalid tiered-execution override" }, { status: 400 });
4858
4833
  const project = getProjectSync(extractPrefixSync(issueId) ?? issueId.split("-")[0]);
4859
4834
  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)));
4835
+ yield* Effect.promise(() => import("./record-pyB6VA32.js").then((m) => m.writeRecordTieredExecutionOverride(project, issueId, override)));
4861
4836
  const projectPath = project.path;
4862
4837
  const location = yield* resolvePlanLocation(projectPath, issueId);
4863
4838
  if (!location) return jsonResponse({ error: "No vBRIEF plan found for this workspace" }, { status: 404 });
@@ -5153,6 +5128,9 @@ const stashCleanRouteLayer = Layer.mergeAll(getWorkspaceStashesRoute, postWorksp
5153
5128
  * POST /api/review/:issueId/trigger
5154
5129
  * POST /api/review/:issueId/request
5155
5130
  *
5131
+ * Release read endpoint:
5132
+ * GET /api/workspaces/:issueId/release
5133
+ *
5156
5134
  * The cancel/control routes (reset, purge, abort, pending, unstick,
5157
5135
  * deacon-ignore, auto-merge) live in review-control.ts. Shared singletons
5158
5136
  * (review-status wrapper, pending-ops cluster, project path, readJsonBody,
@@ -5163,6 +5141,7 @@ init_projects();
5163
5141
  init_state_plane();
5164
5142
  init_domain_services();
5165
5143
  init_review_status();
5144
+ init_release_set();
5166
5145
  init_conflict_gate();
5167
5146
  init_beads_restore();
5168
5147
  init_agents();
@@ -5290,7 +5269,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
5290
5269
  console.log(`Feature branch push note: ${errorMessage(pushErr)}`);
5291
5270
  }
5292
5271
  try {
5293
- const { createReviewArtifactsForIssue } = await import("./review-artifacts-C7a45b1_.js");
5272
+ const { createReviewArtifactsForIssue } = await import("./review-artifacts-CX951jTU.js");
5294
5273
  const artifactResult = await Effect.runPromise(createReviewArtifactsForIssue(issueId, workspacePath));
5295
5274
  const primaryArtifact = artifactResult.mergeSet?.repos.find((repo) => !!repo.artifactUrl);
5296
5275
  artifactResult.mergeSet?.repos.find((repo) => repo.mergeStatus !== "skipped")?.targetBranch;
@@ -5345,7 +5324,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
5345
5324
  } catch {}
5346
5325
  return;
5347
5326
  }
5348
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
5327
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Rub0OpZc.js");
5349
5328
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
5350
5329
  const reviewResult = await Effect.runPromise(spawnReviewRoleForIssue({
5351
5330
  issueId,
@@ -5485,7 +5464,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
5485
5464
  console.log(`[request-review] Feature branch push note: ${errorMessage(pushErr)}`);
5486
5465
  }
5487
5466
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
5488
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
5467
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Rub0OpZc.js");
5489
5468
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
5490
5469
  issueId,
5491
5470
  workspace: workspacePathRerun,
@@ -5535,7 +5514,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
5535
5514
  });
5536
5515
  } else {
5537
5516
  const workspacePath = join(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
5538
- const { spawnRun } = yield* Effect.promise(() => import("./agents-C4kZ8a2r.js"));
5517
+ const { spawnRun } = yield* Effect.promise(() => import("./agents-DCvyTXNU.js"));
5539
5518
  try {
5540
5519
  const testRun = yield* Effect.promise(() => spawnRun(issueId, "test", { workspace: workspacePath }));
5541
5520
  setReviewStatus(issueId, { testStatus: "testing" });
@@ -5624,7 +5603,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
5624
5603
  autoRequeueCount: newCount
5625
5604
  }, { status: 500 });
5626
5605
  const result = yield* Effect.promise(async () => {
5627
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
5606
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Rub0OpZc.js");
5628
5607
  return await Effect.runPromise(spawnReviewRoleForIssue({
5629
5608
  issueId,
5630
5609
  workspace: workspacePath,
@@ -5688,7 +5667,14 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
5688
5667
  }, { status: 500 });
5689
5668
  }
5690
5669
  })));
5691
- const reviewPipelineRouteLayer = Layer.mergeAll(postWorkspaceReviewRoute, postWorkspaceRequestReviewRoute);
5670
+ const getReleaseSetRoute = HttpRouter.add("GET", "/api/workspaces/:issueId/release", httpHandler(Effect.gen(function* () {
5671
+ const rawIssueId = (yield* HttpRouter.params)["issueId"] ?? "";
5672
+ if (!parseIssueIdSync(rawIssueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
5673
+ const releaseSet = getReleaseSetSync(resolveIssueIdSync(rawIssueId));
5674
+ if (!releaseSet) return jsonResponse({ error: "Release set not found" }, { status: 404 });
5675
+ return jsonResponse(releaseSet);
5676
+ })));
5677
+ const reviewPipelineRouteLayer = Layer.mergeAll(postWorkspaceReviewRoute, postWorkspaceRequestReviewRoute, getReleaseSetRoute);
5692
5678
  //#endregion
5693
5679
  //#region routes/workspaces/review-control.ts
5694
5680
  /**
@@ -5921,7 +5907,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
5921
5907
  const result = processResetReviewPipeline(issueId, resetWorkspace.exists);
5922
5908
  if (result.httpStatus !== 200) return jsonResponse(result.body, { status: result.httpStatus });
5923
5909
  try {
5924
- const { resetPostMergeState } = yield* Effect.promise(() => import("./merge-agent-CfohxFWM.js"));
5910
+ const { resetPostMergeState } = yield* Effect.promise(() => import("./merge-agent-36wfYm2u.js"));
5925
5911
  resetPostMergeState(issueId);
5926
5912
  } catch (err) {
5927
5913
  console.warn(`[reset-review] resetPostMergeState best-effort failed for ${issueId}:`, err);
@@ -5930,7 +5916,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
5930
5916
  const rerun = body?.rerun === true;
5931
5917
  if (rerun) try {
5932
5918
  yield* Effect.promise(async () => {
5933
- const { spawnReviewRoleForIssue } = await import("./review-agent-uwVftH98.js");
5919
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Rub0OpZc.js");
5934
5920
  const dispatchArgs = buildReviewRedispatchArgs(issueId, resetWorkspace, workspaceInfo, resolved);
5935
5921
  if (dispatchArgs) {
5936
5922
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
@@ -5959,7 +5945,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
5959
5945
  const postWorkspaceReviewPurgeRoute = HttpRouter.add("POST", "/api/review/:issueId/purge", httpHandler(Effect.gen(function* () {
5960
5946
  const issueId = (yield* HttpRouter.params)["issueId"] ?? "";
5961
5947
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
5962
- const { purgeReviewAgentsForIssue } = yield* Effect.promise(() => import("./review-agent-uwVftH98.js"));
5948
+ const { purgeReviewAgentsForIssue } = yield* Effect.promise(() => import("./review-agent-Rub0OpZc.js"));
5963
5949
  const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
5964
5950
  const purge = yield* Effect.promise(() => purgeReviewAgentsForIssue(projectKey, issueId));
5965
5951
  const workspaceInfo = getWorkspaceInfoForIssue(issueId);
@@ -5989,8 +5975,8 @@ const postWorkspaceAbortReviewRoute = HttpRouter.add("POST", "/api/review/:issue
5989
5975
  success: false,
5990
5976
  error: "Workspace does not exist"
5991
5977
  }, { status: 400 });
5992
- const { resolveProjectFromIssueSync } = yield* Effect.promise(() => import("./projects-Bqfwuqet.js"));
5993
- const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-uwVftH98.js"));
5978
+ const { resolveProjectFromIssueSync } = yield* Effect.promise(() => import("./projects-KJ94e50I.js"));
5979
+ const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-Rub0OpZc.js"));
5994
5980
  const { killed, failed } = yield* killAllReviewerSessions(resolveProjectFromIssueSync(issueId)?.projectKey, issueId);
5995
5981
  setReviewStatus(issueId, {
5996
5982
  reviewStatus: "pending",
@@ -6062,8 +6048,8 @@ const getReviewConfigRoute = HttpRouter.add("GET", "/api/review/:issueId/config"
6062
6048
  const issueId = ((yield* HttpRouter.params)["issueId"] ?? "").toUpperCase();
6063
6049
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
6064
6050
  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");
6051
+ const { readIssueRecordSync, resolveProjectForIssue } = await import("./record-pyB6VA32.js");
6052
+ const { resolveReviewMode, resolveReReviewScope } = await import("./review-agent-Rub0OpZc.js");
6067
6053
  const project = resolveProjectForIssue(issueId);
6068
6054
  const record = project ? readIssueRecordSync(project, issueId) : null;
6069
6055
  return {
@@ -6089,8 +6075,8 @@ const postReviewConfigRoute = HttpRouter.add("POST", "/api/review/:issueId/confi
6089
6075
  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
6076
  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
6077
  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");
6078
+ const { ensureIssueRecordSync, readIssueRecordSync, resolveProjectForIssue, writeIssueRecordSync } = await import("./record-pyB6VA32.js");
6079
+ const { resolveReviewMode, resolveReReviewScope } = await import("./review-agent-Rub0OpZc.js");
6094
6080
  const project = resolveProjectForIssue(issueId);
6095
6081
  const record = readIssueRecordSync(project, issueId) ?? ensureIssueRecordSync(project, issueId);
6096
6082
  if (hasMode) if (body.reviewMode === null) delete record.reviewMode;
@@ -6484,7 +6470,7 @@ async function readWorkspacePlanningMarkdown(issueId, fileName) {
6484
6470
  */
6485
6471
  async function readWorkspaceContinueFile(_projectPath, workspacePath, issueId) {
6486
6472
  try {
6487
- const { readRecordContinueViewSync, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-De2syxNB.js");
6473
+ const { readRecordContinueViewSync, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-pyB6VA32.js");
6488
6474
  const recordView = readRecordContinueViewSync(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId);
6489
6475
  return recordView ? JSON.stringify(recordView, null, 2) : null;
6490
6476
  } catch {
@@ -7253,7 +7239,7 @@ const getWorkspaceReviewStatusRoute = HttpRouter.add("GET", "/api/review/:issueI
7253
7239
  if (queuePosition === null) try {
7254
7240
  const resolved = resolveProjectFromIssueSync(issueId);
7255
7241
  if (resolved) {
7256
- const { getQueueForProject } = yield* Effect.promise(() => import("./merge-DRMPa8CQ.js"));
7242
+ const { getQueueForProject } = yield* Effect.promise(() => import("./merge-brm721Es.js"));
7257
7243
  const mergePos = findPositionInQueueSync(issueId, getQueueForProject(resolved.projectKey).map((e) => ({
7258
7244
  id: String(e.id),
7259
7245
  type: "task",
@@ -7291,7 +7277,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7291
7277
  const workspaceInfo = getWorkspaceInfoForIssue(issueId);
7292
7278
  if (workspaceInfo.exists && workspaceInfo.localPath) {
7293
7279
  const localPath = workspaceInfo.localPath;
7294
- const { getWorkspaceGitInfo } = yield* Effect.promise(() => import("./git-utils-DbfC0zls.js"));
7280
+ const { getWorkspaceGitInfo } = yield* Effect.promise(() => import("./git-utils-BCLRWQ-y.js"));
7295
7281
  try {
7296
7282
  const gitInfo = yield* getWorkspaceGitInfo(localPath);
7297
7283
  if (gitInfo.HEAD) update.reviewedAtCommit = gitInfo.HEAD;
@@ -7306,7 +7292,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7306
7292
  if (verificationStatus) update.verificationStatus = verificationStatus;
7307
7293
  if (readyForMerge !== void 0) update.readyForMerge = readyForMerge;
7308
7294
  const status = setReviewStatus(issueId, update);
7309
- const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DdvpFNt1.js"));
7295
+ const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-8ZAguXef.js"));
7310
7296
  const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
7311
7297
  if (reviewStatus && [
7312
7298
  "passed",
@@ -7324,7 +7310,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7324
7310
  const agentId = `agent-${issueId.toLowerCase()}`;
7325
7311
  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
7312
  try {
7327
- const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-DMBdS_jL.js"));
7313
+ const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-DOUhyIW2.js"));
7328
7314
  const wsInfo = getWorkspaceInfoForIssue(issueId);
7329
7315
  const fileResult = yield* Effect.promise(() => writeFeedbackFile({
7330
7316
  issueId,
@@ -7388,7 +7374,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7388
7374
  const agentId = `agent-${issueId.toLowerCase()}`;
7389
7375
  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
7376
  try {
7391
- const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-DMBdS_jL.js"));
7377
+ const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-DOUhyIW2.js"));
7392
7378
  const wsInfo = getWorkspaceInfoForIssue(issueId);
7393
7379
  const fileResult = yield* Effect.promise(() => writeFeedbackFile({
7394
7380
  issueId,
@@ -7413,14 +7399,14 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
7413
7399
  console.log(`[review-status] ${issueId} marked ready for merge after test=passed`);
7414
7400
  yield* Effect.promise(async () => {
7415
7401
  try {
7416
- const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-Bqfwuqet.js");
7402
+ const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-KJ94e50I.js");
7417
7403
  const project = resolveProjectFromIssueSync(issueId);
7418
7404
  const repo = (project ? getProjectSync(project.projectKey) : null)?.github_repo;
7419
7405
  if (!repo || !repo.includes("/")) return;
7420
7406
  const [owner, name] = repo.split("/");
7421
7407
  const wsInfo = getWorkspaceInfoForIssue(issueId);
7422
7408
  if (!wsInfo?.localPath) return;
7423
- const { postOverdeckTestsStatus } = await import("./github-app-C7lftMNj.js");
7409
+ const { postOverdeckTestsStatus } = await import("./github-app-DRD2woO0.js");
7424
7410
  await postOverdeckTestsStatus(wsInfo.localPath, owner, name, "success", "Test specialist passed");
7425
7411
  } catch (err) {
7426
7412
  console.warn(`[review-status] Failed to post overdeck/tests for ${issueId}: ${err.message}`);
@@ -7462,7 +7448,7 @@ const postWorkspaceRefreshTokenRoute = HttpRouter.add("POST", "/api/workspaces/:
7462
7448
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
7463
7449
  const issueLower = issueId.toLowerCase();
7464
7450
  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"));
7451
+ const { refreshWorkspaceToken, isGitHubAppConfigured } = yield* Effect.promise(() => import("./github-app-DRD2woO0.js"));
7466
7452
  if (!isGitHubAppConfigured()) return jsonResponse({
7467
7453
  success: false,
7468
7454
  error: "GitHub App not configured"
@@ -7477,4 +7463,4 @@ const workspacesRouteLayer = Layer.mergeAll(workspaceDataRouteLayer, postWorkspa
7477
7463
  //#endregion
7478
7464
  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
7465
 
7480
- //# sourceMappingURL=workspaces-Ca4zZs12.js.map
7466
+ //# sourceMappingURL=workspaces-BjWXntty.js.map
@@ -0,0 +1,3 @@
1
+ import { n as init_writer, r as runMutationBatch } from "./writer-fe1-8iGc.js";
2
+ init_writer();
3
+ export { runMutationBatch };