@overdeck/desktop 0.45.21 → 0.45.22
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-BH7ac_1G.js} +2 -2
- package/server/{advancing-selfheal-CPOBO5ZS.js → advancing-selfheal-cSvXNZLZ.js} +6 -6
- package/server/{agent-gc-D6PUckBB.js → agent-gc-Dj2gncak.js} +4 -4
- package/server/{agent-state-BV_6RHnO.js → agent-state-Co5Sy2Fw.js} +1 -1
- package/server/{agent-state-service-DHwemt96.js → agent-state-service-CsQ07Pxe.js} +1 -1
- package/server/{agent-state-service-6MFQqnFy.js → agent-state-service-DistflNn.js} +5 -5
- package/server/{agents-DbrHWunF.js → agents-DXdHmRTC.js} +4 -4
- package/server/{agents-Czz6R57Z.js → agents-DyHKlq1I.js} +1 -1
- package/server/{archive-planning-BOnwJq8M.js → archive-planning-BvDuWNMo.js} +5 -5
- package/server/{archive-planning-MPpvQJL4.js → archive-planning-Cp_DC1j-.js} +1 -1
- package/server/{artifact-index-jobs-BOoySTKD.js → artifact-index-jobs-CDBFL4OU.js} +2 -2
- package/server/{backlog-auto-trigger-BUaFI44J.js → backlog-auto-trigger-DmA1IbYf.js} +3 -3
- package/server/{behavior-Dg-D8eBG.js → behavior-CGj16clS.js} +2 -2
- package/server/{briefing-freshness-OouGbJ7d.js → briefing-freshness-C12WgkaB.js} +2 -2
- package/server/{build-info-Cv6CI7Gu.js → build-info-BRpqQvNd.js} +1 -1
- package/server/{build-info-27NlbKhV.js → build-info-NU3KbXYw.js} +3 -3
- package/server/{checkpoint-manager-D64fCC4p.js → checkpoint-manager-CTPjAmtH.js} +2 -2
- package/server/{checkpoint-manager-C7mFCY_E.js → checkpoint-manager-rOgT98WY.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-DwZqT2qQ.js → checkpoints-B5jFNi2G.js} +1 -1
- package/server/{checkpoints-Vh-J15ge.js → checkpoints-BJum14fs.js} +2 -2
- package/server/{claude-hooks-provision-CS5W_dhI.js → claude-hooks-provision-BhwWK-TQ.js} +1 -1
- package/server/{claude-hooks-provision-BVLGfHrv.js → claude-hooks-provision-D7p5WcKZ.js} +2 -2
- package/server/{claude-permissions-C2OrLYKL.js → claude-permissions-nSFKH78M.js} +2 -2
- package/server/{claude-settings-overlay-DX-fMFpC.js → claude-settings-overlay-BI_UIke0.js} +2 -2
- package/server/{claude-settings-overlay-DWXjafJh.js → claude-settings-overlay-DHBwjS1X.js} +1 -1
- package/server/cli-BRORS9qY.js +3 -0
- package/server/{cli-mvpEOb3w.js → cli-CbKNkFE5.js} +9 -9
- package/server/{cliproxy-Dvsr4ZkW.js → cliproxy-Brf_5MuG.js} +2 -2
- package/server/{cliproxy-7g1nObvB.js → cliproxy-bONZDBbC.js} +1 -1
- package/server/{close-issue-8F6uawYj.js → close-issue-CxReRxIc.js} +5 -5
- package/server/{closed-issue-reaper-BaYQYF6w.js → closed-issue-reaper-CQ3kqha7.js} +9 -9
- package/server/{closed-issue-reaper-BhV-r-tC.js → closed-issue-reaper-DXP2Xyv3.js} +1 -1
- package/server/{codex-D_UBEOwL.js → codex-CbmztVcc.js} +9 -6
- package/server/{codex-BBeZ8c3s.js → codex-DNyiQDKW.js} +1 -1
- package/server/{codex-parser-BTzlOZiV.js → codex-parser-jl8AeAmB.js} +2 -2
- package/server/{config-nAB_F-Gp.js → config-BJKocXKd.js} +1 -1
- package/server/{config-G1TOMJZA.js → config-DeTsoZdR.js} +2 -2
- package/server/{config-CrduXs4a.js → config-q4Gvd8dq.js} +2 -2
- package/server/{config-yaml-Ciyp2mYe.js → config-yaml-ig8Nwtiw.js} +124 -27
- package/server/{conflict-gate-BLUNMs1i.js → conflict-gate-CFqPVxEg.js} +3 -3
- package/server/{conflict-gate-BKalpcjL.js → conflict-gate-CHU9K1vU.js} +1 -1
- package/server/{context-layers-Cg9ZgVfx.js → context-layers-15gDOk20.js} +3 -3
- package/server/{context-layers-YNpf6Q_I.js → context-layers-DlQKkHH2.js} +2 -2
- package/server/{control-settings-D_79A6gp.js → control-settings-D_odMIaC.js} +4 -4
- package/server/{conversation-compaction-DiuZbIUB.js → conversation-compaction-B6YSRLda.js} +8 -8
- package/server/{conversation-compaction-CMIeWW4_.js → conversation-compaction-CN4-5YYt.js} +1 -1
- package/server/{conversation-service-DQybSPUK.js → conversation-service-C3avRVEr.js} +6 -6
- package/server/{conversation-service-CWk8mEym.js → conversation-service-Dq33SYEj.js} +1 -1
- package/server/{conversations-BJ-t3BRm.js → conversations-H9if0bCQ.js} +1 -1
- package/server/{conversations-BUgGvqVL.js → conversations-bYpM9-kZ.js} +4 -4
- package/server/{cost-Drm7qeD5.js → cost-Codk1pc2.js} +2 -2
- package/server/{cost-sync-DzHP6zaR.js → cost-sync-D_cre6WM.js} +3 -3
- package/server/{cost-jJ2cgDcG.js → cost-wH46-WsJ.js} +3 -3
- package/server/{dag-DIji6O2b.js → dag-CJpgf9A3.js} +2 -2
- package/server/{dangerous-git-ops-BebB-61h.js → dangerous-git-ops-D6AF-Hg_.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-pleYrvIm.js → deacon-B8HbQdqU.js} +3 -3
- package/server/{deacon-1s7bM5zn.js → deacon-CkT_kznS.js} +1377 -407
- package/server/{deacon-nudge-log-C5VCKtyi.js → deacon-nudge-log-D6K9K-rE.js} +3 -3
- package/server/{deacon-swarm-DmA3rJ7k.js → deacon-swarm-BryRr6AO.js} +13 -13
- package/server/deacon-swarm-CV54eNmU.js +2 -0
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-DmM6F-yw.js → deploy-patrol-1IrZxicY.js} +6 -6
- package/server/{deploy-window-ClLq1RYf.js → deploy-window-7ZYHh7Zp.js} +1 -1
- package/server/{deploy-window-jw4S_Y-c.js → deploy-window-wDf4UgHt.js} +6 -6
- package/server/{dev-supervisor-Do2Stz49.js → dev-supervisor-C7p9kEpc.js} +2 -2
- package/server/{devcontainer-renderer-D8ylupco.js → devcontainer-renderer-CNmQy0pL.js} +3 -3
- package/server/{dist-yfR7G1BL.js → dist-D-Ed5yVw.js} +1 -1
- package/server/dist-j64RzSrQ.js +3 -0
- package/server/{docker-ClwPQaba.js → docker-BCZ89M9X.js} +2 -2
- package/server/{dod-BLphkhjs.js → dod-DbJLYcHv.js} +1 -1
- package/server/{ensure-devcontainer-BA3bICoY.js → ensure-devcontainer-Cs6W9Yzj.js} +1 -1
- package/server/{ensure-devcontainer-CFpQatOc.js → ensure-devcontainer-V5JWaAva.js} +4 -4
- package/server/{esm-shims-BZw-fTQ6.js → esm-shims-dTeNdq7X.js} +1 -1
- package/server/{event-store-DABarGNz.js → event-store-CpBGsO6_.js} +1 -1
- package/server/{event-store-BVnON3vf.js → event-store-TnWdydfB.js} +3 -3
- package/server/{events-CmERlnwn.js → events-DSUdR-04.js} +3 -3
- package/server/{events-LGeUehYW.js → events-Dsuv6qyB.js} +1 -1
- package/server/{factory-CQNprtHe.js → factory-BMrK4TrE.js} +4 -4
- package/server/{feature-registry-population-D9Z3tYSa.js → feature-registry-population-B-CI9hgE.js} +4 -4
- package/server/{feature-registry-storage-BWymOgXE.js → feature-registry-storage-B972ph_A.js} +2 -2
- package/server/{features--fOza5g5.js → features-Bc-Bmiye.js} +2 -2
- package/server/{feedback-target-Dn9vfPpz.js → feedback-target-DS6NUuSs.js} +1 -1
- package/server/{feedback-target-Dqik2WTe.js → feedback-target-DZ-iAnAa.js} +7 -7
- package/server/{feedback-writer-Wlq5-qgS.js → feedback-writer-BXP6g75N.js} +4 -4
- package/server/{feedback-writer-DDQNV8uc.js → feedback-writer-Bx5z11mF.js} +1 -1
- package/server/{flywheel-DPUc8r3V.js → flywheel-6WHU4O7A.js} +14 -14
- package/server/{flywheel-1Wd8WDlh.js → flywheel-COR0mbRI.js} +12 -12
- package/server/{flywheel-Q-38YhZG.js → flywheel-Ctr5uuvo.js} +1 -1
- package/server/{flywheel-merge-order-CeBuX0EJ.js → flywheel-merge-order-CNKAY489.js} +1 -1
- package/server/{flywheel-merge-order-4SqOXFAr.js → flywheel-merge-order-CTgHeg-W.js} +7 -7
- package/server/forge-B0_opi-V.js +2 -0
- package/server/{forge-DBbDpiYc.js → forge-B1S_KZv4.js} +2 -2
- package/server/{from-hh6vTBGl.js → from-DpwQ-sc3.js} +1 -1
- package/server/{fts-db-6ponMie2.js → fts-db-DmAcuCkV.js} +2 -2
- package/server/{fts-operations-KIRK165y.js → fts-operations-7d_RkmWp.js} +2 -2
- package/server/git-utils-Cc3FHDKd.js +198 -0
- package/server/{git-utils-DmF5xkj8.js → git-utils-CsKGnzFA.js} +1 -1
- package/server/{github-app-B3yfECo8.js → github-app-CDPtGF7J.js} +2 -2
- package/server/{github-app-CeSVFL6C.js → github-app-CU14oYzP.js} +1 -1
- package/server/{github-client-4A6FgA8O.js → github-client-CwBZZ3t7.js} +1 -1
- package/server/{github-client-Dslipypz.js → github-client-XjTJbBm7.js} +2 -2
- package/server/{github-pr-lookup-DBP0YHMr.js → github-pr-lookup-CFGeVhqv.js} +2 -2
- package/server/harness-binary-B2CTcD84.js +106 -0
- package/server/{harness-resolve-BGpO-OVM.js → harness-resolve-D5FVQTmy.js} +9 -15
- package/server/{health-events-CnwV_SSz.js → health-events-C1whmd58.js} +1 -1
- package/server/{health-events-CZGZ5I-A.js → health-events-DREeevle.js} +2 -2
- package/server/{hooks-DvX33gY_.js → hooks-B-HItBiS.js} +1 -1
- package/server/{hooks-CoNscX84.js → hooks-yxRsjk-z.js} +2 -2
- package/server/hume-BmhvfVbV.js +3 -0
- package/server/{hume-DSJt5eA_.js → hume-Dz_OymXE.js} +2 -2
- package/server/{idle-stack-reaper-5DVRoY6P.js → idle-stack-reaper-DrCv0OAG.js} +1 -1
- package/server/{idle-stack-reaper-BfL8HqYy.js → idle-stack-reaper-Yf34xXxY.js} +2 -2
- package/server/{in-flight-guard-tVGiI5ee.js → in-flight-guard-BoWm66Kh.js} +2 -2
- package/server/{infra-DN2wSxle.js → infra-D4iNWMA5.js} +4 -4
- package/server/{injection-DK9zh_HL.js → injection-BVNa4MQW.js} +1 -1
- package/server/{injection-DtlT8Akv.js → injection-D7T75Pye.js} +7 -7
- package/server/{inspect-agent-DKByUS_F.js → inspect-agent-BXCgNeZ4.js} +13 -9
- package/server/inspect-agent-Dq0z1k3H.js +2 -0
- package/server/{internal-token-7bYL5v6K.js → internal-token-C9DdEOKY.js} +1 -1
- package/server/{internal-token-DhfFiwW7.js → internal-token-CXsfxslp.js} +2 -2
- package/server/{io-BiM-7Zsx.js → io-DQR9PMgS.js} +3 -3
- package/server/{issue-closed-Dfw3QDyZ.js → issue-closed-DtmJM0D0.js} +7 -7
- package/server/{issue-lifecycle-ytsEdDlK.js → issue-lifecycle-8PSS9Anq.js} +1 -1
- package/server/{issue-lifecycle-B7HZWnTA.js → issue-lifecycle-CeyW_HoD.js} +21 -21
- package/server/{issue-service-singleton-D5EB5eYr.js → issue-service-singleton-DBZabEl7.js} +1 -1
- package/server/{issue-service-singleton-CPESc4Or.js → issue-service-singleton-D_RVYBuL.js} +8 -8
- package/server/{issues-XYtFMxrH.js → issues-pDW9VUNz.js} +2 -2
- package/server/{jsonl-parser-DJV2eZUP.js → jsonl-parser-C3HVNR5d.js} +3 -3
- package/server/{label-cleanup-CJ4m8iRU.js → label-cleanup-DPwiZlWo.js} +3 -3
- package/server/{label-reconciler-CNf3Ylm3.js → label-reconciler-Df1ZduPH.js} +4 -4
- package/server/{launcher-generator-5DJRiovn.js → launcher-generator-COgR2By1.js} +6 -6
- package/server/{layers-cZx7ibtV.js → layers-Cp1To4L8.js} +2 -2
- package/server/{lifecycle-CE7619Xw.js → lifecycle-CtPDcZ9u.js} +6 -6
- package/server/{lifecycle-io-CUpsxG0p.js → lifecycle-io-DmY2qwCn.js} +1 -1
- package/server/{lifecycle-io-DMurK4oM.js → lifecycle-io-taIb0PoH.js} +4 -4
- package/server/{linear-client-BLyN-NiP.js → linear-client-DsFkIxee.js} +2 -2
- package/server/{linear-client-Bj1l4FOA.js → linear-client-YwZMDIwQ.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-CwX2_AWm.js → merge-BwsyNRJV.js} +1 -1
- package/server/{merge-hSC2BENe.js → merge-C1t-bspg.js} +3 -3
- package/server/{merge-agent-CnORPiri.js → merge-agent-B-SnXOoc.js} +1 -1
- package/server/{merge-agent-DnBsms_V.js → merge-agent-DDiIjzk-.js} +369 -213
- package/server/{merge-batch-C2w2U2eK.js → merge-batch-Byt-QnEl.js} +1 -1
- package/server/{merge-blockers-DhRgh76x.js → merge-blockers-BYjeXrVN.js} +2 -2
- package/server/merge-ops-DwWCkSgo.js +2 -0
- package/server/{merge-rebase-CE-ZyOMY.js → merge-rebase-Cm6fXaZN.js} +2 -2
- package/server/{merge-set-DHkzPCJU.js → merge-set-6LEglm6o.js} +1 -1
- package/server/{merge-set-D7YNU1ZB.js → merge-set-DiISXcC-.js} +3 -3
- package/server/{merge-sync-CpGA9Kg7.js → merge-sync-B95_4in_.js} +1 -1
- package/server/{merge-sync-De1FYva5.js → merge-sync-Do8_q32h.js} +2 -2
- package/server/{merge-train-SvkRJZ-k.js → merge-train-CKana8EH.js} +3 -3
- package/server/{merge-train-deps-CECJTElu.js → merge-train-deps-BgmqwIfA.js} +4 -4
- package/server/{merge-verification-B3meGcXF.js → merge-verification-CqnUzGEK.js} +4 -4
- package/server/{multipart-parser-ByTMgYV5.js → multipart-parser-tdOQDJ3o.js} +2 -2
- package/server/{no-resume-mode-BnInAFKs.js → no-resume-mode-BWOSZjWd.js} +1 -1
- 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-DSvsJ5M7.js} +1 -1
- package/server/{orphan-proposed-reconciler-AxAGUouN.js → orphan-proposed-reconciler-xklgvNA7.js} +19 -12
- package/server/package-lock.json +6 -6
- package/server/package.json +1 -1
- package/server/{pan-dir-Rw17YjT1.js → pan-dir-DOcf6ug3.js} +4 -4
- package/server/{paths-FP8v3lTz.js → paths-DooHpt9p.js} +2 -2
- package/server/{pickup-xi3KTLaJ.js → pickup-CaskQ7j6.js} +2 -2
- package/server/{pipeline-membership-BtKMNY7v.js → pipeline-membership-1LGRjo-k.js} +11 -8
- package/server/{pipeline-notifier-BM2HLF7B.js → pipeline-notifier-B6FVsYF9.js} +2 -2
- package/server/{pipeline-notifier-dQ-U4NSb.js → pipeline-notifier-CZsrU_nj.js} +1 -1
- package/server/{project-pipelines-B59NfN44.js → project-pipelines-CtNG_rvs.js} +2 -2
- package/server/projects-BKkwpH6q.js +3 -0
- package/server/{prompts-CbqaVjbe.js → prompts-EvhMeeHG.js} +2 -2
- package/server/{providers-d3pwXGVE.js → providers-BDDPULlp.js} +7 -7
- package/server/providers-DNSQqy2V.js +3 -0
- package/server/public/assets/{chunk-BO2N2NFS-BxYSL7J-.js → chunk-BO2N2NFS-sym_ufXe.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-C_F9Q2as.js → diagram-OG6HWLK6-CQJPBNBu.js} +1 -1
- package/server/public/assets/{dist-DQNg4CiF.js → dist-Bio7THQU.js} +1 -1
- package/server/public/assets/{dist-CLSlc6cV.js → dist-DukGS2YZ.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-Cq0my-0C.js → ganttDiagram-6RSMTGT7-D4lWwte3.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-eZC03dGh.js → highlighted-body-OFNGDK62-CaLboCt5.js} +1 -1
- package/server/public/assets/{index-C6NLz_1S.css → index-Bdc4V9ba.css} +1 -1
- package/server/public/assets/{index-SLYGA8AQ.js → index-Bwejq-5s.js} +147 -145
- package/server/public/assets/{linear-6Fi3qnGg.js → linear-qUWmMZ-c.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-Dpmc6xsv.js → pieDiagram-4H26LBE5-C4zYulEm.js} +1 -1
- package/server/public/assets/{prod-ojHllFvN.js → prod-C8VtLuWC.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Ulr9gON5.js → quadrantDiagram-W4KKPZXB-qP04zyZC.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-CwdHGXfL.js → sankeyDiagram-5OEKKPKP-eMPTX_cG.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-r-bEDzJh.js → xychartDiagram-2RQKCTM6-Dme1PIt6.js} +1 -1
- package/server/public/index.html +54 -10
- package/server/{pull-requests-CjjPj7v6.js → pull-requests-8z2N1UOV.js} +3 -3
- package/server/{pull-requests-D3N6HQzI.js → pull-requests-By_BteaL.js} +1 -1
- package/server/{queries-B5hl7lMQ.js → queries-ZABd5aXP.js} +95 -71
- package/server/rally-OSJXdiHK.js +3 -0
- package/server/{rally-api-DGaFz5L5.js → rally-api-DqKqIMNR.js} +2 -2
- package/server/{rally-api-CKr0O4DJ.js → rally-api-xHazRk0d.js} +1 -1
- package/server/{rally-client-Cqf6EX_r.js → rally-client-CGWEHaPd.js} +1 -1
- package/server/{rally-client-SVbjGvqj.js → rally-client-COYz1vYR.js} +4 -4
- package/server/{rally-Dp0Gb1DN.js → rally-i_goYmiA.js} +3 -3
- package/server/reap-terminal-sessions-CaMkFOIH.js +4 -0
- package/server/{reap-terminal-sessions-CjqRAGw7.js → reap-terminal-sessions-DG9eiMVz.js} +11 -28
- package/server/{rebuild-stack-DjdpALr1.js → rebuild-stack-CKjJAI8L.js} +1 -1
- package/server/{rebuild-stack-DHqCLvLX.js → rebuild-stack-JUm0jqYP.js} +6 -6
- package/server/{reconstruct-cache-BqrCQt0o.js → reconstruct-cache-wU79aCee.js} +6 -6
- package/server/record-rwK-nKv_.js +3 -0
- package/server/{record-update-RviRDSNs.js → record-update-Crz74r-6.js} +2 -2
- package/server/{record-update-BlB8mpKO.js → record-update-D3N6WMFR.js} +1 -1
- package/server/{recovery-trip-l1Hsi37x.js → recovery-trip-DkzJSej9.js} +2 -2
- package/server/{release-engine-CSI4K6Oj.js → release-engine-DMINVN8S.js} +5 -5
- package/server/{release-set-BywwggrE.js → release-set-DeUSOEHy.js} +3 -3
- package/server/{remote-DYziAkiZ.js → remote-Dr5kGYSZ.js} +3 -3
- package/server/{remote-agents-CZ2rc8I0.js → remote-agents-Ct_WOyke.js} +6 -6
- package/server/{remote-agents-BNORDWAX.js → remote-agents-D6O_zETW.js} +1 -1
- package/server/{remote-cnoeuDWn.js → remote-b-c5bOce.js} +3 -3
- package/server/{remote-completion-W67FNQ-A.js → remote-completion-Dca3hAaa.js} +13 -13
- package/server/resume-wZZsWtzz.js +3 -0
- package/server/{review-agent-CSswH985.js → review-agent-CCum8sGe.js} +1 -1
- package/server/{review-agent-CqSqSHkU.js → review-agent-CThvgK2r.js} +23 -23
- package/server/{review-artifacts-BBgnd5df.js → review-artifacts-CXywD0F2.js} +5 -5
- package/server/{review-context-Ctp9BdNJ.js → review-context-OYfKUprb.js} +8 -8
- package/server/{review-status-DXeqFpk5.js → review-status-Bnh-rdkY.js} +1 -1
- package/server/{review-status-CCgPVK1h.js → review-status-DFRjDFef.js} +21 -37
- package/server/{review-status-enrichment-DtDRGpst.js → review-status-enrichment-crNAtIpL.js} +3 -3
- package/server/review-status-source-CxuEjLGg.js +39 -0
- package/server/{review-status-sync-C792ksoJ.js → review-status-sync-D60PJWNL.js} +1 -1
- package/server/{review-status-sync-jnLgd04F.js → review-status-sync-DpAMD_WO.js} +2 -2
- package/server/{review-verdict-feedback-CMsIpTpy.js → review-verdict-feedback-CpUZl5aE.js} +7 -7
- package/server/{review-verdict-feedback-D5lW0o3k.js → review-verdict-feedback-JImjut0z.js} +1 -1
- package/server/{rollup-B3kQmNpl.js → rollup-CZ02qgxk.js} +1 -1
- package/server/{rollup-CLj_AK9f.js → rollup-SyuF09e4.js} +8 -8
- package/server/{scanner-C4NeC4FE.js → scanner-Br0Z5S6R.js} +7 -7
- package/server/{sequence-io-Ce-6grIY.js → sequence-io-fxU0DlwW.js} +4 -4
- package/server/{sequencer-agent-Bpz0yGmG.js → sequencer-agent-B5YC5XVP.js} +5 -5
- package/server/server.js +583 -387
- package/server/{service-CqAY8Kmk.js → service-Bagb90KZ.js} +150 -47
- package/server/{session-fork-uNo4rMRA.js → session-fork-BqQxd-V6.js} +2 -2
- package/server/{session-history-DUehL3KN.js → session-history-XdS0JKp3.js} +4 -4
- package/server/{settings-DP2OYLXL.js → settings-BNbocWOg.js} +3 -3
- package/server/settings-BlUsVaUc.js +2 -0
- package/server/{settings-D9grjmaP.js → settings-uLc6DEYI.js} +2 -2
- package/server/{shadow-engineering-Bi_oIMtF.js → shadow-engineering-D4X_s3fA.js} +3 -3
- package/server/{shadow-state-a_ztFBJe.js → shadow-state-C_NkP-sa.js} +2 -2
- package/server/{shadow-state-CDxEuPlE.js → shadow-state-CbvsN3qG.js} +1 -1
- package/server/{shadow-utils-CyOg6_Xq.js → shadow-utils-CYMRPeRT.js} +2 -2
- package/server/{ship-log-DDcueaIR.js → ship-log-__QtAFXG.js} +1 -1
- package/server/{smart-compaction--Oj65Uov.js → smart-compaction-CLZOWin1.js} +7 -7
- package/server/{smart-compaction-C1_VVLEd.js → smart-compaction-jdMkG1vo.js} +1 -1
- package/server/{spawn-planning-session-LFtK2QCE.js → spawn-planning-session-8D6mE033.js} +1 -1
- package/server/{spawn-planning-session-AiUSsBnH.js → spawn-planning-session-D5OXo8pT.js} +19 -15
- package/server/{specialist-completion-qOgqdqXH.js → specialist-completion-CqmduO92.js} +1 -1
- package/server/{specialist-context-gjj8Z4Ii.js → specialist-context-CJ-QjFR-.js} +5 -5
- package/server/{specialist-handoff-logger-BsBNvVZv.js → specialist-handoff-logger-Dnjlwt7g.js} +2 -2
- package/server/{specialist-logs-CSLtvPx6.js → specialist-logs-CQnKzuZs.js} +3 -3
- package/server/{specialists-DAegTvRt.js → specialists-Bg9v4z3F.js} +122 -94
- package/server/{specialists-CYRwELzc.js → specialists-CwZHb5cb.js} +18 -18
- package/server/{specialists-D0VBf8g_.js → specialists-D0gGXMZx.js} +1 -1
- package/server/{specialists-C6WkeKFK.js → specialists-Dqe6_HE5.js} +1 -1
- package/server/specs-BhOKBzqk.js +3 -0
- package/server/{src-OLoJhUiJ.js → src-BMMoA_ba.js} +6 -6
- package/server/{src-BqTcrfO_.js → src-Bqdtd6po.js} +3 -3
- package/server/{src-Dpq1yFIl.js → src-k039WVYY.js} +337 -4
- package/server/{stack-health-I713ELld.js → stack-health-Bd06frFn.js} +1 -1
- package/server/{stack-health-DV_f-lK0.js → stack-health-C-ifC7b0.js} +2 -2
- package/server/{stale-task-claims-CQSKZVq0.js → stale-task-claims-L7pJkQFL.js} +4 -4
- package/server/{staleness-BbsGxmF2.js → staleness-BID1BKdr.js} +1 -1
- package/server/{staleness-zGp4P1hd.js → staleness-_Tr-GwdA.js} +1 -1
- package/server/{state-home-DixkE-up.js → state-home-CONQvZR0.js} +36 -23
- package/server/state-migrate-BeBW0KXA.js +478 -0
- package/server/{stuck-remediation-BWkK_O7A.js → stuck-remediation-CKnIryGT.js} +20 -18
- package/server/{stuck-remediation-CTPRC2S5.js → stuck-remediation-CsGD5Ksb.js} +1 -1
- package/server/{substrate-bug-weights-service-DXd0ID83.js → substrate-bug-weights-service-CpIZILj9.js} +3 -3
- package/server/{summary-fork-CdLn8Chr.js → summary-fork-agEMsPSo.js} +2 -2
- package/server/{summary-fork-f3DpgjXh.js → summary-fork-bX6ax6X7.js} +8 -8
- package/server/supervisor-COVHrBTg.js +2 -0
- package/server/{supervisor-Ch8CDuoF.js → supervisor-Ctt4eRYz.js} +3 -3
- package/server/{swarm-readiness-C9P2iPap.js → swarm-readiness-DdmJVX7y.js} +3 -3
- package/server/{system-prerequisites-DkoQBn1q.js → system-prerequisites-DSXBvffY.js} +24 -44
- package/server/{teardown-workspace-D-5yMyit.js → teardown-workspace-DDCf5n-a.js} +15 -15
- package/server/{test-agent-queue-BwpUpu-o.js → test-agent-queue-BJZ9Nfcc.js} +6 -6
- package/server/{test-verdict-BRiSu7eW.js → test-verdict-Cp5tljlJ.js} +1 -1
- package/server/{test-verdict-BQ1yx7d4.js → test-verdict-D_-sXIz_.js} +1 -1
- package/server/{tldr-daemon-BJA7TkqS.js → tldr-daemon-B8_oT5gx.js} +1 -1
- package/server/{tldr-daemon-DjxP5g6Y.js → tldr-daemon-BQFmmFp0.js} +2 -2
- package/server/{tmux-HQLgwo_C.js → tmux-BAvtac_u.js} +1 -1
- package/server/{tmux-y1blSxks.js → tmux-L5LgvGLp.js} +2 -2
- package/server/{token-LUrbM9sU.js → token-BkQLy4yS.js} +2 -2
- package/server/token-util-BArZLN6w.js +3 -0
- package/server/{token-util-BZaDAQ8S.js → token-util-DI8sGlmF.js} +1 -1
- package/server/{tracker-config-DSFZBdXP.js → tracker-config-DdT-nUAM.js} +2 -2
- package/server/{tracker-utils-DiceZN3a.js → tracker-utils-CawsPSS2.js} +2 -2
- package/server/{tracker-utils-WtP_V-yn.js → tracker-utils-DV3h1FYG.js} +1 -1
- package/server/{traefik-connect-BXqfOP4-.js → traefik-connect-C6mJckNs.js} +1 -1
- package/server/{tunnel-WcJImbAC.js → tunnel-BIFl98rc.js} +1 -1
- package/server/{tunnel-DTng1rfQ.js → tunnel-IdK1iTHx.js} +3 -3
- package/server/{types-BjaZ1oqH.js → types-7-GnJn0t.js} +1 -1
- package/server/{types-DqeBMmJN.js → types-hraoaQIp.js} +1 -1
- package/server/{uat-train-Wismge7h.js → uat-train-0Ujk8GCv.js} +1 -1
- package/server/{uat-train-BpLnp7Cx.js → uat-train-j0cPeMSj.js} +25 -25
- package/server/{validation-BA4e5EGm.js → validation-CabEISJT.js} +4 -4
- package/server/{validation-CUWamZ4X.js → validation-DcAgXTQp.js} +1 -1
- package/server/{verification-artifact-Dr_0g9nb.js → verification-artifact-BuTA1QbL.js} +1 -1
- package/server/{verification-artifact-CrbI4tJE.js → verification-artifact-Ck1tefmz.js} +1 -1
- package/server/{verification-runner-Dcksl_P-.js → verification-runner-DlJezzef.js} +1 -1
- package/server/{verification-runner-gAzh3cVD.js → verification-runner-FiuAZ-H2.js} +15 -14
- package/server/{vtt-parser-3VZKsmSm.js → vtt-parser-BnRsYzcz.js} +1 -1
- package/server/{work-agent-prompt-ULdcANl5.js → work-agent-prompt-DLthEPAq.js} +12 -11
- package/server/{workflows-B8ROFlfw.js → workflows-BZNNYkGC.js} +18 -18
- package/server/workflows-C4mR0Reb.js +2 -0
- package/server/{workspace-DSjUJaJN.js → workspace-3IC-UkAi.js} +1 -1
- package/server/{workspace-DhTDA8nB.js → workspace-D9ppycdg.js} +3 -3
- package/server/{workspace-config-BAAsAv-o.js → workspace-config-Bigl_-Lk.js} +1 -1
- package/server/{workspace-manager-CcujONCR.js → workspace-manager-B1WOfKvB.js} +1 -1
- package/server/{workspace-manager-DsN52IMG.js → workspace-manager-ClkCIWTe.js} +13 -13
- package/server/{workspace-metadata-CftOpNLs.js → workspace-metadata-BE0efUv_.js} +1 -1
- package/server/{workspace-metadata-DIL5_U4c.js → workspace-metadata-tiSRIWJP.js} +2 -2
- package/server/{workspaces-Dmlh1YXm.js → workspaces-CFPcL0vl.js} +96 -96
- package/sync-sources/skills/pan-start/SKILL.md +23 -0
- package/server/cli-ChErG518.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/merge-ops-BpTtuO8x.js +0 -2
- package/server/projects-IRHJIPYC.js +0 -3
- package/server/providers-BqCdTryq.js +0 -3
- 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-us0YECMO.js +0 -3
- package/server/resume-OyN3dEXE.js +0 -3
- package/server/settings-BaPXXJsT.js +0 -2
- package/server/specs-BsNcum0h.js +0 -3
- package/server/state-migrate-_zJJ6XKE.js +0 -362
- package/server/supervisor-Qy1QecAs.js +0 -2
- package/server/token-util-Cg-QnowA.js +0 -3
- package/server/workflows-C5c-RPsY.js +0 -2
package/server/server.js
CHANGED
|
@@ -1,107 +1,110 @@
|
|
|
1
1
|
import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { $
|
|
3
|
-
import { a as shouldRefuseHostDashboardPort, i as readHostDashboardApiPort, n as getDashboardIdentity, r as isNonPrimaryCheckoutRoot } from "./deacon-nudge-log-
|
|
4
|
-
import { $ as runInBatches, A as handleConversationDelete, B as stopConversationRuntime, C as isPiControlChannelHarness, D as conversationNeedsRunningRepair, E as validateConversationControlAckOrigin, F as isInsideGitWorkTree, G as cleanupOrphanedConversationAttachments, H as waitForPiTuiReady, I as resolveAllowedHarness, J as extractConversationAttachmentPaths, K as cleanupUnreferencedConversationAttachments, L as shouldReportUnresolvedLiveSession, M as handleConversationResume, N as handleConversationStop, O as conversationSessionAliveFromState, P as handleConversationSwitchModel, Q as removeConversationAttachment, R as spawnConversationSession, S as handleConversationThinkingLevel, T as resolveConversationDeliveryMethod, U as waitForTmuxSession$1, V as tmuxSessionExists, W as cleanupConversationAttachments, X as hasConversationAttachment, Y as getConversationAttachmentsRoot, Z as isManagedConversationAttachmentPath, _ as handleConversationCodexApproval, _t as validateOrigin$1, a as agentsRouteLayer, at as panCliInvocation, b as handleConversationDeliveryMethod, bt as getDefaultCwd, c as hasDashboardInternalToken, ct as resolveAgentHarness, d as rejectUnsafeDashboardMutationRequest, dt as resolveJsonlPath, et as evaluateSpawnGuardrails, f as saveAgentStateAndEmitEvent, ft as resolvePiSessionPath, g as handleConversationAbort, gt as isTrustedOriginForHost, h as deliverConversationViaControlChannel, ht as getHeaderFromMap, j as handleConversationRestartAll, k as handleConversationCreate, l as rejectUnauthorizedDashboardRequest, lt as resolveClaudeSessionId, m as codexConversationPendingInput, mt as waitForSessionRespawn, nt as resolveAgentGitInfo, o as dashboardCsrfToken, p as saveAgentStateAndEmitEventProgram, pt as isRespawnPending, q as ensureConversationAttachmentDir, rt as resolveConversationGitInfo, s as dashboardSessionCookieHeader, st as readLauncherPinnedSessionId, t as specialistsRouteLayer, tt as invalidateAgentsCache, u as rejectUnauthorizedDashboardSessionMintRequest, ut as resolveCodexRolloutPath, v as handleConversationCompact, vt as validateOriginHeaders, w as pickDeliverAs, x as handleConversationPlanAction, xt as jsonResponse, y as handleConversationControlAck, yt as httpHandler, z as startConversationModelBackfill } from "./specialists-
|
|
2
|
+
import { $r as getDocsIndexPath, A as canUseHarnessSync, Br as LOGS_DIR, Cr as GitHubApiError, D as resolveTieredExecutionEnabled, Dn as extractTeamPrefix, Dr as ProcessSpawnError, E as resolveTieredExecutionBlock, Gn as listProjects, H as init_providers, Hn as init_projects, I as UnknownModelError, In as getProjectSync, J as defaultBackgroundAiFeatures, Jr as SYNC_SOURCES, Kn as listProjectsSync, Lr as CLAUDE_DIR, M as init_harness_policy, Mr as AGENTS_DIR, Nn as getIssuePrefix, Nt as init_record, Q as computeModelOrigin, Qn as renameProject, Qr as getDocsDisableStatePath, R as getBuiltInDefaultHarness, Rt as readIssueRecordSync, T as init_tier_table, Tn as ProjectRenameError, V as getProviderForModelSync, Vr as OVERDECK_HOME, X as DEFAULT_ROLES, Xr as encodeClaudeProjectDir, Y as init_registry, Z as DEFAULT_WORKHORSES, Zn as registerProjectSync, Zr as getDocsBudgetStatePath, _ as getDefaultDocsConfig, _r as require_dist$1, ai as isDevMode, at as getModelEffortLevelsSync, ci as sessionFilePath, cn as init_auto_commit, ct as modelSupportsImagesSync, d as loadConfigNoMigration, dr as extractPrefixSync, ei as getDocsTelemetryPath, er as resolveInfraRepo, f as loadConfigSync, fr as init_issue_id, g as mergeConfigs, h as jsYaml, ht as ROLE_EFFORTS, i as getConversationsConfig, ii as init_paths, jn as findProjectByTeamSync, jr as init_errors, jt as getIssueWorkspacePath, k as validateTieredExecutionConfig, kn as findProjectByPathSync, kr as TrackerError, lt as resolveModelIdSync, m as init_js_yaml, mr as parseIssueIdSync, mt as PARENT_MODEL_REF, n as clearConfigCache, ni as getLegacyHome, nr as resolveProjectFromIssueSync, nt as MODEL_CAPABILITIES, o as getGlobalConfigPath, oi as packageRoot, on as flushAllPendingAutoCommits, or as setProjectAutoMergeDefaultSync, ot as hasModelCapabilitySync, p as updateConversationsConfig, pt as COMPLIANCE_MODES, r as getConversationSearchConfigSync, ri as getOverdeckHome, rt as MODEL_DEPRECATIONS, s as init_load, sn as flushAutoCommits, sr as setProjectSwarmPolicySync, st as init_model_capabilities, t as init_config_yaml, tr as resolveProjectFromIssue, tt as resolveModel, u as isTldrEnabledSync, v as getDefaultTtsDaemonConfig, w as TieredExecutionConfigError, xr as FsError, y as mergeTtsDaemonConfigs, z as getKimiAnthropicBaseUrl } from "./config-yaml-ig8Nwtiw.js";
|
|
3
|
+
import { a as shouldRefuseHostDashboardPort, i as readHostDashboardApiPort, n as getDashboardIdentity, r as isNonPrimaryCheckoutRoot } from "./deacon-nudge-log-D6K9K-rE.js";
|
|
4
|
+
import { $ as runInBatches, A as handleConversationDelete, B as stopConversationRuntime, C as isPiControlChannelHarness, D as conversationNeedsRunningRepair, E as validateConversationControlAckOrigin, F as isInsideGitWorkTree, G as cleanupOrphanedConversationAttachments, H as waitForPiTuiReady, I as resolveAllowedHarness, J as extractConversationAttachmentPaths, K as cleanupUnreferencedConversationAttachments, L as shouldReportUnresolvedLiveSession, M as handleConversationResume, N as handleConversationStop, O as conversationSessionAliveFromState, P as handleConversationSwitchModel, Q as removeConversationAttachment, R as spawnConversationSession, S as handleConversationThinkingLevel, T as resolveConversationDeliveryMethod, U as waitForTmuxSession$1, V as tmuxSessionExists, W as cleanupConversationAttachments, X as hasConversationAttachment, Y as getConversationAttachmentsRoot, Z as isManagedConversationAttachmentPath, _ as handleConversationCodexApproval, _t as validateOrigin$1, a as agentsRouteLayer, at as panCliInvocation, b as handleConversationDeliveryMethod, bt as getDefaultCwd, c as hasDashboardInternalToken, ct as resolveAgentHarness, d as rejectUnsafeDashboardMutationRequest, dt as resolveJsonlPath, et as evaluateSpawnGuardrails, f as saveAgentStateAndEmitEvent, ft as resolvePiSessionPath, g as handleConversationAbort, gt as isTrustedOriginForHost, h as deliverConversationViaControlChannel, ht as getHeaderFromMap, j as handleConversationRestartAll, k as handleConversationCreate, l as rejectUnauthorizedDashboardRequest, lt as resolveClaudeSessionId, m as codexConversationPendingInput, mt as waitForSessionRespawn, nt as resolveAgentGitInfo, o as dashboardCsrfToken, p as saveAgentStateAndEmitEventProgram, pt as isRespawnPending, q as ensureConversationAttachmentDir, rt as resolveConversationGitInfo, s as dashboardSessionCookieHeader, st as readLauncherPinnedSessionId, t as specialistsRouteLayer, tt as invalidateAgentsCache, u as rejectUnauthorizedDashboardSessionMintRequest, ut as resolveCodexRolloutPath, v as handleConversationCompact, vt as validateOriginHeaders, w as pickDeliverAs, x as handleConversationPlanAction, xt as jsonResponse, y as handleConversationControlAck, yt as httpHandler, z as startConversationModelBackfill } from "./specialists-Bg9v4z3F.js";
|
|
5
5
|
import { a as init_activity_logger, i as emitDashboardLifecycleSync, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-DDlOIAML.js";
|
|
6
|
-
import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-
|
|
6
|
+
import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-D4iNWMA5.js";
|
|
7
7
|
import { n as openDatabase, t as init_driver } from "./driver-CKVGi51s.js";
|
|
8
|
-
import { n as updateIssueRecord, t as init_record_update } from "./record-update-
|
|
9
|
-
import { C as getWindowDimensions, D as killSession, I as resizeWindow, K as init_ui_theme, M as listSessions, R as sendKeys, T as isHarnessProcessAlive, V as sessionExists, X as buildChildEnvWithoutTmuxSync, Y as buildChildEnvSync, Z as init_child_env, d as ensureManagedTmuxContextOnce, i as capturePane, j as listSessionNames, k as listPaneValues, l as deliveryVerifyLine, n as buildTmuxArgs, o as capturePaneText, q as setUiTheme, s as createSession, w as init_tmux, z as sendKeysAsync } from "./tmux-
|
|
10
|
-
import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-
|
|
11
|
-
import {
|
|
12
|
-
import { a as fixStuckReadyForMerge, c as init_review_status, i as fixStuckCommentedReviews, l as loadReadyForMergeFlags, n as clearReviewStatus, o as getReviewStatus, r as clearStuckMergeStatuses, s as getReviewStatusSync, u as loadReviewStatuses, v as setReviewStatus, y as setReviewStatusSync } from "./review-status-
|
|
13
|
-
import { a as EventStoreService, c as ReadModelService, d as init_read_model, f as toAgentResolution, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentStatus, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-
|
|
14
|
-
import { c as listAllAgentsSync, n as AgentsResolverLive, o as init_agents } from "./agents-
|
|
15
|
-
import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-
|
|
16
|
-
import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-
|
|
17
|
-
import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-
|
|
18
|
-
import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-
|
|
19
|
-
import {
|
|
20
|
-
import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-
|
|
21
|
-
import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
8
|
+
import { n as updateIssueRecord, t as init_record_update } from "./record-update-Crz74r-6.js";
|
|
9
|
+
import { C as getWindowDimensions, D as killSession, I as resizeWindow, K as init_ui_theme, M as listSessions, R as sendKeys, T as isHarnessProcessAlive, V as sessionExists, X as buildChildEnvWithoutTmuxSync, Y as buildChildEnvSync, Z as init_child_env, d as ensureManagedTmuxContextOnce, i as capturePane, j as listSessionNames, k as listPaneValues, l as deliveryVerifyLine, n as buildTmuxArgs, o as capturePaneText, q as setUiTheme, s as createSession, w as init_tmux, z as sendKeysAsync } from "./tmux-L5LgvGLp.js";
|
|
10
|
+
import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-TnWdydfB.js";
|
|
11
|
+
import { D as AgentSnapshot, E as AgentRuntimeSnapshot, O as ReviewStatusSnapshot, S as SystemHealthSnapshot, _ as WS_METHODS, b as EDITORS, c as ContextPreviewRequest, g as PanRpcGroup, h as PanRpcError, l as FlywheelStats, n as compareIssueIds, o as getHarnessBehavior, s as ContextLayerSaveRequest, t as init_src, v as FlywheelRunId, w as MemoryObservation, x as DomainEvent, y as FlywheelStatus } from "./src-k039WVYY.js";
|
|
12
|
+
import { a as fixStuckReadyForMerge, c as init_review_status, i as fixStuckCommentedReviews, l as loadReadyForMergeFlags, n as clearReviewStatus, o as getReviewStatus, r as clearStuckMergeStatuses, s as getReviewStatusSync, u as loadReviewStatuses, v as setReviewStatus, y as setReviewStatusSync } from "./review-status-DFRjDFef.js";
|
|
13
|
+
import { a as EventStoreService, c as ReadModelService, d as init_read_model, f as toAgentResolution, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentStatus, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-CeyW_HoD.js";
|
|
14
|
+
import { c as listAllAgentsSync, n as AgentsResolverLive, o as init_agents } from "./agents-DXdHmRTC.js";
|
|
15
|
+
import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-DooHpt9p.js";
|
|
16
|
+
import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-C12WgkaB.js";
|
|
17
|
+
import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-B972ph_A.js";
|
|
18
|
+
import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-CTPjAmtH.js";
|
|
19
|
+
import { Ct as probeTranscriptSince, Dn as getAgentDir, Gn as saveAgentStateSync, Gt as getProviderAuthMode, It as resolveImplicitStaffing, Jt as injectPiConversationMemory, L as messageAgent, Pt as init_staffing, Qn as readAgentHarnessModelRecordSync, R as init_operator_interventions, St as init_transcript_landing, Zn as init_agent_record_sync, _r as init_codex_auth, a as listRunningAgentsSync, ar as normalizeAgentId, cr as waitForReadySignal, dn as getOpenAIAuthStatus, fn as init_openai_auth, gr as checkCodexAuthStatus, gt as deliverAgentMessage, i as listRunningAgents, it as emergencyBrake, jn as getAgentStateSync, kn as getAgentState, lr as getAgentRuntimeState, m as init_tier_supervisor, n as init_queries, nn as init_claude_auth, on as getProviderEnvForModel, ot as init_concurrency, p as deliverCommitForReview, r as listAgentStates, s as init_agents$1, tn as getClaudeAuthStatus, ur as getAgentRuntimeStateSync, v as supervisorAgentId, xt as captureTranscriptUserRecordSnapshot, z as operatorInterventionEvent } from "./queries-ZABd5aXP.js";
|
|
20
|
+
import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-D_cre6WM.js";
|
|
21
|
+
import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-Bagb90KZ.js";
|
|
22
|
+
import { u as init_agent_runtime_mirror } from "./session-history-XdS0JKp3.js";
|
|
23
|
+
import { t as init_behavior } from "./behavior-CGj16clS.js";
|
|
24
|
+
import { n as AgentStateServiceLive } from "./agent-state-service-DistflNn.js";
|
|
25
|
+
import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-DdT-nUAM.js";
|
|
25
26
|
import { d as init_typed_errors, i as PlanEmpty, l as WorkspaceCreateError, n as AgentStartError, s as TrackerApiError, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-2BTMxkZq.js";
|
|
26
|
-
import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-
|
|
27
|
-
import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-
|
|
28
|
-
import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-
|
|
29
|
-
import { a as resolveTrackerTypeSync, i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-
|
|
30
|
-
import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-
|
|
31
|
-
import { i as ensureInternalTokenSync, s as init_internal_token } from "./internal-token-
|
|
32
|
-
import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-
|
|
33
|
-
import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import { C as
|
|
37
|
-
import { C as
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import { i as
|
|
42
|
-
import { i as
|
|
43
|
-
import {
|
|
44
|
-
import { a as
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
50
|
-
import {
|
|
51
|
-
import {
|
|
52
|
-
import {
|
|
53
|
-
import {
|
|
54
|
-
import {
|
|
55
|
-
import {
|
|
56
|
-
import {
|
|
57
|
-
import { i as
|
|
58
|
-
import { c as
|
|
59
|
-
import {
|
|
60
|
-
import {
|
|
61
|
-
import {
|
|
62
|
-
import {
|
|
63
|
-
import {
|
|
64
|
-
import {
|
|
65
|
-
import { l as
|
|
66
|
-
import {
|
|
67
|
-
import {
|
|
68
|
-
import {
|
|
69
|
-
import {
|
|
70
|
-
import {
|
|
71
|
-
import {
|
|
72
|
-
import {
|
|
73
|
-
import {
|
|
74
|
-
import {
|
|
75
|
-
import {
|
|
76
|
-
import { a as
|
|
77
|
-
import {
|
|
78
|
-
import { a as
|
|
79
|
-
import {
|
|
80
|
-
import { i as
|
|
81
|
-
import {
|
|
82
|
-
import {
|
|
83
|
-
import {
|
|
84
|
-
import {
|
|
85
|
-
import { t as
|
|
86
|
-
import {
|
|
87
|
-
import {
|
|
88
|
-
import {
|
|
89
|
-
import { n as
|
|
90
|
-
import {
|
|
91
|
-
import {
|
|
92
|
-
import {
|
|
93
|
-
import {
|
|
94
|
-
import {
|
|
95
|
-
import { n as
|
|
96
|
-
import {
|
|
97
|
-
import {
|
|
98
|
-
import { a as
|
|
99
|
-
import { a as
|
|
100
|
-
import {
|
|
101
|
-
import { t as
|
|
102
|
-
import {
|
|
103
|
-
import "./
|
|
104
|
-
import { i as
|
|
27
|
+
import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-DsFkIxee.js";
|
|
28
|
+
import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-XjTJbBm7.js";
|
|
29
|
+
import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-COYz1vYR.js";
|
|
30
|
+
import { a as resolveTrackerTypeSync, i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-CawsPSS2.js";
|
|
31
|
+
import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-D_RVYBuL.js";
|
|
32
|
+
import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-CXsfxslp.js";
|
|
33
|
+
import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-B6FVsYF9.js";
|
|
34
|
+
import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-DpAMD_WO.js";
|
|
35
|
+
import { n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-CxuEjLGg.js";
|
|
36
|
+
import { a as PAN_DIRNAME, d as WORKSPACE_RUNTIME_DIRNAME, f as asPanSpecDocument, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-hraoaQIp.js";
|
|
37
|
+
import { C as transitionToMerging, _ as markFailed, c as isFlywheelGloballyPaused, d as listDuePendingAutoMerges, f as listProblemAutoMerges, g as markBlocked, n as getActionableAutoMerge, o as init_merge_sync, t as cancelPending, u as listActiveAutoMerges, v as markMerged, x as scheduleAutoMergeWithResult, y as requeueToPending } from "./merge-sync-Do8_q32h.js";
|
|
38
|
+
import { C as init_specs, D as writeSpecDocument, O as writeSpecForIssue, a as findWorkspaceDraftPlan, m as readWorkspacePlanSync, o as init_io, p as readWorkspacePlan, r as findPlan, s as isPlanningComplete, u as readPlan, v as init_types$1, x as findSpecByIssue, y as subItemsOf } from "./io-DQR9PMgS.js";
|
|
39
|
+
import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-Brf_5MuG.js";
|
|
40
|
+
import { $ as updateConversationForkFallbackReason, A as isAgentConversationName, B as removeFavorite, C as getConversationByTmuxSession, D as importLegacyConversation, F as markConversationEnded, H as setClearedToConvId, I as markConversationRunning, J as setForkRequest, M as listConversations, N as listFavoritedIds, O as incrementForkRetryCount, P as markConversationActive, S as getConversationByName, T as getStuckForks, U as setConversationClaudeSessionId, X as unarchiveConversation, Y as setImportedConversationLinks, Z as updateConversationCost, _ as canRefineTitle, b as getConversationByClaudeSessionId, et as updateConversationTitle, gt as getDiscoveredSessionBySessionId, h as archiveConversation, j as listArchivedConversationsWithEnrichment, k as init_conversations, q as setFavorite, tt as updateForkStatus, v as canReplaceTitle, w as getConversationLedgerCosts, x as getConversationById, y as createConversation, yt as init_discovered_sessions, z as recordConversationHandoff } from "./conversations-bYpM9-kZ.js";
|
|
41
|
+
import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-Bc-Bmiye.js";
|
|
42
|
+
import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-BNbocWOg.js";
|
|
43
|
+
import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-BDDPULlp.js";
|
|
44
|
+
import { i as normalizeModelOverrideSync, n as init_launcher_generator, r as init_model_validation, t as generateLauncherScriptSync } from "./launcher-generator-COgR2By1.js";
|
|
45
|
+
import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-nSFKH78M.js";
|
|
46
|
+
import { a as globalContextFile$1, f as resolveProjectContextFile, h as workspaceContextFile, n as codexGlobalContextFile, o as init_layers, p as resolveWorkspaceContextFile, r as ensureProjectLayer } from "./layers-Cp1To4L8.js";
|
|
47
|
+
import { l as init_codex, s as findRolloutPath } from "./codex-CbmztVcc.js";
|
|
48
|
+
import { n as init_harness_binary, r as prepareHarnessLaunch } from "./harness-binary-B2CTcD84.js";
|
|
49
|
+
import { f as init_config, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-q4Gvd8dq.js";
|
|
50
|
+
import { C as setMergeTrainEnabled, S as setFlywheelRequireUatBeforeMerge, b as setFlywheelAutoPickupBacklog, c as isCloisterSpawnsPausedSync, d as isFlywheelAutoPickupBacklog, f as isFlywheelGloballyPaused$1, g as setCloisterSpawnsPausedSync, h as setBootReconciliationDecision, m as isMergeTrainEnabled, o as getSetting, p as isFlywheelRequireUatBeforeMerge, r as getBootReconciliationState, s as init_control_settings, u as isDeaconGloballyPausedSync, v as setDeaconGloballyPausedSync, w as setSetting } from "./control-settings-D_odMIaC.js";
|
|
51
|
+
import { l as init_dag, r as compileGlob } from "./dag-CJpgf9A3.js";
|
|
52
|
+
import { a as loadCloisterConfigSync, o as saveCloisterConfigSync, r as init_config$1, s as shouldAutoStart } from "./config-DeTsoZdR.js";
|
|
53
|
+
import { c as isStateMigrated, i as ensureStateWorktree, o as init_state_home, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-CONQvZR0.js";
|
|
54
|
+
import { i as checkPrdGateSync, t as init_pan_dir } from "./pan-dir-DOcf6ug3.js";
|
|
55
|
+
import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-taIb0PoH.js";
|
|
56
|
+
import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-DdmJVX7y.js";
|
|
57
|
+
import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-DI8sGlmF.js";
|
|
58
|
+
import { _ as init_codex_conversation_parser, a as contextUsageFromParseResult, c as parseEntireConversation, d as init_pi_conversation_parser, f as isPiSessionFile, g as parseOhmypiConversationMessages, h as isOhmypiSessionFile, i as computeContextUsage, l as parseFromLastCompactBoundary, m as init_ohmypi_conversation_parser, n as gateSnapshotEmission, o as summarizeConversationActivity, p as parsePiConversationMessages, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages } from "./conversation-service-C3avRVEr.js";
|
|
59
|
+
import { c as countPendingAskUserQuestionsForAgent, h as detectAwaitingInputFromPaneSync, l as getAgentJsonlMtime, m as detectAwaitingInputForAgent, o as getRuntimeForAgent, p as scanPendingInputsPromise, s as computeAgentEnrichment } from "./stuck-remediation-CKnIryGT.js";
|
|
60
|
+
import { i as CostThresholdError, l as embed, s as parseRelativeTime } from "./scanner-Br0Z5S6R.js";
|
|
61
|
+
import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-DSUdR-04.js";
|
|
62
|
+
import { n as recordBackgroundAiCost, t as init_cost } from "./cost-wH46-WsJ.js";
|
|
63
|
+
import { a as getByIssueId, i as parseFlywheelStatsWindow, n as derivePipelineRunStatsInputs, o as markFixed, r as computeFlywheelStats, s as upsert } from "./substrate-bug-weights-service-CpIZILj9.js";
|
|
64
|
+
import { c as startUatTrainReconciler, d as openFlywheelRunReportForDashboard, f as pauseFlywheelRunForDashboard, g as runDashboardDbJob, h as startFlywheelRunForDashboard, l as stopUatTrainReconciler, m as resumeFlywheelRunForDashboard, p as readCurrentFlywheelStatusForDashboard, u as abortFlywheelRunForDashboard } from "./uat-train-j0cPeMSj.js";
|
|
65
|
+
import { C as writeLatestFlywheelStatus, b as resolveLiveFlywheelRunId, g as listFlywheelRuns, h as isFlywheelRunId, p as getFlywheelRunDetail, u as buildClassifyLookups, v as readCurrentLatestFlywheelStatus, x as subscribeLatestFlywheelStatus } from "./flywheel-COR0mbRI.js";
|
|
66
|
+
import { C as getWorkspacePathForIssue, S as resolveIssueHeadlineCost, _ as getCostsForIssueSync, b as processPendingFeedbackDeliveries, d as resumeQueuedMerges, f as syncWalFromAllProjects, g as migrateAllSessionsSync, h as reclassifyUnknownCostEventsSync, l as internalEventsRouteLayer, m as reconcilePiTranscripts, p as reconcile$1, t as workspacesRouteLayer, u as eventsRouteLayer, v as rebuildCacheSync, x as getCachedRunningAgents, y as syncCacheSync } from "./workspaces-CFPcL0vl.js";
|
|
67
|
+
import { At as getAcceptedSystemHealthSnapshot, Dt as formatUptime, Et as getResourceStacks, F as setAgentStatusChangedNotifier, Ft as isSmeeConfiguredSync, I as setAgentStoppedNotifier, It as startSmeeProcessSync, J as startBootReconciliation, K as isBootReconciliationCandidate, L as setMergeReadyNotifier, Lt as classifyAgentHealth, Nt as getSystemHealthEvidenceSnapshot, O as loadConfig, Ot as getContainerHistory, St as paneShowsClaudeBootBlockingScreen, jt as getDeployStaleness, k as loadState, kt as getCurrentDockerStats, n as assessDeaconPatrolFreshness, q as listBootReconciliationCandidates, t as applyBootReconciliationDecision, x as getDeaconLogs } from "./deacon-CkT_kznS.js";
|
|
68
|
+
import { l as detectPlatform, u as init_platform } from "./workspace-manager-ClkCIWTe.js";
|
|
69
|
+
import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-BXP6g75N.js";
|
|
70
|
+
import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-BoWm66Kh.js";
|
|
71
|
+
import { t as init_specialists, z as getReviewerSessionName } from "./specialists-CwZHb5cb.js";
|
|
72
|
+
import { c as findPrdAtStatusSync, l as init_prd_locations } from "./archive-planning-BvDuWNMo.js";
|
|
73
|
+
import { a as getShadowState, s as init_shadow_state } from "./shadow-state-C_NkP-sa.js";
|
|
74
|
+
import { A as withConcurrencyLimit, D as createPromiseConcurrencyLimiter, E as verifyAppCanMerge, O as createSettledTtlPromiseCache, d as getPullRequestState, f as init_github_app, k as init_concurrency$1, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-CDPtGF7J.js";
|
|
75
|
+
import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-DtmJM0D0.js";
|
|
76
|
+
import { b as resolveSwarmPolicy } from "./deacon-swarm-BryRr6AO.js";
|
|
77
|
+
import { a as init_boot_gates, i as formatBootGateState, o as resolveBootGates } from "./no-resume-mode-BWOSZjWd.js";
|
|
78
|
+
import { _ as selectNeedsPlanning, c as classifyIssue, d as computeLanes, f as computeStats, g as normalizeGate, l as computeCohort, m as init_pickup, p as computeWaves, u as computeEpicGroups } from "./pickup-CaskQ7j6.js";
|
|
79
|
+
import { a as applyIssueObjectionLabel, c as applyIssueReleasedLabel, d as removeIssueBlocksMainLabel, f as removeIssueObjectionLabel, g as removeIssueVetoedLabel, h as removeIssueReleasedLabel, i as applyIssueBlocksMainLabel, l as applyIssueVetoedLabel, m as removeIssueReadyLabel, o as applyIssueParkedLabel, p as removeIssueParkedLabel, s as applyIssueReadyLabel, u as init_label_ops } from "./label-reconciler-Df1ZduPH.js";
|
|
80
|
+
import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-fxU0DlwW.js";
|
|
81
|
+
import { c as init_resource_utils, i as gatherProjectLensSignals, l as parseIssueIdFromTextSync, n as init_pipeline_membership, o as init_pipeline_membership_gather, r as resolvePipelineMembership, s as listOpenPullRequestsSnapshot } from "./pipeline-membership-1LGRjo-k.js";
|
|
82
|
+
import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-tiSRIWJP.js";
|
|
83
|
+
import { i as resolveAutoSpawnOnFinalize, o as spawnPlanningSession } from "./spawn-planning-session-D5OXo8pT.js";
|
|
84
|
+
import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-Ct_WOyke.js";
|
|
85
|
+
import { r as spawnInspectAgent } from "./inspect-agent-BXCgNeZ4.js";
|
|
86
|
+
import { n as init_github_pr_lookup, r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-CFGeVhqv.js";
|
|
87
|
+
import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, d as setCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, o as init_pull_requests, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as init_pr_tab_cache } from "./pull-requests-8z2N1UOV.js";
|
|
88
|
+
import { t as DOD_ROWS } from "./dod-DbJLYcHv.js";
|
|
89
|
+
import { t as enrichReviewStatus } from "./review-status-enrichment-crNAtIpL.js";
|
|
90
|
+
import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-DmAcuCkV.js";
|
|
91
|
+
import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-SyuF09e4.js";
|
|
92
|
+
import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-BQFmmFp0.js";
|
|
93
|
+
import { T as listGitOperationsSync, w as init_git_activity } from "./merge-agent-DDiIjzk-.js";
|
|
94
|
+
import { t as readVerificationArtifact } from "./verification-artifact-BuTA1QbL.js";
|
|
95
|
+
import { t as getAgentCommandSync } from "./settings-uLc6DEYI.js";
|
|
96
|
+
import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-CThvgK2r.js";
|
|
97
|
+
import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-b-c5bOce.js";
|
|
98
|
+
import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-BI_UIke0.js";
|
|
99
|
+
import { a as init_query_expansion, i as clearQueryExpansionCache, n as init_injection, o as buildMatchQuery, r as injectPromptTimeMemory, s as init_search } from "./injection-D7T75Pye.js";
|
|
100
|
+
import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-bX6ax6X7.js";
|
|
101
|
+
import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-B6YSRLda.js";
|
|
102
|
+
import { a as init_render, d as validateTemplate, i as hasManagedRegion, l as init_harness, o as userContentOutsideRegion, t as init_context_layers, u as renderForHarness } from "./context-layers-15gDOk20.js";
|
|
103
|
+
import { r as parseArtifactRef } from "./forge-B1S_KZv4.js";
|
|
104
|
+
import { t as getMergeBlockersPayload } from "./merge-blockers-BYjeXrVN.js";
|
|
105
|
+
import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-B5YC5XVP.js";
|
|
106
|
+
import "./supervisor-Ctt4eRYz.js";
|
|
107
|
+
import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-BJum14fs.js";
|
|
105
108
|
import { createRequire } from "node:module";
|
|
106
109
|
import * as sp from "node:path";
|
|
107
110
|
import { basename, delimiter, dirname, extname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
|
|
@@ -109,7 +112,7 @@ import { Cause, Context, Data, Duration, Effect, Exit, Fiber, FileSystem, Layer,
|
|
|
109
112
|
import { createReadStream, createWriteStream, existsSync, fstatSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "fs";
|
|
110
113
|
import { basename as basename$1, dirname as dirname$1, join as join$1, resolve as resolve$1 } from "path";
|
|
111
114
|
import { homedir } from "os";
|
|
112
|
-
import {
|
|
115
|
+
import { homedir as homedir$1, type } from "node:os";
|
|
113
116
|
import { constants, createReadStream as createReadStream$1, existsSync as existsSync$1, mkdirSync as mkdirSync$1, promises as promises$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, readlinkSync, renameSync as renameSync$1, rmSync as rmSync$1, stat, statSync as statSync$1, symlinkSync as symlinkSync$1, unwatchFile, watch, watchFile } from "node:fs";
|
|
114
117
|
import { FetchHttpClient, HttpRouter, HttpServer, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
|
|
115
118
|
import { EventEmitter } from "node:events";
|
|
@@ -688,7 +691,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
688
691
|
if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
|
|
689
692
|
const plan = readWorkspacePlanSync(workspacePath);
|
|
690
693
|
if (!plan || plan.plan.items.length === 0) throw new PlanEmpty({ id: issueId });
|
|
691
|
-
const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-
|
|
694
|
+
const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-DyHKlq1I.js");
|
|
692
695
|
const normalizedId = normalizeAgentId(issueId);
|
|
693
696
|
if ((await Effect.runPromise(getAgentState(normalizedId)))?.status === "running") throw new AgentAlreadyRunning({ id: issueId });
|
|
694
697
|
return {
|
|
@@ -719,7 +722,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
719
722
|
const { workspacePath, projectPath, issue } = opts;
|
|
720
723
|
if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
|
|
721
724
|
const sessionName = opts.sessionName ?? `planning-${issueId.toLowerCase()}`;
|
|
722
|
-
const { spawnPlanningSession } = await import("./spawn-planning-session-
|
|
725
|
+
const { spawnPlanningSession } = await import("./spawn-planning-session-8D6mE033.js");
|
|
723
726
|
const result = await spawnPlanningSession({
|
|
724
727
|
issue: {
|
|
725
728
|
id: issue.id,
|
|
@@ -752,14 +755,14 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
752
755
|
}),
|
|
753
756
|
kill: (agentId) => Effect.tryPromise({
|
|
754
757
|
try: async () => {
|
|
755
|
-
const { stopAgent } = await import("./agents-
|
|
758
|
+
const { stopAgent } = await import("./agents-DyHKlq1I.js");
|
|
756
759
|
await Effect.runPromise(stopAgent(agentId));
|
|
757
760
|
},
|
|
758
761
|
catch: () => void 0
|
|
759
762
|
}).pipe(Effect.ignore),
|
|
760
763
|
message: (agentId, msg) => Effect.tryPromise({
|
|
761
764
|
try: async () => {
|
|
762
|
-
const { messageAgent } = await import("./agents-
|
|
765
|
+
const { messageAgent } = await import("./agents-DyHKlq1I.js");
|
|
763
766
|
await messageAgent(agentId, msg);
|
|
764
767
|
},
|
|
765
768
|
catch: (err) => new AgentStartError({
|
|
@@ -770,8 +773,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
770
773
|
}),
|
|
771
774
|
deepWipe: (issueId, opts) => Effect.tryPromise({
|
|
772
775
|
try: async () => {
|
|
773
|
-
const { deepWipe } = await import("./workflows-
|
|
774
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
776
|
+
const { deepWipe } = await import("./workflows-C4mR0Reb.js");
|
|
777
|
+
const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
|
|
775
778
|
const project = resolveProjectFromIssueSync(issueId);
|
|
776
779
|
const projectPath = project?.projectPath ?? process.cwd();
|
|
777
780
|
await Effect.runPromise(deepWipe({
|
|
@@ -830,8 +833,8 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
|
|
|
830
833
|
const { workspacePath, branch } = getWorkspacePath(issueId);
|
|
831
834
|
const issueLower = issueId.toLowerCase();
|
|
832
835
|
if (existsSync$1(workspacePath)) return workspacePath;
|
|
833
|
-
const { createWorkspace } = await import("./workspace-manager-
|
|
834
|
-
const { loadProjectsConfigSync } = await import("./projects-
|
|
836
|
+
const { createWorkspace } = await import("./workspace-manager-B1WOfKvB.js");
|
|
837
|
+
const { loadProjectsConfigSync } = await import("./projects-BKkwpH6q.js");
|
|
835
838
|
const { projects } = loadProjectsConfigSync();
|
|
836
839
|
const project = resolveProjectFromIssueSync(issueId);
|
|
837
840
|
if (!project) throw new WorkspaceCreateError({
|
|
@@ -866,7 +869,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
|
|
|
866
869
|
const { workspacePath } = getWorkspacePath(issueId);
|
|
867
870
|
const issueLower = issueId.toLowerCase();
|
|
868
871
|
if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
|
|
869
|
-
const { removeWorkspace } = await import("./workspace-manager-
|
|
872
|
+
const { removeWorkspace } = await import("./workspace-manager-B1WOfKvB.js");
|
|
870
873
|
const project = resolveProjectFromIssueSync(issueId);
|
|
871
874
|
if (!project) throw new WorkspaceCreateError({
|
|
872
875
|
id: issueId,
|
|
@@ -897,7 +900,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
|
|
|
897
900
|
try: async () => {
|
|
898
901
|
const { workspacePath } = getWorkspacePath(issueId);
|
|
899
902
|
const issueLower = issueId.toLowerCase();
|
|
900
|
-
const { stopWorkspaceDocker } = await import("./workspace-manager-
|
|
903
|
+
const { stopWorkspaceDocker } = await import("./workspace-manager-B1WOfKvB.js");
|
|
901
904
|
await Effect.runPromise(stopWorkspaceDocker(workspacePath, issueLower));
|
|
902
905
|
},
|
|
903
906
|
catch: () => void 0
|
|
@@ -966,7 +969,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
|
|
|
966
969
|
join(workspacePath, ".devcontainer", "docker-compose.devcontainer.yml")
|
|
967
970
|
];
|
|
968
971
|
if (!composePaths.find((p) => existsSync$1(p))) {
|
|
969
|
-
const { ensureDevcontainerSync } = await import("./ensure-devcontainer-
|
|
972
|
+
const { ensureDevcontainerSync } = await import("./ensure-devcontainer-Cs6W9Yzj.js");
|
|
970
973
|
const ensure = ensureDevcontainerSync({
|
|
971
974
|
workspacePath,
|
|
972
975
|
issueId
|
|
@@ -5451,6 +5454,7 @@ function setupTerminalWebSocket(server) {
|
|
|
5451
5454
|
//#endregion
|
|
5452
5455
|
//#region ../../../node_modules/.bun/@ai-sdk+provider@3.0.10/node_modules/@ai-sdk/provider/dist/index.mjs
|
|
5453
5456
|
init_briefing_freshness();
|
|
5457
|
+
init_agent_runtime_mirror();
|
|
5454
5458
|
init_behavior();
|
|
5455
5459
|
init_discovered_sessions();
|
|
5456
5460
|
init_conversations();
|
|
@@ -5460,6 +5464,7 @@ init_openai_auth();
|
|
|
5460
5464
|
init_claude_permissions();
|
|
5461
5465
|
init_claude_auth();
|
|
5462
5466
|
init_layers();
|
|
5467
|
+
init_harness_binary();
|
|
5463
5468
|
init_codex();
|
|
5464
5469
|
init_launcher_generator();
|
|
5465
5470
|
init_transcript_landing();
|
|
@@ -15944,7 +15949,7 @@ var require_get_vercel_oidc_token = /* @__PURE__ */ __commonJSMin(((exports, mod
|
|
|
15944
15949
|
err = error;
|
|
15945
15950
|
}
|
|
15946
15951
|
try {
|
|
15947
|
-
const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-
|
|
15952
|
+
const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-BArZLN6w.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-BkQLy4yS.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
|
|
15948
15953
|
if (!token || isExpired(getTokenPayload(token), options?.expirationBufferMs)) {
|
|
15949
15954
|
await refreshToken(options);
|
|
15950
15955
|
token = getVercelOidcTokenSync();
|
|
@@ -27778,7 +27783,7 @@ function randomId() {
|
|
|
27778
27783
|
function randomNonce() {
|
|
27779
27784
|
return Math.floor(Math.random() * 2147483647);
|
|
27780
27785
|
}
|
|
27781
|
-
function finiteNumber(value, fallback) {
|
|
27786
|
+
function finiteNumber$1(value, fallback) {
|
|
27782
27787
|
return typeof value === "number" && Number.isFinite(value) ? value : fallback;
|
|
27783
27788
|
}
|
|
27784
27789
|
function normalizeExcalidrawElement(element) {
|
|
@@ -27786,12 +27791,12 @@ function normalizeExcalidrawElement(element) {
|
|
|
27786
27791
|
...element,
|
|
27787
27792
|
id: typeof element.id === "string" && element.id ? element.id : randomId(),
|
|
27788
27793
|
type: typeof element.type === "string" && element.type ? element.type : "rectangle",
|
|
27789
|
-
x: finiteNumber(element.x, 0),
|
|
27790
|
-
y: finiteNumber(element.y, 0),
|
|
27791
|
-
width: Math.max(1, finiteNumber(element.width, 100)),
|
|
27792
|
-
height: Math.max(1, finiteNumber(element.height, 100)),
|
|
27793
|
-
version: Math.max(1, Math.trunc(finiteNumber(element.version, 1))),
|
|
27794
|
-
versionNonce: Math.trunc(finiteNumber(element.versionNonce, randomNonce())),
|
|
27794
|
+
x: finiteNumber$1(element.x, 0),
|
|
27795
|
+
y: finiteNumber$1(element.y, 0),
|
|
27796
|
+
width: Math.max(1, finiteNumber$1(element.width, 100)),
|
|
27797
|
+
height: Math.max(1, finiteNumber$1(element.height, 100)),
|
|
27798
|
+
version: Math.max(1, Math.trunc(finiteNumber$1(element.version, 1))),
|
|
27799
|
+
versionNonce: Math.trunc(finiteNumber$1(element.versionNonce, randomNonce())),
|
|
27795
27800
|
isDeleted: element.isDeleted === true
|
|
27796
27801
|
};
|
|
27797
27802
|
if (Math.abs(normalized.x) > VISIBLE_CANVAS_LIMIT || Math.abs(normalized.y) > VISIBLE_CANVAS_LIMIT) console.warn(`Excalidraw element ${normalized.id} has coordinates outside visible canvas range`);
|
|
@@ -28261,7 +28266,7 @@ var GoogleCloudTranscription = class {
|
|
|
28261
28266
|
}
|
|
28262
28267
|
async start(apiKey, model) {
|
|
28263
28268
|
try {
|
|
28264
|
-
const { SpeechClient } = await import("./src-
|
|
28269
|
+
const { SpeechClient } = await import("./src-BMMoA_ba.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
|
|
28265
28270
|
if (this.closed) return;
|
|
28266
28271
|
const stream = new SpeechClient({ apiKey }).streamingRecognize({
|
|
28267
28272
|
config: {
|
|
@@ -30040,6 +30045,7 @@ const websocketRpcRouteLayer = Layer.unwrap(Effect.gen(function* () {
|
|
|
30040
30045
|
}));
|
|
30041
30046
|
//#endregion
|
|
30042
30047
|
//#region ../../lib/vbrief/quality-lint.ts
|
|
30048
|
+
init_internal_token();
|
|
30043
30049
|
init_state_home();
|
|
30044
30050
|
init_pan_dir();
|
|
30045
30051
|
init_in_flight_guard();
|
|
@@ -30416,13 +30422,12 @@ init_concurrency$1();
|
|
|
30416
30422
|
init_github_app();
|
|
30417
30423
|
init_resource_utils();
|
|
30418
30424
|
init_pipeline_membership_gather();
|
|
30425
|
+
init_pipeline_membership();
|
|
30419
30426
|
init_review_status();
|
|
30420
30427
|
//#endregion
|
|
30421
30428
|
//#region services/pipeline-membership.ts
|
|
30422
|
-
init_internal_token();
|
|
30423
30429
|
init_pipeline_notifier();
|
|
30424
30430
|
init_review_status_sync();
|
|
30425
|
-
init_pipeline_membership();
|
|
30426
30431
|
const PIPELINE_MEMBERSHIP_TTL_MS = 3e4;
|
|
30427
30432
|
function createPipelineMembershipService(deps = {
|
|
30428
30433
|
gather: gatherProjectLensSignals,
|
|
@@ -30520,8 +30525,10 @@ function unavailablePipelineMembership() {
|
|
|
30520
30525
|
}
|
|
30521
30526
|
//#endregion
|
|
30522
30527
|
//#region services/resource-discovery.ts
|
|
30528
|
+
init_src();
|
|
30523
30529
|
init_conversations();
|
|
30524
30530
|
init_projects();
|
|
30531
|
+
init_pipeline_membership();
|
|
30525
30532
|
init_pipeline_membership_gather();
|
|
30526
30533
|
init_tmux();
|
|
30527
30534
|
const execFileAsync$18 = promisify(execFile);
|
|
@@ -30639,7 +30646,7 @@ function isDiscoverableAgentSession(sessionName) {
|
|
|
30639
30646
|
async function loadTrackerIssues() {
|
|
30640
30647
|
const map = /* @__PURE__ */ new Map();
|
|
30641
30648
|
try {
|
|
30642
|
-
const { getSharedIssueService } = await import("./issue-service-singleton-
|
|
30649
|
+
const { getSharedIssueService } = await import("./issue-service-singleton-DBZabEl7.js");
|
|
30643
30650
|
const issues = (await getSharedIssueService()).getIssues();
|
|
30644
30651
|
for (const issue of issues) if (issue.identifier) map.set(issue.identifier.toUpperCase(), issue);
|
|
30645
30652
|
} catch {
|
|
@@ -30910,7 +30917,7 @@ async function computeResourceAllocatedIssues() {
|
|
|
30910
30917
|
});
|
|
30911
30918
|
}
|
|
30912
30919
|
try {
|
|
30913
|
-
const { listActiveRemoteAgentStates } = await import("./remote-agents-
|
|
30920
|
+
const { listActiveRemoteAgentStates } = await import("./remote-agents-D6O_zETW.js");
|
|
30914
30921
|
for (const remoteState of listActiveRemoteAgentStates()) {
|
|
30915
30922
|
const issue = ensureIssue(remoteState.issueId);
|
|
30916
30923
|
if (!issue) continue;
|
|
@@ -31030,9 +31037,10 @@ async function computeResourceAllocatedIssues() {
|
|
|
31030
31037
|
resourceDetails: issue.resourceDetails,
|
|
31031
31038
|
taskTotals: issue.taskTotals,
|
|
31032
31039
|
pipelineBucket: membership.bucket,
|
|
31040
|
+
specOnlyPlanned: membership.bucket === "planned_backlog" && membership.reasons.includes("open issue with a vBRIEF spec but no branch/PR — planned work whose plan encodes code paths that age; needs starting or re-planning"),
|
|
31033
31041
|
resourceDrift: !membership.inPipeline
|
|
31034
31042
|
};
|
|
31035
|
-
}).sort((a, b) => a.issueId
|
|
31043
|
+
}).sort((a, b) => compareIssueIds(a.issueId, b.issueId));
|
|
31036
31044
|
}
|
|
31037
31045
|
function toPublicResourceIssue(issue) {
|
|
31038
31046
|
return {
|
|
@@ -31122,7 +31130,7 @@ function groupResourceAllocatedIssuesByProject(issues) {
|
|
|
31122
31130
|
}
|
|
31123
31131
|
return [...projectTree.values()].map((project) => ({
|
|
31124
31132
|
...project,
|
|
31125
|
-
features: project.features.sort((a, b) => a.issueId
|
|
31133
|
+
features: project.features.sort((a, b) => compareIssueIds(a.issueId, b.issueId))
|
|
31126
31134
|
})).sort((a, b) => a.name.localeCompare(b.name));
|
|
31127
31135
|
}
|
|
31128
31136
|
//#endregion
|
|
@@ -31584,25 +31592,32 @@ function getInternalDashboardOrigin() {
|
|
|
31584
31592
|
}
|
|
31585
31593
|
function classifyAutoSpawnSkip(status, body) {
|
|
31586
31594
|
const error = typeof body["error"] === "string" ? body["error"] : "";
|
|
31595
|
+
if (status === 401 || status === 403) return "unauthorized";
|
|
31587
31596
|
if (body["stackHealth"] || /workspace docker stack/i.test(error)) return "stack-unhealthy";
|
|
31588
31597
|
if (body["paused"] === true) return "paused";
|
|
31589
31598
|
if (body["troubled"] === true) return "troubled";
|
|
31590
31599
|
if (body["guardrails"] || body["requiresAcknowledgement"] === true || status === 409) return "guardrails";
|
|
31591
31600
|
return "spawn-failed";
|
|
31592
31601
|
}
|
|
31602
|
+
function resolveCompletePlanningTerminalStatus(autoSpawnRequested, autoSpawnResult) {
|
|
31603
|
+
return autoSpawnRequested && autoSpawnResult?.workAgentSpawned !== true ? "failure" : "success";
|
|
31604
|
+
}
|
|
31593
31605
|
async function completePlanningAutoSpawn(options) {
|
|
31594
31606
|
if (options.autoSpawn !== true) {
|
|
31595
31607
|
emitCompletePlanningPhase(options.issueId, "autoSpawn", "skipped", "autoSpawn not requested");
|
|
31596
31608
|
return null;
|
|
31597
31609
|
}
|
|
31598
31610
|
const dashboardOrigin = options.dashboardOrigin ?? getInternalDashboardOrigin();
|
|
31611
|
+
const internalToken = getInternalTokenSync();
|
|
31612
|
+
const internalTokenHeaders = internalToken ? { [INTERNAL_TOKEN_HEADER]: internalToken } : {};
|
|
31599
31613
|
emitCompletePlanningPhase(options.issueId, "autoSpawn", "start", "posting work-agent spawn request", { dashboardOrigin });
|
|
31600
31614
|
try {
|
|
31601
31615
|
const response = await (options.fetchImpl ?? fetch)(new URL("/api/agents", dashboardOrigin), {
|
|
31602
31616
|
method: "POST",
|
|
31603
31617
|
headers: {
|
|
31604
31618
|
"content-type": "application/json",
|
|
31605
|
-
origin: dashboardOrigin
|
|
31619
|
+
origin: dashboardOrigin,
|
|
31620
|
+
...internalTokenHeaders
|
|
31606
31621
|
},
|
|
31607
31622
|
body: JSON.stringify({
|
|
31608
31623
|
issueId: options.issueId,
|
|
@@ -31623,7 +31638,10 @@ async function completePlanningAutoSpawn(options) {
|
|
|
31623
31638
|
if (skipReason === "stack-unhealthy") {
|
|
31624
31639
|
const recovery = await (options.fetchImpl ?? fetch)(new URL(`/api/workspaces/${encodeURIComponent(options.issueId)}/rebuild-and-start`, dashboardOrigin), {
|
|
31625
31640
|
method: "POST",
|
|
31626
|
-
headers: {
|
|
31641
|
+
headers: {
|
|
31642
|
+
origin: dashboardOrigin,
|
|
31643
|
+
...internalTokenHeaders
|
|
31644
|
+
}
|
|
31627
31645
|
});
|
|
31628
31646
|
const recoveryBody = await recovery.json().catch(() => ({}));
|
|
31629
31647
|
if (recovery.ok && recoveryBody["success"] !== false) {
|
|
@@ -31969,7 +31987,7 @@ async function completePlanningForIssue(options) {
|
|
|
31969
31987
|
skipKill,
|
|
31970
31988
|
sessionName
|
|
31971
31989
|
});
|
|
31972
|
-
emitCompletePlanningPhase(id, "terminal",
|
|
31990
|
+
emitCompletePlanningPhase(id, "terminal", resolveCompletePlanningTerminalStatus(effectiveAutoSpawn, autoSpawnResult), autoSpawnResult?.workAgentSpawned ? "planning complete and work agent spawn requested" : autoSpawnResult?.workAgentSkipReason ?? "planning complete", {
|
|
31973
31991
|
autoSpawn: effectiveAutoSpawn,
|
|
31974
31992
|
workAgentSpawned: autoSpawnResult?.workAgentSpawned ?? false,
|
|
31975
31993
|
workAgentSkipReason: autoSpawnResult?.workAgentSkipReason
|
|
@@ -32134,7 +32152,7 @@ async function closeIssuePullRequest(issueId, reason = "Canceled via Overdeck")
|
|
|
32134
32152
|
timeout: 15e3
|
|
32135
32153
|
});
|
|
32136
32154
|
try {
|
|
32137
|
-
const { setReviewStatusSync } = await import("./review-status-
|
|
32155
|
+
const { setReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
|
|
32138
32156
|
setReviewStatusSync(issueId.toUpperCase(), { prUrl: void 0 });
|
|
32139
32157
|
} catch {}
|
|
32140
32158
|
return [`Closed PR #${prNumber} on ${githubCheck.owner}/${githubCheck.repo}`];
|
|
@@ -32188,7 +32206,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
|
|
|
32188
32206
|
const { ctx, projectConfig } = buildLifecycleContext(id, getIssueDataService$8().getIssueSource(id) ?? void 0);
|
|
32189
32207
|
const deleteWorkspace = opts.deleteWorkspace ?? true;
|
|
32190
32208
|
cleanupLog.push(...await closeIssuePullRequest(id, mode === "cancel" ? "Canceled via Overdeck" : "Reset to Todo via Overdeck"));
|
|
32191
|
-
const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-
|
|
32209
|
+
const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-CtPDcZ9u.js");
|
|
32192
32210
|
const workflow = mode === "cancel" ? cancelIssueWorkflow : resetToTodo;
|
|
32193
32211
|
const result = await Effect.runPromise(workflow(ctx, {
|
|
32194
32212
|
deleteWorkspace,
|
|
@@ -32203,7 +32221,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
|
|
|
32203
32221
|
}));
|
|
32204
32222
|
cleanupLog.push(...result.steps.flatMap((step) => step.details || [step.error].filter(Boolean)));
|
|
32205
32223
|
if (mode === "cancel") try {
|
|
32206
|
-
const { transitionVBriefOnMain } = await import("./lifecycle-io-
|
|
32224
|
+
const { transitionVBriefOnMain } = await import("./lifecycle-io-DmY2qwCn.js");
|
|
32207
32225
|
const tx = await Effect.runPromise(transitionVBriefOnMain(ctx.projectPath, id, "cancelled", "cancelled", `scope: cancel ${id.toUpperCase()} vBRIEF`));
|
|
32208
32226
|
if (tx.moved) cleanupLog.push(`vBRIEF moved ${tx.fromDir} → cancelled`);
|
|
32209
32227
|
if (tx.committed) cleanupLog.push(`Committed vBRIEF cancellation on main`);
|
|
@@ -32211,8 +32229,8 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
|
|
|
32211
32229
|
cleanupLog.push(`vBRIEF cancel transition failed (non-fatal): ${err?.message ?? err}`);
|
|
32212
32230
|
}
|
|
32213
32231
|
try {
|
|
32214
|
-
const { killAllReviewerSessions } = await import("./review-agent-
|
|
32215
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
32232
|
+
const { killAllReviewerSessions } = await import("./review-agent-CCum8sGe.js");
|
|
32233
|
+
const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
|
|
32216
32234
|
const projectKey = resolveProjectFromIssueSync(id)?.projectKey;
|
|
32217
32235
|
if (projectKey) {
|
|
32218
32236
|
const { killed } = await Effect.runPromise(killAllReviewerSessions(projectKey, id.toUpperCase()));
|
|
@@ -32226,7 +32244,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
|
|
|
32226
32244
|
cleanupLog.push("Cleared review status");
|
|
32227
32245
|
} catch {}
|
|
32228
32246
|
try {
|
|
32229
|
-
const { resetPostMergeState } = await import("./merge-agent-
|
|
32247
|
+
const { resetPostMergeState } = await import("./merge-agent-B-SnXOoc.js");
|
|
32230
32248
|
resetPostMergeState(id);
|
|
32231
32249
|
resetPostMergeState(id.toUpperCase());
|
|
32232
32250
|
cleanupLog.push("Cleared merge state");
|
|
@@ -32246,7 +32264,7 @@ function closeIssueTransition(options) {
|
|
|
32246
32264
|
const { issueId, body, eventStore } = options;
|
|
32247
32265
|
const { reason } = body;
|
|
32248
32266
|
const projectPath = getProjectPath$3(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]);
|
|
32249
|
-
const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-
|
|
32267
|
+
const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-CtPDcZ9u.js"));
|
|
32250
32268
|
const githubCheck = isGitHubIssue$4(issueId);
|
|
32251
32269
|
const issueDataService = getIssueDataService$8();
|
|
32252
32270
|
const issueSource = issueDataService.getIssueSource(issueId);
|
|
@@ -32513,7 +32531,7 @@ function reopenIssueTransition(options) {
|
|
|
32513
32531
|
else clearReviewStatus(id.toUpperCase());
|
|
32514
32532
|
} catch {}
|
|
32515
32533
|
try {
|
|
32516
|
-
const { resetPostMergeState } = await import("./merge-agent-
|
|
32534
|
+
const { resetPostMergeState } = await import("./merge-agent-B-SnXOoc.js");
|
|
32517
32535
|
resetPostMergeState(id);
|
|
32518
32536
|
resetPostMergeState(id.toUpperCase());
|
|
32519
32537
|
} catch {}
|
|
@@ -32577,7 +32595,7 @@ function moveIssueStatus(options) {
|
|
|
32577
32595
|
"done"
|
|
32578
32596
|
];
|
|
32579
32597
|
if (!targetStatus || !validStatuses.includes(targetStatus)) return jsonResponse({ error: `Invalid targetStatus. Must be one of: ${validStatuses.join(", ")}` }, { status: 400 });
|
|
32580
|
-
const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-
|
|
32598
|
+
const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-CbvsN3qG.js"));
|
|
32581
32599
|
const issueState = {
|
|
32582
32600
|
backlog: "open",
|
|
32583
32601
|
todo: "open",
|
|
@@ -32804,7 +32822,7 @@ async function copySettingsToWorkspace(id) {
|
|
|
32804
32822
|
success: false,
|
|
32805
32823
|
error: "Workspace not found"
|
|
32806
32824
|
}, { status: 404 });
|
|
32807
|
-
const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-
|
|
32825
|
+
const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-B1WOfKvB.js");
|
|
32808
32826
|
const result = copyOverdeckSettingsToWorkspaceSync(workspacePath);
|
|
32809
32827
|
return jsonResponse({
|
|
32810
32828
|
success: result.errors.length === 0 || result.copied.length > 0,
|
|
@@ -33267,7 +33285,7 @@ function restartFromPlan(options) {
|
|
|
33267
33285
|
});
|
|
33268
33286
|
const resetResult = yield* Effect.promise(async () => {
|
|
33269
33287
|
try {
|
|
33270
|
-
const { runGitResetHard } = await import("./dangerous-git-ops-
|
|
33288
|
+
const { runGitResetHard } = await import("./dangerous-git-ops-D6AF-Hg_.js");
|
|
33271
33289
|
async function findPlanningCommit(grep, label) {
|
|
33272
33290
|
try {
|
|
33273
33291
|
const { stdout } = await execAsync$6(`git log --grep="${grep.replace(/"/g, "\\\"")}" --format=%H -1`, {
|
|
@@ -33720,7 +33738,7 @@ function closeOutIssue(id, opts = {}) {
|
|
|
33720
33738
|
}
|
|
33721
33739
|
const closeOutResult = yield* Effect.promise(async () => {
|
|
33722
33740
|
try {
|
|
33723
|
-
const { closeOut } = await import("./lifecycle-
|
|
33741
|
+
const { closeOut } = await import("./lifecycle-CtPDcZ9u.js");
|
|
33724
33742
|
return {
|
|
33725
33743
|
ok: true,
|
|
33726
33744
|
result: await Effect.runPromise(closeOut(ctx, {
|
|
@@ -33809,7 +33827,7 @@ function bulkCloseOut(body) {
|
|
|
33809
33827
|
const invalidIds = issueIds.filter((id) => !isValidIssueId(id));
|
|
33810
33828
|
if (invalidIds.length > 0) return jsonResponse({ error: `Invalid issue ID format: ${invalidIds.join(", ")}` }, { status: 400 });
|
|
33811
33829
|
const eventStore = yield* EventStoreService;
|
|
33812
|
-
const { closeOut } = yield* Effect.promise(() => import("./lifecycle-
|
|
33830
|
+
const { closeOut } = yield* Effect.promise(() => import("./lifecycle-CtPDcZ9u.js"));
|
|
33813
33831
|
const issueDataService = getIssueDataService$5();
|
|
33814
33832
|
const tasks = [];
|
|
33815
33833
|
const agentChecks = yield* withConcurrencyLimit(issueIds.map((id) => Effect.promise(async () => {
|
|
@@ -34035,8 +34053,8 @@ const getIssueShipLogRoute = HttpRouter.add("GET", "/api/issues/:id/ship-log", h
|
|
|
34035
34053
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
34036
34054
|
if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
34037
34055
|
return yield* Effect.promise(async () => {
|
|
34038
|
-
const { getShipLog } = await import("./ship-log-
|
|
34039
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
34056
|
+
const { getShipLog } = await import("./ship-log-__QtAFXG.js");
|
|
34057
|
+
const { getReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
|
|
34040
34058
|
const log = getShipLog(id);
|
|
34041
34059
|
const rs = getReviewStatusSync(id);
|
|
34042
34060
|
return jsonResponse({
|
|
@@ -34051,8 +34069,8 @@ const getIssueVerificationRoute = HttpRouter.add("GET", "/api/issues/:id/verific
|
|
|
34051
34069
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
34052
34070
|
if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
34053
34071
|
return yield* Effect.promise(async () => {
|
|
34054
|
-
const { readVerificationArtifact } = await import("./verification-artifact-
|
|
34055
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
34072
|
+
const { readVerificationArtifact } = await import("./verification-artifact-Ck1tefmz.js");
|
|
34073
|
+
const { getReviewStatusSync } = await import("./review-status-Bnh-rdkY.js");
|
|
34056
34074
|
const { join } = await import("node:path");
|
|
34057
34075
|
const resolved = resolveProjectFromIssueSync(id);
|
|
34058
34076
|
const workspacePath = resolved ? join(resolved.projectPath, "workspaces", `feature-${id.toLowerCase()}`) : null;
|
|
@@ -35165,7 +35183,7 @@ function buildProcessTotalsByRoot(roots, processes) {
|
|
|
35165
35183
|
}
|
|
35166
35184
|
totals.set(root.rootPid, {
|
|
35167
35185
|
processCount: seen.size,
|
|
35168
|
-
cpuPercent: roundOneDecimal$
|
|
35186
|
+
cpuPercent: roundOneDecimal$2(cpuPercent),
|
|
35169
35187
|
memoryBytes
|
|
35170
35188
|
});
|
|
35171
35189
|
}
|
|
@@ -35199,7 +35217,7 @@ function getIdleMinutes(lastActivity, nowMs) {
|
|
|
35199
35217
|
if (!Number.isFinite(lastActivityMs)) return 0;
|
|
35200
35218
|
return Math.max(0, Math.floor((nowMs - lastActivityMs) / 6e4));
|
|
35201
35219
|
}
|
|
35202
|
-
function roundOneDecimal$
|
|
35220
|
+
function roundOneDecimal$2(value) {
|
|
35203
35221
|
return Math.round(value * 10) / 10;
|
|
35204
35222
|
}
|
|
35205
35223
|
function roundCurrency(value) {
|
|
@@ -35357,7 +35375,7 @@ function aggregateSupportFleet(processes) {
|
|
|
35357
35375
|
const supportProcesses = processes.filter(isSupportFleetProcess);
|
|
35358
35376
|
const members = supportProcesses.map((process) => process.command);
|
|
35359
35377
|
return {
|
|
35360
|
-
cpuPercent: roundOneDecimal$
|
|
35378
|
+
cpuPercent: roundOneDecimal$1(supportProcesses.reduce((sum, process) => sum + process.cpuPercent, 0)),
|
|
35361
35379
|
memoryBytes: supportProcesses.reduce((sum, process) => sum + process.memoryBytes, 0),
|
|
35362
35380
|
memberCount: supportProcesses.length,
|
|
35363
35381
|
members
|
|
@@ -35384,7 +35402,7 @@ function formatDuration(totalSeconds) {
|
|
|
35384
35402
|
if (minutes > 0) return `${minutes}m ${seconds}s`;
|
|
35385
35403
|
return `${seconds}s`;
|
|
35386
35404
|
}
|
|
35387
|
-
function roundOneDecimal$
|
|
35405
|
+
function roundOneDecimal$1(value) {
|
|
35388
35406
|
return Math.round(value * 10) / 10;
|
|
35389
35407
|
}
|
|
35390
35408
|
//#endregion
|
|
@@ -35410,7 +35428,7 @@ function buildCapacityForecast(stacks, options) {
|
|
|
35410
35428
|
}),
|
|
35411
35429
|
headroom: {
|
|
35412
35430
|
freeRamBytes: options.hostVitals.mem.availableBytes,
|
|
35413
|
-
loadHeadroom: Math.max(0, 100 - options.hostVitals.cpu.percent)
|
|
35431
|
+
loadHeadroom: options.hostVitals.cpu.percent === null ? null : Math.max(0, 100 - options.hostVitals.cpu.percent)
|
|
35414
35432
|
}
|
|
35415
35433
|
};
|
|
35416
35434
|
}
|
|
@@ -35481,8 +35499,8 @@ function buildHostProcesses(processes, options = {}) {
|
|
|
35481
35499
|
const row = {
|
|
35482
35500
|
...group,
|
|
35483
35501
|
pids: group.pids.sort((a, b) => a - b),
|
|
35484
|
-
cpuPercent: roundOneDecimal
|
|
35485
|
-
peakCpuPercent: roundOneDecimal
|
|
35502
|
+
cpuPercent: roundOneDecimal(group.cpuPercent),
|
|
35503
|
+
peakCpuPercent: roundOneDecimal(peakCpuPercent),
|
|
35486
35504
|
peakMemoryBytes
|
|
35487
35505
|
};
|
|
35488
35506
|
if (peakCpuPercent >= burstCpuThreshold) retainedBursts.set(group.id, {
|
|
@@ -35557,7 +35575,7 @@ function selectTopRows(rows, limit) {
|
|
|
35557
35575
|
for (const row of [...topByCpu, ...topByMemory]) merged.set(row.id, row);
|
|
35558
35576
|
return [...merged.values()].sort((a, b) => b.cpuPercent - a.cpuPercent || b.peakCpuPercent - a.peakCpuPercent).slice(0, limit);
|
|
35559
35577
|
}
|
|
35560
|
-
function roundOneDecimal
|
|
35578
|
+
function roundOneDecimal(value) {
|
|
35561
35579
|
return Math.round(value * 10) / 10;
|
|
35562
35580
|
}
|
|
35563
35581
|
//#endregion
|
|
@@ -35575,12 +35593,20 @@ let cachedDockerCounts = {
|
|
|
35575
35593
|
}
|
|
35576
35594
|
};
|
|
35577
35595
|
function buildHostVitalsSnapshot(options = {}) {
|
|
35578
|
-
const
|
|
35579
|
-
|
|
35580
|
-
|
|
35596
|
+
const metrics = options.hostMetrics;
|
|
35597
|
+
const cpuPercent = metrics?.cpuPercent ?? null;
|
|
35598
|
+
if (cpuPercent !== null) {
|
|
35599
|
+
cpuSpark.push(cpuPercent);
|
|
35600
|
+
cpuSpark = cpuSpark.slice(-CPU_SPARK_MAX);
|
|
35601
|
+
}
|
|
35581
35602
|
const dockerCounts = options.dockerStale ? cachedDockerCounts : computeDockerCounts(options.containers ?? [], options.networkCount ?? 0, options.networkPoolTotal ?? 31);
|
|
35582
35603
|
if (!options.dockerStale) cachedDockerCounts = dockerCounts;
|
|
35583
|
-
const memory =
|
|
35604
|
+
const memory = {
|
|
35605
|
+
usedBytes: metrics?.usedMemoryBytes ?? null,
|
|
35606
|
+
availableBytes: metrics?.availableMemoryBytes ?? null,
|
|
35607
|
+
swapUsedBytes: metrics?.swapUsedBytes ?? null,
|
|
35608
|
+
swapTotalBytes: metrics?.swapTotalBytes ?? null
|
|
35609
|
+
};
|
|
35584
35610
|
const disk = options.disk ?? {
|
|
35585
35611
|
usedBytes: 0,
|
|
35586
35612
|
freeBytes: 0,
|
|
@@ -35591,7 +35617,11 @@ function buildHostVitalsSnapshot(options = {}) {
|
|
|
35591
35617
|
stale: options.dockerStale === true,
|
|
35592
35618
|
cpu: {
|
|
35593
35619
|
percent: cpuPercent,
|
|
35594
|
-
load:
|
|
35620
|
+
load: [
|
|
35621
|
+
metrics?.loadAverage1m ?? null,
|
|
35622
|
+
null,
|
|
35623
|
+
null
|
|
35624
|
+
],
|
|
35595
35625
|
spark: [...cpuSpark]
|
|
35596
35626
|
},
|
|
35597
35627
|
mem: memory,
|
|
@@ -35637,26 +35667,6 @@ function computeAgentCounts(agents, fleet, nowMs) {
|
|
|
35637
35667
|
totalUsd: fleet.totalUsd ?? 0
|
|
35638
35668
|
};
|
|
35639
35669
|
}
|
|
35640
|
-
function getDefaultMemoryVitals() {
|
|
35641
|
-
const total = totalmem$1();
|
|
35642
|
-
const available = freemem$1();
|
|
35643
|
-
return {
|
|
35644
|
-
usedBytes: Math.max(0, total - available),
|
|
35645
|
-
availableBytes: available,
|
|
35646
|
-
swapUsedBytes: 0,
|
|
35647
|
-
swapTotalBytes: 0
|
|
35648
|
-
};
|
|
35649
|
-
}
|
|
35650
|
-
function normalizeLoad(load) {
|
|
35651
|
-
return [
|
|
35652
|
-
roundOneDecimal(load[0] ?? 0),
|
|
35653
|
-
roundOneDecimal(load[1] ?? 0),
|
|
35654
|
-
roundOneDecimal(load[2] ?? 0)
|
|
35655
|
-
];
|
|
35656
|
-
}
|
|
35657
|
-
function roundOneDecimal(value) {
|
|
35658
|
-
return Math.round(value * 10) / 10;
|
|
35659
|
-
}
|
|
35660
35670
|
//#endregion
|
|
35661
35671
|
//#region routes/resources/limits.ts
|
|
35662
35672
|
const OOM_WINDOW_MS = 1440 * 60 * 1e3;
|
|
@@ -35767,32 +35777,97 @@ function isClosedReviewStatus(issueId) {
|
|
|
35767
35777
|
}
|
|
35768
35778
|
//#endregion
|
|
35769
35779
|
//#region routes/resources/spawn-gate.ts
|
|
35770
|
-
let
|
|
35771
|
-
function mapSpawnGateDecision(decision) {
|
|
35772
|
-
|
|
35780
|
+
let readSystemHealthEvidenceSnapshot = () => getSystemHealthEvidenceSnapshot();
|
|
35781
|
+
function mapSpawnGateDecision(decision, accepted) {
|
|
35782
|
+
if (decision.health.freshness.status !== "fresh") {
|
|
35783
|
+
const reason = decision.health.freshness.status === "stale" ? {
|
|
35784
|
+
code: "admission.snapshot.stale",
|
|
35785
|
+
domain: "admission",
|
|
35786
|
+
severity: "critical",
|
|
35787
|
+
message: decision.error ?? `Spawn gate health is stale: ${decision.health.freshness.reason.message}`
|
|
35788
|
+
} : {
|
|
35789
|
+
code: "admission.snapshot.measuring",
|
|
35790
|
+
domain: "admission",
|
|
35791
|
+
severity: "info",
|
|
35792
|
+
message: decision.error ?? "Spawn gate health is still measuring."
|
|
35793
|
+
};
|
|
35794
|
+
return unavailableSpawnGate(accepted ?? null, reason, decision.warnings);
|
|
35795
|
+
}
|
|
35796
|
+
const admission = accepted?.admission;
|
|
35797
|
+
const state = admission ? strongestAdmissionState(admission.state, decision.blocked ? "blocked" : decision.requiresAcknowledgement ? "soft" : "open") : decision.blocked ? "blocked" : decision.requiresAcknowledgement ? "soft" : "open";
|
|
35798
|
+
const reasons = mergeAdmissionReasons(admission?.reasons ?? [], decision.warnings.map((warning) => ({
|
|
35799
|
+
code: warning.code,
|
|
35800
|
+
domain: "admission",
|
|
35801
|
+
severity: warning.severity,
|
|
35802
|
+
message: warning.message
|
|
35803
|
+
})));
|
|
35773
35804
|
return {
|
|
35774
|
-
state
|
|
35775
|
-
reason,
|
|
35805
|
+
state,
|
|
35806
|
+
reason: decision.error ?? decision.warnings[0]?.message ?? reasons[0]?.message ?? "",
|
|
35807
|
+
reasons,
|
|
35808
|
+
admittedWorkAgentCount: admission?.admittedWorkAgentCount ?? decision.health.summary.workAgentCount,
|
|
35776
35809
|
warnings: decision.warnings,
|
|
35777
|
-
pressure: spawnGatePressure(
|
|
35810
|
+
pressure: spawnGatePressure(state)
|
|
35778
35811
|
};
|
|
35779
35812
|
}
|
|
35780
|
-
function
|
|
35813
|
+
function getResourcesHealthEvidenceEffect() {
|
|
35781
35814
|
return Effect.tryPromise({
|
|
35782
|
-
try: () =>
|
|
35815
|
+
try: () => readSystemHealthEvidenceSnapshot(),
|
|
35783
35816
|
catch: (error) => error
|
|
35784
|
-
}).pipe(Effect.map((
|
|
35785
|
-
|
|
35786
|
-
|
|
35787
|
-
|
|
35817
|
+
}).pipe(Effect.map(({ accepted, compatibility }) => ({
|
|
35818
|
+
accepted,
|
|
35819
|
+
decision: evaluateSpawnGuardrails(compatibility)
|
|
35820
|
+
})), Effect.catch(() => Effect.succeed({
|
|
35821
|
+
accepted: null,
|
|
35822
|
+
decision: null
|
|
35823
|
+
})));
|
|
35824
|
+
}
|
|
35825
|
+
function getSpawnGatePayloadEffect(evidence) {
|
|
35826
|
+
return (evidence ? Effect.succeed(evidence) : getResourcesHealthEvidenceEffect()).pipe(Effect.map(({ accepted, decision }) => {
|
|
35827
|
+
if (!accepted || !decision) return unavailableSpawnGate(accepted);
|
|
35828
|
+
return mapSpawnGateDecision(decision, accepted);
|
|
35829
|
+
}));
|
|
35830
|
+
}
|
|
35831
|
+
function unavailableSpawnGate(accepted, unavailableReason, warnings = []) {
|
|
35832
|
+
const reasons = unavailableReason ? [unavailableReason] : accepted?.admission.reasons.length ? [...accepted.admission.reasons] : [{
|
|
35833
|
+
code: "admission.snapshot.unavailable",
|
|
35834
|
+
domain: "admission",
|
|
35835
|
+
severity: "critical",
|
|
35836
|
+
message: "Spawn gate health is unavailable."
|
|
35837
|
+
}];
|
|
35838
|
+
return {
|
|
35839
|
+
state: "unavailable",
|
|
35840
|
+
reason: reasons[0]?.message ?? "Spawn gate health is unavailable.",
|
|
35841
|
+
reasons,
|
|
35842
|
+
admittedWorkAgentCount: accepted?.admission.admittedWorkAgentCount ?? null,
|
|
35843
|
+
warnings,
|
|
35788
35844
|
pressure: 0,
|
|
35789
35845
|
stale: true
|
|
35790
|
-
}
|
|
35846
|
+
};
|
|
35847
|
+
}
|
|
35848
|
+
function mergeAdmissionReasons(...reasonGroups) {
|
|
35849
|
+
const seen = /* @__PURE__ */ new Set();
|
|
35850
|
+
return reasonGroups.flatMap((reasons) => reasons).filter((reason) => {
|
|
35851
|
+
const key = `${reason.code}::${reason.message}`;
|
|
35852
|
+
if (seen.has(key)) return false;
|
|
35853
|
+
seen.add(key);
|
|
35854
|
+
return true;
|
|
35855
|
+
});
|
|
35856
|
+
}
|
|
35857
|
+
function strongestAdmissionState(accepted, enforced) {
|
|
35858
|
+
if (accepted === "unavailable") return accepted;
|
|
35859
|
+
const rank = {
|
|
35860
|
+
open: 0,
|
|
35861
|
+
soft: 1,
|
|
35862
|
+
blocked: 2
|
|
35863
|
+
};
|
|
35864
|
+
return rank[accepted] >= rank[enforced] ? accepted : enforced;
|
|
35791
35865
|
}
|
|
35792
|
-
function spawnGatePressure(
|
|
35793
|
-
if (
|
|
35794
|
-
if (
|
|
35795
|
-
return 12;
|
|
35866
|
+
function spawnGatePressure(state) {
|
|
35867
|
+
if (state === "blocked") return 100;
|
|
35868
|
+
if (state === "soft") return 67;
|
|
35869
|
+
if (state === "open") return 12;
|
|
35870
|
+
return 0;
|
|
35796
35871
|
}
|
|
35797
35872
|
//#endregion
|
|
35798
35873
|
//#region routes/resources/snapshot.ts
|
|
@@ -35803,7 +35878,8 @@ function getResourcesEffect() {
|
|
|
35803
35878
|
return Effect.gen(function* () {
|
|
35804
35879
|
const containers = enrichContainersWithLimits(getCurrentDockerStats());
|
|
35805
35880
|
const agentStats = yield* getAgentStatsSnapshotEffect();
|
|
35806
|
-
const
|
|
35881
|
+
const healthEvidence = yield* getResourcesHealthEvidenceEffect();
|
|
35882
|
+
const spawnGate = yield* getSpawnGatePayloadEffect(healthEvidence);
|
|
35807
35883
|
const stoppedContainers = [];
|
|
35808
35884
|
const sessions = yield* listSessions().pipe(Effect.catch(() => Effect.succeed([])));
|
|
35809
35885
|
const tmuxSessionNames = new Set(sessions.map((s) => s.name));
|
|
@@ -35813,6 +35889,7 @@ function getResourcesEffect() {
|
|
|
35813
35889
|
}));
|
|
35814
35890
|
const agentStatsById = new Map(agentStats.agents.map((agent) => [agent.id, agent]));
|
|
35815
35891
|
const baseHostVitals = buildHostVitalsSnapshot({
|
|
35892
|
+
hostMetrics: healthEvidence.accepted?.host.metrics,
|
|
35816
35893
|
containers,
|
|
35817
35894
|
agents: agents.map((agent) => ({
|
|
35818
35895
|
id: String(agent.id),
|
|
@@ -38574,7 +38651,7 @@ Be specific: reference actual file names, function names, requirement text, disc
|
|
|
38574
38651
|
const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
|
|
38575
38652
|
const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
|
|
38576
38653
|
const promptFile = join(planningDir, ".status-review-prompt.tmp");
|
|
38577
|
-
const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-
|
|
38654
|
+
const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-DNSQqy2V.js");
|
|
38578
38655
|
let providerEnvStr = "";
|
|
38579
38656
|
let providerEnv = {};
|
|
38580
38657
|
const statusProvider = getProviderForModelSync(statusModelId);
|
|
@@ -38657,7 +38734,7 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
|
|
|
38657
38734
|
let safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "-");
|
|
38658
38735
|
let processedContent = content;
|
|
38659
38736
|
if (safeName.endsWith(".vtt")) {
|
|
38660
|
-
const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-
|
|
38737
|
+
const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-BnRsYzcz.js"));
|
|
38661
38738
|
processedContent = vttToMarkdown(content);
|
|
38662
38739
|
safeName = safeName.replace(/\.vtt$/, ".md");
|
|
38663
38740
|
}
|
|
@@ -44484,7 +44561,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
|
|
|
44484
44561
|
}, { status: 400 });
|
|
44485
44562
|
return yield* Effect.promise(async () => {
|
|
44486
44563
|
try {
|
|
44487
|
-
const { RallyRestApi } = await import("./rally-api-
|
|
44564
|
+
const { RallyRestApi } = await import("./rally-api-xHazRk0d.js");
|
|
44488
44565
|
const api = new RallyRestApi({
|
|
44489
44566
|
apiKey,
|
|
44490
44567
|
server: server || "https://rally1.rallydev.com"
|
|
@@ -44516,15 +44593,9 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
|
|
|
44516
44593
|
const trackersRouteLayer = Layer.mergeAll(postTrackersRefreshRoute, getTrackerStatusRoute, postRallyValidateRoute);
|
|
44517
44594
|
//#endregion
|
|
44518
44595
|
//#region ../lib/health-filtering.ts
|
|
44519
|
-
/**
|
|
44520
|
-
* Health filtering logic for dashboard health API
|
|
44521
|
-
* Determines which agents should be visible in health checks
|
|
44522
|
-
*/
|
|
44523
|
-
init_config$1();
|
|
44524
44596
|
init_tmux();
|
|
44525
|
-
const KICKOFF_STALL_GRACE_MS = 300 * 1e3;
|
|
44526
44597
|
/**
|
|
44527
|
-
* Check if agent tmux session is alive
|
|
44598
|
+
* Check if agent tmux session is alive.
|
|
44528
44599
|
*/
|
|
44529
44600
|
const checkAgentHealth = (agentId) => Effect.gen(function* () {
|
|
44530
44601
|
if (!(yield* sessionExists(agentId))) return { alive: false };
|
|
@@ -44533,133 +44604,191 @@ const checkAgentHealth = (agentId) => Effect.gen(function* () {
|
|
|
44533
44604
|
lastOutput: (yield* capturePane(agentId, 5)).trim()
|
|
44534
44605
|
};
|
|
44535
44606
|
}).pipe(Effect.catch(() => Effect.succeed({ alive: false })));
|
|
44536
|
-
/**
|
|
44537
|
-
* Determine health status based on activity
|
|
44538
|
-
* Returns null if agent should be hidden (completed/stopped/no state.json)
|
|
44539
|
-
*
|
|
44540
|
-
* `liveSessions` is REQUIRED — pass the session list fetched once per request.
|
|
44541
|
-
* Iterating ~150 agent dirs and spawning a tmux subprocess per agent was pinning
|
|
44542
|
-
* the dashboard process at 100% CPU on every 5s `/api/health/agents` poll.
|
|
44543
|
-
* State is also read before the tmux check so stopped/completed/missing
|
|
44544
|
-
* agents short-circuit without any extra work.
|
|
44545
|
-
*/
|
|
44546
|
-
const determineHealthStatus = (agentId, stateFile, liveSessions) => Effect.gen(function* () {
|
|
44547
|
-
let agentStatus;
|
|
44548
|
-
let lastActivity = null;
|
|
44549
|
-
let contextSaturatedAt;
|
|
44550
|
-
if (!existsSync(stateFile)) return null;
|
|
44551
|
-
const state = yield* Effect.tryPromise({
|
|
44552
|
-
try: () => readFile$1(stateFile, "utf-8").then((content) => JSON.parse(content)),
|
|
44553
|
-
catch: () => null
|
|
44554
|
-
}).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
44555
|
-
if (state === null) return null;
|
|
44556
|
-
agentStatus = state.status;
|
|
44557
|
-
lastActivity = state.lastActivity ? new Date(state.lastActivity) : null;
|
|
44558
|
-
if (!agentStatus) return null;
|
|
44559
|
-
if (agentStatus === "stopped" || agentStatus === "completed") return null;
|
|
44560
|
-
const runtimeFile = stateFile.replace("state.json", "runtime.json");
|
|
44561
|
-
if (existsSync(runtimeFile)) {
|
|
44562
|
-
const runtime = yield* Effect.tryPromise({
|
|
44563
|
-
try: () => readFile$1(runtimeFile, "utf-8").then((content) => JSON.parse(content)),
|
|
44564
|
-
catch: () => null
|
|
44565
|
-
}).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
44566
|
-
if (runtime?.lastActivity) {
|
|
44567
|
-
const runtimeDate = new Date(runtime.lastActivity);
|
|
44568
|
-
if (!lastActivity || runtimeDate > lastActivity) lastActivity = runtimeDate;
|
|
44569
|
-
}
|
|
44570
|
-
if (runtime?.contextSaturatedAt) contextSaturatedAt = runtime.contextSaturatedAt;
|
|
44571
|
-
}
|
|
44572
|
-
if (!liveSessions.has(agentId)) {
|
|
44573
|
-
const STALE_THRESHOLD_MS = ((yield* loadCloisterConfig()).retention?.health_staleness_hours ?? 24) * 60 * 60 * 1e3;
|
|
44574
|
-
if (lastActivity) {
|
|
44575
|
-
if (Date.now() - lastActivity.getTime() > STALE_THRESHOLD_MS) return null;
|
|
44576
|
-
} else return null;
|
|
44577
|
-
return {
|
|
44578
|
-
status: "dead",
|
|
44579
|
-
reason: "Agent crashed unexpectedly"
|
|
44580
|
-
};
|
|
44581
|
-
}
|
|
44582
|
-
if (contextSaturatedAt) return {
|
|
44583
|
-
status: "wedged",
|
|
44584
|
-
reason: "Context window exhausted (400) — recovery in progress"
|
|
44585
|
-
};
|
|
44586
|
-
const startedAtMs = typeof state.startedAt === "string" ? Date.parse(state.startedAt) : NaN;
|
|
44587
|
-
if (state.role === "work" && agentStatus === "running" && state.kickoffDelivered === false && Number.isFinite(startedAtMs) && Date.now() - startedAtMs > KICKOFF_STALL_GRACE_MS) return {
|
|
44588
|
-
status: "stalled",
|
|
44589
|
-
reason: "Work agent running with no kickoff delivered since spawn"
|
|
44590
|
-
};
|
|
44591
|
-
if (lastActivity) {
|
|
44592
|
-
const ageMinutes = (Date.now() - lastActivity.getTime()) / (1e3 * 60);
|
|
44593
|
-
if (ageMinutes > 30) return {
|
|
44594
|
-
status: "stuck",
|
|
44595
|
-
reason: `No activity for ${Math.round(ageMinutes)} minutes`
|
|
44596
|
-
};
|
|
44597
|
-
else if (ageMinutes > 15) return {
|
|
44598
|
-
status: "warning",
|
|
44599
|
-
reason: `Low activity (${Math.round(ageMinutes)} minutes)`
|
|
44600
|
-
};
|
|
44601
|
-
}
|
|
44602
|
-
return { status: "healthy" };
|
|
44603
|
-
});
|
|
44604
44607
|
//#endregion
|
|
44605
44608
|
//#region routes/misc/health.ts
|
|
44606
|
-
|
|
44609
|
+
init_src();
|
|
44610
|
+
init_review_status_source();
|
|
44611
|
+
init_paths();
|
|
44607
44612
|
init_tmux();
|
|
44608
44613
|
init_read_model();
|
|
44609
|
-
|
|
44610
|
-
return jsonResponse(yield* (yield* ReadModelService).getSnapshot.pipe(Effect.flatMap((snapshot) => Effect.promise(() => getSystemHealthSnapshot(snapshot)))));
|
|
44611
|
-
})));
|
|
44612
|
-
const getGodviewSystemHealthRoute = HttpRouter.add("GET", "/api/godview/system-health", httpHandler(Effect.gen(function* () {
|
|
44613
|
-
const health = yield* (yield* ReadModelService).getSnapshot.pipe(Effect.flatMap((snapshot) => Effect.promise(() => getSystemHealthSnapshot(snapshot))));
|
|
44614
|
+
function unavailableSystemHealthResponse() {
|
|
44614
44615
|
return jsonResponse({
|
|
44615
|
-
|
|
44616
|
-
|
|
44617
|
-
|
|
44618
|
-
|
|
44619
|
-
|
|
44616
|
+
status: "unavailable",
|
|
44617
|
+
reasons: [{
|
|
44618
|
+
code: "system.health_snapshot.unavailable",
|
|
44619
|
+
domain: "host",
|
|
44620
|
+
severity: "critical",
|
|
44621
|
+
message: "The accepted system health snapshot could not be produced or decoded."
|
|
44622
|
+
}]
|
|
44623
|
+
}, { status: 503 });
|
|
44624
|
+
}
|
|
44625
|
+
function decodeAcceptedSystemHealth(value) {
|
|
44626
|
+
const decoded = Schema.decodeUnknownResult(SystemHealthSnapshot)(value);
|
|
44627
|
+
if (decoded._tag === "Failure") throw new Error("The accepted system health snapshot failed shared-contract decoding.");
|
|
44628
|
+
return decoded.success;
|
|
44629
|
+
}
|
|
44630
|
+
function buildSystemHealthResponse(dependencies) {
|
|
44631
|
+
return dependencies.snapshot.pipe(Effect.map((snapshot) => jsonResponse(decodeAcceptedSystemHealth(snapshot))), Effect.catchCause(() => Effect.succeed(unavailableSystemHealthResponse())));
|
|
44632
|
+
}
|
|
44633
|
+
function buildGodviewSystemHealthResponse(dependencies) {
|
|
44634
|
+
return dependencies.snapshot.pipe(Effect.map((snapshot) => {
|
|
44635
|
+
const health = decodeAcceptedSystemHealth(snapshot);
|
|
44636
|
+
return jsonResponse({
|
|
44637
|
+
...health,
|
|
44638
|
+
cpu: health.summary.cpuPercent,
|
|
44639
|
+
memPercent: health.summary.memoryUsedPercent,
|
|
44640
|
+
memUsed: health.summary.usedMemoryBytes,
|
|
44641
|
+
memTotal: health.summary.totalMemoryBytes,
|
|
44642
|
+
updatedAt: health.updatedAt
|
|
44643
|
+
});
|
|
44644
|
+
}), Effect.catchCause(() => Effect.succeed(unavailableSystemHealthResponse())));
|
|
44645
|
+
}
|
|
44646
|
+
const getSystemHealthRoute = HttpRouter.add("GET", "/api/system/health", httpHandler(buildSystemHealthResponse({ snapshot: Effect.promise(() => getAcceptedSystemHealthSnapshot()) })));
|
|
44647
|
+
const getGodviewSystemHealthRoute = HttpRouter.add("GET", "/api/godview/system-health", httpHandler(buildGodviewSystemHealthResponse({ snapshot: Effect.promise(() => getAcceptedSystemHealthSnapshot()) })));
|
|
44648
|
+
const getDeployStalenessRoute = HttpRouter.add("GET", "/api/deploy/staleness", Effect.promise(async () => jsonResponse(await getDeployStaleness())));
|
|
44649
|
+
function finiteNumber(value) {
|
|
44650
|
+
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
44651
|
+
}
|
|
44652
|
+
async function readAgentHealthObservations(agentId) {
|
|
44653
|
+
if (!/^[A-Za-z0-9._-]+$/.test(agentId) || agentId.includes("..")) return {};
|
|
44654
|
+
const agentDir = join(getOverdeckHome(), "agents", agentId);
|
|
44655
|
+
const observations = {};
|
|
44656
|
+
try {
|
|
44657
|
+
const stored = JSON.parse(await readFile(join(agentDir, "health.json"), "utf-8"));
|
|
44658
|
+
if (stored && typeof stored === "object" && !Array.isArray(stored)) {
|
|
44659
|
+
const record = stored;
|
|
44660
|
+
const consecutiveFailures = finiteNumber(record["consecutiveFailures"]);
|
|
44661
|
+
const killCount = finiteNumber(record["killCount"]);
|
|
44662
|
+
if (consecutiveFailures !== void 0) observations.consecutiveFailures = consecutiveFailures;
|
|
44663
|
+
if (killCount !== void 0) observations.killCount = killCount;
|
|
44664
|
+
}
|
|
44665
|
+
} catch {}
|
|
44666
|
+
try {
|
|
44667
|
+
const raw = (await readFile(join(agentDir, "context-pct"), "utf-8")).trim();
|
|
44668
|
+
const contextPercent = raw === "" ? NaN : Number(raw);
|
|
44669
|
+
if (Number.isFinite(contextPercent)) observations.contextPercent = contextPercent;
|
|
44670
|
+
} catch {}
|
|
44671
|
+
return observations;
|
|
44672
|
+
}
|
|
44673
|
+
function runtimeHealthState(runtime) {
|
|
44674
|
+
if (!runtime) return null;
|
|
44675
|
+
switch (runtime.activity) {
|
|
44676
|
+
case "working":
|
|
44677
|
+
case "thinking": return {
|
|
44678
|
+
state: "active",
|
|
44679
|
+
lastActivity: runtime.lastActivity,
|
|
44680
|
+
contextSaturatedAt: runtime.contextSaturatedAt
|
|
44681
|
+
};
|
|
44682
|
+
case "waiting": return {
|
|
44683
|
+
state: "waiting-on-human",
|
|
44684
|
+
lastActivity: runtime.lastActivity,
|
|
44685
|
+
contextSaturatedAt: runtime.contextSaturatedAt
|
|
44686
|
+
};
|
|
44687
|
+
case "idle": return {
|
|
44688
|
+
state: "idle",
|
|
44689
|
+
lastActivity: runtime.lastActivity,
|
|
44690
|
+
contextSaturatedAt: runtime.contextSaturatedAt
|
|
44691
|
+
};
|
|
44692
|
+
case "stopped": return {
|
|
44693
|
+
state: "stopped",
|
|
44694
|
+
lastActivity: runtime.lastActivity,
|
|
44695
|
+
contextSaturatedAt: runtime.contextSaturatedAt
|
|
44696
|
+
};
|
|
44697
|
+
}
|
|
44698
|
+
}
|
|
44699
|
+
function decodeReviewStatuses(value) {
|
|
44700
|
+
const statuses = /* @__PURE__ */ new Map();
|
|
44701
|
+
for (const candidate of value ?? []) {
|
|
44702
|
+
const decoded = Schema.decodeUnknownResult(ReviewStatusSnapshot)(candidate);
|
|
44703
|
+
if (decoded._tag === "Success") statuses.set(decoded.success.issueId.toUpperCase(), decoded.success);
|
|
44704
|
+
}
|
|
44705
|
+
return statuses;
|
|
44706
|
+
}
|
|
44707
|
+
function reviewLifecycle(agent, statuses, tmuxActive) {
|
|
44708
|
+
if (agent.role !== "review" && agent.role !== "test" && agent.role !== "ship") return "unknown";
|
|
44709
|
+
return classifyAdvancingSessionLifecycle(agent.role, statuses.get(agent.issueId.toUpperCase()), tmuxActive);
|
|
44710
|
+
}
|
|
44711
|
+
function snapshotSource(value) {
|
|
44712
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("The canonical read model did not return an object.");
|
|
44713
|
+
const candidate = value;
|
|
44714
|
+
if (!Array.isArray(candidate["agents"])) throw new Error("The canonical read model did not return an agent array.");
|
|
44715
|
+
return {
|
|
44716
|
+
agents: candidate["agents"],
|
|
44717
|
+
agentRuntimeById: candidate["agentRuntimeById"],
|
|
44718
|
+
reviewStatuses: Array.isArray(candidate["reviewStatuses"]) ? candidate["reviewStatuses"] : void 0
|
|
44719
|
+
};
|
|
44720
|
+
}
|
|
44721
|
+
function runtimeRecord(value) {
|
|
44722
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
44723
|
+
}
|
|
44724
|
+
async function projectAgentHealth(snapshotValue, sessionNames, readObservations, nowMs) {
|
|
44725
|
+
const snapshot = snapshotSource(snapshotValue);
|
|
44726
|
+
const liveSessions = new Set(sessionNames);
|
|
44727
|
+
const runtimes = runtimeRecord(snapshot.agentRuntimeById);
|
|
44728
|
+
const reviewStatuses = decodeReviewStatuses(snapshot.reviewStatuses);
|
|
44729
|
+
return Promise.all(snapshot.agents.map(async (candidate, index) => {
|
|
44730
|
+
const decoded = Schema.decodeUnknownResult(AgentSnapshot)(candidate);
|
|
44731
|
+
if (decoded._tag === "Failure") {
|
|
44732
|
+
const candidateId = candidate && typeof candidate === "object" && !Array.isArray(candidate) ? candidate["id"] : void 0;
|
|
44733
|
+
return classifyAgentHealth({
|
|
44734
|
+
agentId: typeof candidateId === "string" ? candidateId : `unavailable-agent-${index + 1}`,
|
|
44735
|
+
persisted: {
|
|
44736
|
+
status: "unavailable",
|
|
44737
|
+
reason: "The canonical agent snapshot could not be decoded."
|
|
44738
|
+
},
|
|
44739
|
+
runtime: null,
|
|
44740
|
+
liveSessions,
|
|
44741
|
+
reviewLifecycle: "unknown",
|
|
44742
|
+
nowMs
|
|
44743
|
+
});
|
|
44744
|
+
}
|
|
44745
|
+
const agent = decoded.success;
|
|
44746
|
+
const runtimeCandidate = Schema.decodeUnknownResult(AgentRuntimeSnapshot)(runtimes[agent.id]);
|
|
44747
|
+
const runtime = runtimeCandidate._tag === "Success" ? runtimeCandidate.success : null;
|
|
44748
|
+
const observations = await readObservations(agent.id).catch(() => ({}));
|
|
44749
|
+
return classifyAgentHealth({
|
|
44750
|
+
agentId: agent.id,
|
|
44751
|
+
persisted: {
|
|
44752
|
+
status: "available",
|
|
44753
|
+
value: {
|
|
44754
|
+
id: agent.id,
|
|
44755
|
+
issueId: agent.issueId,
|
|
44756
|
+
role: agent.role,
|
|
44757
|
+
status: agent.status,
|
|
44758
|
+
startedAt: agent.startedAt,
|
|
44759
|
+
lastActivity: agent.lastActivity,
|
|
44760
|
+
paused: agent.paused,
|
|
44761
|
+
stoppedByUser: agent.stoppedByUser,
|
|
44762
|
+
consecutiveFailures: agent.consecutiveFailures
|
|
44763
|
+
}
|
|
44764
|
+
},
|
|
44765
|
+
runtime: runtimeHealthState(runtime),
|
|
44766
|
+
liveSessions,
|
|
44767
|
+
reviewLifecycle: reviewLifecycle(agent, reviewStatuses, liveSessions.has(agent.id)),
|
|
44768
|
+
observations,
|
|
44769
|
+
nowMs
|
|
44770
|
+
});
|
|
44771
|
+
}));
|
|
44772
|
+
}
|
|
44773
|
+
function buildHealthAgentsResponse(dependencies) {
|
|
44774
|
+
return Effect.all({
|
|
44775
|
+
snapshot: dependencies.snapshot,
|
|
44776
|
+
sessionNames: dependencies.sessionNames
|
|
44777
|
+
}).pipe(Effect.flatMap(({ snapshot, sessionNames }) => Effect.promise(async () => jsonResponse(await projectAgentHealth(snapshot, sessionNames, dependencies.readObservations ?? readAgentHealthObservations, dependencies.nowMs ?? Date.now())))), Effect.catchCause(() => Effect.succeed(jsonResponse({
|
|
44778
|
+
status: "unavailable",
|
|
44779
|
+
reasons: [{
|
|
44780
|
+
code: "agent.health_snapshot.unavailable",
|
|
44781
|
+
domain: "agent",
|
|
44782
|
+
severity: "critical",
|
|
44783
|
+
message: "The canonical agent health snapshot could not be loaded."
|
|
44784
|
+
}]
|
|
44785
|
+
}, { status: 503 }))));
|
|
44786
|
+
}
|
|
44787
|
+
const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.gen(function* () {
|
|
44788
|
+
return yield* buildHealthAgentsResponse({
|
|
44789
|
+
snapshot: (yield* ReadModelService).getSnapshot,
|
|
44790
|
+
sessionNames: listSessionNames()
|
|
44620
44791
|
});
|
|
44621
|
-
})));
|
|
44622
|
-
const getHealthAgentsRoute = HttpRouter.add("GET", "/api/health/agents", Effect.promise(async () => {
|
|
44623
|
-
try {
|
|
44624
|
-
const agentsDir = join(homedir$1(), ".overdeck", "agents");
|
|
44625
|
-
if (!existsSync$1(agentsDir)) return jsonResponse([]);
|
|
44626
|
-
const agentNames = (await readdir(agentsDir)).filter((name) => name.startsWith("agent-") || name.startsWith("planning-") || name.startsWith("specialist-"));
|
|
44627
|
-
const liveSessions = new Set(await Effect.runPromise(listSessionNames()));
|
|
44628
|
-
return jsonResponse((await Promise.all(agentNames.map(async (name) => {
|
|
44629
|
-
const stateFile = getAgentStateFilePath(name);
|
|
44630
|
-
const healthFile = join(agentsDir, name, "health.json");
|
|
44631
|
-
const healthStatus = await Effect.runPromise(determineHealthStatus(name, stateFile, liveSessions));
|
|
44632
|
-
if (!healthStatus) return null;
|
|
44633
|
-
let storedHealth = {
|
|
44634
|
-
consecutiveFailures: 0,
|
|
44635
|
-
killCount: 0
|
|
44636
|
-
};
|
|
44637
|
-
try {
|
|
44638
|
-
const healthContent = await readFile(healthFile, "utf-8");
|
|
44639
|
-
storedHealth = {
|
|
44640
|
-
...storedHealth,
|
|
44641
|
-
...JSON.parse(healthContent)
|
|
44642
|
-
};
|
|
44643
|
-
} catch {}
|
|
44644
|
-
let contextPercent = null;
|
|
44645
|
-
try {
|
|
44646
|
-
const ctxContent = await readFile(join(agentsDir, name, "context-pct"), "utf-8");
|
|
44647
|
-
contextPercent = parseInt(ctxContent.trim(), 10) || null;
|
|
44648
|
-
} catch {}
|
|
44649
|
-
return {
|
|
44650
|
-
agentId: name,
|
|
44651
|
-
status: healthStatus.status,
|
|
44652
|
-
reason: healthStatus.reason,
|
|
44653
|
-
lastPing: (/* @__PURE__ */ new Date()).toISOString(),
|
|
44654
|
-
consecutiveFailures: storedHealth.consecutiveFailures,
|
|
44655
|
-
killCount: storedHealth.killCount,
|
|
44656
|
-
contextPercent
|
|
44657
|
-
};
|
|
44658
|
-
}))).filter((agent) => agent !== null));
|
|
44659
|
-
} catch (error) {
|
|
44660
|
-
console.error("Error fetching health:", error);
|
|
44661
|
-
return jsonResponse([]);
|
|
44662
|
-
}
|
|
44663
44792
|
}));
|
|
44664
44793
|
const postHealthAgentPingRoute = HttpRouter.add("POST", "/api/health/agents/:id/ping", Effect.gen(function* () {
|
|
44665
44794
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
@@ -44681,7 +44810,7 @@ const postHealthAgentPingRoute = HttpRouter.add("POST", "/api/health/agents/:id/
|
|
|
44681
44810
|
}
|
|
44682
44811
|
});
|
|
44683
44812
|
}));
|
|
44684
|
-
const healthRouteLayer$1 = Layer.mergeAll(getSystemHealthRoute, getGodviewSystemHealthRoute, getHealthAgentsRoute, postHealthAgentPingRoute);
|
|
44813
|
+
const healthRouteLayer$1 = Layer.mergeAll(getSystemHealthRoute, getGodviewSystemHealthRoute, getDeployStalenessRoute, getHealthAgentsRoute, postHealthAgentPingRoute);
|
|
44685
44814
|
//#endregion
|
|
44686
44815
|
//#region routes/misc/deacon.ts
|
|
44687
44816
|
init_control_settings();
|
|
@@ -44812,7 +44941,7 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
|
|
|
44812
44941
|
const remoteState = loadRemoteAgentState(sessionName);
|
|
44813
44942
|
const isRemote = !!remoteState;
|
|
44814
44943
|
const vmName = remoteState?.vmName ?? "";
|
|
44815
|
-
const { getAgentStateSync } = await import("./agents-
|
|
44944
|
+
const { getAgentStateSync } = await import("./agents-DyHKlq1I.js");
|
|
44816
44945
|
const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
|
|
44817
44946
|
let tmuxSessionAlive = false;
|
|
44818
44947
|
if (!isRemote) try {
|
|
@@ -44954,8 +45083,9 @@ ${message}
|
|
|
44954
45083
|
Continue the PLANNING session. Do NOT implement anything.
|
|
44955
45084
|
`);
|
|
44956
45085
|
const agentCwd = workspacePath;
|
|
45086
|
+
const harnessLaunch = await prepareHarnessLaunch("claude-code");
|
|
44957
45087
|
if (existsSync$1(outputFile)) await rename(outputFile, join(planningDir, `output-${Date.now()}.jsonl`));
|
|
44958
|
-
const { getAgentCommandSync } = await import("./settings-
|
|
45088
|
+
const { getAgentCommandSync } = await import("./settings-BlUsVaUc.js");
|
|
44959
45089
|
let msgPlanningModel = "claude-sonnet-5";
|
|
44960
45090
|
try {
|
|
44961
45091
|
msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
|
|
@@ -44969,6 +45099,7 @@ Continue the PLANNING session. Do NOT implement anything.
|
|
|
44969
45099
|
role: "plan",
|
|
44970
45100
|
workingDir: agentCwd,
|
|
44971
45101
|
baseCommand: msgCmdWithArgs,
|
|
45102
|
+
extraEnvExports: [harnessLaunch.pathExport],
|
|
44972
45103
|
appendSystemPromptFiles: await claudePlanningSystemPromptFiles(agentCwd),
|
|
44973
45104
|
promptInline: `Please read the continuation prompt at ${continuationPromptPath} and continue the planning session.`
|
|
44974
45105
|
}), { mode: 493 });
|
|
@@ -45076,7 +45207,7 @@ async function getIndexStats(rootPath, isMain) {
|
|
|
45076
45207
|
}
|
|
45077
45208
|
const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
|
|
45078
45209
|
try {
|
|
45079
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
45210
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
|
|
45080
45211
|
const projectRoot = process.cwd();
|
|
45081
45212
|
const venvPath = join(projectRoot, ".venv");
|
|
45082
45213
|
const results = [];
|
|
@@ -45121,7 +45252,7 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
|
|
|
45121
45252
|
}));
|
|
45122
45253
|
const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
|
|
45123
45254
|
try {
|
|
45124
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
45255
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
|
|
45125
45256
|
const projectRoot = process.cwd();
|
|
45126
45257
|
const venvPath = join(projectRoot, ".venv");
|
|
45127
45258
|
if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
|
|
@@ -45138,7 +45269,7 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
|
|
|
45138
45269
|
}));
|
|
45139
45270
|
const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
|
|
45140
45271
|
try {
|
|
45141
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
45272
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
|
|
45142
45273
|
const projectRoot = process.cwd();
|
|
45143
45274
|
const venvPath = join(projectRoot, ".venv");
|
|
45144
45275
|
if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
|
|
@@ -45155,7 +45286,7 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
|
|
|
45155
45286
|
}));
|
|
45156
45287
|
const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
|
|
45157
45288
|
try {
|
|
45158
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
45289
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-B8_oT5gx.js");
|
|
45159
45290
|
const enabled = isTldrEnabledSync();
|
|
45160
45291
|
const projectRoot = process.cwd();
|
|
45161
45292
|
const targets = [];
|
|
@@ -45343,7 +45474,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
|
|
|
45343
45474
|
const version = await getOverdeckVersion();
|
|
45344
45475
|
let supervisorUrl = null;
|
|
45345
45476
|
try {
|
|
45346
|
-
const { getSupervisorUrlSync } = await import("./supervisor-
|
|
45477
|
+
const { getSupervisorUrlSync } = await import("./supervisor-COVHrBTg.js");
|
|
45347
45478
|
supervisorUrl = getSupervisorUrlSync();
|
|
45348
45479
|
} catch {}
|
|
45349
45480
|
return jsonResponse({
|
|
@@ -45353,11 +45484,11 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
|
|
|
45353
45484
|
});
|
|
45354
45485
|
}));
|
|
45355
45486
|
const getPrerequisitesRoute = HttpRouter.add("GET", "/api/prerequisites", Effect.promise(async () => {
|
|
45356
|
-
const { checkSystemPrerequisites } = await import("./system-prerequisites-
|
|
45487
|
+
const { checkSystemPrerequisites } = await import("./system-prerequisites-DSXBvffY.js");
|
|
45357
45488
|
return jsonResponse(await checkSystemPrerequisites());
|
|
45358
45489
|
}));
|
|
45359
45490
|
const getSetupDiagnosticsRoute = HttpRouter.add("GET", "/api/diagnostics/setup", Effect.promise(async () => {
|
|
45360
|
-
const { collectSetupDiagnostics } = await import("./system-prerequisites-
|
|
45491
|
+
const { collectSetupDiagnostics } = await import("./system-prerequisites-DSXBvffY.js");
|
|
45361
45492
|
return jsonResponse(await collectSetupDiagnostics(await getOverdeckVersion()));
|
|
45362
45493
|
}));
|
|
45363
45494
|
const getSyncStatusRoute = HttpRouter.add("GET", "/api/sync-status", Effect.sync(() => {
|
|
@@ -45537,7 +45668,7 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
|
|
|
45537
45668
|
const projectPath = await getProjectPath(issuePrefix);
|
|
45538
45669
|
const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
|
|
45539
45670
|
if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
|
|
45540
|
-
const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-
|
|
45671
|
+
const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-D4X_s3fA.js");
|
|
45541
45672
|
const config = {
|
|
45542
45673
|
issueId,
|
|
45543
45674
|
workspacePath,
|
|
@@ -45567,7 +45698,7 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
|
|
|
45567
45698
|
if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
|
|
45568
45699
|
const ghConfig = getGitHubConfig();
|
|
45569
45700
|
if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
|
|
45570
|
-
const { runObserverCycle } = await import("./shadow-engineering-
|
|
45701
|
+
const { runObserverCycle } = await import("./shadow-engineering-D4X_s3fA.js");
|
|
45571
45702
|
const firstRepo = ghConfig.repos[0];
|
|
45572
45703
|
const config = {
|
|
45573
45704
|
issueId,
|
|
@@ -48735,7 +48866,7 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
|
|
|
48735
48866
|
let mergeState;
|
|
48736
48867
|
let isDraft;
|
|
48737
48868
|
let checksFailed;
|
|
48738
|
-
const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-
|
|
48869
|
+
const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-CU14oYzP.js");
|
|
48739
48870
|
if (isGitHubAppConfigured()) {
|
|
48740
48871
|
const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
|
|
48741
48872
|
mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
|
|
@@ -48884,8 +49015,8 @@ async function handlePullRequestPromise(payload) {
|
|
|
48884
49015
|
bumpIssuePrTabCacheGeneration(issueId);
|
|
48885
49016
|
const repo = payload.repository.full_name;
|
|
48886
49017
|
if (payload.action === "closed" && pr.merged === true) try {
|
|
48887
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
48888
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
49018
|
+
const { postMergeLifecycle } = await import("./merge-agent-B-SnXOoc.js");
|
|
49019
|
+
const { resolveProjectFromIssueSync } = await import("./projects-BKkwpH6q.js");
|
|
48889
49020
|
const project = resolveProjectFromIssueSync(issueId);
|
|
48890
49021
|
if (project) {
|
|
48891
49022
|
const branchName = pr.head.ref;
|
|
@@ -50281,7 +50412,7 @@ async function registerProjectFromPath(opts) {
|
|
|
50281
50412
|
registerProjectSync(key, projectConfig);
|
|
50282
50413
|
const seededContextLayer = ensureProjectLayer(fullPath);
|
|
50283
50414
|
try {
|
|
50284
|
-
const { preTrustDirectorySync } = await import("./workspace-manager-
|
|
50415
|
+
const { preTrustDirectorySync } = await import("./workspace-manager-B1WOfKvB.js");
|
|
50285
50416
|
preTrustDirectorySync(fullPath);
|
|
50286
50417
|
} catch {}
|
|
50287
50418
|
let hooksInstalled = 0;
|
|
@@ -50311,6 +50442,7 @@ init_issue_id();
|
|
|
50311
50442
|
init_tmux();
|
|
50312
50443
|
init_concurrency$1();
|
|
50313
50444
|
init_read_model();
|
|
50445
|
+
init_src();
|
|
50314
50446
|
init_agents$1();
|
|
50315
50447
|
init_pan_dir();
|
|
50316
50448
|
init_io();
|
|
@@ -50318,7 +50450,7 @@ init_specs();
|
|
|
50318
50450
|
init_paths();
|
|
50319
50451
|
const execAsync$2 = promisify(exec);
|
|
50320
50452
|
async function getIssueDataService() {
|
|
50321
|
-
const { getSharedIssueService } = await import("./issue-service-singleton-
|
|
50453
|
+
const { getSharedIssueService } = await import("./issue-service-singleton-DBZabEl7.js");
|
|
50322
50454
|
return getSharedIssueService();
|
|
50323
50455
|
}
|
|
50324
50456
|
/** Returns true if the path exists (any type). */
|
|
@@ -50733,7 +50865,7 @@ async function fetchProjectSessionTree(projectKey, sharedContext) {
|
|
|
50733
50865
|
})), 15));
|
|
50734
50866
|
features.push(...results.filter((f) => f !== null));
|
|
50735
50867
|
}
|
|
50736
|
-
features.sort((a, b) => a.issueId
|
|
50868
|
+
features.sort((a, b) => compareIssueIds(a.issueId, b.issueId));
|
|
50737
50869
|
return {
|
|
50738
50870
|
projectKey,
|
|
50739
50871
|
features
|
|
@@ -50775,7 +50907,7 @@ const getProjectReleaseStatusRoute = HttpRouter.add("GET", "/api/projects/:proje
|
|
|
50775
50907
|
const projectKey = (yield* HttpRouter.params)["projectKey"] ?? "";
|
|
50776
50908
|
return jsonResponse(yield* Effect.tryPromise({
|
|
50777
50909
|
try: async () => {
|
|
50778
|
-
const { fetchProjectReleaseStatus } = await import("./project-pipelines-
|
|
50910
|
+
const { fetchProjectReleaseStatus } = await import("./project-pipelines-CtNG_rvs.js");
|
|
50779
50911
|
return fetchProjectReleaseStatus(projectKey);
|
|
50780
50912
|
},
|
|
50781
50913
|
catch: (err) => new Error(err instanceof Error ? err.message : String(err))
|
|
@@ -51590,6 +51722,35 @@ async function checkCommand(cmd, args = ["--version"]) {
|
|
|
51590
51722
|
return false;
|
|
51591
51723
|
}
|
|
51592
51724
|
}
|
|
51725
|
+
const LINUX_PACKAGE_MANAGERS = [
|
|
51726
|
+
"pacman",
|
|
51727
|
+
"dnf",
|
|
51728
|
+
"zypper",
|
|
51729
|
+
"apk",
|
|
51730
|
+
"apt-get"
|
|
51731
|
+
];
|
|
51732
|
+
async function detectLinuxPackageManager(commandAvailable = checkCommand) {
|
|
51733
|
+
for (const packageManager of LINUX_PACKAGE_MANAGERS) if (await commandAvailable(packageManager)) return packageManager;
|
|
51734
|
+
return null;
|
|
51735
|
+
}
|
|
51736
|
+
function getLinuxInstallCommand(tool, packageManager) {
|
|
51737
|
+
switch (packageManager) {
|
|
51738
|
+
case "pacman": return `sudo pacman -S --noconfirm ${tool}`;
|
|
51739
|
+
case "dnf": return `sudo dnf install -y ${tool}`;
|
|
51740
|
+
case "zypper": return `sudo zypper install -y ${tool}`;
|
|
51741
|
+
case "apk": return `sudo apk add ${tool}`;
|
|
51742
|
+
case "apt-get": return `sudo apt-get update && sudo apt-get install -y ${tool}`;
|
|
51743
|
+
}
|
|
51744
|
+
}
|
|
51745
|
+
function getLinuxManualInstallHint(tool, packageManager) {
|
|
51746
|
+
if (packageManager) return getLinuxInstallCommand(tool, packageManager);
|
|
51747
|
+
return `${tool} — download from ${tool === "jq" ? "https://jqlang.github.io/jq/download/" : "https://github.com/tmux/tmux/wiki/Installing"}`;
|
|
51748
|
+
}
|
|
51749
|
+
async function installLinuxPackage(tool) {
|
|
51750
|
+
const packageManager = await detectLinuxPackageManager();
|
|
51751
|
+
if (!packageManager) throw new Error(`No supported Linux package manager found. Install ${getLinuxManualInstallHint(tool, null)}`);
|
|
51752
|
+
await execAsync$1(getLinuxInstallCommand(tool, packageManager), { timeout: 12e4 });
|
|
51753
|
+
}
|
|
51593
51754
|
async function isToolInstalled(tool) {
|
|
51594
51755
|
if (tool === "docker") return checkCommand("docker", ["info"]);
|
|
51595
51756
|
if (tool === "traefik") try {
|
|
@@ -51632,7 +51793,7 @@ async function installTool(tool) {
|
|
|
51632
51793
|
}
|
|
51633
51794
|
async function installTmux() {
|
|
51634
51795
|
if (await Effect.runPromise(detectPlatform()) === "darwin") await execAsync$1("brew install tmux", { timeout: 12e4 });
|
|
51635
|
-
else await
|
|
51796
|
+
else await installLinuxPackage("tmux");
|
|
51636
51797
|
return {
|
|
51637
51798
|
tool: "tmux",
|
|
51638
51799
|
success: true,
|
|
@@ -51682,7 +51843,7 @@ async function installMkcert() {
|
|
|
51682
51843
|
}
|
|
51683
51844
|
async function installJq() {
|
|
51684
51845
|
if (await Effect.runPromise(detectPlatform()) === "darwin") await execAsync$1("brew install jq", { timeout: 12e4 });
|
|
51685
|
-
else await
|
|
51846
|
+
else await installLinuxPackage("jq");
|
|
51686
51847
|
return {
|
|
51687
51848
|
tool: "jq",
|
|
51688
51849
|
success: true,
|
|
@@ -52417,7 +52578,7 @@ function getCheckpointWorker() {
|
|
|
52417
52578
|
return worker;
|
|
52418
52579
|
}
|
|
52419
52580
|
async function runInline(operation, payload) {
|
|
52420
|
-
const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-
|
|
52581
|
+
const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-B5jFNi2G.js");
|
|
52421
52582
|
switch (operation) {
|
|
52422
52583
|
case "claimTranscriptRange": return claimTranscriptRange(payload);
|
|
52423
52584
|
case "commitTranscriptRange": return commitTranscriptRange(payload);
|
|
@@ -53571,7 +53732,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
|
|
|
53571
53732
|
};
|
|
53572
53733
|
}
|
|
53573
53734
|
async function emitMemoryObservationCreated(observation, timestamp) {
|
|
53574
|
-
const { initEventStore } = await import("./event-store-
|
|
53735
|
+
const { initEventStore } = await import("./event-store-CpBGsO6_.js");
|
|
53575
53736
|
await (await initEventStore()).appendAsync({
|
|
53576
53737
|
type: "memory.observation_created",
|
|
53577
53738
|
timestamp,
|
|
@@ -56583,7 +56744,7 @@ async function getFlywheelConversationPayload() {
|
|
|
56583
56744
|
};
|
|
56584
56745
|
}
|
|
56585
56746
|
async function postFlywheelReportPayload() {
|
|
56586
|
-
const { flywheelReportCommand } = await import("./flywheel-
|
|
56747
|
+
const { flywheelReportCommand } = await import("./flywheel-6WHU4O7A.js");
|
|
56587
56748
|
await flywheelReportCommand({ cwd: process.cwd() });
|
|
56588
56749
|
return {
|
|
56589
56750
|
status: 200,
|
|
@@ -56741,11 +56902,11 @@ const getMergeBlockersRoute = HttpRouter.add("GET", "/api/flywheel/merge-blocker
|
|
|
56741
56902
|
async function defaultGetOrderedIssueIds() {
|
|
56742
56903
|
const status = await readCurrentFlywheelStatusForDashboard();
|
|
56743
56904
|
if (!status) return [];
|
|
56744
|
-
const { computeMergeQueue } = await import("./flywheel-merge-order-
|
|
56905
|
+
const { computeMergeQueue } = await import("./flywheel-merge-order-CNKAY489.js");
|
|
56745
56906
|
return (await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd()).pipe(Effect.provide(layer)))).map((i) => i.issueId);
|
|
56746
56907
|
}
|
|
56747
56908
|
async function defaultMergeOne(issueId) {
|
|
56748
|
-
const { triggerMerge } = await import("./merge-ops-
|
|
56909
|
+
const { triggerMerge } = await import("./merge-ops-DwWCkSgo.js");
|
|
56749
56910
|
const r = await triggerMerge(issueId);
|
|
56750
56911
|
return r.success ? { ok: true } : {
|
|
56751
56912
|
ok: false,
|
|
@@ -56765,7 +56926,7 @@ async function postFlywheelMergeNextPayload(payload, deps = {}) {
|
|
|
56765
56926
|
body: { error: "n must be a positive integer" }
|
|
56766
56927
|
};
|
|
56767
56928
|
const issueIds = (await (deps.getOrderedIssueIds ?? defaultGetOrderedIssueIds)()).slice(0, n);
|
|
56768
|
-
const { shipMergeBatch } = await import("./merge-batch-
|
|
56929
|
+
const { shipMergeBatch } = await import("./merge-batch-Byt-QnEl.js");
|
|
56769
56930
|
return {
|
|
56770
56931
|
status: 200,
|
|
56771
56932
|
body: { outcomes: await shipMergeBatch(issueIds, { merge: deps.merge ?? defaultMergeOne }) }
|
|
@@ -56922,7 +57083,7 @@ const getFlywheelMergeQueueRoute = HttpRouter.add("GET", "/api/flywheel/merge-qu
|
|
|
56922
57083
|
return yield* Effect.promise(async () => {
|
|
56923
57084
|
const status = await readCurrentFlywheelStatusForDashboard();
|
|
56924
57085
|
if (!status) return jsonResponse([]);
|
|
56925
|
-
const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-
|
|
57086
|
+
const { computeMergeQueue, resolveMergeQueuePrUrl } = await import("./flywheel-merge-order-CNKAY489.js");
|
|
56926
57087
|
return jsonResponse(await Effect.runPromise(computeMergeQueue(status.activePipeline, process.cwd(), { getPrUrl: resolveMergeQueuePrUrl }).pipe(Effect.provide(layer))));
|
|
56927
57088
|
});
|
|
56928
57089
|
})));
|
|
@@ -56936,18 +57097,18 @@ function uatGenerationNameFromParam(param) {
|
|
|
56936
57097
|
return decoded.startsWith("uat/") ? decoded : `uat/${decoded}`;
|
|
56937
57098
|
}
|
|
56938
57099
|
const getUatGenerationsRoute = HttpRouter.add("GET", "/api/flywheel/uat-generations", httpHandler(Effect.gen(function* () {
|
|
56939
|
-
const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-
|
|
57100
|
+
const { getUatGenerationsPayload } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
|
|
56940
57101
|
return jsonResponse(yield* Effect.promise(() => getUatGenerationsPayload()));
|
|
56941
57102
|
})));
|
|
56942
57103
|
const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
|
|
56943
|
-
const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-
|
|
57104
|
+
const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
|
|
56944
57105
|
return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
|
|
56945
57106
|
})));
|
|
56946
57107
|
const postUatGenerationStackRoute = HttpRouter.add("POST", "/api/flywheel/uat-generations/:name/stack", httpHandler(Effect.gen(function* () {
|
|
56947
57108
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
56948
57109
|
if (authError) return authError;
|
|
56949
57110
|
const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
|
|
56950
|
-
const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-
|
|
57111
|
+
const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
|
|
56951
57112
|
const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
|
|
56952
57113
|
if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
|
|
56953
57114
|
return jsonResponse({
|
|
@@ -56959,8 +57120,8 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
|
|
|
56959
57120
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
56960
57121
|
if (authError) return authError;
|
|
56961
57122
|
const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
|
|
56962
|
-
const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-
|
|
56963
|
-
const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-
|
|
57123
|
+
const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
|
|
57124
|
+
const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-D0gGXMZx.js"));
|
|
56964
57125
|
const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle));
|
|
56965
57126
|
if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
|
|
56966
57127
|
return jsonResponse(result);
|
|
@@ -56973,7 +57134,7 @@ const postUatGenerationPromoteRoute = HttpRouter.add("POST", "/api/flywheel/uat-
|
|
|
56973
57134
|
const postFlywheelAssembleUatRoute = HttpRouter.add("POST", "/api/flywheel/assemble-uat", httpHandler(Effect.gen(function* () {
|
|
56974
57135
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
56975
57136
|
if (authError) return authError;
|
|
56976
|
-
const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-
|
|
57137
|
+
const { runUatTrainReconcile } = yield* Effect.promise(() => import("./uat-train-0Ujk8GCv.js"));
|
|
56977
57138
|
return jsonResponse(yield* Effect.promise(() => runUatTrainReconcile({ force: true })));
|
|
56978
57139
|
})));
|
|
56979
57140
|
const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
|
|
@@ -60646,7 +60807,7 @@ async function pollOnce(state) {
|
|
|
60646
60807
|
try {
|
|
60647
60808
|
const remoteState = await readFile(join(homedir$1(), ".overdeck", "agents", agentId, "remote-state.json"), "utf-8").then((text) => JSON.parse(text)).catch(() => null);
|
|
60648
60809
|
if (remoteState?.location === "remote" && remoteState?.vmName) {
|
|
60649
|
-
const { getRemoteAgentOutput } = await import("./remote-agents-
|
|
60810
|
+
const { getRemoteAgentOutput } = await import("./remote-agents-D6O_zETW.js");
|
|
60650
60811
|
stdout = await getRemoteAgentOutput(agentId, remoteState.vmName, 50);
|
|
60651
60812
|
} else stdout = await Effect.runPromise(capturePane(agentId, 50));
|
|
60652
60813
|
} catch {
|
|
@@ -61852,7 +62013,7 @@ const RESTART_MARKER = join$1(homedir(), ".overdeck", "dashboard-restarting.json
|
|
|
61852
62013
|
* loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
|
|
61853
62014
|
*/
|
|
61854
62015
|
async function defaultLifecycleRunner(pending) {
|
|
61855
|
-
const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-
|
|
62016
|
+
const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-B-SnXOoc.js");
|
|
61856
62017
|
await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
|
|
61857
62018
|
if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
|
|
61858
62019
|
}
|
|
@@ -62173,7 +62334,7 @@ function failureReason(result) {
|
|
|
62173
62334
|
return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
|
|
62174
62335
|
}
|
|
62175
62336
|
async function defaultMergeIssue(issueId) {
|
|
62176
|
-
const { triggerMerge } = await import("./merge-ops-
|
|
62337
|
+
const { triggerMerge } = await import("./merge-ops-DwWCkSgo.js");
|
|
62177
62338
|
return triggerMerge(issueId);
|
|
62178
62339
|
}
|
|
62179
62340
|
function defaultAnnounceFailure(issueId, reason) {
|
|
@@ -62401,24 +62562,27 @@ init_projects();
|
|
|
62401
62562
|
init_state_home();
|
|
62402
62563
|
const execFileAsync = promisify(execFile);
|
|
62403
62564
|
const inFlight = /* @__PURE__ */ new Map();
|
|
62404
|
-
async function pathIsGitWorkTree(path) {
|
|
62565
|
+
async function pathIsGitWorkTree(path, signal) {
|
|
62405
62566
|
try {
|
|
62567
|
+
signal?.throwIfAborted();
|
|
62406
62568
|
const { stdout } = await execFileAsync("git", ["rev-parse", "--is-inside-work-tree"], {
|
|
62407
62569
|
cwd: path,
|
|
62408
62570
|
encoding: "utf8",
|
|
62409
|
-
timeout: 15e3
|
|
62571
|
+
timeout: 15e3,
|
|
62572
|
+
signal
|
|
62410
62573
|
});
|
|
62411
62574
|
return stdout.trim() === "true";
|
|
62412
62575
|
} catch {
|
|
62576
|
+
signal?.throwIfAborted();
|
|
62413
62577
|
return false;
|
|
62414
62578
|
}
|
|
62415
62579
|
}
|
|
62416
62580
|
const defaultDependencies = {
|
|
62417
62581
|
inspect: inspectStateMigration,
|
|
62418
62582
|
ensureWorktree: ensureStateWorktree,
|
|
62419
|
-
migrate: async (projectKey, project) => {
|
|
62420
|
-
const { migrateProjectState } = await import("./state-migrate-
|
|
62421
|
-
await migrateProjectState(projectKey, {}, project);
|
|
62583
|
+
migrate: async (projectKey, project, signal) => {
|
|
62584
|
+
const { migrateProjectState } = await import("./state-migrate-BeBW0KXA.js");
|
|
62585
|
+
await migrateProjectState(projectKey, { signal }, project);
|
|
62422
62586
|
},
|
|
62423
62587
|
clearCache: clearStateMigrationCache,
|
|
62424
62588
|
isGitWorkTree: pathIsGitWorkTree
|
|
@@ -62445,16 +62609,19 @@ function blocked(projectKey, error) {
|
|
|
62445
62609
|
function worktreeBlockReason(status) {
|
|
62446
62610
|
return `The canonical overdeck-state worktree is ${status.status}: ${status.detail}`;
|
|
62447
62611
|
}
|
|
62448
|
-
async function reconcile(projectKey, project, dependencies) {
|
|
62612
|
+
async function reconcile(projectKey, project, dependencies, signal) {
|
|
62449
62613
|
try {
|
|
62450
|
-
if (!(await dependencies.inspect(project)).migrated) {
|
|
62614
|
+
if (!(await dependencies.inspect(project, { signal })).migrated) {
|
|
62451
62615
|
const { repoPath } = resolveInfraRepo(project);
|
|
62452
|
-
if (!await dependencies.isGitWorkTree(repoPath)) return blocked(projectKey, describeUnmigratableProjectPath(projectKey, project, repoPath));
|
|
62453
|
-
await dependencies.migrate(projectKey, project);
|
|
62616
|
+
if (!await dependencies.isGitWorkTree(repoPath, signal)) return blocked(projectKey, describeUnmigratableProjectPath(projectKey, project, repoPath));
|
|
62617
|
+
await dependencies.migrate(projectKey, project, signal);
|
|
62454
62618
|
dependencies.clearCache();
|
|
62455
|
-
if (!(await dependencies.inspect(project)).migrated) return blocked(projectKey, "Migration completed without a valid marker on origin/overdeck-state.");
|
|
62619
|
+
if (!(await dependencies.inspect(project, { signal })).migrated) return blocked(projectKey, "Migration completed without a valid marker on origin/overdeck-state.");
|
|
62456
62620
|
}
|
|
62457
|
-
const worktree = await dependencies.ensureWorktree(project, {
|
|
62621
|
+
const worktree = await dependencies.ensureWorktree(project, {
|
|
62622
|
+
projectKey,
|
|
62623
|
+
signal
|
|
62624
|
+
});
|
|
62458
62625
|
if (worktree.status === "dirty" || worktree.status === "error") return blocked(projectKey, worktreeBlockReason(worktree));
|
|
62459
62626
|
if (worktree.status === "legacy") return blocked(projectKey, "The remote migration marker is valid but the local state worktree still resolves to the legacy project checkout.");
|
|
62460
62627
|
return {
|
|
@@ -62463,6 +62630,7 @@ async function reconcile(projectKey, project, dependencies) {
|
|
|
62463
62630
|
worktree: worktree.status
|
|
62464
62631
|
};
|
|
62465
62632
|
} catch (error) {
|
|
62633
|
+
signal.throwIfAborted();
|
|
62466
62634
|
return blocked(projectKey, error);
|
|
62467
62635
|
}
|
|
62468
62636
|
}
|
|
@@ -62471,12 +62639,39 @@ async function reconcile(projectKey, project, dependencies) {
|
|
|
62471
62639
|
* state. Concurrent dashboard/CLI callers on this process share one attempt;
|
|
62472
62640
|
* the migration command supplies the cross-process lock and no-loss gates.
|
|
62473
62641
|
*/
|
|
62474
|
-
function ensureAutomaticStateMigration(projectKey, project, dependencies = defaultDependencies) {
|
|
62475
|
-
|
|
62476
|
-
|
|
62477
|
-
|
|
62478
|
-
|
|
62479
|
-
|
|
62642
|
+
function ensureAutomaticStateMigration(projectKey, project, dependencies = defaultDependencies, signal) {
|
|
62643
|
+
signal?.throwIfAborted();
|
|
62644
|
+
let entry = inFlight.get(projectKey);
|
|
62645
|
+
if (!entry) {
|
|
62646
|
+
const controller = new AbortController();
|
|
62647
|
+
const task = reconcile(projectKey, project, dependencies, controller.signal).finally(() => inFlight.delete(projectKey));
|
|
62648
|
+
entry = {
|
|
62649
|
+
controller,
|
|
62650
|
+
persistentOwner: signal === void 0,
|
|
62651
|
+
waiters: /* @__PURE__ */ new Map(),
|
|
62652
|
+
task
|
|
62653
|
+
};
|
|
62654
|
+
inFlight.set(projectKey, entry);
|
|
62655
|
+
} else if (!signal) entry.persistentOwner = true;
|
|
62656
|
+
if (!signal) return entry.task;
|
|
62657
|
+
const token = Symbol(projectKey);
|
|
62658
|
+
entry.waiters.set(token, false);
|
|
62659
|
+
const maybeAbortSharedMigration = () => {
|
|
62660
|
+
entry?.waiters.set(token, true);
|
|
62661
|
+
if (!entry?.persistentOwner && [...entry.waiters.values()].every(Boolean)) entry.controller.abort(signal.reason);
|
|
62662
|
+
};
|
|
62663
|
+
signal.addEventListener("abort", maybeAbortSharedMigration, { once: true });
|
|
62664
|
+
if (signal.aborted) maybeAbortSharedMigration();
|
|
62665
|
+
return entry.task.then((result) => {
|
|
62666
|
+
signal.throwIfAborted();
|
|
62667
|
+
return result;
|
|
62668
|
+
}, (error) => {
|
|
62669
|
+
signal.throwIfAborted();
|
|
62670
|
+
throw error;
|
|
62671
|
+
}).finally(() => {
|
|
62672
|
+
signal.removeEventListener("abort", maybeAbortSharedMigration);
|
|
62673
|
+
entry?.waiters.delete(token);
|
|
62674
|
+
});
|
|
62480
62675
|
}
|
|
62481
62676
|
function formatAutomaticStateMigrationBlock(result) {
|
|
62482
62677
|
return `State migration for ${result.projectKey} is blocked: ${result.reason} Overdeck will not start pipeline work because that would write permanent state into the legacy project checkout. Resolve the stated prerequisite, then run "pan sync"; do not commit project-root .pan/ or .beads/ files.`;
|
|
@@ -62514,6 +62709,7 @@ function decideDeaconBootGate(migrations) {
|
|
|
62514
62709
|
//#region main.ts
|
|
62515
62710
|
init_issue_service_singleton();
|
|
62516
62711
|
init_tracker_config();
|
|
62712
|
+
init_internal_token();
|
|
62517
62713
|
init_review_status();
|
|
62518
62714
|
init_event_store();
|
|
62519
62715
|
init_activity_logger();
|
|
@@ -62575,7 +62771,7 @@ if (shouldStartStaleCheckRetriggerService()) {
|
|
|
62575
62771
|
}
|
|
62576
62772
|
if (process.env.OVERDECK_MODE === "desktop") (async () => {
|
|
62577
62773
|
try {
|
|
62578
|
-
const { provisionClaudeHooks } = await import("./claude-hooks-provision-
|
|
62774
|
+
const { provisionClaudeHooks } = await import("./claude-hooks-provision-BhwWK-TQ.js");
|
|
62579
62775
|
const result = await provisionClaudeHooks();
|
|
62580
62776
|
if (!result.ok) console.warn(`[overdeck] Claude hook provisioning skipped: ${result.reason}`);
|
|
62581
62777
|
else if (result.changed) console.log(`[overdeck] Claude hooks provisioned: ${result.binariesSynced} scripts, registered ${result.registered.length} hook(s)${result.pruned.length ? `, pruned ${result.pruned.length} stale` : ""}`);
|
|
@@ -62893,7 +63089,7 @@ const handleShutdownSignal = async (signal) => {
|
|
|
62893
63089
|
stopRestartAnnouncer();
|
|
62894
63090
|
await stopDeaconChild().catch((err) => console.warn("[deacon-supervisor] child shutdown failed:", err?.message ?? err));
|
|
62895
63091
|
try {
|
|
62896
|
-
const { killAllGateProcessGroups } = await import("./validation-
|
|
63092
|
+
const { killAllGateProcessGroups } = await import("./validation-DcAgXTQp.js");
|
|
62897
63093
|
const reaped = killAllGateProcessGroups();
|
|
62898
63094
|
if (reaped > 0) console.log(`[overdeck] reaped ${reaped} in-flight gate process group(s)`);
|
|
62899
63095
|
} catch (err) {
|
|
@@ -62948,7 +63144,7 @@ reconcileStaleGitHubBlockers().then((n) => {
|
|
|
62948
63144
|
}
|
|
62949
63145
|
}).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
|
|
62950
63146
|
try {
|
|
62951
|
-
const { resetProcessingToQueued } = await import("./merge-sync-
|
|
63147
|
+
const { resetProcessingToQueued } = await import("./merge-sync-B95_4in_.js");
|
|
62952
63148
|
const resetCount = resetProcessingToQueued();
|
|
62953
63149
|
if (resetCount > 0) {
|
|
62954
63150
|
console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);
|
|
@@ -62970,7 +63166,7 @@ else {
|
|
|
62970
63166
|
console.log("[overdeck] Auto-merge executor started");
|
|
62971
63167
|
}
|
|
62972
63168
|
try {
|
|
62973
|
-
const { reconcileInterruptedVerifications } = await import("./verification-runner-
|
|
63169
|
+
const { reconcileInterruptedVerifications } = await import("./verification-runner-DlJezzef.js");
|
|
62974
63170
|
const interrupted = reconcileInterruptedVerifications();
|
|
62975
63171
|
if (interrupted > 0) console.log(`[overdeck] recovered ${interrupted} orphaned verification worker(s)`);
|
|
62976
63172
|
} catch (err) {
|