@overdeck/desktop 0.45.15 → 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 (372) 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-CSuZ31bB.js → advancing-selfheal-DgwQgm4D.js} +6 -5
  8. package/server/{agent-gc-D_DxfBHR.js → agent-gc-kpzxqT7P.js} +3 -3
  9. package/server/agent-state-C_6TG-Ad.js +3 -0
  10. package/server/{agent-state-service-C_2ZAQRP.js → agent-state-service-BUfovFfB.js} +1 -1
  11. package/server/{agent-state-service-BZkvgQf4.js → agent-state-service-nUD3qfob.js} +9 -52
  12. package/server/agents-BA15AQqo.js +3 -0
  13. package/server/{briefing-freshness-Kh5V8RTh.js → agents-BHBxr8c9.js} +5 -131
  14. package/server/{archive-planning-DkivCk1A.js → archive-planning-CzCW9Ifl.js} +5 -10
  15. package/server/{archive-planning-CTILQRnV.js → archive-planning-D-QsBufn.js} +1 -1
  16. package/server/{artifact-index-jobs-CmsvQ1ey.js → artifact-index-jobs-qqa51B2Z.js} +2 -2
  17. package/server/{backlog-auto-trigger-ueRaT8Dy.js → backlog-auto-trigger-B7Bi0bvY.js} +3 -3
  18. package/server/behavior-CWqNMqE5.js +10 -0
  19. package/server/briefing-freshness-DuxIE1yr.js +131 -0
  20. package/server/{checkpoint-manager-fu9oVsR-.js → checkpoint-manager-DF6hb9Jw.js} +3 -3
  21. package/server/{checkpoint-manager-CAFos8e1.js → checkpoint-manager-DixkLus7.js} +1 -1
  22. package/server/checkpoint-worker.js +1 -1
  23. package/server/{checkpoints-DvhGi8P_.js → checkpoints-B1Z42tJE.js} +1 -1
  24. package/server/{checkpoints-1BqOlS4q.js → checkpoints-BiviJqei.js} +2 -2
  25. package/server/claude-hooks-provision-BeMGi4ty.js +3 -0
  26. package/server/{claude-hooks-provision-s_wdpeVj.js → claude-hooks-provision-Du_PkMsp.js} +132 -114
  27. package/server/{claude-permissions-CaWqysff.js → claude-permissions-BB6agcOZ.js} +2 -2
  28. package/server/{claude-settings-overlay-CcTf0xzG.js → claude-settings-overlay-CAq2oFSK.js} +2 -2
  29. package/server/{claude-settings-overlay-BbA4FbVI.js → claude-settings-overlay-DUWWLd6M.js} +1 -1
  30. package/server/cli-BFgrSWKV.js +3 -0
  31. package/server/{cli-BwCvCUBK.js → cli-C33xPZNm.js} +9 -9
  32. package/server/{cliproxy-C2xC-3vH.js → cliproxy-BQX1TL6N.js} +1 -1
  33. package/server/{cliproxy-BsoNNDAj.js → cliproxy-CGBA1GzA.js} +2 -2
  34. package/server/{close-issue-BleIwP3f.js → close-issue-DNv8npc1.js} +5 -5
  35. package/server/{closed-issue-reaper-BwUUvjEW.js → closed-issue-reaper-DrqgBJlr.js} +1 -1
  36. package/server/{closed-issue-reaper-mC5pujeb.js → closed-issue-reaper-LoMnnjtJ.js} +9 -9
  37. package/server/codex-DxLivxri.js +3 -0
  38. package/server/{behavior-Cpj03N4v.js → codex-parser-DboQnEXN.js} +3 -9
  39. package/server/{codex-DW60_5j2.js → codex-sgWVCGUd.js} +43 -17
  40. package/server/{config-BRNQJXhA.js → config-6MCHOZ2N.js} +1 -1
  41. package/server/{config-ZNnMpIlh.js → config-DfaUXr6r.js} +2 -2
  42. package/server/{config-yaml-Dcz-8uit.js → config-yaml-CqaAyn8y.js} +149 -80
  43. package/server/{conflict-gate-DTje2Ll7.js → conflict-gate-BF_zhcmb.js} +3 -3
  44. package/server/{conflict-gate-DGT8jCLp.js → conflict-gate-BubJprtD.js} +1 -1
  45. package/server/{context-layers-BdUCQ-cl.js → context-layers-BFrxfl0l.js} +17 -3
  46. package/server/{context-layers-ByOWUjUg.js → context-layers-DWL_8HhY.js} +2 -2
  47. package/server/{control-settings-DwkAeooY.js → control-settings-BguNQ1F_.js} +4 -4
  48. package/server/{conversation-compaction-WYQZUVDm.js → conversation-compaction-CRKAf2qP.js} +1 -1
  49. package/server/{conversation-compaction-OTYgd6eg.js → conversation-compaction-DxSXl0pT.js} +8 -8
  50. package/server/{conversation-service-C_kNZPLx.js → conversation-service-DzuY9qoH.js} +1 -1
  51. package/server/{conversation-service-BR1OgvxO.js → conversation-service-mFVFdDQK.js} +6 -5
  52. package/server/{conversations-DG2M8WnT.js → conversations-BX5aD-6F.js} +4 -4
  53. package/server/{conversations-izHvSoAR.js → conversations-BajHQ60c.js} +1 -1
  54. package/server/{cost-DQ2ajr_m.js → cost-BoqD1Pxz.js} +2 -2
  55. package/server/{cost-B2mj17iG.js → cost-DuZ5vlv-.js} +3 -3
  56. package/server/{cost-sync-gTayEuWP.js → cost-sync-BYnmnMkY.js} +3 -3
  57. package/server/{dag-CqTehWpY.js → dag-C6kYyF17.js} +7 -243
  58. package/server/{dangerous-git-ops-DDWQlPC3.js → dangerous-git-ops-q5OPtXMd.js} +1 -1
  59. package/server/dashboard-db-worker.js +6 -6
  60. package/server/{deacon-BqW9HMew.js → deacon-CwCiNuEZ.js} +3 -3
  61. package/server/{deacon-DrKDBeJL.js → deacon-Dru5onpk.js} +258 -167
  62. package/server/{deacon-nudge-log-D1wEK6zF.js → deacon-nudge-log-ilDfxrhK.js} +1 -1
  63. package/server/{deacon-swarm-CO_A7xyd.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-BQolp_qZ.js → devcontainer-renderer-BqGNCzvN.js} +3 -3
  67. package/server/{dist-Bc32rWJB.js → dist-BwlEiLCU.js} +1 -1
  68. package/server/dist-Bx4KkgYL.js +3 -0
  69. package/server/{dist-src-Byxt1ifL.js → dist-src-BE0Denfs.js} +1 -1
  70. package/server/{docker-s-esqZ__.js → docker-CNjXS72x.js} +2 -2
  71. package/server/{ensure-devcontainer-DA4-jF6R.js → ensure-devcontainer-5e9xOve4.js} +4 -4
  72. package/server/{ensure-devcontainer-pUVaT0h3.js → ensure-devcontainer-C6gyUQdE.js} +1 -1
  73. package/server/{esm-shims-CJHy8CZY.js → esm-shims-Cso7IGBC.js} +1 -1
  74. package/server/{event-store-CcJAhKCl.js → event-store-D9UhQyMS.js} +1 -1
  75. package/server/{event-store-DRte2Rwt.js → event-store-KZnWUKWh.js} +3 -3
  76. package/server/{events-Bej1w_k8.js → events-2eFUPdqz.js} +3 -3
  77. package/server/{events-CtsLScn8.js → events-BYbvqZky.js} +1 -1
  78. package/server/{factory-FN727tWr.js → factory-BtaRsHFC.js} +20 -17
  79. package/server/{feature-registry-population-ie-yBcQC.js → feature-registry-population-Ca2UaV0U.js} +4 -4
  80. package/server/{feature-registry-storage-CkZTFSsn.js → feature-registry-storage-DaP-bQxO.js} +2 -2
  81. package/server/{features-Dtm9ABuz.js → features-DqvaoQoa.js} +2 -2
  82. package/server/{feedback-target-BYtpyt1i.js → feedback-target-BXWdOiYI.js} +9 -7
  83. package/server/{feedback-target-DVJQDiE4.js → feedback-target-BblmMe9P.js} +1 -1
  84. package/server/{feedback-writer-DOUhyIW2.js → feedback-writer-CULeOOY4.js} +1 -1
  85. package/server/{feedback-writer-fdE1BzeL.js → feedback-writer-Dn8o9ZyE.js} +4 -4
  86. package/server/{flywheel-Bi82iiNl.js → flywheel-BUWdcfhq.js} +1 -1
  87. package/server/{flywheel-Bv3wv2S6.js → flywheel-CqkO3cDj.js} +15 -28
  88. package/server/{flywheel-CUErLAyN.js → flywheel-D9r1mw2U.js} +13 -13
  89. package/server/{flywheel-merge-order-DXjeBnJ1.js → flywheel-merge-order-LDzQDwSg.js} +1 -1
  90. package/server/{flywheel-merge-order-BaEN3iyN.js → flywheel-merge-order-VtjUweEb.js} +7 -7
  91. package/server/forge-DJy3Zx4s.js +2 -0
  92. package/server/{forge-ButEdJ31.js → forge-wEollMCi.js} +22 -12
  93. package/server/{from-CbtTxftl.js → from-B2tOYhYV.js} +1 -1
  94. package/server/{fts-db-CBgBLZcL.js → fts-db-Bgzn2RO7.js} +2 -2
  95. package/server/{fts-operations-CI9Xuo_1.js → fts-operations-Bj8yutnR.js} +2 -2
  96. package/server/{git-utils-ClfpP47N.js → git-utils-GxlL0tmt.js} +2 -2
  97. package/server/{git-utils-BCLRWQ-y.js → git-utils-q8jNoBts.js} +1 -1
  98. package/server/{github-app-DRD2woO0.js → github-app-BrYwK_Gb.js} +1 -1
  99. package/server/{github-app-DscZ0_B6.js → github-app-tUbb8Ldr.js} +8 -3
  100. package/server/{github-client-DpiZnxGH.js → github-client-BwBU41jK.js} +3 -3
  101. package/server/{github-client-iFRw8f7e.js → github-client-D6CNsftm.js} +1 -1
  102. package/server/{github-pr-lookup-D-EBexxC.js → github-pr-lookup-BS5PqkJb.js} +2 -2
  103. package/server/{harness-resolve-iMjyNUJ2.js → harness-resolve-Dx8hUsvC.js} +3 -3
  104. package/server/{health-events-CRdxDFN2.js → health-events-2DLp-5Xp.js} +2 -2
  105. package/server/{health-events-B_WsQyYm.js → health-events-B0mj6Iae.js} +1 -1
  106. package/server/{hooks-C1ScyVxP.js → hooks-BDcQJDUe.js} +1 -1
  107. package/server/{hooks-C9b7Vqpw.js → hooks-BS_JrvYP.js} +3 -3
  108. package/server/hume-B4seN95Y.js +3 -0
  109. package/server/{hume-TQ5pvOZ_.js → hume-BRhNKyXQ.js} +2 -2
  110. package/server/{idle-stack-reaper-B1kG7B_X.js → idle-stack-reaper-BCITXNW5.js} +2 -2
  111. package/server/{idle-stack-reaper-iFVOAoJy.js → idle-stack-reaper-C1ymihno.js} +1 -1
  112. package/server/{infra-bpq1MHKU.js → infra-_Kx1m9pm.js} +9 -4
  113. package/server/{injection-BLWfwTVZ.js → injection-Bvhyg_MV.js} +1 -1
  114. package/server/{injection-DJqWld1v.js → injection-CCaYkofq.js} +7 -7
  115. package/server/{inspect-agent-DytCsltn.js → inspect-agent-BqyZ4pCo.js} +35 -67
  116. package/server/inspect-agent-DCJQm9Wu.js +2 -0
  117. package/server/{internal-token-CjlhdufS.js → internal-token-Cl-1IxaE.js} +2 -2
  118. package/server/{internal-token-CCaWaTwE.js → internal-token-D-t28de5.js} +1 -1
  119. package/server/{io-BiQ2Cs3k.js → io-DkC4sFSy.js} +42 -56
  120. package/server/{issue-closed-FApNiOOs.js → issue-closed-Cpl4VDUM.js} +41 -6
  121. package/server/{issue-lifecycle-C-K53ASY.js → issue-lifecycle-CFR8TJ22.js} +22 -37
  122. package/server/{issue-lifecycle-BkFWNjlD.js → issue-lifecycle-YNTy3OT3.js} +1 -1
  123. package/server/{issue-service-singleton-bG1WdSdQ.js → issue-service-singleton-D81mCts_.js} +1 -1
  124. package/server/{issue-service-singleton-CuHGpJJP.js → issue-service-singleton-ldvUUXi3.js} +29 -29
  125. package/server/{issues-CwQMphDH.js → issues-DIEHt9sq.js} +2 -2
  126. package/server/{jsonl-parser-dNIjHgym.js → jsonl-parser-Cd5jIqh7.js} +3 -3
  127. package/server/{label-cleanup-DYvAZknd.js → label-cleanup-Btny6Gyo.js} +3 -3
  128. package/server/{state-home-CRowbXqU.js → launcher-generator-BXLM9f4b.js} +7 -127
  129. package/server/{layers-CD6FysRU.js → layers-gCJlK62m.js} +2 -2
  130. package/server/lifecycle-D7aQUnTO.js +12 -0
  131. package/server/{lifecycle-io-C_Wu0_i-.js → lifecycle-io-DQBF-GHO.js} +1 -1
  132. package/server/{lifecycle-io-CeYxP3cE.js → lifecycle-io-FfPUtz-y.js} +36 -47
  133. package/server/{linear-client-EtVyblVz.js → linear-client-CDH2D6Qy.js} +3 -3
  134. package/server/{linear-client-4qoKnuQu.js → linear-client-WrYrUIAH.js} +1 -1
  135. package/server/memory-fts-worker.js +1 -1
  136. package/server/{merge-7rqkTUm2.js → merge-BsDgUxFz.js} +3 -3
  137. package/server/{merge-brm721Es.js → merge-Dervs4BF.js} +1 -1
  138. package/server/{merge-agent-4Zhlgvqp.js → merge-agent-D6DNhe9j.js} +64 -51
  139. package/server/{merge-agent-36wfYm2u.js → merge-agent-DMQTJMP0.js} +1 -1
  140. package/server/{merge-batch-itfnwdsT.js → merge-batch-Bv6Z5K2H.js} +1 -1
  141. package/server/{merge-blockers-Bto_Oe_o.js → merge-blockers-WWWi6Ur2.js} +2 -2
  142. package/server/merge-ops-h9OCnIVz.js +2 -0
  143. package/server/{merge-rebase-Czfqfe4q.js → merge-rebase-Czth9ggm.js} +2 -2
  144. package/server/{merge-set-BIkGQL9j.js → merge-set-DNc4zBqd.js} +3 -3
  145. package/server/{merge-set-G1RHcu3D.js → merge-set-vuE3MEVt.js} +1 -1
  146. package/server/{merge-sync-B43Dybea.js → merge-sync-B2KSk54U.js} +2 -2
  147. package/server/{merge-sync-DIrmlZUr.js → merge-sync-B9nHdUGx.js} +1 -1
  148. package/server/{merge-train-DGqVuNZV.js → merge-train-DJgr81tF.js} +3 -3
  149. package/server/{merge-train-deps-q15XLnAS.js → merge-train-deps-B2OWS0k9.js} +4 -4
  150. package/server/{merge-verification-Cqfxx6bE.js → merge-verification-BBIXUEqa.js} +4 -4
  151. package/server/{multipart-parser-CiPxxfUH.js → multipart-parser-9DhuAkPd.js} +2 -2
  152. package/server/{no-resume-mode-yrPEQ_pC.js → no-resume-mode-Gh5R_YLF.js} +1 -1
  153. package/server/node_modules/.package-lock.json +11 -11
  154. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  155. package/server/node_modules/toml/README.md +54 -0
  156. package/server/node_modules/toml/index.d.ts +42 -1
  157. package/server/node_modules/toml/index.js +3 -3
  158. package/server/node_modules/toml/lib/compiler.js +35 -3
  159. package/server/node_modules/toml/lib/parser.js +224 -143
  160. package/server/node_modules/toml/package.json +3 -1
  161. package/server/node_modules/ws/lib/receiver.js +15 -32
  162. package/server/node_modules/ws/lib/websocket-server.js +4 -4
  163. package/server/node_modules/ws/lib/websocket.js +4 -4
  164. package/server/node_modules/ws/package.json +5 -1
  165. package/server/{orphan-proposed-reconciler-BWWHn4Lr.js → orphan-proposed-reconciler-B8H41C4a.js} +14 -24
  166. package/server/{orphan-proposed-reconciler-DAD9FJtQ.js → orphan-proposed-reconciler-DbTmT7qy.js} +1 -1
  167. package/server/package-lock.json +12 -12
  168. package/server/package.json +1 -1
  169. package/server/{pan-dir-Bj7Hy8iu.js → pan-dir-BTw4MdSe.js} +4 -4
  170. package/server/{paths-C9DkhIOT.js → paths-Btkc8mzp.js} +2 -2
  171. package/server/{pickup-CKRuGDsB.js → pickup-BtvRBbvI.js} +1 -1
  172. package/server/{pipeline-notifier-BkKbQ8ji.js → pipeline-notifier-3frIvSi3.js} +1 -1
  173. package/server/{pipeline-notifier-CAurUste.js → pipeline-notifier-DTd19f18.js} +2 -2
  174. package/server/{project-pipelines-BRWaGmI4.js → project-pipelines-B95fcAek.js} +2 -2
  175. package/server/projects-Dc9aoVoG.js +3 -0
  176. package/server/{prompts-DfI5qbTW.js → prompts-CIVmjHxn.js} +2 -2
  177. package/server/{providers-D-5txBRc.js → providers-BLLk5IIb.js} +1 -1
  178. package/server/{providers-CWDXoaMA.js → providers-C-yWibCk.js} +7 -7
  179. package/server/public/assets/chunk-BO2N2NFS-DzKZyoKY.js +103 -0
  180. package/server/public/assets/{diagram-OG6HWLK6-Avtvq2qI.js → diagram-OG6HWLK6-Cx8mWUb8.js} +1 -1
  181. package/server/public/assets/{dist-BEHQuasD.js → dist-BqccLhaw.js} +3 -3
  182. package/server/public/assets/{dist-BvmY-qb1.js → dist-rC3nAs_O.js} +1 -1
  183. package/server/public/assets/{ganttDiagram-6RSMTGT7-7KhCd0fH.js → ganttDiagram-6RSMTGT7-DLYPLf5T.js} +1 -1
  184. package/server/public/assets/{highlighted-body-OFNGDK62-iQoBMTf0.js → highlighted-body-OFNGDK62-D4DqixbV.js} +1 -1
  185. package/server/public/assets/index-CPcysUHk.js +796 -0
  186. package/server/public/assets/index-H5M0yhM4.css +1 -0
  187. package/server/public/assets/{linear-CiJHW9g5.js → linear-yqcXkDfj.js} +1 -1
  188. package/server/public/assets/mermaid-GHXKKRXX-CWdZ_heB.js +1 -0
  189. package/server/public/assets/{pieDiagram-4H26LBE5-BOhmvUhW.js → pieDiagram-4H26LBE5-DhraIOaV.js} +1 -1
  190. package/server/public/assets/{prod-DmLBBqat.js → prod-DKUunUdN.js} +4 -4
  191. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Cjku660G.js → quadrantDiagram-W4KKPZXB-DPiRcToa.js} +1 -1
  192. package/server/public/assets/{sankeyDiagram-5OEKKPKP-D52w5oPh.js → sankeyDiagram-5OEKKPKP-3An5HNkZ.js} +1 -1
  193. package/server/public/assets/{xychartDiagram-2RQKCTM6-BTO07_Iv.js → xychartDiagram-2RQKCTM6-lbEOjfqQ.js} +1 -1
  194. package/server/public/index.html +2 -2
  195. package/server/{pull-requests-CKZPWhjD.js → pull-requests-D7AL5woD.js} +1 -1
  196. package/server/{pull-requests-Bmre-Xlz.js → pull-requests-NDDNtqNq.js} +3 -3
  197. package/server/{agents-CsOzAmRg.js → queries-C0LCGG21.js} +743 -399
  198. package/server/{rally-BBd9tQ__.js → rally-4oKvnxLG.js} +3 -3
  199. package/server/rally-DF5a3ioP.js +3 -0
  200. package/server/{rally-api-DxZFObI_.js → rally-api-41tT6ikZ.js} +2 -2
  201. package/server/{rally-api-DDc85HIz.js → rally-api-BsaQ8Vnz.js} +1 -1
  202. package/server/{rally-client-DvvLiAQP.js → rally-client-Bo4hNcCZ.js} +5 -5
  203. package/server/{rally-client-BADHn0m_.js → rally-client-b5PT1x5L.js} +1 -1
  204. package/server/{reap-terminal-sessions-D_xvy-Mk.js → reap-terminal-sessions-BR39qflC.js} +1 -1
  205. package/server/{reap-terminal-sessions-D6JDJsqF.js → reap-terminal-sessions-CFkuquQj.js} +1 -1
  206. package/server/{rebuild-stack-GOsWqXi3.js → rebuild-stack-C7JPUom6.js} +1 -1
  207. package/server/{rebuild-stack-D19i080j.js → rebuild-stack-Ddv6W017.js} +6 -6
  208. package/server/{reconstruct-cache-lQrG4xGg.js → reconstruct-cache-Gqhm---K.js} +6 -6
  209. package/server/record-DLOqfbkI.js +3 -0
  210. package/server/record-update-BltEmPge.js +168 -0
  211. package/server/record-update-CDp7aTaT.js +3 -0
  212. package/server/recovery-trip-Cn7KJVkS.js +44 -0
  213. package/server/{release-engine-DxcMWRuK.js → release-engine-BYzmIBf9.js} +5 -5
  214. package/server/{release-set-BYsgX7o6.js → release-set-7pnxFOWR.js} +3 -3
  215. package/server/{remote-DmeL21dF.js → remote-Cvu4CSDk.js} +3 -3
  216. package/server/{remote-agents-BfQBE6MN.js → remote-agents-C2C6z9tj.js} +6 -33
  217. package/server/{remote-agents-DlvbzO7m.js → remote-agents-DYY5fFpd.js} +1 -1
  218. package/server/{remote-completion-BgkiSQmx.js → remote-completion-2Kb4IDg_.js} +13 -13
  219. package/server/{remote-8W2Yhygw.js → remote-rN0ecjHE.js} +3 -3
  220. package/server/resume-BFLl-yLn.js +3 -0
  221. package/server/{review-agent-D025Wt7w.js → review-agent-BZvk0N5G.js} +31 -23
  222. package/server/{review-agent-Rub0OpZc.js → review-agent-CpSHLzed.js} +1 -1
  223. package/server/{review-artifacts-CX951jTU.js → review-artifacts-PCo53YMn.js} +5 -19
  224. package/server/{review-context-DGGGR_w5.js → review-context-M7QtJlJq.js} +8 -8
  225. package/server/{review-monitor-0_qqMcnS.js → review-monitor-BLC5mTTg.js} +2 -2
  226. package/server/{review-status-Br6lAFGO.js → review-status-77N3PoZr.js} +1 -1
  227. package/server/{review-status-4qqLkRMu.js → review-status-DANr0t-v.js} +33 -59
  228. package/server/{review-status-enrichment-Cr8m3uVL.js → review-status-enrichment-DwOg4UfL.js} +3 -3
  229. package/server/{review-status-sync-D3KUhsdA.js → review-status-sync-Bd08OOFA.js} +1 -1
  230. package/server/{review-status-sync-OC-l1lNt.js → review-status-sync-BjTUJ5fx.js} +2 -2
  231. package/server/{review-verdict-feedback-YOzmsq9G.js → review-verdict-feedback-BsFLjN_6.js} +1 -1
  232. package/server/{review-verdict-feedback-DrWMuRaj.js → review-verdict-feedback-CBf-J_wS.js} +8 -8
  233. package/server/{rollup-CnxbwaLH.js → rollup-Bu0f2EyN.js} +8 -8
  234. package/server/{rollup-DmazRY0j.js → rollup-DTCCdEy4.js} +1 -1
  235. package/server/{scanner-DE1MqAaF.js → scanner-BlZ2vB7j.js} +7 -7
  236. package/server/{sequence-io-C0uoqfGx.js → sequence-io-ylyDtz2J.js} +4 -4
  237. package/server/{sequencer-agent-i-b2u4SJ.js → sequencer-agent-DsWQ-87H.js} +6 -17
  238. package/server/server.js +5670 -6392
  239. package/server/{service-D0_gh2tl.js → service-CLVBC_1Y.js} +116 -90
  240. package/server/{session-fork-DZ12vipL.js → session-fork-DlEIAhRy.js} +2 -2
  241. package/server/session-history-bnOFKMwf.js +168 -0
  242. package/server/settings-CP3GGon2.js +2 -0
  243. package/server/{settings-ByqjPtFO.js → settings-Cqa-8nyj.js} +2 -2
  244. package/server/{settings-DCC4BAqj.js → settings-gJrdLZy2.js} +3 -3
  245. package/server/{shadow-engineering-BhnmtW5m.js → shadow-engineering-fq1YEKV3.js} +3 -3
  246. package/server/{shadow-state-ByXZehsy.js → shadow-state-BqeFAygK.js} +1 -1
  247. package/server/{shadow-state-CKm8xWX9.js → shadow-state-RptE9Cau.js} +2 -2
  248. package/server/shadow-utils-BMWr5tRT.js +39 -0
  249. package/server/{ship-log-DE_0Cv_i.js → ship-log-BRQQi2lU.js} +1 -1
  250. package/server/{smart-compaction-D5Zen3AA.js → smart-compaction-CmoXpjeU.js} +7 -7
  251. package/server/{smart-compaction-h4_ca6Uk.js → smart-compaction-DldUel4B.js} +1 -1
  252. package/server/{spawn-planning-session-Dueit4WX.js → spawn-planning-session-CoS6LTc6.js} +16 -16
  253. package/server/{spawn-planning-session-Bgi7Ub02.js → spawn-planning-session-DT2tSMxo.js} +1 -1
  254. package/server/{specialist-completion-BZ8M-WZ0.js → specialist-completion-pJtESo7m.js} +1 -1
  255. package/server/{specialist-context-BMq83C58.js → specialist-context-CspI4Eog.js} +5 -5
  256. package/server/{specialist-handoff-logger-BxX1YefH.js → specialist-handoff-logger-Duz9RGvk.js} +2 -2
  257. package/server/{specialist-logs-BWZYcJ6P.js → specialist-logs-DtSkPJZK.js} +3 -3
  258. package/server/{specialists-ZkW4Mb7U.js → specialists-CywEMwxk.js} +1 -1
  259. package/server/{specialists-8ZAguXef.js → specialists-D9-dMUtI.js} +1 -1
  260. package/server/{specialists-BudKrjOu.js → specialists-Dax7tqXC.js} +1817 -560
  261. package/server/{specialists-DrPrC9Y9.js → specialists-GF42OOqd.js} +18 -18
  262. package/server/specs-VwcFtEDi.js +3 -0
  263. package/server/{src-DHn4Rd2F.js → src-By3D85Ry.js} +77 -1
  264. package/server/{src-Dv6L03vW.js → src-CqyFg52C.js} +5 -5
  265. package/server/{src-DNUUqkec.js → src-DhxM-eCb.js} +6 -6
  266. package/server/{stack-health-Dclm7_tu.js → stack-health-BsEVrJZ6.js} +1 -1
  267. package/server/{stack-health-DxsTx7II.js → stack-health-C-SnpRHh.js} +2 -2
  268. package/server/stale-task-claims-vTxmRzLi.js +69 -0
  269. package/server/state-home-Bur1y4oH.js +213 -0
  270. package/server/{state-mapping-BvAgFK8n.js → state-mapping-Ci0pkac4.js} +1 -1
  271. package/server/state-migrate-D3VveYfO.js +362 -0
  272. package/server/{stuck-remediation-CFWUP8_I.js → stuck-remediation-B699-p8v.js} +63 -46
  273. package/server/{stuck-remediation-CLHd-lrF.js → stuck-remediation-CaFYYTQW.js} +1 -1
  274. package/server/{summary-fork-CKc01Our.js → summary-fork-BxnF8Xh0.js} +2 -2
  275. package/server/{summary-fork-CtCwBJ2Z.js → summary-fork-COqYpVa3.js} +8 -8
  276. package/server/supervisor/{paths-3R6b989k.js → paths-Bk6hJRH9.js} +4 -3
  277. package/server/supervisor/pty-supervisor.js +2 -2
  278. package/server/supervisor/{pty-token-CScQ32Rj.js → pty-token-BZS5GYdG.js} +2 -2
  279. package/server/supervisor-eWAAmXKu.js +2 -0
  280. package/server/{supervisor-BA5D72Qa.js → supervisor-liMgIPDF.js} +2 -2
  281. package/server/{swarm-readiness-CL5sM9B1.js → swarm-readiness-sXB1vhzo.js} +3 -3
  282. package/server/{system-prerequisites-DmFSXIE5.js → system-prerequisites-Bz6KdkFJ.js} +1 -13
  283. package/server/{teardown-workspace-DWmFJzTw.js → teardown-workspace-DvzqnmUF.js} +14 -71
  284. package/server/{test-agent-queue-DjsQoV5X.js → test-agent-queue-hAU1Ah08.js} +6 -6
  285. package/server/{test-verdict-BSqsQp3G.js → test-verdict-CRsPpByy.js} +1 -1
  286. package/server/{test-verdict-D1AmZ2c0.js → test-verdict-CXMLATGc.js} +1 -1
  287. package/server/{tldr-daemon-C-MGomL8.js → tldr-daemon-Bam7Xhoo.js} +2 -2
  288. package/server/{tldr-daemon-DD9rI5gA.js → tldr-daemon-DhGwd88s.js} +1 -1
  289. package/server/tmux-C-rgxRDA.js +3 -0
  290. package/server/{tmux-C_d-lSIq.js → tmux-U55cNGFG.js} +92 -4
  291. package/server/{token-DfBf1bsd.js → token-Dsa-i36o.js} +2 -2
  292. package/server/{token-util-CROoF5ic.js → token-util-BWNpH96m.js} +1 -1
  293. package/server/token-util-DRt0j2nQ.js +3 -0
  294. package/server/{tracker-config-CNODpd11.js → tracker-config-OkdbaUCm.js} +2 -2
  295. package/server/{tracker-utils-Ch2_5GGf.js → tracker-utils-CghXMF3q.js} +2 -2
  296. package/server/{tracker-utils-B9ZoVA9b.js → tracker-utils-DdzUiPNU.js} +1 -1
  297. package/server/{traefik-connect-BF4x_LUQ.js → traefik-connect-CZYB3dlm.js} +1 -1
  298. package/server/{tunnel-r_5nHAI6.js → tunnel-D1YxesBL.js} +3 -3
  299. package/server/{tunnel-YD80_IHr.js → tunnel-DjlzgTl3.js} +1 -1
  300. package/server/typed-errors-CH4roFIj.js +3 -0
  301. package/server/{typed-errors-BEJhbjJg.js → typed-errors-n_Tnb4Fh.js} +3 -4
  302. package/server/{types-CE1m_daD.js → types-DOjWNv3Z.js} +1 -1
  303. package/server/{types-33JEP4LZ.js → types-DXBMm4mX.js} +1 -1
  304. package/server/{uat-train-DDI00aqD.js → uat-train-CaaWs9Rp.js} +1 -1
  305. package/server/{uat-train-DjkFWXge.js → uat-train-CqN34zFx.js} +24 -25
  306. package/server/{validation-DUTiJnyz.js → validation-4-z2Cw4z.js} +70 -23
  307. package/server/validation-DpTNakM6.js +3 -0
  308. package/server/verification-artifact-DK1xb1zG.js +56 -0
  309. package/server/verification-artifact-JD_edpZ9.js +2 -0
  310. package/server/{verification-runner-inLgeQux.js → verification-runner-BjHN80pJ.js} +338 -58
  311. package/server/verification-runner-ShYu5Ph3.js +2 -0
  312. package/server/{work-agent-prompt-fZljjA1_.js → work-agent-prompt-BiJ43Der.js} +12 -88
  313. package/server/workflows-B4C3lY9E.js +2 -0
  314. package/server/{workflows-oBnJ7Tm0.js → workflows-DkTotz_m.js} +17 -24
  315. package/server/{workspace-CNuW2j41.js → workspace-CuN0ev4Z.js} +3 -3
  316. package/server/{workspace-B2WOW9Hw.js → workspace-DQ4vVivd.js} +1 -1
  317. package/server/{workspace-config-CBgMGhWs.js → workspace-config-C77NKnsV.js} +1 -1
  318. package/server/{workspace-manager-DjUAJCSs.js → workspace-manager-B1mYn0lN.js} +1 -1
  319. package/server/{workspace-manager-CB-R07R3.js → workspace-manager-Beeo2aKF.js} +23 -48
  320. package/server/{workspace-metadata-9Nn5kgRl.js → workspace-metadata-BZC5BmoP.js} +2 -2
  321. package/server/{workspace-metadata-Fd58uUQG.js → workspace-metadata-Cy7_ZACL.js} +1 -1
  322. package/server/{workspaces-BjWXntty.js → workspaces-CGuzW1Ia.js} +191 -153
  323. package/sync-sources/hooks/ask-user-question-hook +7 -1
  324. package/sync-sources/hooks/codex-notify-hook +64 -8
  325. package/sync-sources/hooks/record-cost-event.js +1109 -36
  326. package/sync-sources/hooks/record-cost-event.js.map +1 -1
  327. package/sync-sources/hooks/statusline.sh +2 -2
  328. package/sync-sources/hooks/work-agent-stop-hook +1 -2
  329. package/server/acceptance-criteria-DHZk2ceV.js +0 -33
  330. package/server/agent-runtime-mirror-DrWxopNA.js +0 -37
  331. package/server/agent-state-EP2QFV9n.js +0 -3
  332. package/server/agents-DCvyTXNU.js +0 -3
  333. package/server/auto-commit-QAfsu3Sb.js +0 -3
  334. package/server/bd-process-lock-D3S4T4o-.js +0 -390
  335. package/server/beads-BGGxrkZ5.js +0 -649
  336. package/server/beads-CYsLiyIM.js +0 -2
  337. package/server/beads-query-B1DlJVp9.js +0 -95
  338. package/server/beads-restore-CyygSmmn.js +0 -23
  339. package/server/cli-ClIQwgMI.js +0 -3
  340. package/server/codex-B7DTpwEw.js +0 -3
  341. package/server/compact-beads-CK_hHEnB.js +0 -3
  342. package/server/compact-beads-DKL54y6j.js +0 -94
  343. package/server/deacon-swarm-BY5hKNaU.js +0 -2
  344. package/server/dist-DGTwcZhI.js +0 -3
  345. package/server/export-Dx_qJ3h8.js +0 -87
  346. package/server/forge-XlDgPQWs.js +0 -2
  347. package/server/hume-K1pi8jC4.js +0 -3
  348. package/server/inspect-agent-477VxQim.js +0 -2
  349. package/server/lifecycle-C_73gi-C.js +0 -14
  350. package/server/merge-ops-PzqsW69V.js +0 -2
  351. package/server/projects-KJ94e50I.js +0 -3
  352. package/server/public/assets/chunk-BO2N2NFS-ClukPsZQ.js +0 -103
  353. package/server/public/assets/index-DUFDmvmH.css +0 -1
  354. package/server/public/assets/index-DnTZ2QeN.js +0 -796
  355. package/server/public/assets/mermaid-GHXKKRXX-DZJOwgBG.js +0 -1
  356. package/server/rally-Dc2Wnxw2.js +0 -3
  357. package/server/record-pyB6VA32.js +0 -3
  358. package/server/recovery-trip-Dfh1tNHn.js +0 -98
  359. package/server/resolver-dTpSSzaH.js +0 -158
  360. package/server/resume-DhcIqsTm.js +0 -3
  361. package/server/settings-yydgaqhv.js +0 -2
  362. package/server/specs-DwoAEGrW.js +0 -3
  363. package/server/supervisor-DHjumXlL.js +0 -2
  364. package/server/tmux-x291Gjjb.js +0 -3
  365. package/server/token-util-xNaV-00f.js +0 -3
  366. package/server/tracker-config-DItsdelv.js +0 -3
  367. package/server/typed-errors-DSPn_xWP.js +0 -3
  368. package/server/validation-ict8hnXk.js +0 -3
  369. package/server/verification-runner-ATaLbpr5.js +0 -2
  370. package/server/workflows-tU7KKxQi.js +0 -2
  371. package/server/writer-CQMGzEkw.js +0 -3
  372. package/server/writer-fe1-8iGc.js +0 -251
