@overdeck/desktop 0.45.21 → 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-CJIFA8Vg.js → acceptance-criteria-DOA0KgXx.js} +5 -5
- package/server/{advancing-selfheal-CPOBO5ZS.js → advancing-selfheal-BBu6DSNm.js} +6 -6
- package/server/{agent-gc-D6PUckBB.js → agent-gc-BV1q_2EV.js} +4 -4
- package/server/agent-state-Bg0lhqwj.js +3 -0
- package/server/{agent-state-service-DHwemt96.js → agent-state-service-CnzFKSAQ.js} +1 -1
- package/server/{agent-state-service-6MFQqnFy.js → agent-state-service-HoK8U4jW.js} +5 -5
- package/server/{agents-DbrHWunF.js → agents-B4Bjbkfv.js} +4 -4
- package/server/agents-FlIgQ3ql.js +3 -0
- package/server/{archive-planning-BOnwJq8M.js → archive-planning-DYrYojxl.js} +31 -7
- package/server/{archive-planning-MPpvQJL4.js → archive-planning-zkJb3BeM.js} +1 -1
- package/server/{artifact-index-jobs-BOoySTKD.js → artifact-index-jobs-C-xy7Z5v.js} +2 -2
- package/server/{backlog-auto-trigger-BUaFI44J.js → backlog-auto-trigger-GtG71X8H.js} +3 -3
- package/server/{behavior-Dg-D8eBG.js → behavior-B_-4EKF3.js} +2 -2
- package/server/{briefing-freshness-OouGbJ7d.js → briefing-freshness-DWdW7vUm.js} +2 -2
- package/server/{build-info-27NlbKhV.js → build-info-BT096lEl.js} +3 -3
- package/server/{build-info-Cv6CI7Gu.js → build-info-DgTqZkL5.js} +1 -1
- package/server/{checkpoint-manager-C7mFCY_E.js → checkpoint-manager-B7Bt29J0.js} +1 -1
- package/server/{checkpoint-manager-D64fCC4p.js → checkpoint-manager-DDqcGyu8.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-Vh-J15ge.js → checkpoints-C-AXLfYT.js} +2 -2
- package/server/{checkpoints-DwZqT2qQ.js → checkpoints-CpgCjAlN.js} +1 -1
- package/server/{claude-hooks-provision-CS5W_dhI.js → claude-hooks-provision-C8wdRnN1.js} +1 -1
- package/server/{claude-hooks-provision-BVLGfHrv.js → claude-hooks-provision-but-_qGY.js} +2 -2
- package/server/{claude-permissions-C2OrLYKL.js → claude-permissions-H_5wHQZQ.js} +2 -2
- package/server/{claude-settings-overlay-DWXjafJh.js → claude-settings-overlay-BTENVmYf.js} +1 -1
- package/server/{claude-settings-overlay-DX-fMFpC.js → claude-settings-overlay-CbSz0Dvb.js} +2 -2
- package/server/cli-BsVIHwzC.js +3 -0
- package/server/{cli-mvpEOb3w.js → cli-vBeXbPrq.js} +9 -9
- package/server/{cliproxy-Dvsr4ZkW.js → cliproxy-Bgb2XCqi.js} +2 -2
- package/server/{cliproxy-7g1nObvB.js → cliproxy-DW0V86F8.js} +1 -1
- package/server/{close-issue-8F6uawYj.js → close-issue-Dn_4c4G8.js} +5 -5
- package/server/{closed-issue-reaper-BhV-r-tC.js → closed-issue-reaper-CWpY2uBw.js} +1 -1
- package/server/{closed-issue-reaper-BaYQYF6w.js → closed-issue-reaper-hANY_ehE.js} +9 -9
- package/server/codex-Dg7Is5yb.js +3 -0
- package/server/{codex-D_UBEOwL.js → codex-TmSi-yTv.js} +30 -8
- package/server/{codex-parser-BTzlOZiV.js → codex-parser-C4gSH-IR.js} +2 -2
- package/server/{config-CrduXs4a.js → config-CCvjQf27.js} +2 -2
- package/server/{config-nAB_F-Gp.js → config-DUIhMN_T.js} +1 -1
- package/server/{config-G1TOMJZA.js → config-DjLOdbgT.js} +2 -2
- package/server/{config-yaml-Ciyp2mYe.js → config-yaml-DvyMuOle.js} +177 -211
- package/server/{conflict-gate-BKalpcjL.js → conflict-gate-BSJkNTdp.js} +1 -1
- package/server/{conflict-gate-BLUNMs1i.js → conflict-gate-CmrYpa47.js} +3 -3
- package/server/{context-layers-YNpf6Q_I.js → context-layers-B3Nt58jl.js} +2 -2
- package/server/{context-layers-Cg9ZgVfx.js → context-layers-ZYFcWiyc.js} +3 -3
- package/server/{control-settings-D_79A6gp.js → control-settings-aP1ANIlI.js} +4 -4
- package/server/{conversation-compaction-DiuZbIUB.js → conversation-compaction-CNbTLB86.js} +8 -8
- package/server/{conversation-compaction-CMIeWW4_.js → conversation-compaction-DiG5zWQq.js} +1 -1
- package/server/{conversation-service-DQybSPUK.js → conversation-service-Du-MTNpJ.js} +6 -6
- package/server/{conversation-service-CWk8mEym.js → conversation-service-Up7FEzIC.js} +1 -1
- package/server/{conversations-BJ-t3BRm.js → conversations-6mPANqvL.js} +1 -1
- package/server/{conversations-BUgGvqVL.js → conversations-DbOs1e9Q.js} +4 -4
- package/server/{cost-jJ2cgDcG.js → cost-CW4WSe72.js} +3 -3
- package/server/{cost-Drm7qeD5.js → cost-Ca0YTWDw.js} +18 -2
- package/server/{cost-sync-DzHP6zaR.js → cost-sync-C0VdGme1.js} +3 -3
- package/server/{dag-DIji6O2b.js → dag-CdOjJVDT.js} +9 -9
- package/server/{dangerous-git-ops-BebB-61h.js → dangerous-git-ops-CT-IypG3.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-pleYrvIm.js → deacon-DYSEJb48.js} +3 -3
- package/server/{deacon-nudge-log-C5VCKtyi.js → deacon-nudge-log-Bjg8U4Y9.js} +3 -3
- package/server/{deacon-1s7bM5zn.js → deacon-pRnyD5w9.js} +1133 -474
- package/server/deacon-swarm-9jRLS5Ke.js +2 -0
- package/server/{deacon-swarm-DmA3rJ7k.js → deacon-swarm-DftYRDo8.js} +17 -17
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-DmM6F-yw.js → deploy-patrol-Bjsho_ha.js} +136 -19
- package/server/{deploy-window-ClLq1RYf.js → deploy-window-CM6W1-c6.js} +1 -1
- package/server/{deploy-window-jw4S_Y-c.js → deploy-window-DeP_OIRk.js} +77 -10
- package/server/{dev-supervisor-Do2Stz49.js → dev-supervisor-BpMoHlkR.js} +2 -2
- package/server/{devcontainer-renderer-D8ylupco.js → devcontainer-renderer-CtUgrVKW.js} +3 -3
- package/server/dist-Bd3vn0Hw.js +3 -0
- package/server/{dist-yfR7G1BL.js → dist-DyRx4cI7.js} +1 -1
- package/server/{docker-ClwPQaba.js → docker-BK7HIcBj.js} +2 -2
- package/server/{dod-BLphkhjs.js → dod-BrSfUHm0.js} +1 -1
- package/server/{ensure-devcontainer-BA3bICoY.js → ensure-devcontainer-DRqaAkBR.js} +1 -1
- package/server/{ensure-devcontainer-CFpQatOc.js → ensure-devcontainer-DseivYEy.js} +4 -4
- package/server/{esm-shims-BZw-fTQ6.js → esm-shims-CbI3BVkl.js} +1 -1
- package/server/{event-store-DABarGNz.js → event-store-Cr5PQwFC.js} +1 -1
- package/server/{event-store-BVnON3vf.js → event-store-tdiY5eDZ.js} +3 -3
- package/server/{events-CmERlnwn.js → events-CC1dgUpx.js} +3 -3
- package/server/{events-LGeUehYW.js → events-CvvGK6LT.js} +1 -1
- package/server/{factory-CQNprtHe.js → factory-CynerjXO.js} +50 -13
- package/server/{feature-registry-population-D9Z3tYSa.js → feature-registry-population-B0pmAz0a.js} +4 -4
- package/server/{feature-registry-storage-BWymOgXE.js → feature-registry-storage-_wUBRD3J.js} +2 -2
- package/server/{features--fOza5g5.js → features-Dhxz-wLc.js} +2 -2
- package/server/{feedback-target-Dqik2WTe.js → feedback-target-CPS15Vte.js} +7 -7
- package/server/{feedback-target-Dn9vfPpz.js → feedback-target-iygZwmMc.js} +1 -1
- package/server/{feedback-writer-Wlq5-qgS.js → feedback-writer-C9b6ccN1.js} +6 -5
- package/server/{feedback-writer-DDQNV8uc.js → feedback-writer-qmiMbqTZ.js} +1 -1
- package/server/{flywheel-Q-38YhZG.js → flywheel-DMCUzDWg.js} +1 -1
- package/server/{flywheel-1Wd8WDlh.js → flywheel-DSSpWmqF.js} +13 -13
- package/server/{flywheel-DPUc8r3V.js → flywheel-DcBkQvgE.js} +14 -14
- package/server/{flywheel-merge-order-CeBuX0EJ.js → flywheel-merge-order-C-6zRLvM.js} +1 -1
- package/server/{flywheel-merge-order-4SqOXFAr.js → flywheel-merge-order-DxbQKE1d.js} +8 -8
- package/server/forge-B-ZWyTRm.js +2 -0
- package/server/{forge-DBbDpiYc.js → forge-Ch9gCFod.js} +2 -2
- package/server/{from-hh6vTBGl.js → from-CJ_aH5jD.js} +1 -1
- package/server/{fts-db-6ponMie2.js → fts-db-CKgg0VKg.js} +2 -2
- package/server/{fts-operations-KIRK165y.js → fts-operations-BrL_VTRr.js} +2 -2
- package/server/git-utils-BVa07a4a.js +198 -0
- package/server/{git-utils-DmF5xkj8.js → git-utils-Dry_Ka_D.js} +1 -1
- package/server/{github-app-B3yfECo8.js → github-app-CMBdIFBQ.js} +11 -3
- package/server/{github-app-CeSVFL6C.js → github-app-CPfoFAdV.js} +1 -1
- package/server/{github-client-Dslipypz.js → github-client--XVlDpwM.js} +2 -2
- package/server/{github-client-4A6FgA8O.js → github-client-B4QsdE-X.js} +1 -1
- package/server/{github-pr-lookup-DBP0YHMr.js → github-pr-lookup-BRbDW-qk.js} +2 -2
- package/server/harness-binary-CVio2m-u.js +106 -0
- package/server/{harness-resolve-BGpO-OVM.js → harness-resolve-qHJBhy3Z.js} +9 -15
- package/server/{health-events-CZGZ5I-A.js → health-events-C9B8y1Hm.js} +2 -2
- package/server/{health-events-CnwV_SSz.js → health-events-CpfvuVmm.js} +1 -1
- package/server/{hooks-CoNscX84.js → hooks-DUXw8A0-.js} +2 -2
- package/server/{hooks-DvX33gY_.js → hooks-ltecuFqZ.js} +1 -1
- package/server/{hume-DSJt5eA_.js → hume-BEq0bUDg.js} +2 -2
- package/server/hume-B_DbflNM.js +3 -0
- package/server/{idle-stack-reaper-5DVRoY6P.js → idle-stack-reaper-D7w9t3fE.js} +1 -1
- package/server/{idle-stack-reaper-BfL8HqYy.js → idle-stack-reaper-w1ISSlhs.js} +2 -2
- package/server/{in-flight-guard-tVGiI5ee.js → in-flight-guard-aQ1IxeI3.js} +2 -2
- package/server/{infra-DN2wSxle.js → infra-CzaSOgul.js} +4 -4
- package/server/{injection-DtlT8Akv.js → injection-DZ0PfYa4.js} +7 -7
- package/server/{injection-DK9zh_HL.js → injection-oNZeoDhL.js} +1 -1
- package/server/{inspect-agent-DKByUS_F.js → inspect-agent-DJKLWcVT.js} +15 -11
- package/server/inspect-agent-ch-F-5Ci.js +2 -0
- package/server/{internal-token-DhfFiwW7.js → internal-token-Bb4XeV2x.js} +2 -2
- package/server/{internal-token-7bYL5v6K.js → internal-token-DXdfprGr.js} +1 -1
- package/server/{io-BiM-7Zsx.js → io-B3_AHDfr.js} +160 -184
- package/server/{issue-closed-Dfw3QDyZ.js → issue-closed-zhdvQicO.js} +7 -7
- package/server/{issue-lifecycle-B7HZWnTA.js → issue-lifecycle-CreaCkjW.js} +22 -22
- package/server/{issue-lifecycle-ytsEdDlK.js → issue-lifecycle-Dy4vd0Oa.js} +1 -1
- package/server/{issue-service-singleton-CPESc4Or.js → issue-service-singleton-B5ushCvE.js} +8 -8
- package/server/{issue-service-singleton-D5EB5eYr.js → issue-service-singleton-DabvBWUp.js} +1 -1
- package/server/{issues-XYtFMxrH.js → issues-B6ToV6x1.js} +2 -2
- package/server/{jsonl-parser-DJV2eZUP.js → jsonl-parser-Dhflo1SH.js} +3 -3
- package/server/{label-cleanup-CJ4m8iRU.js → label-cleanup-BKPJm4Hv.js} +3 -3
- package/server/{label-reconciler-CNf3Ylm3.js → label-reconciler-DdWbHEBu.js} +4 -4
- package/server/{launcher-generator-5DJRiovn.js → launcher-generator-CHVm7bGT.js} +10 -9
- package/server/{layers-cZx7ibtV.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-DMurK4oM.js → lifecycle-io-D8iNBcux.js} +37 -37
- package/server/{lifecycle-CE7619Xw.js → lifecycle-sycO16hj.js} +6 -6
- package/server/{linear-client-BLyN-NiP.js → linear-client-D4zqMnX7.js} +2 -2
- package/server/{linear-client-Bj1l4FOA.js → linear-client-DqhDQO9k.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-hSC2BENe.js → merge-C_ZEhbqI.js} +3 -3
- package/server/{merge-CwX2_AWm.js → merge-DK23JEdS.js} +1 -1
- package/server/{merge-agent-CnORPiri.js → merge-agent-BQM3a8z5.js} +1 -1
- package/server/{merge-agent-DnBsms_V.js → merge-agent-XrB80vfT.js} +369 -213
- package/server/{merge-batch-C2w2U2eK.js → merge-batch-Bwoyr8Je.js} +1 -1
- package/server/{merge-blockers-DhRgh76x.js → merge-blockers-BsFjGrQ8.js} +2 -2
- package/server/merge-ops-DlB1IM0Y.js +2 -0
- package/server/{merge-rebase-CE-ZyOMY.js → merge-rebase-C1KIVr0s.js} +2 -2
- package/server/{merge-set-D7YNU1ZB.js → merge-set-DLz0MkGT.js} +3 -3
- package/server/{merge-set-DHkzPCJU.js → merge-set-DnSYdBEp.js} +1 -1
- package/server/{merge-sync-De1FYva5.js → merge-sync-DZ9dojJn.js} +2 -2
- package/server/{merge-sync-CpGA9Kg7.js → merge-sync-SSv3E-pl.js} +1 -1
- package/server/{merge-train-SvkRJZ-k.js → merge-train-DxDfBTjr.js} +3 -3
- package/server/{merge-train-deps-CECJTElu.js → merge-train-deps-CyYQUksx.js} +4 -4
- package/server/{merge-verification-B3meGcXF.js → merge-verification-CSizH3HY.js} +4 -4
- package/server/{multipart-parser-ByTMgYV5.js → multipart-parser-Dt8YPN5S.js} +2 -2
- package/server/{no-resume-mode-BnInAFKs.js → no-resume-mode-Cx3K0hHi.js} +11 -8
- package/server/node_modules/.package-lock.json +5 -5
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +3 -3
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +2 -2
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +5 -5
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +6 -8
- package/server/{orphan-proposed-reconciler-CAfuWTA1.js → orphan-proposed-reconciler-BTkDrl4R.js} +1 -1
- package/server/{orphan-proposed-reconciler-AxAGUouN.js → orphan-proposed-reconciler-neK8dHQk.js} +23 -14
- package/server/package-lock.json +6 -6
- package/server/package.json +1 -1
- package/server/{pan-dir-Rw17YjT1.js → pan-dir-DeVUgwA7.js} +78 -58
- package/server/{paths-FP8v3lTz.js → paths-_zEts6wc.js} +2 -2
- package/server/{pickup-xi3KTLaJ.js → pickup-Dd0Znxxy.js} +2 -2
- package/server/{pipeline-membership-BtKMNY7v.js → pipeline-membership-0HaEGDlH.js} +190 -68
- package/server/{pipeline-notifier-dQ-U4NSb.js → pipeline-notifier-6iCJplFZ.js} +1 -1
- package/server/{pipeline-notifier-BM2HLF7B.js → pipeline-notifier-D0ykk59O.js} +2 -2
- package/server/{project-pipelines-B59NfN44.js → project-pipelines-2sK1apsO.js} +2 -2
- package/server/projects-9SkRpES9.js +3 -0
- package/server/{prompts-CbqaVjbe.js → prompts-Dp4Tpk39.js} +2 -2
- package/server/providers-DKkBXhxU.js +3 -0
- package/server/{providers-d3pwXGVE.js → providers-DV7ec8l7.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-BxYSL7J-.js → chunk-BO2N2NFS-CltymLRg.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-C_F9Q2as.js → diagram-OG6HWLK6-D2f6pjgA.js} +1 -1
- package/server/public/assets/{dist-DQNg4CiF.js → dist-BWR4qFiV.js} +1 -1
- package/server/public/assets/{dist-CLSlc6cV.js → dist-DEmlBBNQ.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-Cq0my-0C.js → ganttDiagram-6RSMTGT7-DnfiViPK.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-eZC03dGh.js → highlighted-body-OFNGDK62-B8Wrmj9H.js} +1 -1
- package/server/public/assets/index-CUr1xv8w.css +1 -0
- package/server/public/assets/{index-SLYGA8AQ.js → index-CsSuZQBI.js} +148 -145
- package/server/public/assets/{linear-6Fi3qnGg.js → linear-C9zFQpkX.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-Dpmc6xsv.js → pieDiagram-4H26LBE5-lR8H7Yjd.js} +1 -1
- package/server/public/assets/{prod-ojHllFvN.js → prod-B1jCQihw.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Ulr9gON5.js → quadrantDiagram-W4KKPZXB-CVQ2guem.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-CwdHGXfL.js → sankeyDiagram-5OEKKPKP-eD1RB4gm.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-r-bEDzJh.js → xychartDiagram-2RQKCTM6-ChEC6dQn.js} +1 -1
- package/server/public/index.html +54 -10
- package/server/{pull-requests-D3N6HQzI.js → pull-requests--Ib2jTgy.js} +1 -1
- package/server/{pull-requests-CjjPj7v6.js → pull-requests-CXIhdCYD.js} +13 -11
- package/server/{queries-B5hl7lMQ.js → queries-6d7Cdtm7.js} +723 -110
- package/server/{rally-Dp0Gb1DN.js → rally-B708-nZn.js} +3 -3
- package/server/{rally-api-DGaFz5L5.js → rally-api-nY0ZANw3.js} +2 -2
- package/server/{rally-api-CKr0O4DJ.js → rally-api-yjQ0TfHd.js} +1 -1
- package/server/{rally-client-SVbjGvqj.js → rally-client-B1EJhfV0.js} +4 -4
- package/server/{rally-client-Cqf6EX_r.js → rally-client-CULK2XAY.js} +1 -1
- package/server/rally-njs_mJrt.js +3 -0
- package/server/reap-terminal-sessions-MWnqdLCJ.js +4 -0
- package/server/{reap-terminal-sessions-CjqRAGw7.js → reap-terminal-sessions-N3BTkmX_.js} +11 -28
- package/server/{rebuild-stack-DHqCLvLX.js → rebuild-stack-Dp4eLkt4.js} +6 -6
- package/server/{rebuild-stack-DjdpALr1.js → rebuild-stack-kA7XngID.js} +1 -1
- package/server/{reconstruct-cache-BqrCQt0o.js → reconstruct-cache-uWbZfjms.js} +6 -6
- package/server/record-t6V-3Dcj.js +3 -0
- package/server/{record-update-BlB8mpKO.js → record-update-DACtKh6_.js} +1 -1
- package/server/record-update-Dq0t2uBG.js +310 -0
- package/server/{recovery-trip-l1Hsi37x.js → recovery-trip-BJtIQuag.js} +2 -2
- package/server/{release-engine-CSI4K6Oj.js → release-engine-DZpmGGzb.js} +5 -5
- package/server/{release-set-BywwggrE.js → release-set-hnXd_kga.js} +3 -3
- package/server/{remote-DYziAkiZ.js → remote-4tiENDaI.js} +3 -3
- package/server/{remote-cnoeuDWn.js → remote-Br-ZWVIP.js} +3 -3
- package/server/{remote-agents-BNORDWAX.js → remote-agents-CRCg1L4H.js} +1 -1
- package/server/{remote-agents-CZ2rc8I0.js → remote-agents-nmty1mLu.js} +6 -6
- package/server/{remote-completion-W67FNQ-A.js → remote-completion-BbWNd10K.js} +13 -13
- package/server/resume-CcKqnTvE.js +3 -0
- package/server/{review-agent-CSswH985.js → review-agent-DJRO8EG8.js} +1 -1
- package/server/{review-agent-CqSqSHkU.js → review-agent-sKkE1FEL.js} +23 -23
- package/server/{review-artifacts-BBgnd5df.js → review-artifacts-BLbSC4ke.js} +5 -5
- package/server/{review-context-Ctp9BdNJ.js → review-context-BgX3lcCx.js} +9 -9
- package/server/{review-status-CCgPVK1h.js → review-status-A7quS5KJ.js} +56 -39
- package/server/review-status-C6n6-9f_.js +3 -0
- package/server/{review-status-enrichment-DtDRGpst.js → review-status-enrichment-tbOn_A_u.js} +3 -3
- package/server/review-status-source-CxuEjLGg.js +39 -0
- package/server/{review-status-sync-jnLgd04F.js → review-status-sync-BhSQ0d0l.js} +2 -2
- package/server/{review-status-sync-C792ksoJ.js → review-status-sync-To3-iS-N.js} +1 -1
- package/server/{review-verdict-feedback-D5lW0o3k.js → review-verdict-feedback-C1Kg8n7t.js} +1 -1
- package/server/{review-verdict-feedback-CMsIpTpy.js → review-verdict-feedback-CTRNtzXO.js} +7 -7
- package/server/{rollup-B3kQmNpl.js → rollup-B53Y81xK.js} +1 -1
- package/server/{rollup-CLj_AK9f.js → rollup-WA0VD-Rr.js} +8 -8
- package/server/{scanner-C4NeC4FE.js → scanner-D2743cp8.js} +11 -7
- package/server/{sequence-io-Ce-6grIY.js → sequence-io-Cg0zYj_E.js} +4 -4
- package/server/{sequencer-agent-Bpz0yGmG.js → sequencer-agent-BGY8gjg-.js} +5 -5
- package/server/server.js +1348 -963
- package/server/{service-CqAY8Kmk.js → service-DCpB_SGd.js} +154 -51
- package/server/{session-fork-uNo4rMRA.js → session-fork-BQ8_6H32.js} +2 -2
- package/server/{session-history-DUehL3KN.js → session-history-CVZDpS3c.js} +4 -4
- package/server/{settings-DP2OYLXL.js → settings-BZ5m1UCl.js} +3 -3
- package/server/settings-D0OSwos5.js +2 -0
- package/server/{settings-D9grjmaP.js → settings-ylxwqwQG.js} +2 -2
- package/server/{shadow-engineering-Bi_oIMtF.js → shadow-engineering-BlxG6Xye.js} +3 -3
- package/server/{shadow-state-CDxEuPlE.js → shadow-state-C2_epgx2.js} +1 -1
- package/server/{shadow-state-a_ztFBJe.js → shadow-state-Dh-HzF2J.js} +2 -2
- package/server/{shadow-utils-CyOg6_Xq.js → shadow-utils-4bvjn9b3.js} +2 -2
- package/server/{ship-log-DDcueaIR.js → ship-log-ClSMIzZX.js} +1 -1
- package/server/{smart-compaction-C1_VVLEd.js → smart-compaction-CHIxLr_d.js} +1 -1
- package/server/{smart-compaction--Oj65Uov.js → smart-compaction-r4pHQBIr.js} +7 -7
- package/server/{spawn-planning-session-AiUSsBnH.js → spawn-planning-session-DWAorh2B.js} +25 -20
- package/server/{spawn-planning-session-LFtK2QCE.js → spawn-planning-session-KC_UduxD.js} +1 -1
- package/server/{specialist-completion-qOgqdqXH.js → specialist-completion-BXhav38U.js} +1 -1
- package/server/{specialist-context-gjj8Z4Ii.js → specialist-context-DtrYvGJ-.js} +5 -5
- package/server/{specialist-handoff-logger-BsBNvVZv.js → specialist-handoff-logger-C45ouoZ6.js} +2 -2
- package/server/{specialist-logs-CSLtvPx6.js → specialist-logs-DJ3RzKxW.js} +3 -3
- package/server/{specialists-D0VBf8g_.js → specialists-D5fRZXmN.js} +1 -1
- package/server/specialists-DVj0hvaL.js +3 -0
- package/server/{specialists-CYRwELzc.js → specialists-DyFeedjn.js} +66 -76
- package/server/{specialists-DAegTvRt.js → specialists-JVO00bs7.js} +374 -220
- package/server/specs-nN45DG2X.js +3 -0
- package/server/{src-OLoJhUiJ.js → src-CG9mCkP6.js} +6 -6
- package/server/{src-BqTcrfO_.js → src-CMTQGyCK.js} +3 -3
- package/server/{src-Dpq1yFIl.js → src-U7_kTPEE.js} +338 -4
- package/server/{stack-health-I713ELld.js → stack-health-Df0YEZKa.js} +1 -1
- package/server/{stack-health-DV_f-lK0.js → stack-health-puygdaMd.js} +2 -2
- package/server/{stale-task-claims-CQSKZVq0.js → stale-task-claims-BbFwCTb0.js} +4 -4
- package/server/{staleness-BbsGxmF2.js → staleness-Bpy41ngS.js} +15 -3
- package/server/{staleness-zGp4P1hd.js → staleness-Cbl_w4Bw.js} +1 -1
- package/server/{state-home-DixkE-up.js → state-home-CIGjwNfJ.js} +119 -54
- package/server/state-migrate-Dkzaxvny.js +487 -0
- package/server/{stuck-remediation-BWkK_O7A.js → stuck-remediation-CzEov_fq.js} +27 -21
- package/server/{stuck-remediation-CTPRC2S5.js → stuck-remediation-sY_MHHgQ.js} +1 -1
- package/server/{substrate-bug-weights-service-DXd0ID83.js → substrate-bug-weights-service-BH66lhm7.js} +3 -3
- package/server/{summary-fork-CdLn8Chr.js → summary-fork-D8bXjCr7.js} +2 -2
- package/server/{summary-fork-f3DpgjXh.js → summary-fork-DHhJIsAL.js} +8 -8
- package/server/{supervisor-Ch8CDuoF.js → supervisor-BO-Zk_h-.js} +3 -3
- package/server/supervisor-BPy-o1A8.js +2 -0
- package/server/{swarm-readiness-C9P2iPap.js → swarm-readiness-CQ_fwUWF.js} +4 -4
- package/server/{system-prerequisites-DkoQBn1q.js → system-prerequisites-Bza0ffAh.js} +24 -44
- package/server/{teardown-workspace-D-5yMyit.js → teardown-workspace-CEgauF4U.js} +15 -15
- package/server/{test-agent-queue-BwpUpu-o.js → test-agent-queue-DXDt0Xa-.js} +7 -7
- package/server/{test-verdict-BRiSu7eW.js → test-verdict-CmUBK5cT.js} +1 -1
- package/server/{test-verdict-BQ1yx7d4.js → test-verdict-DFjjIHR5.js} +1 -1
- package/server/{tldr-daemon-DjxP5g6Y.js → tldr-daemon-BDtLOIlO.js} +2 -2
- package/server/{tldr-daemon-BJA7TkqS.js → tldr-daemon-DL566HbH.js} +1 -1
- package/server/tmux-DoThH6aj.js +3 -0
- package/server/{tmux-y1blSxks.js → tmux-ftABRAmc.js} +76 -44
- package/server/{token-LUrbM9sU.js → token-CsOhvw42.js} +2 -2
- package/server/{token-util-BZaDAQ8S.js → token-util-CTmczIfW.js} +1 -1
- package/server/token-util-DrHg8abn.js +3 -0
- package/server/{tracker-config-DSFZBdXP.js → tracker-config-B4itFzDo.js} +2 -2
- package/server/{tracker-utils-WtP_V-yn.js → tracker-utils-BePq_oj-.js} +1 -1
- package/server/{tracker-utils-DiceZN3a.js → tracker-utils-tnxxqROg.js} +2 -2
- package/server/{traefik-connect-BXqfOP4-.js → traefik-connect-m73vGebA.js} +1 -1
- package/server/{tunnel-DTng1rfQ.js → tunnel-B2vxjx_b.js} +3 -3
- package/server/{tunnel-WcJImbAC.js → tunnel-Cgj-IGIl.js} +1 -1
- package/server/{types-BjaZ1oqH.js → types-BBNjPcqU.js} +1 -1
- package/server/{types-DqeBMmJN.js → types-hraoaQIp.js} +1 -1
- package/server/{uat-train-BpLnp7Cx.js → uat-train-CuEn0t9M.js} +28 -28
- package/server/{uat-train-Wismge7h.js → uat-train-cKfM-_WW.js} +1 -1
- package/server/{validation-BA4e5EGm.js → validation-B5JxoPUS.js} +259 -9
- package/server/{validation-CUWamZ4X.js → validation-CIi6pnI2.js} +1 -1
- package/server/{verification-artifact-Dr_0g9nb.js → verification-artifact-BcnIbigL.js} +1 -1
- package/server/{verification-artifact-CrbI4tJE.js → verification-artifact-C-lIHfUa.js} +1 -1
- package/server/{verification-runner-gAzh3cVD.js → verification-runner-Br0S_Ous.js} +103 -37
- package/server/{verification-runner-Dcksl_P-.js → verification-runner-CDj4lD4t.js} +1 -1
- package/server/{vtt-parser-3VZKsmSm.js → vtt-parser-DKpNNW5i.js} +1 -1
- package/server/{work-agent-prompt-ULdcANl5.js → work-agent-prompt-Yb2bd3Fq.js} +16 -15
- package/server/{workflows-B8ROFlfw.js → workflows-C9WmILql.js} +39 -77
- package/server/workflows-D90rMOya.js +2 -0
- package/server/{workspace-DhTDA8nB.js → workspace-BVl4rihN.js} +3 -3
- package/server/{workspace-DSjUJaJN.js → workspace-DuUdndHe.js} +1 -1
- package/server/{workspace-config-BAAsAv-o.js → workspace-config-cEGcO6UT.js} +1 -1
- package/server/{workspace-manager-CcujONCR.js → workspace-manager-ZTdJAy9M.js} +1 -1
- package/server/{workspace-manager-DsN52IMG.js → workspace-manager-hLUv3ADC.js} +23 -16
- package/server/{workspace-metadata-DIL5_U4c.js → workspace-metadata-CskwzzhL.js} +2 -2
- package/server/{workspace-metadata-CftOpNLs.js → workspace-metadata-DNpMixRq.js} +1 -1
- package/server/{workspaces-Dmlh1YXm.js → workspaces-hWvy9eKs.js} +276 -110
- 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 +26 -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-BV_6RHnO.js +0 -3
- package/server/agents-Czz6R57Z.js +0 -3
- package/server/cli-ChErG518.js +0 -3
- package/server/codex-BBeZ8c3s.js +0 -3
- package/server/deacon-swarm-uudlSCLM.js +0 -2
- package/server/dist-BEDL2alY.js +0 -3
- package/server/forge-DbhJyH6u.js +0 -2
- package/server/git-utils-Bkxzr1Xf.js +0 -129
- package/server/hume-BrA1tUuk.js +0 -3
- package/server/inspect-agent-CyXNo9fM.js +0 -2
- package/server/lifecycle-io-CUpsxG0p.js +0 -3
- package/server/merge-ops-BpTtuO8x.js +0 -2
- package/server/projects-IRHJIPYC.js +0 -3
- package/server/providers-BqCdTryq.js +0 -3
- package/server/public/assets/index-C6NLz_1S.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-BNwFoQsf.js +0 -1
- package/server/rally-DGimSRBQ.js +0 -3
- package/server/reap-terminal-sessions-C1mfzoZo.js +0 -3
- package/server/record-update-RviRDSNs.js +0 -168
- package/server/record-us0YECMO.js +0 -3
- package/server/resume-OyN3dEXE.js +0 -3
- package/server/review-status-DXeqFpk5.js +0 -3
- package/server/settings-BaPXXJsT.js +0 -2
- package/server/specialists-C6WkeKFK.js +0 -3
- package/server/specs-BsNcum0h.js +0 -3
- package/server/state-migrate-_zJJ6XKE.js +0 -362
- package/server/supervisor-Qy1QecAs.js +0 -2
- package/server/tmux-HQLgwo_C.js +0 -3
- package/server/token-util-Cg-QnowA.js +0 -3
- package/server/workflows-C5c-RPsY.js +0 -2
|
@@ -1,42 +1,44 @@
|
|
|
1
1
|
import { a as __toCommonJS } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import {
|
|
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 {
|
|
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-
|
|
20
|
-
import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-
|
|
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 { a as
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import { o as
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import { a as
|
|
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
|
+
import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-hraoaQIp.js";
|
|
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";
|
|
40
42
|
import { basename, delimiter, dirname, join, resolve } from "node:path";
|
|
41
43
|
import { Cause, Data, Effect, Layer, Option, Schema, Stream } from "effect";
|
|
42
44
|
import { join as join$1 } from "path";
|
|
@@ -98,9 +100,8 @@ init_cost();
|
|
|
98
100
|
init_behavior();
|
|
99
101
|
init_persistent_logger();
|
|
100
102
|
init_tracker_config();
|
|
101
|
-
init_types();
|
|
102
|
-
init_review_status();
|
|
103
103
|
init_lifecycle();
|
|
104
|
+
init_review_status();
|
|
104
105
|
init_io();
|
|
105
106
|
/**
|
|
106
107
|
* Resolve the default cwd used when no project is selected — the "devroot"
|
|
@@ -196,6 +197,7 @@ init_model_validation();
|
|
|
196
197
|
init_provider_health();
|
|
197
198
|
init_claude_permissions();
|
|
198
199
|
init_layers();
|
|
200
|
+
init_harness_binary();
|
|
199
201
|
init_ohmypi_fifo();
|
|
200
202
|
init_pi_fifo();
|
|
201
203
|
init_stack_health();
|
|
@@ -579,7 +581,7 @@ async function resolveCodexRolloutPath(agentId, opts = {}) {
|
|
|
579
581
|
const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
|
|
580
582
|
const codexHome = join(agentDir, "codex-home");
|
|
581
583
|
if (!await pathExists$1(codexHome)) return null;
|
|
582
|
-
const { findRolloutPath, findLatestRollout } = await import("./codex-
|
|
584
|
+
const { findRolloutPath, findLatestRollout } = await import("./codex-Dg7Is5yb.js");
|
|
583
585
|
const threadId = (await readOptional(join(agentDir, "codex-thread-id")))?.trim();
|
|
584
586
|
if (threadId) {
|
|
585
587
|
const rollout = findRolloutPath(codexHome, threadId);
|
|
@@ -640,12 +642,13 @@ async function resolveJsonlPath(agentId, workspacePath, opts = {}) {
|
|
|
640
642
|
logTranscriptResolution(agentId, `missing-session-id:${harness ?? "unknown"}`, `failed harness=${harness ?? "unknown"} reason=no-session-id checked=session.id,sessions.json,runtime-state`, opts);
|
|
641
643
|
return null;
|
|
642
644
|
}
|
|
643
|
-
const
|
|
645
|
+
const effectiveWorkspacePath = (await readRecordedState(agentId, opts)).workspace ?? workspacePath;
|
|
646
|
+
const jsonlPath = join(opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects"), encodeClaudeProjectDir(effectiveWorkspacePath), `${claudeSessionId}.jsonl`);
|
|
644
647
|
if (await pathExists$1(jsonlPath)) {
|
|
645
648
|
logTranscriptResolution(agentId, `resolved:${jsonlPath}`, `resolved harness=${harness ?? "claude-code"} sessionId=${claudeSessionId} path=${jsonlPath}`, opts);
|
|
646
649
|
return jsonlPath;
|
|
647
650
|
}
|
|
648
|
-
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);
|
|
649
652
|
return null;
|
|
650
653
|
}
|
|
651
654
|
//#endregion
|
|
@@ -832,15 +835,14 @@ const getWorkAgentLifecycleState = (agentOrIssueId) => Effect.promise(() => getW
|
|
|
832
835
|
* expected feature branch. Reports drift and missing-workspace state
|
|
833
836
|
* because both are silent failure modes today.
|
|
834
837
|
*
|
|
835
|
-
* Cache: in-memory,
|
|
836
|
-
*
|
|
837
|
-
*
|
|
838
|
-
*
|
|
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.
|
|
839
842
|
*
|
|
840
843
|
* All I/O is async (execFile / fs.promises). No execSync, no readFileSync.
|
|
841
844
|
*/
|
|
842
845
|
const execFileAsync$3 = promisify(execFile);
|
|
843
|
-
const GIT_INFO_TTL_MS = 3e4;
|
|
844
846
|
const GIT_INFO_TIMEOUT_MS = 2e3;
|
|
845
847
|
const cache = /* @__PURE__ */ new Map();
|
|
846
848
|
/**
|
|
@@ -915,22 +917,20 @@ async function readGitInfoFresh(absPath) {
|
|
|
915
917
|
};
|
|
916
918
|
}
|
|
917
919
|
/**
|
|
918
|
-
* Resolve branch + worktree status for a conversation cwd. Cached
|
|
919
|
-
*
|
|
920
|
+
* Resolve branch + worktree status for a conversation cwd. Cached until the
|
|
921
|
+
* HEAD mtime changes.
|
|
920
922
|
*/
|
|
921
923
|
async function resolveConversationGitInfo(absPath) {
|
|
922
|
-
const now = Date.now();
|
|
923
924
|
const headMtimeMs = await readHeadMtimeMs(absPath);
|
|
924
925
|
if (headMtimeMs === null) return {
|
|
925
926
|
branch: null,
|
|
926
927
|
isWorktree: false
|
|
927
928
|
};
|
|
928
929
|
const cached = cache.get(absPath);
|
|
929
|
-
if (cached && cached.
|
|
930
|
+
if (cached && cached.headMtimeMs === headMtimeMs) return cached.value;
|
|
930
931
|
const value = await readGitInfoFresh(absPath);
|
|
931
932
|
cache.set(absPath, {
|
|
932
933
|
value,
|
|
933
|
-
expiresAt: now + GIT_INFO_TTL_MS,
|
|
934
934
|
headMtimeMs
|
|
935
935
|
});
|
|
936
936
|
return value;
|
|
@@ -1375,8 +1375,31 @@ function hasActiveAgentGateOrRetry(state, nowMs = Date.now()) {
|
|
|
1375
1375
|
}
|
|
1376
1376
|
function evaluateSpawnGuardrails(health) {
|
|
1377
1377
|
const warnings = [];
|
|
1378
|
+
if (health.freshness.status !== "fresh") {
|
|
1379
|
+
const message = health.freshness.status === "stale" ? `System health evidence is stale: ${health.freshness.reason.message}` : "System health is still measuring; fresh admission evidence is not available yet.";
|
|
1380
|
+
warnings.push({
|
|
1381
|
+
severity: "critical",
|
|
1382
|
+
code: "health_snapshot_unavailable",
|
|
1383
|
+
message
|
|
1384
|
+
});
|
|
1385
|
+
return {
|
|
1386
|
+
blocked: true,
|
|
1387
|
+
requiresAcknowledgement: false,
|
|
1388
|
+
status: 503,
|
|
1389
|
+
error: message,
|
|
1390
|
+
hint: "Wait for a fresh system health assessment before starting this agent.",
|
|
1391
|
+
warnings,
|
|
1392
|
+
health: {
|
|
1393
|
+
severity: health.severity,
|
|
1394
|
+
summary: health.summary,
|
|
1395
|
+
reasons: health.reasons,
|
|
1396
|
+
leakedSpecialists: health.leakedSpecialists,
|
|
1397
|
+
freshness: health.freshness
|
|
1398
|
+
}
|
|
1399
|
+
};
|
|
1400
|
+
}
|
|
1378
1401
|
const availableGb = Math.round(health.summary.availableMemoryBytes / 1024 ** 3 * 10) / 10;
|
|
1379
|
-
const workAgentCount = health.
|
|
1402
|
+
const workAgentCount = health.admission.admittedWorkAgentCount;
|
|
1380
1403
|
const leakedSpecialists = health.leakedSpecialists;
|
|
1381
1404
|
const resourceConfig = getResourceConfig();
|
|
1382
1405
|
const hardWorkAgentLimit = resolveAgentCountEnv("PAN_AGENT_BLOCK_COUNT", resourceConfig.agentBlockCount);
|
|
@@ -1424,7 +1447,8 @@ function evaluateSpawnGuardrails(health) {
|
|
|
1424
1447
|
severity: health.severity,
|
|
1425
1448
|
summary: health.summary,
|
|
1426
1449
|
reasons: health.reasons,
|
|
1427
|
-
leakedSpecialists: health.leakedSpecialists
|
|
1450
|
+
leakedSpecialists: health.leakedSpecialists,
|
|
1451
|
+
freshness: health.freshness
|
|
1428
1452
|
}
|
|
1429
1453
|
};
|
|
1430
1454
|
}
|
|
@@ -1438,7 +1462,8 @@ function evaluateSpawnGuardrails(health) {
|
|
|
1438
1462
|
severity: health.severity,
|
|
1439
1463
|
summary: health.summary,
|
|
1440
1464
|
reasons: health.reasons,
|
|
1441
|
-
leakedSpecialists: health.leakedSpecialists
|
|
1465
|
+
leakedSpecialists: health.leakedSpecialists,
|
|
1466
|
+
freshness: health.freshness
|
|
1442
1467
|
}
|
|
1443
1468
|
};
|
|
1444
1469
|
}
|
|
@@ -1700,7 +1725,7 @@ const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", http
|
|
|
1700
1725
|
} catch {}
|
|
1701
1726
|
let stdout;
|
|
1702
1727
|
if (isRemote && vmName) {
|
|
1703
|
-
const { getRemoteAgentOutput } = await import("./remote-agents-
|
|
1728
|
+
const { getRemoteAgentOutput } = await import("./remote-agents-CRCg1L4H.js");
|
|
1704
1729
|
stdout = await getRemoteAgentOutput(id, vmName, parseInt(String(lines), 10) || 100);
|
|
1705
1730
|
} else stdout = await Effect.runPromise(capturePane(id, parseInt(String(lines), 10) || 100));
|
|
1706
1731
|
if (!stdout || stdout.trim() === "" || stdout.trim() === "Session not found") {
|
|
@@ -1880,7 +1905,7 @@ const postAgentTellRoute = postAgentMessageLikeRoute("/api/agents/:id/tell");
|
|
|
1880
1905
|
const postAgentPokeRoute = HttpRouter.add("POST", "/api/agents/:id/poke", httpHandler(Effect.gen(function* () {
|
|
1881
1906
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
1882
1907
|
const { message } = yield* readJsonBody$1;
|
|
1883
|
-
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?";
|
|
1884
1909
|
yield* Effect.promise(() => messageAgent(id, pokeMsg));
|
|
1885
1910
|
return jsonResponse({
|
|
1886
1911
|
success: true,
|
|
@@ -2121,7 +2146,7 @@ async function cleanupConversationAttachments(name) {
|
|
|
2121
2146
|
* sessions that the lifecycle poller missed. */
|
|
2122
2147
|
async function cleanupOrphanedConversationAttachments() {
|
|
2123
2148
|
try {
|
|
2124
|
-
const { listConversations } = await import("./conversations-
|
|
2149
|
+
const { listConversations } = await import("./conversations-6mPANqvL.js");
|
|
2125
2150
|
const convNames = new Set(listConversations().map((c) => c.name));
|
|
2126
2151
|
const root = getConversationAttachmentsRoot();
|
|
2127
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, {
|
|
@@ -2652,6 +2677,7 @@ function isNotFound(error) {
|
|
|
2652
2677
|
}
|
|
2653
2678
|
async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model, effort, issueId, resume = false, harness = "claude-code", plainFork = false) {
|
|
2654
2679
|
const behavior = getHarnessBehavior(harness);
|
|
2680
|
+
const harnessLaunch = await prepareHarnessLaunch(harness);
|
|
2655
2681
|
const stateDir = join(getOverdeckHome(), "conversations", tmuxSession);
|
|
2656
2682
|
await mkdir(stateDir, { recursive: true });
|
|
2657
2683
|
clearReadySignal(tmuxSession);
|
|
@@ -2699,7 +2725,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
2699
2725
|
const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
|
|
2700
2726
|
const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
|
|
2701
2727
|
const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
|
|
2702
|
-
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-
|
|
2728
|
+
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-Dg7Is5yb.js");
|
|
2703
2729
|
initCodexHome(codexHome, {
|
|
2704
2730
|
trustedDir: cwd,
|
|
2705
2731
|
approvalPolicy: codexApprovalPolicy,
|
|
@@ -2745,7 +2771,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
2745
2771
|
...issueId ? { issueId } : {},
|
|
2746
2772
|
...piFields || codexFields || useSupervisor ? { agentId: tmuxSession } : {}
|
|
2747
2773
|
},
|
|
2748
|
-
extraEnvExports: [`export OVERDECK_DASHBOARD_URL="http://127.0.0.1:${process.env["API_PORT"] ?? process.env["PORT"] ?? "3011"}"`],
|
|
2774
|
+
extraEnvExports: [harnessLaunch.pathExport, `export OVERDECK_DASHBOARD_URL="http://127.0.0.1:${process.env["API_PORT"] ?? process.env["PORT"] ?? "3011"}"`],
|
|
2749
2775
|
providerExports: providerExportsStr || void 0,
|
|
2750
2776
|
trapHup: true,
|
|
2751
2777
|
baseCommand: runtimeCommand,
|
|
@@ -2768,7 +2794,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
2768
2794
|
} catch {}
|
|
2769
2795
|
console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
|
|
2770
2796
|
try {
|
|
2771
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
2797
|
+
const { preTrustDirectory } = await import("./workspace-manager-ZTdJAy9M.js");
|
|
2772
2798
|
preTrustDirectory(cwd);
|
|
2773
2799
|
} catch {}
|
|
2774
2800
|
try {
|
|
@@ -2785,7 +2811,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
2785
2811
|
const codexHomeDir = codexFields.codexHome;
|
|
2786
2812
|
(async () => {
|
|
2787
2813
|
try {
|
|
2788
|
-
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-
|
|
2814
|
+
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-Dg7Is5yb.js");
|
|
2789
2815
|
const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
|
|
2790
2816
|
if (rollout) {
|
|
2791
2817
|
const threadId = extractThreadIdFromRollout(rollout);
|
|
@@ -3664,7 +3690,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
|
|
|
3664
3690
|
error: "missing agent id"
|
|
3665
3691
|
}, { status: 400 });
|
|
3666
3692
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
3667
|
-
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"));
|
|
3668
3694
|
const expected = getInternalTokenSync();
|
|
3669
3695
|
if (!expected) return jsonResponse({
|
|
3670
3696
|
ok: false,
|
|
@@ -3931,7 +3957,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
|
|
|
3931
3957
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
3932
3958
|
const urlOpt = HttpServerRequest.toURL(request);
|
|
3933
3959
|
const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
|
|
3934
|
-
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-
|
|
3960
|
+
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-CpfvuVmm.js"));
|
|
3935
3961
|
const endTime = /* @__PURE__ */ new Date();
|
|
3936
3962
|
const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
|
|
3937
3963
|
const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
|
|
@@ -3972,7 +3998,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
|
|
|
3972
3998
|
detail: String(decoded.failure)
|
|
3973
3999
|
}, { status: 400 })
|
|
3974
4000
|
};
|
|
3975
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
4001
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CnzFKSAQ.js"));
|
|
3976
4002
|
yield* (yield* AgentStateService).emit(decoded.success);
|
|
3977
4003
|
return {
|
|
3978
4004
|
ok: true,
|
|
@@ -4054,7 +4080,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
|
|
|
4054
4080
|
success: false,
|
|
4055
4081
|
error: "missing agent id"
|
|
4056
4082
|
}, { status: 400 });
|
|
4057
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
4083
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CnzFKSAQ.js"));
|
|
4058
4084
|
const snapshot = yield* (yield* AgentStateService).get(id);
|
|
4059
4085
|
if (!snapshot) return jsonResponse({
|
|
4060
4086
|
success: false,
|
|
@@ -4118,35 +4144,107 @@ function saveAgentStateAndEmitEvent(state, event) {
|
|
|
4118
4144
|
function saveAgentStateAndEmitEventProgram(state, event) {
|
|
4119
4145
|
return Effect.sync(() => saveAgentStateAndEmitEvent(state, event));
|
|
4120
4146
|
}
|
|
4121
|
-
|
|
4122
|
-
* Dependency-injected variant for tests.
|
|
4123
|
-
*/
|
|
4124
|
-
function saveAgentStateAndEmitEventWithDeps(db, eventStore, state, event) {
|
|
4125
|
-
prepareAgentStateForSave(state);
|
|
4126
|
-
writeAgentStateJsonSync(state);
|
|
4147
|
+
function writeProjectionRows(db, state, event) {
|
|
4127
4148
|
const record = event;
|
|
4128
4149
|
const timestamp = record["timestamp"] ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
4129
4150
|
const timestampMs = new Date(timestamp).getTime();
|
|
4130
4151
|
const payload = JSON.stringify(record["payload"] ?? {});
|
|
4131
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);
|
|
4132
4175
|
db.exec("BEGIN IMMEDIATE");
|
|
4133
4176
|
try {
|
|
4134
|
-
|
|
4135
|
-
db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
|
|
4136
|
-
db.prepare(`INSERT INTO events (type, timestamp, payload) VALUES (?, ?, ?)`).run(event.type, timestampMs, payload);
|
|
4137
|
-
const sequence = db.prepare(`SELECT last_insert_rowid() AS sequence`).get()?.sequence ?? 0;
|
|
4177
|
+
const rows = writeProjectionRows(db, state, event);
|
|
4138
4178
|
db.exec("COMMIT");
|
|
4139
|
-
|
|
4140
|
-
eventStore.emitStored(stored);
|
|
4141
|
-
logAgentLifecycleSync(state.id, `projected ${event.type} (seq=${sequence}) for ${state.id}`);
|
|
4142
|
-
return { sequence };
|
|
4179
|
+
return emitCommittedProjection(eventStore, state, event, rows);
|
|
4143
4180
|
} catch (err) {
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
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);
|
|
4214
|
+
throw err;
|
|
4215
|
+
}
|
|
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);
|
|
4147
4242
|
throw err;
|
|
4148
4243
|
}
|
|
4149
4244
|
}
|
|
4245
|
+
function rollbackAgentStartPlaceholderProgram(placeholder, fallback, event) {
|
|
4246
|
+
return Effect.sync(() => rollbackAgentStartPlaceholderWithDeps(getOverdeckDatabaseSync(), getEventStore(), placeholder, fallback, event));
|
|
4247
|
+
}
|
|
4150
4248
|
//#endregion
|
|
4151
4249
|
//#region routes/agents/lifecycle-stop.ts
|
|
4152
4250
|
init_agents$1();
|
|
@@ -4167,8 +4265,8 @@ function createAgentStopHandler(lifecycleEvent) {
|
|
|
4167
4265
|
yield* stopAgent(id);
|
|
4168
4266
|
if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
|
|
4169
4267
|
try {
|
|
4170
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
4171
|
-
const { findWorkspacePath } = await import("./archive-planning-
|
|
4268
|
+
const { resolveProjectFromIssueSync } = await import("./projects-9SkRpES9.js");
|
|
4269
|
+
const { findWorkspacePath } = await import("./archive-planning-zkJb3BeM.js");
|
|
4172
4270
|
const issueLower = stateBeforeStop.issueId.toLowerCase();
|
|
4173
4271
|
const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
|
|
4174
4272
|
if (workspacePath) {
|
|
@@ -5146,8 +5244,10 @@ const postAgentSwitchModelRoute = HttpRouter.add("POST", "/api/agents/:id/switch
|
|
|
5146
5244
|
return jsonResponse({ error: `Agent ${(yield* HttpRouter.params)["id"] ?? ""} model is locked once the agent is spawned` }, { status: 409 });
|
|
5147
5245
|
})));
|
|
5148
5246
|
//#endregion
|
|
5149
|
-
//#region ../../lib/
|
|
5247
|
+
//#region ../../lib/xbrief/auto-synthesize.ts
|
|
5150
5248
|
init_state_read_home();
|
|
5249
|
+
init_state_plane();
|
|
5250
|
+
init_types();
|
|
5151
5251
|
init_codex_auth();
|
|
5152
5252
|
init_state_home();
|
|
5153
5253
|
init_io();
|
|
@@ -5170,7 +5270,7 @@ function extractAcceptanceCriteriaFromIssue(title, body) {
|
|
|
5170
5270
|
}
|
|
5171
5271
|
return [`Issue's stated fix implemented with tests`];
|
|
5172
5272
|
}
|
|
5173
|
-
function
|
|
5273
|
+
function synthesizeMinimalXBrief(issue) {
|
|
5174
5274
|
const issueId = issue.issueId.toUpperCase();
|
|
5175
5275
|
const issueLabel = issueId.toLowerCase();
|
|
5176
5276
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -5181,9 +5281,9 @@ function synthesizeMinimalVBrief(issue) {
|
|
|
5181
5281
|
created: now,
|
|
5182
5282
|
metadata: { kind: "acceptance_criterion" }
|
|
5183
5283
|
}));
|
|
5184
|
-
const canonicalFilename =
|
|
5284
|
+
const canonicalFilename = generateXBriefFilename(issueId, issue.title, now);
|
|
5185
5285
|
return {
|
|
5186
|
-
|
|
5286
|
+
xBRIEFInfo: {
|
|
5187
5287
|
version: "0.8",
|
|
5188
5288
|
created: now,
|
|
5189
5289
|
updated: now,
|
|
@@ -5230,8 +5330,8 @@ function synthesizeMinimalVBrief(issue) {
|
|
|
5230
5330
|
}
|
|
5231
5331
|
};
|
|
5232
5332
|
}
|
|
5233
|
-
async function
|
|
5234
|
-
const document =
|
|
5333
|
+
async function writeAutoStartXBriefPromise(projectRoot, workspacePath, issue) {
|
|
5334
|
+
const document = synthesizeMinimalXBrief(issue);
|
|
5235
5335
|
const canonicalFilename = document.plan.metadata?.canonicalFilename;
|
|
5236
5336
|
const projectSpecsDir = join$1(projectRoot, ".pan", "specs");
|
|
5237
5337
|
const projectSpecPath = join$1(projectSpecsDir, canonicalFilename);
|
|
@@ -5243,7 +5343,7 @@ async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
|
|
|
5243
5343
|
}
|
|
5244
5344
|
};
|
|
5245
5345
|
await mkdir$1(projectSpecsDir, { recursive: true });
|
|
5246
|
-
await writeFile$1(projectSpecPath,
|
|
5346
|
+
await writeFile$1(projectSpecPath, serializeXBriefDocument(projectDocument), "utf-8");
|
|
5247
5347
|
return {
|
|
5248
5348
|
document,
|
|
5249
5349
|
workspaceSpecPath: projectSpecPath,
|
|
@@ -5252,15 +5352,15 @@ async function writeAutoStartVBriefPromise(projectRoot, workspacePath, issue) {
|
|
|
5252
5352
|
};
|
|
5253
5353
|
}
|
|
5254
5354
|
/**
|
|
5255
|
-
* Effect variant of
|
|
5355
|
+
* Effect variant of writeAutoStartXBrief. Wraps mkdir + writeFile in a typed
|
|
5256
5356
|
* FsError channel so callers in Effect-native code can compose with this
|
|
5257
5357
|
* synthesis step without losing failure typing.
|
|
5258
5358
|
*/
|
|
5259
|
-
const
|
|
5260
|
-
try: () =>
|
|
5359
|
+
const writeAutoStartXBrief = (projectRoot, workspacePath, issue) => Effect.tryPromise({
|
|
5360
|
+
try: () => writeAutoStartXBriefPromise(projectRoot, workspacePath, issue),
|
|
5261
5361
|
catch: (cause) => new FsError({
|
|
5262
5362
|
path: projectRoot,
|
|
5263
|
-
operation: "
|
|
5363
|
+
operation: "writeAutoStartXBrief",
|
|
5264
5364
|
cause
|
|
5265
5365
|
})
|
|
5266
5366
|
});
|
|
@@ -5472,15 +5572,15 @@ init_agents$1();
|
|
|
5472
5572
|
function handleRemoteAgentSpawn(input) {
|
|
5473
5573
|
return Effect.gen(function* () {
|
|
5474
5574
|
const { issueId, workspacePath, workspaceMetadata, spawnModel, projectPath, spawnGuardrails, lifecycle } = input;
|
|
5475
|
-
const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-
|
|
5476
|
-
const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-
|
|
5477
|
-
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"));
|
|
5478
5578
|
const panConfig = loadPanConfig();
|
|
5479
5579
|
const spendCap = checkRemoteSpendCap(panConfig);
|
|
5480
5580
|
if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
|
|
5481
5581
|
const fly = createFlyProviderFromConfig(panConfig.remote);
|
|
5482
5582
|
yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
|
|
5483
|
-
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-
|
|
5583
|
+
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-Yb2bd3Fq.js"));
|
|
5484
5584
|
const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
|
|
5485
5585
|
const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
|
|
5486
5586
|
issueId,
|
|
@@ -5801,6 +5901,7 @@ init_child_env();
|
|
|
5801
5901
|
init_harness_policy();
|
|
5802
5902
|
init_activity_logger();
|
|
5803
5903
|
init_projects();
|
|
5904
|
+
init_review_status();
|
|
5804
5905
|
init_io();
|
|
5805
5906
|
init_read_model();
|
|
5806
5907
|
init_domain_services();
|
|
@@ -5824,6 +5925,25 @@ function emitDirtyWorkspaceRefusalActivity(issueId, porcelain) {
|
|
|
5824
5925
|
});
|
|
5825
5926
|
} catch {}
|
|
5826
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
|
+
}
|
|
5827
5947
|
function spawnGuardrailResourcesHint(hint) {
|
|
5828
5948
|
const resourcesHint = "Open /resources to inspect Machine Room pressure before retrying.";
|
|
5829
5949
|
return hint ? `${hint} ${resourcesHint}` : resourcesHint;
|
|
@@ -5850,7 +5970,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
5850
5970
|
const body = yield* readJsonBody$1;
|
|
5851
5971
|
const eventStore = yield* EventStoreService;
|
|
5852
5972
|
const lifecycle = yield* IssueLifecycle;
|
|
5853
|
-
|
|
5973
|
+
yield* ReadModelService;
|
|
5854
5974
|
const { issueId, projectId } = body;
|
|
5855
5975
|
const autoStart = body.auto === true;
|
|
5856
5976
|
const guardrailAcknowledged = body.guardrailAcknowledged === true;
|
|
@@ -5928,7 +6048,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
5928
6048
|
const workspacePanContinuePath = join(workspacePanDir, PAN_CONTINUE_FILENAME);
|
|
5929
6049
|
let planPath = yield* findPlan(workspacePath);
|
|
5930
6050
|
if (autoStart && !planPath) {
|
|
5931
|
-
yield*
|
|
6051
|
+
yield* writeAutoStartXBrief(projectPath, workspacePath, {
|
|
5932
6052
|
issueId,
|
|
5933
6053
|
title: cachedIssue?.title || issueId,
|
|
5934
6054
|
body: cachedIssue?.description || "",
|
|
@@ -5937,7 +6057,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
5937
6057
|
planPath = yield* findPlan(workspacePath);
|
|
5938
6058
|
}
|
|
5939
6059
|
if (!planPath) return jsonResponse({
|
|
5940
|
-
error: `No workspace
|
|
6060
|
+
error: `No workspace xBRIEF found for ${issueId}. Work agents require a finalized plan.`,
|
|
5941
6061
|
hint: "Run planning first, or use auto-start to synthesize a plan before starting the work agent.",
|
|
5942
6062
|
issueId
|
|
5943
6063
|
}, { status: 422 });
|
|
@@ -5954,8 +6074,8 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
5954
6074
|
if (planReadResult._tag === "failure") {
|
|
5955
6075
|
const { planErr } = planReadResult;
|
|
5956
6076
|
return jsonResponse({
|
|
5957
|
-
error: `Could not read workspace
|
|
5958
|
-
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.",
|
|
5959
6079
|
issueId
|
|
5960
6080
|
}, { status: 422 });
|
|
5961
6081
|
}
|
|
@@ -5973,7 +6093,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
5973
6093
|
hint: "Re-run planning to produce a plan with tasks and acceptance criteria.",
|
|
5974
6094
|
issueId
|
|
5975
6095
|
}, { status: 422 });
|
|
5976
|
-
const health = yield*
|
|
6096
|
+
const health = yield* Effect.promise(() => getSystemHealthSnapshot());
|
|
5977
6097
|
emitStartAgentPhase(issueId, "guardrails", "start", "evaluating spawn guardrails");
|
|
5978
6098
|
const spawnGuardrails = evaluateSpawnGuardrails(health);
|
|
5979
6099
|
if (spawnGuardrails.blocked) {
|
|
@@ -6118,33 +6238,6 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6118
6238
|
}).unref();
|
|
6119
6239
|
}
|
|
6120
6240
|
}).pipe(Effect.catch(() => Effect.void));
|
|
6121
|
-
yield* transitionVBriefOnMain(projectPath, issueId, "active", "approved", `scope: approve ${issueId.toUpperCase()} vBRIEF`).pipe(Effect.match({
|
|
6122
|
-
onSuccess: (result) => {
|
|
6123
|
-
if (result.moved) console.log(`[start-agent] vBRIEF moved ${result.fromDir} → active for ${issueId}`);
|
|
6124
|
-
if (result.committed) console.log(`[start-agent] Committed approval transition on main for ${issueId}`);
|
|
6125
|
-
},
|
|
6126
|
-
onFailure: (err) => {
|
|
6127
|
-
console.warn(`[start-agent] vBRIEF approval transition failed (non-fatal): ${err?.message ?? err}`);
|
|
6128
|
-
}
|
|
6129
|
-
}));
|
|
6130
|
-
if (existsSync(planPath)) try {
|
|
6131
|
-
updatePlanStatus(planPath, "running");
|
|
6132
|
-
console.log(`[start-agent] Set plan.status=running for ${issueId}`);
|
|
6133
|
-
} catch (planStatusErr) {
|
|
6134
|
-
console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
|
|
6135
|
-
}
|
|
6136
|
-
try {
|
|
6137
|
-
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = yield* Effect.promise(() => import("./record-us0YECMO.js"));
|
|
6138
|
-
const recordProject = resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath);
|
|
6139
|
-
yield* Effect.promise(() => appendSessionEntry(recordProject, issueId, {
|
|
6140
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6141
|
-
reason: "start",
|
|
6142
|
-
agentModel: spawnModel
|
|
6143
|
-
}));
|
|
6144
|
-
console.log(`[start-agent] Wrote start session entry to record for ${issueId}`);
|
|
6145
|
-
} catch (continueErr) {
|
|
6146
|
-
console.warn(`[start-agent] Failed to write start entry to record (non-fatal): ${continueErr?.message ?? continueErr}`);
|
|
6147
|
-
}
|
|
6148
6241
|
let gatesCommitted = false;
|
|
6149
6242
|
const commitClearedGates = async () => {
|
|
6150
6243
|
if (!startGateBlock || gatesCommitted) return;
|
|
@@ -6165,6 +6258,38 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6165
6258
|
troubled: startGateBlock.troubled
|
|
6166
6259
|
});
|
|
6167
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
|
+
};
|
|
6168
6293
|
if (isRemote && workspaceMetadata) {
|
|
6169
6294
|
const response = yield* Effect.promise(() => spawnAfterClearingStartGates({
|
|
6170
6295
|
agentSessionName,
|
|
@@ -6183,6 +6308,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6183
6308
|
}));
|
|
6184
6309
|
if (response.status < 200 || response.status >= 300) return response;
|
|
6185
6310
|
yield* Effect.promise(commitClearedGates);
|
|
6311
|
+
yield* Effect.promise(markWorkStartAccepted);
|
|
6186
6312
|
return response;
|
|
6187
6313
|
}
|
|
6188
6314
|
const devScript = join(workspacePath, "dev");
|
|
@@ -6214,11 +6340,11 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6214
6340
|
console.log(`[start-agent] Killed stale tmux session ${agentSessionName}`);
|
|
6215
6341
|
}).pipe(Effect.catch(() => Effect.void));
|
|
6216
6342
|
if (!(body.acknowledgeDirtyWorkspace === true)) try {
|
|
6217
|
-
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", {
|
|
6218
6344
|
cwd: workspacePath,
|
|
6219
6345
|
encoding: "utf-8"
|
|
6220
6346
|
}));
|
|
6221
|
-
if (statusOut.trim()) {
|
|
6347
|
+
if (statusOut.trim() && !isOnlyOverdeckRuntimeWorkspaceChanges(statusOut)) {
|
|
6222
6348
|
const { stdout: diffOut } = yield* Effect.promise(() => execAsync$2("git diff HEAD --stat", {
|
|
6223
6349
|
cwd: workspacePath,
|
|
6224
6350
|
encoding: "utf-8"
|
|
@@ -6285,7 +6411,58 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6285
6411
|
spawnPanCommand,
|
|
6286
6412
|
updateIssueStatus
|
|
6287
6413
|
});
|
|
6288
|
-
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
|
+
}));
|
|
6289
6466
|
yield* Effect.promise(() => appendAgentLifecycleLog(agentSessionName, "agent.work_spawn_requested", {
|
|
6290
6467
|
issueId,
|
|
6291
6468
|
role,
|
|
@@ -6300,11 +6477,35 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6300
6477
|
harness: effectiveHarness,
|
|
6301
6478
|
allowHost
|
|
6302
6479
|
}), workspacePath));
|
|
6480
|
+
yield* Effect.promise(markWorkStartAccepted);
|
|
6303
6481
|
emitStartAgentPhase(issueId, "spawn", "success", "local work agent spawn requested", {
|
|
6304
6482
|
workspacePath,
|
|
6305
6483
|
activityId
|
|
6306
6484
|
});
|
|
6307
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();
|
|
6308
6509
|
const output = String(error?.output ?? error?.message ?? "");
|
|
6309
6510
|
if (output.includes(`Workspace docker stack for ${issueId}`) && output.includes("is not healthy")) {
|
|
6310
6511
|
const failedStackHealth = yield* getWorkspaceStackHealth(issueId, {
|
|
@@ -6348,55 +6549,8 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
6348
6549
|
activityId: error?.activityId
|
|
6349
6550
|
}, { status: 500 });
|
|
6350
6551
|
}
|
|
6351
|
-
|
|
6352
|
-
const earlyStateDir = join(homedir(), ".overdeck", "agents", earlyAgentId);
|
|
6353
|
-
yield* Effect.promise(() => mkdir(earlyStateDir, { recursive: true }));
|
|
6354
|
-
saveAgentStateSync({
|
|
6355
|
-
id: earlyAgentId,
|
|
6356
|
-
issueId,
|
|
6357
|
-
...effectiveHarness ? { harness: effectiveHarness } : {},
|
|
6358
|
-
model: "pending-work-spawn",
|
|
6359
|
-
status: "starting",
|
|
6360
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6361
|
-
workspace: workspacePath,
|
|
6362
|
-
role,
|
|
6363
|
-
hostOverride: allowHost || void 0
|
|
6364
|
-
});
|
|
6365
|
-
updateRegistryForAgentStart(issueId, workspacePath, earlyAgentId);
|
|
6366
|
-
yield* Effect.promise(() => appendAgentLifecycleLog(earlyAgentId, "agent.start_placeholder_created", {
|
|
6367
|
-
issueId,
|
|
6368
|
-
role,
|
|
6369
|
-
workspacePath,
|
|
6370
|
-
activityId
|
|
6371
|
-
}));
|
|
6552
|
+
updateRegistryForAgentStart(issueId, workspacePath, agentSessionName);
|
|
6372
6553
|
yield* Effect.promise(() => updateIssueStatus());
|
|
6373
|
-
yield* saveAgentStateAndEmitEventProgram({
|
|
6374
|
-
id: earlyAgentId,
|
|
6375
|
-
issueId,
|
|
6376
|
-
workspace: workspacePath,
|
|
6377
|
-
role,
|
|
6378
|
-
...effectiveHarness ? { harness: effectiveHarness } : {},
|
|
6379
|
-
model: "pending-work-spawn",
|
|
6380
|
-
status: "starting",
|
|
6381
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6382
|
-
hostOverride: allowHost || void 0
|
|
6383
|
-
}, {
|
|
6384
|
-
type: "agent.started",
|
|
6385
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6386
|
-
payload: {
|
|
6387
|
-
agentId: earlyAgentId,
|
|
6388
|
-
issueId,
|
|
6389
|
-
agent: {
|
|
6390
|
-
id: earlyAgentId,
|
|
6391
|
-
issueId,
|
|
6392
|
-
workspace: workspacePath,
|
|
6393
|
-
status: "starting",
|
|
6394
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6395
|
-
role,
|
|
6396
|
-
...effectiveHarness ? { runtime: effectiveHarness } : {}
|
|
6397
|
-
}
|
|
6398
|
-
}
|
|
6399
|
-
});
|
|
6400
6554
|
try {
|
|
6401
6555
|
getIssueDataService().patchIssue(issueId, {
|
|
6402
6556
|
status: "In Progress",
|
|
@@ -6561,10 +6715,10 @@ const _serverManagedMerges = /* @__PURE__ */ new Set();
|
|
|
6561
6715
|
function firePostMergeLifecycle(issueId, options) {
|
|
6562
6716
|
const started = postMergeGuard.run(issueId, async () => {
|
|
6563
6717
|
const projectPath = getProjectPathForIssue(extractPrefixSync(issueId) ?? issueId.split("-")[0]);
|
|
6564
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
6718
|
+
const { postMergeLifecycle } = await import("./merge-agent-BQM3a8z5.js");
|
|
6565
6719
|
await postMergeLifecycle(issueId, projectPath, options?.sourceBranch, options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : void 0);
|
|
6566
6720
|
console.log(`[merge] post-merge lifecycle completed for ${issueId}`);
|
|
6567
|
-
const { runMergeTrainReconcile } = await import("./merge-train-
|
|
6721
|
+
const { runMergeTrainReconcile } = await import("./merge-train-DxDfBTjr.js");
|
|
6568
6722
|
const outcomes = await runMergeTrainReconcile(issueId);
|
|
6569
6723
|
if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${issueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
|
|
6570
6724
|
}, (err) => console.error(`[merge] post-merge lifecycle failed for ${issueId}:`, err));
|
|
@@ -6585,15 +6739,15 @@ init_io();
|
|
|
6585
6739
|
init_domain_services();
|
|
6586
6740
|
init_tmux();
|
|
6587
6741
|
const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
|
|
6588
|
-
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
6742
|
+
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
6589
6743
|
return jsonResponse({
|
|
6590
6744
|
specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
|
|
6591
6745
|
projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
|
|
6592
6746
|
});
|
|
6593
6747
|
})));
|
|
6594
6748
|
const postSpecialistsResetAllRoute = HttpRouter.add("POST", "/api/specialists/reset-all", httpHandler(Effect.gen(function* () {
|
|
6595
|
-
const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
6596
|
-
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"));
|
|
6597
6751
|
const specialists = getAllSpecialists();
|
|
6598
6752
|
const results = [];
|
|
6599
6753
|
for (const specialist of specialists) {
|
|
@@ -6645,11 +6799,11 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6645
6799
|
if (!itemId) return jsonResponse({ error: "itemId is required for a passed inspect verdict" }, { status: 400 });
|
|
6646
6800
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
6647
6801
|
const workspacePath = project && join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
6648
|
-
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 });
|
|
6649
6803
|
}
|
|
6650
6804
|
console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
|
|
6651
6805
|
if (specialist === "merge") {
|
|
6652
|
-
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-
|
|
6806
|
+
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-BXhav38U.js"));
|
|
6653
6807
|
if (yield* reportSpecialistCompletion(normalizedIssueId, {
|
|
6654
6808
|
status,
|
|
6655
6809
|
notes
|
|
@@ -6696,7 +6850,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6696
6850
|
if (specialist === "inspect" && status === "failed") yield* Effect.promise(() => reportTieredInspectFailureEscalation(normalizedIssueId, notes));
|
|
6697
6851
|
yield* Effect.promise(async () => {
|
|
6698
6852
|
try {
|
|
6699
|
-
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-
|
|
6853
|
+
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-DVj0hvaL.js");
|
|
6700
6854
|
const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
|
|
6701
6855
|
const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
|
|
6702
6856
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -6715,7 +6869,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6715
6869
|
});
|
|
6716
6870
|
console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
|
|
6717
6871
|
}
|
|
6718
|
-
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-
|
|
6872
|
+
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-C45ouoZ6.js");
|
|
6719
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}`);
|
|
6720
6874
|
} catch (err) {
|
|
6721
6875
|
console.error(`[specialists/done] Error managing specialist state:`, err);
|
|
@@ -6727,7 +6881,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6727
6881
|
if (project) {
|
|
6728
6882
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
6729
6883
|
if (existsSync(workspacePath)) {
|
|
6730
|
-
const { getWorkspaceGitInfo } = await import("./git-utils-
|
|
6884
|
+
const { getWorkspaceGitInfo } = await import("./git-utils-Dry_Ka_D.js");
|
|
6731
6885
|
const { HEAD } = await Effect.runPromise(getWorkspaceGitInfo(workspacePath));
|
|
6732
6886
|
setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: HEAD });
|
|
6733
6887
|
console.log(`[specialists/done] Snapshotted reviewedAtCommit=${HEAD.substring(0, 8)} for ${normalizedIssueId}`);
|
|
@@ -6739,7 +6893,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6739
6893
|
});
|
|
6740
6894
|
if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
|
|
6741
6895
|
try {
|
|
6742
|
-
const { onInspectComplete } = await import("./inspect-agent-
|
|
6896
|
+
const { onInspectComplete } = await import("./inspect-agent-ch-F-5Ci.js");
|
|
6743
6897
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
6744
6898
|
if (project) {
|
|
6745
6899
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
@@ -6755,7 +6909,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6755
6909
|
if (project) {
|
|
6756
6910
|
if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
|
|
6757
6911
|
setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
|
|
6758
|
-
const { initEventStore } = await import("./event-store-
|
|
6912
|
+
const { initEventStore } = await import("./event-store-Cr5PQwFC.js");
|
|
6759
6913
|
await (await initEventStore()).appendAsync({
|
|
6760
6914
|
type: "test.passed",
|
|
6761
6915
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -6808,8 +6962,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6808
6962
|
if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
|
|
6809
6963
|
try {
|
|
6810
6964
|
const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
|
|
6811
|
-
const { sessionExists } = await import("./tmux-
|
|
6812
|
-
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");
|
|
6813
6967
|
if (await Effect.runPromise(sessionExists(workAgentId))) {
|
|
6814
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}`);
|
|
6815
6969
|
console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
|
|
@@ -6823,7 +6977,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6823
6977
|
try {
|
|
6824
6978
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
6825
6979
|
const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
|
|
6826
|
-
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-
|
|
6980
|
+
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-C1Kg8n7t.js");
|
|
6827
6981
|
const result = await Effect.runPromise(deliverReviewVerdictFeedback({
|
|
6828
6982
|
issueId: normalizedIssueId,
|
|
6829
6983
|
verdict: status === "failed" ? "failed" : "blocked",
|
|
@@ -6864,7 +7018,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
6864
7018
|
});
|
|
6865
7019
|
})));
|
|
6866
7020
|
const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
|
|
6867
|
-
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7021
|
+
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
6868
7022
|
const results = cleanupAllLogsSync();
|
|
6869
7023
|
return jsonResponse({
|
|
6870
7024
|
success: true,
|
|
@@ -6874,7 +7028,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
6874
7028
|
});
|
|
6875
7029
|
})));
|
|
6876
7030
|
const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
|
|
6877
|
-
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
7031
|
+
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
6878
7032
|
return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
|
|
6879
7033
|
})));
|
|
6880
7034
|
const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
|
|
@@ -6918,7 +7072,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
|
|
|
6918
7072
|
"blocked",
|
|
6919
7073
|
"failed"
|
|
6920
7074
|
].includes(status)) {
|
|
6921
|
-
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
7075
|
+
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
6922
7076
|
saveAgentRuntimeState(getTmuxSessionName(name), {
|
|
6923
7077
|
state: "idle",
|
|
6924
7078
|
lastActivity: (/* @__PURE__ */ new Date()).toISOString()
|
|
@@ -7039,7 +7193,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
|
|
|
7039
7193
|
const issueId = params["issueId"];
|
|
7040
7194
|
const type = params["type"];
|
|
7041
7195
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7042
|
-
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-
|
|
7196
|
+
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7043
7197
|
const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
|
|
7044
7198
|
yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
|
|
7045
7199
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -7066,7 +7220,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
|
|
|
7066
7220
|
if (limitParam) limit = parseInt(limitParam, 10);
|
|
7067
7221
|
if (offsetParam) offset = parseInt(offsetParam, 10);
|
|
7068
7222
|
}
|
|
7069
|
-
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7223
|
+
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
7070
7224
|
return jsonResponse(listRunLogsSync(project, type, {
|
|
7071
7225
|
limit,
|
|
7072
7226
|
offset
|
|
@@ -7077,7 +7231,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
|
|
|
7077
7231
|
const project = params["project"];
|
|
7078
7232
|
const type = params["type"];
|
|
7079
7233
|
const runId = params["runId"];
|
|
7080
|
-
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7234
|
+
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
7081
7235
|
const logPath = getRunLogPath(project, type, runId);
|
|
7082
7236
|
if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
7083
7237
|
const encoder = new TextEncoder();
|
|
@@ -7136,7 +7290,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
|
|
|
7136
7290
|
const project = params["project"];
|
|
7137
7291
|
const type = params["type"];
|
|
7138
7292
|
const runId = params["runId"];
|
|
7139
|
-
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7293
|
+
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-DJ3RzKxW.js"));
|
|
7140
7294
|
const content = getRunLogSync(project, type, runId);
|
|
7141
7295
|
if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
7142
7296
|
return jsonResponse({
|
|
@@ -7150,7 +7304,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
|
|
|
7150
7304
|
const project = params["project"];
|
|
7151
7305
|
const type = params["type"];
|
|
7152
7306
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7153
|
-
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-
|
|
7307
|
+
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7154
7308
|
yield* Effect.promise(() => terminateSpecialist(project, type));
|
|
7155
7309
|
return jsonResponse({
|
|
7156
7310
|
success: true,
|
|
@@ -7162,7 +7316,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
|
|
|
7162
7316
|
const project = params["project"];
|
|
7163
7317
|
const type = params["type"];
|
|
7164
7318
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7165
|
-
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
7319
|
+
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7166
7320
|
if (pauseGracePeriod(project, type)) return jsonResponse({
|
|
7167
7321
|
success: true,
|
|
7168
7322
|
message: "Grace period paused"
|
|
@@ -7174,7 +7328,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
|
|
|
7174
7328
|
const project = params["project"];
|
|
7175
7329
|
const type = params["type"];
|
|
7176
7330
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7177
|
-
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
7331
|
+
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7178
7332
|
if (resumeGracePeriod(project, type)) return jsonResponse({
|
|
7179
7333
|
success: true,
|
|
7180
7334
|
message: "Grace period resumed"
|
|
@@ -7186,7 +7340,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
|
|
|
7186
7340
|
const project = params["project"];
|
|
7187
7341
|
const type = params["type"];
|
|
7188
7342
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7189
|
-
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
7343
|
+
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7190
7344
|
exitGracePeriod(project, type);
|
|
7191
7345
|
return jsonResponse({
|
|
7192
7346
|
success: true,
|
|
@@ -7198,7 +7352,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
|
|
|
7198
7352
|
const project = params["project"];
|
|
7199
7353
|
const type = params["type"];
|
|
7200
7354
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7201
|
-
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-
|
|
7355
|
+
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7202
7356
|
const state = getGracePeriodState(project, type);
|
|
7203
7357
|
if (state) return jsonResponse(state);
|
|
7204
7358
|
else return jsonResponse({ error: "No active grace period" }, { status: 404 });
|
|
@@ -7207,7 +7361,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
|
|
|
7207
7361
|
const params = yield* HttpRouter.params;
|
|
7208
7362
|
const project = params["project"];
|
|
7209
7363
|
const type = params["type"];
|
|
7210
|
-
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
7364
|
+
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-DtrYvGJ-.js"));
|
|
7211
7365
|
const digest = loadContextDigest(project, type);
|
|
7212
7366
|
if (digest) return jsonResponse({ digest });
|
|
7213
7367
|
else return jsonResponse({ error: "No context digest found" }, { status: 404 });
|
|
@@ -7216,7 +7370,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
|
|
|
7216
7370
|
const params = yield* HttpRouter.params;
|
|
7217
7371
|
const project = params["project"];
|
|
7218
7372
|
const type = params["type"];
|
|
7219
|
-
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
7373
|
+
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-DtrYvGJ-.js"));
|
|
7220
7374
|
const digest = yield* Effect.promise(() => regenerateContextDigest(project, type));
|
|
7221
7375
|
if (digest) return jsonResponse({
|
|
7222
7376
|
digest,
|
|
@@ -7235,7 +7389,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
7235
7389
|
"blocked"
|
|
7236
7390
|
].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
|
|
7237
7391
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
7238
|
-
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-
|
|
7392
|
+
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-DVj0hvaL.js"));
|
|
7239
7393
|
signalSpecialistCompletion(project, type, {
|
|
7240
7394
|
status,
|
|
7241
7395
|
notes
|
|
@@ -7269,8 +7423,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
|
|
|
7269
7423
|
const params = yield* HttpRouter.params;
|
|
7270
7424
|
const project = params["project"];
|
|
7271
7425
|
const type = params["type"];
|
|
7272
|
-
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
7273
|
-
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"));
|
|
7274
7428
|
const retention = getSpecialistRetention(project);
|
|
7275
7429
|
const deleted = cleanupOldLogsSync(project, type, {
|
|
7276
7430
|
maxDays: retention.max_days,
|
|
@@ -7291,7 +7445,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
7291
7445
|
const project = params["project"];
|
|
7292
7446
|
const issueId = params["issueId"];
|
|
7293
7447
|
const { model, harness } = yield* readJsonBody;
|
|
7294
|
-
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-
|
|
7448
|
+
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-DJRO8EG8.js"));
|
|
7295
7449
|
const killResult = yield* killAllReviewerSessions(project, issueId);
|
|
7296
7450
|
const projectConfig = resolveProjectFromIssueSync(issueId);
|
|
7297
7451
|
if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
|
|
@@ -7305,7 +7459,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
7305
7459
|
}));
|
|
7306
7460
|
branch = stdout.trim() || "unknown";
|
|
7307
7461
|
} catch {}
|
|
7308
|
-
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-
|
|
7462
|
+
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-DJRO8EG8.js"));
|
|
7309
7463
|
const prUrl = getReviewStatusSync(issueId)?.prUrl;
|
|
7310
7464
|
const result = yield* spawnReviewRoleForIssue({
|
|
7311
7465
|
issueId,
|
|
@@ -7454,6 +7608,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
|
|
|
7454
7608
|
*/
|
|
7455
7609
|
const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
|
|
7456
7610
|
//#endregion
|
|
7457
|
-
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 };
|
|
7458
7612
|
|
|
7459
|
-
//# sourceMappingURL=specialists-
|
|
7613
|
+
//# sourceMappingURL=specialists-JVO00bs7.js.map
|