@overdeck/desktop 0.45.10 → 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 (603) 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-CMlGznKv.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-xk_G8t90.js → agent-state-D-moNwhA.js} +1 -1
  7. package/server/{agent-state-service-C1iUF9Ft.js → agent-state-service-BaZH7sXJ.js} +1 -1
  8. package/server/{agent-state-service-5ge9xxhx.js → agent-state-service-BzESvLOf.js} +4 -4
  9. package/server/{agents-DHvsjsuP.js → agents-B5LfpLPv.js} +256 -185
  10. package/server/{agents-BIggLvi_.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-COm_R96V.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-CvK9xuSS.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-BnpErnD1.js → close-issue-_X3MXJyG.js} +4 -4
  35. package/server/{closed-issue-reaper-DRqK5k39.js → closed-issue-reaper-BsUfBSjM.js} +13 -13
  36. package/server/{closed-issue-reaper-BLCQwTpF.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-BhKvrPxn.js → conflict-gate-BtB_o-Vi.js} +3 -3
  45. package/server/{conflict-gate-JdFuhKuF.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-Ba5aZdrb.js → conversation-compaction-CZRVk4hg.js} +1 -1
  50. package/server/{conversation-compaction-C5o_eKEm.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-j3qSZ7--.js → deacon-CM0MxbS8.js} +235 -178
  61. package/server/{deacon-Cv2RMfHs.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-DadWNi5J.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-C4DaDSZ8.js → feedback-target-B2SEai8-.js} +1 -1
  79. package/server/{feedback-target-oE4-Esxl.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-DefHRzY4.js → flywheel-D2LdPSic.js} +13 -13
  83. package/server/{flywheel-ClMjGW_u.js → flywheel-Dfpx4bIV.js} +11 -11
  84. package/server/{flywheel-BqDdGvrQ.js → flywheel-k4FPtCQ_.js} +1 -1
  85. package/server/{flywheel-merge-order-CuDcqTRJ.js → flywheel-merge-order-CB4lbXeJ.js} +6 -6
  86. package/server/{flywheel-merge-order-B6YDSElh.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-DKeSVsJL.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-BKKc0XnB.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-DnhQgddB.js → issue-lifecycle-543pQX9D.js} +28 -28
  116. package/server/{issue-lifecycle-nY4esZn8.js → issue-lifecycle-Bd9XBJAQ.js} +1 -1
  117. package/server/{issue-service-singleton-Bnqv1uaa.js → issue-service-singleton-BC2JLZi7.js} +1 -1
  118. package/server/{issue-service-singleton-_AquSBTl.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-CGKm7doE.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-BcgAYStl.js → merge-agent-CHHs5S_0.js} +25 -25
  131. package/server/{merge-agent-Dh8Y9PDO.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-DmxlYbEo.js → merge-train-98ptZrPT.js} +3 -3
  140. package/server/{merge-train-deps-DBHsOWt9.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-Db8tUhce.js → orphan-proposed-reconciler-BSGCNJ6X.js} +9 -9
  145. package/server/{orphan-proposed-reconciler-mXV--tcB.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-_tDZ2D72.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-Bklh6loJ.js → remote-completion-RZYePR_0.js} +12 -12
  189. package/server/resume-CmxF3Kjz.js +3 -0
  190. package/server/{review-agent-phzqNqIs.js → review-agent-sZBCpEVv.js} +35 -26
  191. package/server/review-agent-uwVftH98.js +3 -0
  192. package/server/{review-artifacts-BGc69epg.js → review-artifacts-C7a45b1_.js} +7 -7
  193. package/server/{review-context-CCq56O_Y.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-bBkqUj5i.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-BQjqQXZG.js → review-status-gPndPUBc.js} +66 -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-wqnikhMK.js → review-verdict-feedback-4WZ5ZdbC.js} +7 -7
  201. package/server/{review-verdict-feedback-cZh9Wi9G.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-B2GmilSI.js → sequence-io-DA0akEQN.js} +5 -5
  206. package/server/{sequencer-agent-D8pW2aU_.js → sequencer-agent-DeflKafB.js} +6 -6
  207. package/server/server.js +576 -552
  208. package/server/{service-CILd-uOt.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-CrP90OFE.js → smart-compaction-Bw1K_Sbl.js} +7 -7
  217. package/server/{smart-compaction-Bgp_gwcA.js → smart-compaction-xblMyVpT.js} +1 -1
  218. package/server/{spawn-planning-session-D15KbPOy.js → spawn-planning-session-CzDFSKAQ.js} +1 -1
  219. package/server/{spawn-planning-session-BmJWHSCu.js → spawn-planning-session-DxLxcM7m.js} +15 -15
  220. package/server/{specialist-context-CwKkcXL9.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-CvDxquV_.js → specialist-logs-CFJjGsLC.js} +3 -3
  223. package/server/{specialists-D07ybnam.js → specialists-B4byf18k.js} +156 -156
  224. package/server/{specialists-BCjcG4uE.js → specialists-BLIreoE7.js} +1 -1
  225. package/server/{specialists-F2uMO4QS.js → specialists-DdvpFNt1.js} +1 -1
  226. package/server/{specialists-BYi0k8CZ.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-EjvOkEPl.js → summary-fork-DezPkJSm.js} +16 -16
  234. package/server/{summary-fork-DedqguZb.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-5LCVbjfq.js → teardown-workspace-CWz1pbEK.js} +12 -12
  561. package/server/{test-agent-queue-qfsq6uaC.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-C3hWXtip.js → uat-train-DGkIkLxu.js} +1 -1
  575. package/server/{uat-train-CtNGgXxj.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-BPAhPWR7.js → verification-runner-CntudBes.js} +11 -11
  579. package/server/{verification-runner-DuZRHjPU.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-H-COJ84X.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-CRU9_vRn.js → workspaces-Ca4zZs12.js} +223 -223
  590. package/server/cli-CJDWXE_Y.js +0 -3
  591. package/server/deacon-swarm-D1iAUX-P.js +0 -2
  592. package/server/forge-BfP7OJwK.js +0 -2
  593. package/server/inspect-agent-vm88mLYr.js +0 -2
  594. package/server/merge-ops-QdBiQ8XB.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-DnIsmIgC.js +0 -3
  599. package/server/review-agent-DgySDb-G.js +0 -3
  600. package/server/settings-vLoKyghx.js +0 -2
  601. package/server/specs-DeS98l_p.js +0 -3
  602. package/server/supervisor-D1-XwmZ7.js +0 -2
  603. package/server/workflows-Cz8OtiB4.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-CtNGgXxj.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-D07ybnam.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-BQjqQXZG.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-DnhQgddB.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-DHvsjsuP.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-CILd-uOt.js";
21
- import { n as AgentStateServiceLive } from "./agent-state-service-5ge9xxhx.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-_AquSBTl.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-DKeSVsJL.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-j3qSZ7--.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-ClMjGW_u.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-CRU9_vRn.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-BYi0k8CZ.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-B2GmilSI.js";
69
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-1eu1RvAT.js";
70
- import { i as resolveAutoSpawnOnFinalize, o as spawnPlanningSession } from "./spawn-planning-session-BmJWHSCu.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-BKKc0XnB.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-BcgAYStl.js";
80
- import { t as getAgentCommandSync } from "./settings-CBrei_kx.js";
81
- import { n as isExtendedReviewEnabled, t as init_review_agent } from "./review-agent-phzqNqIs.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-EjvOkEPl.js";
86
- import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-C5o_eKEm.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-D8pW2aU_.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-BIggLvi_.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-D15KbPOy.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-BIggLvi_.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-BIggLvi_.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-Cz8OtiB4.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-Bnqv1uaa.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-bBkqUj5i.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-CGKm7doE.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-DgySDb-G.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-Dh8Y9PDO.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-CGKm7doE.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-Dh8Y9PDO.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-CGKm7doE.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-CGKm7doE.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-bBkqUj5i.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
  }
