@overdeck/desktop 0.47.1 → 0.48.0

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 (444) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +59 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-Cd7ZGZCq.js → acceptance-criteria-DmtLDbtt.js} +2 -2
  4. package/server/{activity-logger-CyteR4JO.js → activity-logger-Co5qljIj.js} +55 -4
  5. package/server/activity-logger-K7FYGF_z.js +3 -0
  6. package/server/{advancing-selfheal-DieFp3qi.js → advancing-selfheal-8AR68Asf.js} +6 -6
  7. package/server/{agent-gc-BMcgTDl7.js → agent-gc-BmYeT6eH.js} +5 -5
  8. package/server/agent-state-Dq3s84-P.js +3 -0
  9. package/server/{agent-state-service-DFO6qvHp.js → agent-state-service-DK1Vay1E.js} +1 -1
  10. package/server/{agent-state-service-BOzQhLjU.js → agent-state-service-rjnzpHDx.js} +6 -6
  11. package/server/{agent-state-source-Ca_zCaII.js → agent-state-source-Ds968-j6.js} +1 -1
  12. package/server/{agents-CtACUuVG.js → agents-Dls7tfJH.js} +5 -5
  13. package/server/agents-IPSa5kzn.js +3 -0
  14. package/server/{archive-planning-Binfb99i.js → archive-planning-Cq7cyinS.js} +51 -24
  15. package/server/archive-planning-MbkGCBIY.js +2 -0
  16. package/server/{artifact-index-jobs-Jn7BGOtV.js → artifact-index-jobs-Dj_8kpTd.js} +3 -3
  17. package/server/{assemble-DsqK9OAq.js → assemble-BTCmbcfH.js} +20 -13
  18. package/server/{auto-spawn-consent-BooqhC3L.js → auto-spawn-consent-lXqRJ1Dr.js} +304 -121
  19. package/server/{backlog-auto-trigger-BADGPxov.js → backlog-auto-trigger-Dn-amzt6.js} +3 -3
  20. package/server/{behavior-B7biGtFT.js → behavior-DIMQMRzs.js} +2 -2
  21. package/server/{boot-reconciled-stop-events-bQUzU8ns.js → boot-reconciled-stop-events-D6SeUTIr.js} +1 -1
  22. package/server/{bridge-pool-patrol-DsPj6F7t.js → bridge-pool-patrol-BEjt-xF3.js} +2 -2
  23. package/server/{briefing-freshness-CUerZqWd.js → briefing-freshness-3PNmL_p3.js} +2 -2
  24. package/server/{build-info-D0q_i8WM.js → build-info-CJg813Hm.js} +3 -3
  25. package/server/{build-info-Du74MKiP.js → build-info-CXyeFsXu.js} +1 -1
  26. package/server/{checkpoint-manager-Cu-R5Uzg.js → checkpoint-manager-9t7G5c1V.js} +1 -1
  27. package/server/{checkpoint-manager-R5tnaxEY.js → checkpoint-manager-B2G38R3p.js} +3 -3
  28. package/server/checkpoint-worker.js +1 -1
  29. package/server/{checkpoints-wF84ubZ8.js → checkpoints-CuBgiXO-.js} +1 -1
  30. package/server/{checkpoints-DYtLu-PB.js → checkpoints-VTZMd4Qm.js} +2 -2
  31. package/server/{claude-hooks-provision-DXI3Wqlm.js → claude-hooks-provision-55SyQaPz.js} +2 -2
  32. package/server/{claude-hooks-provision-UKxCeOyj.js → claude-hooks-provision-CEUT-CZd.js} +1 -1
  33. package/server/{claude-permissions-DYVLnX9t.js → claude-permissions-Cn0dIu2i.js} +2 -2
  34. package/server/{claude-settings-overlay-DxP2F_gY.js → claude-settings-overlay-B19hdzSA.js} +1 -1
  35. package/server/{claude-settings-overlay-DsbpIq2d.js → claude-settings-overlay-Yg_ANh81.js} +2 -2
  36. package/server/{cli-DzRKxxP_.js → cli-C9S84iTy.js} +79 -22
  37. package/server/cli-M1cwZ__d.js +3 -0
  38. package/server/{cliproxy-CG4meRFc.js → cliproxy-CJq3KXU6.js} +2 -2
  39. package/server/{cliproxy-Cwzw39yN.js → cliproxy-DgEZlr7Y.js} +1 -1
  40. package/server/{close-issue-BX1bATJy.js → close-issue-DPxRddGR.js} +5 -5
  41. package/server/{closed-issue-reaper-hLt0W86J.js → closed-issue-reaper-C5Zn4GRS.js} +13 -13
  42. package/server/{closed-issue-reaper-DvnTSN6a.js → closed-issue-reaper-D-2B48Ri.js} +1 -1
  43. package/server/{codex-rnJN3v3_.js → codex-B3n_rkwn.js} +1 -1
  44. package/server/{codex-BYwi1uyW.js → codex-CjkD1PJu.js} +6 -6
  45. package/server/{codex-parser-Poyz29GE.js → codex-parser-DpB1Il-P.js} +2 -2
  46. package/server/{compaction-continuation-DtMfHN0f.js → compaction-continuation-DZD9ukSE.js} +3 -3
  47. package/server/{config-R793W0yA.js → config-C5saf4Ja.js} +1 -1
  48. package/server/{config-CX4vk1CV.js → config-DnLJATZk.js} +2 -2
  49. package/server/{config-ktAVnp4s.js → config-DvM8jtQK.js} +2 -2
  50. package/server/{config-yaml-CxdwhAIA.js → config-yaml-BSCqwmX0.js} +11299 -10972
  51. package/server/{conflict-gate-BSTlwCtF.js → conflict-gate-DXa_L28t.js} +1 -1
  52. package/server/{conflict-gate-BNv6UolH.js → conflict-gate-WfVqgalf.js} +4 -4
  53. package/server/{context-layers-DCdaGsRG.js → context-layers-D7UqH9Ab.js} +2 -2
  54. package/server/{context-layers-DlWsDiRF.js → context-layers-Dpz3Vd6d.js} +3 -3
  55. package/server/{control-settings-qYYHrIqy.js → control-settings-DVf6pKyv.js} +4 -4
  56. package/server/{conversation-compaction-BxUKObHb.js → conversation-compaction-5XuH6OBn.js} +1 -1
  57. package/server/{conversation-compaction-CXQrN3I_.js → conversation-compaction-COrbnX1J.js} +8 -8
  58. package/server/{conversation-service-CZiUE8Uw.js → conversation-service-BufdtnZF.js} +169 -10
  59. package/server/{conversation-service-CDnQ3ayN.js → conversation-service-DnUyIiLb.js} +1 -1
  60. package/server/{conversations-D7lR670u.js → conversations-B4rxz-Wl.js} +17 -10
  61. package/server/{conversations-DXl5YTf4.js → conversations-D1bwxQMy.js} +1 -1
  62. package/server/{cost-Aat8HfO_.js → cost-CpFDrJUS.js} +46 -2
  63. package/server/{cost-CWvN9FP2.js → cost-KLuwKCW9.js} +3 -3
  64. package/server/{cost-sync-DiUBXwl6.js → cost-sync-cesi9dp8.js} +3 -3
  65. package/server/{dag-5QlmH0oC.js → dag-BYiFMqpU.js} +2 -2
  66. package/server/{dangerous-git-ops-DWX6Og8c.js → dangerous-git-ops-BKvd3-Hk.js} +1 -1
  67. package/server/dashboard-db-worker.js +7 -7
  68. package/server/{deacon-PW_bg4uL.js → deacon-BbsWw8a6.js} +3 -3
  69. package/server/{deacon-B1LD5cJU.js → deacon-HdEh0Esp.js} +672 -181
  70. package/server/deacon-event-client-C93rvOT7.js +237 -0
  71. package/server/deacon-event-client-Ck5Ei7Mn.js +3 -0
  72. package/server/{deacon-nudge-log-DPHsO14z.js → deacon-nudge-log-BND_97Wo.js} +4 -3
  73. package/server/{deacon-pending-lifecycle-2ZflPxgo.js → deacon-pending-lifecycle-CD3YsiQK.js} +3 -3
  74. package/server/deacon-swarm-DgWADWd_.js +2 -0
  75. package/server/{deacon-swarm-DwGUgSVp.js → deacon-swarm-rqrl4TMs.js} +39 -18
  76. package/server/deacon.js +12 -210
  77. package/server/{dead-end-trip-B06RFIr2.js → dead-end-trip-DSF23CLX.js} +4 -3
  78. package/server/dead-end-trip-zKlS4v6f.js +2 -0
  79. package/server/delivery-CsbQdZkS.js +3 -0
  80. package/server/{deploy-patrol-BNjeCL8u.js → deploy-patrol-kARAkji4.js} +17 -21
  81. package/server/{deploy-queue-CKT_Ia9p.js → deploy-queue-Bj0HJT1i.js} +2 -2
  82. package/server/{deploy-queue-DMMYhFC8.js → deploy-queue-rjTUy1RM.js} +1 -1
  83. package/server/{deploy-window-DC8lze3d.js → deploy-window-B2IM-9G5.js} +10 -44
  84. package/server/{deploy-window-D_AimdNN.js → deploy-window-BNFWnA8D.js} +1 -1
  85. package/server/{dev-supervisor-C4F0vbno.js → dev-supervisor-B1mZYXz4.js} +2 -2
  86. package/server/{devcontainer-renderer-66sqMQIi.js → devcontainer-renderer-B-o68Z5B.js} +3 -3
  87. package/server/{dist-C5FT9lTG.js → dist-3W--cGMa.js} +1 -1
  88. package/server/dist-BR0QtwmS.js +3 -0
  89. package/server/{dist-src-B-AlGWSl.js → dist-src-C-Vk2jNk.js} +1 -1
  90. package/server/{docker-BxrFhTZ_.js → docker-DH3jUYg1.js} +1 -1
  91. package/server/{docker-CoAT8R0J.js → docker-meuLKLzV.js} +27 -20
  92. package/server/{dod-Bg6wsKTV.js → dod-D7-9dCOD.js} +1 -1
  93. package/server/{driver-CKVGi51s.js → driver-CmsY2RLl.js} +1 -1
  94. package/server/{durable-review-pipeline-D_DcfIGP.js → durable-review-pipeline-CStTgOAf.js} +1 -1
  95. package/server/{durable-review-pipeline-HkAgnx0L.js → durable-review-pipeline-Chq0lzjL.js} +1 -1
  96. package/server/{ensure-devcontainer-Bg5HJAcO.js → ensure-devcontainer-BE3llBWP.js} +1 -1
  97. package/server/{ensure-devcontainer-DTxChVuA.js → ensure-devcontainer-BXrY7C2Z.js} +4 -4
  98. package/server/{esm-shims-CaBWIR7f.js → esm-shims-Bzy4ZzNU.js} +1 -1
  99. package/server/event-store-COd2tOx8.js +3 -0
  100. package/server/{event-store-CrHcVC5_.js → event-store-D_AR-Y78.js} +184 -11
  101. package/server/{events-ChEFB7Jp.js → events-CCkFWa7X.js} +1 -1
  102. package/server/{events-DhRN-6vM.js → events-zjDQozet.js} +3 -3
  103. package/server/{factory-BezSPaTd.js → factory-DhavwKVc.js} +5 -5
  104. package/server/{feature-registry-population-DhswNiXx.js → feature-registry-population-DWGBKyWd.js} +4 -4
  105. package/server/{feature-registry-storage-CUVNpAso.js → feature-registry-storage-C5DkXmCM.js} +3 -3
  106. package/server/{features-B2CfNPFw.js → features-CC47YcCX.js} +2 -2
  107. package/server/{feedback-target-CMrEAoeA.js → feedback-target-D9Tex35_.js} +1 -1
  108. package/server/{feedback-target-VBr9gKgX.js → feedback-target-DoRCR3L-.js} +8 -8
  109. package/server/{feedback-writer-CY91ckuw.js → feedback-writer-CTSuA6lw.js} +1 -1
  110. package/server/{feedback-writer-xpFgU632.js → feedback-writer-DdsBdtNL.js} +5 -5
  111. package/server/{flywheel-DsICCjTR.js → flywheel-DHWHzaYK.js} +1 -1
  112. package/server/{flywheel-DQqsSm7P.js → flywheel-DJQa9az8.js} +14 -14
  113. package/server/{flywheel-CTVY3yCG.js → flywheel-TacAI9MA.js} +21 -17
  114. package/server/{flywheel-merge-order-C-TI4JGu.js → flywheel-merge-order-D2foPh88.js} +1 -1
  115. package/server/{flywheel-merge-order-CMGz-imq.js → flywheel-merge-order-DRtex2Dt.js} +7 -7
  116. package/server/forge-CdlCG9aS.js +3 -0
  117. package/server/{forge-RTNqJe6a.js → forge-c8LeC-tw.js} +2 -2
  118. package/server/{from-DxGcivc9.js → from-BogSwvr2.js} +1 -1
  119. package/server/{fs-lock-Bre3sGoz.js → fs-lock-D_GeJtXl.js} +3 -3
  120. package/server/{fts-operations-BuTdlZFA.js → fts-operations-DP9R-8Q3.js} +3 -3
  121. package/server/{git-utils-CedsVume.js → git-utils-C31x1lpE.js} +1 -1
  122. package/server/{git-utils-DtdoEXJk.js → git-utils-xQ74FoSn.js} +5 -4
  123. package/server/{github-app-DIE8BkHI.js → github-app-CpQSDlv8.js} +1 -1
  124. package/server/{github-app-gVnZcP9B.js → github-app-D2QuvZ3j.js} +3 -3
  125. package/server/{github-client-BrAC6ELh.js → github-client-D9YvJX5D.js} +3 -3
  126. package/server/{github-client-CBOkvBUl.js → github-client-Tpi3PmKX.js} +1 -1
  127. package/server/{github-pr-lookup-CgMULTPf.js → github-pr-lookup-DvBMv-IW.js} +2 -2
  128. package/server/{harness-binary-CnBHpd57.js → harness-binary-BHxWf_sX.js} +7 -6
  129. package/server/{harness-resolve-BVj6sI8m.js → harness-resolve-bj9WMABA.js} +4 -4
  130. package/server/{health-events-BBWO_Dh9.js → health-events-bCDPn59Z.js} +2 -2
  131. package/server/{health-events-Der6bOkm.js → health-events-qo7Ss34U.js} +1 -1
  132. package/server/{hooks-BOavco-e.js → hooks-Dyxtg5fk.js} +2 -2
  133. package/server/{hooks-BJNal-bs.js → hooks-X2XHBB2b.js} +1 -1
  134. package/server/{hume-DBocJFkA.js → hume-DrZEGpqc.js} +2 -2
  135. package/server/hume-YPsy4UA8.js +3 -0
  136. package/server/{idle-stack-reaper-DQFh8rDh.js → idle-stack-reaper-CJ1ygW0p.js} +37 -7
  137. package/server/{idle-stack-reaper-CyGxXOfC.js → idle-stack-reaper-uJGOb-vu.js} +1 -1
  138. package/server/{in-flight-guard-nXEKoxI7.js → in-flight-guard-CG2Eo-rr.js} +1 -1
  139. package/server/{infra-BDQDRopn.js → infra-CTrmVqc_.js} +111 -6
  140. package/server/{injection-DfFFEMKL.js → injection-BisQ0lpX.js} +1 -1
  141. package/server/{injection-CCopdUKz.js → injection-C9sxqbc2.js} +73 -193
  142. package/server/{inspect-agent-FCDlNT_i.js → inspect-agent-BoSO51YC.js} +12 -12
  143. package/server/inspect-agent-BykeOH4a.js +2 -0
  144. package/server/{internal-token-BG6yQKNL.js → internal-token-AvXePaQT.js} +2 -2
  145. package/server/{internal-token-BJZa40Ld.js → internal-token-Djkj-yqK.js} +1 -1
  146. package/server/{io-C0NV7y6C.js → io-mxOWMZ7I.js} +6 -6
  147. package/server/{issue-closed-CNNGbhWm.js → issue-closed-Bj_bCv_0.js} +7 -7
  148. package/server/{issue-lifecycle-DSH0GpWC.js → issue-lifecycle-A5YIpDZE.js} +1 -1
  149. package/server/{issue-lifecycle-BXfzxFCD.js → issue-lifecycle-BXUqaHzF.js} +32 -28
  150. package/server/{issue-service-singleton-F3A5VP6M.js → issue-service-singleton-BPNEXczv.js} +11 -11
  151. package/server/{issue-service-singleton-lwFJ4dHk.js → issue-service-singleton-CcaHjKPR.js} +1 -1
  152. package/server/{issues-DA-U_MpR.js → issues-AX-YBeAQ.js} +2 -2
  153. package/server/{jsonl-parser-BXiGANOh.js → jsonl-parser-CgYWQ20q.js} +7 -3
  154. package/server/kimi-code-BYbme0aV.js +579 -0
  155. package/server/kimi-code-D_Ppt82c.js +3 -0
  156. package/server/kimi-parser-B-JBg3Pv.js +147 -0
  157. package/server/{label-cleanup-BnxRk0Eo.js → label-cleanup-sXUlgdM0.js} +3 -3
  158. package/server/{lifecycle-DOgGnpIv.js → lifecycle-D2X3al0D.js} +2 -2
  159. package/server/{lifecycle-Di48-w4x.js → lifecycle-DjlljAZ1.js} +6 -6
  160. package/server/{lifecycle-io-eVG6v_8-.js → lifecycle-io-C5nVk55o.js} +1 -1
  161. package/server/{lifecycle-io-1XSeczTr.js → lifecycle-io-NPm1YtIG.js} +5 -5
  162. package/server/{linear-client-CvGo9n7M.js → linear-client--luYwCZg.js} +1 -1
  163. package/server/{linear-client-CYZRrcjp.js → linear-client-B8pLegW1.js} +3 -3
  164. package/server/{linear-mcp-auth-Cp0XaP96.js → linear-mcp-auth-BQVWV0I3.js} +6 -6
  165. package/server/{linear-mcp-auth-DoJnjdPZ.js → linear-mcp-auth-Dx81Zl4G.js} +1 -1
  166. package/server/memory-fts-worker.js +1 -1
  167. package/server/{merge-DO14mOr3.js → merge-Bx5Bh9pi.js} +3 -3
  168. package/server/{merge-ZF99ig6A.js → merge-Dqmh_zja.js} +1 -1
  169. package/server/{merge-agent-gpiRkcvj.js → merge-agent-DP9AUY29.js} +33 -33
  170. package/server/{merge-agent-C1-9zbP_.js → merge-agent-DWd0KfiS.js} +1 -1
  171. package/server/{merge-batch-C11ocNkO.js → merge-batch-BdmvTEAC.js} +1 -1
  172. package/server/{merge-completeness-CghMbyX7.js → merge-completeness-BfRwFjRx.js} +1 -1
  173. package/server/{merge-completeness-BUzPZy0E.js → merge-completeness-C1FevcDT.js} +4 -4
  174. package/server/merge-ops-B98tKc1e.js +2 -0
  175. package/server/merge-rebase-BLykMwPO.js +2 -0
  176. package/server/{merge-rebase-iwlUzZjr.js → merge-rebase-BX1xKsrE.js} +2 -2
  177. package/server/{merge-set-Dbnx4chw.js → merge-set-DsLjjLEV.js} +4 -4
  178. package/server/{merge-set-BymrheTj.js → merge-set-H6epHOsw.js} +1 -1
  179. package/server/{merge-sync-CM978zez.js → merge-sync-BEdfsQV4.js} +2 -2
  180. package/server/{merge-sync-CqEtqjI2.js → merge-sync-BebcWWGA.js} +1 -1
  181. package/server/{merge-train-DvLcAn1G.js → merge-train-D1I0lNOT.js} +4 -4
  182. package/server/{merge-train-deps-Cl_kcRbO.js → merge-train-deps-D_-C0Pk2.js} +4 -4
  183. package/server/{merge-verification-c9Y9mllw.js → merge-verification-DN1Ov9bU.js} +6 -6
  184. package/server/{merged-docker-cleanup-worker-CGiDOdv8.js → merged-docker-cleanup-worker-CfXSr2pA.js} +4 -4
  185. package/server/{merged-docker-cleanup-worker-DgsLOx3E.js → merged-docker-cleanup-worker-ybsPyHjB.js} +1 -1
  186. package/server/{multipart-parser-D0twwRjz.js → multipart-parser-CL5QG8iv.js} +2 -2
  187. package/server/{no-resume-mode-DZvP0M_S.js → no-resume-mode-DUR7Hi98.js} +1 -1
  188. package/server/node_modules/.package-lock.json +7 -7
  189. package/server/node_modules/brace-expansion/README.md +23 -1
  190. package/server/node_modules/brace-expansion/index.js +206 -85
  191. package/server/node_modules/brace-expansion/package.json +1 -1
  192. package/server/node_modules/msgpackr/dist/index-no-eval.cjs +34 -28
  193. package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
  194. package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
  195. package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
  196. package/server/node_modules/msgpackr/dist/index.js +34 -28
  197. package/server/node_modules/msgpackr/dist/index.js.map +1 -1
  198. package/server/node_modules/msgpackr/dist/index.min.js +1 -1
  199. package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
  200. package/server/node_modules/msgpackr/dist/node.cjs +36 -29
  201. package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
  202. package/server/node_modules/msgpackr/dist/test.js +63 -32
  203. package/server/node_modules/msgpackr/dist/test.js.map +1 -1
  204. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +34 -28
  205. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
  206. package/server/node_modules/msgpackr/package.json +1 -1
  207. package/server/node_modules/msgpackr/unpack.js +34 -28
  208. package/server/{orphan-proposed-reconciler-6r2OEfYd.js → orphan-proposed-reconciler-CEW1maPl.js} +1 -1
  209. package/server/{orphan-proposed-reconciler-DtQP6oE_.js → orphan-proposed-reconciler-DfqHZftT.js} +23 -22
  210. package/server/package-lock.json +8 -8
  211. package/server/package.json +1 -1
  212. package/server/{pan-dir-DAOb1V2-.js → pan-dir-DhgKfO86.js} +21 -6
  213. package/server/{paths-DuATV5iE.js → paths-BUuhi6jM.js} +17 -17
  214. package/server/{pending-lifecycle-claim-DQUHIDfX.js → pending-lifecycle-claim-DJlA1rTR.js} +2 -2
  215. package/server/{persistent-logger-CBj016pT.js → persistent-logger-s8cbpFNV.js} +2 -2
  216. package/server/{pickup-zXZl5lQI.js → pickup-2AxtB3dW.js} +1 -1
  217. package/server/{pipeline-membership-DHOXmvba.js → pipeline-membership-2_okL5bm.js} +1 -1
  218. package/server/{pipeline-membership-B2yUcBz7.js → pipeline-membership-Dqv6_0ig.js} +1 -1
  219. package/server/{pipeline-membership-gather-OkLXuvxR.js → pipeline-membership-gather-4F1-tXKI.js} +1 -1
  220. package/server/{pipeline-membership-gather-BIcJ-N0W.js → pipeline-membership-gather-CtJ_7aGf.js} +149 -17
  221. package/server/{pipeline-notifier-BmwrVKsO.js → pipeline-notifier-CO9rxJgB.js} +1 -1
  222. package/server/{pipeline-notifier-CxMes51i.js → pipeline-notifier-DDfVBJhJ.js} +2 -2
  223. package/server/{post-merge-lifecycle-worker-3u_rA4R0.js → post-merge-lifecycle-worker-DmSOkeNp.js} +3 -3
  224. package/server/{project-pipelines-C3SPFJ38.js → project-pipelines-72WE8GVK.js} +2 -2
  225. package/server/{project-repos-BOpBzkO6.js → project-repos-BAqDwtvi.js} +16 -11
  226. package/server/project-repos-Df90Zw7Y.js +3 -0
  227. package/server/projects-WqMWCdpa.js +3 -0
  228. package/server/{prompts-B0TtboFm.js → prompts-XkL10m8M.js} +2 -2
  229. package/server/{providers-O2smCvSz.js → providers-ClGPGkQ8.js} +15 -12
  230. package/server/providers-DFUOed8u.js +3 -0
  231. package/server/public/assets/{chunk-BO2N2NFS-D_pGACYN.js → chunk-BO2N2NFS-CeQUdPxr.js} +4 -4
  232. package/server/public/assets/{diagram-OG6HWLK6-BO6fe3hH.js → diagram-OG6HWLK6-B7rgk4yT.js} +1 -1
  233. package/server/public/assets/{dist-5zingMiA.js → dist-2RPazfXY.js} +3 -3
  234. package/server/public/assets/{dist-CVxhbI2E.js → dist-B9NInrVZ.js} +1 -1
  235. package/server/public/assets/{ganttDiagram-6RSMTGT7-Bgj4A7kp.js → ganttDiagram-6RSMTGT7-Bxp0gV14.js} +1 -1
  236. package/server/public/assets/{highlighted-body-OFNGDK62-DNPK7_cm.js → highlighted-body-OFNGDK62-CzoRTVlC.js} +1 -1
  237. package/server/public/assets/index-Cml-kHo6.css +1 -0
  238. package/server/public/assets/{index-DEpY-D1O.js → index-CvN8cEgs.js} +216 -215
  239. package/server/public/assets/{linear-BB0jQT16.js → linear-CFEEl3ND.js} +1 -1
  240. package/server/public/assets/mermaid-GHXKKRXX-CpV7nCBM.js +1 -0
  241. package/server/public/assets/{pieDiagram-4H26LBE5-DeGIzzpZ.js → pieDiagram-4H26LBE5-BeR8R0cr.js} +1 -1
  242. package/server/public/assets/{prod-XBLvikex.js → prod-CYjzjCrn.js} +4 -4
  243. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BV9SLeWz.js → quadrantDiagram-W4KKPZXB-BpcTkFuW.js} +1 -1
  244. package/server/public/assets/{sankeyDiagram-5OEKKPKP-Dwja0gj8.js → sankeyDiagram-5OEKKPKP-Bx2ETEV5.js} +1 -1
  245. package/server/public/assets/{xychartDiagram-2RQKCTM6-DCB4qvfw.js → xychartDiagram-2RQKCTM6-BKgEAFaj.js} +1 -1
  246. package/server/public/index.html +2 -2
  247. package/server/{pull-requests-BonZ4WVG.js → pull-requests-B-KrUph5.js} +3 -3
  248. package/server/{pull-requests-DNcJUVWA.js → pull-requests-DK5k92B4.js} +1 -1
  249. package/server/{queries-DCX27GRr.js → queries-DVpl1vsU.js} +1212 -193
  250. package/server/{rally-Cxe7lKYX.js → rally-DbE561hD.js} +3 -3
  251. package/server/rally-O_st_X7n.js +3 -0
  252. package/server/{rally-api-CzkKenoi.js → rally-api-CZLeEd2C.js} +2 -2
  253. package/server/{rally-api-Cp50exEi.js → rally-api-DaHtn5QN.js} +1 -1
  254. package/server/{rally-client-Bu3Cekkw.js → rally-client-C-MAl8ur.js} +1 -1
  255. package/server/{rally-client-CyBBEDHu.js → rally-client-Ch3zRsBX.js} +5 -5
  256. package/server/{reap-terminal-sessions-CtAhr6L0.js → reap-terminal-sessions-C1n0ALRb.js} +2 -2
  257. package/server/{reap-terminal-sessions-DvFqQUnq.js → reap-terminal-sessions-DegFS2p1.js} +2 -2
  258. package/server/{rebuild-stack-hCQtprWC.js → rebuild-stack-C9Li44A3.js} +20 -10
  259. package/server/{rebuild-stack-BKYpIPDL.js → rebuild-stack-qC0jCNm6.js} +2 -2
  260. package/server/{reconstruct-cache-CF2avArx.js → reconstruct-cache-BHyiAg02.js} +7 -7
  261. package/server/record-aVzu-LGm.js +3 -0
  262. package/server/record-update-CZh46a2f.js +617 -0
  263. package/server/{record-update-DhI7eySG.js → record-update-DtdJK2Iw.js} +1 -1
  264. package/server/recovery-trip-CSNWSLDn.js +77 -0
  265. package/server/recovery-trip-_16hFKv4.js +3 -0
  266. package/server/{release-engine-_eO3VFth.js → release-engine-Be5MX5GP.js} +5 -5
  267. package/server/{release-set-vxgZwwZV.js → release-set-DJv_O6PS.js} +3 -3
  268. package/server/{remote-BienmcrZ.js → remote-BMM3uH2J.js} +3 -3
  269. package/server/{remote-CVPCc7Vy.js → remote-C0xVTHA5.js} +3 -3
  270. package/server/{remote-agents-kwsEZvXu.js → remote-agents-BIIoc5pD.js} +1 -1
  271. package/server/{remote-agents-kxraOCGT.js → remote-agents-EUiZ26bj.js} +7 -7
  272. package/server/{remote-completion-BtmZ42aP.js → remote-completion-BS4tJUn8.js} +13 -13
  273. package/server/resolver-BvHd6RE4.js +163 -0
  274. package/server/resume-9thEqAQR.js +3 -0
  275. package/server/{review-agent-CIRr0yYt.js → review-agent-BHGaBoBu.js} +29 -29
  276. package/server/{review-agent-UpAM4DmT.js → review-agent-CD3RQ-tc.js} +1 -1
  277. package/server/{review-artifacts-BCODM9ww.js → review-artifacts-DyhajWso.js} +6 -6
  278. package/server/{review-context-BBsNrDri.js → review-context-B-dlsPnx.js} +9 -9
  279. package/server/{review-convoy-liveness-l06_LYCt.js → review-convoy-liveness-D7M-s_nS.js} +2 -2
  280. package/server/{review-status-CacDM78F.js → review-status-B6wYcOtP.js} +1 -1
  281. package/server/{review-status-CwhA9wmd.js → review-status-CKLk5aZ-.js} +306 -59
  282. package/server/{review-status-emit-BPJwYcRy.js → review-status-emit-CJ7UmEVU.js} +3 -3
  283. package/server/{review-status-enrichment-DvyZAbGR.js → review-status-enrichment-DJRgGX7-.js} +3 -3
  284. package/server/review-status-limits-4EJDCGHO.js +7 -0
  285. package/server/{review-status-source-DWnFE0b6.js → review-status-source-7nU3Z2wL.js} +1 -1
  286. package/server/{review-status-source-B70ekARK.js → review-status-source-BsDYGfyv.js} +1 -1
  287. package/server/{review-status-sync-B0IS6Beh.js → review-status-sync-BLssMTEW.js} +1 -1
  288. package/server/{review-status-sync-h2CJX6ju.js → review-status-sync-BxBeHRde.js} +35 -11
  289. package/server/{review-verdict-feedback-yrrmgps_.js → review-verdict-feedback-5jWuzgpc.js} +22 -10
  290. package/server/{review-verdict-feedback-qRohbFG2.js → review-verdict-feedback-HRY9P4bN.js} +1 -1
  291. package/server/{rollup-CUoav0Op.js → rollup-BGIrCEkU.js} +79 -44
  292. package/server/rollup-CZB4UL9q.js +3 -0
  293. package/server/{scanner-ChURu_b-.js → scanner-DydjXPrz.js} +16 -9
  294. package/server/search-DdtIjAiu.js +395 -0
  295. package/server/{sequence-io-D9ITDxzq.js → sequence-io-Fw-cLyDs.js} +4 -4
  296. package/server/{sequencer-agent-m7gmaakW.js → sequencer-agent-BcpGMt5x.js} +15 -10
  297. package/server/server.js +1258 -438
  298. package/server/{service-BzFG0Us_.js → service-BFFkGsG4.js} +58 -58
  299. package/server/{session-fork-KBq4HIHF.js → session-fork-D0V-3e5P.js} +2 -2
  300. package/server/{session-history-C_EMhIIF.js → session-history-Bta5l9jY.js} +5 -5
  301. package/server/{settings-DejgzzLs.js → settings-Ce8B1daF.js} +2 -2
  302. package/server/{settings-BLbcDqUp.js → settings-E3FnEIUx.js} +3 -3
  303. package/server/settings-eOOJpxi_.js +2 -0
  304. package/server/{shadow-engineering-D8R9I8Yl.js → shadow-engineering-Mt9nJO4i.js} +3 -3
  305. package/server/{shadow-state-C0Af4clN.js → shadow-state-Bzj_AZCV.js} +1 -1
  306. package/server/{shadow-state-fzIqIMDD.js → shadow-state-DrkhoVSx.js} +2 -2
  307. package/server/{shadow-utils-Ugca_9ND.js → shadow-utils-H1GfqP06.js} +2 -2
  308. package/server/{ship-log-VAv-lHrF.js → ship-log-CFUIo4PR.js} +1 -1
  309. package/server/{smart-compaction-BcYY_Suf.js → smart-compaction-DSTq-Wua.js} +1 -1
  310. package/server/{smart-compaction-B2Xu5XEb.js → smart-compaction-Hzp3KCJX.js} +7 -7
  311. package/server/{spawn-planning-session-Dsv-350T.js → spawn-planning-session-C0uSA2SL.js} +2 -2
  312. package/server/{spawn-planning-session-DhCoBPct.js → spawn-planning-session-DN4son31.js} +23 -21
  313. package/server/{specialist-completion-z6v3ZqJE.js → specialist-completion-Cf6tpIh1.js} +1 -1
  314. package/server/{specialist-context-CrA5azkJ.js → specialist-context-DEUEkjIQ.js} +5 -5
  315. package/server/{specialist-handoff-logger-CmpZYJMB.js → specialist-handoff-logger-D_LmQDj3.js} +2 -2
  316. package/server/{specialist-logs-BorrIu0x.js → specialist-logs-7Ynue0R7.js} +3 -3
  317. package/server/{specialists-ZdrifiKx.js → specialists-CQwBEGlD.js} +1 -1
  318. package/server/{specialists-2yLmqph9.js → specialists-DAjPgYs_.js} +504 -238
  319. package/server/{specialists-Dfx9_Wzb.js → specialists-Hr6iW9fU.js} +18 -18
  320. package/server/{specialists-CH6ah6D-.js → specialists-MOoeB4A8.js} +1 -1
  321. package/server/specs-Dl88cbKY.js +3 -0
  322. package/server/{src-B948bGVR.js → src-BYdwL_n-.js} +668 -64
  323. package/server/{src-Dm_NV7f6.js → src-DQnkPN2i.js} +3 -3
  324. package/server/{src-B2e5rGu2.js → src-DhfDV0o4.js} +6 -6
  325. package/server/{stack-health-Bf2WdG4E.js → stack-health-D_iKwNRg.js} +107 -16
  326. package/server/stack-health-deVSdDwn.js +3 -0
  327. package/server/{stale-task-claims-D1Ll8fI5.js → stale-task-claims-BYJGqhLI.js} +5 -5
  328. package/server/{staleness-CuED1Psm.js → staleness-CopBDKnA.js} +1 -1
  329. package/server/{staleness-45qZ_a60.js → staleness-D8WeMUHd.js} +1 -1
  330. package/server/{state-home-B4EWfIxF.js → state-home-DjN8qduI.js} +24 -3
  331. package/server/{state-mapping-BEONzr8P.js → state-mapping-DlM7OYRW.js} +1 -1
  332. package/server/{state-migrate-Cd8BH33U.js → state-migrate-a2p1gtD7.js} +4 -4
  333. package/server/state-mirror-Cv_XgvT5.js +121 -0
  334. package/server/{stuck-remediation-ChcooZuk.js → stuck-remediation-CXJX_kki.js} +1 -1
  335. package/server/{stuck-remediation-DmY5UJLg.js → stuck-remediation-CbCRSz1v.js} +31 -732
  336. package/server/{substrate-bug-weights-service-BvTWrFUz.js → substrate-bug-weights-service-DxpopNd9.js} +3 -3
  337. package/server/{summary-fork--Jr8duYh.js → summary-fork-B61fjRJn.js} +2 -2
  338. package/server/{summary-fork-Ct514_Jl.js → summary-fork-B9pszUJN.js} +91 -10
  339. package/server/supervisor/{injection-budget-B3UyEONL.js → injection-budget-Ar7hgyJq.js} +1 -1
  340. package/server/supervisor/pty-supervisor.js +12 -3
  341. package/server/supervisor/{pty-token-CWRffcCa.js → pty-token-CXCFU0Z8.js} +1 -1
  342. package/server/{supervisor-B7BHGcNA.js → supervisor-BvnxbuuF.js} +6 -4
  343. package/server/supervisor-C69kpqvd.js +2 -0
  344. package/server/{swarm-readiness-MNE5O8hn.js → swarm-readiness-vTw1kqGa.js} +3 -3
  345. package/server/{system-prerequisites-Cin9ZgDx.js → system-prerequisites-LLzTEqsK.js} +3 -3
  346. package/server/{teardown-workspace-CvBpvc85.js → teardown-workspace-CqKKVJr1.js} +15 -15
  347. package/server/{test-agent-queue-DmSIqays.js → test-agent-queue-CWMq7oyG.js} +8 -7
  348. package/server/{test-verdict-BieVDAV1.js → test-verdict-NdtgRBuA.js} +1 -1
  349. package/server/{test-verdict-Cy2jJGTe.js → test-verdict-diIWE6hz.js} +15 -3
  350. package/server/{tldr-daemon-Ca0eovh3.js → tldr-daemon-B1Jhrtc8.js} +1 -1
  351. package/server/{tldr-daemon-IOssGwg7.js → tldr-daemon-Bpls1CJB.js} +2 -2
  352. package/server/{tmux-CfDHob9M.js → tmux-CImZaX4q.js} +10 -16
  353. package/server/tmux-Cjpx8L8u.js +4 -0
  354. package/server/{token-B10VFNOD.js → token-Bgpjo3tE.js} +2 -2
  355. package/server/token-util-BsjFll-k.js +3 -0
  356. package/server/{token-util-CZ8WPtdk.js → token-util-BymbpkJp.js} +1 -1
  357. package/server/{tracker-config-CHbrjg6m.js → tracker-config-4DaKVTfc.js} +2 -2
  358. package/server/{tracker-utils-DZZq_C0R.js → tracker-utils-BDeAXC-q.js} +2 -2
  359. package/server/{traefik-connect-GHomyBaD.js → traefik-connect-CC5FyxYj.js} +1 -1
  360. package/server/{tunnel-Dz7y434T.js → tunnel-CDWkeceJ.js} +1 -1
  361. package/server/{tunnel-Bdyb-sNq.js → tunnel-CPf5M-Pc.js} +3 -3
  362. package/server/{typed-errors-Bn_2WRU7.js → typed-errors-9K7Dq_Vn.js} +1 -1
  363. package/server/{typed-errors-BR_RmPS_.js → typed-errors-DrS5fb5z.js} +1 -1
  364. package/server/{types-D2ETIB8T.js → types-DzlUKiuf.js} +4 -3
  365. package/server/{types-Dh6RI5Vj.js → types-kI9ik8XO.js} +1 -1
  366. package/server/{uat-promote-verification-DyvQXvIn.js → uat-promote-verification-c_pxoxEc.js} +5 -5
  367. package/server/{uat-train-Dv0Bxer7.js → uat-train-CWGxBdJO.js} +0 -0
  368. package/server/{uat-train-diX_7shd.js → uat-train-CfCYd2ve.js} +1 -1
  369. package/server/{validate-606KcYZC.js → validate-f3ItVCfm.js} +3 -3
  370. package/server/{validation-Cf7aaV5A.js → validation-5G_wQtea.js} +1 -1
  371. package/server/{validation-CnrDul1x.js → validation-7tSiCM82.js} +4 -4
  372. package/server/{verification-artifact-GOaj8u2s.js → verification-artifact-9h9dH8uX.js} +1 -1
  373. package/server/{verification-artifact-D4b-bio9.js → verification-artifact-C_4WJnf6.js} +1 -1
  374. package/server/{verification-runner-DiPaUP-C.js → verification-runner-BV5F6wrA.js} +1 -1
  375. package/server/{verification-runner-B5MVxDvU.js → verification-runner-D58KmBhK.js} +18 -38
  376. package/server/{vtt-parser-CMU5EZ5R.js → vtt-parser-2iT9OHa9.js} +1 -1
  377. package/server/{work-agent-prompt-Csb3fbVR.js → work-agent-prompt-D03s4DD1.js} +9 -9
  378. package/server/{workflows-D87ajwV6.js → workflows-BMBwLYPV.js} +281 -98
  379. package/server/workflows-BOmWGpIh.js +2 -0
  380. package/server/{workspace-iD8oULqu.js → workspace-BgflNCH0.js} +3 -3
  381. package/server/{workspace-AIOM7n00.js → workspace-Cn9ywfSW.js} +1 -1
  382. package/server/{workspace-anchor-drift-19cJ1bH5.js → workspace-anchor-drift-C8Fy3shi.js} +1 -1
  383. package/server/{workspace-anchor-drift-C3mK5wNI.js → workspace-anchor-drift-CMiNncwq.js} +5 -8
  384. package/server/{workspace-config-CJ7RqQiP.js → workspace-config-aUc2nIz6.js} +1 -1
  385. package/server/{workspace-manager-CXfrw4rR.js → workspace-manager-Bem7ZBs9.js} +521 -292
  386. package/server/workspace-manager-C0CpNh3t.js +3 -0
  387. package/server/{workspace-metadata-BuMRco5P.js → workspace-metadata-C5iSlPRo.js} +1 -1
  388. package/server/{workspace-metadata-eHSj_NsP.js → workspace-metadata-UKmTYmDQ.js} +2 -2
  389. package/server/{workspaces-DbtMX2TM.js → workspaces-DqxgwDZ8.js} +143 -113
  390. package/sync-sources/hooks/notification-hook +12 -1
  391. package/sync-sources/hooks/pan-hook-lib.sh +226 -0
  392. package/sync-sources/hooks/session-start-hook +31 -4
  393. package/sync-sources/hooks/work-agent-stop-hook +23 -1
  394. package/sync-sources/skills/pan-memory/SKILL.md +19 -3
  395. package/sync-sources/skills/pan-projects/SKILL.md +9 -0
  396. package/sync-sources/skills/pan-restart/SKILL.md +26 -7
  397. package/sync-sources/skills/pan-workspace/SKILL.md +77 -0
  398. package/server/activity-logger-CMthG6Vd.js +0 -3
  399. package/server/agent-state-DyZJia9f.js +0 -3
  400. package/server/agents-Dnn4XgdB.js +0 -3
  401. package/server/archive-planning-BHCd_eL5.js +0 -2
  402. package/server/cli-D6mRfUE6.js +0 -3
  403. package/server/deacon-swarm-BkKR7SXu.js +0 -2
  404. package/server/delivery-C2M73sBg.js +0 -3
  405. package/server/dist-qcf9gAP0.js +0 -3
  406. package/server/event-store-5UKzh9Jf.js +0 -3
  407. package/server/forge-D647IMNa.js +0 -3
  408. package/server/fts-db-wROfFfje.js +0 -146
  409. package/server/hume-DtWN8oV5.js +0 -3
  410. package/server/inspect-agent-CPqXI81t.js +0 -2
  411. package/server/merge-ops-7QqziXAh.js +0 -2
  412. package/server/merge-rebase-B4pgzvQJ.js +0 -2
  413. package/server/node_modules/brace-expansion/.tap/coverage/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -757
  414. package/server/node_modules/brace-expansion/.tap/processinfo/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -719
  415. package/server/node_modules/brace-expansion/ADVISORY-CVE-2026-14257.md +0 -107
  416. package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts +0 -8
  417. package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +0 -1
  418. package/server/node_modules/brace-expansion/dist/commonjs/index.js +0 -263
  419. package/server/node_modules/brace-expansion/dist/commonjs/index.js.map +0 -1
  420. package/server/node_modules/brace-expansion/dist/commonjs/package.json +0 -3
  421. package/server/node_modules/brace-expansion/dist/esm/index.d.ts +0 -8
  422. package/server/node_modules/brace-expansion/dist/esm/index.d.ts.map +0 -1
  423. package/server/node_modules/brace-expansion/dist/esm/index.js +0 -259
  424. package/server/node_modules/brace-expansion/dist/esm/index.js.map +0 -1
  425. package/server/node_modules/brace-expansion/dist/esm/package.json +0 -3
  426. package/server/project-repos-BgW4lcIa.js +0 -3
  427. package/server/projects-_n3Zui6K.js +0 -3
  428. package/server/providers-BI1mOBQ4.js +0 -3
  429. package/server/public/assets/index-Ddkcz3WT.css +0 -1
  430. package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +0 -1
  431. package/server/rally-x6ztTQo4.js +0 -3
  432. package/server/record-BTwWhtBb.js +0 -3
  433. package/server/record-update-DaOKS7Wb.js +0 -277
  434. package/server/recovery-trip-D-wM9EfB.js +0 -44
  435. package/server/resume-DXIIfJNk.js +0 -3
  436. package/server/rollup-DxCjJaAM.js +0 -3
  437. package/server/settings-9jSGHBPY.js +0 -2
  438. package/server/specs-DKV3jIEs.js +0 -3
  439. package/server/stack-health-CoWAhA99.js +0 -3
  440. package/server/supervisor-CyR_mW5B.js +0 -2
  441. package/server/tmux-Ctk6RV5l.js +0 -3
  442. package/server/token-util-CrfQ2FKf.js +0 -3
  443. package/server/workflows-DN6NyVGd.js +0 -2
  444. package/server/workspace-manager-B38rFWA1.js +0 -3