@@ -27,8 +27,8 @@ MAG='\033[35m'; RED='\033[31m'; WHT='\033[37m'
27
27
  # Helper: format token count
28
28
  fmt() {
29
29
  local n=${1:-0}
30
- if (( n >= 1000000 )); then printf "%.1fM" "$(echo "scale=1;$n/1000000" | bc)"
31
- elif (( n >= 1000 )); then printf "%.1fk" "$(echo "scale=1;$n/1000" | bc)"
30
+ if (( n >= 1000000 )); then awk -v n="$n" 'BEGIN { printf "%.1fM", n / 1000000 }'
31
+ elif (( n >= 1000 )); then awk -v n="$n" 'BEGIN { printf "%.1fk", n / 1000 }'
32
32
  else echo "$n"; fi
33
33
  }
34
34
 
@@ -356,8 +356,7 @@ $OUTPUT
356
356
  </terminal_output>
357
357
 
358
358
  Decide FORGOT_COMPLETION if ANY of these are true AND the transcript does NOT show a 'pan work done' Bash invocation in the tail:
359
- - the agent wrote a summary/wrap-up message ('all tests pass', 'implementation complete', 'all beads closed', 'ready for review', etc.) and then stopped
360
- - the agent closed beads or ran 'bd close' and finished with a prompt
359
+ - the agent wrote a summary/wrap-up message ('all tests pass', 'implementation complete', 'all vBRIEF tasks closed', 'ready for review', etc.) and then stopped
361
360
  - the agent committed + pushed and the last message is a status summary instead of a pan-work-done command
