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