@overdeck/desktop 0.45.22 → 0.45.24

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 (429) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +2 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DDCnXF58.js} +5 -5
  4. package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BVwW4qRn.js} +6 -6
  5. package/server/{agent-gc-Dj2gncak.js → agent-gc-CHcnvonI.js} +4 -4
  6. package/server/agent-state-Bc3tzUC8.js +3 -0
  7. package/server/{agent-state-service-DistflNn.js → agent-state-service-BsgWxZuB.js} +5 -5
  8. package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-D5UGKIJL.js} +1 -1
  9. package/server/{agents-DXdHmRTC.js → agents-EbI0zCJl.js} +4 -4
  10. package/server/agents-wi9NWzs2.js +3 -0
  11. package/server/{archive-planning-Cp_DC1j-.js → archive-planning-BZDgzoEj.js} +1 -1
  12. package/server/{archive-planning-BvDuWNMo.js → archive-planning-Du25Jtst.js} +30 -6
  13. package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-CbEDfCDu.js} +2 -2
  14. package/server/assemble-J2ZZ2C15.js +339 -0
  15. package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-2R2jog7n.js} +3 -3
  16. package/server/{behavior-CGj16clS.js → behavior-B3exJ42O.js} +2 -2
  17. package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-D1wzUIWv.js} +2 -2
  18. package/server/{build-info-BRpqQvNd.js → build-info-CZk_TITh.js} +1 -1
  19. package/server/{build-info-NU3KbXYw.js → build-info-Ie_D0_BT.js} +3 -3
  20. package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-BI1Wxoku.js} +2 -2
  21. package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-DwbQoqrC.js} +1 -1
  22. package/server/checkpoint-worker.js +1 -1
  23. package/server/{checkpoints-B5jFNi2G.js → checkpoints-BJIs5QIA.js} +1 -1
  24. package/server/{checkpoints-BJum14fs.js → checkpoints-CQB1h765.js} +2 -2
  25. package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-8Ngo8TpT.js} +1 -1
  26. package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-D8GXF3_s.js} +2 -2
  27. package/server/{claude-permissions-nSFKH78M.js → claude-permissions-DNWEVV6z.js} +2 -2
  28. package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CEdaqpWI.js} +2 -2
  29. package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-DWy-Bb4Y.js} +1 -1
  30. package/server/cli-B86rejVV.js +3 -0
  31. package/server/{cli-CbKNkFE5.js → cli-RoOx5DUf.js} +9 -9
  32. package/server/{cliproxy-Brf_5MuG.js → cliproxy-C8a1vtTU.js} +2 -2
  33. package/server/{cliproxy-bONZDBbC.js → cliproxy-fHfIeiGd.js} +1 -1
  34. package/server/{close-issue-CxReRxIc.js → close-issue-DoOifFIK.js} +5 -5
  35. package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-Bk3SU4RC.js} +9 -9
  36. package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CktPXo8m.js} +1 -1
  37. package/server/{codex-CbmztVcc.js → codex-BZXGhUVB.js} +27 -8
  38. package/server/codex-GcHuUF-k.js +3 -0
  39. package/server/{codex-parser-jl8AeAmB.js → codex-parser-CFZ1_1Jl.js} +2 -2
  40. package/server/{config-q4Gvd8dq.js → config-BZ0sHTju.js} +2 -2
  41. package/server/{config-DeTsoZdR.js → config-CKxYiCmX.js} +2 -2
  42. package/server/{config-BJKocXKd.js → config-DzV30TOm.js} +1 -1
  43. package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DySPNmKN.js} +77 -194
  44. package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-BaCVrH-N.js} +3 -3
  45. package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BhAY7TUd.js} +1 -1
  46. package/server/context-layers-BrPmE__h.js +4 -0
  47. package/server/context-layers-igZ4FI4_.js +37 -0
  48. package/server/{control-settings-D_odMIaC.js → control-settings-BQp7_4uD.js} +4 -4
  49. package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CgrR8YYp.js} +8 -8
  50. package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-eQB5CkOe.js} +1 -1
  51. package/server/{conversation-service-Dq33SYEj.js → conversation-service-BLd3MYsG.js} +1 -1
  52. package/server/{conversation-service-C3avRVEr.js → conversation-service-DPJ71F33.js} +329 -19
  53. package/server/{conversations-bYpM9-kZ.js → conversations-6AfUfbwc.js} +5 -5
  54. package/server/{conversations-H9if0bCQ.js → conversations-CAsJF9kh.js} +1 -1
  55. package/server/{cost-Codk1pc2.js → cost-B2ddP6wq.js} +18 -2
  56. package/server/{cost-wH46-WsJ.js → cost-R-m6Yi-W.js} +3 -3
  57. package/server/{cost-sync-D_cre6WM.js → cost-sync-BsN6ER0n.js} +3 -3
  58. package/server/{dag-CJpgf9A3.js → dag-B1ucnjDU.js} +9 -9
  59. package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-BXqeWVSf.js} +1 -1
  60. package/server/dashboard-db-worker.js +7 -7
  61. package/server/{deacon-CkT_kznS.js → deacon-CU_cAYSR.js} +406 -607
  62. package/server/{deacon-B8HbQdqU.js → deacon-kiQrb4ZT.js} +3 -3
  63. package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-6wVqAaqz.js} +3 -3
  64. package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-BXZZ1Z2-.js} +17 -17
  65. package/server/deacon-swarm-C-GwfjJy.js +2 -0
  66. package/server/deacon.js +8 -8
  67. package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-AiFoP8dw.js} +136 -19
  68. package/server/{deploy-window-wDf4UgHt.js → deploy-window-C3F-tihF.js} +77 -10
  69. package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-DkZraDyj.js} +1 -1
  70. package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-bcOWqdQE.js} +2 -2
  71. package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-_d6XhyND.js} +3 -3
  72. package/server/dist-Bzy0y69j.js +3 -0
  73. package/server/{dist-D-Ed5yVw.js → dist-Cb_0uvpS.js} +1 -1
  74. package/server/{docker-BCZ89M9X.js → docker-DcMTFTUC.js} +2 -2
  75. package/server/{dod-DbJLYcHv.js → dod-C6n9RV3G.js} +1 -1
  76. package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-BZgOhRo7.js} +1 -1
  77. package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DNi-ono3.js} +4 -4
  78. package/server/{esm-shims-dTeNdq7X.js → esm-shims-OSHAYaS1.js} +1 -1
  79. package/server/{event-store-TnWdydfB.js → event-store-CQL6NeqB.js} +3 -3
  80. package/server/{event-store-CpBGsO6_.js → event-store-EV2cMiXj.js} +1 -1
  81. package/server/{events-Dsuv6qyB.js → events-BTdrdEq8.js} +1 -1
  82. package/server/{events-DSUdR-04.js → events-DTfAe4My.js} +3 -3
  83. package/server/{factory-BMrK4TrE.js → factory-CFibJuaw.js} +50 -13
  84. package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-DKZFMbFt.js} +4 -4
  85. package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-BdPuLcBX.js} +2 -2
  86. package/server/{features-Bc-Bmiye.js → features-ez2271oH.js} +2 -2
  87. package/server/{feedback-target-DZ-iAnAa.js → feedback-target-7mqqwrX6.js} +7 -7
  88. package/server/{feedback-target-DS6NUuSs.js → feedback-target-CoFDHiM8.js} +1 -1
  89. package/server/{feedback-writer-BXP6g75N.js → feedback-writer-CY5L1lB7.js} +6 -5
  90. package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-D3a22RCd.js} +1 -1
  91. package/server/flywheel-DHrgCphM.js +1084 -0
  92. package/server/flywheel-DzGtWnJ1.js +477 -0
  93. package/server/flywheel-SVF02Jpq.js +2 -0
  94. package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-UU0tiUld.js} +10 -9
  95. package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-UUcsCDb6.js} +1 -1
  96. package/server/{forge-B1S_KZv4.js → forge-CNFnyqps.js} +2 -2
  97. package/server/forge-DXnS_YFH.js +2 -0
  98. package/server/{from-DpwQ-sc3.js → from-kNxT0bZC.js} +1 -1
  99. package/server/{fts-db-DmAcuCkV.js → fts-db-CE46vDkZ.js} +2 -2
  100. package/server/{fts-operations-7d_RkmWp.js → fts-operations-CqY6zl-i.js} +2 -2
  101. package/server/{git-utils-Cc3FHDKd.js → git-utils-CRw2zLPC.js} +68 -3
  102. package/server/git-utils-D0_yhCgF.js +3 -0
  103. package/server/{github-app-CDPtGF7J.js → github-app-C3QrAUd0.js} +27 -8
  104. package/server/{github-app-CU14oYzP.js → github-app-ClZ2lk8D.js} +1 -1
  105. package/server/{github-client-XjTJbBm7.js → github-client-BnIsSrEN.js} +2 -2
  106. package/server/{github-client-CwBZZ3t7.js → github-client-DfQYVUaw.js} +1 -1
  107. package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-D16NGsSO.js} +2 -2
  108. package/server/{harness-binary-B2CTcD84.js → harness-binary-DPUi-Pv8.js} +32 -6
  109. package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-3lNZkyT4.js} +18 -9
  110. package/server/{health-events-DREeevle.js → health-events-BBcTYQKU.js} +2 -2
  111. package/server/{health-events-C1whmd58.js → health-events-BDOHby5Q.js} +1 -1
  112. package/server/{hooks-yxRsjk-z.js → hooks-CKZgXlJb.js} +2 -2
  113. package/server/{hooks-B-HItBiS.js → hooks-DPVX1rwQ.js} +1 -1
  114. package/server/{hume-Dz_OymXE.js → hume-Cz8igP9E.js} +2 -2
  115. package/server/hume-ccTf4wTX.js +3 -0
  116. package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-CuLF0j2H.js} +1 -1
  117. package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-DDIRwxUY.js} +2 -2
  118. package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-CAAkqPLu.js} +2 -2
  119. package/server/{infra-D4iNWMA5.js → infra-BEqFxlJc.js} +14 -4
  120. package/server/{injection-D7T75Pye.js → injection-C8aiVJrF.js} +191 -183
  121. package/server/{injection-BVNa4MQW.js → injection-CPUIqNhI.js} +1 -1
  122. package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-BLuJ1AkT.js} +137 -81
  123. package/server/inspect-agent-Brtz0URj.js +2 -0
  124. package/server/{internal-token-C9DdEOKY.js → internal-token-BrcU6qfe.js} +1 -1
  125. package/server/{internal-token-CXsfxslp.js → internal-token-s0-oKybJ.js} +2 -2
  126. package/server/{io-DQR9PMgS.js → io-C9kF1wtJ.js} +160 -184
  127. package/server/{issue-closed-DtmJM0D0.js → issue-closed-CDJk4pIp.js} +7 -7
  128. package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-B8sZHVHh.js} +1 -1
  129. package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-ojZAzDBP.js} +22 -22
  130. package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-BvJ09SaR.js} +1 -1
  131. package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-Yx5DdmVJ.js} +8 -8
  132. package/server/{issues-pDW9VUNz.js → issues-BMmP_77e.js} +2 -2
  133. package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-BXSlHwEh.js} +3 -3
  134. package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-B0UJwnv5.js} +3 -3
  135. package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-B4iOAjlC.js} +4 -4
  136. package/server/{launcher-generator-COgR2By1.js → launcher-generator-BBWG_SiS.js} +105 -10
  137. package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-BREGpnLk.js} +37 -37
  138. package/server/lifecycle-io-DPo7x11I.js +3 -0
  139. package/server/{lifecycle-CtPDcZ9u.js → lifecycle-xmBfK2GJ.js} +6 -6
  140. package/server/lifecycle-yPd___5E.js +121 -0
  141. package/server/{linear-client-DsFkIxee.js → linear-client-BsuUvkdA.js} +2 -2
  142. package/server/{linear-client-YwZMDIwQ.js → linear-client-CTskEeT_.js} +1 -1
  143. package/server/memory-fts-worker.js +1 -1
  144. package/server/{merge-BwsyNRJV.js → merge-B1DiziGU.js} +1 -1
  145. package/server/{merge-C1t-bspg.js → merge-CefQNAnq.js} +3 -3
  146. package/server/{merge-agent-DDiIjzk-.js → merge-agent-4WOWlSYA.js} +28 -28
  147. package/server/{merge-agent-B-SnXOoc.js → merge-agent-CKkgIBPB.js} +1 -1
  148. package/server/{merge-batch-Byt-QnEl.js → merge-batch-ClFn2T-y.js} +1 -1
  149. package/server/merge-ops-CR44oU9-.js +2 -0
  150. package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-BfaTyXsw.js} +2 -2
  151. package/server/merge-set-DJ8-UErs.js +83 -0
  152. package/server/{merge-set-6LEglm6o.js → merge-set-bUqbm3yc.js} +1 -1
  153. package/server/{merge-sync-B95_4in_.js → merge-sync-BJYeOODr.js} +1 -1
  154. package/server/{merge-sync-Do8_q32h.js → merge-sync-VPV28g0g.js} +2 -2
  155. package/server/{merge-train-CKana8EH.js → merge-train-CHopycP0.js} +3 -3
  156. package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-D1cOZzy2.js} +4 -4
  157. package/server/{merge-verification-CqnUzGEK.js → merge-verification-BkaOqPsw.js} +4 -4
  158. package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-duPAfSBw.js} +2 -2
  159. package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Nw29vaFb.js} +11 -8
  160. package/server/node_modules/.package-lock.json +8 -8
  161. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  162. package/server/node_modules/undici/README.md +5 -0
  163. package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
  164. package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
  165. package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
  166. package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
  167. package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
  168. package/server/node_modules/undici/docs/docs/index.md +5 -0
  169. package/server/node_modules/undici/lib/core/request.js +1 -1
  170. package/server/node_modules/undici/lib/core/util.js +6 -1
  171. package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
  172. package/server/node_modules/undici/lib/dispatcher/client-h1.js +31 -6
  173. package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
  174. package/server/node_modules/undici/lib/handler/cache-handler.js +93 -5
  175. package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
  176. package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
  177. package/server/node_modules/undici/lib/handler/retry-handler.js +6 -4
  178. package/server/node_modules/undici/lib/interceptor/cache.js +21 -4
  179. package/server/node_modules/undici/lib/interceptor/decompress.js +4 -0
  180. package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
  181. package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
  182. package/server/node_modules/undici/lib/util/cache.js +49 -7
  183. package/server/node_modules/undici/lib/web/fetch/body.js +2 -1
  184. package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
  185. package/server/node_modules/undici/package.json +2 -2
  186. package/server/node_modules/undici/types/client.d.ts +2 -2
  187. package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
  188. package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
  189. package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-BvKkWMJQ.js} +15 -13
  190. package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-CTSGcK8p.js} +1 -1
  191. package/server/package-lock.json +9 -9
  192. package/server/package.json +1 -1
  193. package/server/{pan-dir-DOcf6ug3.js → pan-dir-B0c3w0Ya.js} +78 -58
  194. package/server/{paths-DooHpt9p.js → paths-D-xWGHdh.js} +2 -2
  195. package/server/{pickup-CaskQ7j6.js → pickup-DUCLWrJY.js} +17 -16
  196. package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-mY3GprlK.js} +186 -67
  197. package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-BJr8gQX6.js} +1 -1
  198. package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-BXkJzDC4.js} +2 -2
  199. package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-C0MWUeCU.js} +2 -2
  200. package/server/project-repos-B6GycDh9.js +94 -0
  201. package/server/project-repos-DXKQsc_m.js +3 -0
  202. package/server/projects-vjjcmiN8.js +3 -0
  203. package/server/{prompts-EvhMeeHG.js → prompts-DxzFXuLl.js} +2 -2
  204. package/server/{providers-BDDPULlp.js → providers-qQAwGQDW.js} +7 -7
  205. package/server/{providers-DNSQqy2V.js → providers-u4Ga0jOr.js} +1 -1
  206. package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-BamJdinX.js} +4 -4
  207. package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-DfOB8-w4.js} +1 -1
  208. package/server/public/assets/{dist-DukGS2YZ.js → dist-ByIuzMQW.js} +3 -3
  209. package/server/public/assets/{dist-Bio7THQU.js → dist-D7zYSEA6.js} +1 -1
  210. package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-EdmRyXL3.js} +1 -1
  211. package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-MerOfTX8.js} +1 -1
  212. package/server/public/assets/{index-Bwejq-5s.js → index-CWeMerGO.js} +147 -144
  213. package/server/public/assets/index-CenuJ3Cw.css +1 -0
  214. package/server/public/assets/{linear-qUWmMZ-c.js → linear-BBbArIcK.js} +1 -1
  215. package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +1 -0
  216. package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-BKIddiJN.js} +1 -1
  217. package/server/public/assets/{prod-C8VtLuWC.js → prod-B8vYiu52.js} +4 -4
  218. package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-D6RtoULk.js} +1 -1
  219. package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-CLrCedZX.js} +1 -1
  220. package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-hznR8DYl.js} +1 -1
  221. package/server/public/index.html +2 -2
  222. package/server/{pull-requests-By_BteaL.js → pull-requests-7N8WKseP.js} +1 -1
  223. package/server/{pull-requests-8z2N1UOV.js → pull-requests-_lHueOHW.js} +13 -11
  224. package/server/{queries-ZABd5aXP.js → queries-CjNIf-Ub.js} +1200 -201
  225. package/server/{rally-i_goYmiA.js → rally-CyWT_lNO.js} +3 -3
  226. package/server/{rally-api-DqKqIMNR.js → rally-api-C8e_1JRi.js} +2 -2
  227. package/server/{rally-api-xHazRk0d.js → rally-api-ClOSd-Tt.js} +1 -1
  228. package/server/{rally-client-COYz1vYR.js → rally-client-lc-nokqr.js} +4 -4
  229. package/server/{rally-client-CGWEHaPd.js → rally-client-sgtVqzNU.js} +1 -1
  230. package/server/rally-zhhtXuDP.js +3 -0
  231. package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-7KeHv1R1.js} +1 -1
  232. package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-BtHPo6Xc.js} +1 -1
  233. package/server/rebuild-stack-CFvcBHsS.js +4 -0
  234. package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-lwtsW0GO.js} +26 -35
  235. package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-C3Ui7ojV.js} +6 -6
  236. package/server/record-CN0pj4_5.js +3 -0
  237. package/server/{record-update-D3N6WMFR.js → record-update-bLJxAXH4.js} +1 -1
  238. package/server/record-update-dE1Aw83j.js +310 -0
  239. package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BvRWfUXM.js} +2 -2
  240. package/server/{release-engine-DMINVN8S.js → release-engine-Cx48W7z8.js} +5 -5
  241. package/server/{release-set-DeUSOEHy.js → release-set-CQfuN9-v.js} +3 -3
  242. package/server/{remote-b-c5bOce.js → remote-C_2hasl7.js} +3 -3
  243. package/server/{remote-Dr5kGYSZ.js → remote-ChgimyYa.js} +3 -3
  244. package/server/{remote-agents-Ct_WOyke.js → remote-agents-By1ige5O.js} +6 -6
  245. package/server/{remote-agents-D6O_zETW.js → remote-agents-CA3Ihlxj.js} +1 -1
  246. package/server/{remote-completion-Dca3hAaa.js → remote-completion-fVe9e_3u.js} +12 -12
  247. package/server/resume-BFv1PGpA.js +3 -0
  248. package/server/{review-agent-CThvgK2r.js → review-agent-CIGOQYBD.js} +29 -25
  249. package/server/{review-agent-CCum8sGe.js → review-agent-DNboMyW4.js} +1 -1
  250. package/server/{review-artifacts-CXywD0F2.js → review-artifacts-nRDPuMxd.js} +5 -5
  251. package/server/{review-context-OYfKUprb.js → review-context-2uj-YQ8J.js} +70 -26
  252. package/server/review-status-btEYlaxA.js +3 -0
  253. package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-Dci-ZwEt.js} +3 -3
  254. package/server/{review-status-DFRjDFef.js → review-status-kZj_KyCk.js} +77 -28
  255. package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BTOpxtTC.js} +10 -5
  256. package/server/{review-status-sync-D60PJWNL.js → review-status-sync-DSDK3OMy.js} +1 -1
  257. package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CCjVA7Uk.js} +6 -6
  258. package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-CTd4QMBu.js} +1 -1
  259. package/server/{rollup-CZ02qgxk.js → rollup-BKQC7jp4.js} +1 -1
  260. package/server/{rollup-SyuF09e4.js → rollup-FGsKki9R.js} +8 -8
  261. package/server/{scanner-Br0Z5S6R.js → scanner-CnqEZeDy.js} +45 -14
  262. package/server/{sequence-io-fxU0DlwW.js → sequence-io-D909zgeH.js} +4 -4
  263. package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-CzkcK6P5.js} +5 -5
  264. package/server/server.js +2961 -919
  265. package/server/{service-Bagb90KZ.js → service-CLeAoU6G.js} +55 -54
  266. package/server/{session-fork-BqQxd-V6.js → session-fork-CHI1XvL9.js} +2 -2
  267. package/server/{session-history-XdS0JKp3.js → session-history-BT3IvqhC.js} +4 -4
  268. package/server/settings-66A6uvIA.js +2 -0
  269. package/server/{settings-BNbocWOg.js → settings-BTMvpNFU.js} +3 -3
  270. package/server/{settings-uLc6DEYI.js → settings-C0zgxOGf.js} +2 -2
  271. package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BJfgm-hX.js} +2 -2
  272. package/server/{shadow-state-C_NkP-sa.js → shadow-state-7a-524T8.js} +2 -2
  273. package/server/{shadow-state-CbvsN3qG.js → shadow-state-DnDyjujH.js} +1 -1
  274. package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-Db3oroFG.js} +2 -2
  275. package/server/{ship-log-__QtAFXG.js → ship-log-D9MlVzYU.js} +1 -1
  276. package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CV2ukKND.js} +1 -1
  277. package/server/{smart-compaction-CLZOWin1.js → smart-compaction-KCYScAU1.js} +7 -7
  278. package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DKpdFyOC.js} +35 -27
  279. package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-qUC2VWu3.js} +1 -1
  280. package/server/{specialist-completion-CqmduO92.js → specialist-completion-Ky9wCDpb.js} +1 -1
  281. package/server/{specialist-context-CJ-QjFR-.js → specialist-context-Bn3dCGS2.js} +5 -5
  282. package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-CMEwYxa2.js} +2 -2
  283. package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-C5p8G7tx.js} +3 -3
  284. package/server/{specialists-Bg9v4z3F.js → specialists-CC4r-c2s.js} +1015 -460
  285. package/server/{specialists-D0gGXMZx.js → specialists-CShuVGWT.js} +1 -1
  286. package/server/specialists-DM6bWjsi.js +3 -0
  287. package/server/{specialists-CwZHb5cb.js → specialists-jiuuyVkp.js} +66 -74
  288. package/server/specs-C8Wsn2XO.js +3 -0
  289. package/server/{src-BMMoA_ba.js → src-CXmtj0im.js} +6 -6
  290. package/server/{src-Bqdtd6po.js → src-CdmnTM2m.js} +5 -5
  291. package/server/{src-k039WVYY.js → src-DtcUOZCq.js} +112 -18
  292. package/server/stack-health-Bn3o8FBX.js +3 -0
  293. package/server/{stack-health-C-ifC7b0.js → stack-health-DxSdG9cW.js} +63 -9
  294. package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-KJKxxiiQ.js} +4 -4
  295. package/server/{staleness-_Tr-GwdA.js → staleness-CT34nwr9.js} +1 -1
  296. package/server/{staleness-BID1BKdr.js → staleness-DPm7ClwA.js} +15 -3
  297. package/server/{state-home-CONQvZR0.js → state-home-Cn_Qu8IX.js} +96 -44
  298. package/server/{state-migrate-BeBW0KXA.js → state-migrate-BGg2ZaOt.js} +12 -3
  299. package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-DYuPRYYw.js} +307 -26
  300. package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-s9_2qfi6.js} +1 -1
  301. package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-B-FwCs5V.js} +3 -3
  302. package/server/{summary-fork-bX6ax6X7.js → summary-fork-D1RAk9rJ.js} +78 -12
  303. package/server/{summary-fork-agEMsPSo.js → summary-fork-DpcxN9tf.js} +2 -2
  304. package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-Csw5tqfJ.js} +2 -41
  305. package/server/supervisor/pty-supervisor.js +2 -1
  306. package/server/supervisor/pty-token-x-ea28Us.js +43 -0
  307. package/server/supervisor-FTJAIsAK.js +2 -0
  308. package/server/{supervisor-Ctt4eRYz.js → supervisor-wM4ooB5O.js} +3 -3
  309. package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-DlP_UjHq.js} +4 -4
  310. package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-DUDj1YHf.js} +56 -29
  311. package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-DeTTImn-.js} +15 -15
  312. package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-MbxX5vqq.js} +7 -7
  313. package/server/{test-verdict-Cp5tljlJ.js → test-verdict-bWYBtqBg.js} +1 -1
  314. package/server/{test-verdict-D_-sXIz_.js → test-verdict-gscuksPv.js} +1 -1
  315. package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-BYFkts95.js} +1 -1
  316. package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-C-69c3OI.js} +2 -2
  317. package/server/tmux-B6z7h_vZ.js +3 -0
  318. package/server/{tmux-L5LgvGLp.js → tmux-R7N7y-Mh.js} +76 -44
  319. package/server/{token-BkQLy4yS.js → token-BK6t8BIT.js} +2 -2
  320. package/server/token-util-DuPuNriz.js +3 -0
  321. package/server/{token-util-DI8sGlmF.js → token-util-DxXu-vd1.js} +1 -1
  322. package/server/{tracker-config-DdT-nUAM.js → tracker-config-G6latr8C.js} +2 -2
  323. package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-B4ylXZQK.js} +1 -1
  324. package/server/{tracker-utils-CawsPSS2.js → tracker-utils-DHv5pSDT.js} +2 -2
  325. package/server/{traefik-connect-C6mJckNs.js → traefik-connect-Df2uXPsQ.js} +1 -1
  326. package/server/{tunnel-IdK1iTHx.js → tunnel-CDVKJpRv.js} +3 -3
  327. package/server/{tunnel-BIFl98rc.js → tunnel-DGdUkGoZ.js} +1 -1
  328. package/server/{types-7-GnJn0t.js → types-5M0lupud.js} +1 -1
  329. package/server/{uat-train-0Ujk8GCv.js → uat-train-B05BWkp-.js} +1 -1
  330. package/server/{uat-train-j0cPeMSj.js → uat-train-DDSrSoV1.js} +28 -28
  331. package/server/validate-IfDGkaVR.js +177 -0
  332. package/server/{validation-DcAgXTQp.js → validation-CC9OPqJZ.js} +1 -1
  333. package/server/{validation-CabEISJT.js → validation-Dw1pzDzr.js} +259 -9
  334. package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-B3itKTxu.js} +1 -1
  335. package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-TVFSz_q1.js} +1 -1
  336. package/server/{verification-runner-DlJezzef.js → verification-runner-BW4HOKAz.js} +1 -1
  337. package/server/{verification-runner-FiuAZ-H2.js → verification-runner-CkgX6EtI.js} +174 -124
  338. package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DYPbKcIJ.js} +1 -1
  339. package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Du8Vh2aJ.js} +13 -13
  340. package/server/workflows-BQu4RFQ-.js +2 -0
  341. package/server/{workflows-BZNNYkGC.js → workflows-mbQzh6mQ.js} +39 -77
  342. package/server/{workspace-3IC-UkAi.js → workspace--8tnhDI0.js} +1 -1
  343. package/server/{workspace-D9ppycdg.js → workspace-BPUws1-_.js} +3 -3
  344. package/server/{workspace-config-Bigl_-Lk.js → workspace-config-CIVWZOQr.js} +1 -1
  345. package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-CBhNdzE4.js} +76 -18
  346. package/server/workspace-manager-CWT55qeI.js +3 -0
  347. package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-BzHnwwX4.js} +1 -1
  348. package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-_WygnyoX.js} +2 -2
  349. package/server/{workspaces-CFPcL0vl.js → workspaces-Do_9J0LQ.js} +309 -124
  350. package/sync-sources/agents/pan-inspect-agent.md +1 -1
  351. package/sync-sources/agents/pan-merge-agent.md +1 -1
  352. package/sync-sources/agents/pan-planning-agent.md +4 -4
  353. package/sync-sources/agents/pan-work-agent.md +1 -1
  354. package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
  355. package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
  356. package/sync-sources/hooks/record-cost-event.js +369 -75
  357. package/sync-sources/hooks/session-start-hook +7 -0
  358. package/sync-sources/hooks/work-agent-stop-hook +1 -1
  359. package/sync-sources/rules/per-bead-durability.md +1 -1
  360. package/sync-sources/rules/prd-authoring.md +1 -1
  361. package/sync-sources/skills/feature-work/SKILL.md +1 -1
  362. package/sync-sources/skills/okf/README.md +11 -3
  363. package/sync-sources/skills/okf/SKILL.md +12 -1
  364. package/sync-sources/skills/okf/docs/USAGE.md +15 -0
  365. package/sync-sources/skills/okf/references/overdeck.md +28 -0
  366. package/sync-sources/skills/pan/SKILL.md +2 -2
  367. package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
  368. package/sync-sources/skills/pan-approve/SKILL.md +1 -1
  369. package/sync-sources/skills/pan-close/SKILL.md +1 -1
  370. package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
  371. package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
  372. package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
  373. package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
  374. package/sync-sources/skills/pan-orders/SKILL.md +33 -0
  375. package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
  376. package/sync-sources/skills/pan-plan/SKILL.md +6 -6
  377. package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
  378. package/sync-sources/skills/pan-recap/SKILL.md +2 -2
  379. package/sync-sources/skills/pan-review/SKILL.md +1 -1
  380. package/sync-sources/skills/pan-start/SKILL.md +7 -3
  381. package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
  382. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  383. package/sync-sources/skills/pan-task/SKILL.md +2 -2
  384. package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
  385. package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
  386. package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
  387. package/sync-sources/skills/plan/SKILL.md +11 -11
  388. package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
  389. package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
  390. package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
  391. package/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
  392. package/server/agent-state-Co5Sy2Fw.js +0 -3
  393. package/server/agents-DyHKlq1I.js +0 -3
  394. package/server/cli-BRORS9qY.js +0 -3
  395. package/server/codex-DNyiQDKW.js +0 -3
  396. package/server/context-layers-15gDOk20.js +0 -165
  397. package/server/context-layers-DlQKkHH2.js +0 -4
  398. package/server/deacon-swarm-CV54eNmU.js +0 -2
  399. package/server/dist-j64RzSrQ.js +0 -3
  400. package/server/flywheel-6WHU4O7A.js +0 -207
  401. package/server/flywheel-COR0mbRI.js +0 -522
  402. package/server/flywheel-Ctr5uuvo.js +0 -2
  403. package/server/forge-B0_opi-V.js +0 -2
  404. package/server/git-utils-CsKGnzFA.js +0 -3
  405. package/server/hume-BmhvfVbV.js +0 -3
  406. package/server/inspect-agent-Dq0z1k3H.js +0 -2
  407. package/server/layers-Cp1To4L8.js +0 -93
  408. package/server/lifecycle-io-DmY2qwCn.js +0 -3
  409. package/server/merge-blockers-BYjeXrVN.js +0 -41
  410. package/server/merge-ops-DwWCkSgo.js +0 -2
  411. package/server/merge-set-DiISXcC-.js +0 -139
  412. package/server/projects-BKkwpH6q.js +0 -3
  413. package/server/public/assets/index-Bdc4V9ba.css +0 -1
  414. package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
  415. package/server/rally-OSJXdiHK.js +0 -3
  416. package/server/rebuild-stack-CKjJAI8L.js +0 -3
  417. package/server/record-rwK-nKv_.js +0 -3
  418. package/server/record-update-Crz74r-6.js +0 -168
  419. package/server/resume-wZZsWtzz.js +0 -3
  420. package/server/review-status-Bnh-rdkY.js +0 -3
  421. package/server/settings-BlUsVaUc.js +0 -2
  422. package/server/specialists-Dqe6_HE5.js +0 -3
  423. package/server/specs-BhOKBzqk.js +0 -3
  424. package/server/stack-health-Bd06frFn.js +0 -3
  425. package/server/supervisor-COVHrBTg.js +0 -2
  426. package/server/tmux-BAvtac_u.js +0 -3
  427. package/server/token-util-BArZLN6w.js +0 -3
  428. package/server/workflows-C4mR0Reb.js +0 -2
  429. package/server/workspace-manager-B1WOfKvB.js +0 -3
