@overdeck/desktop 0.45.21 → 0.45.22

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 (344) hide show
  1. package/package.json +1 -1
  2. package/server/{acceptance-criteria-CJIFA8Vg.js → acceptance-criteria-BH7ac_1G.js} +2 -2
  3. package/server/{advancing-selfheal-CPOBO5ZS.js → advancing-selfheal-cSvXNZLZ.js} +6 -6
  4. package/server/{agent-gc-D6PUckBB.js → agent-gc-Dj2gncak.js} +4 -4
  5. package/server/{agent-state-BV_6RHnO.js → agent-state-Co5Sy2Fw.js} +1 -1
  6. package/server/{agent-state-service-DHwemt96.js → agent-state-service-CsQ07Pxe.js} +1 -1
  7. package/server/{agent-state-service-6MFQqnFy.js → agent-state-service-DistflNn.js} +5 -5
  8. package/server/{agents-DbrHWunF.js → agents-DXdHmRTC.js} +4 -4
  9. package/server/{agents-Czz6R57Z.js → agents-DyHKlq1I.js} +1 -1
  10. package/server/{archive-planning-BOnwJq8M.js → archive-planning-BvDuWNMo.js} +5 -5
  11. package/server/{archive-planning-MPpvQJL4.js → archive-planning-Cp_DC1j-.js} +1 -1
  12. package/server/{artifact-index-jobs-BOoySTKD.js → artifact-index-jobs-CDBFL4OU.js} +2 -2
  13. package/server/{backlog-auto-trigger-BUaFI44J.js → backlog-auto-trigger-DmA1IbYf.js} +3 -3
  14. package/server/{behavior-Dg-D8eBG.js → behavior-CGj16clS.js} +2 -2
  15. package/server/{briefing-freshness-OouGbJ7d.js → briefing-freshness-C12WgkaB.js} +2 -2
  16. package/server/{build-info-Cv6CI7Gu.js → build-info-BRpqQvNd.js} +1 -1
  17. package/server/{build-info-27NlbKhV.js → build-info-NU3KbXYw.js} +3 -3
  18. package/server/{checkpoint-manager-D64fCC4p.js → checkpoint-manager-CTPjAmtH.js} +2 -2
  19. package/server/{checkpoint-manager-C7mFCY_E.js → checkpoint-manager-rOgT98WY.js} +1 -1
  20. package/server/checkpoint-worker.js +1 -1
  21. package/server/{checkpoints-DwZqT2qQ.js → checkpoints-B5jFNi2G.js} +1 -1
  22. package/server/{checkpoints-Vh-J15ge.js → checkpoints-BJum14fs.js} +2 -2
  23. package/server/{claude-hooks-provision-CS5W_dhI.js → claude-hooks-provision-BhwWK-TQ.js} +1 -1
  24. package/server/{claude-hooks-provision-BVLGfHrv.js → claude-hooks-provision-D7p5WcKZ.js} +2 -2
  25. package/server/{claude-permissions-C2OrLYKL.js → claude-permissions-nSFKH78M.js} +2 -2
  26. package/server/{claude-settings-overlay-DX-fMFpC.js → claude-settings-overlay-BI_UIke0.js} +2 -2
  27. package/server/{claude-settings-overlay-DWXjafJh.js → claude-settings-overlay-DHBwjS1X.js} +1 -1
  28. package/server/cli-BRORS9qY.js +3 -0
  29. package/server/{cli-mvpEOb3w.js → cli-CbKNkFE5.js} +9 -9
  30. package/server/{cliproxy-Dvsr4ZkW.js → cliproxy-Brf_5MuG.js} +2 -2
  31. package/server/{cliproxy-7g1nObvB.js → cliproxy-bONZDBbC.js} +1 -1
  32. package/server/{close-issue-8F6uawYj.js → close-issue-CxReRxIc.js} +5 -5
  33. package/server/{closed-issue-reaper-BaYQYF6w.js → closed-issue-reaper-CQ3kqha7.js} +9 -9
  34. package/server/{closed-issue-reaper-BhV-r-tC.js → closed-issue-reaper-DXP2Xyv3.js} +1 -1
  35. package/server/{codex-D_UBEOwL.js → codex-CbmztVcc.js} +9 -6
  36. package/server/{codex-BBeZ8c3s.js → codex-DNyiQDKW.js} +1 -1
  37. package/server/{codex-parser-BTzlOZiV.js → codex-parser-jl8AeAmB.js} +2 -2
  38. package/server/{config-nAB_F-Gp.js → config-BJKocXKd.js} +1 -1
  39. package/server/{config-G1TOMJZA.js → config-DeTsoZdR.js} +2 -2
  40. package/server/{config-CrduXs4a.js → config-q4Gvd8dq.js} +2 -2
  41. package/server/{config-yaml-Ciyp2mYe.js → config-yaml-ig8Nwtiw.js} +124 -27
  42. package/server/{conflict-gate-BLUNMs1i.js → conflict-gate-CFqPVxEg.js} +3 -3
  43. package/server/{conflict-gate-BKalpcjL.js → conflict-gate-CHU9K1vU.js} +1 -1
  44. package/server/{context-layers-Cg9ZgVfx.js → context-layers-15gDOk20.js} +3 -3
  45. package/server/{context-layers-YNpf6Q_I.js → context-layers-DlQKkHH2.js} +2 -2
  46. package/server/{control-settings-D_79A6gp.js → control-settings-D_odMIaC.js} +4 -4
  47. package/server/{conversation-compaction-DiuZbIUB.js → conversation-compaction-B6YSRLda.js} +8 -8
  48. package/server/{conversation-compaction-CMIeWW4_.js → conversation-compaction-CN4-5YYt.js} +1 -1
  49. package/server/{conversation-service-DQybSPUK.js → conversation-service-C3avRVEr.js} +6 -6
  50. package/server/{conversation-service-CWk8mEym.js → conversation-service-Dq33SYEj.js} +1 -1
  51. package/server/{conversations-BJ-t3BRm.js → conversations-H9if0bCQ.js} +1 -1
  52. package/server/{conversations-BUgGvqVL.js → conversations-bYpM9-kZ.js} +4 -4
  53. package/server/{cost-Drm7qeD5.js → cost-Codk1pc2.js} +2 -2
  54. package/server/{cost-sync-DzHP6zaR.js → cost-sync-D_cre6WM.js} +3 -3
  55. package/server/{cost-jJ2cgDcG.js → cost-wH46-WsJ.js} +3 -3
  56. package/server/{dag-DIji6O2b.js → dag-CJpgf9A3.js} +2 -2
  57. package/server/{dangerous-git-ops-BebB-61h.js → dangerous-git-ops-D6AF-Hg_.js} +1 -1
  58. package/server/dashboard-db-worker.js +7 -7
  59. package/server/{deacon-pleYrvIm.js → deacon-B8HbQdqU.js} +3 -3
  60. package/server/{deacon-1s7bM5zn.js → deacon-CkT_kznS.js} +1377 -407
  61. package/server/{deacon-nudge-log-C5VCKtyi.js → deacon-nudge-log-D6K9K-rE.js} +3 -3
  62. package/server/{deacon-swarm-DmA3rJ7k.js → deacon-swarm-BryRr6AO.js} +13 -13
  63. package/server/deacon-swarm-CV54eNmU.js +2 -0
  64. package/server/deacon.js +8 -8
  65. package/server/{deploy-patrol-DmM6F-yw.js → deploy-patrol-1IrZxicY.js} +6 -6
  66. package/server/{deploy-window-ClLq1RYf.js → deploy-window-7ZYHh7Zp.js} +1 -1
  67. package/server/{deploy-window-jw4S_Y-c.js → deploy-window-wDf4UgHt.js} +6 -6
  68. package/server/{dev-supervisor-Do2Stz49.js → dev-supervisor-C7p9kEpc.js} +2 -2
  69. package/server/{devcontainer-renderer-D8ylupco.js → devcontainer-renderer-CNmQy0pL.js} +3 -3
  70. package/server/{dist-yfR7G1BL.js → dist-D-Ed5yVw.js} +1 -1
  71. package/server/dist-j64RzSrQ.js +3 -0
  72. package/server/{docker-ClwPQaba.js → docker-BCZ89M9X.js} +2 -2
  73. package/server/{dod-BLphkhjs.js → dod-DbJLYcHv.js} +1 -1
  74. package/server/{ensure-devcontainer-BA3bICoY.js → ensure-devcontainer-Cs6W9Yzj.js} +1 -1
  75. package/server/{ensure-devcontainer-CFpQatOc.js → ensure-devcontainer-V5JWaAva.js} +4 -4
  76. package/server/{esm-shims-BZw-fTQ6.js → esm-shims-dTeNdq7X.js} +1 -1
  77. package/server/{event-store-DABarGNz.js → event-store-CpBGsO6_.js} +1 -1
  78. package/server/{event-store-BVnON3vf.js → event-store-TnWdydfB.js} +3 -3
  79. package/server/{events-CmERlnwn.js → events-DSUdR-04.js} +3 -3
  80. package/server/{events-LGeUehYW.js → events-Dsuv6qyB.js} +1 -1
  81. package/server/{factory-CQNprtHe.js → factory-BMrK4TrE.js} +4 -4
  82. package/server/{feature-registry-population-D9Z3tYSa.js → feature-registry-population-B-CI9hgE.js} +4 -4
  83. package/server/{feature-registry-storage-BWymOgXE.js → feature-registry-storage-B972ph_A.js} +2 -2
  84. package/server/{features--fOza5g5.js → features-Bc-Bmiye.js} +2 -2
  85. package/server/{feedback-target-Dn9vfPpz.js → feedback-target-DS6NUuSs.js} +1 -1
  86. package/server/{feedback-target-Dqik2WTe.js → feedback-target-DZ-iAnAa.js} +7 -7
  87. package/server/{feedback-writer-Wlq5-qgS.js → feedback-writer-BXP6g75N.js} +4 -4
  88. package/server/{feedback-writer-DDQNV8uc.js → feedback-writer-Bx5z11mF.js} +1 -1
  89. package/server/{flywheel-DPUc8r3V.js → flywheel-6WHU4O7A.js} +14 -14
  90. package/server/{flywheel-1Wd8WDlh.js → flywheel-COR0mbRI.js} +12 -12
  91. package/server/{flywheel-Q-38YhZG.js → flywheel-Ctr5uuvo.js} +1 -1
  92. package/server/{flywheel-merge-order-CeBuX0EJ.js → flywheel-merge-order-CNKAY489.js} +1 -1
  93. package/server/{flywheel-merge-order-4SqOXFAr.js → flywheel-merge-order-CTgHeg-W.js} +7 -7
  94. package/server/forge-B0_opi-V.js +2 -0
  95. package/server/{forge-DBbDpiYc.js → forge-B1S_KZv4.js} +2 -2
  96. package/server/{from-hh6vTBGl.js → from-DpwQ-sc3.js} +1 -1
  97. package/server/{fts-db-6ponMie2.js → fts-db-DmAcuCkV.js} +2 -2
  98. package/server/{fts-operations-KIRK165y.js → fts-operations-7d_RkmWp.js} +2 -2
  99. package/server/git-utils-Cc3FHDKd.js +198 -0
  100. package/server/{git-utils-DmF5xkj8.js → git-utils-CsKGnzFA.js} +1 -1
  101. package/server/{github-app-B3yfECo8.js → github-app-CDPtGF7J.js} +2 -2
  102. package/server/{github-app-CeSVFL6C.js → github-app-CU14oYzP.js} +1 -1
  103. package/server/{github-client-4A6FgA8O.js → github-client-CwBZZ3t7.js} +1 -1
  104. package/server/{github-client-Dslipypz.js → github-client-XjTJbBm7.js} +2 -2
  105. package/server/{github-pr-lookup-DBP0YHMr.js → github-pr-lookup-CFGeVhqv.js} +2 -2
  106. package/server/harness-binary-B2CTcD84.js +106 -0
  107. package/server/{harness-resolve-BGpO-OVM.js → harness-resolve-D5FVQTmy.js} +9 -15
  108. package/server/{health-events-CnwV_SSz.js → health-events-C1whmd58.js} +1 -1
  109. package/server/{health-events-CZGZ5I-A.js → health-events-DREeevle.js} +2 -2
  110. package/server/{hooks-DvX33gY_.js → hooks-B-HItBiS.js} +1 -1
  111. package/server/{hooks-CoNscX84.js → hooks-yxRsjk-z.js} +2 -2
  112. package/server/hume-BmhvfVbV.js +3 -0
  113. package/server/{hume-DSJt5eA_.js → hume-Dz_OymXE.js} +2 -2
  114. package/server/{idle-stack-reaper-5DVRoY6P.js → idle-stack-reaper-DrCv0OAG.js} +1 -1
  115. package/server/{idle-stack-reaper-BfL8HqYy.js → idle-stack-reaper-Yf34xXxY.js} +2 -2
  116. package/server/{in-flight-guard-tVGiI5ee.js → in-flight-guard-BoWm66Kh.js} +2 -2
  117. package/server/{infra-DN2wSxle.js → infra-D4iNWMA5.js} +4 -4
  118. package/server/{injection-DK9zh_HL.js → injection-BVNa4MQW.js} +1 -1
  119. package/server/{injection-DtlT8Akv.js → injection-D7T75Pye.js} +7 -7
  120. package/server/{inspect-agent-DKByUS_F.js → inspect-agent-BXCgNeZ4.js} +13 -9
  121. package/server/inspect-agent-Dq0z1k3H.js +2 -0
  122. package/server/{internal-token-7bYL5v6K.js → internal-token-C9DdEOKY.js} +1 -1
  123. package/server/{internal-token-DhfFiwW7.js → internal-token-CXsfxslp.js} +2 -2
  124. package/server/{io-BiM-7Zsx.js → io-DQR9PMgS.js} +3 -3
  125. package/server/{issue-closed-Dfw3QDyZ.js → issue-closed-DtmJM0D0.js} +7 -7
  126. package/server/{issue-lifecycle-ytsEdDlK.js → issue-lifecycle-8PSS9Anq.js} +1 -1
  127. package/server/{issue-lifecycle-B7HZWnTA.js → issue-lifecycle-CeyW_HoD.js} +21 -21
  128. package/server/{issue-service-singleton-D5EB5eYr.js → issue-service-singleton-DBZabEl7.js} +1 -1
  129. package/server/{issue-service-singleton-CPESc4Or.js → issue-service-singleton-D_RVYBuL.js} +8 -8
  130. package/server/{issues-XYtFMxrH.js → issues-pDW9VUNz.js} +2 -2
  131. package/server/{jsonl-parser-DJV2eZUP.js → jsonl-parser-C3HVNR5d.js} +3 -3
  132. package/server/{label-cleanup-CJ4m8iRU.js → label-cleanup-DPwiZlWo.js} +3 -3
  133. package/server/{label-reconciler-CNf3Ylm3.js → label-reconciler-Df1ZduPH.js} +4 -4
  134. package/server/{launcher-generator-5DJRiovn.js → launcher-generator-COgR2By1.js} +6 -6
  135. package/server/{layers-cZx7ibtV.js → layers-Cp1To4L8.js} +2 -2
  136. package/server/{lifecycle-CE7619Xw.js → lifecycle-CtPDcZ9u.js} +6 -6
  137. package/server/{lifecycle-io-CUpsxG0p.js → lifecycle-io-DmY2qwCn.js} +1 -1
  138. package/server/{lifecycle-io-DMurK4oM.js → lifecycle-io-taIb0PoH.js} +4 -4
  139. package/server/{linear-client-BLyN-NiP.js → linear-client-DsFkIxee.js} +2 -2
  140. package/server/{linear-client-Bj1l4FOA.js → linear-client-YwZMDIwQ.js} +1 -1
  141. package/server/memory-fts-worker.js +1 -1
  142. package/server/{merge-CwX2_AWm.js → merge-BwsyNRJV.js} +1 -1
  143. package/server/{merge-hSC2BENe.js → merge-C1t-bspg.js} +3 -3
  144. package/server/{merge-agent-CnORPiri.js → merge-agent-B-SnXOoc.js} +1 -1
  145. package/server/{merge-agent-DnBsms_V.js → merge-agent-DDiIjzk-.js} +369 -213
  146. package/server/{merge-batch-C2w2U2eK.js → merge-batch-Byt-QnEl.js} +1 -1
  147. package/server/{merge-blockers-DhRgh76x.js → merge-blockers-BYjeXrVN.js} +2 -2
  148. package/server/merge-ops-DwWCkSgo.js +2 -0
  149. package/server/{merge-rebase-CE-ZyOMY.js → merge-rebase-Cm6fXaZN.js} +2 -2
  150. package/server/{merge-set-DHkzPCJU.js → merge-set-6LEglm6o.js} +1 -1
  151. package/server/{merge-set-D7YNU1ZB.js → merge-set-DiISXcC-.js} +3 -3
  152. package/server/{merge-sync-CpGA9Kg7.js → merge-sync-B95_4in_.js} +1 -1
  153. package/server/{merge-sync-De1FYva5.js → merge-sync-Do8_q32h.js} +2 -2
  154. package/server/{merge-train-SvkRJZ-k.js → merge-train-CKana8EH.js} +3 -3
  155. package/server/{merge-train-deps-CECJTElu.js → merge-train-deps-BgmqwIfA.js} +4 -4
  156. package/server/{merge-verification-B3meGcXF.js → merge-verification-CqnUzGEK.js} +4 -4
  157. package/server/{multipart-parser-ByTMgYV5.js → multipart-parser-tdOQDJ3o.js} +2 -2
  158. package/server/{no-resume-mode-BnInAFKs.js → no-resume-mode-BWOSZjWd.js} +1 -1
  159. package/server/node_modules/.package-lock.json +5 -5
  160. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +3 -3
  161. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
  162. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +2 -2
  163. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
  164. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +5 -5
  165. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +6 -8
  166. package/server/{orphan-proposed-reconciler-CAfuWTA1.js → orphan-proposed-reconciler-DSvsJ5M7.js} +1 -1
  167. package/server/{orphan-proposed-reconciler-AxAGUouN.js → orphan-proposed-reconciler-xklgvNA7.js} +19 -12
  168. package/server/package-lock.json +6 -6
  169. package/server/package.json +1 -1
  170. package/server/{pan-dir-Rw17YjT1.js → pan-dir-DOcf6ug3.js} +4 -4
  171. package/server/{paths-FP8v3lTz.js → paths-DooHpt9p.js} +2 -2
  172. package/server/{pickup-xi3KTLaJ.js → pickup-CaskQ7j6.js} +2 -2
  173. package/server/{pipeline-membership-BtKMNY7v.js → pipeline-membership-1LGRjo-k.js} +11 -8
  174. package/server/{pipeline-notifier-BM2HLF7B.js → pipeline-notifier-B6FVsYF9.js} +2 -2
  175. package/server/{pipeline-notifier-dQ-U4NSb.js → pipeline-notifier-CZsrU_nj.js} +1 -1
  176. package/server/{project-pipelines-B59NfN44.js → project-pipelines-CtNG_rvs.js} +2 -2
  177. package/server/projects-BKkwpH6q.js +3 -0
  178. package/server/{prompts-CbqaVjbe.js → prompts-EvhMeeHG.js} +2 -2
  179. package/server/{providers-d3pwXGVE.js → providers-BDDPULlp.js} +7 -7
  180. package/server/providers-DNSQqy2V.js +3 -0
  181. package/server/public/assets/{chunk-BO2N2NFS-BxYSL7J-.js → chunk-BO2N2NFS-sym_ufXe.js} +4 -4
  182. package/server/public/assets/{diagram-OG6HWLK6-C_F9Q2as.js → diagram-OG6HWLK6-CQJPBNBu.js} +1 -1
  183. package/server/public/assets/{dist-DQNg4CiF.js → dist-Bio7THQU.js} +1 -1
  184. package/server/public/assets/{dist-CLSlc6cV.js → dist-DukGS2YZ.js} +3 -3
  185. package/server/public/assets/{ganttDiagram-6RSMTGT7-Cq0my-0C.js → ganttDiagram-6RSMTGT7-D4lWwte3.js} +1 -1
  186. package/server/public/assets/{highlighted-body-OFNGDK62-eZC03dGh.js → highlighted-body-OFNGDK62-CaLboCt5.js} +1 -1
  187. package/server/public/assets/{index-C6NLz_1S.css → index-Bdc4V9ba.css} +1 -1
  188. package/server/public/assets/{index-SLYGA8AQ.js → index-Bwejq-5s.js} +147 -145
  189. package/server/public/assets/{linear-6Fi3qnGg.js → linear-qUWmMZ-c.js} +1 -1
  190. package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +1 -0
  191. package/server/public/assets/{pieDiagram-4H26LBE5-Dpmc6xsv.js → pieDiagram-4H26LBE5-C4zYulEm.js} +1 -1
  192. package/server/public/assets/{prod-ojHllFvN.js → prod-C8VtLuWC.js} +4 -4
  193. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Ulr9gON5.js → quadrantDiagram-W4KKPZXB-qP04zyZC.js} +1 -1
  194. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CwdHGXfL.js → sankeyDiagram-5OEKKPKP-eMPTX_cG.js} +1 -1
  195. package/server/public/assets/{xychartDiagram-2RQKCTM6-r-bEDzJh.js → xychartDiagram-2RQKCTM6-Dme1PIt6.js} +1 -1
  196. package/server/public/index.html +54 -10
  197. package/server/{pull-requests-CjjPj7v6.js → pull-requests-8z2N1UOV.js} +3 -3
  198. package/server/{pull-requests-D3N6HQzI.js → pull-requests-By_BteaL.js} +1 -1
  199. package/server/{queries-B5hl7lMQ.js → queries-ZABd5aXP.js} +95 -71
  200. package/server/rally-OSJXdiHK.js +3 -0
  201. package/server/{rally-api-DGaFz5L5.js → rally-api-DqKqIMNR.js} +2 -2
  202. package/server/{rally-api-CKr0O4DJ.js → rally-api-xHazRk0d.js} +1 -1
  203. package/server/{rally-client-Cqf6EX_r.js → rally-client-CGWEHaPd.js} +1 -1
  204. package/server/{rally-client-SVbjGvqj.js → rally-client-COYz1vYR.js} +4 -4
  205. package/server/{rally-Dp0Gb1DN.js → rally-i_goYmiA.js} +3 -3
  206. package/server/reap-terminal-sessions-CaMkFOIH.js +4 -0
  207. package/server/{reap-terminal-sessions-CjqRAGw7.js → reap-terminal-sessions-DG9eiMVz.js} +11 -28
  208. package/server/{rebuild-stack-DjdpALr1.js → rebuild-stack-CKjJAI8L.js} +1 -1
  209. package/server/{rebuild-stack-DHqCLvLX.js → rebuild-stack-JUm0jqYP.js} +6 -6
  210. package/server/{reconstruct-cache-BqrCQt0o.js → reconstruct-cache-wU79aCee.js} +6 -6
  211. package/server/record-rwK-nKv_.js +3 -0
  212. package/server/{record-update-RviRDSNs.js → record-update-Crz74r-6.js} +2 -2
  213. package/server/{record-update-BlB8mpKO.js → record-update-D3N6WMFR.js} +1 -1
  214. package/server/{recovery-trip-l1Hsi37x.js → recovery-trip-DkzJSej9.js} +2 -2
  215. package/server/{release-engine-CSI4K6Oj.js → release-engine-DMINVN8S.js} +5 -5
  216. package/server/{release-set-BywwggrE.js → release-set-DeUSOEHy.js} +3 -3
  217. package/server/{remote-DYziAkiZ.js → remote-Dr5kGYSZ.js} +3 -3
  218. package/server/{remote-agents-CZ2rc8I0.js → remote-agents-Ct_WOyke.js} +6 -6
  219. package/server/{remote-agents-BNORDWAX.js → remote-agents-D6O_zETW.js} +1 -1
  220. package/server/{remote-cnoeuDWn.js → remote-b-c5bOce.js} +3 -3
  221. package/server/{remote-completion-W67FNQ-A.js → remote-completion-Dca3hAaa.js} +13 -13
  222. package/server/resume-wZZsWtzz.js +3 -0
  223. package/server/{review-agent-CSswH985.js → review-agent-CCum8sGe.js} +1 -1
  224. package/server/{review-agent-CqSqSHkU.js → review-agent-CThvgK2r.js} +23 -23
  225. package/server/{review-artifacts-BBgnd5df.js → review-artifacts-CXywD0F2.js} +5 -5
  226. package/server/{review-context-Ctp9BdNJ.js → review-context-OYfKUprb.js} +8 -8
  227. package/server/{review-status-DXeqFpk5.js → review-status-Bnh-rdkY.js} +1 -1
  228. package/server/{review-status-CCgPVK1h.js → review-status-DFRjDFef.js} +21 -37
  229. package/server/{review-status-enrichment-DtDRGpst.js → review-status-enrichment-crNAtIpL.js} +3 -3
  230. package/server/review-status-source-CxuEjLGg.js +39 -0
  231. package/server/{review-status-sync-C792ksoJ.js → review-status-sync-D60PJWNL.js} +1 -1
  232. package/server/{review-status-sync-jnLgd04F.js → review-status-sync-DpAMD_WO.js} +2 -2
  233. package/server/{review-verdict-feedback-CMsIpTpy.js → review-verdict-feedback-CpUZl5aE.js} +7 -7
  234. package/server/{review-verdict-feedback-D5lW0o3k.js → review-verdict-feedback-JImjut0z.js} +1 -1
  235. package/server/{rollup-B3kQmNpl.js → rollup-CZ02qgxk.js} +1 -1
  236. package/server/{rollup-CLj_AK9f.js → rollup-SyuF09e4.js} +8 -8
  237. package/server/{scanner-C4NeC4FE.js → scanner-Br0Z5S6R.js} +7 -7
  238. package/server/{sequence-io-Ce-6grIY.js → sequence-io-fxU0DlwW.js} +4 -4
  239. package/server/{sequencer-agent-Bpz0yGmG.js → sequencer-agent-B5YC5XVP.js} +5 -5
  240. package/server/server.js +583 -387
  241. package/server/{service-CqAY8Kmk.js → service-Bagb90KZ.js} +150 -47
  242. package/server/{session-fork-uNo4rMRA.js → session-fork-BqQxd-V6.js} +2 -2
  243. package/server/{session-history-DUehL3KN.js → session-history-XdS0JKp3.js} +4 -4
  244. package/server/{settings-DP2OYLXL.js → settings-BNbocWOg.js} +3 -3
  245. package/server/settings-BlUsVaUc.js +2 -0
  246. package/server/{settings-D9grjmaP.js → settings-uLc6DEYI.js} +2 -2
  247. package/server/{shadow-engineering-Bi_oIMtF.js → shadow-engineering-D4X_s3fA.js} +3 -3
  248. package/server/{shadow-state-a_ztFBJe.js → shadow-state-C_NkP-sa.js} +2 -2
  249. package/server/{shadow-state-CDxEuPlE.js → shadow-state-CbvsN3qG.js} +1 -1
  250. package/server/{shadow-utils-CyOg6_Xq.js → shadow-utils-CYMRPeRT.js} +2 -2
  251. package/server/{ship-log-DDcueaIR.js → ship-log-__QtAFXG.js} +1 -1
  252. package/server/{smart-compaction--Oj65Uov.js → smart-compaction-CLZOWin1.js} +7 -7
  253. package/server/{smart-compaction-C1_VVLEd.js → smart-compaction-jdMkG1vo.js} +1 -1
  254. package/server/{spawn-planning-session-LFtK2QCE.js → spawn-planning-session-8D6mE033.js} +1 -1
  255. package/server/{spawn-planning-session-AiUSsBnH.js → spawn-planning-session-D5OXo8pT.js} +19 -15
  256. package/server/{specialist-completion-qOgqdqXH.js → specialist-completion-CqmduO92.js} +1 -1
  257. package/server/{specialist-context-gjj8Z4Ii.js → specialist-context-CJ-QjFR-.js} +5 -5
  258. package/server/{specialist-handoff-logger-BsBNvVZv.js → specialist-handoff-logger-Dnjlwt7g.js} +2 -2
  259. package/server/{specialist-logs-CSLtvPx6.js → specialist-logs-CQnKzuZs.js} +3 -3
  260. package/server/{specialists-DAegTvRt.js → specialists-Bg9v4z3F.js} +122 -94
  261. package/server/{specialists-CYRwELzc.js → specialists-CwZHb5cb.js} +18 -18
  262. package/server/{specialists-D0VBf8g_.js → specialists-D0gGXMZx.js} +1 -1
  263. package/server/{specialists-C6WkeKFK.js → specialists-Dqe6_HE5.js} +1 -1
  264. package/server/specs-BhOKBzqk.js +3 -0
  265. package/server/{src-OLoJhUiJ.js → src-BMMoA_ba.js} +6 -6
  266. package/server/{src-BqTcrfO_.js → src-Bqdtd6po.js} +3 -3
  267. package/server/{src-Dpq1yFIl.js → src-k039WVYY.js} +337 -4
  268. package/server/{stack-health-I713ELld.js → stack-health-Bd06frFn.js} +1 -1
  269. package/server/{stack-health-DV_f-lK0.js → stack-health-C-ifC7b0.js} +2 -2
  270. package/server/{stale-task-claims-CQSKZVq0.js → stale-task-claims-L7pJkQFL.js} +4 -4
  271. package/server/{staleness-BbsGxmF2.js → staleness-BID1BKdr.js} +1 -1
  272. package/server/{staleness-zGp4P1hd.js → staleness-_Tr-GwdA.js} +1 -1
  273. package/server/{state-home-DixkE-up.js → state-home-CONQvZR0.js} +36 -23
  274. package/server/state-migrate-BeBW0KXA.js +478 -0
  275. package/server/{stuck-remediation-BWkK_O7A.js → stuck-remediation-CKnIryGT.js} +20 -18
  276. package/server/{stuck-remediation-CTPRC2S5.js → stuck-remediation-CsGD5Ksb.js} +1 -1
  277. package/server/{substrate-bug-weights-service-DXd0ID83.js → substrate-bug-weights-service-CpIZILj9.js} +3 -3
  278. package/server/{summary-fork-CdLn8Chr.js → summary-fork-agEMsPSo.js} +2 -2
  279. package/server/{summary-fork-f3DpgjXh.js → summary-fork-bX6ax6X7.js} +8 -8
  280. package/server/supervisor-COVHrBTg.js +2 -0
  281. package/server/{supervisor-Ch8CDuoF.js → supervisor-Ctt4eRYz.js} +3 -3
  282. package/server/{swarm-readiness-C9P2iPap.js → swarm-readiness-DdmJVX7y.js} +3 -3
  283. package/server/{system-prerequisites-DkoQBn1q.js → system-prerequisites-DSXBvffY.js} +24 -44
  284. package/server/{teardown-workspace-D-5yMyit.js → teardown-workspace-DDCf5n-a.js} +15 -15
  285. package/server/{test-agent-queue-BwpUpu-o.js → test-agent-queue-BJZ9Nfcc.js} +6 -6
  286. package/server/{test-verdict-BRiSu7eW.js → test-verdict-Cp5tljlJ.js} +1 -1
  287. package/server/{test-verdict-BQ1yx7d4.js → test-verdict-D_-sXIz_.js} +1 -1
  288. package/server/{tldr-daemon-BJA7TkqS.js → tldr-daemon-B8_oT5gx.js} +1 -1
  289. package/server/{tldr-daemon-DjxP5g6Y.js → tldr-daemon-BQFmmFp0.js} +2 -2
  290. package/server/{tmux-HQLgwo_C.js → tmux-BAvtac_u.js} +1 -1
  291. package/server/{tmux-y1blSxks.js → tmux-L5LgvGLp.js} +2 -2
  292. package/server/{token-LUrbM9sU.js → token-BkQLy4yS.js} +2 -2
  293. package/server/token-util-BArZLN6w.js +3 -0
  294. package/server/{token-util-BZaDAQ8S.js → token-util-DI8sGlmF.js} +1 -1
  295. package/server/{tracker-config-DSFZBdXP.js → tracker-config-DdT-nUAM.js} +2 -2
  296. package/server/{tracker-utils-DiceZN3a.js → tracker-utils-CawsPSS2.js} +2 -2
  297. package/server/{tracker-utils-WtP_V-yn.js → tracker-utils-DV3h1FYG.js} +1 -1
  298. package/server/{traefik-connect-BXqfOP4-.js → traefik-connect-C6mJckNs.js} +1 -1
  299. package/server/{tunnel-WcJImbAC.js → tunnel-BIFl98rc.js} +1 -1
  300. package/server/{tunnel-DTng1rfQ.js → tunnel-IdK1iTHx.js} +3 -3
  301. package/server/{types-BjaZ1oqH.js → types-7-GnJn0t.js} +1 -1
  302. package/server/{types-DqeBMmJN.js → types-hraoaQIp.js} +1 -1
  303. package/server/{uat-train-Wismge7h.js → uat-train-0Ujk8GCv.js} +1 -1
  304. package/server/{uat-train-BpLnp7Cx.js → uat-train-j0cPeMSj.js} +25 -25
  305. package/server/{validation-BA4e5EGm.js → validation-CabEISJT.js} +4 -4
  306. package/server/{validation-CUWamZ4X.js → validation-DcAgXTQp.js} +1 -1
  307. package/server/{verification-artifact-Dr_0g9nb.js → verification-artifact-BuTA1QbL.js} +1 -1
  308. package/server/{verification-artifact-CrbI4tJE.js → verification-artifact-Ck1tefmz.js} +1 -1
  309. package/server/{verification-runner-Dcksl_P-.js → verification-runner-DlJezzef.js} +1 -1
  310. package/server/{verification-runner-gAzh3cVD.js → verification-runner-FiuAZ-H2.js} +15 -14
  311. package/server/{vtt-parser-3VZKsmSm.js → vtt-parser-BnRsYzcz.js} +1 -1
  312. package/server/{work-agent-prompt-ULdcANl5.js → work-agent-prompt-DLthEPAq.js} +12 -11
  313. package/server/{workflows-B8ROFlfw.js → workflows-BZNNYkGC.js} +18 -18
  314. package/server/workflows-C4mR0Reb.js +2 -0
  315. package/server/{workspace-DSjUJaJN.js → workspace-3IC-UkAi.js} +1 -1
  316. package/server/{workspace-DhTDA8nB.js → workspace-D9ppycdg.js} +3 -3
  317. package/server/{workspace-config-BAAsAv-o.js → workspace-config-Bigl_-Lk.js} +1 -1
  318. package/server/{workspace-manager-CcujONCR.js → workspace-manager-B1WOfKvB.js} +1 -1
  319. package/server/{workspace-manager-DsN52IMG.js → workspace-manager-ClkCIWTe.js} +13 -13
  320. package/server/{workspace-metadata-CftOpNLs.js → workspace-metadata-BE0efUv_.js} +1 -1
  321. package/server/{workspace-metadata-DIL5_U4c.js → workspace-metadata-tiSRIWJP.js} +2 -2
  322. package/server/{workspaces-Dmlh1YXm.js → workspaces-CFPcL0vl.js} +96 -96
  323. package/sync-sources/skills/pan-start/SKILL.md +23 -0
  324. package/server/cli-ChErG518.js +0 -3
  325. package/server/deacon-swarm-uudlSCLM.js +0 -2
  326. package/server/dist-BEDL2alY.js +0 -3
  327. package/server/forge-DbhJyH6u.js +0 -2
  328. package/server/git-utils-Bkxzr1Xf.js +0 -129
  329. package/server/hume-BrA1tUuk.js +0 -3
  330. package/server/inspect-agent-CyXNo9fM.js +0 -2
  331. package/server/merge-ops-BpTtuO8x.js +0 -2
  332. package/server/projects-IRHJIPYC.js +0 -3
  333. package/server/providers-BqCdTryq.js +0 -3
  334. package/server/public/assets/mermaid-GHXKKRXX-BNwFoQsf.js +0 -1
  335. package/server/rally-DGimSRBQ.js +0 -3
  336. package/server/reap-terminal-sessions-C1mfzoZo.js +0 -3
  337. package/server/record-us0YECMO.js +0 -3
  338. package/server/resume-OyN3dEXE.js +0 -3
  339. package/server/settings-BaPXXJsT.js +0 -2
  340. package/server/specs-BsNcum0h.js +0 -3
  341. package/server/state-migrate-_zJJ6XKE.js +0 -362
  342. package/server/supervisor-Qy1QecAs.js +0 -2
  343. package/server/token-util-Cg-QnowA.js +0 -3
  344. package/server/workflows-C5c-RPsY.js +0 -2
