@overdeck/desktop 0.45.22 → 0.45.23
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/package.json +1 -1
- package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DOA0KgXx.js} +5 -5
- package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BBu6DSNm.js} +6 -6
- package/server/{agent-gc-Dj2gncak.js → agent-gc-BV1q_2EV.js} +4 -4
- package/server/agent-state-Bg0lhqwj.js +3 -0
- package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-CnzFKSAQ.js} +1 -1
- package/server/{agent-state-service-DistflNn.js → agent-state-service-HoK8U4jW.js} +5 -5
- package/server/{agents-DXdHmRTC.js → agents-B4Bjbkfv.js} +4 -4
- package/server/agents-FlIgQ3ql.js +3 -0
- package/server/{archive-planning-BvDuWNMo.js → archive-planning-DYrYojxl.js} +30 -6
- package/server/{archive-planning-Cp_DC1j-.js → archive-planning-zkJb3BeM.js} +1 -1
- package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-C-xy7Z5v.js} +2 -2
- package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-GtG71X8H.js} +3 -3
- package/server/{behavior-CGj16clS.js → behavior-B_-4EKF3.js} +2 -2
- package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-DWdW7vUm.js} +2 -2
- package/server/{build-info-NU3KbXYw.js → build-info-BT096lEl.js} +3 -3
- package/server/{build-info-BRpqQvNd.js → build-info-DgTqZkL5.js} +1 -1
- package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-B7Bt29J0.js} +1 -1
- package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-DDqcGyu8.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-BJum14fs.js → checkpoints-C-AXLfYT.js} +2 -2
- package/server/{checkpoints-B5jFNi2G.js → checkpoints-CpgCjAlN.js} +1 -1
- package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-C8wdRnN1.js} +1 -1
- package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-but-_qGY.js} +2 -2
- package/server/{claude-permissions-nSFKH78M.js → claude-permissions-H_5wHQZQ.js} +2 -2
- package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-BTENVmYf.js} +1 -1
- package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CbSz0Dvb.js} +2 -2
- package/server/cli-BsVIHwzC.js +3 -0
- package/server/{cli-CbKNkFE5.js → cli-vBeXbPrq.js} +9 -9
- package/server/{cliproxy-Brf_5MuG.js → cliproxy-Bgb2XCqi.js} +2 -2
- package/server/{cliproxy-bONZDBbC.js → cliproxy-DW0V86F8.js} +1 -1
- package/server/{close-issue-CxReRxIc.js → close-issue-Dn_4c4G8.js} +5 -5
- package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CWpY2uBw.js} +1 -1
- package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-hANY_ehE.js} +9 -9
- package/server/codex-Dg7Is5yb.js +3 -0
- package/server/{codex-CbmztVcc.js → codex-TmSi-yTv.js} +27 -8
- package/server/{codex-parser-jl8AeAmB.js → codex-parser-C4gSH-IR.js} +2 -2
- package/server/{config-q4Gvd8dq.js → config-CCvjQf27.js} +2 -2
- package/server/{config-BJKocXKd.js → config-DUIhMN_T.js} +1 -1
- package/server/{config-DeTsoZdR.js → config-DjLOdbgT.js} +2 -2
- package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DvyMuOle.js} +55 -186
- package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BSJkNTdp.js} +1 -1
- package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-CmrYpa47.js} +3 -3
- package/server/{context-layers-DlQKkHH2.js → context-layers-B3Nt58jl.js} +2 -2
- package/server/{context-layers-15gDOk20.js → context-layers-ZYFcWiyc.js} +3 -3
- package/server/{control-settings-D_odMIaC.js → control-settings-aP1ANIlI.js} +4 -4
- package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CNbTLB86.js} +8 -8
- package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-DiG5zWQq.js} +1 -1
- package/server/{conversation-service-C3avRVEr.js → conversation-service-Du-MTNpJ.js} +6 -6
- package/server/{conversation-service-Dq33SYEj.js → conversation-service-Up7FEzIC.js} +1 -1
- package/server/{conversations-H9if0bCQ.js → conversations-6mPANqvL.js} +1 -1
- package/server/{conversations-bYpM9-kZ.js → conversations-DbOs1e9Q.js} +4 -4
- package/server/{cost-wH46-WsJ.js → cost-CW4WSe72.js} +3 -3
- package/server/{cost-Codk1pc2.js → cost-Ca0YTWDw.js} +18 -2
- package/server/{cost-sync-D_cre6WM.js → cost-sync-C0VdGme1.js} +3 -3
- package/server/{dag-CJpgf9A3.js → dag-CdOjJVDT.js} +9 -9
- package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-CT-IypG3.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-B8HbQdqU.js → deacon-DYSEJb48.js} +3 -3
- package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-Bjg8U4Y9.js} +3 -3
- package/server/{deacon-CkT_kznS.js → deacon-pRnyD5w9.js} +266 -577
- package/server/deacon-swarm-9jRLS5Ke.js +2 -0
- package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-DftYRDo8.js} +17 -17
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-Bjsho_ha.js} +136 -19
- package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-CM6W1-c6.js} +1 -1
- package/server/{deploy-window-wDf4UgHt.js → deploy-window-DeP_OIRk.js} +77 -10
- package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-BpMoHlkR.js} +2 -2
- package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-CtUgrVKW.js} +3 -3
- package/server/dist-Bd3vn0Hw.js +3 -0
- package/server/{dist-D-Ed5yVw.js → dist-DyRx4cI7.js} +1 -1
- package/server/{docker-BCZ89M9X.js → docker-BK7HIcBj.js} +2 -2
- package/server/{dod-DbJLYcHv.js → dod-BrSfUHm0.js} +1 -1
- package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-DRqaAkBR.js} +1 -1
- package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DseivYEy.js} +4 -4
- package/server/{esm-shims-dTeNdq7X.js → esm-shims-CbI3BVkl.js} +1 -1
- package/server/{event-store-CpBGsO6_.js → event-store-Cr5PQwFC.js} +1 -1
- package/server/{event-store-TnWdydfB.js → event-store-tdiY5eDZ.js} +3 -3
- package/server/{events-DSUdR-04.js → events-CC1dgUpx.js} +3 -3
- package/server/{events-Dsuv6qyB.js → events-CvvGK6LT.js} +1 -1
- package/server/{factory-BMrK4TrE.js → factory-CynerjXO.js} +50 -13
- package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-B0pmAz0a.js} +4 -4
- package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-_wUBRD3J.js} +2 -2
- package/server/{features-Bc-Bmiye.js → features-Dhxz-wLc.js} +2 -2
- package/server/{feedback-target-DZ-iAnAa.js → feedback-target-CPS15Vte.js} +7 -7
- package/server/{feedback-target-DS6NUuSs.js → feedback-target-iygZwmMc.js} +1 -1
- package/server/{feedback-writer-BXP6g75N.js → feedback-writer-C9b6ccN1.js} +6 -5
- package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-qmiMbqTZ.js} +1 -1
- package/server/{flywheel-Ctr5uuvo.js → flywheel-DMCUzDWg.js} +1 -1
- package/server/{flywheel-COR0mbRI.js → flywheel-DSSpWmqF.js} +13 -13
- package/server/{flywheel-6WHU4O7A.js → flywheel-DcBkQvgE.js} +14 -14
- package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-C-6zRLvM.js} +1 -1
- package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-DxbQKE1d.js} +8 -8
- package/server/forge-B-ZWyTRm.js +2 -0
- package/server/{forge-B1S_KZv4.js → forge-Ch9gCFod.js} +2 -2
- package/server/{from-DpwQ-sc3.js → from-CJ_aH5jD.js} +1 -1
- package/server/{fts-db-DmAcuCkV.js → fts-db-CKgg0VKg.js} +2 -2
- package/server/{fts-operations-7d_RkmWp.js → fts-operations-BrL_VTRr.js} +2 -2
- package/server/{git-utils-Cc3FHDKd.js → git-utils-BVa07a4a.js} +2 -2
- package/server/{git-utils-CsKGnzFA.js → git-utils-Dry_Ka_D.js} +1 -1
- package/server/{github-app-CDPtGF7J.js → github-app-CMBdIFBQ.js} +11 -3
- package/server/{github-app-CU14oYzP.js → github-app-CPfoFAdV.js} +1 -1
- package/server/{github-client-XjTJbBm7.js → github-client--XVlDpwM.js} +2 -2
- package/server/{github-client-CwBZZ3t7.js → github-client-B4QsdE-X.js} +1 -1
- package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-BRbDW-qk.js} +2 -2
- package/server/{harness-binary-B2CTcD84.js → harness-binary-CVio2m-u.js} +1 -1
- package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-qHJBhy3Z.js} +4 -4
- package/server/{health-events-DREeevle.js → health-events-C9B8y1Hm.js} +2 -2
- package/server/{health-events-C1whmd58.js → health-events-CpfvuVmm.js} +1 -1
- package/server/{hooks-yxRsjk-z.js → hooks-DUXw8A0-.js} +2 -2
- package/server/{hooks-B-HItBiS.js → hooks-ltecuFqZ.js} +1 -1
- package/server/{hume-Dz_OymXE.js → hume-BEq0bUDg.js} +2 -2
- package/server/hume-B_DbflNM.js +3 -0
- package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-D7w9t3fE.js} +1 -1
- package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-w1ISSlhs.js} +2 -2
- package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-aQ1IxeI3.js} +2 -2
- package/server/{infra-D4iNWMA5.js → infra-CzaSOgul.js} +4 -4
- package/server/{injection-D7T75Pye.js → injection-DZ0PfYa4.js} +7 -7
- package/server/{injection-BVNa4MQW.js → injection-oNZeoDhL.js} +1 -1
- package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-DJKLWcVT.js} +12 -12
- package/server/inspect-agent-ch-F-5Ci.js +2 -0
- package/server/{internal-token-CXsfxslp.js → internal-token-Bb4XeV2x.js} +2 -2
- package/server/{internal-token-C9DdEOKY.js → internal-token-DXdfprGr.js} +1 -1
- package/server/{io-DQR9PMgS.js → io-B3_AHDfr.js} +160 -184
- package/server/{issue-closed-DtmJM0D0.js → issue-closed-zhdvQicO.js} +7 -7
- package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-CreaCkjW.js} +22 -22
- package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-Dy4vd0Oa.js} +1 -1
- package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-B5ushCvE.js} +8 -8
- package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-DabvBWUp.js} +1 -1
- package/server/{issues-pDW9VUNz.js → issues-B6ToV6x1.js} +2 -2
- package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-Dhflo1SH.js} +3 -3
- package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-BKPJm4Hv.js} +3 -3
- package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-DdWbHEBu.js} +4 -4
- package/server/{launcher-generator-COgR2By1.js → launcher-generator-CHVm7bGT.js} +10 -9
- package/server/{layers-Cp1To4L8.js → layers-DzxSTGNA.js} +2 -2
- package/server/lifecycle-DfeyBDwA.js +121 -0
- package/server/lifecycle-io-Bsnr2K4F.js +3 -0
- package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-D8iNBcux.js} +37 -37
- package/server/{lifecycle-CtPDcZ9u.js → lifecycle-sycO16hj.js} +6 -6
- package/server/{linear-client-DsFkIxee.js → linear-client-D4zqMnX7.js} +2 -2
- package/server/{linear-client-YwZMDIwQ.js → linear-client-DqhDQO9k.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-C1t-bspg.js → merge-C_ZEhbqI.js} +3 -3
- package/server/{merge-BwsyNRJV.js → merge-DK23JEdS.js} +1 -1
- package/server/{merge-agent-B-SnXOoc.js → merge-agent-BQM3a8z5.js} +1 -1
- package/server/{merge-agent-DDiIjzk-.js → merge-agent-XrB80vfT.js} +28 -28
- package/server/{merge-batch-Byt-QnEl.js → merge-batch-Bwoyr8Je.js} +1 -1
- package/server/{merge-blockers-BYjeXrVN.js → merge-blockers-BsFjGrQ8.js} +2 -2
- package/server/merge-ops-DlB1IM0Y.js +2 -0
- package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-C1KIVr0s.js} +2 -2
- package/server/{merge-set-DiISXcC-.js → merge-set-DLz0MkGT.js} +3 -3
- package/server/{merge-set-6LEglm6o.js → merge-set-DnSYdBEp.js} +1 -1
- package/server/{merge-sync-Do8_q32h.js → merge-sync-DZ9dojJn.js} +2 -2
- package/server/{merge-sync-B95_4in_.js → merge-sync-SSv3E-pl.js} +1 -1
- package/server/{merge-train-CKana8EH.js → merge-train-DxDfBTjr.js} +3 -3
- package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-CyYQUksx.js} +4 -4
- package/server/{merge-verification-CqnUzGEK.js → merge-verification-CSizH3HY.js} +4 -4
- package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-Dt8YPN5S.js} +2 -2
- package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Cx3K0hHi.js} +11 -8
- package/server/node_modules/.package-lock.json +1 -1
- package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-BTkDrl4R.js} +1 -1
- package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-neK8dHQk.js} +15 -13
- package/server/package-lock.json +2 -2
- package/server/package.json +1 -1
- package/server/{pan-dir-DOcf6ug3.js → pan-dir-DeVUgwA7.js} +78 -58
- package/server/{paths-DooHpt9p.js → paths-_zEts6wc.js} +2 -2
- package/server/{pickup-CaskQ7j6.js → pickup-Dd0Znxxy.js} +1 -1
- package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-0HaEGDlH.js} +186 -67
- package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-6iCJplFZ.js} +1 -1
- package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-D0ykk59O.js} +2 -2
- package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-2sK1apsO.js} +2 -2
- package/server/projects-9SkRpES9.js +3 -0
- package/server/{prompts-EvhMeeHG.js → prompts-Dp4Tpk39.js} +2 -2
- package/server/{providers-DNSQqy2V.js → providers-DKkBXhxU.js} +1 -1
- package/server/{providers-BDDPULlp.js → providers-DV7ec8l7.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-CltymLRg.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-D2f6pjgA.js} +1 -1
- package/server/public/assets/{dist-Bio7THQU.js → dist-BWR4qFiV.js} +1 -1
- package/server/public/assets/{dist-DukGS2YZ.js → dist-DEmlBBNQ.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-DnfiViPK.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-B8Wrmj9H.js} +1 -1
- package/server/public/assets/index-CUr1xv8w.css +1 -0
- package/server/public/assets/{index-Bwejq-5s.js → index-CsSuZQBI.js} +145 -144
- package/server/public/assets/{linear-qUWmMZ-c.js → linear-C9zFQpkX.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-lR8H7Yjd.js} +1 -1
- package/server/public/assets/{prod-C8VtLuWC.js → prod-B1jCQihw.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-CVQ2guem.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-eD1RB4gm.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-ChEC6dQn.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-By_BteaL.js → pull-requests--Ib2jTgy.js} +1 -1
- package/server/{pull-requests-8z2N1UOV.js → pull-requests-CXIhdCYD.js} +13 -11
- package/server/{queries-ZABd5aXP.js → queries-6d7Cdtm7.js} +693 -104
- package/server/{rally-i_goYmiA.js → rally-B708-nZn.js} +3 -3
- package/server/{rally-api-DqKqIMNR.js → rally-api-nY0ZANw3.js} +2 -2
- package/server/{rally-api-xHazRk0d.js → rally-api-yjQ0TfHd.js} +1 -1
- package/server/{rally-client-COYz1vYR.js → rally-client-B1EJhfV0.js} +4 -4
- package/server/{rally-client-CGWEHaPd.js → rally-client-CULK2XAY.js} +1 -1
- package/server/rally-njs_mJrt.js +3 -0
- package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-MWnqdLCJ.js} +1 -1
- package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-N3BTkmX_.js} +1 -1
- package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-Dp4eLkt4.js} +6 -6
- package/server/{rebuild-stack-CKjJAI8L.js → rebuild-stack-kA7XngID.js} +1 -1
- package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-uWbZfjms.js} +6 -6
- package/server/record-t6V-3Dcj.js +3 -0
- package/server/{record-update-D3N6WMFR.js → record-update-DACtKh6_.js} +1 -1
- package/server/record-update-Dq0t2uBG.js +310 -0
- package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BJtIQuag.js} +2 -2
- package/server/{release-engine-DMINVN8S.js → release-engine-DZpmGGzb.js} +5 -5
- package/server/{release-set-DeUSOEHy.js → release-set-hnXd_kga.js} +3 -3
- package/server/{remote-Dr5kGYSZ.js → remote-4tiENDaI.js} +3 -3
- package/server/{remote-b-c5bOce.js → remote-Br-ZWVIP.js} +3 -3
- package/server/{remote-agents-D6O_zETW.js → remote-agents-CRCg1L4H.js} +1 -1
- package/server/{remote-agents-Ct_WOyke.js → remote-agents-nmty1mLu.js} +6 -6
- package/server/{remote-completion-Dca3hAaa.js → remote-completion-BbWNd10K.js} +12 -12
- package/server/resume-CcKqnTvE.js +3 -0
- package/server/{review-agent-CCum8sGe.js → review-agent-DJRO8EG8.js} +1 -1
- package/server/{review-agent-CThvgK2r.js → review-agent-sKkE1FEL.js} +22 -22
- package/server/{review-artifacts-CXywD0F2.js → review-artifacts-BLbSC4ke.js} +5 -5
- package/server/{review-context-OYfKUprb.js → review-context-BgX3lcCx.js} +8 -8
- package/server/{review-status-DFRjDFef.js → review-status-A7quS5KJ.js} +54 -21
- package/server/review-status-C6n6-9f_.js +3 -0
- package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-tbOn_A_u.js} +3 -3
- package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BhSQ0d0l.js} +2 -2
- package/server/{review-status-sync-D60PJWNL.js → review-status-sync-To3-iS-N.js} +1 -1
- package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-C1Kg8n7t.js} +1 -1
- package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CTRNtzXO.js} +6 -6
- package/server/{rollup-CZ02qgxk.js → rollup-B53Y81xK.js} +1 -1
- package/server/{rollup-SyuF09e4.js → rollup-WA0VD-Rr.js} +8 -8
- package/server/{scanner-Br0Z5S6R.js → scanner-D2743cp8.js} +11 -7
- package/server/{sequence-io-fxU0DlwW.js → sequence-io-Cg0zYj_E.js} +4 -4
- package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-BGY8gjg-.js} +5 -5
- package/server/server.js +941 -752
- package/server/{service-Bagb90KZ.js → service-DCpB_SGd.js} +53 -53
- package/server/{session-fork-BqQxd-V6.js → session-fork-BQ8_6H32.js} +2 -2
- package/server/{session-history-XdS0JKp3.js → session-history-CVZDpS3c.js} +4 -4
- package/server/{settings-BNbocWOg.js → settings-BZ5m1UCl.js} +3 -3
- package/server/settings-D0OSwos5.js +2 -0
- package/server/{settings-uLc6DEYI.js → settings-ylxwqwQG.js} +2 -2
- package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BlxG6Xye.js} +2 -2
- package/server/{shadow-state-CbvsN3qG.js → shadow-state-C2_epgx2.js} +1 -1
- package/server/{shadow-state-C_NkP-sa.js → shadow-state-Dh-HzF2J.js} +2 -2
- package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-4bvjn9b3.js} +2 -2
- package/server/{ship-log-__QtAFXG.js → ship-log-ClSMIzZX.js} +1 -1
- package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CHIxLr_d.js} +1 -1
- package/server/{smart-compaction-CLZOWin1.js → smart-compaction-r4pHQBIr.js} +7 -7
- package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DWAorh2B.js} +22 -21
- package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-KC_UduxD.js} +1 -1
- package/server/{specialist-completion-CqmduO92.js → specialist-completion-BXhav38U.js} +1 -1
- package/server/{specialist-context-CJ-QjFR-.js → specialist-context-DtrYvGJ-.js} +5 -5
- package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-C45ouoZ6.js} +2 -2
- package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-DJ3RzKxW.js} +3 -3
- package/server/{specialists-D0gGXMZx.js → specialists-D5fRZXmN.js} +1 -1
- package/server/specialists-DVj0hvaL.js +3 -0
- package/server/{specialists-CwZHb5cb.js → specialists-DyFeedjn.js} +66 -76
- package/server/{specialists-Bg9v4z3F.js → specialists-JVO00bs7.js} +340 -214
- package/server/specs-nN45DG2X.js +3 -0
- package/server/{src-BMMoA_ba.js → src-CG9mCkP6.js} +6 -6
- package/server/{src-Bqdtd6po.js → src-CMTQGyCK.js} +3 -3
- package/server/{src-k039WVYY.js → src-U7_kTPEE.js} +2 -1
- package/server/{stack-health-Bd06frFn.js → stack-health-Df0YEZKa.js} +1 -1
- package/server/{stack-health-C-ifC7b0.js → stack-health-puygdaMd.js} +2 -2
- package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-BbFwCTb0.js} +4 -4
- package/server/{staleness-BID1BKdr.js → staleness-Bpy41ngS.js} +15 -3
- package/server/{staleness-_Tr-GwdA.js → staleness-Cbl_w4Bw.js} +1 -1
- package/server/{state-home-CONQvZR0.js → state-home-CIGjwNfJ.js} +96 -44
- package/server/{state-migrate-BeBW0KXA.js → state-migrate-Dkzaxvny.js} +12 -3
- package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-CzEov_fq.js} +26 -22
- package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-sY_MHHgQ.js} +1 -1
- package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-BH66lhm7.js} +3 -3
- package/server/{summary-fork-agEMsPSo.js → summary-fork-D8bXjCr7.js} +2 -2
- package/server/{summary-fork-bX6ax6X7.js → summary-fork-DHhJIsAL.js} +8 -8
- package/server/{supervisor-Ctt4eRYz.js → supervisor-BO-Zk_h-.js} +3 -3
- package/server/supervisor-BPy-o1A8.js +2 -0
- package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-CQ_fwUWF.js} +4 -4
- package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-Bza0ffAh.js} +2 -2
- package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-CEgauF4U.js} +15 -15
- package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-DXDt0Xa-.js} +7 -7
- package/server/{test-verdict-Cp5tljlJ.js → test-verdict-CmUBK5cT.js} +1 -1
- package/server/{test-verdict-D_-sXIz_.js → test-verdict-DFjjIHR5.js} +1 -1
- package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-BDtLOIlO.js} +2 -2
- package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-DL566HbH.js} +1 -1
- package/server/tmux-DoThH6aj.js +3 -0
- package/server/{tmux-L5LgvGLp.js → tmux-ftABRAmc.js} +76 -44
- package/server/{token-BkQLy4yS.js → token-CsOhvw42.js} +2 -2
- package/server/{token-util-DI8sGlmF.js → token-util-CTmczIfW.js} +1 -1
- package/server/token-util-DrHg8abn.js +3 -0
- package/server/{tracker-config-DdT-nUAM.js → tracker-config-B4itFzDo.js} +2 -2
- package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-BePq_oj-.js} +1 -1
- package/server/{tracker-utils-CawsPSS2.js → tracker-utils-tnxxqROg.js} +2 -2
- package/server/{traefik-connect-C6mJckNs.js → traefik-connect-m73vGebA.js} +1 -1
- package/server/{tunnel-IdK1iTHx.js → tunnel-B2vxjx_b.js} +3 -3
- package/server/{tunnel-BIFl98rc.js → tunnel-Cgj-IGIl.js} +1 -1
- package/server/{types-7-GnJn0t.js → types-BBNjPcqU.js} +1 -1
- package/server/{uat-train-j0cPeMSj.js → uat-train-CuEn0t9M.js} +28 -28
- package/server/{uat-train-0Ujk8GCv.js → uat-train-cKfM-_WW.js} +1 -1
- package/server/{validation-CabEISJT.js → validation-B5JxoPUS.js} +259 -9
- package/server/{validation-DcAgXTQp.js → validation-CIi6pnI2.js} +1 -1
- package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-BcnIbigL.js} +1 -1
- package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-C-lIHfUa.js} +1 -1
- package/server/{verification-runner-FiuAZ-H2.js → verification-runner-Br0S_Ous.js} +102 -37
- package/server/{verification-runner-DlJezzef.js → verification-runner-CDj4lD4t.js} +1 -1
- package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DKpNNW5i.js} +1 -1
- package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Yb2bd3Fq.js} +13 -13
- package/server/{workflows-BZNNYkGC.js → workflows-C9WmILql.js} +39 -77
- package/server/workflows-D90rMOya.js +2 -0
- package/server/{workspace-D9ppycdg.js → workspace-BVl4rihN.js} +3 -3
- package/server/{workspace-3IC-UkAi.js → workspace-DuUdndHe.js} +1 -1
- package/server/{workspace-config-Bigl_-Lk.js → workspace-config-cEGcO6UT.js} +1 -1
- package/server/{workspace-manager-B1WOfKvB.js → workspace-manager-ZTdJAy9M.js} +1 -1
- package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-hLUv3ADC.js} +22 -15
- package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-CskwzzhL.js} +2 -2
- package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-DNpMixRq.js} +1 -1
- package/server/{workspaces-CFPcL0vl.js → workspaces-hWvy9eKs.js} +275 -109
- package/sync-sources/agents/pan-inspect-agent.md +1 -1
- package/sync-sources/agents/pan-merge-agent.md +1 -1
- package/sync-sources/agents/pan-planning-agent.md +4 -4
- package/sync-sources/agents/pan-work-agent.md +1 -1
- package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
- package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
- package/sync-sources/hooks/record-cost-event.js +363 -71
- package/sync-sources/hooks/session-start-hook +7 -0
- package/sync-sources/hooks/work-agent-stop-hook +1 -1
- package/sync-sources/rules/per-bead-durability.md +1 -1
- package/sync-sources/rules/prd-authoring.md +1 -1
- package/sync-sources/skills/feature-work/SKILL.md +1 -1
- package/sync-sources/skills/pan/SKILL.md +2 -2
- package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
- package/sync-sources/skills/pan-approve/SKILL.md +1 -1
- package/sync-sources/skills/pan-close/SKILL.md +1 -1
- package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
- package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
- package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
- package/sync-sources/skills/pan-plan/SKILL.md +6 -6
- package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
- package/sync-sources/skills/pan-recap/SKILL.md +2 -2
- package/sync-sources/skills/pan-review/SKILL.md +1 -1
- package/sync-sources/skills/pan-start/SKILL.md +3 -3
- package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/sync-sources/skills/pan-task/SKILL.md +2 -2
- package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
- package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
- package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
- package/sync-sources/skills/plan/SKILL.md +11 -11
- package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
- package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
- package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
- package/server/agent-state-Co5Sy2Fw.js +0 -3
- package/server/agents-DyHKlq1I.js +0 -3
- package/server/cli-BRORS9qY.js +0 -3
- package/server/codex-DNyiQDKW.js +0 -3
- package/server/deacon-swarm-CV54eNmU.js +0 -2
- package/server/dist-j64RzSrQ.js +0 -3
- package/server/forge-B0_opi-V.js +0 -2
- package/server/hume-BmhvfVbV.js +0 -3
- package/server/inspect-agent-Dq0z1k3H.js +0 -2
- package/server/lifecycle-io-DmY2qwCn.js +0 -3
- package/server/merge-ops-DwWCkSgo.js +0 -2
- package/server/projects-BKkwpH6q.js +0 -3
- package/server/public/assets/index-Bdc4V9ba.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
- package/server/rally-OSJXdiHK.js +0 -3
- package/server/record-rwK-nKv_.js +0 -3
- package/server/record-update-Crz74r-6.js +0 -168
- package/server/resume-wZZsWtzz.js +0 -3
- package/server/review-status-Bnh-rdkY.js +0 -3
- package/server/settings-BlUsVaUc.js +0 -2
- package/server/specialists-Dqe6_HE5.js +0 -3
- package/server/specs-BhOKBzqk.js +0 -3
- package/server/supervisor-COVHrBTg.js +0 -2
- package/server/tmux-BAvtac_u.js +0 -3
- package/server/token-util-BArZLN6w.js +0 -3
- package/server/workflows-C4mR0Reb.js +0 -2
|
@@ -1,43 +1,44 @@
|
|
|
1
1
|
import { a as __toCommonJS } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { A as canUseHarnessSync,
|
|
2
|
+
import { A as canUseHarnessSync, Br as getOverdeckHome, D as resolveTieredExecutionEnabled, H as init_providers, I as UnknownModelError, Jn as extractPrefixSync, M as init_harness_policy, Nr as encodeClaudeProjectDir, O as resolveTieredExecutionEnabledForIssue, Qt as parsePorcelainStatusPaths, T as init_tier_table, Tn as init_projects, U as piProviderForModel, Ur as packageRoot, V as getProviderForModelSync, Vr as init_paths, Wr as resolveOhmypiExtensionPath, Yn as init_issue_id, Yt as init_state_plane, Zn as parseIssueIdSync, c as isClaudeCodeChannelsEnabled, f as loadConfigSync, in as shouldCommitLegacyWorkspaceArtifacts, ir as FsError, kn as listProjectsSync, mr as init_errors, nn as init_state_read_home, t as init_config_yaml, tt as resolveModel, yn as getProjectSync, zn as resolveProjectFromIssueSync } from "./config-yaml-DvyMuOle.js";
|
|
3
3
|
import { a as init_activity_logger, n as emitActivityEntrySync } from "./activity-logger-DDlOIAML.js";
|
|
4
|
-
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-
|
|
5
|
-
import { B as
|
|
6
|
-
import { a as init_event_store, n as getEventStore } from "./event-store-
|
|
7
|
-
import { k as normalizeChannelReplyPayload, o as getHarnessBehavior, t as init_src, x as DomainEvent } from "./src-
|
|
8
|
-
import {
|
|
9
|
-
import { a as EventStoreService, c as ReadModelService, d as init_read_model, i as init_issue_lifecycle, s as init_domain_services, t as IssueLifecycle, u as getClosedIssueIdsForReadSource } from "./issue-lifecycle-
|
|
10
|
-
import { d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-
|
|
11
|
-
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-
|
|
12
|
-
import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-
|
|
13
|
-
import {
|
|
14
|
-
import { a as performHandoff, i as checkAllTriggers, s as getAgentHealth, t as getCloisterService } from "./service-
|
|
15
|
-
import { o as init_persistent_logger, s as logAgentLifecycleSync } from "./session-history-
|
|
16
|
-
import { t as init_behavior } from "./behavior-
|
|
17
|
-
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-
|
|
18
|
-
import { n as init_issue_service_singleton, r as issue_service_singleton_exports } from "./issue-service-singleton-
|
|
19
|
-
import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-
|
|
4
|
+
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CzaSOgul.js";
|
|
5
|
+
import { $ as init_child_env, B as sendKeysAsync, D as killSession, H as sessionExists, M as listSessionNames, N as listSessions, Q as buildChildEnvWithoutTmuxSync, T as isHarnessProcessAlive, U as sessionExistsSync, V as sendRawKeystroke, W as setOption, X as BLANKED_PROVIDER_ENV, g as findManagedServerPidSync, i as capturePane, m as exactPaneTarget, s as createSession, w as init_tmux } from "./tmux-ftABRAmc.js";
|
|
6
|
+
import { a as init_event_store, n as getEventStore } from "./event-store-tdiY5eDZ.js";
|
|
7
|
+
import { k as normalizeChannelReplyPayload, o as getHarnessBehavior, t as init_src, x as DomainEvent } from "./src-U7_kTPEE.js";
|
|
8
|
+
import { E as init_agent_state_sync, b as setReviewStatusSync, c as getReviewStatusSync, d as loadReviewStatuses, i as clearWorkspaceStuck, k as stateToOverdeckParamsForDb, l as init_review_status, w as AGENT_COLUMNS_FOR_DB } from "./review-status-A7quS5KJ.js";
|
|
9
|
+
import { a as EventStoreService, c as ReadModelService, d as init_read_model, i as init_issue_lifecycle, s as init_domain_services, t as IssueLifecycle, u as getClosedIssueIdsForReadSource } from "./issue-lifecycle-CreaCkjW.js";
|
|
10
|
+
import { d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-B4Bjbkfv.js";
|
|
11
|
+
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-DWdW7vUm.js";
|
|
12
|
+
import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-Ca0YTWDw.js";
|
|
13
|
+
import { An as writeChannelsBridgeMcpConfig, Ar as init_codex_auth, At as deliverAgentPermissionDecision, Bn as getAgentDir, Cn as validateProviderHealth, Cr as getAgentRuntimeStateSync, F as init_tier_escalation, G as resumeAgent, Gt as transitionIssueToInProgress, H as restartAgent, Hn as getAgentState, In as clearAgentTroubled, Lt as BRIDGE_TOKEN_HEADER, Nt as setAgentDeliveryMethod, P as decideEscalation, Pn as clearAgentPaused, Q as operatorInterventionEvent, Rt as init_bridge_token, Sn as init_provider_health, Sr as getAgentRuntimeState, Tr as saveAgentRuntimeState, V as recoverAgent, Wn as getAgentStateSync, X as messageAgent, Xt as resolveStaffing, Z as init_operator_interventions, Zn as markAgentStoppedState, ar as setAgentPaused, at as saveSessionId, b as init_agents$1, bn as getProviderExportsForModel, cr as wipeAgentStateDirs, dn as piFifoPaths, et as getActivity, fn as init_ohmypi_fifo, fr as init_pty_token, ft as stopAgent, gr as clearReadySignal, hr as resolvePtySupervisorScriptPath, i as listRunningAgents, in as getProviderAuthMode, ir as saveAgentStateSync, kn as dismissDevChannelsDialog, kr as checkCodexAuthStatus, kt as deliverAgentMessage, lr as writeAgentStateJsonSync, mr as init_pty_supervisor_locate, nt as getLatestSessionIdSync, pn as ohmypiFifoPaths, pr as writePtyToken, qt as init_staffing, r as listAgentStates, rr as saveAgentState, rt as getSessionId, tn as getAgentRuntimeBaseCommand, tt as getLatestSessionId, un as init_pi_fifo, vn as determineModel, vr as normalizeAgentId, xr as waitForReadySignal, yn as getProviderEnvForModel, zt as writeBridgeTokenSync } from "./queries-6d7Cdtm7.js";
|
|
14
|
+
import { a as performHandoff, i as checkAllTriggers, s as getAgentHealth, t as getCloisterService } from "./service-DCpB_SGd.js";
|
|
15
|
+
import { o as init_persistent_logger, s as logAgentLifecycleSync } from "./session-history-CVZDpS3c.js";
|
|
16
|
+
import { t as init_behavior } from "./behavior-B_-4EKF3.js";
|
|
17
|
+
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-B4itFzDo.js";
|
|
18
|
+
import { n as init_issue_service_singleton, r as issue_service_singleton_exports } from "./issue-service-singleton-B5ushCvE.js";
|
|
19
|
+
import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-Bb4XeV2x.js";
|
|
20
20
|
import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-hraoaQIp.js";
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import { a as
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import { _ as
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
21
|
+
import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-DfeyBDwA.js";
|
|
22
|
+
import { f as readTierOverrides, g as serializeXBriefDocument, h as recordTierPromotion, m as readWorkspacePlanSync, o as init_io, r as findPlan, u as readPlan } from "./io-B3_AHDfr.js";
|
|
23
|
+
import { B as removeFavorite, E as hasOtherActiveConversationOnTmuxSession, F as markConversationEnded, G as setConversationHarness, K as setConversationModel, M as listConversations, P as markConversationActive, Q as updateConversationDeliveryMethod, S as getConversationByName, W as setConversationEffort, g as backfillConversationModel, h as archiveConversation, k as init_conversations, nt as updateLastAttached, rt as updateSpawnError, x as getConversationById, y as createConversation } from "./conversations-DbOs1e9Q.js";
|
|
24
|
+
import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-B0pmAz0a.js";
|
|
25
|
+
import { a as requireModelOverrideSync, i as normalizeModelOverrideSync, n as init_launcher_generator, r as init_model_validation, t as generateLauncherScriptSync } from "./launcher-generator-CHVm7bGT.js";
|
|
26
|
+
import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-H_5wHQZQ.js";
|
|
27
|
+
import { h as workspaceContextFile, l as piGlobalContextFile, o as init_layers } from "./layers-DzxSTGNA.js";
|
|
28
|
+
import { n as init_harness_binary, r as prepareHarnessLaunch } from "./harness-binary-CVio2m-u.js";
|
|
29
|
+
import { a as init_stack_health, i as getWorkspaceStackHealth } from "./stack-health-puygdaMd.js";
|
|
30
|
+
import { l as init_dag, o as getDispatchableItems } from "./dag-CdOjJVDT.js";
|
|
31
|
+
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-qHJBhy3Z.js";
|
|
32
|
+
import { a as loadCloisterConfigSync, r as init_config } from "./config-DjLOdbgT.js";
|
|
33
|
+
import { c as isStateMigrated, o as init_state_home } from "./state-home-CIGjwNfJ.js";
|
|
34
|
+
import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-D8iNBcux.js";
|
|
35
|
+
import { _ as init_codex_conversation_parser, c as parseEntireConversation, d as init_pi_conversation_parser, g as parseOhmypiConversationMessages, m as init_ohmypi_conversation_parser, p as parsePiConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages } from "./conversation-service-Du-MTNpJ.js";
|
|
36
|
+
import { _ as parseCodexApprovalPrompt, d as getAgentPendingQuestions$1, f as getAgentWorkspace$1, g as normalizeAwaitingInputPrompt, m as detectAwaitingInputForAgent, o as getRuntimeForAgent, p as scanPendingInputsPromise, s as computeAgentEnrichment, u as getAgentJsonlPath$1 } from "./stuck-remediation-CzEov_fq.js";
|
|
37
|
+
import { Dt as classifyMemoryPressure, It as getSystemHealthSnapshot, Pt as getResourceConfig } from "./deacon-pRnyD5w9.js";
|
|
38
|
+
import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-hLUv3ADC.js";
|
|
39
|
+
import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-Dhflo1SH.js";
|
|
40
|
+
import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-aQ1IxeI3.js";
|
|
41
|
+
import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-CskwzzhL.js";
|
|
41
42
|
import { basename, delimiter, dirname, join, resolve } from "node:path";
|
|
42
43
|
import { Cause, Data, Effect, Layer, Option, Schema, Stream } from "effect";
|
|
43
44
|
import { join as join$1 } from "path";
|
|
@@ -99,9 +100,8 @@ init_cost();
|
|
|
99
100
|
init_behavior();
|
|
100
101
|
init_persistent_logger();
|
|
101
102
|
init_tracker_config();
|
|
102
|
-
init_types();
|
|
103
|
-
init_review_status();
|
|
104
103
|
init_lifecycle();
|
|
104
|
+
init_review_status();
|
|
105
105
|
init_io();
|
|
106
106
|
/**
|
|
107
107
|
* Resolve the default cwd used when no project is selected — the "devroot"
|
|
@@ -581,7 +581,7 @@ async function resolveCodexRolloutPath(agentId, opts = {}) {
|
|
|
581
581
|
const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
|
|
582
582
|
const codexHome = join(agentDir, "codex-home");
|
|
583
583
|
if (!await pathExists$1(codexHome)) return null;
|
|
584
|
-
const { findRolloutPath, findLatestRollout } = await import("./codex-
|
|
584
|
+
const { findRolloutPath, findLatestRollout } = await import("./codex-Dg7Is5yb.js");
|
|
585
585
|
const threadId = (await readOptional(join(agentDir, "codex-thread-id")))?.trim();
|
|
586
586
|
if (threadId) {
|
|
587
587
|
const rollout = findRolloutPath(codexHome, threadId);
|
|
@@ -642,12 +642,13 @@ async function resolveJsonlPath(agentId, workspacePath, opts = {}) {
|
|
|
642
642
|
logTranscriptResolution(agentId, `missing-session-id:${harness ?? "unknown"}`, `failed harness=${harness ?? "unknown"} reason=no-session-id checked=session.id,sessions.json,runtime-state`, opts);
|
|
643
643
|
return null;
|
|
644
644
|
}
|
|
645
|
-
const
|
|
645
|
+
const effectiveWorkspacePath = (await readRecordedState(agentId, opts)).workspace ?? workspacePath;
|
|
646
|
+
const jsonlPath = join(opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects"), encodeClaudeProjectDir(effectiveWorkspacePath), `${claudeSessionId}.jsonl`);
|
|
646
647
|
if (await pathExists$1(jsonlPath)) {
|
|
647
648
|
logTranscriptResolution(agentId, `resolved:${jsonlPath}`, `resolved harness=${harness ?? "claude-code"} sessionId=${claudeSessionId} path=${jsonlPath}`, opts);
|
|
648
649
|
return jsonlPath;
|
|
649
650
|
}
|
|
650
|
-
logTranscriptResolution(agentId, `missing-jsonl:${jsonlPath}`, `failed harness=${harness ?? "claude-code"} reason=jsonl-missing sessionId=${claudeSessionId} workspace=${
|
|
651
|
+
logTranscriptResolution(agentId, `missing-jsonl:${jsonlPath}`, `failed harness=${harness ?? "claude-code"} reason=jsonl-missing sessionId=${claudeSessionId} workspace=${effectiveWorkspacePath} expectedPath=${jsonlPath}`, opts);
|
|
651
652
|
return null;
|
|
652
653
|
}
|
|
653
654
|
//#endregion
|
|
@@ -834,15 +835,14 @@ const getWorkAgentLifecycleState = (agentOrIssueId) => Effect.promise(() => getW
|
|
|
834
835
|
* expected feature branch. Reports drift and missing-workspace state
|
|
835
836
|
* because both are silent failure modes today.
|
|
836
837
|
*
|
|
837
|
-
* Cache: in-memory,
|
|
838
|
-
*
|
|
839
|
-
*
|
|
840
|
-
*
|
|
838
|
+
* Cache: in-memory, keyed by absolute path and invalidated when the mtime of
|
|
839
|
+
* <path>/.git/HEAD changes. Every read still stats HEAD, so a checkout under a
|
|
840
|
+
* live conversation is picked up immediately without periodically respawning
|
|
841
|
+
* two git processes for every unchanged workspace.
|
|
841
842
|
*
|
|
842
843
|
* All I/O is async (execFile / fs.promises). No execSync, no readFileSync.
|
|
843
844
|
*/
|
|
844
845
|
const execFileAsync$3 = promisify(execFile);
|
|
845
|
-
const GIT_INFO_TTL_MS = 3e4;
|
|
846
846
|
const GIT_INFO_TIMEOUT_MS = 2e3;
|
|
847
847
|
const cache = /* @__PURE__ */ new Map();
|
|
848
848
|
/**
|
|
@@ -917,22 +917,20 @@ async function readGitInfoFresh(absPath) {
|
|
|
917
917
|
};
|
|
918
918
|
}
|
|
919
919
|
/**
|
|
920
|
-
* Resolve branch + worktree status for a conversation cwd. Cached
|
|
921
|
-
*
|
|
920
|
+
* Resolve branch + worktree status for a conversation cwd. Cached until the
|
|
921
|
+
* HEAD mtime changes.
|
|
922
922
|
*/
|
|
923
923
|
async function resolveConversationGitInfo(absPath) {
|
|
924
|
-
const now = Date.now();
|
|
925
924
|
const headMtimeMs = await readHeadMtimeMs(absPath);
|
|
926
925
|
if (headMtimeMs === null) return {
|
|
927
926
|
branch: null,
|
|
928
927
|
isWorktree: false
|
|
929
928
|
};
|
|
930
929
|
const cached = cache.get(absPath);
|
|
931
|
-
if (cached && cached.
|
|
930
|
+
if (cached && cached.headMtimeMs === headMtimeMs) return cached.value;
|
|
932
931
|
const value = await readGitInfoFresh(absPath);
|
|
933
932
|
cache.set(absPath, {
|
|
934
933
|
value,
|
|
935
|
-
expiresAt: now + GIT_INFO_TTL_MS,
|
|
936
934
|
headMtimeMs
|
|
937
935
|
});
|
|
938
936
|
return value;
|
|
@@ -1727,7 +1725,7 @@ const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", http
|
|
|
1727
1725
|
} catch {}
|
|
1728
1726
|
let stdout;
|
|
1729
1727
|
if (isRemote && vmName) {
|
|
1730
|
-
const { getRemoteAgentOutput } = await import("./remote-agents-
|
|
1728
|
+
const { getRemoteAgentOutput } = await import("./remote-agents-CRCg1L4H.js");
|
|
1731
1729
|
stdout = await getRemoteAgentOutput(id, vmName, parseInt(String(lines), 10) || 100);
|
|
1732
1730
|
} else stdout = await Effect.runPromise(capturePane(id, parseInt(String(lines), 10) || 100));
|
|
1733
1731
|
if (!stdout || stdout.trim() === "" || stdout.trim() === "Session not found") {
|
|
@@ -1907,7 +1905,7 @@ const postAgentTellRoute = postAgentMessageLikeRoute("/api/agents/:id/tell");
|
|
|
1907
1905
|
const postAgentPokeRoute = HttpRouter.add("POST", "/api/agents/:id/poke", httpHandler(Effect.gen(function* () {
|
|
1908
1906
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
1909
1907
|
const { message } = yield* readJsonBody$1;
|
|
1910
|
-
const pokeMsg = message || "You seem to have been inactive for a while. If you're stuck:\n1. Check your current task
|
|
1908
|
+
const pokeMsg = message || "You seem to have been inactive for a while. If you're stuck:\n1. Check your current xBRIEF task with `pan task show <issue> <item-id>`\n2. Try an alternative approach if blocked\n3. Ask for help if needed\n\nWhat's your current status?";
|
|
1911
1909
|
yield* Effect.promise(() => messageAgent(id, pokeMsg));
|
|
1912
1910
|
return jsonResponse({
|
|
1913
1911
|
success: true,
|
|
@@ -2148,7 +2146,7 @@ async function cleanupConversationAttachments(name) {
|
|
|
2148
2146
|
* sessions that the lifecycle poller missed. */
|
|
2149
2147
|
async function cleanupOrphanedConversationAttachments() {
|
|
2150
2148
|
try {
|
|
2151
|
-
const { listConversations } = await import("./conversations-
|
|
2149
|
+
const { listConversations } = await import("./conversations-6mPANqvL.js");
|
|
2152
2150
|
const convNames = new Set(listConversations().map((c) => c.name));
|
|
2153
2151
|
const root = getConversationAttachmentsRoot();
|
|
2154
2152
|
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, {
|
|
@@ -2727,7 +2725,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
2727
2725
|
const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
|
|
2728
2726
|
const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
|
|
2729
2727
|
const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
|
|
2730
|
-
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-
|
|
2728
|
+
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-Dg7Is5yb.js");
|
|
2731
2729
|
initCodexHome(codexHome, {
|
|
2732
2730
|
trustedDir: cwd,
|
|
2733
2731
|
approvalPolicy: codexApprovalPolicy,
|
|
@@ -2796,7 +2794,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
2796
2794
|
} catch {}
|
|
2797
2795
|
console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
|
|
2798
2796
|
try {
|
|
2799
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
2797
|
+
const { preTrustDirectory } = await import("./workspace-manager-ZTdJAy9M.js");
|
|
2800
2798
|
preTrustDirectory(cwd);
|
|
2801
2799
|
} catch {}
|
|
2802
2800
|
try {
|
|
@@ -2813,7 +2811,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
2813
2811
|
const codexHomeDir = codexFields.codexHome;
|
|
2814
2812
|
(async () => {
|
|
2815
2813
|
try {
|
|
2816
|
-
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-
|
|
2814
|
+
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-Dg7Is5yb.js");
|
|
2817
2815
|
const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
|
|
2818
2816
|
if (rollout) {
|
|
2819
2817
|
const threadId = extractThreadIdFromRollout(rollout);
|
|
@@ -3692,7 +3690,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
|
|
|
3692
3690
|
error: "missing agent id"
|
|
3693
3691
|
}, { status: 400 });
|
|
3694
3692
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
3695
|
-
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-
|
|
3693
|
+
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-DXdfprGr.js"));
|
|
3696
3694
|
const expected = getInternalTokenSync();
|
|
3697
3695
|
if (!expected) return jsonResponse({
|
|
3698
3696
|
ok: false,
|
|
@@ -3959,7 +3957,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
|
|
|
3959
3957
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
3960
3958
|
const urlOpt = HttpServerRequest.toURL(request);
|
|
3961
3959
|
const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
|
|
3962
|
-
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-
|
|
3960
|
+
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-CpfvuVmm.js"));
|
|
3963
3961
|
const endTime = /* @__PURE__ */ new Date();
|
|
3964
3962
|
const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
|
|
3965
3963
|
const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
|
|
@@ -4000,7 +3998,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
|
|
|
4000
3998
|
detail: String(decoded.failure)
|
|
4001
3999
|
}, { status: 400 })
|
|
4002
4000
|
};
|
|
4003
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
4001
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CnzFKSAQ.js"));
|
|
4004
4002
|
yield* (yield* AgentStateService).emit(decoded.success);
|
|
4005
4003
|
return {
|
|
4006
4004
|
ok: true,
|
|
@@ -4082,7 +4080,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
|
|
|
4082
4080
|
success: false,
|
|
4083
4081
|
error: "missing agent id"
|
|
4084
4082
|
}, { status: 400 });
|
|
4085
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
4083
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CnzFKSAQ.js"));
|
|
4086
4084
|
const snapshot = yield* (yield* AgentStateService).get(id);
|
|
4087
4085
|
if (!snapshot) return jsonResponse({
|
|
4088
4086
|
success: false,
|
|
@@ -4146,35 +4144,107 @@ function saveAgentStateAndEmitEvent(state, event) {
|
|
|
4146
4144
|
function saveAgentStateAndEmitEventProgram(state, event) {
|
|
4147
4145
|
return Effect.sync(() => saveAgentStateAndEmitEvent(state, event));
|
|
4148
4146
|
}
|
|
4149
|
-
|
|
4150
|
-
* Dependency-injected variant for tests.
|
|
4151
|
-
*/
|
|
4152
|
-
function saveAgentStateAndEmitEventWithDeps(db, eventStore, state, event) {
|
|
4153
|
-
prepareAgentStateForSave(state);
|
|
4154
|
-
writeAgentStateJsonSync(state);
|
|
4147
|
+
function writeProjectionRows(db, state, event) {
|
|
4155
4148
|
const record = event;
|
|
4156
4149
|
const timestamp = record["timestamp"] ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
4157
4150
|
const timestampMs = new Date(timestamp).getTime();
|
|
4158
4151
|
const payload = JSON.stringify(record["payload"] ?? {});
|
|
4159
4152
|
const updatedAt = Date.now();
|
|
4153
|
+
db.prepare(`INSERT OR IGNORE INTO issues (id, stage, updated_at) VALUES (?, 'working', ?)`).run(state.issueId, updatedAt);
|
|
4154
|
+
db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
|
|
4155
|
+
db.prepare(`INSERT INTO events (type, timestamp, payload) VALUES (?, ?, ?)`).run(event.type, timestampMs, payload);
|
|
4156
|
+
const sequence = db.prepare(`SELECT last_insert_rowid() AS sequence`).get()?.sequence ?? 0;
|
|
4157
|
+
return {
|
|
4158
|
+
sequence,
|
|
4159
|
+
stored: buildStoredEvent(event, sequence)
|
|
4160
|
+
};
|
|
4161
|
+
}
|
|
4162
|
+
function emitCommittedProjection(eventStore, state, event, rows) {
|
|
4163
|
+
eventStore.emitStored(rows.stored);
|
|
4164
|
+
logAgentLifecycleSync(state.id, `projected ${event.type} (seq=${rows.sequence}) for ${state.id}`);
|
|
4165
|
+
return { sequence: rows.sequence };
|
|
4166
|
+
}
|
|
4167
|
+
function rollbackTransaction(db) {
|
|
4168
|
+
try {
|
|
4169
|
+
db.exec("ROLLBACK");
|
|
4170
|
+
} catch {}
|
|
4171
|
+
}
|
|
4172
|
+
function saveAgentStateAndEmitEventWithDeps(db, eventStore, state, event) {
|
|
4173
|
+
prepareAgentStateForSave(state);
|
|
4174
|
+
writeAgentStateJsonSync(state);
|
|
4160
4175
|
db.exec("BEGIN IMMEDIATE");
|
|
4161
4176
|
try {
|
|
4162
|
-
|
|
4163
|
-
db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
|
|
4164
|
-
db.prepare(`INSERT INTO events (type, timestamp, payload) VALUES (?, ?, ?)`).run(event.type, timestampMs, payload);
|
|
4165
|
-
const sequence = db.prepare(`SELECT last_insert_rowid() AS sequence`).get()?.sequence ?? 0;
|
|
4177
|
+
const rows = writeProjectionRows(db, state, event);
|
|
4166
4178
|
db.exec("COMMIT");
|
|
4167
|
-
|
|
4168
|
-
eventStore.emitStored(stored);
|
|
4169
|
-
logAgentLifecycleSync(state.id, `projected ${event.type} (seq=${sequence}) for ${state.id}`);
|
|
4170
|
-
return { sequence };
|
|
4179
|
+
return emitCommittedProjection(eventStore, state, event, rows);
|
|
4171
4180
|
} catch (err) {
|
|
4172
|
-
|
|
4173
|
-
|
|
4174
|
-
|
|
4181
|
+
rollbackTransaction(db);
|
|
4182
|
+
throw err;
|
|
4183
|
+
}
|
|
4184
|
+
}
|
|
4185
|
+
/**
|
|
4186
|
+
* Claim the single in-flight work-spawn slot and project its starting state.
|
|
4187
|
+
* The SQLite write lock makes the status check and placeholder insert one
|
|
4188
|
+
* operation, so concurrent dashboard requests cannot both launch `pan start`.
|
|
4189
|
+
*/
|
|
4190
|
+
function claimAgentStartPlaceholderWithDeps(db, eventStore, state, event, hasLiveTmuxSession) {
|
|
4191
|
+
if (hasLiveTmuxSession) return {
|
|
4192
|
+
claimed: false,
|
|
4193
|
+
reason: "live-session"
|
|
4194
|
+
};
|
|
4195
|
+
prepareAgentStateForSave(state);
|
|
4196
|
+
db.exec("BEGIN IMMEDIATE");
|
|
4197
|
+
try {
|
|
4198
|
+
const current = db.prepare(`SELECT status, started_at AS startedAt FROM agents WHERE id = ?`).get(state.id);
|
|
4199
|
+
const startingWithinGrace = current?.status === "starting" && current.startedAt !== null && Date.now() - current.startedAt < 12e4;
|
|
4200
|
+
if (current?.status === "running" || startingWithinGrace) {
|
|
4201
|
+
rollbackTransaction(db);
|
|
4202
|
+
return {
|
|
4203
|
+
claimed: false,
|
|
4204
|
+
reason: "active-state"
|
|
4205
|
+
};
|
|
4206
|
+
}
|
|
4207
|
+
writeAgentStateJsonSync(state);
|
|
4208
|
+
const rows = writeProjectionRows(db, state, event);
|
|
4209
|
+
db.exec("COMMIT");
|
|
4210
|
+
emitCommittedProjection(eventStore, state, event, rows);
|
|
4211
|
+
return { claimed: true };
|
|
4212
|
+
} catch (err) {
|
|
4213
|
+
rollbackTransaction(db);
|
|
4175
4214
|
throw err;
|
|
4176
4215
|
}
|
|
4177
4216
|
}
|
|
4217
|
+
function claimAgentStartPlaceholderProgram(state, event, hasLiveTmuxSession) {
|
|
4218
|
+
return Effect.sync(() => claimAgentStartPlaceholderWithDeps(getOverdeckDatabaseSync(), getEventStore(), state, event, hasLiveTmuxSession));
|
|
4219
|
+
}
|
|
4220
|
+
/**
|
|
4221
|
+
* Roll back only the placeholder owned by this failed spawn attempt. If the
|
|
4222
|
+
* agent has already advanced to a real running state, the compare fails and
|
|
4223
|
+
* the successful concurrent launch is left untouched.
|
|
4224
|
+
*/
|
|
4225
|
+
function rollbackAgentStartPlaceholderWithDeps(db, eventStore, placeholder, fallback, event) {
|
|
4226
|
+
prepareAgentStateForSave(fallback);
|
|
4227
|
+
db.exec("BEGIN IMMEDIATE");
|
|
4228
|
+
try {
|
|
4229
|
+
const current = db.prepare(`SELECT status, model, started_at AS startedAt FROM agents WHERE id = ?`).get(placeholder.id);
|
|
4230
|
+
const placeholderStartedAt = new Date(placeholder.startedAt).getTime();
|
|
4231
|
+
if (!(current?.status === "starting" && current.model === "pending-work-spawn" && current.startedAt === placeholderStartedAt)) {
|
|
4232
|
+
rollbackTransaction(db);
|
|
4233
|
+
return false;
|
|
4234
|
+
}
|
|
4235
|
+
writeAgentStateJsonSync(fallback);
|
|
4236
|
+
const rows = writeProjectionRows(db, fallback, event);
|
|
4237
|
+
db.exec("COMMIT");
|
|
4238
|
+
emitCommittedProjection(eventStore, fallback, event, rows);
|
|
4239
|
+
return true;
|
|
4240
|
+
} catch (err) {
|
|
4241
|
+
rollbackTransaction(db);
|
|
4242
|
+
throw err;
|
|
4243
|
+
}
|
|
4244
|
+
}
|
|
4245
|
+
function rollbackAgentStartPlaceholderProgram(placeholder, fallback, event) {
|
|
4246
|
+
return Effect.sync(() => rollbackAgentStartPlaceholderWithDeps(getOverdeckDatabaseSync(), getEventStore(), placeholder, fallback, event));
|
|
4247
|
+
}
|
|
4178
4248
|
//#endregion
|
|
4179
4249
|
//#region routes/agents/lifecycle-stop.ts
|
|
4180
4250
|
init_agents$1();
|
|
@@ -4195,8 +4265,8 @@ function createAgentStopHandler(lifecycleEvent) {
|
|
|
4195
4265
|
yield* stopAgent(id);
|
|
4196
4266
|
if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
|
|
4197
4267
|
try {
|
|
4198
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
4199
|
-
const { findWorkspacePath } = await import("./archive-planning-
|
|
4268
|
+
const { resolveProjectFromIssueSync } = await import("./projects-9SkRpES9.js");
|
|
4269
|
+
const { findWorkspacePath } = await import("./archive-planning-zkJb3BeM.js");
|
|
4200
4270
|
const issueLower = stateBeforeStop.issueId.toLowerCase();
|
|
4201
4271
|
const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
|
|
4202
4272
|
if (workspacePath) {
|
|
@@ -5174,8 +5244,10 @@ const postAgentSwitchModelRoute = HttpRouter.add("POST", "/api/agents/:id/switch
|
|
|
5174
5244
|
return jsonResponse({ error: `Agent ${(yield* HttpRouter.params)["id"] ?? ""} model is locked once the agent is spawned` }, { status: 409 });
|
|
5175
5245
|
})));
|
|
5176
5246
|
//#endregion
|
|
5177
|
-
//#region ../../lib/
|
|
5247
|
+
//#region ../../lib/xbrief/auto-synthesize.ts
|
|
5178
5248
|
init_state_read_home();
|
|
5249
|
+
init_state_plane();
|
|
5250
|
+
init_types();
|
|
5179
5251
|
init_codex_auth();
|
|
5180
5252
|
init_state_home();
|
|
5181
5253
|
init_io();
|
|
@@ -5198,7 +5270,7 @@ function extractAcceptanceCriteriaFromIssue(title, body) {
|
|
|
5198
5270
|
}
|
|
5199
5271
|
return [`Issue's stated fix implemented with tests`];
|
|
5200
5272
|
}
|
|
5201
|
-
function
|
|
5273
|
+
function synthesizeMinimalXBrief(issue) {
|
|
5202
5274
|
const issueId = issue.issueId.toUpperCase();
|
|
5203
5275
|
const issueLabel = issueId.toLowerCase();
|
|
5204
5276
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -5209,9 +5281,9 @@ function synthesizeMinimalVBrief(issue) {
|
|
|
5209
5281
|
created: now,
|
|
5210
5282
|
metadata: { kind: "acceptance_criterion" }
|
|
5211
5283
|
}));
|
|
5212
|
-
const canonicalFilename =
|
|
5284
|
+
const canonicalFilename = generateXBriefFilename(issueId, issue.title, now);
|
|
5213
5285
|
return {
|
|
5214
|
-
|
|
5286
|
+
xBRIEFInfo: {
|
|
5215
5287
|
version: "0.8",
|
|
5216
5288
|
created: now,
|
|
5217
5289
|
updated: now,
|
|
@@ -5258,8 +5330,8 @@ function synthesizeMinimalVBrief(issue) {
|
|
|
5258
5330
|
}
|
|
5259
5331
|
};
|
|
5260
5332
|
}
|
|
5261
|
-
async function
|
|
5262
|
-
const document =
|
|
5333
|
+
async function writeAutoStartXBriefPromise(projectRoot, workspacePath, issue) {
|
|
5334
|
+
const document = synthesizeMinimalXBrief(issue);
|
|
5263
5335
|
const canonicalFilename = document.plan.metadata?.canonicalFilename;
|
|
5264
5336
|
const projectSpecsDir = join$1(projectRoot, ".pan", "specs");
|
|
5265
5337
|
const projectSpecPath = join$1(projectSpecsDir, canonicalFilename);
|
|
@@ -5271,7 +5343,7 @@ async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
|
|
|
5271
5343
|
}
|
|
5272
5344
|
};
|
|
5273
5345
|
await mkdir$1(projectSpecsDir, { recursive: true });
|
|
5274
|
-
await writeFile$1(projectSpecPath,
|
|
5346
|
+
await writeFile$1(projectSpecPath, serializeXBriefDocument(projectDocument), "utf-8");
|
|
5275
5347
|
return {
|
|
5276
5348
|
document,
|
|
5277
5349
|
workspaceSpecPath: projectSpecPath,
|
|
@@ -5280,15 +5352,15 @@ async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
|
|
|
5280
5352
|
};
|
|
5281
5353
|
}
|
|
5282
5354
|
/**
|
|
5283
|
-
* Effect variant of
|
|
5355
|
+
* Effect variant of writeAutoStartXBrief. Wraps mkdir + writeFile in a typed
|
|
5284
5356
|
* FsError channel so callers in Effect-native code can compose with this
|
|
5285
5357
|
* synthesis step without losing failure typing.
|
|
5286
5358
|
*/
|
|
5287
|
-
const
|
|
5288
|
-
try: () =>
|
|
5359
|
+
const writeAutoStartXBrief = (projectRoot, workspacePath, issue) => Effect.tryPromise({
|
|
5360
|
+
try: () => writeAutoStartXBriefPromise(projectRoot, workspacePath, issue),
|
|
5289
5361
|
catch: (cause) => new FsError({
|
|
5290
5362
|
path: projectRoot,
|
|
5291
|
-
operation: "
|
|
5363
|
+
operation: "writeAutoStartXBrief",
|
|
5292
5364
|
cause
|
|
5293
5365
|
})
|
|
5294
5366
|
});
|
|
@@ -5500,15 +5572,15 @@ init_agents$1();
|
|
|
5500
5572
|
function handleRemoteAgentSpawn(input) {
|
|
5501
5573
|
return Effect.gen(function* () {
|
|
5502
5574
|
const { issueId, workspacePath, workspaceMetadata, spawnModel, projectPath, spawnGuardrails, lifecycle } = input;
|
|
5503
|
-
const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-
|
|
5504
|
-
const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-
|
|
5505
|
-
const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-
|
|
5575
|
+
const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-CRCg1L4H.js"));
|
|
5576
|
+
const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-4tiENDaI.js"));
|
|
5577
|
+
const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-DUIhMN_T.js"));
|
|
5506
5578
|
const panConfig = loadPanConfig();
|
|
5507
5579
|
const spendCap = checkRemoteSpendCap(panConfig);
|
|
5508
5580
|
if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
|
|
5509
5581
|
const fly = createFlyProviderFromConfig(panConfig.remote);
|
|
5510
5582
|
yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
|
|
5511
|
-
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-
|
|
5583
|
+
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-Yb2bd3Fq.js"));
|
|
5512
5584
|
const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
|
|
5513
5585
|
const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
|
|
5514
5586
|
issueId,
|
|
@@ -5829,6 +5901,7 @@ init_child_env();
|
|
|
5829
5901
|
init_harness_policy();
|
|
5830
5902
|
init_activity_logger();
|
|
5831
5903
|
init_projects();
|
|
5904
|
+
init_review_status();
|
|
5832
5905
|
init_io();
|
|
5833
5906
|
init_read_model();
|
|
5834
5907
|
init_domain_services();
|
|
@@ -5852,6 +5925,25 @@ function emitDirtyWorkspaceRefusalActivity(issueId, porcelain) {
|
|
|
5852
5925
|
});
|
|
5853
5926
|
} catch {}
|
|
5854
5927
|
}
|
|
5928
|
+
const LEGACY_WORKSPACE_RUNTIME_FILES = new Set([
|
|
5929
|
+
".pan/continue.json",
|
|
5930
|
+
".pan/spec.vbrief.json",
|
|
5931
|
+
".pan/kickoff.md",
|
|
5932
|
+
".pan/sessions.jsonl",
|
|
5933
|
+
".pan/pipeline-verdict.json",
|
|
5934
|
+
".pan/verification-latest.json",
|
|
5935
|
+
".pan/agent-mcp.json"
|
|
5936
|
+
]);
|
|
5937
|
+
function isOverdeckWorkspaceRuntimePath(path) {
|
|
5938
|
+
if (path === ".overdeck" || path.startsWith(".overdeck/")) return true;
|
|
5939
|
+
if (path === ".pan" || path === ".pan/") return true;
|
|
5940
|
+
if (LEGACY_WORKSPACE_RUNTIME_FILES.has(path)) return true;
|
|
5941
|
+
return path.startsWith(".pan/feedback/") || path.startsWith(".pan/review/") || path.startsWith(".pan/test/") || path.startsWith(".pan/handoff-");
|
|
5942
|
+
}
|
|
5943
|
+
/** True when git porcelain contains only Overdeck-owned workspace runtime files. */
|
|
5944
|
+
function isOnlyOverdeckRuntimeWorkspaceChanges(porcelain) {
|
|
5945
|
+
return parsePorcelainStatusPaths(porcelain).every(isOverdeckWorkspaceRuntimePath);
|
|
5946
|
+
}
|
|
5855
5947
|
function spawnGuardrailResourcesHint(hint) {
|
|
5856
5948
|
const resourcesHint = "Open /resources to inspect Machine Room pressure before retrying.";
|
|
5857
5949
|
return hint ? `${hint} ${resourcesHint}` : resourcesHint;
|
|
@@ -5956,7 +6048,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
5956
6048
|
const workspacePanContinuePath = join(workspacePanDir, PAN_CONTINUE_FILENAME);
|
|
5957
6049
|
let planPath = yield* findPlan(workspacePath);
|
|
5958
6050
|
if (autoStart && !planPath) {
|
|
5959
|
-
yield*
|
|
6051
|
+
yield* writeAutoStartXBrief(projectPath, workspacePath, {
|
|
5960
6052
|
issueId,
|
|
5961
6053
|
title: cachedIssue?.title || issueId,
|
|
5962
6054
|
body: cachedIssue?.description || "",
|
|
@@ -5965,7 +6057,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
5965
6057
|
planPath = yield* findPlan(workspacePath);
|
|
5966
6058
|
}
|
|
5967
6059
|
if (!planPath) return jsonResponse({
|
|
5968
|
-
error: `No workspace
|
|
6060
|
+
error: `No workspace xBRIEF found for ${issueId}. Work agents require a finalized plan.`,
|
|
5969
6061
|
hint: "Run planning first, or use auto-start to synthesize a plan before starting the work agent.",
|
|
5970
6062
|
issueId
|
|
5971
6063
|
}, { status: 422 });
|
|
@@ -5982,8 +6074,8 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
5982
6074
|
if (planReadResult._tag === "failure") {
|
|
5983
6075
|
const { planErr } = planReadResult;
|
|
5984
6076
|
return jsonResponse({
|
|
5985
|
-
error: `Could not read workspace
|
|
5986
|
-
hint: "Re-run planning to produce a readable
|
|
6077
|
+
error: `Could not read workspace xBRIEF for ${issueId}: ${planErr instanceof Error ? planErr.message : String(planErr)}`,
|
|
6078
|
+
hint: "Re-run planning to produce a readable xBRIEF before starting the work agent.",
|
|
5987
6079
|
issueId
|
|
5988
6080
|
}, { status: 422 });
|
|
5989
6081
|
}
|
|
@@ -6146,33 +6238,6 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6146
6238
|
}).unref();
|
|
6147
6239
|
}
|
|
6148
6240
|
}).pipe(Effect.catch(() => Effect.void));
|
|
6149
|
-
yield* transitionVBriefOnMain(projectPath, issueId, "active", "approved", `scope: approve ${issueId.toUpperCase()} vBRIEF`).pipe(Effect.match({
|
|
6150
|
-
onSuccess: (result) => {
|
|
6151
|
-
if (result.moved) console.log(`[start-agent] vBRIEF moved ${result.fromDir} → active for ${issueId}`);
|
|
6152
|
-
if (result.committed) console.log(`[start-agent] Committed approval transition on main for ${issueId}`);
|
|
6153
|
-
},
|
|
6154
|
-
onFailure: (err) => {
|
|
6155
|
-
console.warn(`[start-agent] vBRIEF approval transition failed (non-fatal): ${err?.message ?? err}`);
|
|
6156
|
-
}
|
|
6157
|
-
}));
|
|
6158
|
-
if (existsSync(planPath)) try {
|
|
6159
|
-
updatePlanStatus(planPath, "running");
|
|
6160
|
-
console.log(`[start-agent] Set plan.status=running for ${issueId}`);
|
|
6161
|
-
} catch (planStatusErr) {
|
|
6162
|
-
console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
|
|
6163
|
-
}
|
|
6164
|
-
try {
|
|
6165
|
-
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = yield* Effect.promise(() => import("./record-rwK-nKv_.js"));
|
|
6166
|
-
const recordProject = resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath);
|
|
6167
|
-
yield* Effect.promise(() => appendSessionEntry(recordProject, issueId, {
|
|
6168
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6169
|
-
reason: "start",
|
|
6170
|
-
agentModel: spawnModel
|
|
6171
|
-
}));
|
|
6172
|
-
console.log(`[start-agent] Wrote start session entry to record for ${issueId}`);
|
|
6173
|
-
} catch (continueErr) {
|
|
6174
|
-
console.warn(`[start-agent] Failed to write start entry to record (non-fatal): ${continueErr?.message ?? continueErr}`);
|
|
6175
|
-
}
|
|
6176
6241
|
let gatesCommitted = false;
|
|
6177
6242
|
const commitClearedGates = async () => {
|
|
6178
6243
|
if (!startGateBlock || gatesCommitted) return;
|
|
@@ -6193,6 +6258,38 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6193
6258
|
troubled: startGateBlock.troubled
|
|
6194
6259
|
});
|
|
6195
6260
|
};
|
|
6261
|
+
let workStartAccepted = false;
|
|
6262
|
+
const markWorkStartAccepted = async () => {
|
|
6263
|
+
if (workStartAccepted) return;
|
|
6264
|
+
workStartAccepted = true;
|
|
6265
|
+
await Effect.runPromise(transitionXBriefOnMain(projectPath, issueId, "active", "approved", `scope: approve ${issueId.toUpperCase()} xBRIEF`).pipe(Effect.match({
|
|
6266
|
+
onSuccess: (result) => {
|
|
6267
|
+
if (result.moved) console.log(`[start-agent] xBRIEF moved ${result.fromDir} → active for ${issueId}`);
|
|
6268
|
+
if (result.committed) console.log(`[start-agent] Committed approval transition for ${issueId}`);
|
|
6269
|
+
},
|
|
6270
|
+
onFailure: (err) => {
|
|
6271
|
+
console.warn(`[start-agent] xBRIEF approval transition failed (non-fatal): ${err?.message ?? err}`);
|
|
6272
|
+
}
|
|
6273
|
+
})));
|
|
6274
|
+
if (existsSync(planPath)) try {
|
|
6275
|
+
updatePlanStatus(planPath, "running");
|
|
6276
|
+
console.log(`[start-agent] Set plan.status=running for ${issueId}`);
|
|
6277
|
+
} catch (planStatusErr) {
|
|
6278
|
+
console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
|
|
6279
|
+
}
|
|
6280
|
+
try {
|
|
6281
|
+
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-t6V-3Dcj.js");
|
|
6282
|
+
await appendSessionEntry(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId, {
|
|
6283
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6284
|
+
reason: "start",
|
|
6285
|
+
agentModel: spawnModel
|
|
6286
|
+
});
|
|
6287
|
+
console.log(`[start-agent] Wrote start session entry to record for ${issueId}`);
|
|
6288
|
+
} catch (continueErr) {
|
|
6289
|
+
console.warn(`[start-agent] Failed to write start entry to record (non-fatal): ${continueErr?.message ?? continueErr}`);
|
|
6290
|
+
}
|
|
6291
|
+
if (getReviewStatusSync(issueId)?.stuckReason === "planning_auto_handoff_failed") clearWorkspaceStuck(issueId);
|
|
6292
|
+
};
|
|
6196
6293
|
if (isRemote && workspaceMetadata) {
|
|
6197
6294
|
const response = yield* Effect.promise(() => spawnAfterClearingStartGates({
|
|
6198
6295
|
agentSessionName,
|
|
@@ -6211,6 +6308,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6211
6308
|
}));
|
|
6212
6309
|
if (response.status < 200 || response.status >= 300) return response;
|
|
6213
6310
|
yield* Effect.promise(commitClearedGates);
|
|
6311
|
+
yield* Effect.promise(markWorkStartAccepted);
|
|
6214
6312
|
return response;
|
|
6215
6313
|
}
|
|
6216
6314
|
const devScript = join(workspacePath, "dev");
|
|
@@ -6242,11 +6340,11 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6242
6340
|
console.log(`[start-agent] Killed stale tmux session ${agentSessionName}`);
|
|
6243
6341
|
}).pipe(Effect.catch(() => Effect.void));
|
|
6244
6342
|
if (!(body.acknowledgeDirtyWorkspace === true)) try {
|
|
6245
|
-
const { stdout: statusOut } = yield* Effect.promise(() => execAsync$2("git status --porcelain", {
|
|
6343
|
+
const { stdout: statusOut } = yield* Effect.promise(() => execAsync$2("git status --porcelain --untracked-files=all", {
|
|
6246
6344
|
cwd: workspacePath,
|
|
6247
6345
|
encoding: "utf-8"
|
|
6248
6346
|
}));
|
|
6249
|
-
if (statusOut.trim()) {
|
|
6347
|
+
if (statusOut.trim() && !isOnlyOverdeckRuntimeWorkspaceChanges(statusOut)) {
|
|
6250
6348
|
const { stdout: diffOut } = yield* Effect.promise(() => execAsync$2("git diff HEAD --stat", {
|
|
6251
6349
|
cwd: workspacePath,
|
|
6252
6350
|
encoding: "utf-8"
|
|
@@ -6313,7 +6411,58 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6313
6411
|
spawnPanCommand,
|
|
6314
6412
|
updateIssueStatus
|
|
6315
6413
|
});
|
|
6316
|
-
if (containerResponse)
|
|
6414
|
+
if (containerResponse) {
|
|
6415
|
+
if (containerResponse.status >= 200 && containerResponse.status < 300) yield* Effect.promise(markWorkStartAccepted);
|
|
6416
|
+
return containerResponse;
|
|
6417
|
+
}
|
|
6418
|
+
const placeholderStartedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
6419
|
+
const placeholderState = {
|
|
6420
|
+
id: agentSessionName,
|
|
6421
|
+
issueId,
|
|
6422
|
+
workspace: workspacePath,
|
|
6423
|
+
role,
|
|
6424
|
+
...effectiveHarness ? { harness: effectiveHarness } : {},
|
|
6425
|
+
model: "pending-work-spawn",
|
|
6426
|
+
status: "starting",
|
|
6427
|
+
startedAt: placeholderStartedAt,
|
|
6428
|
+
hostOverride: allowHost || void 0
|
|
6429
|
+
};
|
|
6430
|
+
const hasLiveTmuxSession = yield* sessionExists(agentSessionName).pipe(Effect.catch(() => Effect.succeed(true)));
|
|
6431
|
+
const placeholderClaim = yield* claimAgentStartPlaceholderProgram(placeholderState, {
|
|
6432
|
+
type: "agent.started",
|
|
6433
|
+
timestamp: placeholderStartedAt,
|
|
6434
|
+
payload: {
|
|
6435
|
+
agentId: agentSessionName,
|
|
6436
|
+
issueId,
|
|
6437
|
+
agent: {
|
|
6438
|
+
id: agentSessionName,
|
|
6439
|
+
issueId,
|
|
6440
|
+
workspace: workspacePath,
|
|
6441
|
+
status: "starting",
|
|
6442
|
+
startedAt: placeholderStartedAt,
|
|
6443
|
+
role,
|
|
6444
|
+
...effectiveHarness ? { runtime: effectiveHarness } : {}
|
|
6445
|
+
}
|
|
6446
|
+
}
|
|
6447
|
+
}, hasLiveTmuxSession);
|
|
6448
|
+
if (!placeholderClaim.claimed) {
|
|
6449
|
+
yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.start_placeholder_blocked", {
|
|
6450
|
+
issueId,
|
|
6451
|
+
role,
|
|
6452
|
+
workspacePath,
|
|
6453
|
+
reason: placeholderClaim.reason
|
|
6454
|
+
}));
|
|
6455
|
+
return jsonResponse({
|
|
6456
|
+
error: `Agent ${agentSessionName} is already starting or running.`,
|
|
6457
|
+
code: "AGENT_START_IN_FLIGHT"
|
|
6458
|
+
}, { status: 409 });
|
|
6459
|
+
}
|
|
6460
|
+
yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.start_placeholder_created", {
|
|
6461
|
+
issueId,
|
|
6462
|
+
role,
|
|
6463
|
+
workspacePath,
|
|
6464
|
+
startedAt: placeholderStartedAt
|
|
6465
|
+
}));
|
|
6317
6466
|
yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.work_spawn_requested", {
|
|
6318
6467
|
issueId,
|
|
6319
6468
|
role,
|
|
@@ -6328,11 +6477,35 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6328
6477
|
harness: effectiveHarness,
|
|
6329
6478
|
allowHost
|
|
6330
6479
|
}), workspacePath));
|
|
6480
|
+
yield* Effect.promise(markWorkStartAccepted);
|
|
6331
6481
|
emitStartAgentPhase(issueId, "spawn", "success", "local work agent spawn requested", {
|
|
6332
6482
|
workspacePath,
|
|
6333
6483
|
activityId
|
|
6334
6484
|
});
|
|
6335
6485
|
} catch (error) {
|
|
6486
|
+
const initialStateIsPlaceholder = initialAgentState?.model.startsWith("pending-") === true;
|
|
6487
|
+
const fallbackState = initialAgentState && !initialStateIsPlaceholder ? { ...initialAgentState } : {
|
|
6488
|
+
...placeholderState,
|
|
6489
|
+
model: spawnModel,
|
|
6490
|
+
status: "stopped",
|
|
6491
|
+
stoppedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
6492
|
+
};
|
|
6493
|
+
const rolledBack = yield* rollbackAgentStartPlaceholderProgram(placeholderState, fallbackState, {
|
|
6494
|
+
type: "agent.status_changed",
|
|
6495
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6496
|
+
payload: {
|
|
6497
|
+
agentId: agentSessionName,
|
|
6498
|
+
status: fallbackState.status,
|
|
6499
|
+
previousStatus: "starting",
|
|
6500
|
+
hasLiveTmuxSession: false
|
|
6501
|
+
}
|
|
6502
|
+
});
|
|
6503
|
+
yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.start_placeholder_rollback", {
|
|
6504
|
+
issueId,
|
|
6505
|
+
rolledBack,
|
|
6506
|
+
fallbackStatus: fallbackState.status
|
|
6507
|
+
}));
|
|
6508
|
+
invalidateAgentsCache();
|
|
6336
6509
|
const output = String(error?.output ?? error?.message ?? "");
|
|
6337
6510
|
if (output.includes(`Workspace docker stack for ${issueId}`) && output.includes("is not healthy")) {
|
|
6338
6511
|
const failedStackHealth = yield* getWorkspaceStackHealth(issueId, {
|
|
@@ -6376,55 +6549,8 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6376
6549
|
activityId: error?.activityId
|
|
6377
6550
|
}, { status: 500 });
|
|
6378
6551
|
}
|
|
6379
|
-
|
|
6380
|
-
const earlyStateDir = join(homedir(), ".overdeck", "agents", earlyAgentId);
|
|
6381
|
-
yield* Effect.promise(() => mkdir(earlyStateDir, { recursive: true }));
|
|
6382
|
-
saveAgentStateSync({
|
|
6383
|
-
id: earlyAgentId,
|
|
6384
|
-
issueId,
|
|
6385
|
-
...effectiveHarness ? { harness: effectiveHarness } : {},
|
|
6386
|
-
model: "pending-work-spawn",
|
|
6387
|
-
status: "starting",
|
|
6388
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6389
|
-
workspace: workspacePath,
|
|
6390
|
-
role,
|
|
6391
|
-
hostOverride: allowHost || void 0
|
|
6392
|
-
});
|
|
6393
|
-
updateRegistryForAgentStart(issueId, workspacePath, earlyAgentId);
|
|
6394
|
-
yield* Effect.promise(() => appendAgentLifecycleLog(earlyAgentId, "agent.start_placeholder_created", {
|
|
6395
|
-
issueId,
|
|
6396
|
-
role,
|
|
6397
|
-
workspacePath,
|
|
6398
|
-
activityId
|
|
6399
|
-
}));
|
|
6552
|
+
updateRegistryForAgentStart(issueId, workspacePath, agentSessionName);
|
|
6400
6553
|
yield* Effect.promise(() => updateIssueStatus());
|
|
6401
|
-
yield* saveAgentStateAndEmitEventProgram({
|
|
6402
|
-
id: earlyAgentId,
|
|
6403
|
-
issueId,
|
|
6404
|
-
workspace: workspacePath,
|
|
6405
|
-
role,
|
|
6406
|
-
...effectiveHarness ? { harness: effectiveHarness } : {},
|
|
6407
|
-
model: "pending-work-spawn",
|
|
6408
|
-
status: "starting",
|
|
6409
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6410
|
-
hostOverride: allowHost || void 0
|
|
6411
|
-
}, {
|
|
6412
|
-
type: "agent.started",
|
|
6413
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6414
|
-
payload: {
|
|
6415
|
-
agentId: earlyAgentId,
|
|
6416
|
-
issueId,
|
|
6417
|
-
agent: {
|
|
6418
|
-
id: earlyAgentId,
|
|
6419
|
-
issueId,
|
|
6420
|
-
workspace: workspacePath,
|
|
6421
|
-
status: "starting",
|
|
6422
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6423
|
-
role,
|
|
6424
|
-
...effectiveHarness ? { runtime: effectiveHarness } : {}
|
|
6425
|
-
}
|
|
6426
|
-
}
|
|
6427
|
-
});
|
|
6428
6554
|
try {
|
|
6429
6555
|
getIssueDataService().patchIssue(issueId, {
|
|
6430
6556
|
status: "In Progress",
|
|
@@ -6589,10 +6715,10 @@ const _serverManagedMerges = /* @__PURE__ */ new Set();
|
|
|
6589
6715
|
function firePostMergeLifecycle(issueId, options) {
|
|
6590
6716
|
const started = postMergeGuard.run(issueId, async () => {
|
|
6591
6717
|
const projectPath = getProjectPathForIssue(extractPrefixSync(issueId) ?? issueId.split("-")[0]);
|
|
6592
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
6718
|
+
const { postMergeLifecycle } = await import("./merge-agent-BQM3a8z5.js");
|
|
6593
6719
|
await postMergeLifecycle(issueId, projectPath, options?.sourceBranch, options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : void 0);
|
|
6594
6720
|
console.log(`[merge] post-merge lifecycle completed for ${issueId}`);
|
|
6595
|
-
const { runMergeTrainReconcile } = await import("./merge-train-
|
|
6721
|
+
const { runMergeTrainReconcile } = await import("./merge-train-DxDfBTjr.js");
|
|
6596
6722
|
const outcomes = await runMergeTrainReconcile(issueId);
|
|
6597
6723
|
if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${issueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
|
|
6598
6724
|
}, (err) => console.error(`[merge] post-merge lifecycle failed for ${issueId}:`, err));
|
|
@@ -6613,15 +6739,15 @@ init_io();
|
|
|
6613
6739
|
init_domain_services();
|
|
6614
6740
|
init_tmux();
|
|
6615
6741
|
const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
|
|
6616
|
-
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
6742
|
+
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
6617
6743
|
return jsonResponse({
|
|
6618
6744
|
specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
|
|
6619
6745
|
projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
|
|
6620
6746
|
});
|
|
6621
6747
|
})));
|
|
6622
6748
|
const postSpecialistsResetAllRoute = HttpRouter.add("POST", "/api/specialists/reset-all", httpHandler(Effect.gen(function* () {
|
|
6623
|
-
const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
6624
|
-
const { clearHookSync } = yield* Effect.promise(() => import("./hooks-
|
|
6749
|
+
const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
6750
|
+
const { clearHookSync } = yield* Effect.promise(() => import("./hooks-ltecuFqZ.js"));
|
|
6625
6751
|
const specialists = getAllSpecialists();
|
|
6626
6752
|
const results = [];
|
|
6627
6753
|
for (const specialist of specialists) {
|
|
@@ -6673,11 +6799,11 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6673
6799
|
if (!itemId) return jsonResponse({ error: "itemId is required for a passed inspect verdict" }, { status: 400 });
|
|
6674
6800
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
6675
6801
|
const workspacePath = project && join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
6676
|
-
if (!(workspacePath ? readWorkspacePlanSync(workspacePath) : void 0)?.plan.items.some((item) => item.id === itemId)) return jsonResponse({ error: `Item "${itemId}" does not exist in the
|
|
6802
|
+
if (!(workspacePath ? readWorkspacePlanSync(workspacePath) : void 0)?.plan.items.some((item) => item.id === itemId)) return jsonResponse({ error: `Item "${itemId}" does not exist in the xBRIEF for ${normalizedIssueId}` }, { status: 400 });
|
|
6677
6803
|
}
|
|
6678
6804
|
console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
|
|
6679
6805
|
if (specialist === "merge") {
|
|
6680
|
-
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-
|
|
6806
|
+
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-BXhav38U.js"));
|
|
6681
6807
|
if (yield* reportSpecialistCompletion(normalizedIssueId, {
|
|
6682
6808
|
status,
|
|
6683
6809
|
notes
|
|
@@ -6724,7 +6850,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6724
6850
|
if (specialist === "inspect" && status === "failed") yield* Effect.promise(() => reportTieredInspectFailureEscalation(normalizedIssueId, notes));
|
|
6725
6851
|
yield* Effect.promise(async () => {
|
|
6726
6852
|
try {
|
|
6727
|
-
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-
|
|
6853
|
+
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-DVj0hvaL.js");
|
|
6728
6854
|
const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
|
|
6729
6855
|
const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
|
|
6730
6856
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -6743,7 +6869,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6743
6869
|
});
|
|
6744
6870
|
console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
|
|
6745
6871
|
}
|
|
6746
|
-
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-
|
|
6872
|
+
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-C45ouoZ6.js");
|
|
6747
6873
|
if (await Effect.runPromise(updateSpecialistHandoffStatus(normalizedIssueId, `${specialist}-agent`, status === "passed" ? "completed" : "failed", status === "passed" ? "success" : "failure"))) console.log(`[specialists/done] Updated handoff log: ${specialist}-agent ${normalizedIssueId} → ${status}`);
|
|
6748
6874
|
} catch (err) {
|
|
6749
6875
|
console.error(`[specialists/done] Error managing specialist state:`, err);
|
|
@@ -6755,7 +6881,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6755
6881
|
if (project) {
|
|
6756
6882
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
6757
6883
|
if (existsSync(workspacePath)) {
|
|
6758
|
-
const { getWorkspaceGitInfo } = await import("./git-utils-
|
|
6884
|
+
const { getWorkspaceGitInfo } = await import("./git-utils-Dry_Ka_D.js");
|
|
6759
6885
|
const { HEAD } = await Effect.runPromise(getWorkspaceGitInfo(workspacePath));
|
|
6760
6886
|
setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: HEAD });
|
|
6761
6887
|
console.log(`[specialists/done] Snapshotted reviewedAtCommit=${HEAD.substring(0, 8)} for ${normalizedIssueId}`);
|
|
@@ -6767,7 +6893,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6767
6893
|
});
|
|
6768
6894
|
if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
|
|
6769
6895
|
try {
|
|
6770
|
-
const { onInspectComplete } = await import("./inspect-agent-
|
|
6896
|
+
const { onInspectComplete } = await import("./inspect-agent-ch-F-5Ci.js");
|
|
6771
6897
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
6772
6898
|
if (project) {
|
|
6773
6899
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
@@ -6783,7 +6909,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6783
6909
|
if (project) {
|
|
6784
6910
|
if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
|
|
6785
6911
|
setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
|
|
6786
|
-
const { initEventStore } = await import("./event-store-
|
|
6912
|
+
const { initEventStore } = await import("./event-store-Cr5PQwFC.js");
|
|
6787
6913
|
await (await initEventStore()).appendAsync({
|
|
6788
6914
|
type: "test.passed",
|
|
6789
6915
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -6836,8 +6962,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6836
6962
|
if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
|
|
6837
6963
|
try {
|
|
6838
6964
|
const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
|
|
6839
|
-
const { sessionExists } = await import("./tmux-
|
|
6840
|
-
const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-
|
|
6965
|
+
const { sessionExists } = await import("./tmux-DoThH6aj.js");
|
|
6966
|
+
const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-FlIgQ3ql.js");
|
|
6841
6967
|
if (await Effect.runPromise(sessionExists(workAgentId))) {
|
|
6842
6968
|
await messageAgent(workAgentId, `MERGE CONFLICT: The merge-agent could not rebase your branch onto main due to conflicts. Please fix this now:\n\n1. git fetch origin main\n2. git rebase origin/main\n3. Resolve any conflicts (git add <file> && git rebase --continue)\n4. git push --force-with-lease\n5. Resubmit: curl -s -X POST http://localhost:3011/api/review/${normalizedIssueId}/request -H "Content-Type: application/json" -d "{}"\n\nConflict details: ${notes}`);
|
|
6843
6969
|
console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
|
|
@@ -6851,7 +6977,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6851
6977
|
try {
|
|
6852
6978
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
6853
6979
|
const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
|
|
6854
|
-
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-
|
|
6980
|
+
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-C1Kg8n7t.js");
|
|
6855
6981
|
const result = await Effect.runPromise(deliverReviewVerdictFeedback({
|
|
6856
6982
|
issueId: normalizedIssueId,
|
|
6857
6983
|
verdict: status === "failed" ? "failed" : "blocked",
|
|
@@ -6892,7 +7018,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6892
7018
|
});
|
|
6893
7019
|
})));
|
|
6894
7020
|
const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
|
|
6895
|
-
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7021
|
+
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
6896
7022
|
const results = cleanupAllLogsSync();
|
|
6897
7023
|
return jsonResponse({
|
|
6898
7024
|
success: true,
|
|
@@ -6902,7 +7028,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
6902
7028
|
});
|
|
6903
7029
|
})));
|
|
6904
7030
|
const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
|
|
6905
|
-
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
7031
|
+
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
6906
7032
|
return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
|
|
6907
7033
|
})));
|
|
6908
7034
|
const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
|
|
@@ -6946,7 +7072,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
|
|
|
6946
7072
|
"blocked",
|
|
6947
7073
|
"failed"
|
|
6948
7074
|
].includes(status)) {
|
|
6949
|
-
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
7075
|
+
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
6950
7076
|
saveAgentRuntimeState(getTmuxSessionName(name), {
|
|
6951
7077
|
state: "idle",
|
|
6952
7078
|
lastActivity: (/* @__PURE__ */ new Date()).toISOString()
|
|
@@ -7067,7 +7193,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
|
|
|
7067
7193
|
const issueId = params["issueId"];
|
|
7068
7194
|
const type = params["type"];
|
|
7069
7195
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7070
|
-
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-
|
|
7196
|
+
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7071
7197
|
const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
|
|
7072
7198
|
yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
|
|
7073
7199
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -7094,7 +7220,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
|
|
|
7094
7220
|
if (limitParam) limit = parseInt(limitParam, 10);
|
|
7095
7221
|
if (offsetParam) offset = parseInt(offsetParam, 10);
|
|
7096
7222
|
}
|
|
7097
|
-
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7223
|
+
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
7098
7224
|
return jsonResponse(listRunLogsSync(project, type, {
|
|
7099
7225
|
limit,
|
|
7100
7226
|
offset
|
|
@@ -7105,7 +7231,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
|
|
|
7105
7231
|
const project = params["project"];
|
|
7106
7232
|
const type = params["type"];
|
|
7107
7233
|
const runId = params["runId"];
|
|
7108
|
-
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7234
|
+
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
7109
7235
|
const logPath = getRunLogPath(project, type, runId);
|
|
7110
7236
|
if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
7111
7237
|
const encoder = new TextEncoder();
|
|
@@ -7164,7 +7290,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
|
|
|
7164
7290
|
const project = params["project"];
|
|
7165
7291
|
const type = params["type"];
|
|
7166
7292
|
const runId = params["runId"];
|
|
7167
|
-
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7293
|
+
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
7168
7294
|
const content = getRunLogSync(project, type, runId);
|
|
7169
7295
|
if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
7170
7296
|
return jsonResponse({
|
|
@@ -7178,7 +7304,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
|
|
|
7178
7304
|
const project = params["project"];
|
|
7179
7305
|
const type = params["type"];
|
|
7180
7306
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7181
|
-
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-
|
|
7307
|
+
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7182
7308
|
yield* Effect.promise(() => terminateSpecialist(project, type));
|
|
7183
7309
|
return jsonResponse({
|
|
7184
7310
|
success: true,
|
|
@@ -7190,7 +7316,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
|
|
|
7190
7316
|
const project = params["project"];
|
|
7191
7317
|
const type = params["type"];
|
|
7192
7318
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7193
|
-
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
7319
|
+
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7194
7320
|
if (pauseGracePeriod(project, type)) return jsonResponse({
|
|
7195
7321
|
success: true,
|
|
7196
7322
|
message: "Grace period paused"
|
|
@@ -7202,7 +7328,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
|
|
|
7202
7328
|
const project = params["project"];
|
|
7203
7329
|
const type = params["type"];
|
|
7204
7330
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7205
|
-
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
7331
|
+
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7206
7332
|
if (resumeGracePeriod(project, type)) return jsonResponse({
|
|
7207
7333
|
success: true,
|
|
7208
7334
|
message: "Grace period resumed"
|
|
@@ -7214,7 +7340,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
|
|
|
7214
7340
|
const project = params["project"];
|
|
7215
7341
|
const type = params["type"];
|
|
7216
7342
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7217
|
-
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
7343
|
+
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7218
7344
|
exitGracePeriod(project, type);
|
|
7219
7345
|
return jsonResponse({
|
|
7220
7346
|
success: true,
|
|
@@ -7226,7 +7352,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
|
|
|
7226
7352
|
const project = params["project"];
|
|
7227
7353
|
const type = params["type"];
|
|
7228
7354
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7229
|
-
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-
|
|
7355
|
+
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7230
7356
|
const state = getGracePeriodState(project, type);
|
|
7231
7357
|
if (state) return jsonResponse(state);
|
|
7232
7358
|
else return jsonResponse({ error: "No active grace period" }, { status: 404 });
|
|
@@ -7235,7 +7361,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
|
|
|
7235
7361
|
const params = yield* HttpRouter.params;
|
|
7236
7362
|
const project = params["project"];
|
|
7237
7363
|
const type = params["type"];
|
|
7238
|
-
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
7364
|
+
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-DtrYvGJ-.js"));
|
|
7239
7365
|
const digest = loadContextDigest(project, type);
|
|
7240
7366
|
if (digest) return jsonResponse({ digest });
|
|
7241
7367
|
else return jsonResponse({ error: "No context digest found" }, { status: 404 });
|
|
@@ -7244,7 +7370,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
|
|
|
7244
7370
|
const params = yield* HttpRouter.params;
|
|
7245
7371
|
const project = params["project"];
|
|
7246
7372
|
const type = params["type"];
|
|
7247
|
-
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
7373
|
+
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-DtrYvGJ-.js"));
|
|
7248
7374
|
const digest = yield* Effect.promise(() => regenerateContextDigest(project, type));
|
|
7249
7375
|
if (digest) return jsonResponse({
|
|
7250
7376
|
digest,
|
|
@@ -7263,7 +7389,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
7263
7389
|
"blocked"
|
|
7264
7390
|
].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
|
|
7265
7391
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7266
|
-
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-
|
|
7392
|
+
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7267
7393
|
signalSpecialistCompletion(project, type, {
|
|
7268
7394
|
status,
|
|
7269
7395
|
notes
|
|
@@ -7297,8 +7423,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
|
|
|
7297
7423
|
const params = yield* HttpRouter.params;
|
|
7298
7424
|
const project = params["project"];
|
|
7299
7425
|
const type = params["type"];
|
|
7300
|
-
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7301
|
-
const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-
|
|
7426
|
+
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
7427
|
+
const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-9SkRpES9.js"));
|
|
7302
7428
|
const retention = getSpecialistRetention(project);
|
|
7303
7429
|
const deleted = cleanupOldLogsSync(project, type, {
|
|
7304
7430
|
maxDays: retention.max_days,
|
|
@@ -7319,7 +7445,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
7319
7445
|
const project = params["project"];
|
|
7320
7446
|
const issueId = params["issueId"];
|
|
7321
7447
|
const { model, harness } = yield* readJsonBody;
|
|
7322
|
-
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-
|
|
7448
|
+
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-DJRO8EG8.js"));
|
|
7323
7449
|
const killResult = yield* killAllReviewerSessions(project, issueId);
|
|
7324
7450
|
const projectConfig = resolveProjectFromIssueSync(issueId);
|
|
7325
7451
|
if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
|
|
@@ -7333,7 +7459,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
7333
7459
|
}));
|
|
7334
7460
|
branch = stdout.trim() || "unknown";
|
|
7335
7461
|
} catch {}
|
|
7336
|
-
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-
|
|
7462
|
+
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-DJRO8EG8.js"));
|
|
7337
7463
|
const prUrl = getReviewStatusSync(issueId)?.prUrl;
|
|
7338
7464
|
const result = yield* spawnReviewRoleForIssue({
|
|
7339
7465
|
issueId,
|
|
@@ -7482,6 +7608,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
|
|
|
7482
7608
|
*/
|
|
7483
7609
|
const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
|
|
7484
7610
|
//#endregion
|
|
7485
|
-
export { runInBatches as $, handleConversationDelete as A, stopConversationRuntime as B, isPiControlChannelHarness as C, conversationNeedsRunningRepair as D, validateConversationControlAckOrigin as E, isInsideGitWorkTree as F, cleanupOrphanedConversationAttachments as G, waitForPiTuiReady as H, resolveAllowedHarness as I, extractConversationAttachmentPaths as J, cleanupUnreferencedConversationAttachments as K, shouldReportUnresolvedLiveSession as L, handleConversationResume as M, handleConversationStop as N, conversationSessionAliveFromState as O, handleConversationSwitchModel as P, removeConversationAttachment as Q, spawnConversationSession as R, handleConversationThinkingLevel as S, resolveConversationDeliveryMethod as T, waitForTmuxSession as U, tmuxSessionExists as V, cleanupConversationAttachments as W, hasConversationAttachment as X, getConversationAttachmentsRoot as Y, isManagedConversationAttachmentPath as Z, handleConversationCodexApproval as _, validateOrigin as _t, agentsRouteLayer as a, panCliInvocation as at, handleConversationDeliveryMethod as b, getDefaultCwd as bt, hasDashboardInternalToken as c, resolveAgentHarness as ct, rejectUnsafeDashboardMutationRequest as d, resolveJsonlPath as dt, evaluateSpawnGuardrails as et, saveAgentStateAndEmitEvent as f, resolvePiSessionPath as ft, handleConversationAbort as g, isTrustedOriginForHost as gt, deliverConversationViaControlChannel as h, getHeaderFromMap as ht, validateSpecialistAutoCompleteMetadata as i, getWorkAgentLifecycleStateSync as it, handleConversationRestartAll as j, handleConversationCreate as k, rejectUnauthorizedDashboardRequest as l, resolveClaudeSessionId as lt, codexConversationPendingInput as m, waitForSessionRespawn as mt, _serverManagedMerges as n, resolveAgentGitInfo as nt, dashboardCsrfToken as o, spawnPanCli as ot, saveAgentStateAndEmitEventProgram as p, isRespawnPending as pt, ensureConversationAttachmentDir as q, firePostMergeLifecycle as r, resolveConversationGitInfo as rt, dashboardSessionCookieHeader as s, readLauncherPinnedSessionId as st, specialistsRouteLayer as t, invalidateAgentsCache as tt, rejectUnauthorizedDashboardSessionMintRequest as u, resolveCodexRolloutPath as ut, handleConversationCompact as v, validateOriginHeaders as vt, pickDeliverAs as w, handleConversationPlanAction as x, jsonResponse as xt, handleConversationControlAck as y, httpHandler as yt, startConversationModelBackfill as z };
|
|
7611
|
+
export { runInBatches as $, handleConversationDelete as A, stopConversationRuntime as B, isPiControlChannelHarness as C, conversationNeedsRunningRepair as D, validateConversationControlAckOrigin as E, isInsideGitWorkTree as F, cleanupOrphanedConversationAttachments as G, waitForPiTuiReady as H, resolveAllowedHarness as I, extractConversationAttachmentPaths as J, cleanupUnreferencedConversationAttachments as K, shouldReportUnresolvedLiveSession as L, handleConversationResume as M, handleConversationStop as N, conversationSessionAliveFromState as O, handleConversationSwitchModel as P, removeConversationAttachment as Q, spawnConversationSession as R, handleConversationThinkingLevel as S, jsonStringResponse as St, resolveConversationDeliveryMethod as T, waitForTmuxSession as U, tmuxSessionExists as V, cleanupConversationAttachments as W, hasConversationAttachment as X, getConversationAttachmentsRoot as Y, isManagedConversationAttachmentPath as Z, handleConversationCodexApproval as _, validateOrigin as _t, agentsRouteLayer as a, panCliInvocation as at, handleConversationDeliveryMethod as b, getDefaultCwd as bt, hasDashboardInternalToken as c, resolveAgentHarness as ct, rejectUnsafeDashboardMutationRequest as d, resolveJsonlPath as dt, evaluateSpawnGuardrails as et, saveAgentStateAndEmitEvent as f, resolvePiSessionPath as ft, handleConversationAbort as g, isTrustedOriginForHost as gt, deliverConversationViaControlChannel as h, getHeaderFromMap as ht, validateSpecialistAutoCompleteMetadata as i, getWorkAgentLifecycleStateSync as it, handleConversationRestartAll as j, handleConversationCreate as k, rejectUnauthorizedDashboardRequest as l, resolveClaudeSessionId as lt, codexConversationPendingInput as m, waitForSessionRespawn as mt, _serverManagedMerges as n, resolveAgentGitInfo as nt, dashboardCsrfToken as o, spawnPanCli as ot, saveAgentStateAndEmitEventProgram as p, isRespawnPending as pt, ensureConversationAttachmentDir as q, firePostMergeLifecycle as r, resolveConversationGitInfo as rt, dashboardSessionCookieHeader as s, readLauncherPinnedSessionId as st, specialistsRouteLayer as t, invalidateAgentsCache as tt, rejectUnauthorizedDashboardSessionMintRequest as u, resolveCodexRolloutPath as ut, handleConversationCompact as v, validateOriginHeaders as vt, pickDeliverAs as w, handleConversationPlanAction as x, jsonResponse as xt, handleConversationControlAck as y, httpHandler as yt, startConversationModelBackfill as z };
|
|
7486
7612
|
|
|
7487
|
-
//# sourceMappingURL=specialists-
|
|
7613
|
+
//# sourceMappingURL=specialists-JVO00bs7.js.map
|