@@ -1,18 +1,20 @@
1
- import { Ft as markRecordPipelineClosedOutSync, Gr as OVERDECK_HOME, Lt as readIssueRecord, Nt as getProjectConfigFromWorkspacePath, Pt as init_record, Vt as resolveProjectForIssue, Wt as writeCloseOutDodGate, gr as init_issue_id, hr as extractPrefixSync, li as init_paths, mr as extractNumberSync } from "./config-yaml-CxdwhAIA.js";
2
- import { D as resolvePipelineTelemetryContext, E as init_pipeline, p as init_review_status, u as getReviewStatus, w as capturePipelineStage } from "./review-status-CwhA9wmd.js";
3
- import { b as init_agents, i as listRunningAgents } from "./queries-DCX27GRr.js";
4
- import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-DhswNiXx.js";
5
- import { f as init_config, s as getDashboardApiUrlSync } from "./config-CX4vk1CV.js";
6
- import { i as loadCloisterConfig, r as init_config$1 } from "./config-ktAVnp4s.js";
7
- import { r as getAutoCloseOutCanonicalState, t as pruneStoppedAgentsForIssue } from "./agent-gc-BMcgTDl7.js";
8
- import { i as isTrackerIssueClosed, n as init_issue_closed } from "./issue-closed-CNNGbhWm.js";
9
- import { i as findWorkspacePath, t as archivePlanning } from "./archive-planning-Binfb99i.js";
10
- import { a as stepSkipped, i as stepOk, n as init_types, r as stepFailed, t as getLinearApiKey } from "./types-Dh6RI5Vj.js";
11
- import { i as gatherIssueBranchContainment, s as init_pipeline_membership_gather } from "./pipeline-membership-gather-BIcJ-N0W.js";
12
- import { t as closeIssue } from "./close-issue-BX1bATJy.js";
13
- import { o as init_pull_requests, r as fetchIssuePullRequest, t as fetchCommitCheckRuns } from "./pull-requests-BonZ4WVG.js";
14
- import { a as canAcceptDodMisses, i as buildAbandonedDodGate, n as DOD_ROWS, r as acceptFlagFor, t as BRANCH_ABSENT_MERGE_ERROR } from "./dod-Bg6wsKTV.js";
15
- import { t as teardownWorkspace } from "./teardown-workspace-CvBpvc85.js";
1
+ import { J as markRecordPipelineClosedOutSync, K as getProjectConfigFromWorkspacePath, Mn as extractPrefixSync, Nn as init_issue_id, X as readIssueRecord, Zr as OVERDECK_HOME, et as resolveProjectForIssue, hi as init_paths, jn as extractNumberSync, q as init_record, rt as writeCloseOutDodGate } from "./config-yaml-BSCqwmX0.js";
2
+ import { f as init_config, s as getDashboardApiUrlSync } from "./config-DnLJATZk.js";
3
+ import { D as resolvePipelineTelemetryContext, E as init_pipeline, p as init_review_status, u as getReviewStatus, w as capturePipelineStage } from "./review-status-CKLk5aZ-.js";
4
+ import { b as init_agents, i as listRunningAgents } from "./queries-DVpl1vsU.js";
5
+ import { c as resolveProjectReposForIssueSync, i as init_project_repos } from "./project-repos-BAqDwtvi.js";
6
+ import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-DWGBKyWd.js";
7
+ import { i as loadCloisterConfig, r as init_config$1 } from "./config-DvM8jtQK.js";
8
+ import { r as getAutoCloseOutCanonicalState, t as pruneStoppedAgentsForIssue } from "./agent-gc-BmYeT6eH.js";
9
+ import { i as isTrackerIssueClosed, n as init_issue_closed } from "./issue-closed-Bj_bCv_0.js";
10
+ import { n as getForgeAdapter, r as init_forge } from "./forge-c8LeC-tw.js";
11
+ import { i as findWorkspacePath, t as archivePlanning } from "./archive-planning-Cq7cyinS.js";
12
+ import { a as stepSkipped, i as stepOk, n as init_types, r as stepFailed, t as getLinearApiKey } from "./types-kI9ik8XO.js";
13
+ import { i as gatherIssueBranchContainment, s as init_pipeline_membership_gather } from "./pipeline-membership-gather-CtJ_7aGf.js";
14
+ import { t as closeIssue } from "./close-issue-DPxRddGR.js";
15
+ import { o as init_pull_requests, r as fetchIssuePullRequest, t as fetchCommitCheckRuns } from "./pull-requests-B-KrUph5.js";
16
+ import { a as canAcceptDodMisses, i as buildAbandonedDodGate, n as DOD_ROWS, r as acceptFlagFor, t as BRANCH_ABSENT_MERGE_ERROR } from "./dod-D7-9dCOD.js";
17
+ import { t as teardownWorkspace } from "./teardown-workspace-CqKKVJr1.js";
16
18
  import { resolve } from "node:path";
