@overdeck/desktop 0.45.16 → 0.45.18

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 (365) hide show
  1. package/dist-electron/main.js +149 -158
  2. package/dist-electron/main.js.map +1 -1
  3. package/dist-electron/preload.js +17 -2
  4. package/dist-electron/preload.js.map +1 -1
  5. package/package.json +5 -4
  6. package/server/acceptance-criteria-aQFKQf-J.js +62 -0
  7. package/server/{advancing-selfheal-DJYAvGv-.js → advancing-selfheal-DgwQgm4D.js} +6 -6
  8. package/server/{agent-gc-D0wDIeV1.js → agent-gc-kpzxqT7P.js} +3 -3
  9. package/server/agent-state-C_6TG-Ad.js +3 -0
  10. package/server/{agent-state-service-CZrayD_G.js → agent-state-service-BUfovFfB.js} +1 -1
  11. package/server/{agent-state-service-DFslS5go.js → agent-state-service-nUD3qfob.js} +5 -5
  12. package/server/agents-BA15AQqo.js +3 -0
  13. package/server/{briefing-freshness-DESTCWo-.js → agents-BHBxr8c9.js} +5 -131
  14. package/server/{archive-planning-CbghE9-o.js → archive-planning-CzCW9Ifl.js} +5 -10
  15. package/server/{archive-planning-CoyIbgGK.js → archive-planning-D-QsBufn.js} +1 -1
  16. package/server/{artifact-index-jobs-CcSrUoSE.js → artifact-index-jobs-qqa51B2Z.js} +2 -2
  17. package/server/{backlog-auto-trigger-BfgDsII0.js → backlog-auto-trigger-B7Bi0bvY.js} +2 -2
  18. package/server/{behavior-BTpYbAv4.js → behavior-CWqNMqE5.js} +2 -2
  19. package/server/briefing-freshness-DuxIE1yr.js +131 -0
  20. package/server/{checkpoint-manager-BwFdegJF.js → checkpoint-manager-DF6hb9Jw.js} +3 -3
  21. package/server/{checkpoint-manager-DWSXooZV.js → checkpoint-manager-DixkLus7.js} +1 -1
  22. package/server/checkpoint-worker.js +1 -1
  23. package/server/{checkpoints-fjadfOKF.js → checkpoints-B1Z42tJE.js} +1 -1
  24. package/server/{checkpoints-BtUonbs3.js → checkpoints-BiviJqei.js} +2 -2
  25. package/server/{claude-hooks-provision-DiK62u0k.js → claude-hooks-provision-BeMGi4ty.js} +1 -1
  26. package/server/{claude-hooks-provision-DAtxutOs.js → claude-hooks-provision-Du_PkMsp.js} +2 -2
  27. package/server/{claude-permissions-CThLgf8d.js → claude-permissions-BB6agcOZ.js} +2 -2
  28. package/server/{claude-settings-overlay-BF9MPIwx.js → claude-settings-overlay-CAq2oFSK.js} +2 -2
  29. package/server/{claude-settings-overlay-Dx_Uqcmv.js → claude-settings-overlay-DUWWLd6M.js} +1 -1
  30. package/server/cli-BFgrSWKV.js +3 -0
  31. package/server/{cli-ByKIIMfT.js → cli-C33xPZNm.js} +9 -9
  32. package/server/{cliproxy-C_GuT5DU.js → cliproxy-BQX1TL6N.js} +1 -1
  33. package/server/{cliproxy-B4c1BUvs.js → cliproxy-CGBA1GzA.js} +2 -2
  34. package/server/{close-issue-BOuLKr6e.js → close-issue-DNv8npc1.js} +5 -5
  35. package/server/{closed-issue-reaper-CksfuiFD.js → closed-issue-reaper-DrqgBJlr.js} +1 -1
  36. package/server/{closed-issue-reaper-DCAYzNXW.js → closed-issue-reaper-LoMnnjtJ.js} +9 -9
  37. package/server/codex-DxLivxri.js +3 -0
  38. package/server/{codex-parser-mFYZh8vR.js → codex-parser-DboQnEXN.js} +2 -2
  39. package/server/{codex-BbqIRZjd.js → codex-sgWVCGUd.js} +43 -18
  40. package/server/{config-Dj6N8EP9.js → config-6MCHOZ2N.js} +1 -1
  41. package/server/{config-DVLdmnMJ.js → config-DfaUXr6r.js} +2 -2
  42. package/server/{config-yaml-cNOZcEww.js → config-yaml-CqaAyn8y.js} +74 -74
  43. package/server/{conflict-gate-BMKm_5DV.js → conflict-gate-BF_zhcmb.js} +3 -3
  44. package/server/{conflict-gate-CuXUv-bP.js → conflict-gate-BubJprtD.js} +1 -1
  45. package/server/{context-layers-c0JqYHcS.js → context-layers-BFrxfl0l.js} +17 -3
  46. package/server/{context-layers-CeAwSYNt.js → context-layers-DWL_8HhY.js} +2 -2
  47. package/server/{control-settings-D4EFsRBd.js → control-settings-BguNQ1F_.js} +4 -4
  48. package/server/{conversation-compaction-kHVfVRg3.js → conversation-compaction-CRKAf2qP.js} +1 -1
  49. package/server/{conversation-compaction-BCggyih4.js → conversation-compaction-DxSXl0pT.js} +8 -8
  50. package/server/{conversation-service-BTzObqGi.js → conversation-service-DzuY9qoH.js} +1 -1
  51. package/server/{conversation-service-B8LFQQm1.js → conversation-service-mFVFdDQK.js} +6 -6
  52. package/server/{conversations-B-lcHv-5.js → conversations-BX5aD-6F.js} +4 -4
  53. package/server/{conversations-BM7zlXjr.js → conversations-BajHQ60c.js} +1 -1
  54. package/server/{cost-D9kPIY_5.js → cost-BoqD1Pxz.js} +2 -2
  55. package/server/{cost-BcpRQ-7o.js → cost-DuZ5vlv-.js} +3 -3
  56. package/server/{cost-sync-DF6odxK9.js → cost-sync-BYnmnMkY.js} +3 -3
  57. package/server/{dag-DKI3sOmX.js → dag-C6kYyF17.js} +7 -243
  58. package/server/{dangerous-git-ops-Bn18PEcN.js → dangerous-git-ops-q5OPtXMd.js} +1 -1
  59. package/server/dashboard-db-worker.js +6 -6
  60. package/server/{deacon-DONuopff.js → deacon-CwCiNuEZ.js} +3 -3
  61. package/server/{deacon-DdARMjZq.js → deacon-Dru5onpk.js} +233 -162
  62. package/server/{deacon-nudge-log-B-naf89q.js → deacon-nudge-log-ilDfxrhK.js} +1 -1
  63. package/server/{deacon-swarm-BNGkmYR_.js → deacon-swarm-BPmBmSoU.js} +298 -72
  64. package/server/deacon-swarm-CKyGJng1.js +2 -0
  65. package/server/deacon.js +14 -7
  66. package/server/{devcontainer-renderer-C-34Sxyz.js → devcontainer-renderer-BqGNCzvN.js} +3 -3
  67. package/server/{dist-BMXvKiZP.js → dist-BwlEiLCU.js} +1 -1
  68. package/server/dist-Bx4KkgYL.js +3 -0
  69. package/server/{dist-src-BgGUblXg.js → dist-src-BE0Denfs.js} +1 -1
  70. package/server/{docker-apZ9pBYw.js → docker-CNjXS72x.js} +2 -2
  71. package/server/{ensure-devcontainer-Bqi1EF1P.js → ensure-devcontainer-5e9xOve4.js} +4 -4
  72. package/server/{ensure-devcontainer-Dq3KoOIl.js → ensure-devcontainer-C6gyUQdE.js} +1 -1
  73. package/server/{esm-shims-BEjvINX3.js → esm-shims-Cso7IGBC.js} +1 -1
  74. package/server/{event-store-CqDgfbAs.js → event-store-D9UhQyMS.js} +1 -1
  75. package/server/{event-store-D89fMfXS.js → event-store-KZnWUKWh.js} +3 -3
  76. package/server/{events-S_C0pvl6.js → events-2eFUPdqz.js} +3 -3
  77. package/server/{events-rIGncmP1.js → events-BYbvqZky.js} +1 -1
  78. package/server/{factory-DV18m0rc.js → factory-BtaRsHFC.js} +20 -17
  79. package/server/{feature-registry-population-CqZSnqQi.js → feature-registry-population-Ca2UaV0U.js} +4 -4
  80. package/server/{feature-registry-storage-BeXmNBwK.js → feature-registry-storage-DaP-bQxO.js} +2 -2
  81. package/server/{features-u5XeMaOK.js → features-DqvaoQoa.js} +2 -2
  82. package/server/{feedback-target-CwyWf0Dg.js → feedback-target-BXWdOiYI.js} +9 -7
  83. package/server/{feedback-target-DDG1PWl3.js → feedback-target-BblmMe9P.js} +1 -1
  84. package/server/{feedback-writer-BsJiw5aT.js → feedback-writer-CULeOOY4.js} +1 -1
  85. package/server/{feedback-writer-D20HSXre.js → feedback-writer-Dn8o9ZyE.js} +4 -4
  86. package/server/{flywheel-RCnHAgc4.js → flywheel-BUWdcfhq.js} +1 -1
  87. package/server/{flywheel-Dczmgchd.js → flywheel-CqkO3cDj.js} +15 -28
  88. package/server/{flywheel-9Y1X7IM-.js → flywheel-D9r1mw2U.js} +13 -13
  89. package/server/{flywheel-merge-order-DEtEd3aK.js → flywheel-merge-order-LDzQDwSg.js} +1 -1
  90. package/server/{flywheel-merge-order-CtCYsFJP.js → flywheel-merge-order-VtjUweEb.js} +6 -6
  91. package/server/forge-DJy3Zx4s.js +2 -0
  92. package/server/{forge-DFDThFil.js → forge-wEollMCi.js} +22 -12
  93. package/server/{from-NSJypkI8.js → from-B2tOYhYV.js} +1 -1
  94. package/server/{fts-db-C5A_TTOM.js → fts-db-Bgzn2RO7.js} +2 -2
  95. package/server/{fts-operations-DvCSimfU.js → fts-operations-Bj8yutnR.js} +2 -2
  96. package/server/{git-utils-Dr0L7mFk.js → git-utils-GxlL0tmt.js} +2 -2
  97. package/server/{git-utils-C0neHvQx.js → git-utils-q8jNoBts.js} +1 -1
  98. package/server/{github-app-Bwt9lK4A.js → github-app-BrYwK_Gb.js} +1 -1
  99. package/server/{github-app-u9-SX7Gc.js → github-app-tUbb8Ldr.js} +8 -3
  100. package/server/{github-client-Btyy3uan.js → github-client-BwBU41jK.js} +3 -3
  101. package/server/{github-client-Do3k-N1W.js → github-client-D6CNsftm.js} +1 -1
  102. package/server/{github-pr-lookup-DOF1U2WW.js → github-pr-lookup-BS5PqkJb.js} +2 -2
  103. package/server/{harness-resolve-C6g2R0Cd.js → harness-resolve-Dx8hUsvC.js} +3 -3
  104. package/server/{health-events-B4u-2a9m.js → health-events-2DLp-5Xp.js} +2 -2
  105. package/server/{health-events-Bos3sk5g.js → health-events-B0mj6Iae.js} +1 -1
  106. package/server/{hooks-uEr8WTx_.js → hooks-BDcQJDUe.js} +1 -1
  107. package/server/{hooks-BCoOjL_R.js → hooks-BS_JrvYP.js} +3 -3
  108. package/server/hume-B4seN95Y.js +3 -0
  109. package/server/{hume-BqxYKbUf.js → hume-BRhNKyXQ.js} +2 -2
  110. package/server/{idle-stack-reaper-DbZ8ukMd.js → idle-stack-reaper-BCITXNW5.js} +2 -2
  111. package/server/{idle-stack-reaper-H0W6XtHh.js → idle-stack-reaper-C1ymihno.js} +1 -1
  112. package/server/{infra-Ba9mS6e6.js → infra-_Kx1m9pm.js} +9 -4
  113. package/server/{injection-C1DKXeIZ.js → injection-Bvhyg_MV.js} +1 -1
  114. package/server/{injection-yrMBxzVq.js → injection-CCaYkofq.js} +7 -7
  115. package/server/{inspect-agent-B-mnb4uh.js → inspect-agent-BqyZ4pCo.js} +35 -67
  116. package/server/inspect-agent-DCJQm9Wu.js +2 -0
  117. package/server/{internal-token-BtqSbKTx.js → internal-token-Cl-1IxaE.js} +2 -2
  118. package/server/{internal-token-BPYEaXFh.js → internal-token-D-t28de5.js} +1 -1
  119. package/server/{io-VEGSAqsd.js → io-DkC4sFSy.js} +36 -43
  120. package/server/{issue-closed-BxcePXL-.js → issue-closed-Cpl4VDUM.js} +41 -6
  121. package/server/{issue-lifecycle--8MRxrG1.js → issue-lifecycle-CFR8TJ22.js} +22 -37
  122. package/server/{issue-lifecycle-CdMUauyb.js → issue-lifecycle-YNTy3OT3.js} +1 -1
  123. package/server/{issue-service-singleton-MZsDhAob.js → issue-service-singleton-D81mCts_.js} +1 -1
  124. package/server/{issue-service-singleton-CkTUI-eu.js → issue-service-singleton-ldvUUXi3.js} +29 -29
  125. package/server/{issues-CBAsuoAO.js → issues-DIEHt9sq.js} +2 -2
  126. package/server/{jsonl-parser-BUW5_sSK.js → jsonl-parser-Cd5jIqh7.js} +3 -3
  127. package/server/{label-cleanup-htK6fBRU.js → label-cleanup-Btny6Gyo.js} +3 -3
  128. package/server/{state-home-CEvD_v5F.js → launcher-generator-BXLM9f4b.js} +7 -127
  129. package/server/{layers-jjL16At6.js → layers-gCJlK62m.js} +2 -2
  130. package/server/lifecycle-D7aQUnTO.js +12 -0
  131. package/server/{lifecycle-io-DXv8Utct.js → lifecycle-io-DQBF-GHO.js} +1 -1
  132. package/server/{lifecycle-io-IehcRt2v.js → lifecycle-io-FfPUtz-y.js} +4 -4
  133. package/server/{linear-client-D9cSQfvD.js → linear-client-CDH2D6Qy.js} +3 -3
  134. package/server/{linear-client-By7hjwuN.js → linear-client-WrYrUIAH.js} +1 -1
  135. package/server/memory-fts-worker.js +1 -1
  136. package/server/{merge-BN8FGJ2q.js → merge-BsDgUxFz.js} +3 -3
  137. package/server/{merge-BLcEZNXz.js → merge-Dervs4BF.js} +1 -1
  138. package/server/{merge-agent-B3u2szOL.js → merge-agent-D6DNhe9j.js} +64 -51
  139. package/server/{merge-agent-ejC7Wos8.js → merge-agent-DMQTJMP0.js} +1 -1
  140. package/server/{merge-batch-DyqlgYGp.js → merge-batch-Bv6Z5K2H.js} +1 -1
  141. package/server/{merge-blockers-cq-aS2KG.js → merge-blockers-WWWi6Ur2.js} +2 -2
  142. package/server/merge-ops-h9OCnIVz.js +2 -0
  143. package/server/{merge-rebase-Dl7yIxtV.js → merge-rebase-Czth9ggm.js} +2 -2
  144. package/server/{merge-set-CZ9Nbay0.js → merge-set-DNc4zBqd.js} +3 -3
  145. package/server/{merge-set-Dy0D0r3i.js → merge-set-vuE3MEVt.js} +1 -1
  146. package/server/{merge-sync-D7jWLgCC.js → merge-sync-B2KSk54U.js} +2 -2
  147. package/server/{merge-sync-CG9kDCdT.js → merge-sync-B9nHdUGx.js} +1 -1
  148. package/server/{merge-train-CH33XJOH.js → merge-train-DJgr81tF.js} +3 -3
  149. package/server/{merge-train-deps-JoVdGnOg.js → merge-train-deps-B2OWS0k9.js} +4 -4
  150. package/server/{merge-verification-D4wTChdX.js → merge-verification-BBIXUEqa.js} +4 -4
  151. package/server/{multipart-parser-Csn8U-K9.js → multipart-parser-9DhuAkPd.js} +2 -2
  152. package/server/node_modules/.package-lock.json +11 -11
  153. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  154. package/server/node_modules/toml/README.md +54 -0
  155. package/server/node_modules/toml/index.d.ts +42 -1
  156. package/server/node_modules/toml/index.js +3 -3
  157. package/server/node_modules/toml/lib/compiler.js +35 -3
  158. package/server/node_modules/toml/lib/parser.js +224 -143
  159. package/server/node_modules/toml/package.json +3 -1
  160. package/server/node_modules/ws/lib/receiver.js +15 -32
  161. package/server/node_modules/ws/lib/websocket-server.js +4 -4
  162. package/server/node_modules/ws/lib/websocket.js +4 -4
  163. package/server/node_modules/ws/package.json +5 -1
  164. package/server/{orphan-proposed-reconciler-DI_IS1p_.js → orphan-proposed-reconciler-B8H41C4a.js} +14 -24
  165. package/server/{orphan-proposed-reconciler-BIcNu4tl.js → orphan-proposed-reconciler-DbTmT7qy.js} +1 -1
  166. package/server/package-lock.json +12 -12
  167. package/server/package.json +1 -1
  168. package/server/{pan-dir-CQIfKG8c.js → pan-dir-BTw4MdSe.js} +4 -4
  169. package/server/{paths-Blj6A9AJ.js → paths-Btkc8mzp.js} +2 -2
  170. package/server/{pipeline-notifier-BH4PAi-w.js → pipeline-notifier-3frIvSi3.js} +1 -1
  171. package/server/{pipeline-notifier-D_WYtEwl.js → pipeline-notifier-DTd19f18.js} +2 -2
  172. package/server/{project-pipelines-jMTitpeO.js → project-pipelines-B95fcAek.js} +2 -2
  173. package/server/projects-Dc9aoVoG.js +3 -0
  174. package/server/{prompts-B3njaImU.js → prompts-CIVmjHxn.js} +2 -2
  175. package/server/{providers-DnPxkHoG.js → providers-BLLk5IIb.js} +1 -1
  176. package/server/{providers-BbEyFhPX.js → providers-C-yWibCk.js} +7 -7
  177. package/server/public/assets/{chunk-BO2N2NFS-3qh9TUJi.js → chunk-BO2N2NFS-DzKZyoKY.js} +4 -4
  178. package/server/public/assets/{diagram-OG6HWLK6-D8UVTPj7.js → diagram-OG6HWLK6-Cx8mWUb8.js} +1 -1
  179. package/server/public/assets/{dist-BvLLn1YC.js → dist-BqccLhaw.js} +3 -3
  180. package/server/public/assets/{dist-CyubL7Wj.js → dist-rC3nAs_O.js} +1 -1
  181. package/server/public/assets/{ganttDiagram-6RSMTGT7-BI4E1LbQ.js → ganttDiagram-6RSMTGT7-DLYPLf5T.js} +1 -1
  182. package/server/public/assets/{highlighted-body-OFNGDK62-D_bapWkF.js → highlighted-body-OFNGDK62-D4DqixbV.js} +1 -1
  183. package/server/public/assets/index-CPcysUHk.js +796 -0
  184. package/server/public/assets/index-H5M0yhM4.css +1 -0
  185. package/server/public/assets/{linear-CEdobObr.js → linear-yqcXkDfj.js} +1 -1
  186. package/server/public/assets/mermaid-GHXKKRXX-CWdZ_heB.js +1 -0
  187. package/server/public/assets/{pieDiagram-4H26LBE5-DT79L01f.js → pieDiagram-4H26LBE5-DhraIOaV.js} +1 -1
  188. package/server/public/assets/{prod-CR_K2DFV.js → prod-DKUunUdN.js} +4 -4
  189. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BEkKXXrL.js → quadrantDiagram-W4KKPZXB-DPiRcToa.js} +1 -1
  190. package/server/public/assets/{sankeyDiagram-5OEKKPKP-BxSCqn-j.js → sankeyDiagram-5OEKKPKP-3An5HNkZ.js} +1 -1
  191. package/server/public/assets/{xychartDiagram-2RQKCTM6-DicwJGG_.js → xychartDiagram-2RQKCTM6-lbEOjfqQ.js} +1 -1
  192. package/server/public/index.html +2 -2
  193. package/server/{pull-requests-43LPDfM8.js → pull-requests-D7AL5woD.js} +1 -1
  194. package/server/{pull-requests-DyUkQl4W.js → pull-requests-NDDNtqNq.js} +3 -3
  195. package/server/{agents-B9GwfCyp.js → queries-C0LCGG21.js} +710 -325
  196. package/server/{rally-BtWjybOa.js → rally-4oKvnxLG.js} +3 -3
  197. package/server/rally-DF5a3ioP.js +3 -0
  198. package/server/{rally-api-B-osULNL.js → rally-api-41tT6ikZ.js} +2 -2
  199. package/server/{rally-api-B-YA_oXx.js → rally-api-BsaQ8Vnz.js} +1 -1
  200. package/server/{rally-client-sErNQBO0.js → rally-client-Bo4hNcCZ.js} +5 -5
  201. package/server/{rally-client-CzFymP7P.js → rally-client-b5PT1x5L.js} +1 -1
  202. package/server/{reap-terminal-sessions-DnDQ7pf9.js → reap-terminal-sessions-BR39qflC.js} +1 -1
  203. package/server/{reap-terminal-sessions-2s-fvilz.js → reap-terminal-sessions-CFkuquQj.js} +1 -1
  204. package/server/{rebuild-stack-nGD_nPZo.js → rebuild-stack-C7JPUom6.js} +1 -1
  205. package/server/{rebuild-stack-CoU-HqZj.js → rebuild-stack-Ddv6W017.js} +5 -5
  206. package/server/{reconstruct-cache-Wj8GrYB0.js → reconstruct-cache-Gqhm---K.js} +6 -6
  207. package/server/record-DLOqfbkI.js +3 -0
  208. package/server/record-update-BltEmPge.js +168 -0
  209. package/server/record-update-CDp7aTaT.js +3 -0
  210. package/server/recovery-trip-Cn7KJVkS.js +44 -0
  211. package/server/{release-engine-CBLQXDlH.js → release-engine-BYzmIBf9.js} +5 -5
  212. package/server/{release-set-BNiqi7hy.js → release-set-7pnxFOWR.js} +3 -3
  213. package/server/{remote-DW_TWQnr.js → remote-Cvu4CSDk.js} +3 -3
  214. package/server/{remote-agents-C4cyxHQS.js → remote-agents-C2C6z9tj.js} +6 -33
  215. package/server/{remote-agents-Cv-U-_V8.js → remote-agents-DYY5fFpd.js} +1 -1
  216. package/server/{remote-completion-PhXGGFQy.js → remote-completion-2Kb4IDg_.js} +13 -13
  217. package/server/{remote-DcO9An_f.js → remote-rN0ecjHE.js} +3 -3
  218. package/server/resume-BFLl-yLn.js +3 -0
  219. package/server/{review-agent-Dn-yn7Zj.js → review-agent-BZvk0N5G.js} +31 -23
  220. package/server/{review-agent-u5q3ip7H.js → review-agent-CpSHLzed.js} +1 -1
  221. package/server/{review-artifacts-D4T04aYI.js → review-artifacts-PCo53YMn.js} +5 -19
  222. package/server/{review-context-Rc0VDLG_.js → review-context-M7QtJlJq.js} +8 -8
  223. package/server/{review-monitor-BC--miCO.js → review-monitor-BLC5mTTg.js} +2 -2
  224. package/server/{review-status-CG0iDuWa.js → review-status-77N3PoZr.js} +1 -1
  225. package/server/{review-status-Dc1l4dVz.js → review-status-DANr0t-v.js} +32 -58
  226. package/server/{review-status-enrichment-C1a1OG_1.js → review-status-enrichment-DwOg4UfL.js} +3 -3
  227. package/server/{review-status-sync-CfSixhhX.js → review-status-sync-Bd08OOFA.js} +1 -1
  228. package/server/{review-status-sync-CAr-hfnJ.js → review-status-sync-BjTUJ5fx.js} +2 -2
  229. package/server/{review-verdict-feedback-D2Q960wX.js → review-verdict-feedback-BsFLjN_6.js} +1 -1
  230. package/server/{review-verdict-feedback-CVDbIDBe.js → review-verdict-feedback-CBf-J_wS.js} +8 -8
  231. package/server/{rollup-DctoIu-A.js → rollup-Bu0f2EyN.js} +8 -8
  232. package/server/{rollup-CakjztPl.js → rollup-DTCCdEy4.js} +1 -1
  233. package/server/{scanner-BTM1jc_u.js → scanner-BlZ2vB7j.js} +7 -7
  234. package/server/{sequence-io-pnoIDGv4.js → sequence-io-ylyDtz2J.js} +4 -4
  235. package/server/{sequencer-agent-9Soi-WL-.js → sequencer-agent-DsWQ-87H.js} +6 -17
  236. package/server/server.js +4695 -4093
  237. package/server/{service-DfTVoqJg.js → service-CLVBC_1Y.js} +116 -90
  238. package/server/{session-fork-C4jAFHj8.js → session-fork-DlEIAhRy.js} +2 -2
  239. package/server/{session-history-DanhhiCw.js → session-history-bnOFKMwf.js} +4 -4
  240. package/server/settings-CP3GGon2.js +2 -0
  241. package/server/{settings-Cuc12oP_.js → settings-Cqa-8nyj.js} +2 -2
  242. package/server/{settings-DfT3f86D.js → settings-gJrdLZy2.js} +3 -3
  243. package/server/{shadow-engineering-bKuKTCn-.js → shadow-engineering-fq1YEKV3.js} +3 -3
  244. package/server/{shadow-state-CVHpRWlb.js → shadow-state-BqeFAygK.js} +1 -1
  245. package/server/{shadow-state-DJz6_pb_.js → shadow-state-RptE9Cau.js} +2 -2
  246. package/server/shadow-utils-BMWr5tRT.js +39 -0
  247. package/server/{ship-log-CwqPFfqx.js → ship-log-BRQQi2lU.js} +1 -1
  248. package/server/{smart-compaction-CiWfGfRZ.js → smart-compaction-CmoXpjeU.js} +7 -7
  249. package/server/{smart-compaction-B4KlpZGN.js → smart-compaction-DldUel4B.js} +1 -1
  250. package/server/{spawn-planning-session-CU-DwyDl.js → spawn-planning-session-CoS6LTc6.js} +16 -16
  251. package/server/{spawn-planning-session-D5N3RuLG.js → spawn-planning-session-DT2tSMxo.js} +1 -1
  252. package/server/{specialist-completion-CJcv-NXH.js → specialist-completion-pJtESo7m.js} +1 -1
  253. package/server/{specialist-context-B2HlbNxS.js → specialist-context-CspI4Eog.js} +5 -5
  254. package/server/{specialist-handoff-logger-CQyF1ygu.js → specialist-handoff-logger-Duz9RGvk.js} +2 -2
  255. package/server/{specialist-logs-CdcUpfjj.js → specialist-logs-DtSkPJZK.js} +3 -3
  256. package/server/{specialists-D7AcFi1u.js → specialists-CywEMwxk.js} +1 -1
  257. package/server/{specialists-k22_Btaq.js → specialists-D9-dMUtI.js} +1 -1
  258. package/server/{specialists-CFgw_0Q6.js → specialists-Dax7tqXC.js} +161 -448
  259. package/server/{specialists-CwzFdapR.js → specialists-GF42OOqd.js} +18 -18
  260. package/server/specs-VwcFtEDi.js +3 -0
  261. package/server/{src-B4TTzNSr.js → src-By3D85Ry.js} +6 -1
  262. package/server/{src-BvpMg4EB.js → src-CqyFg52C.js} +5 -5
  263. package/server/{src-D4YUZrwR.js → src-DhxM-eCb.js} +6 -6
  264. package/server/{stack-health-DVN7zRnL.js → stack-health-BsEVrJZ6.js} +1 -1
  265. package/server/{stack-health-CSgcYcr8.js → stack-health-C-SnpRHh.js} +2 -2
  266. package/server/stale-task-claims-vTxmRzLi.js +69 -0
  267. package/server/state-home-Bur1y4oH.js +213 -0
  268. package/server/{state-mapping-C13UaCL7.js → state-mapping-Ci0pkac4.js} +1 -1
  269. package/server/state-migrate-D3VveYfO.js +362 -0
  270. package/server/{stuck-remediation-CxsyxwFO.js → stuck-remediation-B699-p8v.js} +36 -41
  271. package/server/{stuck-remediation-nTIvhGOR.js → stuck-remediation-CaFYYTQW.js} +1 -1
  272. package/server/{summary-fork-CnRMPCYd.js → summary-fork-BxnF8Xh0.js} +2 -2
  273. package/server/{summary-fork-gKSoFAnK.js → summary-fork-COqYpVa3.js} +8 -8
  274. package/server/supervisor/{paths-3R6b989k.js → paths-Bk6hJRH9.js} +4 -3
  275. package/server/supervisor/pty-supervisor.js +2 -2
  276. package/server/supervisor/{pty-token-CScQ32Rj.js → pty-token-BZS5GYdG.js} +2 -2
  277. package/server/supervisor-eWAAmXKu.js +2 -0
  278. package/server/{supervisor-CZMs8s0M.js → supervisor-liMgIPDF.js} +2 -2
  279. package/server/{swarm-readiness-h6-pwY8w.js → swarm-readiness-sXB1vhzo.js} +3 -3
  280. package/server/{system-prerequisites-DZZTi2G6.js → system-prerequisites-Bz6KdkFJ.js} +1 -13
  281. package/server/{teardown-workspace-B4D-oCVg.js → teardown-workspace-DvzqnmUF.js} +14 -71
  282. package/server/{test-agent-queue-CnuYku4B.js → test-agent-queue-hAU1Ah08.js} +5 -5
  283. package/server/{tldr-daemon-CuA8hz21.js → tldr-daemon-Bam7Xhoo.js} +2 -2
  284. package/server/{tldr-daemon-CgZQ3jmZ.js → tldr-daemon-DhGwd88s.js} +1 -1
  285. package/server/tmux-C-rgxRDA.js +3 -0
  286. package/server/{tmux-C3g9VFcg.js → tmux-U55cNGFG.js} +92 -4
  287. package/server/{token-g_sJ19g3.js → token-Dsa-i36o.js} +2 -2
  288. package/server/{token-util-DiwnnbJo.js → token-util-BWNpH96m.js} +1 -1
  289. package/server/token-util-DRt0j2nQ.js +3 -0
  290. package/server/{tracker-config-dQxC15vH.js → tracker-config-OkdbaUCm.js} +2 -2
  291. package/server/{tracker-utils--z8FLSWn.js → tracker-utils-CghXMF3q.js} +2 -2
  292. package/server/{tracker-utils-DkKyRT0H.js → tracker-utils-DdzUiPNU.js} +1 -1
  293. package/server/{tunnel-BpWZs0Jy.js → tunnel-D1YxesBL.js} +3 -3
  294. package/server/{tunnel-CN2px87h.js → tunnel-DjlzgTl3.js} +1 -1
  295. package/server/typed-errors-CH4roFIj.js +3 -0
  296. package/server/{typed-errors-sLpGfegz.js → typed-errors-n_Tnb4Fh.js} +3 -4
  297. package/server/{types-BLS_Zbmd.js → types-DOjWNv3Z.js} +1 -1
  298. package/server/{types-tlXf80x3.js → types-DXBMm4mX.js} +1 -1
  299. package/server/{uat-train-utGVmqdm.js → uat-train-CaaWs9Rp.js} +1 -1
  300. package/server/{uat-train-BRo6DM7p.js → uat-train-CqN34zFx.js} +24 -25
  301. package/server/{validation-CsPVsoA0.js → validation-4-z2Cw4z.js} +70 -23
  302. package/server/validation-DpTNakM6.js +3 -0
  303. package/server/verification-artifact-DK1xb1zG.js +56 -0
  304. package/server/verification-artifact-JD_edpZ9.js +2 -0
  305. package/server/{verification-runner-CMT5WRMS.js → verification-runner-BjHN80pJ.js} +338 -58
  306. package/server/verification-runner-ShYu5Ph3.js +2 -0
  307. package/server/{vtt-parser-C_XPlifj.js → vtt-parser-QnRfcjiU.js} +1 -1
  308. package/server/{work-agent-prompt-ZTAb2Hyf.js → work-agent-prompt-BiJ43Der.js} +12 -88
  309. package/server/workflows-B4C3lY9E.js +2 -0
  310. package/server/{workflows-CXRwhw_o.js → workflows-DkTotz_m.js} +17 -24
  311. package/server/{workspace-CNfuj1-5.js → workspace-CuN0ev4Z.js} +3 -3
  312. package/server/{workspace-9UEsKuiP.js → workspace-DQ4vVivd.js} +1 -1
  313. package/server/{workspace-config-ChWOECy0.js → workspace-config-C77NKnsV.js} +1 -1
  314. package/server/{workspace-manager-BO-6k3sP.js → workspace-manager-B1mYn0lN.js} +1 -1
  315. package/server/{workspace-manager-D8AByFIT.js → workspace-manager-Beeo2aKF.js} +23 -48
  316. package/server/{workspace-metadata-CvC268MN.js → workspace-metadata-BZC5BmoP.js} +2 -2
  317. package/server/{workspace-metadata-DZiJtnuF.js → workspace-metadata-Cy7_ZACL.js} +1 -1
  318. package/server/{workspaces-D-uIoqbg.js → workspaces-CGuzW1Ia.js} +182 -152
  319. package/sync-sources/hooks/codex-notify-hook +64 -8
  320. package/sync-sources/hooks/record-cost-event.js +1109 -36
  321. package/sync-sources/hooks/record-cost-event.js.map +1 -1
  322. package/sync-sources/hooks/statusline.sh +2 -2
  323. package/sync-sources/hooks/work-agent-stop-hook +1 -2
  324. package/server/acceptance-criteria-BZ_nQS1f.js +0 -33
  325. package/server/agent-state-lGvgPP4m.js +0 -3
  326. package/server/agents-CEcaxSkR.js +0 -3
  327. package/server/auto-commit-IW-eik_b.js +0 -3
  328. package/server/bd-process-lock-XAXAet9O.js +0 -390
  329. package/server/beads-B1u04n3o.js +0 -2
  330. package/server/beads-BeSMEjGT.js +0 -649
  331. package/server/beads-query-Dl4FhT8J.js +0 -95
  332. package/server/beads-restore-BUItPOjI.js +0 -23
  333. package/server/cli-D9cUTbBr.js +0 -3
  334. package/server/codex-BYPz6ZdF.js +0 -3
  335. package/server/compact-beads-CyJtoXJi.js +0 -94
  336. package/server/compact-beads-N00E4EVa.js +0 -3
  337. package/server/deacon-swarm-CvdFekIO.js +0 -2
  338. package/server/dist-BNwrgsUO.js +0 -3
  339. package/server/export-BJHSVwKP.js +0 -87
  340. package/server/forge-8y6aEPTB.js +0 -2
  341. package/server/hume-CerGi2RH.js +0 -3
  342. package/server/inspect-agent-CWkeAB7J.js +0 -2
  343. package/server/lifecycle-Ck2UR27D.js +0 -14
  344. package/server/merge-ops-CFkQtXEj.js +0 -2
  345. package/server/projects-CrBE6IhN.js +0 -3
  346. package/server/public/assets/index-BAZxZ-8I.js +0 -796
  347. package/server/public/assets/index-FBG3JBfq.css +0 -1
  348. package/server/public/assets/mermaid-GHXKKRXX-BYP8MI37.js +0 -1
  349. package/server/rally-oggyp4cs.js +0 -3
  350. package/server/record-lEYK__LD.js +0 -3
  351. package/server/recovery-trip-BT7nb9OV.js +0 -98
  352. package/server/resolver-C7dLn8OK.js +0 -158
  353. package/server/resume-BYZBIab-.js +0 -3
  354. package/server/settings-Cy7SCFO9.js +0 -2
  355. package/server/specs-RzcDgozr.js +0 -3
  356. package/server/supervisor-CfX192ma.js +0 -2
  357. package/server/tmux-By8E_Yv_.js +0 -3
  358. package/server/token-util-C9u4An3K.js +0 -3
  359. package/server/tracker-config-BzfVj41Z.js +0 -3
  360. package/server/typed-errors-CrN1AByg.js +0 -3
  361. package/server/validation-Dq_wwcw3.js +0 -3
  362. package/server/verification-runner-D0Uh-9jc.js +0 -2
  363. package/server/workflows-BLwxUMP7.js +0 -2
  364. package/server/writer-BUweuRPx.js +0 -3
  365. package/server/writer-CrP2xuBn.js +0 -251