@@ -36431,7 +36449,6 @@ function sanitizeApiTtsConfig(tts) {
36431
36449
  function getDefaultConversationModelApi() {
36432
36450
  const { config } = loadConfigSync();
36433
36451
  if (config.defaultConversationModel) return resolveModelIdSync(config.defaultConversationModel);
36434
- throw new Error("No default model configured — set models.default_conversation_model");
36435
36452
  }
36436
36453
  const ROLE_NAMES = [
36437
36454
  "plan",
@@ -36793,7 +36810,7 @@ function loadSettingsApi() {
36793
36810
  streamdownRenderer: config.experimental?.streamdownRenderer ?? false,
36794
36811
  showHarnessModelPermutations: config.experimental?.showHarnessModelPermutations ?? false
36795
36812
  },
36796
- claude: { permissionMode: config.claude?.permissionMode ?? "auto" },
36813
+ claude: { permissionMode: config.claude?.permissionMode ?? "bypass" },
36797
36814
  codex: { permissionMode: config.codex?.permissionMode ?? "auto-review" },
36798
36815
  remote: {
36799
36816
  resiliency_tier: config.remote?.resiliencyTier ?? "ephemeral",
@@ -37394,7 +37411,7 @@ async function readReviewerStoppedAt(sessionId, _agentsRoot) {
37394
37411
  }
37395
37412
  /** Read the round-N.json artifacts for one reviewer session. */
37396
37413
  async function readReviewerRounds(sessionName, agentsRoot) {
37397
- const dir = join$1(agentsRoot, sessionName);
37414
+ const dir = join(agentsRoot, sessionName);
37398
37415
  let entries;
37399
37416
  try {
37400
37417
  entries = await readdir(dir);
@@ -37411,7 +37428,7 @@ async function readReviewerRounds(sessionName, agentsRoot) {
37411
37428
  if (roundFiles.length === 0) return void 0;
37412
37429
  const isSynthesis = sessionName.endsWith("-review-synthesis");
37413
37430
  const history = (await Promise.all(roundFiles.map(async (rf) => {
37414
- 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);
37415
37432
  if (!raw) return null;
37416
37433
  try {
37417
37434
  const parsed = JSON.parse(raw);
@@ -37458,7 +37475,7 @@ async function readReviewerRounds(sessionName, agentsRoot) {
37458
37475
  */
37459
37476
  async function findLatestReviewRunDir(workspacePath, issueId) {
37460
37477
  try {
37461
- const reviewRoot = join$1(workspacePath, ".pan", "review");
37478
+ const reviewRoot = join(workspacePath, ".pan", "review");
37462
37479
  const entries = await readdir(reviewRoot);
37463
37480
  const upper = issueId.toUpperCase();
37464
37481
  const lower = issueId.toLowerCase();
@@ -37473,7 +37490,7 @@ async function findLatestReviewRunDir(workspacePath, issueId) {
37473
37490
  if (!Number.isFinite(ts)) continue;
37474
37491
  if (ts > bestTs) {
37475
37492
  bestTs = ts;
37476
- bestDir = join$1(reviewRoot, entry);
37493
+ bestDir = join(reviewRoot, entry);
37477
37494
  }
37478
37495
  }
37479
37496
  return bestDir;
@@ -37481,7 +37498,7 @@ async function findLatestReviewRunDir(workspacePath, issueId) {
37481
37498
  return null;
37482
37499
  }
37483
37500
  }
37484
- async function readSynthesisRounds(issueId, projectKey, agentsRoot = join$1(homedir$1(), ".overdeck", "agents")) {
37501
+ async function readSynthesisRounds(issueId, projectKey, agentsRoot = join(homedir$1(), ".overdeck", "agents")) {
37485
37502
  return readReviewerRounds(getReviewerSessionName("synthesis", projectKey, issueId), agentsRoot);
37486
37503
  }
37487
37504
  /**
@@ -37490,14 +37507,14 @@ async function readSynthesisRounds(issueId, projectKey, agentsRoot = join$1(home
37490
37507
  */
37491
37508
  async function buildReviewerNodes(opts) {
37492
37509
  if (!isExtendedReviewEnabled(opts.issueId)) return [];
37493
- const agentsRoot = opts.agentsDirOverride ?? join$1(homedir$1(), ".overdeck", "agents");
37510
+ const agentsRoot = opts.agentsDirOverride ?? join(homedir$1(), ".overdeck", "agents");
37494
37511
  const latestReviewRunDir = await findLatestReviewRunDir(opts.workspacePath, opts.issueId);
37495
37512
  return await Promise.all(CONVOY_REVIEWER_ROLES.map(async (role) => {
37496
37513
  const sessionId = getReviewerSessionName(role, opts.projectKey, opts.issueId);
37497
37514
  const isLive = opts.tmuxSessionNames.has(sessionId);
37498
37515
  const roundMetadata = await readReviewerRounds(sessionId, agentsRoot);
37499
37516
  const jsonlPath = await resolveJsonlPath(sessionId, opts.workspacePath ?? opts.projectPath, { agentsDirOverride: opts.agentsDirOverride });
37500
- const latestRunOutputExists = latestReviewRunDir ? existsSync$1(join$1(latestReviewRunDir, `${role}.md`)) : false;
37517
+ const latestRunOutputExists = latestReviewRunDir ? existsSync$1(join(latestReviewRunDir, `${role}.md`)) : false;
37501
37518
  const inProgressThisRound = isLive && latestReviewRunDir !== null && !latestRunOutputExists;
37502
37519
  const latestRoundDone = roundMetadata?.latestStatus === "completed" || roundMetadata?.latestStatus === "failed";
37503
37520
  const isZombie = isLive && latestRoundDone && !inProgressThisRound;
@@ -37593,7 +37610,7 @@ function setProjectPathCache(issuePrefix, path) {
37593
37610
  return path;
37594
37611
  }
37595
37612
  function getProjectPath$1(issuePrefix) {
37596
- if (!issuePrefix) return join$1(homedir$1(), "Projects");
37613
+ if (!issuePrefix) return join(homedir$1(), "Projects");
37597
37614
  const cached = projectPathCache.get(issuePrefix);
37598
37615
  if (cached) return cached;
37599
37616
  const resolved = resolveProjectFromIssueSync(`${issuePrefix}-1`);
@@ -37602,13 +37619,13 @@ function getProjectPath$1(issuePrefix) {
37602
37619
  if (config) {
37603
37620
  for (const { owner, repo, prefix } of config.repos) if ((prefix || repo.toUpperCase().replace(/-CLI$/, "").replace(/-/g, "")).toUpperCase() === issuePrefix.toUpperCase()) {
37604
37621
  for (const path of [
37605
- join$1(homedir$1(), "Projects", repo),
37606
- join$1(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
37607
- 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)
37608
37625
  ]) if (existsSync$1(path)) return setProjectPathCache(issuePrefix, path);
37609
37626
  }
37610
37627
  }
37611
- return setProjectPathCache(issuePrefix, join$1(homedir$1(), "Projects"));
37628
+ return setProjectPathCache(issuePrefix, join(homedir$1(), "Projects"));
37612
37629
  }
37613
37630
  const readJsonBody$12 = Effect.gen(function* () {
37614
37631
  const text = yield* (yield* HttpServerRequest.HttpServerRequest).text;
@@ -37654,18 +37671,18 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37654
37671
  } catch {}
37655
37672
  const sections = [];
37656
37673
  const projectPath = getProjectPath$1(issuePrefix);
37657
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
37674
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
37658
37675
  const agentId = `agent-${issueLower}`;
37659
37676
  const planningAgentId = `planning-${issueLower}`;
37660
37677
  const knowledgeAgentId = `agent-${issueLower}-knowledge`;
37661
- const agentsDir = join$1(homedir$1(), ".overdeck", "agents");
37678
+ const agentsDir = join(homedir$1(), ".overdeck", "agents");
37662
37679
  let hasPlanningSection = false;
37663
37680
  for (const checkId of [
37664
37681
  planningAgentId,
37665
37682
  agentId,
37666
37683
  knowledgeAgentId
37667
37684
  ]) {
37668
- const agentDir = join$1(agentsDir, checkId);
37685
+ const agentDir = join(agentsDir, checkId);
37669
37686
  if (!await pathExists$4(agentDir)) continue;
37670
37687
  const state = getAgentStateSync(checkId);
37671
37688
  if (!state) continue;
@@ -37681,11 +37698,11 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37681
37698
  transcriptFromPane = transcript.length > 0;
37682
37699
  } catch {}
37683
37700
  if (!isPlanning && !transcript) {
37684
- const logText = await readOptional$2(join$1(agentDir, "output.log"));
37701
+ const logText = await readOptional$2(join(agentDir, "output.log"));
37685
37702
  if (logText) transcript = logText;
37686
37703
  }
37687
37704
  if (isPlanning && !transcript) {
37688
- 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));
37689
37706
  if (continueText) transcript = `PLANNING COMPLETE\n\n${continueText}`;
37690
37707
  }
37691
37708
  }
@@ -37717,7 +37734,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37717
37734
  } catch {}
37718
37735
  }
37719
37736
  if (!hasPlanningSection) {
37720
- const continuePath = join$1(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
37737
+ const continuePath = join(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
37721
37738
  const continueText = await readOptional$2(continuePath);
37722
37739
  if (continueText) {
37723
37740
  const fileStat = await stat$1(continuePath).catch(() => null);
@@ -37738,7 +37755,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37738
37755
  }
37739
37756
  const centralStatus = getReviewStatusSync(issueId.toUpperCase());
37740
37757
  if (centralStatus?.history && centralStatus.history.length > 0) {
37741
- const tasksDir = join$1(homedir$1(), ".overdeck", "specialists", "tasks");
37758
+ const tasksDir = join(homedir$1(), ".overdeck", "specialists", "tasks");
37742
37759
  const taskFilesByType = {
37743
37760
  review: [],
37744
37761
  test: [],
@@ -37750,7 +37767,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
37750
37767
  if (await pathExists$4(tasksDir)) {
37751
37768
  const filenames = (await readdir(tasksDir).catch(() => [])).filter((f) => f.endsWith(".md"));
37752
37769
  await Promise.all(filenames.map(async (f) => {
37753
- const content = await readOptional$2(join$1(tasksDir, f));
37770
+ const content = await readOptional$2(join(tasksDir, f));
37754
37771
  if (content) taskFileContents.set(f, content);
37755
37772
  }));
37756
37773
  }
@@ -37968,9 +37985,9 @@ async function fetchPlanningData(issueId, options = {}) {
37968
37985
  const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
37969
37986
  const summaryOnly = options.summaryOnly ?? false;
37970
37987
  const projectPath = getProjectPath$1(issuePrefix);
37971
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
37972
- const planningDir = join$1(workspacePath, PAN_DIRNAME);
37973
- 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);
37974
37991
  const result = {
37975
37992
  hasPrd: false,
37976
37993
  hasState: false,
@@ -37987,7 +38004,7 @@ async function fetchPlanningData(issueId, options = {}) {
37987
38004
  return a.localeCompare(b);
37988
38005
  })[0];
37989
38006
  if (!firstMarkdown) return void 0;
37990
- return await readOptional$2(join$1(loc.path, firstMarkdown)) ?? void 0;
38007
+ return await readOptional$2(join(loc.path, firstMarkdown)) ?? void 0;
37991
38008
  };
37992
38009
  const hasPlanningDir = await pathExists$4(planningDir);
37993
38010
  const hasPanContinue = await pathExists$4(panContinuePath);
@@ -38026,9 +38043,9 @@ async function fetchPlanningData(issueId, options = {}) {
38026
38043
  return result;
38027
38044
  }
38028
38045
  result.state = await readOptional$2(panContinuePath) ?? void 0;
38029
- 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;
38030
38047
  result.hasState = Boolean(result.state);
38031
- const statusReviewPath = join$1(planningDir, "STATUS_REVIEW.md");
38048
+ const statusReviewPath = join(planningDir, "STATUS_REVIEW.md");
38032
38049
  const statusReview = await readOptional$2(statusReviewPath);
38033
38050
  if (statusReview) {
38034
38051
  result.statusReview = statusReview;
@@ -38051,13 +38068,13 @@ async function fetchPlanningData(issueId, options = {}) {
38051
38068
  result.hasPrd = Boolean(result.prd);
38052
38069
  const listArtifactFiles = async (subdir) => {
38053
38070
  if (!hasPlanningDir) return [];
38054
- const dirPath = join$1(planningDir, subdir);
38071
+ const dirPath = join(planningDir, subdir);
38055
38072
  if (!await pathExists$4(dirPath)) return [];
38056
38073
  const files = (await readdir(dirPath).catch(() => [])).filter((f) => f.endsWith(".md") || f.endsWith(".txt"));
38057
38074
  return (await Promise.all(files.map(async (filename) => {
38058
38075
  return {
38059
38076
  filename,
38060
- 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()
38061
38078
  };
38062
38079
  }))).sort((a, b) => new Date(b.mtime).getTime() - new Date(a.mtime).getTime());
38063
38080
  };
@@ -38066,7 +38083,7 @@ async function fetchPlanningData(issueId, options = {}) {
38066
38083
  return await Promise.all(files.map(async ({ filename, mtime }) => {
38067
38084
  return {
38068
38085
  filename,
38069
- content: await readOptional$2(join$1(planningDir, subdir, filename)) ?? "",
38086
+ content: await readOptional$2(join(planningDir, subdir, filename)) ?? "",
38070
38087
  [dateField]: mtime
38071
38088
  };
38072
38089
  }));
@@ -38139,9 +38156,9 @@ const postMissionControlStatusReviewRoute = HttpRouter.add("POST", "/api/command
38139
38156
  })));
38140
38157
  async function generateStatusReview(issueId) {
38141
38158
  const issueLower = issueId.toLowerCase();
38142
- const workspacePath = join$1(getProjectPath$1(extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`);
38143
- const planningDir = join$1(workspacePath, PAN_DIRNAME);
38144
- 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);
38145
38162
  if (!await pathExists$4(planningDir) && !await pathExists$4(panContinuePath)) return {
38146
38163
  type: "err",
38147
38164
  response: { error: "No planning state found" },
@@ -38149,11 +38166,11 @@ async function generateStatusReview(issueId) {
38149
38166
  };
38150
38167
  const state = await readOptional$2(panContinuePath);
38151
38168
  const readPlanningSubdir = async (subdir, limit = 5, maxPerFile = 2e3) => {
38152
- const dirPath = join$1(planningDir, subdir);
38169
+ const dirPath = join(planningDir, subdir);
38153
38170
  if (!await pathExists$4(dirPath)) return "";
38154
38171
  const files = (await readdir(dirPath).catch(() => [])).filter((f) => f.endsWith(".md") || f.endsWith(".txt"));
38155
38172
  return (await Promise.all(files.slice(0, limit).map(async (file) => {
38156
- const content = await readOptional$2(join$1(dirPath, file));
38173
+ const content = await readOptional$2(join(dirPath, file));
38157
38174
  return content ? `\n### ${file}\n${content.slice(0, maxPerFile)}\n` : "";
38158
38175
  }))).join("");
38159
38176
  };
@@ -38225,8 +38242,8 @@ async function generateStatusReview(issueId) {
38225
38242
  testStatus
38226
38243
  ].filter(Boolean).join("|")).digest("hex");
38227
38244
  await mkdir(planningDir, { recursive: true });
38228
- const hashPath = join$1(planningDir, ".status-review-hash");
38229
- const statusReviewPath = join$1(planningDir, "STATUS_REVIEW.md");
38245
+ const hashPath = join(planningDir, ".status-review-hash");
38246
+ const statusReviewPath = join(planningDir, "STATUS_REVIEW.md");
38230
38247
  const [savedHash, cachedReview] = await Promise.all([readOptional$2(hashPath), readOptional$2(statusReviewPath)]);
38231
38248
  if (savedHash?.trim() === contentHash && cachedReview) {
38232
38249
  const fileStat = await stat$1(statusReviewPath).catch(() => null);
@@ -38288,8 +38305,8 @@ Be specific: reference actual file names, function names, requirement text, disc
38288
38305
  const statusModelId = (loadSettingsApi().models?.overrides)?.["status-review"] || "claude-sonnet-5";
38289
38306
  const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
38290
38307
  const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
38291
- const promptFile = join$1(planningDir, ".status-review-prompt.tmp");
38292
- 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");
38293
38310
  let providerEnvStr = "";
38294
38311
  let providerEnv = {};
38295
38312
  const statusProvider = getProviderForModelSync(statusModelId);
@@ -38377,17 +38394,17 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
38377
38394
  safeName = safeName.replace(/\.vtt$/, ".md");
38378
38395
  }
38379
38396
  const ext = safeName.endsWith(".md") || safeName.endsWith(".txt") ? "" : ".md";
38380
- 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");
38381
38398
  yield* Effect.tryPromise({
38382
38399
  try: async () => {
38383
38400
  await mkdir(dirPath, { recursive: true });
38384
- await writeFile(join$1(dirPath, safeName + ext), processedContent, "utf-8");
38401
+ await writeFile(join(dirPath, safeName + ext), processedContent, "utf-8");
38385
38402
  },
38386
38403
  catch: (err) => new Error(err instanceof Error ? err.message : String(err))
38387
38404
  });
38388
38405
  return jsonResponse({
38389
38406
  success: true,
38390
- path: join$1(dirPath, safeName + ext)
38407
+ path: join(dirPath, safeName + ext)
38391
38408
  });
38392
38409
  })));
38393
38410
  const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/command-deck/planning/:issueId/sync-discussions", httpHandler(Effect.gen(function* () {
@@ -38403,7 +38420,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38403
38420
  "linear",
38404
38421
  "rally"
38405
38422
  ].includes(tracker)) return jsonResponse({ error: "tracker must be github, linear, or rally" }, { status: 400 });
38406
- 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");
38407
38424
  yield* Effect.tryPromise({
38408
38425
  try: () => mkdir(discussionsDir, { recursive: true }),
38409
38426
  catch: (err) => new Error(err instanceof Error ? err.message : String(err))
@@ -38430,7 +38447,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38430
38447
  });
38431
38448
  if (stdout.trim()) {
38432
38449
  const filename = `github-${issueId}-comments.md`;
38433
- 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");
38434
38451
  syncedFiles.push(filename);
38435
38452
  }
38436
38453
  } catch (err) {
@@ -38469,7 +38486,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38469
38486
  });
38470
38487
  if (prComments.trim()) {
38471
38488
  const filename = `pr-${prNum}-discussion.md`;
38472
- 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");
38473
38490
  syncedFiles.push(filename);
38474
38491
  }
38475
38492
  } catch {}
@@ -38483,7 +38500,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38483
38500
  const filename = `linear-${issueId}-comments.md`;
38484
38501
  const commentBody = comments.map((c) => `## ${c.author} (${c.createdAt})\n\n${c.body}\n\n---\n`).join("\n");
38485
38502
  yield* Effect.tryPromise({
38486
- 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"),
38487
38504
  catch: (err) => new Error(String(err))
38488
38505
  });
38489
38506
  syncedFiles.push(filename);
@@ -38524,7 +38541,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
38524
38541
  lines.push("");
38525
38542
  }
38526
38543
  yield* Effect.tryPromise({
38527
- try: () => writeFile(join$1(discussionsDir, filename), lines.join("\n"), "utf-8"),
38544
+ try: () => writeFile(join(discussionsDir, filename), lines.join("\n"), "utf-8"),
38528
38545
  catch: (err) => new Error(String(err))
38529
38546
  });
38530
38547
  syncedFiles.push(filename);
@@ -38543,16 +38560,16 @@ const postMissionControlPlanningInitRoute = HttpRouter.add("POST", "/api/command
38543
38560
  const eventStore = yield* EventStoreService;
38544
38561
  const { shadow } = body;
38545
38562
  const issueLower = issueId.toLowerCase();
38546
- 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);
38547
38564
  yield* Effect.tryPromise({
38548
38565
  try: async () => {
38549
38566
  await Promise.all([
38550
38567
  "transcripts",
38551
38568
  "discussions",
38552
38569
  "notes"
38553
- ].map((subdir) => mkdir(join$1(planningDir, subdir), { recursive: true })));
38570
+ ].map((subdir) => mkdir(join(planningDir, subdir), { recursive: true })));
38554
38571
  if (shadow) {
38555
- const inferencePath = join$1(planningDir, "INFERENCE.md");
38572
+ const inferencePath = join(planningDir, "INFERENCE.md");
38556
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");
38557
38574
  }
38558
38575
  },
@@ -38603,7 +38620,7 @@ init_config$1();
38603
38620
  init_domain_services();
38604
38621
  async function loadRemoteWorkspaceMetadata(issueId) {
38605
38622
  const normalizedId = issueId.toLowerCase().replace(/[^a-z0-9-]/g, "-");
38606
- 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);
38607
38624
  if (!content) return null;
38608
38625
  try {
38609
38626
  return import_dist.parse(content);
@@ -38612,11 +38629,11 @@ async function loadRemoteWorkspaceMetadata(issueId) {
38612
38629
  }
38613
38630
  }
38614
38631
  async function listRemoteWorkspaceMetadata() {
38615
- const workspacesDir = join$1(homedir$1(), ".overdeck", "workspaces");
38632
+ const workspacesDir = join(homedir$1(), ".overdeck", "workspaces");
38616
38633
  const yamlFiles = (await readdir(workspacesDir).catch(() => [])).filter((f) => f.endsWith(".yaml"));
38617
38634
  const workspaces = [];
38618
38635
  for (const file of yamlFiles) {
38619
- const content = await readFile(join$1(workspacesDir, file), "utf-8").catch(() => null);
38636
+ const content = await readFile(join(workspacesDir, file), "utf-8").catch(() => null);
38620
38637
  if (!content) continue;
38621
38638
  try {
38622
38639
  const metadata = import_dist.parse(content);
@@ -38852,8 +38869,8 @@ async function pathExists$3(filePath) {
38852
38869
  async function findProjectRootAsync(startDir = process.cwd()) {
38853
38870
  let currentDir = startDir;
38854
38871
  while (true) {
38855
- if (await pathExists$3(join$1(currentDir, ".git"))) return currentDir;
38856
- const parent = dirname$1(currentDir);
38872
+ if (await pathExists$3(join(currentDir, ".git"))) return currentDir;
38873
+ const parent = dirname(currentDir);
38857
38874
  if (parent === currentDir) return null;
38858
38875
  currentDir = parent;
38859
38876
  }
@@ -38869,9 +38886,9 @@ function stripProjectTtsEndpoint(config) {
38869
38886
  async function readProjectConfig() {
38870
38887
  const projectRoot = await findProjectRootAsync();
38871
38888
  if (!projectRoot) return null;
38872
- const configPath = join$1(projectRoot, ".pan.yaml");
38889
+ const configPath = join(projectRoot, ".pan.yaml");
38873
38890
  if (await pathExists$3(configPath)) return stripProjectTtsEndpoint(await readYamlConfig(configPath));
38874
- const legacyConfigPath = join$1(projectRoot, ".overdeck.yaml");
38891
+ const legacyConfigPath = join(projectRoot, ".overdeck.yaml");
38875
38892
  if (await pathExists$3(legacyConfigPath)) return stripProjectTtsEndpoint(await readYamlConfig(legacyConfigPath));
38876
38893
  return null;
38877
38894
  }
@@ -38889,13 +38906,13 @@ init_paths();
38889
38906
  init_config_yaml();
38890
38907
  init_errors();
38891
38908
  const execFileAsync$3 = promisify(execFile);
38892
- const QWEN_TTS_PID_PATH = join$1(OVERDECK_HOME, "pids", "qwen-tts.pid");
38893
- const QWEN_TTS_STATE_PATH = join$1(OVERDECK_HOME, "pids", "qwen-tts.json");
38894
- const QWEN_TTS_START_LOCK_PATH = join$1(OVERDECK_HOME, "pids", "qwen-tts.start.lock");
38895
- const QWEN_TTS_MANUAL_STOP_PATH = join$1(OVERDECK_HOME, "pids", "qwen-tts.manual-stop");
38896
- 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");
38897
38914
  const QWEN_TTS_AUTH_HEADER = "X-Overdeck-TTS-Token";
38898
- const QWEN_TTS_LOG_PATH = join$1(LOGS_DIR, "qwen-tts.log");
38915
+ const QWEN_TTS_LOG_PATH = join(LOGS_DIR, "qwen-tts.log");
38899
38916
  const GPU_MEMORY_CACHE_TTL_MS = 3e4;
38900
38917
  const DEFAULT_TTS_DAEMON_STARTUP_GRACE_MS = 30 * 6e4;
38901
38918
  let gpuMemoryCache = null;
@@ -38909,21 +38926,21 @@ async function pathExists$2(path) {
38909
38926
  }
38910
38927
  }
38911
38928
  async function resolveQwenTtsPackageDirPromise() {
38912
- 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")];
38913
38930
  for (const candidate of candidates) if (await pathExists$2(candidate)) return candidate;
38914
38931
  await mkdir(candidates[0], { recursive: true });
38915
38932
  return candidates[0];
38916
38933
  }
38917
38934
  async function resolveTtsDaemonScriptPromise() {
38918
- 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");
38919
38936
  if (await pathExists$2(script)) return script;
38920
38937
  throw new Error(`Qwen TTS daemon script not found at ${script}`);
38921
38938
  }
38922
38939
  async function getTtsDaemonVenvDirPromise() {
38923
- return join$1(await Effect.runPromise(resolveQwenTtsPackageDir()), ".venv");
38940
+ return join(await Effect.runPromise(resolveQwenTtsPackageDir()), ".venv");
38924
38941
  }
38925
38942
  async function getTtsDaemonPythonPromise() {
38926
- return join$1(await Effect.runPromise(getTtsDaemonVenvDir()), "bin", "python");
38943
+ return join(await Effect.runPromise(getTtsDaemonVenvDir()), "bin", "python");
38927
38944
  }
38928
38945
  async function readState() {
38929
38946
  try {
@@ -38948,7 +38965,7 @@ async function readState() {
38948
38965
  }
38949
38966
  }
38950
38967
  async function writeState(state) {
38951
- await mkdir(dirname$1(QWEN_TTS_PID_PATH), { recursive: true });
38968
+ await mkdir(dirname(QWEN_TTS_PID_PATH), { recursive: true });
38952
38969
  await writeFile(QWEN_TTS_PID_PATH, `${state.pid}\n`, "utf8");
38953
38970
  await writeFile(QWEN_TTS_STATE_PATH, `${JSON.stringify(state, null, 2)}\n`, "utf8");
38954
38971
  }
@@ -38965,7 +38982,7 @@ async function getTtsDaemonAuthTokenPromise() {
38965
38982
  }
38966
38983
  } catch {}
38967
38984
  const token = randomBytes(32).toString("base64url");
38968
- await mkdir(dirname$1(QWEN_TTS_AUTH_TOKEN_PATH), {
38985
+ await mkdir(dirname(QWEN_TTS_AUTH_TOKEN_PATH), {
38969
38986
  recursive: true,
38970
38987
  mode: 448
38971
38988
  });
@@ -39028,7 +39045,7 @@ function buildTtsDaemonEnv(config, authToken) {
39028
39045
  return env;
39029
39046
  }
39030
39047
  async function acquireStartLock() {
39031
- await mkdir(dirname$1(QWEN_TTS_START_LOCK_PATH), { recursive: true });
39048
+ await mkdir(dirname(QWEN_TTS_START_LOCK_PATH), { recursive: true });
39032
39049
  while (true) try {
39033
39050
  await mkdir(QWEN_TTS_START_LOCK_PATH, { mode: 448 });
39034
39051
  return;
@@ -39382,7 +39399,7 @@ const startTtsDaemon = (options) => Effect.tryPromise({
39382
39399
  init_paths();
39383
39400
  init_errors();
39384
39401
  function getTtsVoicesPath() {
39385
- return join(getOverdeckHome(), "tts-voices.json");
39402
+ return join$1(getOverdeckHome(), "tts-voices.json");
39386
39403
  }
39387
39404
  async function loadVoicesPromise() {
39388
39405
  try {
@@ -39395,7 +39412,7 @@ async function loadVoicesPromise() {
39395
39412
  }
39396
39413
  async function saveVoicesPromise(voices) {
39397
39414
  const filePath = getTtsVoicesPath();
39398
- await mkdir$1(dirname(filePath), { recursive: true });
39415
+ await mkdir$1(dirname$1(filePath), { recursive: true });
39399
39416
  await writeFile$1(filePath, `${JSON.stringify(voices, null, 2)}\n`, {
39400
39417
  encoding: "utf-8",
39401
39418
  mode: 384
@@ -39807,7 +39824,7 @@ var ReaddirpStream = class extends Readable {
39807
39824
  this._wantsDir = type ? DIR_TYPES.has(type) : false;
39808
39825
  this._wantsFile = type ? FILE_TYPES.has(type) : false;
39809
39826
  this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;
39810
- this._root = resolve$1(root);
39827
+ this._root = resolve(root);
39811
39828
  this._isDirent = !opts.alwaysStat;
39812
39829
  this._statsProp = this._isDirent ? "dirent" : "stats";
39813
39830
  this._rdOptions = {
@@ -39879,9 +39896,9 @@ var ReaddirpStream = class extends Readable {
39879
39896
  let entry;
39880
39897
  const basename = this._isDirent ? dirent.name : dirent;
39881
39898
  try {
39882
- const fullPath = resolve$1(join$1(path, basename));
39899
+ const fullPath = resolve(join(path, basename));
39883
39900
  entry = {
39884
- path: relative$1(this._root, fullPath),
39901
+ path: relative(this._root, fullPath),
39885
39902
  fullPath,
39886
39903
  basename
39887
39904
  };
@@ -39909,7 +39926,7 @@ var ReaddirpStream = class extends Readable {
39909
39926
  if (entryRealPathStats.isFile()) return "file";
39910
39927
  if (entryRealPathStats.isDirectory()) {
39911
39928
  const len = entryRealPath.length;
39912
- if (full.startsWith(entryRealPath) && full.substr(len, 1) === sep$1) {
39929
+ if (full.startsWith(entryRealPath) && full.substr(len, 1) === sep) {
39913
39930
  const recursiveError = /* @__PURE__ */ new Error(`Circular symlink detected: "${full}" points to "${entryRealPath}"`);
39914
39931
  recursiveError.code = RECURSIVE_ERROR_CODE;
39915
39932
  return this._onError(recursiveError);
@@ -41578,7 +41595,7 @@ function openEmbeddingsDb(dbPath, dimensions, options = {}) {
41578
41595
  if (!Number.isInteger(dimensions) || dimensions <= 0) return unavailable(`Invalid embedding dimensions: ${dimensions}`);
41579
41596
  let db;
41580
41597
  try {
41581
- const dir = dirname$1(dbPath);
41598
+ const dir = dirname(dbPath);
41582
41599
  if (!existsSync$1(dir)) mkdirSync$1(dir, { recursive: true });
41583
41600
  db = openDatabase(dbPath, { allowExtension: true });
41584
41601
  } catch (err) {
@@ -42125,7 +42142,7 @@ async function indexConversationSearch(options = {}) {
42125
42142
  filesScanned: files.length,
42126
42143
  filesIndexed: processed,
42127
42144
  chunksIndexed: result.chunksIndexed,
42128
- currentFile: basename$1(filePath)
42145
+ currentFile: basename(filePath)
42129
42146
  });
42130
42147
  const fileResult = await indexConversationFile({
42131
42148
  ...options,
@@ -42356,7 +42373,7 @@ async function collectJsonlFiles(dir, files, signal) {
42356
42373
  return;
42357
42374
  }
42358
42375
  for (const entry of entries) {
42359
- const path = join$1(dir, entry.name);
42376
+ const path = join(dir, entry.name);
42360
42377
  throwIfAborted(signal);
42361
42378
  if (entry.isDirectory()) await collectJsonlFiles(path, files, signal);
42362
42379
  else if (entry.isFile() && entry.name.endsWith(".jsonl")) files.push(path);
@@ -42384,10 +42401,10 @@ function openIndexerResources(config, options) {
42384
42401
  };
42385
42402
  }
42386
42403
  function defaultConversationRoots$1() {
42387
- return [join$1(homedir$1(), ".claude", "projects")];
42404
+ return [join(homedir$1(), ".claude", "projects")];
42388
42405
  }
42389
42406
  function sessionIdFromPath(filePath) {
42390
- return basename$1(filePath).replace(/\.jsonl$/, "");
42407
+ return basename(filePath).replace(/\.jsonl$/, "");
42391
42408
  }
42392
42409
  function projectIdFromPath(filePath) {
42393
42410
  const parts = filePath.split(/[\\/]+/);
@@ -42584,7 +42601,7 @@ async function syncConversationSearchWatcher(options = {}) {
42584
42601
  return activeWatcher;
42585
42602
  }
42586
42603
  function defaultConversationRoots() {
42587
- return [join$1(homedir$1(), ".claude", "projects")];
42604
+ return [join(homedir$1(), ".claude", "projects")];
42588
42605
  }
42589
42606
  function isAbortError(error) {
42590
42607
  return error instanceof Error && error.name === "AbortError";
@@ -43630,7 +43647,7 @@ const getLegacyImportPreviewRoute = HttpRouter.add("GET", "/api/settings/legacy-
43630
43647
  return yield* Effect.try({
43631
43648
  try: () => {
43632
43649
  const urlPath = new URL(request.url, "http://localhost").searchParams.get("path");
43633
- const defaultPath = join$1(getLegacyHome(), "panopticon.db");
43650
+ const defaultPath = join(getLegacyHome(), "panopticon.db");
43634
43651
  const resolvedPath = urlPath?.trim() || defaultPath;
43635
43652
  const preview = previewLegacyConversations(resolvedPath);
43636
43653
  if (!preview.found) return jsonResponse({
@@ -43982,13 +43999,14 @@ init_projects();
43982
43999
  init_tracker_utils();
43983
44000
  init_tracker_config();
43984
44001
  async function readPackageVersion() {
43985
- let dir = dirname$1(fileURLToPath(import.meta.url));
44002
+ let dir = dirname(fileURLToPath(import.meta.url));
43986
44003
  for (let i = 0; i < 8; i++) {
43987
- const candidate = join$1(dir, "package.json");
44004
+ const candidate = join(dir, "package.json");
43988
44005
  try {
43989
- 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;
43990
44008
  } catch {}
43991
- const parent = dirname$1(dir);
44009
+ const parent = dirname(dir);
43992
44010
  if (parent === dir) break;
43993
44011
  dir = parent;
43994
44012
  }
@@ -44000,16 +44018,16 @@ async function getOverdeckVersion() {
44000
44018
  return _overdeckVersion;
44001
44019
  }
44002
44020
  const overdeckDevMode = (() => {
44003
- let dir = dirname$1(fileURLToPath(import.meta.url));
44021
+ let dir = dirname(fileURLToPath(import.meta.url));
44004
44022
  for (let i = 0; i < 8; i++) {
44005
- if (existsSync$1(join$1(dir, "package.json")) && existsSync$1(join$1(dir, "src", "dashboard"))) return true;
44006
- 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);
44007
44025
  if (parent === dir) break;
44008
44026
  dir = parent;
44009
44027
  }
44010
44028
  return false;
44011
44029
  })();
44012
- const PROJECT_MAPPINGS_FILE = join$1(homedir$1(), ".overdeck", "project-mappings.json");
44030
+ const PROJECT_MAPPINGS_FILE = join(homedir$1(), ".overdeck", "project-mappings.json");
44013
44031
  async function getProjectMappings() {
44014
44032
  try {
44015
44033
  const content = await readFile(PROJECT_MAPPINGS_FILE, "utf-8");
@@ -44019,7 +44037,7 @@ async function getProjectMappings() {
44019
44037
  }
44020
44038
  }
44021
44039
  async function saveProjectMappings(mappings) {
44022
- await mkdir(join$1(homedir$1(), ".overdeck"), { recursive: true });
44040
+ await mkdir(join(homedir$1(), ".overdeck"), { recursive: true });
44023
44041
  await writeFile(PROJECT_MAPPINGS_FILE, JSON.stringify(mappings, null, 2));
44024
44042
  }
44025
44043
  async function getProjectPath(issuePrefix) {
@@ -44186,7 +44204,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
44186
44204
  }, { status: 400 });
44187
44205
  return yield* Effect.promise(async () => {
44188
44206
  try {
44189
- const { RallyRestApi } = await import("./rally-api-CcCdecF-.js");
44207
+ const { RallyRestApi } = await import("./rally-api-BtvwdX6d.js");
44190
44208
  const api = new RallyRestApi({
44191
44209
  apiKey,
44192
44210
  server: server || "https://rally1.rallydev.com"
@@ -44323,13 +44341,13 @@ const getGodviewSystemHealthRoute = HttpRouter.add("GET", "/api/godview/system-h
44323
44341
  })));
44324
44342
  const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.promise(async () => {
44325
44343
  try {
44326
- const agentsDir = join$1(homedir$1(), ".overdeck", "agents");
44344
+ const agentsDir = join(homedir$1(), ".overdeck", "agents");
44327
44345
  if (!existsSync$1(agentsDir)) return jsonResponse([]);
44328
44346
  const agentNames = (await readdir(agentsDir)).filter((name) => name.startsWith("agent-") || name.startsWith("planning-") || name.startsWith("specialist-"));
44329
44347
  const liveSessions = new Set(await Effect.runPromise(listSessionNames()));
44330
44348
  return jsonResponse((await Promise.all(agentNames.map(async (name) => {
44331
44349
  const stateFile = getAgentStateFilePath(name);
44332
- const healthFile = join$1(agentsDir, name, "health.json");
44350
+ const healthFile = join(agentsDir, name, "health.json");
44333
44351
  const healthStatus = await Effect.runPromise(determineHealthStatus(name, stateFile, liveSessions));
44334
44352
  if (!healthStatus) return null;
44335
44353
  let storedHealth = {
@@ -44345,7 +44363,7 @@ const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.
44345
44363
  } catch {}
44346
44364
  let contextPercent = null;
44347
44365
  try {
44348
- const ctxContent = await readFile(join$1(agentsDir, name, "context-pct"), "utf-8");
44366
+ const ctxContent = await readFile(join(agentsDir, name, "context-pct"), "utf-8");
44349
44367
  contextPercent = parseInt(ctxContent.trim(), 10) || null;
44350
44368
  } catch {}
44351
44369
  return {
@@ -44510,18 +44528,18 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
44510
44528
  const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
44511
44529
  return yield* Effect.promise(async () => {
44512
44530
  try {
44513
- const workspacePath = join$1(await getProjectPath(issuePrefix), "workspaces", `feature-${issueLower}`);
44531
+ const workspacePath = join(await getProjectPath(issuePrefix), "workspaces", `feature-${issueLower}`);
44514
44532
  const remoteState = loadRemoteAgentState(sessionName);
44515
44533
  const isRemote = !!remoteState;
44516
44534
  const vmName = remoteState?.vmName ?? "";
44517
- const { getAgentStateSync } = await import("./agents-BIggLvi_.js");
44535
+ const { getAgentStateSync } = await import("./agents-C4kZ8a2r.js");
44518
44536
  const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
44519
44537
  let tmuxSessionAlive = false;
44520
44538
  if (!isRemote) try {
44521
44539
  tmuxSessionAlive = await Effect.runPromise(sessionExists(sessionName));
44522
44540
  } catch {}
44523
- const panDir = join$1(workspacePath, PAN_DIRNAME);
44524
- 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;
44525
44543
  const hasPromptFile = hasPlanningState;
44526
44544
  const hasCompletionMarker = existsSync$1(panDir) ? await Effect.runPromise(checkPlanStatus(workspacePath, (status) => status === "proposed")) : false;
44527
44545
  const planningCompleted = existsSync$1(panDir) ? await Effect.runPromise(checkPlanStatus(workspacePath, (status) => PLANNING_FINISHED_STATUSES.has(status))) : false;
@@ -44579,8 +44597,8 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
44579
44597
  projectPath = (teamPrefix ? findProjectByTeamSync(teamPrefix) : null)?.path || "";
44580
44598
  }
44581
44599
  if (!projectPath) return jsonResponse({ error: `Could not find project path for ${issueId}. Check projects.yaml.` }, { status: 404 });
44582
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
44583
- const planningDir = join$1(workspacePath, PAN_DIRNAME);
44600
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
44601
+ const planningDir = join(workspacePath, PAN_DIRNAME);
44584
44602
  if (!existsSync$1(planningDir)) return jsonResponse({
44585
44603
  error: "Planning directory not found",
44586
44604
  sessionEnded: true
@@ -44607,7 +44625,7 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
44607
44625
  message: "Message sent to active session"
44608
44626
  });
44609
44627
  }
44610
- const outputFile = join$1(planningDir, "output.jsonl");
44628
+ const outputFile = join(planningDir, "output.jsonl");
44611
44629
  let conversationLog = "";
44612
44630
  const outputContent = await readFile(outputFile, "utf-8").catch(() => null);
44613
44631
  if (outputContent) {
@@ -44621,7 +44639,7 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
44621
44639
  } catch {}
44622
44640
  conversationLog = logParts.join("\n\n");
44623
44641
  }
44624
- const continuationPromptPath = join$1(planningDir, "CONTINUATION_PROMPT.md");
44642
+ const continuationPromptPath = join(planningDir, "CONTINUATION_PROMPT.md");
44625
44643
  await writeFile(continuationPromptPath, `# Continuation of Planning Session: ${issueId.toUpperCase()}
44626
44644
 
44627
44645
  ## CRITICAL: PLANNING ONLY - NO IMPLEMENTATION
@@ -44656,8 +44674,8 @@ ${message}
44656
44674
  Continue the PLANNING session. Do NOT implement anything.
44657
44675
  `);
44658
44676
  const agentCwd = workspacePath;
44659
- if (existsSync$1(outputFile)) await rename(outputFile, join$1(planningDir, `output-${Date.now()}.jsonl`));
44660
- 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");
44661
44679
  let msgPlanningModel = "claude-sonnet-5";
44662
44680
  try {
44663
44681
  msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
@@ -44665,7 +44683,7 @@ Continue the PLANNING session. Do NOT implement anything.
44665
44683
  const msgAgentCmd = getAgentCommandSync(msgPlanningModel);
44666
44684
  const msgPermissionFlags = getClaudePermissionFlagsStringSync();
44667
44685
  const msgCmdWithArgs = msgAgentCmd.args.length > 0 ? `${msgAgentCmd.command} ${msgAgentCmd.args.join(" ")} ${msgPermissionFlags}` : `${msgAgentCmd.command} ${msgPermissionFlags}`;
44668
- const launcherScript = join$1(agentStateDir, "continuation-launcher.sh");
44686
+ const launcherScript = join(agentStateDir, "continuation-launcher.sh");
44669
44687
  await mkdir(agentStateDir, { recursive: true });
44670
44688
  await writeFile(launcherScript, generateLauncherScriptSync({
44671
44689
  role: "plan",
@@ -44722,11 +44740,11 @@ const planningRouteLayer = Layer.mergeAll(getPlanningStatusRoute, postPlanningMe
44722
44740
  //#region routes/misc/tldr.ts
44723
44741
  init_config_yaml();
44724
44742
  async function getIndexStats(rootPath, isMain) {
44725
- const tldrPath = join$1(rootPath, ".tldr");
44743
+ const tldrPath = join(rootPath, ".tldr");
44726
44744
  if (!await access(tldrPath).then(() => true, () => false)) return {};
44727
44745
  try {
44728
44746
  let indexAge;
44729
- 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);
44730
44748
  if (langContent) {
44731
44749
  const langData = JSON.parse(langContent);
44732
44750
  if (langData.timestamp) {
@@ -44753,7 +44771,7 @@ async function getIndexStats(rootPath, isMain) {
44753
44771
  }
44754
44772
  let fileCount;
44755
44773
  let edgeCount;
44756
- 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);
44757
44775
  if (cgContent) {
44758
44776
  const cg = JSON.parse(cgContent);
44759
44777
  edgeCount = Array.isArray(cg.edges) ? cg.edges.length : void 0;
@@ -44778,9 +44796,9 @@ async function getIndexStats(rootPath, isMain) {
44778
44796
  }
44779
44797
  const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
44780
44798
  try {
44781
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CJqGsDFh.js");
44799
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
44782
44800
  const projectRoot = process.cwd();
44783
- const venvPath = join$1(projectRoot, ".venv");
44801
+ const venvPath = join(projectRoot, ".venv");
44784
44802
  const results = [];
44785
44803
  if (existsSync$1(venvPath)) {
44786
44804
  const status = await getTldrDaemonServiceSync(projectRoot, venvPath).getStatus();
@@ -44794,12 +44812,12 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
44794
44812
  ...indexStats
44795
44813
  });
44796
44814
  }
44797
- const workspacesDir = join$1(projectRoot, "workspaces");
44815
+ const workspacesDir = join(projectRoot, "workspaces");
44798
44816
  if (existsSync$1(workspacesDir)) {
44799
44817
  const workspaces = (await readdir(workspacesDir, { withFileTypes: true })).filter((d) => d.isDirectory() && d.name.startsWith("feature-"));
44800
44818
  for (const ws of workspaces) {
44801
- const wsPath = join$1(workspacesDir, ws.name);
44802
- const wsVenvPath = join$1(wsPath, ".venv");
44819
+ const wsPath = join(workspacesDir, ws.name);
44820
+ const wsVenvPath = join(wsPath, ".venv");
44803
44821
  if (existsSync$1(wsVenvPath)) {
44804
44822
  const status = await getTldrDaemonServiceSync(wsPath, wsVenvPath).getStatus();
44805
44823
  const indexStats = getIndexStats(wsPath, false);
@@ -44823,9 +44841,9 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
44823
44841
  }));
44824
44842
  const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
44825
44843
  try {
44826
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CJqGsDFh.js");
44844
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
44827
44845
  const projectRoot = process.cwd();
44828
- const venvPath = join$1(projectRoot, ".venv");
44846
+ const venvPath = join(projectRoot, ".venv");
44829
44847
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
44830
44848
  await getTldrDaemonServiceSync(projectRoot, venvPath).start();
44831
44849
  return jsonResponse({
@@ -44840,9 +44858,9 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
44840
44858
  }));
44841
44859
  const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
44842
44860
  try {
44843
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CJqGsDFh.js");
44861
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
44844
44862
  const projectRoot = process.cwd();
44845
- const venvPath = join$1(projectRoot, ".venv");
44863
+ const venvPath = join(projectRoot, ".venv");
44846
44864
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
44847
44865
  await getTldrDaemonServiceSync(projectRoot, venvPath).stop();
44848
44866
  return jsonResponse({
@@ -44857,24 +44875,24 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
44857
44875
  }));
44858
44876
  const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
44859
44877
  try {
44860
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CJqGsDFh.js");
44878
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
44861
44879
  const enabled = isTldrEnabledSync();
44862
44880
  const projectRoot = process.cwd();
44863
44881
  const targets = [];
44864
- if (existsSync$1(join$1(projectRoot, ".venv"))) targets.push(projectRoot);
44865
- const workspacesDir = join$1(projectRoot, "workspaces");
44882
+ if (existsSync$1(join(projectRoot, ".venv"))) targets.push(projectRoot);
44883
+ const workspacesDir = join(projectRoot, "workspaces");
44866
44884
  if (existsSync$1(workspacesDir)) {
44867
44885
  const workspaces = (await readdir(workspacesDir, { withFileTypes: true })).filter((d) => d.isDirectory() && d.name.startsWith("feature-"));
44868
44886
  for (const ws of workspaces) {
44869
- const wsPath = join$1(workspacesDir, ws.name);
44870
- 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);
44871
44889
  }
44872
44890
  }
44873
44891
  let restarted = 0;
44874
44892
  let stopped = 0;
44875
44893
  const errors = [];
44876
44894
  for (const wsPath of targets) try {
44877
- const service = getTldrDaemonServiceSync(wsPath, join$1(wsPath, ".venv"));
44895
+ const service = getTldrDaemonServiceSync(wsPath, join(wsPath, ".venv"));
44878
44896
  if (enabled) {
44879
44897
  await service.restart();
44880
44898
  restarted++;
@@ -44915,7 +44933,7 @@ function getIssueDataService$1() {
44915
44933
  return getSharedIssueService();
44916
44934
  }
44917
44935
  const pendingConfirmations = /* @__PURE__ */ new Map();
44918
- const METRICS_FILE = join$1(homedir$1(), ".overdeck", "runtime-metrics.json");
44936
+ const METRICS_FILE = join(homedir$1(), ".overdeck", "runtime-metrics.json");
44919
44937
  async function loadRuntimeMetrics() {
44920
44938
  try {
44921
44939
  const content = await readFile(METRICS_FILE, "utf-8");
@@ -44933,7 +44951,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
44933
44951
  const version = await getOverdeckVersion();
44934
44952
  let supervisorUrl = null;
44935
44953
  try {
44936
- const { getSupervisorUrlSync } = await import("./supervisor-D1-XwmZ7.js");
44954
+ const { getSupervisorUrlSync } = await import("./supervisor-DQMK2e3I.js");
44937
44955
  supervisorUrl = getSupervisorUrlSync();
44938
44956
  } catch {}
44939
44957
  return jsonResponse({
@@ -44942,6 +44960,10 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
44942
44960
  supervisorUrl
44943
44961
  });
44944
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
+ }));
44945
44967
  const getRegisteredProjectsRoute = HttpRouter.add("GET", "/api/registered-projects", Effect.try({
44946
44968
  try: () => {
44947
44969
  return jsonResponse(listProjectsSync().map((p) => ({
@@ -44984,10 +45006,10 @@ const getSkillsRoute = HttpRouter.add("GET", "/api/skills", Effect.promise(async
44984
45006
  try {
44985
45007
  const skills = [];
44986
45008
  const skillLocations = [{
44987
- path: join$1(homedir$1(), ".overdeck", "skills"),
45009
+ path: join(homedir$1(), ".overdeck", "skills"),
44988
45010
  source: "overdeck"
44989
45011
  }, {
44990
- path: join$1(homedir$1(), ".claude", "skills"),
45012
+ path: join(homedir$1(), ".claude", "skills"),
44991
45013
  source: "claude"
44992
45014
  }];
44993
45015
  for (const { path: skillsDir, source } of skillLocations) {
@@ -44995,8 +45017,8 @@ const getSkillsRoute = HttpRouter.add("GET", "/api/skills", Effect.promise(async
44995
45017
  const entries = await readdir(skillsDir, { withFileTypes: true });
44996
45018
  for (const entry of entries) {
44997
45019
  if (!entry.isDirectory()) continue;
44998
- const skillPath = join$1(skillsDir, entry.name);
44999
- const skillMdPath = join$1(skillPath, "SKILL.md");
45020
+ const skillPath = join(skillsDir, entry.name);
45021
+ const skillMdPath = join(skillPath, "SKILL.md");
45000
45022
  const hasSkillMd = await access(skillMdPath).then(() => true, () => false);
45001
45023
  let description;
45002
45024
  if (hasSkillMd) try {
@@ -45095,9 +45117,9 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
45095
45117
  return yield* Effect.promise(async () => {
45096
45118
  try {
45097
45119
  const projectPath = await getProjectPath(issuePrefix);
45098
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
45120
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
45099
45121
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
45100
- const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-Ba1D0QUN.js");
45122
+ const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-BRxnVSDk.js");
45101
45123
  const config = {
45102
45124
  issueId,
45103
45125
  workspacePath,
@@ -45123,11 +45145,11 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
45123
45145
  return yield* Effect.promise(async () => {
45124
45146
  try {
45125
45147
  const projectPath = await getProjectPath(issuePrefix);
45126
- const workspacePath = join$1(projectPath, "workspaces", `feature-${issueLower}`);
45148
+ const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
45127
45149
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
45128
45150
  const ghConfig = getGitHubConfig();
45129
45151
  if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
45130
- const { runObserverCycle } = await import("./shadow-engineering-Ba1D0QUN.js");
45152
+ const { runObserverCycle } = await import("./shadow-engineering-BRxnVSDk.js");
45131
45153
  const firstRepo = ghConfig.repos[0];
45132
45154
  const config = {
45133
45155
  issueId,
@@ -45146,10 +45168,10 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
45146
45168
  });
45147
45169
  }));
45148
45170
  const overdeckProjectRoot = (() => {
45149
- let dir = dirname$1(fileURLToPath(import.meta.url));
45171
+ let dir = dirname(fileURLToPath(import.meta.url));
45150
45172
  for (let i = 0; i < 8; i++) {
45151
- if (existsSync$1(join$1(dir, "package.json")) && existsSync$1(join$1(dir, "src", "dashboard"))) return dir;
45152
- 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);
45153
45175
  if (parent === dir) break;
45154
45176
  dir = parent;
45155
45177
  }
@@ -45191,7 +45213,7 @@ const postRestartDashboardRoute = HttpRouter.add("POST", "/api/system/restart-da
45191
45213
  return jsonResponse({ error: "Restart failed: " + (error instanceof Error ? error.message : String(error)) }, { status: 500 });
45192
45214
  }
45193
45215
  }));
45194
- 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);
45195
45217
  //#endregion
45196
45218
  //#region routes/misc.ts
45197
45219
  /**
@@ -46007,7 +46029,7 @@ const paletteRouteLayer = Layer.mergeAll(getPaletteCommandsRoute, getPaletteSear
46007
46029
  */
46008
46030
  const PI_CODEX_PROVIDER = "openai-codex";
46009
46031
  function getOhmypiAuthPath() {
46010
- return join$1(homedir$1(), ".omp", "agent", "auth.json");
46032
+ return join(homedir$1(), ".omp", "agent", "auth.json");
46011
46033
  }
46012
46034
  function readAuthFile() {
46013
46035
  const path = getOhmypiAuthPath();
@@ -46027,7 +46049,7 @@ function readOhmypiCodexCredential() {
46027
46049
  /** Atomically merge a fresh codex credential into auth.json (mode 0600). */
46028
46050
  function writeOhmypiCodexCredential(tokens) {
46029
46051
  const path = getOhmypiAuthPath();
46030
- mkdirSync$1(dirname$1(path), { recursive: true });
46052
+ mkdirSync$1(dirname(path), { recursive: true });
46031
46053
  const auth = readAuthFile();
46032
46054
  const stored = {
46033
46055
  type: "oauth",
@@ -46046,24 +46068,24 @@ function writeOhmypiCodexCredential(tokens) {
46046
46068
  function findOmpBinary() {
46047
46069
  for (const dir of (process.env["PATH"] ?? "").split(delimiter)) {
46048
46070
  if (!dir) continue;
46049
- const candidate = join$1(dir, "omp");
46071
+ const candidate = join(dir, "omp");
46050
46072
  if (existsSync$1(candidate)) return candidate;
46051
46073
  }
46052
46074
  return null;
46053
46075
  }
46054
46076
  /** omp is @oh-my-pi/pi-coding-agent; the oauth submodule path mirrors pi-ai's layout. */
46055
- 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");
46056
46078
  /**
46057
46079
  * Resolve omp's openai-codex OAuth submodule by walking node_modules upward
46058
46080
  * from the real omp binary. Returns null when not found — the caller degrades
46059
46081
  * gracefully to 'unavailable' status.
46060
46082
  */
46061
46083
  function resolveOmpCodexOAuthFile(ompBin) {
46062
- let dir = dirname$1(realpathSync$1(ompBin));
46084
+ let dir = dirname(realpathSync$1(ompBin));
46063
46085
  for (let i = 0; i < 10; i++) {
46064
- const candidate = join$1(dir, "node_modules", OMP_AI_OAUTH_SUBPATH);
46086
+ const candidate = join(dir, "node_modules", OMP_AI_OAUTH_SUBPATH);
46065
46087
  if (existsSync$1(candidate)) return candidate;
46066
- const parent = dirname$1(dir);
46088
+ const parent = dirname(dir);
46067
46089
  if (parent === dir) break;
46068
46090
  dir = parent;
46069
46091
  }
@@ -46169,11 +46191,11 @@ function assertSafeName(name) {
46169
46191
  if (!/^[a-zA-Z0-9_-]{1,64}$/.test(name)) throw new Error("Invalid conversation name");
46170
46192
  }
46171
46193
  function getConversationAttachmentsRoot() {
46172
- return join$1(getOverdeckHome(), CONVERSATION_ATTACHMENTS_DIR);
46194
+ return join(getOverdeckHome(), CONVERSATION_ATTACHMENTS_DIR);
46173
46195
  }
46174
46196
  function getConversationAttachmentDir(name) {
46175
46197
  assertSafeName(name);
46176
- return join$1(getConversationAttachmentsRoot(), name);
46198
+ return join(getConversationAttachmentsRoot(), name);
46177
46199
  }
46178
46200
  async function ensureConversationAttachmentDir(name) {
46179
46201
  const dir = getConversationAttachmentDir(name);
@@ -46192,10 +46214,10 @@ async function cleanupConversationAttachments(name) {
46192
46214
  * sessions that the lifecycle poller missed. */
46193
46215
  async function cleanupOrphanedConversationAttachments() {
46194
46216
  try {
46195
- const { listConversations } = await import("./conversations-Dcx6LeIh.js");
46217
+ const { listConversations } = await import("./conversations-BmWEluPL.js");
46196
46218
  const convNames = new Set(listConversations().map((c) => c.name));
46197
46219
  const root = getConversationAttachmentsRoot();
46198
- 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, {
46199
46221
  recursive: true,
46200
46222
  force: true
46201
46223
  }).catch(() => {}));
@@ -46204,7 +46226,7 @@ async function cleanupOrphanedConversationAttachments() {
46204
46226
  async function listConversationAttachmentPaths(name) {
46205
46227
  const dir = getConversationAttachmentDir(name);
46206
46228
  try {
46207
- 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));
46208
46230
  } catch {
46209
46231
  return [];
46210
46232
  }
@@ -46215,7 +46237,7 @@ async function listConversationAttachmentPaths(name) {
46215
46237
  * in the JSONL, not accessing the filesystem. */
46216
46238
  function isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath) {
46217
46239
  try {
46218
- return resolve$1(attachmentPath).startsWith(`${resolvedAttachmentDir}/`);
46240
+ return resolve(attachmentPath).startsWith(`${resolvedAttachmentDir}/`);
46219
46241
  } catch {
46220
46242
  return false;
46221
46243
  }
@@ -46234,7 +46256,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
46234
46256
  try {
46235
46257
  resolvedAttachmentDir = await realpath(getConversationAttachmentDir(name));
46236
46258
  } catch {
46237
- resolvedAttachmentDir = resolve$1(getConversationAttachmentDir(name));
46259
+ resolvedAttachmentDir = resolve(getConversationAttachmentDir(name));
46238
46260
  }
46239
46261
  const referenced = /* @__PURE__ */ new Set();
46240
46262
  const stream = createReadStream$1(sessionFile, { encoding: "utf-8" });
@@ -46259,7 +46281,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
46259
46281
  }
46260
46282
  if (text) {
46261
46283
  for (const attachmentPath of extractConversationAttachmentPaths(text)) if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) {
46262
- referenced.add(basename$1(attachmentPath));
46284
+ referenced.add(basename(attachmentPath));
46263
46285
  structuredFoundPaths = true;
46264
46286
  }
46265
46287
  }
@@ -46273,7 +46295,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
46273
46295
  attachmentPath = rawValue;
46274
46296
  }
46275
46297
  if (typeof attachmentPath === "string" && attachmentPath.startsWith("/")) {
46276
- if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) referenced.add(basename$1(attachmentPath));
46298
+ if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) referenced.add(basename(attachmentPath));
46277
46299
  }
46278
46300
  }
46279
46301
  }
@@ -46308,7 +46330,7 @@ async function cleanupUnreferencedConversationAttachments(conversation) {
46308
46330
  if (freshStats.mtimeMs > sessionMtimeMs) sessionMtimeMs = freshStats.mtimeMs;
46309
46331
  } catch {}
46310
46332
  await runInBatches(attachmentPaths, 10, async (attachmentPath) => {
46311
- if (referencedBasenames.has(basename$1(attachmentPath))) return;
46333
+ if (referencedBasenames.has(basename(attachmentPath))) return;
46312
46334
  try {
46313
46335
  if ((await stat$1(attachmentPath)).mtimeMs >= sessionMtimeMs) return;
46314
46336
  } catch {
@@ -46330,15 +46352,15 @@ async function resolveForContainment(attachmentPath) {
46330
46352
  try {
46331
46353
  return await realpath(attachmentPath);
46332
46354
  } catch {
46333
- let dir = dirname$1(attachmentPath);
46334
- const remaining = [basename$1(attachmentPath)];
46355
+ let dir = dirname(attachmentPath);
46356
+ const remaining = [basename(attachmentPath)];
46335
46357
  while (dir !== "/" && dir !== ".") try {
46336
- return join$1(await realpath(dir), ...remaining);
46358
+ return join(await realpath(dir), ...remaining);
46337
46359
  } catch {
46338
- remaining.unshift(basename$1(dir));
46339
- dir = dirname$1(dir);
46360
+ remaining.unshift(basename(dir));
46361
+ dir = dirname(dir);
46340
46362
  }
46341
- return resolve$1(attachmentPath);
46363
+ return resolve(attachmentPath);
46342
46364
  }
46343
46365
  }
46344
46366
  async function isManagedConversationAttachmentPath(attachmentPath) {
@@ -46351,7 +46373,7 @@ async function isManagedConversationAttachmentPath(attachmentPath) {
46351
46373
  }
46352
46374
  async function isConversationAttachmentPath(name, attachmentPath) {
46353
46375
  try {
46354
- const attachmentDir = resolve$1(getConversationAttachmentDir(name));
46376
+ const attachmentDir = resolve(getConversationAttachmentDir(name));
46355
46377
  return (await resolveForContainment(attachmentPath)).startsWith(`${attachmentDir}/`);
46356
46378
  } catch {
46357
46379
  return false;
@@ -46378,7 +46400,7 @@ function conversationControlPaths(agentId, home) {
46378
46400
  const { agentDir } = ohmypiFifoPaths(agentId, home);
46379
46401
  return {
46380
46402
  agentDir,
46381
- controlDir: join$1(agentDir, "control")
46403
+ controlDir: join(agentDir, "control")
46382
46404
  };
46383
46405
  }
46384
46406
  async function writeConversationControlCommand(agentId, command, home) {
@@ -46388,7 +46410,7 @@ async function writeConversationControlCommand(agentId, command, home) {
46388
46410
  mode: 448
46389
46411
  });
46390
46412
  await chmod(paths.controlDir, 448);
46391
- 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`);
46392
46414
  const tempPath = `${finalPath}.tmp`;
46393
46415
  await writeFile(tempPath, `${JSON.stringify(command)}\n`, {
46394
46416
  encoding: "utf8",
@@ -46733,7 +46755,7 @@ async function terminatePids(pids) {
46733
46755
  }
46734
46756
  }
46735
46757
  function conversationRuntimeRootPids(conv, rows) {
46736
- const launcherScript = join$1(getOverdeckHome(), "conversations", conv.tmuxSession, "launcher.sh");
46758
+ const launcherScript = join(getOverdeckHome(), "conversations", conv.tmuxSession, "launcher.sh");
46737
46759
  const sessionId = conv.claudeSessionId?.trim();
46738
46760
  const sessionNeedles = sessionId ? [`--resume ${sessionId}`, `--session-id ${sessionId}`] : [];
46739
46761
  const serverPid = findManagedServerPidSync();
@@ -46901,11 +46923,8 @@ async function handleConversationSwitchModel(name, body) {
46901
46923
  sessionAlive: false
46902
46924
  });
46903
46925
  }
46904
- function resolvePtySupervisorScriptPath() {
46905
- return join$1(packageRoot, "dist", "pty-supervisor.js");
46906
- }
46907
46926
  function getPtySupervisorSocketPath(agentId) {
46908
- return join$1(getOverdeckHome(), "sockets", `pty-${agentId}.sock`);
46927
+ return join(getOverdeckHome(), "sockets", `pty-${agentId}.sock`);
46909
46928
  }
46910
46929
  async function waitForPtySupervisorSocket(agentId, timeoutMs = PTY_SUPERVISOR_SOCKET_WAIT_MS) {
46911
46930
  const socketPath = getPtySupervisorSocketPath(agentId);
@@ -46986,9 +47005,9 @@ async function claudeConversationSystemPromptFiles(cwd) {
46986
47005
  return files;
46987
47006
  }
46988
47007
  async function ensurePiConversationSourceContractFile() {
46989
- const contextDir = join$1(getOverdeckHome(), "context");
47008
+ const contextDir = join(getOverdeckHome(), "context");
46990
47009
  await mkdir(contextDir, { recursive: true });
46991
- const path = join$1(contextDir, "pi-conversation-source-contract.md");
47010
+ const path = join(contextDir, "pi-conversation-source-contract.md");
46992
47011
  await writeFile(path, `${PI_CONVERSATION_SOURCE_CONTRACT}\n`, "utf-8");
46993
47012
  return path;
46994
47013
  }
@@ -47017,10 +47036,10 @@ function isNotFound(error) {
47017
47036
  }
47018
47037
  async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model, effort, issueId, resume = false, harness = "claude-code", plainFork = false) {
47019
47038
  const behavior = getHarnessBehavior(harness);
47020
- const stateDir = join$1(getOverdeckHome(), "conversations", tmuxSession);
47039
+ const stateDir = join(getOverdeckHome(), "conversations", tmuxSession);
47021
47040
  await mkdir(stateDir, { recursive: true });
47022
47041
  clearReadySignal(tmuxSession);
47023
- const launcherScript = join$1(stateDir, "launcher.sh");
47042
+ const launcherScript = join(stateDir, "launcher.sh");
47024
47043
  let runtimeCommand = `claude ${getClaudePermissionFlagsStringSync()}`;
47025
47044
  let providerExportsStr = "";
47026
47045
  let piFields;
@@ -47038,7 +47057,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47038
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.");
47039
47058
  }
47040
47059
  const paths = piFifoPaths(tmuxSession);
47041
- const piSessionDir = join$1(paths.agentDir, "sessions");
47060
+ const piSessionDir = join(paths.agentDir, "sessions");
47042
47061
  await mkdir(paths.agentDir, {
47043
47062
  recursive: true,
47044
47063
  mode: 448
@@ -47047,33 +47066,33 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47047
47066
  recursive: true,
47048
47067
  mode: 448
47049
47068
  });
47050
- 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;
47051
47070
  piFields = {
47052
47071
  harness: "ohmypi",
47053
47072
  piMode: "tui",
47054
- piExtensionPath: resolveOhmypiExtensionPath() ?? resolve$1(process.cwd(), "packages/ohmypi-extension/dist/index.js"),
47073
+ piExtensionPath: resolveOhmypiExtensionPath() ?? resolve(process.cwd(), "packages/ohmypi-extension/dist/index.js"),
47055
47074
  piSessionDir,
47056
47075
  resumeSessionId: storedPiSessionId || void 0
47057
47076
  };
47058
47077
  } else if (behavior.usesCodexHome) {
47059
- const codexHome = join$1(getOverdeckHome(), "agents", tmuxSession, "codex-home");
47078
+ const codexHome = join(getOverdeckHome(), "agents", tmuxSession, "codex-home");
47060
47079
  const codexPermMode = loadConfigSync().config.codex?.permissionMode ?? "workspace";
47061
47080
  const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
47062
47081
  const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
47063
47082
  const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
47064
- const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-BUZjrnqH.js");
47083
+ const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-CY-QRuU9.js");
47065
47084
  initCodexHome(codexHome, {
47066
47085
  trustedDir: cwd,
47067
47086
  approvalPolicy: codexApprovalPolicy,
47068
47087
  sandboxMode: codexSandboxMode,
47069
47088
  approvalsReviewer: codexApprovalsReviewer
47070
47089
  });
47071
- 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;
47072
47091
  codexFields = {
47073
47092
  harness: "codex",
47074
47093
  codexMode: "tui",
47075
47094
  codexHome,
47076
- codexSessionDir: join$1(codexHome, "sessions"),
47095
+ codexSessionDir: join(codexHome, "sessions"),
47077
47096
  resumeSessionId
47078
47097
  };
47079
47098
  }
@@ -47088,12 +47107,11 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47088
47107
  let supervisorScriptPath;
47089
47108
  if (useSupervisor) {
47090
47109
  supervisorScriptPath = resolvePtySupervisorScriptPath();
47091
- if (!existsSync$1(supervisorScriptPath)) throw new Error("pty-supervisor build artifact missing — run `npm run build`.");
47092
47110
  await writePtyToken(tmuxSession);
47093
47111
  }
47094
47112
  let channelsBridgeMcpConfig;
47095
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") {
47096
- channelsBridgeMcpConfig = join$1(stateDir, "agent-mcp.json");
47114
+ channelsBridgeMcpConfig = join(stateDir, "agent-mcp.json");
47097
47115
  writeBridgeTokenSync(tmuxSession);
47098
47116
  await writeChannelsBridgeMcpConfig(channelsBridgeMcpConfig, tmuxSession);
47099
47117
  }
@@ -47131,7 +47149,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47131
47149
  } catch {}
47132
47150
  console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
47133
47151
  try {
47134
- const { preTrustDirectory } = await import("./workspace-manager-B3PqQQSM.js");
47152
+ const { preTrustDirectory } = await import("./workspace-manager-Cb2a7bg9.js");
47135
47153
  preTrustDirectory(cwd);
47136
47154
  } catch {}
47137
47155
  try {
@@ -47148,7 +47166,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47148
47166
  const codexHomeDir = codexFields.codexHome;
47149
47167
  (async () => {
47150
47168
  try {
47151
- const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-BUZjrnqH.js");
47169
+ const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-CY-QRuU9.js");
47152
47170
  const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
47153
47171
  if (rollout) {
47154
47172
  const threadId = extractThreadIdFromRollout(rollout);
@@ -47164,6 +47182,18 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
47164
47182
  await Effect.runPromise(setOption(tmuxSession, "destroy-unattached", "off"));
47165
47183
  await Effect.runPromise(setOption(exactPaneTarget(tmuxSession), "remain-on-exit", "on"));
47166
47184
  }
47185
+ /**
47186
+ * Resolve a conversation's cwd from a project identifier.
47187
+ *
47188
+ * The Command Deck identifies projects by display name, not yaml key
47189
+ * (PAN-2590) — accept either, like GET /api/session-trees does.
47190
+ */
47191
+ function resolveProjectCwd(projectKey) {
47192
+ const projectConfig = getProjectSync(projectKey) ?? listProjectsSync().find((p) => p.config.name === projectKey)?.config ?? null;
47193
+ if (!projectConfig) return { error: `Unknown project: ${projectKey}` };
47194
+ if (!projectConfig.path || !existsSync$1(projectConfig.path)) return { error: `Project path does not exist: ${projectConfig.path || "(unset)"} (project: ${projectKey})` };
47195
+ return { cwd: projectConfig.path };
47196
+ }
47167
47197
  async function handleConversationCreate(body, deps) {
47168
47198
  try {
47169
47199
  const message = typeof body["message"] === "string" ? body["message"].trim() : "";
@@ -47177,9 +47207,9 @@ async function handleConversationCreate(body, deps) {
47177
47207
  if (effort && !SAFE_EFFORT_PATTERN.test(effort)) return jsonResponse({ error: "Invalid effort" }, { status: 400 });
47178
47208
  let cwd = getDefaultCwd();
47179
47209
  if (projectKey) {
47180
- const projectConfig = getProjectSync(projectKey);
47181
- if (projectConfig?.path && existsSync$1(projectConfig.path)) cwd = projectConfig.path;
47182
- else return jsonResponse({ error: `Unknown project: ${projectKey}` }, { status: 400 });
47210
+ const resolved = resolveProjectCwd(projectKey);
47211
+ if ("error" in resolved) return jsonResponse({ error: resolved.error }, { status: 400 });
47212
+ cwd = resolved.cwd;
47183
47213
  }
47184
47214
  if (message && message.length > 5e4) return jsonResponse({ error: "message exceeds maximum length of 50000 characters" }, { status: 400 });
47185
47215
  let name = generateConversationName();
@@ -47616,7 +47646,7 @@ async function getConversationDiffFull(name, deps) {
47616
47646
  const conv = getConversationByName(name);
47617
47647
  if (!conv) return result$1({ error: "Conversation not found" }, 404);
47618
47648
  const cwd = conv.cwd;
47619
- if (existsSync$1(join$1(cwd, ".git"))) {
47649
+ if (existsSync$1(join(cwd, ".git"))) {
47620
47650
  const baseCommit = await Effect.runPromise(findCommitAtTime(cwd, conv.createdAt));
47621
47651
  if (!baseCommit) return result$1({ diff: "" });
47622
47652
  return result$1({ diff: await Effect.runPromise(diffPatchSinceCommit(cwd, baseCommit)) });
@@ -47644,7 +47674,7 @@ async function getConversationDiffTurn(name, turnId, fileFilter, deps) {
47644
47674
  const conv = lookupConversation(name);
47645
47675
  if (!conv) return result$1({ error: "Conversation not found" }, 404);
47646
47676
  const cwd = conv.cwd;
47647
- if (existsSync$1(join$1(cwd, ".git"))) {
47677
+ if (existsSync$1(join(cwd, ".git"))) {
47648
47678
  const baseCommit = await Effect.runPromise(findCommitAtTime(cwd, conv.createdAt));
47649
47679
  if (baseCommit) return result$1({
47650
47680
  turnId,
@@ -48034,10 +48064,10 @@ async function findClaudeSessionFileById$1(sessionId) {
48034
48064
  } else if (Date.now() - cached.ts < SESSION_FILE_MISS_TTL_MS$1) return null;
48035
48065
  }
48036
48066
  try {
48037
- const claudeProjects = join$1(homedir$1(), ".claude", "projects");
48067
+ const claudeProjects = join(homedir$1(), ".claude", "projects");
48038
48068
  const dirs = await readdir(claudeProjects);
48039
48069
  const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
48040
- 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`));
48041
48071
  const STAT_BATCH_SIZE = 50;
48042
48072
  for (let i = 0; i < candidates.length; i += STAT_BATCH_SIZE) {
48043
48073
  const batch = candidates.slice(i, i + STAT_BATCH_SIZE);
@@ -48323,10 +48353,10 @@ async function resolveSpecialistSessionFile(name) {
48323
48353
  try {
48324
48354
  const claudeSessionId = await resolveClaudeSessionId(name);
48325
48355
  if (claudeSessionId && SAFE_SESSION_ID_PATTERN.test(claudeSessionId)) {
48326
- const claudeProjects = join$1(homedir$1(), ".claude", "projects");
48356
+ const claudeProjects = join(homedir$1(), ".claude", "projects");
48327
48357
  const dirs = await readdir(claudeProjects);
48328
48358
  const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
48329
- 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`));
48330
48360
  const STAT_BATCH_SIZE = 50;
48331
48361
  let found = null;
48332
48362
  for (let i = 0; i < candidates.length && !found; i += STAT_BATCH_SIZE) {
@@ -48782,7 +48812,7 @@ function validateImageMagicBytes(bytes, mimeType) {
48782
48812
  function safeUploadExtension(filename, mimeType) {
48783
48813
  const mimeExtension = ALLOWED_UPLOAD_MIME_TYPES.get(mimeType);
48784
48814
  if (!mimeExtension) return "";
48785
- const originalExtension = extname$1(filename).toLowerCase();
48815
+ const originalExtension = extname(filename).toLowerCase();
48786
48816
  return originalExtension === mimeExtension ? originalExtension : mimeExtension;
48787
48817
  }
48788
48818
  async function handleConversationImageUpload(name, filename, bytes, mimeType) {
@@ -48807,7 +48837,7 @@ async function handleConversationImageUpload(name, filename, bytes, mimeType) {
48807
48837
  }
48808
48838
  if (!resolvedDir.startsWith(`${attachmentsRoot}/`)) return jsonResponse({ error: "Invalid attachment path" }, { status: 500 });
48809
48839
  const fileName = `${randomUUID$1()}${extension}`;
48810
- const path = join$1(resolvedDir, fileName);
48840
+ const path = join(resolvedDir, fileName);
48811
48841
  const tmpPath = `${path}.tmp`;
48812
48842
  try {
48813
48843
  await writeFile(tmpPath, bytes);
@@ -48980,10 +49010,10 @@ async function findClaudeSessionFileById(sessionId) {
48980
49010
  } else if (Date.now() - cached.ts < SESSION_FILE_MISS_TTL_MS) return null;
48981
49011
  }
48982
49012
  try {
48983
- const claudeProjects = join$1(homedir$1(), ".claude", "projects");
49013
+ const claudeProjects = join(homedir$1(), ".claude", "projects");
48984
49014
  const dirs = await readdir(claudeProjects);
48985
49015
  const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
48986
- 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`));
48987
49017
  const STAT_BATCH_SIZE = 50;
48988
49018
  for (let i = 0; i < candidates.length; i += STAT_BATCH_SIZE) {
48989
49019
  const batch = candidates.slice(i, i + STAT_BATCH_SIZE);
@@ -50123,18 +50153,18 @@ var DuplicateProjectError = class extends Error {
50123
50153
  }
50124
50154
  };
50125
50155
  function installGitHooksInDir(gitDir) {
50126
- const hooksTarget = join$1(gitDir, "hooks");
50156
+ const hooksTarget = join(gitDir, "hooks");
50127
50157
  let installed = 0;
50128
50158
  if (!existsSync$1(hooksTarget)) mkdirSync$1(hooksTarget, { recursive: true });
50129
50159
  if (!existsSync$1(BUNDLED_HOOKS_DIR)) return 0;
50130
50160
  try {
50131
50161
  const hooks = readdirSync$1(BUNDLED_HOOKS_DIR).filter((f) => {
50132
- const p = join$1(BUNDLED_HOOKS_DIR, f);
50162
+ const p = join(BUNDLED_HOOKS_DIR, f);
50133
50163
  return existsSync$1(p) && statSync$1(p).isFile();
50134
50164
  });
50135
50165
  for (const hook of hooks) {
50136
- const source = join$1(BUNDLED_HOOKS_DIR, hook);
50137
- const target = join$1(hooksTarget, hook);
50166
+ const source = join(BUNDLED_HOOKS_DIR, hook);
50167
+ const target = join(hooksTarget, hook);
50138
50168
  if (existsSync$1(target)) {
50139
50169
  try {
50140
50170
  if (readlinkSync(target) === source) continue;
@@ -50155,7 +50185,7 @@ function installGitHooksInDir(gitDir) {
50155
50185
  */
50156
50186
  async function registerProjectFromPath(opts) {
50157
50187
  const { path: fullPath } = opts;
50158
- const name = opts.name ?? (basename$1(fullPath) || "unknown");
50188
+ const name = opts.name ?? (basename(fullPath) || "unknown");
50159
50189
  const key = name.toLowerCase().replace(/[^a-z0-9-]/g, "-");
50160
50190
  if (!key.replace(/-/g, "")) throw new Error(`Cannot register project: derived key '${key}' from name '${name}' contains no alphanumeric characters`);
50161
50191
  const existing = getProjectSync(key);
@@ -50167,11 +50197,11 @@ async function registerProjectFromPath(opts) {
50167
50197
  registerProjectSync(key, projectConfig);
50168
50198
  const seededContextLayer = ensureProjectLayer(fullPath);
50169
50199
  try {
50170
- const { preTrustDirectorySync } = await import("./workspace-manager-B3PqQQSM.js");
50200
+ const { preTrustDirectorySync } = await import("./workspace-manager-Cb2a7bg9.js");
50171
50201
  preTrustDirectorySync(fullPath);
50172
50202
  } catch {}
50173
50203
  let hooksInstalled = 0;
50174
- const rootGit = join$1(fullPath, ".git");
50204
+ const rootGit = join(fullPath, ".git");
50175
50205
  if (existsSync$1(rootGit)) hooksInstalled = installGitHooksInDir(rootGit);
50176
50206
  return {
50177
50207
  key,
@@ -50203,7 +50233,7 @@ init_pan_dir();
50203
50233
  init_paths();
50204
50234
  const execAsync$2 = promisify(exec);
50205
50235
  async function getIssueDataService() {
50206
- const { getSharedIssueService } = await import("./issue-service-singleton-Bnqv1uaa.js");
50236
+ const { getSharedIssueService } = await import("./issue-service-singleton-BC2JLZi7.js");
50207
50237
  return getSharedIssueService();
50208
50238
  }
50209
50239
  /** Returns true if the path exists (any type). */
@@ -50251,7 +50281,7 @@ function getSlotWorkSessionNumber(sessionId, issueLower) {
50251
50281
  function getSessionTreeWorkspacePath(issueLower, baseWorkspacePath, projectPath, sessionId) {
50252
50282
  const slotNumber = getSlotWorkSessionNumber(sessionId, issueLower);
50253
50283
  if (slotNumber === null) return baseWorkspacePath;
50254
- return join$1(projectPath, "workspaces", `feature-${issueLower}-slot-${slotNumber}`);
50284
+ return join(projectPath, "workspaces", `feature-${issueLower}-slot-${slotNumber}`);
50255
50285
  }
50256
50286
  function compareSessionTreeSessionIds(a, b, issueLower) {
50257
50287
  const planningAgentId = `planning-${issueLower}`;
@@ -50303,7 +50333,7 @@ async function readSessionGateFields(sessionId, state = getAgentStateSync(sessio
50303
50333
  }
50304
50334
  async function countQueuedMail(agentId) {
50305
50335
  try {
50306
- 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;
50307
50337
  } catch {
50308
50338
  return 0;
50309
50339
  }
@@ -50311,7 +50341,7 @@ async function countQueuedMail(agentId) {
50311
50341
  async function collectSessionTreeNodes(issueId, workspacePath, projectPath, context) {
50312
50342
  const issueLower = issueId.toLowerCase();
50313
50343
  const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
50314
- const agentsDir = join$1(getOverdeckHome(), "agents");
50344
+ const agentsDir = join(getOverdeckHome(), "agents");
50315
50345
  const agentId = `agent-${issueLower}`;
50316
50346
  const planningAgentId = `planning-${issueLower}`;
50317
50347
  const strikeAgentId = `strike-${issueLower}`;
@@ -50332,7 +50362,7 @@ async function collectSessionTreeNodes(issueId, workspacePath, projectPath, cont
50332
50362
  }
50333
50363
  for (const sessionName of context.tmuxSessionNames) if (slotWorkSessionPattern.test(sessionName)) candidateSessionIds.add(sessionName);
50334
50364
  for (const checkId of [...candidateSessionIds].sort((a, b) => compareSessionTreeSessionIds(a, b, issueLower))) {
50335
- if (!await pathExists$1(join$1(agentsDir, checkId))) continue;
50365
+ if (!await pathExists$1(join(agentsDir, checkId))) continue;
50336
50366
  const state = getAgentStateSync(checkId);
50337
50367
  if (!state) continue;
50338
50368
  try {
@@ -50369,7 +50399,7 @@ async function collectSessionTreeNodes(issueId, workspacePath, projectPath, cont
50369
50399
  } catch {}
50370
50400
  }
50371
50401
  if (!hasPlanningSection) {
50372
- const panContinuePath = join$1(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
50402
+ const panContinuePath = join(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
50373
50403
  const planningPathForTimestamp = await pathExists$1(panContinuePath) ? panContinuePath : null;
50374
50404
  if (planningPathForTimestamp) {
50375
50405
  const planningStat = await stat$1(planningPathForTimestamp).catch(() => null);
@@ -50522,7 +50552,7 @@ async function fetchProjectSessionTree(projectKey, sharedContext) {
50522
50552
  if (!project) return null;
50523
50553
  const projectPath = project.config.path;
50524
50554
  const workspaceConfig = project.config.workspace;
50525
- const workspacesDir = join$1(projectPath, workspaceConfig?.workspaces_dir || "workspaces");
50555
+ const workspacesDir = join(projectPath, workspaceConfig?.workspaces_dir || "workspaces");
50526
50556
  const effectiveSharedContext = {
50527
50557
  tmuxSessionNames: sharedContext?.tmuxSessionNames ?? new Set((await Effect.runPromise(listSessionNames()).catch(() => [])).filter((s) => s.trim())),
50528
50558
  agentSnapshotsById: sharedContext?.agentSnapshotsById
@@ -50536,12 +50566,12 @@ async function fetchProjectSessionTree(projectKey, sharedContext) {
50536
50566
  issueId: e.name.replace("feature-", "").toUpperCase()
50537
50567
  })).filter((c) => /^[a-z]+-\d+$/.test(c.issueLower));
50538
50568
  const results = await Effect.runPromise(withConcurrencyLimit(featureCandidates.map((c) => Effect.promise(async () => {
50539
- const agentDir = join$1(getOverdeckHome(), "agents", `agent-${c.issueLower}`);
50540
- 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);
50541
50571
  const [hasAgent, hasPlanning] = await Promise.all([pathExists$1(agentDir), pathExists$1(panDir)]);
50542
50572
  if (!hasAgent && !hasPlanning) return null;
50543
50573
  try {
50544
- const workspacePath = join$1(workspacesDir, c.name);
50574
+ const workspacePath = join(workspacesDir, c.name);
50545
50575
  const sessions = await collectSessionTreeNodes(c.issueId, workspacePath, projectPath, effectiveSharedContext);
50546
50576
  if (sessions.length === 0) return null;
50547
50577
  const title = await resolveFeatureTitle(c.issueId, c.issueLower, issueTitles, project);
@@ -50616,7 +50646,7 @@ async function buildHomeGuard() {
50616
50646
  } catch {
50617
50647
  ch = home;
50618
50648
  }
50619
- 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}`);
50620
50650
  }
50621
50651
  const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Effect.gen(function* () {
50622
50652
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
@@ -50628,7 +50658,7 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
50628
50658
  if (body.mode === "existing") {
50629
50659
  const rawPath = body.path;
50630
50660
  if (typeof rawPath !== "string" || !rawPath.trim()) return jsonResponse({ error: "path is required" }, { status: 400 });
50631
- 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 });
50632
50662
  const nameOpt = typeof body.name === "string" && body.name.trim() ? body.name.trim() : void 0;
50633
50663
  return yield* Effect.promise(async () => {
50634
50664
  try {
@@ -50669,14 +50699,14 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
50669
50699
  if (typeof rawName !== "string" || !rawName.trim()) return jsonResponse({ error: "name is required for mode=new" }, { status: 400 });
50670
50700
  const rawParent = body.parentDir;
50671
50701
  if (typeof rawParent !== "string" || !rawParent.trim()) return jsonResponse({ error: "parentDir is required for mode=new" }, { status: 400 });
50672
- 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 });
50673
50703
  const name = rawName.trim();
50674
50704
  const key = slugify(name);
50675
50705
  if (!key.replace(/-/g, "")) return jsonResponse({ error: "Name must contain at least one alphanumeric character" }, { status: 400 });
50676
50706
  if (getProjectSync(key)) return jsonResponse({ error: `project key '${key}' is already registered` }, { status: 409 });
50677
50707
  return yield* Effect.promise(async () => {
50678
50708
  const withinHome = await buildHomeGuard();
50679
- const rawParentResolved = resolve$1(normalize(rawParent));
50709
+ const rawParentResolved = resolve(normalize(rawParent));
50680
50710
  let probe = rawParentResolved;
50681
50711
  let existingAncestor = null;
50682
50712
  for (;;) {
@@ -50684,15 +50714,15 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
50684
50714
  existingAncestor = await realpath(probe);
50685
50715
  break;
50686
50716
  } catch {}
50687
- const up = dirname$1(probe);
50717
+ const up = dirname(probe);
50688
50718
  if (up === probe) break;
50689
50719
  probe = up;
50690
50720
  }
50691
50721
  if (!existingAncestor || !withinHome(existingAncestor)) return jsonResponse({ error: "parentDir is outside home directory" }, { status: 400 });
50692
- const suffix = relative$1(probe, rawParentResolved);
50693
- const canonicalParent = suffix ? resolve$1(existingAncestor, suffix) : existingAncestor;
50722
+ const suffix = relative(probe, rawParentResolved);
50723
+ const canonicalParent = suffix ? resolve(existingAncestor, suffix) : existingAncestor;
50694
50724
  if (!withinHome(canonicalParent)) return jsonResponse({ error: "parentDir is outside home directory" }, { status: 400 });
50695
- const target = join$1(canonicalParent, key);
50725
+ const target = join(canonicalParent, key);
50696
50726
  let targetExists = false;
50697
50727
  try {
50698
50728
  await access(target);
@@ -50745,14 +50775,14 @@ const execFileAsync$1 = promisify(execFile);
50745
50775
  const decodePreviewRequest = Schema.decodeUnknownSync(ContextPreviewRequest);
50746
50776
  const decodeSaveRequest = Schema.decodeUnknownSync(ContextLayerSaveRequest);
50747
50777
  function globalContextFile(overdeckHome = getOverdeckHome()) {
50748
- return overdeckHome === getOverdeckHome() ? globalContextFile$1() : join$1(overdeckHome, "context", "global.md");
50778
+ return overdeckHome === getOverdeckHome() ? globalContextFile$1() : join(overdeckHome, "context", "global.md");
50749
50779
  }
50750
50780
  function contextDirForFile(file) {
50751
- return dirname$1(file);
50781
+ return dirname(file);
50752
50782
  }
50753
50783
  function pathWithin(root, candidate) {
50754
- const rel = relative$1(resolve$1(root), resolve$1(candidate));
50755
- return rel === "" || !!rel && !rel.startsWith("..") && !isAbsolute$1(rel);
50784
+ const rel = relative(resolve(root), resolve(candidate));
50785
+ return rel === "" || !!rel && !rel.startsWith("..") && !isAbsolute(rel);
50756
50786
  }
50757
50787
  function assertPathInside(root, candidate) {
50758
50788
  if (!pathWithin(root, candidate)) throw new Error(`Path escapes allowed root: ${candidate}`);
@@ -50773,13 +50803,13 @@ async function readOptionalFile(path) {
50773
50803
  }
50774
50804
  function workspaceRootForProject(project) {
50775
50805
  const configured = project.workspace?.workspaces_dir ?? "workspaces";
50776
- return isAbsolute$1(configured) ? resolve$1(configured) : resolve$1(project.path, configured);
50806
+ return isAbsolute(configured) ? resolve(configured) : resolve(project.path, configured);
50777
50807
  }
50778
50808
  function summarizeProject({ key, config }) {
50779
50809
  return {
50780
50810
  projectKey: key,
50781
50811
  name: config.name,
50782
- path: resolve$1(config.path),
50812
+ path: resolve(config.path),
50783
50813
  ...config.issue_prefix ? { issuePrefix: config.issue_prefix } : {},
50784
50814
  ...config.tracker ? { tracker: config.tracker } : {},
50785
50815
  workspaceRoot: workspaceRootForProject(config)
@@ -50798,7 +50828,7 @@ async function discoverWorkspacesForProject(projectKey, config) {
50798
50828
  if (error.code === "ENOENT") return [];
50799
50829
  throw error;
50800
50830
  })).filter((entry) => entry.isDirectory() && !entry.name.startsWith(".")).map((entry) => {
50801
- const path = resolve$1(root, entry.name);
50831
+ const path = resolve(root, entry.name);
50802
50832
  assertPathInside(root, path);
50803
50833
  return {
50804
50834
  projectKey,
@@ -50814,7 +50844,7 @@ async function buildContextCatalog(projects) {
50814
50844
  key: project.key,
50815
50845
  config: {
50816
50846
  ...project.config,
50817
- path: resolve$1(project.config.path)
50847
+ path: resolve(project.config.path)
50818
50848
  }
50819
50849
  })).sort((a, b) => a.key.localeCompare(b.key));
50820
50850
  const workspaceGroups = await Promise.all(normalizedProjects.map((project) => discoverWorkspacesForProject(project.key, project.config)));
@@ -50828,7 +50858,7 @@ function targetKey(target) {
50828
50858
  switch (target.kind) {
50829
50859
  case "global": return "global";
50830
50860
  case "project": return `project:${target.projectKey}`;
50831
- case "workspace": return `workspace:${target.projectKey}:${resolve$1(target.workspacePath)}`;
50861
+ case "workspace": return `workspace:${target.projectKey}:${resolve(target.workspacePath)}`;
50832
50862
  }
50833
50863
  }
50834
50864
  function targetForLayer(layer) {
@@ -50841,7 +50871,7 @@ function targetForLayer(layer) {
50841
50871
  case "workspace": return {
50842
50872
  kind: "workspace",
50843
50873
  projectKey: layer.projectKey,
50844
- workspacePath: resolve$1(layer.workspacePath)
50874
+ workspacePath: resolve(layer.workspacePath)
50845
50875
  };
50846
50876
  }
50847
50877
  }
@@ -50852,7 +50882,7 @@ function selectedProjectKey(target) {
50852
50882
  if (target.kind === "project" || target.kind === "workspace") return target.projectKey;
50853
50883
  }
50854
50884
  function selectedWorkspacePath(target) {
50855
- return target.kind === "workspace" ? resolve$1(target.workspacePath) : void 0;
50885
+ return target.kind === "workspace" ? resolve(target.workspacePath) : void 0;
50856
50886
  }
50857
50887
  function applicableLayers(state, selectedLayer) {
50858
50888
  const projectKey = selectedProjectKey(selectedLayer);
@@ -50860,7 +50890,7 @@ function applicableLayers(state, selectedLayer) {
50860
50890
  return state.resolvedLayers.filter((layer) => {
50861
50891
  if (layer.kind === "global") return true;
50862
50892
  if (layer.kind === "project") return layer.projectKey === projectKey;
50863
- return layer.projectKey === projectKey && resolve$1(layer.workspacePath) === workspacePath;
50893
+ return layer.projectKey === projectKey && resolve(layer.workspacePath) === workspacePath;
50864
50894
  });
50865
50895
  }
50866
50896
  async function layerRecord(file, base) {
@@ -50898,11 +50928,11 @@ async function describeSyncTarget(harness, layerKind, projectKey, label, path) {
50898
50928
  * a Overdeck-owned file, not a user file, so it is not listed as a target.
50899
50929
  */
50900
50930
  async function buildSyncTargets(projects) {
50901
- 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())];
50902
50932
  for (const { key, config } of projects) {
50903
50933
  if (!(await readOptionalFile(resolveProjectContextFile(config.path))).exists) continue;
50904
- targets.push(await describeSyncTarget("claude-code", "project", key, `${config.name} · CLAUDE.md`, join$1(config.path, "CLAUDE.md")));
50905
- 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")));
50906
50936
  }
50907
50937
  return targets;
50908
50938
  }
@@ -50965,7 +50995,7 @@ async function renderBundledRulesAsync(harness) {
50965
50995
  const includeDev = isDevMode();
50966
50996
  const entries = await readdir(SYNC_SOURCES.rules, { withFileTypes: true }).catch(() => []);
50967
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) => {
50968
- const file = join$1(SYNC_SOURCES.rules, entry.name);
50998
+ const file = join(SYNC_SOURCES.rules, entry.name);
50969
50999
  assertPathInside(SYNC_SOURCES.rules, file);
50970
51000
  const rule = parseRule(await readFile(file, "utf-8"));
50971
51001
  if (!includeDev && rule.scope === "dev") return "";
@@ -51055,7 +51085,7 @@ async function saveContextLayer(projects, requestOrTarget, maybeContentOrOverdec
51055
51085
  const layer = requireLayer(await buildContextLayerState(projects, "operation" in requestOrTarget ? maybeContentOrOverdeckHome ?? maybeOverdeckHome : maybeOverdeckHome), request.target);
51056
51086
  if (!pathWithin(layer.dir, layer.file)) throw new Error(`Context layer path escapes its directory: ${layer.file}`);
51057
51087
  await mkdir(layer.dir, { recursive: true });
51058
- const tempFile = join$1(layer.dir, `.${randomUUID$1()}.tmp`);
51088
+ const tempFile = join(layer.dir, `.${randomUUID$1()}.tmp`);
51059
51089
  try {
51060
51090
  await writeFile(tempFile, request.content, "utf-8");
51061
51091
  await rename(tempFile, layer.file);
@@ -51178,8 +51208,8 @@ init_conversations();
51178
51208
  */
51179
51209
  const getAdminTldrRoute = HttpRouter.add("GET", "/api/admin/tldr/:issueId", httpHandler(Effect.gen(function* () {
51180
51210
  const issueId = (yield* HttpRouter.params)["issueId"] ?? "";
51181
- const workspacePath = join$1(resolveProjectFromIssueSync(issueId)?.projectPath ?? process.cwd(), "workspaces", `feature-${issueId.toLowerCase()}`);
51182
- 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");
51183
51213
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
51184
51214
  if (!existsSync$1(venvPath)) return jsonResponse({
51185
51215
  available: false,
@@ -51307,7 +51337,7 @@ function checkCommand(cmd) {
51307
51337
  }
51308
51338
  async function isToolInstalled(tool) {
51309
51339
  if (tool === "traefik") return checkCommand("docker");
51310
- 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"));
51311
51341
  return checkCommand(tool);
51312
51342
  }
51313
51343
  /** Install a single tool. Returns a result object (never throws). */
@@ -51344,9 +51374,9 @@ async function installTmux() {
51344
51374
  }
51345
51375
  async function installTtyd() {
51346
51376
  const plat = await Effect.runPromise(detectPlatform());
51347
- const binDir = join$1(homedir$1(), "bin");
51377
+ const binDir = join(homedir$1(), "bin");
51348
51378
  mkdirSync$1(binDir, { recursive: true });
51349
- const ttydPath = join$1(binDir, "ttyd");
51379
+ const ttydPath = join(binDir, "ttyd");
51350
51380
  if (plat === "darwin") try {
51351
51381
  await execAsync$1("brew install ttyd", { timeout: 12e4 });
51352
51382
  return {
@@ -51372,9 +51402,9 @@ async function installMkcert() {
51372
51402
  message: "mkcert installed via Homebrew and CA set up"
51373
51403
  };
51374
51404
  }
51375
- const binDir = join$1(homedir$1(), ".local", "bin");
51405
+ const binDir = join(homedir$1(), ".local", "bin");
51376
51406
  mkdirSync$1(binDir, { recursive: true });
51377
- const mkcertPath = join$1(binDir, "mkcert");
51407
+ const mkcertPath = join(binDir, "mkcert");
51378
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 });
51379
51409
  await execAsync$1("mkcert -install", { timeout: 3e4 });
51380
51410
  return {
@@ -51403,8 +51433,8 @@ async function installOx() {
51403
51433
  const plat = await Effect.runPromise(detectPlatform());
51404
51434
  const arch = process.arch === "x64" ? "amd64" : process.arch;
51405
51435
  const platform = plat === "darwin" ? "darwin" : "linux";
51406
- const binDir = join$1(homedir$1(), ".local", "bin");
51407
- const oxPath = join$1(binDir, "ox");
51436
+ const binDir = join(homedir$1(), ".local", "bin");
51437
+ const oxPath = join(binDir, "ox");
51408
51438
  mkdirSync$1(binDir, { recursive: true });
51409
51439
  await execAsync$1(`curl -sL "https://github.com/eltmon/ox/releases/download/latest/ox-${platform}-${arch}" -o "${oxPath}" && chmod +x "${oxPath}"`, { timeout: 6e4 });
51410
51440
  return {
@@ -51995,7 +52025,7 @@ async function relayCiFailureFeedbackPromise(opts) {
51995
52025
  return { agentMessageSent: false };
51996
52026
  }
51997
52027
  const resolved = resolveProjectFromIssueSync(issueId);
51998
- 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;
51999
52029
  const markdownBody = buildFeedbackBody({
52000
52030
  issueId,
52001
52031
  repo: opts.repo,
@@ -52203,7 +52233,7 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
52203
52233
  let mergeState;
52204
52234
  let isDraft;
52205
52235
  let checksFailed;
52206
- const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-B5PDHMyn.js");
52236
+ const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-C7lftMNj.js");
52207
52237
  if (isGitHubAppConfigured()) {
52208
52238
  const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
52209
52239
  mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
@@ -52352,8 +52382,8 @@ async function handlePullRequestPromise(payload) {
52352
52382
  bumpIssuePrTabCacheGeneration(issueId);
52353
52383
  const repo = payload.repository.full_name;
52354
52384
  if (payload.action === "closed" && pr.merged === true) try {
52355
- const { postMergeLifecycle } = await import("./merge-agent-Dh8Y9PDO.js");
52356
- const { resolveProjectFromIssueSync } = await import("./projects-BNmVxnNt.js");
52385
+ const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
52386
+ const { resolveProjectFromIssueSync } = await import("./projects-Bqfwuqet.js");
52357
52387
  const project = resolveProjectFromIssueSync(issueId);
52358
52388
  if (project) {
52359
52389
  const branchName = pr.head.ref;
@@ -52655,7 +52685,7 @@ async function reconcileStaleGitHubBlockers() {
52655
52685
  * Verifies X-Hub-Signature-256 HMAC-SHA256 signature.
52656
52686
  * Dispatches to per-event-type handlers.
52657
52687
  */
52658
- 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");
52659
52689
  let _cachedWebhookSecret = void 0;
52660
52690
  let _secretLoadPromise = null;
52661
52691
  async function loadWebhookSecret() {
@@ -52868,12 +52898,12 @@ async function readComplianceWarningMarkers(projectId, issueId) {
52868
52898
  async function writeComplianceWarningMarkers(projectId, issueId, markers) {
52869
52899
  const path = resolveComplianceWarningMarkersFile(projectId, issueId);
52870
52900
  await ensureParentDir(path);
52871
- const tempPath = join(dirname(path), `.${randomUUID()}.tmp`);
52901
+ const tempPath = join$1(dirname$1(path), `.${randomUUID()}.tmp`);
52872
52902
  await writeFile$1(tempPath, `${JSON.stringify({ warnedObservationIds: [...new Set(markers.warnedObservationIds)] }, null, 2)}\n`, "utf8");
52873
52903
  await rename$1(tempPath, path);
52874
52904
  }
52875
52905
  function resolveComplianceWarningMarkersFile(projectId, issueId) {
52876
- return join(resolveIssueMemoryRoot(projectId, issueId), "compliance", "warned-misses.json");
52906
+ return join$1(resolveIssueMemoryRoot(projectId, issueId), "compliance", "warned-misses.json");
52877
52907
  }
52878
52908
  function isCurrentSessionMiss(observation, identity) {
52879
52909
  return observation.sessionId === identity.sessionId && observation.actionStatus === "compliance.miss" && observation.tags.includes("compliance") && observation.tags.includes("miss");
@@ -52918,7 +52948,7 @@ function getCheckpointWorker() {
52918
52948
  return worker;
52919
52949
  }
52920
52950
  async function runInline(operation, payload) {
52921
- const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-BjlBWOA8.js");
52951
+ const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-BK17oicz.js");
52922
52952
  switch (operation) {
52923
52953
  case "claimTranscriptRange": return claimTranscriptRange(payload);
52924
52954
  case "commitTranscriptRange": return commitTranscriptRange(payload);
@@ -53306,7 +53336,7 @@ var CodexTranscriptSource = class {
53306
53336
  async resolveAgentTranscript(agent) {
53307
53337
  const threadId = await this.readThreadId(agent);
53308
53338
  if (!threadId) return null;
53309
- const rolloutPath = findRolloutPath(join$1(getAgentDir(agent.id), "codex-home"), threadId);
53339
+ const rolloutPath = findRolloutPath(join(getAgentDir(agent.id), "codex-home"), threadId);
53310
53340
  if (!rolloutPath) return null;
53311
53341
  let fileStat;
53312
53342
  try {
@@ -53363,13 +53393,13 @@ function getAgentRuntimeStateFromStore$1(agentId) {
53363
53393
  async function readPiSessionId(agent) {
53364
53394
  if (agent.sessionId) return agent.sessionId;
53365
53395
  try {
53366
- 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;
53367
53397
  } catch {
53368
53398
  return null;
53369
53399
  }
53370
53400
  }
53371
53401
  async function resolvePiTranscriptPath(agent, sessionId) {
53372
- const sessionDir = join$1(getAgentDir(agent.id), "sessions");
53402
+ const sessionDir = join(getAgentDir(agent.id), "sessions");
53373
53403
  let entries;
53374
53404
  try {
53375
53405
  entries = (await readdir(sessionDir)).filter((name) => name.endsWith(".jsonl")).sort();
@@ -53377,16 +53407,16 @@ async function resolvePiTranscriptPath(agent, sessionId) {
53377
53407
  return null;
53378
53408
  }
53379
53409
  const matching = entries.findLast((name) => name.includes(sessionId));
53380
- if (matching) return join$1(sessionDir, matching);
53381
- 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;
53382
53412
  }
53383
53413
  function isClaudeCodeSubagentSession(_sessionId, _agent, transcriptPath) {
53384
- return transcriptPath.split(sep$1).includes("subagents") || transcriptPath.includes("/subagents/");
53414
+ return transcriptPath.split(sep).includes("subagents") || transcriptPath.includes("/subagents/");
53385
53415
  }
53386
53416
  function buildMemoryIdentity(agent, sessionId) {
53387
53417
  return {
53388
53418
  projectId: inferProjectId$1(agent.workspace),
53389
- workspaceId: basename$1(agent.workspace),
53419
+ workspaceId: basename(agent.workspace),
53390
53420
  issueId: agent.issueId,
53391
53421
  runId: agent.id,
53392
53422
  sessionId,
@@ -53395,12 +53425,12 @@ function buildMemoryIdentity(agent, sessionId) {
53395
53425
  };
53396
53426
  }
53397
53427
  function inferProjectId$1(workspacePath) {
53398
- if (basename$1(workspacePath).startsWith("feature-")) return basename$1(dirname$1(dirname$1(workspacePath)));
53399
- return basename$1(workspacePath);
53428
+ if (basename(workspacePath).startsWith("feature-")) return basename(dirname(dirname(workspacePath)));
53429
+ return basename(workspacePath);
53400
53430
  }
53401
53431
  async function readCodexThreadId(agent) {
53402
53432
  try {
53403
- 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;
53404
53434
  } catch {
53405
53435
  return null;
53406
53436
  }
@@ -53694,7 +53724,7 @@ async function upsertObservationMarkdown(markdownPath, observation) {
53694
53724
  const index = lines.findIndex((line) => line.includes(marker));
53695
53725
  if (index === -1) lines.push(nextLine);
53696
53726
  else lines[index] = nextLine;
53697
- const tempPath = `${dirname(markdownPath)}/.${randomUUID()}.tmp`;
53727
+ const tempPath = `${dirname$1(markdownPath)}/.${randomUUID()}.tmp`;
53698
53728
  await writeFile$1(tempPath, `${lines.join("\n")}\n`, "utf8");
53699
53729
  await rename$1(tempPath, markdownPath);
53700
53730
  }
@@ -54072,7 +54102,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
54072
54102
  };
54073
54103
  }
54074
54104
  async function emitMemoryObservationCreated(observation, timestamp) {
54075
- const { initEventStore } = await import("./event-store-DIk9wvnS.js");
54105
+ const { initEventStore } = await import("./event-store-DU3HkZlN.js");
54076
54106
  await (await initEventStore()).appendAsync({
54077
54107
  type: "memory.observation_created",
54078
54108
  timestamp,
@@ -54623,7 +54653,7 @@ async function handleMemoryTurnBody(body, options = {}) {
54623
54653
  const payloadIdentity = parseMemoryIdentity(payload.identity, sessionId);
54624
54654
  let agentState = null;
54625
54655
  const trustedTranscriptPath = options.resolveTranscriptPath ? await options.resolveTranscriptPath(body, sessionId) : resolveTrustedTranscriptPathFromState(agentState = await resolveAgentState(body, sessionId, options.resolveAgentIdBySessionId), sessionId);
54626
- if (!trustedTranscriptPath || resolve(transcriptPath) !== trustedTranscriptPath) return {
54656
+ if (!trustedTranscriptPath || resolve$1(transcriptPath) !== trustedTranscriptPath) return {
54627
54657
  status: "error",
54628
54658
  statusCode: 422,
54629
54659
  error: "transcript path could not be verified"
@@ -54674,7 +54704,7 @@ async function handleMemorySessionStartBody(body, options = {}) {
54674
54704
  } : { sessionId }).catch(() => {});
54675
54705
  if (!await (options.areObservationsEnabled ?? areMemoryObservationsEnabled)()) return { status: "disabled" };
54676
54706
  const trustedTranscriptPath = options.resolveTranscriptPath ? await options.resolveTranscriptPath(body, sessionId) : await resolveTrustedTranscriptPath(body, sessionId, options.resolveAgentIdBySessionId);
54677
- if (!trustedTranscriptPath || resolve(transcriptPath) !== trustedTranscriptPath) return {
54707
+ if (!trustedTranscriptPath || resolve$1(transcriptPath) !== trustedTranscriptPath) return {
54678
54708
  status: "error",
54679
54709
  statusCode: 422,
54680
54710
  error: "transcript path could not be verified"
@@ -54922,7 +54952,7 @@ function resolveMemoryIdentityFromState(state, sessionId) {
54922
54952
  if (!state) return null;
54923
54953
  return {
54924
54954
  projectId: inferProjectId(state.workspace),
54925
- workspaceId: basename(state.workspace),
54955
+ workspaceId: basename$1(state.workspace),
54926
54956
  issueId: state.issueId,
54927
54957
  runId: state.id,
54928
54958
  sessionId,
@@ -54934,7 +54964,7 @@ async function resolveTrustedTranscriptPath(body, sessionId, resolveAgentIdBySes
54934
54964
  return resolveTrustedTranscriptPathFromState(await resolveAgentState(body, sessionId, resolveAgentIdBySessionId), sessionId);
54935
54965
  }
54936
54966
  function resolveTrustedTranscriptPathFromState(state, sessionId) {
54937
- return state ? resolve(sessionFilePath(state.workspace, sessionId)) : null;
54967
+ return state ? resolve$1(sessionFilePath(state.workspace, sessionId)) : null;
54938
54968
  }
54939
54969
  async function resolveAgentState(body, sessionId, resolveAgentIdBySessionId) {
54940
54970
  const agentId = stringField(body.agentId) ?? stringField(body.agent_id);
@@ -54953,8 +54983,8 @@ async function findAgentStateBySessionId(sessionId, resolveAgentIdBySessionId) {
54953
54983
  return null;
54954
54984
  }
54955
54985
  function inferProjectId(workspacePath) {
54956
- if (basename(workspacePath).startsWith("feature-")) return basename(dirname(dirname(workspacePath)));
54957
- return basename(workspacePath);
54986
+ if (basename$1(workspacePath).startsWith("feature-")) return basename$1(dirname$1(dirname$1(workspacePath)));
54987
+ return basename$1(workspacePath);
54958
54988
  }
54959
54989
  function validOffset(value) {
54960
54990
  return Number.isInteger(value) && value >= 0;
@@ -55890,15 +55920,15 @@ const discoveredSessionsRouteLayer = Layer.mergeAll(getStatsRoute, listRoute, se
55890
55920
  //#region services/flywheel-state.ts
55891
55921
  const FLYWHEEL_STATE_RELATIVE_PATH = "docs/FLYWHEEL-STATE.md";
55892
55922
  function resolveStatePath(projectRoot) {
55893
- const root = resolve$1(projectRoot);
55894
- const absolute = resolve$1(root, FLYWHEEL_STATE_RELATIVE_PATH);
55895
- const rel = relative$1(root, absolute);
55896
- 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");
55897
55927
  return absolute;
55898
55928
  }
55899
55929
  async function readFlywheelState(options = {}) {
55900
55930
  const absolute = resolveStatePath(options.projectRoot ?? process.cwd());
55901
- const displayPath = join$1(FLYWHEEL_STATE_RELATIVE_PATH);
55931
+ const displayPath = join(FLYWHEEL_STATE_RELATIVE_PATH);
55902
55932
  try {
55903
55933
  const [content, info] = await Promise.all([readFile(absolute, "utf8"), stat$1(absolute)]);
55904
55934
  return {
@@ -56879,8 +56909,8 @@ function requireTrustedOrigin(request) {
56879
56909
  return originCheck.ok ? null : jsonResponse({ error: originCheck.error }, { status: 403 });
56880
56910
  }
56881
56911
  function isInsideRoot(projectRoot, candidate) {
56882
- const relativePath = relative$1(projectRoot, candidate);
56883
- return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute$1(relativePath);
56912
+ const relativePath = relative(projectRoot, candidate);
56913
+ return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute(relativePath);
56884
56914
  }
56885
56915
  function parseRunIdParam(runId) {
56886
56916
  try {
@@ -56901,10 +56931,10 @@ function parseRunsLimit(value) {
56901
56931
  return Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : void 0;
56902
56932
  }
56903
56933
  function resolveFlywheelBriefPath(projectRoot) {
56904
- const root = resolve$1(projectRoot);
56905
- const resolvedPath = resolve$1(root, DEFAULT_BRIEF_PATH);
56906
- const normalizedRoot = root.endsWith(sep$1) ? root : `${root}${sep$1}`;
56907
- 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);
56908
56938
  return {
56909
56939
  ok: true,
56910
56940
  path: resolvedPath.startsWith(normalizedRoot) ? displayPath : resolvedPath
@@ -56915,7 +56945,7 @@ function resolveBriefAbsolutePath(projectRoot) {
56915
56945
  if (!resolved.ok) return resolved;
56916
56946
  return {
56917
56947
  ok: true,
56918
- absolutePath: resolve$1(projectRoot, resolved.path),
56948
+ absolutePath: resolve(projectRoot, resolved.path),
56919
56949
  displayPath: resolved.path
56920
56950
  };
56921
56951
  }
@@ -56928,7 +56958,7 @@ async function assertExistingPathInsideRoot(projectRoot, candidate) {
56928
56958
  }
56929
56959
  async function assertWritePathInsideRoot(projectRoot, candidate) {
56930
56960
  const realRoot = await realpath(projectRoot);
56931
- if (!isInsideRoot(realRoot, await realpath(dirname$1(candidate)))) return {
56961
+ if (!isInsideRoot(realRoot, await realpath(dirname(candidate)))) return {
56932
56962
  ok: false,
56933
56963
  error: "Brief path must stay inside the project root"
56934
56964
  };
@@ -57169,7 +57199,7 @@ async function getFlywheelConversationPayload() {
57169
57199
  };
57170
57200
  }
57171
57201
  async function postFlywheelReportPayload() {
57172
- const { flywheelReportCommand } = await import("./flywheel-DefHRzY4.js");
57202
+ const { flywheelReportCommand } = await import("./flywheel-D2LdPSic.js");
57173
57203
  await flywheelReportCommand({ cwd: process.cwd() });
57174
57204
  return {
57175
57205
  status: 200,
@@ -57327,11 +57357,11 @@ const getMergeBlockersRoute = HttpRouter.add("GET", "/api/flywheel/merge-blocker
57327
57357
  async function defaultGetOrderedIssueIds() {
57328
57358
  const status = await readCurrentFlywheelStatusForDashboard();
57329
57359
  if (!status) return [];
57330
- const { computeMergeQueue } = await import("./flywheel-merge-order-B6YDSElh.js");
57360
+ const { computeMergeQueue } = await import("./flywheel-merge-order-CttTazRY.js");
57331
57361
  return (await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd()).pipe(Effect.provide(layer)))).map((i) => i.issueId);
57332
57362
  }
57333
57363
  async function defaultMergeOne(issueId) {
57334
- const { triggerMerge } = await import("./merge-ops-QdBiQ8XB.js");
57364
+ const { triggerMerge } = await import("./merge-ops-Czke6UAp.js");
57335
57365
  const r = await triggerMerge(issueId);
57336
57366
  return r.success ? { ok: true } : {
57337
57367
  ok: false,
@@ -57494,7 +57524,7 @@ const postFlywheelBriefRoute = HttpRouter.add("POST", "/api/flywheel/brief", htt
57494
57524
  const resolved = resolveBriefAbsolutePath(process.cwd());
57495
57525
  if (!resolved.ok) return jsonResponse({ error: resolved.error }, { status: 400 });
57496
57526
  return yield* Effect.promise(async () => {
57497
- await mkdir(dirname$1(resolved.absolutePath), { recursive: true });
57527
+ await mkdir(dirname(resolved.absolutePath), { recursive: true });
57498
57528
  const containment = await assertWritePathInsideRoot(process.cwd(), resolved.absolutePath);
57499
57529
  if (!containment.ok) return jsonResponse({ error: containment.error }, { status: 400 });
57500
57530
  await writeFile(resolved.absolutePath, bodyContent, "utf8");
@@ -57508,7 +57538,7 @@ const getFlywheelMergeQueueRoute = HttpRouter.add("GET", "/api/flywheel/merge-qu
57508
57538
  return yield* Effect.promise(async () => {
57509
57539
  const status = await readCurrentFlywheelStatusForDashboard();
57510
57540
  if (!status) return jsonResponse([]);
57511
- const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-B6YDSElh.js");
57541
+ const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-CttTazRY.js");
57512
57542
  return jsonResponse(await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd(), { getPrUrl: resolveMergeQueuePrUrl }).pipe(Effect.provide(layer))));
57513
57543
  });
57514
57544
  })));
@@ -57522,18 +57552,18 @@ function uatGenerationNameFromParam(param) {
57522
57552
  return decoded.startsWith("uat/") ? decoded : `uat/${decoded}`;
57523
57553
  }
57524
57554
  const getUatGenerationsRoute = HttpRouter.add("GET", "/api/flywheel/uat-generations", httpHandler(Effect.gen(function* () {
57525
- const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-C3hWXtip.js"));
57555
+ const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57526
57556
  return jsonResponse(yield* Effect.promise(() => getUatGenerationsPayload()));
57527
57557
  })));
57528
57558
  const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
57529
- const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-C3hWXtip.js"));
57559
+ const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57530
57560
  return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
57531
57561
  })));
57532
57562
  const postUatGenerationStackRoute = HttpRouter.add("POST", "/api/flywheel/uat-generations/:name/stack", httpHandler(Effect.gen(function* () {
57533
57563
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
57534
57564
  if (authError) return authError;
57535
57565
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
57536
- const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-C3hWXtip.js"));
57566
+ const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57537
57567
  const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
57538
57568
  if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
57539
57569
  return jsonResponse({
@@ -57545,8 +57575,8 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
57545
57575
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
57546
57576
  if (authError) return authError;
57547
57577
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
57548
- const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-C3hWXtip.js"));
57549
- const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-BCjcG4uE.js"));
57578
+ const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57579
+ const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-BLIreoE7.js"));
57550
57580
  const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle));
57551
57581
  if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
57552
57582
  return jsonResponse(result);
@@ -57559,7 +57589,7 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
57559
57589
  const postFlywheelAssembleUatRoute = HttpRouter.add("POST", "/api/flywheel/assemble-uat", httpHandler(Effect.gen(function* () {
57560
57590
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
57561
57591
  if (authError) return authError;
57562
- const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-C3hWXtip.js"));
57592
+ const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
57563
57593
  return jsonResponse(yield* Effect.promise(() => runUatTrainReconcile({ force: true })));
57564
57594
  })));
57565
57595
  const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
@@ -57573,10 +57603,10 @@ const DEFAULT_THUMBNAIL_WIDTH = 640;
57573
57603
  const DEFAULT_THUMBNAIL_HEIGHT = 360;
57574
57604
  const DEFAULT_THUMBNAIL_TIMEOUT_MS = 1e4;
57575
57605
  function getArtifactThumbnailDir(slug) {
57576
- return join$1(getOverdeckHome(), "artifacts", "thumbnails", slug);
57606
+ return join(getOverdeckHome(), "artifacts", "thumbnails", slug);
57577
57607
  }
57578
57608
  function getArtifactThumbnailPath(slug, publishedHash) {
57579
- return join$1(getArtifactThumbnailDir(slug), `${sanitizeHashForPath(publishedHash)}.png`);
57609
+ return join(getArtifactThumbnailDir(slug), `${sanitizeHashForPath(publishedHash)}.png`);
57580
57610
  }
57581
57611
  function resolveArtifactThumbnailUrl(artifact) {
57582
57612
  const publishedHash = artifact.lastPublishedHash;
@@ -57593,7 +57623,7 @@ async function getOrCreateArtifactThumbnail(artifact, options = {}) {
57593
57623
  cacheHit: true
57594
57624
  };
57595
57625
  try {
57596
- await mkdir(dirname$1(path), { recursive: true });
57626
+ await mkdir(dirname(path), { recursive: true });
57597
57627
  await (options.renderer ?? renderArtifactThumbnailWithPlaywright)({
57598
57628
  rawUrl: options.rawUrl ?? defaultRawArtifactUrl(artifact.slug),
57599
57629
  outputPath: path,
@@ -57703,7 +57733,7 @@ function isArtifactHost(headers, baseDomain) {
57703
57733
  return normalizedHost(headerValue(headers, "host")) === `artifacts.${artifactDomain(baseDomain)}`;
57704
57734
  }
57705
57735
  function getPublishedSnapshotPath(slug) {
57706
- return join$1(getOverdeckHome(), "artifacts", "snapshots", slug, "index.html");
57736
+ return join(getOverdeckHome(), "artifacts", "snapshots", slug, "index.html");
57707
57737
  }
57708
57738
  function resolveArtifactUrls(slug, baseDomain) {
57709
57739
  const domain = baseDomain ?? process.env.PAN_ARTIFACT_DOMAIN ?? "overdeck.localhost";
@@ -58160,7 +58190,7 @@ function buildNamedParams(row) {
58160
58190
  * has no live session is marked stopped.
58161
58191
  */
58162
58192
  function backfillAgentsFromStateJsonSync(db, options) {
58163
- const agentsDir = join$1(getOverdeckHome(), "agents");
58193
+ const agentsDir = join(getOverdeckHome(), "agents");
58164
58194
  const liveSessions = options?.listLiveSessions?.() ?? listLiveTmuxSessionNames();
58165
58195
  const readHarnessModel = options?.readHarnessModel ?? readAgentHarnessModelRecordSync;
58166
58196
  let processed = 0;
@@ -58181,11 +58211,11 @@ function backfillAgentsFromStateJsonSync(db, options) {
58181
58211
  const upsert = db.prepare(`INSERT OR REPLACE INTO agents (${columns.join(", ")}) VALUES (${placeholders})`);
58182
58212
  db.transaction(() => {
58183
58213
  for (const entry of entries) {
58184
- const dirPath = join$1(agentsDir, entry);
58214
+ const dirPath = join(agentsDir, entry);
58185
58215
  let statePath;
58186
58216
  try {
58187
58217
  if (!statSync$1(dirPath).isDirectory()) continue;
58188
- statePath = join$1(dirPath, "state.json");
58218
+ statePath = join(dirPath, "state.json");
58189
58219
  } catch {
58190
58220
  continue;
58191
58221
  }
@@ -59578,7 +59608,7 @@ function runMigrations(db, dbPath) {
59578
59608
  }
59579
59609
  if (currentVersion < 55) {
59580
59610
  try {
59581
- const resolvedDbPath = dbPath ?? join(getOverdeckHome(), "panopticon.db");
59611
+ const resolvedDbPath = dbPath ?? join$1(getOverdeckHome(), "panopticon.db");
59582
59612
  const snapshotPath = `${resolvedDbPath}.v54-backfill-snapshot`;
59583
59613
  if (existsSync(resolvedDbPath) && !existsSync(snapshotPath)) {
59584
59614
  writeFileSync(snapshotPath, readFileSync(resolvedDbPath));
@@ -59715,7 +59745,7 @@ let _db = null;
59715
59745
  * Get the path to panopticon.db (dynamic, respects OVERDECK_HOME override for tests)
59716
59746
  */
59717
59747
  function getDatabasePath() {
59718
- return join(getOverdeckHome(), "panopticon.db");
59748
+ return join$1(getOverdeckHome(), "panopticon.db");
59719
59749
  }
59720
59750
  /**
59721
59751
  * Initialize and return the singleton database connection.
@@ -59795,7 +59825,7 @@ function clearBacklogSequence(projectKey) {
59795
59825
  getDatabase().prepare("DELETE FROM backlog_sequence WHERE project_key = ?").run(projectKey);
59796
59826
  }
59797
59827
  function getBacklogSequenceForRoot(projectRoot) {
59798
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
59828
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
59799
59829
  if (existsSync$1(seqPath)) {
59800
59830
  const result = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
59801
59831
  if (result.ok) {
@@ -59866,20 +59896,20 @@ const getBacklogSequenceRoute = HttpRouter.add("GET", "/api/backlog/sequence", h
59866
59896
  nodes: [],
59867
59897
  edges: []
59868
59898
  });
59869
- const draftsDir = join$1(projectRoot, ".pan", "drafts");
59899
+ const draftsDir = join(projectRoot, ".pan", "drafts");
59870
59900
  const prdFiles = existsSync$1(draftsDir) ? new Set(readdirSync$1(draftsDir).map((f) => f.replace(/\.md$/, "").toUpperCase())) : /* @__PURE__ */ new Set();
59871
- const specsDir = join$1(projectRoot, ".pan", "specs");
59901
+ const specsDir = join(projectRoot, ".pan", "specs");
59872
59902
  const specIssues = /* @__PURE__ */ new Set();
59873
59903
  if (existsSync$1(specsDir)) for (const f of readdirSync$1(specsDir)) {
59874
59904
  const match = /^[\d-]+-([A-Z]+-\d+)-/i.exec(f);
59875
59905
  if (match) specIssues.add(match[1].toUpperCase());
59876
59906
  }
59877
- const workspacesDir = join$1(projectRoot, "workspaces");
59907
+ const workspacesDir = join(projectRoot, "workspaces");
59878
59908
  const issuesWithBeads = /* @__PURE__ */ new Set();
59879
59909
  if (existsSync$1(workspacesDir)) for (const dir of readdirSync$1(workspacesDir)) {
59880
59910
  const match = /^feature-([a-z]+-\d+)$/i.exec(dir);
59881
59911
  if (match) {
59882
- 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());
59883
59913
  }
59884
59914
  }
59885
59915
  const titleByIssue = /* @__PURE__ */ new Map();
@@ -59896,7 +59926,7 @@ const getBacklogSequenceRoute = HttpRouter.add("GET", "/api/backlog/sequence", h
59896
59926
  nodes: cachedNodes.map((r) => {
59897
59927
  const issueUpper = r.issueId.toUpperCase();
59898
59928
  const reviewStatus = getReviewStatusSync(issueUpper);
59899
- 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()}`));
59900
59930
  const hasPrd = prdFiles.has(issueUpper);
59901
59931
  const ready = specIssues.has(issueUpper) && issuesWithBeads.has(issueUpper);
59902
59932
  const state = classifyIssue({
@@ -59980,7 +60010,7 @@ const postBacklogGateRoute = HttpRouter.add("POST", "/api/backlog/sequence/gate"
59980
60010
  const gate = normalizeGate(rawGate);
59981
60011
  return yield* Effect.promise(async () => {
59982
60012
  const projectRoot = process.cwd();
59983
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
60013
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
59984
60014
  if (!existsSync$1(seqPath)) throw new Error("sequence.md not found");
59985
60015
  const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
59986
60016
  if (!parsed.ok) throw new Error(`parse error: ${parsed.error}`);
@@ -60012,7 +60042,7 @@ const postBacklogPlanningRoute = HttpRouter.add("POST", "/api/backlog/sequence/p
60012
60042
  ].includes(planning)) return yield* Effect.fail(/* @__PURE__ */ new Error("planning must be skip, auto, or interactive"));
60013
60043
  return yield* Effect.promise(async () => {
60014
60044
  const projectRoot = process.cwd();
60015
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
60045
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
60016
60046
  if (!existsSync$1(seqPath)) throw new Error("sequence.md not found");
60017
60047
  const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
60018
60048
  if (!parsed.ok) throw new Error(`parse error: ${parsed.error}`);
@@ -60035,7 +60065,7 @@ const getBacklogForecastRoute = HttpRouter.add("GET", "/api/backlog/forecast", h
60035
60065
  return yield* Effect.try({
60036
60066
  try: () => {
60037
60067
  const projectRoot = process.cwd();
60038
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
60068
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
60039
60069
  if (!existsSync$1(seqPath)) return jsonResponse({
60040
60070
  n,
60041
60071
  stats: null,
@@ -60143,7 +60173,7 @@ const getBacklogIssueStateRoute = HttpRouter.add("GET", "/api/backlog/issue-stat
60143
60173
  let gate = "auto";
60144
60174
  let planning = null;
60145
60175
  let inSequence = false;
60146
- const seqPath = join$1(projectRoot, ".pan", "backlog", "sequence.md");
60176
+ const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
60147
60177
  if (existsSync$1(seqPath)) {
60148
60178
  const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
60149
60179
  if (parsed.ok) {
@@ -60174,7 +60204,7 @@ const postBacklogClearRoute = HttpRouter.add("POST", "/api/backlog/sequence/clea
60174
60204
  if (authError) return authError;
60175
60205
  return yield* Effect.try({
60176
60206
  try: () => {
60177
- const seqPath = join$1(process.cwd(), ".pan", "backlog", "sequence.md");
60207
+ const seqPath = join(process.cwd(), ".pan", "backlog", "sequence.md");
60178
60208
  if (existsSync$1(seqPath)) {
60179
60209
  const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
60180
60210
  if (parsed.ok) clearBacklogSequence(parsed.doc.project);
@@ -60193,7 +60223,7 @@ const getSequencerStatusRoute = HttpRouter.add("GET", "/api/backlog/sequencer-st
60193
60223
  const projectRoot = process.cwd();
60194
60224
  const { running, startedAt } = getSequencerRunStatus(projectRoot);
60195
60225
  let total = 0;
60196
- const manifestPath = join$1(projectRoot, ".pan", "backlog", "manifest.json");
60226
+ const manifestPath = join(projectRoot, ".pan", "backlog", "manifest.json");
60197
60227
  if (existsSync$1(manifestPath)) try {
60198
60228
  const m = JSON.parse(readFileSync$1(manifestPath, "utf-8"));
60199
60229
  const arr = Array.isArray(m) ? m : m?.issues ?? m?.nodes ?? [];
@@ -60260,8 +60290,8 @@ const listDirsRoute = HttpRouter.add("GET", "/api/fs/list-dirs", httpHandler(Eff
60260
60290
  } catch {
60261
60291
  canonicalHome = home;
60262
60292
  }
60263
- const isWithinHome = (p) => p === canonicalHome || p.startsWith(canonicalHome.endsWith(sep$1) ? canonicalHome : `${canonicalHome}${sep$1}`);
60264
- 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;
60265
60295
  let target;
60266
60296
  try {
60267
60297
  target = await realpath(rawResolved);
@@ -60269,10 +60299,10 @@ const listDirsRoute = HttpRouter.add("GET", "/api/fs/list-dirs", httpHandler(Eff
60269
60299
  return jsonResponse({ error: "Path does not exist" }, { status: 400 });
60270
60300
  }
60271
60301
  if (!isWithinHome(target)) return jsonResponse({ error: "Path is outside home directory" }, { status: 400 });
60272
- const parent = target === canonicalHome ? null : resolve$1(target, "..");
60302
+ const parent = target === canonicalHome ? null : resolve(target, "..");
60273
60303
  const entries = (await readdir(target, { withFileTypes: true })).filter((d) => d.isDirectory()).sort((a, b) => a.name.localeCompare(b.name)).map((d) => ({
60274
60304
  name: d.name,
60275
- path: resolve$1(target, d.name)
60305
+ path: resolve(target, d.name)
60276
60306
  }));
60277
60307
  return jsonResponse({
60278
60308
  path: target,
@@ -61066,9 +61096,9 @@ async function pollOnce(state) {
61066
61096
  const { id: agentId } = agent;
61067
61097
  let stdout;
61068
61098
  try {
61069
- 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);
61070
61100
  if (remoteState?.location === "remote" && remoteState?.vmName) {
61071
- const { getRemoteAgentOutput } = await import("./remote-agents-DNuaAgU6.js");
61101
+ const { getRemoteAgentOutput } = await import("./remote-agents-UHoi4oGr.js");
61072
61102
  stdout = await getRemoteAgentOutput(agentId, remoteState.vmName, 50);
61073
61103
  } else stdout = await Effect.runPromise(capturePane(agentId, 50));
61074
61104
  } catch {
@@ -61183,7 +61213,7 @@ async function captureCorpseDiagnostics(tmuxSession) {
61183
61213
  if (status) parts.push(`exitStatus=${status}`);
61184
61214
  } catch {}
61185
61215
  try {
61186
- const logPath = join(getOverdeckHome(), "agents", tmuxSession, "output.log");
61216
+ const logPath = join$1(getOverdeckHome(), "agents", tmuxSession, "output.log");
61187
61217
  if (existsSync(logPath)) {
61188
61218
  const lines = (await tailFile(logPath, 1500)).trim().split("\n").slice(-8).join("\n");
61189
61219
  if (lines) parts.push(`output.log tail:\n${lines}`);
@@ -61265,7 +61295,7 @@ async function backfillOrphanedSpecialistConversations(aliveSessions) {
61265
61295
  if (!sessionName.startsWith("agent-")) continue;
61266
61296
  if (NON_AGENT_PREFIXES.some((p) => sessionName.startsWith(p))) continue;
61267
61297
  if (getConversationByName(sessionName)) continue;
61268
- const statePath = join(homedir(), ".overdeck", "agents", sessionName, "state.json");
61298
+ const statePath = join$1(homedir(), ".overdeck", "agents", sessionName, "state.json");
61269
61299
  if (!existsSync(statePath)) continue;
61270
61300
  let state;
61271
61301
  try {
@@ -61335,7 +61365,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
61335
61365
  cwdGroups.set(conv.cwd, list);
61336
61366
  }
61337
61367
  for (const [cwd, convs] of cwdGroups) {
61338
- const projectDir = join(homedir(), ".claude", "projects", encodeClaudeProjectDir(cwd));
61368
+ const projectDir = join$1(homedir(), ".claude", "projects", encodeClaudeProjectDir(cwd));
61339
61369
  let entries;
61340
61370
  try {
61341
61371
  entries = await readdir$1(projectDir);
@@ -61347,7 +61377,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
61347
61377
  for (const filename of entries) {
61348
61378
  if (!filename.endsWith(".jsonl")) continue;
61349
61379
  const sessionId = filename.slice(0, -6);
61350
- const jsonlPath = join(projectDir, filename);
61380
+ const jsonlPath = join$1(projectDir, filename);
61351
61381
  if (notOrphanJsonlPaths.has(jsonlPath)) continue;
61352
61382
  if (getConversationByClaudeSessionId(sessionId)) continue;
61353
61383
  const { clearTs: firstClearTs, definitive } = await readFirstClearTimestamp(jsonlPath);
@@ -61360,7 +61390,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
61360
61390
  for (const candidate of convs) {
61361
61391
  if (!candidate.claudeSessionId) continue;
61362
61392
  if (candidate.claudeSessionId === sessionId) continue;
61363
- const parentJsonl = join(projectDir, `${candidate.claudeSessionId}.jsonl`);
61393
+ const parentJsonl = join$1(projectDir, `${candidate.claudeSessionId}.jsonl`);
61364
61394
  let mtimeMs;
61365
61395
  try {
61366
61396
  mtimeMs = (await stat$2(parentJsonl)).mtimeMs;
@@ -61474,7 +61504,7 @@ async function readFirstClearTimestamp(jsonlPath) {
61474
61504
  * worktree).
61475
61505
  */
61476
61506
  async function findClaudeSessionUuid(workspaceCwd, startedAt) {
61477
- const projectDir = join(homedir(), ".claude", "projects", encodeClaudeProjectDir(workspaceCwd));
61507
+ const projectDir = join$1(homedir(), ".claude", "projects", encodeClaudeProjectDir(workspaceCwd));
61478
61508
  let entries;
61479
61509
  try {
61480
61510
  entries = await readdir$1(projectDir);
@@ -61487,7 +61517,7 @@ async function findClaudeSessionUuid(workspaceCwd, startedAt) {
61487
61517
  const startedMs = startedAt ? new Date(startedAt).getTime() : NaN;
61488
61518
  let best = null;
61489
61519
  for (const filename of candidates) try {
61490
- const st = await stat$2(join(projectDir, filename));
61520
+ const st = await stat$2(join$1(projectDir, filename));
61491
61521
  const score = Number.isFinite(startedMs) ? Math.abs(st.mtimeMs - startedMs) : -st.mtimeMs;
61492
61522
  if (best === null || score < best.score) best = {
61493
61523
  uuid: filename.replace(/\.jsonl$/, ""),
@@ -61530,7 +61560,7 @@ function isProcessAlive(pid) {
61530
61560
  }
61531
61561
  }
61532
61562
  async function removeStaleRestartEventsLock(lockPath) {
61533
- const pidFile = join$1(lockPath, "pid");
61563
+ const pidFile = join(lockPath, "pid");
61534
61564
  try {
61535
61565
  const pid = parseInt(await readFile(pidFile, "utf8"), 10);
61536
61566
  if (Number.isFinite(pid) && isProcessAlive(pid)) return false;
@@ -61549,7 +61579,7 @@ async function acquireRestartEventsLock() {
61549
61579
  const lockPath = restartEventsLockPath();
61550
61580
  while (true) try {
61551
61581
  await mkdir(lockPath);
61552
- await writeFile(join$1(lockPath, "pid"), String(process.pid), "utf8");
61582
+ await writeFile(join(lockPath, "pid"), String(process.pid), "utf8");
61553
61583
  return true;
61554
61584
  } catch (error) {
61555
61585
  if (!isErrnoException(error) || error.code !== "EEXIST") return false;
@@ -61566,10 +61596,10 @@ async function releaseRestartEventsLock() {
61566
61596
  } catch {}
61567
61597
  }
61568
61598
  function restartStatusPath() {
61569
- return join$1(getOverdeckHome(), "restart-status.json");
61599
+ return join(getOverdeckHome(), "restart-status.json");
61570
61600
  }
61571
61601
  function restartEventsPath() {
61572
- return join$1(getOverdeckHome(), "restart-events.jsonl");
61602
+ return join(getOverdeckHome(), "restart-events.jsonl");
61573
61603
  }
61574
61604
  function isErrnoException(error) {
61575
61605
  return error instanceof Error && "code" in error;
@@ -61578,7 +61608,7 @@ async function appendRestartEvent(entry) {
61578
61608
  if (!await acquireRestartEventsLock()) return;
61579
61609
  try {
61580
61610
  const path = restartEventsPath();
61581
- await mkdir(dirname$1(path), { recursive: true });
61611
+ await mkdir(dirname(path), { recursive: true });
61582
61612
  await appendFile(path, `${JSON.stringify(entry)}\n`, "utf8");
61583
61613
  } catch {} finally {
61584
61614
  await releaseRestartEventsLock();
@@ -61605,7 +61635,7 @@ async function compactRestartEvents() {
61605
61635
  }
61606
61636
  async function writeRestartStatusPromise(entry) {
61607
61637
  const path = restartStatusPath();
61608
- await mkdir(dirname$1(path), { recursive: true });
61638
+ await mkdir(dirname(path), { recursive: true });
61609
61639
  const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
61610
61640
  await writeFile(tmp, `${JSON.stringify(entry, null, 2)}\n`, "utf8");
61611
61641
  await rename(tmp, path);
@@ -62245,14 +62275,14 @@ function stopTtsSummarizer() {
62245
62275
  * the "restarting" banner.
62246
62276
  */
62247
62277
  init_activity_logger();
62248
- const PENDING_FILE = join(homedir(), ".overdeck", "pending-post-merge.json");
62249
- 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");
62250
62280
  /**
62251
62281
  * Default lifecycle runner: dynamically imports merge-agent so the fresh process
62252
62282
  * loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
62253
62283
  */
62254
62284
  async function defaultLifecycleRunner(pending) {
62255
- const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-Dh8Y9PDO.js");
62285
+ const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-CfohxFWM.js");
62256
62286
  await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
62257
62287
  if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
62258
62288
  }
@@ -62487,7 +62517,7 @@ async function directoryContainsJsonl(dirPath) {
62487
62517
  return false;
62488
62518
  }
62489
62519
  for (const entry of entries) {
62490
- const entryPath = join(dirPath, entry.name);
62520
+ const entryPath = join$1(dirPath, entry.name);
62491
62521
  if (entry.isFile() && entry.name.endsWith(".jsonl")) return true;
62492
62522
  if (entry.isDirectory() && await directoryContainsJsonl(entryPath)) return true;
62493
62523
  }
@@ -62505,7 +62535,7 @@ async function findClosedIssueAgentDirsPromise(options) {
62505
62535
  const candidates = [];
62506
62536
  for (const entry of entries) {
62507
62537
  if (!entry.isDirectory()) continue;
62508
- const dirPath = join(agentsDir, entry.name);
62538
+ const dirPath = join$1(agentsDir, entry.name);
62509
62539
  const issueId = await readAgentStateIssueId(dirPath) ?? getAgentDirectoryIssueId(entry.name);
62510
62540
  if (!issueId) continue;
62511
62541
  const closedAtMs = closedIssueTimes.get(issueId);
@@ -62573,7 +62603,7 @@ function failureReason(result) {
62573
62603
  return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
62574
62604
  }
62575
62605
  async function defaultMergeIssue(issueId) {
62576
- const { triggerMerge } = await import("./merge-ops-QdBiQ8XB.js");
62606
+ const { triggerMerge } = await import("./merge-ops-Czke6UAp.js");
62577
62607
  return triggerMerge(issueId);
62578
62608
  }
62579
62609
  function defaultAnnounceFailure(issueId, reason) {
@@ -62780,7 +62810,7 @@ function createOverdeckDatabase(options = {}) {
62780
62810
  if (!options.force) throw new Error(`Refusing to overwrite existing overdeck.db at ${dbPath}; pass --force to recreate it.`);
62781
62811
  rmSync$1(dbPath, { force: true });
62782
62812
  }
62783
- mkdirSync$1(dirname$1(dbPath), { recursive: true });
62813
+ mkdirSync$1(dirname(dbPath), { recursive: true });
62784
62814
  const db = openDatabase(dbPath);
62785
62815
  try {
62786
62816
  applyMigration(db, migrationPath);
@@ -62797,12 +62827,6 @@ function createOverdeckDatabase(options = {}) {
62797
62827
  }
62798
62828
  //#endregion
62799
62829
  //#region main.ts
62800
- /**
62801
- * Dashboard server entry point — dual-runtime (Bun dev, Node prod) (PAN-428 B5)
62802
- *
62803
- * Usage (dev): bun run src/dashboard/server/main.ts
62804
- * Usage (prod): node dist/dashboard/server.js
62805
- */
62806
62830
  init_issue_service_singleton();
62807
62831
  init_tracker_config();
62808
62832
  init_internal_token();
@@ -63210,7 +63234,7 @@ reconcileStaleGitHubBlockers().then((n) => {
63210
63234
  }
63211
63235
  }).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
63212
63236
  try {
63213
- const { resetProcessingToQueued } = await import("./merge-sync-BKLKu9kz.js");
63237
+ const { resetProcessingToQueued } = await import("./merge-sync-bOOtfeXR.js");
63214
63238
  const resetCount = resetProcessingToQueued();
63215
63239
  if (resetCount > 0) {
63216
63240
  console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);