@@ -0,0 +1,477 @@
1
+ import { Tn as init_projects, f as loadConfigSync, fn as findProjectByPathSync, nn as init_state_read_home, rn as resolveStateReadHomeSync, t as init_config_yaml, tt as resolveModel } from "./config-yaml-DySPNmKN.js";
2
+ import { H as sessionExists, w as init_tmux } from "./tmux-R7N7y-Mh.js";
3
+ import { S as FlywheelStatus, f as FlywheelStats, t as init_src } from "./src-DtcUOZCq.js";
4
+ import { b as init_agents } from "./queries-CjNIf-Ub.js";
5
+ import { s as init_internal_token } from "./internal-token-s0-oKybJ.js";
6
+ import { d as isFlywheelAutoPickupBacklog, i as getFlywheelActiveRunId, p as isFlywheelRequireUatBeforeMerge, s as init_control_settings } from "./control-settings-BQp7_4uD.js";
7
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-3lNZkyT4.js";
8
+ import { f as init_github_app } from "./github-app-C3QrAUd0.js";
9
+ import "./substrate-bug-weights-service-B-FwCs5V.js";
10
+ import { t as init_sequence_io } from "./sequence-io-D909zgeH.js";
11
+ import { A as advanceQueue, B as getBook, D as writeFlywheelLaunchMetadata, L as setStatus, O as writeLatestFlywheelStatus, S as nextFlywheelRunId, _ as clearFlywheelGate, d as spawnFlywheel, h as resolvePrimaryWorktreeRoot, m as requireFlywheelBrief, n as abortSpawnedFlywheel, t as FLYWHEEL_ORCHESTRATOR_AGENT_ID, v as getFlywheelRunDetail, w as readFlywheelLaunchMetadata, x as listFlywheelRuns, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-DHrgCphM.js";
12
+ import { r as computeMergeQueue } from "./flywheel-merge-order-UU0tiUld.js";
13
+ import { r as validateBookForStart } from "./validate-IfDGkaVR.js";
14
+ import { join } from "node:path";
15
+ import { Effect, Schema } from "effect";
16
+ import { freemem, totalmem } from "node:os";
17
+ import "node:fs";
18
+ import { readFile, writeFile } from "node:fs/promises";
19
+ import { exec, execFile } from "node:child_process";
20
+ import { promisify } from "node:util";
21
+ import { layer } from "@effect/platform-node/NodeServices";
22
+ //#region ../../cli/commands/flywheel-merge-backend.ts
23
+ init_projects();
24
+ init_config_yaml();
25
+ init_tmux();
26
+ init_src();
27
+ init_internal_token();
28
+ init_control_settings();
29
+ init_harness_resolve();
30
+ init_agents();
31
+ init_github_app();
32
+ //#endregion
33
+ //#region ../../cli/commands/flywheel-orders.ts
34
+ init_state_read_home();
35
+ function orderStateRootFor(cwd) {
36
+ const project = findProjectByPathSync(cwd);
37
+ if (!project) throw new Error(`No configured project contains ${cwd}`);
38
+ return resolveStateReadHomeSync(project).root;
39
+ }
40
+ function validationError(bookId, findings) {
41
+ return new Error([`Order book ${bookId} cannot start:`, ...findings.map((finding) => `- [${finding.code}] ${finding.issue}: ${finding.message}`)].join("\n"));
42
+ }
43
+ function resolveFlywheelOrderStart(cwd, bookId, deps = {}) {
44
+ const stateRoot = (deps.orderStateRoot ?? orderStateRootFor)(cwd);
45
+ const book = (deps.getOrderBook ?? getBook)(stateRoot, bookId);
46
+ if (!book) throw new Error(`Order book not found: ${bookId}`);
47
+ if (book.status !== "ready") throw new Error(`Order book ${book.id} must be ready before start (current status: ${book.status})`);
48
+ const validation = (deps.validateOrderBook ?? validateBookForStart)(stateRoot, book);
49
+ if (validation.blocks.length > 0) throw validationError(book.id, validation.blocks);
50
+ return {
51
+ stateRoot,
52
+ book
53
+ };
54
+ }
55
+ async function resolveFlywheelOrderBriefOverlay(cwd, book, deps = {}) {
56
+ const path = book?.settings.briefOverlay?.trim();
57
+ if (!path) return {};
58
+ const brief = await (deps.requireBrief ?? requireFlywheelBrief)(cwd, path);
59
+ return {
60
+ briefOverlayPath: brief.displayPath,
61
+ briefOverlayContent: await (deps.readBrief ?? ((absolutePath) => readFile(absolutePath, "utf8")))(brief.absolutePath)
62
+ };
63
+ }
64
+ async function compensateFailedFlywheelStart(context, runId, cause, deps = {}) {
65
+ const failures = [cause];
66
+ try {
67
+ await (deps.cleanupSpawnedRun ?? abortSpawnedFlywheel)(runId);
68
+ } catch (error) {
69
+ failures.push(error);
70
+ }
71
+ if (context) try {
72
+ await setFlywheelOrderStatus(context, "ready", null, deps);
73
+ } catch (error) {
74
+ failures.push(error);
75
+ }
76
+ if (failures.length > 1) throw new AggregateError(failures, `Flywheel run ${runId} failed to start and compensation was incomplete`);
77
+ throw cause;
78
+ }
79
+ async function setFlywheelOrderStatus(context, status, runId, deps = {}) {
80
+ await (deps.setOrderStatus ?? setStatus)(context.stateRoot, context.book.id, status, runId === void 0 ? {} : { runId });
81
+ }
82
+ //#endregion
83
+ //#region ../../cli/commands/flywheel-complete.ts
84
+ init_projects();
85
+ init_state_read_home();
86
+ function stateRootFor(workspace) {
87
+ const project = findProjectByPathSync(workspace);
88
+ if (!project) throw new Error(`No configured project contains ${workspace}`);
89
+ return resolveStateReadHomeSync(project).root;
90
+ }
91
+ async function readOptionalFile(path) {
92
+ try {
93
+ return await readFile(path, "utf8");
94
+ } catch (error) {
95
+ if ((typeof error === "object" && error !== null && "code" in error ? error.code : void 0) === "ENOENT") return null;
96
+ throw error;
97
+ }
98
+ }
99
+ function appendFlywheelRetrospective(report, retro) {
100
+ const finding = retro?.trim();
101
+ if (!finding) return {
102
+ report: `${report.trimEnd()}\n\nRetrospective: no findings recognized.\n`,
103
+ retrospectiveIncluded: false
104
+ };
105
+ return {
106
+ report: `${report.trimEnd()}\n\n---\n\n## Retrospective\n\n${finding}\n`,
107
+ retrospectiveIncluded: true
108
+ };
109
+ }
110
+ function nonTerminalIssues(progress) {
111
+ return progress.items.filter((item) => !item.terminal).map((item) => item.issue);
112
+ }
113
+ async function completeFlywheelRun(options, deps) {
114
+ const cwd = options.cwd ?? process.cwd();
115
+ const status = await deps.loadStatus();
116
+ if (!status) throw new Error("no flywheel run to complete");
117
+ const launch = await (deps.readLaunch ?? readFlywheelLaunchMetadata)(status.runId);
118
+ if (!launch) throw new Error(`Flywheel run ${status.runId} is missing launch metadata`);
119
+ const bookId = launch.orders?.bookId;
120
+ if (!bookId) throw new Error(`Flywheel run ${status.runId} is not bound to an order book; use pan flywheel report`);
121
+ const stateRoot = (deps.stateRoot ?? stateRootFor)(launch.workspace);
122
+ const book = (deps.getOrderBook ?? getBook)(stateRoot, bookId);
123
+ if (!book) throw new Error(`Flywheel run ${status.runId} references missing order book ${bookId}`);
124
+ const progress = (deps.computeProgress ?? computeBookProgress)(book);
125
+ const remaining = nonTerminalIssues(progress);
126
+ if (!progress.drained && !options.force) throw new Error(`Order book ${book.id} is not drained; non-terminal items: ${remaining.join(", ")}. Pass --force to complete anyway.`);
127
+ const runDir = getFlywheelRunDir(status.runId);
128
+ const retro = await (deps.readRetro ?? readOptionalFile)(join(runDir, "retro.md"));
129
+ const report = appendFlywheelRetrospective(await deps.buildReport(status, cwd), retro);
130
+ try {
131
+ await deps.persistReport(status, cwd, report.report);
132
+ } finally {
133
+ deps.clearGate(status.runId);
134
+ }
135
+ const nextBook = await (deps.advance ?? advanceQueue)(stateRoot, book.id);
136
+ const startOptions = {
137
+ cwd: launch.workspace,
138
+ brief: launch.briefPath
139
+ };
140
+ if (nextBook) {
141
+ const next = await deps.start({
142
+ ...startOptions,
143
+ orders: nextBook.id
144
+ });
145
+ return {
146
+ runId: status.runId,
147
+ reportPath: join(runDir, "report.md"),
148
+ retrospectiveIncluded: report.retrospectiveIncluded,
149
+ continuation: "next-book",
150
+ nextRunId: next.runId,
151
+ nextBookId: nextBook.id
152
+ };
153
+ }
154
+ if ((deps.autoPickupBacklog ?? isFlywheelAutoPickupBacklog)()) {
155
+ const next = await deps.start(startOptions);
156
+ return {
157
+ runId: status.runId,
158
+ reportPath: join(runDir, "report.md"),
159
+ retrospectiveIncluded: report.retrospectiveIncluded,
160
+ continuation: "backlog",
161
+ nextRunId: next.runId
162
+ };
163
+ }
164
+ return {
165
+ runId: status.runId,
166
+ reportPath: join(runDir, "report.md"),
167
+ retrospectiveIncluded: report.retrospectiveIncluded,
168
+ continuation: "needs-you"
169
+ };
170
+ }
171
+ function createFlywheelCompleteCommand(deps) {
172
+ return async (options = {}) => {
173
+ try {
174
+ const result = await completeFlywheelRun(options, deps);
175
+ if (result.continuation === "next-book") console.log(`Completed ${result.runId}; started ${result.nextRunId} with order book ${result.nextBookId}.`);
176
+ else if (result.continuation === "backlog") console.log(`Completed ${result.runId}; started ${result.nextRunId} in backlog mode.`);
177
+ else console.log("needs-you: pipeline idle — no order book queued and auto-pickup is off");
178
+ } catch (error) {
179
+ console.error(error instanceof Error ? error.message : String(error));
180
+ process.exitCode = 1;
181
+ }
182
+ };
183
+ }
184
+ //#endregion
185
+ //#region ../../cli/commands/flywheel-surfaces.ts
186
+ init_sequence_io();
187
+ init_control_settings();
188
+ init_github_app();
189
+ promisify(exec);
190
+ promisify(execFile);
191
+ //#endregion
192
+ //#region ../../cli/commands/flywheel.ts
193
+ init_control_settings();
194
+ Schema.decodeUnknownSync(FlywheelStatus);
195
+ Schema.decodeUnknownSync(FlywheelStats);
196
+ const execAsync = promisify(exec);
197
+ function mb(bytes) {
198
+ return Math.round(bytes / 1024 / 1024);
199
+ }
200
+ async function resolveFlywheelRoleConfig() {
201
+ const { config } = loadConfigSync();
202
+ const flywheel = config.roles?.flywheel;
203
+ const model = resolveModel("flywheel", void 0, config);
204
+ return {
205
+ harness: await resolveHarness({ model }),
206
+ model,
207
+ effort: flywheel?.effort ?? "high",
208
+ minAgents: flywheel?.minAgents ?? 20,
209
+ maxAgents: flywheel?.maxAgents ?? 30,
210
+ scope: flywheel?.scope ?? "pan-only",
211
+ autoPickupBacklog: isFlywheelAutoPickupBacklog(),
212
+ requireUatBeforeMerge: isFlywheelRequireUatBeforeMerge()
213
+ };
214
+ }
215
+ async function createInitialFlywheelStatus(runId, startedAt, cwd, agentModel, agentHarness, roleConfig) {
216
+ const ramTotalMb = mb(totalmem());
217
+ return {
218
+ runId,
219
+ startedAt,
220
+ elapsedMs: 0,
221
+ orchestrator: {
222
+ harness: agentHarness ?? roleConfig.harness,
223
+ model: agentModel ?? roleConfig.model,
224
+ effort: roleConfig.effort,
225
+ ctxPercent: 0
226
+ },
227
+ headline: {
228
+ bugsFixed: 0,
229
+ swarmItemsMerged: 0,
230
+ swarmItemsTotal: 0,
231
+ prsMerged: 0,
232
+ awaitingUat: 0
233
+ },
234
+ activePipeline: [],
235
+ substrateBugs: [],
236
+ agents: [{
237
+ id: FLYWHEEL_ORCHESTRATOR_AGENT_ID,
238
+ label: "flywheel-orchestrator",
239
+ status: "running",
240
+ role: "flywheel",
241
+ model: agentModel
242
+ }],
243
+ parked: [],
244
+ suggestions: [],
245
+ system: {
246
+ mainHead: await gitOutput("git rev-parse --short HEAD", cwd).catch(() => "unknown"),
247
+ ramUsedMb: Math.max(0, ramTotalMb - mb(freemem())),
248
+ ramTotalMb,
249
+ swapUsedMb: 0,
250
+ swapTotalMb: 0,
251
+ agentsActive: 1,
252
+ agentsCap: roleConfig.maxAgents
253
+ },
254
+ openQuestions: [],
255
+ ticks: 0,
256
+ lastTickAt: startedAt
257
+ };
258
+ }
259
+ async function startFlywheelRun(options = {}, deps = {}) {
260
+ const cwd = options.cwd ?? await (deps.resolvePrimaryRoot ?? resolvePrimaryWorktreeRoot)(process.cwd());
261
+ const brief = await (deps.requireBrief ?? requireFlywheelBrief)(cwd, options.brief);
262
+ const orderContext = options.orders ? resolveFlywheelOrderStart(cwd, options.orders, deps) : null;
263
+ const book = orderContext?.book ?? null;
264
+ const overlay = await resolveFlywheelOrderBriefOverlay(cwd, book, deps);
265
+ const runId = await (deps.nextRunId ?? nextFlywheelRunId)();
266
+ const startedAt = (/* @__PURE__ */ new Date()).toISOString();
267
+ const launchMetadata = {
268
+ version: 1,
269
+ runId,
270
+ workspace: cwd,
271
+ briefPath: brief.absolutePath,
272
+ briefDisplayPath: brief.displayPath,
273
+ ...overlay.briefOverlayPath ? { briefOverlayPath: overlay.briefOverlayPath } : {},
274
+ ...book ? { orders: { bookId: book.id } } : {}
275
+ };
276
+ await (deps.writeLaunchMetadata ?? writeFlywheelLaunchMetadata)(launchMetadata);
277
+ const roleConfig = await (deps.resolveRoleConfig ?? resolveFlywheelRoleConfig)();
278
+ const agent = await (deps.spawn ?? spawnFlywheel)({
279
+ runId,
280
+ briefPath: brief.absolutePath,
281
+ ...overlay,
282
+ workspace: cwd,
283
+ model: roleConfig.model,
284
+ harness: roleConfig.harness,
285
+ effort: roleConfig.effort,
286
+ minAgents: roleConfig.minAgents,
287
+ maxAgents: roleConfig.maxAgents,
288
+ scope: roleConfig.scope,
289
+ autoPickupBacklog: roleConfig.autoPickupBacklog,
290
+ requireUatBeforeMerge: roleConfig.requireUatBeforeMerge
291
+ });
292
+ try {
293
+ if (orderContext) await setFlywheelOrderStatus(orderContext, "running", runId, deps);
294
+ await (deps.writeStatus ?? writeLatestFlywheelStatus)(await createInitialFlywheelStatus(runId, startedAt, cwd, agent.model, agent.harness, roleConfig));
295
+ return {
296
+ runId,
297
+ briefDisplayPath: brief.displayPath,
298
+ agentModel: agent.model
299
+ };
300
+ } catch (error) {
301
+ return compensateFailedFlywheelStart(orderContext, runId, error, deps);
302
+ }
303
+ }
304
+ function runNumberFromRunId(runId) {
305
+ const match = /^RUN-(\d+)$/.exec(runId);
306
+ if (!match) throw new Error(`Invalid Flywheel run id for report: ${runId}`);
307
+ return Number(match[1]);
308
+ }
309
+ function reportDate(status) {
310
+ return status.lastTickAt.slice(0, 10);
311
+ }
312
+ function tableCell(value) {
313
+ return String(value ?? "").replace(/\|/g, "\\|").replace(/\n/g, " ");
314
+ }
315
+ function formatFlywheelStateReport(status, mergeQueue = []) {
316
+ const runNumber = runNumberFromRunId(status.runId);
317
+ const suggestionRows = status.suggestions.length > 0 ? status.suggestions.map((suggestion) => `| ${tableCell(suggestion.priority)} | ${tableCell(suggestion.action)} | ${tableCell(suggestion.issueId)} | ${tableCell(suggestion.rationale)} |`).join("\n") : "No suggestions emitted this run.";
318
+ const activePipelineRows = status.activePipeline.length > 0 ? status.activePipeline.map((item) => `| ${tableCell(item.issueId)} | ${tableCell(item.verb)} | ${tableCell(item.status)} | ${tableCell(item.title)} | ${tableCell(item.progressPercent)} | ${tableCell(item.pr)} |`).join("\n") : "| _None_ | | | | | |";
319
+ const substrateRows = status.substrateBugs.length > 0 ? status.substrateBugs.map((bug) => `| ${tableCell(bug.issueId)} | ${tableCell(bug.status)} | ${tableCell(bug.title)} | ${tableCell(bug.commitSha?.slice(0, 10))} |`).join("\n") : "| _None_ | | | |";
320
+ const patternLines = status.parked.length > 0 ? status.parked.map((item) => `- **${item.issueId}** (${item.reason}) — ${item.title}`).join("\n") : "- None recorded this run.";
321
+ const questionLines = status.openQuestions.length > 0 ? status.openQuestions.map((question) => `- ${question}`).join("\n") : "- None.";
322
+ const mergeQueueSection = mergeQueue.length > 0 ? `## Merge Queue
323
+
324
+ Merge ship-ready PRs in this order to avoid rebase conflicts. Branches with overlapping file changes must be merged in sequence; non-overlapping branches can be merged in any order.
325
+
326
+ | # | Issue | PR | Conflicts With |
327
+ |---|---|---|---|
328
+ ${mergeQueue.map((item) => {
329
+ const prCell = item.pr != null ? `#${item.pr}` : "—";
330
+ const conflictsCell = item.conflictsWith.length > 0 ? item.conflictsWith.join(", ") : "—";
331
+ return `| ${item.mergeOrder} | ${item.issueId} | ${prCell} | ${conflictsCell} |`;
332
+ }).join("\n")}
333
+
334
+ ---
335
+
336
+ ` : "";
337
+ return `# Flywheel Run ${runNumber} Report — ${reportDate(status)}
338
+
339
+ Per-run report derived from the last \`FlywheelStatus\` snapshot. Durable cumulative memory across runs lives in \`docs/FLYWHEEL-STATE.md\`.
340
+
341
+ **Run window:** ${status.startedAt} → ${status.lastTickAt} (${status.orchestrator.harness}, ${status.orchestrator.model}, ${status.orchestrator.effort})
342
+
343
+ **Headline result:** ${status.headline.bugsFixed} substrate bugs fixed; ${status.headline.swarmItemsMerged}/${status.headline.swarmItemsTotal} SWARM items merged; ${status.headline.prsMerged} PRs merged; ${status.headline.awaitingUat} awaiting UAT.
344
+
345
+ **Run counters:** ticks ${status.ticks}; last tick ${status.lastTickAt}; orchestrator context ${status.orchestrator.ctxPercent}%.
346
+
347
+ ---
348
+
349
+ ${mergeQueueSection}## Suggestions
350
+
351
+ ${status.suggestions.length > 0 ? `| Priority | Action | Issue | Rationale |
352
+ |---|---|---|---|
353
+ ${suggestionRows}` : suggestionRows}
354
+
355
+ ---
356
+
357
+ ## Active Pipeline
358
+
359
+ | Issue | Verb | Status | Title | Progress | PR |
360
+ |---|---|---|---|---:|---:|
361
+ ${activePipelineRows}
362
+
363
+ ---
364
+
365
+ ## Cycling Alerts
366
+
367
+ ${questionLines}
368
+
369
+ ---
370
+
371
+ ## Infrastructure Gaps
372
+
373
+ | Issue | Status | Notes | Commit |
374
+ |---|---|---|---|
375
+ ${substrateRows}
376
+
377
+ ---
378
+
379
+ ## Pattern Ledger
380
+
381
+ ${patternLines}
382
+
383
+ ---
384
+
385
+ ## Skill Gaps
386
+
387
+ - Keep \`pan flywheel report\` in the closeout path so run summaries stay archived under the run directory.
388
+ `;
389
+ }
390
+ async function isFlywheelStateDirty(cwd) {
391
+ try {
392
+ const { stdout } = await execAsync("git status --porcelain docs/FLYWHEEL-STATE.md", {
393
+ cwd,
394
+ encoding: "utf8"
395
+ });
396
+ return stdout.trim().length > 0;
397
+ } catch {
398
+ return false;
399
+ }
400
+ }
401
+ async function loadReportFlywheelStatus() {
402
+ const activeRunId = getFlywheelActiveRunId();
403
+ if (activeRunId) {
404
+ const activeDetail = await getFlywheelRunDetail(activeRunId);
405
+ if (activeDetail?.latest) return activeDetail.latest;
406
+ }
407
+ const runs = await listFlywheelRuns();
408
+ const run = runs.find((candidate) => candidate.status === "running") ?? runs[0];
409
+ if (!run) return null;
410
+ return (await getFlywheelRunDetail(run.id))?.latest ?? null;
411
+ }
412
+ async function gitOutput(command, cwd) {
413
+ const { stdout } = await execAsync(command, {
414
+ cwd,
415
+ encoding: "utf8"
416
+ });
417
+ return stdout.trim();
418
+ }
419
+ async function commitFlywheelStateChanges(cwd, runNumber) {
420
+ const subject = `docs(flywheel): run ${runNumber}`;
421
+ await execAsync("git add docs/FLYWHEEL-STATE.md", { cwd });
422
+ await execAsync(await gitOutput("git log -1 --format=%s", cwd).catch(() => "") === subject ? `git commit --amend -m ${JSON.stringify(subject)}` : `git commit -m ${JSON.stringify(subject)}`, {
423
+ cwd,
424
+ encoding: "utf8"
425
+ });
426
+ }
427
+ function clearFlywheelRunGate(runId) {
428
+ if (getFlywheelActiveRunId() === runId) clearFlywheelGate();
429
+ }
430
+ async function buildFlywheelStateReport(status, cwd) {
431
+ return formatFlywheelStateReport(status, await Effect.runPromise(computeMergeQueue(status.activePipeline, cwd).pipe(Effect.provide(layer))));
432
+ }
433
+ async function persistFlywheelStateReport(status, cwd, report) {
434
+ const runNumber = runNumberFromRunId(status.runId);
435
+ await writeFile(join(getFlywheelRunDir(status.runId), "report.md"), report, "utf8");
436
+ if (await isFlywheelStateDirty(cwd)) {
437
+ await commitFlywheelStateChanges(cwd, runNumber);
438
+ console.log(`Wrote per-run report and committed FLYWHEEL-STATE.md changes for run ${runNumber}.`);
439
+ } else console.log(`Wrote per-run report for run ${runNumber}. No FLYWHEEL-STATE.md changes to commit.`);
440
+ }
441
+ async function flywheelReportCommand(options = {}) {
442
+ try {
443
+ const cwd = options.cwd ?? process.cwd();
444
+ if (!options.force && await Effect.runPromise(sessionExists("flywheel-orchestrator"))) {
445
+ console.error("Refusing to write report — flywheel orchestrator session is still alive.");
446
+ console.error("This command finalizes the run (writes report.md and clears the active-run gate).");
447
+ console.error("Run `pan flywheel pause` (or `pan flywheel abort`) first, or pass --force to override.");
448
+ process.exitCode = 1;
449
+ return;
450
+ }
451
+ const status = await loadReportFlywheelStatus();
452
+ if (!status) {
453
+ console.error("no flywheel run to report");
454
+ process.exitCode = 1;
455
+ return;
456
+ }
457
+ try {
458
+ await persistFlywheelStateReport(status, cwd, await buildFlywheelStateReport(status, cwd));
459
+ } finally {
460
+ clearFlywheelRunGate(status.runId);
461
+ }
462
+ } catch (error) {
463
+ console.error(error instanceof Error ? error.message : String(error));
464
+ process.exitCode = 1;
465
+ }
466
+ }
467
+ createFlywheelCompleteCommand({
468
+ loadStatus: loadReportFlywheelStatus,
469
+ buildReport: buildFlywheelStateReport,
470
+ persistReport: persistFlywheelStateReport,
471
+ clearGate: clearFlywheelRunGate,
472
+ start: startFlywheelRun
473
+ });
474
+ //#endregion
475
+ export { flywheelReportCommand, startFlywheelRun };
476
+
477
+ //# sourceMappingURL=flywheel-DzGtWnJ1.js.map
@@ -0,0 +1,2 @@
1
+ import { c as pauseFlywheel, l as resumeFlywheel } from "./flywheel-DHrgCphM.js";
2
+ export { pauseFlywheel, resumeFlywheel };
@@ -1,9 +1,9 @@
1
- import { Fn as getProjectSwarmHotspots, Hn as init_projects, kn as findProjectByPathSync } from "./config-yaml-ig8Nwtiw.js";
2
- import { c as init_review_status, p as mergeGateEligibility, s as getReviewStatusSync } from "./review-status-DFRjDFef.js";
3
- import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-CawsPSS2.js";
4
- import { l as init_dag, r as compileGlob } from "./dag-CJpgf9A3.js";
5
- import { n as computeIssueFootprint, r as init_swarm_readiness } from "./swarm-readiness-DdmJVX7y.js";
6
- import { c as classifyIssue, h as isAutoPickable, m as init_pickup } from "./pickup-CaskQ7j6.js";
1
+ import { Tn as init_projects, fn as findProjectByPathSync, vn as getProjectSwarmHotspots } from "./config-yaml-DySPNmKN.js";
2
+ import { c as getReviewStatusSync, l as init_review_status, m as mergeGateEligibility } from "./review-status-kZj_KyCk.js";
3
+ import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-DHv5pSDT.js";
4
+ import { l as init_dag, r as compileGlob } from "./dag-B1ucnjDU.js";
5
+ import { n as computeIssueFootprint, r as init_swarm_readiness } from "./swarm-readiness-DlP_UjHq.js";
6
+ import { c as classifyIssue, h as isAutoPickable, m as init_pickup } from "./pickup-DUCLWrJY.js";
7
7
  import { Effect } from "effect";