@@ -1,649 +0,0 @@
1
- import { _ as updateItemStatus, b as init_types, d as readPlanSync, m as readWorkspacePlanSync, o as init_io, v as updateSubItemStatus, x as subItemsOf } from "./io-VEGSAqsd.js";
2
- import { i as runBdWithRetry, n as init_bd_process_lock, o as init_home, s as resolveCanonicalBeadsHome, t as BdTransientFailure } from "./bd-process-lock-XAXAet9O.js";
3
- import { n as init_resolver, t as createBeadsResolver } from "./resolver-C7dLn8OK.js";
4
- import { t as init_beads_restore } from "./beads-restore-BUItPOjI.js";
5
- import { n as init_writer, r as runMutationBatch, t as formatMutationBatchFailure } from "./writer-CrP2xuBn.js";
6
- import { n as init_acceptance_criteria, t as extractACFromDocument } from "./acceptance-criteria-BZ_nQS1f.js";
7
- import { Data, Effect } from "effect";
8
- import { chmodSync, existsSync, mkdirSync, writeFileSync } from "fs";
9
- import { join } from "path";
10
- import { execFile } from "child_process";
11
- import { promisify } from "util";
12
- //#region ../../lib/bd-mutex.ts
13
- /**
14
- * Global mutex for bd (beads) CLI commands.
15
- *
16
- * Embedded Dolt uses file-based locking — only one process can hold the
17
- * database lock at a time. When the dashboard spawns concurrent `bd` commands
18
- * (e.g. planning-state queries for every kanban card), each process blocks
19
- * waiting for the lock, creating a cascade of hundreds of hung processes.
20
- *
21
- * This mutex serializes all bd operations so only one runs at a time,
22
- * preventing lock contention and process pile-up.
23
- */
24
- init_beads_restore();
25
- let pending = Promise.resolve();
26
- async function withBdMutexPromise(fn) {
27
- const result = pending.then(fn, fn);
28
- pending = result.then(() => {}, () => {});
29
- return result;
30
- }
31
- /**
32
- * Effect-native variant of withBdMutex over a thunk that returns a no-context
33
- * Effect. Serializes against all other bd-mutex callers via the Promise queue.
34
- * The wrapped Effect must be no-context (R = never) since it is launched from
35
- * inside a tryPromise — Layers cannot be threaded through the global mutex.
36
- */
37
- const withBdMutex = (fn) => Effect.tryPromise({
38
- try: () => withBdMutexPromise(() => Effect.runPromise(fn())),
39
- catch: (e) => e
40
- });
41
- //#endregion
42
- //#region ../../lib/vbrief/beads.ts
43
- /**
44
- * createBeadsFromVBrief
45
- *
46
- * Converts a vBRIEF plan document into beads tasks, preserving dependency
47
- * relationships from blocking edges. This replaces LLM-generated `bd create`
48
- * shell commands with a deterministic, programmatic conversion.
49
- */
50
- init_bd_process_lock();
51
- init_io();
52
- init_acceptance_criteria();
53
- init_types();
54
- init_resolver();
55
- init_writer();
56
- init_home();
57
- const execFileAsync = promisify(execFile);
58
- function normalizeClearBeadsOptions(value = {}) {
59
- if (typeof value === "number") return { timeoutMs: value };
60
- return {
61
- timeoutMs: BD_TIMEOUT_FLOOR_MS,
62
- ...value
63
- };
64
- }
65
- function firstLine(value) {
66
- return (typeof value === "string" ? value : value instanceof Error ? value.message : String(value ?? "")).split("\n")[0] || "unknown error";
67
- }
68
- function execFileErrorMessage(error) {
69
- return firstLine(error?.stderr?.toString() || error?.message || error);
70
- }
71
- /** Bootstrap timeout for the latency probe that derives the operational timeout. */
72
- const BD_PING_BOOTSTRAP_TIMEOUT_MS = 8e3;
73
- /** Floor for the adaptive bd operational timeout. Preserves today's 30s default. */
74
- const BD_TIMEOUT_FLOOR_MS = 3e4;
75
- /** Ceiling for the adaptive bd operational timeout. Prevents near-unbounded waits. */
76
- const BD_TIMEOUT_CEILING_MS = 18e4;
77
- /** Multiplier applied to bd ping total_ms to derive the operational timeout. */
78
- const BD_TIMEOUT_MULTIPLIER = 20;
79
- /**
80
- * Resolve the operational timeout for all bd calls in this finalize.
81
- *
82
- * - If OVERDECK_BD_TIMEOUT_MS is a positive integer, return it verbatim and
83
- * do NOT probe bd.
84
- * - Otherwise run `bd ping --json` once with a fixed bootstrap timeout, read
85
- * total_ms, and clamp(total_ms * 20, 30s, 180s).
86
- * - If the probe fails or returns unparseable JSON, return the 30s floor.
87
- *
88
- * The caller (createBeadsFromVBriefPromise) caches the result for the lifetime
89
- * of one finalize so the probe runs once.
90
- */
91
- async function resolveBdTimeout(workspacePath) {
92
- const envValue = Number(process.env.OVERDECK_BD_TIMEOUT_MS);
93
- if (Number.isInteger(envValue) && envValue > 0) return Math.min(BD_TIMEOUT_CEILING_MS, Math.max(BD_TIMEOUT_FLOOR_MS, envValue));
94
- try {
95
- const { stdout } = await execFileAsync("bd", ["ping", "--json"], {
96
- encoding: "utf-8",
97
- cwd: workspacePath,
98
- timeout: BD_PING_BOOTSTRAP_TIMEOUT_MS
99
- });
100
- const parsed = JSON.parse(stdout);
101
- const totalMs = typeof parsed?.total_ms === "number" ? parsed.total_ms : 0;
102
- return Math.min(BD_TIMEOUT_CEILING_MS, Math.max(BD_TIMEOUT_FLOOR_MS, totalMs * BD_TIMEOUT_MULTIPLIER));
103
- } catch {
104
- return BD_TIMEOUT_FLOOR_MS;
105
- }
106
- }
107
- function parseBdList(stdout) {
108
- const parsed = JSON.parse(String(stdout || "[]"));
109
- if (!Array.isArray(parsed)) throw new Error("bd list returned non-array JSON");
110
- return parsed;
111
- }
112
- function beadIdsFromList(beads) {
113
- return beads.map((bead) => bead?.id).filter((id) => id !== void 0 && id !== null && String(id).length > 0).map((id) => String(id));
114
- }
115
- async function listBeadsForIssue(workspacePath, issueLabel, options = {}) {
116
- const result = await createBeadsResolver(workspacePath, { retry: normalizeClearBeadsOptions(options) }).getBeadsForIssue(issueLabel);
117
- if (!result.ok) throw result.error;
118
- return result.value;
119
- }
120
- /**
121
- * After a bd create timeout or empty-stdout, recover the bead ID by exact-title
122
- * re-query. A client-side timeout usually means the create succeeded on the
123
- * server, so the only missing piece is the ID.
124
- *
125
- * Returns the recovered id, or null if no unique match is found. ambiguity=true
126
- * means more than one bead matched the full title and the caller must NOT pick
127
- * one silently.
128
- */
129
- async function recoverBeadIdByTitle(workspacePath, issueLabel, fullTitle, timeoutMs) {
130
- let beads;
131
- try {
132
- beads = await listBeadsForIssue(workspacePath, issueLabel, { timeoutMs });
133
- } catch {
134
- return {
135
- id: null,
136
- ambiguity: false
137
- };
138
- }
139
- const matches = beads.filter((bead) => bead?.title === fullTitle);
140
- if (matches.length === 1) {
141
- const id = matches[0]?.id;
142
- if (id !== void 0 && id !== null && String(id).length > 0) return {
143
- id: String(id),
144
- ambiguity: false
145
- };
146
- } else if (matches.length > 1) return {
147
- id: null,
148
- ambiguity: true
149
- };
150
- return {
151
- id: null,
152
- ambiguity: false
153
- };
154
- }
155
- async function defaultBdSleep(ms) {
156
- await new Promise((resolve) => setTimeout(resolve, ms));
157
- }
158
- /**
159
- * Bounded exponential-backoff retry for idempotent bd operations.
160
- *
161
- * Retries `fn` up to `attempts` times (default 3), waiting
162
- * `baseDelayMs * 2^(attempt-1)` milliseconds between attempts. Surfaces the
163
- * last error once attempts are exhausted. Used only for reads/deletes — never
164
- * for bd create, which is not idempotent.
165
- */
166
- async function retryBd(fn, options = {}) {
167
- const attempts = options.attempts ?? 3;
168
- const baseDelayMs = options.baseDelayMs ?? 500;
169
- const sleep = options.sleep ?? defaultBdSleep;
170
- let lastError;
171
- for (let attempt = 1; attempt <= attempts; attempt++) try {
172
- return await fn();
173
- } catch (error) {
174
- lastError = error;
175
- if (attempt < attempts) await sleep(baseDelayMs * Math.pow(2, attempt - 1));
176
- }
177
- throw lastError;
178
- }
179
- /**
180
- * Post-condition verification for dependency edges.
181
- *
182
- * Issues one batched `bd dep list` over all created bead IDs, compares the
183
- * actual `blocks` dependencies against plan.edges, and repairs any missing edge
184
- * with `bd dep add`. Edges whose endpoints were not both captured are reported
185
- * as errors and not repaired. After repairs, any edge that is still missing
186
- * causes success:false so finalize exits non-zero rather than silently shipping
187
- * a corrupt DAG.
188
- */
189
- async function verifyAndRepairDependencyEdges(client, workspacePath, planEdges, beadIds, timeoutMs, retryOptions = {}) {
190
- const blockEdges = planEdges.filter((edge) => edge.type === "blocks");
191
- if (blockEdges.length === 0 || beadIds.size === 0) return {
192
- success: true,
193
- errors: []
194
- };
195
- const createdBeadIds = Array.from(new Set(beadIds.values()));
196
- let actualDeps;
197
- try {
198
- actualDeps = parseBdList(await runBdWithRetry(`dep list for ${createdBeadIds.length} beads`, () => client.run([
199
- "dep",
200
- "list",
201
- ...createdBeadIds,
202
- "--json"
203
- ]), {
204
- ...retryOptions,
205
- workspacePath
206
- }));
207
- } catch (error) {
208
- return {
209
- success: false,
210
- errors: [`dep list failed: ${execFileErrorMessage(error)}`]
211
- };
212
- }
213
- const isBlocksDep = (dep) => dep?.dependency_type === "blocks" || dep?.type === "blocks" || dep?.relationship === "blocks";
214
- const actualDepSet = new Set(actualDeps.filter(isBlocksDep).map((dep) => `${dep.issue_id}|${dep.depends_on_id ?? dep.id}`));
215
- const errors = [];
216
- const missingRepairs = [];
217
- for (const edge of blockEdges) {
218
- const beadFrom = beadIds.get(edge.from);
219
- const beadTo = beadIds.get(edge.to);
220
- if (!beadFrom || !beadTo) {
221
- errors.push(`Missing bead IDs for dependency edge ${edge.from} -> ${edge.to}`);
222
- continue;
223
- }
224
- const key = `${beadTo}|${beadFrom}`;
225
- if (!actualDepSet.has(key)) missingRepairs.push({
226
- from: edge.from,
227
- to: edge.to,
228
- beadFrom,
229
- beadTo
230
- });
231
- }
232
- for (const repair of missingRepairs) try {
233
- await runBdWithRetry(`dep add ${repair.beadTo} ${repair.beadFrom}`, () => client.mutate([
234
- "dep",
235
- "add",
236
- repair.beadTo,
237
- repair.beadFrom
238
- ]), {
239
- ...retryOptions,
240
- workspacePath
241
- });
242
- actualDepSet.add(`${repair.beadTo}|${repair.beadFrom}`);
243
- } catch (error) {
244
- errors.push(`Failed to repair dependency edge ${repair.from} -> ${repair.to}: ${execFileErrorMessage(error)}`);
245
- }
246
- for (const edge of blockEdges) {
247
- const beadFrom = beadIds.get(edge.from);
248
- const beadTo = beadIds.get(edge.to);
249
- if (!beadFrom || !beadTo) continue;
250
- const key = `${beadTo}|${beadFrom}`;
251
- if (!actualDepSet.has(key)) errors.push(`Dependency edge ${edge.from} -> ${edge.to} still missing after repair`);
252
- }
253
- return {
254
- success: errors.length === 0,
255
- errors
256
- };
257
- }
258
- /**
259
- * Delete a single bead, treating "issue not found" as success. Under contention
260
- * a delete can time out client-side while committing server-side; a retry then
261
- * sees the bead as already gone. Catching that case makes deletion idempotent.
262
- */
263
- async function deleteBead(client, id) {
264
- try {
265
- await client.mutate([
266
- "delete",
267
- id,
268
- "--force"
269
- ]);
270
- } catch (error) {
271
- if (execFileErrorMessage(error).toLowerCase().includes("not found")) return;
272
- throw error;
273
- }
274
- }
275
- async function clearBeadsForIssue(workspacePath, issueLabel, timeoutMsOrOptions = {}) {
276
- const options = normalizeClearBeadsOptions(timeoutMsOrOptions);
277
- const batch = await runMutationBatch({
278
- project: { workspacePath },
279
- reason: `clear beads for ${issueLabel}`,
280
- lockOptions: options
281
- }, (client) => clearBeadsForIssueWithClient(client, workspacePath, issueLabel, options));
282
- return batch.ok ? batch.value : {
283
- cleared: 0,
284
- errors: [formatMutationBatchFailure(batch)]
285
- };
286
- }
287
- async function clearBeadsForIssueWithClient(client, workspacePath, issueLabel, options) {
288
- let existingBeads;
289
- try {
290
- existingBeads = await listBeadsForIssue(workspacePath, issueLabel, options);
291
- } catch (error) {
292
- return {
293
- cleared: 0,
294
- errors: [`list failed: ${execFileErrorMessage(error)}`],
295
- transientFailure: error instanceof BdTransientFailure ? error : void 0
296
- };
297
- }
298
- const errors = [];
299
- let cleared = 0;
300
- for (const id of beadIdsFromList(existingBeads)) try {
301
- await runBdWithRetry(`delete bead ${id} for ${issueLabel}`, () => deleteBead(client, id), {
302
- ...options,
303
- workspacePath
304
- });
305
- cleared++;
306
- } catch (error) {
307
- errors.push(`delete ${id}: ${execFileErrorMessage(error)}`);
308
- }
309
- let residualBeads;
310
- try {
311
- residualBeads = await listBeadsForIssue(workspacePath, issueLabel, options);
312
- } catch (error) {
313
- errors.push(`post-delete list failed: ${execFileErrorMessage(error)}`);
314
- return {
315
- cleared,
316
- errors,
317
- transientFailure: error instanceof BdTransientFailure ? error : void 0
318
- };
319
- }
320
- const residualIds = beadIdsFromList(residualBeads);
321
- if (residualIds.length > 0) errors.push(`residual ${residualIds.length} beads after delete: ${residualIds.join(", ")}`);
322
- return {
323
- cleared,
324
- errors
325
- };
326
- }
327
- function resolveInspectionMetadata(policy, item) {
328
- if (policy === "never") return {
329
- requiresInspection: false,
330
- inspectionDepth: "fast"
331
- };
332
- if (policy === "fast") return {
333
- requiresInspection: true,
334
- inspectionDepth: "fast"
335
- };
336
- if (policy === "deep") return {
337
- requiresInspection: true,
338
- inspectionDepth: "deep"
339
- };
340
- return {
341
- requiresInspection: typeof item.metadata?.requiresInspection === "boolean" ? item.metadata.requiresInspection : false,
342
- inspectionDepth: item.metadata?.inspectionDepth === "deep" ? "deep" : "fast"
343
- };
344
- }
345
- async function createBeadsFromVBriefPromise(workspacePath, options = {}) {
346
- const { planPath, lockOptions, ...retryOptions } = options;
347
- const batch = await runMutationBatch({
348
- project: { workspacePath },
349
- reason: "create beads from vBRIEF",
350
- lockOptions
351
- }, async (bd) => withBdMutexPromise(async () => {
352
- const created = [];
353
- const errors = [];
354
- const beadIds = /* @__PURE__ */ new Map();
355
- try {
356
- await execFileAsync("which", ["bd"], {
357
- encoding: "utf-8",
358
- timeout: 5e3
359
- });
360
- } catch {
361
- return {
362
- success: false,
363
- created: [],
364
- errors: ["bd (beads) CLI not found in PATH"],
365
- beadIds
366
- };
367
- }
368
- const beadsDir = join(workspacePath, ".beads");
369
- const redirectPath = join(beadsDir, "redirect");
370
- if (!existsSync(redirectPath)) {
371
- mkdirSync(beadsDir, { recursive: true });
372
- chmodSync(beadsDir, 448);
373
- writeFileSync(redirectPath, resolveCanonicalBeadsHome(workspacePath) ?? "../../.beads", "utf8");
374
- }
375
- const doc = planPath ? readPlanSync(planPath) : readWorkspacePlanSync(workspacePath);
376
- if (!doc) return {
377
- success: false,
378
- created: [],
379
- errors: ["No plan.vbrief.json found in workspace"],
380
- beadIds
381
- };
382
- const { plan } = doc;
383
- const planEdges = plan.edges ?? [];
384
- const inspectionPolicy = doc.vBRIEFInfo.inspectionPolicy ?? "auto";
385
- const bdTimeoutMs = await resolveBdTimeout(workspacePath);
386
- const issueLabel = plan.id.toLowerCase();
387
- try {
388
- await retryBd(() => execFileAsync("bd", ["ping", "--json"], {
389
- encoding: "utf-8",
390
- cwd: workspacePath,
391
- timeout: bdTimeoutMs
392
- }), { sleep: retryOptions.sleep });
393
- } catch (connectError) {
394
- try {
395
- await execFileAsync("bd", ["doctor", "--fix"], {
396
- encoding: "utf-8",
397
- cwd: workspacePath,
398
- timeout: bdTimeoutMs
399
- });
400
- await retryBd(() => execFileAsync("bd", ["ping", "--json"], {
401
- encoding: "utf-8",
402
- cwd: workspacePath,
403
- timeout: bdTimeoutMs
404
- }), { sleep: retryOptions.sleep });
405
- } catch (retryError) {
406
- return {
407
- success: false,
408
- created: [],
409
- errors: [`beads probe failed after recovery (${execFileErrorMessage(retryError ?? connectError).split("\n")[0]})`],
410
- beadIds
411
- };
412
- }
413
- }
414
- const clearResult = await clearBeadsForIssueWithClient(bd, workspacePath, issueLabel, {
415
- ...retryOptions,
416
- timeoutMs: bdTimeoutMs
417
- });
418
- if (clearResult.errors.length > 0) return {
419
- success: false,
420
- created: [],
421
- errors: clearResult.errors.map((error) => `dedup failed: ${error}`),
422
- transientFailure: clearResult.transientFailure,
423
- beadIds: /* @__PURE__ */ new Map()
424
- };
425
- if (clearResult.cleared > 0) console.log(`[beads] Cleared ${clearResult.cleared} existing beads for ${issueLabel} (verified)`);
426
- const blockers = /* @__PURE__ */ new Map();
427
- for (const item of plan.items) blockers.set(item.id, /* @__PURE__ */ new Set());
428
- for (const edge of planEdges) if (edge.type === "blocks") {
429
- const blockersOfTo = blockers.get(edge.to);
430
- if (blockersOfTo) blockersOfTo.add(edge.from);
431
- }
432
- const inDegree = /* @__PURE__ */ new Map();
433
- const adjacency = /* @__PURE__ */ new Map();
434
- for (const item of plan.items) {
435
- inDegree.set(item.id, 0);
436
- adjacency.set(item.id, []);
437
- }
438
- for (const edge of planEdges) if (edge.type === "blocks") {
439
- inDegree.set(edge.to, (inDegree.get(edge.to) ?? 0) + 1);
440
- adjacency.get(edge.from)?.push(edge.to);
441
- }
442
- const queue = [];
443
- for (const item of plan.items) if ((inDegree.get(item.id) ?? 0) === 0) queue.push(item.id);
444
- const itemById = new Map(plan.items.map((i) => [i.id, i]));
445
- const sortedIds = [];
446
- while (queue.length > 0) {
447
- const id = queue.shift();
448
- sortedIds.push(id);
449
- for (const dependent of adjacency.get(id) ?? []) {
450
- const newDegree = (inDegree.get(dependent) ?? 1) - 1;
451
- inDegree.set(dependent, newDegree);
452
- if (newDegree === 0) queue.push(dependent);
453
- }
454
- }
455
- const orderedIds = sortedIds.length === plan.items.length ? sortedIds : plan.items.map((i) => i.id);
456
- for (let i = 0; i < orderedIds.length; i++) {
457
- const itemId = orderedIds[i];
458
- const item = itemById.get(itemId);
459
- if (!item) continue;
460
- const fullTitle = `${plan.id}: ${item.title}`;
461
- const difficulty = item.metadata?.difficulty ?? "medium";
462
- const issueLabel = item.metadata?.issueLabel ?? plan.id.toLowerCase();
463
- const phase = item.metadata?.phase;
464
- const beadMetadata = {
465
- ...item.metadata ?? {},
466
- vbriefItemId: itemId,
467
- ...resolveInspectionMetadata(inspectionPolicy, item)
468
- };
469
- const labels = [issueLabel, `difficulty:${difficulty}`];
470
- if (phase !== void 0) labels.push(`phase-${phase}`);
471
- const labelStr = labels.join(",");
472
- const description = [item.narrative?.Action ?? "", subItemsOf(item).filter((s) => s.metadata?.kind === "acceptance_criterion").map((s) => `- AC: ${s.title}`).join("\n")].filter(Boolean).join("\n");
473
- const dependencyBeadIds = [...blockers.get(itemId) ?? []].map((blockerId) => beadIds.get(blockerId) ?? null).filter((d) => d !== null);
474
- const args = [
475
- "create",
476
- fullTitle,
477
- "--type",
478
- "task",
479
- "--silent",
480
- "-l",
481
- labelStr,
482
- "--metadata",
483
- JSON.stringify(beadMetadata)
484
- ];
485
- if (description) args.push("-d", description);
486
- if (dependencyBeadIds.length > 0) args.push("--deps", dependencyBeadIds.join(","));
487
- console.log(`[beads] (${i + 1}/${orderedIds.length}) creating "${item.title}"`);
488
- let capturedBeadId = null;
489
- let createFailureMessage = null;
490
- try {
491
- capturedBeadId = (await bd.mutate(args)).trim() || null;
492
- if (!capturedBeadId) createFailureMessage = `Created "${item.title}" but could not capture bead ID`;
493
- } catch (error) {
494
- const timedOut = error?.killed === true || /ETIMEDOUT/i.test(String(error?.code ?? ""));
495
- const errMsg = error?.stderr?.toString() || error?.message || String(error);
496
- const prefix = timedOut ? `timed out after ${Math.round(bdTimeoutMs / 1e3)}s` : errMsg.split("\n")[0];
497
- createFailureMessage = `Failed to create "${item.title}": ${prefix}`;
498
- }
499
- if (capturedBeadId) {
500
- beadIds.set(itemId, capturedBeadId);
501
- created.push(fullTitle);
502
- } else {
503
- console.warn(`[beads] (${i + 1}/${orderedIds.length}) FAILED/EMPTY "${item.title}"; attempting title-based recovery`);
504
- const recovered = await recoverBeadIdByTitle(workspacePath, issueLabel, fullTitle, bdTimeoutMs);
505
- if (recovered.ambiguity) errors.push(`${createFailureMessage}; recovery found multiple beads titled "${fullTitle}"`);
506
- else if (recovered.id) {
507
- beadIds.set(itemId, recovered.id);
508
- created.push(fullTitle);
509
- console.log(`[beads] (${i + 1}/${orderedIds.length}) RECOVERED "${item.title}" as ${recovered.id}`);
510
- } else errors.push(createFailureMessage ?? `Failed to create "${item.title}"`);
511
- }
512
- }
513
- const edgeVerification = await verifyAndRepairDependencyEdges(bd, workspacePath, planEdges, beadIds, bdTimeoutMs, retryOptions);
514
- errors.push(...edgeVerification.errors);
515
- return {
516
- success: errors.length === 0,
517
- created,
518
- errors,
519
- beadIds
520
- };
521
- }));
522
- return batch.ok ? batch.value : {
523
- success: false,
524
- created: [],
525
- errors: [formatMutationBatchFailure(batch)],
526
- beadIds: /* @__PURE__ */ new Map()
527
- };
528
- }
529
- /**
530
- * Syncs a bead's status to the corresponding vBRIEF item.
531
- * Returns the vBRIEF item ID that was updated, or null if no match was found.
532
- * Callers must provide knownTitle (from bd list/show output).
533
- */
534
- async function readBeadTitle(beadId, workspacePath) {
535
- const result = await createBeadsResolver(workspacePath).getBeadById(beadId);
536
- return result.ok ? result.value?.title ?? null : null;
537
- }
538
- async function syncBeadStatusToVBriefPromise(beadId, workspacePath, status = "completed", knownTitle) {
539
- try {
540
- const doc = readWorkspacePlanSync(workspacePath);
541
- if (!doc) return null;
542
- let beadTitle = knownTitle ?? null;
543
- if (!beadTitle) beadTitle = await readBeadTitle(beadId, workspacePath);
544
- if (!beadTitle) return null;
545
- const planId = doc.plan.id;
546
- const prefix = `${planId}: `;
547
- const itemTitle = beadTitle.toLowerCase().startsWith(prefix.toLowerCase()) ? beadTitle.slice(prefix.length) : beadTitle;
548
- const itemTitleLower = itemTitle.toLowerCase();
549
- const matchingItem = doc.plan.items.find((i) => i.title.toLowerCase() === itemTitleLower);
550
- if (!matchingItem) {
551
- console.warn(`[vbrief-sync] No plan item matches bead ${beadId} (title "${itemTitle}") in plan ${planId} — AC statuses for this bead were NOT synced`);
552
- return null;
553
- }
554
- updateItemStatus(workspacePath, matchingItem.id, status);
555
- if (status === "completed") {
556
- for (const sub of subItemsOf(matchingItem)) if (sub.metadata?.kind === "acceptance_criterion" && sub.status !== "completed") updateSubItemStatus(workspacePath, matchingItem.id, sub.id, "completed");
557
- }
558
- console.log(`[vbrief-sync] Updated item "${matchingItem.id}" to "${status}" from bead ${beadId}`);
559
- return matchingItem.id;
560
- } catch (err) {
561
- console.warn(`[vbrief-sync] Failed to sync bead ${beadId}: ${err.message}`);
562
- return null;
563
- }
564
- }
565
- /**
566
- * Get structured AC status from a workspace's vBRIEF plan.
567
- *
568
- * Returns per-item AC counts (completed/pending/total) plus an overall
569
- * allCompleted flag. Returns null if no plan exists or no AC are found
570
- * (legacy workspace compatibility).
571
- *
572
- * Used by: verification gate, pan done, merge agent, prompt injection.
573
- */
574
- function getVBriefACStatusSync(workspacePath) {
575
- const doc = readWorkspacePlanSync(workspacePath);
576
- if (!doc) return null;
577
- const allCriteria = extractACFromDocument(doc);
578
- if (allCriteria.length === 0) return null;
579
- const itemMap = /* @__PURE__ */ new Map();
580
- for (const ac of allCriteria) {
581
- let item = itemMap.get(ac.itemId);
582
- if (!item) {
583
- item = {
584
- itemId: ac.itemId,
585
- itemTitle: ac.itemTitle,
586
- completed: 0,
587
- pending: 0,
588
- total: 0,
589
- criteria: []
590
- };
591
- itemMap.set(ac.itemId, item);
592
- }
593
- item.total++;
594
- item.criteria.push(ac);
595
- if (ac.status === "completed" || ac.status === "cancelled") item.completed++;
596
- else item.pending++;
597
- }
598
- const items = Array.from(itemMap.values());
599
- const totalCompleted = items.reduce((sum, i) => sum + i.completed, 0);
600
- const totalPending = items.reduce((sum, i) => sum + i.pending, 0);
601
- const totalCount = totalCompleted + totalPending;
602
- return {
603
- allCompleted: totalPending === 0,
604
- items,
605
- totalCompleted,
606
- totalPending,
607
- totalCount
608
- };
609
- }
610
- /** Tagged error for beads Effect variants. */
611
- var BeadsOperationError = class extends Data.TaggedError("BeadsOperationError") {};
612
- /**
613
- * Idempotent and internally serialized via bd-mutex. Calling N times yields
614
- * exactly planItemCount beads or returns success:false with errors. Do NOT wrap
615
- * callers in withBdMutex — it will deadlock.
616
- */
617
- const createBeadsFromVBrief = (workspacePath, options = {}) => Effect.tryPromise({
618
- try: () => createBeadsFromVBriefPromise(workspacePath, options),
619
- catch: (cause) => new BeadsOperationError({
620
- operation: "createBeadsFromVBrief",
621
- workspacePath,
622
- message: cause instanceof Error ? cause.message : String(cause),
623
- cause
624
- })
625
- });
626
- /** Effect variant of `syncBeadStatusToVBrief`. */
627
- const syncBeadStatusToVBrief = (beadId, workspacePath, status = "completed", knownTitle) => Effect.tryPromise({
628
- try: () => syncBeadStatusToVBriefPromise(beadId, workspacePath, status, knownTitle),
629
- catch: (cause) => new BeadsOperationError({
630
- operation: "syncBeadStatusToVBrief",
631
- workspacePath,
632
- message: cause instanceof Error ? cause.message : String(cause),
633
- cause
634
- })
635
- });
636
- /** Effect variant of `getVBriefACStatus`. */
637
- const getVBriefACStatus = (workspacePath) => Effect.try({
638
- try: () => getVBriefACStatusSync(workspacePath),
639
- catch: (cause) => new BeadsOperationError({
640
- operation: "getVBriefACStatus",
641
- workspacePath,
642
- message: cause instanceof Error ? cause.message : String(cause),
643
- cause
644
- })
645
- });
646
- //#endregion
647
- export { getVBriefACStatusSync as a, syncBeadStatusToVBrief as c, getVBriefACStatus as i, withBdMutex as l, clearBeadsForIssue as n, resolveBdTimeout as o, createBeadsFromVBrief as r, retryBd as s, BeadsOperationError as t };
648
-
649
- //# sourceMappingURL=beads-BeSMEjGT.js.map