@overdeck/desktop 0.45.11 → 0.45.12

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 (602) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +6 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-l0DSvFFS.js → acceptance-criteria-1LHgD9vg.js} +2 -2
  4. package/server/{advancing-selfheal-BezNfM3P.js → advancing-selfheal-BqsLWqEM.js} +4 -4
  5. package/server/{agent-gc-BtAzj8QN.js → agent-gc-CUb52n7s.js} +3 -3
  6. package/server/{agent-state-BUANcaA7.js → agent-state-D-moNwhA.js} +1 -1
  7. package/server/{agent-state-service-DmFpIMbP.js → agent-state-service-BaZH7sXJ.js} +1 -1
  8. package/server/{agent-state-service-tXUdp6UF.js → agent-state-service-BzESvLOf.js} +4 -4
  9. package/server/{agents-C7V4odQ6.js → agents-B5LfpLPv.js} +256 -185
  10. package/server/{agents-C-vqmKDi.js → agents-C4kZ8a2r.js} +1 -1
  11. package/server/{archive-planning-B4Qi02bk.js → archive-planning-BbZe-8IK.js} +1 -1
  12. package/server/{archive-planning-zTvWWHG_.js → archive-planning-oX1pj6nY.js} +3 -3
  13. package/server/{artifact-index-jobs-BrByqVkB.js → artifact-index-jobs-DGr6bxev.js} +3 -3
  14. package/server/{auto-commit-DoIPFoEs.js → auto-commit-CGQlb4rV.js} +1 -1
  15. package/server/{backlog-auto-trigger-Cb8PR-5w.js → backlog-auto-trigger-BlJHikOm.js} +2 -2
  16. package/server/{bd-process-lock-CJkoG7hW.js → bd-process-lock-i3CYMS-B.js} +3 -3
  17. package/server/{beads-AmCXEv_E.js → beads-BNU-fb48.js} +1 -1
  18. package/server/{beads-DlZm-vrG.js → beads-DD7fYCl5.js} +4 -4
  19. package/server/{beads-query-BrVNWoSL.js → beads-query-e6oku4P5.js} +2 -2
  20. package/server/{behavior-By-2Wipv.js → behavior-CPf0pbOt.js} +2 -2
  21. package/server/{briefing-freshness-CXhZdnB8.js → briefing-freshness-B2FdLwIv.js} +27 -15
  22. package/server/{checkpoint-manager-CfNpHOp4.js → checkpoint-manager-JryW6MpM.js} +2 -2
  23. package/server/{checkpoint-manager-CPw51H2n.js → checkpoint-manager-eFgaMMu4.js} +1 -1
  24. package/server/checkpoint-worker.js +1 -1
  25. package/server/{checkpoints-BjlBWOA8.js → checkpoints-BK17oicz.js} +1 -1
  26. package/server/{checkpoints-BbfH1EIy.js → checkpoints-qvOqvMuC.js} +2 -2
  27. package/server/{claude-permissions-DrRAs_0F.js → claude-permissions-B6bWGh9d.js} +3 -3
  28. package/server/{claude-settings-overlay-CEWlIFL-.js → claude-settings-overlay-BPdhTPjo.js} +1 -1
  29. package/server/{claude-settings-overlay-BSeS7Ki3.js → claude-settings-overlay-CRyyKKXQ.js} +2 -2
  30. package/server/{cli-BgzbB6h3.js → cli-B75AieAM.js} +9 -9
  31. package/server/cli-Ch_BWJB2.js +3 -0
  32. package/server/{cliproxy-J-_1iIXe.js → cliproxy-CCzwuSNe.js} +2 -2
  33. package/server/{cliproxy-BOcmOK6l.js → cliproxy-DOQf66G9.js} +1 -1
  34. package/server/{close-issue-BWf3pxn4.js → close-issue-_X3MXJyG.js} +4 -4
  35. package/server/{closed-issue-reaper-D7XPq5pY.js → closed-issue-reaper-BsUfBSjM.js} +13 -13
  36. package/server/{closed-issue-reaper-VSTSTROK.js → closed-issue-reaper-CLR7ClsO.js} +1 -1
  37. package/server/{codex-DcInrhok.js → codex-B4KEpX5V.js} +5 -5
  38. package/server/{codex-BUZjrnqH.js → codex-CY-QRuU9.js} +1 -1
  39. package/server/{compact-beads-omhUgj5b.js → compact-beads-cZds2MTr.js} +1 -1
  40. package/server/{compact-beads-RFwdZFPA.js → compact-beads-uEDccC76.js} +3 -3
  41. package/server/{config-oWoKf5jO.js → config-8sjaU6jZ.js} +2 -2
  42. package/server/{config-CzcWQ24p.js → config-DARrpYWA.js} +1 -1
  43. package/server/{config-yaml-DPAieL_G.js → config-yaml-ClpGgrf6.js} +100 -99
  44. package/server/{conflict-gate-FFEvTDVA.js → conflict-gate-BtB_o-Vi.js} +3 -3
  45. package/server/{conflict-gate-DwOslTij.js → conflict-gate-Ds9_2yjd.js} +1 -1
  46. package/server/{context-layers-DxKsseHI.js → context-layers-CRCk1QG7.js} +2 -2
  47. package/server/{context-layers-CTjQwcEQ.js → context-layers-r2ywnQYA.js} +3 -3
  48. package/server/{control-settings-BMqUkXmR.js → control-settings-D1B3u6HP.js} +4 -4
  49. package/server/{conversation-compaction-CL5Ti4j4.js → conversation-compaction-CZRVk4hg.js} +1 -1
  50. package/server/{conversation-compaction-CCqN4hWk.js → conversation-compaction-D86Zo2Ci.js} +9 -9
  51. package/server/{conversation-service-WKl-sw58.js → conversation-service-CkL-6MuG.js} +1 -1
  52. package/server/{conversation-service-DvG8vZSV.js → conversation-service-CuTVU8dV.js} +5 -5
  53. package/server/{conversations-Dcx6LeIh.js → conversations-BmWEluPL.js} +1 -1
  54. package/server/{conversations-DL_BAWVk.js → conversations-DfJKBDwB.js} +5 -5
  55. package/server/{cost-C2CuA66z.js → cost-CCnqa5xK.js} +2 -2
  56. package/server/{cost-DaOG8sUB.js → cost-DAPYN6iA.js} +3 -3
  57. package/server/{cost-sync-8lkDeL9g.js → cost-sync-BDL10Nwu.js} +3 -3
  58. package/server/{dag-jH8ZkewR.js → dag-Dv2r5bVD.js} +3 -3
  59. package/server/dashboard-db-worker.js +6 -6
  60. package/server/{deacon-CGHl90eC.js → deacon-CM0MxbS8.js} +179 -179
  61. package/server/{deacon-DMPh40Im.js → deacon-DYnZH7kC.js} +3 -3
  62. package/server/{deacon-nudge-log-CJGA6aSQ.js → deacon-nudge-log-B-naf89q.js} +2 -2
  63. package/server/{deacon-swarm-aMMJTq6t.js → deacon-swarm-BstYoz8Q.js} +17 -17
  64. package/server/deacon-swarm-CSWGRfzr.js +2 -0
  65. package/server/deacon.js +7 -7
  66. package/server/{devcontainer-renderer-DUJYYRQB.js → devcontainer-renderer-CaYOG9JN.js} +2 -2
  67. package/server/{docker-Q4bphryk.js → docker-DDI1shu3.js} +2 -2
  68. package/server/{ensure-devcontainer-BCB6fHp9.js → ensure-devcontainer-CbSXvN9W.js} +1 -1
  69. package/server/{ensure-devcontainer-XLL0vtgV.js → ensure-devcontainer-DCAg3ksz.js} +3 -3
  70. package/server/{event-store-DTJXZjCl.js → event-store-DCMqyI07.js} +3 -3
  71. package/server/{event-store-DIk9wvnS.js → event-store-DU3HkZlN.js} +1 -1
  72. package/server/{events-DGWZzye2.js → events-BfiosVAn.js} +3 -3
  73. package/server/{events-BlzVUyTx.js → events-DLRxpSuV.js} +1 -1
  74. package/server/{factory-rG4T40su.js → factory-BMtWV9iv.js} +4 -4
  75. package/server/{feature-registry-population-Dwyj9gEM.js → feature-registry-population-DA7bO6Zn.js} +5 -5
  76. package/server/{feature-registry-storage-CnGyNgAq.js → feature-registry-storage-nAY1fbBt.js} +3 -3
  77. package/server/{features-CYY2_Eeh.js → features-DMu7eGmU.js} +2 -2
  78. package/server/{feedback-target-nQSM6ygL.js → feedback-target-B2SEai8-.js} +1 -1
  79. package/server/{feedback-target-dJjFfITP.js → feedback-target-DHqcw3cN.js} +6 -6
  80. package/server/{feedback-writer-thrdxYpK.js → feedback-writer-DMBdS_jL.js} +1 -1
  81. package/server/{feedback-writer-DMaO0XXa.js → feedback-writer-qvm7UON7.js} +4 -4
  82. package/server/{flywheel-Cqf8vu7N.js → flywheel-D2LdPSic.js} +13 -13
  83. package/server/{flywheel-BLoVNtJV.js → flywheel-Dfpx4bIV.js} +11 -11
  84. package/server/{flywheel-PJsbrXNY.js → flywheel-k4FPtCQ_.js} +1 -1
  85. package/server/{flywheel-merge-order-B7BH8mZ3.js → flywheel-merge-order-CB4lbXeJ.js} +6 -6
  86. package/server/{flywheel-merge-order-CCwF60b-.js → flywheel-merge-order-CttTazRY.js} +1 -1
  87. package/server/{forge-BixzckB0.js → forge-CoPFXFyl.js} +3 -3
  88. package/server/forge-IgLR0Ist.js +2 -0
  89. package/server/{from-D4xmArTA.js → from-B0YoJl9-.js} +2 -2
  90. package/server/{fts-db-DPtxOAjp.js → fts-db-DAHW1yA_.js} +2 -2
  91. package/server/{fts-operations-VrGjsT0w.js → fts-operations-DDXDBi0d.js} +3 -3
  92. package/server/{git-utils-D_cax3fD.js → git-utils-B90Zjzfl.js} +2 -2
  93. package/server/{git-utils-RAmTwjFB.js → git-utils-DbfC0zls.js} +1 -1
  94. package/server/{github-app-FMXgo3vK.js → github-app-BecAnXRX.js} +2 -2
  95. package/server/{github-app-B5PDHMyn.js → github-app-C7lftMNj.js} +1 -1
  96. package/server/{github-client-VRiB6N-4.js → github-client-BwtKZtM0.js} +1 -1
  97. package/server/{github-client-yjbXaqpR.js → github-client-D21rCIXk.js} +2 -2
  98. package/server/{github-pr-lookup-t8X8R0c0.js → github-pr-lookup-CzVWuysl.js} +2 -2
  99. package/server/{harness-resolve-B3f9G1Kp.js → harness-resolve-SkRJm4a7.js} +3 -3
  100. package/server/{health-events-DaLX4-0a.js → health-events-BT0aAfeA.js} +2 -2
  101. package/server/{health-events-CD6q47ub.js → health-events-DA_JLpgZ.js} +1 -1
  102. package/server/{hooks-D-cbMUzQ.js → hooks-BQxRXtRb.js} +1 -1
  103. package/server/{hooks-CmHFSj_Z.js → hooks-DxEn2BoY.js} +2 -2
  104. package/server/{idle-stack-reaper-DdnERp3G.js → idle-stack-reaper-C7fJL8jH.js} +1 -1
  105. package/server/{idle-stack-reaper-DBKQ9SKu.js → idle-stack-reaper-DGy7tvC9.js} +2 -2
  106. package/server/{infra-CpKlYZA9.js → infra-DE3C4PMr.js} +22 -4
  107. package/server/{injection-CszhePD2.js → injection-Cc4Qt8LZ.js} +7 -7
  108. package/server/{injection-DKzL2Axk.js → injection-Dt22tGvS.js} +1 -1
  109. package/server/inspect-agent-CYoWAeeB.js +2 -0
  110. package/server/{inspect-agent-CKF5-SJr.js → inspect-agent-DOaCDkCF.js} +9 -9
  111. package/server/{internal-token-CQUx9YLc.js → internal-token-B_1YLWLI.js} +3 -3
  112. package/server/{internal-token-DrGdpLFo.js → internal-token-nobT6FhA.js} +1 -1
  113. package/server/{io-Wy8YpFeP.js → io-A7ZuOBkz.js} +2 -2
  114. package/server/{issue-closed-BO84g03t.js → issue-closed-Da3DeomA.js} +4 -4
  115. package/server/{issue-lifecycle-5LbOcATP.js → issue-lifecycle-543pQX9D.js} +28 -28
  116. package/server/{issue-lifecycle-CjYqQ669.js → issue-lifecycle-Bd9XBJAQ.js} +1 -1
  117. package/server/{issue-service-singleton-B8iu_TKV.js → issue-service-singleton-BC2JLZi7.js} +1 -1
  118. package/server/{issue-service-singleton-CDGt__oQ.js → issue-service-singleton-Brc3t0SV.js} +8 -8
  119. package/server/{issues-ChNcfHta.js → issues-D3kt9UWE.js} +2 -2
  120. package/server/{label-cleanup-bVXCGWBM.js → label-cleanup-w9X_T3AQ.js} +2 -2
  121. package/server/{layers-vdvlpFki.js → layers-Cwe1J-9o.js} +2 -2
  122. package/server/{lifecycle-CEg4sHZH.js → lifecycle-f1GbDK33.js} +6 -6
  123. package/server/{lifecycle-io-DSrv9xGh.js → lifecycle-io-Bqvj0m3i.js} +4 -4
  124. package/server/{lifecycle-io-CdqPkCyk.js → lifecycle-io-D56q8zlO.js} +1 -1
  125. package/server/{linear-client-BxKvL6U8.js → linear-client-Bh4T4S-c.js} +1 -1
  126. package/server/{linear-client-E0HdXtWs.js → linear-client-CfJMTAYd.js} +2 -2
  127. package/server/memory-fts-worker.js +1 -1
  128. package/server/{merge-D3wEbmUJ.js → merge-DRMPa8CQ.js} +1 -1
  129. package/server/{merge-UlAwCk80.js → merge-ZrXFM3jv.js} +3 -3
  130. package/server/{merge-agent-C81xPIGd.js → merge-agent-CHHs5S_0.js} +25 -25
  131. package/server/{merge-agent-7nBiCytp.js → merge-agent-CfohxFWM.js} +1 -1
  132. package/server/{merge-blockers-DwdQNsYD.js → merge-blockers-BMhDpMl_.js} +2 -2
  133. package/server/merge-ops-Czke6UAp.js +2 -0
  134. package/server/{merge-rebase-CH12_ufi.js → merge-rebase-R7MfqpiE.js} +2 -2
  135. package/server/{merge-set-TRxJwR-w.js → merge-set-B3Breacq.js} +3 -3
  136. package/server/{merge-set-rXK3ehnB.js → merge-set-D-iXNP0I.js} +1 -1
  137. package/server/{merge-sync-CaLRt2cB.js → merge-sync-DHWbGtjR.js} +2 -2
  138. package/server/{merge-sync-BKLKu9kz.js → merge-sync-bOOtfeXR.js} +1 -1
  139. package/server/{merge-train-D3qzRccL.js → merge-train-98ptZrPT.js} +3 -3
  140. package/server/{merge-train-deps-Be5ElC_P.js → merge-train-deps-B5FWJTE2.js} +4 -4
  141. package/server/{merge-verification-DA9rvqsE.js → merge-verification-BGiuiXAK.js} +4 -4
  142. package/server/{multipart-parser-DtIEUW2B.js → multipart-parser-D7mzNNDm.js} +2 -2
  143. package/server/node_modules/.package-lock.json +1 -0
  144. package/server/{orphan-proposed-reconciler-Boq_XaRe.js → orphan-proposed-reconciler-BSGCNJ6X.js} +9 -9
  145. package/server/{orphan-proposed-reconciler-C0sPnDq_.js → orphan-proposed-reconciler-CSuxivr9.js} +1 -1
  146. package/server/package-lock.json +2 -0
  147. package/server/package.json +1 -0
  148. package/server/{pan-dir-BgBeeZDX.js → pan-dir-DoPtdHrp.js} +3 -3
  149. package/server/{paths-TE1GOZDr.js → paths-CVDLPxXp.js} +2 -2
  150. package/server/{pipeline-notifier-lwMa--Gz.js → pipeline-notifier-BtYHbBPl.js} +1 -1
  151. package/server/{pipeline-notifier-aX_5EqQO.js → pipeline-notifier-WD2dnOsR.js} +2 -2
  152. package/server/{projects-BNmVxnNt.js → projects-Bqfwuqet.js} +1 -1
  153. package/server/{prompts-CelsUdrx.js → prompts-Cg7e9FPb.js} +2 -2
  154. package/server/{providers-BOnRq5XK.js → providers-JjK6izqX.js} +1 -1
  155. package/server/{providers-4-xOzHQu.js → providers-fLduChnX.js} +7 -7
  156. package/server/public/assets/{chunk-BO2N2NFS-BjULspib.js → chunk-BO2N2NFS-aNlsGDCu.js} +4 -4
  157. package/server/public/assets/{diagram-OG6HWLK6-4ER5ovy_.js → diagram-OG6HWLK6-CnjkrvT8.js} +1 -1
  158. package/server/public/assets/{dist-CBUe_1pC.js → dist-Bg3Sbsx4.js} +3 -3
  159. package/server/public/assets/{dist-DVM-OI65.js → dist-CGKBCieA.js} +1 -1
  160. package/server/public/assets/{ganttDiagram-6RSMTGT7-DQ3nocJU.js → ganttDiagram-6RSMTGT7-C8LLKj23.js} +1 -1
  161. package/server/public/assets/{highlighted-body-OFNGDK62-BcLOHe75.js → highlighted-body-OFNGDK62-BSDEUvhW.js} +1 -1
  162. package/server/public/assets/{index-B-m-cSFg.css → index-CZiADHcL.css} +1 -1
  163. package/server/public/assets/index-LQIfhmgI.js +796 -0
  164. package/server/public/assets/{linear-Acq5WFAt.js → linear-DEbYZoxg.js} +1 -1
  165. package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +1 -0
  166. package/server/public/assets/{pieDiagram-4H26LBE5-BEmjmqLh.js → pieDiagram-4H26LBE5-BtZL5pXE.js} +1 -1
  167. package/server/public/assets/{prod-D-3YYika.js → prod-DYVvIyuh.js} +4 -4
  168. package/server/public/assets/{quadrantDiagram-W4KKPZXB-DyeZ0jBC.js → quadrantDiagram-W4KKPZXB-a7vS8Jc8.js} +1 -1
  169. package/server/public/assets/{sankeyDiagram-5OEKKPKP-DSD--Pbl.js → sankeyDiagram-5OEKKPKP-Ckbq2SWH.js} +1 -1
  170. package/server/public/assets/{xychartDiagram-2RQKCTM6-idS7x7Bb.js → xychartDiagram-2RQKCTM6-DJyeNa99.js} +1 -1
  171. package/server/public/index.html +2 -2
  172. package/server/{pull-requests-CH4iBFLl.js → pull-requests-1WXmTBlo.js} +3 -3
  173. package/server/{pull-requests-DL_4klIb.js → pull-requests-D2SjJIwY.js} +1 -1
  174. package/server/{rally-D0mKv2t8.js → rally-8aQlLLVj.js} +3 -3
  175. package/server/rally-Ba9QoNYc.js +3 -0
  176. package/server/{rally-api-CcCdecF-.js → rally-api-BtvwdX6d.js} +1 -1
  177. package/server/{rally-api-DgAt6FbN.js → rally-api-H5I2CBO0.js} +2 -2
  178. package/server/{rally-client-DYjtgTOu.js → rally-client-33CYZYYu.js} +4 -4
  179. package/server/{rally-client-X0bEEN2B.js → rally-client-Bt-qHiOh.js} +1 -1
  180. package/server/{rebuild-stack-ByFCMqTK.js → rebuild-stack-CXSgAGPR.js} +1 -1
  181. package/server/{rebuild-stack-BLG3rlWa.js → rebuild-stack-KHkkrGjx.js} +6 -6
  182. package/server/{reconstruct-cache-C2pCltOq.js → reconstruct-cache-D_Ml65_6.js} +7 -7
  183. package/server/{record-DjPikotp.js → record-De2syxNB.js} +1 -1
  184. package/server/{remote-TN0cV8k-.js → remote-CGuognN3.js} +3 -3
  185. package/server/{remote-B1Trmr0N.js → remote-D0Old0Cv.js} +3 -3
  186. package/server/{remote-agents-CmbIKw7E.js → remote-agents-DfhMq6kQ.js} +5 -5
  187. package/server/{remote-agents-DNuaAgU6.js → remote-agents-UHoi4oGr.js} +1 -1
  188. package/server/{remote-completion-BmxD5UMQ.js → remote-completion-RZYePR_0.js} +12 -12
  189. package/server/resume-CmxF3Kjz.js +3 -0
  190. package/server/{review-agent-D6P6d3pz.js → review-agent-sZBCpEVv.js} +22 -22
  191. package/server/{review-agent-DTINEffB.js → review-agent-uwVftH98.js} +1 -1
  192. package/server/{review-artifacts-BGc69epg.js → review-artifacts-C7a45b1_.js} +7 -7
  193. package/server/{review-context-Dyo0tsBa.js → review-context-CErbQpKL.js} +7 -7
  194. package/server/{review-monitor-BKG2ubt5.js → review-monitor-DHD9m_kh.js} +2 -2
  195. package/server/{review-status-h7BXIA4z.js → review-status-JhQ3qlDS.js} +1 -1
  196. package/server/{review-status-enrichment-CGlcApSn.js → review-status-enrichment-qWvWckYN.js} +3 -3
  197. package/server/{review-status-B5ZASOo4.js → review-status-gPndPUBc.js} +53 -30
  198. package/server/{review-status-sync-BxHBVH8s.js → review-status-sync-B_GrEke8.js} +1 -1
  199. package/server/{review-status-sync-BWHnrq-k.js → review-status-sync-D3A9KX95.js} +2 -2
  200. package/server/{review-verdict-feedback-B70VbfRL.js → review-verdict-feedback-4WZ5ZdbC.js} +7 -7
  201. package/server/{review-verdict-feedback-CorgH49f.js → review-verdict-feedback-Zo0r_z4m.js} +1 -1
  202. package/server/{rollup-DBNy1yFB.js → rollup-Bmhn80tB.js} +1 -1
  203. package/server/{rollup-BJE-Vc7H.js → rollup-BrUIKMv_.js} +7 -7
  204. package/server/{scanner-CUGpdp4i.js → scanner-BIGumel_.js} +7 -7
  205. package/server/{sequence-io-6YP8fVpH.js → sequence-io-DA0akEQN.js} +5 -5
  206. package/server/{sequencer-agent-ja-nkEc1.js → sequencer-agent-DeflKafB.js} +6 -6
  207. package/server/server.js +561 -548
  208. package/server/{service-HKDrIy0h.js → service-V0sUK-OR.js} +64 -64
  209. package/server/{session-fork-DDSDVoIK.js → session-fork-Yx3UcAQf.js} +2 -2
  210. package/server/{settings-CBrei_kx.js → settings-CFEeQRj2.js} +2 -2
  211. package/server/{settings-D2wt4nku.js → settings-CxVate0h.js} +3 -3
  212. package/server/settings-DEhYpW0k.js +2 -0
  213. package/server/{shadow-engineering-Ba1D0QUN.js → shadow-engineering-BRxnVSDk.js} +2 -2
  214. package/server/{shadow-state-BOaq8BrD.js → shadow-state-1aS8FijU.js} +1 -1
  215. package/server/{shadow-state-DTC7AMHc.js → shadow-state-BiMwdyl1.js} +2 -2
  216. package/server/{smart-compaction-uke1npUz.js → smart-compaction-Bw1K_Sbl.js} +7 -7
  217. package/server/{smart-compaction-L0LSnF0_.js → smart-compaction-xblMyVpT.js} +1 -1
  218. package/server/{spawn-planning-session-CSMWco8B.js → spawn-planning-session-CzDFSKAQ.js} +1 -1
  219. package/server/{spawn-planning-session-CXc0NkwV.js → spawn-planning-session-DxLxcM7m.js} +15 -15
  220. package/server/{specialist-context-BGCJ24LH.js → specialist-context-BfkTA81h.js} +5 -5
  221. package/server/{specialist-handoff-logger-B_2VsWli.js → specialist-handoff-logger-BiKuLtNm.js} +2 -2
  222. package/server/{specialist-logs--Uz-r8ia.js → specialist-logs-CFJjGsLC.js} +3 -3
  223. package/server/{specialists-DEfrAbWs.js → specialists-B4byf18k.js} +156 -156
  224. package/server/{specialists-Ca9XSBCS.js → specialists-BLIreoE7.js} +1 -1
  225. package/server/{specialists-DeZx9xom.js → specialists-DdvpFNt1.js} +1 -1
  226. package/server/{specialists-nZ0mRwpZ.js → specialists-DjHbwQ_p.js} +18 -18
  227. package/server/specs-CVH1kvz3.js +3 -0
  228. package/server/{src-Dp0WHgDZ.js → src-CALBEUMX.js} +3 -3
  229. package/server/{src-BswtmojL.js → src-mK_M_ZIj.js} +3 -3
  230. package/server/{stack-health-Deel1mSW.js → stack-health-BFM8YlHw.js} +1 -1
  231. package/server/{stack-health-BJVh1TCg.js → stack-health-Qd7rPiVe.js} +3 -3
  232. package/server/{state-home-Bgj7i-C7.js → state-home-C2Bicw9N.js} +6 -6
  233. package/server/{summary-fork-Xn0QUNmb.js → summary-fork-DezPkJSm.js} +16 -16
  234. package/server/{summary-fork-2a1L2DIU.js → summary-fork-EWWBvzgE.js} +2 -2
  235. package/server/supervisor/chunk-ruWRV7i3.js +30 -0
  236. package/server/supervisor/paths-3R6b989k.js +224 -0
  237. package/server/supervisor/pty-supervisor.js +391 -0
  238. package/server/supervisor/pty-token-CScQ32Rj.js +43 -0
  239. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/LICENSE +69 -0
  240. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/README.md +67 -0
  241. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/binding.gyp +123 -0
  242. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/.editorconfig +2 -0
  243. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/.drone.yml +17 -0
  244. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/.gitattributes +19 -0
  245. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/LICENSE +21 -0
  246. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/Makefile +166 -0
  247. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/README.md +151 -0
  248. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/RELEASES.md +280 -0
  249. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/VERSION.txt +1 -0
  250. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/configure +167 -0
  251. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/BufferResizeTests.cc +90 -0
  252. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
  253. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ClearConsole.cc +72 -0
  254. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ConinMode.cc +117 -0
  255. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ConinMode.ps1 +116 -0
  256. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ConoutMode.cc +113 -0
  257. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/DebugClient.py +42 -0
  258. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/DebugServer.py +63 -0
  259. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/DumpLines.py +5 -0
  260. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
  261. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
  262. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
  263. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
  264. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
  265. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
  266. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
  267. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
  268. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
  269. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
  270. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/FontSurvey.cc +100 -0
  271. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/FormatChar.h +21 -0
  272. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/FreezePerfTest.cc +62 -0
  273. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/GetCh.cc +20 -0
  274. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/GetConsolePos.cc +41 -0
  275. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/GetFont.cc +261 -0
  276. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
  277. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/IsNewConsole.cc +87 -0
  278. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/MouseInputNotes.txt +90 -0
  279. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
  280. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Notes.txt +219 -0
  281. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/OSVersion.cc +27 -0
  282. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
  283. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ScreenBufferTest.cc +671 -0
  284. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
  285. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SelectAllTest.cc +45 -0
  286. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SetBufferSize.cc +32 -0
  287. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SetCursorPos.cc +10 -0
  288. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SetFont.cc +145 -0
  289. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SetWindowRect.cc +36 -0
  290. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ShowArgv.cc +12 -0
  291. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ShowConsoleInput.cc +40 -0
  292. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Spew.py +5 -0
  293. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/TestUtil.cc +172 -0
  294. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
  295. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
  296. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
  297. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/UnixEcho.cc +89 -0
  298. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Utf16Echo.cc +46 -0
  299. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/VeryLargeRead.cc +122 -0
  300. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/VkEscapeTest.cc +56 -0
  301. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
  302. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win10WrapTest1.cc +57 -0
  303. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win10WrapTest2.cc +30 -0
  304. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Echo1.cc +26 -0
  305. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Echo2.cc +19 -0
  306. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Test1.cc +46 -0
  307. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Test2.cc +70 -0
  308. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Test3.cc +78 -0
  309. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Write1.cc +44 -0
  310. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
  311. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/WriteConsole.cc +106 -0
  312. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/build32.sh +9 -0
  313. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/build64.sh +9 -0
  314. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/color-test.sh +212 -0
  315. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/font-notes.txt +300 -0
  316. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/winbug-15048.cc +201 -0
  317. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
  318. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/ship/common_ship.py +53 -0
  319. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/ship/make_msvc_package.py +165 -0
  320. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/ship/ship.py +108 -0
  321. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Agent.cc +613 -0
  322. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Agent.h +103 -0
  323. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
  324. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
  325. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleFont.cc +632 -0
  326. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleFont.h +28 -0
  327. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleInput.cc +852 -0
  328. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleInput.h +109 -0
  329. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
  330. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
  331. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleLine.cc +152 -0
  332. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleLine.h +41 -0
  333. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Coord.h +87 -0
  334. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DebugShowInput.cc +239 -0
  335. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DebugShowInput.h +32 -0
  336. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
  337. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DefaultInputMap.h +28 -0
  338. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DsrSender.h +30 -0
  339. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/EventLoop.cc +99 -0
  340. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/EventLoop.h +47 -0
  341. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/InputMap.cc +246 -0
  342. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/InputMap.h +114 -0
  343. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
  344. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
  345. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/NamedPipe.cc +378 -0
  346. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/NamedPipe.h +125 -0
  347. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Scraper.cc +699 -0
  348. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Scraper.h +103 -0
  349. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/SimplePool.h +75 -0
  350. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/SmallRect.h +143 -0
  351. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Terminal.cc +535 -0
  352. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Terminal.h +69 -0
  353. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
  354. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
  355. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Win32Console.cc +107 -0
  356. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Win32Console.h +67 -0
  357. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
  358. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
  359. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/main.cc +114 -0
  360. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/subdir.mk +61 -0
  361. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/configurations.gypi +60 -0
  362. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/debugserver/DebugServer.cc +117 -0
  363. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/debugserver/subdir.mk +41 -0
  364. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/include/winpty.h +242 -0
  365. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/include/winpty_constants.h +131 -0
  366. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
  367. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
  368. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
  369. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
  370. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/subdir.mk +46 -0
  371. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/winpty.cc +970 -0
  372. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/AgentMsg.h +38 -0
  373. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
  374. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
  375. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/Buffer.cc +103 -0
  376. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/Buffer.h +102 -0
  377. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/DebugClient.cc +187 -0
  378. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/DebugClient.h +38 -0
  379. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/GenRandom.cc +138 -0
  380. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/GenRandom.h +55 -0
  381. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/GetCommitHash.bat +13 -0
  382. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/Mutex.h +54 -0
  383. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/OsModule.h +63 -0
  384. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/OwnedHandle.cc +36 -0
  385. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/OwnedHandle.h +45 -0
  386. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
  387. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/StringBuilder.h +227 -0
  388. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
  389. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/StringUtil.cc +55 -0
  390. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/StringUtil.h +80 -0
  391. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/TimeMeasurement.h +63 -0
  392. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
  393. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
  394. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
  395. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WindowsSecurity.h +104 -0
  396. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WindowsVersion.cc +252 -0
  397. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WindowsVersion.h +29 -0
  398. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyAssert.cc +55 -0
  399. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyAssert.h +64 -0
  400. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyException.cc +57 -0
  401. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyException.h +43 -0
  402. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyVersion.cc +42 -0
  403. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyVersion.h +27 -0
  404. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/winpty_snprintf.h +99 -0
  405. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/subdir.mk +5 -0
  406. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/tests/subdir.mk +28 -0
  407. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/tests/trivial_test.cc +158 -0
  408. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
  409. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
  410. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
  411. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
  412. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/Util.cc +86 -0
  413. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/Util.h +31 -0
  414. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
  415. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
  416. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/main.cc +729 -0
  417. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/subdir.mk +41 -0
  418. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/winpty.gyp +235 -0
  419. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/vcbuild.bat +83 -0
  420. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/conpty_console_list_agent.js +20 -0
  421. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/conpty_console_list_agent.js.map +1 -0
  422. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/eventEmitter2.js +47 -0
  423. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/eventEmitter2.js.map +1 -0
  424. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/eventEmitter2.test.js +30 -0
  425. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/eventEmitter2.test.js.map +1 -0
  426. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/index.js +52 -0
  427. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/index.js.map +1 -0
  428. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/interfaces.js +7 -0
  429. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/interfaces.js.map +1 -0
  430. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-file-path.js +18 -0
  431. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-file-path.js.map +1 -0
  432. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-loader.js +19 -0
  433. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-loader.js.map +1 -0
  434. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/shared/conout.js +11 -0
  435. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/shared/conout.js.map +1 -0
  436. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/terminal.js +190 -0
  437. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/terminal.js.map +1 -0
  438. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/terminal.test.js +139 -0
  439. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/terminal.test.js.map +1 -0
  440. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/testUtils.test.js +28 -0
  441. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/testUtils.test.js.map +1 -0
  442. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/types.js +7 -0
  443. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/types.js.map +1 -0
  444. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.js +290 -0
  445. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.js.map +1 -0
  446. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.test.js +352 -0
  447. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.test.js.map +1 -0
  448. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/utils.js +17 -0
  449. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/utils.js.map +1 -0
  450. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsConoutConnection.js +125 -0
  451. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsConoutConnection.js.map +1 -0
  452. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.js +345 -0
  453. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.js.map +1 -0
  454. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.test.js +90 -0
  455. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.test.js.map +1 -0
  456. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsTerminal.js +201 -0
  457. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsTerminal.js.map +1 -0
  458. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsTerminal.test.js +217 -0
  459. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsTerminal.test.js.map +1 -0
  460. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/worker/conoutSocketWorker.js +22 -0
  461. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/worker/conoutSocketWorker.js.map +1 -0
  462. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/package.json +79 -0
  463. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi102.musl.node +0 -0
  464. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi102.node +0 -0
  465. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi108.musl.node +0 -0
  466. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi108.node +0 -0
  467. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi111.musl.node +0 -0
  468. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi111.node +0 -0
  469. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi115.musl.node +0 -0
  470. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi115.node +0 -0
  471. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi120.musl.node +0 -0
  472. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi120.node +0 -0
  473. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi127.musl.node +0 -0
  474. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi127.node +0 -0
  475. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi131.musl.node +0 -0
  476. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi131.node +0 -0
  477. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi137.musl.node +0 -0
  478. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi137.node +0 -0
  479. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi102.musl.node +0 -0
  480. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi108.musl.node +0 -0
  481. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi108.node +0 -0
  482. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi111.musl.node +0 -0
  483. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi111.node +0 -0
  484. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi115.musl.node +0 -0
  485. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi115.node +0 -0
  486. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi120.musl.node +0 -0
  487. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi120.node +0 -0
  488. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi127.musl.node +0 -0
  489. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi127.node +0 -0
  490. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi131.musl.node +0 -0
  491. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi131.node +0 -0
  492. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi137.musl.node +0 -0
  493. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi137.node +0 -0
  494. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi108.node +0 -0
  495. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi111.node +0 -0
  496. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi115.node +0 -0
  497. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi120.node +0 -0
  498. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi127.node +0 -0
  499. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi131.node +0 -0
  500. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi137.node +0 -0
  501. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi102.musl.node +0 -0
  502. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi108.musl.node +0 -0
  503. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi108.node +0 -0
  504. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi111.musl.node +0 -0
  505. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi111.node +0 -0
  506. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi115.musl.node +0 -0
  507. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi115.node +0 -0
  508. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi120.musl.node +0 -0
  509. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi120.node +0 -0
  510. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi127.musl.node +0 -0
  511. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi127.node +0 -0
  512. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi131.musl.node +0 -0
  513. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi131.node +0 -0
  514. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi137.musl.node +0 -0
  515. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi137.node +0 -0
  516. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/scripts/check-prebuild.js +15 -0
  517. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/scripts/increment-version.js +54 -0
  518. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/scripts/install.js +18 -0
  519. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/scripts/post-install.js +83 -0
  520. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/conpty_console_list_agent.ts +19 -0
  521. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/eventEmitter2.test.ts +30 -0
  522. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/eventEmitter2.ts +48 -0
  523. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/index.ts +53 -0
  524. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/interfaces.ts +130 -0
  525. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/native.d.ts +54 -0
  526. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/prebuild-file-path.ts +21 -0
  527. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/prebuild-loader.ts +17 -0
  528. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/shared/conout.ts +15 -0
  529. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/terminal.test.ts +119 -0
  530. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/terminal.ts +211 -0
  531. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/testUtils.test.ts +23 -0
  532. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/tsconfig.json +22 -0
  533. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/types.ts +15 -0
  534. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/unix/pty.cc +796 -0
  535. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/unix/spawn-helper.cc +23 -0
  536. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/unixTerminal.test.ts +368 -0
  537. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/unixTerminal.ts +318 -0
  538. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/utils.ts +9 -0
  539. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/conpty.cc +583 -0
  540. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/conpty.h +41 -0
  541. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/conpty_console_list.cc +44 -0
  542. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/path_util.cc +95 -0
  543. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/path_util.h +26 -0
  544. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/winpty.cc +333 -0
  545. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsConoutConnection.ts +82 -0
  546. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsPtyAgent.test.ts +94 -0
  547. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsPtyAgent.ts +342 -0
  548. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsTerminal.test.ts +227 -0
  549. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsTerminal.ts +208 -0
  550. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/worker/conoutSocketWorker.ts +22 -0
  551. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/third_party/conpty/1.22.250204002/win10-arm64/OpenConsole.exe +0 -0
  552. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/third_party/conpty/1.22.250204002/win10-arm64/conpty.dll +0 -0
  553. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/third_party/conpty/1.22.250204002/win10-x64/OpenConsole.exe +0 -0
  554. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/third_party/conpty/1.22.250204002/win10-x64/conpty.dll +0 -0
  555. package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/typings/node-pty.d.ts +230 -0
  556. package/server/{supervisor-0oXvLwyC.js → supervisor-D5GC5jUM.js} +8 -8
  557. package/server/supervisor-DQMK2e3I.js +2 -0
  558. package/server/{swarm-readiness-OBgamRql.js → swarm-readiness-Cf9mommA.js} +3 -3
  559. package/server/system-prerequisites-BsI9hxh9.js +166 -0
  560. package/server/{teardown-workspace-DhA6oAIK.js → teardown-workspace-CWz1pbEK.js} +12 -12
  561. package/server/{test-agent-queue-B_ukPyIK.js → test-agent-queue-TiVXe3ZT.js} +6 -6
  562. package/server/{test-verdict-D3Il7cBK.js → test-verdict-Bm4uv_AA.js} +2 -2
  563. package/server/{test-verdict-BkubHtti.js → test-verdict-CCDd25uN.js} +1 -1
  564. package/server/{tldr-daemon-CJqGsDFh.js → tldr-daemon-Big5IZ_M.js} +1 -1
  565. package/server/{tldr-daemon-CJW_P4On.js → tldr-daemon-C_1frSDj.js} +2 -2
  566. package/server/{tmux-ePNhMIMU.js → tmux-D57f-XNv.js} +2 -2
  567. package/server/{tmux-CeDD14p1.js → tmux-DClqWwb8.js} +1 -1
  568. package/server/{tracker-config-Drt_tx4D.js → tracker-config-B_Ubts1Z.js} +1 -1
  569. package/server/{tracker-config-C3hiPVAM.js → tracker-config-BmdJU_w6.js} +2 -2
  570. package/server/{tracker-utils-D6B8scEw.js → tracker-utils-Bg-Sevcv.js} +1 -1
  571. package/server/{tracker-utils-bpWs7Xyx.js → tracker-utils-CWFt6jjV.js} +2 -2
  572. package/server/{tunnel-3Ve8BS4H.js → tunnel-UBf2vyAL.js} +2 -2
  573. package/server/{tunnel-AporWhoi.js → tunnel-hOBNQbmF.js} +1 -1
  574. package/server/{uat-train-DPfGR9_I.js → uat-train-DGkIkLxu.js} +1 -1
  575. package/server/{uat-train-BLBAbJ8Y.js → uat-train-qNanv5hN.js} +54 -54
  576. package/server/{validation-CbqP_dze.js → validation-B0QaLIHP.js} +1 -1
  577. package/server/{validation-BmUB-26g.js → validation-C4wegCvH.js} +3 -3
  578. package/server/{verification-runner-R2-4XgMO.js → verification-runner-CntudBes.js} +11 -11
  579. package/server/{verification-runner-KTGTNugM.js → verification-runner-DdleMNLq.js} +1 -1
  580. package/server/{work-agent-prompt-DCdHsm-V.js → work-agent-prompt-CG5jFV9A.js} +11 -11
  581. package/server/{workflows-CSKX5MhC.js → workflows-BK2xs_a8.js} +13 -13
  582. package/server/workflows-pKw9yRSV.js +2 -0
  583. package/server/{workspace-DYv9kBg6.js → workspace-C9lC5o3E.js} +1 -1
  584. package/server/{workspace-4ZufqeMe.js → workspace-CLrSIRCx.js} +3 -3
  585. package/server/{workspace-manager-CEWK-OXd.js → workspace-manager-BJhW2sky.js} +10 -10
  586. package/server/{workspace-manager-B3PqQQSM.js → workspace-manager-Cb2a7bg9.js} +1 -1
  587. package/server/{workspace-metadata-C0I-nIDL.js → workspace-metadata-CTRnr323.js} +1 -1
  588. package/server/{workspace-metadata-1eu1RvAT.js → workspace-metadata-QQmo_Z0l.js} +2 -2
  589. package/server/{workspaces-DXLDgXo2.js → workspaces-Ca4zZs12.js} +223 -223
  590. package/server/cli-DCqy_wFa.js +0 -3
  591. package/server/deacon-swarm-CVTiNL0N.js +0 -2
  592. package/server/forge-BfP7OJwK.js +0 -2
  593. package/server/inspect-agent-CqpEWGWy.js +0 -2
  594. package/server/merge-ops-DE_6CnmZ.js +0 -2
  595. package/server/public/assets/index-DdqPXf3T.js +0 -796
  596. package/server/public/assets/mermaid-GHXKKRXX-BTHbMU88.js +0 -1
  597. package/server/rally-DffLLIdl.js +0 -3
  598. package/server/resume-C-nxu9Y4.js +0 -3
  599. package/server/settings-vLoKyghx.js +0 -2
  600. package/server/specs-DeS98l_p.js +0 -3
  601. package/server/supervisor-D1-XwmZ7.js +0 -2
  602. package/server/workflows-DVwXauef.js +0 -2
