@overdeck/desktop 0.45.11 → 0.45.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drizzle/overdeck/0000_overdeck_init.sql +6 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-l0DSvFFS.js → acceptance-criteria-1LHgD9vg.js} +2 -2
- package/server/{advancing-selfheal-BezNfM3P.js → advancing-selfheal-BqsLWqEM.js} +4 -4
- package/server/{agent-gc-BtAzj8QN.js → agent-gc-CUb52n7s.js} +3 -3
- package/server/{agent-state-BUANcaA7.js → agent-state-D-moNwhA.js} +1 -1
- package/server/{agent-state-service-DmFpIMbP.js → agent-state-service-BaZH7sXJ.js} +1 -1
- package/server/{agent-state-service-tXUdp6UF.js → agent-state-service-BzESvLOf.js} +4 -4
- package/server/{agents-C7V4odQ6.js → agents-B5LfpLPv.js} +256 -185
- package/server/{agents-C-vqmKDi.js → agents-C4kZ8a2r.js} +1 -1
- package/server/{archive-planning-B4Qi02bk.js → archive-planning-BbZe-8IK.js} +1 -1
- package/server/{archive-planning-zTvWWHG_.js → archive-planning-oX1pj6nY.js} +3 -3
- package/server/{artifact-index-jobs-BrByqVkB.js → artifact-index-jobs-DGr6bxev.js} +3 -3
- package/server/{auto-commit-DoIPFoEs.js → auto-commit-CGQlb4rV.js} +1 -1
- package/server/{backlog-auto-trigger-Cb8PR-5w.js → backlog-auto-trigger-BlJHikOm.js} +2 -2
- package/server/{bd-process-lock-CJkoG7hW.js → bd-process-lock-i3CYMS-B.js} +3 -3
- package/server/{beads-AmCXEv_E.js → beads-BNU-fb48.js} +1 -1
- package/server/{beads-DlZm-vrG.js → beads-DD7fYCl5.js} +4 -4
- package/server/{beads-query-BrVNWoSL.js → beads-query-e6oku4P5.js} +2 -2
- package/server/{behavior-By-2Wipv.js → behavior-CPf0pbOt.js} +2 -2
- package/server/{briefing-freshness-CXhZdnB8.js → briefing-freshness-B2FdLwIv.js} +27 -15
- package/server/{checkpoint-manager-CfNpHOp4.js → checkpoint-manager-JryW6MpM.js} +2 -2
- package/server/{checkpoint-manager-CPw51H2n.js → checkpoint-manager-eFgaMMu4.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-BjlBWOA8.js → checkpoints-BK17oicz.js} +1 -1
- package/server/{checkpoints-BbfH1EIy.js → checkpoints-qvOqvMuC.js} +2 -2
- package/server/{claude-permissions-DrRAs_0F.js → claude-permissions-B6bWGh9d.js} +3 -3
- package/server/{claude-settings-overlay-CEWlIFL-.js → claude-settings-overlay-BPdhTPjo.js} +1 -1
- package/server/{claude-settings-overlay-BSeS7Ki3.js → claude-settings-overlay-CRyyKKXQ.js} +2 -2
- package/server/{cli-BgzbB6h3.js → cli-B75AieAM.js} +9 -9
- package/server/cli-Ch_BWJB2.js +3 -0
- package/server/{cliproxy-J-_1iIXe.js → cliproxy-CCzwuSNe.js} +2 -2
- package/server/{cliproxy-BOcmOK6l.js → cliproxy-DOQf66G9.js} +1 -1
- package/server/{close-issue-BWf3pxn4.js → close-issue-_X3MXJyG.js} +4 -4
- package/server/{closed-issue-reaper-D7XPq5pY.js → closed-issue-reaper-BsUfBSjM.js} +13 -13
- package/server/{closed-issue-reaper-VSTSTROK.js → closed-issue-reaper-CLR7ClsO.js} +1 -1
- package/server/{codex-DcInrhok.js → codex-B4KEpX5V.js} +5 -5
- package/server/{codex-BUZjrnqH.js → codex-CY-QRuU9.js} +1 -1
- package/server/{compact-beads-omhUgj5b.js → compact-beads-cZds2MTr.js} +1 -1
- package/server/{compact-beads-RFwdZFPA.js → compact-beads-uEDccC76.js} +3 -3
- package/server/{config-oWoKf5jO.js → config-8sjaU6jZ.js} +2 -2
- package/server/{config-CzcWQ24p.js → config-DARrpYWA.js} +1 -1
- package/server/{config-yaml-DPAieL_G.js → config-yaml-ClpGgrf6.js} +100 -99
- package/server/{conflict-gate-FFEvTDVA.js → conflict-gate-BtB_o-Vi.js} +3 -3
- package/server/{conflict-gate-DwOslTij.js → conflict-gate-Ds9_2yjd.js} +1 -1
- package/server/{context-layers-DxKsseHI.js → context-layers-CRCk1QG7.js} +2 -2
- package/server/{context-layers-CTjQwcEQ.js → context-layers-r2ywnQYA.js} +3 -3
- package/server/{control-settings-BMqUkXmR.js → control-settings-D1B3u6HP.js} +4 -4
- package/server/{conversation-compaction-CL5Ti4j4.js → conversation-compaction-CZRVk4hg.js} +1 -1
- package/server/{conversation-compaction-CCqN4hWk.js → conversation-compaction-D86Zo2Ci.js} +9 -9
- package/server/{conversation-service-WKl-sw58.js → conversation-service-CkL-6MuG.js} +1 -1
- package/server/{conversation-service-DvG8vZSV.js → conversation-service-CuTVU8dV.js} +5 -5
- package/server/{conversations-Dcx6LeIh.js → conversations-BmWEluPL.js} +1 -1
- package/server/{conversations-DL_BAWVk.js → conversations-DfJKBDwB.js} +5 -5
- package/server/{cost-C2CuA66z.js → cost-CCnqa5xK.js} +2 -2
- package/server/{cost-DaOG8sUB.js → cost-DAPYN6iA.js} +3 -3
- package/server/{cost-sync-8lkDeL9g.js → cost-sync-BDL10Nwu.js} +3 -3
- package/server/{dag-jH8ZkewR.js → dag-Dv2r5bVD.js} +3 -3
- package/server/dashboard-db-worker.js +6 -6
- package/server/{deacon-CGHl90eC.js → deacon-CM0MxbS8.js} +179 -179
- package/server/{deacon-DMPh40Im.js → deacon-DYnZH7kC.js} +3 -3
- package/server/{deacon-nudge-log-CJGA6aSQ.js → deacon-nudge-log-B-naf89q.js} +2 -2
- package/server/{deacon-swarm-aMMJTq6t.js → deacon-swarm-BstYoz8Q.js} +17 -17
- package/server/deacon-swarm-CSWGRfzr.js +2 -0
- package/server/deacon.js +7 -7
- package/server/{devcontainer-renderer-DUJYYRQB.js → devcontainer-renderer-CaYOG9JN.js} +2 -2
- package/server/{docker-Q4bphryk.js → docker-DDI1shu3.js} +2 -2
- package/server/{ensure-devcontainer-BCB6fHp9.js → ensure-devcontainer-CbSXvN9W.js} +1 -1
- package/server/{ensure-devcontainer-XLL0vtgV.js → ensure-devcontainer-DCAg3ksz.js} +3 -3
- package/server/{event-store-DTJXZjCl.js → event-store-DCMqyI07.js} +3 -3
- package/server/{event-store-DIk9wvnS.js → event-store-DU3HkZlN.js} +1 -1
- package/server/{events-DGWZzye2.js → events-BfiosVAn.js} +3 -3
- package/server/{events-BlzVUyTx.js → events-DLRxpSuV.js} +1 -1
- package/server/{factory-rG4T40su.js → factory-BMtWV9iv.js} +4 -4
- package/server/{feature-registry-population-Dwyj9gEM.js → feature-registry-population-DA7bO6Zn.js} +5 -5
- package/server/{feature-registry-storage-CnGyNgAq.js → feature-registry-storage-nAY1fbBt.js} +3 -3
- package/server/{features-CYY2_Eeh.js → features-DMu7eGmU.js} +2 -2
- package/server/{feedback-target-nQSM6ygL.js → feedback-target-B2SEai8-.js} +1 -1
- package/server/{feedback-target-dJjFfITP.js → feedback-target-DHqcw3cN.js} +6 -6
- package/server/{feedback-writer-thrdxYpK.js → feedback-writer-DMBdS_jL.js} +1 -1
- package/server/{feedback-writer-DMaO0XXa.js → feedback-writer-qvm7UON7.js} +4 -4
- package/server/{flywheel-Cqf8vu7N.js → flywheel-D2LdPSic.js} +13 -13
- package/server/{flywheel-BLoVNtJV.js → flywheel-Dfpx4bIV.js} +11 -11
- package/server/{flywheel-PJsbrXNY.js → flywheel-k4FPtCQ_.js} +1 -1
- package/server/{flywheel-merge-order-B7BH8mZ3.js → flywheel-merge-order-CB4lbXeJ.js} +6 -6
- package/server/{flywheel-merge-order-CCwF60b-.js → flywheel-merge-order-CttTazRY.js} +1 -1
- package/server/{forge-BixzckB0.js → forge-CoPFXFyl.js} +3 -3
- package/server/forge-IgLR0Ist.js +2 -0
- package/server/{from-D4xmArTA.js → from-B0YoJl9-.js} +2 -2
- package/server/{fts-db-DPtxOAjp.js → fts-db-DAHW1yA_.js} +2 -2
- package/server/{fts-operations-VrGjsT0w.js → fts-operations-DDXDBi0d.js} +3 -3
- package/server/{git-utils-D_cax3fD.js → git-utils-B90Zjzfl.js} +2 -2
- package/server/{git-utils-RAmTwjFB.js → git-utils-DbfC0zls.js} +1 -1
- package/server/{github-app-FMXgo3vK.js → github-app-BecAnXRX.js} +2 -2
- package/server/{github-app-B5PDHMyn.js → github-app-C7lftMNj.js} +1 -1
- package/server/{github-client-VRiB6N-4.js → github-client-BwtKZtM0.js} +1 -1
- package/server/{github-client-yjbXaqpR.js → github-client-D21rCIXk.js} +2 -2
- package/server/{github-pr-lookup-t8X8R0c0.js → github-pr-lookup-CzVWuysl.js} +2 -2
- package/server/{harness-resolve-B3f9G1Kp.js → harness-resolve-SkRJm4a7.js} +3 -3
- package/server/{health-events-DaLX4-0a.js → health-events-BT0aAfeA.js} +2 -2
- package/server/{health-events-CD6q47ub.js → health-events-DA_JLpgZ.js} +1 -1
- package/server/{hooks-D-cbMUzQ.js → hooks-BQxRXtRb.js} +1 -1
- package/server/{hooks-CmHFSj_Z.js → hooks-DxEn2BoY.js} +2 -2
- package/server/{idle-stack-reaper-DdnERp3G.js → idle-stack-reaper-C7fJL8jH.js} +1 -1
- package/server/{idle-stack-reaper-DBKQ9SKu.js → idle-stack-reaper-DGy7tvC9.js} +2 -2
- package/server/{infra-CpKlYZA9.js → infra-DE3C4PMr.js} +22 -4
- package/server/{injection-CszhePD2.js → injection-Cc4Qt8LZ.js} +7 -7
- package/server/{injection-DKzL2Axk.js → injection-Dt22tGvS.js} +1 -1
- package/server/inspect-agent-CYoWAeeB.js +2 -0
- package/server/{inspect-agent-CKF5-SJr.js → inspect-agent-DOaCDkCF.js} +9 -9
- package/server/{internal-token-CQUx9YLc.js → internal-token-B_1YLWLI.js} +3 -3
- package/server/{internal-token-DrGdpLFo.js → internal-token-nobT6FhA.js} +1 -1
- package/server/{io-Wy8YpFeP.js → io-A7ZuOBkz.js} +2 -2
- package/server/{issue-closed-BO84g03t.js → issue-closed-Da3DeomA.js} +4 -4
- package/server/{issue-lifecycle-5LbOcATP.js → issue-lifecycle-543pQX9D.js} +28 -28
- package/server/{issue-lifecycle-CjYqQ669.js → issue-lifecycle-Bd9XBJAQ.js} +1 -1
- package/server/{issue-service-singleton-B8iu_TKV.js → issue-service-singleton-BC2JLZi7.js} +1 -1
- package/server/{issue-service-singleton-CDGt__oQ.js → issue-service-singleton-Brc3t0SV.js} +8 -8
- package/server/{issues-ChNcfHta.js → issues-D3kt9UWE.js} +2 -2
- package/server/{label-cleanup-bVXCGWBM.js → label-cleanup-w9X_T3AQ.js} +2 -2
- package/server/{layers-vdvlpFki.js → layers-Cwe1J-9o.js} +2 -2
- package/server/{lifecycle-CEg4sHZH.js → lifecycle-f1GbDK33.js} +6 -6
- package/server/{lifecycle-io-DSrv9xGh.js → lifecycle-io-Bqvj0m3i.js} +4 -4
- package/server/{lifecycle-io-CdqPkCyk.js → lifecycle-io-D56q8zlO.js} +1 -1
- package/server/{linear-client-BxKvL6U8.js → linear-client-Bh4T4S-c.js} +1 -1
- package/server/{linear-client-E0HdXtWs.js → linear-client-CfJMTAYd.js} +2 -2
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-D3wEbmUJ.js → merge-DRMPa8CQ.js} +1 -1
- package/server/{merge-UlAwCk80.js → merge-ZrXFM3jv.js} +3 -3
- package/server/{merge-agent-C81xPIGd.js → merge-agent-CHHs5S_0.js} +25 -25
- package/server/{merge-agent-7nBiCytp.js → merge-agent-CfohxFWM.js} +1 -1
- package/server/{merge-blockers-DwdQNsYD.js → merge-blockers-BMhDpMl_.js} +2 -2
- package/server/merge-ops-Czke6UAp.js +2 -0
- package/server/{merge-rebase-CH12_ufi.js → merge-rebase-R7MfqpiE.js} +2 -2
- package/server/{merge-set-TRxJwR-w.js → merge-set-B3Breacq.js} +3 -3
- package/server/{merge-set-rXK3ehnB.js → merge-set-D-iXNP0I.js} +1 -1
- package/server/{merge-sync-CaLRt2cB.js → merge-sync-DHWbGtjR.js} +2 -2
- package/server/{merge-sync-BKLKu9kz.js → merge-sync-bOOtfeXR.js} +1 -1
- package/server/{merge-train-D3qzRccL.js → merge-train-98ptZrPT.js} +3 -3
- package/server/{merge-train-deps-Be5ElC_P.js → merge-train-deps-B5FWJTE2.js} +4 -4
- package/server/{merge-verification-DA9rvqsE.js → merge-verification-BGiuiXAK.js} +4 -4
- package/server/{multipart-parser-DtIEUW2B.js → multipart-parser-D7mzNNDm.js} +2 -2
- package/server/node_modules/.package-lock.json +1 -0
- package/server/{orphan-proposed-reconciler-Boq_XaRe.js → orphan-proposed-reconciler-BSGCNJ6X.js} +9 -9
- package/server/{orphan-proposed-reconciler-C0sPnDq_.js → orphan-proposed-reconciler-CSuxivr9.js} +1 -1
- package/server/package-lock.json +2 -0
- package/server/package.json +1 -0
- package/server/{pan-dir-BgBeeZDX.js → pan-dir-DoPtdHrp.js} +3 -3
- package/server/{paths-TE1GOZDr.js → paths-CVDLPxXp.js} +2 -2
- package/server/{pipeline-notifier-lwMa--Gz.js → pipeline-notifier-BtYHbBPl.js} +1 -1
- package/server/{pipeline-notifier-aX_5EqQO.js → pipeline-notifier-WD2dnOsR.js} +2 -2
- package/server/{projects-BNmVxnNt.js → projects-Bqfwuqet.js} +1 -1
- package/server/{prompts-CelsUdrx.js → prompts-Cg7e9FPb.js} +2 -2
- package/server/{providers-BOnRq5XK.js → providers-JjK6izqX.js} +1 -1
- package/server/{providers-4-xOzHQu.js → providers-fLduChnX.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-BjULspib.js → chunk-BO2N2NFS-aNlsGDCu.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-4ER5ovy_.js → diagram-OG6HWLK6-CnjkrvT8.js} +1 -1
- package/server/public/assets/{dist-CBUe_1pC.js → dist-Bg3Sbsx4.js} +3 -3
- package/server/public/assets/{dist-DVM-OI65.js → dist-CGKBCieA.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-DQ3nocJU.js → ganttDiagram-6RSMTGT7-C8LLKj23.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-BcLOHe75.js → highlighted-body-OFNGDK62-BSDEUvhW.js} +1 -1
- package/server/public/assets/{index-B-m-cSFg.css → index-CZiADHcL.css} +1 -1
- package/server/public/assets/index-LQIfhmgI.js +796 -0
- package/server/public/assets/{linear-Acq5WFAt.js → linear-DEbYZoxg.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BEmjmqLh.js → pieDiagram-4H26LBE5-BtZL5pXE.js} +1 -1
- package/server/public/assets/{prod-D-3YYika.js → prod-DYVvIyuh.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-DyeZ0jBC.js → quadrantDiagram-W4KKPZXB-a7vS8Jc8.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-DSD--Pbl.js → sankeyDiagram-5OEKKPKP-Ckbq2SWH.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-idS7x7Bb.js → xychartDiagram-2RQKCTM6-DJyeNa99.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-CH4iBFLl.js → pull-requests-1WXmTBlo.js} +3 -3
- package/server/{pull-requests-DL_4klIb.js → pull-requests-D2SjJIwY.js} +1 -1
- package/server/{rally-D0mKv2t8.js → rally-8aQlLLVj.js} +3 -3
- package/server/rally-Ba9QoNYc.js +3 -0
- package/server/{rally-api-CcCdecF-.js → rally-api-BtvwdX6d.js} +1 -1
- package/server/{rally-api-DgAt6FbN.js → rally-api-H5I2CBO0.js} +2 -2
- package/server/{rally-client-DYjtgTOu.js → rally-client-33CYZYYu.js} +4 -4
- package/server/{rally-client-X0bEEN2B.js → rally-client-Bt-qHiOh.js} +1 -1
- package/server/{rebuild-stack-ByFCMqTK.js → rebuild-stack-CXSgAGPR.js} +1 -1
- package/server/{rebuild-stack-BLG3rlWa.js → rebuild-stack-KHkkrGjx.js} +6 -6
- package/server/{reconstruct-cache-C2pCltOq.js → reconstruct-cache-D_Ml65_6.js} +7 -7
- package/server/{record-DjPikotp.js → record-De2syxNB.js} +1 -1
- package/server/{remote-TN0cV8k-.js → remote-CGuognN3.js} +3 -3
- package/server/{remote-B1Trmr0N.js → remote-D0Old0Cv.js} +3 -3
- package/server/{remote-agents-CmbIKw7E.js → remote-agents-DfhMq6kQ.js} +5 -5
- package/server/{remote-agents-DNuaAgU6.js → remote-agents-UHoi4oGr.js} +1 -1
- package/server/{remote-completion-BmxD5UMQ.js → remote-completion-RZYePR_0.js} +12 -12
- package/server/resume-CmxF3Kjz.js +3 -0
- package/server/{review-agent-D6P6d3pz.js → review-agent-sZBCpEVv.js} +22 -22
- package/server/{review-agent-DTINEffB.js → review-agent-uwVftH98.js} +1 -1
- package/server/{review-artifacts-BGc69epg.js → review-artifacts-C7a45b1_.js} +7 -7
- package/server/{review-context-Dyo0tsBa.js → review-context-CErbQpKL.js} +7 -7
- package/server/{review-monitor-BKG2ubt5.js → review-monitor-DHD9m_kh.js} +2 -2
- package/server/{review-status-h7BXIA4z.js → review-status-JhQ3qlDS.js} +1 -1
- package/server/{review-status-enrichment-CGlcApSn.js → review-status-enrichment-qWvWckYN.js} +3 -3
- package/server/{review-status-B5ZASOo4.js → review-status-gPndPUBc.js} +53 -30
- package/server/{review-status-sync-BxHBVH8s.js → review-status-sync-B_GrEke8.js} +1 -1
- package/server/{review-status-sync-BWHnrq-k.js → review-status-sync-D3A9KX95.js} +2 -2
- package/server/{review-verdict-feedback-B70VbfRL.js → review-verdict-feedback-4WZ5ZdbC.js} +7 -7
- package/server/{review-verdict-feedback-CorgH49f.js → review-verdict-feedback-Zo0r_z4m.js} +1 -1
- package/server/{rollup-DBNy1yFB.js → rollup-Bmhn80tB.js} +1 -1
- package/server/{rollup-BJE-Vc7H.js → rollup-BrUIKMv_.js} +7 -7
- package/server/{scanner-CUGpdp4i.js → scanner-BIGumel_.js} +7 -7
- package/server/{sequence-io-6YP8fVpH.js → sequence-io-DA0akEQN.js} +5 -5
- package/server/{sequencer-agent-ja-nkEc1.js → sequencer-agent-DeflKafB.js} +6 -6
- package/server/server.js +561 -548
- package/server/{service-HKDrIy0h.js → service-V0sUK-OR.js} +64 -64
- package/server/{session-fork-DDSDVoIK.js → session-fork-Yx3UcAQf.js} +2 -2
- package/server/{settings-CBrei_kx.js → settings-CFEeQRj2.js} +2 -2
- package/server/{settings-D2wt4nku.js → settings-CxVate0h.js} +3 -3
- package/server/settings-DEhYpW0k.js +2 -0
- package/server/{shadow-engineering-Ba1D0QUN.js → shadow-engineering-BRxnVSDk.js} +2 -2
- package/server/{shadow-state-BOaq8BrD.js → shadow-state-1aS8FijU.js} +1 -1
- package/server/{shadow-state-DTC7AMHc.js → shadow-state-BiMwdyl1.js} +2 -2
- package/server/{smart-compaction-uke1npUz.js → smart-compaction-Bw1K_Sbl.js} +7 -7
- package/server/{smart-compaction-L0LSnF0_.js → smart-compaction-xblMyVpT.js} +1 -1
- package/server/{spawn-planning-session-CSMWco8B.js → spawn-planning-session-CzDFSKAQ.js} +1 -1
- package/server/{spawn-planning-session-CXc0NkwV.js → spawn-planning-session-DxLxcM7m.js} +15 -15
- package/server/{specialist-context-BGCJ24LH.js → specialist-context-BfkTA81h.js} +5 -5
- package/server/{specialist-handoff-logger-B_2VsWli.js → specialist-handoff-logger-BiKuLtNm.js} +2 -2
- package/server/{specialist-logs--Uz-r8ia.js → specialist-logs-CFJjGsLC.js} +3 -3
- package/server/{specialists-DEfrAbWs.js → specialists-B4byf18k.js} +156 -156
- package/server/{specialists-Ca9XSBCS.js → specialists-BLIreoE7.js} +1 -1
- package/server/{specialists-DeZx9xom.js → specialists-DdvpFNt1.js} +1 -1
- package/server/{specialists-nZ0mRwpZ.js → specialists-DjHbwQ_p.js} +18 -18
- package/server/specs-CVH1kvz3.js +3 -0
- package/server/{src-Dp0WHgDZ.js → src-CALBEUMX.js} +3 -3
- package/server/{src-BswtmojL.js → src-mK_M_ZIj.js} +3 -3
- package/server/{stack-health-Deel1mSW.js → stack-health-BFM8YlHw.js} +1 -1
- package/server/{stack-health-BJVh1TCg.js → stack-health-Qd7rPiVe.js} +3 -3
- package/server/{state-home-Bgj7i-C7.js → state-home-C2Bicw9N.js} +6 -6
- package/server/{summary-fork-Xn0QUNmb.js → summary-fork-DezPkJSm.js} +16 -16
- package/server/{summary-fork-2a1L2DIU.js → summary-fork-EWWBvzgE.js} +2 -2
- package/server/supervisor/chunk-ruWRV7i3.js +30 -0
- package/server/supervisor/paths-3R6b989k.js +224 -0
- package/server/supervisor/pty-supervisor.js +391 -0
- package/server/supervisor/pty-token-CScQ32Rj.js +43 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/LICENSE +69 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/README.md +67 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/binding.gyp +123 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/.editorconfig +2 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/.drone.yml +17 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/.gitattributes +19 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/LICENSE +21 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/Makefile +166 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/README.md +151 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/RELEASES.md +280 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/VERSION.txt +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/configure +167 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/BufferResizeTests.cc +90 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ClearConsole.cc +72 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ConinMode.cc +117 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ConinMode.ps1 +116 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ConoutMode.cc +113 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/DebugClient.py +42 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/DebugServer.py +63 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/DumpLines.py +5 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/FontSurvey.cc +100 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/FormatChar.h +21 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/FreezePerfTest.cc +62 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/GetCh.cc +20 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/GetConsolePos.cc +41 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/GetFont.cc +261 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/IsNewConsole.cc +87 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/MouseInputNotes.txt +90 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Notes.txt +219 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/OSVersion.cc +27 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ScreenBufferTest.cc +671 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SelectAllTest.cc +45 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SetBufferSize.cc +32 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SetCursorPos.cc +10 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SetFont.cc +145 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/SetWindowRect.cc +36 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ShowArgv.cc +12 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/ShowConsoleInput.cc +40 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Spew.py +5 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/TestUtil.cc +172 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/UnixEcho.cc +89 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Utf16Echo.cc +46 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/VeryLargeRead.cc +122 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/VkEscapeTest.cc +56 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win10WrapTest1.cc +57 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win10WrapTest2.cc +30 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Echo1.cc +26 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Echo2.cc +19 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Test1.cc +46 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Test2.cc +70 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Test3.cc +78 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/Win32Write1.cc +44 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/WriteConsole.cc +106 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/build32.sh +9 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/build64.sh +9 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/color-test.sh +212 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/font-notes.txt +300 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/misc/winbug-15048.cc +201 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/ship/common_ship.py +53 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/ship/make_msvc_package.py +165 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/ship/ship.py +108 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Agent.cc +613 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Agent.h +103 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleFont.cc +632 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleFont.h +28 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleInput.cc +852 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleInput.h +109 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleLine.cc +152 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/ConsoleLine.h +41 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Coord.h +87 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DebugShowInput.cc +239 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DebugShowInput.h +32 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DefaultInputMap.h +28 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/DsrSender.h +30 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/EventLoop.cc +99 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/EventLoop.h +47 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/InputMap.cc +246 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/InputMap.h +114 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/NamedPipe.cc +378 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/NamedPipe.h +125 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Scraper.cc +699 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Scraper.h +103 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/SimplePool.h +75 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/SmallRect.h +143 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Terminal.cc +535 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Terminal.h +69 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Win32Console.cc +107 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Win32Console.h +67 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/main.cc +114 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/agent/subdir.mk +61 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/configurations.gypi +60 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/debugserver/DebugServer.cc +117 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/debugserver/subdir.mk +41 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/include/winpty.h +242 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/include/winpty_constants.h +131 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/subdir.mk +46 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/libwinpty/winpty.cc +970 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/AgentMsg.h +38 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/Buffer.cc +103 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/Buffer.h +102 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/DebugClient.cc +187 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/DebugClient.h +38 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/GenRandom.cc +138 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/GenRandom.h +55 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/GetCommitHash.bat +13 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/Mutex.h +54 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/OsModule.h +63 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/OwnedHandle.cc +36 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/OwnedHandle.h +45 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/StringBuilder.h +227 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/StringUtil.cc +55 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/StringUtil.h +80 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/TimeMeasurement.h +63 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WindowsSecurity.h +104 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WindowsVersion.cc +252 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WindowsVersion.h +29 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyAssert.cc +55 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyAssert.h +64 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyException.cc +57 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyException.h +43 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyVersion.cc +42 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/WinptyVersion.h +27 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/shared/winpty_snprintf.h +99 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/subdir.mk +5 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/tests/subdir.mk +28 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/tests/trivial_test.cc +158 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/Util.cc +86 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/Util.h +31 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/main.cc +729 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/unix-adapter/subdir.mk +41 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/src/winpty.gyp +235 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/deps/winpty/vcbuild.bat +83 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/conpty_console_list_agent.js +20 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/conpty_console_list_agent.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/eventEmitter2.js +47 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/eventEmitter2.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/eventEmitter2.test.js +30 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/eventEmitter2.test.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/index.js +52 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/index.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/interfaces.js +7 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/interfaces.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-file-path.js +18 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-file-path.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-loader.js +19 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/prebuild-loader.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/shared/conout.js +11 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/shared/conout.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/terminal.js +190 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/terminal.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/terminal.test.js +139 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/terminal.test.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/testUtils.test.js +28 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/testUtils.test.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/types.js +7 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/types.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.js +290 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.test.js +352 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/unixTerminal.test.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/utils.js +17 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/utils.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsConoutConnection.js +125 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsConoutConnection.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.js +345 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.test.js +90 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsPtyAgent.test.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsTerminal.js +201 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsTerminal.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsTerminal.test.js +217 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/windowsTerminal.test.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/worker/conoutSocketWorker.js +22 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/lib/worker/conoutSocketWorker.js.map +1 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/package.json +79 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi102.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi102.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi108.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi108.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi111.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi111.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi115.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi115.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi120.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi120.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi127.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi127.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi131.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi131.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi137.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm/node.abi137.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi102.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi108.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi108.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi111.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi111.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi115.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi115.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi120.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi120.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi127.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi127.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi131.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi131.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi137.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-arm64/node.abi137.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi108.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi111.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi115.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi120.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi127.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi131.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-ia32/node.abi137.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi102.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi108.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi108.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi111.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi111.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi115.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi115.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi120.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi120.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi127.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi127.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi131.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi131.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi137.musl.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/prebuilds/linux-x64/node.abi137.node +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/scripts/check-prebuild.js +15 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/scripts/increment-version.js +54 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/scripts/install.js +18 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/scripts/post-install.js +83 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/conpty_console_list_agent.ts +19 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/eventEmitter2.test.ts +30 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/eventEmitter2.ts +48 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/index.ts +53 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/interfaces.ts +130 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/native.d.ts +54 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/prebuild-file-path.ts +21 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/prebuild-loader.ts +17 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/shared/conout.ts +15 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/terminal.test.ts +119 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/terminal.ts +211 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/testUtils.test.ts +23 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/tsconfig.json +22 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/types.ts +15 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/unix/pty.cc +796 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/unix/spawn-helper.cc +23 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/unixTerminal.test.ts +368 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/unixTerminal.ts +318 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/utils.ts +9 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/conpty.cc +583 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/conpty.h +41 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/conpty_console_list.cc +44 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/path_util.cc +95 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/path_util.h +26 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/win/winpty.cc +333 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsConoutConnection.ts +82 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsPtyAgent.test.ts +94 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsPtyAgent.ts +342 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsTerminal.test.ts +227 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/windowsTerminal.ts +208 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/src/worker/conoutSocketWorker.ts +22 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/third_party/conpty/1.22.250204002/win10-arm64/OpenConsole.exe +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/third_party/conpty/1.22.250204002/win10-arm64/conpty.dll +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/third_party/conpty/1.22.250204002/win10-x64/OpenConsole.exe +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/third_party/conpty/1.22.250204002/win10-x64/conpty.dll +0 -0
- package/server/supervisor/vendor/@homebridge/node-pty-prebuilt-multiarch/typings/node-pty.d.ts +230 -0
- package/server/{supervisor-0oXvLwyC.js → supervisor-D5GC5jUM.js} +8 -8
- package/server/supervisor-DQMK2e3I.js +2 -0
- package/server/{swarm-readiness-OBgamRql.js → swarm-readiness-Cf9mommA.js} +3 -3
- package/server/system-prerequisites-BsI9hxh9.js +166 -0
- package/server/{teardown-workspace-DhA6oAIK.js → teardown-workspace-CWz1pbEK.js} +12 -12
- package/server/{test-agent-queue-B_ukPyIK.js → test-agent-queue-TiVXe3ZT.js} +6 -6
- package/server/{test-verdict-D3Il7cBK.js → test-verdict-Bm4uv_AA.js} +2 -2
- package/server/{test-verdict-BkubHtti.js → test-verdict-CCDd25uN.js} +1 -1
- package/server/{tldr-daemon-CJqGsDFh.js → tldr-daemon-Big5IZ_M.js} +1 -1
- package/server/{tldr-daemon-CJW_P4On.js → tldr-daemon-C_1frSDj.js} +2 -2
- package/server/{tmux-ePNhMIMU.js → tmux-D57f-XNv.js} +2 -2
- package/server/{tmux-CeDD14p1.js → tmux-DClqWwb8.js} +1 -1
- package/server/{tracker-config-Drt_tx4D.js → tracker-config-B_Ubts1Z.js} +1 -1
- package/server/{tracker-config-C3hiPVAM.js → tracker-config-BmdJU_w6.js} +2 -2
- package/server/{tracker-utils-D6B8scEw.js → tracker-utils-Bg-Sevcv.js} +1 -1
- package/server/{tracker-utils-bpWs7Xyx.js → tracker-utils-CWFt6jjV.js} +2 -2
- package/server/{tunnel-3Ve8BS4H.js → tunnel-UBf2vyAL.js} +2 -2
- package/server/{tunnel-AporWhoi.js → tunnel-hOBNQbmF.js} +1 -1
- package/server/{uat-train-DPfGR9_I.js → uat-train-DGkIkLxu.js} +1 -1
- package/server/{uat-train-BLBAbJ8Y.js → uat-train-qNanv5hN.js} +54 -54
- package/server/{validation-CbqP_dze.js → validation-B0QaLIHP.js} +1 -1
- package/server/{validation-BmUB-26g.js → validation-C4wegCvH.js} +3 -3
- package/server/{verification-runner-R2-4XgMO.js → verification-runner-CntudBes.js} +11 -11
- package/server/{verification-runner-KTGTNugM.js → verification-runner-DdleMNLq.js} +1 -1
- package/server/{work-agent-prompt-DCdHsm-V.js → work-agent-prompt-CG5jFV9A.js} +11 -11
- package/server/{workflows-CSKX5MhC.js → workflows-BK2xs_a8.js} +13 -13
- package/server/workflows-pKw9yRSV.js +2 -0
- package/server/{workspace-DYv9kBg6.js → workspace-C9lC5o3E.js} +1 -1
- package/server/{workspace-4ZufqeMe.js → workspace-CLrSIRCx.js} +3 -3
- package/server/{workspace-manager-CEWK-OXd.js → workspace-manager-BJhW2sky.js} +10 -10
- package/server/{workspace-manager-B3PqQQSM.js → workspace-manager-Cb2a7bg9.js} +1 -1
- package/server/{workspace-metadata-C0I-nIDL.js → workspace-metadata-CTRnr323.js} +1 -1
- package/server/{workspace-metadata-1eu1RvAT.js → workspace-metadata-QQmo_Z0l.js} +2 -2
- package/server/{workspaces-DXLDgXo2.js → workspaces-Ca4zZs12.js} +223 -223
- package/server/cli-DCqy_wFa.js +0 -3
- package/server/deacon-swarm-CVTiNL0N.js +0 -2
- package/server/forge-BfP7OJwK.js +0 -2
- package/server/inspect-agent-CqpEWGWy.js +0 -2
- package/server/merge-ops-DE_6CnmZ.js +0 -2
- package/server/public/assets/index-DdqPXf3T.js +0 -796
- package/server/public/assets/mermaid-GHXKKRXX-BTHbMU88.js +0 -1
- package/server/rally-DffLLIdl.js +0 -3
- package/server/resume-C-nxu9Y4.js +0 -3
- package/server/settings-vLoKyghx.js +0 -2
- package/server/specs-DeS98l_p.js +0 -3
- package/server/supervisor-D1-XwmZ7.js +0 -2
- package/server/workflows-DVwXauef.js +0 -2
package/server/server.js
CHANGED
|
@@ -1,104 +1,104 @@
|
|
|
1
1
|
import { a as __toCommonJS, i as __require, o as __toESM, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { $n as extractPrefixSync, Br as getOverdeckHome, C as resolveTieredExecutionEnabled, Dn as getProjectSync, Dr as LOGS_DIR, E as canUseHarnessSync, Et as getIssueWorkspacePath, F as getKimiAnthropicBaseUrl, Fr as SYNC_SOURCES, G as init_registry, Gn as resolveProjectFromIssueSync, Gr as sessionFilePath, Hn as registerProjectSync, Hr as isDevMode, In as listProjects, J as computeModelOrigin, K as DEFAULT_ROLES, L as getProviderForModelSync, Ln as listProjectsSync, Lr as encodeClaudeProjectDir, M as UnknownModelError, Nn as init_projects, O as init_harness_policy, Or as OVERDECK_HOME, Ot as init_record, P as getBuiltInDefaultHarness, Q as MODEL_DEPRECATIONS, R as init_providers, S as init_tier_table, Sn as findProjectByTeamSync, T as validateTieredExecutionConfig, Ur as packageRoot, Vr as init_paths, W as defaultBackgroundAiFeatures, Wn as resolveProjectFromIssue, Wr as resolveOhmypiExtensionPath, X as resolveModel, Yn as setProjectAutoMergeDefaultSync, Z as MODEL_CAPABILITIES, _ as getDefaultTtsDaemonConfig, bn as findProjectByPathSync, c as isClaudeCodeChannelsEnabled, cr as FsError, ct as COMPLIANCE_MODES, d as loadConfigNoMigration, er as init_issue_id, et as getModelEffortLevelsSync, f as loadConfigSync, g as mergeConfigs, gr as TrackerError, h as jsYaml, i as getConversationsConfig, ir as require_dist$1, it as resolveModelIdSync, lt as PARENT_MODEL_REF, m as init_js_yaml, mr as ProcessSpawnError, n as clearConfigCache, nn as flushAutoCommits, nr as parseIssueIdSync, nt as init_model_capabilities, o as getGlobalConfigPath, p as updateConversationsConfig, q as DEFAULT_WORKHORSES, r as getConversationSearchConfigSync, rn as init_auto_commit, rt as modelSupportsImagesSync, t as init_config_yaml, tn as flushAllPendingAutoCommits, tt as hasModelCapabilitySync, u as isTldrEnabledSync, ur as GitHubApiError, ut as ROLE_EFFORTS, v as mergeTtsDaemonConfigs, vn as extractTeamPrefix, vr as init_errors, wn as getIssuePrefix, wr as CLAUDE_DIR, x as TieredExecutionConfigError, yr as AGENTS_DIR, z as piProviderForModel, zr as getLegacyHome } from "./config-yaml-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
9
|
-
import { a as init_event_store, i as initEventStore, n as getEventStore, r as getSharedDb } from "./event-store-
|
|
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-
|
|
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-
|
|
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-
|
|
14
|
-
import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-
|
|
15
|
-
import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-
|
|
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-
|
|
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,
|
|
18
|
-
import { t as init_behavior } from "./behavior-
|
|
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-
|
|
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-
|
|
21
|
-
import { n as AgentStateServiceLive } from "./agent-state-service-
|
|
22
|
-
import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-
|
|
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-
|
|
25
|
-
import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-
|
|
26
|
-
import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-
|
|
27
|
-
import { a as resolveTrackerTypeSync, i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-
|
|
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-
|
|
29
|
-
import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-
|
|
30
|
-
import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-
|
|
31
|
-
import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-
|
|
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-
|
|
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-
|
|
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-
|
|
36
|
-
import { f as init_config$1, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-
|
|
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-
|
|
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-
|
|
40
|
-
import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-
|
|
41
|
-
import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-
|
|
42
|
-
import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-
|
|
43
|
-
import { a as init_launcher_generator, i as generateLauncherScriptSync, n as init_state_home, r as isStateMigrated } from "./state-home-
|
|
44
|
-
import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-
|
|
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-
|
|
46
|
-
import { l as init_codex, s as findRolloutPath } from "./codex-
|
|
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-
|
|
48
|
-
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-
|
|
49
|
-
import { i as checkPrdGateSync, t as init_pan_dir } from "./pan-dir-
|
|
50
|
-
import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-
|
|
51
|
-
import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-
|
|
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-
|
|
53
|
-
import { i as CostThresholdError, l as embed, s as parseRelativeTime } from "./scanner-
|
|
54
|
-
import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-
|
|
55
|
-
import { n as recordBackgroundAiCost, t as init_cost } from "./cost-
|
|
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-
|
|
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-
|
|
58
|
-
import { l as detectPlatform, u as init_platform } from "./workspace-manager-
|
|
59
|
-
import { O as init_specialists, b as getReviewerSessionName } from "./specialists-
|
|
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-
|
|
62
|
-
import { a as getShadowState, s as init_shadow_state } from "./shadow-state-
|
|
63
|
-
import { T as verifyAppCanMerge, d as getPullRequestState, f as init_github_app, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-
|
|
64
|
-
import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-
|
|
65
|
-
import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-
|
|
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-
|
|
69
|
-
import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-
|
|
70
|
-
import { i as resolveAutoSpawnOnFinalize, o as spawnPlanningSession } from "./spawn-planning-session-
|
|
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-
|
|
72
|
-
import { r as spawnInspectAgent } from "./inspect-agent-
|
|
73
|
-
import { n as init_github_pr_lookup, r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-
|
|
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-
|
|
75
|
-
import { t as enrichReviewStatus } from "./review-status-enrichment-
|
|
76
|
-
import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-
|
|
77
|
-
import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-
|
|
78
|
-
import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-
|
|
79
|
-
import { C as init_git_activity, w as listGitOperationsSync } from "./merge-agent-
|
|
80
|
-
import { t as getAgentCommandSync } from "./settings-
|
|
81
|
-
import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-
|
|
82
|
-
import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-
|
|
83
|
-
import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-
|
|
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-
|
|
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-
|
|
86
|
-
import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-
|
|
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-
|
|
88
|
-
import { r as parseArtifactRef } from "./forge-
|
|
89
|
-
import { t as getMergeBlockersPayload } from "./merge-blockers-
|
|
90
|
-
import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-
|
|
91
|
-
import "./supervisor-
|
|
92
|
-
import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-
|
|
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
|
|
657
|
-
const projectBeadsDir = join
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
742
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
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
|
|
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-
|
|
799
|
-
const { loadProjectsConfigSync } = await import("./projects-
|
|
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-
|
|
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-
|
|
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
|
|
929
|
-
join
|
|
930
|
-
join
|
|
931
|
-
join
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
28325
|
-
resolve
|
|
28326
|
-
resolve
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
30598
|
-
const projectRoot = join
|
|
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
|
|
30601
|
-
const beadsEntries = workspaceEntries.has(".beads") ? new Set(await readdir(join
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
30937
|
-
join
|
|
30938
|
-
join
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
31331
|
-
else if (!migrated && existsSync$1(join
|
|
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
|
|
31337
|
-
if (!migrated && existsSync$1(join
|
|
31338
|
-
if (existsSync$1(join
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
31900
|
-
join
|
|
31901
|
-
join
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
32027
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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
|
|
32351
|
+
const agentDir = join(homedir$1(), ".overdeck", "agents", `agent-${id.toLowerCase()}`);
|
|
32334
32352
|
for (const marker of ["completed", "completed.processed"]) {
|
|
32335
|
-
const markerPath = join
|
|
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
|
|
32348
|
-
const { createBeadsFromVBrief } = await import("./beads-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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-
|
|
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
|
|
32761
|
-
join
|
|
32762
|
-
join
|
|
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
|
|
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
|
|
32865
|
+
const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
|
|
32848
32866
|
const sessionName = `planning-${issueLower}`;
|
|
32849
|
-
const agentStateDir = join
|
|
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
|
|
33004
|
-
const workAgentStateDir = issueIdentifier ? join
|
|
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
|
|
33016
|
-
const plainWorkspacePath = join
|
|
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
|
|
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
|
|
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
|
|
33113
|
-
join
|
|
33114
|
-
join
|
|
33115
|
-
join
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
36356
|
+
const logStat = await stat$1(join(homedir$1(), ".overdeck", "agents", agentId, "output.log")).catch(() => null);
|
|
36339
36357
|
if (logStat && Date.now() - logStat.mtime.getTime() < 5e3) return "active";
|
|
36340
36358
|
return "idle";
|
|
36341
36359
|
}
|
|
@@ -36792,7 +36810,7 @@ function loadSettingsApi() {
|
|
|
36792
36810
|
streamdownRenderer: config.experimental?.streamdownRenderer ?? false,
|
|
36793
36811
|
showHarnessModelPermutations: config.experimental?.showHarnessModelPermutations ?? false
|
|
36794
36812
|
},
|
|
36795
|
-
claude: { permissionMode: config.claude?.permissionMode ?? "
|
|
36813
|
+
claude: { permissionMode: config.claude?.permissionMode ?? "bypass" },
|
|
36796
36814
|
codex: { permissionMode: config.codex?.permissionMode ?? "auto-review" },
|
|
36797
36815
|
remote: {
|
|
36798
36816
|
resiliency_tier: config.remote?.resiliencyTier ?? "ephemeral",
|
|
@@ -37393,7 +37411,7 @@ async function readReviewerStoppedAt(sessionId, _agentsRoot) {
|
|
|
37393
37411
|
}
|
|
37394
37412
|
/** Read the round-N.json artifacts for one reviewer session. */
|
|
37395
37413
|
async function readReviewerRounds(sessionName, agentsRoot) {
|
|
37396
|
-
const dir = join
|
|
37414
|
+
const dir = join(agentsRoot, sessionName);
|
|
37397
37415
|
let entries;
|
|
37398
37416
|
try {
|
|
37399
37417
|
entries = await readdir(dir);
|
|
@@ -37410,7 +37428,7 @@ async function readReviewerRounds(sessionName, agentsRoot) {
|
|
|
37410
37428
|
if (roundFiles.length === 0) return void 0;
|
|
37411
37429
|
const isSynthesis = sessionName.endsWith("-review-synthesis");
|
|
37412
37430
|
const history = (await Promise.all(roundFiles.map(async (rf) => {
|
|
37413
|
-
const raw = await readFile(join
|
|
37431
|
+
const raw = await readFile(join(dir, rf.name), "utf-8").catch(() => null);
|
|
37414
37432
|
if (!raw) return null;
|
|
37415
37433
|
try {
|
|
37416
37434
|
const parsed = JSON.parse(raw);
|
|
@@ -37457,7 +37475,7 @@ async function readReviewerRounds(sessionName, agentsRoot) {
|
|
|
37457
37475
|
*/
|
|
37458
37476
|
async function findLatestReviewRunDir(workspacePath, issueId) {
|
|
37459
37477
|
try {
|
|
37460
|
-
const reviewRoot = join
|
|
37478
|
+
const reviewRoot = join(workspacePath, ".pan", "review");
|
|
37461
37479
|
const entries = await readdir(reviewRoot);
|
|
37462
37480
|
const upper = issueId.toUpperCase();
|
|
37463
37481
|
const lower = issueId.toLowerCase();
|
|
@@ -37472,7 +37490,7 @@ async function findLatestReviewRunDir(workspacePath, issueId) {
|
|
|
37472
37490
|
if (!Number.isFinite(ts)) continue;
|
|
37473
37491
|
if (ts > bestTs) {
|
|
37474
37492
|
bestTs = ts;
|
|
37475
|
-
bestDir = join
|
|
37493
|
+
bestDir = join(reviewRoot, entry);
|
|
37476
37494
|
}
|
|
37477
37495
|
}
|
|
37478
37496
|
return bestDir;
|
|
@@ -37480,7 +37498,7 @@ async function findLatestReviewRunDir(workspacePath, issueId) {
|
|
|
37480
37498
|
return null;
|
|
37481
37499
|
}
|
|
37482
37500
|
}
|
|
37483
|
-
async function readSynthesisRounds(issueId, projectKey, agentsRoot = join
|
|
37501
|
+
async function readSynthesisRounds(issueId, projectKey, agentsRoot = join(homedir$1(), ".overdeck", "agents")) {
|
|
37484
37502
|
return readReviewerRounds(getReviewerSessionName("synthesis", projectKey, issueId), agentsRoot);
|
|
37485
37503
|
}
|
|
37486
37504
|
/**
|
|
@@ -37489,14 +37507,14 @@ async function readSynthesisRounds(issueId, projectKey, agentsRoot = join$1(home
|
|
|
37489
37507
|
*/
|
|
37490
37508
|
async function buildReviewerNodes(opts) {
|
|
37491
37509
|
if (!isExtendedReviewEnabled(opts.issueId)) return [];
|
|
37492
|
-
const agentsRoot = opts.agentsDirOverride ?? join
|
|
37510
|
+
const agentsRoot = opts.agentsDirOverride ?? join(homedir$1(), ".overdeck", "agents");
|
|
37493
37511
|
const latestReviewRunDir = await findLatestReviewRunDir(opts.workspacePath, opts.issueId);
|
|
37494
37512
|
return await Promise.all(CONVOY_REVIEWER_ROLES.map(async (role) => {
|
|
37495
37513
|
const sessionId = getReviewerSessionName(role, opts.projectKey, opts.issueId);
|
|
37496
37514
|
const isLive = opts.tmuxSessionNames.has(sessionId);
|
|
37497
37515
|
const roundMetadata = await readReviewerRounds(sessionId, agentsRoot);
|
|
37498
37516
|
const jsonlPath = await resolveJsonlPath(sessionId, opts.workspacePath ?? opts.projectPath, { agentsDirOverride: opts.agentsDirOverride });
|
|
37499
|
-
const latestRunOutputExists = latestReviewRunDir ? existsSync$1(join
|
|
37517
|
+
const latestRunOutputExists = latestReviewRunDir ? existsSync$1(join(latestReviewRunDir, `${role}.md`)) : false;
|
|
37500
37518
|
const inProgressThisRound = isLive && latestReviewRunDir !== null && !latestRunOutputExists;
|
|
37501
37519
|
const latestRoundDone = roundMetadata?.latestStatus === "completed" || roundMetadata?.latestStatus === "failed";
|
|
37502
37520
|
const isZombie = isLive && latestRoundDone && !inProgressThisRound;
|
|
@@ -37592,7 +37610,7 @@ function setProjectPathCache(issuePrefix, path) {
|
|
|
37592
37610
|
return path;
|
|
37593
37611
|
}
|
|
37594
37612
|
function getProjectPath$1(issuePrefix) {
|
|
37595
|
-
if (!issuePrefix) return join
|
|
37613
|
+
if (!issuePrefix) return join(homedir$1(), "Projects");
|
|
37596
37614
|
const cached = projectPathCache.get(issuePrefix);
|
|
37597
37615
|
if (cached) return cached;
|
|
37598
37616
|
const resolved = resolveProjectFromIssueSync(`${issuePrefix}-1`);
|
|
@@ -37601,13 +37619,13 @@ function getProjectPath$1(issuePrefix) {
|
|
|
37601
37619
|
if (config) {
|
|
37602
37620
|
for (const { owner, repo, prefix } of config.repos) if ((prefix || repo.toUpperCase().replace(/-CLI$/, "").replace(/-/g, "")).toUpperCase() === issuePrefix.toUpperCase()) {
|
|
37603
37621
|
for (const path of [
|
|
37604
|
-
join
|
|
37605
|
-
join
|
|
37606
|
-
join
|
|
37622
|
+
join(homedir$1(), "Projects", repo),
|
|
37623
|
+
join(homedir$1(), "Projects", repo.replace(/-cli$/, "")),
|
|
37624
|
+
join(homedir$1(), "Projects", owner, repo)
|
|
37607
37625
|
]) if (existsSync$1(path)) return setProjectPathCache(issuePrefix, path);
|
|
37608
37626
|
}
|
|
37609
37627
|
}
|
|
37610
|
-
return setProjectPathCache(issuePrefix, join
|
|
37628
|
+
return setProjectPathCache(issuePrefix, join(homedir$1(), "Projects"));
|
|
37611
37629
|
}
|
|
37612
37630
|
const readJsonBody$12 = Effect.gen(function* () {
|
|
37613
37631
|
const text = yield* (yield* HttpServerRequest.HttpServerRequest).text;
|
|
@@ -37653,18 +37671,18 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
|
|
|
37653
37671
|
} catch {}
|
|
37654
37672
|
const sections = [];
|
|
37655
37673
|
const projectPath = getProjectPath$1(issuePrefix);
|
|
37656
|
-
const workspacePath = join
|
|
37674
|
+
const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
|
|
37657
37675
|
const agentId = `agent-${issueLower}`;
|
|
37658
37676
|
const planningAgentId = `planning-${issueLower}`;
|
|
37659
37677
|
const knowledgeAgentId = `agent-${issueLower}-knowledge`;
|
|
37660
|
-
const agentsDir = join
|
|
37678
|
+
const agentsDir = join(homedir$1(), ".overdeck", "agents");
|
|
37661
37679
|
let hasPlanningSection = false;
|
|
37662
37680
|
for (const checkId of [
|
|
37663
37681
|
planningAgentId,
|
|
37664
37682
|
agentId,
|
|
37665
37683
|
knowledgeAgentId
|
|
37666
37684
|
]) {
|
|
37667
|
-
const agentDir = join
|
|
37685
|
+
const agentDir = join(agentsDir, checkId);
|
|
37668
37686
|
if (!await pathExists$4(agentDir)) continue;
|
|
37669
37687
|
const state = getAgentStateSync(checkId);
|
|
37670
37688
|
if (!state) continue;
|
|
@@ -37680,11 +37698,11 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
|
|
|
37680
37698
|
transcriptFromPane = transcript.length > 0;
|
|
37681
37699
|
} catch {}
|
|
37682
37700
|
if (!isPlanning && !transcript) {
|
|
37683
|
-
const logText = await readOptional$2(join
|
|
37701
|
+
const logText = await readOptional$2(join(agentDir, "output.log"));
|
|
37684
37702
|
if (logText) transcript = logText;
|
|
37685
37703
|
}
|
|
37686
37704
|
if (isPlanning && !transcript) {
|
|
37687
|
-
const continueText = await readOptional$2(join
|
|
37705
|
+
const continueText = await readOptional$2(join(join(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`, PAN_DIRNAME), PAN_CONTINUE_FILENAME));
|
|
37688
37706
|
if (continueText) transcript = `PLANNING COMPLETE\n\n${continueText}`;
|
|
37689
37707
|
}
|
|
37690
37708
|
}
|
|
@@ -37716,7 +37734,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
|
|
|
37716
37734
|
} catch {}
|
|
37717
37735
|
}
|
|
37718
37736
|
if (!hasPlanningSection) {
|
|
37719
|
-
const continuePath = join
|
|
37737
|
+
const continuePath = join(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
|
|
37720
37738
|
const continueText = await readOptional$2(continuePath);
|
|
37721
37739
|
if (continueText) {
|
|
37722
37740
|
const fileStat = await stat$1(continuePath).catch(() => null);
|
|
@@ -37737,7 +37755,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
|
|
|
37737
37755
|
}
|
|
37738
37756
|
const centralStatus = getReviewStatusSync(issueId.toUpperCase());
|
|
37739
37757
|
if (centralStatus?.history && centralStatus.history.length > 0) {
|
|
37740
|
-
const tasksDir = join
|
|
37758
|
+
const tasksDir = join(homedir$1(), ".overdeck", "specialists", "tasks");
|
|
37741
37759
|
const taskFilesByType = {
|
|
37742
37760
|
review: [],
|
|
37743
37761
|
test: [],
|
|
@@ -37749,7 +37767,7 @@ async function fetchActivityDataWithContext(issueId, context = {}) {
|
|
|
37749
37767
|
if (await pathExists$4(tasksDir)) {
|
|
37750
37768
|
const filenames = (await readdir(tasksDir).catch(() => [])).filter((f) => f.endsWith(".md"));
|
|
37751
37769
|
await Promise.all(filenames.map(async (f) => {
|
|
37752
|
-
const content = await readOptional$2(join
|
|
37770
|
+
const content = await readOptional$2(join(tasksDir, f));
|
|
37753
37771
|
if (content) taskFileContents.set(f, content);
|
|
37754
37772
|
}));
|
|
37755
37773
|
}
|
|
@@ -37967,9 +37985,9 @@ async function fetchPlanningData(issueId, options = {}) {
|
|
|
37967
37985
|
const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
|
|
37968
37986
|
const summaryOnly = options.summaryOnly ?? false;
|
|
37969
37987
|
const projectPath = getProjectPath$1(issuePrefix);
|
|
37970
|
-
const workspacePath = join
|
|
37971
|
-
const planningDir = join
|
|
37972
|
-
const panContinuePath = join
|
|
37988
|
+
const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
|
|
37989
|
+
const planningDir = join(workspacePath, PAN_DIRNAME);
|
|
37990
|
+
const panContinuePath = join(planningDir, PAN_CONTINUE_FILENAME);
|
|
37973
37991
|
const result = {
|
|
37974
37992
|
hasPrd: false,
|
|
37975
37993
|
hasState: false,
|
|
@@ -37986,7 +38004,7 @@ async function fetchPlanningData(issueId, options = {}) {
|
|
|
37986
38004
|
return a.localeCompare(b);
|
|
37987
38005
|
})[0];
|
|
37988
38006
|
if (!firstMarkdown) return void 0;
|
|
37989
|
-
return await readOptional$2(join
|
|
38007
|
+
return await readOptional$2(join(loc.path, firstMarkdown)) ?? void 0;
|
|
37990
38008
|
};
|
|
37991
38009
|
const hasPlanningDir = await pathExists$4(planningDir);
|
|
37992
38010
|
const hasPanContinue = await pathExists$4(panContinuePath);
|
|
@@ -38025,9 +38043,9 @@ async function fetchPlanningData(issueId, options = {}) {
|
|
|
38025
38043
|
return result;
|
|
38026
38044
|
}
|
|
38027
38045
|
result.state = await readOptional$2(panContinuePath) ?? void 0;
|
|
38028
|
-
result.inference = hasPlanningDir ? await readOptional$2(join
|
|
38046
|
+
result.inference = hasPlanningDir ? await readOptional$2(join(planningDir, "INFERENCE.md")) ?? void 0 : void 0;
|
|
38029
38047
|
result.hasState = Boolean(result.state);
|
|
38030
|
-
const statusReviewPath = join
|
|
38048
|
+
const statusReviewPath = join(planningDir, "STATUS_REVIEW.md");
|
|
38031
38049
|
const statusReview = await readOptional$2(statusReviewPath);
|
|
38032
38050
|
if (statusReview) {
|
|
38033
38051
|
result.statusReview = statusReview;
|
|
@@ -38050,13 +38068,13 @@ async function fetchPlanningData(issueId, options = {}) {
|
|
|
38050
38068
|
result.hasPrd = Boolean(result.prd);
|
|
38051
38069
|
const listArtifactFiles = async (subdir) => {
|
|
38052
38070
|
if (!hasPlanningDir) return [];
|
|
38053
|
-
const dirPath = join
|
|
38071
|
+
const dirPath = join(planningDir, subdir);
|
|
38054
38072
|
if (!await pathExists$4(dirPath)) return [];
|
|
38055
38073
|
const files = (await readdir(dirPath).catch(() => [])).filter((f) => f.endsWith(".md") || f.endsWith(".txt"));
|
|
38056
38074
|
return (await Promise.all(files.map(async (filename) => {
|
|
38057
38075
|
return {
|
|
38058
38076
|
filename,
|
|
38059
|
-
mtime: (await stat$1(join
|
|
38077
|
+
mtime: (await stat$1(join(dirPath, filename)).catch(() => null))?.mtime.toISOString() ?? (/* @__PURE__ */ new Date()).toISOString()
|
|
38060
38078
|
};
|
|
38061
38079
|
}))).sort((a, b) => new Date(b.mtime).getTime() - new Date(a.mtime).getTime());
|
|
38062
38080
|
};
|
|
@@ -38065,7 +38083,7 @@ async function fetchPlanningData(issueId, options = {}) {
|
|
|
38065
38083
|
return await Promise.all(files.map(async ({ filename, mtime }) => {
|
|
38066
38084
|
return {
|
|
38067
38085
|
filename,
|
|
38068
|
-
content: await readOptional$2(join
|
|
38086
|
+
content: await readOptional$2(join(planningDir, subdir, filename)) ?? "",
|
|
38069
38087
|
[dateField]: mtime
|
|
38070
38088
|
};
|
|
38071
38089
|
}));
|
|
@@ -38138,9 +38156,9 @@ const postMissionControlStatusReviewRoute = HttpRouter.add("POST", "/api/command
|
|
|
38138
38156
|
})));
|
|
38139
38157
|
async function generateStatusReview(issueId) {
|
|
38140
38158
|
const issueLower = issueId.toLowerCase();
|
|
38141
|
-
const workspacePath = join
|
|
38142
|
-
const planningDir = join
|
|
38143
|
-
const panContinuePath = join
|
|
38159
|
+
const workspacePath = join(getProjectPath$1(extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`);
|
|
38160
|
+
const planningDir = join(workspacePath, PAN_DIRNAME);
|
|
38161
|
+
const panContinuePath = join(planningDir, PAN_CONTINUE_FILENAME);
|
|
38144
38162
|
if (!await pathExists$4(planningDir) && !await pathExists$4(panContinuePath)) return {
|
|
38145
38163
|
type: "err",
|
|
38146
38164
|
response: { error: "No planning state found" },
|
|
@@ -38148,11 +38166,11 @@ async function generateStatusReview(issueId) {
|
|
|
38148
38166
|
};
|
|
38149
38167
|
const state = await readOptional$2(panContinuePath);
|
|
38150
38168
|
const readPlanningSubdir = async (subdir, limit = 5, maxPerFile = 2e3) => {
|
|
38151
|
-
const dirPath = join
|
|
38169
|
+
const dirPath = join(planningDir, subdir);
|
|
38152
38170
|
if (!await pathExists$4(dirPath)) return "";
|
|
38153
38171
|
const files = (await readdir(dirPath).catch(() => [])).filter((f) => f.endsWith(".md") || f.endsWith(".txt"));
|
|
38154
38172
|
return (await Promise.all(files.slice(0, limit).map(async (file) => {
|
|
38155
|
-
const content = await readOptional$2(join
|
|
38173
|
+
const content = await readOptional$2(join(dirPath, file));
|
|
38156
38174
|
return content ? `\n### ${file}\n${content.slice(0, maxPerFile)}\n` : "";
|
|
38157
38175
|
}))).join("");
|
|
38158
38176
|
};
|
|
@@ -38224,8 +38242,8 @@ async function generateStatusReview(issueId) {
|
|
|
38224
38242
|
testStatus
|
|
38225
38243
|
].filter(Boolean).join("|")).digest("hex");
|
|
38226
38244
|
await mkdir(planningDir, { recursive: true });
|
|
38227
|
-
const hashPath = join
|
|
38228
|
-
const statusReviewPath = join
|
|
38245
|
+
const hashPath = join(planningDir, ".status-review-hash");
|
|
38246
|
+
const statusReviewPath = join(planningDir, "STATUS_REVIEW.md");
|
|
38229
38247
|
const [savedHash, cachedReview] = await Promise.all([readOptional$2(hashPath), readOptional$2(statusReviewPath)]);
|
|
38230
38248
|
if (savedHash?.trim() === contentHash && cachedReview) {
|
|
38231
38249
|
const fileStat = await stat$1(statusReviewPath).catch(() => null);
|
|
@@ -38287,8 +38305,8 @@ Be specific: reference actual file names, function names, requirement text, disc
|
|
|
38287
38305
|
const statusModelId = (loadSettingsApi().models?.overrides)?.["status-review"] || "claude-sonnet-5";
|
|
38288
38306
|
const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
|
|
38289
38307
|
const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
|
|
38290
|
-
const promptFile = join
|
|
38291
|
-
const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-
|
|
38308
|
+
const promptFile = join(planningDir, ".status-review-prompt.tmp");
|
|
38309
|
+
const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-JjK6izqX.js");
|
|
38292
38310
|
let providerEnvStr = "";
|
|
38293
38311
|
let providerEnv = {};
|
|
38294
38312
|
const statusProvider = getProviderForModelSync(statusModelId);
|
|
@@ -38376,17 +38394,17 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
|
|
|
38376
38394
|
safeName = safeName.replace(/\.vtt$/, ".md");
|
|
38377
38395
|
}
|
|
38378
38396
|
const ext = safeName.endsWith(".md") || safeName.endsWith(".txt") ? "" : ".md";
|
|
38379
|
-
const dirPath = join
|
|
38397
|
+
const dirPath = join(join(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`), PAN_DIRNAME, type === "transcript" ? "transcripts" : "notes");
|
|
38380
38398
|
yield* Effect.tryPromise({
|
|
38381
38399
|
try: async () => {
|
|
38382
38400
|
await mkdir(dirPath, { recursive: true });
|
|
38383
|
-
await writeFile(join
|
|
38401
|
+
await writeFile(join(dirPath, safeName + ext), processedContent, "utf-8");
|
|
38384
38402
|
},
|
|
38385
38403
|
catch: (err) => new Error(err instanceof Error ? err.message : String(err))
|
|
38386
38404
|
});
|
|
38387
38405
|
return jsonResponse({
|
|
38388
38406
|
success: true,
|
|
38389
|
-
path: join
|
|
38407
|
+
path: join(dirPath, safeName + ext)
|
|
38390
38408
|
});
|
|
38391
38409
|
})));
|
|
38392
38410
|
const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/command-deck/planning/:issueId/sync-discussions", httpHandler(Effect.gen(function* () {
|
|
@@ -38402,7 +38420,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
|
|
|
38402
38420
|
"linear",
|
|
38403
38421
|
"rally"
|
|
38404
38422
|
].includes(tracker)) return jsonResponse({ error: "tracker must be github, linear, or rally" }, { status: 400 });
|
|
38405
|
-
const discussionsDir = join
|
|
38423
|
+
const discussionsDir = join(join(getProjectPath$1(issuePrefix), "workspaces", `feature-${issueLower}`), PAN_DIRNAME, "discussions");
|
|
38406
38424
|
yield* Effect.tryPromise({
|
|
38407
38425
|
try: () => mkdir(discussionsDir, { recursive: true }),
|
|
38408
38426
|
catch: (err) => new Error(err instanceof Error ? err.message : String(err))
|
|
@@ -38429,7 +38447,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
|
|
|
38429
38447
|
});
|
|
38430
38448
|
if (stdout.trim()) {
|
|
38431
38449
|
const filename = `github-${issueId}-comments.md`;
|
|
38432
|
-
await writeFile(join
|
|
38450
|
+
await writeFile(join(discussionsDir, filename), `# GitHub Comments for ${issueId}\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + stdout, "utf-8");
|
|
38433
38451
|
syncedFiles.push(filename);
|
|
38434
38452
|
}
|
|
38435
38453
|
} catch (err) {
|
|
@@ -38468,7 +38486,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
|
|
|
38468
38486
|
});
|
|
38469
38487
|
if (prComments.trim()) {
|
|
38470
38488
|
const filename = `pr-${prNum}-discussion.md`;
|
|
38471
|
-
await writeFile(join
|
|
38489
|
+
await writeFile(join(discussionsDir, filename), `# PR #${prNum} Discussion\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + prComments, "utf-8");
|
|
38472
38490
|
syncedFiles.push(filename);
|
|
38473
38491
|
}
|
|
38474
38492
|
} catch {}
|
|
@@ -38482,7 +38500,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
|
|
|
38482
38500
|
const filename = `linear-${issueId}-comments.md`;
|
|
38483
38501
|
const commentBody = comments.map((c) => `## ${c.author} (${c.createdAt})\n\n${c.body}\n\n---\n`).join("\n");
|
|
38484
38502
|
yield* Effect.tryPromise({
|
|
38485
|
-
try: () => writeFile(join
|
|
38503
|
+
try: () => writeFile(join(discussionsDir, filename), `# Linear Comments for ${issueId}\n\nSynced: ${(/* @__PURE__ */ new Date()).toISOString()}\n\n---\n\n` + commentBody, "utf-8"),
|
|
38486
38504
|
catch: (err) => new Error(String(err))
|
|
38487
38505
|
});
|
|
38488
38506
|
syncedFiles.push(filename);
|
|
@@ -38523,7 +38541,7 @@ const postMissionControlSyncDiscussionsRoute = HttpRouter.add("POST", "/api/comm
|
|
|
38523
38541
|
lines.push("");
|
|
38524
38542
|
}
|
|
38525
38543
|
yield* Effect.tryPromise({
|
|
38526
|
-
try: () => writeFile(join
|
|
38544
|
+
try: () => writeFile(join(discussionsDir, filename), lines.join("\n"), "utf-8"),
|
|
38527
38545
|
catch: (err) => new Error(String(err))
|
|
38528
38546
|
});
|
|
38529
38547
|
syncedFiles.push(filename);
|
|
@@ -38542,16 +38560,16 @@ const postMissionControlPlanningInitRoute = HttpRouter.add("POST", "/api/command
|
|
|
38542
38560
|
const eventStore = yield* EventStoreService;
|
|
38543
38561
|
const { shadow } = body;
|
|
38544
38562
|
const issueLower = issueId.toLowerCase();
|
|
38545
|
-
const planningDir = join
|
|
38563
|
+
const planningDir = join(join(getProjectPath$1(extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`), PAN_DIRNAME);
|
|
38546
38564
|
yield* Effect.tryPromise({
|
|
38547
38565
|
try: async () => {
|
|
38548
38566
|
await Promise.all([
|
|
38549
38567
|
"transcripts",
|
|
38550
38568
|
"discussions",
|
|
38551
38569
|
"notes"
|
|
38552
|
-
].map((subdir) => mkdir(join
|
|
38570
|
+
].map((subdir) => mkdir(join(planningDir, subdir), { recursive: true })));
|
|
38553
38571
|
if (shadow) {
|
|
38554
|
-
const inferencePath = join
|
|
38572
|
+
const inferencePath = join(planningDir, "INFERENCE.md");
|
|
38555
38573
|
if (!await pathExists$4(inferencePath)) await writeFile(inferencePath, `# Inference Document - ${issueId}\n\n*This document is maintained by the Shadow Engineering Monitoring Agent.*\n\n## Status\n\nAwaiting initial artifact analysis.\n\n## Understanding\n\n(pending)\n\n## Gaps & Risks\n\n(pending)\n`, "utf-8");
|
|
38556
38574
|
}
|
|
38557
38575
|
},
|
|
@@ -38602,7 +38620,7 @@ init_config$1();
|
|
|
38602
38620
|
init_domain_services();
|
|
38603
38621
|
async function loadRemoteWorkspaceMetadata(issueId) {
|
|
38604
38622
|
const normalizedId = issueId.toLowerCase().replace(/[^a-z0-9-]/g, "-");
|
|
38605
|
-
const content = await readFile(join
|
|
38623
|
+
const content = await readFile(join(homedir$1(), ".overdeck", "workspaces", `${normalizedId}.yaml`), "utf-8").catch(() => null);
|
|
38606
38624
|
if (!content) return null;
|
|
38607
38625
|
try {
|
|
38608
38626
|
return import_dist.parse(content);
|
|
@@ -38611,11 +38629,11 @@ async function loadRemoteWorkspaceMetadata(issueId) {
|
|
|
38611
38629
|
}
|
|
38612
38630
|
}
|
|
38613
38631
|
async function listRemoteWorkspaceMetadata() {
|
|
38614
|
-
const workspacesDir = join
|
|
38632
|
+
const workspacesDir = join(homedir$1(), ".overdeck", "workspaces");
|
|
38615
38633
|
const yamlFiles = (await readdir(workspacesDir).catch(() => [])).filter((f) => f.endsWith(".yaml"));
|
|
38616
38634
|
const workspaces = [];
|
|
38617
38635
|
for (const file of yamlFiles) {
|
|
38618
|
-
const content = await readFile(join
|
|
38636
|
+
const content = await readFile(join(workspacesDir, file), "utf-8").catch(() => null);
|
|
38619
38637
|
if (!content) continue;
|
|
38620
38638
|
try {
|
|
38621
38639
|
const metadata = import_dist.parse(content);
|
|
@@ -38851,8 +38869,8 @@ async function pathExists$3(filePath) {
|
|
|
38851
38869
|
async function findProjectRootAsync(startDir = process.cwd()) {
|
|
38852
38870
|
let currentDir = startDir;
|
|
38853
38871
|
while (true) {
|
|
38854
|
-
if (await pathExists$3(join
|
|
38855
|
-
const parent = dirname
|
|
38872
|
+
if (await pathExists$3(join(currentDir, ".git"))) return currentDir;
|
|
38873
|
+
const parent = dirname(currentDir);
|
|
38856
38874
|
if (parent === currentDir) return null;
|
|
38857
38875
|
currentDir = parent;
|
|
38858
38876
|
}
|
|
@@ -38868,9 +38886,9 @@ function stripProjectTtsEndpoint(config) {
|
|
|
38868
38886
|
async function readProjectConfig() {
|
|
38869
38887
|
const projectRoot = await findProjectRootAsync();
|
|
38870
38888
|
if (!projectRoot) return null;
|
|
38871
|
-
const configPath = join
|
|
38889
|
+
const configPath = join(projectRoot, ".pan.yaml");
|
|
38872
38890
|
if (await pathExists$3(configPath)) return stripProjectTtsEndpoint(await readYamlConfig(configPath));
|
|
38873
|
-
const legacyConfigPath = join
|
|
38891
|
+
const legacyConfigPath = join(projectRoot, ".overdeck.yaml");
|
|
38874
38892
|
if (await pathExists$3(legacyConfigPath)) return stripProjectTtsEndpoint(await readYamlConfig(legacyConfigPath));
|
|
38875
38893
|
return null;
|
|
38876
38894
|
}
|
|
@@ -38888,13 +38906,13 @@ init_paths();
|
|
|
38888
38906
|
init_config_yaml();
|
|
38889
38907
|
init_errors();
|
|
38890
38908
|
const execFileAsync$3 = promisify(execFile);
|
|
38891
|
-
const QWEN_TTS_PID_PATH = join
|
|
38892
|
-
const QWEN_TTS_STATE_PATH = join
|
|
38893
|
-
const QWEN_TTS_START_LOCK_PATH = join
|
|
38894
|
-
const QWEN_TTS_MANUAL_STOP_PATH = join
|
|
38895
|
-
const QWEN_TTS_AUTH_TOKEN_PATH = join
|
|
38909
|
+
const QWEN_TTS_PID_PATH = join(OVERDECK_HOME, "pids", "qwen-tts.pid");
|
|
38910
|
+
const QWEN_TTS_STATE_PATH = join(OVERDECK_HOME, "pids", "qwen-tts.json");
|
|
38911
|
+
const QWEN_TTS_START_LOCK_PATH = join(OVERDECK_HOME, "pids", "qwen-tts.start.lock");
|
|
38912
|
+
const QWEN_TTS_MANUAL_STOP_PATH = join(OVERDECK_HOME, "pids", "qwen-tts.manual-stop");
|
|
38913
|
+
const QWEN_TTS_AUTH_TOKEN_PATH = join(OVERDECK_HOME, "secrets", "qwen-tts.token");
|
|
38896
38914
|
const QWEN_TTS_AUTH_HEADER = "X-Overdeck-TTS-Token";
|
|
38897
|
-
const QWEN_TTS_LOG_PATH = join
|
|
38915
|
+
const QWEN_TTS_LOG_PATH = join(LOGS_DIR, "qwen-tts.log");
|
|
38898
38916
|
const GPU_MEMORY_CACHE_TTL_MS = 3e4;
|
|
38899
38917
|
const DEFAULT_TTS_DAEMON_STARTUP_GRACE_MS = 30 * 6e4;
|
|
38900
38918
|
let gpuMemoryCache = null;
|
|
@@ -38908,21 +38926,21 @@ async function pathExists$2(path) {
|
|
|
38908
38926
|
}
|
|
38909
38927
|
}
|
|
38910
38928
|
async function resolveQwenTtsPackageDirPromise() {
|
|
38911
|
-
const candidates = [join
|
|
38929
|
+
const candidates = [join(packageRoot, "packages", "qwen-tts-linux-x64"), join(packageRoot, "node_modules", "qwen-tts-linux-x64")];
|
|
38912
38930
|
for (const candidate of candidates) if (await pathExists$2(candidate)) return candidate;
|
|
38913
38931
|
await mkdir(candidates[0], { recursive: true });
|
|
38914
38932
|
return candidates[0];
|
|
38915
38933
|
}
|
|
38916
38934
|
async function resolveTtsDaemonScriptPromise() {
|
|
38917
|
-
const script = join
|
|
38935
|
+
const script = join(SYNC_SOURCES.skills, "pan-tts", "scripts", "tts_daemon.py");
|
|
38918
38936
|
if (await pathExists$2(script)) return script;
|
|
38919
38937
|
throw new Error(`Qwen TTS daemon script not found at ${script}`);
|
|
38920
38938
|
}
|
|
38921
38939
|
async function getTtsDaemonVenvDirPromise() {
|
|
38922
|
-
return join
|
|
38940
|
+
return join(await Effect.runPromise(resolveQwenTtsPackageDir()), ".venv");
|
|
38923
38941
|
}
|
|
38924
38942
|
async function getTtsDaemonPythonPromise() {
|
|
38925
|
-
return join
|
|
38943
|
+
return join(await Effect.runPromise(getTtsDaemonVenvDir()), "bin", "python");
|
|
38926
38944
|
}
|
|
38927
38945
|
async function readState() {
|
|
38928
38946
|
try {
|
|
@@ -38947,7 +38965,7 @@ async function readState() {
|
|
|
38947
38965
|
}
|
|
38948
38966
|
}
|
|
38949
38967
|
async function writeState(state) {
|
|
38950
|
-
await mkdir(dirname
|
|
38968
|
+
await mkdir(dirname(QWEN_TTS_PID_PATH), { recursive: true });
|
|
38951
38969
|
await writeFile(QWEN_TTS_PID_PATH, `${state.pid}\n`, "utf8");
|
|
38952
38970
|
await writeFile(QWEN_TTS_STATE_PATH, `${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
38953
38971
|
}
|
|
@@ -38964,7 +38982,7 @@ async function getTtsDaemonAuthTokenPromise() {
|
|
|
38964
38982
|
}
|
|
38965
38983
|
} catch {}
|
|
38966
38984
|
const token = randomBytes(32).toString("base64url");
|
|
38967
|
-
await mkdir(dirname
|
|
38985
|
+
await mkdir(dirname(QWEN_TTS_AUTH_TOKEN_PATH), {
|
|
38968
38986
|
recursive: true,
|
|
38969
38987
|
mode: 448
|
|
38970
38988
|
});
|
|
@@ -39027,7 +39045,7 @@ function buildTtsDaemonEnv(config, authToken) {
|
|
|
39027
39045
|
return env;
|
|
39028
39046
|
}
|
|
39029
39047
|
async function acquireStartLock() {
|
|
39030
|
-
await mkdir(dirname
|
|
39048
|
+
await mkdir(dirname(QWEN_TTS_START_LOCK_PATH), { recursive: true });
|
|
39031
39049
|
while (true) try {
|
|
39032
39050
|
await mkdir(QWEN_TTS_START_LOCK_PATH, { mode: 448 });
|
|
39033
39051
|
return;
|
|
@@ -39381,7 +39399,7 @@ const startTtsDaemon = (options) => Effect.tryPromise({
|
|
|
39381
39399
|
init_paths();
|
|
39382
39400
|
init_errors();
|
|
39383
39401
|
function getTtsVoicesPath() {
|
|
39384
|
-
return join(getOverdeckHome(), "tts-voices.json");
|
|
39402
|
+
return join$1(getOverdeckHome(), "tts-voices.json");
|
|
39385
39403
|
}
|
|
39386
39404
|
async function loadVoicesPromise() {
|
|
39387
39405
|
try {
|
|
@@ -39394,7 +39412,7 @@ async function loadVoicesPromise() {
|
|
|
39394
39412
|
}
|
|
39395
39413
|
async function saveVoicesPromise(voices) {
|
|
39396
39414
|
const filePath = getTtsVoicesPath();
|
|
39397
|
-
await mkdir$1(dirname(filePath), { recursive: true });
|
|
39415
|
+
await mkdir$1(dirname$1(filePath), { recursive: true });
|
|
39398
39416
|
await writeFile$1(filePath, `${JSON.stringify(voices, null, 2)}\n`, {
|
|
39399
39417
|
encoding: "utf-8",
|
|
39400
39418
|
mode: 384
|
|
@@ -39806,7 +39824,7 @@ var ReaddirpStream = class extends Readable {
|
|
|
39806
39824
|
this._wantsDir = type ? DIR_TYPES.has(type) : false;
|
|
39807
39825
|
this._wantsFile = type ? FILE_TYPES.has(type) : false;
|
|
39808
39826
|
this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;
|
|
39809
|
-
this._root = resolve
|
|
39827
|
+
this._root = resolve(root);
|
|
39810
39828
|
this._isDirent = !opts.alwaysStat;
|
|
39811
39829
|
this._statsProp = this._isDirent ? "dirent" : "stats";
|
|
39812
39830
|
this._rdOptions = {
|
|
@@ -39878,9 +39896,9 @@ var ReaddirpStream = class extends Readable {
|
|
|
39878
39896
|
let entry;
|
|
39879
39897
|
const basename = this._isDirent ? dirent.name : dirent;
|
|
39880
39898
|
try {
|
|
39881
|
-
const fullPath = resolve
|
|
39899
|
+
const fullPath = resolve(join(path, basename));
|
|
39882
39900
|
entry = {
|
|
39883
|
-
path: relative
|
|
39901
|
+
path: relative(this._root, fullPath),
|
|
39884
39902
|
fullPath,
|
|
39885
39903
|
basename
|
|
39886
39904
|
};
|
|
@@ -39908,7 +39926,7 @@ var ReaddirpStream = class extends Readable {
|
|
|
39908
39926
|
if (entryRealPathStats.isFile()) return "file";
|
|
39909
39927
|
if (entryRealPathStats.isDirectory()) {
|
|
39910
39928
|
const len = entryRealPath.length;
|
|
39911
|
-
if (full.startsWith(entryRealPath) && full.substr(len, 1) === sep
|
|
39929
|
+
if (full.startsWith(entryRealPath) && full.substr(len, 1) === sep) {
|
|
39912
39930
|
const recursiveError = /* @__PURE__ */ new Error(`Circular symlink detected: "${full}" points to "${entryRealPath}"`);
|
|
39913
39931
|
recursiveError.code = RECURSIVE_ERROR_CODE;
|
|
39914
39932
|
return this._onError(recursiveError);
|
|
@@ -41577,7 +41595,7 @@ function openEmbeddingsDb(dbPath, dimensions, options = {}) {
|
|
|
41577
41595
|
if (!Number.isInteger(dimensions) || dimensions <= 0) return unavailable(`Invalid embedding dimensions: ${dimensions}`);
|
|
41578
41596
|
let db;
|
|
41579
41597
|
try {
|
|
41580
|
-
const dir = dirname
|
|
41598
|
+
const dir = dirname(dbPath);
|
|
41581
41599
|
if (!existsSync$1(dir)) mkdirSync$1(dir, { recursive: true });
|
|
41582
41600
|
db = openDatabase(dbPath, { allowExtension: true });
|
|
41583
41601
|
} catch (err) {
|
|
@@ -42124,7 +42142,7 @@ async function indexConversationSearch(options = {}) {
|
|
|
42124
42142
|
filesScanned: files.length,
|
|
42125
42143
|
filesIndexed: processed,
|
|
42126
42144
|
chunksIndexed: result.chunksIndexed,
|
|
42127
|
-
currentFile: basename
|
|
42145
|
+
currentFile: basename(filePath)
|
|
42128
42146
|
});
|
|
42129
42147
|
const fileResult = await indexConversationFile({
|
|
42130
42148
|
...options,
|
|
@@ -42355,7 +42373,7 @@ async function collectJsonlFiles(dir, files, signal) {
|
|
|
42355
42373
|
return;
|
|
42356
42374
|
}
|
|
42357
42375
|
for (const entry of entries) {
|
|
42358
|
-
const path = join
|
|
42376
|
+
const path = join(dir, entry.name);
|
|
42359
42377
|
throwIfAborted(signal);
|
|
42360
42378
|
if (entry.isDirectory()) await collectJsonlFiles(path, files, signal);
|
|
42361
42379
|
else if (entry.isFile() && entry.name.endsWith(".jsonl")) files.push(path);
|
|
@@ -42383,10 +42401,10 @@ function openIndexerResources(config, options) {
|
|
|
42383
42401
|
};
|
|
42384
42402
|
}
|
|
42385
42403
|
function defaultConversationRoots$1() {
|
|
42386
|
-
return [join
|
|
42404
|
+
return [join(homedir$1(), ".claude", "projects")];
|
|
42387
42405
|
}
|
|
42388
42406
|
function sessionIdFromPath(filePath) {
|
|
42389
|
-
return basename
|
|
42407
|
+
return basename(filePath).replace(/\.jsonl$/, "");
|
|
42390
42408
|
}
|
|
42391
42409
|
function projectIdFromPath(filePath) {
|
|
42392
42410
|
const parts = filePath.split(/[\\/]+/);
|
|
@@ -42583,7 +42601,7 @@ async function syncConversationSearchWatcher(options = {}) {
|
|
|
42583
42601
|
return activeWatcher;
|
|
42584
42602
|
}
|
|
42585
42603
|
function defaultConversationRoots() {
|
|
42586
|
-
return [join
|
|
42604
|
+
return [join(homedir$1(), ".claude", "projects")];
|
|
42587
42605
|
}
|
|
42588
42606
|
function isAbortError(error) {
|
|
42589
42607
|
return error instanceof Error && error.name === "AbortError";
|
|
@@ -43629,7 +43647,7 @@ const getLegacyImportPreviewRoute = HttpRouter.add("GET", "/api/settings/legacy-
|
|
|
43629
43647
|
return yield* Effect.try({
|
|
43630
43648
|
try: () => {
|
|
43631
43649
|
const urlPath = new URL(request.url, "http://localhost").searchParams.get("path");
|
|
43632
|
-
const defaultPath = join
|
|
43650
|
+
const defaultPath = join(getLegacyHome(), "panopticon.db");
|
|
43633
43651
|
const resolvedPath = urlPath?.trim() || defaultPath;
|
|
43634
43652
|
const preview = previewLegacyConversations(resolvedPath);
|
|
43635
43653
|
if (!preview.found) return jsonResponse({
|
|
@@ -43981,13 +43999,14 @@ init_projects();
|
|
|
43981
43999
|
init_tracker_utils();
|
|
43982
44000
|
init_tracker_config();
|
|
43983
44001
|
async function readPackageVersion() {
|
|
43984
|
-
let dir = dirname
|
|
44002
|
+
let dir = dirname(fileURLToPath(import.meta.url));
|
|
43985
44003
|
for (let i = 0; i < 8; i++) {
|
|
43986
|
-
const candidate = join
|
|
44004
|
+
const candidate = join(dir, "package.json");
|
|
43987
44005
|
try {
|
|
43988
|
-
|
|
44006
|
+
const version = JSON.parse(await readFile(candidate, "utf-8")).version;
|
|
44007
|
+
if (typeof version === "string" && version) return version;
|
|
43989
44008
|
} catch {}
|
|
43990
|
-
const parent = dirname
|
|
44009
|
+
const parent = dirname(dir);
|
|
43991
44010
|
if (parent === dir) break;
|
|
43992
44011
|
dir = parent;
|
|
43993
44012
|
}
|
|
@@ -43999,16 +44018,16 @@ async function getOverdeckVersion() {
|
|
|
43999
44018
|
return _overdeckVersion;
|
|
44000
44019
|
}
|
|
44001
44020
|
const overdeckDevMode = (() => {
|
|
44002
|
-
let dir = dirname
|
|
44021
|
+
let dir = dirname(fileURLToPath(import.meta.url));
|
|
44003
44022
|
for (let i = 0; i < 8; i++) {
|
|
44004
|
-
if (existsSync$1(join
|
|
44005
|
-
const parent = dirname
|
|
44023
|
+
if (existsSync$1(join(dir, "package.json")) && existsSync$1(join(dir, "src", "dashboard"))) return true;
|
|
44024
|
+
const parent = dirname(dir);
|
|
44006
44025
|
if (parent === dir) break;
|
|
44007
44026
|
dir = parent;
|
|
44008
44027
|
}
|
|
44009
44028
|
return false;
|
|
44010
44029
|
})();
|
|
44011
|
-
const PROJECT_MAPPINGS_FILE = join
|
|
44030
|
+
const PROJECT_MAPPINGS_FILE = join(homedir$1(), ".overdeck", "project-mappings.json");
|
|
44012
44031
|
async function getProjectMappings() {
|
|
44013
44032
|
try {
|
|
44014
44033
|
const content = await readFile(PROJECT_MAPPINGS_FILE, "utf-8");
|
|
@@ -44018,7 +44037,7 @@ async function getProjectMappings() {
|
|
|
44018
44037
|
}
|
|
44019
44038
|
}
|
|
44020
44039
|
async function saveProjectMappings(mappings) {
|
|
44021
|
-
await mkdir(join
|
|
44040
|
+
await mkdir(join(homedir$1(), ".overdeck"), { recursive: true });
|
|
44022
44041
|
await writeFile(PROJECT_MAPPINGS_FILE, JSON.stringify(mappings, null, 2));
|
|
44023
44042
|
}
|
|
44024
44043
|
async function getProjectPath(issuePrefix) {
|
|
@@ -44185,7 +44204,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
|
|
|
44185
44204
|
}, { status: 400 });
|
|
44186
44205
|
return yield* Effect.promise(async () => {
|
|
44187
44206
|
try {
|
|
44188
|
-
const { RallyRestApi } = await import("./rally-api-
|
|
44207
|
+
const { RallyRestApi } = await import("./rally-api-BtvwdX6d.js");
|
|
44189
44208
|
const api = new RallyRestApi({
|
|
44190
44209
|
apiKey,
|
|
44191
44210
|
server: server || "https://rally1.rallydev.com"
|
|
@@ -44322,13 +44341,13 @@ const getGodviewSystemHealthRoute = HttpRouter.add("GET", "/api/godview/system-h
|
|
|
44322
44341
|
})));
|
|
44323
44342
|
const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.promise(async () => {
|
|
44324
44343
|
try {
|
|
44325
|
-
const agentsDir = join
|
|
44344
|
+
const agentsDir = join(homedir$1(), ".overdeck", "agents");
|
|
44326
44345
|
if (!existsSync$1(agentsDir)) return jsonResponse([]);
|
|
44327
44346
|
const agentNames = (await readdir(agentsDir)).filter((name) => name.startsWith("agent-") || name.startsWith("planning-") || name.startsWith("specialist-"));
|
|
44328
44347
|
const liveSessions = new Set(await Effect.runPromise(listSessionNames()));
|
|
44329
44348
|
return jsonResponse((await Promise.all(agentNames.map(async (name) => {
|
|
44330
44349
|
const stateFile = getAgentStateFilePath(name);
|
|
44331
|
-
const healthFile = join
|
|
44350
|
+
const healthFile = join(agentsDir, name, "health.json");
|
|
44332
44351
|
const healthStatus = await Effect.runPromise(determineHealthStatus(name, stateFile, liveSessions));
|
|
44333
44352
|
if (!healthStatus) return null;
|
|
44334
44353
|
let storedHealth = {
|
|
@@ -44344,7 +44363,7 @@ const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.
|
|
|
44344
44363
|
} catch {}
|
|
44345
44364
|
let contextPercent = null;
|
|
44346
44365
|
try {
|
|
44347
|
-
const ctxContent = await readFile(join
|
|
44366
|
+
const ctxContent = await readFile(join(agentsDir, name, "context-pct"), "utf-8");
|
|
44348
44367
|
contextPercent = parseInt(ctxContent.trim(), 10) || null;
|
|
44349
44368
|
} catch {}
|
|
44350
44369
|
return {
|
|
@@ -44509,18 +44528,18 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
|
|
|
44509
44528
|
const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
|
|
44510
44529
|
return yield* Effect.promise(async () => {
|
|
44511
44530
|
try {
|
|
44512
|
-
const workspacePath = join
|
|
44531
|
+
const workspacePath = join(await getProjectPath(issuePrefix), "workspaces", `feature-${issueLower}`);
|
|
44513
44532
|
const remoteState = loadRemoteAgentState(sessionName);
|
|
44514
44533
|
const isRemote = !!remoteState;
|
|
44515
44534
|
const vmName = remoteState?.vmName ?? "";
|
|
44516
|
-
const { getAgentStateSync } = await import("./agents-
|
|
44535
|
+
const { getAgentStateSync } = await import("./agents-C4kZ8a2r.js");
|
|
44517
44536
|
const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
|
|
44518
44537
|
let tmuxSessionAlive = false;
|
|
44519
44538
|
if (!isRemote) try {
|
|
44520
44539
|
tmuxSessionAlive = await Effect.runPromise(sessionExists(sessionName));
|
|
44521
44540
|
} catch {}
|
|
44522
|
-
const panDir = join
|
|
44523
|
-
const hasPlanningState = existsSync$1(join
|
|
44541
|
+
const panDir = join(workspacePath, PAN_DIRNAME);
|
|
44542
|
+
const hasPlanningState = existsSync$1(join(panDir, "continue.json")) || await Effect.runPromise(findPlan(workspacePath)) !== null;
|
|
44524
44543
|
const hasPromptFile = hasPlanningState;
|
|
44525
44544
|
const hasCompletionMarker = existsSync$1(panDir) ? await Effect.runPromise(checkPlanStatus(workspacePath, (status) => status === "proposed")) : false;
|
|
44526
44545
|
const planningCompleted = existsSync$1(panDir) ? await Effect.runPromise(checkPlanStatus(workspacePath, (status) => PLANNING_FINISHED_STATUSES.has(status))) : false;
|
|
@@ -44578,8 +44597,8 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
|
|
|
44578
44597
|
projectPath = (teamPrefix ? findProjectByTeamSync(teamPrefix) : null)?.path || "";
|
|
44579
44598
|
}
|
|
44580
44599
|
if (!projectPath) return jsonResponse({ error: `Could not find project path for ${issueId}. Check projects.yaml.` }, { status: 404 });
|
|
44581
|
-
const workspacePath = join
|
|
44582
|
-
const planningDir = join
|
|
44600
|
+
const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
|
|
44601
|
+
const planningDir = join(workspacePath, PAN_DIRNAME);
|
|
44583
44602
|
if (!existsSync$1(planningDir)) return jsonResponse({
|
|
44584
44603
|
error: "Planning directory not found",
|
|
44585
44604
|
sessionEnded: true
|
|
@@ -44606,7 +44625,7 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
|
|
|
44606
44625
|
message: "Message sent to active session"
|
|
44607
44626
|
});
|
|
44608
44627
|
}
|
|
44609
|
-
const outputFile = join
|
|
44628
|
+
const outputFile = join(planningDir, "output.jsonl");
|
|
44610
44629
|
let conversationLog = "";
|
|
44611
44630
|
const outputContent = await readFile(outputFile, "utf-8").catch(() => null);
|
|
44612
44631
|
if (outputContent) {
|
|
@@ -44620,7 +44639,7 @@ const postPlanningMessageRoute = HttpRouter.add("POST", "/api/planning/:issueId/
|
|
|
44620
44639
|
} catch {}
|
|
44621
44640
|
conversationLog = logParts.join("\n\n");
|
|
44622
44641
|
}
|
|
44623
|
-
const continuationPromptPath = join
|
|
44642
|
+
const continuationPromptPath = join(planningDir, "CONTINUATION_PROMPT.md");
|
|
44624
44643
|
await writeFile(continuationPromptPath, `# Continuation of Planning Session: ${issueId.toUpperCase()}
|
|
44625
44644
|
|
|
44626
44645
|
## CRITICAL: PLANNING ONLY - NO IMPLEMENTATION
|
|
@@ -44655,8 +44674,8 @@ ${message}
|
|
|
44655
44674
|
Continue the PLANNING session. Do NOT implement anything.
|
|
44656
44675
|
`);
|
|
44657
44676
|
const agentCwd = workspacePath;
|
|
44658
|
-
if (existsSync$1(outputFile)) await rename(outputFile, join
|
|
44659
|
-
const { getAgentCommandSync } = await import("./settings-
|
|
44677
|
+
if (existsSync$1(outputFile)) await rename(outputFile, join(planningDir, `output-${Date.now()}.jsonl`));
|
|
44678
|
+
const { getAgentCommandSync } = await import("./settings-DEhYpW0k.js");
|
|
44660
44679
|
let msgPlanningModel = "claude-sonnet-5";
|
|
44661
44680
|
try {
|
|
44662
44681
|
msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
|
|
@@ -44664,7 +44683,7 @@ Continue the PLANNING session. Do NOT implement anything.
|
|
|
44664
44683
|
const msgAgentCmd = getAgentCommandSync(msgPlanningModel);
|
|
44665
44684
|
const msgPermissionFlags = getClaudePermissionFlagsStringSync();
|
|
44666
44685
|
const msgCmdWithArgs = msgAgentCmd.args.length > 0 ? `${msgAgentCmd.command} ${msgAgentCmd.args.join(" ")} ${msgPermissionFlags}` : `${msgAgentCmd.command} ${msgPermissionFlags}`;
|
|
44667
|
-
const launcherScript = join
|
|
44686
|
+
const launcherScript = join(agentStateDir, "continuation-launcher.sh");
|
|
44668
44687
|
await mkdir(agentStateDir, { recursive: true });
|
|
44669
44688
|
await writeFile(launcherScript, generateLauncherScriptSync({
|
|
44670
44689
|
role: "plan",
|
|
@@ -44721,11 +44740,11 @@ const planningRouteLayer = Layer.mergeAll(getPlanningStatusRoute, postPlanningMe
|
|
|
44721
44740
|
//#region routes/misc/tldr.ts
|
|
44722
44741
|
init_config_yaml();
|
|
44723
44742
|
async function getIndexStats(rootPath, isMain) {
|
|
44724
|
-
const tldrPath = join
|
|
44743
|
+
const tldrPath = join(rootPath, ".tldr");
|
|
44725
44744
|
if (!await access(tldrPath).then(() => true, () => false)) return {};
|
|
44726
44745
|
try {
|
|
44727
44746
|
let indexAge;
|
|
44728
|
-
const langContent = await readFile(join
|
|
44747
|
+
const langContent = await readFile(join(tldrPath, "languages.json"), "utf-8").catch(() => null);
|
|
44729
44748
|
if (langContent) {
|
|
44730
44749
|
const langData = JSON.parse(langContent);
|
|
44731
44750
|
if (langData.timestamp) {
|
|
@@ -44752,7 +44771,7 @@ async function getIndexStats(rootPath, isMain) {
|
|
|
44752
44771
|
}
|
|
44753
44772
|
let fileCount;
|
|
44754
44773
|
let edgeCount;
|
|
44755
|
-
const cgContent = await readFile(join
|
|
44774
|
+
const cgContent = await readFile(join(tldrPath, "cache", "call_graph.json"), "utf-8").catch(() => null);
|
|
44756
44775
|
if (cgContent) {
|
|
44757
44776
|
const cg = JSON.parse(cgContent);
|
|
44758
44777
|
edgeCount = Array.isArray(cg.edges) ? cg.edges.length : void 0;
|
|
@@ -44777,9 +44796,9 @@ async function getIndexStats(rootPath, isMain) {
|
|
|
44777
44796
|
}
|
|
44778
44797
|
const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
|
|
44779
44798
|
try {
|
|
44780
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
44799
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
|
|
44781
44800
|
const projectRoot = process.cwd();
|
|
44782
|
-
const venvPath = join
|
|
44801
|
+
const venvPath = join(projectRoot, ".venv");
|
|
44783
44802
|
const results = [];
|
|
44784
44803
|
if (existsSync$1(venvPath)) {
|
|
44785
44804
|
const status = await getTldrDaemonServiceSync(projectRoot, venvPath).getStatus();
|
|
@@ -44793,12 +44812,12 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
|
|
|
44793
44812
|
...indexStats
|
|
44794
44813
|
});
|
|
44795
44814
|
}
|
|
44796
|
-
const workspacesDir = join
|
|
44815
|
+
const workspacesDir = join(projectRoot, "workspaces");
|
|
44797
44816
|
if (existsSync$1(workspacesDir)) {
|
|
44798
44817
|
const workspaces = (await readdir(workspacesDir, { withFileTypes: true })).filter((d) => d.isDirectory() && d.name.startsWith("feature-"));
|
|
44799
44818
|
for (const ws of workspaces) {
|
|
44800
|
-
const wsPath = join
|
|
44801
|
-
const wsVenvPath = join
|
|
44819
|
+
const wsPath = join(workspacesDir, ws.name);
|
|
44820
|
+
const wsVenvPath = join(wsPath, ".venv");
|
|
44802
44821
|
if (existsSync$1(wsVenvPath)) {
|
|
44803
44822
|
const status = await getTldrDaemonServiceSync(wsPath, wsVenvPath).getStatus();
|
|
44804
44823
|
const indexStats = getIndexStats(wsPath, false);
|
|
@@ -44822,9 +44841,9 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
|
|
|
44822
44841
|
}));
|
|
44823
44842
|
const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
|
|
44824
44843
|
try {
|
|
44825
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
44844
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
|
|
44826
44845
|
const projectRoot = process.cwd();
|
|
44827
|
-
const venvPath = join
|
|
44846
|
+
const venvPath = join(projectRoot, ".venv");
|
|
44828
44847
|
if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
|
|
44829
44848
|
await getTldrDaemonServiceSync(projectRoot, venvPath).start();
|
|
44830
44849
|
return jsonResponse({
|
|
@@ -44839,9 +44858,9 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
|
|
|
44839
44858
|
}));
|
|
44840
44859
|
const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
|
|
44841
44860
|
try {
|
|
44842
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
44861
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
|
|
44843
44862
|
const projectRoot = process.cwd();
|
|
44844
|
-
const venvPath = join
|
|
44863
|
+
const venvPath = join(projectRoot, ".venv");
|
|
44845
44864
|
if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
|
|
44846
44865
|
await getTldrDaemonServiceSync(projectRoot, venvPath).stop();
|
|
44847
44866
|
return jsonResponse({
|
|
@@ -44856,24 +44875,24 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
|
|
|
44856
44875
|
}));
|
|
44857
44876
|
const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
|
|
44858
44877
|
try {
|
|
44859
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
44878
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Big5IZ_M.js");
|
|
44860
44879
|
const enabled = isTldrEnabledSync();
|
|
44861
44880
|
const projectRoot = process.cwd();
|
|
44862
44881
|
const targets = [];
|
|
44863
|
-
if (existsSync$1(join
|
|
44864
|
-
const workspacesDir = join
|
|
44882
|
+
if (existsSync$1(join(projectRoot, ".venv"))) targets.push(projectRoot);
|
|
44883
|
+
const workspacesDir = join(projectRoot, "workspaces");
|
|
44865
44884
|
if (existsSync$1(workspacesDir)) {
|
|
44866
44885
|
const workspaces = (await readdir(workspacesDir, { withFileTypes: true })).filter((d) => d.isDirectory() && d.name.startsWith("feature-"));
|
|
44867
44886
|
for (const ws of workspaces) {
|
|
44868
|
-
const wsPath = join
|
|
44869
|
-
if (existsSync$1(join
|
|
44887
|
+
const wsPath = join(workspacesDir, ws.name);
|
|
44888
|
+
if (existsSync$1(join(wsPath, ".venv"))) targets.push(wsPath);
|
|
44870
44889
|
}
|
|
44871
44890
|
}
|
|
44872
44891
|
let restarted = 0;
|
|
44873
44892
|
let stopped = 0;
|
|
44874
44893
|
const errors = [];
|
|
44875
44894
|
for (const wsPath of targets) try {
|
|
44876
|
-
const service = getTldrDaemonServiceSync(wsPath, join
|
|
44895
|
+
const service = getTldrDaemonServiceSync(wsPath, join(wsPath, ".venv"));
|
|
44877
44896
|
if (enabled) {
|
|
44878
44897
|
await service.restart();
|
|
44879
44898
|
restarted++;
|
|
@@ -44914,7 +44933,7 @@ function getIssueDataService$1() {
|
|
|
44914
44933
|
return getSharedIssueService();
|
|
44915
44934
|
}
|
|
44916
44935
|
const pendingConfirmations = /* @__PURE__ */ new Map();
|
|
44917
|
-
const METRICS_FILE = join
|
|
44936
|
+
const METRICS_FILE = join(homedir$1(), ".overdeck", "runtime-metrics.json");
|
|
44918
44937
|
async function loadRuntimeMetrics() {
|
|
44919
44938
|
try {
|
|
44920
44939
|
const content = await readFile(METRICS_FILE, "utf-8");
|
|
@@ -44932,7 +44951,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
|
|
|
44932
44951
|
const version = await getOverdeckVersion();
|
|
44933
44952
|
let supervisorUrl = null;
|
|
44934
44953
|
try {
|
|
44935
|
-
const { getSupervisorUrlSync } = await import("./supervisor-
|
|
44954
|
+
const { getSupervisorUrlSync } = await import("./supervisor-DQMK2e3I.js");
|
|
44936
44955
|
supervisorUrl = getSupervisorUrlSync();
|
|
44937
44956
|
} catch {}
|
|
44938
44957
|
return jsonResponse({
|
|
@@ -44941,6 +44960,10 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
|
|
|
44941
44960
|
supervisorUrl
|
|
44942
44961
|
});
|
|
44943
44962
|
}));
|
|
44963
|
+
const getPrerequisitesRoute = HttpRouter.add("GET", "/api/prerequisites", Effect.promise(async () => {
|
|
44964
|
+
const { checkSystemPrerequisites } = await import("./system-prerequisites-BsI9hxh9.js");
|
|
44965
|
+
return jsonResponse(await checkSystemPrerequisites());
|
|
44966
|
+
}));
|
|
44944
44967
|
const getRegisteredProjectsRoute = HttpRouter.add("GET", "/api/registered-projects", Effect.try({
|
|
44945
44968
|
try: () => {
|
|
44946
44969
|
return jsonResponse(listProjectsSync().map((p) => ({
|
|
@@ -44983,10 +45006,10 @@ const getSkillsRoute = HttpRouter.add("GET", "/api/skills", Effect.promise(async
|
|
|
44983
45006
|
try {
|
|
44984
45007
|
const skills = [];
|
|
44985
45008
|
const skillLocations = [{
|
|
44986
|
-
path: join
|
|
45009
|
+
path: join(homedir$1(), ".overdeck", "skills"),
|
|
44987
45010
|
source: "overdeck"
|
|
44988
45011
|
}, {
|
|
44989
|
-
path: join
|
|
45012
|
+
path: join(homedir$1(), ".claude", "skills"),
|
|
44990
45013
|
source: "claude"
|
|
44991
45014
|
}];
|
|
44992
45015
|
for (const { path: skillsDir, source } of skillLocations) {
|
|
@@ -44994,8 +45017,8 @@ const getSkillsRoute = HttpRouter.add("GET", "/api/skills", Effect.promise(async
|
|
|
44994
45017
|
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
44995
45018
|
for (const entry of entries) {
|
|
44996
45019
|
if (!entry.isDirectory()) continue;
|
|
44997
|
-
const skillPath = join
|
|
44998
|
-
const skillMdPath = join
|
|
45020
|
+
const skillPath = join(skillsDir, entry.name);
|
|
45021
|
+
const skillMdPath = join(skillPath, "SKILL.md");
|
|
44999
45022
|
const hasSkillMd = await access(skillMdPath).then(() => true, () => false);
|
|
45000
45023
|
let description;
|
|
45001
45024
|
if (hasSkillMd) try {
|
|
@@ -45094,9 +45117,9 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
|
|
|
45094
45117
|
return yield* Effect.promise(async () => {
|
|
45095
45118
|
try {
|
|
45096
45119
|
const projectPath = await getProjectPath(issuePrefix);
|
|
45097
|
-
const workspacePath = join
|
|
45120
|
+
const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
|
|
45098
45121
|
if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
|
|
45099
|
-
const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-
|
|
45122
|
+
const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-BRxnVSDk.js");
|
|
45100
45123
|
const config = {
|
|
45101
45124
|
issueId,
|
|
45102
45125
|
workspacePath,
|
|
@@ -45122,11 +45145,11 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
|
|
|
45122
45145
|
return yield* Effect.promise(async () => {
|
|
45123
45146
|
try {
|
|
45124
45147
|
const projectPath = await getProjectPath(issuePrefix);
|
|
45125
|
-
const workspacePath = join
|
|
45148
|
+
const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
|
|
45126
45149
|
if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
|
|
45127
45150
|
const ghConfig = getGitHubConfig();
|
|
45128
45151
|
if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
|
|
45129
|
-
const { runObserverCycle } = await import("./shadow-engineering-
|
|
45152
|
+
const { runObserverCycle } = await import("./shadow-engineering-BRxnVSDk.js");
|
|
45130
45153
|
const firstRepo = ghConfig.repos[0];
|
|
45131
45154
|
const config = {
|
|
45132
45155
|
issueId,
|
|
@@ -45145,10 +45168,10 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
|
|
|
45145
45168
|
});
|
|
45146
45169
|
}));
|
|
45147
45170
|
const overdeckProjectRoot = (() => {
|
|
45148
|
-
let dir = dirname
|
|
45171
|
+
let dir = dirname(fileURLToPath(import.meta.url));
|
|
45149
45172
|
for (let i = 0; i < 8; i++) {
|
|
45150
|
-
if (existsSync$1(join
|
|
45151
|
-
const parent = dirname
|
|
45173
|
+
if (existsSync$1(join(dir, "package.json")) && existsSync$1(join(dir, "src", "dashboard"))) return dir;
|
|
45174
|
+
const parent = dirname(dir);
|
|
45152
45175
|
if (parent === dir) break;
|
|
45153
45176
|
dir = parent;
|
|
45154
45177
|
}
|
|
@@ -45190,7 +45213,7 @@ const postRestartDashboardRoute = HttpRouter.add("POST", "/api/system/restart-da
|
|
|
45190
45213
|
return jsonResponse({ error: "Restart failed: " + (error instanceof Error ? error.message : String(error)) }, { status: 500 });
|
|
45191
45214
|
}
|
|
45192
45215
|
}));
|
|
45193
|
-
const metaRouteLayer = Layer.mergeAll(getVersionRoute, getRegisteredProjectsRoute, getConfirmationsRoute, postConfirmationRespondRoute, getSkillsRoute, getCacheStatusRoute, clearCacheRoute, getMetricsRuntimesRoute, getMetricsTasksRoute, postShadowMonitorRoute, postShadowObserveRoute, postDevRebuildRoute, postRestartDashboardRoute);
|
|
45216
|
+
const metaRouteLayer = Layer.mergeAll(getVersionRoute, getPrerequisitesRoute, getRegisteredProjectsRoute, getConfirmationsRoute, postConfirmationRespondRoute, getSkillsRoute, getCacheStatusRoute, clearCacheRoute, getMetricsRuntimesRoute, getMetricsTasksRoute, postShadowMonitorRoute, postShadowObserveRoute, postDevRebuildRoute, postRestartDashboardRoute);
|
|
45194
45217
|
//#endregion
|
|
45195
45218
|
//#region routes/misc.ts
|
|
45196
45219
|
/**
|
|
@@ -46006,7 +46029,7 @@ const paletteRouteLayer = Layer.mergeAll(getPaletteCommandsRoute, getPaletteSear
|
|
|
46006
46029
|
*/
|
|
46007
46030
|
const PI_CODEX_PROVIDER = "openai-codex";
|
|
46008
46031
|
function getOhmypiAuthPath() {
|
|
46009
|
-
return join
|
|
46032
|
+
return join(homedir$1(), ".omp", "agent", "auth.json");
|
|
46010
46033
|
}
|
|
46011
46034
|
function readAuthFile() {
|
|
46012
46035
|
const path = getOhmypiAuthPath();
|
|
@@ -46026,7 +46049,7 @@ function readOhmypiCodexCredential() {
|
|
|
46026
46049
|
/** Atomically merge a fresh codex credential into auth.json (mode 0600). */
|
|
46027
46050
|
function writeOhmypiCodexCredential(tokens) {
|
|
46028
46051
|
const path = getOhmypiAuthPath();
|
|
46029
|
-
mkdirSync$1(dirname
|
|
46052
|
+
mkdirSync$1(dirname(path), { recursive: true });
|
|
46030
46053
|
const auth = readAuthFile();
|
|
46031
46054
|
const stored = {
|
|
46032
46055
|
type: "oauth",
|
|
@@ -46045,24 +46068,24 @@ function writeOhmypiCodexCredential(tokens) {
|
|
|
46045
46068
|
function findOmpBinary() {
|
|
46046
46069
|
for (const dir of (process.env["PATH"] ?? "").split(delimiter)) {
|
|
46047
46070
|
if (!dir) continue;
|
|
46048
|
-
const candidate = join
|
|
46071
|
+
const candidate = join(dir, "omp");
|
|
46049
46072
|
if (existsSync$1(candidate)) return candidate;
|
|
46050
46073
|
}
|
|
46051
46074
|
return null;
|
|
46052
46075
|
}
|
|
46053
46076
|
/** omp is @oh-my-pi/pi-coding-agent; the oauth submodule path mirrors pi-ai's layout. */
|
|
46054
|
-
const OMP_AI_OAUTH_SUBPATH = join
|
|
46077
|
+
const OMP_AI_OAUTH_SUBPATH = join("@oh-my-pi", "pi-ai", "dist", "utils", "oauth", "openai-codex.js");
|
|
46055
46078
|
/**
|
|
46056
46079
|
* Resolve omp's openai-codex OAuth submodule by walking node_modules upward
|
|
46057
46080
|
* from the real omp binary. Returns null when not found — the caller degrades
|
|
46058
46081
|
* gracefully to 'unavailable' status.
|
|
46059
46082
|
*/
|
|
46060
46083
|
function resolveOmpCodexOAuthFile(ompBin) {
|
|
46061
|
-
let dir = dirname
|
|
46084
|
+
let dir = dirname(realpathSync$1(ompBin));
|
|
46062
46085
|
for (let i = 0; i < 10; i++) {
|
|
46063
|
-
const candidate = join
|
|
46086
|
+
const candidate = join(dir, "node_modules", OMP_AI_OAUTH_SUBPATH);
|
|
46064
46087
|
if (existsSync$1(candidate)) return candidate;
|
|
46065
|
-
const parent = dirname
|
|
46088
|
+
const parent = dirname(dir);
|
|
46066
46089
|
if (parent === dir) break;
|
|
46067
46090
|
dir = parent;
|
|
46068
46091
|
}
|
|
@@ -46168,11 +46191,11 @@ function assertSafeName(name) {
|
|
|
46168
46191
|
if (!/^[a-zA-Z0-9_-]{1,64}$/.test(name)) throw new Error("Invalid conversation name");
|
|
46169
46192
|
}
|
|
46170
46193
|
function getConversationAttachmentsRoot() {
|
|
46171
|
-
return join
|
|
46194
|
+
return join(getOverdeckHome(), CONVERSATION_ATTACHMENTS_DIR);
|
|
46172
46195
|
}
|
|
46173
46196
|
function getConversationAttachmentDir(name) {
|
|
46174
46197
|
assertSafeName(name);
|
|
46175
|
-
return join
|
|
46198
|
+
return join(getConversationAttachmentsRoot(), name);
|
|
46176
46199
|
}
|
|
46177
46200
|
async function ensureConversationAttachmentDir(name) {
|
|
46178
46201
|
const dir = getConversationAttachmentDir(name);
|
|
@@ -46191,10 +46214,10 @@ async function cleanupConversationAttachments(name) {
|
|
|
46191
46214
|
* sessions that the lifecycle poller missed. */
|
|
46192
46215
|
async function cleanupOrphanedConversationAttachments() {
|
|
46193
46216
|
try {
|
|
46194
|
-
const { listConversations } = await import("./conversations-
|
|
46217
|
+
const { listConversations } = await import("./conversations-BmWEluPL.js");
|
|
46195
46218
|
const convNames = new Set(listConversations().map((c) => c.name));
|
|
46196
46219
|
const root = getConversationAttachmentsRoot();
|
|
46197
|
-
await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join
|
|
46220
|
+
await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join(root, entry.name)), 10, (path) => rm(path, {
|
|
46198
46221
|
recursive: true,
|
|
46199
46222
|
force: true
|
|
46200
46223
|
}).catch(() => {}));
|
|
@@ -46203,7 +46226,7 @@ async function cleanupOrphanedConversationAttachments() {
|
|
|
46203
46226
|
async function listConversationAttachmentPaths(name) {
|
|
46204
46227
|
const dir = getConversationAttachmentDir(name);
|
|
46205
46228
|
try {
|
|
46206
|
-
return (await readdir(dir, { withFileTypes: true })).filter((entry) => entry.isFile()).map((entry) => join
|
|
46229
|
+
return (await readdir(dir, { withFileTypes: true })).filter((entry) => entry.isFile()).map((entry) => join(dir, entry.name));
|
|
46207
46230
|
} catch {
|
|
46208
46231
|
return [];
|
|
46209
46232
|
}
|
|
@@ -46214,7 +46237,7 @@ async function listConversationAttachmentPaths(name) {
|
|
|
46214
46237
|
* in the JSONL, not accessing the filesystem. */
|
|
46215
46238
|
function isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath) {
|
|
46216
46239
|
try {
|
|
46217
|
-
return resolve
|
|
46240
|
+
return resolve(attachmentPath).startsWith(`${resolvedAttachmentDir}/`);
|
|
46218
46241
|
} catch {
|
|
46219
46242
|
return false;
|
|
46220
46243
|
}
|
|
@@ -46233,7 +46256,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
|
|
|
46233
46256
|
try {
|
|
46234
46257
|
resolvedAttachmentDir = await realpath(getConversationAttachmentDir(name));
|
|
46235
46258
|
} catch {
|
|
46236
|
-
resolvedAttachmentDir = resolve
|
|
46259
|
+
resolvedAttachmentDir = resolve(getConversationAttachmentDir(name));
|
|
46237
46260
|
}
|
|
46238
46261
|
const referenced = /* @__PURE__ */ new Set();
|
|
46239
46262
|
const stream = createReadStream$1(sessionFile, { encoding: "utf-8" });
|
|
@@ -46258,7 +46281,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
|
|
|
46258
46281
|
}
|
|
46259
46282
|
if (text) {
|
|
46260
46283
|
for (const attachmentPath of extractConversationAttachmentPaths(text)) if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) {
|
|
46261
|
-
referenced.add(basename
|
|
46284
|
+
referenced.add(basename(attachmentPath));
|
|
46262
46285
|
structuredFoundPaths = true;
|
|
46263
46286
|
}
|
|
46264
46287
|
}
|
|
@@ -46272,7 +46295,7 @@ async function readSessionAttachmentBasenames(sessionFile, name) {
|
|
|
46272
46295
|
attachmentPath = rawValue;
|
|
46273
46296
|
}
|
|
46274
46297
|
if (typeof attachmentPath === "string" && attachmentPath.startsWith("/")) {
|
|
46275
|
-
if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) referenced.add(basename
|
|
46298
|
+
if (isUnderAttachmentDir(resolvedAttachmentDir, attachmentPath)) referenced.add(basename(attachmentPath));
|
|
46276
46299
|
}
|
|
46277
46300
|
}
|
|
46278
46301
|
}
|
|
@@ -46307,7 +46330,7 @@ async function cleanupUnreferencedConversationAttachments(conversation) {
|
|
|
46307
46330
|
if (freshStats.mtimeMs > sessionMtimeMs) sessionMtimeMs = freshStats.mtimeMs;
|
|
46308
46331
|
} catch {}
|
|
46309
46332
|
await runInBatches(attachmentPaths, 10, async (attachmentPath) => {
|
|
46310
|
-
if (referencedBasenames.has(basename
|
|
46333
|
+
if (referencedBasenames.has(basename(attachmentPath))) return;
|
|
46311
46334
|
try {
|
|
46312
46335
|
if ((await stat$1(attachmentPath)).mtimeMs >= sessionMtimeMs) return;
|
|
46313
46336
|
} catch {
|
|
@@ -46329,15 +46352,15 @@ async function resolveForContainment(attachmentPath) {
|
|
|
46329
46352
|
try {
|
|
46330
46353
|
return await realpath(attachmentPath);
|
|
46331
46354
|
} catch {
|
|
46332
|
-
let dir = dirname
|
|
46333
|
-
const remaining = [basename
|
|
46355
|
+
let dir = dirname(attachmentPath);
|
|
46356
|
+
const remaining = [basename(attachmentPath)];
|
|
46334
46357
|
while (dir !== "/" && dir !== ".") try {
|
|
46335
|
-
return join
|
|
46358
|
+
return join(await realpath(dir), ...remaining);
|
|
46336
46359
|
} catch {
|
|
46337
|
-
remaining.unshift(basename
|
|
46338
|
-
dir = dirname
|
|
46360
|
+
remaining.unshift(basename(dir));
|
|
46361
|
+
dir = dirname(dir);
|
|
46339
46362
|
}
|
|
46340
|
-
return resolve
|
|
46363
|
+
return resolve(attachmentPath);
|
|
46341
46364
|
}
|
|
46342
46365
|
}
|
|
46343
46366
|
async function isManagedConversationAttachmentPath(attachmentPath) {
|
|
@@ -46350,7 +46373,7 @@ async function isManagedConversationAttachmentPath(attachmentPath) {
|
|
|
46350
46373
|
}
|
|
46351
46374
|
async function isConversationAttachmentPath(name, attachmentPath) {
|
|
46352
46375
|
try {
|
|
46353
|
-
const attachmentDir = resolve
|
|
46376
|
+
const attachmentDir = resolve(getConversationAttachmentDir(name));
|
|
46354
46377
|
return (await resolveForContainment(attachmentPath)).startsWith(`${attachmentDir}/`);
|
|
46355
46378
|
} catch {
|
|
46356
46379
|
return false;
|
|
@@ -46377,7 +46400,7 @@ function conversationControlPaths(agentId, home) {
|
|
|
46377
46400
|
const { agentDir } = ohmypiFifoPaths(agentId, home);
|
|
46378
46401
|
return {
|
|
46379
46402
|
agentDir,
|
|
46380
|
-
controlDir: join
|
|
46403
|
+
controlDir: join(agentDir, "control")
|
|
46381
46404
|
};
|
|
46382
46405
|
}
|
|
46383
46406
|
async function writeConversationControlCommand(agentId, command, home) {
|
|
@@ -46387,7 +46410,7 @@ async function writeConversationControlCommand(agentId, command, home) {
|
|
|
46387
46410
|
mode: 448
|
|
46388
46411
|
});
|
|
46389
46412
|
await chmod(paths.controlDir, 448);
|
|
46390
|
-
const finalPath = join
|
|
46413
|
+
const finalPath = join(paths.controlDir, `${Date.now()}-${command.id}-${randomUUID$1()}.json`);
|
|
46391
46414
|
const tempPath = `${finalPath}.tmp`;
|
|
46392
46415
|
await writeFile(tempPath, `${JSON.stringify(command)}\n`, {
|
|
46393
46416
|
encoding: "utf8",
|
|
@@ -46732,7 +46755,7 @@ async function terminatePids(pids) {
|
|
|
46732
46755
|
}
|
|
46733
46756
|
}
|
|
46734
46757
|
function conversationRuntimeRootPids(conv, rows) {
|
|
46735
|
-
const launcherScript = join
|
|
46758
|
+
const launcherScript = join(getOverdeckHome(), "conversations", conv.tmuxSession, "launcher.sh");
|
|
46736
46759
|
const sessionId = conv.claudeSessionId?.trim();
|
|
46737
46760
|
const sessionNeedles = sessionId ? [`--resume ${sessionId}`, `--session-id ${sessionId}`] : [];
|
|
46738
46761
|
const serverPid = findManagedServerPidSync();
|
|
@@ -46900,11 +46923,8 @@ async function handleConversationSwitchModel(name, body) {
|
|
|
46900
46923
|
sessionAlive: false
|
|
46901
46924
|
});
|
|
46902
46925
|
}
|
|
46903
|
-
function resolvePtySupervisorScriptPath() {
|
|
46904
|
-
return join$1(packageRoot, "dist", "pty-supervisor.js");
|
|
46905
|
-
}
|
|
46906
46926
|
function getPtySupervisorSocketPath(agentId) {
|
|
46907
|
-
return join
|
|
46927
|
+
return join(getOverdeckHome(), "sockets", `pty-${agentId}.sock`);
|
|
46908
46928
|
}
|
|
46909
46929
|
async function waitForPtySupervisorSocket(agentId, timeoutMs = PTY_SUPERVISOR_SOCKET_WAIT_MS) {
|
|
46910
46930
|
const socketPath = getPtySupervisorSocketPath(agentId);
|
|
@@ -46985,9 +47005,9 @@ async function claudeConversationSystemPromptFiles(cwd) {
|
|
|
46985
47005
|
return files;
|
|
46986
47006
|
}
|
|
46987
47007
|
async function ensurePiConversationSourceContractFile() {
|
|
46988
|
-
const contextDir = join
|
|
47008
|
+
const contextDir = join(getOverdeckHome(), "context");
|
|
46989
47009
|
await mkdir(contextDir, { recursive: true });
|
|
46990
|
-
const path = join
|
|
47010
|
+
const path = join(contextDir, "pi-conversation-source-contract.md");
|
|
46991
47011
|
await writeFile(path, `${PI_CONVERSATION_SOURCE_CONTRACT}\n`, "utf-8");
|
|
46992
47012
|
return path;
|
|
46993
47013
|
}
|
|
@@ -47016,10 +47036,10 @@ function isNotFound(error) {
|
|
|
47016
47036
|
}
|
|
47017
47037
|
async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model, effort, issueId, resume = false, harness = "claude-code", plainFork = false) {
|
|
47018
47038
|
const behavior = getHarnessBehavior(harness);
|
|
47019
|
-
const stateDir = join
|
|
47039
|
+
const stateDir = join(getOverdeckHome(), "conversations", tmuxSession);
|
|
47020
47040
|
await mkdir(stateDir, { recursive: true });
|
|
47021
47041
|
clearReadySignal(tmuxSession);
|
|
47022
|
-
const launcherScript = join
|
|
47042
|
+
const launcherScript = join(stateDir, "launcher.sh");
|
|
47023
47043
|
let runtimeCommand = `claude ${getClaudePermissionFlagsStringSync()}`;
|
|
47024
47044
|
let providerExportsStr = "";
|
|
47025
47045
|
let piFields;
|
|
@@ -47037,7 +47057,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
47037
47057
|
if (auth.status === "missing" || auth.status === "expired") throw new Error("ohmypi ChatGPT/Codex login (openai-codex) has expired and could not be refreshed. Re-authenticate with `pan pi-auth login`, then retry.");
|
|
47038
47058
|
}
|
|
47039
47059
|
const paths = piFifoPaths(tmuxSession);
|
|
47040
|
-
const piSessionDir = join
|
|
47060
|
+
const piSessionDir = join(paths.agentDir, "sessions");
|
|
47041
47061
|
await mkdir(paths.agentDir, {
|
|
47042
47062
|
recursive: true,
|
|
47043
47063
|
mode: 448
|
|
@@ -47046,33 +47066,33 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
47046
47066
|
recursive: true,
|
|
47047
47067
|
mode: 448
|
|
47048
47068
|
});
|
|
47049
|
-
const storedPiSessionId = resume ? await readFile(join
|
|
47069
|
+
const storedPiSessionId = resume ? await readFile(join(paths.agentDir, "session.id"), "utf-8").then((s) => s.trim()).catch(() => void 0) : void 0;
|
|
47050
47070
|
piFields = {
|
|
47051
47071
|
harness: "ohmypi",
|
|
47052
47072
|
piMode: "tui",
|
|
47053
|
-
piExtensionPath: resolveOhmypiExtensionPath() ?? resolve
|
|
47073
|
+
piExtensionPath: resolveOhmypiExtensionPath() ?? resolve(process.cwd(), "packages/ohmypi-extension/dist/index.js"),
|
|
47054
47074
|
piSessionDir,
|
|
47055
47075
|
resumeSessionId: storedPiSessionId || void 0
|
|
47056
47076
|
};
|
|
47057
47077
|
} else if (behavior.usesCodexHome) {
|
|
47058
|
-
const codexHome = join
|
|
47078
|
+
const codexHome = join(getOverdeckHome(), "agents", tmuxSession, "codex-home");
|
|
47059
47079
|
const codexPermMode = loadConfigSync().config.codex?.permissionMode ?? "workspace";
|
|
47060
47080
|
const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
|
|
47061
47081
|
const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
|
|
47062
47082
|
const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
|
|
47063
|
-
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-
|
|
47083
|
+
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-CY-QRuU9.js");
|
|
47064
47084
|
initCodexHome(codexHome, {
|
|
47065
47085
|
trustedDir: cwd,
|
|
47066
47086
|
approvalPolicy: codexApprovalPolicy,
|
|
47067
47087
|
sandboxMode: codexSandboxMode,
|
|
47068
47088
|
approvalsReviewer: codexApprovalsReviewer
|
|
47069
47089
|
});
|
|
47070
|
-
const resumeSessionId = resume ? await resolveCodexRolloutPath(tmuxSession, { agentsDirOverride: join
|
|
47090
|
+
const resumeSessionId = resume ? await resolveCodexRolloutPath(tmuxSession, { agentsDirOverride: join(getOverdeckHome(), "agents") }).then((rollout) => rollout ? extractThreadIdFromRollout(rollout) ?? void 0 : void 0) : void 0;
|
|
47071
47091
|
codexFields = {
|
|
47072
47092
|
harness: "codex",
|
|
47073
47093
|
codexMode: "tui",
|
|
47074
47094
|
codexHome,
|
|
47075
|
-
codexSessionDir: join
|
|
47095
|
+
codexSessionDir: join(codexHome, "sessions"),
|
|
47076
47096
|
resumeSessionId
|
|
47077
47097
|
};
|
|
47078
47098
|
}
|
|
@@ -47087,12 +47107,11 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
47087
47107
|
let supervisorScriptPath;
|
|
47088
47108
|
if (useSupervisor) {
|
|
47089
47109
|
supervisorScriptPath = resolvePtySupervisorScriptPath();
|
|
47090
|
-
if (!existsSync$1(supervisorScriptPath)) throw new Error("pty-supervisor build artifact missing — run `npm run build`.");
|
|
47091
47110
|
await writePtyToken(tmuxSession);
|
|
47092
47111
|
}
|
|
47093
47112
|
let channelsBridgeMcpConfig;
|
|
47094
47113
|
if (!piFields && !codexFields && !plainFork && isClaudeCodeChannelsEnabled() && (!model || getProviderForModelSync(model).name === "anthropic") && process.env.CLAUDE_CODE_USE_BEDROCK !== "1" && process.env.CLAUDE_CODE_USE_VERTEX !== "1" && process.env.CLAUDE_CODE_USE_FOUNDRY !== "1" && process.env.OVERDECK_DOCKER_WORKSPACE !== "1" && process.env.PAN_DOCKER !== "1") {
|
|
47095
|
-
channelsBridgeMcpConfig = join
|
|
47114
|
+
channelsBridgeMcpConfig = join(stateDir, "agent-mcp.json");
|
|
47096
47115
|
writeBridgeTokenSync(tmuxSession);
|
|
47097
47116
|
await writeChannelsBridgeMcpConfig(channelsBridgeMcpConfig, tmuxSession);
|
|
47098
47117
|
}
|
|
@@ -47130,7 +47149,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
47130
47149
|
} catch {}
|
|
47131
47150
|
console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
|
|
47132
47151
|
try {
|
|
47133
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
47152
|
+
const { preTrustDirectory } = await import("./workspace-manager-Cb2a7bg9.js");
|
|
47134
47153
|
preTrustDirectory(cwd);
|
|
47135
47154
|
} catch {}
|
|
47136
47155
|
try {
|
|
@@ -47147,7 +47166,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
47147
47166
|
const codexHomeDir = codexFields.codexHome;
|
|
47148
47167
|
(async () => {
|
|
47149
47168
|
try {
|
|
47150
|
-
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-
|
|
47169
|
+
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-CY-QRuU9.js");
|
|
47151
47170
|
const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
|
|
47152
47171
|
if (rollout) {
|
|
47153
47172
|
const threadId = extractThreadIdFromRollout(rollout);
|
|
@@ -47627,7 +47646,7 @@ async function getConversationDiffFull(name, deps) {
|
|
|
47627
47646
|
const conv = getConversationByName(name);
|
|
47628
47647
|
if (!conv) return result$1({ error: "Conversation not found" }, 404);
|
|
47629
47648
|
const cwd = conv.cwd;
|
|
47630
|
-
if (existsSync$1(join
|
|
47649
|
+
if (existsSync$1(join(cwd, ".git"))) {
|
|
47631
47650
|
const baseCommit = await Effect.runPromise(findCommitAtTime(cwd, conv.createdAt));
|
|
47632
47651
|
if (!baseCommit) return result$1({ diff: "" });
|
|
47633
47652
|
return result$1({ diff: await Effect.runPromise(diffPatchSinceCommit(cwd, baseCommit)) });
|
|
@@ -47655,7 +47674,7 @@ async function getConversationDiffTurn(name, turnId, fileFilter, deps) {
|
|
|
47655
47674
|
const conv = lookupConversation(name);
|
|
47656
47675
|
if (!conv) return result$1({ error: "Conversation not found" }, 404);
|
|
47657
47676
|
const cwd = conv.cwd;
|
|
47658
|
-
if (existsSync$1(join
|
|
47677
|
+
if (existsSync$1(join(cwd, ".git"))) {
|
|
47659
47678
|
const baseCommit = await Effect.runPromise(findCommitAtTime(cwd, conv.createdAt));
|
|
47660
47679
|
if (baseCommit) return result$1({
|
|
47661
47680
|
turnId,
|
|
@@ -48045,10 +48064,10 @@ async function findClaudeSessionFileById$1(sessionId) {
|
|
|
48045
48064
|
} else if (Date.now() - cached.ts < SESSION_FILE_MISS_TTL_MS$1) return null;
|
|
48046
48065
|
}
|
|
48047
48066
|
try {
|
|
48048
|
-
const claudeProjects = join
|
|
48067
|
+
const claudeProjects = join(homedir$1(), ".claude", "projects");
|
|
48049
48068
|
const dirs = await readdir(claudeProjects);
|
|
48050
48069
|
const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
|
|
48051
|
-
const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join
|
|
48070
|
+
const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join(claudeProjects, dir, `${sessionId}.jsonl`));
|
|
48052
48071
|
const STAT_BATCH_SIZE = 50;
|
|
48053
48072
|
for (let i = 0; i < candidates.length; i += STAT_BATCH_SIZE) {
|
|
48054
48073
|
const batch = candidates.slice(i, i + STAT_BATCH_SIZE);
|
|
@@ -48334,10 +48353,10 @@ async function resolveSpecialistSessionFile(name) {
|
|
|
48334
48353
|
try {
|
|
48335
48354
|
const claudeSessionId = await resolveClaudeSessionId(name);
|
|
48336
48355
|
if (claudeSessionId && SAFE_SESSION_ID_PATTERN.test(claudeSessionId)) {
|
|
48337
|
-
const claudeProjects = join
|
|
48356
|
+
const claudeProjects = join(homedir$1(), ".claude", "projects");
|
|
48338
48357
|
const dirs = await readdir(claudeProjects);
|
|
48339
48358
|
const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
|
|
48340
|
-
const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join
|
|
48359
|
+
const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join(claudeProjects, dir, `${claudeSessionId}.jsonl`));
|
|
48341
48360
|
const STAT_BATCH_SIZE = 50;
|
|
48342
48361
|
let found = null;
|
|
48343
48362
|
for (let i = 0; i < candidates.length && !found; i += STAT_BATCH_SIZE) {
|
|
@@ -48793,7 +48812,7 @@ function validateImageMagicBytes(bytes, mimeType) {
|
|
|
48793
48812
|
function safeUploadExtension(filename, mimeType) {
|
|
48794
48813
|
const mimeExtension = ALLOWED_UPLOAD_MIME_TYPES.get(mimeType);
|
|
48795
48814
|
if (!mimeExtension) return "";
|
|
48796
|
-
const originalExtension = extname
|
|
48815
|
+
const originalExtension = extname(filename).toLowerCase();
|
|
48797
48816
|
return originalExtension === mimeExtension ? originalExtension : mimeExtension;
|
|
48798
48817
|
}
|
|
48799
48818
|
async function handleConversationImageUpload(name, filename, bytes, mimeType) {
|
|
@@ -48818,7 +48837,7 @@ async function handleConversationImageUpload(name, filename, bytes, mimeType) {
|
|
|
48818
48837
|
}
|
|
48819
48838
|
if (!resolvedDir.startsWith(`${attachmentsRoot}/`)) return jsonResponse({ error: "Invalid attachment path" }, { status: 500 });
|
|
48820
48839
|
const fileName = `${randomUUID$1()}${extension}`;
|
|
48821
|
-
const path = join
|
|
48840
|
+
const path = join(resolvedDir, fileName);
|
|
48822
48841
|
const tmpPath = `${path}.tmp`;
|
|
48823
48842
|
try {
|
|
48824
48843
|
await writeFile(tmpPath, bytes);
|
|
@@ -48991,10 +49010,10 @@ async function findClaudeSessionFileById(sessionId) {
|
|
|
48991
49010
|
} else if (Date.now() - cached.ts < SESSION_FILE_MISS_TTL_MS) return null;
|
|
48992
49011
|
}
|
|
48993
49012
|
try {
|
|
48994
|
-
const claudeProjects = join
|
|
49013
|
+
const claudeProjects = join(homedir$1(), ".claude", "projects");
|
|
48995
49014
|
const dirs = await readdir(claudeProjects);
|
|
48996
49015
|
const SAFE_DIR_PATTERN = /^[a-zA-Z0-9_.-]+$/;
|
|
48997
|
-
const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join
|
|
49016
|
+
const candidates = dirs.filter((dir) => SAFE_DIR_PATTERN.test(dir)).map((dir) => join(claudeProjects, dir, `${sessionId}.jsonl`));
|
|
48998
49017
|
const STAT_BATCH_SIZE = 50;
|
|
48999
49018
|
for (let i = 0; i < candidates.length; i += STAT_BATCH_SIZE) {
|
|
49000
49019
|
const batch = candidates.slice(i, i + STAT_BATCH_SIZE);
|
|
@@ -50134,18 +50153,18 @@ var DuplicateProjectError = class extends Error {
|
|
|
50134
50153
|
}
|
|
50135
50154
|
};
|
|
50136
50155
|
function installGitHooksInDir(gitDir) {
|
|
50137
|
-
const hooksTarget = join
|
|
50156
|
+
const hooksTarget = join(gitDir, "hooks");
|
|
50138
50157
|
let installed = 0;
|
|
50139
50158
|
if (!existsSync$1(hooksTarget)) mkdirSync$1(hooksTarget, { recursive: true });
|
|
50140
50159
|
if (!existsSync$1(BUNDLED_HOOKS_DIR)) return 0;
|
|
50141
50160
|
try {
|
|
50142
50161
|
const hooks = readdirSync$1(BUNDLED_HOOKS_DIR).filter((f) => {
|
|
50143
|
-
const p = join
|
|
50162
|
+
const p = join(BUNDLED_HOOKS_DIR, f);
|
|
50144
50163
|
return existsSync$1(p) && statSync$1(p).isFile();
|
|
50145
50164
|
});
|
|
50146
50165
|
for (const hook of hooks) {
|
|
50147
|
-
const source = join
|
|
50148
|
-
const target = join
|
|
50166
|
+
const source = join(BUNDLED_HOOKS_DIR, hook);
|
|
50167
|
+
const target = join(hooksTarget, hook);
|
|
50149
50168
|
if (existsSync$1(target)) {
|
|
50150
50169
|
try {
|
|
50151
50170
|
if (readlinkSync(target) === source) continue;
|
|
@@ -50166,7 +50185,7 @@ function installGitHooksInDir(gitDir) {
|
|
|
50166
50185
|
*/
|
|
50167
50186
|
async function registerProjectFromPath(opts) {
|
|
50168
50187
|
const { path: fullPath } = opts;
|
|
50169
|
-
const name = opts.name ?? (basename
|
|
50188
|
+
const name = opts.name ?? (basename(fullPath) || "unknown");
|
|
50170
50189
|
const key = name.toLowerCase().replace(/[^a-z0-9-]/g, "-");
|
|
50171
50190
|
if (!key.replace(/-/g, "")) throw new Error(`Cannot register project: derived key '${key}' from name '${name}' contains no alphanumeric characters`);
|
|
50172
50191
|
const existing = getProjectSync(key);
|
|
@@ -50178,11 +50197,11 @@ async function registerProjectFromPath(opts) {
|
|
|
50178
50197
|
registerProjectSync(key, projectConfig);
|
|
50179
50198
|
const seededContextLayer = ensureProjectLayer(fullPath);
|
|
50180
50199
|
try {
|
|
50181
|
-
const { preTrustDirectorySync } = await import("./workspace-manager-
|
|
50200
|
+
const { preTrustDirectorySync } = await import("./workspace-manager-Cb2a7bg9.js");
|
|
50182
50201
|
preTrustDirectorySync(fullPath);
|
|
50183
50202
|
} catch {}
|
|
50184
50203
|
let hooksInstalled = 0;
|
|
50185
|
-
const rootGit = join
|
|
50204
|
+
const rootGit = join(fullPath, ".git");
|
|
50186
50205
|
if (existsSync$1(rootGit)) hooksInstalled = installGitHooksInDir(rootGit);
|
|
50187
50206
|
return {
|
|
50188
50207
|
key,
|
|
@@ -50214,7 +50233,7 @@ init_pan_dir();
|
|
|
50214
50233
|
init_paths();
|
|
50215
50234
|
const execAsync$2 = promisify(exec);
|
|
50216
50235
|
async function getIssueDataService() {
|
|
50217
|
-
const { getSharedIssueService } = await import("./issue-service-singleton-
|
|
50236
|
+
const { getSharedIssueService } = await import("./issue-service-singleton-BC2JLZi7.js");
|
|
50218
50237
|
return getSharedIssueService();
|
|
50219
50238
|
}
|
|
50220
50239
|
/** Returns true if the path exists (any type). */
|
|
@@ -50262,7 +50281,7 @@ function getSlotWorkSessionNumber(sessionId, issueLower) {
|
|
|
50262
50281
|
function getSessionTreeWorkspacePath(issueLower, baseWorkspacePath, projectPath, sessionId) {
|
|
50263
50282
|
const slotNumber = getSlotWorkSessionNumber(sessionId, issueLower);
|
|
50264
50283
|
if (slotNumber === null) return baseWorkspacePath;
|
|
50265
|
-
return join
|
|
50284
|
+
return join(projectPath, "workspaces", `feature-${issueLower}-slot-${slotNumber}`);
|
|
50266
50285
|
}
|
|
50267
50286
|
function compareSessionTreeSessionIds(a, b, issueLower) {
|
|
50268
50287
|
const planningAgentId = `planning-${issueLower}`;
|
|
@@ -50314,7 +50333,7 @@ async function readSessionGateFields(sessionId, state = getAgentStateSync(sessio
|
|
|
50314
50333
|
}
|
|
50315
50334
|
async function countQueuedMail(agentId) {
|
|
50316
50335
|
try {
|
|
50317
|
-
return (await readdir(join
|
|
50336
|
+
return (await readdir(join(getAgentDir(agentId), "mail"), { withFileTypes: true })).filter((entry) => entry.isFile() && entry.name.endsWith(".md")).length;
|
|
50318
50337
|
} catch {
|
|
50319
50338
|
return 0;
|
|
50320
50339
|
}
|
|
@@ -50322,7 +50341,7 @@ async function countQueuedMail(agentId) {
|
|
|
50322
50341
|
async function collectSessionTreeNodes(issueId, workspacePath, projectPath, context) {
|
|
50323
50342
|
const issueLower = issueId.toLowerCase();
|
|
50324
50343
|
const issuePrefix = extractPrefixSync(issueId) ?? issueId.split("-")[0];
|
|
50325
|
-
const agentsDir = join
|
|
50344
|
+
const agentsDir = join(getOverdeckHome(), "agents");
|
|
50326
50345
|
const agentId = `agent-${issueLower}`;
|
|
50327
50346
|
const planningAgentId = `planning-${issueLower}`;
|
|
50328
50347
|
const strikeAgentId = `strike-${issueLower}`;
|
|
@@ -50343,7 +50362,7 @@ async function collectSessionTreeNodes(issueId, workspacePath, projectPath, cont
|
|
|
50343
50362
|
}
|
|
50344
50363
|
for (const sessionName of context.tmuxSessionNames) if (slotWorkSessionPattern.test(sessionName)) candidateSessionIds.add(sessionName);
|
|
50345
50364
|
for (const checkId of [...candidateSessionIds].sort((a, b) => compareSessionTreeSessionIds(a, b, issueLower))) {
|
|
50346
|
-
if (!await pathExists$1(join
|
|
50365
|
+
if (!await pathExists$1(join(agentsDir, checkId))) continue;
|
|
50347
50366
|
const state = getAgentStateSync(checkId);
|
|
50348
50367
|
if (!state) continue;
|
|
50349
50368
|
try {
|
|
@@ -50380,7 +50399,7 @@ async function collectSessionTreeNodes(issueId, workspacePath, projectPath, cont
|
|
|
50380
50399
|
} catch {}
|
|
50381
50400
|
}
|
|
50382
50401
|
if (!hasPlanningSection) {
|
|
50383
|
-
const panContinuePath = join
|
|
50402
|
+
const panContinuePath = join(workspacePath, PAN_DIRNAME, PAN_CONTINUE_FILENAME);
|
|
50384
50403
|
const planningPathForTimestamp = await pathExists$1(panContinuePath) ? panContinuePath : null;
|
|
50385
50404
|
if (planningPathForTimestamp) {
|
|
50386
50405
|
const planningStat = await stat$1(planningPathForTimestamp).catch(() => null);
|
|
@@ -50533,7 +50552,7 @@ async function fetchProjectSessionTree(projectKey, sharedContext) {
|
|
|
50533
50552
|
if (!project) return null;
|
|
50534
50553
|
const projectPath = project.config.path;
|
|
50535
50554
|
const workspaceConfig = project.config.workspace;
|
|
50536
|
-
const workspacesDir = join
|
|
50555
|
+
const workspacesDir = join(projectPath, workspaceConfig?.workspaces_dir || "workspaces");
|
|
50537
50556
|
const effectiveSharedContext = {
|
|
50538
50557
|
tmuxSessionNames: sharedContext?.tmuxSessionNames ?? new Set((await Effect.runPromise(listSessionNames()).catch(() => [])).filter((s) => s.trim())),
|
|
50539
50558
|
agentSnapshotsById: sharedContext?.agentSnapshotsById
|
|
@@ -50547,12 +50566,12 @@ async function fetchProjectSessionTree(projectKey, sharedContext) {
|
|
|
50547
50566
|
issueId: e.name.replace("feature-", "").toUpperCase()
|
|
50548
50567
|
})).filter((c) => /^[a-z]+-\d+$/.test(c.issueLower));
|
|
50549
50568
|
const results = await Effect.runPromise(withConcurrencyLimit(featureCandidates.map((c) => Effect.promise(async () => {
|
|
50550
|
-
const agentDir = join
|
|
50551
|
-
const panDir = join
|
|
50569
|
+
const agentDir = join(getOverdeckHome(), "agents", `agent-${c.issueLower}`);
|
|
50570
|
+
const panDir = join(workspacesDir, c.name, PAN_DIRNAME);
|
|
50552
50571
|
const [hasAgent, hasPlanning] = await Promise.all([pathExists$1(agentDir), pathExists$1(panDir)]);
|
|
50553
50572
|
if (!hasAgent && !hasPlanning) return null;
|
|
50554
50573
|
try {
|
|
50555
|
-
const workspacePath = join
|
|
50574
|
+
const workspacePath = join(workspacesDir, c.name);
|
|
50556
50575
|
const sessions = await collectSessionTreeNodes(c.issueId, workspacePath, projectPath, effectiveSharedContext);
|
|
50557
50576
|
if (sessions.length === 0) return null;
|
|
50558
50577
|
const title = await resolveFeatureTitle(c.issueId, c.issueLower, issueTitles, project);
|
|
@@ -50627,7 +50646,7 @@ async function buildHomeGuard() {
|
|
|
50627
50646
|
} catch {
|
|
50628
50647
|
ch = home;
|
|
50629
50648
|
}
|
|
50630
|
-
return (p) => p === ch || p.startsWith(ch.endsWith(sep
|
|
50649
|
+
return (p) => p === ch || p.startsWith(ch.endsWith(sep) ? ch : `${ch}${sep}`);
|
|
50631
50650
|
}
|
|
50632
50651
|
const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Effect.gen(function* () {
|
|
50633
50652
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
@@ -50639,7 +50658,7 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
|
|
|
50639
50658
|
if (body.mode === "existing") {
|
|
50640
50659
|
const rawPath = body.path;
|
|
50641
50660
|
if (typeof rawPath !== "string" || !rawPath.trim()) return jsonResponse({ error: "path is required" }, { status: 400 });
|
|
50642
|
-
if (!isAbsolute
|
|
50661
|
+
if (!isAbsolute(rawPath)) return jsonResponse({ error: "path must be absolute" }, { status: 400 });
|
|
50643
50662
|
const nameOpt = typeof body.name === "string" && body.name.trim() ? body.name.trim() : void 0;
|
|
50644
50663
|
return yield* Effect.promise(async () => {
|
|
50645
50664
|
try {
|
|
@@ -50680,14 +50699,14 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
|
|
|
50680
50699
|
if (typeof rawName !== "string" || !rawName.trim()) return jsonResponse({ error: "name is required for mode=new" }, { status: 400 });
|
|
50681
50700
|
const rawParent = body.parentDir;
|
|
50682
50701
|
if (typeof rawParent !== "string" || !rawParent.trim()) return jsonResponse({ error: "parentDir is required for mode=new" }, { status: 400 });
|
|
50683
|
-
if (!isAbsolute
|
|
50702
|
+
if (!isAbsolute(rawParent)) return jsonResponse({ error: "parentDir must be absolute" }, { status: 400 });
|
|
50684
50703
|
const name = rawName.trim();
|
|
50685
50704
|
const key = slugify(name);
|
|
50686
50705
|
if (!key.replace(/-/g, "")) return jsonResponse({ error: "Name must contain at least one alphanumeric character" }, { status: 400 });
|
|
50687
50706
|
if (getProjectSync(key)) return jsonResponse({ error: `project key '${key}' is already registered` }, { status: 409 });
|
|
50688
50707
|
return yield* Effect.promise(async () => {
|
|
50689
50708
|
const withinHome = await buildHomeGuard();
|
|
50690
|
-
const rawParentResolved = resolve
|
|
50709
|
+
const rawParentResolved = resolve(normalize(rawParent));
|
|
50691
50710
|
let probe = rawParentResolved;
|
|
50692
50711
|
let existingAncestor = null;
|
|
50693
50712
|
for (;;) {
|
|
@@ -50695,15 +50714,15 @@ const postProjectsRoute = HttpRouter.add("POST", "/api/projects", httpHandler(Ef
|
|
|
50695
50714
|
existingAncestor = await realpath(probe);
|
|
50696
50715
|
break;
|
|
50697
50716
|
} catch {}
|
|
50698
|
-
const up = dirname
|
|
50717
|
+
const up = dirname(probe);
|
|
50699
50718
|
if (up === probe) break;
|
|
50700
50719
|
probe = up;
|
|
50701
50720
|
}
|
|
50702
50721
|
if (!existingAncestor || !withinHome(existingAncestor)) return jsonResponse({ error: "parentDir is outside home directory" }, { status: 400 });
|
|
50703
|
-
const suffix = relative
|
|
50704
|
-
const canonicalParent = suffix ? resolve
|
|
50722
|
+
const suffix = relative(probe, rawParentResolved);
|
|
50723
|
+
const canonicalParent = suffix ? resolve(existingAncestor, suffix) : existingAncestor;
|
|
50705
50724
|
if (!withinHome(canonicalParent)) return jsonResponse({ error: "parentDir is outside home directory" }, { status: 400 });
|
|
50706
|
-
const target = join
|
|
50725
|
+
const target = join(canonicalParent, key);
|
|
50707
50726
|
let targetExists = false;
|
|
50708
50727
|
try {
|
|
50709
50728
|
await access(target);
|
|
@@ -50756,14 +50775,14 @@ const execFileAsync$1 = promisify(execFile);
|
|
|
50756
50775
|
const decodePreviewRequest = Schema.decodeUnknownSync(ContextPreviewRequest);
|
|
50757
50776
|
const decodeSaveRequest = Schema.decodeUnknownSync(ContextLayerSaveRequest);
|
|
50758
50777
|
function globalContextFile(overdeckHome = getOverdeckHome()) {
|
|
50759
|
-
return overdeckHome === getOverdeckHome() ? globalContextFile$1() : join
|
|
50778
|
+
return overdeckHome === getOverdeckHome() ? globalContextFile$1() : join(overdeckHome, "context", "global.md");
|
|
50760
50779
|
}
|
|
50761
50780
|
function contextDirForFile(file) {
|
|
50762
|
-
return dirname
|
|
50781
|
+
return dirname(file);
|
|
50763
50782
|
}
|
|
50764
50783
|
function pathWithin(root, candidate) {
|
|
50765
|
-
const rel = relative
|
|
50766
|
-
return rel === "" || !!rel && !rel.startsWith("..") && !isAbsolute
|
|
50784
|
+
const rel = relative(resolve(root), resolve(candidate));
|
|
50785
|
+
return rel === "" || !!rel && !rel.startsWith("..") && !isAbsolute(rel);
|
|
50767
50786
|
}
|
|
50768
50787
|
function assertPathInside(root, candidate) {
|
|
50769
50788
|
if (!pathWithin(root, candidate)) throw new Error(`Path escapes allowed root: ${candidate}`);
|
|
@@ -50784,13 +50803,13 @@ async function readOptionalFile(path) {
|
|
|
50784
50803
|
}
|
|
50785
50804
|
function workspaceRootForProject(project) {
|
|
50786
50805
|
const configured = project.workspace?.workspaces_dir ?? "workspaces";
|
|
50787
|
-
return isAbsolute
|
|
50806
|
+
return isAbsolute(configured) ? resolve(configured) : resolve(project.path, configured);
|
|
50788
50807
|
}
|
|
50789
50808
|
function summarizeProject({ key, config }) {
|
|
50790
50809
|
return {
|
|
50791
50810
|
projectKey: key,
|
|
50792
50811
|
name: config.name,
|
|
50793
|
-
path: resolve
|
|
50812
|
+
path: resolve(config.path),
|
|
50794
50813
|
...config.issue_prefix ? { issuePrefix: config.issue_prefix } : {},
|
|
50795
50814
|
...config.tracker ? { tracker: config.tracker } : {},
|
|
50796
50815
|
workspaceRoot: workspaceRootForProject(config)
|
|
@@ -50809,7 +50828,7 @@ async function discoverWorkspacesForProject(projectKey, config) {
|
|
|
50809
50828
|
if (error.code === "ENOENT") return [];
|
|
50810
50829
|
throw error;
|
|
50811
50830
|
})).filter((entry) => entry.isDirectory() && !entry.name.startsWith(".")).map((entry) => {
|
|
50812
|
-
const path = resolve
|
|
50831
|
+
const path = resolve(root, entry.name);
|
|
50813
50832
|
assertPathInside(root, path);
|
|
50814
50833
|
return {
|
|
50815
50834
|
projectKey,
|
|
@@ -50825,7 +50844,7 @@ async function buildContextCatalog(projects) {
|
|
|
50825
50844
|
key: project.key,
|
|
50826
50845
|
config: {
|
|
50827
50846
|
...project.config,
|
|
50828
|
-
path: resolve
|
|
50847
|
+
path: resolve(project.config.path)
|
|
50829
50848
|
}
|
|
50830
50849
|
})).sort((a, b) => a.key.localeCompare(b.key));
|
|
50831
50850
|
const workspaceGroups = await Promise.all(normalizedProjects.map((project) => discoverWorkspacesForProject(project.key, project.config)));
|
|
@@ -50839,7 +50858,7 @@ function targetKey(target) {
|
|
|
50839
50858
|
switch (target.kind) {
|
|
50840
50859
|
case "global": return "global";
|
|
50841
50860
|
case "project": return `project:${target.projectKey}`;
|
|
50842
|
-
case "workspace": return `workspace:${target.projectKey}:${resolve
|
|
50861
|
+
case "workspace": return `workspace:${target.projectKey}:${resolve(target.workspacePath)}`;
|
|
50843
50862
|
}
|
|
50844
50863
|
}
|
|
50845
50864
|
function targetForLayer(layer) {
|
|
@@ -50852,7 +50871,7 @@ function targetForLayer(layer) {
|
|
|
50852
50871
|
case "workspace": return {
|
|
50853
50872
|
kind: "workspace",
|
|
50854
50873
|
projectKey: layer.projectKey,
|
|
50855
|
-
workspacePath: resolve
|
|
50874
|
+
workspacePath: resolve(layer.workspacePath)
|
|
50856
50875
|
};
|
|
50857
50876
|
}
|
|
50858
50877
|
}
|
|
@@ -50863,7 +50882,7 @@ function selectedProjectKey(target) {
|
|
|
50863
50882
|
if (target.kind === "project" || target.kind === "workspace") return target.projectKey;
|
|
50864
50883
|
}
|
|
50865
50884
|
function selectedWorkspacePath(target) {
|
|
50866
|
-
return target.kind === "workspace" ? resolve
|
|
50885
|
+
return target.kind === "workspace" ? resolve(target.workspacePath) : void 0;
|
|
50867
50886
|
}
|
|
50868
50887
|
function applicableLayers(state, selectedLayer) {
|
|
50869
50888
|
const projectKey = selectedProjectKey(selectedLayer);
|
|
@@ -50871,7 +50890,7 @@ function applicableLayers(state, selectedLayer) {
|
|
|
50871
50890
|
return state.resolvedLayers.filter((layer) => {
|
|
50872
50891
|
if (layer.kind === "global") return true;
|
|
50873
50892
|
if (layer.kind === "project") return layer.projectKey === projectKey;
|
|
50874
|
-
return layer.projectKey === projectKey && resolve
|
|
50893
|
+
return layer.projectKey === projectKey && resolve(layer.workspacePath) === workspacePath;
|
|
50875
50894
|
});
|
|
50876
50895
|
}
|
|
50877
50896
|
async function layerRecord(file, base) {
|
|
@@ -50909,11 +50928,11 @@ async function describeSyncTarget(harness, layerKind, projectKey, label, path) {
|
|
|
50909
50928
|
* a Overdeck-owned file, not a user file, so it is not listed as a target.
|
|
50910
50929
|
*/
|
|
50911
50930
|
async function buildSyncTargets(projects) {
|
|
50912
|
-
const targets = [await describeSyncTarget("claude-code", "global", void 0, "Claude Code · global", join
|
|
50931
|
+
const targets = [await describeSyncTarget("claude-code", "global", void 0, "Claude Code · global", join(CLAUDE_DIR, "CLAUDE.md")), await describeSyncTarget("codex", "global", void 0, "Codex · global (codex-global.md)", codexGlobalContextFile())];
|
|
50913
50932
|
for (const { key, config } of projects) {
|
|
50914
50933
|
if (!(await readOptionalFile(resolveProjectContextFile(config.path))).exists) continue;
|
|
50915
|
-
targets.push(await describeSyncTarget("claude-code", "project", key, `${config.name} · CLAUDE.md`, join
|
|
50916
|
-
targets.push(await describeSyncTarget("pi", "project", key, `${config.name} · AGENTS.md`, join
|
|
50934
|
+
targets.push(await describeSyncTarget("claude-code", "project", key, `${config.name} · CLAUDE.md`, join(config.path, "CLAUDE.md")));
|
|
50935
|
+
targets.push(await describeSyncTarget("pi", "project", key, `${config.name} · AGENTS.md`, join(config.path, "AGENTS.md")));
|
|
50917
50936
|
}
|
|
50918
50937
|
return targets;
|
|
50919
50938
|
}
|
|
@@ -50976,7 +50995,7 @@ async function renderBundledRulesAsync(harness) {
|
|
|
50976
50995
|
const includeDev = isDevMode();
|
|
50977
50996
|
const entries = await readdir(SYNC_SOURCES.rules, { withFileTypes: true }).catch(() => []);
|
|
50978
50997
|
const rendered = (await Promise.all(entries.filter((entry) => entry.isFile() && entry.name.endsWith(".md")).sort((a, b) => a.name.localeCompare(b.name)).map(async (entry) => {
|
|
50979
|
-
const file = join
|
|
50998
|
+
const file = join(SYNC_SOURCES.rules, entry.name);
|
|
50980
50999
|
assertPathInside(SYNC_SOURCES.rules, file);
|
|
50981
51000
|
const rule = parseRule(await readFile(file, "utf-8"));
|
|
50982
51001
|
if (!includeDev && rule.scope === "dev") return "";
|
|
@@ -51066,7 +51085,7 @@ async function saveContextLayer(projects, requestOrTarget, maybeContentOrOverdec
|
|
|
51066
51085
|
const layer = requireLayer(await buildContextLayerState(projects, "operation" in requestOrTarget ? maybeContentOrOverdeckHome ?? maybeOverdeckHome : maybeOverdeckHome), request.target);
|
|
51067
51086
|
if (!pathWithin(layer.dir, layer.file)) throw new Error(`Context layer path escapes its directory: ${layer.file}`);
|
|
51068
51087
|
await mkdir(layer.dir, { recursive: true });
|
|
51069
|
-
const tempFile = join
|
|
51088
|
+
const tempFile = join(layer.dir, `.${randomUUID$1()}.tmp`);
|
|
51070
51089
|
try {
|
|
51071
51090
|
await writeFile(tempFile, request.content, "utf-8");
|
|
51072
51091
|
await rename(tempFile, layer.file);
|
|
@@ -51189,8 +51208,8 @@ init_conversations();
|
|
|
51189
51208
|
*/
|
|
51190
51209
|
const getAdminTldrRoute = HttpRouter.add("GET", "/api/admin/tldr/:issueId", httpHandler(Effect.gen(function* () {
|
|
51191
51210
|
const issueId = (yield* HttpRouter.params)["issueId"] ?? "";
|
|
51192
|
-
const workspacePath = join
|
|
51193
|
-
const venvPath = join
|
|
51211
|
+
const workspacePath = join(resolveProjectFromIssueSync(issueId)?.projectPath ?? process.cwd(), "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
51212
|
+
const venvPath = join(workspacePath, ".venv");
|
|
51194
51213
|
if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
|
|
51195
51214
|
if (!existsSync$1(venvPath)) return jsonResponse({
|
|
51196
51215
|
available: false,
|
|
@@ -51318,7 +51337,7 @@ function checkCommand(cmd) {
|
|
|
51318
51337
|
}
|
|
51319
51338
|
async function isToolInstalled(tool) {
|
|
51320
51339
|
if (tool === "traefik") return checkCommand("docker");
|
|
51321
|
-
if (tool === "ttyd") return checkCommand("ttyd") || existsSync$1(join
|
|
51340
|
+
if (tool === "ttyd") return checkCommand("ttyd") || existsSync$1(join(homedir$1(), "bin", "ttyd"));
|
|
51322
51341
|
return checkCommand(tool);
|
|
51323
51342
|
}
|
|
51324
51343
|
/** Install a single tool. Returns a result object (never throws). */
|
|
@@ -51355,9 +51374,9 @@ async function installTmux() {
|
|
|
51355
51374
|
}
|
|
51356
51375
|
async function installTtyd() {
|
|
51357
51376
|
const plat = await Effect.runPromise(detectPlatform());
|
|
51358
|
-
const binDir = join
|
|
51377
|
+
const binDir = join(homedir$1(), "bin");
|
|
51359
51378
|
mkdirSync$1(binDir, { recursive: true });
|
|
51360
|
-
const ttydPath = join
|
|
51379
|
+
const ttydPath = join(binDir, "ttyd");
|
|
51361
51380
|
if (plat === "darwin") try {
|
|
51362
51381
|
await execAsync$1("brew install ttyd", { timeout: 12e4 });
|
|
51363
51382
|
return {
|
|
@@ -51383,9 +51402,9 @@ async function installMkcert() {
|
|
|
51383
51402
|
message: "mkcert installed via Homebrew and CA set up"
|
|
51384
51403
|
};
|
|
51385
51404
|
}
|
|
51386
|
-
const binDir = join
|
|
51405
|
+
const binDir = join(homedir$1(), ".local", "bin");
|
|
51387
51406
|
mkdirSync$1(binDir, { recursive: true });
|
|
51388
|
-
const mkcertPath = join
|
|
51407
|
+
const mkcertPath = join(binDir, "mkcert");
|
|
51389
51408
|
await execAsync$1(`curl -sL "https://github.com/FiloSottile/mkcert/releases/latest/download/mkcert-v1.4.4-linux-${process.arch === "x64" ? "amd64" : process.arch}" -o "${mkcertPath}" && chmod +x "${mkcertPath}"`, { timeout: 6e4 });
|
|
51390
51409
|
await execAsync$1("mkcert -install", { timeout: 3e4 });
|
|
51391
51410
|
return {
|
|
@@ -51414,8 +51433,8 @@ async function installOx() {
|
|
|
51414
51433
|
const plat = await Effect.runPromise(detectPlatform());
|
|
51415
51434
|
const arch = process.arch === "x64" ? "amd64" : process.arch;
|
|
51416
51435
|
const platform = plat === "darwin" ? "darwin" : "linux";
|
|
51417
|
-
const binDir = join
|
|
51418
|
-
const oxPath = join
|
|
51436
|
+
const binDir = join(homedir$1(), ".local", "bin");
|
|
51437
|
+
const oxPath = join(binDir, "ox");
|
|
51419
51438
|
mkdirSync$1(binDir, { recursive: true });
|
|
51420
51439
|
await execAsync$1(`curl -sL "https://github.com/eltmon/ox/releases/download/latest/ox-${platform}-${arch}" -o "${oxPath}" && chmod +x "${oxPath}"`, { timeout: 6e4 });
|
|
51421
51440
|
return {
|
|
@@ -52006,7 +52025,7 @@ async function relayCiFailureFeedbackPromise(opts) {
|
|
|
52006
52025
|
return { agentMessageSent: false };
|
|
52007
52026
|
}
|
|
52008
52027
|
const resolved = resolveProjectFromIssueSync(issueId);
|
|
52009
|
-
const workspacePath = resolved ? join
|
|
52028
|
+
const workspacePath = resolved ? join(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`) : void 0;
|
|
52010
52029
|
const markdownBody = buildFeedbackBody({
|
|
52011
52030
|
issueId,
|
|
52012
52031
|
repo: opts.repo,
|
|
@@ -52214,7 +52233,7 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
|
|
|
52214
52233
|
let mergeState;
|
|
52215
52234
|
let isDraft;
|
|
52216
52235
|
let checksFailed;
|
|
52217
|
-
const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-
|
|
52236
|
+
const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-C7lftMNj.js");
|
|
52218
52237
|
if (isGitHubAppConfigured()) {
|
|
52219
52238
|
const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
|
|
52220
52239
|
mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
|
|
@@ -52363,8 +52382,8 @@ async function handlePullRequestPromise(payload) {
|
|
|
52363
52382
|
bumpIssuePrTabCacheGeneration(issueId);
|
|
52364
52383
|
const repo = payload.repository.full_name;
|
|
52365
52384
|
if (payload.action === "closed" && pr.merged === true) try {
|
|
52366
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
52367
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
52385
|
+
const { postMergeLifecycle } = await import("./merge-agent-CfohxFWM.js");
|
|
52386
|
+
const { resolveProjectFromIssueSync } = await import("./projects-Bqfwuqet.js");
|
|
52368
52387
|
const project = resolveProjectFromIssueSync(issueId);
|
|
52369
52388
|
if (project) {
|
|
52370
52389
|
const branchName = pr.head.ref;
|
|
@@ -52666,7 +52685,7 @@ async function reconcileStaleGitHubBlockers() {
|
|
|
52666
52685
|
* Verifies X-Hub-Signature-256 HMAC-SHA256 signature.
|
|
52667
52686
|
* Dispatches to per-event-type handlers.
|
|
52668
52687
|
*/
|
|
52669
|
-
const WEBHOOK_SECRET_PATH = join
|
|
52688
|
+
const WEBHOOK_SECRET_PATH = join(homedir$1(), ".overdeck", "github-app", "webhook-secret");
|
|
52670
52689
|
let _cachedWebhookSecret = void 0;
|
|
52671
52690
|
let _secretLoadPromise = null;
|
|
52672
52691
|
async function loadWebhookSecret() {
|
|
@@ -52879,12 +52898,12 @@ async function readComplianceWarningMarkers(projectId, issueId) {
|
|
|
52879
52898
|
async function writeComplianceWarningMarkers(projectId, issueId, markers) {
|
|
52880
52899
|
const path = resolveComplianceWarningMarkersFile(projectId, issueId);
|
|
52881
52900
|
await ensureParentDir(path);
|
|
52882
|
-
const tempPath = join(dirname(path), `.${randomUUID()}.tmp`);
|
|
52901
|
+
const tempPath = join$1(dirname$1(path), `.${randomUUID()}.tmp`);
|
|
52883
52902
|
await writeFile$1(tempPath, `${JSON.stringify({ warnedObservationIds: [...new Set(markers.warnedObservationIds)] }, null, 2)}\n`, "utf8");
|
|
52884
52903
|
await rename$1(tempPath, path);
|
|
52885
52904
|
}
|
|
52886
52905
|
function resolveComplianceWarningMarkersFile(projectId, issueId) {
|
|
52887
|
-
return join(resolveIssueMemoryRoot(projectId, issueId), "compliance", "warned-misses.json");
|
|
52906
|
+
return join$1(resolveIssueMemoryRoot(projectId, issueId), "compliance", "warned-misses.json");
|
|
52888
52907
|
}
|
|
52889
52908
|
function isCurrentSessionMiss(observation, identity) {
|
|
52890
52909
|
return observation.sessionId === identity.sessionId && observation.actionStatus === "compliance.miss" && observation.tags.includes("compliance") && observation.tags.includes("miss");
|
|
@@ -52929,7 +52948,7 @@ function getCheckpointWorker() {
|
|
|
52929
52948
|
return worker;
|
|
52930
52949
|
}
|
|
52931
52950
|
async function runInline(operation, payload) {
|
|
52932
|
-
const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-
|
|
52951
|
+
const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-BK17oicz.js");
|
|
52933
52952
|
switch (operation) {
|
|
52934
52953
|
case "claimTranscriptRange": return claimTranscriptRange(payload);
|
|
52935
52954
|
case "commitTranscriptRange": return commitTranscriptRange(payload);
|
|
@@ -53317,7 +53336,7 @@ var CodexTranscriptSource = class {
|
|
|
53317
53336
|
async resolveAgentTranscript(agent) {
|
|
53318
53337
|
const threadId = await this.readThreadId(agent);
|
|
53319
53338
|
if (!threadId) return null;
|
|
53320
|
-
const rolloutPath = findRolloutPath(join
|
|
53339
|
+
const rolloutPath = findRolloutPath(join(getAgentDir(agent.id), "codex-home"), threadId);
|
|
53321
53340
|
if (!rolloutPath) return null;
|
|
53322
53341
|
let fileStat;
|
|
53323
53342
|
try {
|
|
@@ -53374,13 +53393,13 @@ function getAgentRuntimeStateFromStore$1(agentId) {
|
|
|
53374
53393
|
async function readPiSessionId(agent) {
|
|
53375
53394
|
if (agent.sessionId) return agent.sessionId;
|
|
53376
53395
|
try {
|
|
53377
|
-
return (await readFile(join
|
|
53396
|
+
return (await readFile(join(getAgentDir(agent.id), "session.id"), "utf8")).trim() || null;
|
|
53378
53397
|
} catch {
|
|
53379
53398
|
return null;
|
|
53380
53399
|
}
|
|
53381
53400
|
}
|
|
53382
53401
|
async function resolvePiTranscriptPath(agent, sessionId) {
|
|
53383
|
-
const sessionDir = join
|
|
53402
|
+
const sessionDir = join(getAgentDir(agent.id), "sessions");
|
|
53384
53403
|
let entries;
|
|
53385
53404
|
try {
|
|
53386
53405
|
entries = (await readdir(sessionDir)).filter((name) => name.endsWith(".jsonl")).sort();
|
|
@@ -53388,16 +53407,16 @@ async function resolvePiTranscriptPath(agent, sessionId) {
|
|
|
53388
53407
|
return null;
|
|
53389
53408
|
}
|
|
53390
53409
|
const matching = entries.findLast((name) => name.includes(sessionId));
|
|
53391
|
-
if (matching) return join
|
|
53392
|
-
return entries.length > 0 ? join
|
|
53410
|
+
if (matching) return join(sessionDir, matching);
|
|
53411
|
+
return entries.length > 0 ? join(sessionDir, entries[entries.length - 1]) : null;
|
|
53393
53412
|
}
|
|
53394
53413
|
function isClaudeCodeSubagentSession(_sessionId, _agent, transcriptPath) {
|
|
53395
|
-
return transcriptPath.split(sep
|
|
53414
|
+
return transcriptPath.split(sep).includes("subagents") || transcriptPath.includes("/subagents/");
|
|
53396
53415
|
}
|
|
53397
53416
|
function buildMemoryIdentity(agent, sessionId) {
|
|
53398
53417
|
return {
|
|
53399
53418
|
projectId: inferProjectId$1(agent.workspace),
|
|
53400
|
-
workspaceId: basename
|
|
53419
|
+
workspaceId: basename(agent.workspace),
|
|
53401
53420
|
issueId: agent.issueId,
|
|
53402
53421
|
runId: agent.id,
|
|
53403
53422
|
sessionId,
|
|
@@ -53406,12 +53425,12 @@ function buildMemoryIdentity(agent, sessionId) {
|
|
|
53406
53425
|
};
|
|
53407
53426
|
}
|
|
53408
53427
|
function inferProjectId$1(workspacePath) {
|
|
53409
|
-
if (basename
|
|
53410
|
-
return basename
|
|
53428
|
+
if (basename(workspacePath).startsWith("feature-")) return basename(dirname(dirname(workspacePath)));
|
|
53429
|
+
return basename(workspacePath);
|
|
53411
53430
|
}
|
|
53412
53431
|
async function readCodexThreadId(agent) {
|
|
53413
53432
|
try {
|
|
53414
|
-
return (await readFile(join
|
|
53433
|
+
return (await readFile(join(getAgentDir(agent.id), "codex-thread-id"), "utf8")).trim() || null;
|
|
53415
53434
|
} catch {
|
|
53416
53435
|
return null;
|
|
53417
53436
|
}
|
|
@@ -53705,7 +53724,7 @@ async function upsertObservationMarkdown(markdownPath, observation) {
|
|
|
53705
53724
|
const index = lines.findIndex((line) => line.includes(marker));
|
|
53706
53725
|
if (index === -1) lines.push(nextLine);
|
|
53707
53726
|
else lines[index] = nextLine;
|
|
53708
|
-
const tempPath = `${dirname(markdownPath)}/.${randomUUID()}.tmp`;
|
|
53727
|
+
const tempPath = `${dirname$1(markdownPath)}/.${randomUUID()}.tmp`;
|
|
53709
53728
|
await writeFile$1(tempPath, `${lines.join("\n")}\n`, "utf8");
|
|
53710
53729
|
await rename$1(tempPath, markdownPath);
|
|
53711
53730
|
}
|
|
@@ -54083,7 +54102,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
|
|
|
54083
54102
|
};
|
|
54084
54103
|
}
|
|
54085
54104
|
async function emitMemoryObservationCreated(observation, timestamp) {
|
|
54086
|
-
const { initEventStore } = await import("./event-store-
|
|
54105
|
+
const { initEventStore } = await import("./event-store-DU3HkZlN.js");
|
|
54087
54106
|
await (await initEventStore()).appendAsync({
|
|
54088
54107
|
type: "memory.observation_created",
|
|
54089
54108
|
timestamp,
|
|
@@ -54634,7 +54653,7 @@ async function handleMemoryTurnBody(body, options = {}) {
|
|
|
54634
54653
|
const payloadIdentity = parseMemoryIdentity(payload.identity, sessionId);
|
|
54635
54654
|
let agentState = null;
|
|
54636
54655
|
const trustedTranscriptPath = options.resolveTranscriptPath ? await options.resolveTranscriptPath(body, sessionId) : resolveTrustedTranscriptPathFromState(agentState = await resolveAgentState(body, sessionId, options.resolveAgentIdBySessionId), sessionId);
|
|
54637
|
-
if (!trustedTranscriptPath || resolve(transcriptPath) !== trustedTranscriptPath) return {
|
|
54656
|
+
if (!trustedTranscriptPath || resolve$1(transcriptPath) !== trustedTranscriptPath) return {
|
|
54638
54657
|
status: "error",
|
|
54639
54658
|
statusCode: 422,
|
|
54640
54659
|
error: "transcript path could not be verified"
|
|
@@ -54685,7 +54704,7 @@ async function handleMemorySessionStartBody(body, options = {}) {
|
|
|
54685
54704
|
} : { sessionId }).catch(() => {});
|
|
54686
54705
|
if (!await (options.areObservationsEnabled ?? areMemoryObservationsEnabled)()) return { status: "disabled" };
|
|
54687
54706
|
const trustedTranscriptPath = options.resolveTranscriptPath ? await options.resolveTranscriptPath(body, sessionId) : await resolveTrustedTranscriptPath(body, sessionId, options.resolveAgentIdBySessionId);
|
|
54688
|
-
if (!trustedTranscriptPath || resolve(transcriptPath) !== trustedTranscriptPath) return {
|
|
54707
|
+
if (!trustedTranscriptPath || resolve$1(transcriptPath) !== trustedTranscriptPath) return {
|
|
54689
54708
|
status: "error",
|
|
54690
54709
|
statusCode: 422,
|
|
54691
54710
|
error: "transcript path could not be verified"
|
|
@@ -54933,7 +54952,7 @@ function resolveMemoryIdentityFromState(state, sessionId) {
|
|
|
54933
54952
|
if (!state) return null;
|
|
54934
54953
|
return {
|
|
54935
54954
|
projectId: inferProjectId(state.workspace),
|
|
54936
|
-
workspaceId: basename(state.workspace),
|
|
54955
|
+
workspaceId: basename$1(state.workspace),
|
|
54937
54956
|
issueId: state.issueId,
|
|
54938
54957
|
runId: state.id,
|
|
54939
54958
|
sessionId,
|
|
@@ -54945,7 +54964,7 @@ async function resolveTrustedTranscriptPath(body, sessionId, resolveAgentIdBySes
|
|
|
54945
54964
|
return resolveTrustedTranscriptPathFromState(await resolveAgentState(body, sessionId, resolveAgentIdBySessionId), sessionId);
|
|
54946
54965
|
}
|
|
54947
54966
|
function resolveTrustedTranscriptPathFromState(state, sessionId) {
|
|
54948
|
-
return state ? resolve(sessionFilePath(state.workspace, sessionId)) : null;
|
|
54967
|
+
return state ? resolve$1(sessionFilePath(state.workspace, sessionId)) : null;
|
|
54949
54968
|
}
|
|
54950
54969
|
async function resolveAgentState(body, sessionId, resolveAgentIdBySessionId) {
|
|
54951
54970
|
const agentId = stringField(body.agentId) ?? stringField(body.agent_id);
|
|
@@ -54964,8 +54983,8 @@ async function findAgentStateBySessionId(sessionId, resolveAgentIdBySessionId) {
|
|
|
54964
54983
|
return null;
|
|
54965
54984
|
}
|
|
54966
54985
|
function inferProjectId(workspacePath) {
|
|
54967
|
-
if (basename(workspacePath).startsWith("feature-")) return basename(dirname(dirname(workspacePath)));
|
|
54968
|
-
return basename(workspacePath);
|
|
54986
|
+
if (basename$1(workspacePath).startsWith("feature-")) return basename$1(dirname$1(dirname$1(workspacePath)));
|
|
54987
|
+
return basename$1(workspacePath);
|
|
54969
54988
|
}
|
|
54970
54989
|
function validOffset(value) {
|
|
54971
54990
|
return Number.isInteger(value) && value >= 0;
|
|
@@ -55901,15 +55920,15 @@ const discoveredSessionsRouteLayer = Layer.mergeAll(getStatsRoute, listRoute, se
|
|
|
55901
55920
|
//#region services/flywheel-state.ts
|
|
55902
55921
|
const FLYWHEEL_STATE_RELATIVE_PATH = "docs/FLYWHEEL-STATE.md";
|
|
55903
55922
|
function resolveStatePath(projectRoot) {
|
|
55904
|
-
const root = resolve
|
|
55905
|
-
const absolute = resolve
|
|
55906
|
-
const rel = relative
|
|
55907
|
-
if (rel.startsWith("..") || isAbsolute
|
|
55923
|
+
const root = resolve(projectRoot);
|
|
55924
|
+
const absolute = resolve(root, FLYWHEEL_STATE_RELATIVE_PATH);
|
|
55925
|
+
const rel = relative(root, absolute);
|
|
55926
|
+
if (rel.startsWith("..") || isAbsolute(rel)) throw new Error("Flywheel state path escapes the project root");
|
|
55908
55927
|
return absolute;
|
|
55909
55928
|
}
|
|
55910
55929
|
async function readFlywheelState(options = {}) {
|
|
55911
55930
|
const absolute = resolveStatePath(options.projectRoot ?? process.cwd());
|
|
55912
|
-
const displayPath = join
|
|
55931
|
+
const displayPath = join(FLYWHEEL_STATE_RELATIVE_PATH);
|
|
55913
55932
|
try {
|
|
55914
55933
|
const [content, info] = await Promise.all([readFile(absolute, "utf8"), stat$1(absolute)]);
|
|
55915
55934
|
return {
|
|
@@ -56890,8 +56909,8 @@ function requireTrustedOrigin(request) {
|
|
|
56890
56909
|
return originCheck.ok ? null : jsonResponse({ error: originCheck.error }, { status: 403 });
|
|
56891
56910
|
}
|
|
56892
56911
|
function isInsideRoot(projectRoot, candidate) {
|
|
56893
|
-
const relativePath = relative
|
|
56894
|
-
return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute
|
|
56912
|
+
const relativePath = relative(projectRoot, candidate);
|
|
56913
|
+
return relativePath === "" || !relativePath.startsWith("..") && !isAbsolute(relativePath);
|
|
56895
56914
|
}
|
|
56896
56915
|
function parseRunIdParam(runId) {
|
|
56897
56916
|
try {
|
|
@@ -56912,10 +56931,10 @@ function parseRunsLimit(value) {
|
|
|
56912
56931
|
return Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : void 0;
|
|
56913
56932
|
}
|
|
56914
56933
|
function resolveFlywheelBriefPath(projectRoot) {
|
|
56915
|
-
const root = resolve
|
|
56916
|
-
const resolvedPath = resolve
|
|
56917
|
-
const normalizedRoot = root.endsWith(sep
|
|
56918
|
-
const displayPath = relative
|
|
56934
|
+
const root = resolve(projectRoot);
|
|
56935
|
+
const resolvedPath = resolve(root, DEFAULT_BRIEF_PATH);
|
|
56936
|
+
const normalizedRoot = root.endsWith(sep) ? root : `${root}${sep}`;
|
|
56937
|
+
const displayPath = relative(root, resolvedPath);
|
|
56919
56938
|
return {
|
|
56920
56939
|
ok: true,
|
|
56921
56940
|
path: resolvedPath.startsWith(normalizedRoot) ? displayPath : resolvedPath
|
|
@@ -56926,7 +56945,7 @@ function resolveBriefAbsolutePath(projectRoot) {
|
|
|
56926
56945
|
if (!resolved.ok) return resolved;
|
|
56927
56946
|
return {
|
|
56928
56947
|
ok: true,
|
|
56929
|
-
absolutePath: resolve
|
|
56948
|
+
absolutePath: resolve(projectRoot, resolved.path),
|
|
56930
56949
|
displayPath: resolved.path
|
|
56931
56950
|
};
|
|
56932
56951
|
}
|
|
@@ -56939,7 +56958,7 @@ async function assertExistingPathInsideRoot(projectRoot, candidate) {
|
|
|
56939
56958
|
}
|
|
56940
56959
|
async function assertWritePathInsideRoot(projectRoot, candidate) {
|
|
56941
56960
|
const realRoot = await realpath(projectRoot);
|
|
56942
|
-
if (!isInsideRoot(realRoot, await realpath(dirname
|
|
56961
|
+
if (!isInsideRoot(realRoot, await realpath(dirname(candidate)))) return {
|
|
56943
56962
|
ok: false,
|
|
56944
56963
|
error: "Brief path must stay inside the project root"
|
|
56945
56964
|
};
|
|
@@ -57180,7 +57199,7 @@ async function getFlywheelConversationPayload() {
|
|
|
57180
57199
|
};
|
|
57181
57200
|
}
|
|
57182
57201
|
async function postFlywheelReportPayload() {
|
|
57183
|
-
const { flywheelReportCommand } = await import("./flywheel-
|
|
57202
|
+
const { flywheelReportCommand } = await import("./flywheel-D2LdPSic.js");
|
|
57184
57203
|
await flywheelReportCommand({ cwd: process.cwd() });
|
|
57185
57204
|
return {
|
|
57186
57205
|
status: 200,
|
|
@@ -57338,11 +57357,11 @@ const getMergeBlockersRoute = HttpRouter.add("GET", "/api/flywheel/merge-blocker
|
|
|
57338
57357
|
async function defaultGetOrderedIssueIds() {
|
|
57339
57358
|
const status = await readCurrentFlywheelStatusForDashboard();
|
|
57340
57359
|
if (!status) return [];
|
|
57341
|
-
const { computeMergeQueue } = await import("./flywheel-merge-order-
|
|
57360
|
+
const { computeMergeQueue } = await import("./flywheel-merge-order-CttTazRY.js");
|
|
57342
57361
|
return (await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd()).pipe(Effect.provide(layer)))).map((i) => i.issueId);
|
|
57343
57362
|
}
|
|
57344
57363
|
async function defaultMergeOne(issueId) {
|
|
57345
|
-
const { triggerMerge } = await import("./merge-ops-
|
|
57364
|
+
const { triggerMerge } = await import("./merge-ops-Czke6UAp.js");
|
|
57346
57365
|
const r = await triggerMerge(issueId);
|
|
57347
57366
|
return r.success ? { ok: true } : {
|
|
57348
57367
|
ok: false,
|
|
@@ -57505,7 +57524,7 @@ const postFlywheelBriefRoute = HttpRouter.add("POST", "/api/flywheel/brief", htt
|
|
|
57505
57524
|
const resolved = resolveBriefAbsolutePath(process.cwd());
|
|
57506
57525
|
if (!resolved.ok) return jsonResponse({ error: resolved.error }, { status: 400 });
|
|
57507
57526
|
return yield* Effect.promise(async () => {
|
|
57508
|
-
await mkdir(dirname
|
|
57527
|
+
await mkdir(dirname(resolved.absolutePath), { recursive: true });
|
|
57509
57528
|
const containment = await assertWritePathInsideRoot(process.cwd(), resolved.absolutePath);
|
|
57510
57529
|
if (!containment.ok) return jsonResponse({ error: containment.error }, { status: 400 });
|
|
57511
57530
|
await writeFile(resolved.absolutePath, bodyContent, "utf8");
|
|
@@ -57519,7 +57538,7 @@ const getFlywheelMergeQueueRoute = HttpRouter.add("GET", "/api/flywheel/merge-qu
|
|
|
57519
57538
|
return yield* Effect.promise(async () => {
|
|
57520
57539
|
const status = await readCurrentFlywheelStatusForDashboard();
|
|
57521
57540
|
if (!status) return jsonResponse([]);
|
|
57522
|
-
const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-
|
|
57541
|
+
const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-CttTazRY.js");
|
|
57523
57542
|
return jsonResponse(await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd(), { getPrUrl: resolveMergeQueuePrUrl }).pipe(Effect.provide(layer))));
|
|
57524
57543
|
});
|
|
57525
57544
|
})));
|
|
@@ -57533,18 +57552,18 @@ function uatGenerationNameFromParam(param) {
|
|
|
57533
57552
|
return decoded.startsWith("uat/") ? decoded : `uat/${decoded}`;
|
|
57534
57553
|
}
|
|
57535
57554
|
const getUatGenerationsRoute = HttpRouter.add("GET", "/api/flywheel/uat-generations", httpHandler(Effect.gen(function* () {
|
|
57536
|
-
const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-
|
|
57555
|
+
const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
|
|
57537
57556
|
return jsonResponse(yield* Effect.promise(() => getUatGenerationsPayload()));
|
|
57538
57557
|
})));
|
|
57539
57558
|
const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
|
|
57540
|
-
const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-
|
|
57559
|
+
const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
|
|
57541
57560
|
return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
|
|
57542
57561
|
})));
|
|
57543
57562
|
const postUatGenerationStackRoute = HttpRouter.add("POST", "/api/flywheel/uat-generations/:name/stack", httpHandler(Effect.gen(function* () {
|
|
57544
57563
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
57545
57564
|
if (authError) return authError;
|
|
57546
57565
|
const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
|
|
57547
|
-
const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-
|
|
57566
|
+
const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
|
|
57548
57567
|
const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
|
|
57549
57568
|
if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
|
|
57550
57569
|
return jsonResponse({
|
|
@@ -57556,8 +57575,8 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
|
|
|
57556
57575
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
57557
57576
|
if (authError) return authError;
|
|
57558
57577
|
const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
|
|
57559
|
-
const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-
|
|
57560
|
-
const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-
|
|
57578
|
+
const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
|
|
57579
|
+
const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-BLIreoE7.js"));
|
|
57561
57580
|
const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle));
|
|
57562
57581
|
if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
|
|
57563
57582
|
return jsonResponse(result);
|
|
@@ -57570,7 +57589,7 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
|
|
|
57570
57589
|
const postFlywheelAssembleUatRoute = HttpRouter.add("POST", "/api/flywheel/assemble-uat", httpHandler(Effect.gen(function* () {
|
|
57571
57590
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
57572
57591
|
if (authError) return authError;
|
|
57573
|
-
const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-
|
|
57592
|
+
const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-DGkIkLxu.js"));
|
|
57574
57593
|
return jsonResponse(yield* Effect.promise(() => runUatTrainReconcile({ force: true })));
|
|
57575
57594
|
})));
|
|
57576
57595
|
const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
|
|
@@ -57584,10 +57603,10 @@ const DEFAULT_THUMBNAIL_WIDTH = 640;
|
|
|
57584
57603
|
const DEFAULT_THUMBNAIL_HEIGHT = 360;
|
|
57585
57604
|
const DEFAULT_THUMBNAIL_TIMEOUT_MS = 1e4;
|
|
57586
57605
|
function getArtifactThumbnailDir(slug) {
|
|
57587
|
-
return join
|
|
57606
|
+
return join(getOverdeckHome(), "artifacts", "thumbnails", slug);
|
|
57588
57607
|
}
|
|
57589
57608
|
function getArtifactThumbnailPath(slug, publishedHash) {
|
|
57590
|
-
return join
|
|
57609
|
+
return join(getArtifactThumbnailDir(slug), `${sanitizeHashForPath(publishedHash)}.png`);
|
|
57591
57610
|
}
|
|
57592
57611
|
function resolveArtifactThumbnailUrl(artifact) {
|
|
57593
57612
|
const publishedHash = artifact.lastPublishedHash;
|
|
@@ -57604,7 +57623,7 @@ async function getOrCreateArtifactThumbnail(artifact, options = {}) {
|
|
|
57604
57623
|
cacheHit: true
|
|
57605
57624
|
};
|
|
57606
57625
|
try {
|
|
57607
|
-
await mkdir(dirname
|
|
57626
|
+
await mkdir(dirname(path), { recursive: true });
|
|
57608
57627
|
await (options.renderer ?? renderArtifactThumbnailWithPlaywright)({
|
|
57609
57628
|
rawUrl: options.rawUrl ?? defaultRawArtifactUrl(artifact.slug),
|
|
57610
57629
|
outputPath: path,
|
|
@@ -57714,7 +57733,7 @@ function isArtifactHost(headers, baseDomain) {
|
|
|
57714
57733
|
return normalizedHost(headerValue(headers, "host")) === `artifacts.${artifactDomain(baseDomain)}`;
|
|
57715
57734
|
}
|
|
57716
57735
|
function getPublishedSnapshotPath(slug) {
|
|
57717
|
-
return join
|
|
57736
|
+
return join(getOverdeckHome(), "artifacts", "snapshots", slug, "index.html");
|
|
57718
57737
|
}
|
|
57719
57738
|
function resolveArtifactUrls(slug, baseDomain) {
|
|
57720
57739
|
const domain = baseDomain ?? process.env.PAN_ARTIFACT_DOMAIN ?? "overdeck.localhost";
|
|
@@ -58171,7 +58190,7 @@ function buildNamedParams(row) {
|
|
|
58171
58190
|
* has no live session is marked stopped.
|
|
58172
58191
|
*/
|
|
58173
58192
|
function backfillAgentsFromStateJsonSync(db, options) {
|
|
58174
|
-
const agentsDir = join
|
|
58193
|
+
const agentsDir = join(getOverdeckHome(), "agents");
|
|
58175
58194
|
const liveSessions = options?.listLiveSessions?.() ?? listLiveTmuxSessionNames();
|
|
58176
58195
|
const readHarnessModel = options?.readHarnessModel ?? readAgentHarnessModelRecordSync;
|
|
58177
58196
|
let processed = 0;
|
|
@@ -58192,11 +58211,11 @@ function backfillAgentsFromStateJsonSync(db, options) {
|
|
|
58192
58211
|
const upsert = db.prepare(`INSERT OR REPLACE INTO agents (${columns.join(", ")}) VALUES (${placeholders})`);
|
|
58193
58212
|
db.transaction(() => {
|
|
58194
58213
|
for (const entry of entries) {
|
|
58195
|
-
const dirPath = join
|
|
58214
|
+
const dirPath = join(agentsDir, entry);
|
|
58196
58215
|
let statePath;
|
|
58197
58216
|
try {
|
|
58198
58217
|
if (!statSync$1(dirPath).isDirectory()) continue;
|
|
58199
|
-
statePath = join
|
|
58218
|
+
statePath = join(dirPath, "state.json");
|
|
58200
58219
|
} catch {
|
|
58201
58220
|
continue;
|
|
58202
58221
|
}
|
|
@@ -59589,7 +59608,7 @@ function runMigrations(db, dbPath) {
|
|
|
59589
59608
|
}
|
|
59590
59609
|
if (currentVersion < 55) {
|
|
59591
59610
|
try {
|
|
59592
|
-
const resolvedDbPath = dbPath ?? join(getOverdeckHome(), "panopticon.db");
|
|
59611
|
+
const resolvedDbPath = dbPath ?? join$1(getOverdeckHome(), "panopticon.db");
|
|
59593
59612
|
const snapshotPath = `${resolvedDbPath}.v54-backfill-snapshot`;
|
|
59594
59613
|
if (existsSync(resolvedDbPath) && !existsSync(snapshotPath)) {
|
|
59595
59614
|
writeFileSync(snapshotPath, readFileSync(resolvedDbPath));
|
|
@@ -59726,7 +59745,7 @@ let _db = null;
|
|
|
59726
59745
|
* Get the path to panopticon.db (dynamic, respects OVERDECK_HOME override for tests)
|
|
59727
59746
|
*/
|
|
59728
59747
|
function getDatabasePath() {
|
|
59729
|
-
return join(getOverdeckHome(), "panopticon.db");
|
|
59748
|
+
return join$1(getOverdeckHome(), "panopticon.db");
|
|
59730
59749
|
}
|
|
59731
59750
|
/**
|
|
59732
59751
|
* Initialize and return the singleton database connection.
|
|
@@ -59806,7 +59825,7 @@ function clearBacklogSequence(projectKey) {
|
|
|
59806
59825
|
getDatabase().prepare("DELETE FROM backlog_sequence WHERE project_key = ?").run(projectKey);
|
|
59807
59826
|
}
|
|
59808
59827
|
function getBacklogSequenceForRoot(projectRoot) {
|
|
59809
|
-
const seqPath = join
|
|
59828
|
+
const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
|
|
59810
59829
|
if (existsSync$1(seqPath)) {
|
|
59811
59830
|
const result = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
|
|
59812
59831
|
if (result.ok) {
|
|
@@ -59877,20 +59896,20 @@ const getBacklogSequenceRoute = HttpRouter.add("GET", "/api/backlog/sequence", h
|
|
|
59877
59896
|
nodes: [],
|
|
59878
59897
|
edges: []
|
|
59879
59898
|
});
|
|
59880
|
-
const draftsDir = join
|
|
59899
|
+
const draftsDir = join(projectRoot, ".pan", "drafts");
|
|
59881
59900
|
const prdFiles = existsSync$1(draftsDir) ? new Set(readdirSync$1(draftsDir).map((f) => f.replace(/\.md$/, "").toUpperCase())) : /* @__PURE__ */ new Set();
|
|
59882
|
-
const specsDir = join
|
|
59901
|
+
const specsDir = join(projectRoot, ".pan", "specs");
|
|
59883
59902
|
const specIssues = /* @__PURE__ */ new Set();
|
|
59884
59903
|
if (existsSync$1(specsDir)) for (const f of readdirSync$1(specsDir)) {
|
|
59885
59904
|
const match = /^[\d-]+-([A-Z]+-\d+)-/i.exec(f);
|
|
59886
59905
|
if (match) specIssues.add(match[1].toUpperCase());
|
|
59887
59906
|
}
|
|
59888
|
-
const workspacesDir = join
|
|
59907
|
+
const workspacesDir = join(projectRoot, "workspaces");
|
|
59889
59908
|
const issuesWithBeads = /* @__PURE__ */ new Set();
|
|
59890
59909
|
if (existsSync$1(workspacesDir)) for (const dir of readdirSync$1(workspacesDir)) {
|
|
59891
59910
|
const match = /^feature-([a-z]+-\d+)$/i.exec(dir);
|
|
59892
59911
|
if (match) {
|
|
59893
|
-
if (existsSync$1(join
|
|
59912
|
+
if (existsSync$1(join(workspacesDir, dir, ".beads", "issues.jsonl"))) issuesWithBeads.add(match[1].toUpperCase());
|
|
59894
59913
|
}
|
|
59895
59914
|
}
|
|
59896
59915
|
const titleByIssue = /* @__PURE__ */ new Map();
|
|
@@ -59907,7 +59926,7 @@ const getBacklogSequenceRoute = HttpRouter.add("GET", "/api/backlog/sequence", h
|
|
|
59907
59926
|
nodes: cachedNodes.map((r) => {
|
|
59908
59927
|
const issueUpper = r.issueId.toUpperCase();
|
|
59909
59928
|
const reviewStatus = getReviewStatusSync(issueUpper);
|
|
59910
|
-
const inPipeline = reviewStatus !== null && reviewStatus.reviewStatus !== "pending" || existsSync$1(join
|
|
59929
|
+
const inPipeline = reviewStatus !== null && reviewStatus.reviewStatus !== "pending" || existsSync$1(join(workspacesDir, `feature-${r.issueId.toLowerCase()}`));
|
|
59911
59930
|
const hasPrd = prdFiles.has(issueUpper);
|
|
59912
59931
|
const ready = specIssues.has(issueUpper) && issuesWithBeads.has(issueUpper);
|
|
59913
59932
|
const state = classifyIssue({
|
|
@@ -59991,7 +60010,7 @@ const postBacklogGateRoute = HttpRouter.add("POST", "/api/backlog/sequence/gate"
|
|
|
59991
60010
|
const gate = normalizeGate(rawGate);
|
|
59992
60011
|
return yield* Effect.promise(async () => {
|
|
59993
60012
|
const projectRoot = process.cwd();
|
|
59994
|
-
const seqPath = join
|
|
60013
|
+
const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
|
|
59995
60014
|
if (!existsSync$1(seqPath)) throw new Error("sequence.md not found");
|
|
59996
60015
|
const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
|
|
59997
60016
|
if (!parsed.ok) throw new Error(`parse error: ${parsed.error}`);
|
|
@@ -60023,7 +60042,7 @@ const postBacklogPlanningRoute = HttpRouter.add("POST", "/api/backlog/sequence/p
|
|
|
60023
60042
|
].includes(planning)) return yield* Effect.fail(/* @__PURE__ */ new Error("planning must be skip, auto, or interactive"));
|
|
60024
60043
|
return yield* Effect.promise(async () => {
|
|
60025
60044
|
const projectRoot = process.cwd();
|
|
60026
|
-
const seqPath = join
|
|
60045
|
+
const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
|
|
60027
60046
|
if (!existsSync$1(seqPath)) throw new Error("sequence.md not found");
|
|
60028
60047
|
const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
|
|
60029
60048
|
if (!parsed.ok) throw new Error(`parse error: ${parsed.error}`);
|
|
@@ -60046,7 +60065,7 @@ const getBacklogForecastRoute = HttpRouter.add("GET", "/api/backlog/forecast", h
|
|
|
60046
60065
|
return yield* Effect.try({
|
|
60047
60066
|
try: () => {
|
|
60048
60067
|
const projectRoot = process.cwd();
|
|
60049
|
-
const seqPath = join
|
|
60068
|
+
const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
|
|
60050
60069
|
if (!existsSync$1(seqPath)) return jsonResponse({
|
|
60051
60070
|
n,
|
|
60052
60071
|
stats: null,
|
|
@@ -60154,7 +60173,7 @@ const getBacklogIssueStateRoute = HttpRouter.add("GET", "/api/backlog/issue-stat
|
|
|
60154
60173
|
let gate = "auto";
|
|
60155
60174
|
let planning = null;
|
|
60156
60175
|
let inSequence = false;
|
|
60157
|
-
const seqPath = join
|
|
60176
|
+
const seqPath = join(projectRoot, ".pan", "backlog", "sequence.md");
|
|
60158
60177
|
if (existsSync$1(seqPath)) {
|
|
60159
60178
|
const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
|
|
60160
60179
|
if (parsed.ok) {
|
|
@@ -60185,7 +60204,7 @@ const postBacklogClearRoute = HttpRouter.add("POST", "/api/backlog/sequence/clea
|
|
|
60185
60204
|
if (authError) return authError;
|
|
60186
60205
|
return yield* Effect.try({
|
|
60187
60206
|
try: () => {
|
|
60188
|
-
const seqPath = join
|
|
60207
|
+
const seqPath = join(process.cwd(), ".pan", "backlog", "sequence.md");
|
|
60189
60208
|
if (existsSync$1(seqPath)) {
|
|
60190
60209
|
const parsed = parseSequenceMd(readFileSync$1(seqPath, "utf-8"));
|
|
60191
60210
|
if (parsed.ok) clearBacklogSequence(parsed.doc.project);
|
|
@@ -60204,7 +60223,7 @@ const getSequencerStatusRoute = HttpRouter.add("GET", "/api/backlog/sequencer-st
|
|
|
60204
60223
|
const projectRoot = process.cwd();
|
|
60205
60224
|
const { running, startedAt } = getSequencerRunStatus(projectRoot);
|
|
60206
60225
|
let total = 0;
|
|
60207
|
-
const manifestPath = join
|
|
60226
|
+
const manifestPath = join(projectRoot, ".pan", "backlog", "manifest.json");
|
|
60208
60227
|
if (existsSync$1(manifestPath)) try {
|
|
60209
60228
|
const m = JSON.parse(readFileSync$1(manifestPath, "utf-8"));
|
|
60210
60229
|
const arr = Array.isArray(m) ? m : m?.issues ?? m?.nodes ?? [];
|
|
@@ -60271,8 +60290,8 @@ const listDirsRoute = HttpRouter.add("GET", "/api/fs/list-dirs", httpHandler(Eff
|
|
|
60271
60290
|
} catch {
|
|
60272
60291
|
canonicalHome = home;
|
|
60273
60292
|
}
|
|
60274
|
-
const isWithinHome = (p) => p === canonicalHome || p.startsWith(canonicalHome.endsWith(sep
|
|
60275
|
-
const rawResolved = rawPath ? resolve
|
|
60293
|
+
const isWithinHome = (p) => p === canonicalHome || p.startsWith(canonicalHome.endsWith(sep) ? canonicalHome : `${canonicalHome}${sep}`);
|
|
60294
|
+
const rawResolved = rawPath ? resolve(normalize(rawPath)) : home;
|
|
60276
60295
|
let target;
|
|
60277
60296
|
try {
|
|
60278
60297
|
target = await realpath(rawResolved);
|
|
@@ -60280,10 +60299,10 @@ const listDirsRoute = HttpRouter.add("GET", "/api/fs/list-dirs", httpHandler(Eff
|
|
|
60280
60299
|
return jsonResponse({ error: "Path does not exist" }, { status: 400 });
|
|
60281
60300
|
}
|
|
60282
60301
|
if (!isWithinHome(target)) return jsonResponse({ error: "Path is outside home directory" }, { status: 400 });
|
|
60283
|
-
const parent = target === canonicalHome ? null : resolve
|
|
60302
|
+
const parent = target === canonicalHome ? null : resolve(target, "..");
|
|
60284
60303
|
const entries = (await readdir(target, { withFileTypes: true })).filter((d) => d.isDirectory()).sort((a, b) => a.name.localeCompare(b.name)).map((d) => ({
|
|
60285
60304
|
name: d.name,
|
|
60286
|
-
path: resolve
|
|
60305
|
+
path: resolve(target, d.name)
|
|
60287
60306
|
}));
|
|
60288
60307
|
return jsonResponse({
|
|
60289
60308
|
path: target,
|
|
@@ -61077,9 +61096,9 @@ async function pollOnce(state) {
|
|
|
61077
61096
|
const { id: agentId } = agent;
|
|
61078
61097
|
let stdout;
|
|
61079
61098
|
try {
|
|
61080
|
-
const remoteState = await readFile(join
|
|
61099
|
+
const remoteState = await readFile(join(homedir$1(), ".overdeck", "agents", agentId, "remote-state.json"), "utf-8").then((text) => JSON.parse(text)).catch(() => null);
|
|
61081
61100
|
if (remoteState?.location === "remote" && remoteState?.vmName) {
|
|
61082
|
-
const { getRemoteAgentOutput } = await import("./remote-agents-
|
|
61101
|
+
const { getRemoteAgentOutput } = await import("./remote-agents-UHoi4oGr.js");
|
|
61083
61102
|
stdout = await getRemoteAgentOutput(agentId, remoteState.vmName, 50);
|
|
61084
61103
|
} else stdout = await Effect.runPromise(capturePane(agentId, 50));
|
|
61085
61104
|
} catch {
|
|
@@ -61194,7 +61213,7 @@ async function captureCorpseDiagnostics(tmuxSession) {
|
|
|
61194
61213
|
if (status) parts.push(`exitStatus=${status}`);
|
|
61195
61214
|
} catch {}
|
|
61196
61215
|
try {
|
|
61197
|
-
const logPath = join(getOverdeckHome(), "agents", tmuxSession, "output.log");
|
|
61216
|
+
const logPath = join$1(getOverdeckHome(), "agents", tmuxSession, "output.log");
|
|
61198
61217
|
if (existsSync(logPath)) {
|
|
61199
61218
|
const lines = (await tailFile(logPath, 1500)).trim().split("\n").slice(-8).join("\n");
|
|
61200
61219
|
if (lines) parts.push(`output.log tail:\n${lines}`);
|
|
@@ -61276,7 +61295,7 @@ async function backfillOrphanedSpecialistConversations(aliveSessions) {
|
|
|
61276
61295
|
if (!sessionName.startsWith("agent-")) continue;
|
|
61277
61296
|
if (NON_AGENT_PREFIXES.some((p) => sessionName.startsWith(p))) continue;
|
|
61278
61297
|
if (getConversationByName(sessionName)) continue;
|
|
61279
|
-
const statePath = join(homedir(), ".overdeck", "agents", sessionName, "state.json");
|
|
61298
|
+
const statePath = join$1(homedir(), ".overdeck", "agents", sessionName, "state.json");
|
|
61280
61299
|
if (!existsSync(statePath)) continue;
|
|
61281
61300
|
let state;
|
|
61282
61301
|
try {
|
|
@@ -61346,7 +61365,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
|
|
|
61346
61365
|
cwdGroups.set(conv.cwd, list);
|
|
61347
61366
|
}
|
|
61348
61367
|
for (const [cwd, convs] of cwdGroups) {
|
|
61349
|
-
const projectDir = join(homedir(), ".claude", "projects", encodeClaudeProjectDir(cwd));
|
|
61368
|
+
const projectDir = join$1(homedir(), ".claude", "projects", encodeClaudeProjectDir(cwd));
|
|
61350
61369
|
let entries;
|
|
61351
61370
|
try {
|
|
61352
61371
|
entries = await readdir$1(projectDir);
|
|
@@ -61358,7 +61377,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
|
|
|
61358
61377
|
for (const filename of entries) {
|
|
61359
61378
|
if (!filename.endsWith(".jsonl")) continue;
|
|
61360
61379
|
const sessionId = filename.slice(0, -6);
|
|
61361
|
-
const jsonlPath = join(projectDir, filename);
|
|
61380
|
+
const jsonlPath = join$1(projectDir, filename);
|
|
61362
61381
|
if (notOrphanJsonlPaths.has(jsonlPath)) continue;
|
|
61363
61382
|
if (getConversationByClaudeSessionId(sessionId)) continue;
|
|
61364
61383
|
const { clearTs: firstClearTs, definitive } = await readFirstClearTimestamp(jsonlPath);
|
|
@@ -61371,7 +61390,7 @@ async function detectOrphanedClaudeCodeSessions(activeConvs) {
|
|
|
61371
61390
|
for (const candidate of convs) {
|
|
61372
61391
|
if (!candidate.claudeSessionId) continue;
|
|
61373
61392
|
if (candidate.claudeSessionId === sessionId) continue;
|
|
61374
|
-
const parentJsonl = join(projectDir, `${candidate.claudeSessionId}.jsonl`);
|
|
61393
|
+
const parentJsonl = join$1(projectDir, `${candidate.claudeSessionId}.jsonl`);
|
|
61375
61394
|
let mtimeMs;
|
|
61376
61395
|
try {
|
|
61377
61396
|
mtimeMs = (await stat$2(parentJsonl)).mtimeMs;
|
|
@@ -61485,7 +61504,7 @@ async function readFirstClearTimestamp(jsonlPath) {
|
|
|
61485
61504
|
* worktree).
|
|
61486
61505
|
*/
|
|
61487
61506
|
async function findClaudeSessionUuid(workspaceCwd, startedAt) {
|
|
61488
|
-
const projectDir = join(homedir(), ".claude", "projects", encodeClaudeProjectDir(workspaceCwd));
|
|
61507
|
+
const projectDir = join$1(homedir(), ".claude", "projects", encodeClaudeProjectDir(workspaceCwd));
|
|
61489
61508
|
let entries;
|
|
61490
61509
|
try {
|
|
61491
61510
|
entries = await readdir$1(projectDir);
|
|
@@ -61498,7 +61517,7 @@ async function findClaudeSessionUuid(workspaceCwd, startedAt) {
|
|
|
61498
61517
|
const startedMs = startedAt ? new Date(startedAt).getTime() : NaN;
|
|
61499
61518
|
let best = null;
|
|
61500
61519
|
for (const filename of candidates) try {
|
|
61501
|
-
const st = await stat$2(join(projectDir, filename));
|
|
61520
|
+
const st = await stat$2(join$1(projectDir, filename));
|
|
61502
61521
|
const score = Number.isFinite(startedMs) ? Math.abs(st.mtimeMs - startedMs) : -st.mtimeMs;
|
|
61503
61522
|
if (best === null || score < best.score) best = {
|
|
61504
61523
|
uuid: filename.replace(/\.jsonl$/, ""),
|
|
@@ -61541,7 +61560,7 @@ function isProcessAlive(pid) {
|
|
|
61541
61560
|
}
|
|
61542
61561
|
}
|
|
61543
61562
|
async function removeStaleRestartEventsLock(lockPath) {
|
|
61544
|
-
const pidFile = join
|
|
61563
|
+
const pidFile = join(lockPath, "pid");
|
|
61545
61564
|
try {
|
|
61546
61565
|
const pid = parseInt(await readFile(pidFile, "utf8"), 10);
|
|
61547
61566
|
if (Number.isFinite(pid) && isProcessAlive(pid)) return false;
|
|
@@ -61560,7 +61579,7 @@ async function acquireRestartEventsLock() {
|
|
|
61560
61579
|
const lockPath = restartEventsLockPath();
|
|
61561
61580
|
while (true) try {
|
|
61562
61581
|
await mkdir(lockPath);
|
|
61563
|
-
await writeFile(join
|
|
61582
|
+
await writeFile(join(lockPath, "pid"), String(process.pid), "utf8");
|
|
61564
61583
|
return true;
|
|
61565
61584
|
} catch (error) {
|
|
61566
61585
|
if (!isErrnoException(error) || error.code !== "EEXIST") return false;
|
|
@@ -61577,10 +61596,10 @@ async function releaseRestartEventsLock() {
|
|
|
61577
61596
|
} catch {}
|
|
61578
61597
|
}
|
|
61579
61598
|
function restartStatusPath() {
|
|
61580
|
-
return join
|
|
61599
|
+
return join(getOverdeckHome(), "restart-status.json");
|
|
61581
61600
|
}
|
|
61582
61601
|
function restartEventsPath() {
|
|
61583
|
-
return join
|
|
61602
|
+
return join(getOverdeckHome(), "restart-events.jsonl");
|
|
61584
61603
|
}
|
|
61585
61604
|
function isErrnoException(error) {
|
|
61586
61605
|
return error instanceof Error && "code" in error;
|
|
@@ -61589,7 +61608,7 @@ async function appendRestartEvent(entry) {
|
|
|
61589
61608
|
if (!await acquireRestartEventsLock()) return;
|
|
61590
61609
|
try {
|
|
61591
61610
|
const path = restartEventsPath();
|
|
61592
|
-
await mkdir(dirname
|
|
61611
|
+
await mkdir(dirname(path), { recursive: true });
|
|
61593
61612
|
await appendFile(path, `${JSON.stringify(entry)}\n`, "utf8");
|
|
61594
61613
|
} catch {} finally {
|
|
61595
61614
|
await releaseRestartEventsLock();
|
|
@@ -61616,7 +61635,7 @@ async function compactRestartEvents() {
|
|
|
61616
61635
|
}
|
|
61617
61636
|
async function writeRestartStatusPromise(entry) {
|
|
61618
61637
|
const path = restartStatusPath();
|
|
61619
|
-
await mkdir(dirname
|
|
61638
|
+
await mkdir(dirname(path), { recursive: true });
|
|
61620
61639
|
const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
61621
61640
|
await writeFile(tmp, `${JSON.stringify(entry, null, 2)}\n`, "utf8");
|
|
61622
61641
|
await rename(tmp, path);
|
|
@@ -62256,14 +62275,14 @@ function stopTtsSummarizer() {
|
|
|
62256
62275
|
* the "restarting" banner.
|
|
62257
62276
|
*/
|
|
62258
62277
|
init_activity_logger();
|
|
62259
|
-
const PENDING_FILE = join(homedir(), ".overdeck", "pending-post-merge.json");
|
|
62260
|
-
const RESTART_MARKER = join(homedir(), ".overdeck", "dashboard-restarting.json");
|
|
62278
|
+
const PENDING_FILE = join$1(homedir(), ".overdeck", "pending-post-merge.json");
|
|
62279
|
+
const RESTART_MARKER = join$1(homedir(), ".overdeck", "dashboard-restarting.json");
|
|
62261
62280
|
/**
|
|
62262
62281
|
* Default lifecycle runner: dynamically imports merge-agent so the fresh process
|
|
62263
62282
|
* loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
|
|
62264
62283
|
*/
|
|
62265
62284
|
async function defaultLifecycleRunner(pending) {
|
|
62266
|
-
const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-
|
|
62285
|
+
const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-CfohxFWM.js");
|
|
62267
62286
|
await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
|
|
62268
62287
|
if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
|
|
62269
62288
|
}
|
|
@@ -62498,7 +62517,7 @@ async function directoryContainsJsonl(dirPath) {
|
|
|
62498
62517
|
return false;
|
|
62499
62518
|
}
|
|
62500
62519
|
for (const entry of entries) {
|
|
62501
|
-
const entryPath = join(dirPath, entry.name);
|
|
62520
|
+
const entryPath = join$1(dirPath, entry.name);
|
|
62502
62521
|
if (entry.isFile() && entry.name.endsWith(".jsonl")) return true;
|
|
62503
62522
|
if (entry.isDirectory() && await directoryContainsJsonl(entryPath)) return true;
|
|
62504
62523
|
}
|
|
@@ -62516,7 +62535,7 @@ async function findClosedIssueAgentDirsPromise(options) {
|
|
|
62516
62535
|
const candidates = [];
|
|
62517
62536
|
for (const entry of entries) {
|
|
62518
62537
|
if (!entry.isDirectory()) continue;
|
|
62519
|
-
const dirPath = join(agentsDir, entry.name);
|
|
62538
|
+
const dirPath = join$1(agentsDir, entry.name);
|
|
62520
62539
|
const issueId = await readAgentStateIssueId(dirPath) ?? getAgentDirectoryIssueId(entry.name);
|
|
62521
62540
|
if (!issueId) continue;
|
|
62522
62541
|
const closedAtMs = closedIssueTimes.get(issueId);
|
|
@@ -62584,7 +62603,7 @@ function failureReason(result) {
|
|
|
62584
62603
|
return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
|
|
62585
62604
|
}
|
|
62586
62605
|
async function defaultMergeIssue(issueId) {
|
|
62587
|
-
const { triggerMerge } = await import("./merge-ops-
|
|
62606
|
+
const { triggerMerge } = await import("./merge-ops-Czke6UAp.js");
|
|
62588
62607
|
return triggerMerge(issueId);
|
|
62589
62608
|
}
|
|
62590
62609
|
function defaultAnnounceFailure(issueId, reason) {
|
|
@@ -62791,7 +62810,7 @@ function createOverdeckDatabase(options = {}) {
|
|
|
62791
62810
|
if (!options.force) throw new Error(`Refusing to overwrite existing overdeck.db at ${dbPath}; pass --force to recreate it.`);
|
|
62792
62811
|
rmSync$1(dbPath, { force: true });
|
|
62793
62812
|
}
|
|
62794
|
-
mkdirSync$1(dirname
|
|
62813
|
+
mkdirSync$1(dirname(dbPath), { recursive: true });
|
|
62795
62814
|
const db = openDatabase(dbPath);
|
|
62796
62815
|
try {
|
|
62797
62816
|
applyMigration(db, migrationPath);
|
|
@@ -62808,12 +62827,6 @@ function createOverdeckDatabase(options = {}) {
|
|
|
62808
62827
|
}
|
|
62809
62828
|
//#endregion
|
|
62810
62829
|
//#region main.ts
|
|
62811
|
-
/**
|
|
62812
|
-
* Dashboard server entry point — dual-runtime (Bun dev, Node prod) (PAN-428 B5)
|
|
62813
|
-
*
|
|
62814
|
-
* Usage (dev): bun run src/dashboard/server/main.ts
|
|
62815
|
-
* Usage (prod): node dist/dashboard/server.js
|
|
62816
|
-
*/
|
|
62817
62830
|
init_issue_service_singleton();
|
|
62818
62831
|
init_tracker_config();
|
|
62819
62832
|
init_internal_token();
|
|
@@ -63221,7 +63234,7 @@ reconcileStaleGitHubBlockers().then((n) => {
|
|
|
63221
63234
|
}
|
|
63222
63235
|
}).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
|
|
63223
63236
|
try {
|
|
63224
|
-
const { resetProcessingToQueued } = await import("./merge-sync-
|
|
63237
|
+
const { resetProcessingToQueued } = await import("./merge-sync-bOOtfeXR.js");
|
|
63225
63238
|
const resetCount = resetProcessingToQueued();
|
|
63226
63239
|
if (resetCount > 0) {
|
|
63227
63240
|
console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);
|