17
19
  import { Effect } from "effect";
18
20
  import { existsSync } from "fs";
@@ -36,6 +38,8 @@ init_review_status();
36
38
  init_record();
37
39
  init_issue_closed();
38
40
  init_pull_requests();
41
+ init_forge();
42
+ init_project_repos();
39
43
  init_pipeline_membership_gather();
40
44
  const execFileAsync = promisify(execFile);
41
45
  const defaultMergedRowDeps = {
@@ -54,6 +58,14 @@ const defaultMergedRowDeps = {
54
58
  readDurableMerges: async (ctx) => {
55
59
  return (await readIssueRecord(resolveProjectForIssue(ctx.issueId) ?? getProjectConfigFromWorkspacePath(ctx.projectPath), ctx.issueId))?.closeOut.merges ?? [];
56
60
  },
61
+ readMergedForgeArtifacts: async (ctx) => {
62
+ const repos = resolveProjectReposForIssueSync(ctx.issueId)?.filter((repo) => repo.required) ?? [];
63
+ return (await Promise.all(repos.map((repo) => getForgeAdapter(repo.forge).findMergedArtifact({
64
+ sourceBranch: repo.sourceBranch,
65
+ targetBranch: repo.targetBranch,
66
+ cwd: repo.repoPath
67
+ })))).filter((artifact) => artifact !== null);
68
+ },
57
69
  readBranchContainment: async (ctx) => {
58
70
  const project = resolveProjectForIssue(ctx.issueId) ?? getProjectConfigFromWorkspacePath(ctx.projectPath);
59
71
  if (!project) return {
@@ -69,17 +81,33 @@ const defaultPostMergeRowDeps = {
69
81
  readCanonicalState: async (ctx) => {
70
82
  return getAutoCloseOutCanonicalState(ctx.issueId);
71
83
  },
72
- readMergeStatus: async (issueId) => (await Effect.runPromise(getReviewStatus(issueId)))?.mergeStatus,
84
+ readMergeStatus: async (issueId) => (await loadStatus(issueId, defaultDeps))?.status.mergeStatus,
73
85
  listAgents: async () => Effect.runPromise(listRunningAgents())
74
86
  };
75
- const defaultMainVerifyRowDeps = { readCheckRuns: async (ctx, mergeCommit) => {
76
- if (!ctx.github) return {
77
- total: 0,
78
- failed: [],
79
- pending: []
80
- };
81
- return fetchCommitCheckRuns(ctx.github.owner, ctx.github.repo, mergeCommit);
82
- } };
87
+ const defaultMainVerifyRowDeps = {
88
+ readCheckRuns: async (ctx, commit) => {
89
+ if (!ctx.github) return {
90
+ total: 0,
91
+ failed: [],
92
+ pending: []
93
+ };
94
+ return fetchCommitCheckRuns(ctx.github.owner, ctx.github.repo, commit);
95
+ },
96
+ readContainingDefaultBranchCommits: async (ctx, mergeCommit) => {
97
+ const { stdout } = await execFileAsync("git", [
98
+ "rev-list",
99
+ "--ancestry-path",
100
+ "--first-parent",
101
+ `${mergeCommit}..origin/main`
102
+ ], {
103
+ cwd: ctx.projectPath,
104
+ encoding: "utf-8",
105
+ timeout: 1e4,
106
+ maxBuffer: 8 * 1024 * 1024
107
+ });
108
+ return stdout.split("\n").map((line) => line.trim()).filter(Boolean);
109
+ }
110
+ };
83
111
  const defaultEvaluateDodGateDeps = {
84
112
  review: (issueId, settlement) => checkReviewRow(issueId, defaultDeps, settlement),
85
113
  tests: (issueId, settlement) => checkTestsRow(issueId, defaultDeps, settlement),
@@ -238,11 +266,24 @@ async function checkMergedRow(ctx, deps = defaultMergedRowDeps) {
238
266
  const merged = result("merged", verified.success || verified.skipped ? "pass" : "miss", observed);
239
267
  const branchAbsent = verified.error === BRANCH_ABSENT_MERGE_ERROR;
240
268
  let durableMerges = [];
241
- if (branchAbsent) try {
242
- durableMerges = await (deps.readDurableMerges ?? defaultMergedRowDeps.readDurableMerges)(ctx);
243
- } catch (error) {
244
- const message = error instanceof Error ? error.message : String(error);
245
- merged.observed = `${merged.observed}; durable merge evidence unavailable: ${message}`;
269
+ let forgeArtifacts = [];
270
+ if (branchAbsent) {
271
+ try {
272
+ durableMerges = await (deps.readDurableMerges ?? defaultMergedRowDeps.readDurableMerges)(ctx);
273
+ } catch (error) {
274
+ const message = error instanceof Error ? error.message : String(error);
275
+ merged.observed = `${merged.observed}; durable merge evidence unavailable: ${message}`;
276
+ }
277
+ if (!ctx.github && deps.readMergedForgeArtifacts) try {
278
+ forgeArtifacts = await deps.readMergedForgeArtifacts(ctx);
279
+ const labels = forgeArtifacts.map((artifact) => {
280
+ return `${artifact.forge === "gitlab" ? artifact.id ? `MR !${artifact.id}` : "GitLab MR" : artifact.id ? `PR #${artifact.id}` : "GitHub PR"} merged${artifact.url ? ` (${artifact.url})` : ""}`;
281
+ });
282
+ if (labels.length > 0) merged.observed = `${merged.observed}; ${labels.join("; ")}`;
283
+ } catch (error) {
284
+ const message = error instanceof Error ? error.message : String(error);
285
+ merged.observed = `${merged.observed}; forge artifact evidence unavailable: ${message}`;
286
+ }
246
287
  }
247
288
  let pullRequestState;
248
289
  if (ctx.github) try {
@@ -261,7 +302,7 @@ async function checkMergedRow(ctx, deps = defaultMergedRowDeps) {
261
302
  }
262
303
  if (branchAbsent) {
263
304
  const forgeMerged = pullRequestState?.toUpperCase() === "MERGED";
264
- if (durableMerges.length > 0 || forgeMerged) {
305
+ if (durableMerges.length > 0 || forgeMerged || forgeArtifacts.length > 0) {
265
306
  merged.status = "pass";
266
307
  if (durableMerges.length > 0) merged.observed = `${merged.observed}; durable close-out record contains ${durableMerges.length} merge artifact(s)`;
267
308
  } else merged.observed = `${merged.observed}; no merged forge artifact or durable close-out merge record found`;
@@ -297,13 +338,65 @@ async function checkPostMergeRow(ctx, merged, deps = defaultPostMergeRowDeps) {
297
338
  return result("post-merge", "miss", `post-merge evidence unavailable: ${error instanceof Error ? error.message : String(error)}`);
298
339
  }
299
340
  }
341
+ /**
342
+ * PAN-3202: how many default-branch heads above the merge commit are probed for
343
+ * the later-green-run evidence form. The tip of main is often mid-CI, so a single
344
+ * candidate would usually read as pending; five reaches back far enough to find
345
+ * the newest concluded green head without turning one row into a check-run storm.
346
+ */
347
+ const LATER_GREEN_CANDIDATE_LIMIT = 5;
348
+ /**
349
+ * PAN-3202: the fallback evidence form for DoD row 6. When a merge lands inside a
350
+ * red-main window, the merge commit's own check-runs can never turn green, so the
351
+ * row was permanently unsatisfiable even after main went green hundreds of times
352
+ * with the commit included. A later default-branch head whose check-runs all
353
+ * concluded green, and which contains the merge commit, is strictly stronger
354
+ * evidence than the original run: it proves main is healthy *with* the merge in it,
355
+ * which is exactly what "verified on main" means. Row 7 (deploy) already reasons
356
+ * this way through the same containment relation.
357
+ */
358
+ async function findLaterGreenDefaultBranchRun(ctx, mergeCommit, deps) {
359
+ const readCandidates = deps.readContainingDefaultBranchCommits ?? defaultMainVerifyRowDeps.readContainingDefaultBranchCommits;
360
+ let candidates;
361
+ try {
362
+ candidates = await readCandidates(ctx, mergeCommit);
363
+ } catch (error) {
364
+ return {
365
+ run: null,
366
+ note: `later-run evidence unavailable: ${error instanceof Error ? error.message : String(error)}`
367
+ };
368
+ }
369
+ const probed = candidates.slice(0, LATER_GREEN_CANDIDATE_LIMIT);
370
+ for (const sha of probed) try {
371
+ const checks = await deps.readCheckRuns(ctx, sha);
372
+ if (checks.total > 0 && checks.failed.length === 0 && checks.pending.length === 0) return {
373
+ run: {
374
+ sha,
375
+ total: checks.total
376
+ },
377
+ note: ""
378
+ };
379
+ } catch (error) {
380
+ return {
381
+ run: null,
382
+ note: `later-run evidence unavailable: ${error instanceof Error ? error.message : String(error)}`
383
+ };
384
+ }
385
+ return {
386
+ run: null,
387
+ note: probed.length === 0 ? "no later default-branch commit contains the merge" : `no green CI run among the ${probed.length} newest default-branch commit(s) containing the merge`
388
+ };
389
+ }
300
390
  async function checkMainVerifyRow(ctx, mergeCommit, deps = defaultMainVerifyRowDeps) {
301
391
  if (!ctx.github || !mergeCommit) return result("main-verify", "skip", "no merge commit resolvable — verified-on-main has no durable marker (see DoD row 6)");
302
392
  try {
303
393
  const checks = await deps.readCheckRuns(ctx, mergeCommit);
304
- if (checks.total === 0) return result("main-verify", "skip", `no CI check-runs on merge commit ${mergeCommit}`);
305
- if (checks.failed.length > 0 || checks.pending.length > 0) return result("main-verify", "miss", `${[...checks.failed.length > 0 ? [`failed checks: ${checks.failed.join(", ")}`] : [], ...checks.pending.length > 0 ? [`still running: ${checks.pending.join(", ")}`] : []].join("; ")} on ${mergeCommit}`);
306
- return result("main-verify", "pass", `${checks.total} check-runs concluded successfully on ${mergeCommit}`);
394
+ if (checks.total > 0 && checks.failed.length === 0 && checks.pending.length === 0) return result("main-verify", "pass", `${checks.total} check-runs concluded successfully on ${mergeCommit}`);
395
+ const parts = [...checks.failed.length > 0 ? [`failed checks: ${checks.failed.join(", ")}`] : [], ...checks.pending.length > 0 ? [`still running: ${checks.pending.join(", ")}`] : []];
396
+ const primary = checks.total === 0 ? `no CI check-runs on merge commit ${mergeCommit}` : `${parts.join("; ")} on ${mergeCommit}`;
397
+ const later = await findLaterGreenDefaultBranchRun(ctx, mergeCommit, deps);
398
+ if (later.run) return result("main-verify", "pass", `${primary}; verified on main by later green CI run ${later.run.sha} containing the merge (${later.run.total} check-runs concluded successfully)`);
399
+ return result("main-verify", checks.total === 0 ? "skip" : "miss", `${primary}; ${later.note}`);
307
400
  } catch (error) {
308
401
  return result("main-verify", "miss", `could not read merge-commit check-runs: ${error instanceof Error ? error.message : String(error)}`);
309
402
  }
@@ -385,6 +478,23 @@ async function evaluateDodGate(ctx, opts = {}, deps = defaultEvaluateDodGateDeps
385
478
  passed: rows.every((row) => row.status !== "miss" || Boolean(row.acceptedBy))
386
479
  };
387
480
  }
481
+ /**
482
+ * PAN-3025: completion witness for the close-out ceremony. Returns closedOutAt
483
+ * only when the journal is terminal AND the live row is gone (the ceremony's
484
+ * final mutating step). closedOut with live status present means a prior run
485
+ * aborted mid-ceremony and must fall through to complete it.
486
+ */
487
+ async function readCompletedCloseOut(issueId, projectPath) {
488
+ try {
489
+ const record = await readIssueRecord(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(projectPath), issueId.toUpperCase());
490
+ if (!record?.pipeline.closedOut) return null;
491
+ const live = await Effect.runPromise(getReviewStatus(issueId)).catch(() => "unknown");
492
+ if (live === "unknown") return null;
493
+ return live ? null : record.pipeline.closedOutAt ?? "unknown";
494
+ } catch {
495
+ return null;
496
+ }
497
+ }
388
498
  //#endregion
389
499
  //#region ../../lib/lifecycle/workflows.ts
390
500
  /**
@@ -395,6 +505,8 @@ async function evaluateDodGate(ctx, opts = {}, deps = defaultEvaluateDodGateDeps
395
505
  * closeOut() — Full ceremony: verify-merged + archive + teardown + close + label + clear-status
396
506
  * deepWipe() — Destructive: teardown(deleteBranches) + delete agent state + reset issue
397
507
  */
508
+ init_forge();
509
+ init_project_repos();
398
510
  init_record();
399
511
  init_pipeline();
400
512
  const execAsync = promisify$1(exec$1);
@@ -483,9 +595,14 @@ function closeOut(ctx, opts = {}) {
483
595
  return Effect.gen(function* () {
484
596
  const start = Date.now();
485
597
  const allSteps = [];
598
+ const closedOutAt = yield* Effect.promise(() => readCompletedCloseOut(ctx.issueId, ctx.projectPath).catch(() => null));
599
+ if (closedOutAt) {
600
+ allSteps.push(stepSkipped("close-out:idempotent", [`Issue already closed out at ${closedOutAt} — skipping the Definition-of-Done gate and ceremony`]));
601
+ return buildResult("close-out", ctx.issueId, allSteps, start);
602
+ }
486
603
  const uatEvidenceStep = yield* Effect.promise(async () => {
487
604
  try {
488
- const { healUatPromotionVerification } = await import("./uat-promote-verification-DyvQXvIn.js");
605
+ const { healUatPromotionVerification } = await import("./uat-promote-verification-c_pxoxEc.js");
489
606
  const evidence = await healUatPromotionVerification(ctx.issueId);
490
607
  if (!evidence) return stepSkipped("dod:uat-promotion-evidence", ["No missing UAT-promotion verification evidence found"]);
491
608
  return stepOk("dod:uat-promotion-evidence", [`Recorded verification from ${evidence.generation}`, ...evidence.mergeSha ? [`Promoted to main at ${evidence.mergeSha.slice(0, 9)}`] : []]);
@@ -684,7 +801,7 @@ function cancelIssueWorkflow(ctx, opts = {}) {
684
801
  async function completeXBriefStep(ctx) {
685
802
  const step = "close-out:vbrief-completed";
686
803
  try {
687
- const { transitionXBriefOnMain } = await import("./lifecycle-io-eVG6v_8-.js");
804
+ const { transitionXBriefOnMain } = await import("./lifecycle-io-C5nVk55o.js");
688
805
  const result = await Effect.runPromise(transitionXBriefOnMain(ctx.projectPath, ctx.issueId, "completed", "completed", `scope: complete ${ctx.issueId.toUpperCase()} xBRIEF`));
689
806
  const details = [result.moved ? "Updated xBRIEF lifecycle to completed" : "xBRIEF lifecycle already completed", result.statusUpdated ? "Updated plan.status to completed" : "plan.status already completed"];
690
807
  if (result.committed) details.push("Committed xBRIEF completion on main");
@@ -696,171 +813,237 @@ async function completeXBriefStep(ctx) {
696
813
  return stepFailed(step, `xBRIEF completion failed: ${message}`);
697
814
  }
698
815
  }
816
+ async function verifyRootConventionBranches(ctx, root, issueLower) {
817
+ const featureResult = await verifyConventionBranchMerged(ctx, root);
818
+ if (featureResult?.success) return featureResult;
819
+ const strikeResult = await verifyConventionBranchMerged(ctx, {
820
+ ...root,
821
+ sourceBranch: `strike/${issueLower}`
822
+ });
823
+ if (strikeResult?.success && !strikeResult.skipped) return stepOk("close-out:verify-merged", [...strikeResult.details ?? [], `Superseded ${root.sourceBranch} residual: ${featureResult?.error ?? "Feature branch is absent; positive merge evidence is required"}`]);
824
+ return featureResult;
825
+ }
699
826
  async function verifyBranchMergedImpl(ctx) {
700
827
  const step = "close-out:verify-merged";
701
828
  const issueLower = ctx.issueId.toLowerCase();
702
- const featureBranchName = `feature/${issueLower}`;
703
- const strikeBranchName = `strike/${issueLower}`;
829
+ const defaultRoot = {
830
+ repoKey: issueLower,
831
+ dir: ctx.projectPath,
832
+ sourceBranch: `feature/${issueLower}`,
833
+ targetBranch: "main",
834
+ forge: "github"
835
+ };
704
836
  try {
705
837
  try {
706
- const { loadReviewStatuses } = await import("./review-status-CacDM78F.js");
838
+ const { loadReviewStatuses } = await import("./review-status-B6wYcOtP.js");
707
839
  if (loadReviewStatuses()[ctx.issueId.toUpperCase()]?.mergeStatus === "merged") return stepOk(step, ["Merge specialist confirmed merge completed"]);
708
840
  } catch {}
709
- const featureResult = await verifyConventionBranchMerged(ctx, featureBranchName);
710
- if (featureResult?.success) return featureResult;
711
- const strikeResult = await verifyConventionBranchMerged(ctx, strikeBranchName);
712
- if (strikeResult?.success && !strikeResult.skipped) return stepOk(step, [...strikeResult.details ?? [], `Superseded ${featureBranchName} residual: ${featureResult?.error ?? "Feature branch is absent; positive merge evidence is required"}`]);
713
- if (featureResult) return featureResult;
841
+ const resolvedRoots = resolveProjectReposForIssueSync(ctx.issueId)?.filter((repo) => repo.required).map((repo) => ({
842
+ repoKey: repo.repoKey,
843
+ dir: repo.repoPath,
844
+ sourceBranch: repo.sourceBranch,
845
+ targetBranch: repo.targetBranch,
846
+ forge: repo.forge
847
+ }));
848
+ const roots = resolvedRoots?.length ? resolvedRoots : [defaultRoot];
849
+ if (roots.length === 1) return await verifyRootConventionBranches(ctx, roots[0], issueLower) ?? stepFailed(step, "Feature branch is absent; positive merge evidence is required");
850
+ const results = await Promise.all(roots.map(async (root) => ({
851
+ root,
852
+ result: await verifyRootConventionBranches(ctx, root, issueLower)
853
+ })));
854
+ const failures = results.filter(({ result }) => result && !result.success);
855
+ if (failures.length > 0) return stepFailed(step, failures.map(({ root, result }) => `${root.repoKey}: ${result?.error}`).join("; "));
856
+ const successes = results.filter(({ result }) => result?.success);
857
+ if (successes.length > 0) return stepOk(step, successes.flatMap(({ root, result }) => (result?.details ?? []).map((detail) => `${root.repoKey}: ${detail}`)));
714
858
  return stepFailed(step, BRANCH_ABSENT_MERGE_ERROR);
715
859
  } catch (err) {
716
860
  return stepFailed(step, `Could not verify merge: ${err.message}`);
717
861
  }
718
862
  }
719
- async function verifyConventionBranchMerged(ctx, branchName) {
863
+ async function verifyConventionBranchMerged(ctx, root) {
720
864
  const step = "close-out:verify-merged";
721
- const { stdout: branchExists } = await execAsync(`git branch --list "${branchName}" 2>/dev/null || true`, {
722
- cwd: ctx.projectPath,
865
+ const gitlabLookup = { attempted: false };
866
+ const { stdout: branchExists } = await execAsync(`git branch --list "${root.sourceBranch}" 2>/dev/null || true`, {
867
+ cwd: root.dir,
723
868
  encoding: "utf-8"
724
869
  });
725
870
  if (branchExists.trim()) try {
726
- await execAsync(`git merge-base --is-ancestor ${branchName} main`, {
727
- cwd: ctx.projectPath,
871
+ await execAsync(`git merge-base --is-ancestor ${root.sourceBranch} ${root.targetBranch}`, {
872
+ cwd: root.dir,
728
873
  encoding: "utf-8"
729
874
  });
730
- const remoteCheck = await verifyRemoteBranchIfPresent(ctx, branchName);
875
+ const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
731
876
  if (remoteCheck && !remoteCheck.success) return remoteCheck;
732
877
  return stepOk(step, ["All commits merged to main", ...remoteCheck?.details ?? []]);
733
878
  } catch {
879
+ const gitlabMerged = await verifySquashMergedMrByBranch(root, root.sourceBranch, gitlabLookup);
880
+ if (gitlabMerged) {
881
+ const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
882
+ if (remoteCheck && !remoteCheck.success) return remoteCheck;
883
+ return stepOk(step, [...gitlabMerged.result.details ?? [], ...remoteCheck?.details ?? []]);
884
+ }
734
885
  try {
735
- const { stdout: codeDiff } = await execAsync(`git diff main...${branchName} -- ':!.planning' ':!docs/prds' ':!.overdeck/prompts' 2>/dev/null || true`, {
736
- cwd: ctx.projectPath,
886
+ const { stdout: codeDiff } = await execAsync(`git diff ${root.targetBranch}...${root.sourceBranch} -- ':!.planning' ':!docs/prds' ':!.overdeck/prompts' 2>/dev/null || true`, {
887
+ cwd: root.dir,
737
888
  encoding: "utf-8"
738
889
  });
739
890
  if (!codeDiff.trim()) {
740
- const remoteCheck = await verifyRemoteBranchIfPresent(ctx, branchName);
891
+ const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
741
892
  if (remoteCheck && !remoteCheck.success) return remoteCheck;
742
893
  return stepOk(step, ["Code changes squash-merged to main (only planning artifacts remain on branch)", ...remoteCheck?.details ?? []]);
743
894
  }
744
895
  } catch {}
745
- const githubMerged = await verifySquashMergedPrByBranch(ctx, branchName, branchName);
896
+ const githubMerged = root.forge === "github" ? await verifySquashMergedPrByBranch(ctx, root, root.sourceBranch) : null;
746
897
  if (githubMerged?.success) {
747
- const remoteCheck = await verifyRemoteBranchIfPresent(ctx, branchName);
898
+ const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
748
899
  if (remoteCheck && !remoteCheck.success) return remoteCheck;
749
900
  return stepOk(step, [...githubMerged.details ?? [], ...remoteCheck?.details ?? []]);
750
901
  }
751
902
  if (githubMerged) return githubMerged;
752
- const { stdout: unmerged } = await execAsync(`git log main..${branchName} --oneline 2>/dev/null || true`, {
753
- cwd: ctx.projectPath,
903
+ const { stdout: unmerged } = await execAsync(`git log ${root.targetBranch}..${root.sourceBranch} --oneline 2>/dev/null || true`, {
904
+ cwd: root.dir,
754
905
  encoding: "utf-8"
755
906
  });
756
907
  const count = unmerged.trim() ? unmerged.trim().split("\n").length : 0;
757
- if (ctx.github) try {
908
+ if (ctx.github && root.forge === "github") try {
758
909
  const { stdout: issueState } = await execAsync(`gh issue view ${ctx.github.number} --repo ${ctx.github.owner}/${ctx.github.repo} --json state --jq '.state'`, {
759
- cwd: ctx.projectPath,
910
+ cwd: root.dir,
760
911
  encoding: "utf-8"
761
912
  });
762
- if (issueState.trim().toUpperCase() === "CLOSED") return stepSkipped(step, [`Issue already closed on GitHub; ${count} unmerged commit(s) remain on ${branchName}`]);
913
+ if (issueState.trim().toUpperCase() === "CLOSED") return stepSkipped(step, [`Issue already closed on GitHub; ${count} unmerged commit(s) remain on ${root.sourceBranch}`]);
763
914
  } catch {}
764
- return stepFailed(step, `${count} unmerged commit(s) on ${branchName}. Merge before closing out.`);
915
+ return stepFailed(step, `${count} unmerged commit(s) on ${root.sourceBranch}. Merge before closing out.`);
765
916
  }
766
- const { stdout: remoteBranch } = await execAsync(`git ls-remote --heads origin "${branchName}" 2>/dev/null || true`, {
767
- cwd: ctx.projectPath,
917
+ const { stdout: remoteBranch } = await execAsync(`git ls-remote --heads origin "${root.sourceBranch}" 2>/dev/null || true`, {
918
+ cwd: root.dir,
768
919
  encoding: "utf-8"
769
920
  });
770
921
  if (remoteBranch.trim()) {
771
- await execAsync(`git fetch origin ${branchName}`, { cwd: ctx.projectPath }).catch(() => {});
772
- const remoteCheck = await verifyRemoteBranchIfPresent(ctx, branchName);
922
+ await execAsync(`git fetch origin ${root.sourceBranch}`, { cwd: root.dir }).catch(() => {});
923
+ const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
773
924
  if (remoteCheck) return remoteCheck;
774
925
  }
775
926
  return null;
776
927
  }
777
- async function verifyRemoteBranchIfPresent(ctx, branchName) {
928
+ async function verifySquashMergedMrByBranch(root, branchRef, lookup) {
929
+ if (root.forge !== "gitlab") return null;
930
+ try {
931
+ const { stdout } = await execAsync(`git rev-parse ${branchRef} 2>/dev/null`, {
932
+ cwd: root.dir,
933
+ encoding: "utf-8"
934
+ });
935
+ const headSha = stdout.trim();
936
+ if (!headSha) return null;
937
+ const reused = lookup.attempted;
938
+ if (!reused) {
939
+ lookup.attempted = true;
940
+ lookup.headSha = headSha;
941
+ lookup.artifact = await getForgeAdapter("gitlab").findMergedArtifact({
942
+ sourceBranch: root.sourceBranch,
943
+ targetBranch: root.targetBranch,
944
+ headSha,
945
+ cwd: root.dir
946
+ });
947
+ }
948
+ if (!lookup.artifact || lookup.headSha !== headSha) return null;
949
+ return {
950
+ result: stepOk("close-out:verify-merged", [`${lookup.artifact.id ? `MR !${lookup.artifact.id}` : "GitLab MR"} is merged and ${branchRef} matches the merged MR head${lookup.artifact.url ? ` (${lookup.artifact.url})` : ""}`]),
951
+ reused
952
+ };
953
+ } catch {
954
+ return null;
955
+ }
956
+ }
957
+ async function verifyRemoteBranchIfPresent(ctx, root, gitlabLookup) {
778
958
  const step = "close-out:verify-merged";
779
- const remoteRef = `origin/${branchName}`;
780
- const { stdout: remoteBranch } = await execAsync(`git ls-remote --heads origin "${branchName}" 2>/dev/null || true`, {
781
- cwd: ctx.projectPath,
959
+ const remoteRef = `origin/${root.sourceBranch}`;
960
+ const { stdout: remoteBranch } = await execAsync(`git ls-remote --heads origin "${root.sourceBranch}" 2>/dev/null || true`, {
961
+ cwd: root.dir,
782
962
  encoding: "utf-8"
783
963
  });
784
964
  if (!remoteBranch.trim()) return null;
785
- await execAsync(`git fetch origin ${branchName}`, { cwd: ctx.projectPath }).catch(() => {});
965
+ await execAsync(`git fetch origin ${root.sourceBranch}`, { cwd: root.dir }).catch(() => {});
786
966
  try {
787
- await execAsync(`git merge-base --is-ancestor ${remoteRef} main`, {
788
- cwd: ctx.projectPath,
967
+ await execAsync(`git merge-base --is-ancestor ${remoteRef} ${root.targetBranch}`, {
968
+ cwd: root.dir,
789
969
  encoding: "utf-8"
790
970
  });
791
971
  return stepOk(step, ["Remote branch fully merged"]);
792
972
  } catch {
793
973
  try {
794
- const { stdout: codeDiff } = await execAsync(`git diff main...${remoteRef} -- ':!.planning' ':!docs/prds' ':!.overdeck/prompts' 2>/dev/null || true`, {
795
- cwd: ctx.projectPath,
974
+ const { stdout: codeDiff } = await execAsync(`git diff ${root.targetBranch}...${remoteRef} -- ':!.planning' ':!docs/prds' ':!.overdeck/prompts' 2>/dev/null || true`, {
975
+ cwd: root.dir,
796
976
  encoding: "utf-8"
797
977
  });
798
978
  if (!codeDiff.trim()) return stepOk(step, ["Remote code changes squash-merged to main (only planning artifacts remain on branch)"]);
799
979
  } catch {}
800
- const githubMerged = await verifySquashMergedPrByBranch(ctx, branchName, remoteRef);
980
+ const gitlabMerged = await verifySquashMergedMrByBranch(root, remoteRef, gitlabLookup);
981
+ if (gitlabMerged) return gitlabMerged.reused ? stepOk(step, [`Remote ${remoteRef} matches the merged MR head`]) : gitlabMerged.result;
982
+ const githubMerged = root.forge === "github" ? await verifySquashMergedPrByBranch(ctx, root, remoteRef) : null;
801
983
  if (githubMerged) return githubMerged;
802
- const { stdout: remoteUnmerged } = await execAsync(`git log main..${remoteRef} --oneline 2>/dev/null || true`, {
803
- cwd: ctx.projectPath,
984
+ const { stdout: remoteUnmerged } = await execAsync(`git log ${root.targetBranch}..${remoteRef} --oneline 2>/dev/null || true`, {
985
+ cwd: root.dir,
804
986
  encoding: "utf-8"
805
987
  });
806
988
  const count = remoteUnmerged.trim() ? remoteUnmerged.trim().split("\n").length : 0;
807
- if (ctx.github) try {
989
+ if (ctx.github && root.forge === "github") try {
808
990
  const { stdout: issueState } = await execAsync(`gh issue view ${ctx.github.number} --repo ${ctx.github.owner}/${ctx.github.repo} --json state --jq '.state'`, {
809
- cwd: ctx.projectPath,
991
+ cwd: root.dir,
810
992
  encoding: "utf-8"
811
993
  });
812
- if (issueState.trim().toUpperCase() === "CLOSED") return stepSkipped(step, [`Issue already closed on GitHub; ${count} unmerged commit(s) remain on remote ${branchName}`]);
994
+ if (issueState.trim().toUpperCase() === "CLOSED") return stepSkipped(step, [`Issue already closed on GitHub; ${count} unmerged commit(s) remain on remote ${root.sourceBranch}`]);
813
995
  } catch {}
814
- return stepFailed(step, `${count} unmerged commit(s) on remote ${branchName}.`);
996
+ return stepFailed(step, `${count} unmerged commit(s) on remote ${root.sourceBranch}.`);
815
997
  }
816
998
  }
817
- async function verifySquashMergedPrByBranch(ctx, branchName, branchRef) {
999
+ async function verifySquashMergedPrByBranch(ctx, root, branchRef) {
818
1000
  if (!ctx.github) return null;
819
1001
  const step = "close-out:verify-merged";
820
1002
  const { owner, repo } = ctx.github;
1003
+ const remoteTargetRef = `origin/${root.targetBranch}`;
821
1004
  try {
822
- const { stdout: prJson } = await execAsync(`gh pr list --repo ${owner}/${repo} --state merged --head ${JSON.stringify(branchName)} --json number,mergedAt,headRefOid,url`, {
823
- cwd: ctx.projectPath,
1005
+ const { stdout: prJson } = await execAsync(`gh pr list --repo ${owner}/${repo} --state merged --head ${JSON.stringify(root.sourceBranch)} --json number,mergedAt,headRefOid,url`, {
1006
+ cwd: root.dir,
824
1007
  encoding: "utf-8"
825
1008
  });
826
1009
  const mergedPr = JSON.parse(prJson).filter((pr) => typeof pr.mergedAt === "string" && pr.mergedAt.length > 0 && typeof pr.headRefOid === "string" && pr.headRefOid.length > 0).sort((a, b) => Date.parse(String(b.mergedAt)) - Date.parse(String(a.mergedAt)))[0];
827
1010
  if (!mergedPr?.headRefOid) return null;
828
1011
  const { stdout: tipShaRaw } = await execAsync(`git rev-parse ${branchRef} 2>/dev/null`, {
829
- cwd: ctx.projectPath,
1012
+ cwd: root.dir,
830
1013
  encoding: "utf-8"
831
1014
  });
832
1015
  const tipSha = tipShaRaw.trim();
833
1016
  if (!tipSha) return null;
834
1017
  if (tipSha === mergedPr.headRefOid) return stepOk(step, [`${typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "GitHub PR"} is squash-merged and ${branchRef} matches the merged PR head`]);
835
- let commitsNotOnMain = null;
1018
+ let commitsNotOnTarget = null;
836
1019
  try {
837
1020
  const { stdout: commitsRaw } = await execAsync(`git log --no-merges --format=%H ${mergedPr.headRefOid}..${tipSha}`, {
838
- cwd: ctx.projectPath,
1021
+ cwd: root.dir,
839
1022
  encoding: "utf-8"
840
1023
  });
841
1024
  const commits = commitsRaw.split("\n").map((sha) => sha.trim()).filter(Boolean);
842
1025
  const unmerged = [];
843
1026
  for (const commit of commits) try {
844
- await execAsync(`git merge-base --is-ancestor ${commit} origin/main`, {
845
- cwd: ctx.projectPath,
1027
+ await execAsync(`git merge-base --is-ancestor ${commit} ${remoteTargetRef}`, {
1028
+ cwd: root.dir,
846
1029
  encoding: "utf-8"
847
1030
  });
848
1031
  } catch {
849
1032
  unmerged.push(commit);
850
1033
  }
851
- if (unmerged.length === 0) return stepOk(step, [`${typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "GitHub PR"} is squash-merged; all ${commits.length} post-PR non-merge commit(s) on ${branchRef} are already on origin/main`]);
852
- commitsNotOnMain = unmerged;
1034
+ if (unmerged.length === 0) return stepOk(step, [`${typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "GitHub PR"} is squash-merged; all ${commits.length} post-PR non-merge commit(s) on ${branchRef} are already on ${remoteTargetRef}`]);
1035
+ commitsNotOnTarget = unmerged;
853
1036
  } catch {}
854
1037
  try {
855
1038
  const { stdout: deltaRaw } = await execAsync(`git diff --name-only ${mergedPr.headRefOid}..${tipSha}`, {
856
- cwd: ctx.projectPath,
1039
+ cwd: root.dir,
857
1040
  encoding: "utf-8"
858
1041
  });
859
1042
  let deltaFiles = deltaRaw.split("\n").map((f) => f.trim()).filter(Boolean);
860
1043
  let statePlaneOnly = deltaFiles.length > 0 && deltaFiles.every((f) => f.startsWith(".pan/"));
861
1044
  if (!statePlaneOnly) {
862
- const { stdout: uniqueRaw } = await execAsync(`git diff --name-only origin/main...${tipSha}`, {
863
- cwd: ctx.projectPath,
1045
+ const { stdout: uniqueRaw } = await execAsync(`git diff --name-only ${remoteTargetRef}...${tipSha}`, {
1046
+ cwd: root.dir,
864
1047
  encoding: "utf-8"
865
1048
  });
866
1049
  deltaFiles = uniqueRaw.split("\n").map((f) => f.trim()).filter(Boolean);
@@ -869,7 +1052,7 @@ async function verifySquashMergedPrByBranch(ctx, branchName, branchRef) {
869
1052
  if (statePlaneOnly) return stepOk(step, [`${typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "GitHub PR"} is squash-merged; ${branchRef} is ahead only by state-plane commits (${deltaFiles.length} file(s): .pan) — accepted per state-plane policy`]);
870
1053
  } catch {}
871
1054
  const prLabel = typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "merged GitHub PR";
872
- if (commitsNotOnMain) return stepFailed(step, `${branchRef} has ${commitsNotOnMain.length} commit(s) after merged ${prLabel} that are not on origin/main: ${commitsNotOnMain.join(", ")}`);
1055
+ if (commitsNotOnTarget) return stepFailed(step, `${branchRef} has ${commitsNotOnTarget.length} commit(s) after merged ${prLabel} that are not on ${remoteTargetRef}: ${commitsNotOnTarget.join(", ")}`);
873
1056
  return stepFailed(step, `${branchRef} does not match the head commit of merged ${prLabel}; inspect before closing out.`);
874
1057
  } catch {
875
1058
  return null;
@@ -936,7 +1119,7 @@ async function resetIssueToTodoImpl(ctx) {
936
1119
  */
937
1120
  async function resetPostMergeStateForIssue(issueId) {
938
1121
  try {
939
- const { resetPostMergeState } = await import("./merge-agent-C1-9zbP_.js");
1122
+ const { resetPostMergeState } = await import("./merge-agent-DWd0KfiS.js");
940
1123
  resetPostMergeState(issueId);
941
1124
  resetPostMergeState(issueId.toUpperCase());
942
1125
  } catch {
@@ -952,7 +1135,7 @@ function clearReviewStatusStep(issueId) {
952
1135
  async function clearReviewStatusStepImpl(issueId) {
953
1136
  const step = "clear-review-status";
954
1137
  try {
955
- const { clearReviewStatus } = await import("./review-status-CacDM78F.js");
1138
+ const { clearReviewStatus } = await import("./review-status-B6wYcOtP.js");
956
1139
  clearReviewStatus(issueId.toUpperCase());
957
1140
  return stepOk(step, ["Review status cleared"]);
958
1141
  } catch {
@@ -1017,6 +1200,6 @@ async function resetIssueToCanceledImpl(ctx) {
1017
1200
  }
1018
1201
  }
1019
1202
  //#endregion
1020
- export { deepWipe as a, closeOut as i, cancelIssueWorkflow as n, resetToTodo as o, close as r, verifyBranchMergedImpl as s, approve as t };
1203
+ export { deepWipe as a, verifyConventionBranchMerged as c, closeOut as i, cancelIssueWorkflow as n, resetToTodo as o, close as r, verifyBranchMergedImpl as s, approve as t };
1021
1204
 
1022
- //# sourceMappingURL=workflows-D87ajwV6.js.map
1205
+ //# sourceMappingURL=workflows-BMBwLYPV.js.map
@@ -0,0 +1,2 @@
1
+ import { a as deepWipe, i as closeOut } from "./workflows-BMBwLYPV.js";
2
+ export { closeOut, deepWipe };
@@ -1,6 +1,6 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Fr as init_errors, Tr as FsError } from "./config-yaml-CxdwhAIA.js";
3
- import { i as init_settings, t as areMemoryObservationsEnabled } from "./settings-BLbcDqUp.js";
2
+ import { Ar as FsError, Vr as init_errors } from "./config-yaml-BSCqwmX0.js";
3
+ import { i as init_settings, t as areMemoryObservationsEnabled } from "./settings-E3FnEIUx.js";
4
4
  import { Effect } from "effect";
5
5
  import { existsSync } from "fs";
6
6
  import { join } from "path";
@@ -238,4 +238,4 @@ var init_workspace = __esmMin((() => {
238
238
  //#endregion
239
239
  export { readCavemanVariant as a, injectMemoryHookSettings as i, init_workspace as n, injectCavemanSettings as r, determineCavemanVariant as t };
240
240
 
241
- //# sourceMappingURL=workspace-iD8oULqu.js.map
241
+ //# sourceMappingURL=workspace-BgflNCH0.js.map
@@ -1,3 +1,3 @@
1
- import { i as injectMemoryHookSettings, n as init_workspace, r as injectCavemanSettings, t as determineCavemanVariant } from "./workspace-iD8oULqu.js";
1
+ import { i as injectMemoryHookSettings, n as init_workspace, r as injectCavemanSettings, t as determineCavemanVariant } from "./workspace-BgflNCH0.js";
2
2
  init_workspace();
3
3
  export { determineCavemanVariant, injectCavemanSettings, injectMemoryHookSettings };
@@ -1,3 +1,3 @@
1
- import { n as init_workspace_anchor_drift, t as evaluateWorkspaceAnchorDrift } from "./workspace-anchor-drift-C3mK5wNI.js";
1
+ import { n as init_workspace_anchor_drift, t as evaluateWorkspaceAnchorDrift } from "./workspace-anchor-drift-CMiNncwq.js";
2
2
  init_workspace_anchor_drift();
3
3
  export { evaluateWorkspaceAnchorDrift };