package/server/server.js CHANGED
@@ -1,104 +1,104 @@
1
1
  import { a as __toCommonJS, i as __require, o as __toESM, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { $n as extractPrefixSync, Br as getOverdeckHome, C as resolveTieredExecutionEnabled, Dn as getProjectSync, Dr as LOGS_DIR, E as canUseHarnessSync, Et as getIssueWorkspacePath, F as getKimiAnthropicBaseUrl, Fr as SYNC_SOURCES, G as init_registry, Gn as resolveProjectFromIssueSync, Gr as sessionFilePath, Hn as registerProjectSync, Hr as isDevMode, In as listProjects, J as computeModelOrigin, K as DEFAULT_ROLES, L as getProviderForModelSync, Ln as listProjectsSync, Lr as encodeClaudeProjectDir, M as UnknownModelError, Nn as init_projects, O as init_harness_policy, Or as OVERDECK_HOME, Ot as init_record, P as getBuiltInDefaultHarness, Q as MODEL_DEPRECATIONS, R as init_providers, S as init_tier_table, Sn as findProjectByTeamSync, T as validateTieredExecutionConfig, Ur as packageRoot, Vr as init_paths, W as defaultBackgroundAiFeatures, Wn as resolveProjectFromIssue, Wr as resolveOhmypiExtensionPath, X as resolveModel, Yn as setProjectAutoMergeDefaultSync, Z as MODEL_CAPABILITIES, _ as getDefaultTtsDaemonConfig, bn as findProjectByPathSync, c as isClaudeCodeChannelsEnabled, cr as FsError, ct as COMPLIANCE_MODES, d as loadConfigNoMigration, er as init_issue_id, et as getModelEffortLevelsSync, f as loadConfigSync, g as mergeConfigs, gr as TrackerError, h as jsYaml, i as getConversationsConfig, ir as require_dist$1, it as resolveModelIdSync, lt as PARENT_MODEL_REF, m as init_js_yaml, mr as ProcessSpawnError, n as clearConfigCache, nn as flushAutoCommits, nr as parseIssueIdSync, nt as init_model_capabilities, o as getGlobalConfigPath, p as updateConversationsConfig, q as DEFAULT_WORKHORSES, r as getConversationSearchConfigSync, rn as init_auto_commit, rt as modelSupportsImagesSync, t as init_config_yaml, tn as flushAllPendingAutoCommits, tt as hasModelCapabilitySync, u as isTldrEnabledSync, ur as GitHubApiError, ut as ROLE_EFFORTS, v as mergeTtsDaemonConfigs, vn as extractTeamPrefix, vr as init_errors, wn as getIssuePrefix, wr as CLAUDE_DIR, x as TieredExecutionConfigError, yr as AGENTS_DIR, z as piProviderForModel, zr as getLegacyHome } from "./config-yaml-DPAieL_G.js";
3
- import { _ as getDashboardIdentity, c as startUatTrainReconciler, d as openFlywheelRunReportForDashboard, f as pauseFlywheelRunForDashboard, g as runDashboardDbJob, h as startFlywheelRunForDashboard, l as stopUatTrainReconciler, m as resumeFlywheelRunForDashboard, p as readCurrentFlywheelStatusForDashboard, u as abortFlywheelRunForDashboard, v as readHostDashboardApiPort, y as shouldRefuseHostDashboardPort } from "./uat-train-BLBAbJ8Y.js";
4
- import { C as validateOrigin$1, D as jsonResponse, E as httpHandler, O as jsonStringResponse, T as checkCodexAuthStatus, _ as resolveJsonlPath, a as agentsRouteLayer, c as evaluateSpawnGuardrails, d as resolveConversationGitInfo, g as resolveCodexRolloutPath, h as resolveClaudeSessionId, l as invalidateAgentsCache, m as resolveAgentHarness, o as saveAgentStateAndEmitEvent, p as readLauncherPinnedSessionId, s as saveAgentStateAndEmitEventProgram, t as specialistsRouteLayer, u as resolveAgentGitInfo, v as resolvePiSessionPath, w as validateOriginHeaders, x as isTrustedOriginForHost, y as getHeaderFromMap } from "./specialists-DEfrAbWs.js";
2
+ import { $n as extractPrefixSync, Br as getOverdeckHome, C as resolveTieredExecutionEnabled, Dn as getProjectSync, Dr as LOGS_DIR, E as canUseHarnessSync, Et as getIssueWorkspacePath, F as getKimiAnthropicBaseUrl, Fr as SYNC_SOURCES, G as init_registry, Gn as resolveProjectFromIssueSync, Gr as sessionFilePath, Hn as registerProjectSync, Hr as isDevMode, In as listProjects, J as computeModelOrigin, K as DEFAULT_ROLES, L as getProviderForModelSync, Ln as listProjectsSync, Lr as encodeClaudeProjectDir, M as UnknownModelError, Nn as init_projects, O as init_harness_policy, Or as OVERDECK_HOME, Ot as init_record, P as getBuiltInDefaultHarness, Q as MODEL_DEPRECATIONS, R as init_providers, S as init_tier_table, Sn as findProjectByTeamSync, T as validateTieredExecutionConfig, Ur as packageRoot, Vr as init_paths, W as defaultBackgroundAiFeatures, Wn as resolveProjectFromIssue, Wr as resolveOhmypiExtensionPath, X as resolveModel, Yn as setProjectAutoMergeDefaultSync, Z as MODEL_CAPABILITIES, _ as getDefaultTtsDaemonConfig, bn as findProjectByPathSync, c as isClaudeCodeChannelsEnabled, cr as FsError, ct as COMPLIANCE_MODES, d as loadConfigNoMigration, er as init_issue_id, et as getModelEffortLevelsSync, f as loadConfigSync, g as mergeConfigs, gr as TrackerError, h as jsYaml, i as getConversationsConfig, ir as require_dist$1, it as resolveModelIdSync, lt as PARENT_MODEL_REF, m as init_js_yaml, mr as ProcessSpawnError, n as clearConfigCache, nn as flushAutoCommits, nr as parseIssueIdSync, nt as init_model_capabilities, o as getGlobalConfigPath, p as updateConversationsConfig, q as DEFAULT_WORKHORSES, r as getConversationSearchConfigSync, rn as init_auto_commit, rt as modelSupportsImagesSync, t as init_config_yaml, tn as flushAllPendingAutoCommits, tt as hasModelCapabilitySync, u as isTldrEnabledSync, ur as GitHubApiError, ut as ROLE_EFFORTS, v as mergeTtsDaemonConfigs, vn as extractTeamPrefix, vr as init_errors, wn as getIssuePrefix, wr as CLAUDE_DIR, x as TieredExecutionConfigError, yr as AGENTS_DIR, z as piProviderForModel, zr as getLegacyHome } from "./config-yaml-ClpGgrf6.js";
3
+ import { _ as getDashboardIdentity, c as startUatTrainReconciler, d as openFlywheelRunReportForDashboard, f as pauseFlywheelRunForDashboard, g as runDashboardDbJob, h as startFlywheelRunForDashboard, l as stopUatTrainReconciler, m as resumeFlywheelRunForDashboard, p as readCurrentFlywheelStatusForDashboard, u as abortFlywheelRunForDashboard, v as readHostDashboardApiPort, y as shouldRefuseHostDashboardPort } from "./uat-train-qNanv5hN.js";
4
+ import { C as validateOrigin$1, D as jsonResponse, E as httpHandler, O as jsonStringResponse, T as checkCodexAuthStatus, _ as resolveJsonlPath, a as agentsRouteLayer, c as evaluateSpawnGuardrails, d as resolveConversationGitInfo, g as resolveCodexRolloutPath, h as resolveClaudeSessionId, l as invalidateAgentsCache, m as resolveAgentHarness, o as saveAgentStateAndEmitEvent, p as readLauncherPinnedSessionId, s as saveAgentStateAndEmitEventProgram, t as specialistsRouteLayer, u as resolveAgentGitInfo, v as resolvePiSessionPath, w as validateOriginHeaders, x as isTrustedOriginForHost, y as getHeaderFromMap } from "./specialists-B4byf18k.js";
5
5
  import { a as init_activity_logger, i as emitDashboardLifecycleSync, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-pcbf-e30.js";
6
- import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, d as getOverdeckDatabaseSync, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-CpKlYZA9.js";
6
+ import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, d as getOverdeckDatabaseSync, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-DE3C4PMr.js";
7
7
  import { n as openDatabase, t as init_driver } from "./driver-D-HBOQa_.js";
8
- import { E as listPaneValues, F as sendKeysAsync, G as buildChildEnvSync, H as init_ui_theme, I as sendRawKeystroke, K as buildChildEnvWithoutTmuxSync, L as sessionExists, M as resizeWindow, O as listSessionNames, P as sendKeys, S as isHarnessProcessAlive, U as setUiTheme, W as BLANKED_PROVIDER_ENV, b as getWindowDimensions, c as ensureManagedTmuxContextOnce, d as exactPaneTarget, i as capturePane, k as listSessions, n as buildTmuxArgs, o as createSession, p as findManagedServerPidSync, q as init_child_env, w as killSession, x as init_tmux, z as setOption } from "./tmux-ePNhMIMU.js";
9
- import { a as init_event_store, i as initEventStore, n as getEventStore, r as getSharedDb } from "./event-store-DTJXZjCl.js";
8
+ import { E as listPaneValues, F as sendKeysAsync, G as buildChildEnvSync, H as init_ui_theme, I as sendRawKeystroke, K as buildChildEnvWithoutTmuxSync, L as sessionExists, M as resizeWindow, O as listSessionNames, P as sendKeys, S as isHarnessProcessAlive, U as setUiTheme, W as BLANKED_PROVIDER_ENV, b as getWindowDimensions, c as ensureManagedTmuxContextOnce, d as exactPaneTarget, i as capturePane, k as listSessions, n as buildTmuxArgs, o as createSession, p as findManagedServerPidSync, q as init_child_env, w as killSession, x as init_tmux, z as setOption } from "./tmux-D57f-XNv.js";
9
+ import { a as init_event_store, i as initEventStore, n as getEventStore, r as getSharedDb } from "./event-store-DCMqyI07.js";
10
10
  import { _ as FlywheelRunId, a as getHarnessBehavior, b as DomainEvent, c as FlywheelStats, g as WS_METHODS, h as PanRpcGroup, m as PanRpcError, o as ContextLayerSaveRequest, s as ContextPreviewRequest, t as init_src, v as FlywheelStatus, x as MemoryObservation, y as EDITORS } from "./src-fgbU-jJ-.js";
11
- import { a as fixStuckReadyForMerge, c as init_review_status, i as fixStuckCommentedReviews, l as loadReadyForMergeFlags, n as clearReviewStatus, o as getReviewStatus, r as clearStuckMergeStatuses, s as getReviewStatusSync, u as loadReviewStatuses, v as setReviewStatus, y as setReviewStatusSync } from "./review-status-B5ZASOo4.js";
12
- import { a as EventStoreService, c as ReadModelService, d as init_read_model, f as toAgentResolution, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentStatus, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-5LbOcATP.js";
13
- import { d as init_agents, i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, p as listAllAgentsSync, r as init_briefing_freshness, s as AgentsResolverLive, t as appendFreshBriefingUpdate } from "./briefing-freshness-CXhZdnB8.js";
14
- import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-TE1GOZDr.js";
15
- import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-CnGyNgAq.js";
16
- import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-CfNpHOp4.js";
17
- import { An as getAgentDir, At as init_bridge_token, Dt as captureTranscriptUserRecordSnapshot, Gt as getAgentRuntimeBaseCommand, Jn as saveAgentStateSync, Jt as getProviderAuthMode, M as init_operator_interventions, Mn as getAgentState, N as operatorInterventionEvent, Nn as getAgentStateFilePath, Ot as init_transcript_landing, Pn as getAgentStateSync, Q as listRunningAgentsSync, St as deliverAgentMessage, X as listAgentStates, Z as listRunningAgents, Zt as injectPiConversationMemory, _t as init_config, an as init_claude_auth, ar as init_pty_token, at as init_concurrency, bn as writeChannelsBridgeMcpConfig, bt as saveCloisterConfigSync, c as init_tier_supervisor, en as init_pi_fifo, f as supervisorAgentId, fr as waitForReadySignal, hn as init_openai_auth, in as getClaudeAuthStatus, ir as readAgentHarnessModelRecordSync, j as messageAgent, jt as writeBridgeTokenSync, kt as probeTranscriptSince, ln as getProviderEnvForModel, lr as normalizeAgentId, mn as getOpenAIAuthStatus, mr as getAgentRuntimeStateSync, nn as init_ohmypi_fifo, or as writePtyToken, pr as getAgentRuntimeState, rn as ohmypiFifoPaths, rr as init_agent_record_sync, rt as emergencyBrake, s as deliverCommitForReview, sr as clearReadySignal, t as init_agents$1, tn as piFifoPaths, un as getProviderExportsForModel, vt as loadCloisterConfig, xt as shouldAutoStart, yn as dismissDevChannelsDialog, yt as loadCloisterConfigSync } from "./agents-C7V4odQ6.js";
18
- import { t as init_behavior } from "./behavior-By-2Wipv.js";
19
- import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-8lkDeL9g.js";
20
- import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-HKDrIy0h.js";
21
- import { n as AgentStateServiceLive } from "./agent-state-service-tXUdp6UF.js";
22
- import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-C3hiPVAM.js";
11
+ import { a as fixStuckReadyForMerge, c as init_review_status, i as fixStuckCommentedReviews, l as loadReadyForMergeFlags, n as clearReviewStatus, o as getReviewStatus, r as clearStuckMergeStatuses, s as getReviewStatusSync, u as loadReviewStatuses, v as setReviewStatus, y as setReviewStatusSync } from "./review-status-gPndPUBc.js";
12
+ import { a as EventStoreService, c as ReadModelService, d as init_read_model, f as toAgentResolution, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentStatus, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-543pQX9D.js";
13
+ import { d as init_agents, i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, p as listAllAgentsSync, r as init_briefing_freshness, s as AgentsResolverLive, t as appendFreshBriefingUpdate } from "./briefing-freshness-B2FdLwIv.js";
14
+ import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-CVDLPxXp.js";
15
+ import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-nAY1fbBt.js";
16
+ import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-JryW6MpM.js";
17
+ import { An as getAgentDir, At as init_bridge_token, Dt as captureTranscriptUserRecordSnapshot, Gt as getAgentRuntimeBaseCommand, Jn as saveAgentStateSync, Jt as getProviderAuthMode, M as init_operator_interventions, Mn as getAgentState, N as operatorInterventionEvent, Nn as getAgentStateFilePath, Ot as init_transcript_landing, Pn as getAgentStateSync, Q as listRunningAgentsSync, St as deliverAgentMessage, X as listAgentStates, Z as listRunningAgents, Zt as injectPiConversationMemory, _t as init_config, an as init_claude_auth, ar as init_pty_token, at as init_concurrency, bn as writeChannelsBridgeMcpConfig, bt as saveCloisterConfigSync, c as init_tier_supervisor, cr as resolvePtySupervisorScriptPath, dr as normalizeAgentId, en as init_pi_fifo, f as supervisorAgentId, gr as getAgentRuntimeStateSync, hn as init_openai_auth, hr as getAgentRuntimeState, in as getClaudeAuthStatus, ir as readAgentHarnessModelRecordSync, j as messageAgent, jt as writeBridgeTokenSync, kt as probeTranscriptSince, ln as getProviderEnvForModel, lr as clearReadySignal, mn as getOpenAIAuthStatus, mr as waitForReadySignal, nn as init_ohmypi_fifo, or as writePtyToken, rn as ohmypiFifoPaths, rr as init_agent_record_sync, rt as emergencyBrake, s as deliverCommitForReview, sr as init_pty_supervisor_locate, t as init_agents$1, tn as piFifoPaths, un as getProviderExportsForModel, vt as loadCloisterConfig, xt as shouldAutoStart, yn as dismissDevChannelsDialog, yt as loadCloisterConfigSync } from "./agents-B5LfpLPv.js";
18
+ import { t as init_behavior } from "./behavior-CPf0pbOt.js";
19
+ import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-BDL10Nwu.js";
20
+ import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-V0sUK-OR.js";
21
+ import { n as AgentStateServiceLive } from "./agent-state-service-BzESvLOf.js";
22
+ import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-BmdJU_w6.js";
23
23
  import { d as init_typed_errors, l as WorkspaceCreateError, n as AgentStartError, r as BeadsNotInitialized, s as TrackerApiError, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-BEJhbjJg.js";
24
- import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-E0HdXtWs.js";
25
- import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-yjbXaqpR.js";
26
- import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-DYjtgTOu.js";
27
- import { a as resolveTrackerTypeSync, i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-bpWs7Xyx.js";
28
- import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-CDGt__oQ.js";
29
- import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-CQUx9YLc.js";
30
- import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-aX_5EqQO.js";
31
- import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-BWHnrq-k.js";
24
+ import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-CfJMTAYd.js";
25
+ import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-D21rCIXk.js";
26
+ import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-33CYZYYu.js";
27
+ import { a as resolveTrackerTypeSync, i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-CWFt6jjV.js";
28
+ import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-Brc3t0SV.js";
29
+ import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-B_1YLWLI.js";
30
+ import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-WD2dnOsR.js";
31
+ import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-D3A9KX95.js";
32
32
  import { a as PAN_DIRNAME, f as asPanSpecDocument, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-CE1m_daD.js";
33
- import { C as transitionToMerging, _ as markFailed, c as isFlywheelGloballyPaused, d as listDuePendingAutoMerges, f as listProblemAutoMerges, g as markBlocked, n as getActionableAutoMerge, o as init_merge_sync, t as cancelPending, u as listActiveAutoMerges, v as markMerged, x as scheduleAutoMergeWithResult, y as requeueToPending } from "./merge-sync-CaLRt2cB.js";
34
- import { C as findSpecByIssue, O as writeSpec, T as init_specs, a as findWorkspaceDraftPlan, b as init_types$1, k as writeSpecForIssue, m as readWorkspacePlanSync, o as init_io, p as readWorkspacePlan, r as findPlan, s as isPlanningComplete, u as readPlan, x as subItemsOf } from "./io-Wy8YpFeP.js";
35
- import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-J-_1iIXe.js";
36
- import { f as init_config$1, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-oWoKf5jO.js";
33
+ import { C as transitionToMerging, _ as markFailed, c as isFlywheelGloballyPaused, d as listDuePendingAutoMerges, f as listProblemAutoMerges, g as markBlocked, n as getActionableAutoMerge, o as init_merge_sync, t as cancelPending, u as listActiveAutoMerges, v as markMerged, x as scheduleAutoMergeWithResult, y as requeueToPending } from "./merge-sync-DHWbGtjR.js";
34
+ import { C as findSpecByIssue, O as writeSpec, T as init_specs, a as findWorkspaceDraftPlan, b as init_types$1, k as writeSpecForIssue, m as readWorkspacePlanSync, o as init_io, p as readWorkspacePlan, r as findPlan, s as isPlanningComplete, u as readPlan, x as subItemsOf } from "./io-A7ZuOBkz.js";
35
+ import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-CCzwuSNe.js";
36
+ import { f as init_config$1, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-8sjaU6jZ.js";
37
37
  import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-CROoF5ic.js";
38
- import { $ as updateConversationForkFallbackReason, A as isAgentConversationName, B as removeFavorite, C as getConversationByTmuxSession, D as importLegacyConversation, E as hasOtherActiveConversationOnTmuxSession, F as markConversationEnded, G as setConversationHarness, H as setClearedToConvId, I as markConversationRunning, J as setForkRequest, K as setConversationModel, M as listConversations, N as listFavoritedIds, O as incrementForkRetryCount, P as markConversationActive, Q as updateConversationDeliveryMethod, S as getConversationByName, T as getStuckForks, U as setConversationClaudeSessionId, W as setConversationEffort, X as unarchiveConversation, Y as setImportedConversationLinks, Z as updateConversationCost, _ as canRefineTitle, b as getConversationByClaudeSessionId, et as updateConversationTitle, g as backfillConversationModel, gt as getDiscoveredSessionBySessionId, h as archiveConversation, j as listArchivedConversationsWithEnrichment, k as init_conversations, nt as updateLastAttached, q as setFavorite, rt as updateSpawnError, tt as updateForkStatus, v as canReplaceTitle, w as getConversationLedgerCosts, x as getConversationById, y as createConversation, yt as init_discovered_sessions, z as recordConversationHandoff } from "./conversations-DL_BAWVk.js";
39
- import { _ as init_codex_conversation_parser, a as contextUsageFromParseResult, c as parseEntireConversation, d as init_pi_conversation_parser, f as isPiSessionFile, g as parseOhmypiConversationMessages, h as isOhmypiSessionFile, i as computeContextUsage, l as parseFromLastCompactBoundary, m as init_ohmypi_conversation_parser, n as gateSnapshotEmission, o as summarizeConversationActivity, p as parsePiConversationMessages, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages } from "./conversation-service-DvG8vZSV.js";
40
- import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-CYY2_Eeh.js";
41
- import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-D2wt4nku.js";
42
- import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-4-xOzHQu.js";
43
- import { a as init_launcher_generator, i as generateLauncherScriptSync, n as init_state_home, r as isStateMigrated } from "./state-home-Bgj7i-C7.js";
44
- import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-DrRAs_0F.js";
45
- import { a as globalContextFile$1, f as resolveProjectContextFile, h as workspaceContextFile, l as piGlobalContextFile, n as codexGlobalContextFile, o as init_layers, p as resolveWorkspaceContextFile, r as ensureProjectLayer } from "./layers-vdvlpFki.js";
46
- import { l as init_codex, s as findRolloutPath } from "./codex-DcInrhok.js";
47
- import { C as setMergeTrainEnabled, S as setFlywheelRequireUatBeforeMerge, b as setFlywheelAutoPickupBacklog, c as isCloisterSpawnsPausedSync, d as isFlywheelAutoPickupBacklog, f as isFlywheelGloballyPaused$1, g as setCloisterSpawnsPausedSync, h as setBootReconciliationDecision, m as isMergeTrainEnabled, o as getSetting, p as isFlywheelRequireUatBeforeMerge, r as getBootReconciliationState, s as init_control_settings, u as isDeaconGloballyPausedSync, v as setDeaconGloballyPausedSync, w as setSetting } from "./control-settings-BMqUkXmR.js";
48
- import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-B3f9G1Kp.js";
49
- import { i as checkPrdGateSync, t as init_pan_dir } from "./pan-dir-BgBeeZDX.js";
50
- import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-DSrv9xGh.js";
51
- import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-OBgamRql.js";
52
- import { $t as scanPendingInputsPromise, B as applyIssueBlocksMainLabel, Bt as formatUptime, F as setAgentStatusChangedNotifier, G as applyIssueVetoedLabel, Gt as isSmeeConfiguredSync, H as applyIssueParkedLabel, Ht as getCurrentDockerStats, I as setAgentStoppedNotifier, J as removeIssueParkedLabel, Jt as countPendingAskUserQuestionsForAgent, K as removeIssueBlocksMainLabel, Kt as startSmeeProcessSync, L as setMergeReadyNotifier, Lt as getRuntimeForAgent, O as loadConfig, Q as createInFlightGuard, U as applyIssueReadyLabel, V as applyIssueObjectionLabel, Vt as getContainerHistory, W as applyIssueReleasedLabel, Wt as getSystemHealthSnapshot, X as removeIssueReleasedLabel, Y as removeIssueReadyLabel, Yt as getAgentJsonlMtime, Z as removeIssueVetoedLabel, _t as withConcurrencyLimit, at as listBootReconciliationCandidates, en as detectAwaitingInputForAgent, it as isBootReconciliationCandidate, k as loadState, n as assessDeaconPatrolFreshness, ot as startBootReconciliation, q as removeIssueObjectionLabel, qt as computeAgentEnrichment, rn as parseCodexApprovalPrompt, t as applyBootReconciliationDecision, tn as detectAwaitingInputFromPaneSync, x as getDeaconLogs, zt as getResourceStacks } from "./deacon-CGHl90eC.js";
53
- import { i as CostThresholdError, l as embed, s as parseRelativeTime } from "./scanner-CUGpdp4i.js";
54
- import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-DGWZzye2.js";
55
- import { n as recordBackgroundAiCost, t as init_cost } from "./cost-DaOG8sUB.js";
56
- import { S as writeLatestFlywheelStatus, _ as readCurrentLatestFlywheelStatus, b as subscribeLatestFlywheelStatus, f as getFlywheelRunDetail, h as listFlywheelRuns, l as buildClassifyLookups, m as isFlywheelRunId, y as resolveLiveFlywheelRunId } from "./flywheel-BLoVNtJV.js";
57
- import { C as hasDashboardInternalToken, D as getWorkspacePathForIssue, E as rejectUnsafeDashboardMutationRequest, S as dashboardSessionCookieHeader, T as rejectUnauthorizedDashboardSessionMintRequest, _ as syncCacheSync, b as resolveIssueHeadlineCost, d as reconcile, f as reconcilePiTranscripts, g as rebuildCacheSync, h as getCostsForIssueSync, l as resumeQueuedMerges, m as migrateAllSessionsSync, p as reclassifyUnknownCostEventsSync, t as workspacesRouteLayer, u as syncWalFromAllProjects, v as processPendingFeedbackDeliveries, w as rejectUnauthorizedDashboardRequest, x as dashboardCsrfToken, y as getCachedRunningAgents } from "./workspaces-DXLDgXo2.js";
58
- import { l as detectPlatform, u as init_platform } from "./workspace-manager-CEWK-OXd.js";
59
- import { O as init_specialists, b as getReviewerSessionName } from "./specialists-nZ0mRwpZ.js";
38
+ import { $ as updateConversationForkFallbackReason, A as isAgentConversationName, B as removeFavorite, C as getConversationByTmuxSession, D as importLegacyConversation, E as hasOtherActiveConversationOnTmuxSession, F as markConversationEnded, G as setConversationHarness, H as setClearedToConvId, I as markConversationRunning, J as setForkRequest, K as setConversationModel, M as listConversations, N as listFavoritedIds, O as incrementForkRetryCount, P as markConversationActive, Q as updateConversationDeliveryMethod, S as getConversationByName, T as getStuckForks, U as setConversationClaudeSessionId, W as setConversationEffort, X as unarchiveConversation, Y as setImportedConversationLinks, Z as updateConversationCost, _ as canRefineTitle, b as getConversationByClaudeSessionId, et as updateConversationTitle, g as backfillConversationModel, gt as getDiscoveredSessionBySessionId, h as archiveConversation, j as listArchivedConversationsWithEnrichment, k as init_conversations, nt as updateLastAttached, q as setFavorite, rt as updateSpawnError, tt as updateForkStatus, v as canReplaceTitle, w as getConversationLedgerCosts, x as getConversationById, y as createConversation, yt as init_discovered_sessions, z as recordConversationHandoff } from "./conversations-DfJKBDwB.js";
39
+ import { _ as init_codex_conversation_parser, a as contextUsageFromParseResult, c as parseEntireConversation, d as init_pi_conversation_parser, f as isPiSessionFile, g as parseOhmypiConversationMessages, h as isOhmypiSessionFile, i as computeContextUsage, l as parseFromLastCompactBoundary, m as init_ohmypi_conversation_parser, n as gateSnapshotEmission, o as summarizeConversationActivity, p as parsePiConversationMessages, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages } from "./conversation-service-CuTVU8dV.js";
40
+ import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-DMu7eGmU.js";
41
+ import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-CxVate0h.js";
42
+ import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-fLduChnX.js";
43
+ import { a as init_launcher_generator, i as generateLauncherScriptSync, n as init_state_home, r as isStateMigrated } from "./state-home-C2Bicw9N.js";
44
+ import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-B6bWGh9d.js";
45
+ import { a as globalContextFile$1, f as resolveProjectContextFile, h as workspaceContextFile, l as piGlobalContextFile, n as codexGlobalContextFile, o as init_layers, p as resolveWorkspaceContextFile, r as ensureProjectLayer } from "./layers-Cwe1J-9o.js";
46
+ import { l as init_codex, s as findRolloutPath } from "./codex-B4KEpX5V.js";
47
+ import { C as setMergeTrainEnabled, S as setFlywheelRequireUatBeforeMerge, b as setFlywheelAutoPickupBacklog, c as isCloisterSpawnsPausedSync, d as isFlywheelAutoPickupBacklog, f as isFlywheelGloballyPaused$1, g as setCloisterSpawnsPausedSync, h as setBootReconciliationDecision, m as isMergeTrainEnabled, o as getSetting, p as isFlywheelRequireUatBeforeMerge, r as getBootReconciliationState, s as init_control_settings, u as isDeaconGloballyPausedSync, v as setDeaconGloballyPausedSync, w as setSetting } from "./control-settings-D1B3u6HP.js";
48
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-SkRJm4a7.js";
49
+ import { i as checkPrdGateSync, t as init_pan_dir } from "./pan-dir-DoPtdHrp.js";
50
+ import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-Bqvj0m3i.js";
51
+ import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-Cf9mommA.js";
52
+ import { $t as scanPendingInputsPromise, B as applyIssueBlocksMainLabel, Bt as formatUptime, F as setAgentStatusChangedNotifier, G as applyIssueVetoedLabel, Gt as isSmeeConfiguredSync, H as applyIssueParkedLabel, Ht as getCurrentDockerStats, I as setAgentStoppedNotifier, J as removeIssueParkedLabel, Jt as countPendingAskUserQuestionsForAgent, K as removeIssueBlocksMainLabel, Kt as startSmeeProcessSync, L as setMergeReadyNotifier, Lt as getRuntimeForAgent, O as loadConfig, Q as createInFlightGuard, U as applyIssueReadyLabel, V as applyIssueObjectionLabel, Vt as getContainerHistory, W as applyIssueReleasedLabel, Wt as getSystemHealthSnapshot, X as removeIssueReleasedLabel, Y as removeIssueReadyLabel, Yt as getAgentJsonlMtime, Z as removeIssueVetoedLabel, _t as withConcurrencyLimit, at as listBootReconciliationCandidates, en as detectAwaitingInputForAgent, it as isBootReconciliationCandidate, k as loadState, n as assessDeaconPatrolFreshness, ot as startBootReconciliation, q as removeIssueObjectionLabel, qt as computeAgentEnrichment, rn as parseCodexApprovalPrompt, t as applyBootReconciliationDecision, tn as detectAwaitingInputFromPaneSync, x as getDeaconLogs, zt as getResourceStacks } from "./deacon-CM0MxbS8.js";
53
+ import { i as CostThresholdError, l as embed, s as parseRelativeTime } from "./scanner-BIGumel_.js";
54
+ import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-BfiosVAn.js";
55
+ import { n as recordBackgroundAiCost, t as init_cost } from "./cost-DAPYN6iA.js";
56
+ import { S as writeLatestFlywheelStatus, _ as readCurrentLatestFlywheelStatus, b as subscribeLatestFlywheelStatus, f as getFlywheelRunDetail, h as listFlywheelRuns, l as buildClassifyLookups, m as isFlywheelRunId, y as resolveLiveFlywheelRunId } from "./flywheel-Dfpx4bIV.js";
57
+ import { C as hasDashboardInternalToken, D as getWorkspacePathForIssue, E as rejectUnsafeDashboardMutationRequest, S as dashboardSessionCookieHeader, T as rejectUnauthorizedDashboardSessionMintRequest, _ as syncCacheSync, b as resolveIssueHeadlineCost, d as reconcile, f as reconcilePiTranscripts, g as rebuildCacheSync, h as getCostsForIssueSync, l as resumeQueuedMerges, m as migrateAllSessionsSync, p as reclassifyUnknownCostEventsSync, t as workspacesRouteLayer, u as syncWalFromAllProjects, v as processPendingFeedbackDeliveries, w as rejectUnauthorizedDashboardRequest, x as dashboardCsrfToken, y as getCachedRunningAgents } from "./workspaces-Ca4zZs12.js";
58
+ import { l as detectPlatform, u as init_platform } from "./workspace-manager-BJhW2sky.js";
59
+ import { O as init_specialists, b as getReviewerSessionName } from "./specialists-DjHbwQ_p.js";
60
60
  import { t as withBdMutex } from "./bd-mutex-BItGvLQ8.js";
61
- import { c as findPrdAtStatusSync, l as init_prd_locations } from "./archive-planning-zTvWWHG_.js";
62
- import { a as getShadowState, s as init_shadow_state } from "./shadow-state-DTC7AMHc.js";
63
- import { T as verifyAppCanMerge, d as getPullRequestState, f as init_github_app, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-FMXgo3vK.js";
64
- import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-BO84g03t.js";
65
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-DMaO0XXa.js";
61
+ import { c as findPrdAtStatusSync, l as init_prd_locations } from "./archive-planning-oX1pj6nY.js";
62
+ import { a as getShadowState, s as init_shadow_state } from "./shadow-state-BiMwdyl1.js";
63
+ import { T as verifyAppCanMerge, d as getPullRequestState, f as init_github_app, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-BecAnXRX.js";
64
+ import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-Da3DeomA.js";
65
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-qvm7UON7.js";
66
66
  import { a as init_boot_gates, i as formatBootGateState, o as resolveBootGates } from "./no-resume-mode-yrPEQ_pC.js";
67
67
  import { c as computeCohort, d as computeStats, f as computeWaves, h as selectNeedsPlanning, l as computeEpicGroups, m as normalizeGate, s as classifyIssue, u as computeLanes } from "./pickup-KLRUhThD.js";
68
- import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-6YP8fVpH.js";
69
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-1eu1RvAT.js";
70
- import { i as resolveAutoSpawnOnFinalize, o as spawnPlanningSession } from "./spawn-planning-session-CXc0NkwV.js";
71
- import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-CmbIKw7E.js";
72
- import { r as spawnInspectAgent } from "./inspect-agent-CKF5-SJr.js";
73
- import { n as init_github_pr_lookup, r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-t8X8R0c0.js";
74
- import { a as init_pull_requests, c as getIssuePrTabCacheGeneration, i as fetchIssuePullRequestDiff, l as init_pr_tab_cache, n as fetchIssuePullRequest, o as bumpIssuePrTabCacheGeneration, r as fetchIssuePullRequestDetails, s as getCachedIssuePrTabResponse, t as fetchIssueCheckRuns, u as setCachedIssuePrTabResponse } from "./pull-requests-CH4iBFLl.js";
75
- import { t as enrichReviewStatus } from "./review-status-enrichment-CGlcApSn.js";
76
- import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-DPtxOAjp.js";
77
- import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-BJE-Vc7H.js";
78
- import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-CJW_P4On.js";
79
- import { C as init_git_activity, w as listGitOperationsSync } from "./merge-agent-C81xPIGd.js";
80
- import { t as getAgentCommandSync } from "./settings-CBrei_kx.js";
81
- import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-D6P6d3pz.js";
82
- import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-TN0cV8k-.js";
83
- import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-BSeS7Ki3.js";
84
- import { a as init_query_expansion, i as clearQueryExpansionCache, n as init_injection, o as buildMatchQuery, r as injectPromptTimeMemory, s as init_search } from "./injection-CszhePD2.js";
85
- import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-Xn0QUNmb.js";
86
- import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-CCqN4hWk.js";
87
- import { a as init_render, d as validateTemplate, i as hasManagedRegion, l as init_harness, o as userContentOutsideRegion, t as init_context_layers, u as renderForHarness } from "./context-layers-CTjQwcEQ.js";
88
- import { r as parseArtifactRef } from "./forge-BixzckB0.js";
89
- import { t as getMergeBlockersPayload } from "./merge-blockers-DwdQNsYD.js";
90
- import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-ja-nkEc1.js";
91
- import "./supervisor-0oXvLwyC.js";
92
- import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-BbfH1EIy.js";
68
+ import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-DA0akEQN.js";
69
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-QQmo_Z0l.js";
70
+ import { i as resolveAutoSpawnOnFinalize, o as spawnPlanningSession } from "./spawn-planning-session-DxLxcM7m.js";
71
+ import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-DfhMq6kQ.js";
72
+ import { r as spawnInspectAgent } from "./inspect-agent-DOaCDkCF.js";
73
+ import { n as init_github_pr_lookup, r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-CzVWuysl.js";
74
+ import { a as init_pull_requests, c as getIssuePrTabCacheGeneration, i as fetchIssuePullRequestDiff, l as init_pr_tab_cache, n as fetchIssuePullRequest, o as bumpIssuePrTabCacheGeneration, r as fetchIssuePullRequestDetails, s as getCachedIssuePrTabResponse, t as fetchIssueCheckRuns, u as setCachedIssuePrTabResponse } from "./pull-requests-1WXmTBlo.js";
75
+ import { t as enrichReviewStatus } from "./review-status-enrichment-qWvWckYN.js";
76
+ import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-DAHW1yA_.js";
77
+ import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-BrUIKMv_.js";
78
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-C_1frSDj.js";
79
+ import { C as init_git_activity, w as listGitOperationsSync } from "./merge-agent-CHHs5S_0.js";
80
+ import { t as getAgentCommandSync } from "./settings-CFEeQRj2.js";
81
+ import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-sZBCpEVv.js";
82
+ import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-CGuognN3.js";
83
+ import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-CRyyKKXQ.js";
84
+ import { a as init_query_expansion, i as clearQueryExpansionCache, n as init_injection, o as buildMatchQuery, r as injectPromptTimeMemory, s as init_search } from "./injection-Cc4Qt8LZ.js";
85
+ import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-DezPkJSm.js";
86
+ import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-D86Zo2Ci.js";
87
+ import { a as init_render, d as validateTemplate, i as hasManagedRegion, l as init_harness, o as userContentOutsideRegion, t as init_context_layers, u as renderForHarness } from "./context-layers-r2ywnQYA.js";
88
+ import { r as parseArtifactRef } from "./forge-CoPFXFyl.js";
89
+ import { t as getMergeBlockersPayload } from "./merge-blockers-BMhDpMl_.js";
90
+ import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-DeflKafB.js";
91
+ import "./supervisor-D5GC5jUM.js";
92
+ import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-qvOqvMuC.js";
93
93
  import { createRequire } from "node:module";
94
+ import * as sp from "node:path";
95
+ import { basename, delimiter, dirname, extname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
94
96
  import { Cause, Context, Data, Duration, Effect, Exit, Fiber, FileSystem, Layer, Option, Path, Queue, Result, Schedule, Schema, Stream } from "effect";
95
97
  import { createReadStream, createWriteStream, existsSync, fstatSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs";
96
- import { basename, dirname, join, resolve } from "path";
98
+ import { basename as basename$1, dirname as dirname$1, join as join$1, resolve as resolve$1 } from "path";
97
99
  import { homedir } from "os";
98
100
  import { freemem as freemem$1, homedir as homedir$1, loadavg as loadavg$1, totalmem as totalmem$1, type } from "node:os";
99
101
  import { constants, createReadStream as createReadStream$1, existsSync as existsSync$1, mkdirSync as mkdirSync$1, promises as promises$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, readlinkSync, realpathSync as realpathSync$1, renameSync as renameSync$1, rmSync as rmSync$1, stat, statSync as statSync$1, symlinkSync as symlinkSync$1, unwatchFile, watch, watchFile, writeFileSync as writeFileSync$1 } from "node:fs";
100
- import * as sp from "node:path";
101
- import { basename as basename$1, delimiter, dirname as dirname$1, extname as extname$1, isAbsolute as isAbsolute$1, join as join$1, normalize, relative as relative$1, resolve as resolve$1, sep as sep$1 } from "node:path";
102
102
  import { FetchHttpClient, HttpRouter, HttpServer, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
103
103
  import { EventEmitter } from "node:events";
104
104
  import { access, appendFile, chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat as stat$1, unlink, writeFile } from "node:fs/promises";
@@ -118,6 +118,23 @@ import { Worker } from "node:worker_threads";
118
118
  import { monitorEventLoopDelay } from "node:perf_hooks";
119
119
  import { createInterface as createInterface$1 } from "node:readline";
120
120
  import * as Multipart from "effect/unstable/http/Multipart";
121
+ //#region path-env.ts
122
+ /**
123
+ * PAN-2593: children must resolve the same Node this server runs on.
124
+ *
125
+ * `pan up` launches the server with an explicit Node 22 binary, but the process
126
+ * PATH can be bare system dirs — so every spawned child (verification-gate
127
+ * npm/typecheck, git hooks, build steps) resolved /usr/bin/node (v18) and
128
+ * modern-Node tooling (rolldown's util.styleText) failed with confusing,
129
+ * workspace-dependent errors.
130
+ *
131
+ * Side-effect module: prepend the running binary's directory to PATH. Imported
132
+ * FIRST in main.ts so it runs before any other imported module can shell out
133
+ * (ESM import order). Idempotent.
134
+ */
135
+ const execDir = dirname(process.execPath);
136
+ if (!(process.env.PATH ?? "").split(delimiter).includes(execDir)) process.env.PATH = execDir + delimiter + (process.env.PATH ?? "");
137
+ //#endregion
121
138
  //#region server-log-file.ts
122
139
  /**
123
140
  * Persist the dashboard server's console output to
@@ -139,7 +156,7 @@ init_paths();
139
156
  let installed = false;
140
157
  /** Absolute path the dashboard server persists its console output to. */
141
158
  function dashboardLogPath() {
142
- return join(getOverdeckHome(), "logs", "dashboard.log");
159
+ return join$1(getOverdeckHome(), "logs", "dashboard.log");
143
160
  }
144
161
  /**
145
162
  * True when the process's stdout already *is* the dashboard.log file — i.e. a
@@ -191,7 +208,7 @@ function initDashboardLogFile() {
191
208
  try {
192
209
  const logPath = dashboardLogPath();
193
210
  if (stdoutAlreadyTargetsLog(logPath)) return;
194
- mkdirSync(join(getOverdeckHome(), "logs"), { recursive: true });
211
+ mkdirSync(join$1(getOverdeckHome(), "logs"), { recursive: true });
195
212
  const stream = createWriteStream(logPath, { flags: "a" });
196
213
  stream.on("error", () => {});
197
214
  teeStreamToFile(process.stdout, stream);
@@ -215,7 +232,7 @@ init_errors();
215
232
  /**
216
233
  * Path to the Overdeck environment file
217
234
  */
218
- const ENV_FILE_PATH = join(homedir(), ".overdeck.env");
235
+ const ENV_FILE_PATH = join$1(homedir(), ".overdeck.env");
219
236
  /**
220
237
  * Parse a .env file content into key-value pairs
221
238
  */
@@ -653,10 +670,10 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
653
670
  message: `Invalid issueId "${issueId}": bare numeric IDs are not allowed. Use a prefixed ID (e.g. PAN-${issueId}).`
654
671
  });
655
672
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
656
- const beadsDir = join$1(workspacePath, ".beads");
657
- const projectBeadsDir = join$1(workspacePath, "..", "..", ".beads");
673
+ const beadsDir = join(workspacePath, ".beads");
674
+ const projectBeadsDir = join(workspacePath, "..", "..", ".beads");
658
675
  if (!(existsSync$1(beadsDir) || existsSync$1(projectBeadsDir))) throw new BeadsNotInitialized({ workspace: workspacePath });
659
- const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-C-vqmKDi.js");
676
+ const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-C4kZ8a2r.js");
660
677
  const normalizedId = normalizeAgentId(issueId);
661
678
  if ((await Effect.runPromise(getAgentState(normalizedId)))?.status === "running") throw new AgentAlreadyRunning({ id: issueId });
662
679
  return {
@@ -687,7 +704,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
687
704
  const { workspacePath, projectPath, issue } = opts;
688
705
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
689
706
  const sessionName = opts.sessionName ?? `planning-${issueId.toLowerCase()}`;
690
- const { spawnPlanningSession } = await import("./spawn-planning-session-CSMWco8B.js");
707
+ const { spawnPlanningSession } = await import("./spawn-planning-session-CzDFSKAQ.js");
691
708
  const result = await spawnPlanningSession({
692
709
  issue: {
693
710
  id: issue.id,
@@ -720,14 +737,14 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
720
737
  }),
721
738
  kill: (agentId) => Effect.tryPromise({
722
739
  try: async () => {
723
- const { stopAgent } = await import("./agents-C-vqmKDi.js");
740
+ const { stopAgent } = await import("./agents-C4kZ8a2r.js");
724
741
  await Effect.runPromise(stopAgent(agentId));
725
742
  },
726
743
  catch: () => void 0
727
744
  }).pipe(Effect.ignore),
728
745
  message: (agentId, msg) => Effect.tryPromise({
729
746
  try: async () => {
730
- const { messageAgent } = await import("./agents-C-vqmKDi.js");
747
+ const { messageAgent } = await import("./agents-C4kZ8a2r.js");
731
748
  await messageAgent(agentId, msg);
732
749
  },
733
750
  catch: (err) => new AgentStartError({
@@ -738,8 +755,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
738
755
  }),
739
756
  deepWipe: (issueId, opts) => Effect.tryPromise({
740
757
  try: async () => {
741
- const { deepWipe } = await import("./workflows-DVwXauef.js");
742
- const { resolveProjectFromIssueSync } = await import("./projects-BNmVxnNt.js");
758
+ const { deepWipe } = await import("./workflows-pKw9yRSV.js");
759
+ const { resolveProjectFromIssueSync } = await import("./projects-Bqfwuqet.js");
743
760
  const project = resolveProjectFromIssueSync(issueId);
744
761
  const projectPath = project?.projectPath ?? process.cwd();
745
762
  await Effect.runPromise(deepWipe({
@@ -776,7 +793,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
776
793
  const projectPath = resolveProjectFromIssueSync(issueId)?.projectPath ?? process.cwd();
777
794
  return {
778
795
  projectPath,
779
- workspacePath: join$1(projectPath, "workspaces", `feature-${issueLower}`),
796
+ workspacePath: join(projectPath, "workspaces", `feature-${issueLower}`),
780
797
  branch: `feature/${issueLower}`
781
798
  };
782
799
  }
@@ -795,8 +812,8 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
795
812
  const { workspacePath, branch } = getWorkspacePath(issueId);
796
813
  const issueLower = issueId.toLowerCase();
797
814
  if (existsSync$1(workspacePath)) return workspacePath;
798
- const { createWorkspace } = await import("./workspace-manager-B3PqQQSM.js");
799
- const { loadProjectsConfigSync } = await import("./projects-BNmVxnNt.js");
815
+ const { createWorkspace } = await import("./workspace-manager-Cb2a7bg9.js");
816
+ const { loadProjectsConfigSync } = await import("./projects-Bqfwuqet.js");
800
817
  const { projects } = loadProjectsConfigSync();
801
818
  const project = resolveProjectFromIssueSync(issueId);
802
819
  if (!project) throw new WorkspaceCreateError({
@@ -831,7 +848,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
831
848
  const { workspacePath } = getWorkspacePath(issueId);
832
849
  const issueLower = issueId.toLowerCase();
833
850
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
834
- const { removeWorkspace } = await import("./workspace-manager-B3PqQQSM.js");
851
+ const { removeWorkspace } = await import("./workspace-manager-Cb2a7bg9.js");
835
852
  const project = resolveProjectFromIssueSync(issueId);
836
853
  if (!project) throw new WorkspaceCreateError({
837
854
  id: issueId,
@@ -862,7 +879,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
862
879
  try: async () => {
863
880
  const { workspacePath } = getWorkspacePath(issueId);
864
881
  const issueLower = issueId.toLowerCase();
865
- const { stopWorkspaceDocker } = await import("./workspace-manager-B3PqQQSM.js");
882
+ const { stopWorkspaceDocker } = await import("./workspace-manager-Cb2a7bg9.js");
866
883
  await Effect.runPromise(stopWorkspaceDocker(workspacePath, issueLower));
867
884
  },
868
885
  catch: () => void 0
@@ -925,13 +942,13 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
925
942
  issueId.toLowerCase();
926
943
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
927
944
  const composePaths = [
928
- join$1(workspacePath, "docker-compose.yml"),
929
- join$1(workspacePath, "docker-compose.yaml"),
930
- join$1(workspacePath, ".devcontainer", "docker-compose.yml"),
931
- join$1(workspacePath, ".devcontainer", "docker-compose.devcontainer.yml")
945
+ join(workspacePath, "docker-compose.yml"),
946
+ join(workspacePath, "docker-compose.yaml"),
947
+ join(workspacePath, ".devcontainer", "docker-compose.yml"),
948
+ join(workspacePath, ".devcontainer", "docker-compose.devcontainer.yml")
932
949
  ];
933
950
  if (!composePaths.find((p) => existsSync$1(p))) {
934
- const { ensureDevcontainerSync } = await import("./ensure-devcontainer-BCB6fHp9.js");
951
+ const { ensureDevcontainerSync } = await import("./ensure-devcontainer-CbSXvN9W.js");
935
952
  const ensure = ensureDevcontainerSync({
936
953
  workspacePath,
937
954
  issueId
@@ -943,7 +960,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
943
960
  }
944
961
  const finalComposePath = composePaths.find((p) => existsSync$1(p));
945
962
  if (finalComposePath) await execAsync$11(`docker compose -f "${finalComposePath}" up -d --build`, {
946
- cwd: dirname$1(finalComposePath),
963
+ cwd: dirname(finalComposePath),
947
964
  timeout: 3e5
948
965
  });
949
966
  },
@@ -1099,7 +1116,7 @@ const OpenRouterServiceLive = Layer.effect(OpenRouterService, Effect.sync(() =>
1099
1116
  * - The global editor-launcher in the dashboard top bar (PanOpenInPicker)
1100
1117
  */
1101
1118
  function getDefaultCwd() {
1102
- const candidate = join$1(homedir$1(), "Projects");
1119
+ const candidate = join(homedir$1(), "Projects");
1103
1120
  return existsSync$1(candidate) ? candidate : homedir$1();
1104
1121
  }
1105
1122
  //#endregion
@@ -4867,7 +4884,7 @@ function buildTerminalCookie(sessionName, terminalToken) {
4867
4884
  return `pan_codex_reauth=${value}; HttpOnly; SameSite=Strict; Path=/ws/terminal; Max-Age=${Math.floor(SESSION_MAX_AGE_MS / 1e3)}${secure}`;
4868
4885
  }
4869
4886
  async function readBridgedCodexCredential() {
4870
- const path = join$1(getCliproxyAuthDir(), "codex-primary.json");
4887
+ const path = join(getCliproxyAuthDir(), "codex-primary.json");
4871
4888
  try {
4872
4889
  const [raw, fileStat] = await Promise.all([readFile(path, "utf8"), stat$1(path)]);
4873
4890
  const parsed = JSON.parse(raw);
@@ -27847,7 +27864,7 @@ const DEFAULT_SETTINGS = { autopreso: {
27847
27864
  model: "gpt-4.1-mini"
27848
27865
  } };
27849
27866
  async function readCodexBearerToken() {
27850
- const raw = await readFile(join$1(homedir$1(), ".codex", "auth.json"), "utf8");
27867
+ const raw = await readFile(join(homedir$1(), ".codex", "auth.json"), "utf8");
27851
27868
  const parsed = JSON.parse(raw);
27852
27869
  const token = parsed.bearer ?? parsed.accessToken ?? parsed.token;
27853
27870
  if (!token) throw new Error("Codex auth token not found in ~/.codex/auth.json");
@@ -28266,7 +28283,7 @@ var GoogleCloudTranscription = class {
28266
28283
  }
28267
28284
  async start(apiKey, model) {
28268
28285
  try {
28269
- const { SpeechClient } = await import("./src-BswtmojL.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
28286
+ const { SpeechClient } = await import("./src-mK_M_ZIj.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
28270
28287
  if (this.closed) return;
28271
28288
  const stream = new SpeechClient({ apiKey }).streamingRecognize({
28272
28289
  config: {
@@ -28321,9 +28338,9 @@ const SAMPLE_RATE = 16e3;
28321
28338
  const MAX_BACKEND_AUDIO_BUFFER_BYTES = 1e6;
28322
28339
  function resolveSidecarBinary() {
28323
28340
  const candidates = [
28324
- resolve$1(dirname$1(fileURLToPath(import.meta.url)), "../../packages/moonshine-linux-x64/bin/moonshine-sidecar"),
28325
- resolve$1(process.cwd(), "packages/moonshine-linux-x64/bin/moonshine-sidecar"),
28326
- resolve$1(process.cwd(), "node_modules/moonshine-linux-x64/bin/moonshine-sidecar")
28341
+ resolve(dirname(fileURLToPath(import.meta.url)), "../../packages/moonshine-linux-x64/bin/moonshine-sidecar"),
28342
+ resolve(process.cwd(), "packages/moonshine-linux-x64/bin/moonshine-sidecar"),
28343
+ resolve(process.cwd(), "node_modules/moonshine-linux-x64/bin/moonshine-sidecar")
28327
28344
  ];
28328
28345
  const binary = candidates.find((candidate) => existsSync$1(candidate));
28329
28346
  if (!binary) throw new Error(`Moonshine sidecar binary not found. Run npm run build:sidecar to create ${candidates[0]}`);
@@ -28555,7 +28572,7 @@ const readJsonBody$16 = Effect.gen(function* () {
28555
28572
  }
28556
28573
  });
28557
28574
  function voiceSettingsPath() {
28558
- return join$1(getOverdeckHome(), "voice-settings.json");
28575
+ return join(getOverdeckHome(), "voice-settings.json");
28559
28576
  }
28560
28577
  function isVoiceSettings(value) {
28561
28578
  if (!value || typeof value !== "object") return false;
@@ -28612,7 +28629,7 @@ async function saveVoiceSettings(settings) {
28612
28629
  }
28613
28630
  });
28614
28631
  const path = voiceSettingsPath();
28615
- await mkdir(dirname$1(path), { recursive: true });
28632
+ await mkdir(dirname(path), { recursive: true });
28616
28633
  await writeFile(path, `${JSON.stringify(normalized, null, 2)}\n`, {
28617
28634
  encoding: "utf8",
28618
28635
  mode: 384
@@ -28978,7 +28995,7 @@ const LANGUAGE_BY_EXTENSION = {
28978
28995
  ".zsh": "bash"
28979
28996
  };
28980
28997
  function isInsidePath(parent, child) {
28981
- return child === parent || child.startsWith(`${parent}${sep$1}`);
28998
+ return child === parent || child.startsWith(`${parent}${sep}`);
28982
28999
  }
28983
29000
  function splitLines$1(text) {
28984
29001
  if (text.length === 0) return [];
@@ -29031,7 +29048,7 @@ function asPanRpcError(error) {
29031
29048
  });
29032
29049
  }
29033
29050
  function languageForPath(path) {
29034
- return LANGUAGE_BY_EXTENSION[extname$1(path).toLowerCase()] ?? "plaintext";
29051
+ return LANGUAGE_BY_EXTENSION[extname(path).toLowerCase()] ?? "plaintext";
29035
29052
  }
29036
29053
  async function readWorkspaceFile(input) {
29037
29054
  const line = validateIntegerAtLeast(input.line, "line", 1);
@@ -29048,7 +29065,7 @@ async function readWorkspaceFile(input) {
29048
29065
  code: "WORKSPACE_NOT_FOUND"
29049
29066
  });
29050
29067
  });
29051
- const resolvedPath = resolve$1(workspaceRoot, input.relativePath);
29068
+ const resolvedPath = resolve(workspaceRoot, input.relativePath);
29052
29069
  if (!isInsidePath(workspaceRoot, resolvedPath)) throw new PanRpcError({
29053
29070
  message: "Path is outside the workspace",
29054
29071
  code: "PATH_OUTSIDE_WORKSPACE"
@@ -29120,7 +29137,7 @@ async function resolveFilePathExists(input) {
29120
29137
  exists: false,
29121
29138
  kind: null
29122
29139
  };
29123
- const target = isAbsolute$1(path) ? path : resolve$1(cwd, path);
29140
+ const target = isAbsolute(path) ? path : resolve(cwd, path);
29124
29141
  try {
29125
29142
  const s = await stat$1(target);
29126
29143
  if (s.isFile()) return {
@@ -30052,6 +30069,7 @@ init_briefing_freshness();
30052
30069
  init_types();
30053
30070
  init_specs();
30054
30071
  init_io();
30072
+ init_pty_supervisor_locate();
30055
30073
  init_pty_token();
30056
30074
  init_agent_record_sync();
30057
30075
  init_openai_auth();
@@ -30499,7 +30517,7 @@ function isDiscoverableAgentSession(sessionName) {
30499
30517
  async function loadTrackerIssues() {
30500
30518
  const map = /* @__PURE__ */ new Map();
30501
30519
  try {
30502
- const { getSharedIssueService } = await import("./issue-service-singleton-B8iu_TKV.js");
30520
+ const { getSharedIssueService } = await import("./issue-service-singleton-BC2JLZi7.js");
30503
30521
  const issues = (await getSharedIssueService()).getIssues();
30504
30522
  for (const issue of issues) if (issue.identifier) map.set(issue.identifier.toUpperCase(), issue);
30505
30523
  } catch {
@@ -30594,11 +30612,11 @@ async function loadProjectBranches(projectPath) {
30594
30612
  }
30595
30613
  }
30596
30614
  async function scanWorkspace(workspacesDir, workspaceName) {
30597
- const workspacePath = join$1(workspacesDir, workspaceName);
30598
- const projectRoot = join$1(workspacesDir, "..");
30615
+ const workspacePath = join(workspacesDir, workspaceName);
30616
+ const projectRoot = join(workspacesDir, "..");
30599
30617
  const workspaceEntries = new Set(await readdir(workspacePath).catch(() => []));
30600
- const panEntries = workspaceEntries.has(".pan") ? new Set(await readdir(join$1(workspacePath, PAN_DIRNAME)).catch(() => [])) : /* @__PURE__ */ new Set();
30601
- const beadsEntries = workspaceEntries.has(".beads") ? new Set(await readdir(join$1(workspacePath, ".beads")).catch(() => [])) : /* @__PURE__ */ new Set();
30618
+ const panEntries = workspaceEntries.has(".pan") ? new Set(await readdir(join(workspacePath, PAN_DIRNAME)).catch(() => [])) : /* @__PURE__ */ new Set();
30619
+ const beadsEntries = workspaceEntries.has(".beads") ? new Set(await readdir(join(workspacePath, ".beads")).catch(() => [])) : /* @__PURE__ */ new Set();
30602
30620
  const issueMatch = workspaceName.match(/^feature-([a-z]+-\d+)$/i);
30603
30621
  const issueId = issueMatch ? issueMatch[1].toUpperCase() : null;
30604
30622
  const specEntry = issueId ? await Effect.runPromise(findSpecByIssue(projectRoot, issueId)).catch(() => null) : null;
@@ -30698,7 +30716,7 @@ async function computeResourceAllocatedIssues() {
30698
30716
  if (!issue.resourceDetails.tmuxSessions.includes(sessionName)) issue.resourceDetails.tmuxSessions.push(sessionName);
30699
30717
  }
30700
30718
  try {
30701
- const { listActiveRemoteAgentStates } = await import("./remote-agents-DNuaAgU6.js");
30719
+ const { listActiveRemoteAgentStates } = await import("./remote-agents-UHoi4oGr.js");
30702
30720
  for (const remoteState of listActiveRemoteAgentStates()) {
30703
30721
  const issue = ensureIssue(remoteState.issueId);
30704
30722
  if (!issue) continue;
@@ -30722,7 +30740,7 @@ async function computeResourceAllocatedIssues() {
30722
30740
  }
30723
30741
  await Promise.all(projects.map(async (project) => {
30724
30742
  const projectPath = project.config.path;
30725
- const workspacesDir = join$1(projectPath, "workspaces");
30743
+ const workspacesDir = join(projectPath, "workspaces");
30726
30744
  const [workspaceEntries, branches] = await Promise.all([readdir(workspacesDir, { withFileTypes: true }).catch(() => []), loadProjectBranches(projectPath)]);
30727
30745
  await Promise.all(workspaceEntries.map(async (entry) => {
30728
30746
  if (!entry.isDirectory() || !entry.name.startsWith("feature-")) return;
@@ -30740,7 +30758,7 @@ async function computeResourceAllocatedIssues() {
30740
30758
  }
30741
30759
  if (workspace.hasBeads) {
30742
30760
  issue.resourceSources.add("beads");
30743
- issue.resourceDetails.beadsPath = join$1(workspace.workspacePath, ".beads");
30761
+ issue.resourceDetails.beadsPath = join(workspace.workspacePath, ".beads");
30744
30762
  }
30745
30763
  const gitInfo = await resolveAgentGitInfo(workspace.workspacePath, issue.branch);
30746
30764
  issue.resourceDetails.actualBranch = gitInfo.actualBranch;
@@ -30933,15 +30951,15 @@ function getProjectPath$4(linearProjectId, issuePrefix) {
30933
30951
  if (config) {
30934
30952
  for (const { owner, repo, prefix } of config.repos) if ((prefix || repo.toUpperCase().replace(/-CLI$/, "").replace(/-/g, "")).toUpperCase() === issuePrefix.toUpperCase()) {
30935
30953
  const possiblePaths = [
30936
- join$1(homedir$1(), "Projects", repo),
30937
- join$1(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
30938
- join$1(homedir$1(), "Projects", owner, repo)
30954
+ join(homedir$1(), "Projects", repo),
30955
+ join(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
30956
+ join(homedir$1(), "Projects", owner, repo)
30939
30957
  ];
30940
30958
  for (const path of possiblePaths) if (existsSync$1(path)) return path;
30941
30959
  }
30942
30960
  }
30943
30961
  }
30944
- return join$1(homedir$1(), "Projects");
30962
+ return join(homedir$1(), "Projects");
30945
30963
  }
30946
30964
  function resolveIssueProjectPathSync(id) {
30947
30965
  const githubCheck = isGitHubIssue$6(id);
@@ -31048,7 +31066,7 @@ function getIssueBeads(id) {
31048
31066
  return Effect.gen(function* () {
31049
31067
  const issueLower = id.toLowerCase();
31050
31068
  const projectPath = resolveIssueProjectPathSync(id);
31051
- const workspacePath = projectPath ? join$1(projectPath, "workspaces", `feature-${issueLower}`) : "";
31069
+ const workspacePath = projectPath ? join(projectPath, "workspaces", `feature-${issueLower}`) : "";
31052
31070
  const { isRemoteWorkspace, remoteVmName } = yield* Effect.promise(async () => {
31053
31071
  const planningSessionName = `planning-${issueLower}`;
31054
31072
  try {
@@ -31059,7 +31077,7 @@ function getIssueBeads(id) {
31059
31077
  };
31060
31078
  } catch {}
31061
31079
  try {
31062
- const remoteMetadataPath = join$1(homedir$1(), ".overdeck", "agents", planningSessionName, "remote-workspace.json");
31080
+ const remoteMetadataPath = join(homedir$1(), ".overdeck", "agents", planningSessionName, "remote-workspace.json");
31063
31081
  if (existsSync$1(remoteMetadataPath)) {
31064
31082
  const remoteMetadata = JSON.parse(await readFile(remoteMetadataPath, "utf-8"));
31065
31083
  if (remoteMetadata.vmName) return {
@@ -31147,7 +31165,7 @@ function inspectIssueBead(options) {
31147
31165
  const project = resolveProjectFromIssueSync(id);
31148
31166
  if (!project) return jsonResponse({ error: `Could not resolve project for ${id}` }, { status: 404 });
31149
31167
  const issueLower = id.toLowerCase();
31150
- const workspace = join$1(project.projectPath, "workspaces", `feature-${issueLower}`);
31168
+ const workspace = join(project.projectPath, "workspaces", `feature-${issueLower}`);
31151
31169
  if (!(yield* Effect.promise(() => pathIsDirectory(workspace)))) return jsonResponse({ error: `No workspace found for ${id}` }, { status: 404 });
31152
31170
  const result = yield* spawnInspectAgent({
31153
31171
  projectKey: project.projectKey,
@@ -31267,7 +31285,7 @@ async function completePlanningArtifacts(options) {
31267
31285
  if (workspaceIssueId && workspaceIssueId.toLowerCase() !== issueLower) throw new Error(`Workspace vBRIEF is for ${workspaceIssueId.toUpperCase()}, not ${upperIssueId}`);
31268
31286
  assertPlanQuality(workspaceDoc);
31269
31287
  const createBeads = options.createBeads ?? (async (path) => {
31270
- const mod = await import("./beads-AmCXEv_E.js");
31288
+ const mod = await import("./beads-BNU-fb48.js");
31271
31289
  return await Effect.runPromise(mod.createBeadsFromVBrief(path));
31272
31290
  });
31273
31291
  emitCompletePlanningPhase(upperIssueId, "specWrite", "start", "writing proposed vBRIEF spec", { projectPath });
@@ -31304,7 +31322,7 @@ async function completePlanningArtifacts(options) {
31304
31322
  if (existingSpec && previousSpecContents !== null) await writeFile(existingSpec.path, previousSpecContents, "utf-8");
31305
31323
  else if (!existingSpec) {
31306
31324
  await rm(proposed.path, { force: true });
31307
- await rm(dirname$1(proposed.path), { force: true }).catch(() => void 0);
31325
+ await rm(dirname(proposed.path), { force: true }).catch(() => void 0);
31308
31326
  }
31309
31327
  const detail = errors.length > 0 ? errors.join("; ") : `created ${created.length} beads for ${planItemCount} plan items`;
31310
31328
  emitCompletePlanningPhase(upperIssueId, "beadsMaterialize", "failure", detail, {
@@ -31327,15 +31345,15 @@ async function completePlanningArtifacts(options) {
31327
31345
  }
31328
31346
  function completePlanningFilesToStage(projectPath, proposedFilename, migrated = false) {
31329
31347
  const filesToStage = migrated ? [] : [`.pan/specs/${proposedFilename}`];
31330
- if (existsSync$1(join$1(projectPath, ".overdeck", "context", "codebase"))) filesToStage.push(".overdeck/context/codebase/");
31331
- else if (!migrated && existsSync$1(join$1(projectPath, ".pan", "context", "codebase"))) filesToStage.push(".pan/context/codebase/");
31348
+ if (existsSync$1(join(projectPath, ".overdeck", "context", "codebase"))) filesToStage.push(".overdeck/context/codebase/");
31349
+ else if (!migrated && existsSync$1(join(projectPath, ".pan", "context", "codebase"))) filesToStage.push(".pan/context/codebase/");
31332
31350
  return filesToStage;
31333
31351
  }
31334
31352
  function completePlanningWorkspaceGitAddCommands(gitRoot, migrated = false) {
31335
31353
  const commands = [];
31336
- if (!migrated && existsSync$1(join$1(gitRoot, ".pan"))) commands.push(["add", ".pan/"]);
31337
- if (!migrated && existsSync$1(join$1(gitRoot, ".beads"))) commands.push(["add", ".beads/"]);
31338
- if (existsSync$1(join$1(gitRoot, ".gitignore"))) commands.push(["add", ".gitignore"]);
31354
+ if (!migrated && existsSync$1(join(gitRoot, ".pan"))) commands.push(["add", ".pan/"]);
31355
+ if (!migrated && existsSync$1(join(gitRoot, ".beads"))) commands.push(["add", ".beads/"]);
31356
+ if (existsSync$1(join(gitRoot, ".gitignore"))) commands.push(["add", ".gitignore"]);
31339
31357
  return commands;
31340
31358
  }
31341
31359
  /**
@@ -31352,12 +31370,12 @@ async function commitWorkspaceRecordBeforeAutoSpawn(gitRoot, issueId) {
31352
31370
  await Effect.runPromise(flushAutoCommits(project.path));
31353
31371
  return;
31354
31372
  }
31355
- if (!existsSync$1(join$1(gitRoot, ".git"))) return;
31373
+ if (!existsSync$1(join(gitRoot, ".git"))) return;
31356
31374
  const issueLower = issueId.toLowerCase();
31357
31375
  try {
31358
31376
  await Effect.runPromise(flushAutoCommits(gitRoot));
31359
31377
  } catch {}
31360
- const recordPath = join$1(".pan", "records", `${issueLower}.json`);
31378
+ const recordPath = join(".pan", "records", `${issueLower}.json`);
31361
31379
  try {
31362
31380
  const { stdout: statusOut } = await execFileAsync$12("git", [
31363
31381
  "status",
@@ -31530,7 +31548,7 @@ async function completePlanningForIssue(options) {
31530
31548
  isRemotePlanning: true,
31531
31549
  remoteVmName: remoteState.vmName
31532
31550
  };
31533
- const remoteMetadataPath = join$1(homedir$1(), ".overdeck", "agents", sessionName, "remote-workspace.json");
31551
+ const remoteMetadataPath = join(homedir$1(), ".overdeck", "agents", sessionName, "remote-workspace.json");
31534
31552
  if (existsSync$1(remoteMetadataPath)) {
31535
31553
  const remoteMetadata = JSON.parse(await readFile(remoteMetadataPath, "utf-8"));
31536
31554
  if (remoteMetadata.vmName) return {
@@ -31559,7 +31577,7 @@ async function completePlanningForIssue(options) {
31559
31577
  })();
31560
31578
  const githubCheck = isGitHubIssue$5(id);
31561
31579
  const projectPath = resolveIssueProjectPathSync(id);
31562
- const workspacePath = projectPath ? join$1(projectPath, "workspaces", `feature-${issueLower}`) : "";
31580
+ const workspacePath = projectPath ? join(projectPath, "workspaces", `feature-${issueLower}`) : "";
31563
31581
  if (workspacePath) {
31564
31582
  if (noPrd) emitCompletePlanningPhase(id, "prdGate", "skipped", "noPrd bypass requested");
31565
31583
  else {
@@ -31605,7 +31623,7 @@ async function completePlanningForIssue(options) {
31605
31623
  const project = findProjectByPathSync(projectPath);
31606
31624
  const migrated = project ? await isStateMigrated(project) : false;
31607
31625
  const filesToStage = completePlanningFilesToStage(projectPath, proposed.filename, migrated);
31608
- const projectIsGitRepo = existsSync$1(join$1(projectPath, ".git"));
31626
+ const projectIsGitRepo = existsSync$1(join(projectPath, ".git"));
31609
31627
  if (migrated) await Effect.runPromise(flushAutoCommits(projectPath));
31610
31628
  else if (!projectIsGitRepo) console.log(`[complete-planning] Project root ${projectPath} is not a git repository (polyrepo) — pan spec updated on disk but not committed`);
31611
31629
  else {
@@ -31665,7 +31683,7 @@ async function completePlanningForIssue(options) {
31665
31683
  }
31666
31684
  } else console.log(`[complete-planning] Project root not on main (${currentBranch}) — pan spec updated on disk but not committed on main`);
31667
31685
  }
31668
- if (!existsSync$1(join$1(gitRoot, ".git"))) await execFileAsync$12("git", ["init"], {
31686
+ if (!existsSync$1(join(gitRoot, ".git"))) await execFileAsync$12("git", ["init"], {
31669
31687
  cwd: gitRoot,
31670
31688
  encoding: "utf-8"
31671
31689
  });
@@ -31896,15 +31914,15 @@ function getProjectPath$3(linearProjectId, issuePrefix) {
31896
31914
  if (config) {
31897
31915
  for (const { owner, repo, prefix } of config.repos) if ((prefix || repo.toUpperCase().replace(/-CLI$/, "").replace(/-/g, "")).toUpperCase() === issuePrefix.toUpperCase()) {
31898
31916
  const possiblePaths = [
31899
- join$1(homedir$1(), "Projects", repo),
31900
- join$1(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
31901
- join$1(homedir$1(), "Projects", owner, repo)
31917
+ join(homedir$1(), "Projects", repo),
31918
+ join(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
31919
+ join(homedir$1(), "Projects", owner, repo)
31902
31920
  ];
31903
31921
  for (const path of possiblePaths) if (existsSync$1(path)) return path;
31904
31922
  }
31905
31923
  }
31906
31924
  }
31907
- return join$1(homedir$1(), "Projects");
31925
+ return join(homedir$1(), "Projects");
31908
31926
  }
31909
31927
  function getIssueDataService$8() {
31910
31928
  return getSharedIssueService();
@@ -31946,7 +31964,7 @@ async function closeIssuePullRequest(issueId, reason = "Canceled via Overdeck")
31946
31964
  timeout: 15e3
31947
31965
  });
31948
31966
  try {
31949
- const { setReviewStatusSync } = await import("./review-status-h7BXIA4z.js");
31967
+ const { setReviewStatusSync } = await import("./review-status-JhQ3qlDS.js");
31950
31968
  setReviewStatusSync(issueId.toUpperCase(), { prUrl: void 0 });
31951
31969
  } catch {}
31952
31970
  return [`Closed PR #${prNumber} on ${githubCheck.owner}/${githubCheck.repo}`];
@@ -32000,7 +32018,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
32000
32018
  const { ctx, projectConfig } = buildLifecycleContext(id, getIssueDataService$8().getIssueSource(id) ?? void 0);
32001
32019
  const deleteWorkspace = opts.deleteWorkspace ?? true;
32002
32020
  cleanupLog.push(...await closeIssuePullRequest(id, mode === "cancel" ? "Canceled via Overdeck" : "Reset to Todo via Overdeck"));
32003
- const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-CEg4sHZH.js");
32021
+ const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-f1GbDK33.js");
32004
32022
  const workflow = mode === "cancel" ? cancelIssueWorkflow : resetToTodo;
32005
32023
  const result = await Effect.runPromise(workflow(ctx, {
32006
32024
  deleteWorkspace,
@@ -32015,7 +32033,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
32015
32033
  }));
32016
32034
  cleanupLog.push(...result.steps.flatMap((step) => step.details || [step.error].filter(Boolean)));
32017
32035
  if (mode === "cancel") try {
32018
- const { transitionVBriefOnMain } = await import("./lifecycle-io-CdqPkCyk.js");
32036
+ const { transitionVBriefOnMain } = await import("./lifecycle-io-D56q8zlO.js");
32019
32037
  const tx = await Effect.runPromise(transitionVBriefOnMain(ctx.projectPath, id, "cancelled", "cancelled", `scope: cancel ${id.toUpperCase()} vBRIEF`));
32020
32038
  if (tx.moved) cleanupLog.push(`vBRIEF moved ${tx.fromDir} → cancelled`);
32021
32039
  if (tx.committed) cleanupLog.push(`Committed vBRIEF cancellation on main`);
@@ -32023,8 +32041,8 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
32023
32041
  cleanupLog.push(`vBRIEF cancel transition failed (non-fatal): ${err?.message ?? err}`);
32024
32042
  }
32025
32043
  try {
32026
- const { killAllReviewerSessions } = await import("./review-agent-DTINEffB.js");
32027
- const { resolveProjectFromIssueSync } = await import("./projects-BNmVxnNt.js");
32044
+ const { killAllReviewerSessions } = await import("./review-agent-uwVftH98.js");
32045
+ const { resolveProjectFromIssueSync } = await import("./projects-Bqfwuqet.js");
32028
32046
  const projectKey = resolveProjectFromIssueSync(id)?.projectKey;
32029
32047
  if (projectKey) {
32030
32048
  const { killed } = await Effect.runPromise(killAllReviewerSessions(projectKey, id.toUpperCase()));
@@ -32038,7 +32056,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
32038
32056
  cleanupLog.push("Cleared review status");
32039
32057
  } catch {}
32040
32058
  try {
32041
- const { resetPostMergeState } = await import("./merge-agent-7nBiCytp.js");
32059
+ const { resetPostMergeState } = await import("./merge-agent-CfohxFWM.js");
32042
32060
  resetPostMergeState(id);
32043
32061
  resetPostMergeState(id.toUpperCase());
32044
32062
  cleanupLog.push("Cleared merge state");
@@ -32058,7 +32076,7 @@ function closeIssueTransition(options) {
32058
32076
  const { issueId, body, eventStore } = options;
32059
32077
  const { reason } = body;
32060
32078
  const projectPath = getProjectPath$3(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]);
32061
- const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-CEg4sHZH.js"));
32079
+ const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-f1GbDK33.js"));
32062
32080
  const githubCheck = isGitHubIssue$4(issueId);
32063
32081
  const issueDataService = getIssueDataService$8();
32064
32082
  const issueSource = issueDataService.getIssueSource(issueId);
@@ -32320,19 +32338,19 @@ function reopenIssueTransition(options) {
32320
32338
  try {
32321
32339
  const teamPrefix = extractTeamPrefix(id);
32322
32340
  const projectPath = (teamPrefix ? findProjectByTeamSync(teamPrefix) : null)?.path || "";
32323
- const workspacePath = projectPath ? join$1(projectPath, "workspaces", `feature-${id.toLowerCase()}`) : "";
32341
+ const workspacePath = projectPath ? join(projectPath, "workspaces", `feature-${id.toLowerCase()}`) : "";
32324
32342
  if (workspacePath) await Effect.runPromise(reopenWorkspaceState(id.toUpperCase(), workspacePath, { reason: body?.reason }));
32325
32343
  else clearReviewStatus(id.toUpperCase());
32326
32344
  } catch {}
32327
32345
  try {
32328
- const { resetPostMergeState } = await import("./merge-agent-7nBiCytp.js");
32346
+ const { resetPostMergeState } = await import("./merge-agent-CfohxFWM.js");
32329
32347
  resetPostMergeState(id);
32330
32348
  resetPostMergeState(id.toUpperCase());
32331
32349
  } catch {}
32332
32350
  try {
32333
- const agentDir = join$1(homedir$1(), ".overdeck", "agents", `agent-${id.toLowerCase()}`);
32351
+ const agentDir = join(homedir$1(), ".overdeck", "agents", `agent-${id.toLowerCase()}`);
32334
32352
  for (const marker of ["completed", "completed.processed"]) {
32335
- const markerPath = join$1(agentDir, marker);
32353
+ const markerPath = join(agentDir, marker);
32336
32354
  await removeCompletionMarker(markerPath);
32337
32355
  if (!existsSync$1(markerPath)) console.log(`[reopen] Cleared ${marker} marker for ${id}`);
32338
32356
  }
@@ -32344,8 +32362,8 @@ function reopenIssueTransition(options) {
32344
32362
  const teamPrefix = extractTeamPrefix(id);
32345
32363
  const projectPath = (teamPrefix ? findProjectByTeamSync(teamPrefix) : null)?.path || "";
32346
32364
  if (projectPath) {
32347
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
32348
- const { createBeadsFromVBrief } = await import("./beads-AmCXEv_E.js");
32365
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
32366
+ const { createBeadsFromVBrief } = await import("./beads-BNU-fb48.js");
32349
32367
  if (existsSync$1(workspacePath) && await Effect.runPromise(findPlan(workspacePath))) try {
32350
32368
  const { stdout: bdCheck } = await Effect.runPromise(withBdMutex(() => Effect.promise(() => execFileAsync$11("bd", [
32351
32369
  "list",
@@ -32422,7 +32440,7 @@ function moveIssueStatus(options) {
32422
32440
  "done"
32423
32441
  ];
32424
32442
  if (!targetStatus || !validStatuses.includes(targetStatus)) return jsonResponse({ error: `Invalid targetStatus. Must be one of: ${validStatuses.join(", ")}` }, { status: 400 });
32425
- const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-BOaq8BrD.js"));
32443
+ const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-1aS8FijU.js"));
32426
32444
  const issueState = {
32427
32445
  backlog: "open",
32428
32446
  todo: "open",
@@ -32508,7 +32526,7 @@ async function cleanupWorkspaceForIssue(rawId, eventStore) {
32508
32526
  const issueLower = id.toLowerCase();
32509
32527
  const projectRoot = resolveIssueProjectPathSync(id) || null;
32510
32528
  if (projectRoot) {
32511
- const workspacePath = join$1(projectRoot, "workspaces", `feature-${issueLower}`);
32529
+ const workspacePath = join(projectRoot, "workspaces", `feature-${issueLower}`);
32512
32530
  try {
32513
32531
  if ((await execAsync$8("git worktree list --porcelain", {
32514
32532
  cwd: projectRoot,
@@ -32538,7 +32556,7 @@ async function cleanupWorkspaceForIssue(rawId, eventStore) {
32538
32556
  cleanupLog.push(`Deleted local branch: ${branchName}`);
32539
32557
  } catch {}
32540
32558
  }
32541
- const agentDir = join$1(homedir$1(), ".overdeck", "agents", `agent-${issueLower}`);
32559
+ const agentDir = join(homedir$1(), ".overdeck", "agents", `agent-${issueLower}`);
32542
32560
  if (existsSync$1(agentDir)) {
32543
32561
  await execAsync$8(`rm -rf "${agentDir}"`, { encoding: "utf-8" });
32544
32562
  cleanupLog.push(`Removed agent state: ${agentDir}`);
@@ -32644,12 +32662,12 @@ async function deepWipeIssue(id, body, eventStore) {
32644
32662
  async function copySettingsToWorkspace(id) {
32645
32663
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
32646
32664
  const projectPath = resolveIssueProjectPathSync(id);
32647
- const workspacePath = projectPath ? join$1(projectPath, "workspaces", `feature-${id.toLowerCase()}`) : "";
32665
+ const workspacePath = projectPath ? join(projectPath, "workspaces", `feature-${id.toLowerCase()}`) : "";
32648
32666
  if (!workspacePath || !existsSync$1(workspacePath)) return jsonResponse({
32649
32667
  success: false,
32650
32668
  error: "Workspace not found"
32651
32669
  }, { status: 404 });
32652
- const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-B3PqQQSM.js");
32670
+ const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-Cb2a7bg9.js");
32653
32671
  const result = copyOverdeckSettingsToWorkspaceSync(workspacePath);
32654
32672
  return jsonResponse({
32655
32673
  success: result.errors.length === 0 || result.copied.length > 0,
@@ -32678,13 +32696,13 @@ function generateTasksForIssue(id) {
32678
32696
  success: false,
32679
32697
  error: `Could not resolve project path for ${id}`
32680
32698
  }, { status: 404 });
32681
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
32699
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
32682
32700
  const planPath = yield* findPlan(workspacePath);
32683
32701
  if (!planPath || !existsSync$1(planPath)) return jsonResponse({
32684
32702
  success: false,
32685
32703
  error: `No vBRIEF spec found on main for ${id} — run planning first.`
32686
32704
  }, { status: 409 });
32687
- const { createBeadsFromVBrief } = yield* Effect.promise(() => import("./beads-AmCXEv_E.js"));
32705
+ const { createBeadsFromVBrief } = yield* Effect.promise(() => import("./beads-BNU-fb48.js"));
32688
32706
  const result = yield* createBeadsFromVBrief(workspacePath);
32689
32707
  if (!result.success || result.created.length === 0) {
32690
32708
  const errors = result.errors.length > 0 ? result.errors : ["Beads creation produced no tasks"];
@@ -32757,15 +32775,15 @@ function getProjectPath$2(linearProjectId, issuePrefix) {
32757
32775
  if (config) {
32758
32776
  for (const { owner, repo, prefix } of config.repos) if ((prefix || repo.toUpperCase().replace(/-CLI$/, "").replace(/-/g, "")).toUpperCase() === issuePrefix.toUpperCase()) {
32759
32777
  const possiblePaths = [
32760
- join$1(homedir$1(), "Projects", repo),
32761
- join$1(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
32762
- join$1(homedir$1(), "Projects", owner, repo)
32778
+ join(homedir$1(), "Projects", repo),
32779
+ join(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
32780
+ join(homedir$1(), "Projects", owner, repo)
32763
32781
  ];
32764
32782
  for (const path of possiblePaths) if (existsSync$1(path)) return path;
32765
32783
  }
32766
32784
  }
32767
32785
  }
32768
- return join$1(homedir$1(), "Projects");
32786
+ return join(homedir$1(), "Projects");
32769
32787
  }
32770
32788
  function startPlanningForIssue(options) {
32771
32789
  return Effect.gen(function* () {
@@ -32844,9 +32862,9 @@ function startPlanningForIssue(options) {
32844
32862
  }
32845
32863
  const projectPath = getProjectPath$2(void 0, extractPrefixSync(issue.identifier) ?? issue.identifier.split("-")[0]);
32846
32864
  const issueLower = issue.identifier.toLowerCase();
32847
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
32865
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
32848
32866
  const sessionName = `planning-${issueLower}`;
32849
- const agentStateDir = join$1(homedir$1(), ".overdeck", "agents", sessionName);
32867
+ const agentStateDir = join(homedir$1(), ".overdeck", "agents", sessionName);
32850
32868
  yield* Effect.promise(() => mkdir(agentStateDir, { recursive: true }));
32851
32869
  yield* Effect.promise(() => {
32852
32870
  saveAgentStateSync({
@@ -33000,8 +33018,8 @@ function abortPlanningForIssue(options) {
33000
33018
  }
33001
33019
  yield* killSession(sessionName).pipe(Effect.ignore);
33002
33020
  yield* killSession(`planning-${id.toLowerCase()}`).pipe(Effect.ignore);
33003
- const agentStateDir = join$1(homedir$1(), ".overdeck", "agents", sessionName);
33004
- const workAgentStateDir = issueIdentifier ? join$1(homedir$1(), ".overdeck", "agents", `agent-${issueIdentifier.toLowerCase()}`) : join$1(homedir$1(), ".overdeck", "agents", `agent-${id.toLowerCase()}`);
33021
+ const agentStateDir = join(homedir$1(), ".overdeck", "agents", sessionName);
33022
+ const workAgentStateDir = issueIdentifier ? join(homedir$1(), ".overdeck", "agents", `agent-${issueIdentifier.toLowerCase()}`) : join(homedir$1(), ".overdeck", "agents", `agent-${id.toLowerCase()}`);
33005
33023
  yield* Effect.promise(() => cleanupAgentStateDirs([agentStateDir, workAgentStateDir]).catch((cleanupErr) => {
33006
33024
  console.log("[abort-planning] Warning: Could not clean up agent state:", cleanupErr);
33007
33025
  }));
@@ -33012,8 +33030,8 @@ function abortPlanningForIssue(options) {
33012
33030
  try {
33013
33031
  const projectPath = resolveIssueProjectPathSync(issueIdentifier) || void 0;
33014
33032
  if (projectPath) {
33015
- const featureWorkspacePath = join$1(projectPath, "workspaces", `feature-${issueIdentifier.toLowerCase()}`);
33016
- const plainWorkspacePath = join$1(projectPath, "workspaces", issueIdentifier.toLowerCase());
33033
+ const featureWorkspacePath = join(projectPath, "workspaces", `feature-${issueIdentifier.toLowerCase()}`);
33034
+ const plainWorkspacePath = join(projectPath, "workspaces", issueIdentifier.toLowerCase());
33017
33035
  if (existsSync$1(existsSync$1(featureWorkspacePath) ? featureWorkspacePath : plainWorkspacePath)) {
33018
33036
  await execFileAsync$10("pan", [
33019
33037
  "workspace",
@@ -33085,7 +33103,7 @@ function restartFromPlan(options) {
33085
33103
  const { id, lifecycle, eventStore } = options;
33086
33104
  const issueLower = id.toLowerCase();
33087
33105
  const projectPath = resolveIssueProjectPathSync(id);
33088
- const workspacePath = projectPath ? join$1(projectPath, "workspaces", `feature-${issueLower}`) : "";
33106
+ const workspacePath = projectPath ? join(projectPath, "workspaces", `feature-${issueLower}`) : "";
33089
33107
  if (!workspacePath || !existsSync$1(workspacePath)) return jsonResponse({
33090
33108
  success: false,
33091
33109
  error: "Workspace not found"
@@ -33098,7 +33116,7 @@ function restartFromPlan(options) {
33098
33116
  console.log(`[restart-from-plan] Killed work agent session ${workAgentSession}`);
33099
33117
  }
33100
33118
  } catch {}
33101
- const agentStateDir = join$1(homedir$1(), ".overdeck", "agents", `agent-${issueLower}`);
33119
+ const agentStateDir = join(homedir$1(), ".overdeck", "agents", `agent-${issueLower}`);
33102
33120
  if (existsSync$1(agentStateDir)) try {
33103
33121
  await rm(agentStateDir, {
33104
33122
  recursive: true,
@@ -33109,10 +33127,10 @@ function restartFromPlan(options) {
33109
33127
  });
33110
33128
  yield* Effect.promise(async () => {
33111
33129
  const dirsToClean = [
33112
- join$1(workspacePath, ".pan", "review"),
33113
- join$1(workspacePath, ".pan", "prompts"),
33114
- join$1(workspacePath, ".pan", "events"),
33115
- join$1(workspacePath, ".pan", "feedback")
33130
+ join(workspacePath, ".pan", "review"),
33131
+ join(workspacePath, ".pan", "prompts"),
33132
+ join(workspacePath, ".pan", "events"),
33133
+ join(workspacePath, ".pan", "feedback")
33116
33134
  ];
33117
33135
  for (const dir of dirsToClean) if (existsSync$1(dir)) try {
33118
33136
  await rm(dir, {
@@ -33256,7 +33274,7 @@ function getPlanningState(id) {
33256
33274
  return Effect.gen(function* () {
33257
33275
  const issueLower = id.toLowerCase();
33258
33276
  const projectPath = resolveIssueProjectPathSync(id);
33259
- const workspacePath = projectPath ? join$1(projectPath, "workspaces", `feature-${issueLower}`) : "";
33277
+ const workspacePath = projectPath ? join(projectPath, "workspaces", `feature-${issueLower}`) : "";
33260
33278
  const hasPlan = (workspacePath ? yield* findPlan(workspacePath) : null) !== null;
33261
33279
  const planningComplete = workspacePath ? yield* isPlanningComplete(workspacePath) : false;
33262
33280
  return jsonResponse({
@@ -33576,7 +33594,7 @@ function closeOutIssue(id) {
33576
33594
  }
33577
33595
  const closeOutResult = yield* Effect.promise(async () => {
33578
33596
  try {
33579
- const { closeOut } = await import("./lifecycle-CEg4sHZH.js");
33597
+ const { closeOut } = await import("./lifecycle-f1GbDK33.js");
33580
33598
  return {
33581
33599
  ok: true,
33582
33600
  result: await Effect.runPromise(closeOut(ctx))
@@ -33662,7 +33680,7 @@ function bulkCloseOut(body) {
33662
33680
  const invalidIds = issueIds.filter((id) => !isValidIssueId(id));
33663
33681
  if (invalidIds.length > 0) return jsonResponse({ error: `Invalid issue ID format: ${invalidIds.join(", ")}` }, { status: 400 });
33664
33682
  const eventStore = yield* EventStoreService;
33665
- const { closeOut } = yield* Effect.promise(() => import("./lifecycle-CEg4sHZH.js"));
33683
+ const { closeOut } = yield* Effect.promise(() => import("./lifecycle-f1GbDK33.js"));
33666
33684
  const issueDataService = getIssueDataService$5();
33667
33685
  const tasks = [];
33668
33686
  const agentChecks = yield* withConcurrencyLimit(issueIds.map((id) => Effect.promise(async () => {
@@ -33859,7 +33877,7 @@ const getIssueShipLogRoute = HttpRouter.add("GET", "/api/issues/:id/ship-log", h
33859
33877
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
33860
33878
  return yield* Effect.promise(async () => {
33861
33879
  const { getShipLog } = await import("./ship-log-CMWH3H5-.js");
33862
- const { getReviewStatusSync } = await import("./review-status-h7BXIA4z.js");
33880
+ const { getReviewStatusSync } = await import("./review-status-JhQ3qlDS.js");
33863
33881
  const log = getShipLog(id);
33864
33882
  const rs = getReviewStatusSync(id);
33865
33883
  return jsonResponse({
@@ -34440,7 +34458,7 @@ function parsePositiveInt$1(value, fallback) {
34440
34458
  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
34441
34459
  }
34442
34460
  function defaultDeaconScriptPath() {
34443
- return resolve$1(import.meta.dirname, "deacon.js");
34461
+ return resolve(import.meta.dirname, "deacon.js");
34444
34462
  }
34445
34463
  function internalDashboardUrl(env) {
34446
34464
  const port = Number.parseInt(env.API_PORT ?? env.PORT ?? "3011", 10);
@@ -35187,7 +35205,7 @@ function buildCapacityForecast(stacks, options) {
35187
35205
  };
35188
35206
  }
35189
35207
  function forecastStateFile() {
35190
- return forecastStateFileForTests ?? join$1(getOverdeckHome(), "resource-forecast-peaks.json");
35208
+ return forecastStateFileForTests ?? join(getOverdeckHome(), "resource-forecast-peaks.json");
35191
35209
  }
35192
35210
  function loadForecastStore() {
35193
35211
  const file = forecastStateFile();
@@ -35480,7 +35498,7 @@ let venvDelete = async (path) => {
35480
35498
  });
35481
35499
  };
35482
35500
  let issueClosedReader = (issueId) => isClosedReviewStatus(issueId);
35483
- let projectRootReader = () => resolve$1(process.cwd(), "..", "..");
35501
+ let projectRootReader = () => resolve(process.cwd(), "..", "..");
35484
35502
  function buildReclaimPayload(stacks, agents, options = {}) {
35485
35503
  const liveIssueIds = new Set(agents.filter((agent) => agent.hasLiveTmuxSession === true).map((agent) => agent.issueId?.toUpperCase()).filter((issueId) => Boolean(issueId)));
35486
35504
  const candidates = [...stacks.filter((stack) => stack.issueId && isClosedStack(stack) && !liveIssueIds.has(stack.issueId.toUpperCase())).map((stack) => ({
@@ -35519,7 +35537,7 @@ function deleteResourceVenvEffect(issue) {
35519
35537
  ok: false,
35520
35538
  error: `${issueId} is not closed; refusing to delete workspace venv.`
35521
35539
  }, { status: 409 });
35522
- const venvPath = join$1(projectRootReader(), "workspaces", `feature-${issueId.toLowerCase()}`, ".venv");
35540
+ const venvPath = join(projectRootReader(), "workspaces", `feature-${issueId.toLowerCase()}`, ".venv");
35523
35541
  yield* Effect.tryPromise({
35524
35542
  try: () => venvDelete(venvPath),
35525
35543
  catch: (error) => error
@@ -36333,9 +36351,9 @@ async function deriveSessionPresence(agentId, rtState, tmuxSessionNames) {
36333
36351
  if (rtState.state === "active") return "active";
36334
36352
  if (rtState.state === "suspended") return "suspended";
36335
36353
  if (rtState.state === "idle" || rtState.state === "waiting-on-human") {
36336
- const hbStat = await stat$1(join$1(homedir$1(), ".overdeck", "heartbeats", `${agentId}.json`)).catch(() => null);
36354
+ const hbStat = await stat$1(join(homedir$1(), ".overdeck", "heartbeats", `${agentId}.json`)).catch(() => null);
36337
36355
  if (hbStat && Date.now() - hbStat.mtime.getTime() < 5e3) return "active";
36338
- const logStat = await stat$1(join$1(homedir$1(), ".overdeck", "agents", agentId, "output.log")).catch(() => null);
36356
+ const logStat = await stat$1(join(homedir$1(), ".overdeck", "agents", agentId, "output.log")).catch(() => null);
36339
36357
  if (logStat && Date.now() - logStat.mtime.getTime() < 5e3) return "active";
36340
36358
  return "idle";
36341
36359
  }
@@ -36792,7 +36810,7 @@ function loadSettingsApi() {
36792
36810
  streamdownRenderer: config.experimental?.streamdownRenderer ?? false,
36793
36811
  showHarnessModelPermutations: config.experimental?.showHarnessModelPermutations ?? false
36794
36812
  },
36795
- claude: { permissionMode: config.claude?.permissionMode ?? "auto" },
36813
+ claude: { permissionMode: config.claude?.permissionMode ?? "bypass" },
36796
36814
  codex: { permissionMode: config.codex?.permissionMode ?? "auto-review" },
36797
36815
  remote: {
36798
36816
  resiliency_tier: config.remote?.resiliencyTier ?? "ephemeral",
@@ -37393,7 +37411,7 @@ async function readReviewerStoppedAt(sessionId, _agentsRoot) {
37393
37411
  }
37394
37412
  /** Read the round-N.json artifacts for one reviewer session. */
37395
37413
  async function readReviewerRounds(sessionName, agentsRoot) {
37396
- const dir = join$1(agentsRoot, sessionName);
37414
+ const dir = join(agentsRoot, sessionName);
37397
37415
  let entries;
37398
37416
  try {
37399
37417
  entries = await readdir(dir);
@@ -37410,7 +37428,7 @@ async function readReviewerRounds(sessionName, agentsRoot) {
37410
37428
  if (roundFiles.length === 0) return void 0;
37411
37429
  const isSynthesis = sessionName.endsWith("-review-synthesis");
37412
37430
  const history = (await Promise.all(roundFiles.map(async (rf) => {
37413
- const raw = await readFile(join$1(dir, rf.name), "utf-8").catch(() => null);
37431
+ const raw = await readFile(join(dir, rf.name), "utf-8").catch(() => null);
37414
37432
  if (!raw) return null;
37415
37433
  try {
37416
37434
  const parsed = JSON.parse(raw);
@@ -37457,7 +37475,7 @@ async function readReviewerRounds(sessionName, agentsRoot) {
37457
37475
  */
37458
37476
  async function findLatestReviewRunDir(workspacePath, issueId) {
37459
37477
  try {
37460
- const reviewRoot = join$1(workspacePath, ".pan", "review");
37478
+ const reviewRoot = join(workspacePath, ".pan", "review");
37461
37479
  const entries = await readdir(reviewRoot);
37462
37480
  const upper = issueId.toUpperCase();
37463
37481
  const lower = issueId.toLowerCase();
@@ -37472,7 +37490,7 @@ async function findLatestReviewRunDir(workspacePath, issueId) {
37472
37490
  if (!Number.isFinite(ts)) continue;
37473
37491
  if (ts > bestTs) {
37474
37492
  bestTs = ts;
37475
- bestDir = join$1(reviewRoot, entry);
37493
+ bestDir = join(reviewRoot, entry);
37476
37494
  }
37477
37495
  }
37478
37496
  return bestDir;
@@ -37480,7 +37498,7 @@ async function findLatestReviewRunDir(workspacePath, issueId) {
37480
37498
  return null;
37481
37499
  }
37482
37500
  }
37483
- async function readSynthesisRounds(issueId, projectKey, agentsRoot = join$1(homedir$1(), ".overdeck", "agents")) {
37501
+ async function readSynthesisRounds(issueId, projectKey, agentsRoot = join(homedir$1(), ".overdeck", "agents")) {
37484
37502
  return readReviewerRounds(getReviewerSessionName("synthesis", projectKey, issueId), agentsRoot);
37485
37503
  }
37486
37504
  /**
@@ -37489,14 +37507,14 @@ async function readSynthesisRounds(issueId, projectKey, agentsRoot = join$1(home
37489
37507
  */
37490
37508
  async function buildReviewerNodes(opts) {
37491
37509
  if (!isExtendedReviewEnabled(opts.issueId)) return [];
37492
- const agentsRoot = opts.agentsDirOverride ?? join$1(homedir$1(), ".overdeck", "agents");
37510
+ const agentsRoot = opts.agentsDirOverride ?? join(homedir$1(), ".overdeck", "agents");
37493
37511
  const latestReviewRunDir = await findLatestReviewRunDir(opts.workspacePath, opts.issueId);
37494
37512
  return await Promise.all(CONVOY_REVIEWER_ROLES.map(async (role) => {
37495
37513
  const sessionId = getReviewerSessionName(role, opts.projectKey, opts.issueId);
37496
37514
  const isLive = opts.tmuxSessionNames.has(sessionId);
37497
37515
  const roundMetadata = await readReviewerRounds(sessionId, agentsRoot);
37498
37516
  const jsonlPath = await resolveJsonlPath(sessionId, opts.workspacePath ?? opts.projectPath, { agentsDirOverride: opts.agentsDirOverride });
37499
- const latestRunOutputExists = latestReviewRunDir ? existsSync$1(join$1(latestReviewRunDir, `${role}.md`)) : false;
37517
+ const latestRunOutputExists = latestReviewRunDir ? existsSync$1(join(latestReviewRunDir, `${role}.md`)) : false;
37500
37518
  const inProgressThisRound = isLive && latestReviewRunDir !== null && !latestRunOutputExists;
37501
37519
  const latestRoundDone = roundMetadata?.latestStatus === "completed" || roundMetadata?.latestStatus === "failed";
37502
37520
  const isZombie = isLive && latestRoundDone && !inProgressThisRound;
@@ -37592,7 +37610,7 @@ function setProjectPathCache(issuePrefix, path) {
37592
37610
  return path;
37593
37611
  }
37594
37612
  function getProjectPath$1(issuePrefix) {
37595
- if (!issuePrefix) return join$1(homedir$1(), "Projects");
37613
+ if (!issuePrefix) return join(homedir$1(), "Projects");
37596
37614
  const cached = projectPathCache.get(issuePrefix);
37597
37615
  if (cached) return cached;
37598
37616
  const resolved = resolveProjectFromIssueSync(`${issuePrefix}-1`);
@@ -37601,13 +37619,13 @@ function getProjectPath$1(issuePrefix) {
37601
37619
  if (config) {
37602
37620
  for (const { owner, repo, prefix } of config.repos) if ((prefix || repo.toUpperCase().replace(/-CLI$/, "").replace(/-/g, "")).toUpperCase() === issuePrefix.toUpperCase()) {
37603
37621
  for (const path of [
37604
- join$1(homedir$1(), "Projects", repo),
37605
- join$1(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
37606
- join$1(homedir$1(), "Projects", owner, repo)
37622
+ join(homedir$1(), "Projects", repo),
37623
+ join(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
37624
+ join(homedir$1(), "Projects", owner, repo)
37607
37625
  ]) if (existsSync$1(path)) return setProjectPathCache(issuePrefix, path);
37608
37626
  }
37609
37627
  }
37610
- return setProjectPathCache(issuePrefix, join$1(homedir$1(), "Projects"));
37628
+ return setProjectPathCache(issuePrefix, join(homedir$1(), "Projects"));
37611
37629
  }
37612
37630
  const readJsonBody$12 = Effect.gen(function* () {
37613
37631
  const text = yield* (yield* HttpServerRequest.HttpServerRequest).text;
@@ -37653,18 +37671,18 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37653
37671
  } catch {}
37654
37672
  const sections = [];
37655
37673
  const projectPath = getProjectPath$1(issuePrefix);
37656
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
37674
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
37657
37675
  const agentId = `agent-${issueLower}`;
37658
37676
  const planningAgentId = `planning-${issueLower}`;
37659
37677
  const knowledgeAgentId = `agent-${issueLower}-knowledge`;
37660
- const agentsDir = join$1(homedir$1(), ".overdeck", "agents");
37678
+ const agentsDir = join(homedir$1(), ".overdeck", "agents");
37661
37679
  let hasPlanningSection = false;
37662
37680
  for (const checkId of [
37663
37681
  planningAgentId,
37664
37682
  agentId,
37665
37683
  knowledgeAgentId
37666
37684
  ]) {
37667
- const agentDir = join$1(agentsDir, checkId);
37685
+ const agentDir = join(agentsDir, checkId);
37668
37686
  if (!await pathExists$4(agentDir)) continue;
37669
37687
  const state = getAgentStateSync(checkId);
37670
37688
  if (!state) continue;
@@ -37680,11 +37698,11 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37680
37698
  transcriptFromPane = transcript.length > 0;
37681
37699
  } catch {}
37682
37700
  if (!isPlanning && !transcript) {
37683
- const logText = await readOptional$2(join$1(agentDir, "output.log"));
37701
+ const logText = await readOptional$2(join(agentDir, "output.log"));
37684
37702
  if (logText) transcript = logText;
37685
37703
  }
37686
37704
  if (isPlanning && !transcript) {
37687
- const continueText = await readOptional$2(join$1(join$1(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`, PAN_DIRNAME), PAN_CONTINUE_FILENAME));
37705
+ const continueText = await readOptional$2(join(join(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`, PAN_DIRNAME), PAN_CONTINUE_FILENAME));
37688
37706
  if (continueText) transcript = `PLANNING COMPLETE\n\n${continueText}`;
37689
37707
  }
37690
37708
  }
@@ -37716,7 +37734,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37716
37734
  } catch {}
37717
37735
  }
37718
37736
  if (!hasPlanningSection) {
37719
- const continuePath = join$1(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
37737
+ const continuePath = join(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
37720
37738
  const continueText = await readOptional$2(continuePath);
37721
37739
  if (continueText) {
37722
37740
  const fileStat = await stat$1(continuePath).catch(() => null);
@@ -37737,7 +37755,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37737
37755
  }
37738
37756
  const centralStatus = getReviewStatusSync(issueId.toUpperCase());
37739
37757
  if (centralStatus?.history && centralStatus.history.length > 0) {
37740
- const tasksDir = join$1(homedir$1(), ".overdeck", "specialists", "tasks");
37758
+ const tasksDir = join(homedir$1(), ".overdeck", "specialists", "tasks");
37741
37759
  const taskFilesByType = {
37742
37760
  review: [],
37743
37761
  test: [],
@@ -37749,7 +37767,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37749
37767
  if (await pathExists$4(tasksDir)) {
37750
37768
  const filenames = (await readdir(tasksDir).catch(() => [])).filter((f) => f.endsWith(".md"));
37751
37769
  await Promise.all(filenames.map(async (f) => {
37752
- const content = await readOptional$2(join$1(tasksDir, f));
37770
+ const content = await readOptional$2(join(tasksDir, f));
37753
37771
  if (content) taskFileContents.set(f, content);
37754
37772
  }));
37755
37773
  }
@@ -37967,9 +37985,9 @@ async function fetchPlanningData(issueId, options = {}) {
37967
37985
  const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
37968
37986
  const summaryOnly = options.summaryOnly ?? false;
37969
37987
  const projectPath = getProjectPath$1(issuePrefix);
37970
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
37971
- const planningDir = join$1(workspacePath, PAN_DIRNAME);
37972
- const panContinuePath = join$1(planningDir, PAN_CONTINUE_FILENAME);
37988
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
37989
+ const planningDir = join(workspacePath, PAN_DIRNAME);
37990
+ const panContinuePath = join(planningDir, PAN_CONTINUE_FILENAME);
37973
37991
  const result = {
37974
37992
  hasPrd: false,
37975
37993
  hasState: false,
@@ -37986,7 +38004,7 @@ async function fetchPlanningData(issueId, options = {}) {
37986
38004
  return a.localeCompare(b);
37987
38005
  })[0];
37988
38006
  if (!firstMarkdown) return void 0;
37989
- return await readOptional$2(join$1(loc.path, firstMarkdown)) ?? void 0;
38007
+ return await readOptional$2(join(loc.path, firstMarkdown)) ?? void 0;
37990
38008
  };
37991
38009
  const hasPlanningDir = await pathExists$4(planningDir);
37992
38010
  const hasPanContinue = await pathExists$4(panContinuePath);
@@ -38025,9 +38043,9 @@ async function fetchPlanningData(issueId, options = {}) {
38025
38043
  return result;
38026
38044
  }
38027
38045
  result.state = await readOptional$2(panContinuePath) ?? void 0;
38028
- result.inference = hasPlanningDir ? await readOptional$2(join$1(planningDir, "INFERENCE.md")) ?? void 0 : void 0;
38046
+ result.inference = hasPlanningDir ? await readOptional$2(join(planningDir, "INFERENCE.md")) ?? void 0 : void 0;
38029
38047
  result.hasState = Boolean(result.state);
38030
- const statusReviewPath = join$1(planningDir, "STATUS_REVIEW.md");
38048
+ const statusReviewPath = join(planningDir, "STATUS_REVIEW.md");
38031
38049
  const statusReview = await readOptional$2(statusReviewPath);
38032
38050
  if (statusReview) {
38033
38051
  result.statusReview = statusReview;
@@ -38050,13 +38068,13 @@ async function fetchPlanningData(issueId, options = {}) {
38050
38068
  result.hasPrd = Boolean(result.prd);
38051
38069
  const listArtifactFiles = async (subdir) => {
38052
38070
  if (!hasPlanningDir) return [];
38053
- const dirPath = join$1(planningDir, subdir);
38071
+ const dirPath = join(planningDir, subdir);
38054
38072
  if (!await pathExists$4(dirPath)) return [];
38055
38073
  const files = (await readdir(dirPath).catch(() => [])).filter((f) => f.endsWith(".md") || f.endsWith(".txt"));
38056
38074
  return (await Promise.all(files.map(async (filename) => {
38057
38075
  return {
38058
38076
  filename,
38059
- mtime: (await stat$1(join$1(dirPath, filename)).catch(() => null))?.mtime.toISOString() ?? (/* @__PURE__ */ new Date()).toISOString()
38077
+ mtime: (await stat$1(join(dirPath, filename)).catch(() => null))?.mtime.toISOString() ?? (/* @__PURE__ */ new Date()).toISOString()
38060
38078
  };
38061
38079
  }))).sort((a, b) => new Date(b.mtime).getTime() - new Date(a.mtime).getTime());
38062
38080
  };
@@ -38065,7 +38083,7 @@ async function fetchPlanningData(issueId, options = {}) {
38065
38083
  return await Promise.all(files.map(async ({ filename, mtime }) => {
38066
38084
  return {
38067
38085
  filename,
38068
- content: await readOptional$2(join$1(planningDir, subdir, filename)) ?? "",
38086
+ content: await readOptional$2(join(planningDir, subdir, filename)) ?? "",
38069
38087
  [dateField]: mtime
38070
38088
  };
38071
38089
  }));
@@ -38138,9 +38156,9 @@ const postMissionControlStatusReviewRoute = HttpRouter.add("POST", "/api/command
38138
38156
  })));
38139
38157
  async function generateStatusReview(issueId) {
38140
38158
  const issueLower = issueId.toLowerCase();
38141
- const workspacePath = join$1(getProjectPath$1(extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`);
38142
- const planningDir = join$1(workspacePath, PAN_DIRNAME);
38143
- const panContinuePath = join$1(planningDir, PAN_CONTINUE_FILENAME);
38159
+ const workspacePath = join(getProjectPath$1(extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`);
38160
+ const planningDir = join(workspacePath, PAN_DIRNAME);
38161
+ const panContinuePath = join(planningDir, PAN_CONTINUE_FILENAME);
38144
38162
  if (!await pathExists$4(planningDir) && !await pathExists$4(panContinuePath)) return {
38145
38163
  type: "err",
38146
38164
  response: { error: "No planning state found" },
@@ -38148,11 +38166,11 @@ async function generateStatusReview(issueId) {
38148
38166
  };
38149
38167
  const state = await readOptional$2(panContinuePath);
38150
38168
  const readPlanningSubdir = async (subdir, limit = 5, maxPerFile = 2e3) => {
38151
- const dirPath = join$1(planningDir, subdir);
38169
+ const dirPath = join(planningDir, subdir);
38152
38170
  if (!await pathExists$4(dirPath)) return "";
38153
38171
  const files = (await readdir(dirPath).catch(() => [])).filter((f) => f.endsWith(".md") || f.endsWith(".txt"));
38154
38172
  return (await Promise.all(files.slice(0, limit).map(async (file) => {
38155
- const content = await readOptional$2(join$1(dirPath, file));
38173
+ const content = await readOptional$2(join(dirPath, file));
38156
38174
  return content ? `\n### ${file}\n${content.slice(0, maxPerFile)}\n` : "";
38157
38175
  }))).join("");
38158
38176
  };
@@ -38224,8 +38242,8 @@ async function generateStatusReview(issueId) {
38224
38242
  testStatus
38225
38243
  ].filter(Boolean).join("|")).digest("hex");
38226
38244
  await mkdir(planningDir, { recursive: true });
38227
- const hashPath = join$1(planningDir, ".status-review-hash");
38228
- const statusReviewPath = join$1(planningDir, "STATUS_REVIEW.md");
38245
+ const hashPath = join(planningDir, ".status-review-hash");
38246
+ const statusReviewPath = join(planningDir, "STATUS_REVIEW.md");
38229
38247
  const [savedHash, cachedReview] = await Promise.all([readOptional$2(hashPath), readOptional$2(statusReviewPath)]);
38230
38248
  if (savedHash?.trim() === contentHash && cachedReview) {
38231
38249
  const fileStat = await stat$1(statusReviewPath).catch(() => null);
@@ -38287,8 +38305,8 @@ Be specific: reference actual file names, function names, requirement text, disc
38287
38305
  const statusModelId = (loadSettingsApi().models?.overrides)?.["status-review"] || "claude-sonnet-5";
38288
38306
  const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
38289
38307
  const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
38290
- const promptFile = join$1(planningDir, ".status-review-prompt.tmp");
38291
- const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-BOnRq5XK.js");
38308
+ const promptFile = join(planningDir, ".status-review-prompt.tmp");
38309
+ const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-JjK6izqX.js");
38292
38310
  let providerEnvStr = "";
38293
38311
  let providerEnv = {};
38294
38312
  const statusProvider = getProviderForModelSync(statusModelId);
@@ -38376,17 +38394,17 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
38376
38394
  safeName = safeName.replace(/\.vtt$/, ".md");
38377
38395
  }
38378
38396
  const ext = safeName.endsWith(".md") || safeName.endsWith(".txt") ? "" : ".md";
38379
- const dirPath = join$1(join$1(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`), PAN_DIRNAME, type === "transcript" ? "transcripts" : "notes");
38397
+ const dirPath = join(join(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`), PAN_DIRNAME, type === "transcript" ? "transcripts" : "notes");
38380
38398
  yield* Effect.tryPromise({
38381
38399
  try: async () => {
38382
38400
  await mkdir(dirPath, { recursive: true });
38383
- await writeFile(join$1(dirPath, safeName + ext), processedContent, "utf-8");
38401
+ await writeFile(join(dirPath, safeName + ext), processedContent, "utf-8");
38384
38402
  },
38385
38403
  catch: (err) => new Error(err instanceof Error ? err.message : String(err))
38386
38404
  });
38387
38405
  return jsonResponse({
38388
38406
  success: true,
38389
- path: join$1(dirPath, safeName + ext)
38407
+ path: join(dirPath, safeName + ext)
38390
38408
  });
38391
38409
  })));
38392
38410
  const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/command-deck/planning/:issueId/sync-discussions", httpHandler(Effect.gen(function* () {
@@ -38402,7 +38420,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38402
38420
  "linear",
38403
38421
  "rally"
38404
38422
  ].includes(tracker)) return jsonResponse({ error: "tracker must be github, linear, or rally" }, { status: 400 });
38405
- const discussionsDir = join$1(join$1(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`), PAN_DIRNAME, "discussions");
38423
+ const discussionsDir = join(join(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`), PAN_DIRNAME, "discussions");
38406
38424
  yield* Effect.tryPromise({
38407
38425
  try: () => mkdir(discussionsDir, { recursive: true }),
38408
38426
  catch: (err) => new Error(err instanceof Error ? err.message : String(err))
@@ -38429,7 +38447,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38429
38447
  });
38430
38448
  if (stdout.trim()) {
38431
38449
  const filename = `github-${issueId}-comments.md`;
38432
- await writeFile(join$1(discussionsDir, filename), `# GitHub Comments for ${issueId}\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + stdout, "utf-8");
38450
+ await writeFile(join(discussionsDir, filename), `# GitHub Comments for ${issueId}\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + stdout, "utf-8");
38433
38451
  syncedFiles.push(filename);
38434
38452
  }
38435
38453
  } catch (err) {
@@ -38468,7 +38486,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38468
38486
  });
38469
38487
  if (prComments.trim()) {
38470
38488
  const filename = `pr-${prNum}-discussion.md`;
38471
- await writeFile(join$1(discussionsDir, filename), `# PR #${prNum} Discussion\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + prComments, "utf-8");
38489
+ await writeFile(join(discussionsDir, filename), `# PR #${prNum} Discussion\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + prComments, "utf-8");
38472
38490
  syncedFiles.push(filename);
38473
38491
  }
38474
38492
  } catch {}
@@ -38482,7 +38500,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38482
38500
  const filename = `linear-${issueId}-comments.md`;
38483
38501
  const commentBody = comments.map((c) => `## ${c.author} (${c.createdAt})\n\n${c.body}\n\n---\n`).join("\n");
38484
38502
  yield* Effect.tryPromise({
38485
- try: () => writeFile(join$1(discussionsDir, filename), `# Linear Comments for ${issueId}\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + commentBody, "utf-8"),
38503
+ try: () => writeFile(join(discussionsDir, filename), `# Linear Comments for ${issueId}\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + commentBody, "utf-8"),
38486
38504
  catch: (err) => new Error(String(err))
38487
38505
  });
38488
38506
  syncedFiles.push(filename);
@@ -38523,7 +38541,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38523
38541
  lines.push("");
38524
38542
  }
38525
38543
  yield* Effect.tryPromise({
38526
- try: () => writeFile(join$1(discussionsDir, filename), lines.join("\n"), "utf-8"),
38544
+ try: () => writeFile(join(discussionsDir, filename), lines.join("\n"), "utf-8"),
38527
38545
  catch: (err) => new Error(String(err))
38528
38546
  });
38529
38547
  syncedFiles.push(filename);
@@ -38542,16 +38560,16 @@ const postMissionControlPlanningInitRoute = HttpRouter.add("POST", "/api/command
38542
38560
  const eventStore = yield* EventStoreService;
38543
38561
  const { shadow } = body;
38544
38562
  const issueLower = issueId.toLowerCase();
38545
- const planningDir = join$1(join$1(getProjectPath$1(extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`), PAN_DIRNAME);
38563
+ const planningDir = join(join(getProjectPath$1(extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`), PAN_DIRNAME);
38546
38564
  yield* Effect.tryPromise({
38547
38565
  try: async () => {
38548
38566
  await Promise.all([
38549
38567
  "transcripts",
38550
38568
  "discussions",
38551
38569
  "notes"
38552
- ].map((subdir) => mkdir(join$1(planningDir, subdir), { recursive: true })));
38570
+ ].map((subdir) => mkdir(join(planningDir, subdir), { recursive: true })));
38553
38571
  if (shadow) {
38554
- const inferencePath = join$1(planningDir, "INFERENCE.md");
38572
+ const inferencePath = join(planningDir, "INFERENCE.md");
38555
38573
  if (!await pathExists$4(inferencePath)) await writeFile(inferencePath, `# Inference Document - ${issueId}\n\n*This document is maintained by the Shadow Engineering Monitoring Agent.*\n\n## Status\n\nAwaiting initial artifact analysis.\n\n## Understanding\n\n(pending)\n\n## Gaps & Risks\n\n(pending)\n`, "utf-8");
38556
38574
  }
38557
38575
  },
@@ -38602,7 +38620,7 @@ init_config$1();
38602
38620
  init_domain_services();
38603
38621
  async function loadRemoteWorkspaceMetadata(issueId) {
38604
38622
  const normalizedId = issueId.toLowerCase().replace(/[^a-z0-9-]/g, "-");
38605
- const content = await readFile(join$1(homedir$1(), ".overdeck", "workspaces", `${normalizedId}.yaml`), "utf-8").catch(() => null);
38623
+ const content = await readFile(join(homedir$1(), ".overdeck", "workspaces", `${normalizedId}.yaml`), "utf-8").catch(() => null);
38606
38624
  if (!content) return null;
38607
38625
  try {
38608
38626
  return import_dist.parse(content);
@@ -38611,11 +38629,11 @@ async function loadRemoteWorkspaceMetadata(issueId) {
38611
38629
  }
38612
38630
  }
38613
38631
  async function listRemoteWorkspaceMetadata() {
38614
- const workspacesDir = join$1(homedir$1(), ".overdeck", "workspaces");
38632
+ const workspacesDir = join(homedir$1(), ".overdeck", "workspaces");
38615
38633
  const yamlFiles = (await readdir(workspacesDir).catch(() => [])).filter((f) => f.endsWith(".yaml"));
38616
38634
  const workspaces = [];
38617
38635
  for (const file of yamlFiles) {
38618
- const content = await readFile(join$1(workspacesDir, file), "utf-8").catch(() => null);
38636
+ const content = await readFile(join(workspacesDir, file), "utf-8").catch(() => null);
38619
38637
  if (!content) continue;
38620
38638
  try {
38621
38639
  const metadata = import_dist.parse(content);
@@ -38851,8 +38869,8 @@ async function pathExists$3(filePath) {
38851
38869
  async function findProjectRootAsync(startDir = process.cwd()) {
38852
38870
  let currentDir = startDir;
38853
38871
  while (true) {
38854
- if (await pathExists$3(join$1(currentDir, ".git"))) return currentDir;
38855
- const parent = dirname$1(currentDir);
38872
+ if (await pathExists$3(join(currentDir, ".git"))) return currentDir;
38873
+ const parent = dirname(currentDir);
38856
38874
  if (parent === currentDir) return null;
38857
38875
  currentDir = parent;
38858
38876
  }
@@ -38868,9 +38886,9 @@ function stripProjectTtsEndpoint(config) {
38868
38886
  async function readProjectConfig() {
38869
38887
  const projectRoot = await findProjectRootAsync();
38870
38888
  if (!projectRoot) return null;
38871
- const configPath = join$1(projectRoot, ".pan.yaml");
38889
+ const configPath = join(projectRoot, ".pan.yaml");
38872
38890
  if (await pathExists$3(configPath)) return stripProjectTtsEndpoint(await readYamlConfig(configPath));
38873
- const legacyConfigPath = join$1(projectRoot, ".overdeck.yaml");
38891
+ const legacyConfigPath = join(projectRoot, ".overdeck.yaml");
38874
38892
  if (await pathExists$3(legacyConfigPath)) return stripProjectTtsEndpoint(await readYamlConfig(legacyConfigPath));
38875
38893
  return null;
38876
38894
  }
@@ -38888,13 +38906,13 @@ init_paths();
38888
38906
  init_config_yaml();
38889
38907
  init_errors();
38890
38908
  const execFileAsync$3 = promisify(execFile);
38891
- const QWEN_TTS_PID_PATH = join$1(OVERDECK_HOME, "pids", "qwen-tts.pid");
38892
- const QWEN_TTS_STATE_PATH = join$1(OVERDECK_HOME, "pids", "qwen-tts.json");
38893
- const QWEN_TTS_START_LOCK_PATH = join$1(OVERDECK_HOME, "pids", "qwen-tts.start.lock");
38894
- const QWEN_TTS_MANUAL_STOP_PATH = join$1(OVERDECK_HOME, "pids", "qwen-tts.manual-stop");
38895
- const QWEN_TTS_AUTH_TOKEN_PATH = join$1(OVERDECK_HOME, "secrets", "qwen-tts.token");
38909
+ const QWEN_TTS_PID_PATH = join(OVERDECK_HOME, "pids", "qwen-tts.pid");
38910
+ const QWEN_TTS_STATE_PATH = join(OVERDECK_HOME, "pids", "qwen-tts.json");
38911
+ const QWEN_TTS_START_LOCK_PATH = join(OVERDECK_HOME, "pids", "qwen-tts.start.lock");
38912
+ const QWEN_TTS_MANUAL_STOP_PATH = join(OVERDECK_HOME, "pids", "qwen-tts.manual-stop");
38913
+ const QWEN_TTS_AUTH_TOKEN_PATH = join(OVERDECK_HOME, "secrets", "qwen-tts.token");
38896
38914
  const QWEN_TTS_AUTH_HEADER = "X-Overdeck-TTS-Token";
38897
- const QWEN_TTS_LOG_PATH = join$1(LOGS_DIR, "qwen-tts.log");
38915
+ const QWEN_TTS_LOG_PATH = join(LOGS_DIR, "qwen-tts.log");
38898
38916
  const GPU_MEMORY_CACHE_TTL_MS = 3e4;
38899
38917
  const DEFAULT_TTS_DAEMON_STARTUP_GRACE_MS = 30 * 6e4;
38900
38918
  let gpuMemoryCache = null;
@@ -38908,21 +38926,21 @@ async function pathExists$2(path) {
38908
38926
  }
38909
38927
  }
38910
38928
  async function resolveQwenTtsPackageDirPromise() {
38911
- const candidates = [join$1(packageRoot, "packages", "qwen-tts-linux-x64"), join$1(packageRoot, "node_modules", "qwen-tts-linux-x64")];
38929
+ const candidates = [join(packageRoot, "packages", "qwen-tts-linux-x64"), join(packageRoot, "node_modules", "qwen-tts-linux-x64")];
38912
38930
  for (const candidate of candidates) if (await pathExists$2(candidate)) return candidate;
38913
38931
  await mkdir(candidates[0], { recursive: true });
38914
38932
  return candidates[0];
38915
38933
  }
38916
38934
  async function resolveTtsDaemonScriptPromise() {
38917
- const script = join$1(SYNC_SOURCES.skills, "pan-tts", "scripts", "tts_daemon.py");
38935
+ const script = join(SYNC_SOURCES.skills, "pan-tts", "scripts", "tts_daemon.py");
38918
38936
  if (await pathExists$2(script)) return script;
38919
38937
  throw new Error(`Qwen TTS daemon script not found at ${script}`);
38920
38938
  }
38921
38939
  async function getTtsDaemonVenvDirPromise() {
38922
- return join$1(await Effect.runPromise(resolveQwenTtsPackageDir()), ".venv");
38940
+ return join(await Effect.runPromise(resolveQwenTtsPackageDir()), ".venv");
38923
38941
  }
38924
38942
  async function getTtsDaemonPythonPromise() {
38925
- return join$1(await Effect.runPromise(getTtsDaemonVenvDir()), "bin", "python");
38943
+ return join(await Effect.runPromise(getTtsDaemonVenvDir()), "bin", "python");
38926
38944
  }
38927
38945
  async function readState() {
38928
38946
  try {
@@ -38947,7 +38965,7 @@ async function readState() {
38947
38965
  }
38948
38966
  }
38949
38967
  async function writeState(state) {
38950
- await mkdir(dirname$1(QWEN_TTS_PID_PATH), { recursive: true });
38968
+ await mkdir(dirname(QWEN_TTS_PID_PATH), { recursive: true });
38951
38969
  await writeFile(QWEN_TTS_PID_PATH, `${state.pid}\n`, "utf8");
38952
38970
  await writeFile(QWEN_TTS_STATE_PATH, `${JSON.stringify(state, null, 2)}\n`, "utf8");
38953
38971
  }
@@ -38964,7 +38982,7 @@ async function getTtsDaemonAuthTokenPromise() {
38964
38982
  }
38965
38983
  } catch {}
38966
38984
  const token = randomBytes(32).toString("base64url");
38967
- await mkdir(dirname$1(QWEN_TTS_AUTH_TOKEN_PATH), {
38985
+ await mkdir(dirname(QWEN_TTS_AUTH_TOKEN_PATH), {
38968
38986
  recursive: true,
38969
38987
  mode: 448
38970
38988
  });
@@ -39027,7 +39045,7 @@ function buildTtsDaemonEnv(config, authToken) {
39027
39045
  return env;
39028
39046
  }
39029
39047
  async function acquireStartLock() {
39030
- await mkdir(dirname$1(QWEN_TTS_START_LOCK_PATH), { recursive: true });
39048
+ await mkdir(dirname(QWEN_TTS_START_LOCK_PATH), { recursive: true });
39031
39049
  while (true) try {
39032
39050
  await mkdir(QWEN_TTS_START_LOCK_PATH, { mode: 448 });
39033
39051
  return;
@@ -39381,7 +39399,7 @@ const startTtsDaemon = (options) => Effect.tryPromise({
39381
39399
  init_paths();
39382
39400
  init_errors();
39383
39401
  function getTtsVoicesPath() {
39384
- return join(getOverdeckHome(), "tts-voices.json");
39402
+ return join$1(getOverdeckHome(), "tts-voices.json");
39385
39403
  }
39386
39404
  async function loadVoicesPromise() {
39387
39405
  try {
@@ -39394,7 +39412,7 @@ async function loadVoicesPromise() {
39394
39412
  }
39395
39413
  async function saveVoicesPromise(voices) {
39396
39414
  const filePath = getTtsVoicesPath();
39397
- await mkdir$1(dirname(filePath), { recursive: true });
39415
+ await mkdir$1(dirname$1(filePath), { recursive: true });
39398
39416
  await writeFile$1(filePath, `${JSON.stringify(voices, null, 2)}\n`, {
39399
39417
  encoding: "utf-8",
39400
39418
  mode: 384
@@ -39806,7 +39824,7 @@ var ReaddirpStream = class extends Readable {
39806
39824
  this._wantsDir = type ? DIR_TYPES.has(type) : false;
39807
39825
  this._wantsFile = type ? FILE_TYPES.has(type) : false;
39808
39826
  this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;
39809
- this._root = resolve$1(root);
39827
+ this._root = resolve(root);
39810
39828
  this._isDirent = !opts.alwaysStat;
39811
39829
  this._statsProp = this._isDirent ? "dirent" : "stats";
39812
39830
  this._rdOptions = {
@@ -39878,9 +39896,9 @@ var ReaddirpStream = class extends Readable {
39878
39896
  let entry;
39879
39897
  const basename = this._isDirent ? dirent.name : dirent;
39880
39898
  try {
39881
- const fullPath = resolve$1(join$1(path, basename));
39899
+ const fullPath = resolve(join(path, basename));
39882
39900
  entry = {
39883
- path: relative$1(this._root, fullPath),
39901
+ path: relative(this._root, fullPath),
39884
39902
  fullPath,
39885
39903
  basename
39886
39904
  };
@@ -39908,7 +39926,7 @@ var ReaddirpStream = class extends Readable {
39908
39926
  if (entryRealPathStats.isFile()) return "file";
39909
39927
  if (entryRealPathStats.isDirectory()) {
39910
39928
  const len = entryRealPath.length;
39911
- if (full.startsWith(entryRealPath) && full.substr(len, 1) === sep$1) {
39929
+ if (full.startsWith(entryRealPath) && full.substr(len, 1) === sep) {
39912
39930
  const recursiveError = /* @__PURE__ */ new Error(`Circular symlink detected: "${full}" points to "${entryRealPath}"`);
39913
39931
  recursiveError.code = RECURSIVE_ERROR_CODE;
39914
39932
  return this._onError(recursiveError);
@@ -41577,7 +41595,7 @@ function openEmbeddingsDb(dbPath, dimensions, options = {}) {
41577
41595
  if (!Number.isInteger(dimensions) || dimensions <= 0) return unavailable(`Invalid embedding dimensions: ${dimensions}`);
41578
41596
  let db;
41579
41597
  try {
41580
- const dir = dirname$1(dbPath);
41598
+ const dir = dirname(dbPath);
41581
41599
  if (!existsSync$1(dir)) mkdirSync$1(dir, { recursive: true });
41582
41600
  db = openDatabase(dbPath, { allowExtension: true });
41583
41601
  } catch (err) {
@@ -42124,7 +42142,7 @@ async function indexConversationSearch(options = {}) {
42124
42142
  filesScanned: files.length,
42125
42143
  filesIndexed: processed,
42126
42144
  chunksIndexed: result.chunksIndexed,
42127
- currentFile: basename$1(filePath)
42145
+ currentFile: basename(filePath)
42128
42146
  });
42129
42147
  const fileResult = await indexConversationFile({
42130
42148
  ...options,
@@ -42355,7 +42373,7 @@ async function collectJsonlFiles(dir, files, signal) {
42355
42373
  return;
42356
42374
  }
42357
42375
  for (const entry of entries) {
42358
- const path = join$1(dir, entry.name);
42376
+ const path = join(dir, entry.name);
42359
42377
  throwIfAborted(signal);
42360
42378
  if (entry.isDirectory()) await collectJsonlFiles(path, files, signal);
42361
42379
  else if (entry.isFile() && entry.name.endsWith(".jsonl")) files.push(path);
@@ -42383,10 +42401,10 @@ function openIndexerResources(config, options) {
42383
42401
  };
42384
42402
  }
42385
42403
  function defaultConversationRoots$1() {
42386
- return [join$1(homedir$1(), ".claude", "projects")];
42404
+ return [join(homedir$1(), ".claude", "projects")];
42387
42405
  }
42388
42406
  function sessionIdFromPath(filePath) {
42389
- return basename$1(filePath).replace(/\.jsonl$/, "");
42407
+ return basename(filePath).replace(/\.jsonl$/, "");
42390
42408
  }
42391
42409
  function projectIdFromPath(filePath) {
42392
42410
  const parts = filePath.split(/[\\/]+/);
@@ -42583,7 +42601,7 @@ async function syncConversationSearchWatcher(options = {}) {
42583
42601
  return activeWatcher;
42584
42602
  }
42585
42603
  function defaultConversationRoots() {
42586
- return [join$1(homedir$1(), ".claude", "projects")];
42604
+ return [join(homedir$1(), ".claude", "projects")];
42587
42605
  }
42588
42606
  function isAbortError(error) {
42589
42607
  return error instanceof Error && error.name === "AbortError";
@@ -43629,7 +43647,7 @@ const getLegacyImportPreviewRoute = HttpRouter.add("GET", "/api/settings/legacy-
43629
43647
  return yield* Effect.try({
43630
43648
  try: () => {
43631
43649
  const urlPath = new URL(request.url, "http://localhost").searchParams.get("path");
43632
- const defaultPath = join$1(getLegacyHome(), "panopticon.db");
43650
+ const defaultPath = join(getLegacyHome(), "panopticon.db");
43633
43651
  const resolvedPath = urlPath?.trim() || defaultPath;
43634
43652
  const preview = previewLegacyConversations(resolvedPath);
43635
43653
  if (!preview.found) return jsonResponse({
@@ -43981,13 +43999,14 @@ init_projects();
43981
43999
  init_tracker_utils();
43982
44000
  init_tracker_config();
43983
44001
  async function readPackageVersion() {
43984
- let dir = dirname$1(fileURLToPath(import.meta.url));
44002
+ let dir = dirname(fileURLToPath(import.meta.url));
43985
44003
  for (let i = 0; i < 8; i++) {
43986
- const candidate = join$1(dir, "package.json");
44004
+ const candidate = join(dir, "package.json");
43987
44005
  try {
43988
- return JSON.parse(await readFile(candidate, "utf-8")).version;
44006
+ const version = JSON.parse(await readFile(candidate, "utf-8")).version;
44007
+ if (typeof version === "string" && version) return version;
43989
44008
  } catch {}
43990
- const parent = dirname$1(dir);
44009
+ const parent = dirname(dir);
43991
44010
  if (parent === dir) break;
43992
44011
  dir = parent;
43993
44012
  }
@@ -43999,16 +44018,16 @@ async function getOverdeckVersion() {
43999
44018
  return _overdeckVersion;
44000
44019
  }
44001
44020
  const overdeckDevMode = (() => {
44002
- let dir = dirname$1(fileURLToPath(import.meta.url));
44021
+ let dir = dirname(fileURLToPath(import.meta.url));
44003
44022
  for (let i = 0; i < 8; i++) {
44004
- if (existsSync$1(join$1(dir, "package.json")) && existsSync$1(join$1(dir, "src", "dashboard"))) return true;
44005
- const parent = dirname$1(dir);
44023
+ if (existsSync$1(join(dir, "package.json")) && existsSync$1(join(dir, "src", "dashboard"))) return true;
44024
+ const parent = dirname(dir);
44006
44025
  if (parent === dir) break;
44007
44026
  dir = parent;
44008
44027
  }
44009
44028
  return false;
44010
44029
  })();
44011
- const PROJECT_MAPPINGS_FILE = join$1(homedir$1(), ".overdeck", "project-mappings.json");
44030
+ const PROJECT_MAPPINGS_FILE = join(homedir$1(), ".overdeck", "project-mappings.json");
44012
44031
  async function getProjectMappings() {
44013
44032
  try {
44014
44033
  const content = await readFile(PROJECT_MAPPINGS_FILE, "utf-8");
@@ -44018,7 +44037,7 @@ async function getProjectMappings() {
44018
44037
  }
44019
44038
  }
44020
44039
  async function saveProjectMappings(mappings) {
44021
- await mkdir(join$1(homedir$1(), ".overdeck"), { recursive: true });
44040
+ await mkdir(join(homedir$1(), ".overdeck"), { recursive: true });
44022
44041
  await writeFile(PROJECT_MAPPINGS_FILE, JSON.stringify(mappings, null, 2));
44023
44042
  }
44024
44043
  async function getProjectPath(issuePrefix) {
@@ -44185,7 +44204,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
44185
44204
  }, { status: 400 });
44186
44205
  return yield* Effect.promise(async () => {
44187
44206
  try {
44188
- const { RallyRestApi } = await import("./rally-api-CcCdecF-.js");
44207
+ const { RallyRestApi } = await import("./rally-api-BtvwdX6d.js");
44189
44208
  const api = new RallyRestApi({
44190
44209
  apiKey,
44191
44210
  server: server || "https://rally1.rallydev.com"
@@ -44322,13 +44341,13 @@ const getGodviewSystemHealthRoute = HttpRouter.add("GET", "/api/godview/system-h
44322
44341
  })));
44323
44342
  const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.promise(async () => {
44324
44343
  try {
44325
- const agentsDir = join$1(homedir$1(), ".overdeck", "agents");
44344
+ const agentsDir = join(homedir$1(), ".overdeck", "agents");
44326
44345
  if (!existsSync$1(agentsDir)) return jsonResponse([]);
44327
44346
  const agentNames = (await readdir(agentsDir)).filter((name) => name.startsWith("agent-") || name.startsWith("planning-") || name.startsWith("specialist-"));
44328
44347
  const liveSessions = new Set(await Effect.runPromise(listSessionNames()));
44329
44348
  return jsonResponse((await Promise.all(agentNames.map(async (name) => {
44330
44349
  const stateFile = getAgentStateFilePath(name);
44331
- const healthFile = join$1(agentsDir, name, "health.json");
44350
+ const healthFile = join(agentsDir, name, "health.json");
44332
44351
  const healthStatus = await Effect.runPromise(determineHealthStatus(name, stateFile, liveSessions));
44333
44352
  if (!healthStatus) return null;
44334
44353
  let storedHealth = {
@@ -44344,7 +44363,7 @@ const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.
44344
44363
  } catch {}
44345
44364
  let contextPercent = null;
44346
44365
  try {
44347
- const ctxContent = await readFile(join$1(agentsDir, name, "context-pct"), "utf-8");
44366
+ const ctxContent = await readFile(join(agentsDir, name, "context-pct"), "utf-8");
44348
44367
  contextPercent = parseInt(ctxContent.trim(), 10) || null;
44349
44368
  } catch {}
44350
44369
  return {
@@ -44509,18 +44528,18 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
44509
44528
  const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
44510
44529
  return yield* Effect.promise(async () => {
44511
44530
  try {
44512
- const workspacePath = join$1(await getProjectPath(issuePrefix), "workspaces", `feature-${issueLower}`);
44531
+ const workspacePath = join(await getProjectPath(issuePrefix), "workspaces", `feature-${issueLower}`);
44513
44532
  const remoteState = loadRemoteAgentState(sessionName);
44514
44533
  const isRemote = !!remoteState;
44515
44534
  const vmName = remoteState?.vmName ?? "";
44516
- const { getAgentStateSync } = await import("./agents-C-vqmKDi.js");
44535
+ const { getAgentStateSync } = await import("./agents-C4kZ8a2r.js");
44517
44536
  const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
44518
44537
  let tmuxSessionAlive = false;
44519
44538
  if (!isRemote) try {
44520
44539
  tmuxSessionAlive = await Effect.runPromise(sessionExists(sessionName));
44521
44540
  } catch {}
44522
- const panDir = join$1(workspacePath, PAN_DIRNAME);
44523
- const hasPlanningState = existsSync$1(join$1(panDir, "continue.json")) || await Effect.runPromise(findPlan(workspacePath)) !== null;
44541
+ const panDir = join(workspacePath, PAN_DIRNAME);
44542
+ const hasPlanningState = existsSync$1(join(panDir, "continue.json")) || await Effect.runPromise(findPlan(workspacePath)) !== null;
44524
44543
  const hasPromptFile = hasPlanningState;
44525
44544
  const hasCompletionMarker = existsSync$1(panDir) ? await Effect.runPromise(checkPlanStatus(workspacePath, (status) => status === "proposed")) : false;
44526
44545
  const planningCompleted = existsSync$1(panDir) ? await Effect.runPromise(checkPlanStatus(workspacePath, (status) => PLANNING_FINISHED_STATUSES.has(status))) : false;
@@ -44578,8 +44597,8 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
44578
44597
  projectPath = (teamPrefix ? findProjectByTeamSync(teamPrefix) : null)?.path || "";
44579
44598
  }
44580
44599
  if (!projectPath) return jsonResponse({ error: `Could not find project path for ${issueId}. Check projects.yaml.` }, { status: 404 });
44581
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
44582
- const planningDir = join$1(workspacePath, PAN_DIRNAME);
44600
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
44601
+ const planningDir = join(workspacePath, PAN_DIRNAME);
44583
44602
  if (!existsSync$1(planningDir)) return jsonResponse({
44584
44603
  error: "Planning directory not found",
44585
44604
  sessionEnded: true
@@ -44606,7 +44625,7 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
44606
44625
  message: "Message sent to active session"
44607
44626
  });
44608
44627
  }
44609
- const outputFile = join$1(planningDir, "output.jsonl");
44628
+ const outputFile = join(planningDir, "output.jsonl");
44610
44629
  let conversationLog = "";
44611
44630
  const outputContent = await readFile(outputFile, "utf-8").catch(() => null);
44612
44631
  if (outputContent) {
@@ -44620,7 +44639,7 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
44620
44639
  } catch {}
44621
44640
  conversationLog = logParts.join("\n\n");
44622
44641
  }
44623
- const continuationPromptPath = join$1(planningDir, "CONTINUATION_PROMPT.md");
44642
+ const continuationPromptPath = join(planningDir, "CONTINUATION_PROMPT.md");
44624
44643
  await writeFile(continuationPromptPath, `# Continuation of Planning Session: ${issueId.toUpperCase()}
44625
44644
 
44626
44645
  ## CRITICAL: PLANNING ONLY - NO IMPLEMENTATION
@@ -44655,8 +44674,8 @@ ${message}
44655
44674
  Continue the PLANNING session. Do NOT implement anything.
44656
44675
  `);
44657
44676
  const agentCwd = workspacePath;
44658
- if (existsSync$1(outputFile)) await rename(outputFile, join$1(planningDir, `output-${Date.now()}.jsonl`));
44659
- const { getAgentCommandSync } = await import("./settings-vLoKyghx.js");
44677
+ if (existsSync$1(outputFile)) await rename(outputFile, join(planningDir, `output-${Date.now()}.jsonl`));
44678
+ const { getAgentCommandSync } = await import("./settings-DEhYpW0k.js");
44660
44679
  let msgPlanningModel = "claude-sonnet-5";
44661
44680
  try {
44662
44681
  msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
@@ -44664,7 +44683,7 @@ Continue the PLANNING session. Do NOT implement anything.
44664
44683
  const msgAgentCmd = getAgentCommandSync(msgPlanningModel);
44665
44684
  const msgPermissionFlags = getClaudePermissionFlagsStringSync();
44666
44685
  const msgCmdWithArgs = msgAgentCmd.args.length > 0 ? `${msgAgentCmd.command} ${msgAgentCmd.args.join(" ")} ${msgPermissionFlags}` : `${msgAgentCmd.command} ${msgPermissionFlags}`;
44667
- const launcherScript = join$1(agentStateDir, "continuation-launcher.sh");
44686
+ const launcherScript = join(agentStateDir, "continuation-launcher.sh");
44668
44687
  await mkdir(agentStateDir, { recursive: true });
44669
44688
  await writeFile(launcherScript, generateLauncherScriptSync({
44670
44689
  role: "plan",
@@ -44721,11 +44740,11 @@ const planningRouteLayer = Layer.mergeAll(getPlanningStatusRoute, postPlanningMe
44721
44740
  //#region routes/misc/tldr.ts
44722
44741
  init_config_yaml();
44723
44742
  async function getIndexStats(rootPath, isMain) {
44724
- const tldrPath = join$1(rootPath, ".tldr");
44743
+ const tldrPath = join(rootPath, ".tldr");
44725
44744
  if (!await access(tldrPath).then(() => true, () => false)) return {};
44726
44745
  try {
44727
44746
  let indexAge;
44728
- const langContent = await readFile(join$1(tldrPath, "languages.json"), "utf-8").catch(() => null);
44747
+ const langContent = await readFile(join(tldrPath, "languages.json"), "utf-8").catch(() => null);
44729
44748
  if (langContent) {
44730
44749
  const langData = JSON.parse(langContent);
44731
44750
  if (langData.timestamp) {
@@ -44752,7 +44771,7 @@ async function getIndexStats(rootPath, isMain) {
44752
44771
  }
44753
44772
  let fileCount;
44754
44773
  let edgeCount;
44755
- const cgContent = await readFile(join$1(tldrPath, "cache", "call_graph.json"), "utf-8").catch(() => null);
44774
+ const cgContent = await readFile(join(tldrPath, "cache", "call_graph.json"), "utf-8").catch(() => null);
44756
44775
  if (cgContent) {
44757
44776
  const cg = JSON.parse(cgContent);
44758
44777
  edgeCount = Array.isArray(cg.edges) ? cg.edges.length : void 0;
@@ -44777,9 +44796,9 @@ async function getIndexStats(rootPath, isMain) {
44777
44796
  }
44778
44797
  const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
44779
44798
  try {
44780
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CJqGsDFh.js");
44799
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
44781
44800
  const projectRoot = process.cwd();
44782
- const venvPath = join$1(projectRoot, ".venv");
44801
+ const venvPath = join(projectRoot, ".venv");
44783
44802
  const results = [];
44784
44803
  if (existsSync$1(venvPath)) {
44785
44804
  const status = await getTldrDaemonServiceSync(projectRoot, venvPath).getStatus();
@@ -44793,12 +44812,12 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
44793
44812
  ...indexStats
44794
44813
  });
44795
44814
  }
44796
- const workspacesDir = join$1(projectRoot, "workspaces");
44815
+ const workspacesDir = join(projectRoot, "workspaces");
44797
44816
  if (existsSync$1(workspacesDir)) {
44798
44817
  const workspaces = (await readdir(workspacesDir, { withFileTypes: true })).filter((d) => d.isDirectory() && d.name.startsWith("feature-"));
44799
44818
  for (const ws of workspaces) {
44800
- const wsPath = join$1(workspacesDir, ws.name);
44801
- const wsVenvPath = join$1(wsPath, ".venv");
44819
+ const wsPath = join(workspacesDir, ws.name);
44820
+ const wsVenvPath = join(wsPath, ".venv");
44802
44821
  if (existsSync$1(wsVenvPath)) {
44803
44822
  const status = await getTldrDaemonServiceSync(wsPath, wsVenvPath).getStatus();
44804
44823
  const indexStats = getIndexStats(wsPath, false);
@@ -44822,9 +44841,9 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
44822
44841
  }));
44823
44842
  const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
44824
44843
  try {
44825
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CJqGsDFh.js");
44844
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
44826
44845
  const projectRoot = process.cwd();
44827
- const venvPath = join$1(projectRoot, ".venv");
44846
+ const venvPath = join(projectRoot, ".venv");
44828
44847
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
44829
44848
  await getTldrDaemonServiceSync(projectRoot, venvPath).start();
44830
44849
  return jsonResponse({
@@ -44839,9 +44858,9 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
44839
44858
  }));
44840
44859
  const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
44841
44860
  try {
44842
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CJqGsDFh.js");
44861
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
44843
44862
  const projectRoot = process.cwd();
44844
- const venvPath = join$1(projectRoot, ".venv");
44863
+ const venvPath = join(projectRoot, ".venv");
44845
44864
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
44846
44865
  await getTldrDaemonServiceSync(projectRoot, venvPath).stop();
44847
44866
  return jsonResponse({
@@ -44856,24 +44875,24 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
44856
44875
  }));
44857
44876
  const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
44858
44877
  try {
44859
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CJqGsDFh.js");
44878
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
44860
44879
  const enabled = isTldrEnabledSync();
44861
44880
  const projectRoot = process.cwd();
44862
44881
  const targets = [];
44863
- if (existsSync$1(join$1(projectRoot, ".venv"))) targets.push(projectRoot);
44864
- const workspacesDir = join$1(projectRoot, "workspaces");
44882
+ if (existsSync$1(join(projectRoot, ".venv"))) targets.push(projectRoot);
44883
+ const workspacesDir = join(projectRoot, "workspaces");
44865
44884
  if (existsSync$1(workspacesDir)) {
44866
44885
  const workspaces = (await readdir(workspacesDir, { withFileTypes: true })).filter((d) => d.isDirectory() && d.name.startsWith("feature-"));
44867
44886
  for (const ws of workspaces) {
44868
- const wsPath = join$1(workspacesDir, ws.name);
44869
- if (existsSync$1(join$1(wsPath, ".venv"))) targets.push(wsPath);
44887
+ const wsPath = join(workspacesDir, ws.name);
44888
+ if (existsSync$1(join(wsPath, ".venv"))) targets.push(wsPath);
44870
44889
  }
44871
44890
  }
44872
44891
  let restarted = 0;
44873
44892
  let stopped = 0;
44874
44893
  const errors = [];
44875
44894
  for (const wsPath of targets) try {
44876
- const service = getTldrDaemonServiceSync(wsPath, join$1(wsPath, ".venv"));
44895
+ const service = getTldrDaemonServiceSync(wsPath, join(wsPath, ".venv"));
44877
44896
  if (enabled) {
44878
44897
  await service.restart();
44879
44898
  restarted++;
@@ -44914,7 +44933,7 @@ function getIssueDataService$1() {
44914
44933
  return getSharedIssueService();
44915
44934
  }
44916
44935
  const pendingConfirmations = /* @__PURE__ */ new Map();
44917
- const METRICS_FILE = join$1(homedir$1(), ".overdeck", "runtime-metrics.json");
44936
+ const METRICS_FILE = join(homedir$1(), ".overdeck", "runtime-metrics.json");
44918
44937
  async function loadRuntimeMetrics() {
44919
44938
  try {
44920
44939
  const content = await readFile(METRICS_FILE, "utf-8");
@@ -44932,7 +44951,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
44932
44951
  const version = await getOverdeckVersion();
44933
44952
  let supervisorUrl = null;
44934
44953
  try {
44935
- const { getSupervisorUrlSync } = await import("./supervisor-D1-XwmZ7.js");
44954
+ const { getSupervisorUrlSync } = await import("./supervisor-DQMK2e3I.js");
44936
44955
  supervisorUrl = getSupervisorUrlSync();
44937
44956
  } catch {}
44938
44957
  return jsonResponse({
@@ -44941,6 +44960,10 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
44941
44960
  supervisorUrl
44942
44961
  });
44943
44962
  }));
44963
+ const getPrerequisitesRoute = HttpRouter.add("GET", "/api/prerequisites", Effect.promise(async () => {
44964
+ const { checkSystemPrerequisites } = await import("./system-prerequisites-BsI9hxh9.js");
44965
+ return jsonResponse(await checkSystemPrerequisites());
44966
+ }));
44944
44967
  const getRegisteredProjectsRoute = HttpRouter.add("GET", "/api/registered-projects", Effect.try({
44945
44968
  try: () => {
44946
44969
  return jsonResponse(listProjectsSync().map((p) => ({
@@ -44983,10 +45006,10 @@ const getSkillsRoute = HttpRouter.add("GET", "/api/skills", Effect.promise(async
44983
45006
  try {
44984
45007
  const skills = [];
44985
45008
  const skillLocations = [{
44986
- path: join$1(homedir$1(), ".overdeck", "skills"),
45009
+ path: join(homedir$1(), ".overdeck", "skills"),
44987
45010
  source: "overdeck"
44988
45011
  }, {
44989
- path: join$1(homedir$1(), ".claude", "skills"),
45012
+ path: join(homedir$1(), ".claude", "skills"),
44990
45013
  source: "claude"
44991
45014
  }];
44992
45015
  for (const { path: skillsDir, source } of skillLocations) {
@@ -44994,8 +45017,8 @@ const getSkillsRoute = HttpRouter.add("GET", "/api/skills", Effect.promise(async
44994
45017
  const entries = await readdir(skillsDir, { withFileTypes: true });
44995
45018
  for (const entry of entries) {
44996
45019
  if (!entry.isDirectory()) continue;
44997
- const skillPath = join$1(skillsDir, entry.name);
44998
- const skillMdPath = join$1(skillPath, "SKILL.md");
45020
+ const skillPath = join(skillsDir, entry.name);
45021
+ const skillMdPath = join(skillPath, "SKILL.md");
44999
45022
  const hasSkillMd = await access(skillMdPath).then(() => true, () => false);
45000
45023
  let description;
45001
45024
  if (hasSkillMd) try {
@@ -45094,9 +45117,9 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
45094
45117
  return yield* Effect.promise(async () => {
45095
45118
  try {
45096
45119
  const projectPath = await getProjectPath(issuePrefix);
45097
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
45120
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
45098
45121
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
45099
- const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-Ba1D0QUN.js");
45122
+ const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-BRxnVSDk.js");
45100
45123
  const config = {
45101
45124
  issueId,
45102
45125
  workspacePath,
@@ -45122,11 +45145,11 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
45122
45145
  return yield* Effect.promise(async () => {
45123
45146
  try {
45124
45147
  const projectPath = await getProjectPath(issuePrefix);
45125
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
45148
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
45126
45149
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
45127
45150
  const ghConfig = getGitHubConfig();
45128
45151
  if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
45129
- const { runObserverCycle } = await import("./shadow-engineering-Ba1D0QUN.js");
45152
+ const { runObserverCycle } = await import("./shadow-engineering-BRxnVSDk.js");
45130
45153
  const firstRepo = ghConfig.repos[0];
45131
45154
  const config = {
45132
45155
  issueId,
@@ -45145,10 +45168,10 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
45145
45168
  });
45146
45169
  }));
45147
45170
  const overdeckProjectRoot = (() => {
45148
- let dir = dirname$1(fileURLToPath(import.meta.url));
45171
+ let dir = dirname(fileURLToPath(import.meta.url));
45149
45172
  for (let i = 0; i < 8; i++) {
45150
- if (existsSync$1(join$1(dir, "package.json")) && existsSync$1(join$1(dir, "src", "dashboard"))) return dir;
45151
- const parent = dirname$1(dir);
45173
+ if (existsSync$1(join(dir, "package.json")) && existsSync$1(join(dir, "src", "dashboard"))) return dir;
45174
+ const parent = dirname(dir);
45152
45175
  if (parent === dir) break;
45153
45176
  dir = parent;
45154
45177
  }
@@ -45190,7 +45213,7 @@ const postRestartDashboardRoute = HttpRouter.add("POST", "/api/system/restart-da
45190
45213
  return jsonResponse({ error: "Restart failed: " + (error instanceof Error ? error.message : String(error)) }, { status: 500 });
45191
45214
  }
45192
45215
  }));
45193
- const metaRouteLayer = Layer.mergeAll(getVersionRoute, getRegisteredProjectsRoute, getConfirmationsRoute, postConfirmationRespondRoute, getSkillsRoute, getCacheStatusRoute, clearCacheRoute, getMetricsRuntimesRoute, getMetricsTasksRoute, postShadowMonitorRoute, postShadowObserveRoute, postDevRebuildRoute, postRestartDashboardRoute);
45216
+ const metaRouteLayer = Layer.mergeAll(getVersionRoute, getPrerequisitesRoute, getRegisteredProjectsRoute, getConfirmationsRoute, postConfirmationRespondRoute, getSkillsRoute, getCacheStatusRoute, clearCacheRoute, getMetricsRuntimesRoute, getMetricsTasksRoute, postShadowMonitorRoute, postShadowObserveRoute, postDevRebuildRoute, postRestartDashboardRoute);
45194
45217
  //#endregion
45195
45218
  //#region routes/misc.ts
45196
45219
  /**
@@ -46006,7 +46029,7 @@ const paletteRouteLayer = Layer.mergeAll(getPaletteCommandsRoute, getPaletteSear
46006
46029
  */
46007
46030
  const PI_CODEX_PROVIDER = "openai-codex";
46008
46031
  function getOhmypiAuthPath() {
46009
- return join$1(homedir$1(), ".omp", "agent", "auth.json");
46032
+ return join(homedir$1(), ".omp", "agent", "auth.json");
46010
46033
  }
46011
46034
  function readAuthFile() {
46012
46035
  const path = getOhmypiAuthPath();
@@ -46026,7 +46049,7 @@ function readOhmypiCodexCredential() {
46026
46049
  /** Atomically merge a fresh codex credential into auth.json (mode 0600). */
46027
46050
  function writeOhmypiCodexCredential(tokens) {
46028
46051
  const path = getOhmypiAuthPath();
46029
- mkdirSync$1(dirname$1(path), { recursive: true });
46052
+ mkdirSync$1(dirname(path), { recursive: true });
46030
46053
  const auth = readAuthFile();
46031
46054
  const stored = {
46032
46055
  type: "oauth",
@@ -46045,24 +46068,24 @@ function writeOhmypiCodexCredential(tokens) {
46045
46068
  function findOmpBinary() {
46046
46069
  for (const dir of (process.env["PATH"] ?? "").split(delimiter)) {
46047
46070
  if (!dir) continue;
46048
- const candidate = join$1(dir, "omp");
46071
+ const candidate = join(dir, "omp");
46049
46072
  if (existsSync$1(candidate)) return candidate;
46050
46073
  }
46051
46074
  return null;
46052
46075
  }
46053
46076
  /** omp is @oh-my-pi/pi-coding-agent; the oauth submodule path mirrors pi-ai's layout. */
46054
- const OMP_AI_OAUTH_SUBPATH = join$1("@oh-my-pi", "pi-ai", "dist", "utils", "oauth", "openai-codex.js");
46077
+ const OMP_AI_OAUTH_SUBPATH = join("@oh-my-pi", "pi-ai", "dist", "utils", "oauth", "openai-codex.js");
46055
46078
  /**
46056
46079
  * Resolve omp's openai-codex OAuth submodule by walking node_modules upward
46057
46080
  * from the real omp binary. Returns null when not found — the caller degrades
46058
46081
  * gracefully to 'unavailable' status.
46059
46082
  */
46060
46083
  function resolveOmpCodexOAuthFile(ompBin) {
46061
- let dir = dirname$1(realpathSync$1(ompBin));
46084
+ let dir = dirname(realpathSync$1(ompBin));
46062
46085
  for (let i = 0; i < 10; i++) {
46063
- const candidate = join$1(dir, "node_modules", OMP_AI_OAUTH_SUBPATH);
46086
+ const candidate = join(dir, "node_modules", OMP_AI_OAUTH_SUBPATH);
46064
46087
  if (existsSync$1(candidate)) return candidate;
46065
- const parent = dirname$1(dir);
46088
+ const parent = dirname(dir);
46066
46089
  if (parent === dir) break;
46067
46090
  dir = parent;
46068
46091
  }
@@ -46168,11 +46191,11 @@ function assertSafeName(name) {
46168
46191
  if (!/^[a-zA-Z0-9_-]{1,64}$/.test(name)) throw new Error("Invalid conversation name");
46169
46192
  }
46170
46193
  function getConversationAttachmentsRoot() {
46171
- return join$1(getOverdeckHome(), CONVERSATION_ATTACHMENTS_DIR);
46194
+ return join(getOverdeckHome(), CONVERSATION_ATTACHMENTS_DIR);
46172
46195
  }
46173
46196
  function getConversationAttachmentDir(name) {
46174
46197
  assertSafeName(name);
46175
- return join$1(getConversationAttachmentsRoot(), name);
46198
+ return join(getConversationAttachmentsRoot(), name);
46176
46199
  }
46177
46200
  async function ensureConversationAttachmentDir(name) {
46178
46201
  const dir = getConversationAttachmentDir(name);
@@ -46191,10 +46214,10 @@ async function cleanupConversationAttachments(name) {
46191
46214
  * sessions that the lifecycle poller missed. */
46192
46215
  async function cleanupOrphanedConversationAttachments() {
46193
46216
  try {
46194
- const { listConversations } = await import("./conversations-Dcx6LeIh.js");
46217
+ const { listConversations } = await import("./conversations-BmWEluPL.js");
46195
46218
  const convNames = new Set(listConversations().map((c) => c.name));
46196
46219
  const root = getConversationAttachmentsRoot();
46197
- await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join$1(root, entry.name)), 10, (path) => rm(path, {
46220
+ await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join(root, entry.name)), 10, (path) => rm(path, {
46198
46221
  recursive: true,
46199
46222
  force: true
46200
46223
  }).catch(() => {}));
@@ -46203,7 +46226,7 @@ async function cleanupOrphanedConversationAttachments() {
46203
46226
  async function listConversationAttachmentPaths(name) {
46204
46227
  const dir = getConversationAttachmentDir(name);
46205
46228
  try {
46206
- return (await readdir(dir, { withFileTypes: true })).filter((entry) => entry.isFile()).map((entry) => join$1(dir, entry.name));
46229
+ return (await readdir(dir, { withFileTypes: true })).filter((entry) => entry.isFile()).map((entry) => join(dir, entry.name));
46207
46230
  } catch {
46208
46231
  return [];
46209
46232
  }
@@ -46214,7 +46237,7 @@ async function listConversationAttachmentPaths(name) {
46214
46237
  * in the JSONL, not accessing the filesystem. */
46215
46238
  function isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath) {
46216
46239
  try {
46217
- return resolve$1(attachmentPath).startsWith(`${resolvedAttachmentDir}/`);
46240
+ return resolve(attachmentPath).startsWith(`${resolvedAttachmentDir}/`);
46218
46241
  } catch {
46219
46242
  return false;
46220
46243
  }
@@ -46233,7 +46256,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
46233
46256
  try {
46234
46257
  resolvedAttachmentDir = await realpath(getConversationAttachmentDir(name));
46235
46258
  } catch {
46236
- resolvedAttachmentDir = resolve$1(getConversationAttachmentDir(name));
46259
+ resolvedAttachmentDir = resolve(getConversationAttachmentDir(name));
46237
46260
  }
46238
46261
  const referenced = /* @__PURE__ */ new Set();
46239
46262
  const stream = createReadStream$1(sessionFile, { encoding: "utf-8" });
@@ -46258,7 +46281,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
46258
46281
  }
46259
46282
  if (text) {
46260
46283
  for (const attachmentPath of extractConversationAttachmentPaths(text)) if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) {
46261
- referenced.add(basename$1(attachmentPath));
46284
+ referenced.add(basename(attachmentPath));
46262
46285
  structuredFoundPaths = true;
46263
46286
  }
46264
46287
  }
@@ -46272,7 +46295,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
46272
46295
  attachmentPath = rawValue;
46273
46296
  }
46274
46297
  if (typeof attachmentPath === "string" && attachmentPath.startsWith("/")) {
46275
- if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) referenced.add(basename$1(attachmentPath));
46298
+ if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) referenced.add(basename(attachmentPath));
46276
46299
  }
46277
46300
  }
46278
46301
  }
@@ -46307,7 +46330,7 @@ async function cleanupUnreferencedConversationAttachments(conversation) {
46307
46330
  if (freshStats.mtimeMs > sessionMtimeMs) sessionMtimeMs = freshStats.mtimeMs;
46308
46331
  } catch {}
46309
46332
  await runInBatches(attachmentPaths, 10, async (attachmentPath) => {
46310
- if (referencedBasenames.has(basename$1(attachmentPath))) return;
46333
+ if (referencedBasenames.has(basename(attachmentPath))) return;
46311
46334
  try {
46312
46335
  if ((await stat$1(attachmentPath)).mtimeMs >= sessionMtimeMs) return;
46313
46336
  } catch {
@@ -46329,15 +46352,15 @@ async function resolveForContainment(attachmentPath) {
46329
46352
  try {
46330
46353
  return await realpath(attachmentPath);
46331
46354
  } catch {
46332
- let dir = dirname$1(attachmentPath);
46333
- const remaining = [basename$1(attachmentPath)];
46355
+ let dir = dirname(attachmentPath);
46356
+ const remaining = [basename(attachmentPath)];
46334
46357
  while (dir !== "/" && dir !== ".") try {
46335
- return join$1(await realpath(dir), ...remaining);
46358
+ return join(await realpath(dir), ...remaining);
46336
46359
  } catch {
46337
- remaining.unshift(basename$1(dir));
46338
- dir = dirname$1(dir);
46360
+ remaining.unshift(basename(dir));
46361
+ dir = dirname(dir);
46339
46362
  }
46340
- return resolve$1(attachmentPath);
46363
+ return resolve(attachmentPath);
46341
46364
  }
46342
46365
  }
46343
46366
  async function isManagedConversationAttachmentPath(attachmentPath) {
@@ -46350,7 +46373,7 @@ async function isManagedConversationAttachmentPath(attachmentPath) {
46350
46373
  }
46351
46374
  async function isConversationAttachmentPath(name, attachmentPath) {
46352
46375
  try {
46353
- const attachmentDir = resolve$1(getConversationAttachmentDir(name));
46376
+ const attachmentDir = resolve(getConversationAttachmentDir(name));
46354
46377
  return (await resolveForContainment(attachmentPath)).startsWith(`${attachmentDir}/`);
46355
46378
  } catch {
46356
46379
  return false;
@@ -46377,7 +46400,7 @@ function conversationControlPaths(agentId, home) {
46377
46400
  const { agentDir } = ohmypiFifoPaths(agentId, home);
46378
46401
  return {
46379
46402
  agentDir,
46380
- controlDir: join$1(agentDir, "control")
46403
+ controlDir: join(agentDir, "control")
46381
46404
  };
46382
46405
  }
46383
46406
  async function writeConversationControlCommand(agentId, command, home) {
@@ -46387,7 +46410,7 @@ async function writeConversationControlCommand(agentId, command, home) {
46387
46410
  mode: 448
46388
46411
  });
46389
46412
  await chmod(paths.controlDir, 448);
46390
- const finalPath = join$1(paths.controlDir, `${Date.now()}-${command.id}-${randomUUID$1()}.json`);
46413
+ const finalPath = join(paths.controlDir, `${Date.now()}-${command.id}-${randomUUID$1()}.json`);
46391
46414
  const tempPath = `${finalPath}.tmp`;
46392
46415
  await writeFile(tempPath, `${JSON.stringify(command)}\n`, {
46393
46416
  encoding: "utf8",
@@ -46732,7 +46755,7 @@ async function terminatePids(pids) {
46732
46755
  }
46733
46756
  }
46734
46757
  function conversationRuntimeRootPids(conv, rows) {
46735
- const launcherScript = join$1(getOverdeckHome(), "conversations", conv.tmuxSession, "launcher.sh");
46758
+ const launcherScript = join(getOverdeckHome(), "conversations", conv.tmuxSession, "launcher.sh");
46736
46759
  const sessionId = conv.claudeSessionId?.trim();
46737
46760
  const sessionNeedles = sessionId ? [`--resume ${sessionId}`, `--session-id ${sessionId}`] : [];
46738
46761
  const serverPid = findManagedServerPidSync();
@@ -46900,11 +46923,8 @@ async function handleConversationSwitchModel(name, body) {
46900
46923
  sessionAlive: false
46901
46924
  });
46902
46925
  }
46903
- function resolvePtySupervisorScriptPath() {
46904
- return join$1(packageRoot, "dist", "pty-supervisor.js");
46905
- }
46906
46926
  function getPtySupervisorSocketPath(agentId) {
46907
- return join$1(getOverdeckHome(), "sockets", `pty-${agentId}.sock`);
46927
+ return join(getOverdeckHome(), "sockets", `pty-${agentId}.sock`);
46908
46928
  }
46909
46929
  async function waitForPtySupervisorSocket(agentId, timeoutMs = PTY_SUPERVISOR_SOCKET_WAIT_MS) {
46910
46930
  const socketPath = getPtySupervisorSocketPath(agentId);
@@ -46985,9 +47005,9 @@ async function claudeConversationSystemPromptFiles(cwd) {
46985
47005
  return files;
46986
47006
  }
46987
47007
  async function ensurePiConversationSourceContractFile() {
46988
- const contextDir = join$1(getOverdeckHome(), "context");
47008
+ const contextDir = join(getOverdeckHome(), "context");
46989
47009
  await mkdir(contextDir, { recursive: true });
46990
- const path = join$1(contextDir, "pi-conversation-source-contract.md");
47010
+ const path = join(contextDir, "pi-conversation-source-contract.md");
46991
47011
  await writeFile(path, `${PI_CONVERSATION_SOURCE_CONTRACT}\n`, "utf-8");
46992
47012
  return path;
46993
47013
  }
@@ -47016,10 +47036,10 @@ function isNotFound(error) {
47016
47036
  }
47017
47037
  async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model, effort, issueId, resume = false, harness = "claude-code", plainFork = false) {
47018
47038
  const behavior = getHarnessBehavior(harness);
47019
- const stateDir = join$1(getOverdeckHome(), "conversations", tmuxSession);
47039
+ const stateDir = join(getOverdeckHome(), "conversations", tmuxSession);
47020
47040
  await mkdir(stateDir, { recursive: true });
47021
47041
  clearReadySignal(tmuxSession);
47022
- const launcherScript = join$1(stateDir, "launcher.sh");
47042
+ const launcherScript = join(stateDir, "launcher.sh");
47023
47043
  let runtimeCommand = `claude ${getClaudePermissionFlagsStringSync()}`;
47024
47044
  let providerExportsStr = "";
47025
47045
  let piFields;
@@ -47037,7 +47057,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47037
47057
  if (auth.status === "missing" || auth.status === "expired") throw new Error("ohmypi ChatGPT/Codex login (openai-codex) has expired and could not be refreshed. Re-authenticate with `pan pi-auth login`, then retry.");
47038
47058
  }
47039
47059
  const paths = piFifoPaths(tmuxSession);
47040
- const piSessionDir = join$1(paths.agentDir, "sessions");
47060
+ const piSessionDir = join(paths.agentDir, "sessions");
47041
47061
  await mkdir(paths.agentDir, {
47042
47062
  recursive: true,
47043
47063
  mode: 448
@@ -47046,33 +47066,33 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47046
47066
  recursive: true,
47047
47067
  mode: 448
47048
47068
  });
47049
- const storedPiSessionId = resume ? await readFile(join$1(paths.agentDir, "session.id"), "utf-8").then((s) => s.trim()).catch(() => void 0) : void 0;
47069
+ const storedPiSessionId = resume ? await readFile(join(paths.agentDir, "session.id"), "utf-8").then((s) => s.trim()).catch(() => void 0) : void 0;
47050
47070
  piFields = {
47051
47071
  harness: "ohmypi",
47052
47072
  piMode: "tui",
47053
- piExtensionPath: resolveOhmypiExtensionPath() ?? resolve$1(process.cwd(), "packages/ohmypi-extension/dist/index.js"),
47073
+ piExtensionPath: resolveOhmypiExtensionPath() ?? resolve(process.cwd(), "packages/ohmypi-extension/dist/index.js"),
47054
47074
  piSessionDir,
47055
47075
  resumeSessionId: storedPiSessionId || void 0
47056
47076
  };
47057
47077
  } else if (behavior.usesCodexHome) {
47058
- const codexHome = join$1(getOverdeckHome(), "agents", tmuxSession, "codex-home");
47078
+ const codexHome = join(getOverdeckHome(), "agents", tmuxSession, "codex-home");
47059
47079
  const codexPermMode = loadConfigSync().config.codex?.permissionMode ?? "workspace";
47060
47080
  const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
47061
47081
  const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
47062
47082
  const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
47063
- const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-BUZjrnqH.js");
47083
+ const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-CY-QRuU9.js");
47064
47084
  initCodexHome(codexHome, {
47065
47085
  trustedDir: cwd,
47066
47086
  approvalPolicy: codexApprovalPolicy,
47067
47087
  sandboxMode: codexSandboxMode,
47068
47088
  approvalsReviewer: codexApprovalsReviewer
47069
47089
  });
47070
- const resumeSessionId = resume ? await resolveCodexRolloutPath(tmuxSession, { agentsDirOverride: join$1(getOverdeckHome(), "agents") }).then((rollout) => rollout ? extractThreadIdFromRollout(rollout) ?? void 0 : void 0) : void 0;
47090
+ const resumeSessionId = resume ? await resolveCodexRolloutPath(tmuxSession, { agentsDirOverride: join(getOverdeckHome(), "agents") }).then((rollout) => rollout ? extractThreadIdFromRollout(rollout) ?? void 0 : void 0) : void 0;
47071
47091
  codexFields = {
47072
47092
  harness: "codex",
47073
47093
  codexMode: "tui",
47074
47094
  codexHome,
47075
- codexSessionDir: join$1(codexHome, "sessions"),
47095
+ codexSessionDir: join(codexHome, "sessions"),
47076
47096
  resumeSessionId
47077
47097
  };
47078
47098
  }
@@ -47087,12 +47107,11 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47087
47107
  let supervisorScriptPath;
47088
47108
  if (useSupervisor) {
47089
47109
  supervisorScriptPath = resolvePtySupervisorScriptPath();
47090
- if (!existsSync$1(supervisorScriptPath)) throw new Error("pty-supervisor build artifact missing — run `npm run build`.");
47091
47110
  await writePtyToken(tmuxSession);
47092
47111
  }
47093
47112
  let channelsBridgeMcpConfig;
47094
47113
  if (!piFields && !codexFields && !plainFork && isClaudeCodeChannelsEnabled() && (!model || getProviderForModelSync(model).name === "anthropic") && process.env.CLAUDE_CODE_USE_BEDROCK !== "1" && process.env.CLAUDE_CODE_USE_VERTEX !== "1" && process.env.CLAUDE_CODE_USE_FOUNDRY !== "1" && process.env.OVERDECK_DOCKER_WORKSPACE !== "1" && process.env.PAN_DOCKER !== "1") {
47095
- channelsBridgeMcpConfig = join$1(stateDir, "agent-mcp.json");
47114
+ channelsBridgeMcpConfig = join(stateDir, "agent-mcp.json");
47096
47115
  writeBridgeTokenSync(tmuxSession);
47097
47116
  await writeChannelsBridgeMcpConfig(channelsBridgeMcpConfig, tmuxSession);
47098
47117
  }
@@ -47130,7 +47149,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47130
47149
  } catch {}
47131
47150
  console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
47132
47151
  try {
47133
- const { preTrustDirectory } = await import("./workspace-manager-B3PqQQSM.js");
47152
+ const { preTrustDirectory } = await import("./workspace-manager-Cb2a7bg9.js");
47134
47153
  preTrustDirectory(cwd);
47135
47154
  } catch {}
47136
47155
  try {
@@ -47147,7 +47166,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47147
47166
  const codexHomeDir = codexFields.codexHome;
47148
47167
  (async () => {
47149
47168
  try {
47150
- const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-BUZjrnqH.js");
47169
+ const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-CY-QRuU9.js");
47151
47170
  const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
47152
47171
  if (rollout) {
47153
47172
  const threadId = extractThreadIdFromRollout(rollout);
@@ -47627,7 +47646,7 @@ async function getConversationDiffFull(name, deps) {
47627
47646
  const conv = getConversationByName(name);
47628
47647
  if (!conv) return result$1({ error: "Conversation not found" }, 404);
47629
47648
  const cwd = conv.cwd;
47630
- if (existsSync$1(join$1(cwd, ".git"))) {
47649
+ if (existsSync$1(join(cwd, ".git"))) {
47631
47650
  const baseCommit = await Effect.runPromise(findCommitAtTime(cwd, conv.createdAt));
47632
47651
  if (!baseCommit) return result$1({ diff: "" });
47633
47652
  return result$1({ diff: await Effect.runPromise(diffPatchSinceCommit(cwd, baseCommit)) });
@@ -47655,7 +47674,7 @@ async function getConversationDiffTurn(name, turnId, fileFilter, deps) {
47655
47674
  const conv = lookupConversation(name);
47656
47675
  if (!conv) return result$1({ error: "Conversation not found" }, 404);
47657
47676
  const cwd = conv.cwd;
47658
- if (existsSync$1(join$1(cwd, ".git"))) {
47677
+ if (existsSync$1(join(cwd, ".git"))) {
47659
47678
  const baseCommit = await Effect.runPromise(findCommitAtTime(cwd, conv.createdAt));
47660
47679
  if (baseCommit) return result$1({
47661
47680
  turnId,
@@ -48045,10 +48064,10 @@ async function findClaudeSessionFileById$1(sessionId) {
48045
48064
  } else if (Date.now() - cached.ts < SESSION_FILE_MISS_TTL_MS$1) return null;
48046
48065
  }
48047
48066
  try {
48048
- const claudeProjects = join$1(homedir$1(), ".claude", "projects");
48067
+ const claudeProjects = join(homedir$1(), ".claude", "projects");
48049
48068
  const dirs = await readdir(claudeProjects);
48050
48069
  const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
48051
- const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join$1(claudeProjects, dir, `${sessionId}.jsonl`));
48070
+ const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join(claudeProjects, dir, `${sessionId}.jsonl`));
48052
48071
  const STAT_BATCH_SIZE = 50;
48053
48072
  for (let i = 0; i < candidates.length; i += STAT_BATCH_SIZE) {
48054
48073
  const batch = candidates.slice(i, i + STAT_BATCH_SIZE);
@@ -48334,10 +48353,10 @@ async function resolveSpecialistSessionFile(name) {
48334
48353
  try {
48335
48354
  const claudeSessionId = await resolveClaudeSessionId(name);
48336
48355
  if (claudeSessionId && SAFE_SESSION_ID_PATTERN.test(claudeSessionId)) {
48337
- const claudeProjects = join$1(homedir$1(), ".claude", "projects");
48356
+ const claudeProjects = join(homedir$1(), ".claude", "projects");
48338
48357
  const dirs = await readdir(claudeProjects);
48339
48358
  const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
48340
- const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join$1(claudeProjects, dir, `${claudeSessionId}.jsonl`));
48359
+ const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join(claudeProjects, dir, `${claudeSessionId}.jsonl`));
48341
48360
  const STAT_BATCH_SIZE = 50;
48342
48361
  let found = null;
48343
48362
  for (let i = 0; i < candidates.length && !found; i += STAT_BATCH_SIZE) {
@@ -48793,7 +48812,7 @@ function validateImageMagicBytes(bytes, mimeType) {
48793
48812
  function safeUploadExtension(filename, mimeType) {
48794
48813
  const mimeExtension = ALLOWED_UPLOAD_MIME_TYPES.get(mimeType);
48795
48814
  if (!mimeExtension) return "";
48796
- const originalExtension = extname$1(filename).toLowerCase();
48815
+ const originalExtension = extname(filename).toLowerCase();
48797
48816
  return originalExtension === mimeExtension ? originalExtension : mimeExtension;
48798
48817
  }
48799
48818
  async function handleConversationImageUpload(name, filename, bytes, mimeType) {
@@ -48818,7 +48837,7 @@ async function handleConversationImageUpload(name, filename, bytes, mimeType) {
48818
48837
  }
48819
48838
  if (!resolvedDir.startsWith(`${attachmentsRoot}/`)) return jsonResponse({ error: "Invalid attachment path" }, { status: 500 });
48820
48839
  const fileName = `${randomUUID$1()}${extension}`;
48821
- const path = join$1(resolvedDir, fileName);
48840
+ const path = join(resolvedDir, fileName);
48822
48841
  const tmpPath = `${path}.tmp`;
48823
48842
  try {
48824
48843
  await writeFile(tmpPath, bytes);
@@ -48991,10 +49010,10 @@ async function findClaudeSessionFileById(sessionId) {
48991
49010
  } else if (Date.now() - cached.ts < SESSION_FILE_MISS_TTL_MS) return null;
48992
49011
  }
48993
49012
  try {
48994
- const claudeProjects = join$1(homedir$1(), ".claude", "projects");
49013
+ const claudeProjects = join(homedir$1(), ".claude", "projects");
48995
49014
  const dirs = await readdir(claudeProjects);
48996
49015
  const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
48997
- const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join$1(claudeProjects, dir, `${sessionId}.jsonl`));
49016
+ const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join(claudeProjects, dir, `${sessionId}.jsonl`));
48998
49017
  const STAT_BATCH_SIZE = 50;
48999
49018
  for (let i = 0; i < candidates.length; i += STAT_BATCH_SIZE) {
49000
49019
  const batch = candidates.slice(i, i + STAT_BATCH_SIZE);
@@ -50134,18 +50153,18 @@ var DuplicateProjectError = class extends Error {
50134
50153
  }
50135
50154
  };
50136
50155
  function installGitHooksInDir(gitDir) {
50137
- const hooksTarget = join$1(gitDir, "hooks");
50156
+ const hooksTarget = join(gitDir, "hooks");
50138
50157
  let installed = 0;
50139
50158
  if (!existsSync$1(hooksTarget)) mkdirSync$1(hooksTarget, { recursive: true });
50140
50159
  if (!existsSync$1(BUNDLED_HOOKS_DIR)) return 0;
50141
50160
  try {
50142
50161
  const hooks = readdirSync$1(BUNDLED_HOOKS_DIR).filter((f) => {
50143
- const p = join$1(BUNDLED_HOOKS_DIR, f);
50162
+ const p = join(BUNDLED_HOOKS_DIR, f);
50144
50163
  return existsSync$1(p) && statSync$1(p).isFile();
50145
50164
  });
50146
50165
  for (const hook of hooks) {
50147
- const source = join$1(BUNDLED_HOOKS_DIR, hook);
50148
- const target = join$1(hooksTarget, hook);
50166
+ const source = join(BUNDLED_HOOKS_DIR, hook);
50167
+ const target = join(hooksTarget, hook);
50149
50168
  if (existsSync$1(target)) {
50150
50169
  try {
50151
50170
  if (readlinkSync(target) === source) continue;
@@ -50166,7 +50185,7 @@ function installGitHooksInDir(gitDir) {
50166
50185
  */
50167
50186
  async function registerProjectFromPath(opts) {
50168
50187
  const { path: fullPath } = opts;
50169
- const name = opts.name ?? (basename$1(fullPath) || "unknown");
50188
+ const name = opts.name ?? (basename(fullPath) || "unknown");
50170
50189
  const key = name.toLowerCase().replace(/[^a-z0-9-]/g, "-");
50171
50190
  if (!key.replace(/-/g, "")) throw new Error(`Cannot register project: derived key '${key}' from name '${name}' contains no alphanumeric characters`);
50172
50191
  const existing = getProjectSync(key);
@@ -50178,11 +50197,11 @@ async function registerProjectFromPath(opts) {
50178
50197
  registerProjectSync(key, projectConfig);
50179
50198
  const seededContextLayer = ensureProjectLayer(fullPath);
50180
50199
  try {
50181
- const { preTrustDirectorySync } = await import("./workspace-manager-B3PqQQSM.js");
50200
+ const { preTrustDirectorySync } = await import("./workspace-manager-Cb2a7bg9.js");
50182
50201
  preTrustDirectorySync(fullPath);
50183
50202
  } catch {}
50184
50203
  let hooksInstalled = 0;
50185
- const rootGit = join$1(fullPath, ".git");
50204
+ const rootGit = join(fullPath, ".git");
50186
50205
  if (existsSync$1(rootGit)) hooksInstalled = installGitHooksInDir(rootGit);
50187
50206
  return {
50188
50207
  key,
@@ -50214,7 +50233,7 @@ init_pan_dir();
50214
50233
  init_paths();
50215
50234
  const execAsync$2 = promisify(exec);
50216
50235
  async function getIssueDataService() {
50217
- const { getSharedIssueService } = await import("./issue-service-singleton-B8iu_TKV.js");
50236
+ const { getSharedIssueService } = await import("./issue-service-singleton-BC2JLZi7.js");
50218
50237
  return getSharedIssueService();
50219
50238
  }
50220
50239
  /** Returns true if the path exists (any type). */
@@ -50262,7 +50281,7 @@ function getSlotWorkSessionNumber(sessionId, issueLower) {
50262
50281
  function getSessionTreeWorkspacePath(issueLower, baseWorkspacePath, projectPath, sessionId) {
50263
50282
  const slotNumber = getSlotWorkSessionNumber(sessionId, issueLower);
50264
50283
  if (slotNumber === null) return baseWorkspacePath;
50265
- return join$1(projectPath, "workspaces", `feature-${issueLower}-slot-${slotNumber}`);
50284
+ return join(projectPath, "workspaces", `feature-${issueLower}-slot-${slotNumber}`);
50266
50285
  }
50267
50286
  function compareSessionTreeSessionIds(a, b, issueLower) {
50268
50287
  const planningAgentId = `planning-${issueLower}`;
@@ -50314,7 +50333,7 @@ async function readSessionGateFields(sessionId, state = getAgentStateSync(sessio
50314
50333
  }
50315
50334
  async function countQueuedMail(agentId) {
50316
50335
  try {
50317
- return (await readdir(join$1(getAgentDir(agentId), "mail"), { withFileTypes: true })).filter((entry) => entry.isFile() && entry.name.endsWith(".md")).length;
50336
+ return (await readdir(join(getAgentDir(agentId), "mail"), { withFileTypes: true })).filter((entry) => entry.isFile() && entry.name.endsWith(".md")).length;
50318
50337
  } catch {
50319
50338
  return 0;
50320
50339
  }
@@ -50322,7 +50341,7 @@ async function countQueuedMail(agentId) {
50322
50341
  async function collectSessionTreeNodes(issueId, workspacePath, projectPath, context) {
50323
50342
  const issueLower = issueId.toLowerCase();
50324
50343
  const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
50325
- const agentsDir = join$1(getOverdeckHome(), "agents");
50344
+ const agentsDir = join(getOverdeckHome(), "agents");
50326
50345
  const agentId = `agent-${issueLower}`;
50327
50346
  const planningAgentId = `planning-${issueLower}`;
50328
50347
  const strikeAgentId = `strike-${issueLower}`;
@@ -50343,7 +50362,7 @@ async function collectSessionTreeNodes(issueId, workspacePath, projectPath, cont
50343
50362
  }
50344
50363
  for (const sessionName of context.tmuxSessionNames) if (slotWorkSessionPattern.test(sessionName)) candidateSessionIds.add(sessionName);
50345
50364
  for (const checkId of [...candidateSessionIds].sort((a, b) => compareSessionTreeSessionIds(a, b, issueLower))) {
50346
- if (!await pathExists$1(join$1(agentsDir, checkId))) continue;
50365
+ if (!await pathExists$1(join(agentsDir, checkId))) continue;
50347
50366
  const state = getAgentStateSync(checkId);
50348
50367
  if (!state) continue;
50349
50368
  try {
@@ -50380,7 +50399,7 @@ async function collectSessionTreeNodes(issueId, workspacePath, projectPath, cont
50380
50399
  } catch {}
50381
50400
  }
50382
50401
  if (!hasPlanningSection) {
50383
- const panContinuePath = join$1(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
50402
+ const panContinuePath = join(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
50384
50403
  const planningPathForTimestamp = await pathExists$1(panContinuePath) ? panContinuePath : null;
50385
50404
  if (planningPathForTimestamp) {
50386
50405
  const planningStat = await stat$1(planningPathForTimestamp).catch(() => null);
@@ -50533,7 +50552,7 @@ async function fetchProjectSessionTree(projectKey, sharedContext) {
50533
50552
  if (!project) return null;
50534
50553
  const projectPath = project.config.path;
50535
50554
  const workspaceConfig = project.config.workspace;
50536
- const workspacesDir = join$1(projectPath, workspaceConfig?.workspaces_dir || "workspaces");
50555
+ const workspacesDir = join(projectPath, workspaceConfig?.workspaces_dir || "workspaces");
50537
50556
  const effectiveSharedContext = {
50538
50557
  tmuxSessionNames: sharedContext?.tmuxSessionNames ?? new Set((await Effect.runPromise(listSessionNames()).catch(() => [])).filter((s) => s.trim())),
50539
50558
  agentSnapshotsById: sharedContext?.agentSnapshotsById
@@ -50547,12 +50566,12 @@ async function fetchProjectSessionTree(projectKey, sharedContext) {
50547
50566
  issueId: e.name.replace("feature-", "").toUpperCase()
50548
50567
  })).filter((c) => /^[a-z]+-\d+$/.test(c.issueLower));
50549
50568
  const results = await Effect.runPromise(withConcurrencyLimit(featureCandidates.map((c) => Effect.promise(async () => {
50550
- const agentDir = join$1(getOverdeckHome(), "agents", `agent-${c.issueLower}`);
50551
- const panDir = join$1(workspacesDir, c.name, PAN_DIRNAME);
50569
+ const agentDir = join(getOverdeckHome(), "agents", `agent-${c.issueLower}`);
50570
+ const panDir = join(workspacesDir, c.name, PAN_DIRNAME);
50552
50571
  const [hasAgent, hasPlanning] = await Promise.all([pathExists$1(agentDir), pathExists$1(panDir)]);
50553
50572
  if (!hasAgent && !hasPlanning) return null;
50554
50573
  try {
50555
- const workspacePath = join$1(workspacesDir, c.name);
50574
+ const workspacePath = join(workspacesDir, c.name);
50556
50575
  const sessions = await collectSessionTreeNodes(c.issueId, workspacePath, projectPath, effectiveSharedContext);
50557
50576
  if (sessions.length === 0) return null;
50558
50577
  const title = await resolveFeatureTitle(c.issueId, c.issueLower, issueTitles, project);
@@ -50627,7 +50646,7 @@ async function buildHomeGuard() {
50627
50646
  } catch {
50628
50647
  ch = home;
50629
50648
  }
50630
- return (p) => p === ch || p.startsWith(ch.endsWith(sep$1) ? ch : `${ch}${sep$1}`);
50649
+ return (p) => p === ch || p.startsWith(ch.endsWith(sep) ? ch : `${ch}${sep}`);
50631
50650
  }
50632
50651
  const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Effect.gen(function* () {
50633
50652
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
@@ -50639,7 +50658,7 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
50639
50658
  if (body.mode === "existing") {
50640
50659
  const rawPath = body.path;
50641
50660
  if (typeof rawPath !== "string" || !rawPath.trim()) return jsonResponse({ error: "path is required" }, { status: 400 });
50642
- if (!isAbsolute$1(rawPath)) return jsonResponse({ error: "path must be absolute" }, { status: 400 });
50661
+ if (!isAbsolute(rawPath)) return jsonResponse({ error: "path must be absolute" }, { status: 400 });
50643
50662
  const nameOpt = typeof body.name === "string" && body.name.trim() ? body.name.trim() : void 0;
50644
50663
  return yield* Effect.promise(async () => {
50645
50664
  try {
@@ -50680,14 +50699,14 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
50680
50699
  if (typeof rawName !== "string" || !rawName.trim()) return jsonResponse({ error: "name is required for mode=new" }, { status: 400 });
50681
50700
  const rawParent = body.parentDir;
50682
50701
  if (typeof rawParent !== "string" || !rawParent.trim()) return jsonResponse({ error: "parentDir is required for mode=new" }, { status: 400 });
50683
- if (!isAbsolute$1(rawParent)) return jsonResponse({ error: "parentDir must be absolute" }, { status: 400 });
50702
+ if (!isAbsolute(rawParent)) return jsonResponse({ error: "parentDir must be absolute" }, { status: 400 });
50684
50703
  const name = rawName.trim();
50685
50704
  const key = slugify(name);
50686
50705
  if (!key.replace(/-/g, "")) return jsonResponse({ error: "Name must contain at least one alphanumeric character" }, { status: 400 });
50687
50706
  if (getProjectSync(key)) return jsonResponse({ error: `project key '${key}' is already registered` }, { status: 409 });
50688
50707
  return yield* Effect.promise(async () => {
50689
50708
  const withinHome = await buildHomeGuard();
50690
- const rawParentResolved = resolve$1(normalize(rawParent));
50709
+ const rawParentResolved = resolve(normalize(rawParent));
50691
50710
  let probe = rawParentResolved;
50692
50711
  let existingAncestor = null;
50693
50712
  for (;;) {
@@ -50695,15 +50714,15 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
50695
50714
  existingAncestor = await realpath(probe);
50696
50715
  break;
50697
50716
  } catch {}
50698
- const up = dirname$1(probe);
50717
+ const up = dirname(probe);
50699
50718
  if (up === probe) break;
50700
50719
  probe = up;
50701
50720
  }
50702
50721
  if (!existingAncestor || !withinHome(existingAncestor)) return jsonResponse({ error: "parentDir is outside home directory" }, { status: 400 });
50703
- const suffix = relative$1(probe, rawParentResolved);
50704
- const canonicalParent = suffix ? resolve$1(existingAncestor, suffix) : existingAncestor;
50722
+ const suffix = relative(probe, rawParentResolved);
50723
+ const canonicalParent = suffix ? resolve(existingAncestor, suffix) : existingAncestor;
50705
50724
  if (!withinHome(canonicalParent)) return jsonResponse({ error: "parentDir is outside home directory" }, { status: 400 });
50706
- const target = join$1(canonicalParent, key);
50725
+ const target = join(canonicalParent, key);
50707
50726
  let targetExists = false;
50708
50727
  try {
50709
50728
  await access(target);
@@ -50756,14 +50775,14 @@ const execFileAsync$1 = promisify(execFile);
50756
50775
  const decodePreviewRequest = Schema.decodeUnknownSync(ContextPreviewRequest);
50757
50776
  const decodeSaveRequest = Schema.decodeUnknownSync(ContextLayerSaveRequest);
50758
50777
  function globalContextFile(overdeckHome = getOverdeckHome()) {
50759
- return overdeckHome === getOverdeckHome() ? globalContextFile$1() : join$1(overdeckHome, "context", "global.md");
50778
+ return overdeckHome === getOverdeckHome() ? globalContextFile$1() : join(overdeckHome, "context", "global.md");
50760
50779
  }
50761
50780
  function contextDirForFile(file) {
50762
- return dirname$1(file);
50781
+ return dirname(file);
50763
50782
  }
50764
50783
  function pathWithin(root, candidate) {
50765
- const rel = relative$1(resolve$1(root), resolve$1(candidate));
50766
- return rel === "" || !!rel && !rel.startsWith("..") && !isAbsolute$1(rel);
50784
+ const rel = relative(resolve(root), resolve(candidate));
50785
+ return rel === "" || !!rel && !rel.startsWith("..") && !isAbsolute(rel);
50767
50786
  }
50768
50787
  function assertPathInside(root, candidate) {
50769
50788
  if (!pathWithin(root, candidate)) throw new Error(`Path escapes allowed root: ${candidate}`);
@@ -50784,13 +50803,13 @@ async function readOptionalFile(path) {
50784
50803
  }
50785
50804
  function workspaceRootForProject(project) {
50786
50805
  const configured = project.workspace?.workspaces_dir ?? "workspaces";
50787
- return isAbsolute$1(configured) ? resolve$1(configured) : resolve$1(project.path, configured);
50806
+ return isAbsolute(configured) ? resolve(configured) : resolve(project.path, configured);
50788
50807
  }
50789
50808
  function summarizeProject({ key, config }) {
50790
50809
  return {
50791
50810
  projectKey: key,
50792
50811
  name: config.name,
50793
- path: resolve$1(config.path),
50812
+ path: resolve(config.path),
50794
50813
  ...config.issue_prefix ? { issuePrefix: config.issue_prefix } : {},
50795
50814
  ...config.tracker ? { tracker: config.tracker } : {},
50796
50815
  workspaceRoot: workspaceRootForProject(config)
@@ -50809,7 +50828,7 @@ async function discoverWorkspacesForProject(projectKey, config) {
50809
50828
  if (error.code === "ENOENT") return [];
50810
50829
  throw error;
50811
50830
  })).filter((entry) => entry.isDirectory() && !entry.name.startsWith(".")).map((entry) => {
50812
- const path = resolve$1(root, entry.name);
50831
+ const path = resolve(root, entry.name);
50813
50832
  assertPathInside(root, path);
50814
50833
  return {
50815
50834
  projectKey,
@@ -50825,7 +50844,7 @@ async function buildContextCatalog(projects) {
50825
50844
  key: project.key,
50826
50845
  config: {
50827
50846
  ...project.config,
50828
- path: resolve$1(project.config.path)
50847
+ path: resolve(project.config.path)
50829
50848
  }
50830
50849
  })).sort((a, b) => a.key.localeCompare(b.key));
50831
50850
  const workspaceGroups = await Promise.all(normalizedProjects.map((project) => discoverWorkspacesForProject(project.key, project.config)));
@@ -50839,7 +50858,7 @@ function targetKey(target) {
50839
50858
  switch (target.kind) {
50840
50859
  case "global": return "global";
50841
50860
  case "project": return `project:${target.projectKey}`;
50842
- case "workspace": return `workspace:${target.projectKey}:${resolve$1(target.workspacePath)}`;
50861
+ case "workspace": return `workspace:${target.projectKey}:${resolve(target.workspacePath)}`;
50843
50862
  }
50844
50863
  }
50845
50864
  function targetForLayer(layer) {
@@ -50852,7 +50871,7 @@ function targetForLayer(layer) {
50852
50871
  case "workspace": return {
50853
50872
  kind: "workspace",
50854
50873
  projectKey: layer.projectKey,
50855
- workspacePath: resolve$1(layer.workspacePath)
50874
+ workspacePath: resolve(layer.workspacePath)
50856
50875
  };
50857
50876
  }
50858
50877
  }
@@ -50863,7 +50882,7 @@ function selectedProjectKey(target) {
50863
50882
  if (target.kind === "project" || target.kind === "workspace") return target.projectKey;
50864
50883
  }
50865
50884
  function selectedWorkspacePath(target) {
50866
- return target.kind === "workspace" ? resolve$1(target.workspacePath) : void 0;
50885
+ return target.kind === "workspace" ? resolve(target.workspacePath) : void 0;
50867
50886
  }
50868
50887
  function applicableLayers(state, selectedLayer) {
50869
50888
  const projectKey = selectedProjectKey(selectedLayer);
@@ -50871,7 +50890,7 @@ function applicableLayers(state, selectedLayer) {
50871
50890
  return state.resolvedLayers.filter((layer) => {
50872
50891
  if (layer.kind === "global") return true;
50873
50892
  if (layer.kind === "project") return layer.projectKey === projectKey;
50874
- return layer.projectKey === projectKey && resolve$1(layer.workspacePath) === workspacePath;
50893
+ return layer.projectKey === projectKey && resolve(layer.workspacePath) === workspacePath;
50875
50894
  });
50876
50895
  }
50877
50896
  async function layerRecord(file, base) {
@@ -50909,11 +50928,11 @@ async function describeSyncTarget(harness, layerKind, projectKey, label, path) {
50909
50928
  * a Overdeck-owned file, not a user file, so it is not listed as a target.
50910
50929
  */
50911
50930
  async function buildSyncTargets(projects) {
50912
- const targets = [await describeSyncTarget("claude-code", "global", void 0, "Claude Code · global", join$1(CLAUDE_DIR, "CLAUDE.md")), await describeSyncTarget("codex", "global", void 0, "Codex · global (codex-global.md)", codexGlobalContextFile())];
50931
+ const targets = [await describeSyncTarget("claude-code", "global", void 0, "Claude Code · global", join(CLAUDE_DIR, "CLAUDE.md")), await describeSyncTarget("codex", "global", void 0, "Codex · global (codex-global.md)", codexGlobalContextFile())];
50913
50932
  for (const { key, config } of projects) {
50914
50933
  if (!(await readOptionalFile(resolveProjectContextFile(config.path))).exists) continue;
50915
- targets.push(await describeSyncTarget("claude-code", "project", key, `${config.name} · CLAUDE.md`, join$1(config.path, "CLAUDE.md")));
50916
- targets.push(await describeSyncTarget("pi", "project", key, `${config.name} · AGENTS.md`, join$1(config.path, "AGENTS.md")));
50934
+ targets.push(await describeSyncTarget("claude-code", "project", key, `${config.name} · CLAUDE.md`, join(config.path, "CLAUDE.md")));
50935
+ targets.push(await describeSyncTarget("pi", "project", key, `${config.name} · AGENTS.md`, join(config.path, "AGENTS.md")));
50917
50936
  }
50918
50937
  return targets;
50919
50938
  }
@@ -50976,7 +50995,7 @@ async function renderBundledRulesAsync(harness) {
50976
50995
  const includeDev = isDevMode();
50977
50996
  const entries = await readdir(SYNC_SOURCES.rules, { withFileTypes: true }).catch(() => []);
50978
50997
  const rendered = (await Promise.all(entries.filter((entry) => entry.isFile() && entry.name.endsWith(".md")).sort((a, b) => a.name.localeCompare(b.name)).map(async (entry) => {
50979
- const file = join$1(SYNC_SOURCES.rules, entry.name);
50998
+ const file = join(SYNC_SOURCES.rules, entry.name);
50980
50999
  assertPathInside(SYNC_SOURCES.rules, file);
50981
51000
  const rule = parseRule(await readFile(file, "utf-8"));
50982
51001
  if (!includeDev && rule.scope === "dev") return "";
@@ -51066,7 +51085,7 @@ async function saveContextLayer(projects, requestOrTarget, maybeContentOrOverdec
51066
51085
  const layer = requireLayer(await buildContextLayerState(projects, "operation" in requestOrTarget ? maybeContentOrOverdeckHome ?? maybeOverdeckHome : maybeOverdeckHome), request.target);
51067
51086
  if (!pathWithin(layer.dir, layer.file)) throw new Error(`Context layer path escapes its directory: ${layer.file}`);
51068
51087
  await mkdir(layer.dir, { recursive: true });
51069
- const tempFile = join$1(layer.dir, `.${randomUUID$1()}.tmp`);
51088
+ const tempFile = join(layer.dir, `.${randomUUID$1()}.tmp`);
51070
51089
  try {
51071
51090
  await writeFile(tempFile, request.content, "utf-8");
51072
51091
  await rename(tempFile, layer.file);
@@ -51189,8 +51208,8 @@ init_conversations();
51189
51208
  */
51190
51209
  const getAdminTldrRoute = HttpRouter.add("GET", "/api/admin/tldr/:issueId", httpHandler(Effect.gen(function* () {
51191
51210
  const issueId = (yield* HttpRouter.params)["issueId"] ?? "";
51192
- const workspacePath = join$1(resolveProjectFromIssueSync(issueId)?.projectPath ?? process.cwd(), "workspaces", `feature-${issueId.toLowerCase()}`);
51193
- const venvPath = join$1(workspacePath, ".venv");
51211
+ const workspacePath = join(resolveProjectFromIssueSync(issueId)?.projectPath ?? process.cwd(), "workspaces", `feature-${issueId.toLowerCase()}`);
51212
+ const venvPath = join(workspacePath, ".venv");
51194
51213
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
51195
51214
  if (!existsSync$1(venvPath)) return jsonResponse({
51196
51215
  available: false,
@@ -51318,7 +51337,7 @@ function checkCommand(cmd) {
51318
51337
  }
51319
51338
  async function isToolInstalled(tool) {
51320
51339
  if (tool === "traefik") return checkCommand("docker");
51321
- if (tool === "ttyd") return checkCommand("ttyd") || existsSync$1(join$1(homedir$1(), "bin", "ttyd"));
51340
+ if (tool === "ttyd") return checkCommand("ttyd") || existsSync$1(join(homedir$1(), "bin", "ttyd"));
51322
51341
  return checkCommand(tool);
51323
51342
  }
51324
51343
  /** Install a single tool. Returns a result object (never throws). */
@@ -51355,9 +51374,9 @@ async function installTmux() {
51355
51374
  }
51356
51375
  async function installTtyd() {
51357
51376
  const plat = await Effect.runPromise(detectPlatform());
51358
- const binDir = join$1(homedir$1(), "bin");
51377
+ const binDir = join(homedir$1(), "bin");
51359
51378
  mkdirSync$1(binDir, { recursive: true });
51360
- const ttydPath = join$1(binDir, "ttyd");
51379
+ const ttydPath = join(binDir, "ttyd");
51361
51380
  if (plat === "darwin") try {
51362
51381
  await execAsync$1("brew install ttyd", { timeout: 12e4 });
51363
51382
  return {
@@ -51383,9 +51402,9 @@ async function installMkcert() {
51383
51402
  message: "mkcert installed via Homebrew and CA set up"
51384
51403
  };
51385
51404
  }
51386
- const binDir = join$1(homedir$1(), ".local", "bin");
51405
+ const binDir = join(homedir$1(), ".local", "bin");
51387
51406
  mkdirSync$1(binDir, { recursive: true });
51388
- const mkcertPath = join$1(binDir, "mkcert");
51407
+ const mkcertPath = join(binDir, "mkcert");
51389
51408
  await execAsync$1(`curl -sL "https://github.com/FiloSottile/mkcert/releases/latest/download/mkcert-v1.4.4-linux-${process.arch === "x64" ? "amd64" : process.arch}" -o "${mkcertPath}" && chmod +x "${mkcertPath}"`, { timeout: 6e4 });
51390
51409
  await execAsync$1("mkcert -install", { timeout: 3e4 });
51391
51410
  return {
@@ -51414,8 +51433,8 @@ async function installOx() {
51414
51433
  const plat = await Effect.runPromise(detectPlatform());
51415
51434
  const arch = process.arch === "x64" ? "amd64" : process.arch;
51416
51435
  const platform = plat === "darwin" ? "darwin" : "linux";
51417
- const binDir = join$1(homedir$1(), ".local", "bin");
51418
- const oxPath = join$1(binDir, "ox");
51436
+ const binDir = join(homedir$1(), ".local", "bin");
51437
+ const oxPath = join(binDir, "ox");
51419
51438
  mkdirSync$1(binDir, { recursive: true });
51420
51439
  await execAsync$1(`curl -sL "https://github.com/eltmon/ox/releases/download/latest/ox-${platform}-${arch}" -o "${oxPath}" && chmod +x "${oxPath}"`, { timeout: 6e4 });
51421
51440
  return {
@@ -52006,7 +52025,7 @@ async function relayCiFailureFeedbackPromise(opts) {
52006
52025
  return { agentMessageSent: false };
52007
52026
  }
52008
52027
  const resolved = resolveProjectFromIssueSync(issueId);
52009
- const workspacePath = resolved ? join$1(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`) : void 0;
52028
+ const workspacePath = resolved ? join(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`) : void 0;
52010
52029
  const markdownBody = buildFeedbackBody({
52011
52030
  issueId,
52012
52031
  repo: opts.repo,
@@ -52214,7 +52233,7 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
52214
52233
  let mergeState;
52215
52234
  let isDraft;
52216
52235
  let checksFailed;
52217
- const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-B5PDHMyn.js");
52236
+ const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-C7lftMNj.js");
52218
52237
  if (isGitHubAppConfigured()) {
52219
52238
  const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
52220
52239
  mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
@@ -52363,8 +52382,8 @@ async function handlePullRequestPromise(payload) {
52363
52382
  bumpIssuePrTabCacheGeneration(issueId);
52364
52383
  const repo = payload.repository.full_name;
52365
52384
  if (payload.action === "closed" && pr.merged === true) try {
52366
- const { postMergeLifecycle } = await import("./merge-agent-7nBiCytp.js");
52367
- const { resolveProjectFromIssueSync } = await import("./projects-BNmVxnNt.js");
52385
+ const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
52386
+ const { resolveProjectFromIssueSync } = await import("./projects-Bqfwuqet.js");
52368
52387
  const project = resolveProjectFromIssueSync(issueId);
52369
52388
  if (project) {
52370
52389
  const branchName = pr.head.ref;
@@ -52666,7 +52685,7 @@ async function reconcileStaleGitHubBlockers() {
52666
52685
  * Verifies X-Hub-Signature-256 HMAC-SHA256 signature.
52667
52686
  * Dispatches to per-event-type handlers.
52668
52687
  */
52669
- const WEBHOOK_SECRET_PATH = join$1(homedir$1(), ".overdeck", "github-app", "webhook-secret");
52688
+ const WEBHOOK_SECRET_PATH = join(homedir$1(), ".overdeck", "github-app", "webhook-secret");
52670
52689
  let _cachedWebhookSecret = void 0;
52671
52690
  let _secretLoadPromise = null;
52672
52691
  async function loadWebhookSecret() {
@@ -52879,12 +52898,12 @@ async function readComplianceWarningMarkers(projectId, issueId) {
52879
52898
  async function writeComplianceWarningMarkers(projectId, issueId, markers) {
52880
52899
  const path = resolveComplianceWarningMarkersFile(projectId, issueId);
52881
52900
  await ensureParentDir(path);
52882
- const tempPath = join(dirname(path), `.${randomUUID()}.tmp`);
52901
+ const tempPath = join$1(dirname$1(path), `.${randomUUID()}.tmp`);
52883
52902
  await writeFile$1(tempPath, `${JSON.stringify({ warnedObservationIds: [...new Set(markers.warnedObservationIds)] }, null, 2)}\n`, "utf8");
52884
52903
  await rename$1(tempPath, path);
52885
52904
  }
52886
52905
  function resolveComplianceWarningMarkersFile(projectId, issueId) {
52887
- return join(resolveIssueMemoryRoot(projectId, issueId), "compliance", "warned-misses.json");
52906
+ return join$1(resolveIssueMemoryRoot(projectId, issueId), "compliance", "warned-misses.json");
52888
52907
  }
52889
52908
  function isCurrentSessionMiss(observation, identity) {
52890
52909
  return observation.sessionId === identity.sessionId && observation.actionStatus === "compliance.miss" && observation.tags.includes("compliance") && observation.tags.includes("miss");
@@ -52929,7 +52948,7 @@ function getCheckpointWorker() {
52929
52948
  return worker;
52930
52949
  }
52931
52950
  async function runInline(operation, payload) {
52932
- const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-BjlBWOA8.js");
52951
+ const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-BK17oicz.js");
52933
52952
  switch (operation) {
52934
52953
  case "claimTranscriptRange": return claimTranscriptRange(payload);
52935
52954
  case "commitTranscriptRange": return commitTranscriptRange(payload);
@@ -53317,7 +53336,7 @@ var CodexTranscriptSource = class {
53317
53336
  async resolveAgentTranscript(agent) {
53318
53337
  const threadId = await this.readThreadId(agent);
53319
53338
  if (!threadId) return null;
53320
- const rolloutPath = findRolloutPath(join$1(getAgentDir(agent.id), "codex-home"), threadId);
53339
+ const rolloutPath = findRolloutPath(join(getAgentDir(agent.id), "codex-home"), threadId);
53321
53340
  if (!rolloutPath) return null;
53322
53341
  let fileStat;
53323
53342
  try {
@@ -53374,13 +53393,13 @@ function getAgentRuntimeStateFromStore$1(agentId) {
53374
53393
  async function readPiSessionId(agent) {
53375
53394
  if (agent.sessionId) return agent.sessionId;
53376
53395
  try {
53377
- return (await readFile(join$1(getAgentDir(agent.id), "session.id"), "utf8")).trim() || null;
53396
+ return (await readFile(join(getAgentDir(agent.id), "session.id"), "utf8")).trim() || null;
53378
53397
  } catch {
53379
53398
  return null;
53380
53399
  }
53381
53400
  }
53382
53401
  async function resolvePiTranscriptPath(agent, sessionId) {
53383
- const sessionDir = join$1(getAgentDir(agent.id), "sessions");
53402
+ const sessionDir = join(getAgentDir(agent.id), "sessions");
53384
53403
  let entries;
53385
53404
  try {
53386
53405
  entries = (await readdir(sessionDir)).filter((name) => name.endsWith(".jsonl")).sort();
@@ -53388,16 +53407,16 @@ async function resolvePiTranscriptPath(agent, sessionId) {
53388
53407
  return null;
53389
53408
  }
53390
53409
  const matching = entries.findLast((name) => name.includes(sessionId));
53391
- if (matching) return join$1(sessionDir, matching);
53392
- return entries.length > 0 ? join$1(sessionDir, entries[entries.length - 1]) : null;
53410
+ if (matching) return join(sessionDir, matching);
53411
+ return entries.length > 0 ? join(sessionDir, entries[entries.length - 1]) : null;
53393
53412
  }
53394
53413
  function isClaudeCodeSubagentSession(_sessionId, _agent, transcriptPath) {
53395
- return transcriptPath.split(sep$1).includes("subagents") || transcriptPath.includes("/subagents/");
53414
+ return transcriptPath.split(sep).includes("subagents") || transcriptPath.includes("/subagents/");
53396
53415
  }
53397
53416
  function buildMemoryIdentity(agent, sessionId) {
53398
53417
  return {
53399
53418
  projectId: inferProjectId$1(agent.workspace),
53400
- workspaceId: basename$1(agent.workspace),
53419
+ workspaceId: basename(agent.workspace),
53401
53420
  issueId: agent.issueId,
53402
53421
  runId: agent.id,
53403
53422
  sessionId,
@@ -53406,12 +53425,12 @@ function buildMemoryIdentity(agent, sessionId) {
53406
53425
  };
53407
53426
  }
53408
53427
  function inferProjectId$1(workspacePath) {
53409
- if (basename$1(workspacePath).startsWith("feature-")) return basename$1(dirname$1(dirname$1(workspacePath)));
53410
- return basename$1(workspacePath);
53428
+ if (basename(workspacePath).startsWith("feature-")) return basename(dirname(dirname(workspacePath)));
53429
+ return basename(workspacePath);
53411
53430
  }
53412
53431
  async function readCodexThreadId(agent) {
53413
53432
  try {
53414
- return (await readFile(join$1(getAgentDir(agent.id), "codex-thread-id"), "utf8")).trim() || null;
53433
+ return (await readFile(join(getAgentDir(agent.id), "codex-thread-id"), "utf8")).trim() || null;
53415
53434
  } catch {
53416
53435
  return null;
53417
53436
  }
@@ -53705,7 +53724,7 @@ async function upsertObservationMarkdown(markdownPath, observation) {
53705
53724
  const index = lines.findIndex((line) => line.includes(marker));
53706
53725
  if (index === -1) lines.push(nextLine);
53707
53726
  else lines[index] = nextLine;
53708
- const tempPath = `${dirname(markdownPath)}/.${randomUUID()}.tmp`;
53727
+ const tempPath = `${dirname$1(markdownPath)}/.${randomUUID()}.tmp`;
53709
53728
  await writeFile$1(tempPath, `${lines.join("\n")}\n`, "utf8");
53710
53729
  await rename$1(tempPath, markdownPath);
53711
53730
  }
@@ -54083,7 +54102,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
54083
54102
  };
54084
54103
  }
54085
54104
  async function emitMemoryObservationCreated(observation, timestamp) {
54086
- const { initEventStore } = await import("./event-store-DIk9wvnS.js");
54105
+ const { initEventStore } = await import("./event-store-DU3HkZlN.js");
54087
54106
  await (await initEventStore()).appendAsync({
54088
54107
  type: "memory.observation_created",
54089
54108
  timestamp,
@@ -54634,7 +54653,7 @@ async function handleMemoryTurnBody(body, options = {}) {
54634
54653
  const payloadIdentity = parseMemoryIdentity(payload.identity, sessionId);
54635
54654
  let agentState = null;
54636
54655
  const trustedTranscriptPath = options.resolveTranscriptPath ? await options.resolveTranscriptPath(body, sessionId) : resolveTrustedTranscriptPathFromState(agentState = await resolveAgentState(body, sessionId, options.resolveAgentIdBySessionId), sessionId);
54637
- if (!trustedTranscriptPath || resolve(transcriptPath) !== trustedTranscriptPath) return {
54656
+ if (!trustedTranscriptPath || resolve$1(transcriptPath) !== trustedTranscriptPath) return {
54638
54657
  status: "error",
54639
54658
  statusCode: 422,
54640
54659
  error: "transcript path could not be verified"
@@ -54685,7 +54704,7 @@ async function handleMemorySessionStartBody(body, options = {}) {
54685
54704
  } : { sessionId }).catch(() => {});
54686
54705
  if (!await (options.areObservationsEnabled ?? areMemoryObservationsEnabled)()) return { status: "disabled" };
54687
54706
  const trustedTranscriptPath = options.resolveTranscriptPath ? await options.resolveTranscriptPath(body, sessionId) : await resolveTrustedTranscriptPath(body, sessionId, options.resolveAgentIdBySessionId);
54688
- if (!trustedTranscriptPath || resolve(transcriptPath) !== trustedTranscriptPath) return {
54707
+ if (!trustedTranscriptPath || resolve$1(transcriptPath) !== trustedTranscriptPath) return {
54689
54708
  status: "error",
54690
54709
  statusCode: 422,
54691
54710
  error: "transcript path could not be verified"
@@ -54933,7 +54952,7 @@ function resolveMemoryIdentityFromState(state, sessionId) {
54933
54952
  if (!state) return null;
54934
54953
  return {
54935
54954
  projectId: inferProjectId(state.workspace),
54936
- workspaceId: basename(state.workspace),
54955
+ workspaceId: basename$1(state.workspace),
54937
54956
  issueId: state.issueId,
54938
54957
  runId: state.id,
54939
54958
  sessionId,
@@ -54945,7 +54964,7 @@ async function resolveTrustedTranscriptPath(body, sessionId, resolveAgentIdBySes
54945
54964
  return resolveTrustedTranscriptPathFromState(await resolveAgentState(body, sessionId, resolveAgentIdBySessionId), sessionId);
54946
54965
  }
54947
54966
  function resolveTrustedTranscriptPathFromState(state, sessionId) {
54948
- return state ? resolve(sessionFilePath(state.workspace, sessionId)) : null;
54967
+ return state ? resolve$1(sessionFilePath(state.workspace, sessionId)) : null;
54949
54968
  }
54950
54969
  async function resolveAgentState(body, sessionId, resolveAgentIdBySessionId) {
54951
54970
  const agentId = stringField(body.agentId) ?? stringField(body.agent_id);
@@ -54964,8 +54983,8 @@ async function findAgentStateBySessionId(sessionId, resolveAgentIdBySessionId) {
54964
54983
  return null;
54965
54984
  }
54966
54985
  function inferProjectId(workspacePath) {
54967
- if (basename(workspacePath).startsWith("feature-")) return basename(dirname(dirname(workspacePath)));
54968
- return basename(workspacePath);
54986
+ if (basename$1(workspacePath).startsWith("feature-")) return basename$1(dirname$1(dirname$1(workspacePath)));
54987
+ return basename$1(workspacePath);
54969
54988
  }
54970
54989
  function validOffset(value) {
54971
54990
  return Number.isInteger(value) && value >= 0;
@@ -55901,15 +55920,15 @@ const discoveredSessionsRouteLayer = Layer.mergeAll(getStatsRoute, listRoute, se
55901
55920
  //#region services/flywheel-state.ts
55902
55921
  const FLYWHEEL_STATE_RELATIVE_PATH = "docs/FLYWHEEL-STATE.md";
55903
55922
  function resolveStatePath(projectRoot) {
55904
- const root = resolve$1(projectRoot);
55905
- const absolute = resolve$1(root, FLYWHEEL_STATE_RELATIVE_PATH);
55906
- const rel = relative$1(root, absolute);
55907
- if (rel.startsWith("..") || isAbsolute$1(rel)) throw new Error("Flywheel state path escapes the project root");
55923
+ const root = resolve(projectRoot);
55924
+ const absolute = resolve(root, FLYWHEEL_STATE_RELATIVE_PATH);
55925
+ const rel = relative(root, absolute);
55926
+ if (rel.startsWith("..") || isAbsolute(rel)) throw new Error("Flywheel state path escapes the project root");
55908
55927
  return absolute;
55909
55928
  }
55910
55929
  async function readFlywheelState(options = {}) {
55911
55930
  const absolute = resolveStatePath(options.projectRoot ?? process.cwd());
55912
- const displayPath = join$1(FLYWHEEL_STATE_RELATIVE_PATH);
55931
+ const displayPath = join(FLYWHEEL_STATE_RELATIVE_PATH);
55913
55932
  try {
55914
55933
  const [content, info] = await Promise.all([readFile(absolute, "utf8"), stat$1(absolute)]);
55915
55934
  return {
@@ -56890,8 +56909,8 @@ function requireTrustedOrigin(request) {
56890
56909
  return originCheck.ok ? null : jsonResponse({ error: originCheck.error }, { status: 403 });
56891
56910
  }
56892
56911
  function isInsideRoot(projectRoot, candidate) {
56893
- const relativePath = relative$1(projectRoot, candidate);
56894
- return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute$1(relativePath);
56912
+ const relativePath = relative(projectRoot, candidate);
56913
+ return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute(relativePath);
56895
56914
  }
56896
56915
  function parseRunIdParam(runId) {
56897
56916
  try {
@@ -56912,10 +56931,10 @@ function parseRunsLimit(value) {
56912
56931
  return Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : void 0;
56913
56932
  }
56914
56933
  function resolveFlywheelBriefPath(projectRoot) {
56915
- const root = resolve$1(projectRoot);
56916
- const resolvedPath = resolve$1(root, DEFAULT_BRIEF_PATH);
56917
- const normalizedRoot = root.endsWith(sep$1) ? root : `${root}${sep$1}`;
56918
- const displayPath = relative$1(root, resolvedPath);
56934
+ const root = resolve(projectRoot);
56935
+ const resolvedPath = resolve(root, DEFAULT_BRIEF_PATH);
56936
+ const normalizedRoot = root.endsWith(sep) ? root : `${root}${sep}`;
56937
+ const displayPath = relative(root, resolvedPath);
56919
56938
  return {
56920
56939
  ok: true,
56921
56940
  path: resolvedPath.startsWith(normalizedRoot) ? displayPath : resolvedPath
@@ -56926,7 +56945,7 @@ function resolveBriefAbsolutePath(projectRoot) {
56926
56945
  if (!resolved.ok) return resolved;
56927
56946
  return {
56928
56947
  ok: true,
56929
- absolutePath: resolve$1(projectRoot, resolved.path),
56948
+ absolutePath: resolve(projectRoot, resolved.path),
56930
56949
  displayPath: resolved.path
56931
56950
  };
56932
56951
  }
@@ -56939,7 +56958,7 @@ async function assertExistingPathInsideRoot(projectRoot, candidate) {
56939
56958
  }
56940
56959
  async function assertWritePathInsideRoot(projectRoot, candidate) {
56941
56960
  const realRoot = await realpath(projectRoot);
56942
- if (!isInsideRoot(realRoot, await realpath(dirname$1(candidate)))) return {
56961
+ if (!isInsideRoot(realRoot, await realpath(dirname(candidate)))) return {
56943
56962
  ok: false,
56944
56963
  error: "Brief path must stay inside the project root"
56945
56964
  };
@@ -57180,7 +57199,7 @@ async function getFlywheelConversationPayload() {
57180
57199
  };
57181
57200
  }
57182
57201
  async function postFlywheelReportPayload() {
57183
- const { flywheelReportCommand } = await import("./flywheel-Cqf8vu7N.js");
57202
+ const { flywheelReportCommand } = await import("./flywheel-D2LdPSic.js");
57184
57203
  await flywheelReportCommand({ cwd: process.cwd() });
57185
57204
  return {
57186
57205
  status: 200,
@@ -57338,11 +57357,11 @@ const getMergeBlockersRoute = HttpRouter.add("GET", "/api/flywheel/merge-blocker
57338
57357
  async function defaultGetOrderedIssueIds() {
57339
57358
  const status = await readCurrentFlywheelStatusForDashboard();
57340
57359
  if (!status) return [];
57341
- const { computeMergeQueue } = await import("./flywheel-merge-order-CCwF60b-.js");
57360
+ const { computeMergeQueue } = await import("./flywheel-merge-order-CttTazRY.js");
57342
57361
  return (await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd()).pipe(Effect.provide(layer)))).map((i) => i.issueId);
57343
57362
  }
57344
57363
  async function defaultMergeOne(issueId) {
57345
- const { triggerMerge } = await import("./merge-ops-DE_6CnmZ.js");
57364
+ const { triggerMerge } = await import("./merge-ops-Czke6UAp.js");
57346
57365
  const r = await triggerMerge(issueId);
57347
57366
  return r.success ? { ok: true } : {
57348
57367
  ok: false,
@@ -57505,7 +57524,7 @@ const postFlywheelBriefRoute = HttpRouter.add("POST", "/api/flywheel/brief", htt
57505
57524
  const resolved = resolveBriefAbsolutePath(process.cwd());
57506
57525
  if (!resolved.ok) return jsonResponse({ error: resolved.error }, { status: 400 });
57507
57526
  return yield* Effect.promise(async () => {
57508
- await mkdir(dirname$1(resolved.absolutePath), { recursive: true });
57527
+ await mkdir(dirname(resolved.absolutePath), { recursive: true });
57509
57528
  const containment = await assertWritePathInsideRoot(process.cwd(), resolved.absolutePath);
57510
57529
  if (!containment.ok) return jsonResponse({ error: containment.error }, { status: 400 });
57511
57530
  await writeFile(resolved.absolutePath, bodyContent, "utf8");
@@ -57519,7 +57538,7 @@ const getFlywheelMergeQueueRoute = HttpRouter.add("GET", "/api/flywheel/merge-qu
57519
57538
  return yield* Effect.promise(async () => {
57520
57539
  const status = await readCurrentFlywheelStatusForDashboard();
57521
57540
  if (!status) return jsonResponse([]);
57522
- const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-CCwF60b-.js");
57541
+ const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-CttTazRY.js");
57523
57542
  return jsonResponse(await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd(), { getPrUrl: resolveMergeQueuePrUrl }).pipe(Effect.provide(layer))));
57524
57543
  });
57525
57544
  })));
@@ -57533,18 +57552,18 @@ function uatGenerationNameFromParam(param) {
57533
57552
  return decoded.startsWith("uat/") ? decoded : `uat/${decoded}`;
57534
57553
  }
57535
57554
  const getUatGenerationsRoute = HttpRouter.add("GET", "/api/flywheel/uat-generations", httpHandler(Effect.gen(function* () {
57536
- const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-DPfGR9_I.js"));
57555
+ const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57537
57556
  return jsonResponse(yield* Effect.promise(() => getUatGenerationsPayload()));
57538
57557
  })));
57539
57558
  const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
57540
- const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-DPfGR9_I.js"));
57559
+ const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57541
57560
  return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
57542
57561
  })));
57543
57562
  const postUatGenerationStackRoute = HttpRouter.add("POST", "/api/flywheel/uat-generations/:name/stack", httpHandler(Effect.gen(function* () {
57544
57563
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
57545
57564
  if (authError) return authError;
57546
57565
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
57547
- const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-DPfGR9_I.js"));
57566
+ const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57548
57567
  const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
57549
57568
  if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
57550
57569
  return jsonResponse({
@@ -57556,8 +57575,8 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
57556
57575
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
57557
57576
  if (authError) return authError;
57558
57577
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
57559
- const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-DPfGR9_I.js"));
57560
- const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-Ca9XSBCS.js"));
57578
+ const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57579
+ const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-BLIreoE7.js"));
57561
57580
  const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle));
57562
57581
  if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
57563
57582
  return jsonResponse(result);
@@ -57570,7 +57589,7 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
57570
57589
  const postFlywheelAssembleUatRoute = HttpRouter.add("POST", "/api/flywheel/assemble-uat", httpHandler(Effect.gen(function* () {
57571
57590
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
57572
57591
  if (authError) return authError;
57573
- const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-DPfGR9_I.js"));
57592
+ const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57574
57593
  return jsonResponse(yield* Effect.promise(() => runUatTrainReconcile({ force: true })));
57575
57594
  })));
57576
57595
  const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
@@ -57584,10 +57603,10 @@ const DEFAULT_THUMBNAIL_WIDTH = 640;
57584
57603
  const DEFAULT_THUMBNAIL_HEIGHT = 360;
57585
57604
  const DEFAULT_THUMBNAIL_TIMEOUT_MS = 1e4;
57586
57605
  function getArtifactThumbnailDir(slug) {
57587
- return join$1(getOverdeckHome(), "artifacts", "thumbnails", slug);
57606
+ return join(getOverdeckHome(), "artifacts", "thumbnails", slug);
57588
57607
  }
57589
57608
  function getArtifactThumbnailPath(slug, publishedHash) {
57590
- return join$1(getArtifactThumbnailDir(slug), `${sanitizeHashForPath(publishedHash)}.png`);
57609
+ return join(getArtifactThumbnailDir(slug), `${sanitizeHashForPath(publishedHash)}.png`);
57591
57610
  }
57592
57611
  function resolveArtifactThumbnailUrl(artifact) {
57593
57612
  const publishedHash = artifact.lastPublishedHash;
@@ -57604,7 +57623,7 @@ async function getOrCreateArtifactThumbnail(artifact, options = {}) {
57604
57623
  cacheHit: true
57605
57624
  };
57606
57625
  try {
57607
- await mkdir(dirname$1(path), { recursive: true });
57626
+ await mkdir(dirname(path), { recursive: true });
57608
57627
  await (options.renderer ?? renderArtifactThumbnailWithPlaywright)({
57609
57628
  rawUrl: options.rawUrl ?? defaultRawArtifactUrl(artifact.slug),
57610
57629
  outputPath: path,
@@ -57714,7 +57733,7 @@ function isArtifactHost(headers, baseDomain) {
57714
57733
  return normalizedHost(headerValue(headers, "host")) === `artifacts.${artifactDomain(baseDomain)}`;
57715
57734
  }
57716
57735
  function getPublishedSnapshotPath(slug) {
57717
- return join$1(getOverdeckHome(), "artifacts", "snapshots", slug, "index.html");
57736
+ return join(getOverdeckHome(), "artifacts", "snapshots", slug, "index.html");
57718
57737
  }
57719
57738
  function resolveArtifactUrls(slug, baseDomain) {
57720
57739
  const domain = baseDomain ?? process.env.PAN_ARTIFACT_DOMAIN ?? "overdeck.localhost";
@@ -58171,7 +58190,7 @@ function buildNamedParams(row) {
58171
58190
  * has no live session is marked stopped.
58172
58191
  */
58173
58192
  function backfillAgentsFromStateJsonSync(db, options) {
58174
- const agentsDir = join$1(getOverdeckHome(), "agents");
58193
+ const agentsDir = join(getOverdeckHome(), "agents");
58175
58194
  const liveSessions = options?.listLiveSessions?.() ?? listLiveTmuxSessionNames();
58176
58195
  const readHarnessModel = options?.readHarnessModel ?? readAgentHarnessModelRecordSync;
58177
58196
  let processed = 0;
@@ -58192,11 +58211,11 @@ function backfillAgentsFromStateJsonSync(db, options) {
58192
58211
  const upsert = db.prepare(`INSERT OR REPLACE INTO agents (${columns.join(", ")}) VALUES (${placeholders})`);
58193
58212
  db.transaction(() => {
58194
58213
  for (const entry of entries) {
58195
- const dirPath = join$1(agentsDir, entry);
58214
+ const dirPath = join(agentsDir, entry);
58196
58215
  let statePath;
58197
58216
  try {
58198
58217
  if (!statSync$1(dirPath).isDirectory()) continue;
58199
- statePath = join$1(dirPath, "state.json");
58218
+ statePath = join(dirPath, "state.json");
58200
58219
  } catch {
58201
58220
  continue;
58202
58221
  }
@@ -59589,7 +59608,7 @@ function runMigrations(db, dbPath) {
59589
59608
  }
59590
59609
  if (currentVersion < 55) {
59591
59610
  try {
59592
- const resolvedDbPath = dbPath ?? join(getOverdeckHome(), "panopticon.db");
59611
+ const resolvedDbPath = dbPath ?? join$1(getOverdeckHome(), "panopticon.db");
59593
59612
  const snapshotPath = `${resolvedDbPath}.v54-backfill-snapshot`;
59594
59613
  if (existsSync(resolvedDbPath) && !existsSync(snapshotPath)) {
59595
59614
  writeFileSync(snapshotPath, readFileSync(resolvedDbPath));
@@ -59726,7 +59745,7 @@ let _db = null;
59726
59745
  * Get the path to panopticon.db (dynamic, respects OVERDECK_HOME override for tests)
59727
59746
  */
59728
59747
  function getDatabasePath() {
59729
- return join(getOverdeckHome(), "panopticon.db");
59748
+ return join$1(getOverdeckHome(), "panopticon.db");
59730
59749
  }
59731
59750
  /**
59732
59751
  * Initialize and return the singleton database connection.
@@ -59806,7 +59825,7 @@ function clearBacklogSequence(projectKey) {
59806
59825
  getDatabase().prepare("DELETE FROM backlog_sequence WHERE project_key = ?").run(projectKey);
59807
59826
  }
59808
59827
  function getBacklogSequenceForRoot(projectRoot) {
59809
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
59828
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
59810
59829
  if (existsSync$1(seqPath)) {
59811
59830
  const result = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
59812
59831
  if (result.ok) {
@@ -59877,20 +59896,20 @@ const getBacklogSequenceRoute = HttpRouter.add("GET", "/api/backlog/sequence", h
59877
59896
  nodes: [],
59878
59897
  edges: []
59879
59898
  });
59880
- const draftsDir = join$1(projectRoot, ".pan", "drafts");
59899
+ const draftsDir = join(projectRoot, ".pan", "drafts");
59881
59900
  const prdFiles = existsSync$1(draftsDir) ? new Set(readdirSync$1(draftsDir).map((f) => f.replace(/\.md$/, "").toUpperCase())) : /* @__PURE__ */ new Set();
59882
- const specsDir = join$1(projectRoot, ".pan", "specs");
59901
+ const specsDir = join(projectRoot, ".pan", "specs");
59883
59902
  const specIssues = /* @__PURE__ */ new Set();
59884
59903
  if (existsSync$1(specsDir)) for (const f of readdirSync$1(specsDir)) {
59885
59904
  const match = /^[\d-]+-([A-Z]+-\d+)-/i.exec(f);
59886
59905
  if (match) specIssues.add(match[1].toUpperCase());
59887
59906
  }
59888
- const workspacesDir = join$1(projectRoot, "workspaces");
59907
+ const workspacesDir = join(projectRoot, "workspaces");
59889
59908
  const issuesWithBeads = /* @__PURE__ */ new Set();
59890
59909
  if (existsSync$1(workspacesDir)) for (const dir of readdirSync$1(workspacesDir)) {
59891
59910
  const match = /^feature-([a-z]+-\d+)$/i.exec(dir);
59892
59911
  if (match) {
59893
- if (existsSync$1(join$1(workspacesDir, dir, ".beads", "issues.jsonl"))) issuesWithBeads.add(match[1].toUpperCase());
59912
+ if (existsSync$1(join(workspacesDir, dir, ".beads", "issues.jsonl"))) issuesWithBeads.add(match[1].toUpperCase());
59894
59913
  }
59895
59914
  }
59896
59915
  const titleByIssue = /* @__PURE__ */ new Map();
@@ -59907,7 +59926,7 @@ const getBacklogSequenceRoute = HttpRouter.add("GET", "/api/backlog/sequence", h
59907
59926
  nodes: cachedNodes.map((r) => {
59908
59927
  const issueUpper = r.issueId.toUpperCase();
59909
59928
  const reviewStatus = getReviewStatusSync(issueUpper);
59910
- const inPipeline = reviewStatus !== null && reviewStatus.reviewStatus !== "pending" || existsSync$1(join$1(workspacesDir, `feature-${r.issueId.toLowerCase()}`));
59929
+ const inPipeline = reviewStatus !== null && reviewStatus.reviewStatus !== "pending" || existsSync$1(join(workspacesDir, `feature-${r.issueId.toLowerCase()}`));
59911
59930
  const hasPrd = prdFiles.has(issueUpper);
59912
59931
  const ready = specIssues.has(issueUpper) && issuesWithBeads.has(issueUpper);
59913
59932
  const state = classifyIssue({
@@ -59991,7 +60010,7 @@ const postBacklogGateRoute = HttpRouter.add("POST", "/api/backlog/sequence/gate"
59991
60010
  const gate = normalizeGate(rawGate);
59992
60011
  return yield* Effect.promise(async () => {
59993
60012
  const projectRoot = process.cwd();
59994
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
60013
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
59995
60014
  if (!existsSync$1(seqPath)) throw new Error("sequence.md not found");
59996
60015
  const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
59997
60016
  if (!parsed.ok) throw new Error(`parse error: ${parsed.error}`);
@@ -60023,7 +60042,7 @@ const postBacklogPlanningRoute = HttpRouter.add("POST", "/api/backlog/sequence/p
60023
60042
  ].includes(planning)) return yield* Effect.fail(/* @__PURE__ */ new Error("planning must be skip, auto, or interactive"));
60024
60043
  return yield* Effect.promise(async () => {
60025
60044
  const projectRoot = process.cwd();
60026
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
60045
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
60027
60046
  if (!existsSync$1(seqPath)) throw new Error("sequence.md not found");
60028
60047
  const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
60029
60048
  if (!parsed.ok) throw new Error(`parse error: ${parsed.error}`);
@@ -60046,7 +60065,7 @@ const getBacklogForecastRoute = HttpRouter.add("GET", "/api/backlog/forecast", h
60046
60065
  return yield* Effect.try({
60047
60066
  try: () => {
60048
60067
  const projectRoot = process.cwd();
60049
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
60068
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
60050
60069
  if (!existsSync$1(seqPath)) return jsonResponse({
60051
60070
  n,
60052
60071
  stats: null,
@@ -60154,7 +60173,7 @@ const getBacklogIssueStateRoute = HttpRouter.add("GET", "/api/backlog/issue-stat
60154
60173
  let gate = "auto";
60155
60174
  let planning = null;
60156
60175
  let inSequence = false;
60157
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
60176
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
60158
60177
  if (existsSync$1(seqPath)) {
60159
60178
  const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
60160
60179
  if (parsed.ok) {
@@ -60185,7 +60204,7 @@ const postBacklogClearRoute = HttpRouter.add("POST", "/api/backlog/sequence/clea
60185
60204
  if (authError) return authError;
60186
60205
  return yield* Effect.try({
60187
60206
  try: () => {
60188
- const seqPath = join$1(process.cwd(), ".pan", "backlog", "sequence.md");
60207
+ const seqPath = join(process.cwd(), ".pan", "backlog", "sequence.md");
60189
60208
  if (existsSync$1(seqPath)) {
60190
60209
  const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
60191
60210
  if (parsed.ok) clearBacklogSequence(parsed.doc.project);
@@ -60204,7 +60223,7 @@ const getSequencerStatusRoute = HttpRouter.add("GET", "/api/backlog/sequencer-st
60204
60223
  const projectRoot = process.cwd();
60205
60224
  const { running, startedAt } = getSequencerRunStatus(projectRoot);
60206
60225
  let total = 0;
60207
- const manifestPath = join$1(projectRoot, ".pan", "backlog", "manifest.json");
60226
+ const manifestPath = join(projectRoot, ".pan", "backlog", "manifest.json");
60208
60227
  if (existsSync$1(manifestPath)) try {
60209
60228
  const m = JSON.parse(readFileSync$1(manifestPath, "utf-8"));
60210
60229
  const arr = Array.isArray(m) ? m : m?.issues ?? m?.nodes ?? [];
@@ -60271,8 +60290,8 @@ const listDirsRoute = HttpRouter.add("GET", "/api/fs/list-dirs", httpHandler(Eff
60271
60290
  } catch {
60272
60291
  canonicalHome = home;
60273
60292
  }
60274
- const isWithinHome = (p) => p === canonicalHome || p.startsWith(canonicalHome.endsWith(sep$1) ? canonicalHome : `${canonicalHome}${sep$1}`);
60275
- const rawResolved = rawPath ? resolve$1(normalize(rawPath)) : home;
60293
+ const isWithinHome = (p) => p === canonicalHome || p.startsWith(canonicalHome.endsWith(sep) ? canonicalHome : `${canonicalHome}${sep}`);
60294
+ const rawResolved = rawPath ? resolve(normalize(rawPath)) : home;
60276
60295
  let target;
60277
60296
  try {
60278
60297
  target = await realpath(rawResolved);
@@ -60280,10 +60299,10 @@ const listDirsRoute = HttpRouter.add("GET", "/api/fs/list-dirs", httpHandler(Eff
60280
60299
  return jsonResponse({ error: "Path does not exist" }, { status: 400 });
60281
60300
  }
60282
60301
  if (!isWithinHome(target)) return jsonResponse({ error: "Path is outside home directory" }, { status: 400 });
60283
- const parent = target === canonicalHome ? null : resolve$1(target, "..");
60302
+ const parent = target === canonicalHome ? null : resolve(target, "..");
60284
60303
  const entries = (await readdir(target, { withFileTypes: true })).filter((d) => d.isDirectory()).sort((a, b) => a.name.localeCompare(b.name)).map((d) => ({
60285
60304
  name: d.name,
60286
- path: resolve$1(target, d.name)
60305
+ path: resolve(target, d.name)
60287
60306
  }));
60288
60307
  return jsonResponse({
60289
60308
  path: target,
@@ -61077,9 +61096,9 @@ async function pollOnce(state) {
61077
61096
  const { id: agentId } = agent;
61078
61097
  let stdout;
61079
61098
  try {
61080
- const remoteState = await readFile(join$1(homedir$1(), ".overdeck", "agents", agentId, "remote-state.json"), "utf-8").then((text) => JSON.parse(text)).catch(() => null);
61099
+ const remoteState = await readFile(join(homedir$1(), ".overdeck", "agents", agentId, "remote-state.json"), "utf-8").then((text) => JSON.parse(text)).catch(() => null);
61081
61100
  if (remoteState?.location === "remote" && remoteState?.vmName) {
61082
- const { getRemoteAgentOutput } = await import("./remote-agents-DNuaAgU6.js");
61101
+ const { getRemoteAgentOutput } = await import("./remote-agents-UHoi4oGr.js");
61083
61102
  stdout = await getRemoteAgentOutput(agentId, remoteState.vmName, 50);
61084
61103
  } else stdout = await Effect.runPromise(capturePane(agentId, 50));
61085
61104
  } catch {
@@ -61194,7 +61213,7 @@ async function captureCorpseDiagnostics(tmuxSession) {
61194
61213
  if (status) parts.push(`exitStatus=${status}`);
61195
61214
  } catch {}
61196
61215
  try {
61197
- const logPath = join(getOverdeckHome(), "agents", tmuxSession, "output.log");
61216
+ const logPath = join$1(getOverdeckHome(), "agents", tmuxSession, "output.log");
61198
61217
  if (existsSync(logPath)) {
61199
61218
  const lines = (await tailFile(logPath, 1500)).trim().split("\n").slice(-8).join("\n");
61200
61219
  if (lines) parts.push(`output.log tail:\n${lines}`);
@@ -61276,7 +61295,7 @@ async function backfillOrphanedSpecialistConversations(aliveSessions) {
61276
61295
  if (!sessionName.startsWith("agent-")) continue;
61277
61296
  if (NON_AGENT_PREFIXES.some((p) => sessionName.startsWith(p))) continue;
61278
61297
  if (getConversationByName(sessionName)) continue;
61279
- const statePath = join(homedir(), ".overdeck", "agents", sessionName, "state.json");
61298
+ const statePath = join$1(homedir(), ".overdeck", "agents", sessionName, "state.json");
61280
61299
  if (!existsSync(statePath)) continue;
61281
61300
  let state;
61282
61301
  try {
@@ -61346,7 +61365,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
61346
61365
  cwdGroups.set(conv.cwd, list);
61347
61366
  }
61348
61367
  for (const [cwd, convs] of cwdGroups) {
61349
- const projectDir = join(homedir(), ".claude", "projects", encodeClaudeProjectDir(cwd));
61368
+ const projectDir = join$1(homedir(), ".claude", "projects", encodeClaudeProjectDir(cwd));
61350
61369
  let entries;
61351
61370
  try {
61352
61371
  entries = await readdir$1(projectDir);
@@ -61358,7 +61377,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
61358
61377
  for (const filename of entries) {
61359
61378
  if (!filename.endsWith(".jsonl")) continue;
61360
61379
  const sessionId = filename.slice(0, -6);
61361
- const jsonlPath = join(projectDir, filename);
61380
+ const jsonlPath = join$1(projectDir, filename);
61362
61381
  if (notOrphanJsonlPaths.has(jsonlPath)) continue;
61363
61382
  if (getConversationByClaudeSessionId(sessionId)) continue;
61364
61383
  const { clearTs: firstClearTs, definitive } = await readFirstClearTimestamp(jsonlPath);
@@ -61371,7 +61390,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
61371
61390
  for (const candidate of convs) {
61372
61391
  if (!candidate.claudeSessionId) continue;
61373
61392
  if (candidate.claudeSessionId === sessionId) continue;
61374
- const parentJsonl = join(projectDir, `${candidate.claudeSessionId}.jsonl`);
61393
+ const parentJsonl = join$1(projectDir, `${candidate.claudeSessionId}.jsonl`);
61375
61394
  let mtimeMs;
61376
61395
  try {
61377
61396
  mtimeMs = (await stat$2(parentJsonl)).mtimeMs;
@@ -61485,7 +61504,7 @@ async function readFirstClearTimestamp(jsonlPath) {
61485
61504
  * worktree).
61486
61505
  */
61487
61506
  async function findClaudeSessionUuid(workspaceCwd, startedAt) {
61488
- const projectDir = join(homedir(), ".claude", "projects", encodeClaudeProjectDir(workspaceCwd));
61507
+ const projectDir = join$1(homedir(), ".claude", "projects", encodeClaudeProjectDir(workspaceCwd));
61489
61508
  let entries;
61490
61509
  try {
61491
61510
  entries = await readdir$1(projectDir);
@@ -61498,7 +61517,7 @@ async function findClaudeSessionUuid(workspaceCwd, startedAt) {
61498
61517
  const startedMs = startedAt ? new Date(startedAt).getTime() : NaN;
61499
61518
  let best = null;
61500
61519
  for (const filename of candidates) try {
61501
- const st = await stat$2(join(projectDir, filename));
61520
+ const st = await stat$2(join$1(projectDir, filename));
61502
61521
  const score = Number.isFinite(startedMs) ? Math.abs(st.mtimeMs - startedMs) : -st.mtimeMs;
61503
61522
  if (best === null || score < best.score) best = {
61504
61523
  uuid: filename.replace(/\.jsonl$/, ""),
@@ -61541,7 +61560,7 @@ function isProcessAlive(pid) {
61541
61560
  }
61542
61561
  }
61543
61562
  async function removeStaleRestartEventsLock(lockPath) {
61544
- const pidFile = join$1(lockPath, "pid");
61563
+ const pidFile = join(lockPath, "pid");
61545
61564
  try {
61546
61565
  const pid = parseInt(await readFile(pidFile, "utf8"), 10);
61547
61566
  if (Number.isFinite(pid) && isProcessAlive(pid)) return false;
@@ -61560,7 +61579,7 @@ async function acquireRestartEventsLock() {
61560
61579
  const lockPath = restartEventsLockPath();
61561
61580
  while (true) try {
61562
61581
  await mkdir(lockPath);
61563
- await writeFile(join$1(lockPath, "pid"), String(process.pid), "utf8");
61582
+ await writeFile(join(lockPath, "pid"), String(process.pid), "utf8");
61564
61583
  return true;
61565
61584
  } catch (error) {
61566
61585
  if (!isErrnoException(error) || error.code !== "EEXIST") return false;
@@ -61577,10 +61596,10 @@ async function releaseRestartEventsLock() {
61577
61596
  } catch {}
61578
61597
  }
61579
61598
  function restartStatusPath() {
61580
- return join$1(getOverdeckHome(), "restart-status.json");
61599
+ return join(getOverdeckHome(), "restart-status.json");
61581
61600
  }
61582
61601
  function restartEventsPath() {
61583
- return join$1(getOverdeckHome(), "restart-events.jsonl");
61602
+ return join(getOverdeckHome(), "restart-events.jsonl");
61584
61603
  }
61585
61604
  function isErrnoException(error) {
61586
61605
  return error instanceof Error && "code" in error;
@@ -61589,7 +61608,7 @@ async function appendRestartEvent(entry) {
61589
61608
  if (!await acquireRestartEventsLock()) return;
61590
61609
  try {
61591
61610
  const path = restartEventsPath();
61592
- await mkdir(dirname$1(path), { recursive: true });
61611
+ await mkdir(dirname(path), { recursive: true });
61593
61612
  await appendFile(path, `${JSON.stringify(entry)}\n`, "utf8");
61594
61613
  } catch {} finally {
61595
61614
  await releaseRestartEventsLock();
@@ -61616,7 +61635,7 @@ async function compactRestartEvents() {
61616
61635
  }
61617
61636
  async function writeRestartStatusPromise(entry) {
61618
61637
  const path = restartStatusPath();
61619
- await mkdir(dirname$1(path), { recursive: true });
61638
+ await mkdir(dirname(path), { recursive: true });
61620
61639
  const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
61621
61640
  await writeFile(tmp, `${JSON.stringify(entry, null, 2)}\n`, "utf8");
61622
61641
  await rename(tmp, path);
@@ -62256,14 +62275,14 @@ function stopTtsSummarizer() {
62256
62275
  * the "restarting" banner.
62257
62276
  */
62258
62277
  init_activity_logger();
62259
- const PENDING_FILE = join(homedir(), ".overdeck", "pending-post-merge.json");
62260
- const RESTART_MARKER = join(homedir(), ".overdeck", "dashboard-restarting.json");
62278
+ const PENDING_FILE = join$1(homedir(), ".overdeck", "pending-post-merge.json");
62279
+ const RESTART_MARKER = join$1(homedir(), ".overdeck", "dashboard-restarting.json");
62261
62280
  /**
62262
62281
  * Default lifecycle runner: dynamically imports merge-agent so the fresh process
62263
62282
  * loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
62264
62283
  */
62265
62284
  async function defaultLifecycleRunner(pending) {
62266
- const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-7nBiCytp.js");
62285
+ const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-CfohxFWM.js");
62267
62286
  await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
62268
62287
  if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
62269
62288
  }
@@ -62498,7 +62517,7 @@ async function directoryContainsJsonl(dirPath) {
62498
62517
  return false;
62499
62518
  }
62500
62519
  for (const entry of entries) {
62501
- const entryPath = join(dirPath, entry.name);
62520
+ const entryPath = join$1(dirPath, entry.name);
62502
62521
  if (entry.isFile() && entry.name.endsWith(".jsonl")) return true;
62503
62522
  if (entry.isDirectory() && await directoryContainsJsonl(entryPath)) return true;
62504
62523
  }
@@ -62516,7 +62535,7 @@ async function findClosedIssueAgentDirsPromise(options) {
62516
62535
  const candidates = [];
62517
62536
  for (const entry of entries) {
62518
62537
  if (!entry.isDirectory()) continue;
62519
- const dirPath = join(agentsDir, entry.name);
62538
+ const dirPath = join$1(agentsDir, entry.name);
62520
62539
  const issueId = await readAgentStateIssueId(dirPath) ?? getAgentDirectoryIssueId(entry.name);
62521
62540
  if (!issueId) continue;
62522
62541
  const closedAtMs = closedIssueTimes.get(issueId);
@@ -62584,7 +62603,7 @@ function failureReason(result) {
62584
62603
  return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
62585
62604
  }
62586
62605
  async function defaultMergeIssue(issueId) {
62587
- const { triggerMerge } = await import("./merge-ops-DE_6CnmZ.js");
62606
+ const { triggerMerge } = await import("./merge-ops-Czke6UAp.js");
62588
62607
  return triggerMerge(issueId);
62589
62608
  }
62590
62609
  function defaultAnnounceFailure(issueId, reason) {
@@ -62791,7 +62810,7 @@ function createOverdeckDatabase(options = {}) {
62791
62810
  if (!options.force) throw new Error(`Refusing to overwrite existing overdeck.db at ${dbPath}; pass --force to recreate it.`);
62792
62811
  rmSync$1(dbPath, { force: true });
62793
62812
  }
62794
- mkdirSync$1(dirname$1(dbPath), { recursive: true });
62813
+ mkdirSync$1(dirname(dbPath), { recursive: true });
62795
62814
  const db = openDatabase(dbPath);
62796
62815
  try {
62797
62816
  applyMigration(db, migrationPath);
@@ -62808,12 +62827,6 @@ function createOverdeckDatabase(options = {}) {
62808
62827
  }
62809
62828
  //#endregion
62810
62829
  //#region main.ts
62811
- /**
62812
- * Dashboard server entry point — dual-runtime (Bun dev, Node prod) (PAN-428 B5)
62813
- *
62814
- * Usage (dev): bun run src/dashboard/server/main.ts
62815
- * Usage (prod): node dist/dashboard/server.js
62816
- */
62817
62830
  init_issue_service_singleton();
62818
62831
  init_tracker_config();
62819
62832
  init_internal_token();
@@ -63221,7 +63234,7 @@ reconcileStaleGitHubBlockers().then((n) => {
63221
63234
  }
63222
63235
  }).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
63223
63236
  try {
63224
- const { resetProcessingToQueued } = await import("./merge-sync-BKLKu9kz.js");
63237
+ const { resetProcessingToQueued } = await import("./merge-sync-bOOtfeXR.js");
63225
63238
  const resetCount = resetProcessingToQueued();
63226
63239
  if (resetCount > 0) {
63227
63240
  console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);