@@ -1,14 +1,14 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Dr as VcsError, Gn as loadProjectsConfigSync, Or as init_errors, Rr as OVERDECK_HOME, f as loadConfigSync, t as init_config_yaml, ti as init_paths, yr as GitError, zn as init_projects } from "./config-yaml-Ciyp2mYe.js";
2
+ import { Ar as VcsError, Hn as init_projects, Jn as loadProjectsConfigSync, Sr as GitError, Vr as OVERDECK_HOME, f as loadConfigSync, ii as init_paths, jr as init_errors, t as init_config_yaml } from "./config-yaml-ig8Nwtiw.js";
3
3
  import { a as init_activity_logger, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-DDlOIAML.js";
4
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-DN2wSxle.js";
5
- import { D as killSession, R as sendKeys, V as sessionExists, i as capturePane, j as listSessionNames, w as init_tmux } from "./tmux-y1blSxks.js";
6
- import { c as init_review_status, f as markWorkspaceStuck, s as getReviewStatusSync, y as setReviewStatusSync } from "./review-status-CCgPVK1h.js";
7
- import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-DiceZN3a.js";
8
- import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-D9Z3tYSa.js";
9
- import { r as verifyMergedBeforeLifecycle, t as init_merge_verification } from "./merge-verification-B3meGcXF.js";
10
- import { i as runQualityGates, n as init_validation } from "./validation-BA4e5EGm.js";
11
- import { i as init_git_utils, t as cleanupStaleLocks } from "./git-utils-Bkxzr1Xf.js";
4
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-D4iNWMA5.js";
5
+ import { D as killSession, R as sendKeys, V as sessionExists, i as capturePane, j as listSessionNames, w as init_tmux } from "./tmux-L5LgvGLp.js";
6
+ import { c as init_review_status, f as markWorkspaceStuck, s as getReviewStatusSync, y as setReviewStatusSync } from "./review-status-DFRjDFef.js";
7
+ import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-CawsPSS2.js";
8
+ import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-B-CI9hgE.js";
9
+ import { r as verifyMergedBeforeLifecycle, t as init_merge_verification } from "./merge-verification-CqnUzGEK.js";
10
+ import { i as init_git_utils, t as cleanupStaleLocks } from "./git-utils-Cc3FHDKd.js";
11
+ import { i as runQualityGates, n as init_validation } from "./validation-CabEISJT.js";
12
12
  import { Data, Effect } from "effect";
13
13
  import { appendFileSync, existsSync, mkdirSync } from "fs";
14
14
  import { basename, dirname, join, relative } from "path";
@@ -19,7 +19,7 @@ import { promisify } from "util";
19
19
  //#region ../../lib/cloister/merge-agent-step0.ts
20
20
  async function shouldRestartForPostMerge(repoRoot, dependencies = {}) {
21
21
  if ((await (dependencies.computeStaleness ?? (async () => {
22
- const [{ getBuildInfo }, { computeBuildStaleness }] = await Promise.all([import("./build-info-Cv6CI7Gu.js"), import("./staleness-zGp4P1hd.js")]);
22
+ const [{ getBuildInfo }, { computeBuildStaleness }] = await Promise.all([import("./build-info-BRpqQvNd.js"), import("./staleness-_Tr-GwdA.js")]);
23
23
  return computeBuildStaleness({
24
24
  repoRoot,
25
25
  buildCommit: getBuildInfo().buildCommit
@@ -28,7 +28,7 @@ async function shouldRestartForPostMerge(repoRoot, dependencies = {}) {
28
28
  (dependencies.log ?? console.log)("Running build already contains origin/main build inputs — skipping deploy restart");
29
29
  return false;
30
30
  }
31
- const reason = await (dependencies.getBlockReason ?? (async () => (await import("./deploy-window-ClLq1RYf.js")).getDeployBlockReason()))();
31
+ const reason = await (dependencies.getBlockReason ?? (async () => (await import("./deploy-window-7ZYHh7Zp.js")).getDeployBlockReason()))();
32
32
  if (reason) {
33
33
  (dependencies.log ?? console.log)(`Deploy window unsafe (${reason}) — deferring deploy to the staleness patrol`);
34
34
  return false;
@@ -37,6 +37,175 @@ async function shouldRestartForPostMerge(repoRoot, dependencies = {}) {
37
37
  }
38
38
  var init_merge_agent_step0 = __esmMin((() => {}));
39
39
  //#endregion
40
+ //#region ../../lib/cloister/sync-main-git.ts
41
+ function killCommandTree(child) {
42
+ if (!child?.pid) return;
43
+ try {
44
+ if (process.platform === "win32") child.kill("SIGKILL");
45
+ else process.kill(-child.pid, "SIGKILL");
46
+ } catch {
47
+ try {
48
+ child.kill("SIGKILL");
49
+ } catch {}
50
+ }
51
+ }
52
+ function runSyncGitCommand(command, options) {
53
+ if (options.signal?.aborted) return Promise.reject(new SyncGitCommandAbortError(command));
54
+ return new Promise((resolve, reject) => {
55
+ let child;
56
+ let termination;
57
+ const finishTermination = (kind) => {
58
+ if (termination) return;
59
+ termination = kind;
60
+ killCommandTree(child);
61
+ };
62
+ const timeout = setTimeout(() => finishTermination("timeout"), options.timeout);
63
+ const onAbort = () => finishTermination("abort");
64
+ options.signal?.addEventListener("abort", onAbort, { once: true });
65
+ child = execDetached(command, {
66
+ cwd: options.cwd,
67
+ encoding: "utf-8",
68
+ detached: process.platform !== "win32",
69
+ timeout: options.timeout
70
+ }, (error, stdout, stderr) => {
71
+ clearTimeout(timeout);
72
+ options.signal?.removeEventListener("abort", onAbort);
73
+ if (termination === "abort") reject(Object.assign(new SyncGitCommandAbortError(command), {
74
+ stdout,
75
+ stderr
76
+ }));
77
+ else if (termination === "timeout") reject(Object.assign(new SyncGitCommandTimeoutError(command, options.timeout), {
78
+ stdout,
79
+ stderr
80
+ }));
81
+ else if (error?.killed) reject(Object.assign(new SyncGitCommandTimeoutError(command, options.timeout), {
82
+ stdout,
83
+ stderr
84
+ }));
85
+ else if (error) reject(Object.assign(error, {
86
+ stdout,
87
+ stderr
88
+ }));
89
+ else resolve({
90
+ stdout,
91
+ stderr
92
+ });
93
+ });
94
+ if (options.signal?.aborted) finishTermination("abort");
95
+ });
96
+ }
97
+ async function probeGitOperationHeads(projectPath, timeoutMs, signal) {
98
+ const present = [];
99
+ for (const operationHead of GIT_OPERATION_HEADS) try {
100
+ await runSyncGitCommand(`git rev-parse -q --verify ${operationHead}`, {
101
+ cwd: projectPath,
102
+ timeout: timeoutMs,
103
+ signal
104
+ });
105
+ present.push(operationHead);
106
+ } catch (error) {
107
+ if (error instanceof SyncGitCommandAbortError) throw error;
108
+ if (error instanceof SyncGitCommandTimeoutError) return {
109
+ success: false,
110
+ present,
111
+ reason: `${operationHead} probe timed out after ${timeoutMs / 1e3}s`
112
+ };
113
+ if (error?.code !== 1) return {
114
+ success: false,
115
+ present,
116
+ reason: `${operationHead} probe failed: ${error instanceof Error ? error.message : String(error)}`
117
+ };
118
+ }
119
+ return {
120
+ success: true,
121
+ present
122
+ };
123
+ }
124
+ async function ensureSyncGitQuiescent(projectPath, abortMerge, timeoutMs = 3e4) {
125
+ const controller = new AbortController();
126
+ const deadline = Date.now() + timeoutMs;
127
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
128
+ const remaining = (stage) => {
129
+ const budget = deadline - Date.now();
130
+ if (controller.signal.aborted || budget <= 0) throw new UnsafeSyncMainStateError(`Git cleanup timed out after ${timeoutMs / 1e3}s while ${stage}`);
131
+ return budget;
132
+ };
133
+ try {
134
+ let lockCleanup;
135
+ try {
136
+ lockCleanup = await Effect.runPromise(cleanupStaleLocks(projectPath, {
137
+ signal: controller.signal,
138
+ processProbeTimeoutMs: remaining("checking Git lock owners")
139
+ }));
140
+ } catch (error) {
141
+ throw new UnsafeSyncMainStateError(`Could not verify Git lock state after cancellation: ${error instanceof Error ? error.message : String(error)}`);
142
+ }
143
+ if (lockCleanup.errors.length > 0) throw new UnsafeSyncMainStateError(`Could not establish Git quiescence: ${lockCleanup.errors.map(({ file, error }) => `${file}: ${error}`).join("; ")}`);
144
+ let before;
145
+ try {
146
+ before = await probeGitOperationHeads(projectPath, remaining("checking Git operation state"), controller.signal);
147
+ } catch (error) {
148
+ throw new UnsafeSyncMainStateError(`Could not verify Git operation state: ${error instanceof Error ? error.message : String(error)}`);
149
+ }
150
+ if (!before.success) throw new UnsafeSyncMainStateError(`Could not verify Git operation state: ${before.reason}`);
151
+ if (before.present.filter((head) => head !== "MERGE_HEAD").length > 0 || before.present.includes("MERGE_HEAD") && !abortMerge) throw new UnsafeSyncMainStateError(`Git operation remains active after cancellation: ${before.present.join(", ")}`);
152
+ if (before.present.includes("MERGE_HEAD")) try {
153
+ await runSyncGitCommand("git merge --abort", {
154
+ cwd: projectPath,
155
+ timeout: remaining("aborting the timed-out merge"),
156
+ signal: controller.signal
157
+ });
158
+ } catch (error) {
159
+ throw new UnsafeSyncMainStateError(`Could not abort timed-out sync merge: ${error instanceof Error ? error.message : String(error)}`);
160
+ }
161
+ let after;
162
+ try {
163
+ after = await probeGitOperationHeads(projectPath, remaining("verifying Git cleanup"), controller.signal);
164
+ } catch (error) {
165
+ throw new UnsafeSyncMainStateError(`Could not verify Git operation state after cleanup: ${error instanceof Error ? error.message : String(error)}`);
166
+ }
167
+ if (!after.success) throw new UnsafeSyncMainStateError(`Could not verify Git operation state after cleanup: ${after.reason}`);
168
+ if (after.present.length > 0) throw new UnsafeSyncMainStateError(`Git operation remains active after cleanup: ${after.present.join(", ")}`);
169
+ } finally {
170
+ clearTimeout(timeout);
171
+ }
172
+ }
173
+ var GIT_OPERATION_HEADS, SyncGitCommandTimeoutError, SyncGitCommandAbortError, UnsafeSyncMainStateError, execDetached;
174
+ var init_sync_main_git = __esmMin((() => {
175
+ init_git_utils();
176
+ GIT_OPERATION_HEADS = [
177
+ "MERGE_HEAD",
178
+ "REBASE_HEAD",
179
+ "CHERRY_PICK_HEAD",
180
+ "REVERT_HEAD"
181
+ ];
182
+ SyncGitCommandTimeoutError = class extends Error {
183
+ killed = true;
184
+ constructor(command, budgetMs) {
185
+ super(`${command} timed out after ${budgetMs / 1e3}s`);
186
+ this.command = command;
187
+ this.budgetMs = budgetMs;
188
+ this.name = "SyncGitCommandTimeoutError";
189
+ }
190
+ };
191
+ SyncGitCommandAbortError = class extends Error {
192
+ code = "ABORT_ERR";
193
+ killed = true;
194
+ constructor(command) {
195
+ super(`${command} was cancelled`);
196
+ this.command = command;
197
+ this.name = "SyncGitCommandAbortError";
198
+ }
199
+ };
200
+ UnsafeSyncMainStateError = class extends Error {
201
+ constructor(message) {
202
+ super(message);
203
+ this.name = "UnsafeSyncMainStateError";
204
+ }
205
+ };
206
+ execDetached = exec;
207
+ }));
208
+ //#endregion
40
209
  //#region ../../lib/overdeck/git-activity.ts
41
210
  function overdeckDb() {
42
211
  return getOverdeckDatabaseSync();
@@ -331,29 +500,26 @@ function parseStatusPath(line) {
331
500
  * Respects .gitignore (no -f), unstages excluded paths, and leaves excluded
332
501
  * paths dirty so the sync can proceed. Returns success=false on git errors.
333
502
  */
334
- async function autoCommitWorkspaceChangesBeforeSync(projectPath, issueId) {
503
+ async function autoCommitWorkspaceChangesBeforeSync(projectPath, issueId, signal) {
504
+ const run = (command, timeout = SYNC_GIT_STATUS_TIMEOUT_MS) => runSyncGitCommand(command, {
505
+ cwd: projectPath,
506
+ timeout,
507
+ signal
508
+ });
335
509
  try {
336
- for (const operationHead of [
337
- "MERGE_HEAD",
338
- "REBASE_HEAD",
339
- "CHERRY_PICK_HEAD",
340
- "REVERT_HEAD"
341
- ]) try {
342
- await execAsync(`git rev-parse -q --verify ${operationHead}`, {
343
- cwd: projectPath,
344
- encoding: "utf-8"
345
- });
346
- return {
347
- success: false,
348
- committed: false,
349
- reason: `Refusing to auto-commit while ${operationHead} exists; finish or abort the in-progress Git operation first`
350
- };
351
- } catch {}
510
+ const operationHeads = await probeGitOperationHeads(projectPath, SYNC_GIT_STATUS_TIMEOUT_MS, signal);
511
+ if (!operationHeads.success) return {
512
+ success: false,
513
+ committed: false,
514
+ reason: operationHeads.reason
515
+ };
516
+ if (operationHeads.present.length > 0) return {
517
+ success: false,
518
+ committed: false,
519
+ reason: `Refusing to auto-commit while ${operationHeads.present[0]} exists; finish or abort the in-progress Git operation first`
520
+ };
352
521
  try {
353
- const { stdout: conflictMarkers } = await execAsync("git grep -n -I -E '^(<<<<<<<( |$)|=======$|>>>>>>>( |$))' -- .", {
354
- cwd: projectPath,
355
- encoding: "utf-8"
356
- });
522
+ const { stdout: conflictMarkers } = await run("git grep -n -I -E '^(<<<<<<<( |$)|=======$|>>>>>>>( |$))' -- .");
357
523
  if (conflictMarkers.trim()) return {
358
524
  success: false,
359
525
  committed: false,
@@ -366,45 +532,31 @@ async function autoCommitWorkspaceChangesBeforeSync(projectPath, issueId) {
366
532
  reason: `Failed to scan for conflict markers: ${error.message}`
367
533
  };
368
534
  }
369
- const { stdout: statusOut } = await execAsync("git status --porcelain", {
370
- cwd: projectPath,
371
- encoding: "utf-8"
372
- });
535
+ const { stdout: statusOut } = await run("git status --porcelain");
373
536
  if (!statusOut.trim()) return {
374
537
  success: true,
375
538
  committed: false,
376
539
  reason: "no uncommitted changes"
377
540
  };
378
- await execAsync("git add -A", {
379
- cwd: projectPath,
380
- encoding: "utf-8"
381
- });
382
- await execAsync(`git reset HEAD -- ${AUTO_COMMIT_EXCLUDED_PATHS.map((p) => p.endsWith("/") ? p.slice(0, -1) : p).join(" ")}`, {
383
- cwd: projectPath,
384
- encoding: "utf-8"
385
- });
386
- const { stdout: diffStat } = await execAsync("git diff --cached --stat", {
387
- cwd: projectPath,
388
- encoding: "utf-8"
389
- });
541
+ await run("git add -A");
542
+ await run(`git reset HEAD -- ${AUTO_COMMIT_EXCLUDED_PATHS.map((p) => p.endsWith("/") ? p.slice(0, -1) : p).join(" ")}`);
543
+ const { stdout: diffStat } = await run("git diff --cached --stat");
390
544
  if (!diffStat.trim()) return {
391
545
  success: true,
392
546
  committed: false,
393
547
  reason: "only excluded/ignored changes remain"
394
548
  };
395
- await execAsync(`git commit -m "${issueId ? `chore: auto-commit before sync with main (${issueId})` : "chore: auto-commit before sync with main"}"`, {
396
- cwd: projectPath,
397
- encoding: "utf-8"
398
- });
549
+ await run(`git commit -m "${issueId ? `chore: auto-commit before sync with main (${issueId})` : "chore: auto-commit before sync with main"}"`, SYNC_GIT_COMMIT_TIMEOUT_MS);
399
550
  return {
400
551
  success: true,
401
552
  committed: true
402
553
  };
403
554
  } catch (error) {
555
+ if (error instanceof SyncGitCommandAbortError || error instanceof SyncGitCommandTimeoutError) await ensureSyncGitQuiescent(projectPath, false);
404
556
  return {
405
557
  success: false,
406
558
  committed: false,
407
- reason: `Failed to auto-commit: ${error.message}`
559
+ reason: error instanceof SyncGitCommandTimeoutError && error.command.startsWith("git commit ") ? `Auto-commit git commit timed out after ${SYNC_GIT_COMMIT_TIMEOUT_MS / 1e3}s` : `Failed to auto-commit: ${error.message}`
408
560
  };
409
561
  }
410
562
  }
@@ -447,7 +599,7 @@ async function notifyTldrDaemon(projectPath, _sourceBranch) {
447
599
  return;
448
600
  }
449
601
  console.log(`[merge-agent] Found ${changedFiles.length} changed source files to reindex`);
450
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BJA7TkqS.js");
602
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
451
603
  const tldrService = getTldrDaemonServiceSync(projectPath, venvPath);
452
604
  if (!(await tldrService.getStatus()).running) {
453
605
  console.log(`[merge-agent] TLDR daemon not running, skipping notification`);
@@ -477,7 +629,7 @@ async function postMergeLifecycle(issueId, projectPath, sourceBranch, options) {
477
629
  }
478
630
  const run = (async () => {
479
631
  try {
480
- const { findSpecByIssue } = await import("./specs-BsNcum0h.js");
632
+ const { findSpecByIssue } = await import("./specs-BhOKBzqk.js");
481
633
  const spec = await Effect.runPromise(findSpecByIssue(projectPath, issueId));
482
634
  if (spec && (spec.status === "completed" || spec.status === "cancelled")) {
483
635
  console.log(`[merge-agent] ${issueId} is closed out (spec ${spec.status}) — skipping post-merge lifecycle`);
@@ -539,7 +691,7 @@ async function postMergeLifecycle(issueId, projectPath, sourceBranch, options) {
539
691
  }
540
692
  console.log(`[merge-agent] Running post-merge verify handoff for ${issueId}`);
541
693
  try {
542
- const { cleanupMergedLabels } = await import("./label-cleanup-CJ4m8iRU.js");
694
+ const { cleanupMergedLabels } = await import("./label-cleanup-DPwiZlWo.js");
543
695
  const ghResolved = resolveGitHubIssueSync(issueId);
544
696
  const labelCtx = ghResolved.isGitHub ? {
545
697
  issueId,
@@ -588,8 +740,8 @@ async function postMergeLifecycle(issueId, projectPath, sourceBranch, options) {
588
740
  console.warn(`[merge-agent] Async post-merge release trigger failed for ${issueId}: ${err instanceof Error ? err.message : String(err)}`);
589
741
  });
590
742
  try {
591
- const { setAgentPaused, getAgentState } = await import("./agents-Czz6R57Z.js");
592
- const { killSession, sessionExists } = await import("./tmux-HQLgwo_C.js");
743
+ const { setAgentPaused, getAgentState } = await import("./agents-DyHKlq1I.js");
744
+ const { killSession, sessionExists } = await import("./tmux-BAvtac_u.js");
593
745
  const issueLower = issueId.toLowerCase();
594
746
  const reason = "awaiting close-out (verify on main)";
595
747
  for (const agentId of [`agent-${issueLower}`, `planning-${issueLower}`]) {
@@ -614,8 +766,8 @@ async function postMergeLifecycle(issueId, projectPath, sourceBranch, options) {
614
766
  console.warn(`[merge-agent] Could not pause or kill agent sessions: ${err}`);
615
767
  }
616
768
  try {
617
- const { killAllReviewerSessions } = await import("./review-agent-CSswH985.js");
618
- const { resolveProjectFromIssueSync } = await import("./projects-IRHJIPYC.js");
769
+ const { killAllReviewerSessions } = await import("./review-agent-CCum8sGe.js");
770
+ const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
619
771
  const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
620
772
  if (projectKey) {
621
773
  const { killed } = await Effect.runPromise(killAllReviewerSessions(projectKey, issueId));
@@ -629,7 +781,7 @@ async function postMergeLifecycle(issueId, projectPath, sourceBranch, options) {
629
781
  }
630
782
  await killPostMergeRoleSessions(issueId);
631
783
  try {
632
- const { createResetMarker } = await import("./cli-ChErG518.js");
784
+ const { createResetMarker } = await import("./cli-BRORS9qY.js");
633
785
  const timestamp = (/* @__PURE__ */ new Date()).toISOString();
634
786
  const marker = await createResetMarker({
635
787
  projectId: basename(projectPath),
@@ -644,8 +796,8 @@ async function postMergeLifecycle(issueId, projectPath, sourceBranch, options) {
644
796
  console.warn(`[merge-agent] Memory reset marker creation failed (non-fatal): ${err}`);
645
797
  }
646
798
  try {
647
- const { findWorkspacePath } = await import("./archive-planning-MPpvQJL4.js");
648
- const { stopWorkspaceDocker } = await import("./workspace-manager-CcujONCR.js");
799
+ const { findWorkspacePath } = await import("./archive-planning-Cp_DC1j-.js");
800
+ const { stopWorkspaceDocker } = await import("./workspace-manager-B1WOfKvB.js");
649
801
  const issueLower = issueId.toLowerCase();
650
802
  const workspacePath = findWorkspacePath(projectPath, issueLower);
651
803
  if (workspacePath) {
@@ -676,7 +828,7 @@ async function triggerPostMergeReleaseIfConfigured(issueId, projectPath) {
676
828
  console.log(`[merge-agent] Release already started or completed for ${issueId} (${currentStatus}), skipping`);
677
829
  return;
678
830
  }
679
- const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-IRHJIPYC.js");
831
+ const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-BKkwpH6q.js");
680
832
  const resolved = resolveProjectFromIssueSync(issueId);
681
833
  if (!(resolved ? getProjectSync(resolved.projectKey) : null)?.release) {
682
834
  setReviewStatusSync(issueId, {
@@ -686,7 +838,7 @@ async function triggerPostMergeReleaseIfConfigured(issueId, projectPath) {
686
838
  console.log(`[merge-agent] No release config for ${issueId}; marked release skipped`);
687
839
  return;
688
840
  }
689
- const { runRelease } = await import("./release-engine-CSI4K6Oj.js");
841
+ const { runRelease } = await import("./release-engine-DMINVN8S.js");
690
842
  try {
691
843
  await runRelease(issueId, projectPath);
692
844
  } catch (err) {
@@ -705,10 +857,10 @@ async function triggerPostMergeReleaseIfConfigured(issueId, projectPath) {
705
857
  async function transitionIssueToVerifyingOnMain(issueId, projectPath) {
706
858
  const [effectModule, issueLifecycleModule, githubModule, linearModule, rallyModule, errorsModule] = await Promise.all([
707
859
  import("effect"),
708
- import("./issue-lifecycle-ytsEdDlK.js"),
709
- import("./github-client-4A6FgA8O.js"),
710
- import("./linear-client-Bj1l4FOA.js"),
711
- import("./rally-client-Cqf6EX_r.js"),
860
+ import("./issue-lifecycle-8PSS9Anq.js"),
861
+ import("./github-client-CwBZZ3t7.js"),
862
+ import("./linear-client-YwZMDIwQ.js"),
863
+ import("./rally-client-CGWEHaPd.js"),
712
864
  import("./typed-errors-BHhE85Ul.js")
713
865
  ]);
714
866
  const { Effect, Layer } = effectModule;
@@ -922,49 +1074,50 @@ function parseAgentOutput(output) {
922
1074
  /**
923
1075
  * Get conflict files from git status (async)
924
1076
  */
925
- async function getConflictFiles(projectPath) {
1077
+ function isSyncGitTermination(error) {
1078
+ return error instanceof SyncGitCommandAbortError || error instanceof SyncGitCommandTimeoutError;
1079
+ }
1080
+ async function getConflictFiles(projectPath, signal) {
926
1081
  try {
927
- const { stdout: status } = await execAsync("git diff --name-only --diff-filter=U", {
1082
+ const { stdout: status } = await runSyncGitCommand("git diff --name-only --diff-filter=U", {
928
1083
  cwd: projectPath,
929
- encoding: "utf-8"
1084
+ timeout: SYNC_GIT_STATUS_TIMEOUT_MS,
1085
+ signal
930
1086
  });
931
- return status.split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
1087
+ return status.split("\n").map((line) => line.trim()).filter(Boolean);
932
1088
  } catch (error) {
1089
+ if (isSyncGitTermination(error)) throw error;
933
1090
  console.error("Failed to get conflict files:", error);
934
1091
  return [];
935
1092
  }
936
1093
  }
937
- async function resolveMainPreferredSyncConflicts(projectPath, conflictFiles) {
1094
+ async function resolveMainPreferredSyncConflicts(projectPath, conflictFiles, signal) {
938
1095
  if (conflictFiles.length === 0 || !conflictFiles.every(isSyncMainMainPreferredPath)) return {
939
1096
  success: false,
940
1097
  reason: "conflicts include non-pipeline-owned files"
941
1098
  };
1099
+ const run = (command, timeout = SYNC_GIT_STATUS_TIMEOUT_MS) => runSyncGitCommand(command, {
1100
+ cwd: projectPath,
1101
+ timeout,
1102
+ signal
1103
+ });
942
1104
  try {
943
1105
  for (const path of SYNC_MAIN_MAIN_PREFERRED_PATHS) {
944
- await execAsync(`git rm -r --quiet --ignore-unmatch -- ${path}`, {
945
- cwd: projectPath,
946
- encoding: "utf-8"
947
- });
948
- await execAsync(`git checkout origin/main -- ${path}`, {
949
- cwd: projectPath,
950
- encoding: "utf-8"
951
- }).catch(() => {});
952
- await execAsync(`git add -A -- ${path}`, {
953
- cwd: projectPath,
954
- encoding: "utf-8"
1106
+ await run(`git rm -r --quiet --ignore-unmatch -- ${path}`);
1107
+ await run(`git checkout origin/main -- ${path}`).catch((error) => {
1108
+ if (isSyncGitTermination(error)) throw error;
955
1109
  });
1110
+ await run(`git add -A -- ${path}`);
956
1111
  }
957
- const remainingConflicts = await getConflictFiles(projectPath);
1112
+ const remainingConflicts = await getConflictFiles(projectPath, signal);
958
1113
  if (remainingConflicts.length > 0) return {
959
1114
  success: false,
960
1115
  reason: `Unresolved conflicts remain: ${remainingConflicts.join(", ")}`
961
1116
  };
962
- await execAsync("git commit --no-edit", {
963
- cwd: projectPath,
964
- encoding: "utf-8"
965
- });
1117
+ await run("git commit --no-edit", SYNC_GIT_COMMIT_TIMEOUT_MS);
966
1118
  return { success: true };
967
1119
  } catch (error) {
1120
+ if (isSyncGitTermination(error)) throw error;
968
1121
  return {
969
1122
  success: false,
970
1123
  reason: `Failed to auto-resolve pipeline-owned conflicts: ${error.message}`
@@ -1156,6 +1309,31 @@ async function scanForConflictMarkers(projectPath) {
1156
1309
  return [];
1157
1310
  }
1158
1311
  }
1312
+ async function collectSyncMergeStats(projectPath, signal) {
1313
+ const run = (command) => runSyncGitCommand(command, {
1314
+ cwd: projectPath,
1315
+ timeout: SYNC_GIT_STATUS_TIMEOUT_MS,
1316
+ signal
1317
+ });
1318
+ let changedFiles = [];
1319
+ let commitCount = 0;
1320
+ try {
1321
+ const { stdout } = await run("git diff --name-only ORIG_HEAD HEAD 2>/dev/null || git diff --name-only HEAD~1 HEAD");
1322
+ changedFiles = stdout.trim().split("\n").filter(Boolean);
1323
+ } catch (error) {
1324
+ if (isSyncGitTermination(error)) throw error;
1325
+ }
1326
+ try {
1327
+ const { stdout } = await run("git log ORIG_HEAD..HEAD --oneline 2>/dev/null || echo \"\"");
1328
+ commitCount = stdout.trim().split("\n").filter(Boolean).length;
1329
+ } catch (error) {
1330
+ if (isSyncGitTermination(error)) throw error;
1331
+ }
1332
+ return {
1333
+ changedFiles,
1334
+ commitCount
1335
+ };
1336
+ }
1159
1337
  /**
1160
1338
  * Sync the latest main branch into a workspace's feature branch.
1161
1339
  *
@@ -1166,27 +1344,30 @@ async function scanForConflictMarkers(projectPath) {
1166
1344
  *
1167
1345
  * Auto-commits any uncommitted changes before merging (with safety verification).
1168
1346
  */
1169
- async function syncMainIntoWorkspace(projectPath, issueId) {
1347
+ async function syncMainIntoWorkspace(projectPath, issueId, signal) {
1170
1348
  console.log(`[sync-main] Starting sync of main into workspace for ${issueId}`);
1171
1349
  logActivity("sync_main_start", `Starting sync for ${issueId}`);
1172
- console.log(`[sync-main] Checking for uncommitted changes...`);
1173
- logActivity("sync_main_auto_commit", `Auto-committing uncommitted changes before sync`);
1174
- const autoCommit = await autoCommitWorkspaceChangesBeforeSync(projectPath, issueId);
1175
- if (!autoCommit.success) {
1176
- const message = autoCommit.reason || "Failed to auto-commit uncommitted changes";
1177
- console.error(`[sync-main] ${message}`);
1178
- logActivity("sync_main_blocked", message);
1179
- return {
1180
- success: false,
1181
- reason: message
1182
- };
1183
- }
1184
- if (autoCommit.committed) console.log(`[sync-main] Auto-commit successful`);
1350
+ const run = (command, timeout = SYNC_GIT_STATUS_TIMEOUT_MS) => runSyncGitCommand(command, {
1351
+ cwd: projectPath,
1352
+ timeout,
1353
+ signal
1354
+ });
1355
+ let mergeStarted = false;
1185
1356
  try {
1186
- const { stdout: postCommitStatus } = await execAsync("git status --porcelain", {
1187
- cwd: projectPath,
1188
- encoding: "utf-8"
1189
- });
1357
+ console.log(`[sync-main] Checking for uncommitted changes...`);
1358
+ logActivity("sync_main_auto_commit", `Auto-committing uncommitted changes before sync`);
1359
+ const autoCommit = await autoCommitWorkspaceChangesBeforeSync(projectPath, issueId, signal);
1360
+ if (!autoCommit.success) {
1361
+ const message = autoCommit.reason || "Failed to auto-commit uncommitted changes";
1362
+ console.error(`[sync-main] ${message}`);
1363
+ logActivity("sync_main_blocked", message);
1364
+ return {
1365
+ success: false,
1366
+ reason: message
1367
+ };
1368
+ }
1369
+ if (autoCommit.committed) console.log(`[sync-main] Auto-commit successful`);
1370
+ const { stdout: postCommitStatus } = await run("git status --porcelain");
1190
1371
  if (postCommitStatus.trim()) {
1191
1372
  if (postCommitStatus.trim().split("\n").filter((line) => !isAutoCommitExcludedPath(parseStatusPath(line))).length > 0) {
1192
1373
  const message = "Uncommitted changes remain after auto-commit — aborting sync";
@@ -1198,22 +1379,18 @@ async function syncMainIntoWorkspace(projectPath, issueId) {
1198
1379
  };
1199
1380
  }
1200
1381
  }
1201
- } catch (error) {
1202
- return {
1203
- success: false,
1204
- reason: `Failed to check git status: ${error.message}`
1205
- };
1206
- }
1207
- try {
1208
- const lockCleanup = await Effect.runPromise(cleanupStaleLocks(projectPath));
1209
- if (lockCleanup.found.length > 0) {
1210
- console.log(`[sync-main] Found ${lockCleanup.found.length} lock file(s)`);
1382
+ try {
1383
+ const lockCleanup = await Effect.runPromise(cleanupStaleLocks(projectPath, {
1384
+ signal,
1385
+ processProbeTimeoutMs: SYNC_GIT_STATUS_TIMEOUT_MS
1386
+ }));
1387
+ if (lockCleanup.found.length > 0) console.log(`[sync-main] Found ${lockCleanup.found.length} lock file(s)`);
1211
1388
  if (lockCleanup.removed.length > 0) {
1212
1389
  console.log(`[sync-main] Cleaned up ${lockCleanup.removed.length} stale lock file(s)`);
1213
1390
  logActivity("git_lock_cleanup", `Removed ${lockCleanup.removed.length} stale lock file(s)`);
1214
1391
  }
1215
- if (lockCleanup.errors.some((e) => e.error.includes("Git processes are running"))) {
1216
- const message = "Git processes are still running — cannot safely start sync";
1392
+ if (lockCleanup.errors.length > 0) {
1393
+ const message = `Cannot safely start sync: ${lockCleanup.errors.map(({ file, error }) => `${file}: ${error}`).join("; ")}`;
1217
1394
  console.error(`[sync-main] ${message}`);
1218
1395
  logActivity("sync_main_blocked", message);
1219
1396
  return {
@@ -1221,106 +1398,80 @@ async function syncMainIntoWorkspace(projectPath, issueId) {
1221
1398
  reason: message
1222
1399
  };
1223
1400
  }
1401
+ } catch (lockError) {
1402
+ const message = `Cannot verify Git lock state: ${lockError instanceof Error ? lockError.message : String(lockError)}`;
1403
+ console.error(`[sync-main] ${message}`);
1404
+ logActivity("sync_main_blocked", message);
1405
+ return {
1406
+ success: false,
1407
+ reason: message
1408
+ };
1224
1409
  }
1225
- } catch (lockErr) {
1226
- console.warn(`[sync-main] Lock cleanup warning: ${lockErr.message} (continuing)`);
1227
- }
1228
- try {
1229
1410
  console.log(`[sync-main] Fetching origin/main...`);
1230
- await execAsync("git fetch origin main", {
1231
- cwd: projectPath,
1232
- encoding: "utf-8"
1233
- });
1234
- } catch (error) {
1235
- return {
1236
- success: false,
1237
- reason: `Failed to fetch origin/main: ${error.message}`
1238
- };
1239
- }
1240
- let mergeOutput = "";
1241
- let hasConflicts = false;
1242
- try {
1243
- const result = await execAsync("git merge origin/main", {
1244
- cwd: projectPath,
1245
- encoding: "utf-8"
1246
- });
1247
- mergeOutput = (result.stdout || "") + (result.stderr || "");
1248
- } catch (error) {
1249
- mergeOutput = (error.stdout || "") + (error.stderr || "");
1250
- hasConflicts = true;
1251
- }
1252
- if (mergeOutput.includes("Already up to date") || mergeOutput.includes("Already up-to-date")) {
1253
- console.log(`[sync-main] Already up to date`);
1254
- logActivity("sync_main_noop", `${issueId} already up to date with main`);
1255
- return {
1256
- success: true,
1257
- alreadyUpToDate: true
1258
- };
1259
- }
1260
- if (!hasConflicts) {
1261
- console.log(`[sync-main] Clean merge completed`);
1262
- logActivity("sync_main_success", `Clean merge of main into ${issueId}`);
1263
- let changedFiles = [];
1264
- let commitCount = 0;
1265
1411
  try {
1266
- const { stdout: diffFiles } = await execAsync("git diff --name-only ORIG_HEAD HEAD 2>/dev/null || git diff --name-only HEAD~1 HEAD", {
1267
- cwd: projectPath,
1268
- encoding: "utf-8"
1269
- });
1270
- changedFiles = diffFiles.trim().split("\n").filter((f) => f.length > 0);
1271
- } catch {}
1412
+ await run("git fetch origin main", SYNC_GIT_FETCH_TIMEOUT_MS);
1413
+ } catch (error) {
1414
+ if (isSyncGitTermination(error)) throw error;
1415
+ return {
1416
+ success: false,
1417
+ reason: `Failed to fetch origin/main: ${error.message}`
1418
+ };
1419
+ }
1420
+ let mergeOutput = "";
1421
+ let hasConflicts = false;
1272
1422
  try {
1273
- const { stdout: logOut } = await execAsync("git log ORIG_HEAD..HEAD --oneline 2>/dev/null || echo \"\"", {
1274
- cwd: projectPath,
1275
- encoding: "utf-8"
1276
- });
1277
- commitCount = logOut.trim().split("\n").filter((l) => l.length > 0).length;
1278
- } catch {}
1423
+ mergeStarted = true;
1424
+ const result = await run("git merge origin/main", SYNC_GIT_MERGE_TIMEOUT_MS);
1425
+ mergeStarted = false;
1426
+ mergeOutput = (result.stdout || "") + (result.stderr || "");
1427
+ } catch (error) {
1428
+ if (isSyncGitTermination(error)) throw error;
1429
+ mergeOutput = (error.stdout || "") + (error.stderr || "");
1430
+ hasConflicts = true;
1431
+ }
1432
+ if (mergeOutput.includes("Already up to date") || mergeOutput.includes("Already up-to-date")) {
1433
+ console.log(`[sync-main] Already up to date`);
1434
+ logActivity("sync_main_noop", `${issueId} already up to date with main`);
1435
+ return {
1436
+ success: true,
1437
+ alreadyUpToDate: true
1438
+ };
1439
+ }
1440
+ if (!hasConflicts) {
1441
+ console.log(`[sync-main] Clean merge completed`);
1442
+ logActivity("sync_main_success", `Clean merge of main into ${issueId}`);
1443
+ return {
1444
+ success: true,
1445
+ ...await collectSyncMergeStats(projectPath, signal)
1446
+ };
1447
+ }
1448
+ const conflictFiles = await getConflictFiles(projectPath, signal);
1449
+ if ((await resolveMainPreferredSyncConflicts(projectPath, conflictFiles, signal)).success) {
1450
+ mergeStarted = false;
1451
+ console.log(`[sync-main] Auto-resolved ${conflictFiles.length} pipeline-owned conflict(s) with origin/main`);
1452
+ logActivity("sync_main_auto_resolved_conflicts", `Auto-resolved ${conflictFiles.length} pipeline-owned conflict(s) in ${issueId} with origin/main`);
1453
+ return {
1454
+ success: true,
1455
+ ...await collectSyncMergeStats(projectPath, signal)
1456
+ };
1457
+ }
1458
+ console.log(`[sync-main] ${conflictFiles.length} conflict(s); aborting merge for manual resolution`);
1459
+ logActivity("sync_main_conflicts", `${conflictFiles.length} conflict(s) in ${issueId}: ${conflictFiles.join(", ")}`);
1460
+ await ensureSyncGitQuiescent(projectPath, true);
1461
+ mergeStarted = false;
1279
1462
  return {
1280
- success: true,
1281
- commitCount,
1282
- changedFiles
1463
+ success: false,
1464
+ conflictFiles,
1465
+ reason: `Sync-main produced ${conflictFiles.length} conflict(s) in ${issueId}: ${conflictFiles.join(", ")}. Resolve manually in the workspace, then re-run sync-main.`
1283
1466
  };
1284
- }
1285
- const conflictFiles = await getConflictFiles(projectPath);
1286
- if ((await resolveMainPreferredSyncConflicts(projectPath, conflictFiles)).success) {
1287
- console.log(`[sync-main] Auto-resolved ${conflictFiles.length} pipeline-owned conflict(s) with origin/main`);
1288
- logActivity("sync_main_auto_resolved_conflicts", `Auto-resolved ${conflictFiles.length} pipeline-owned conflict(s) in ${issueId} with origin/main`);
1289
- let changedFiles = [];
1290
- let commitCount = 0;
1291
- try {
1292
- const { stdout: diffFiles } = await execAsync("git diff --name-only ORIG_HEAD HEAD 2>/dev/null || git diff --name-only HEAD~1 HEAD", {
1293
- cwd: projectPath,
1294
- encoding: "utf-8"
1295
- });
1296
- changedFiles = diffFiles.trim().split("\n").filter((f) => f.length > 0);
1297
- } catch {}
1298
- try {
1299
- const { stdout: logOut } = await execAsync("git log ORIG_HEAD..HEAD --oneline 2>/dev/null || echo \"\"", {
1300
- cwd: projectPath,
1301
- encoding: "utf-8"
1302
- });
1303
- commitCount = logOut.trim().split("\n").filter((l) => l.length > 0).length;
1304
- } catch {}
1467
+ } catch (error) {
1468
+ if (!isSyncGitTermination(error)) throw error;
1469
+ await ensureSyncGitQuiescent(projectPath, mergeStarted);
1305
1470
  return {
1306
- success: true,
1307
- commitCount,
1308
- changedFiles
1471
+ success: false,
1472
+ reason: error instanceof SyncGitCommandTimeoutError ? error.message : "Sync-main cancelled after reaching its preparation deadline"
1309
1473
  };
1310
1474
  }
1311
- console.log(`[sync-main] ${conflictFiles.length} conflict(s); aborting merge for manual resolution`);
1312
- logActivity("sync_main_conflicts", `${conflictFiles.length} conflict(s) in ${issueId}: ${conflictFiles.join(", ")}`);
1313
- try {
1314
- await execAsync("git merge --abort", {
1315
- cwd: projectPath,
1316
- encoding: "utf-8"
1317
- });
1318
- } catch {}
1319
- return {
1320
- success: false,
1321
- conflictFiles,
1322
- reason: `Sync-main produced ${conflictFiles.length} conflict(s) in ${issueId}: ${conflictFiles.join(", ")}. Resolve manually in the workspace, then re-run sync-main.`
1323
- };
1324
1475
  }
1325
1476
  /**
1326
1477
  * Look up and run quality gates for the project at projectPath.
@@ -1358,12 +1509,13 @@ async function runProjectQualityGates(projectPath, phase) {
1358
1509
  return [];
1359
1510
  }
1360
1511
  }
1361
- var execAsync, AUTO_COMMIT_EXCLUDED_PATHS, SYNC_MAIN_MAIN_PREFERRED_PATHS, __dirname, MERGE_HISTORY_DIR, MERGE_HISTORY_FILE, _completedPostMerge, _postMergeInFlight, GIT_PATTERNS;
1512
+ var execAsync, SYNC_GIT_FETCH_TIMEOUT_MS, SYNC_GIT_MERGE_TIMEOUT_MS, SYNC_GIT_COMMIT_TIMEOUT_MS, SYNC_GIT_STATUS_TIMEOUT_MS, AUTO_COMMIT_EXCLUDED_PATHS, SYNC_MAIN_MAIN_PREFERRED_PATHS, __dirname, MERGE_HISTORY_DIR, MERGE_HISTORY_FILE, _completedPostMerge, _postMergeInFlight, GIT_PATTERNS;
1362
1513
  var init_merge_agent = __esmMin((() => {
1363
1514
  init_tmux();
1364
1515
  init_activity_logger();
1365
1516
  init_config_yaml();
1366
1517
  init_merge_agent_step0();
1518
+ init_sync_main_git();
1367
1519
  init_paths();
1368
1520
  init_tracker_utils();
1369
1521
  init_validation();
@@ -1375,6 +1527,10 @@ var init_merge_agent = __esmMin((() => {
1375
1527
  init_feature_registry_population();
1376
1528
  init_merge_verification();
1377
1529
  execAsync = promisify(exec);
1530
+ SYNC_GIT_FETCH_TIMEOUT_MS = 6e4;
1531
+ SYNC_GIT_MERGE_TIMEOUT_MS = 12e4;
1532
+ SYNC_GIT_COMMIT_TIMEOUT_MS = 6e4;
1533
+ SYNC_GIT_STATUS_TIMEOUT_MS = 3e4;
1378
1534
  AUTO_COMMIT_EXCLUDED_PATHS = [
1379
1535
  ".pan/kickoff.md",
1380
1536
  ".pan/continue.json",
@@ -1436,4 +1592,4 @@ var init_merge_agent = __esmMin((() => {
1436
1592
  //#endregion
1437
1593
  export { init_operations as C, gitPush as S, listGitOperationsSync as T, scanGitPatterns as _, init_merge_agent as a, triggerPostMergeReleaseIfConfigured as b, isSyncMainMainPreferredPath as c, parseAgentOutput as d, postMergeLifecycle as f, scanForConflictMarkers as g, salvageStrandedMerge as h, captureTmuxOutput as i, logMergeHistory as l, runProjectQualityGates as m, GIT_PATTERNS as n, isAutoCommitExcludedPath as o, resetPostMergeState as p, autoCommitWorkspaceChangesBeforeSync as r, isMergeAgentRunning as s, AUTO_COMMIT_EXCLUDED_PATHS as t, notifyTldrDaemon as u, sendMessageToAgent as v, init_git_activity as w, MainDivergedError as x, syncMainIntoWorkspace as y };
1438
1594
 
1439
- //# sourceMappingURL=merge-agent-DnBsms_V.js.map
1595
+ //# sourceMappingURL=merge-agent-DDiIjzk-.js.map