@overdeck/desktop 0.46.0 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drizzle/overdeck/0000_overdeck_init.sql +4 -1
- package/package.json +1 -1
- package/server/{acceptance-criteria-CCwFGICj.js → acceptance-criteria-10Ur5Dne.js} +2 -2
- package/server/{advancing-selfheal-De1L-Sb4.js → advancing-selfheal-BNwqxseD.js} +6 -6
- package/server/{agent-gc-CBULruzm.js → agent-gc-C3h9Or3a.js} +5 -5
- package/server/{agent-state-VQk8fY9F.js → agent-state-CYXJVG72.js} +1 -1
- package/server/agent-state-service-C63p_ftq.js +2 -0
- package/server/{agent-state-service-BlnSkRFA.js → agent-state-service-Ds6OeFvo.js} +15 -9
- package/server/{agents-C5rWYhb6.js → agents-J5mEnekq.js} +23 -16
- package/server/{agents-BKKkxKgK.js → agents-ePFVoZbu.js} +1 -1
- package/server/archive-planning-B2XplFzT.js +2 -0
- package/server/{archive-planning-C0lAbNB_.js → archive-planning-BwhxeP7C.js} +10 -6
- package/server/{artifact-index-jobs-ug6ZxIP5.js → artifact-index-jobs-D1q_vR3V.js} +2 -2
- package/server/{assemble-DnffNpOo.js → assemble-Bgwqv-Ro.js} +2 -2
- package/server/{tmux-dedup-DbN6MGzM.js → auto-spawn-consent-CQ9Bi9q6.js} +262 -13
- package/server/{backlog-auto-trigger-Dh-i9PQf.js → backlog-auto-trigger-n1lzPgN4.js} +3 -3
- package/server/{behavior-CfIg6pKp.js → behavior-td6-xhQk.js} +2 -2
- package/server/boot-reconciled-stop-events-C7gGe3oB.js +44 -0
- package/server/{bridge-pool-patrol-CUFmjVDN.js → bridge-pool-patrol-CYH2OLb5.js} +1 -1
- package/server/{briefing-freshness-DHmCSLar.js → briefing-freshness-DRqZ8lAz.js} +2 -2
- package/server/{build-info-CuFfxZxp.js → build-info-7yiEpl6u.js} +3 -3
- package/server/{build-info-BP160gU7.js → build-info-CpG__c63.js} +1 -1
- package/server/{checkpoint-manager-Dxh0FYsv.js → checkpoint-manager-CkKmB0wZ.js} +1 -1
- package/server/{checkpoint-manager-DEWD82qK.js → checkpoint-manager-DBcyNR8w.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-CZvbtLnr.js → checkpoints-D95apurL.js} +2 -2
- package/server/{checkpoints-DMTgXuLG.js → checkpoints-Wm963lm8.js} +1 -1
- package/server/{claude-hooks-provision-CN-xo-do.js → claude-hooks-provision-4RPxNkE8.js} +1 -1
- package/server/{claude-hooks-provision-fvy4RD2b.js → claude-hooks-provision-Bjitl9aI.js} +2 -2
- package/server/{claude-permissions-CN0cSCPp.js → claude-permissions-CpbpvUQ2.js} +2 -2
- package/server/{claude-settings-overlay-Dabi9slj.js → claude-settings-overlay-BzkHYDwR.js} +1 -1
- package/server/{claude-settings-overlay-CJn35FHQ.js → claude-settings-overlay-_H9Yrzab.js} +2 -2
- package/server/cli-CjOCSnfj.js +3 -0
- package/server/{cli-oCWYA1pE.js → cli-Cte9ZFGn.js} +9 -9
- package/server/{cliproxy-C8mB3KuB.js → cliproxy-C5fMJ7rY.js} +2 -2
- package/server/{cliproxy-PGwTX_o8.js → cliproxy-DaAbWMjC.js} +1 -1
- package/server/{close-issue-D5MF5GqF.js → close-issue-BPh1ARCF.js} +5 -5
- package/server/{closed-issue-reaper-CJ24u0Zt.js → closed-issue-reaper-DHRfRMrp.js} +1 -1
- package/server/{closed-issue-reaper-Cltx86x5.js → closed-issue-reaper-DoOZqGFK.js} +62 -12
- package/server/{codex-Drlf5Xhf.js → codex-BzGDW_d3.js} +6 -6
- package/server/{codex-BdEsUFWh.js → codex-o8FJwzmy.js} +1 -1
- package/server/{codex-parser-DpB89Vqa.js → codex-parser-Dt-ycU8L.js} +2 -2
- package/server/{compaction-continuation-K2AxQX4H.js → compaction-continuation-CvXpbZ4w.js} +3 -3
- package/server/{config-B2IMcBxx.js → config-Bi3u1VK7.js} +2 -2
- package/server/{config-Dr3pW6w6.js → config-BvLe652W.js} +2 -2
- package/server/{config-DV-grfQc.js → config-CL3Gyvja.js} +1 -1
- package/server/{config-yaml-CmOPzmBb.js → config-yaml-CxdwhAIA.js} +10 -2
- package/server/conflict-gate-CX80JYYS.js +3 -0
- package/server/{conflict-gate-B9cN3SBi.js → conflict-gate-E4nt7ZeS.js} +59 -13
- package/server/{context-layers-dR5YxHYB.js → context-layers-C_IIysnm.js} +3 -3
- package/server/{context-layers-D6LZo3l1.js → context-layers-DAG83UZt.js} +2 -2
- package/server/{control-settings-C7DUehE1.js → control-settings-CiqGxXnc.js} +13 -6
- package/server/{conversation-compaction-Dj4FAKoZ.js → conversation-compaction-BE3CNtHF.js} +1 -1
- package/server/{conversation-compaction-BoqdDXWF.js → conversation-compaction-D6-yLtqt.js} +8 -8
- package/server/{conversation-service-5aCnq1zR.js → conversation-service-DBxoYMDl.js} +8 -7
- package/server/{conversation-service-BCxl4f8Z.js → conversation-service-D_TS2b1r.js} +1 -1
- package/server/{conversations-C34dyIb9.js → conversations-BKDVpB-3.js} +1 -1
- package/server/{conversations-BUpYsOZg.js → conversations-D0UEdLtk.js} +4 -4
- package/server/{cost-CvxRrucd.js → cost-DS1s0DbG.js} +3 -3
- package/server/{cost-Bgcub5kW.js → cost-DpgYmYqR.js} +2 -2
- package/server/{cost-sync-Dv3LUaNW.js → cost-sync-tOCCGnEt.js} +3 -3
- package/server/{dag-ombYYt4s.js → dag-BtkgLeqY.js} +2 -2
- package/server/{dangerous-git-ops-BcJPC5Rr.js → dangerous-git-ops-CFLykHWt.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-DrXqT9LQ.js → deacon-BIblC-WX.js} +3 -3
- package/server/{deacon-nudge-log-BNBebzeL.js → deacon-nudge-log-B08gF0mh.js} +3 -3
- package/server/{deacon-hi9KLPLT.js → deacon-pLRLbPvR.js} +548 -176
- package/server/{deacon-pending-lifecycle-Cpk0k7Hi.js → deacon-pending-lifecycle-B-Io84AP.js} +3 -3
- package/server/deacon-swarm-B1XkIvfr.js +2 -0
- package/server/{deacon-swarm-DBxUaO-A.js → deacon-swarm-v5PMun-m.js} +15 -14
- package/server/deacon.js +8 -8
- package/server/{dead-end-trip-CQcP70ND.js → dead-end-trip-D8A3msX9.js} +3 -3
- package/server/{delivery-Da0zEMY4.js → delivery-BX9HR4wQ.js} +1 -1
- package/server/{deploy-patrol-Df-Tmaq0.js → deploy-patrol-sYgOxLeb.js} +8 -8
- package/server/{deploy-queue-UjKGYsDe.js → deploy-queue-VfohaPN_.js} +2 -2
- package/server/{deploy-queue-9SrhZR63.js → deploy-queue-gHJBycaF.js} +1 -1
- package/server/{deploy-window-jOiPRHL0.js → deploy-window-CFRZ0-kt.js} +1 -1
- package/server/{deploy-window-rpqpWqHA.js → deploy-window-D4DQb8VP.js} +6 -6
- package/server/{dev-supervisor-CC46Ig8q.js → dev-supervisor-DiOBDM1c.js} +2 -2
- package/server/{devcontainer-renderer-68CSCRnu.js → devcontainer-renderer-BUOIlfgD.js} +3 -3
- package/server/dist-B3YPQa5A.js +3 -0
- package/server/{dist-CJy72uEg.js → dist-C3A8B8wM.js} +1 -1
- package/server/{dist-src-Bik83hFi.js → dist-src-C0adpegX.js} +1 -1
- package/server/{docker-Dam7mbIB.js → docker-BJzlkqYB.js} +2 -2
- package/server/{docker-BMVTSFL5.js → docker-Y3PElJb0.js} +1 -1
- package/server/{dod-Dar-yheg.js → dod-DlNtcH6n.js} +26 -5
- package/server/{durable-review-pipeline-CGZ5QBxh.js → durable-review-pipeline-Cibps-Rg.js} +5 -2
- package/server/durable-review-pipeline-DP6bIcOY.js +3 -0
- package/server/{ensure-devcontainer-B057YA81.js → ensure-devcontainer-BAofzBPv.js} +4 -4
- package/server/{ensure-devcontainer-C98V8yW-.js → ensure-devcontainer-DMAbWqtQ.js} +1 -1
- package/server/{esm-shims-Br9BPdkR.js → esm-shims-BeObUkaw.js} +1 -1
- package/server/{event-store-ELqkVOn0.js → event-store-5UKzh9Jf.js} +1 -1
- package/server/{event-store-zY5MJHgF.js → event-store-CrHcVC5_.js} +3 -3
- package/server/{events-D9PR1IC0.js → events-BNrvchBg.js} +3 -3
- package/server/{events-D6pyqhzM.js → events-CF8QDbuV.js} +1 -1
- package/server/{factory-CRoOpGsF.js → factory-Cmm9Hsho.js} +5 -5
- package/server/{feature-registry-population--YUXU999.js → feature-registry-population-B6HpNWRy.js} +4 -4
- package/server/{feature-registry-storage-BORBTo0y.js → feature-registry-storage-DJEFx1Pf.js} +2 -2
- package/server/{features--nFkJY8v.js → features-D5km80UI.js} +2 -2
- package/server/{feedback-target-C0ZzyHvU.js → feedback-target-BJ5ZADsu.js} +1 -1
- package/server/{feedback-target-Dt9BsapX.js → feedback-target-DSxEL6lP.js} +7 -7
- package/server/{feedback-writer-BG0RUZiu.js → feedback-writer-C27Hak8a.js} +5 -5
- package/server/{feedback-writer-D1fm-5Z8.js → feedback-writer-CoB9Z6aU.js} +1 -1
- package/server/{flywheel-BiT3odRb.js → flywheel-BHx8XuMr.js} +38 -19
- package/server/{flywheel-BekukH4i.js → flywheel-DZZdtiOL.js} +1 -1
- package/server/{flywheel-CLVB55Be.js → flywheel-f662Q-y2.js} +14 -14
- package/server/{flywheel-merge-order-BJv1DZz1.js → flywheel-merge-order-D_xLMbJU.js} +7 -7
- package/server/{flywheel-merge-order-BKw9o6ku.js → flywheel-merge-order-Dil0LmdN.js} +1 -1
- package/server/forge-B5o319qI.js +3 -0
- package/server/{forge-CZbSg6Ds.js → forge-BaKGCya6.js} +2 -2
- package/server/{from-D_4_dk7i.js → from-B3tZbB55.js} +1 -1
- package/server/fs-lock-Bre3sGoz.js +130 -0
- package/server/{fts-db-BeOomFa-.js → fts-db-IVc4_M3f.js} +2 -2
- package/server/{fts-operations-BdewJ_g9.js → fts-operations-B9jG8wa3.js} +2 -2
- package/server/{git-utils-ameCgDdy.js → git-utils-CsvYfJU3.js} +4 -4
- package/server/{git-utils-CI6cwyyC.js → git-utils-Xg4PFN45.js} +1 -1
- package/server/{github-app-DtAsvwzK.js → github-app-Bmg4R9mv.js} +1 -1
- package/server/{github-app-CQ1Lo6LA.js → github-app-CmNk0zLU.js} +2 -2
- package/server/{github-client-Cj0yl_07.js → github-client-B6KM9_wA.js} +1 -1
- package/server/{github-client-BfyDxuRN.js → github-client-qazkPrg0.js} +3 -3
- package/server/{github-pr-lookup-BDq6Wznz.js → github-pr-lookup-DAcVeRLK.js} +2 -2
- package/server/{harness-binary-DqkftwTb.js → harness-binary-BSpiXaLw.js} +2 -2
- package/server/{harness-resolve-CqMqM1Mb.js → harness-resolve-BAJu5MX8.js} +4 -4
- package/server/{health-events-_xfTaOUs.js → health-events-2Z6Wa9SM.js} +1 -1
- package/server/{health-events-CazRxJUS.js → health-events-BwX32k8d.js} +2 -2
- package/server/{hooks-BnJsxlSq.js → hooks-D1g1jKLI.js} +1 -1
- package/server/{hooks-BO3QT1sn.js → hooks-DbtbimEf.js} +2 -2
- package/server/{hume-CDYJxqx-.js → hume-DXNiu6nQ.js} +2 -2
- package/server/hume-VUCNbTgn.js +3 -0
- package/server/{idle-stack-reaper-BYqERdkE.js → idle-stack-reaper-CRA1e0jr.js} +1 -1
- package/server/{idle-stack-reaper-CnGx_PO_.js → idle-stack-reaper-Cy-dQzW4.js} +2 -2
- package/server/{in-flight-guard-Bq3epG58.js → in-flight-guard-D-sSkADM.js} +1 -1
- package/server/{infra-BjuxvjdS.js → infra-BDQDRopn.js} +15 -4
- package/server/{injection-UCf8EsjX.js → injection-6AGnXxlj.js} +7 -7
- package/server/{injection-DZxlV2al.js → injection-Bl8d_jHZ.js} +1 -1
- package/server/inspect-agent-CUwVmr2h.js +2 -0
- package/server/{inspect-agent-6kylZnrm.js → inspect-agent-nXdIptyh.js} +12 -12
- package/server/{internal-token-DvMTQSOS.js → internal-token-DzK385vD.js} +2 -2
- package/server/{internal-token-M9omeXM1.js → internal-token-Ias7N8Kg.js} +1 -1
- package/server/{io-VHvc0Ssp.js → io-B00PBNku.js} +4 -4
- package/server/{issue-closed-B6KJkmHZ.js → issue-closed-BehTG1be.js} +8 -8
- package/server/{issue-lifecycle-C4Zj0WmE.js → issue-lifecycle-Birk-ifu.js} +29 -23
- package/server/{issue-lifecycle-9gk3fnXN.js → issue-lifecycle-BqSuQvbn.js} +1 -1
- package/server/{issue-service-singleton-PMx8F1jr.js → issue-service-singleton-B2wXiIlw.js} +1 -1
- package/server/{issue-service-singleton-DmCh7EHj.js → issue-service-singleton-C6ZduvuY.js} +10 -10
- package/server/{issues-CgnQ1OGQ.js → issues-DQ5-LatB.js} +2 -2
- package/server/{jsonl-parser-DJOH_O-w.js → jsonl-parser-BDpnGFCl.js} +3 -3
- package/server/{label-cleanup-Dv7AV_R1.js → label-cleanup-Dwnky8FG.js} +3 -3
- package/server/{lifecycle-DDN8ApVY.js → lifecycle-B3s4sM1G.js} +6 -6
- package/server/{lifecycle-CTdOWYMi.js → lifecycle-B4Xdb4cY.js} +2 -2
- package/server/{lifecycle-io-D_zTLvP1.js → lifecycle-io-CzTHEooc.js} +1 -1
- package/server/{lifecycle-io-D-lGdzK3.js → lifecycle-io-DCo6s6ks.js} +5 -5
- package/server/{linear-client-BQU36QqE.js → linear-client-9uq7fhiV.js} +3 -3
- package/server/{linear-client-CY4O_Tu3.js → linear-client-CnbtHiic.js} +1 -1
- package/server/{linear-mcp-auth-BnU4TYfY.js → linear-mcp-auth-BxUOzswy.js} +5 -5
- package/server/{linear-mcp-auth-NYBq_oHZ.js → linear-mcp-auth-D46fBCLf.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-Bpx4jjht.js → merge-DiW9RdSB.js} +3 -3
- package/server/{merge-agent-DdMVSV2Y.js → merge-agent-BLUgRsz3.js} +31 -31
- package/server/{merge-agent-DrXa1CpW.js → merge-agent-DQTXZk8z.js} +1 -1
- package/server/{merge-batch-C5q1c1GX.js → merge-batch-Cp_j9BGk.js} +1 -1
- package/server/{merge-completeness-BMm8tMyZ.js → merge-completeness-B46KqhtY.js} +4 -4
- package/server/{merge-completeness-D0ljXbk3.js → merge-completeness-BLbB5-6n.js} +1 -1
- package/server/merge-ops-1abz6O_P.js +2 -0
- package/server/merge-rebase-CJJVAJuz.js +2 -0
- package/server/{merge-rebase-xLnMlw5h.js → merge-rebase-DIkBjgwq.js} +2 -2
- package/server/{merge-set-DH7ot3yz.js → merge-set-CBgHfwM0.js} +4 -4
- package/server/{merge-set-DzsOTBg5.js → merge-set-DeUxFsC3.js} +1 -1
- package/server/{merge-idOG--29.js → merge-sr8Nrnmi.js} +1 -1
- package/server/merge-sync-CpGmk6Ch.js +3 -0
- package/server/{merge-sync-CQ-LgZ1_.js → merge-sync-kr4vqyjM.js} +7 -4
- package/server/{merge-train-DTEMyIu4.js → merge-train-Dmrcus12.js} +4 -4
- package/server/{merge-train-deps-CNPJzepw.js → merge-train-deps-D_uGX91G.js} +21 -15
- package/server/{merge-verification-x3JO8Dtz.js → merge-verification-NvaAd8CZ.js} +6 -6
- package/server/{merged-docker-cleanup-worker-Cdi9apm-.js → merged-docker-cleanup-worker-DH_hrGPI.js} +1 -1
- package/server/{merged-docker-cleanup-worker-CTpC27Bs.js → merged-docker-cleanup-worker-Y1R06TEl.js} +3 -3
- package/server/{multipart-parser-IMSBfePV.js → multipart-parser-R-oC8dQg.js} +2 -2
- package/server/{no-resume-mode-C5ULAXwO.js → no-resume-mode-BgD0JUmM.js} +1 -1
- package/server/node_modules/.package-lock.json +4 -4
- package/server/node_modules/@types/node/README.md +1 -1
- package/server/node_modules/@types/node/crypto.d.ts +1 -1
- package/server/node_modules/@types/node/package.json +2 -2
- package/server/{orphan-proposed-reconciler-Dg6U4ADZ.js → orphan-proposed-reconciler-B6vJHxtX.js} +230 -31
- package/server/{orphan-proposed-reconciler-CWmOdM9-.js → orphan-proposed-reconciler-DcgTPPFY.js} +1 -1
- package/server/package-lock.json +5 -5
- package/server/package.json +1 -1
- package/server/{pan-dir-ubraCiUg.js → pan-dir-DMzF5wne.js} +4 -4
- package/server/{paths-cXmOwSbh.js → paths-sJBSb7Ul.js} +2 -2
- package/server/{pending-lifecycle-claim-DEteYdS9.js → pending-lifecycle-claim-DilzGfgk.js} +2 -2
- package/server/persistent-logger-H_VjuOu7.js +57 -0
- package/server/{pickup-D8xtG1J2.js → pickup-DWhqzliO.js} +4 -3
- package/server/{pipeline-membership-BGSvkT2M.js → pipeline-membership-C88VBnhJ.js} +1 -1
- package/server/{pipeline-membership-CrAPLYtf.js → pipeline-membership-D9SBvItj.js} +1 -1
- package/server/{pipeline-membership-gather-DTfcgxLl.js → pipeline-membership-gather-4eR-7Tqy.js} +1 -1
- package/server/{pipeline-membership-gather-CET40frr.js → pipeline-membership-gather-CeVGnNJ2.js} +114 -9
- package/server/{pipeline-notifier-BuQ0e4hF.js → pipeline-notifier-D0ALV6Nw.js} +2 -2
- package/server/{pipeline-notifier-ImNXknf0.js → pipeline-notifier-DT6xLFao.js} +1 -1
- package/server/{post-merge-lifecycle-worker-DbO10pum.js → post-merge-lifecycle-worker-8HIeS_J6.js} +3 -3
- package/server/{project-pipelines-Bim6bThI.js → project-pipelines-9SKt2bEc.js} +2 -2
- package/server/{project-repos-C0nuoBGv.js → project-repos-B5pIphKg.js} +2 -2
- package/server/{project-repos-CRE6Ykow.js → project-repos-DPjOdfPa.js} +1 -1
- package/server/{projects-B03Wr-xc.js → projects-_n3Zui6K.js} +1 -1
- package/server/{prompts-BEx08AIu.js → prompts-CgzMBvQF.js} +2 -2
- package/server/{providers-D7IluJe0.js → providers-BI1mOBQ4.js} +1 -1
- package/server/{providers-evXhiQeg.js → providers-BJQSnAAp.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-D1s4-Sqp.js → chunk-BO2N2NFS-D_pGACYN.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-1gdMoSF7.js → diagram-OG6HWLK6-BO6fe3hH.js} +1 -1
- package/server/public/assets/{dist-DqDRYW6P.js → dist-5zingMiA.js} +3 -3
- package/server/public/assets/{dist-CxAOHbil.js → dist-CVxhbI2E.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-BYex-Ec7.js → ganttDiagram-6RSMTGT7-Bgj4A7kp.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-DlVkiG0S.js → highlighted-body-OFNGDK62-DNPK7_cm.js} +1 -1
- package/server/public/assets/{index-K0hAYCgV.js → index-DEpY-D1O.js} +148 -148
- package/server/public/assets/index-Ddkcz3WT.css +1 -0
- package/server/public/assets/{linear-B4cuEFmO.js → linear-BB0jQT16.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-CBHNBIJQ.js → pieDiagram-4H26LBE5-DeGIzzpZ.js} +1 -1
- package/server/public/assets/{prod-CN2nHBvX.js → prod-XBLvikex.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bom87VOQ.js → quadrantDiagram-W4KKPZXB-BV9SLeWz.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-UrBeyLxk.js → sankeyDiagram-5OEKKPKP-Dwja0gj8.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-DhkbrIxR.js → xychartDiagram-2RQKCTM6-DCB4qvfw.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-DHWiKxo7.js → pull-requests-7BgLDsIo.js} +3 -3
- package/server/{pull-requests-Cv7LxzUN.js → pull-requests-Dq0y6IxE.js} +1 -1
- package/server/{queries-DHJm7bTd.js → queries-C-MUZaIy.js} +266 -155
- package/server/{rally-B71M9f4o.js → rally-CPysR4T_.js} +3 -3
- package/server/rally-D_VW4bJv.js +3 -0
- package/server/{rally-api-Dkqmok65.js → rally-api-8Ptlp2os.js} +2 -2
- package/server/{rally-api-D5uXN08-.js → rally-api-CgosKdKL.js} +1 -1
- package/server/{rally-client-CxsA6ExK.js → rally-client-CCX0hADj.js} +1 -1
- package/server/{rally-client-Bfqm6XI4.js → rally-client-iYMHWQD7.js} +5 -5
- package/server/{reap-terminal-sessions-BQ23nriz.js → reap-terminal-sessions-4Xg9NGA8.js} +2 -2
- package/server/{reap-terminal-sessions-CvmwaqKv.js → reap-terminal-sessions-Qf-9LVQc.js} +2 -2
- package/server/{rebuild-stack-0EEYReVZ.js → rebuild-stack-CMdgaylx.js} +7 -7
- package/server/{rebuild-stack-qeRqHZxH.js → rebuild-stack-DqcOVmJO.js} +2 -2
- package/server/{reconstruct-cache-BbYFsqLa.js → reconstruct-cache-CMZJ_Vjq.js} +9 -8
- package/server/{record-CtroO946.js → record-BTwWhtBb.js} +1 -1
- package/server/{record-update-Z0QCxmMp.js → record-update-DaOKS7Wb.js} +5 -128
- package/server/{record-update-DH6dLJID.js → record-update-DhI7eySG.js} +1 -1
- package/server/{recovery-trip-eJe26h-f.js → recovery-trip-DDH-02ng.js} +2 -2
- package/server/{release-engine-lPUp-MTd.js → release-engine-B2X9AfFC.js} +5 -5
- package/server/{release-set-BwGeyZKX.js → release-set-G4XKyQ8K.js} +3 -3
- package/server/{remote-BCd02Es1.js → remote-BXarMvqf.js} +3 -3
- package/server/{remote-CVGUhXMV.js → remote-CUhyqjXk.js} +3 -3
- package/server/{remote-agents-C_VxssLU.js → remote-agents-Bba-MgSA.js} +17 -8
- package/server/{remote-agents-C1bssi41.js → remote-agents-CLZB3Coc.js} +1 -1
- package/server/{remote-completion-DAB0P706.js → remote-completion-CwAp79EC.js} +13 -13
- package/server/resume-mOREjlYu.js +3 -0
- package/server/{review-agent-CHhI66UP.js → review-agent--pOptAEV.js} +31 -29
- package/server/{review-agent-CD4RCI0Y.js → review-agent-BTCNkq2h.js} +1 -1
- package/server/{review-artifacts-DSMRIfuJ.js → review-artifacts-BNmw8dWE.js} +5 -5
- package/server/{review-context-oFuBbiEE.js → review-context-DFxYOOJW.js} +9 -9
- package/server/{review-convoy-liveness-CpzrcJ5F.js → review-convoy-liveness-BgU_1jJf.js} +2 -2
- package/server/{review-status-yljtTd-q.js → review-status-CGvlA4o_.js} +326 -110
- package/server/review-status-Dma9SFaN.js +3 -0
- package/server/{review-status-emit-CUExtHd5.js → review-status-emit-DURrmGYX.js} +3 -3
- package/server/{review-status-enrichment-QV_hQkgS.js → review-status-enrichment-8NiNXi5W.js} +3 -3
- package/server/{review-status-source-ylw5QZUR.js → review-status-source-BLx_1siH.js} +1 -1
- package/server/{review-status-source-CpvJnvnQ.js → review-status-source-DIk1JSow.js} +1 -1
- package/server/{review-status-sync-483sujRo.js → review-status-sync-0GxOqeqF.js} +11 -6
- package/server/{review-status-sync-NaWvI9Xf.js → review-status-sync-muT-EBp2.js} +1 -1
- package/server/{review-verdict-feedback-BPDn4li_.js → review-verdict-feedback-HwF6ODFy.js} +1 -1
- package/server/{review-verdict-feedback-CELeUinh.js → review-verdict-feedback-xJNdqBnX.js} +23 -9
- package/server/{rollup-DTNvelz9.js → rollup-BQaol5TX.js} +8 -8
- package/server/{rollup-DYZfq1c4.js → rollup-BR4t_wck.js} +1 -1
- package/server/{scanner-CV35oSn4.js → scanner-C-D2cFdX.js} +7 -7
- package/server/{sequence-io-DF_8iuhV.js → sequence-io-Bmf1EZM5.js} +4 -4
- package/server/{sequencer-agent-B2WeCtGi.js → sequencer-agent-CigMyKh2.js} +7 -6
- package/server/server.js +435 -418
- package/server/{service-Br9rpBNA.js → service-CD0DvFvD.js} +88 -59
- package/server/{session-fork-D0LY152N.js → session-fork-B6cQ5eya.js} +2 -2
- package/server/{session-history-BUyK29eq.js → session-history-3ON_IJjm.js} +7 -55
- package/server/settings-CVmWiJ-r.js +2 -0
- package/server/{settings-CvVGqNEs.js → settings-PilbFZAM.js} +2 -2
- package/server/{settings-Bse1Pdcj.js → settings-VN0qOh4U.js} +3 -3
- package/server/{shadow-engineering-BWLa8ODz.js → shadow-engineering-DXvx77oE.js} +3 -3
- package/server/{shadow-state-B4fpKxOO.js → shadow-state-BBk_zacw.js} +2 -2
- package/server/{shadow-state-FV6PHfEW.js → shadow-state-CZBp7pwq.js} +1 -1
- package/server/{shadow-utils-D7asqxOZ.js → shadow-utils-DdZ05AJS.js} +2 -2
- package/server/{ship-log-xplJ8t75.js → ship-log-7kJfjUX2.js} +1 -1
- package/server/{smart-compaction-CPp2Ykf6.js → smart-compaction-8fA5k5XN.js} +1 -1
- package/server/{smart-compaction-D3U_79f-.js → smart-compaction-ByhL9cRS.js} +7 -7
- package/server/{spawn-planning-session-DGfZ5B8D.js → spawn-planning-session-pcF-YeFE.js} +38 -50
- package/server/spawn-planning-session-vLUJoFjy.js +3 -0
- package/server/{specialist-completion-Br48eiDP.js → specialist-completion-B07XjWD2.js} +1 -1
- package/server/{specialist-context-cVbGnTa3.js → specialist-context-DJ-zFyL3.js} +5 -5
- package/server/{specialist-handoff-logger-DK-GTz4s.js → specialist-handoff-logger-aKSxbIgD.js} +2 -2
- package/server/{specialist-logs-Cl5-hqT8.js → specialist-logs-Dae-n52_.js} +3 -3
- package/server/{specialists-CNfYO3G2.js → specialists-6PWdtWcg.js} +298 -180
- package/server/{specialists-Tdezg_6N.js → specialists-Bz-wFT7R.js} +1 -1
- package/server/{specialists-Cicieuzu.js → specialists-DUiExaxb.js} +18 -18
- package/server/{specialists-JHsdU3pA.js → specialists-KR3pKulN.js} +1 -1
- package/server/specs--enInima.js +3 -0
- package/server/{src-CRmCHlma.js → src-B948bGVR.js} +57 -13
- package/server/{src-Ck028hjO.js → src-rac0Mepv.js} +6 -6
- package/server/{src-UWcGe0Ix.js → src-vHy2-oCv.js} +3 -3
- package/server/{stack-health-CJLMrLBl.js → stack-health-BikqHSjn.js} +1 -1
- package/server/{stack-health-DqSqx0zv.js → stack-health-DqLTiEu4.js} +2 -2
- package/server/{stale-task-claims-CYFOUNlT.js → stale-task-claims-Cab_Fo_Z.js} +5 -4
- package/server/{staleness-D47CUJok.js → staleness-C-a5rBxF.js} +1 -1
- package/server/{staleness-BQ-0gMYK.js → staleness-CGTZyp6V.js} +1 -1
- package/server/{state-home-BYV7qZTW.js → state-home-722Dkx92.js} +2 -2
- package/server/{state-mapping-BVldLhBf.js → state-mapping-CybR81Uf.js} +1 -1
- package/server/{state-migrate-CvvBtS0Y.js → state-migrate-2u8wIpoL.js} +4 -4
- package/server/{stuck-remediation-mkLC6G_t.js → stuck-remediation-CC6q3eqQ.js} +24 -23
- package/server/{stuck-remediation-Wt0UVvu1.js → stuck-remediation-r1TJu68G.js} +1 -1
- package/server/{substrate-bug-weights-service-XfLAKnmK.js → substrate-bug-weights-service-CzIyyWFT.js} +3 -3
- package/server/{summary-fork-CD7GOts0.js → summary-fork-BqgmgPDt.js} +2 -2
- package/server/{summary-fork-xiXBnWG9.js → summary-fork-Df2WFijM.js} +8 -8
- package/server/supervisor/{injection-budget-B5SbvDx2.js → injection-budget-Cg_KIb3o.js} +1 -1
- package/server/supervisor/{paths-K3noE4N_.js → paths-BBOnCYlO.js} +10 -2
- package/server/supervisor/pty-supervisor.js +4 -4
- package/server/supervisor/{pty-token-B7lp0ElT.js → pty-token-BbjwEUUM.js} +3 -3
- package/server/supervisor-B4anCCSm.js +2 -0
- package/server/{supervisor-DL788vos.js → supervisor-BxqSpjcN.js} +3 -3
- package/server/{swarm-readiness-BV14DF5N.js → swarm-readiness-DfFxa9-n.js} +3 -3
- package/server/{system-prerequisites-pdWG6ZQs.js → system-prerequisites-ICLSkhhZ.js} +2 -2
- package/server/{teardown-workspace-l2F4_zim.js → teardown-workspace-DRdi_CPa.js} +15 -15
- package/server/{test-agent-queue-qakFIIGz.js → test-agent-queue-A_-p-i0I.js} +8 -7
- package/server/{test-verdict-Gw-btEfb.js → test-verdict-BHgTAwIG.js} +1 -1
- package/server/{test-verdict-BJYDggMm.js → test-verdict-C4i9aqEP.js} +1 -1
- package/server/{tldr-daemon-BKOYB616.js → tldr-daemon-CvWXBhX1.js} +1 -1
- package/server/{tldr-daemon-CBaWkV9k.js → tldr-daemon-wvsU6bKv.js} +2 -2
- package/server/{tmux-B1Wbxz5o.js → tmux-CfDHob9M.js} +174 -4
- package/server/{tmux-DQ6jB76i.js → tmux-Ctk6RV5l.js} +1 -1
- package/server/{token-Cxbk023d.js → token-DrxwytsZ.js} +2 -2
- package/server/{token-util-CLq2MmQt.js → token-util-B48BlCba.js} +1 -1
- package/server/token-util-D411CAq9.js +3 -0
- package/server/{tracker-config-DZ8Zn2nQ.js → tracker-config-BcPMElRB.js} +2 -2
- package/server/{tracker-utils-L0FKtjq2.js → tracker-utils-CJ6BHjcD.js} +2 -2
- package/server/{traefik-connect-bNX6jKkb.js → traefik-connect-DZ6nMYMj.js} +1 -1
- package/server/{tunnel-CjSnHdTc.js → tunnel-Bp-dRHZz.js} +1 -1
- package/server/{tunnel-BAm1XgjG.js → tunnel-DUbUPElU.js} +3 -3
- package/server/{typed-errors-BHhE85Ul.js → typed-errors-CKeoDdU3.js} +1 -1
- package/server/{typed-errors-2BTMxkZq.js → typed-errors-DyjseiB6.js} +1 -1
- package/server/{types-hraoaQIp.js → types-Cm5ASJbq.js} +1 -1
- package/server/{types-q67TYYg5.js → types-Di8wdakq.js} +1 -1
- package/server/{uat-promote-verification-CKB9ZrKC.js → uat-promote-verification-CoJuh7XO.js} +5 -5
- package/server/{uat-train-D5UjcyAa.js → uat-train-4Q0k06CQ.js} +0 -0
- package/server/{uat-train-Cu-4nvbf.js → uat-train-Dewoatps.js} +1 -1
- package/server/{validate-Cxsx5Uz1.js → validate-B0C8p66t.js} +3 -3
- package/server/{validation-VZgJxmqc.js → validation-B_kIRfNe.js} +4 -4
- package/server/{validation-DEaTZafj.js → validation-hVOwQk8T.js} +1 -1
- package/server/{verification-artifact-C85cRTc_.js → verification-artifact-BxlxTiYK.js} +1 -1
- package/server/{verification-artifact-g3yuxQDL.js → verification-artifact-D70AtckY.js} +1 -1
- package/server/{verification-runner-DlZI8yhw.js → verification-runner-Bc3cJvpC.js} +1 -1
- package/server/{verification-runner-KDZIsBj4.js → verification-runner-KZTz6u72.js} +19 -19
- package/server/{vtt-parser-Jr94BF3Y.js → vtt-parser-CE_i3Bcw.js} +1 -1
- package/server/{work-agent-prompt-C-vuP3_J.js → work-agent-prompt-ByrPAzOy.js} +9 -9
- package/server/{workflows-D0oip4eV.js → workflows-D0vP1WrK.js} +113 -43
- package/server/workflows-DtDX08ed.js +2 -0
- package/server/{workspace-BqFg__wH.js → workspace-COWvdibH.js} +1 -1
- package/server/{workspace-C0fH3aek.js → workspace-DQkRPLlQ.js} +3 -3
- package/server/{workspace-anchor-drift-CZKofakh.js → workspace-anchor-drift-DXYIAHzr.js} +4 -4
- package/server/{workspace-anchor-drift-B4gMRHl4.js → workspace-anchor-drift-pwz23TI1.js} +1 -1
- package/server/{workspace-config-B123aZl-.js → workspace-config-BdZM4PvZ.js} +1 -1
- package/server/{workspace-manager-CwO-Hek7.js → workspace-manager-BPgTrG66.js} +13 -13
- package/server/{workspace-manager-CDTKjjdU.js → workspace-manager-C1F3XsnS.js} +1 -1
- package/server/{workspace-metadata-D4M8BM4W.js → workspace-metadata-CdjzAP8x.js} +1 -1
- package/server/{workspace-metadata-CQv00QwK.js → workspace-metadata-DkO_iTLo.js} +2 -2
- package/server/{workspaces-j1e_6aAT.js → workspaces-CRBJikLp.js} +136 -113
- package/sync-sources/skills/pan-merge/SKILL.md +7 -5
- package/sync-sources/skills/pan-release/SKILL.md +57 -0
- package/server/agent-state-service-hZpxIw1E.js +0 -2
- package/server/archive-planning-0FJ6Xd3b.js +0 -2
- package/server/cli-DmXETsw-.js +0 -3
- package/server/conflict-gate-Dh754uyA.js +0 -3
- package/server/deacon-swarm-I2JfX5Tg.js +0 -2
- package/server/dist-DSlxIU1H.js +0 -3
- package/server/durable-review-pipeline-jpgCJZFp.js +0 -3
- package/server/forge-DK3blQb_.js +0 -3
- package/server/hume-Dq--7rOQ.js +0 -3
- package/server/inspect-agent-BVwDrVrz.js +0 -2
- package/server/label-reconciler--F85rufp.js +0 -113
- package/server/merge-ops-DdpTiEMt.js +0 -2
- package/server/merge-rebase-DGQpYJU3.js +0 -2
- package/server/merge-sync-Ca7F5JnQ.js +0 -3
- package/server/public/assets/index-Cc7cnFC4.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +0 -1
- package/server/rally-YDjU513q.js +0 -3
- package/server/resume-u9byntrq.js +0 -3
- package/server/review-status-BZH8h-6W.js +0 -3
- package/server/settings-CdvIF84R.js +0 -2
- package/server/spawn-planning-session-1nFi3gfk.js +0 -2
- package/server/specs-Bt7WJDoC.js +0 -3
- package/server/supervisor-UWiQNK-y.js +0 -2
- package/server/token-util-zlz9U0ki.js +0 -3
- package/server/workflows-CHrx_hcW.js +0 -2
|
@@ -1,52 +1,57 @@
|
|
|
1
1
|
import { i as __require, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { Fr as init_errors, Gn as init_projects, Gr as OVERDECK_HOME, Ir as AGENTS_DIR, Pt as init_record, Yn as listProjectsSync, ar as resolveProjectFromIssueSync, b as DEFAULT_CONFIG$1,
|
|
3
|
-
import { n as init_build_info, t as getBuildInfo } from "./build-info-
|
|
4
|
-
import { n as getDashboardIdentity, t as recordDeaconNudge } from "./deacon-nudge-log-
|
|
2
|
+
import { Fr as init_errors, Gn as init_projects, Gr as OVERDECK_HOME, Ir as AGENTS_DIR, Pt as init_record, Yn as listProjectsSync, Zn as loadProjectsConfigSync, ar as resolveProjectFromIssueSync, b as DEFAULT_CONFIG$1, dn as reconcileStatePlaneDrift, f as loadConfigSync, hn as init_state_plane, li as init_paths, ln as init_auto_commit, mn as getMainDivergence, or as resolveProjectPath, pi as sessionFilePath, s as init_load, x as init_defaults, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CxdwhAIA.js";
|
|
3
|
+
import { n as init_build_info, t as getBuildInfo } from "./build-info-7yiEpl6u.js";
|
|
4
|
+
import { n as getDashboardIdentity, t as recordDeaconNudge } from "./deacon-nudge-log-B08gF0mh.js";
|
|
5
5
|
import { i as emitActivityTtsSync, o as init_activity_logger, r as emitActivityEntrySync } from "./activity-logger-CyteR4JO.js";
|
|
6
|
-
import { i as updateIssueRecord, r as init_record_update } from "./record-update-
|
|
7
|
-
import { A as listPaneValues, B as sendKeysAsync, D as killSession, E as isPaneDead, H as sessionExists, I as querySessionSync, M as listSessionNames, N as listSessions, U as sessionExistsSync, i as capturePane, w as init_tmux, z as sendKeys } from "./tmux-
|
|
8
|
-
import { a as init_event_store, i as initEventStore } from "./event-store-
|
|
9
|
-
import { D as projectLegacySystemHealthSummary, t as init_src } from "./src-
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { c as
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { i as
|
|
19
|
-
import { m as
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import { a as
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import { a as
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import { a as
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import { n as
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import { n as
|
|
43
|
-
import {
|
|
44
|
-
import { n as
|
|
45
|
-
import {
|
|
46
|
-
import { t as
|
|
47
|
-
import {
|
|
48
|
-
import { n as
|
|
49
|
-
import {
|
|
6
|
+
import { i as updateIssueRecord, r as init_record_update } from "./record-update-DaOKS7Wb.js";
|
|
7
|
+
import { A as listPaneValues, B as sendKeysAsync, D as killSession, E as isPaneDead, H as sessionExists, I as querySessionSync, M as listSessionNames, N as listSessions, U as sessionExistsSync, i as capturePane, w as init_tmux, z as sendKeys } from "./tmux-CfDHob9M.js";
|
|
8
|
+
import { a as init_event_store, i as initEventStore } from "./event-store-CrHcVC5_.js";
|
|
9
|
+
import { D as projectLegacySystemHealthSummary, t as init_src } from "./src-B948bGVR.js";
|
|
10
|
+
import { B as reviewGatesPassedSync, C as setReviewStatusSync, H as findBlockingFindings, K as readJournalStatusSync, R as init_review_dispatch_decision, U as init_review_findings, W as init_review_status_record_sync, d as getReviewStatusSync, h as loadReviewStatuses, p as init_review_status, z as needsReviewDispatch } from "./review-status-CGvlA4o_.js";
|
|
11
|
+
import { n as logAgentLifecycleSync, r as logDeaconEventSync, t as init_persistent_logger } from "./persistent-logger-H_VjuOu7.js";
|
|
12
|
+
import { c as listAllAgentsSync, d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-J5mEnekq.js";
|
|
13
|
+
import { $n as getAgentDir, Br as saveAgentRuntimeState, Bt as init_transcript_landing, Ct as resetPatrolDispatchBudget, Et as workResumeSlotsAvailable, G as resumeAgent, Gr as init_codex_auth, J as isContextOverflowTail, K as init_context_overflow, Kr as paneShowsCodexAuthBurn, Ln as buildResumeContinueMessage, Lr as getAgentRuntimeState, Ot as init_memory_verdict_cache, Pt as deliverInitialPromptWithRetry, Rr as getAgentRuntimeStateSync, Ur as applyCodexAuthBurnFlag, X as messageAgent, Xn as clearAgentTroubledSync, Y as init_messaging, Zn as clearYieldForResumeSync, _ as init_linux, _r as saveAgentStateSync, _t as describeRunningAgents, a as listRunningAgentsSync, b as init_agents$1, br as setAgentYieldedSync, bt as init_concurrency, c as getRuntimeCensus, fr as recordAgentFailure, ft as init_termination, g as LINUX_MEMORY_PRESSURE_DEFAULTS, gr as saveAgentState, h as init_collector, hr as resetAgentFailureCount, ht as countRunningAgents, i as listRunningAgents, ir as init_agent_state, kt as setCachedMemoryVerdict, lr as markAgentRunningState, m as createHostHealthCollector, n as init_queries, pt as stopAgent, r as listAgentStates, rr as getAgentStateSync, s as descendantPidsForSession, tr as getAgentState, u as init_runtime_census, v as DARWIN_MEMORY_PRESSURE_DEFAULTS, wt as tryReserveAdvancingSlot, xt as releaseAdvancingSlot, y as init_darwin, yr as setAgentPausedSync, yt as getConcurrencyLimits, zr as init_runtime_state, zt as captureTranscriptUserRecordSnapshot } from "./queries-C-MUZaIy.js";
|
|
14
|
+
import { o as getRuntimeSnapshot, s as init_agent_runtime_mirror } from "./session-history-3ON_IJjm.js";
|
|
15
|
+
import { n as resolveGitHubIssueSync, t as init_tracker_utils } from "./tracker-utils-CJ6BHjcD.js";
|
|
16
|
+
import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-DzK385vD.js";
|
|
17
|
+
import { c as init_review_status_sync, l as markWorkspaceStuck } from "./review-status-sync-0GxOqeqF.js";
|
|
18
|
+
import { i as readReviewStatusMap, n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-DIk1JSow.js";
|
|
19
|
+
import { _ as markMerged, c as init_merge_sync, f as listActiveAutoMerges, m as listProblemAutoMerges, t as cancelPending } from "./merge-sync-kr4vqyjM.js";
|
|
20
|
+
import { i as init_merge_set, r as getMergeSetSync } from "./merge-set-CBgHfwM0.js";
|
|
21
|
+
import { m as readWorkspacePlanSync, o as init_io } from "./io-B00PBNku.js";
|
|
22
|
+
import { f as init_config, m as loadConfigSync$1, p as loadConfig$1 } from "./config-BvLe652W.js";
|
|
23
|
+
import { D as setSetting, O as stampBootReconciliation, _ as setBootReconciliationGrace, c as init_control_settings, g as setBootReconciliationDecision, o as getLastCleanShutdownAt, r as getBootReconciliationState, s as getSetting, u as isDeaconGloballyPaused } from "./control-settings-CiqGxXnc.js";
|
|
24
|
+
import { d as init_docker_stats, u as DockerStatsCollector } from "./stack-health-DqLTiEu4.js";
|
|
25
|
+
import { l as init_dag, o as getDispatchableItems } from "./dag-BtkgLeqY.js";
|
|
26
|
+
import { a as loadCloisterConfigSync, i as loadCloisterConfig, r as init_config$1 } from "./config-Bi3u1VK7.js";
|
|
27
|
+
import { a as findRecreatedLegacyStatePaths, o as init_state_home } from "./state-home-722Dkx92.js";
|
|
28
|
+
import { M as withConcurrencyLimit, j as init_concurrency$1 } from "./github-app-CmNk0zLU.js";
|
|
29
|
+
import { a as isAgentIdleForNudge, t as checkStuckAgentRemediation } from "./stuck-remediation-CC6q3eqQ.js";
|
|
30
|
+
import { n as __filename, r as init_esm_shims } from "./esm-shims-BeObUkaw.js";
|
|
31
|
+
import { i as init_staleness, r as computeBuildStaleness } from "./staleness-C-a5rBxF.js";
|
|
32
|
+
import { a as pidsWithCwdUnder, i as sweepAutoCloseOutCache, n as pruneTerminalStoppedAgents, r as getAutoCloseOutCanonicalState } from "./agent-gc-C3h9Or3a.js";
|
|
33
|
+
import { n as init_issue_closed, r as isIssueClosed } from "./issue-closed-BehTG1be.js";
|
|
34
|
+
import { n as getForgeAdapter, r as init_forge } from "./forge-BaKGCya6.js";
|
|
35
|
+
import { a as observeForgeMergeState, i as init_merge_completeness } from "./merge-completeness-B46KqhtY.js";
|
|
36
|
+
import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-C27Hak8a.js";
|
|
37
|
+
import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-DSxEL6lP.js";
|
|
38
|
+
import { a as init_review_monitor, i as REVIEW_SUB_ROLES, n as init_review_convoy_liveness, r as reviewTimestampMs, t as evaluateReviewConvoyLiveness } from "./review-convoy-liveness-BgU_1jJf.js";
|
|
39
|
+
import { J as parseReviewerSessionName, U as getTmuxSessionName, g as getAllProjectSpecialistStatuses, t as init_specialists } from "./specialists-DUiExaxb.js";
|
|
40
|
+
import { a as inferBranchFromWorkspace, i as findWorkspacePath } from "./archive-planning-BwhxeP7C.js";
|
|
41
|
+
import { n as init_merge_verification, r as shouldSkipDispatchAsMerged } from "./merge-verification-NvaAd8CZ.js";
|
|
42
|
+
import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-xJNdqBnX.js";
|
|
43
|
+
import { _ as init_label_reconciler, a as gatherProjectLensSignals, s as init_pipeline_membership_gather, v as reconcilePipelineLabelsPatrol } from "./pipeline-membership-gather-CeVGnNJ2.js";
|
|
44
|
+
import { n as init_pipeline_membership, r as resolvePipelineMembership } from "./pipeline-membership-D9SBvItj.js";
|
|
45
|
+
import { i as init_conflict_gate, o as probeBranchConflictPaths } from "./conflict-gate-E4nt7ZeS.js";
|
|
46
|
+
import { n as reconcileTraefikNetworks, t as init_traefik_connect } from "./traefik-connect-DZ6nMYMj.js";
|
|
47
|
+
import { g as decideAgentAutonomousRedrive, r as coordinateSwarmSlots, y as listFeatureWorkspaces } from "./deacon-swarm-v5PMun-m.js";
|
|
48
|
+
import { n as isExplicitNoResumeRequest, t as init_no_resume_mode } from "./no-resume-mode-BgD0JUmM.js";
|
|
49
|
+
import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-D-sSkADM.js";
|
|
50
|
+
import { r as reconcileClosedIssueAgents } from "./closed-issue-reaper-DoOZqGFK.js";
|
|
51
|
+
import { t as recordDeadEndNeedsYou } from "./dead-end-trip-D8A3msX9.js";
|
|
52
|
+
import { a as spawnWorkAgentThroughAgentsEndpoint, i as reconcileOrphanProposedSpecs, o as triggerRebuildAndStart } from "./orphan-proposed-reconciler-B6vJHxtX.js";
|
|
53
|
+
import { n as reconcileIdleWorkspaceStacks } from "./idle-stack-reaper-Cy-dQzW4.js";
|
|
54
|
+
import { i as readTestVerdictArtifact, n as decideUnsignaledTestAction, r as init_test_verdict } from "./test-verdict-C4i9aqEP.js";
|
|
50
55
|
import { createRequire } from "node:module";
|
|
51
56
|
import { join } from "node:path";
|
|
52
57
|
import { Effect } from "effect";
|
|
@@ -67,15 +72,20 @@ init_paths();
|
|
|
67
72
|
init_errors();
|
|
68
73
|
init_activity_logger();
|
|
69
74
|
init_projects();
|
|
75
|
+
init_state_plane();
|
|
76
|
+
init_auto_commit();
|
|
77
|
+
init_record();
|
|
70
78
|
init_tmux();
|
|
71
79
|
init_src();
|
|
80
|
+
init_persistent_logger();
|
|
72
81
|
init_agents();
|
|
73
82
|
init_agent_runtime_mirror();
|
|
74
|
-
init_persistent_logger();
|
|
75
83
|
init_tracker_utils();
|
|
76
84
|
init_review_status_sync();
|
|
77
85
|
init_review_status_source();
|
|
86
|
+
init_merge_sync();
|
|
78
87
|
init_merge_set();
|
|
88
|
+
init_review_status_record_sync();
|
|
79
89
|
init_review_dispatch_decision();
|
|
80
90
|
init_review_status();
|
|
81
91
|
init_codex_auth();
|
|
@@ -22432,7 +22442,7 @@ function acceptedReasons(state, hostReasons, agents, services) {
|
|
|
22432
22442
|
//#endregion
|
|
22433
22443
|
//#region services/system-health-service.ts
|
|
22434
22444
|
init_review_status_source();
|
|
22435
|
-
const execAsync$
|
|
22445
|
+
const execAsync$4 = promisify(exec);
|
|
22436
22446
|
const KB = 1024;
|
|
22437
22447
|
const GIB$1 = 1024 ** 3;
|
|
22438
22448
|
function parseMemoryPsi(content) {
|
|
@@ -22560,7 +22570,7 @@ async function readProcMemoryDarwin() {
|
|
|
22560
22570
|
let memAvailable = freemem$1();
|
|
22561
22571
|
let memFree = freemem$1();
|
|
22562
22572
|
try {
|
|
22563
|
-
const { stdout } = await execAsync$
|
|
22573
|
+
const { stdout } = await execAsync$4("vm_stat", {
|
|
22564
22574
|
encoding: "utf-8",
|
|
22565
22575
|
timeout: 5e3
|
|
22566
22576
|
});
|
|
@@ -22580,7 +22590,7 @@ async function readProcMemoryDarwin() {
|
|
|
22580
22590
|
let swapTotal = 0;
|
|
22581
22591
|
let swapFree = 0;
|
|
22582
22592
|
try {
|
|
22583
|
-
const { stdout } = await execAsync$
|
|
22593
|
+
const { stdout } = await execAsync$4("sysctl -n vm.swapusage", {
|
|
22584
22594
|
encoding: "utf-8",
|
|
22585
22595
|
timeout: 5e3
|
|
22586
22596
|
});
|
|
@@ -23148,11 +23158,10 @@ async function assessMemoryPressure() {
|
|
|
23148
23158
|
}
|
|
23149
23159
|
//#endregion
|
|
23150
23160
|
//#region ../../lib/cloister/agent-grace.ts
|
|
23151
|
-
init_state_plane();
|
|
23152
|
-
init_auto_commit();
|
|
23153
|
-
init_record();
|
|
23154
23161
|
init_record_update();
|
|
23155
23162
|
init_internal_token();
|
|
23163
|
+
init_review_findings();
|
|
23164
|
+
init_control_settings();
|
|
23156
23165
|
const WORK_LAUNCHER_GRACE_MS = 12e4;
|
|
23157
23166
|
function isStartingWithinGrace(state, now = Date.now(), graceMs = WORK_LAUNCHER_GRACE_MS) {
|
|
23158
23167
|
if (state.status !== "starting") return false;
|
|
@@ -23202,7 +23211,7 @@ async function checkInspectAgentTimeouts(now = /* @__PURE__ */ new Date()) {
|
|
|
23202
23211
|
console.warn(`[deacon] Failed to kill inspect session ${sessionName}: ${msg}`);
|
|
23203
23212
|
});
|
|
23204
23213
|
try {
|
|
23205
|
-
const { messageAgent } = await import("./agents-
|
|
23214
|
+
const { messageAgent } = await import("./agents-ePFVoZbu.js");
|
|
23206
23215
|
await messageAgent(`agent-${issueId.toLowerCase()}`, verdict, "deacon:inspect-watchdog");
|
|
23207
23216
|
} catch (err) {
|
|
23208
23217
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -23396,7 +23405,7 @@ async function maybeProactivelyCompactContext(sessionName, now) {
|
|
|
23396
23405
|
if (!agentState?.workspace || !sessionId || !agentState.model) return null;
|
|
23397
23406
|
let usage = null;
|
|
23398
23407
|
try {
|
|
23399
|
-
const { computeContextUsage } = await import("./conversation-service-
|
|
23408
|
+
const { computeContextUsage } = await import("./conversation-service-D_TS2b1r.js");
|
|
23400
23409
|
usage = await computeContextUsage(sessionFilePath(agentState.workspace, sessionId), agentState.model);
|
|
23401
23410
|
} catch {
|
|
23402
23411
|
return null;
|
|
@@ -23495,9 +23504,9 @@ async function checkApiErrorAgents() {
|
|
|
23495
23504
|
}
|
|
23496
23505
|
if (!tmuxOutput.includes("❯")) continue;
|
|
23497
23506
|
try {
|
|
23498
|
-
const { maybeContinueCompactedAgent } = await import("./compaction-continuation-
|
|
23499
|
-
const { findLastCompactBoundary } = await import("./conversation-service-
|
|
23500
|
-
const { deliverAgentMessage } = await import("./delivery-
|
|
23507
|
+
const { maybeContinueCompactedAgent } = await import("./compaction-continuation-CvXpbZ4w.js");
|
|
23508
|
+
const { findLastCompactBoundary } = await import("./conversation-service-D_TS2b1r.js");
|
|
23509
|
+
const { deliverAgentMessage } = await import("./delivery-BX9HR4wQ.js");
|
|
23501
23510
|
const continued = await maybeContinueCompactedAgent({
|
|
23502
23511
|
agentId: sessionName,
|
|
23503
23512
|
tmuxOutput,
|
|
@@ -23548,13 +23557,13 @@ async function checkApiErrorAgents() {
|
|
|
23548
23557
|
const st = getAgentStateSync(sessionName);
|
|
23549
23558
|
const sid = st?.sessionId ?? runtimeState?.claudeSessionId;
|
|
23550
23559
|
if (st?.workspace && sid && st.model) {
|
|
23551
|
-
const { computeContextUsage } = await import("./conversation-service-
|
|
23560
|
+
const { computeContextUsage } = await import("./conversation-service-D_TS2b1r.js");
|
|
23552
23561
|
const usage = await computeContextUsage(sessionFilePath(st.workspace, sid), st.model);
|
|
23553
23562
|
if (usage && usage.percentUsed < 85) recoveredPct = usage.percentUsed;
|
|
23554
23563
|
}
|
|
23555
23564
|
} catch {}
|
|
23556
23565
|
if (recoveredPct !== null) {
|
|
23557
|
-
const { clearWorkspaceStuck } = await import("./review-status-sync-
|
|
23566
|
+
const { clearWorkspaceStuck } = await import("./review-status-sync-muT-EBp2.js");
|
|
23558
23567
|
clearWorkspaceStuck(issueId);
|
|
23559
23568
|
stuckOverflowNativeRecoveryState.delete(sessionName);
|
|
23560
23569
|
actions.push(`Context overflow recovery: cleared stuck flag for ${sessionName} (context back to ${Math.round(recoveredPct)}%)`);
|
|
@@ -23570,7 +23579,7 @@ async function checkApiErrorAgents() {
|
|
|
23570
23579
|
rec.attempts += 1;
|
|
23571
23580
|
rec.lastAttempt = now;
|
|
23572
23581
|
stuckOverflowNativeRecoveryState.set(sessionName, rec);
|
|
23573
|
-
const { resumeAgent } = await import("./agents-
|
|
23582
|
+
const { resumeAgent } = await import("./agents-ePFVoZbu.js");
|
|
23574
23583
|
const recovered = await resumeAgent(sessionName, void 0, { compact: true });
|
|
23575
23584
|
if (recovered.success) {
|
|
23576
23585
|
stuckOverflowNativeRecoveryState.delete(sessionName);
|
|
@@ -23618,7 +23627,7 @@ async function checkApiErrorAgents() {
|
|
|
23618
23627
|
}
|
|
23619
23628
|
const compactAttempts = (ov?.compactAttempts ?? 0) + 1;
|
|
23620
23629
|
if (issueId !== null) {
|
|
23621
|
-
const { resumeAgent } = await import("./agents-
|
|
23630
|
+
const { resumeAgent } = await import("./agents-ePFVoZbu.js");
|
|
23622
23631
|
const resumeResult = await resumeAgent(sessionName, void 0, { compact: true });
|
|
23623
23632
|
contextOverflowRecoveryState.set(sessionName, {
|
|
23624
23633
|
lastAttempt: now,
|
|
@@ -23737,7 +23746,7 @@ function isStuckMergingState(status, now) {
|
|
|
23737
23746
|
}
|
|
23738
23747
|
async function readSpecStatus(projectPath, issueId) {
|
|
23739
23748
|
try {
|
|
23740
|
-
const { findSpecByIssue } = await import("./specs
|
|
23749
|
+
const { findSpecByIssue } = await import("./specs--enInima.js");
|
|
23741
23750
|
return (await Effect.runPromise(findSpecByIssue(projectPath, issueId)))?.status;
|
|
23742
23751
|
} catch {
|
|
23743
23752
|
return;
|
|
@@ -23819,13 +23828,151 @@ async function reconcileStuckMergingStates() {
|
|
|
23819
23828
|
reviewGatesPassed: reviewGatesPassedSync,
|
|
23820
23829
|
setReviewStatus: setReviewStatusSync,
|
|
23821
23830
|
enqueuePostMerge: async (issueId, projectPath, branch) => {
|
|
23822
|
-
const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-
|
|
23831
|
+
const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-8HIeS_J6.js");
|
|
23823
23832
|
return enqueuePostMergeLifecycle(issueId, projectPath, branch);
|
|
23824
23833
|
},
|
|
23825
23834
|
warn: (message) => console.warn(message)
|
|
23826
23835
|
});
|
|
23827
23836
|
}
|
|
23828
23837
|
//#endregion
|
|
23838
|
+
//#region ../../lib/cloister/deacon-auto-merge-reconcile.ts
|
|
23839
|
+
init_forge();
|
|
23840
|
+
init_merge_set();
|
|
23841
|
+
init_projects();
|
|
23842
|
+
const AUTO_MERGE_RECONCILE_COOLDOWN_MS = 600 * 1e3;
|
|
23843
|
+
const UNBOUNDED_ROW_LIMIT = -1;
|
|
23844
|
+
const autoMergeReconcileCooldowns = /* @__PURE__ */ new Map();
|
|
23845
|
+
const autoMergeLastCheckedAt = /* @__PURE__ */ new Map();
|
|
23846
|
+
function groupByIssue(rows) {
|
|
23847
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
23848
|
+
for (const row of rows) {
|
|
23849
|
+
const issueRows = grouped.get(row.issueId) ?? [];
|
|
23850
|
+
issueRows.push(row);
|
|
23851
|
+
grouped.set(row.issueId, issueRows);
|
|
23852
|
+
}
|
|
23853
|
+
return grouped;
|
|
23854
|
+
}
|
|
23855
|
+
function normalizeArtifactUrl(url) {
|
|
23856
|
+
return url.replace(/[?#].*$/, "").replace(/\/+$/, "");
|
|
23857
|
+
}
|
|
23858
|
+
function repositoryFromArtifactUrl(url, forge) {
|
|
23859
|
+
try {
|
|
23860
|
+
const parsed = new URL(url);
|
|
23861
|
+
if (forge === "github" && parsed.hostname.toLowerCase() !== "github.com") return void 0;
|
|
23862
|
+
const marker = forge === "gitlab" ? "/-/merge_requests/" : "/pull/";
|
|
23863
|
+
const markerIndex = parsed.pathname.indexOf(marker);
|
|
23864
|
+
if (markerIndex <= 1) return void 0;
|
|
23865
|
+
return parsed.pathname.slice(1, markerIndex);
|
|
23866
|
+
} catch {
|
|
23867
|
+
return;
|
|
23868
|
+
}
|
|
23869
|
+
}
|
|
23870
|
+
function pruneTracking(activeIssueIds) {
|
|
23871
|
+
for (const issueId of autoMergeReconcileCooldowns.keys()) if (!activeIssueIds.has(issueId)) autoMergeReconcileCooldowns.delete(issueId);
|
|
23872
|
+
for (const issueId of autoMergeLastCheckedAt.keys()) if (!activeIssueIds.has(issueId)) autoMergeLastCheckedAt.delete(issueId);
|
|
23873
|
+
}
|
|
23874
|
+
async function reconcileForgeCandidate(candidate, deps, now) {
|
|
23875
|
+
const { issueId, problemRows, representative, artifactRepo, projectPath } = candidate;
|
|
23876
|
+
autoMergeLastCheckedAt.set(issueId, now);
|
|
23877
|
+
try {
|
|
23878
|
+
const repository = repositoryFromArtifactUrl(representative.prUrl, representative.forge);
|
|
23879
|
+
if (!await deps.getForgeAdapter(representative.forge).findMergedArtifact({
|
|
23880
|
+
sourceBranch: artifactRepo?.sourceBranch ?? `feature/${issueId.toLowerCase()}`,
|
|
23881
|
+
...artifactRepo?.targetBranch ? { targetBranch: artifactRepo.targetBranch } : {},
|
|
23882
|
+
artifactUrl: representative.prUrl,
|
|
23883
|
+
...artifactRepo?.artifactId ? { artifactId: artifactRepo.artifactId } : {},
|
|
23884
|
+
...repository ? { repository } : {},
|
|
23885
|
+
cwd: artifactRepo?.repoPath ?? projectPath
|
|
23886
|
+
})) {
|
|
23887
|
+
autoMergeReconcileCooldowns.set(issueId, now + AUTO_MERGE_RECONCILE_COOLDOWN_MS);
|
|
23888
|
+
return [];
|
|
23889
|
+
}
|
|
23890
|
+
const actions = [];
|
|
23891
|
+
for (const row of problemRows) {
|
|
23892
|
+
if (!deps.markMerged(row.id)) continue;
|
|
23893
|
+
const action = `Reconciled auto-merge row ${row.id} for ${issueId} — forge confirms the merge`;
|
|
23894
|
+
actions.push(action);
|
|
23895
|
+
deps.log(`[deacon] ${action}`);
|
|
23896
|
+
}
|
|
23897
|
+
autoMergeReconcileCooldowns.delete(issueId);
|
|
23898
|
+
return actions;
|
|
23899
|
+
} catch (error) {
|
|
23900
|
+
autoMergeReconcileCooldowns.set(issueId, now + AUTO_MERGE_RECONCILE_COOLDOWN_MS);
|
|
23901
|
+
deps.warn(`[deacon] Auto-merge row reconciliation failed for ${issueId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
23902
|
+
return [];
|
|
23903
|
+
}
|
|
23904
|
+
}
|
|
23905
|
+
async function reconcileAutoMergeRowsWithDeps(deps) {
|
|
23906
|
+
const actions = [];
|
|
23907
|
+
const now = deps.now();
|
|
23908
|
+
let rows;
|
|
23909
|
+
try {
|
|
23910
|
+
rows = [...deps.listProblemAutoMerges(UNBOUNDED_ROW_LIMIT), ...deps.listActiveAutoMerges(UNBOUNDED_ROW_LIMIT).filter((row) => row.status === "pending")];
|
|
23911
|
+
} catch (error) {
|
|
23912
|
+
deps.warn(`[deacon] Auto-merge row reconciliation failed to list rows: ${error instanceof Error ? error.message : String(error)}`);
|
|
23913
|
+
return actions;
|
|
23914
|
+
}
|
|
23915
|
+
const grouped = groupByIssue(rows);
|
|
23916
|
+
pruneTracking(new Set(grouped.keys()));
|
|
23917
|
+
const forgeCandidates = [];
|
|
23918
|
+
for (const [issueId, issueRows] of grouped) {
|
|
23919
|
+
const cooledUntil = autoMergeReconcileCooldowns.get(issueId);
|
|
23920
|
+
if (cooledUntil && now < cooledUntil) continue;
|
|
23921
|
+
try {
|
|
23922
|
+
if (deps.readJournalStatus(issueId)?.durable.closedOut === true) {
|
|
23923
|
+
for (const row of issueRows) {
|
|
23924
|
+
if (!deps.cancelPending(row.id, "auto-merge-reconciler")) continue;
|
|
23925
|
+
const action = `Cancelled closed-out auto-merge row ${row.id} for ${issueId}`;
|
|
23926
|
+
actions.push(action);
|
|
23927
|
+
deps.log(`[deacon] ${action}`);
|
|
23928
|
+
}
|
|
23929
|
+
autoMergeReconcileCooldowns.delete(issueId);
|
|
23930
|
+
autoMergeLastCheckedAt.delete(issueId);
|
|
23931
|
+
continue;
|
|
23932
|
+
}
|
|
23933
|
+
const problemRows = issueRows.filter((row) => row.status === "blocked" || row.status === "failed");
|
|
23934
|
+
if (problemRows.length === 0) continue;
|
|
23935
|
+
const representative = problemRows.reduce((latest, row) => row.id > latest.id ? row : latest);
|
|
23936
|
+
const project = deps.resolveProject(issueId);
|
|
23937
|
+
if (!project) throw new Error(`project resolution failed for ${issueId}`);
|
|
23938
|
+
const artifactUrl = normalizeArtifactUrl(representative.prUrl);
|
|
23939
|
+
const artifactRepo = deps.getMergeSet(issueId)?.repos.find((repo) => repo.forge === representative.forge && repo.artifactUrl !== void 0 && normalizeArtifactUrl(repo.artifactUrl) === artifactUrl);
|
|
23940
|
+
forgeCandidates.push({
|
|
23941
|
+
issueId,
|
|
23942
|
+
problemRows,
|
|
23943
|
+
representative,
|
|
23944
|
+
artifactRepo,
|
|
23945
|
+
projectPath: project.projectPath
|
|
23946
|
+
});
|
|
23947
|
+
} catch (error) {
|
|
23948
|
+
autoMergeReconcileCooldowns.set(issueId, now + AUTO_MERGE_RECONCILE_COOLDOWN_MS);
|
|
23949
|
+
deps.warn(`[deacon] Auto-merge row reconciliation failed for ${issueId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
23950
|
+
}
|
|
23951
|
+
}
|
|
23952
|
+
forgeCandidates.sort((left, right) => {
|
|
23953
|
+
return (autoMergeLastCheckedAt.get(left.issueId) ?? 0) - (autoMergeLastCheckedAt.get(right.issueId) ?? 0) || left.representative.id - right.representative.id;
|
|
23954
|
+
});
|
|
23955
|
+
const batch = forgeCandidates.slice(0, 4);
|
|
23956
|
+
const reconciled = await Promise.all(batch.map((candidate) => reconcileForgeCandidate(candidate, deps, now)));
|
|
23957
|
+
for (const candidateActions of reconciled) actions.push(...candidateActions);
|
|
23958
|
+
return actions;
|
|
23959
|
+
}
|
|
23960
|
+
async function reconcileAutoMergeRows() {
|
|
23961
|
+
return reconcileAutoMergeRowsWithDeps({
|
|
23962
|
+
now: Date.now,
|
|
23963
|
+
listProblemAutoMerges,
|
|
23964
|
+
listActiveAutoMerges,
|
|
23965
|
+
cancelPending,
|
|
23966
|
+
markMerged,
|
|
23967
|
+
readJournalStatus: readJournalStatusSync,
|
|
23968
|
+
getMergeSet: getMergeSetSync,
|
|
23969
|
+
resolveProject: resolveProjectFromIssueSync,
|
|
23970
|
+
getForgeAdapter,
|
|
23971
|
+
log: (message) => console.log(message),
|
|
23972
|
+
warn: (message) => console.warn(message)
|
|
23973
|
+
});
|
|
23974
|
+
}
|
|
23975
|
+
//#endregion
|
|
23829
23976
|
//#region ../../lib/cloister/deacon-merge.ts
|
|
23830
23977
|
init_paths();
|
|
23831
23978
|
init_activity_logger();
|
|
@@ -23836,7 +23983,7 @@ init_tracker_utils();
|
|
|
23836
23983
|
init_merge_set();
|
|
23837
23984
|
init_tmux();
|
|
23838
23985
|
init_config$1();
|
|
23839
|
-
const execAsync$
|
|
23986
|
+
const execAsync$3 = promisify$1(exec);
|
|
23840
23987
|
const execFileAsync$4 = promisify$1(execFile);
|
|
23841
23988
|
const ciRetryMap = /* @__PURE__ */ new Map();
|
|
23842
23989
|
const MERGE_READY_REMINDER_MS = 3600 * 1e3;
|
|
@@ -23926,7 +24073,7 @@ async function reconcileStaleMergeStatus() {
|
|
|
23926
24073
|
].includes(status.mergeStatus ?? "") || ["merging", "failed"].includes(mergeSet?.status ?? "");
|
|
23927
24074
|
let specStatus;
|
|
23928
24075
|
try {
|
|
23929
|
-
const { findSpecByIssue } = await import("./specs
|
|
24076
|
+
const { findSpecByIssue } = await import("./specs--enInima.js");
|
|
23930
24077
|
const spec = await Effect.runPromise(findSpecByIssue(project.projectPath, issueId));
|
|
23931
24078
|
specStatus = spec?.status;
|
|
23932
24079
|
if (spec && (spec.status === "completed" || spec.status === "cancelled")) {
|
|
@@ -23936,7 +24083,7 @@ async function reconcileStaleMergeStatus() {
|
|
|
23936
24083
|
} catch {}
|
|
23937
24084
|
const branch = `feature/${issueId.toLowerCase()}`;
|
|
23938
24085
|
if (postMergeIncomplete) {
|
|
23939
|
-
const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-
|
|
24086
|
+
const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-8HIeS_J6.js");
|
|
23940
24087
|
const action = enqueuePostMergeLifecycle(issueId, project.projectPath, branch);
|
|
23941
24088
|
if (action) actions.push(action);
|
|
23942
24089
|
continue;
|
|
@@ -23948,7 +24095,7 @@ async function reconcileStaleMergeStatus() {
|
|
|
23948
24095
|
} catch {}
|
|
23949
24096
|
if (!isMerged) isMerged = (await observeGitHubBranchMerge(issueId, branch, project.projectPath)).merged;
|
|
23950
24097
|
if (shouldObserveForge && mergeRelevant) try {
|
|
23951
|
-
const observation = await (await import("./merge-completeness-
|
|
24098
|
+
const observation = await (await import("./merge-completeness-BLbB5-6n.js")).observeForgeMergeState(issueId);
|
|
23952
24099
|
const blocker = observation.repos.find((repo) => repo.state === "unverifiable");
|
|
23953
24100
|
if (blocker) {
|
|
23954
24101
|
console.warn(`[deacon] ${issueId}: forge merge state is unverifiable — ${blocker.reason}`);
|
|
@@ -23975,7 +24122,7 @@ async function reconcileStaleMergeStatus() {
|
|
|
23975
24122
|
const msg = `Reconciled stale mergeStatus for ${issueId} — branch ${branch} is merged to main`;
|
|
23976
24123
|
actions.push(msg);
|
|
23977
24124
|
console.log(`[deacon] ${msg}`);
|
|
23978
|
-
const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-
|
|
24125
|
+
const { enqueuePostMergeLifecycle } = await import("./post-merge-lifecycle-worker-8HIeS_J6.js");
|
|
23979
24126
|
const action = enqueuePostMergeLifecycle(issueId, project.projectPath, branch);
|
|
23980
24127
|
if (action) actions.push(action);
|
|
23981
24128
|
}
|
|
@@ -23998,7 +24145,7 @@ const falseMergedReset = /* @__PURE__ */ new Set();
|
|
|
23998
24145
|
async function reconcileFalseMerged() {
|
|
23999
24146
|
const actions = [];
|
|
24000
24147
|
try {
|
|
24001
|
-
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-
|
|
24148
|
+
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-Bmg4R9mv.js");
|
|
24002
24149
|
if (!isGitHubAppConfigured()) return actions;
|
|
24003
24150
|
const statuses = loadReviewStatuses();
|
|
24004
24151
|
for (const [issueId, status] of Object.entries(statuses)) {
|
|
@@ -24043,7 +24190,7 @@ const CLOSED_PR_RECONCILE_COOLDOWN_MS = 600 * 1e3;
|
|
|
24043
24190
|
async function reconcileClosedPrReadyForMerge() {
|
|
24044
24191
|
const actions = [];
|
|
24045
24192
|
try {
|
|
24046
|
-
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-
|
|
24193
|
+
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-Bmg4R9mv.js");
|
|
24047
24194
|
if (!isGitHubAppConfigured()) return actions;
|
|
24048
24195
|
const statuses = loadReviewStatuses();
|
|
24049
24196
|
const now = Date.now();
|
|
@@ -24115,7 +24262,7 @@ const STALE_MERGE_BLOCKER_COOLDOWN_MS = 120 * 1e3;
|
|
|
24115
24262
|
async function reconcileStaleMergeBlockers() {
|
|
24116
24263
|
const actions = [];
|
|
24117
24264
|
try {
|
|
24118
|
-
const { resolveConflictGate, buildRealConflictGateDeps } = await import("./conflict-gate-
|
|
24265
|
+
const { resolveConflictGate, buildRealConflictGateDeps } = await import("./conflict-gate-CX80JYYS.js");
|
|
24119
24266
|
const statuses = loadReviewStatuses();
|
|
24120
24267
|
const now = Date.now();
|
|
24121
24268
|
const deps = buildRealConflictGateDeps();
|
|
@@ -24258,7 +24405,7 @@ async function checkFailedMergeRetry() {
|
|
|
24258
24405
|
if (ciEntry.count === 5) {
|
|
24259
24406
|
console.log(`[deacon] CI check failure for ${issueId} — retries exhausted, notifying work agent`);
|
|
24260
24407
|
const ciNotes = status.mergeNotes || "CI checks are failing on the PR";
|
|
24261
|
-
const { writeFeedbackFile } = await import("./feedback-writer-
|
|
24408
|
+
const { writeFeedbackFile } = await import("./feedback-writer-CoB9Z6aU.js");
|
|
24262
24409
|
const ciFileResult = await Effect.runPromise(writeFeedbackFile({
|
|
24263
24410
|
issueId,
|
|
24264
24411
|
specialist: "merge-agent",
|
|
@@ -24290,7 +24437,7 @@ async function checkFailedMergeRetry() {
|
|
|
24290
24437
|
ciRetryMap.set(issueId, ciEntry);
|
|
24291
24438
|
console.log(`[deacon] CI check failure for ${issueId} — notifying agent to re-submit (attempt ${ciEntry.count}/5)`);
|
|
24292
24439
|
const ciNotes = status.mergeNotes || "CI checks are failing on the PR";
|
|
24293
|
-
const { writeFeedbackFile } = await import("./feedback-writer-
|
|
24440
|
+
const { writeFeedbackFile } = await import("./feedback-writer-CoB9Z6aU.js");
|
|
24294
24441
|
const ciFileResult2 = await Effect.runPromise(writeFeedbackFile({
|
|
24295
24442
|
issueId,
|
|
24296
24443
|
specialist: "merge-agent",
|
|
@@ -24318,7 +24465,7 @@ async function checkFailedMergeRetry() {
|
|
|
24318
24465
|
const lastNudge = timeoutNudgeCooldowns.get(issueIdForFb);
|
|
24319
24466
|
if (!lastNudge || now - lastNudge >= TIMEOUT_NUDGE_COOLDOWN_MS) {
|
|
24320
24467
|
const timeoutNotes = status.mergeNotes;
|
|
24321
|
-
const { writeFeedbackFile } = await import("./feedback-writer-
|
|
24468
|
+
const { writeFeedbackFile } = await import("./feedback-writer-CoB9Z6aU.js");
|
|
24322
24469
|
await Effect.runPromise(writeFeedbackFile({
|
|
24323
24470
|
issueId: issueIdForFb,
|
|
24324
24471
|
specialist: "merge-agent",
|
|
@@ -24423,7 +24570,7 @@ async function autoCloseOut(now = /* @__PURE__ */ new Date()) {
|
|
|
24423
24570
|
} } : {}
|
|
24424
24571
|
};
|
|
24425
24572
|
try {
|
|
24426
|
-
const { closeOut } = await import("./workflows-
|
|
24573
|
+
const { closeOut } = await import("./workflows-DtDX08ed.js");
|
|
24427
24574
|
const result = await Effect.runPromise(closeOut(ctx));
|
|
24428
24575
|
if (!result.success) {
|
|
24429
24576
|
const failed = result.steps.find((step) => !step.success && !step.skipped);
|
|
@@ -24509,13 +24656,13 @@ async function checkFirstCompletionAgents() {
|
|
|
24509
24656
|
if (!agentState?.workspace || !existsSync(agentState.workspace)) continue;
|
|
24510
24657
|
let hasCommits = false;
|
|
24511
24658
|
try {
|
|
24512
|
-
const { stdout: gitLog } = await execAsync$
|
|
24659
|
+
const { stdout: gitLog } = await execAsync$3("git log --oneline -3 2>/dev/null", { cwd: agentState.workspace });
|
|
24513
24660
|
hasCommits = gitLog.trim().length > 0;
|
|
24514
24661
|
} catch {
|
|
24515
24662
|
try {
|
|
24516
24663
|
const subdirs = readdirSync(agentState.workspace, { withFileTypes: true }).filter((d) => d.isDirectory() && !d.name.startsWith("."));
|
|
24517
24664
|
for (const sub of subdirs) try {
|
|
24518
|
-
const { stdout: subLog } = await execAsync$
|
|
24665
|
+
const { stdout: subLog } = await execAsync$3("git log --oneline -3 2>/dev/null", { cwd: join$1(agentState.workspace, sub.name) });
|
|
24519
24666
|
if (subLog.trim().length > 0) {
|
|
24520
24667
|
hasCommits = true;
|
|
24521
24668
|
break;
|
|
@@ -24736,7 +24883,7 @@ async function checkPostReviewCommits() {
|
|
|
24736
24883
|
const actions = [];
|
|
24737
24884
|
try {
|
|
24738
24885
|
const statuses = loadReviewStatuses();
|
|
24739
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
24886
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
24740
24887
|
for (const [issueId, status] of Object.entries(statuses)) {
|
|
24741
24888
|
const isBlocked = status.reviewStatus === "blocked";
|
|
24742
24889
|
if (!isBlocked) blockedReviewDriftObservations.delete(issueId);
|
|
@@ -24766,8 +24913,8 @@ async function checkPostReviewCommits() {
|
|
|
24766
24913
|
if (!project) continue;
|
|
24767
24914
|
const workspacePath = join$1(project.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
24768
24915
|
if (!existsSync(workspacePath)) continue;
|
|
24769
|
-
const { formatAnchorShort, rehydrateHeadAnchor } = await import("./git-utils-
|
|
24770
|
-
const { evaluateWorkspaceAnchorDrift } = await import("./workspace-anchor-drift-
|
|
24916
|
+
const { formatAnchorShort, rehydrateHeadAnchor } = await import("./git-utils-Xg4PFN45.js");
|
|
24917
|
+
const { evaluateWorkspaceAnchorDrift } = await import("./workspace-anchor-drift-pwz23TI1.js");
|
|
24771
24918
|
const verdict = await evaluateWorkspaceAnchorDrift(issueId, workspacePath, rehydrateHeadAnchor(reviewedAnchor));
|
|
24772
24919
|
if (verdict.kind === "unreadable" || verdict.kind === "current") {
|
|
24773
24920
|
blockedReviewDriftObservations.delete(issueId);
|
|
@@ -24817,7 +24964,7 @@ async function checkPostReviewCommits() {
|
|
|
24817
24964
|
actions.push(`Deferred post-review re-dispatch for ${issueId} — advancing-role concurrency ceiling reached`);
|
|
24818
24965
|
logDeaconEventSync(`checkPostReviewCommits: deferred review for ${issueId} — advancing ceiling reached (PAN-1665) — ${describeRunningAgents()}`);
|
|
24819
24966
|
} else if (freshStatus?.reviewStatus === "pending") {
|
|
24820
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
24967
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
|
|
24821
24968
|
const branch = `feature/${issueId.toLowerCase()}`;
|
|
24822
24969
|
const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
24823
24970
|
issueId,
|
|
@@ -25198,7 +25345,7 @@ function reviewConvoyLiveness(issueId) {
|
|
|
25198
25345
|
*/
|
|
25199
25346
|
async function recoverUnhealthyTestStack(issueId, workspacePath) {
|
|
25200
25347
|
const key = issueId.toUpperCase();
|
|
25201
|
-
const { getWorkspaceStackHealth } = await import("./stack-health-
|
|
25348
|
+
const { getWorkspaceStackHealth } = await import("./stack-health-BikqHSjn.js");
|
|
25202
25349
|
const health = await Effect.runPromise(getWorkspaceStackHealth(issueId, { workspacePath }));
|
|
25203
25350
|
if (health.healthy) {
|
|
25204
25351
|
testStackRebuildState.delete(key);
|
|
@@ -25230,7 +25377,7 @@ async function recoverUnhealthyTestStack(issueId, workspacePath) {
|
|
|
25230
25377
|
record.attempts += 1;
|
|
25231
25378
|
testStackRebuildState.set(key, record);
|
|
25232
25379
|
console.log(`[deacon] Test stack for ${key} unhealthy (${health.reasons.join("; ")}) — rebuilding (attempt ${record.attempts}/${TEST_STACK_REBUILD_MAX_ATTEMPTS})`);
|
|
25233
|
-
const { rebuildWorkspaceStack } = await import("./rebuild-stack-
|
|
25380
|
+
const { rebuildWorkspaceStack } = await import("./rebuild-stack-DqcOVmJO.js");
|
|
25234
25381
|
const result = await Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[deacon] ${key} stack rebuild: ${m}`) }));
|
|
25235
25382
|
if (!result.success) {
|
|
25236
25383
|
console.warn(`[deacon] Test stack rebuild failed for ${key}: ${result.error}`);
|
|
@@ -25398,7 +25545,7 @@ async function handleReviewCoordinatorDied(issueId, _sessionName, _reason) {
|
|
|
25398
25545
|
return actions;
|
|
25399
25546
|
}
|
|
25400
25547
|
try {
|
|
25401
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
25548
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
|
|
25402
25549
|
const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
25403
25550
|
issueId,
|
|
25404
25551
|
workspace,
|
|
@@ -25473,7 +25620,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
25473
25620
|
const issueLower = issueId.toLowerCase();
|
|
25474
25621
|
const workspace = getAgentStateSync(`agent-${issueLower}`)?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
|
|
25475
25622
|
if (workspace) try {
|
|
25476
|
-
if ((options.readWorkspaceHead ? await options.readWorkspaceHead(workspace) : await (await import("./git-utils-
|
|
25623
|
+
if ((options.readWorkspaceHead ? await options.readWorkspaceHead(workspace) : await (await import("./git-utils-Xg4PFN45.js")).snapshotWorkspaceHeadsPromise(issueId, workspace)) === status.lastVerifiedCommit) {
|
|
25477
25624
|
setReviewStatusSync(issueId, {
|
|
25478
25625
|
reviewStatus: "pending",
|
|
25479
25626
|
reviewNotes: void 0
|
|
@@ -25495,7 +25642,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
25495
25642
|
if (project) {
|
|
25496
25643
|
const workspacePath = join$1(project.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
25497
25644
|
if (existsSync(workspacePath)) {
|
|
25498
|
-
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
25645
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Xg4PFN45.js");
|
|
25499
25646
|
reviewUpdate["reviewedAtCommit"] = await snapshotWorkspaceHeadsPromise(issueId, workspacePath);
|
|
25500
25647
|
}
|
|
25501
25648
|
}
|
|
@@ -25550,7 +25697,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
25550
25697
|
const workspace = agentState?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
|
|
25551
25698
|
if (workspace && resolved && !tryReserveAdvancingSlot() && !await tryYieldForAdvancingDispatch("review", issueId)) actions.push(`Deferred review re-dispatch for ${issueId} — advancing-role concurrency ceiling reached`);
|
|
25552
25699
|
else if (workspace && resolved) try {
|
|
25553
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
25700
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
|
|
25554
25701
|
const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
25555
25702
|
issueId,
|
|
25556
25703
|
workspace,
|
|
@@ -25575,8 +25722,8 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
25575
25722
|
const workspace = agentState?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
|
|
25576
25723
|
if (workspace && resolved) {
|
|
25577
25724
|
const branch = `feature/${issueLower}`;
|
|
25578
|
-
const { spawnRun } = await import("./agents-
|
|
25579
|
-
const { buildTestRolePrompt } = await import("./test-agent-queue-
|
|
25725
|
+
const { spawnRun } = await import("./agents-ePFVoZbu.js");
|
|
25726
|
+
const { buildTestRolePrompt } = await import("./test-agent-queue-A_-p-i0I.js");
|
|
25580
25727
|
const stackRecovery = await recoverUnhealthyTestStack(issueId, workspace);
|
|
25581
25728
|
if (stackRecovery === "cooldown" || stackRecovery === "exhausted") {
|
|
25582
25729
|
setReviewStatusSync(issueId, { testStatus: "dispatch_failed" });
|
|
@@ -25592,7 +25739,8 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
25592
25739
|
issueId,
|
|
25593
25740
|
workspace,
|
|
25594
25741
|
branch
|
|
25595
|
-
})
|
|
25742
|
+
}),
|
|
25743
|
+
startedBy: "deacon:orphan-test-recovery"
|
|
25596
25744
|
});
|
|
25597
25745
|
testStackRebuildState.delete(issueId.toUpperCase());
|
|
25598
25746
|
setReviewStatusSync(issueId, { testStatus: "testing" });
|
|
@@ -25714,7 +25862,7 @@ async function recoverStalledReviewConvoys(getCanonicalState = getAutoCloseOutCa
|
|
|
25714
25862
|
record.lastAttempt = now;
|
|
25715
25863
|
record.attempts += 1;
|
|
25716
25864
|
stalledReviewConvoyRecoveryState.set(key, record);
|
|
25717
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
25865
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
|
|
25718
25866
|
try {
|
|
25719
25867
|
const result = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
25720
25868
|
issueId,
|
|
@@ -25785,7 +25933,7 @@ async function checkMissingReviewStatuses() {
|
|
|
25785
25933
|
continue;
|
|
25786
25934
|
}
|
|
25787
25935
|
try {
|
|
25788
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
25936
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
|
|
25789
25937
|
await Effect.runPromise(spawnReviewRoleForIssue({
|
|
25790
25938
|
issueId,
|
|
25791
25939
|
workspace,
|
|
@@ -25836,7 +25984,7 @@ async function checkStuckReviewing() {
|
|
|
25836
25984
|
const actions = [];
|
|
25837
25985
|
const REVIEW_STUCK_THRESHOLD_MS = 1800 * 1e3;
|
|
25838
25986
|
try {
|
|
25839
|
-
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-
|
|
25987
|
+
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
|
|
25840
25988
|
const statuses = loadReviewStatuses();
|
|
25841
25989
|
const now = Date.now();
|
|
25842
25990
|
const activeReviewIssues = /* @__PURE__ */ new Set();
|
|
@@ -25981,7 +26129,7 @@ async function checkCompletedButUnsignaledReviews() {
|
|
|
25981
26129
|
}
|
|
25982
26130
|
const nudge = `Your review synthesis is already written and saved. Your ONLY remaining task is to execute this Bash command immediately — do not analyze, do not summarize, do not ask questions, just run it:\n\n${`pan admin specialists done review ${issueId} --status ${verdict}${verdict === "blocked" || verdict === "failed" ? ` --notes "${topBlocker || "See synthesis.md"}"` : ""} --run-id "${basename$1(latestDir)}"`}\n\nRun this command NOW. Do not write any other response before executing it.`;
|
|
25983
26131
|
try {
|
|
25984
|
-
const { messageAgent } = await import("./agents-
|
|
26132
|
+
const { messageAgent } = await import("./agents-ePFVoZbu.js");
|
|
25985
26133
|
await messageAgent(reviewSession, nudge);
|
|
25986
26134
|
unsignaledReviewNudges.set(latestDir, now);
|
|
25987
26135
|
actions.push(`Nudged ${reviewSession} to signal ${verdict} (synthesis written ${Math.round((now - latestMtime) / 6e4)}min ago)`);
|
|
@@ -26018,19 +26166,6 @@ init_codex_auth();
|
|
|
26018
26166
|
const REVIEWER_IDLE_FAILURE_MS = 180 * 1e3;
|
|
26019
26167
|
const REVIEW_REPORTS_PRESENT_NUDGE_COOLDOWN_MS = 60 * 1e3;
|
|
26020
26168
|
const reviewReportsPresentNudges = /* @__PURE__ */ new Map();
|
|
26021
|
-
function extractMarkdownSection(markdown, heading) {
|
|
26022
|
-
const pattern = new RegExp(`^##\\s+${heading}\\s*\\r?\\n([\\s\\S]*?)(?=^##\\s+|(?![\\s\\S]))`, "im");
|
|
26023
|
-
return markdown.match(pattern)?.[1]?.trim() ?? "";
|
|
26024
|
-
}
|
|
26025
|
-
function findBlockingFindings(markdown) {
|
|
26026
|
-
const findings = extractMarkdownSection(markdown, "Findings");
|
|
26027
|
-
if (!findings || /^none\.?$/i.test(findings)) return [];
|
|
26028
|
-
const blockers = [];
|
|
26029
|
-
const headingPattern = /^###\s*(?:!|⊗)\s+(.+)$/gm;
|
|
26030
|
-
let match;
|
|
26031
|
-
while ((match = headingPattern.exec(findings)) !== null) blockers.push(match[1].trim());
|
|
26032
|
-
return blockers;
|
|
26033
|
-
}
|
|
26034
26169
|
function synthesizeReviewFromReports(opts) {
|
|
26035
26170
|
const blockers = opts.reports.flatMap((report) => findBlockingFindings(report.body).map((title) => ({
|
|
26036
26171
|
subRole: report.subRole,
|
|
@@ -26103,7 +26238,7 @@ async function respawnIdleReviewer(state, agentId) {
|
|
|
26103
26238
|
return false;
|
|
26104
26239
|
}
|
|
26105
26240
|
try {
|
|
26106
|
-
const { spawnReviewSubRoleForIssue } = await import("./review-agent-
|
|
26241
|
+
const { spawnReviewSubRoleForIssue } = await import("./review-agent-BTCNkq2h.js");
|
|
26107
26242
|
const contextManifestPath = join$1(dirname$1(outputPath), "context.json");
|
|
26108
26243
|
const result = await Effect.runPromise(spawnReviewSubRoleForIssue({
|
|
26109
26244
|
issueId: state.issueId,
|
|
@@ -26189,7 +26324,7 @@ async function nudgeSynthesisForCompleteReviewerReports(states) {
|
|
|
26189
26324
|
writeFileSync(join$1(reviewDir, "synthesis.md"), synthesis.body);
|
|
26190
26325
|
let fallbackHead;
|
|
26191
26326
|
try {
|
|
26192
|
-
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
26327
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Xg4PFN45.js");
|
|
26193
26328
|
fallbackHead = await snapshotWorkspaceHeadsPromise(state.issueId, state.workspace);
|
|
26194
26329
|
} catch {}
|
|
26195
26330
|
const anchoredVerdicts = Object.fromEntries(Object.entries(synthesis.reviewerVerdicts).map(([subRole, v]) => [subRole, {
|
|
@@ -26228,7 +26363,7 @@ async function nudgeSynthesisForCompleteReviewerReports(states) {
|
|
|
26228
26363
|
"Read the four reports, write synthesis.md, then signal review status exactly as roles/review.md instructs."
|
|
26229
26364
|
].join("\n");
|
|
26230
26365
|
try {
|
|
26231
|
-
const { messageAgent } = await import("./agents-
|
|
26366
|
+
const { messageAgent } = await import("./agents-ePFVoZbu.js");
|
|
26232
26367
|
await messageAgent(state.id, message);
|
|
26233
26368
|
reviewReportsPresentNudges.set(nudgeKey, now);
|
|
26234
26369
|
const action = `Nudged ${state.id} to synthesize from ${REVIEW_SUB_ROLES.length} reviewer reports`;
|
|
@@ -26314,7 +26449,7 @@ async function monitorReviewConvoySignals() {
|
|
|
26314
26449
|
if (!signal) continue;
|
|
26315
26450
|
const message = signal === "ready" ? `REVIEWER_READY ${state.reviewSubRole} ${outputPath}` : signal === "timeout" ? `REVIEWER_TIMEOUT ${state.reviewSubRole} ${reason}` : `REVIEWER_FAILED ${state.reviewSubRole} ${reason}`;
|
|
26316
26451
|
try {
|
|
26317
|
-
const { messageAgent } = await import("./agents-
|
|
26452
|
+
const { messageAgent } = await import("./agents-ePFVoZbu.js");
|
|
26318
26453
|
await messageAgent(state.reviewSynthesisAgentId, message);
|
|
26319
26454
|
state.reviewMonitorSignaled = signal;
|
|
26320
26455
|
saveAgentStateSync(state);
|
|
@@ -26322,7 +26457,7 @@ async function monitorReviewConvoySignals() {
|
|
|
26322
26457
|
actions.push(action);
|
|
26323
26458
|
logDeaconEventSync(`monitorReviewConvoySignals: ${action}`);
|
|
26324
26459
|
if (signal === "ready") try {
|
|
26325
|
-
const { notifyPipelineSync } = await import("./pipeline-notifier-
|
|
26460
|
+
const { notifyPipelineSync } = await import("./pipeline-notifier-DT6xLFao.js");
|
|
26326
26461
|
notifyPipelineSync({
|
|
26327
26462
|
type: "reviewer_completed",
|
|
26328
26463
|
issueId: state.issueId,
|
|
@@ -26330,7 +26465,7 @@ async function monitorReviewConvoySignals() {
|
|
|
26330
26465
|
});
|
|
26331
26466
|
} catch {}
|
|
26332
26467
|
else if (signal === "timeout") try {
|
|
26333
|
-
const { notifyPipelineSync } = await import("./pipeline-notifier-
|
|
26468
|
+
const { notifyPipelineSync } = await import("./pipeline-notifier-DT6xLFao.js");
|
|
26334
26469
|
notifyPipelineSync({
|
|
26335
26470
|
type: "reviewer_timed_out",
|
|
26336
26471
|
issueId: state.issueId,
|
|
@@ -26430,7 +26565,7 @@ const FORK_CACHE_CHECK_DELAY_MS = 180 * 1e3;
|
|
|
26430
26565
|
async function checkStalledReviewDiscovery() {
|
|
26431
26566
|
const actions = [];
|
|
26432
26567
|
try {
|
|
26433
|
-
const { listAgentStates } = await import("./agents-
|
|
26568
|
+
const { listAgentStates } = await import("./agents-ePFVoZbu.js");
|
|
26434
26569
|
const states = listAgentStates();
|
|
26435
26570
|
const now = Date.now();
|
|
26436
26571
|
for (const state of states) {
|
|
@@ -26439,7 +26574,7 @@ async function checkStalledReviewDiscovery() {
|
|
|
26439
26574
|
const aged = Number.isFinite(startedMs) && now - startedMs > 48e4;
|
|
26440
26575
|
const dead = !await Effect.runPromise(sessionExists(state.id)).catch(() => false) || await Effect.runPromise(isPaneDead(state.id)).catch(() => true);
|
|
26441
26576
|
if (!aged && !dead) continue;
|
|
26442
|
-
const { handleReviewDiscoveryReady } = await import("./review-agent-
|
|
26577
|
+
const { handleReviewDiscoveryReady } = await import("./review-agent-BTCNkq2h.js");
|
|
26443
26578
|
const result = await handleReviewDiscoveryReady(state.issueId, { source: dead ? "deacon-backstop (parent dead)" : "deacon-backstop (discovery timeout)" });
|
|
26444
26579
|
actions.push(result.message);
|
|
26445
26580
|
logDeaconEventSync(`checkStalledReviewDiscovery: ${result.message}`);
|
|
@@ -26462,8 +26597,8 @@ async function checkStalledReviewDiscovery() {
|
|
|
26462
26597
|
async function checkStalledReviewParents() {
|
|
26463
26598
|
const actions = [];
|
|
26464
26599
|
try {
|
|
26465
|
-
const { listAgentStates, markAgentStoppedState } = await import("./agents-
|
|
26466
|
-
const { PARENT_REVIEW_TIMEOUT_MS } = await import("./review-agent-
|
|
26600
|
+
const { listAgentStates, markAgentStoppedState } = await import("./agents-ePFVoZbu.js");
|
|
26601
|
+
const { PARENT_REVIEW_TIMEOUT_MS } = await import("./review-agent-BTCNkq2h.js");
|
|
26467
26602
|
const states = listAgentStates();
|
|
26468
26603
|
const now = Date.now();
|
|
26469
26604
|
for (const state of states) {
|
|
@@ -26512,8 +26647,8 @@ async function checkStalledReviewParents() {
|
|
|
26512
26647
|
async function checkReviewForkCacheMisses() {
|
|
26513
26648
|
const actions = [];
|
|
26514
26649
|
try {
|
|
26515
|
-
const { listAgentStates, saveAgentState } = await import("./agents-
|
|
26516
|
-
const { readEventsSync } = await import("./events-
|
|
26650
|
+
const { listAgentStates, saveAgentState } = await import("./agents-ePFVoZbu.js");
|
|
26651
|
+
const { readEventsSync } = await import("./events-CF8QDbuV.js");
|
|
26517
26652
|
const { emitActivityEntrySync } = await import("./activity-logger-CMthG6Vd.js");
|
|
26518
26653
|
const states = listAgentStates();
|
|
26519
26654
|
const now = Date.now();
|
|
@@ -26560,8 +26695,213 @@ async function checkReviewForkCacheMisses() {
|
|
|
26560
26695
|
return actions;
|
|
26561
26696
|
}
|
|
26562
26697
|
//#endregion
|
|
26698
|
+
//#region ../../lib/cloister/branch-invalidation.ts
|
|
26699
|
+
/**
|
|
26700
|
+
* PAN-3154: notify the pipeline when a merge to main invalidates open branches.
|
|
26701
|
+
*
|
|
26702
|
+
* Watches each project's origin/main head SHA on a cooldown; when it moves,
|
|
26703
|
+
* probes every in-pipeline branch of that project for newly-created conflicts
|
|
26704
|
+
* and marks them with a merge_conflict blocker + conflictsSince, so the
|
|
26705
|
+
* existing conflict-gate machinery (review-dispatch defer, resolver dispatch,
|
|
26706
|
+
* dashboard stuckReason) picks them up without further work.
|
|
26707
|
+
*/
|
|
26708
|
+
init_activity_logger();
|
|
26709
|
+
init_agents();
|
|
26710
|
+
init_messaging();
|
|
26711
|
+
init_review_status();
|
|
26712
|
+
init_projects();
|
|
26713
|
+
init_pipeline_membership_gather();
|
|
26714
|
+
init_pipeline_membership();
|
|
26715
|
+
init_conflict_gate();
|
|
26716
|
+
init_feedback_target();
|
|
26717
|
+
const execAsync$2 = promisify(exec);
|
|
26718
|
+
const GIT_TIMEOUT_MS = 3e4;
|
|
26719
|
+
const GIT_MAX_BUFFER = 4 * 1024 * 1024;
|
|
26720
|
+
const PROJECT_COOLDOWN_MS = 120 * 1e3;
|
|
26721
|
+
const projectCooldowns = /* @__PURE__ */ new Map();
|
|
26722
|
+
async function lsRemoteMainShaReal(projectPath) {
|
|
26723
|
+
const options = {
|
|
26724
|
+
cwd: projectPath,
|
|
26725
|
+
encoding: "utf-8",
|
|
26726
|
+
timeout: GIT_TIMEOUT_MS,
|
|
26727
|
+
maxBuffer: GIT_MAX_BUFFER
|
|
26728
|
+
};
|
|
26729
|
+
try {
|
|
26730
|
+
const { stdout } = await execAsync$2("git ls-remote origin refs/heads/main", options);
|
|
26731
|
+
const sha = String(stdout).trim().split(/\s+/)[0];
|
|
26732
|
+
return sha && /^[0-9a-f]{7,40}$/i.test(sha) ? sha : null;
|
|
26733
|
+
} catch {
|
|
26734
|
+
return null;
|
|
26735
|
+
}
|
|
26736
|
+
}
|
|
26737
|
+
function buildRealBranchInvalidationDeps() {
|
|
26738
|
+
return {
|
|
26739
|
+
listProjects: () => Object.entries(loadProjectsConfigSync().projects).map(([projectKey, projectConfig]) => ({
|
|
26740
|
+
projectKey,
|
|
26741
|
+
projectPath: resolveProjectPath(projectConfig),
|
|
26742
|
+
projectConfig
|
|
26743
|
+
})),
|
|
26744
|
+
gatherPipelineMembership: (projectConfig) => gatherProjectLensSignals(projectConfig).then((signals) => signals.map(resolvePipelineMembership)),
|
|
26745
|
+
listAgentWorkspaces: listAllAgentsSync,
|
|
26746
|
+
existsSync: existsSync$1,
|
|
26747
|
+
readdirSync: (path) => readdirSync$1(path),
|
|
26748
|
+
getSetting,
|
|
26749
|
+
setSetting,
|
|
26750
|
+
getReviewStatus: getReviewStatusSync,
|
|
26751
|
+
setReviewStatus: setReviewStatusSync,
|
|
26752
|
+
emitActivityEntry: emitActivityEntrySync,
|
|
26753
|
+
lsRemoteMainSha: lsRemoteMainShaReal,
|
|
26754
|
+
probeConflictPaths: (workspacePath, targetBranch) => probeBranchConflictPaths(workspacePath, targetBranch),
|
|
26755
|
+
resolveFeedbackTarget: resolveIssueFeedbackTarget,
|
|
26756
|
+
messageAgent: (agentId, message, caller) => messageAgent(agentId, message, caller),
|
|
26757
|
+
now: () => Date.now()
|
|
26758
|
+
};
|
|
26759
|
+
}
|
|
26760
|
+
/**
|
|
26761
|
+
* Resolve an issue's workspace: prefer the agents-table workspace column (fast,
|
|
26762
|
+
* covers -strike/-slot-N by construction), else the first existing
|
|
26763
|
+
* `feature-<issueLower>*` directory (prefix scan; a plain `feature-<issueLower>`
|
|
26764
|
+
* sorts before any `-strike`/`-slot-N` suffix). Agent-table rows and the
|
|
26765
|
+
* workspaces-directory listing are preloaded once per project sweep by the
|
|
26766
|
+
* caller — this function does no I/O beyond the `existsSync` check.
|
|
26767
|
+
*/
|
|
26768
|
+
function resolveWorkspacePath(deps, agentWorkspaces, workspacesDirEntries, projectPath, issueId) {
|
|
26769
|
+
const upperIssueId = issueId.toUpperCase();
|
|
26770
|
+
const agentWorkspace = agentWorkspaces.find((a) => a.issueId.toUpperCase() === upperIssueId)?.workspace;
|
|
26771
|
+
if (agentWorkspace && deps.existsSync(agentWorkspace)) return agentWorkspace;
|
|
26772
|
+
const prefix = `feature-${issueId.toLowerCase()}`;
|
|
26773
|
+
const matches = workspacesDirEntries.filter((name) => name === prefix || name.startsWith(`${prefix}-`)).sort();
|
|
26774
|
+
if (matches.length === 0) return null;
|
|
26775
|
+
return join(projectPath, "workspaces", matches[0]);
|
|
26776
|
+
}
|
|
26777
|
+
function formatPathSummary(paths) {
|
|
26778
|
+
const shown = paths.slice(0, 3).join(", ");
|
|
26779
|
+
return paths.length > 3 ? `${shown}, …` : shown;
|
|
26780
|
+
}
|
|
26781
|
+
/**
|
|
26782
|
+
* Notify the live owning agent that main moved and now conflicts with its
|
|
26783
|
+
* branch. Skips silently when no agent is live (needsYou) — the blocker plus
|
|
26784
|
+
* the existing conflict-resolver dispatch already cover stopped agents; this
|
|
26785
|
+
* is not a second nudge channel.
|
|
26786
|
+
*/
|
|
26787
|
+
async function notifyBranchInvalidated(deps, issueId, info) {
|
|
26788
|
+
const target = await deps.resolveFeedbackTarget(issueId);
|
|
26789
|
+
if ("needsYou" in target) return;
|
|
26790
|
+
const message = [
|
|
26791
|
+
`main moved: merge ${info.sha.slice(0, 7)} now conflicts with your branch in: ${info.paths.join(", ")}.`,
|
|
26792
|
+
`Rebase onto the new main NOW while the conflict is small — run \`pan sync-main ${issueId}\`,`,
|
|
26793
|
+
"resolve preserving BOTH intents, then continue your current task."
|
|
26794
|
+
].join(" ");
|
|
26795
|
+
await deps.messageAgent(target.agentId, message, "internal");
|
|
26796
|
+
}
|
|
26797
|
+
async function sweepProject(deps, project, nowMs, actions) {
|
|
26798
|
+
const { projectKey, projectPath, projectConfig } = project;
|
|
26799
|
+
const newSha = await deps.lsRemoteMainSha(projectPath);
|
|
26800
|
+
if (!newSha) return;
|
|
26801
|
+
const settingKey = `branch_invalidation.main_head.${projectKey}`;
|
|
26802
|
+
const lastSha = deps.getSetting(settingKey);
|
|
26803
|
+
if (lastSha === newSha) return;
|
|
26804
|
+
if (lastSha === null) {
|
|
26805
|
+
deps.setSetting(settingKey, newSha);
|
|
26806
|
+
return;
|
|
26807
|
+
}
|
|
26808
|
+
let memberships;
|
|
26809
|
+
try {
|
|
26810
|
+
memberships = await deps.gatherPipelineMembership(projectConfig);
|
|
26811
|
+
} catch (membershipErr) {
|
|
26812
|
+
console.warn(`[deacon] reconcileBranchInvalidation: ${projectKey} membership gather failed: ${membershipErr instanceof Error ? membershipErr.message : String(membershipErr)}`);
|
|
26813
|
+
return;
|
|
26814
|
+
}
|
|
26815
|
+
const issueIds = memberships.filter((m) => m.inPipeline).map((m) => m.issueId);
|
|
26816
|
+
const shortSha = newSha.slice(0, 7);
|
|
26817
|
+
const newlyMarkedIssueIds = [];
|
|
26818
|
+
let hadUnknownProbe = false;
|
|
26819
|
+
const agentWorkspaces = deps.listAgentWorkspaces();
|
|
26820
|
+
const workspacesDir = join(projectPath, "workspaces");
|
|
26821
|
+
const workspacesDirEntries = deps.existsSync(workspacesDir) ? deps.readdirSync(workspacesDir) : [];
|
|
26822
|
+
for (const issueId of issueIds) {
|
|
26823
|
+
const workspacePath = resolveWorkspacePath(deps, agentWorkspaces, workspacesDirEntries, projectPath, issueId);
|
|
26824
|
+
if (!workspacePath) continue;
|
|
26825
|
+
const probe = await deps.probeConflictPaths(workspacePath, "main");
|
|
26826
|
+
if (probe.mergeability === "unknown") {
|
|
26827
|
+
hadUnknownProbe = true;
|
|
26828
|
+
continue;
|
|
26829
|
+
}
|
|
26830
|
+
if (probe.mergeability !== "conflicts") continue;
|
|
26831
|
+
const freshStatus = deps.getReviewStatus(issueId);
|
|
26832
|
+
if (freshStatus?.mergeStatus === "merged") continue;
|
|
26833
|
+
if (freshStatus?.conflictsSince?.sha === newSha) continue;
|
|
26834
|
+
const detectedAt = new Date(nowMs).toISOString();
|
|
26835
|
+
const nonMergeBlockers = (freshStatus?.blockerReasons ?? []).filter((b) => b.type !== "merge_conflict" && b.type !== "not_mergeable");
|
|
26836
|
+
const mergeConflictBlocker = {
|
|
26837
|
+
type: "merge_conflict",
|
|
26838
|
+
summary: `Conflicts with main since ${shortSha} (${probe.paths.length} path${probe.paths.length === 1 ? "" : "s"}): ${formatPathSummary(probe.paths)}`,
|
|
26839
|
+
detectedAt
|
|
26840
|
+
};
|
|
26841
|
+
deps.setReviewStatus(issueId, {
|
|
26842
|
+
conflictsSince: {
|
|
26843
|
+
sha: newSha,
|
|
26844
|
+
detectedAt,
|
|
26845
|
+
paths: probe.paths
|
|
26846
|
+
},
|
|
26847
|
+
blockerReasons: [...nonMergeBlockers, mergeConflictBlocker]
|
|
26848
|
+
}, freshStatus ?? void 0);
|
|
26849
|
+
deps.emitActivityEntry({
|
|
26850
|
+
source: "cloister",
|
|
26851
|
+
level: "warn",
|
|
26852
|
+
issueId,
|
|
26853
|
+
message: `main moved: ${issueId} now conflicts with main (${shortSha}) in ${formatPathSummary(probe.paths)}`
|
|
26854
|
+
});
|
|
26855
|
+
try {
|
|
26856
|
+
await notifyBranchInvalidated(deps, issueId, {
|
|
26857
|
+
sha: newSha,
|
|
26858
|
+
paths: probe.paths
|
|
26859
|
+
});
|
|
26860
|
+
} catch (notifyErr) {
|
|
26861
|
+
console.warn(`[deacon] reconcileBranchInvalidation: ${issueId} notify failed: ${notifyErr instanceof Error ? notifyErr.message : String(notifyErr)}`);
|
|
26862
|
+
}
|
|
26863
|
+
newlyMarkedIssueIds.push(issueId);
|
|
26864
|
+
actions.push(`Marked ${issueId} conflicting with main since ${shortSha}`);
|
|
26865
|
+
}
|
|
26866
|
+
if (!hadUnknownProbe) deps.setSetting(settingKey, newSha);
|
|
26867
|
+
if (newlyMarkedIssueIds.length > 0) {
|
|
26868
|
+
const summaryMessage = `main ${shortSha} invalidated ${newlyMarkedIssueIds.length} branch(es): ${newlyMarkedIssueIds.join(", ")}`;
|
|
26869
|
+
deps.emitActivityEntry({
|
|
26870
|
+
source: "cloister",
|
|
26871
|
+
level: "warn",
|
|
26872
|
+
message: summaryMessage
|
|
26873
|
+
});
|
|
26874
|
+
actions.push(summaryMessage);
|
|
26875
|
+
}
|
|
26876
|
+
}
|
|
26877
|
+
/**
|
|
26878
|
+
* Deacon patrol reconciler (PAN-3154): fan out a conflict probe to every
|
|
26879
|
+
* in-pipeline branch of a project whenever that project's origin/main head
|
|
26880
|
+
* moves. Never throws — errors are logged and the patrol continues.
|
|
26881
|
+
*/
|
|
26882
|
+
async function reconcileBranchInvalidation(deps = buildRealBranchInvalidationDeps()) {
|
|
26883
|
+
const actions = [];
|
|
26884
|
+
try {
|
|
26885
|
+
const nowMs = deps.now();
|
|
26886
|
+
const projects = deps.listProjects();
|
|
26887
|
+
for (const project of projects) {
|
|
26888
|
+
const cooledUntil = projectCooldowns.get(project.projectKey);
|
|
26889
|
+
if (cooledUntil && nowMs < cooledUntil) continue;
|
|
26890
|
+
projectCooldowns.set(project.projectKey, nowMs + PROJECT_COOLDOWN_MS);
|
|
26891
|
+
try {
|
|
26892
|
+
await sweepProject(deps, project, nowMs, actions);
|
|
26893
|
+
} catch (projectErr) {
|
|
26894
|
+
console.warn(`[deacon] reconcileBranchInvalidation: ${project.projectKey} sweep failed: ${projectErr instanceof Error ? projectErr.message : String(projectErr)}`);
|
|
26895
|
+
}
|
|
26896
|
+
}
|
|
26897
|
+
} catch (err) {
|
|
26898
|
+
console.warn(`[deacon] Error in reconcileBranchInvalidation: ${err instanceof Error ? err.message : String(err)}`);
|
|
26899
|
+
}
|
|
26900
|
+
return actions;
|
|
26901
|
+
}
|
|
26902
|
+
//#endregion
|
|
26563
26903
|
//#region ../../lib/cloister/boot-reconciliation-predicates.ts
|
|
26564
|
-
|
|
26904
|
+
init_label_reconciler();
|
|
26565
26905
|
init_traefik_connect();
|
|
26566
26906
|
init_no_resume_mode();
|
|
26567
26907
|
init_agent_state();
|
|
@@ -26577,6 +26917,7 @@ function bootReconciliationSkipReason(agent) {
|
|
|
26577
26917
|
}
|
|
26578
26918
|
//#endregion
|
|
26579
26919
|
//#region ../../lib/cloister/boot-reconciliation.ts
|
|
26920
|
+
init_control_settings();
|
|
26580
26921
|
init_agents();
|
|
26581
26922
|
init_persistent_logger();
|
|
26582
26923
|
init_config$1();
|
|
@@ -26587,10 +26928,6 @@ let graceTimer = null;
|
|
|
26587
26928
|
* the boot path wires the apply step.
|
|
26588
26929
|
*/
|
|
26589
26930
|
let graceExpiryHook = null;
|
|
26590
|
-
function hasCompletionMarker(workspace) {
|
|
26591
|
-
if (!workspace) return false;
|
|
26592
|
-
return existsSync$1(join(workspace, ".pan", "completed")) || existsSync$1(join(workspace, ".pan", "completed.processed"));
|
|
26593
|
-
}
|
|
26594
26931
|
function newestAgentTimestampMs(agent) {
|
|
26595
26932
|
const timestamps = [
|
|
26596
26933
|
agent.lastActivity,
|
|
@@ -26606,6 +26943,13 @@ function isRecentBootCandidate(agent) {
|
|
|
26606
26943
|
if (!Number.isFinite(bootStartedAtMs) || newestTimestampMs == null) return false;
|
|
26607
26944
|
return newestTimestampMs >= bootStartedAtMs - getBootReconciliationMaxCandidateAgeSeconds() * 1e3;
|
|
26608
26945
|
}
|
|
26946
|
+
function isCleanShutdownBoot() {
|
|
26947
|
+
const state = getBootReconciliationState();
|
|
26948
|
+
const bootStartedAtMs = state.bootStartedAt == null ? NaN : Date.parse(state.bootStartedAt);
|
|
26949
|
+
const marker = getLastCleanShutdownAt();
|
|
26950
|
+
const markerMs = marker == null ? NaN : Date.parse(marker);
|
|
26951
|
+
return Number.isFinite(bootStartedAtMs) && Number.isFinite(markerMs) && bootStartedAtMs - markerMs <= 18e5;
|
|
26952
|
+
}
|
|
26609
26953
|
function getBootReconciliationGraceSeconds() {
|
|
26610
26954
|
const value = loadCloisterConfigSync().startup.reconciliation_grace_secs;
|
|
26611
26955
|
return Number.isFinite(value) && value > 0 ? value : 120;
|
|
@@ -26614,10 +26958,12 @@ function getBootReconciliationMaxCandidateAgeSeconds() {
|
|
|
26614
26958
|
const value = loadCloisterConfigSync().startup.reconciliation_max_candidate_age_secs;
|
|
26615
26959
|
return Number.isFinite(value) && value > 0 ? value : getBootReconciliationGraceSeconds() * 2;
|
|
26616
26960
|
}
|
|
26961
|
+
function isAutoResumableRole(role) {
|
|
26962
|
+
return role === "work" || role === "strike";
|
|
26963
|
+
}
|
|
26617
26964
|
function isBootReconciliationCandidate(agent) {
|
|
26618
|
-
if (agent.role
|
|
26965
|
+
if (!isAutoResumableRole(agent.role) || agent.status !== "stopped") return false;
|
|
26619
26966
|
if (agent.paused === true || agent.troubled === true) return false;
|
|
26620
|
-
if (agent.stoppedByUser === true && !hasCompletionMarker(agent.workspace)) return false;
|
|
26621
26967
|
if (!isRecentBootCandidate(agent)) return false;
|
|
26622
26968
|
if (bootReconciliationSkipReason(agent) !== null) return false;
|
|
26623
26969
|
if (!agent.workspace || !existsSync$1(agent.workspace)) return false;
|
|
@@ -26697,8 +27043,17 @@ function armBootReconciliationGraceTimer(graceDeadline, onGraceExpired = () => v
|
|
|
26697
27043
|
graceTimer = setTimeout(() => {
|
|
26698
27044
|
graceTimer = null;
|
|
26699
27045
|
if (getBootReconciliationState().decision !== "pending") return;
|
|
26700
|
-
|
|
26701
|
-
|
|
27046
|
+
if (listBootReconciliationCandidateIds().length === 0) {
|
|
27047
|
+
setBootReconciliationDecision("resume_all");
|
|
27048
|
+
logDeaconEventSync("boot reconciliation grace expired — vacuous hold auto-released (0 candidates)");
|
|
27049
|
+
Promise.resolve(onGraceExpired()).catch((err) => {
|
|
27050
|
+
logDeaconEventSync(`boot reconciliation grace expiry apply hook failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
27051
|
+
});
|
|
27052
|
+
return;
|
|
27053
|
+
}
|
|
27054
|
+
const decision = isCleanShutdownBoot() ? "resume_all" : "hold_all";
|
|
27055
|
+
setBootReconciliationDecision(decision);
|
|
27056
|
+
logDeaconEventSync(decision === "resume_all" ? "boot reconciliation grace expired — clean shutdown within 30m, decision set to resume_all" : "boot reconciliation grace expired — no clean shutdown marker (crash boot), decision set to hold_all");
|
|
26702
27057
|
Promise.resolve(onGraceExpired()).catch((err) => {
|
|
26703
27058
|
logDeaconEventSync(`boot reconciliation grace expiry apply hook failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
26704
27059
|
});
|
|
@@ -27156,7 +27511,7 @@ async function nudgeStalledResumeWorkAgents() {
|
|
|
27156
27511
|
const message = buildStalledResumePrompt(state);
|
|
27157
27512
|
if (!message) continue;
|
|
27158
27513
|
try {
|
|
27159
|
-
const { messageAgent } = await import("./agents-
|
|
27514
|
+
const { messageAgent } = await import("./agents-ePFVoZbu.js");
|
|
27160
27515
|
await messageAgent(agentId, message);
|
|
27161
27516
|
recordCooldown(agentId, ".last-stalled-resume-nudge");
|
|
27162
27517
|
const action = `Re-sent stalled resume prompt to ${agentId} (${state.issueId})`;
|
|
@@ -27270,7 +27625,7 @@ async function nudgeIdleWorkAgentsWithOpenBeads() {
|
|
|
27270
27625
|
"Continue the per-item workflow without asking — claim it (`pan task claim <item-id>`), implement, commit, push, then complete it through `pan task done <item-id>`. Inspection is conditional on metadata.requiresInspection (default false; check the plan item before deciding to call `pan inspect`). Do NOT end your turn with a multi-paragraph summary; just advance to the next bead."
|
|
27271
27626
|
].join("\n");
|
|
27272
27627
|
try {
|
|
27273
|
-
const { messageAgent } = await import("./agents-
|
|
27628
|
+
const { messageAgent } = await import("./agents-ePFVoZbu.js");
|
|
27274
27629
|
await messageAgent(agentId, message);
|
|
27275
27630
|
writeFileSync(join$1(getAgentDir(agentId), ".last-bead-nudge"), String(Date.now()), "utf-8");
|
|
27276
27631
|
const action = `Nudged idle ${agentId} (${state.issueId}) — ${openTasks.length} ready task(s)`;
|
|
@@ -27316,7 +27671,7 @@ function shouldRetryUndeliveredKickoff(state) {
|
|
|
27316
27671
|
* Does not enumerate directories — it evaluates the single agent ID it was given.
|
|
27317
27672
|
*/
|
|
27318
27673
|
async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
|
|
27319
|
-
const { skipGlobalGates = false, context = "event" } = opts;
|
|
27674
|
+
const { skipGlobalGates = false, context = "event", overrideStoppedByUser = false } = opts;
|
|
27320
27675
|
const state = getAgentStateSync(agentId);
|
|
27321
27676
|
if (!state) {
|
|
27322
27677
|
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — no state`);
|
|
@@ -27326,8 +27681,8 @@ async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
|
|
|
27326
27681
|
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — status=${state.status} (not stopped)`);
|
|
27327
27682
|
return null;
|
|
27328
27683
|
}
|
|
27329
|
-
if (state.role
|
|
27330
|
-
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — role=${state.role} (not
|
|
27684
|
+
if (!isAutoResumableRole(state.role)) {
|
|
27685
|
+
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — role=${state.role} (not auto-resumable)`);
|
|
27331
27686
|
return null;
|
|
27332
27687
|
}
|
|
27333
27688
|
if (getBootReconciliationHeldResumeSet().has(agentId)) {
|
|
@@ -27386,7 +27741,9 @@ async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
|
|
|
27386
27741
|
return null;
|
|
27387
27742
|
}
|
|
27388
27743
|
const hasPendingReviewFeedback = review?.reviewStatus === "blocked" || review?.reviewStatus === "failed" || review?.testStatus === "failed" || review?.verificationStatus === "failed";
|
|
27389
|
-
|
|
27744
|
+
const deliberatelyStopped = state.stoppedByUser === true;
|
|
27745
|
+
if (deliberatelyStopped && overrideStoppedByUser) logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} resuming despite stoppedByUser — explicit operator resume_all override`);
|
|
27746
|
+
else if (deliberatelyStopped && !(handedOffViaDone && hasPendingReviewFeedback)) {
|
|
27390
27747
|
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — deliberately stopped by user (stoppedByUser=true)`);
|
|
27391
27748
|
return null;
|
|
27392
27749
|
}
|
|
@@ -27418,7 +27775,7 @@ async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
|
|
|
27418
27775
|
const runtimeStateForLog = getAgentRuntimeStateSync(agentId);
|
|
27419
27776
|
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} candidate — calling resumeAgent (issueId=${state.issueId}, runtime.state=${runtimeStateForLog?.state || "null"})`);
|
|
27420
27777
|
try {
|
|
27421
|
-
const result = await resumeAgent(agentId);
|
|
27778
|
+
const result = await resumeAgent(agentId, void 0, { startedBy: "deacon:auto-resume" });
|
|
27422
27779
|
if (result.success) {
|
|
27423
27780
|
const resumedState = await Effect.runPromise(getAgentState(agentId));
|
|
27424
27781
|
if (resumedState) deps.notifyAgentStatusChanged(resumedState, state.status, true);
|
|
@@ -27541,7 +27898,8 @@ function bootReconciliationDecisionKey() {
|
|
|
27541
27898
|
if (!state.decision || state.decision === "pending") return null;
|
|
27542
27899
|
return `${state.bootId ?? "boot"}:${state.decision}:${JSON.stringify(state.perAgent)}`;
|
|
27543
27900
|
}
|
|
27544
|
-
async function applyBootReconciliationDecision$1(deps) {
|
|
27901
|
+
async function applyBootReconciliationDecision$1(deps, opts = {}) {
|
|
27902
|
+
const origin = opts.origin ?? "auto";
|
|
27545
27903
|
const decisionKey = bootReconciliationDecisionKey();
|
|
27546
27904
|
if (!decisionKey) return emptyBootReconciliationApplyResult();
|
|
27547
27905
|
if (appliedBootReconciliationDecisions.has(decisionKey)) {
|
|
@@ -27555,6 +27913,12 @@ async function applyBootReconciliationDecision$1(deps) {
|
|
|
27555
27913
|
return emptyBootReconciliationApplyResult();
|
|
27556
27914
|
}
|
|
27557
27915
|
let candidates = listBootReconciliationCandidates();
|
|
27916
|
+
if (origin === "auto") {
|
|
27917
|
+
const candidateCount = candidates.length;
|
|
27918
|
+
candidates = candidates.filter((agent) => agent.stoppedByUser !== true);
|
|
27919
|
+
const filteredCount = candidateCount - candidates.length;
|
|
27920
|
+
if (filteredCount > 0) logDeaconEventSync(`applyBootReconciliationDecision: auto origin filtered ${filteredCount} stoppedByUser candidate(s)`);
|
|
27921
|
+
}
|
|
27558
27922
|
if (state.decision === "per_agent") candidates = candidates.filter((agent) => state.perAgent[agent.issueId] === "resume");
|
|
27559
27923
|
const resumed = [];
|
|
27560
27924
|
const outcomes = [];
|
|
@@ -27599,7 +27963,8 @@ async function applyBootReconciliationDecision$1(deps) {
|
|
|
27599
27963
|
if (resumeAttempts > 0) await new Promise((r) => setTimeout(r, 150));
|
|
27600
27964
|
const result = await handleAgentStoppedEvent$1(agent.id, {
|
|
27601
27965
|
skipGlobalGates: true,
|
|
27602
|
-
context: "boot-reconciliation"
|
|
27966
|
+
context: "boot-reconciliation",
|
|
27967
|
+
...origin === "operator" ? { overrideStoppedByUser: true } : {}
|
|
27603
27968
|
}, deps);
|
|
27604
27969
|
if (result) {
|
|
27605
27970
|
resumed.push(result);
|
|
@@ -27686,7 +28051,6 @@ async function recordMainDivergenceHealth(state, projects = listProjectsSync(),
|
|
|
27686
28051
|
}
|
|
27687
28052
|
//#endregion
|
|
27688
28053
|
//#region ../../lib/cloister/patrol-cadence.ts
|
|
27689
|
-
init_label_reconciler();
|
|
27690
28054
|
function shouldRunRecoveryJanitor(janitor, patrolCycle) {
|
|
27691
28055
|
return patrolCycle % (janitor === "feedback" ? 5 : 60) === 0;
|
|
27692
28056
|
}
|
|
@@ -28479,8 +28843,8 @@ async function cleanupStaleAgentState() {
|
|
|
28479
28843
|
*/
|
|
28480
28844
|
async function cleanupAbandonedFeedback() {
|
|
28481
28845
|
const actions = [];
|
|
28482
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
28483
|
-
const { clearFeedbackFiles } = await import("./feedback-writer-
|
|
28846
|
+
const { getReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
|
|
28847
|
+
const { clearFeedbackFiles } = await import("./feedback-writer-CoB9Z6aU.js");
|
|
28484
28848
|
for (const { issueId, workspacePath } of listFeatureWorkspaces()) {
|
|
28485
28849
|
const panFeedbackDir = join$1(workspacePath, ".pan", "feedback");
|
|
28486
28850
|
if (!existsSync(panFeedbackDir)) continue;
|
|
@@ -28551,7 +28915,7 @@ async function handleOrphanReviewerSession(sessionName, sessions, creationTimes,
|
|
|
28551
28915
|
if (!issueId) return null;
|
|
28552
28916
|
const agentSession = `agent-${issueId.toLowerCase()}`;
|
|
28553
28917
|
if (sessions.includes(agentSession)) return null;
|
|
28554
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
28918
|
+
const { getReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
|
|
28555
28919
|
try {
|
|
28556
28920
|
if (getReviewStatusSync(issueId)?.reviewStatus === "reviewing") return null;
|
|
28557
28921
|
} catch {}
|
|
@@ -28673,7 +29037,7 @@ async function checkOrphanedCompletions() {
|
|
|
28673
29037
|
async function checkPendingTestDispatch() {
|
|
28674
29038
|
const actions = [];
|
|
28675
29039
|
try {
|
|
28676
|
-
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-
|
|
29040
|
+
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
|
|
28677
29041
|
const statuses = loadReviewStatuses();
|
|
28678
29042
|
const now = Date.now();
|
|
28679
29043
|
for (const [issueId, status] of Object.entries(statuses)) {
|
|
@@ -28706,7 +29070,7 @@ async function checkPendingTestDispatch() {
|
|
|
28706
29070
|
console.log(`[deacon] ${issueId}: skipping test re-dispatch — issue is closed`);
|
|
28707
29071
|
continue;
|
|
28708
29072
|
}
|
|
28709
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
29073
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
28710
29074
|
const resolved = resolveProjectFromIssueSync(issueId);
|
|
28711
29075
|
if (!resolved) continue;
|
|
28712
29076
|
const issueLower = issueId.toLowerCase();
|
|
@@ -28721,8 +29085,8 @@ async function checkPendingTestDispatch() {
|
|
|
28721
29085
|
logDeaconEventSync(`checkPendingTestDispatch: deferred test for ${issueId} — advancing ceiling reached (PAN-1665) — ${describeRunningAgents()}`);
|
|
28722
29086
|
continue;
|
|
28723
29087
|
}
|
|
28724
|
-
const { spawnRun } = await import("./agents-
|
|
28725
|
-
const { buildTestRolePrompt } = await import("./test-agent-queue-
|
|
29088
|
+
const { spawnRun } = await import("./agents-ePFVoZbu.js");
|
|
29089
|
+
const { buildTestRolePrompt } = await import("./test-agent-queue-A_-p-i0I.js");
|
|
28726
29090
|
try {
|
|
28727
29091
|
const run = await spawnRun(issueId, "test", {
|
|
28728
29092
|
workspace,
|
|
@@ -28730,7 +29094,8 @@ async function checkPendingTestDispatch() {
|
|
|
28730
29094
|
issueId,
|
|
28731
29095
|
workspace,
|
|
28732
29096
|
branch
|
|
28733
|
-
})
|
|
29097
|
+
}),
|
|
29098
|
+
startedBy: "deacon:test-retry"
|
|
28734
29099
|
});
|
|
28735
29100
|
setReviewStatusSync(issueId, {
|
|
28736
29101
|
testStatus: "testing",
|
|
@@ -28845,7 +29210,7 @@ async function checkCompletedButUnsignaledTests() {
|
|
|
28845
29210
|
const cmd = `pan admin specialists done test ${issueId} --status ${decision.status}${noteArg}`;
|
|
28846
29211
|
const nudge = `Your test verdict (${decision.status}) is already written to .pan/test/result.json. Your ONLY remaining task is to execute this Bash command immediately — do not analyze, do not summarize, do not ask questions, just run it:\n\n${cmd}\n\nRun this command NOW. Do not write any other response before executing it.`;
|
|
28847
29212
|
try {
|
|
28848
|
-
const { messageAgent } = await import("./agents-
|
|
29213
|
+
const { messageAgent } = await import("./agents-ePFVoZbu.js");
|
|
28849
29214
|
await messageAgent(testSession, nudge);
|
|
28850
29215
|
unsignaledTestNudges.set(testSession, now);
|
|
28851
29216
|
const msg = `Nudged ${testSession} to signal ${decision.status} (verdict artifact present)`;
|
|
@@ -28859,7 +29224,7 @@ async function checkCompletedButUnsignaledTests() {
|
|
|
28859
29224
|
case "nudge-write": {
|
|
28860
29225
|
const nudge = `Your test run for ${issueId} looks finished but no verdict was recorded. Decide the verdict from the gates/UAT you ran, then do BOTH of these now: (1) write the workspace file .pan/test/result.json as {"status":"passed"|"failed","notes":"<evidence>"}, and (2) run: pan admin specialists done test ${issueId} --status passed|failed. Do this immediately — do not summarize or ask questions, just write the file and run the command.`;
|
|
28861
29226
|
try {
|
|
28862
|
-
const { messageAgent } = await import("./agents-
|
|
29227
|
+
const { messageAgent } = await import("./agents-ePFVoZbu.js");
|
|
28863
29228
|
await messageAgent(testSession, nudge);
|
|
28864
29229
|
unsignaledTestNudges.set(testSession, now);
|
|
28865
29230
|
const msg = `Nudged ${testSession} to write+signal a test verdict (no artifact yet)`;
|
|
@@ -28882,8 +29247,8 @@ async function checkCompletedButUnsignaledTests() {
|
|
|
28882
29247
|
async function checkVerificationReviewContradiction() {
|
|
28883
29248
|
const actions = [];
|
|
28884
29249
|
try {
|
|
28885
|
-
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-
|
|
28886
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
29250
|
+
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
|
|
29251
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
28887
29252
|
const statuses = loadReviewStatuses();
|
|
28888
29253
|
for (const [issueId, status] of Object.entries(statuses)) if (status.verificationStatus === "passed" && status.reviewStatus === "reviewing" && status.stuckReason === "review_infrastructure_failure") {
|
|
28889
29254
|
let reviewedAtCommit;
|
|
@@ -28892,7 +29257,7 @@ async function checkVerificationReviewContradiction() {
|
|
|
28892
29257
|
if (project) {
|
|
28893
29258
|
const workspacePath = join$1(project.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
28894
29259
|
if (existsSync(workspacePath)) {
|
|
28895
|
-
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
29260
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Xg4PFN45.js");
|
|
28896
29261
|
reviewedAtCommit = await snapshotWorkspaceHeadsPromise(issueId, workspacePath);
|
|
28897
29262
|
}
|
|
28898
29263
|
}
|
|
@@ -28956,8 +29321,8 @@ async function cleanupOrphanedPlanningSessions() {
|
|
|
28956
29321
|
async function handleAgentStoppedEvent(agentId, opts = {}) {
|
|
28957
29322
|
return handleAgentStoppedEvent$1(agentId, opts, autoResumeNotifierDeps());
|
|
28958
29323
|
}
|
|
28959
|
-
async function applyBootReconciliationDecision() {
|
|
28960
|
-
return applyBootReconciliationDecision$1(autoResumeNotifierDeps());
|
|
29324
|
+
async function applyBootReconciliationDecision(opts = {}) {
|
|
29325
|
+
return applyBootReconciliationDecision$1(autoResumeNotifierDeps(), opts);
|
|
28961
29326
|
}
|
|
28962
29327
|
async function reconcileAgentLiveness() {
|
|
28963
29328
|
if (isDeaconGloballyPaused()) {
|
|
@@ -28988,7 +29353,7 @@ async function checkReadyForMergeStuck() {
|
|
|
28988
29353
|
const testStatusGreenCiReconcileCooldowns = /* @__PURE__ */ new Map();
|
|
28989
29354
|
const TEST_STATUS_GREEN_CI_RECONCILE_COOLDOWN_MS = 300 * 1e3;
|
|
28990
29355
|
async function reconcileTestStatusFromGreenCi() {
|
|
28991
|
-
const { getCiCheckRunsState, getPullRequestHeadState, isGitHubAppConfigured } = await import("./github-app-
|
|
29356
|
+
const { getCiCheckRunsState, getPullRequestHeadState, isGitHubAppConfigured } = await import("./github-app-Bmg4R9mv.js");
|
|
28992
29357
|
return reconcileTestStatusFromGreenCiWithDeps({
|
|
28993
29358
|
isGitHubAppConfigured,
|
|
28994
29359
|
loadReviewStatuses,
|
|
@@ -29009,7 +29374,7 @@ async function reconcileTestStatusFromGreenCi() {
|
|
|
29009
29374
|
*/
|
|
29010
29375
|
async function clearStaleCiFeedback(issueId) {
|
|
29011
29376
|
const { readdir, rm } = await import("fs/promises");
|
|
29012
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
29377
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
29013
29378
|
const projectConfig = resolveProjectFromIssueSync(issueId);
|
|
29014
29379
|
if (!projectConfig) return;
|
|
29015
29380
|
const repoDir = projectConfig.projectPath;
|
|
@@ -29305,7 +29670,7 @@ async function checkWorkspaceContainerHealth(sharedState) {
|
|
|
29305
29670
|
}
|
|
29306
29671
|
}
|
|
29307
29672
|
try {
|
|
29308
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
29673
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
29309
29674
|
const resolved = resolveProjectFromIssueSync(issueLower.toUpperCase());
|
|
29310
29675
|
if (resolved) await killOrphanedWorkspaceProcesses(`${resolved.projectPath}/workspaces/feature-${issueLower}`);
|
|
29311
29676
|
} catch {}
|
|
@@ -29354,8 +29719,8 @@ async function checkWorkspaceContainerHealth(sharedState) {
|
|
|
29354
29719
|
async function checkMergedWorkSessions() {
|
|
29355
29720
|
const actions = [];
|
|
29356
29721
|
try {
|
|
29357
|
-
const { selectMergedWorkSessions } = await import("./reap-terminal-sessions-
|
|
29358
|
-
const { setAgentPaused } = await import("./agents-
|
|
29722
|
+
const { selectMergedWorkSessions } = await import("./reap-terminal-sessions-4Xg9NGA8.js");
|
|
29723
|
+
const { setAgentPaused } = await import("./agents-ePFVoZbu.js");
|
|
29359
29724
|
const toKill = selectMergedWorkSessions(loadReviewStatuses(), [...await Effect.runPromise(listSessionNames())]);
|
|
29360
29725
|
for (const session of toKill) try {
|
|
29361
29726
|
await Effect.runPromise(setAgentPaused(session, "merged — awaiting close-out (verify on main)", true));
|
|
@@ -29395,7 +29760,7 @@ const AWAITING_TEST_IDLE_REAP_MS = 600 * 1e3;
|
|
|
29395
29760
|
async function checkAwaitingTestWorkSessions() {
|
|
29396
29761
|
const actions = [];
|
|
29397
29762
|
try {
|
|
29398
|
-
const { selectAwaitingTestWorkSessions } = await import("./reap-terminal-sessions-
|
|
29763
|
+
const { selectAwaitingTestWorkSessions } = await import("./reap-terminal-sessions-4Xg9NGA8.js");
|
|
29399
29764
|
const candidates = selectAwaitingTestWorkSessions(loadReviewStatuses(), [...await Effect.runPromise(listSessionNames())]);
|
|
29400
29765
|
const now = Date.now();
|
|
29401
29766
|
for (const session of candidates) {
|
|
@@ -29448,26 +29813,26 @@ async function runPatrol() {
|
|
|
29448
29813
|
hasLoggedGlobalPauseSkip = false;
|
|
29449
29814
|
addLog("info", `Patrol cycle ${state.patrolCycle} — checking per-project specialists`, state.patrolCycle);
|
|
29450
29815
|
console.log(`[deacon] Patrol cycle ${state.patrolCycle} - checking per-project specialists`);
|
|
29451
|
-
for (const a of await (await import("./stale-task-claims-
|
|
29816
|
+
for (const a of await (await import("./stale-task-claims-Cab_Fo_Z.js")).patrolStaleTaskClaims()) {
|
|
29452
29817
|
actions.push(a);
|
|
29453
29818
|
addLog("action", a, state.patrolCycle);
|
|
29454
29819
|
}
|
|
29455
29820
|
const stuckRemediationActions = await checkStuckAgentRemediation();
|
|
29456
29821
|
actions.push(...stuckRemediationActions);
|
|
29457
29822
|
for (const a of stuckRemediationActions) addLog("action", a, state.patrolCycle);
|
|
29458
|
-
const { reconcileInFlightJournals } = await import("./advancing-selfheal-
|
|
29823
|
+
const { reconcileInFlightJournals } = await import("./advancing-selfheal-BNwqxseD.js");
|
|
29459
29824
|
const reconciledJournalActions = await reconcileInFlightJournals();
|
|
29460
29825
|
actions.push(...reconciledJournalActions);
|
|
29461
29826
|
for (const a of reconciledJournalActions) addLog("action", a, state.patrolCycle);
|
|
29462
29827
|
try {
|
|
29463
29828
|
const pendingFile = join$1(OVERDECK_HOME, "pending-post-merge.json");
|
|
29464
|
-
const { processPendingLifecycleForPatrol } = await import("./deacon-pending-lifecycle-
|
|
29829
|
+
const { processPendingLifecycleForPatrol } = await import("./deacon-pending-lifecycle-B-Io84AP.js");
|
|
29465
29830
|
const action = await processPendingLifecycleForPatrol(pendingFile);
|
|
29466
29831
|
if (action) actions.push(action);
|
|
29467
29832
|
} catch (err) {
|
|
29468
29833
|
console.warn(`[deacon] Failed to process pending lifecycle: ${err.message}`);
|
|
29469
29834
|
}
|
|
29470
|
-
if (state.patrolCycle % 5 === 0) await (await import("./deploy-patrol-
|
|
29835
|
+
if (state.patrolCycle % 5 === 0) await (await import("./deploy-patrol-sYgOxLeb.js")).runScheduledDeployPatrol();
|
|
29471
29836
|
const livenessActions = await reconcileAgentLiveness();
|
|
29472
29837
|
actions.push(...livenessActions);
|
|
29473
29838
|
for (const a of livenessActions) addLog("action", a, state.patrolCycle);
|
|
@@ -29483,7 +29848,7 @@ async function runPatrol() {
|
|
|
29483
29848
|
const idleStackActions = await reconcileIdleWorkspaceStacks();
|
|
29484
29849
|
actions.push(...idleStackActions);
|
|
29485
29850
|
for (const a of idleStackActions) addLog("action", a, state.patrolCycle);
|
|
29486
|
-
for (const a of await (await import("./bridge-pool-patrol-
|
|
29851
|
+
for (const a of await (await import("./bridge-pool-patrol-CYH2OLb5.js")).patrolDockerBridgePool()) {
|
|
29487
29852
|
actions.push(a);
|
|
29488
29853
|
addLog("action", a, state.patrolCycle);
|
|
29489
29854
|
}
|
|
@@ -29503,7 +29868,7 @@ async function runPatrol() {
|
|
|
29503
29868
|
actions.push(...suspendActions);
|
|
29504
29869
|
for (const a of suspendActions) addLog("action", a, state.patrolCycle);
|
|
29505
29870
|
try {
|
|
29506
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
29871
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
29507
29872
|
const allStatuses = loadReviewStatuses();
|
|
29508
29873
|
for (const [issueId, status] of Object.entries(allStatuses)) {
|
|
29509
29874
|
if (!status.readyForMerge || status.mergeStatus === "merged") continue;
|
|
@@ -29523,7 +29888,7 @@ async function runPatrol() {
|
|
|
29523
29888
|
} catch (err) {
|
|
29524
29889
|
console.warn(`[deacon] Failed to check workspace existence: ${err.message}`);
|
|
29525
29890
|
}
|
|
29526
|
-
const { checkMergedAdvancingSessions } = await import("./advancing-selfheal-
|
|
29891
|
+
const { checkMergedAdvancingSessions } = await import("./advancing-selfheal-BNwqxseD.js");
|
|
29527
29892
|
const reapedWorkActions = await checkMergedWorkSessions();
|
|
29528
29893
|
actions.push(...reapedWorkActions);
|
|
29529
29894
|
for (const a of reapedWorkActions) addLog("action", a, state.patrolCycle);
|
|
@@ -29531,7 +29896,7 @@ async function runPatrol() {
|
|
|
29531
29896
|
actions.push(...reapedMergedAdvancingActions);
|
|
29532
29897
|
for (const a of reapedMergedAdvancingActions) addLog("action", a, state.patrolCycle);
|
|
29533
29898
|
try {
|
|
29534
|
-
const { refreshClaudeCredentialsForActiveRemoteAgents } = await import("./remote-completion-
|
|
29899
|
+
const { refreshClaudeCredentialsForActiveRemoteAgents } = await import("./remote-completion-CwAp79EC.js");
|
|
29535
29900
|
const remoteCredentialActions = await refreshClaudeCredentialsForActiveRemoteAgents();
|
|
29536
29901
|
actions.push(...remoteCredentialActions);
|
|
29537
29902
|
for (const a of remoteCredentialActions) addLog(a.includes("failed") ? "warn" : "action", a, state.patrolCycle);
|
|
@@ -29539,7 +29904,7 @@ async function runPatrol() {
|
|
|
29539
29904
|
addLog("warn", `Remote credential refresh patrol failed: ${err.message}`, state.patrolCycle);
|
|
29540
29905
|
}
|
|
29541
29906
|
try {
|
|
29542
|
-
const { refreshHostHeartbeatForEphemeralVms } = await import("./remote-agents-
|
|
29907
|
+
const { refreshHostHeartbeatForEphemeralVms } = await import("./remote-agents-CLZB3Coc.js");
|
|
29543
29908
|
const heartbeatActions = await refreshHostHeartbeatForEphemeralVms();
|
|
29544
29909
|
actions.push(...heartbeatActions);
|
|
29545
29910
|
for (const a of heartbeatActions) addLog(a.includes("failed") ? "warn" : "action", a, state.patrolCycle);
|
|
@@ -29547,7 +29912,7 @@ async function runPatrol() {
|
|
|
29547
29912
|
addLog("warn", `Remote heartbeat refresh patrol failed: ${err.message}`, state.patrolCycle);
|
|
29548
29913
|
}
|
|
29549
29914
|
try {
|
|
29550
|
-
const { reapCompletedRemoteAgents } = await import("./remote-completion-
|
|
29915
|
+
const { reapCompletedRemoteAgents } = await import("./remote-completion-CwAp79EC.js");
|
|
29551
29916
|
const remoteReap = await reapCompletedRemoteAgents();
|
|
29552
29917
|
for (const r of remoteReap) if (r.status === "handed-off" || r.status === "error") {
|
|
29553
29918
|
const msg = `Remote reap ${r.issueId}: ${r.status} (${r.details.join("; ")})`;
|
|
@@ -29649,9 +30014,16 @@ async function runPatrol() {
|
|
|
29649
30014
|
const closedPrReadyActions = await reconcileClosedPrReadyForMerge();
|
|
29650
30015
|
actions.push(...closedPrReadyActions);
|
|
29651
30016
|
for (const a of closedPrReadyActions) addLog("action", a, state.patrolCycle);
|
|
30017
|
+
for (const a of await reconcileAutoMergeRows()) {
|
|
30018
|
+
actions.push(a);
|
|
30019
|
+
addLog("action", a, state.patrolCycle);
|
|
30020
|
+
}
|
|
29652
30021
|
const staleMergeBlockerActions = await reconcileStaleMergeBlockers();
|
|
29653
30022
|
actions.push(...staleMergeBlockerActions);
|
|
29654
30023
|
for (const a of staleMergeBlockerActions) addLog("action", a, state.patrolCycle);
|
|
30024
|
+
const branchInvalidationActions = await reconcileBranchInvalidation();
|
|
30025
|
+
actions.push(...branchInvalidationActions);
|
|
30026
|
+
for (const a of branchInvalidationActions) addLog("action", a, state.patrolCycle);
|
|
29655
30027
|
const stuckReadyActions = reconcileStuckReadyForMerge();
|
|
29656
30028
|
actions.push(...stuckReadyActions);
|
|
29657
30029
|
for (const a of stuckReadyActions) addLog("action", a, state.patrolCycle);
|
|
@@ -29733,7 +30105,7 @@ async function runPatrol() {
|
|
|
29733
30105
|
const issueId = runtimeState.currentIssue;
|
|
29734
30106
|
try {
|
|
29735
30107
|
if (getReviewStatusSync(issueId)?.mergeStatus === "merging") {
|
|
29736
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
30108
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
29737
30109
|
const resolved = resolveProjectFromIssueSync(issueId);
|
|
29738
30110
|
if (resolved) {
|
|
29739
30111
|
const branch = `feature/${issueId.toLowerCase()}`;
|
|
@@ -29747,7 +30119,7 @@ async function runPatrol() {
|
|
|
29747
30119
|
mergeStatus: "merged",
|
|
29748
30120
|
readyForMerge: false
|
|
29749
30121
|
});
|
|
29750
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
30122
|
+
const { postMergeLifecycle } = await import("./merge-agent-DQTXZk8z.js");
|
|
29751
30123
|
postMergeLifecycle(issueId, resolved.projectPath).catch((err) => console.warn(`[deacon] postMergeLifecycle failed for ${issueId}: ${err}`));
|
|
29752
30124
|
actions.push(`Auto-completed stale merge for ${issueId}`);
|
|
29753
30125
|
} else {
|
|
@@ -29927,7 +30299,7 @@ function startDeacon() {
|
|
|
29927
30299
|
logDeaconEventSync(`startDeacon: health monitor starting (patrol every ${config.patrolIntervalMs / 1e3}s)`);
|
|
29928
30300
|
(async () => {
|
|
29929
30301
|
await reconcileAgentLiveness();
|
|
29930
|
-
const { runBootAdvancingSelfHeal } = await import("./advancing-selfheal-
|
|
30302
|
+
const { runBootAdvancingSelfHeal } = await import("./advancing-selfheal-BNwqxseD.js");
|
|
29931
30303
|
await runBootAdvancingSelfHeal();
|
|
29932
30304
|
runScheduledPatrol("startup");
|
|
29933
30305
|
})().catch((err) => {
|
|
@@ -29997,6 +30369,6 @@ function assessDeaconPatrolFreshness(params) {
|
|
|
29997
30369
|
};
|
|
29998
30370
|
}
|
|
29999
30371
|
//#endregion
|
|
30000
|
-
export {
|
|
30372
|
+
export { checkStuckReviewing as $, reconcileTestStatusFromGreenCi as A, classifyMemoryPressure as At, isRapidPostResumeDeath as B, isSmeeConfiguredSync as Bt, handleAgentHeartbeatDeadEvent as C, contextProactiveCompactState as Ct, loadConfig as D, INSPECT_TIMEOUT_MS as Dt, isDeaconRunning as E, paneShowsClaudeBootBlockingScreen as Et, setAgentStoppedNotifier as F, getAcceptedSystemHealthSnapshot as Ft, isAutoResumableRole as G, nudgeStalledResumeWorkAgents as H, classifyAgentHealth as Ht, setMergeReadyNotifier as I, getDeployStaleness as It, startBootReconciliation as J, isBootReconciliationCandidate as K, startDeacon as L, getResourceConfig as Lt, runPatrol as M, formatUptime as Mt, saveState as N, getContainerHistory as Nt, loadState as O, checkInspectAgentTimeouts as Ot, setAgentStatusChangedNotifier as P, getCurrentDockerStats as Pt, checkCompletedButUnsignaledReviews as Q, stopDeacon as R, getSystemHealthEvidenceSnapshot as Rt, getLastPatrolResult as S, contextOverflowRecoveryState as St, handleAgentStoppedForOrphanReviewerSessions as T, deliverOrchestratedCompact as Tt, redeliverUndeliveredKickoffs as U, nudgeIdleWorkAgentsWithOpenBeads as V, startSmeeProcessSync as Vt, extendBootReconciliationGrace as W, monitorReviewConvoySignals as X, cleanupOrphanedReviewSessions as Y, synthesizeReviewFromReports as Z, cleanupOrphanedPlanningSessions as _, reconcileStaleMergeStatus as _t, checkCompletedButUnsignaledTests as a, recoverStalledReviewConvoys as at, getDeaconLogs as b, reconcileStuckMergingStates as bt, checkMergedWorkSessions as c, checkPostReviewCommits as ct, checkReadyForMergeStuck as d, checkFirstCompletionAgents as dt, isSynthesisForActiveReviewRun as et, checkStuckWorkAgents as f, ciRetryMap as ft, cleanupOrphanReviewerSessions as g, reconcileStaleMergeBlockers as gt, cleanupAbandonedFeedback as h, reconcileMergedButReviewing as ht, checkAwaitingTestWorkSessions as i, handleWorkCompleted as it, resetPatrolHeartbeatForStartup as j, getResourceStacks as jt, reconcileAgentLiveness as k, WORK_LAUNCHER_GRACE_MS as kt, checkOrphanedCompletions as l, autoCloseOut as lt, checkWorkspaceContainerHealth as m, reconcileFalseMerged as mt, assessDeaconPatrolFreshness as n, checkOrphanedReviewStatuses as nt, checkDeadEndAgents as o, reviewConvoyLiveness as ot, checkVerificationReviewContradiction as p, reconcileClosedPrReadyForMerge as pt, listBootReconciliationCandidates as q, checkAndSuspendIdleAgents as r, handleReviewCoordinatorDied as rt, checkMassDeath as s, stalledReviewConvoyRecoveryState as st, applyBootReconciliationDecision as t, checkMissingReviewStatuses as tt, checkPendingTestDispatch as u, checkFailedMergeRetry as ut, cleanupStaleAgentState as v, reconcileStuckReadyForMerge as vt, handleAgentStoppedEvent as w, stuckOverflowNativeRecoveryState as wt, getDeaconStatus as x, checkApiErrorAgents as xt, containerRestartBackoffMs as y, reconcileAutoMergeRows as yt, isPreKickoffLaunchDeath as z, getSystemHealthSnapshot as zt };
|
|
30001
30373
|
|
|
30002
|
-
//# sourceMappingURL=deacon-
|
|
30374
|
+
//# sourceMappingURL=deacon-pLRLbPvR.js.map
|