8
8
  import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
9
9
  //#region ../../lib/flywheel-merge-order.ts
@@ -192,7 +192,7 @@ const computeMergeQueue = (items, projectRoot, options = {}) => Effect.gen(funct
192
192
  * - not in-pipeline (active review/work/test)
193
193
  * - no parked labels (`parked`; legacy `needs-design`/`needs-discussion`)
194
194
  * - not in the optional exclusion set (e.g. already running agents)
195
- * - FR-14: must have a vBRIEF spec (ready) or a PRD draft (hasPrd)
195
+ * - FR-14: must have an xBRIEF spec (ready) or a PRD draft (hasPrd)
196
196
  *
197
197
  * Returns null when no eligible issue is found.
198
198
  */
@@ -208,10 +208,11 @@ function pickFromSequence(nodes, opts) {
208
208
  const signalByIssue = new Map((opts?.predictedConflictSignals ?? []).map((signal) => [signal.issueId.toUpperCase(), signal]));
209
209
  const eligible = [...nodes].sort((a, b) => a.rank - b.rank).filter((node) => {
210
210
  const state = classifyIssue(node, lookups);
211
+ const activeBookMember = opts?.activeBookMembership?.has(node.issue.toUpperCase()) ?? false;
211
212
  if (!isAutoPickable(opts?.requireReady ? state : {
212
213
  ...state,
213
214
  ready: true
214
- }, opts?.autoPickupBacklog ?? false)) return false;
215
+ }, opts?.autoPickupBacklog ?? false, activeBookMember)) return false;
215
216
  if (opts?.excludeIssueIds?.has(node.issue)) return false;
216
217
  if (opts?.isAuthorizedIssue && !opts.isAuthorizedIssue(node.issue)) return false;
217
218
  return true;
@@ -241,4 +242,4 @@ function pickFromSequence(nodes, opts) {
241
242
  //#endregion
242
243
  export { declaredIssueFootprint as a, resolveMergeQueuePrUrl as c, computePredictedConflictSignals as i, reviewRecordEligibility as l, changedFilesVsMain as n, orderMergeCandidates as o, computeMergeQueue as r, pickFromSequence as s, MERGE_GATE_VERBS as t };
243
244
 
244
- //# sourceMappingURL=flywheel-merge-order-CTgHeg-W.js.map
245
+ //# sourceMappingURL=flywheel-merge-order-UU0tiUld.js.map
@@ -1,2 +1,2 @@
1
- import { c as resolveMergeQueuePrUrl, l as reviewRecordEligibility, r as computeMergeQueue } from "./flywheel-merge-order-CTgHeg-W.js";
1
+ import { c as resolveMergeQueuePrUrl, l as reviewRecordEligibility, r as computeMergeQueue } from "./flywheel-merge-order-UU0tiUld.js";
2
2
  export { computeMergeQueue, resolveMergeQueuePrUrl, reviewRecordEligibility };
@@ -1,4 +1,4 @@
1
- import { S as parsePullRequestRef, d as getPullRequestState, f as init_github_app, p as isGitHubAppConfigured, v as listPullRequestsForHead, x as mergePullRequestWithApp } from "./github-app-CDPtGF7J.js";
1
+ import { S as parsePullRequestRef, d as getPullRequestState, f as init_github_app, p as isGitHubAppConfigured, v as listPullRequestsForHead, x as mergePullRequestWithApp } from "./github-app-C3QrAUd0.js";
2
2
  import { join } from "node:path";
3
3
  import { Data, Effect } from "effect";
4
4
  import { tmpdir } from "node:os";
@@ -267,4 +267,4 @@ function getForgeAdapter(forge) {
267
267
  //#endregion
268
268
  export { getForgeAdapter as n, parseArtifactRef as r, GITHUB_MERGE_TIMEOUT_MS as t };
269
269
 
270
- //# sourceMappingURL=forge-B1S_KZv4.js.map
270
+ //# sourceMappingURL=forge-CNFnyqps.js.map
@@ -0,0 +1,2 @@
1
+ import { n as getForgeAdapter } from "./forge-CNFnyqps.js";
2
+ export { getForgeAdapter };
@@ -3841,4 +3841,4 @@ var init_from = __esmMin((() => {
3841
3841
  //#endregion
3842
3842
  export { File as a, init_esm_min as i, FormData as n, Blob as o, formDataToBlob as r, init_fetch_blob as s, init_from as t };
3843
3843
 
3844
- //# sourceMappingURL=from-DpwQ-sc3.js.map
3844
+ //# sourceMappingURL=from-kNxT0bZC.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { a as runMemoryFtsTransactionSync, i as runMemoryFtsStatementSync, n as getMemoryFtsDatabaseSync, r as init_fts_operations, t as closeMemoryFtsDatabasesInProcess } from "./fts-operations-7d_RkmWp.js";
2
+ import { a as runMemoryFtsTransactionSync, i as runMemoryFtsStatementSync, n as getMemoryFtsDatabaseSync, r as init_fts_operations, t as closeMemoryFtsDatabasesInProcess } from "./fts-operations-CqY6zl-i.js";
3
3
  import { Worker } from "node:worker_threads";
4
4
  //#region ../../lib/memory/fts-db.ts
5
5
  async function getMemoryFtsDatabase(projectId) {
@@ -143,4 +143,4 @@ var init_fts_db = __esmMin((() => {
143
143
  //#endregion
144
144
  export { withMemoryFtsDatabase as a, runMemoryFtsTransaction as i, init_fts_db as n, runMemoryFtsStatement as r, closeMemoryFtsDatabases as t };
145
145
 
146
- //# sourceMappingURL=fts-db-DmAcuCkV.js.map
146
+ //# sourceMappingURL=fts-db-CE46vDkZ.js.map
@@ -1,6 +1,6 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
2
  import { n as openDatabase, t as init_driver } from "./driver-CKVGi51s.js";
3
- import { i as init_paths, o as resolveFtsDbPath } from "./paths-DooHpt9p.js";
3
+ import { i as init_paths, o as resolveFtsDbPath } from "./paths-D-xWGHdh.js";
4
4
  import { dirname } from "node:path";
5
5
  import { mkdirSync } from "node:fs";
6
6
  //#region ../../lib/memory/fts-operations.ts
@@ -131,4 +131,4 @@ var init_fts_operations = __esmMin((() => {
131
131
  //#endregion
132
132
  export { runMemoryFtsTransactionSync as a, runMemoryFtsStatementSync as i, getMemoryFtsDatabaseSync as n, init_fts_operations as r, closeMemoryFtsDatabasesInProcess as t };
133
133
 
134
- //# sourceMappingURL=fts-operations-7d_RkmWp.js.map
134
+ //# sourceMappingURL=fts-operations-CqY6zl-i.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Sr as GitError, jr as init_errors, xr as FsError } from "./config-yaml-ig8Nwtiw.js";
2
+ import { ar as GitError, ir as FsError, mr as init_errors } from "./config-yaml-DySPNmKN.js";
3
3
  import { Effect } from "effect";
4
4
  import { existsSync, readdirSync, unlinkSync } from "fs";
5
5
  import { join } from "path";
@@ -142,6 +142,43 @@ async function cleanupStaleLocksPromise(repoPath, options) {
142
142
  }
143
143
  return result;
144
144
  }
145
+ /**
146
+ * Parse a polyrepo head anchor such as `fe@<sha> api@<sha>`.
147
+ * Plain single-repo refs return null. Malformed composite anchors fail before
148
+ * any caller can accidentally pass the whitespace-containing value to git.
149
+ */
150
+ function parseWorkspaceHeadAnchor(anchor) {
151
+ const normalized = anchor.trim();
152
+ if (!normalized.includes("@")) {
153
+ if (/\s/.test(normalized)) throw new Error(`Invalid workspace head anchor: ${anchor}`);
154
+ return null;
155
+ }
156
+ return normalized.split(/\s+/).map((token) => {
157
+ const match = /^([^@\s]+)@([0-9a-fA-F]{40,64})$/.exec(token);
158
+ if (!match) throw new Error(`Invalid workspace head anchor token '${token}' in '${anchor}'`);
159
+ return {
160
+ repoKey: match[1],
161
+ sha: match[2]
162
+ };
163
+ });
164
+ }
165
+ /**
166
+ * Render `git show` for a single-repo ref or every entry in a polyrepo anchor.
167
+ * Composite entries are resolved to their nested worktree and labeled using
168
+ * the same repo-section convention as review and inspect diff summaries.
169
+ */
170
+ async function renderWorkspaceGitShowPromise(issueId, workspacePath, anchor, args, gitShow) {
171
+ const entries = parseWorkspaceHeadAnchor(anchor);
172
+ if (!entries) return gitShow(workspacePath, anchor.trim(), args);
173
+ if (!issueId) throw new Error(`Cannot resolve composite workspace head anchor '${anchor}' without an issue id`);
174
+ const { resolveWorkspaceRepoRootsSync } = await import("./project-repos-DXKQsc_m.js");
175
+ const rootsByKey = new Map(resolveWorkspaceRepoRootsSync(issueId, workspacePath).map((root) => [root.repoKey, root]));
176
+ return (await Promise.all(entries.map(async ({ repoKey, sha }) => {
177
+ const root = rootsByKey.get(repoKey);
178
+ if (!root) throw new Error(`Composite workspace head anchor repo '${repoKey}' was not found in ${workspacePath}`);
179
+ return `── ${repoKey} ──\n${(await gitShow(root.dir, sha, args)).trimEnd()}`;
180
+ }))).join("\n");
181
+ }
145
182
  async function getWorkspaceGitInfoPromise(workspacePath) {
146
183
  try {
147
184
  const [headResult, branchResult] = await Promise.all([execAsync("git rev-parse HEAD", { cwd: workspacePath }), execAsync("git rev-parse --abbrev-ref HEAD", { cwd: workspacePath })]);
@@ -154,6 +191,34 @@ async function getWorkspaceGitInfoPromise(workspacePath) {
154
191
  throw new Error(`getWorkspaceGitInfo failed for ${workspacePath}: ${msg}`);
155
192
  }
156
193
  }
194
+ /**
195
+ * Snapshot the code HEAD(s) of a workspace for drift comparison (PAN-2948).
196
+ *
197
+ * Monorepo: returns the workspace HEAD SHA (unchanged behavior). Polyrepo:
198
+ * returns a composite `fe@<sha> api@<sha>` over the sub-repo worktrees —
199
+ * the wrapper repo at the workspace root is a one-commit artifacts repo whose
200
+ * SHA never changes, so snapshotting it makes every drift comparison
201
+ * (reviewedAtCommit vs lastVerifiedCommit, reviewer verdict anchors) report
202
+ * "no drift" forever. Composite snapshots compare equal iff every sub-repo
203
+ * head is unchanged; consumers that try to use the anchor as a git ref fail
204
+ * the ref lookup and fall back to their conservative full-rerun path.
205
+ */
206
+ async function snapshotWorkspaceHeadsPromise(issueId, workspacePath) {
207
+ const { resolveWorkspaceRepoRootsSync } = await import("./project-repos-DXKQsc_m.js");
208
+ const roots = resolveWorkspaceRepoRootsSync(issueId, workspacePath);
209
+ const isPolyrepo = roots.some((root) => root.isPolyrepo);
210
+ const heads = [];
211
+ for (const root of roots) try {
212
+ const { stdout } = await execAsync("git rev-parse HEAD", {
213
+ cwd: root.dir,
214
+ encoding: "utf-8",
215
+ timeout: 1e4
216
+ });
217
+ const sha = stdout.trim();
218
+ if (sha) heads.push(isPolyrepo ? `${root.repoKey}@${sha}` : sha);
219
+ } catch {}
220
+ return heads.length > 0 ? heads.join(" ") : void 0;
221
+ }
157
222
  async function hasStaleLocksPromise(repoPath) {
158
223
  if (findGitLockFiles(repoPath).length === 0) return false;
159
224
  return (await hasRunningGitProcesses(repoPath, {})).status === "idle";
@@ -193,6 +258,6 @@ var init_git_utils = __esmMin((() => {
193
258
  hasStaleLocks = (repoPath) => Effect.promise(() => hasStaleLocksPromise(repoPath));
194
259
  }));
195
260
  //#endregion
196
- export { init_git_utils as i, getWorkspaceGitInfo as n, hasStaleLocks as r, cleanupStaleLocks as t };
261
+ export { parseWorkspaceHeadAnchor as a, init_git_utils as i, getWorkspaceGitInfo as n, renderWorkspaceGitShowPromise as o, hasStaleLocks as r, snapshotWorkspaceHeadsPromise as s, cleanupStaleLocks as t };
197
262
 
198
- //# sourceMappingURL=git-utils-Cc3FHDKd.js.map
263
+ //# sourceMappingURL=git-utils-CRw2zLPC.js.map