362
361
 
363
362
  Decide STILL_WORKING only if the tail clearly shows an in-progress task (mid-edit, running tests, reading files) with no wrap-up summary.
@@ -1,33 +0,0 @@
1
- import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { b as init_types, o as init_io, x as subItemsOf } from "./io-BiQ2Cs3k.js";
3
- import "effect";
4
- //#region ../../lib/vbrief/acceptance-criteria.ts
5
- /**
6
- * Extract AC from an already-loaded document (avoids re-reading the file).
7
- */
8
- function isDeferredOrCancelledItem(item) {
9
- const status = String(item.status);
10
- return status === "cancelled" || status === "deferred" || item.metadata?.deferred === true;
11
- }
12
- function extractACFromDocument(doc) {
13
- const criteria = [];
14
- for (const item of doc.plan.items) {
15
- if (isDeferredOrCancelledItem(item)) continue;
16
- for (const sub of subItemsOf(item)) if (sub.metadata?.kind === "acceptance_criterion") criteria.push({
17
- itemId: item.id,
18
- itemTitle: item.title,
19
- subItemId: sub.id,
20
- title: sub.title,
21
- status: sub.status
22
- });
23
- }
24
- return criteria;
25
- }
26
- var init_acceptance_criteria = __esmMin((() => {
27
- init_io();
28
- init_types();
29
- }));
30
- //#endregion
31
- export { init_acceptance_criteria as n, extractACFromDocument as t };
32
-
33
- //# sourceMappingURL=acceptance-criteria-DHZk2ceV.js.map
@@ -1,37 +0,0 @@
1
- import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Effect } from "effect";
3
- //#region ../../lib/agent-runtime-mirror.ts
4
- /**
5
- * PAN-800 — in-process mirror of AgentStateService's canonical ref.
6
- *
7
- * The dashboard server writes into this mirror on every event fold so lib code
8
- * running in the same process can read the latest AgentRuntimeSnapshot.
9
- * CLI/out-of-process callers should prefer the async HTTP path in agent-runtime.ts.
10
- *
11
- * All exports are Effect-native (PAN-1249 wave-1 migration).
12
- */
13
- function markAgentStateServiceInProcess() {
14
- return Effect.sync(() => {
15
- inProcessService = true;
16
- });
17
- }
18
- function isAgentStateServiceInProcess() {
19
- return Effect.sync(() => inProcessService);
20
- }
21
- function setAgentRuntimeMirror(next) {
22
- return Effect.sync(() => {
23
- mirror = next;
24
- });
25
- }
26
- function getRuntimeSnapshot(agentId) {
27
- return Effect.sync(() => mirror[agentId] ?? null);
28
- }
29
- var mirror, inProcessService;
30
- var init_agent_runtime_mirror = __esmMin((() => {
31
- mirror = {};
32
- inProcessService = false;
33
- }));
34
- //#endregion
35
- export { setAgentRuntimeMirror as a, markAgentStateServiceInProcess as i, init_agent_runtime_mirror as n, isAgentStateServiceInProcess as r, getRuntimeSnapshot as t };
36
-
37
- //# sourceMappingURL=agent-runtime-mirror-DrWxopNA.js.map
@@ -1,3 +0,0 @@
1
- import { Dn as clearAgentTroubledSync, Fn as init_agent_state, Pn as getAgentStateSync, Tn as clearAgentPausedSync, Xn as setAgentPausedSync } from "./agents-CsOzAmRg.js";
2
- init_agent_state();
3
- export { clearAgentPausedSync, clearAgentTroubledSync, getAgentStateSync, setAgentPausedSync };
@@ -1,3 +0,0 @@
1
- import { $ as warnOnBareNumericIssueIds, $n as writeAgentStateJsonSync, $t as waitForPromptReady, An as getAgentDir, Bn as markAgentRunningState, C as restartAgent, Cn as __testInternals, Ct as deliverAgentPermissionDecision, Dn as clearAgentTroubledSync, E as resumeAgent, En as clearAgentTroubled, Et as setAgentDeliveryMethod, F as getActivity, Gt as getAgentRuntimeBaseCommand, Hn as markAgentTroubled, I as getLatestSessionId, In as isAgentPaused, It as retrieveSpawnTimeMemoryContext, J as dropLegacyAgentStatesMissingRoleAsync, Jn as saveAgentStateSync, Jt as getProviderAuthMode, K as stopAgent, Kn as resetAgentFailureCount, L as getLatestSessionIdSync, Ln as isAgentTroubled, Lt as transitionIssueToInProgress, Mn as getAgentState, Mt as assertWorkspaceStackHealthyForSpawn, Nn as getAgentStateFilePath, Nt as buildAgentLaunchConfig, On as clearYieldForResumeSync, P as appendActivity, Pn as getAgentStateSync, Q as listRunningAgentsSync, Qn as wipeAgentStateDirs, Qt as roleAgentDefinitionPath, R as getSessionId, Rn as isRole, Rt as transitionIssueToInReview, S as recoverAgent, Sn as SESSION_EXITED_BEFORE_KICKOFF, St as deliverAgentMessage, Tn as clearAgentPausedSync, Tt as deliverResumeMessageWithTranscriptConfirmation, U as spawnAgent, Un as recordAgentFailure, Ut as OHMYPI_AGENT_READY_TIMEOUT_SECONDS, Vn as markAgentStoppedState, W as spawnRun, Wn as recordAgentFailureSync, Wt as describeOhmypiSpawnFailure, X as listAgentStates, Xn as setAgentPausedSync, Yn as setAgentPaused, Yt as getRoleRuntimeBaseCommand, Z as listRunningAgents, Zn as setAgentYieldedSync, Zt as injectPiConversationMemory, _n as decideChannelsForWorkAgent, a as replayStandingAgent, b as autoRecoverAgents, bn as writeChannelsBridgeMcpConfig, cn as determineModel, dn as getProviderTmuxFlags, dr as normalizeAgentId, fr as resolveAgentTargetSync, gn as buildDefaultResumeContinueMessage, gr as getAgentRuntimeStateSync, hr as getAgentRuntimeState, i as replayCrashedStandingAgent, j as messageAgent, ln as getProviderEnvForModel, lr as clearReadySignal, mr as waitForReadySignal, n as compactAtTierRunBoundary, o as shouldReplayCompactAtTierRunBoundary, on as buildCavemanExports, pr as waitForAgentIdle, q as stopAgentSync, qn as saveAgentState, r as contextWindowForModel, sn as buildSpawnEnvForModel, t as init_agents, un as getProviderExportsForModel, ur as isQualifiedAgentId, vn as decideSupervisorForWorkAgent, vr as saveAgentRuntimeState, w as buildCompactRecoverySeed, wn as clearAgentPaused, wt as deliverInitialPromptWithRetry, x as detectCrashedAgents, xn as GOVERNOR_SLOT_PAUSE_REASON_PREFIX, yn as dismissDevChannelsDialog, z as saveSessionId } from "./agents-CsOzAmRg.js";
2
- init_agents();
3
- export { GOVERNOR_SLOT_PAUSE_REASON_PREFIX, OHMYPI_AGENT_READY_TIMEOUT_SECONDS, SESSION_EXITED_BEFORE_KICKOFF, __testInternals, appendActivity, assertWorkspaceStackHealthyForSpawn, autoRecoverAgents, buildAgentLaunchConfig, buildCavemanExports, buildCompactRecoverySeed, buildDefaultResumeContinueMessage, buildSpawnEnvForModel, clearAgentPaused, clearAgentPausedSync, clearAgentTroubled, clearAgentTroubledSync, clearReadySignal, clearYieldForResumeSync, compactAtTierRunBoundary, contextWindowForModel, decideChannelsForWorkAgent, decideSupervisorForWorkAgent, deliverAgentMessage, deliverAgentPermissionDecision, deliverInitialPromptWithRetry, deliverResumeMessageWithTranscriptConfirmation, describeOhmypiSpawnFailure, detectCrashedAgents, determineModel, dismissDevChannelsDialog, dropLegacyAgentStatesMissingRoleAsync, getActivity, getAgentDir, getAgentRuntimeBaseCommand, getAgentRuntimeState, getAgentRuntimeStateSync, getAgentState, getAgentStateFilePath, getAgentStateSync, getLatestSessionId, getLatestSessionIdSync, getProviderAuthMode, getProviderEnvForModel, getProviderExportsForModel, getProviderTmuxFlags, getRoleRuntimeBaseCommand, getSessionId, injectPiConversationMemory, isAgentPaused, isAgentTroubled, isQualifiedAgentId, isRole, listAgentStates, listRunningAgents, listRunningAgentsSync, markAgentRunningState, markAgentStoppedState, markAgentTroubled, messageAgent, normalizeAgentId, recordAgentFailure, recordAgentFailureSync, recoverAgent, replayCrashedStandingAgent, replayStandingAgent, resetAgentFailureCount, resolveAgentTargetSync, restartAgent, resumeAgent, retrieveSpawnTimeMemoryContext, roleAgentDefinitionPath, saveAgentRuntimeState, saveAgentState, saveAgentStateSync, saveSessionId, setAgentDeliveryMethod, setAgentPaused, setAgentPausedSync, setAgentYieldedSync, shouldReplayCompactAtTierRunBoundary, spawnAgent, spawnRun, stopAgent, stopAgentSync, transitionIssueToInProgress, transitionIssueToInReview, waitForAgentIdle, waitForPromptReady, waitForReadySignal, warnOnBareNumericIssueIds, wipeAgentStateDirs, writeAgentStateJsonSync, writeChannelsBridgeMcpConfig };
@@ -1,3 +0,0 @@
1
- import { in as init_auto_commit, on as queueBeadsAutoCommit, rn as flushAutoCommits } from "./config-yaml-Dcz-8uit.js";
2
- init_auto_commit();
3
- export { flushAutoCommits, queueBeadsAutoCommit };
@@ -1,390 +0,0 @@
1
- import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Kr as getOverdeckHome, Pn as init_projects, mn as resolveStateReadHomeSync, pn as init_state_read_home, qr as init_paths, xn as findProjectByPathSync } from "./config-yaml-Dcz-8uit.js";
3
- import { dirname, isAbsolute, join, resolve } from "node:path";
4
- import { Data } from "effect";
5
- import "node:fs";
6
- import { mkdir, open, readFile, realpath, unlink } from "node:fs/promises";
7
- import { createHash } from "node:crypto";
8
- import { AsyncLocalStorage } from "node:async_hooks";
9
- //#region ../../lib/beads/home.ts
10
- function resolveCanonicalBeadsHome(workspacePath = process.cwd(), project) {
11
- let resolvedProject = project;
12
- if (resolvedProject === void 0) try {
13
- resolvedProject = findProjectByPathSync(workspacePath);
14
- } catch {
15
- resolvedProject = null;
16
- }
17
- if (!resolvedProject) return null;
18
- const stateHome = resolveStateReadHomeSync(resolvedProject);
19
- return resolve(stateHome.migrated ? stateHome.root : resolvedProject.path, ".beads");
20
- }
21
- var init_home = __esmMin((() => {
22
- init_projects();
23
- init_state_read_home();
24
- }));
25
- //#endregion
26
- //#region ../../lib/bd-process-lock.ts
27
- function isRecord(value) {
28
- return typeof value === "object" && value !== null;
29
- }
30
- function isErrnoException(error) {
31
- return error instanceof Error && "code" in error;
32
- }
33
- function pushString(parts, value) {
34
- if (typeof value === "string" && value.trim().length > 0) parts.push(value);
35
- }
36
- function collectErrorText(error, parts = [], seen = /* @__PURE__ */ new Set()) {
37
- if (error == null || seen.has(error)) return parts.join("\n");
38
- seen.add(error);
39
- if (typeof error === "string") {
40
- pushString(parts, error);
41
- return parts.join("\n");
42
- }
43
- if (!isRecord(error)) return parts.join("\n");
44
- pushString(parts, error.stderr);
45
- pushString(parts, error.message);
46
- pushString(parts, error.stdout);
47
- collectErrorText(error.cause, parts, seen);
48
- return parts.join("\n");
49
- }
50
- function hasTransientErrnoCode(error, seen = /* @__PURE__ */ new Set()) {
51
- if (error == null || seen.has(error)) return false;
52
- seen.add(error);
53
- if (!isRecord(error)) return false;
54
- if (typeof error.code === "string" && TRANSIENT_BD_ERRNO_CODES.has(error.code)) return true;
55
- return hasTransientErrnoCode(error.cause, seen);
56
- }
57
- /**
58
- * Return true only for bd/Dolt lock-contention failures worth retrying.
59
- *
60
- * PAN-1629 reproduction note: the issue was triggered by concurrent `pan start`
61
- * processes whose `bd list --json -l pan-<id> --status all --limit 0` child
62
- * process failed while another process held the embedded Dolt DB lock. A local
63
- * throwaway repo stress run (`.pan/tmp/bd-lock-repro-*`, 2026-06-10) exercised
64
- * concurrent `bd list`/`bd create`; bd 1.0.4 serialized cleanly in that run, so
65
- * this predicate is intentionally limited to the exact embedded-Dolt text
66
- * documented by Beads for this condition (`database is locked`) plus equivalent
67
- * OS lock-acquisition phrases (`resource temporarily unavailable`, `could not
68
- * acquire ... lock`). Successful empty results are exit 0 + `[]`, not errors,
69
- * and must remain non-transient.
70
- */
71
- function isTransientBdError(error) {
72
- if (error == null) return false;
73
- if (isRecord(error) && error.killed === true) return true;
74
- const text = collectErrorText(error);
75
- if (TRANSIENT_BD_LOCK_PATTERNS.some((pattern) => pattern.test(text))) return true;
76
- return hasTransientErrnoCode(error);
77
- }
78
- async function defaultSleep(ms) {
79
- await new Promise((resolveSleep) => setTimeout(resolveSleep, ms));
80
- }
81
- async function realpathIfExists(path) {
82
- try {
83
- return await realpath(path);
84
- } catch (error) {
85
- if (isErrnoException(error) && error.code === "ENOENT") return path;
86
- return path;
87
- }
88
- }
89
- async function resolveSharedBeadsDir(workspacePath = process.cwd()) {
90
- const canonical = resolveCanonicalBeadsHome(workspacePath);
91
- if (canonical) return realpathIfExists(canonical);
92
- const beadsDir = resolve(workspacePath, ".beads");
93
- const redirectPath = join(beadsDir, "redirect");
94
- try {
95
- const target = (await readFile(redirectPath, "utf8")).trim();
96
- if (target.length > 0) return realpathIfExists(isAbsolute(target) ? target : resolve(workspacePath, target));
97
- } catch (error) {
98
- if (!isErrnoException(error) || error.code !== "ENOENT") throw error;
99
- }
100
- const projectRootBeadsDir = resolve(workspacePath, "..", "..", ".beads");
101
- try {
102
- return await realpath(projectRootBeadsDir);
103
- } catch (error) {
104
- if (!isErrnoException(error) || error.code !== "ENOENT") throw error;
105
- }
106
- return realpathIfExists(beadsDir);
107
- }
108
- async function bdProcessLockPath(workspacePath = process.cwd()) {
109
- const sharedBeadsDir = await resolveSharedBeadsDir(workspacePath);
110
- const digest = createHash("sha256").update(sharedBeadsDir).digest("hex").slice(0, 16);
111
- return join(getOverdeckHome(), "locks", `bd-${digest}.lock`);
112
- }
113
- async function readLockFileState(path) {
114
- try {
115
- const parsed = JSON.parse(await readFile(path, "utf8"));
116
- if (typeof parsed.pid !== "number" || !Number.isFinite(parsed.pid) || typeof parsed.ts !== "number" || !Number.isFinite(parsed.ts) || typeof parsed.caller !== "string") return { kind: "invalid" };
117
- return {
118
- kind: "valid",
119
- holder: {
120
- pid: parsed.pid,
121
- ts: parsed.ts,
122
- caller: parsed.caller
123
- }
124
- };
125
- } catch (error) {
126
- if (isErrnoException(error) && error.code === "ENOENT") return { kind: "missing" };
127
- return {
128
- kind: "invalid",
129
- error
130
- };
131
- }
132
- }
133
- async function readHolderFromPath(path) {
134
- const state = await readLockFileState(path);
135
- return state.kind === "valid" ? state.holder : null;
136
- }
137
- function isProcessAlive(pid) {
138
- try {
139
- process.kill(pid, 0);
140
- return true;
141
- } catch (error) {
142
- return isErrnoException(error) && error.code === "EPERM";
143
- }
144
- }
145
- function isStale(holder, now, staleLockMs) {
146
- return now - holder.ts > staleLockMs || !isProcessAlive(holder.pid);
147
- }
148
- async function writeLockFile(path, holder) {
149
- const file = await open(path, "wx", 384);
150
- try {
151
- await file.writeFile(`${JSON.stringify(holder)}\n`, "utf8");
152
- } finally {
153
- await file.close();
154
- }
155
- }
156
- async function unlinkIfExists(path) {
157
- try {
158
- await unlink(path);
159
- } catch (error) {
160
- if (!isErrnoException(error) || error.code !== "ENOENT") throw error;
161
- }
162
- }
163
- function matchesHolder(actual, expected) {
164
- return actual?.pid === expected.pid && actual.ts === expected.ts && actual.caller === expected.caller;
165
- }
166
- function isLockHeldByCurrentExecution(path) {
167
- return bdLockExecution.getStore()?.has(path) === true && heldBdProcessLocks.has(path);
168
- }
169
- async function acquireStaleBreaker(path, caller, options) {
170
- const breakerPath = `${path}.break`;
171
- for (let attempt = 0; attempt < 2; attempt += 1) {
172
- const holder = {
173
- pid: process.pid,
174
- ts: options.now(),
175
- caller: `${caller} stale bd lock breaker`
176
- };
177
- try {
178
- await writeLockFile(breakerPath, holder);
179
- let released = false;
180
- return {
181
- path: breakerPath,
182
- holder,
183
- async release() {
184
- if (released) return;
185
- released = true;
186
- if (matchesHolder(await readHolderFromPath(breakerPath), holder)) await unlinkIfExists(breakerPath);
187
- }
188
- };
189
- } catch (error) {
190
- if (!isErrnoException(error) || error.code !== "EEXIST") throw error;
191
- const existing = await readLockFileState(breakerPath);
192
- if (existing.kind === "invalid") return null;
193
- if (existing.kind === "valid" && !isStale(existing.holder, options.now(), options.staleLockMs)) return null;
194
- await unlinkIfExists(breakerPath);
195
- }
196
- }
197
- return null;
198
- }
199
- async function reclaimStaleLock(path, caller, options) {
200
- const breaker = await acquireStaleBreaker(path, caller, options);
201
- if (!breaker) return false;
202
- try {
203
- const existing = await readLockFileState(path);
204
- if (existing.kind === "invalid") return false;
205
- if (existing.kind === "valid" && !isStale(existing.holder, options.now(), options.staleLockMs)) return false;
206
- await unlinkIfExists(path);
207
- return true;
208
- } finally {
209
- await breaker.release();
210
- }
211
- }
212
- async function acquireBdProcessLock(caller, options = {}) {
213
- const path = options.lockPath ?? await bdProcessLockPath(options.workspacePath);
214
- const staleLockMs = options.staleLockMs ?? DEFAULT_STALE_LOCK_MS;
215
- const acquisitionTimeoutMs = options.acquisitionTimeoutMs ?? DEFAULT_ACQUIRE_TIMEOUT_MS;
216
- const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_ACQUIRE_POLL_MS;
217
- const sleep = options.sleep ?? defaultSleep;
218
- const now = options.now ?? Date.now;
219
- const deadline = now() + acquisitionTimeoutMs;
220
- await mkdir(dirname(path), { recursive: true });
221
- if (isLockHeldByCurrentExecution(path)) {
222
- const held = heldBdProcessLocks.get(path);
223
- held.count += 1;
224
- let released = false;
225
- return {
226
- path,
227
- holder: held.holder,
228
- async release() {
229
- if (released) return;
230
- released = true;
231
- held.count -= 1;
232
- if (held.count === 0) {
233
- heldBdProcessLocks.delete(path);
234
- if (matchesHolder(await readHolderFromPath(path), held.holder)) await unlinkIfExists(path);
235
- }
236
- }
237
- };
238
- }
239
- while (true) {
240
- const holder = {
241
- pid: process.pid,
242
- ts: now(),
243
- caller
244
- };
245
- try {
246
- await writeLockFile(path, holder);
247
- heldBdProcessLocks.set(path, {
248
- holder,
249
- count: 1
250
- });
251
- let released = false;
252
- return {
253
- path,
254
- holder,
255
- async release() {
256
- if (released) return;
257
- released = true;
258
- const current = heldBdProcessLocks.get(path);
259
- if (current) {
260
- current.count -= 1;
261
- if (current.count === 0) {
262
- heldBdProcessLocks.delete(path);
263
- if (matchesHolder(await readHolderFromPath(path), holder)) await unlinkIfExists(path);
264
- }
265
- }
266
- }
267
- };
268
- } catch (error) {
269
- if (!isErrnoException(error) || error.code !== "EEXIST") throw new BdProcessLockError({
270
- operation: "acquireBdProcessLock",
271
- message: error instanceof Error ? error.message : String(error),
272
- path,
273
- caller,
274
- cause: error
275
- });
276
- const existing = await readLockFileState(path);
277
- if (existing.kind === "missing") continue;
278
- if (existing.kind === "valid" && isStale(existing.holder, now(), staleLockMs)) {
279
- if (await reclaimStaleLock(path, caller, {
280
- now,
281
- staleLockMs
282
- })) continue;
283
- }
284
- const remainingMs = deadline - now();
285
- if (remainingMs <= 0) {
286
- if (existing.kind === "invalid") throw new BdProcessLockError({
287
- operation: "acquireBdProcessLock",
288
- message: `Timed out waiting for unreadable bd process lock at ${path}`,
289
- path,
290
- caller
291
- });
292
- throw new BdProcessLockError({
293
- operation: "acquireBdProcessLock",
294
- message: `Timed out waiting for bd process lock held by pid ${existing.holder.pid} (${existing.holder.caller})`,
295
- path,
296
- caller,
297
- holder: existing.holder
298
- });
299
- }
300
- await sleep(Math.min(pollIntervalMs, remainingMs));
301
- }
302
- }
303
- }
304
- async function withBdProcessLock(caller, fn, options = {}) {
305
- const handle = await acquireBdProcessLock(caller, options);
306
- try {
307
- const inherited = bdLockExecution.getStore() ?? /* @__PURE__ */ new Set();
308
- return await bdLockExecution.run(new Set([...inherited, handle.path]), fn);
309
- } finally {
310
- await handle.release();
311
- }
312
- }
313
- function isRetryableBdFailure(error) {
314
- return error instanceof BdProcessLockError || isTransientBdError(error);
315
- }
316
- function retryDelayMs(attempt, options) {
317
- const base = Math.min(options.maxDelayMs, options.initialDelayMs * 2 ** Math.max(0, attempt - 1));
318
- const jitter = Math.floor(base * .2 * options.random());
319
- return Math.min(options.maxDelayMs, base + jitter);
320
- }
321
- async function runBdWithRetry(caller, fn, options = {}) {
322
- const maxAttempts = options.maxAttempts ?? DEFAULT_RETRY_ATTEMPTS;
323
- const initialDelayMs = options.initialDelayMs ?? DEFAULT_RETRY_INITIAL_DELAY_MS;
324
- const maxDelayMs = options.maxDelayMs ?? DEFAULT_RETRY_MAX_DELAY_MS;
325
- const random = options.random ?? Math.random;
326
- const sleep = options.sleep ?? defaultSleep;
327
- let lastError;
328
- for (let attempt = 1; attempt <= maxAttempts; attempt += 1) try {
329
- return await (options.lockAlreadyHeld ? fn() : withBdProcessLock(caller, fn, options));
330
- } catch (error) {
331
- lastError = error;
332
- if (!isRetryableBdFailure(error) || attempt >= maxAttempts) break;
333
- const delayMs = retryDelayMs(attempt, {
334
- initialDelayMs,
335
- maxDelayMs,
336
- random
337
- });
338
- await options.onRetry?.({
339
- attempt,
340
- delayMs,
341
- error
342
- });
343
- await sleep(delayMs);
344
- }
345
- if (isRetryableBdFailure(lastError)) throw new BdTransientFailure({
346
- operation: "runBdWithRetry",
347
- message: `bd operation failed after ${maxAttempts} attempts due to transient lock contention`,
348
- attempts: maxAttempts,
349
- caller,
350
- holder: lastError instanceof BdProcessLockError ? lastError.holder : void 0,
351
- cause: lastError
352
- });
353
- throw lastError;
354
- }
355
- var TRANSIENT_BD_ERRNO_CODES, TRANSIENT_BD_LOCK_PATTERNS, DEFAULT_STALE_LOCK_MS, DEFAULT_ACQUIRE_TIMEOUT_MS, DEFAULT_ACQUIRE_POLL_MS, DEFAULT_RETRY_ATTEMPTS, DEFAULT_RETRY_INITIAL_DELAY_MS, DEFAULT_RETRY_MAX_DELAY_MS, BdProcessLockError, BdTransientFailure, heldBdProcessLocks, bdLockExecution;
356
- var init_bd_process_lock = __esmMin((() => {
357
- init_paths();
358
- init_home();
359
- TRANSIENT_BD_ERRNO_CODES = new Set([
360
- "EAGAIN",
361
- "EBUSY",
362
- "EWOULDBLOCK",
363
- "ETIMEDOUT"
364
- ]);
365
- TRANSIENT_BD_LOCK_PATTERNS = [
366
- /\bdatabase is locked\b/i,
367
- /\block held\b/i,
368
- /\bfile is locked\b/i,
369
- /\bresource temporarily unavailable\b/i,
370
- /\bcould not acquire\b[^\n\r]*\block\b/i,
371
- /\bfailed to acquire\b[^\n\r]*\block\b/i,
372
- /\bunable to acquire\b[^\n\r]*\block\b/i,
373
- /\bcould not obtain\b[^\n\r]*\block\b/i,
374
- /\banother process\b[^\n\r]*\block/i
375
- ];
376
- DEFAULT_STALE_LOCK_MS = 300 * 1e3;
377
- DEFAULT_ACQUIRE_TIMEOUT_MS = 3e4;
378
- DEFAULT_ACQUIRE_POLL_MS = 50;
379
- DEFAULT_RETRY_ATTEMPTS = 3;
380
- DEFAULT_RETRY_INITIAL_DELAY_MS = 100;
381
- DEFAULT_RETRY_MAX_DELAY_MS = 1e3;
382
- BdProcessLockError = class extends Data.TaggedError("BdProcessLockError") {};
383
- BdTransientFailure = class extends Data.TaggedError("BdTransientFailure") {};
384
- heldBdProcessLocks = /* @__PURE__ */ new Map();
385
- bdLockExecution = new AsyncLocalStorage();
386
- }));
387
- //#endregion
388
- export { withBdProcessLock as a, runBdWithRetry as i, init_bd_process_lock as n, init_home as o, resolveSharedBeadsDir as r, resolveCanonicalBeadsHome as s, BdTransientFailure as t };
389
-
390
- //# sourceMappingURL=bd-process-lock-D3S4T4o-.js.map