@overdeck/desktop 0.45.22 → 0.45.24
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 +2 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DDCnXF58.js} +5 -5
- package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BVwW4qRn.js} +6 -6
- package/server/{agent-gc-Dj2gncak.js → agent-gc-CHcnvonI.js} +4 -4
- package/server/agent-state-Bc3tzUC8.js +3 -0
- package/server/{agent-state-service-DistflNn.js → agent-state-service-BsgWxZuB.js} +5 -5
- package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-D5UGKIJL.js} +1 -1
- package/server/{agents-DXdHmRTC.js → agents-EbI0zCJl.js} +4 -4
- package/server/agents-wi9NWzs2.js +3 -0
- package/server/{archive-planning-Cp_DC1j-.js → archive-planning-BZDgzoEj.js} +1 -1
- package/server/{archive-planning-BvDuWNMo.js → archive-planning-Du25Jtst.js} +30 -6
- package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-CbEDfCDu.js} +2 -2
- package/server/assemble-J2ZZ2C15.js +339 -0
- package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-2R2jog7n.js} +3 -3
- package/server/{behavior-CGj16clS.js → behavior-B3exJ42O.js} +2 -2
- package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-D1wzUIWv.js} +2 -2
- package/server/{build-info-BRpqQvNd.js → build-info-CZk_TITh.js} +1 -1
- package/server/{build-info-NU3KbXYw.js → build-info-Ie_D0_BT.js} +3 -3
- package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-BI1Wxoku.js} +2 -2
- package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-DwbQoqrC.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-B5jFNi2G.js → checkpoints-BJIs5QIA.js} +1 -1
- package/server/{checkpoints-BJum14fs.js → checkpoints-CQB1h765.js} +2 -2
- package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-8Ngo8TpT.js} +1 -1
- package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-D8GXF3_s.js} +2 -2
- package/server/{claude-permissions-nSFKH78M.js → claude-permissions-DNWEVV6z.js} +2 -2
- package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CEdaqpWI.js} +2 -2
- package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-DWy-Bb4Y.js} +1 -1
- package/server/cli-B86rejVV.js +3 -0
- package/server/{cli-CbKNkFE5.js → cli-RoOx5DUf.js} +9 -9
- package/server/{cliproxy-Brf_5MuG.js → cliproxy-C8a1vtTU.js} +2 -2
- package/server/{cliproxy-bONZDBbC.js → cliproxy-fHfIeiGd.js} +1 -1
- package/server/{close-issue-CxReRxIc.js → close-issue-DoOifFIK.js} +5 -5
- package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-Bk3SU4RC.js} +9 -9
- package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CktPXo8m.js} +1 -1
- package/server/{codex-CbmztVcc.js → codex-BZXGhUVB.js} +27 -8
- package/server/codex-GcHuUF-k.js +3 -0
- package/server/{codex-parser-jl8AeAmB.js → codex-parser-CFZ1_1Jl.js} +2 -2
- package/server/{config-q4Gvd8dq.js → config-BZ0sHTju.js} +2 -2
- package/server/{config-DeTsoZdR.js → config-CKxYiCmX.js} +2 -2
- package/server/{config-BJKocXKd.js → config-DzV30TOm.js} +1 -1
- package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DySPNmKN.js} +77 -194
- package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-BaCVrH-N.js} +3 -3
- package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BhAY7TUd.js} +1 -1
- package/server/context-layers-BrPmE__h.js +4 -0
- package/server/context-layers-igZ4FI4_.js +37 -0
- package/server/{control-settings-D_odMIaC.js → control-settings-BQp7_4uD.js} +4 -4
- package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CgrR8YYp.js} +8 -8
- package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-eQB5CkOe.js} +1 -1
- package/server/{conversation-service-Dq33SYEj.js → conversation-service-BLd3MYsG.js} +1 -1
- package/server/{conversation-service-C3avRVEr.js → conversation-service-DPJ71F33.js} +329 -19
- package/server/{conversations-bYpM9-kZ.js → conversations-6AfUfbwc.js} +5 -5
- package/server/{conversations-H9if0bCQ.js → conversations-CAsJF9kh.js} +1 -1
- package/server/{cost-Codk1pc2.js → cost-B2ddP6wq.js} +18 -2
- package/server/{cost-wH46-WsJ.js → cost-R-m6Yi-W.js} +3 -3
- package/server/{cost-sync-D_cre6WM.js → cost-sync-BsN6ER0n.js} +3 -3
- package/server/{dag-CJpgf9A3.js → dag-B1ucnjDU.js} +9 -9
- package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-BXqeWVSf.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-CkT_kznS.js → deacon-CU_cAYSR.js} +406 -607
- package/server/{deacon-B8HbQdqU.js → deacon-kiQrb4ZT.js} +3 -3
- package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-6wVqAaqz.js} +3 -3
- package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-BXZZ1Z2-.js} +17 -17
- package/server/deacon-swarm-C-GwfjJy.js +2 -0
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-AiFoP8dw.js} +136 -19
- package/server/{deploy-window-wDf4UgHt.js → deploy-window-C3F-tihF.js} +77 -10
- package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-DkZraDyj.js} +1 -1
- package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-bcOWqdQE.js} +2 -2
- package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-_d6XhyND.js} +3 -3
- package/server/dist-Bzy0y69j.js +3 -0
- package/server/{dist-D-Ed5yVw.js → dist-Cb_0uvpS.js} +1 -1
- package/server/{docker-BCZ89M9X.js → docker-DcMTFTUC.js} +2 -2
- package/server/{dod-DbJLYcHv.js → dod-C6n9RV3G.js} +1 -1
- package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-BZgOhRo7.js} +1 -1
- package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DNi-ono3.js} +4 -4
- package/server/{esm-shims-dTeNdq7X.js → esm-shims-OSHAYaS1.js} +1 -1
- package/server/{event-store-TnWdydfB.js → event-store-CQL6NeqB.js} +3 -3
- package/server/{event-store-CpBGsO6_.js → event-store-EV2cMiXj.js} +1 -1
- package/server/{events-Dsuv6qyB.js → events-BTdrdEq8.js} +1 -1
- package/server/{events-DSUdR-04.js → events-DTfAe4My.js} +3 -3
- package/server/{factory-BMrK4TrE.js → factory-CFibJuaw.js} +50 -13
- package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-DKZFMbFt.js} +4 -4
- package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-BdPuLcBX.js} +2 -2
- package/server/{features-Bc-Bmiye.js → features-ez2271oH.js} +2 -2
- package/server/{feedback-target-DZ-iAnAa.js → feedback-target-7mqqwrX6.js} +7 -7
- package/server/{feedback-target-DS6NUuSs.js → feedback-target-CoFDHiM8.js} +1 -1
- package/server/{feedback-writer-BXP6g75N.js → feedback-writer-CY5L1lB7.js} +6 -5
- package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-D3a22RCd.js} +1 -1
- package/server/flywheel-DHrgCphM.js +1084 -0
- package/server/flywheel-DzGtWnJ1.js +477 -0
- package/server/flywheel-SVF02Jpq.js +2 -0
- package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-UU0tiUld.js} +10 -9
- package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-UUcsCDb6.js} +1 -1
- package/server/{forge-B1S_KZv4.js → forge-CNFnyqps.js} +2 -2
- package/server/forge-DXnS_YFH.js +2 -0
- package/server/{from-DpwQ-sc3.js → from-kNxT0bZC.js} +1 -1
- package/server/{fts-db-DmAcuCkV.js → fts-db-CE46vDkZ.js} +2 -2
- package/server/{fts-operations-7d_RkmWp.js → fts-operations-CqY6zl-i.js} +2 -2
- package/server/{git-utils-Cc3FHDKd.js → git-utils-CRw2zLPC.js} +68 -3
- package/server/git-utils-D0_yhCgF.js +3 -0
- package/server/{github-app-CDPtGF7J.js → github-app-C3QrAUd0.js} +27 -8
- package/server/{github-app-CU14oYzP.js → github-app-ClZ2lk8D.js} +1 -1
- package/server/{github-client-XjTJbBm7.js → github-client-BnIsSrEN.js} +2 -2
- package/server/{github-client-CwBZZ3t7.js → github-client-DfQYVUaw.js} +1 -1
- package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-D16NGsSO.js} +2 -2
- package/server/{harness-binary-B2CTcD84.js → harness-binary-DPUi-Pv8.js} +32 -6
- package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-3lNZkyT4.js} +18 -9
- package/server/{health-events-DREeevle.js → health-events-BBcTYQKU.js} +2 -2
- package/server/{health-events-C1whmd58.js → health-events-BDOHby5Q.js} +1 -1
- package/server/{hooks-yxRsjk-z.js → hooks-CKZgXlJb.js} +2 -2
- package/server/{hooks-B-HItBiS.js → hooks-DPVX1rwQ.js} +1 -1
- package/server/{hume-Dz_OymXE.js → hume-Cz8igP9E.js} +2 -2
- package/server/hume-ccTf4wTX.js +3 -0
- package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-CuLF0j2H.js} +1 -1
- package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-DDIRwxUY.js} +2 -2
- package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-CAAkqPLu.js} +2 -2
- package/server/{infra-D4iNWMA5.js → infra-BEqFxlJc.js} +14 -4
- package/server/{injection-D7T75Pye.js → injection-C8aiVJrF.js} +191 -183
- package/server/{injection-BVNa4MQW.js → injection-CPUIqNhI.js} +1 -1
- package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-BLuJ1AkT.js} +137 -81
- package/server/inspect-agent-Brtz0URj.js +2 -0
- package/server/{internal-token-C9DdEOKY.js → internal-token-BrcU6qfe.js} +1 -1
- package/server/{internal-token-CXsfxslp.js → internal-token-s0-oKybJ.js} +2 -2
- package/server/{io-DQR9PMgS.js → io-C9kF1wtJ.js} +160 -184
- package/server/{issue-closed-DtmJM0D0.js → issue-closed-CDJk4pIp.js} +7 -7
- package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-B8sZHVHh.js} +1 -1
- package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-ojZAzDBP.js} +22 -22
- package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-BvJ09SaR.js} +1 -1
- package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-Yx5DdmVJ.js} +8 -8
- package/server/{issues-pDW9VUNz.js → issues-BMmP_77e.js} +2 -2
- package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-BXSlHwEh.js} +3 -3
- package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-B0UJwnv5.js} +3 -3
- package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-B4iOAjlC.js} +4 -4
- package/server/{launcher-generator-COgR2By1.js → launcher-generator-BBWG_SiS.js} +105 -10
- package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-BREGpnLk.js} +37 -37
- package/server/lifecycle-io-DPo7x11I.js +3 -0
- package/server/{lifecycle-CtPDcZ9u.js → lifecycle-xmBfK2GJ.js} +6 -6
- package/server/lifecycle-yPd___5E.js +121 -0
- package/server/{linear-client-DsFkIxee.js → linear-client-BsuUvkdA.js} +2 -2
- package/server/{linear-client-YwZMDIwQ.js → linear-client-CTskEeT_.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-BwsyNRJV.js → merge-B1DiziGU.js} +1 -1
- package/server/{merge-C1t-bspg.js → merge-CefQNAnq.js} +3 -3
- package/server/{merge-agent-DDiIjzk-.js → merge-agent-4WOWlSYA.js} +28 -28
- package/server/{merge-agent-B-SnXOoc.js → merge-agent-CKkgIBPB.js} +1 -1
- package/server/{merge-batch-Byt-QnEl.js → merge-batch-ClFn2T-y.js} +1 -1
- package/server/merge-ops-CR44oU9-.js +2 -0
- package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-BfaTyXsw.js} +2 -2
- package/server/merge-set-DJ8-UErs.js +83 -0
- package/server/{merge-set-6LEglm6o.js → merge-set-bUqbm3yc.js} +1 -1
- package/server/{merge-sync-B95_4in_.js → merge-sync-BJYeOODr.js} +1 -1
- package/server/{merge-sync-Do8_q32h.js → merge-sync-VPV28g0g.js} +2 -2
- package/server/{merge-train-CKana8EH.js → merge-train-CHopycP0.js} +3 -3
- package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-D1cOZzy2.js} +4 -4
- package/server/{merge-verification-CqnUzGEK.js → merge-verification-BkaOqPsw.js} +4 -4
- package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-duPAfSBw.js} +2 -2
- package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Nw29vaFb.js} +11 -8
- package/server/node_modules/.package-lock.json +8 -8
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
- package/server/node_modules/undici/README.md +5 -0
- package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
- package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
- package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
- package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
- package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
- package/server/node_modules/undici/docs/docs/index.md +5 -0
- package/server/node_modules/undici/lib/core/request.js +1 -1
- package/server/node_modules/undici/lib/core/util.js +6 -1
- package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
- package/server/node_modules/undici/lib/dispatcher/client-h1.js +31 -6
- package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
- package/server/node_modules/undici/lib/handler/cache-handler.js +93 -5
- package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
- package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
- package/server/node_modules/undici/lib/handler/retry-handler.js +6 -4
- package/server/node_modules/undici/lib/interceptor/cache.js +21 -4
- package/server/node_modules/undici/lib/interceptor/decompress.js +4 -0
- package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
- package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
- package/server/node_modules/undici/lib/util/cache.js +49 -7
- package/server/node_modules/undici/lib/web/fetch/body.js +2 -1
- package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
- package/server/node_modules/undici/package.json +2 -2
- package/server/node_modules/undici/types/client.d.ts +2 -2
- package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
- package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
- package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-BvKkWMJQ.js} +15 -13
- package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-CTSGcK8p.js} +1 -1
- package/server/package-lock.json +9 -9
- package/server/package.json +1 -1
- package/server/{pan-dir-DOcf6ug3.js → pan-dir-B0c3w0Ya.js} +78 -58
- package/server/{paths-DooHpt9p.js → paths-D-xWGHdh.js} +2 -2
- package/server/{pickup-CaskQ7j6.js → pickup-DUCLWrJY.js} +17 -16
- package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-mY3GprlK.js} +186 -67
- package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-BJr8gQX6.js} +1 -1
- package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-BXkJzDC4.js} +2 -2
- package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-C0MWUeCU.js} +2 -2
- package/server/project-repos-B6GycDh9.js +94 -0
- package/server/project-repos-DXKQsc_m.js +3 -0
- package/server/projects-vjjcmiN8.js +3 -0
- package/server/{prompts-EvhMeeHG.js → prompts-DxzFXuLl.js} +2 -2
- package/server/{providers-BDDPULlp.js → providers-qQAwGQDW.js} +7 -7
- package/server/{providers-DNSQqy2V.js → providers-u4Ga0jOr.js} +1 -1
- package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-BamJdinX.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-DfOB8-w4.js} +1 -1
- package/server/public/assets/{dist-DukGS2YZ.js → dist-ByIuzMQW.js} +3 -3
- package/server/public/assets/{dist-Bio7THQU.js → dist-D7zYSEA6.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-EdmRyXL3.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-MerOfTX8.js} +1 -1
- package/server/public/assets/{index-Bwejq-5s.js → index-CWeMerGO.js} +147 -144
- package/server/public/assets/index-CenuJ3Cw.css +1 -0
- package/server/public/assets/{linear-qUWmMZ-c.js → linear-BBbArIcK.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-BKIddiJN.js} +1 -1
- package/server/public/assets/{prod-C8VtLuWC.js → prod-B8vYiu52.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-D6RtoULk.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-CLrCedZX.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-hznR8DYl.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-By_BteaL.js → pull-requests-7N8WKseP.js} +1 -1
- package/server/{pull-requests-8z2N1UOV.js → pull-requests-_lHueOHW.js} +13 -11
- package/server/{queries-ZABd5aXP.js → queries-CjNIf-Ub.js} +1200 -201
- package/server/{rally-i_goYmiA.js → rally-CyWT_lNO.js} +3 -3
- package/server/{rally-api-DqKqIMNR.js → rally-api-C8e_1JRi.js} +2 -2
- package/server/{rally-api-xHazRk0d.js → rally-api-ClOSd-Tt.js} +1 -1
- package/server/{rally-client-COYz1vYR.js → rally-client-lc-nokqr.js} +4 -4
- package/server/{rally-client-CGWEHaPd.js → rally-client-sgtVqzNU.js} +1 -1
- package/server/rally-zhhtXuDP.js +3 -0
- package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-7KeHv1R1.js} +1 -1
- package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-BtHPo6Xc.js} +1 -1
- package/server/rebuild-stack-CFvcBHsS.js +4 -0
- package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-lwtsW0GO.js} +26 -35
- package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-C3Ui7ojV.js} +6 -6
- package/server/record-CN0pj4_5.js +3 -0
- package/server/{record-update-D3N6WMFR.js → record-update-bLJxAXH4.js} +1 -1
- package/server/record-update-dE1Aw83j.js +310 -0
- package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BvRWfUXM.js} +2 -2
- package/server/{release-engine-DMINVN8S.js → release-engine-Cx48W7z8.js} +5 -5
- package/server/{release-set-DeUSOEHy.js → release-set-CQfuN9-v.js} +3 -3
- package/server/{remote-b-c5bOce.js → remote-C_2hasl7.js} +3 -3
- package/server/{remote-Dr5kGYSZ.js → remote-ChgimyYa.js} +3 -3
- package/server/{remote-agents-Ct_WOyke.js → remote-agents-By1ige5O.js} +6 -6
- package/server/{remote-agents-D6O_zETW.js → remote-agents-CA3Ihlxj.js} +1 -1
- package/server/{remote-completion-Dca3hAaa.js → remote-completion-fVe9e_3u.js} +12 -12
- package/server/resume-BFv1PGpA.js +3 -0
- package/server/{review-agent-CThvgK2r.js → review-agent-CIGOQYBD.js} +29 -25
- package/server/{review-agent-CCum8sGe.js → review-agent-DNboMyW4.js} +1 -1
- package/server/{review-artifacts-CXywD0F2.js → review-artifacts-nRDPuMxd.js} +5 -5
- package/server/{review-context-OYfKUprb.js → review-context-2uj-YQ8J.js} +70 -26
- package/server/review-status-btEYlaxA.js +3 -0
- package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-Dci-ZwEt.js} +3 -3
- package/server/{review-status-DFRjDFef.js → review-status-kZj_KyCk.js} +77 -28
- package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BTOpxtTC.js} +10 -5
- package/server/{review-status-sync-D60PJWNL.js → review-status-sync-DSDK3OMy.js} +1 -1
- package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CCjVA7Uk.js} +6 -6
- package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-CTd4QMBu.js} +1 -1
- package/server/{rollup-CZ02qgxk.js → rollup-BKQC7jp4.js} +1 -1
- package/server/{rollup-SyuF09e4.js → rollup-FGsKki9R.js} +8 -8
- package/server/{scanner-Br0Z5S6R.js → scanner-CnqEZeDy.js} +45 -14
- package/server/{sequence-io-fxU0DlwW.js → sequence-io-D909zgeH.js} +4 -4
- package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-CzkcK6P5.js} +5 -5
- package/server/server.js +2961 -919
- package/server/{service-Bagb90KZ.js → service-CLeAoU6G.js} +55 -54
- package/server/{session-fork-BqQxd-V6.js → session-fork-CHI1XvL9.js} +2 -2
- package/server/{session-history-XdS0JKp3.js → session-history-BT3IvqhC.js} +4 -4
- package/server/settings-66A6uvIA.js +2 -0
- package/server/{settings-BNbocWOg.js → settings-BTMvpNFU.js} +3 -3
- package/server/{settings-uLc6DEYI.js → settings-C0zgxOGf.js} +2 -2
- package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BJfgm-hX.js} +2 -2
- package/server/{shadow-state-C_NkP-sa.js → shadow-state-7a-524T8.js} +2 -2
- package/server/{shadow-state-CbvsN3qG.js → shadow-state-DnDyjujH.js} +1 -1
- package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-Db3oroFG.js} +2 -2
- package/server/{ship-log-__QtAFXG.js → ship-log-D9MlVzYU.js} +1 -1
- package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CV2ukKND.js} +1 -1
- package/server/{smart-compaction-CLZOWin1.js → smart-compaction-KCYScAU1.js} +7 -7
- package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DKpdFyOC.js} +35 -27
- package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-qUC2VWu3.js} +1 -1
- package/server/{specialist-completion-CqmduO92.js → specialist-completion-Ky9wCDpb.js} +1 -1
- package/server/{specialist-context-CJ-QjFR-.js → specialist-context-Bn3dCGS2.js} +5 -5
- package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-CMEwYxa2.js} +2 -2
- package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-C5p8G7tx.js} +3 -3
- package/server/{specialists-Bg9v4z3F.js → specialists-CC4r-c2s.js} +1015 -460
- package/server/{specialists-D0gGXMZx.js → specialists-CShuVGWT.js} +1 -1
- package/server/specialists-DM6bWjsi.js +3 -0
- package/server/{specialists-CwZHb5cb.js → specialists-jiuuyVkp.js} +66 -74
- package/server/specs-C8Wsn2XO.js +3 -0
- package/server/{src-BMMoA_ba.js → src-CXmtj0im.js} +6 -6
- package/server/{src-Bqdtd6po.js → src-CdmnTM2m.js} +5 -5
- package/server/{src-k039WVYY.js → src-DtcUOZCq.js} +112 -18
- package/server/stack-health-Bn3o8FBX.js +3 -0
- package/server/{stack-health-C-ifC7b0.js → stack-health-DxSdG9cW.js} +63 -9
- package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-KJKxxiiQ.js} +4 -4
- package/server/{staleness-_Tr-GwdA.js → staleness-CT34nwr9.js} +1 -1
- package/server/{staleness-BID1BKdr.js → staleness-DPm7ClwA.js} +15 -3
- package/server/{state-home-CONQvZR0.js → state-home-Cn_Qu8IX.js} +96 -44
- package/server/{state-migrate-BeBW0KXA.js → state-migrate-BGg2ZaOt.js} +12 -3
- package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-DYuPRYYw.js} +307 -26
- package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-s9_2qfi6.js} +1 -1
- package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-B-FwCs5V.js} +3 -3
- package/server/{summary-fork-bX6ax6X7.js → summary-fork-D1RAk9rJ.js} +78 -12
- package/server/{summary-fork-agEMsPSo.js → summary-fork-DpcxN9tf.js} +2 -2
- package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-Csw5tqfJ.js} +2 -41
- package/server/supervisor/pty-supervisor.js +2 -1
- package/server/supervisor/pty-token-x-ea28Us.js +43 -0
- package/server/supervisor-FTJAIsAK.js +2 -0
- package/server/{supervisor-Ctt4eRYz.js → supervisor-wM4ooB5O.js} +3 -3
- package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-DlP_UjHq.js} +4 -4
- package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-DUDj1YHf.js} +56 -29
- package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-DeTTImn-.js} +15 -15
- package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-MbxX5vqq.js} +7 -7
- package/server/{test-verdict-Cp5tljlJ.js → test-verdict-bWYBtqBg.js} +1 -1
- package/server/{test-verdict-D_-sXIz_.js → test-verdict-gscuksPv.js} +1 -1
- package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-BYFkts95.js} +1 -1
- package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-C-69c3OI.js} +2 -2
- package/server/tmux-B6z7h_vZ.js +3 -0
- package/server/{tmux-L5LgvGLp.js → tmux-R7N7y-Mh.js} +76 -44
- package/server/{token-BkQLy4yS.js → token-BK6t8BIT.js} +2 -2
- package/server/token-util-DuPuNriz.js +3 -0
- package/server/{token-util-DI8sGlmF.js → token-util-DxXu-vd1.js} +1 -1
- package/server/{tracker-config-DdT-nUAM.js → tracker-config-G6latr8C.js} +2 -2
- package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-B4ylXZQK.js} +1 -1
- package/server/{tracker-utils-CawsPSS2.js → tracker-utils-DHv5pSDT.js} +2 -2
- package/server/{traefik-connect-C6mJckNs.js → traefik-connect-Df2uXPsQ.js} +1 -1
- package/server/{tunnel-IdK1iTHx.js → tunnel-CDVKJpRv.js} +3 -3
- package/server/{tunnel-BIFl98rc.js → tunnel-DGdUkGoZ.js} +1 -1
- package/server/{types-7-GnJn0t.js → types-5M0lupud.js} +1 -1
- package/server/{uat-train-0Ujk8GCv.js → uat-train-B05BWkp-.js} +1 -1
- package/server/{uat-train-j0cPeMSj.js → uat-train-DDSrSoV1.js} +28 -28
- package/server/validate-IfDGkaVR.js +177 -0
- package/server/{validation-DcAgXTQp.js → validation-CC9OPqJZ.js} +1 -1
- package/server/{validation-CabEISJT.js → validation-Dw1pzDzr.js} +259 -9
- package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-B3itKTxu.js} +1 -1
- package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-TVFSz_q1.js} +1 -1
- package/server/{verification-runner-DlJezzef.js → verification-runner-BW4HOKAz.js} +1 -1
- package/server/{verification-runner-FiuAZ-H2.js → verification-runner-CkgX6EtI.js} +174 -124
- package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DYPbKcIJ.js} +1 -1
- package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Du8Vh2aJ.js} +13 -13
- package/server/workflows-BQu4RFQ-.js +2 -0
- package/server/{workflows-BZNNYkGC.js → workflows-mbQzh6mQ.js} +39 -77
- package/server/{workspace-3IC-UkAi.js → workspace--8tnhDI0.js} +1 -1
- package/server/{workspace-D9ppycdg.js → workspace-BPUws1-_.js} +3 -3
- package/server/{workspace-config-Bigl_-Lk.js → workspace-config-CIVWZOQr.js} +1 -1
- package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-CBhNdzE4.js} +76 -18
- package/server/workspace-manager-CWT55qeI.js +3 -0
- package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-BzHnwwX4.js} +1 -1
- package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-_WygnyoX.js} +2 -2
- package/server/{workspaces-CFPcL0vl.js → workspaces-Do_9J0LQ.js} +309 -124
- package/sync-sources/agents/pan-inspect-agent.md +1 -1
- package/sync-sources/agents/pan-merge-agent.md +1 -1
- package/sync-sources/agents/pan-planning-agent.md +4 -4
- package/sync-sources/agents/pan-work-agent.md +1 -1
- package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
- package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
- package/sync-sources/hooks/record-cost-event.js +369 -75
- package/sync-sources/hooks/session-start-hook +7 -0
- package/sync-sources/hooks/work-agent-stop-hook +1 -1
- package/sync-sources/rules/per-bead-durability.md +1 -1
- package/sync-sources/rules/prd-authoring.md +1 -1
- package/sync-sources/skills/feature-work/SKILL.md +1 -1
- package/sync-sources/skills/okf/README.md +11 -3
- package/sync-sources/skills/okf/SKILL.md +12 -1
- package/sync-sources/skills/okf/docs/USAGE.md +15 -0
- package/sync-sources/skills/okf/references/overdeck.md +28 -0
- package/sync-sources/skills/pan/SKILL.md +2 -2
- package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
- package/sync-sources/skills/pan-approve/SKILL.md +1 -1
- package/sync-sources/skills/pan-close/SKILL.md +1 -1
- package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
- package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
- package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
- package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
- package/sync-sources/skills/pan-orders/SKILL.md +33 -0
- package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
- package/sync-sources/skills/pan-plan/SKILL.md +6 -6
- package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
- package/sync-sources/skills/pan-recap/SKILL.md +2 -2
- package/sync-sources/skills/pan-review/SKILL.md +1 -1
- package/sync-sources/skills/pan-start/SKILL.md +7 -3
- package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/sync-sources/skills/pan-task/SKILL.md +2 -2
- package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
- package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
- package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
- package/sync-sources/skills/plan/SKILL.md +11 -11
- package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
- package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
- package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
- package/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
- package/server/agent-state-Co5Sy2Fw.js +0 -3
- package/server/agents-DyHKlq1I.js +0 -3
- package/server/cli-BRORS9qY.js +0 -3
- package/server/codex-DNyiQDKW.js +0 -3
- package/server/context-layers-15gDOk20.js +0 -165
- package/server/context-layers-DlQKkHH2.js +0 -4
- package/server/deacon-swarm-CV54eNmU.js +0 -2
- package/server/dist-j64RzSrQ.js +0 -3
- package/server/flywheel-6WHU4O7A.js +0 -207
- package/server/flywheel-COR0mbRI.js +0 -522
- package/server/flywheel-Ctr5uuvo.js +0 -2
- package/server/forge-B0_opi-V.js +0 -2
- package/server/git-utils-CsKGnzFA.js +0 -3
- package/server/hume-BmhvfVbV.js +0 -3
- package/server/inspect-agent-Dq0z1k3H.js +0 -2
- package/server/layers-Cp1To4L8.js +0 -93
- package/server/lifecycle-io-DmY2qwCn.js +0 -3
- package/server/merge-blockers-BYjeXrVN.js +0 -41
- package/server/merge-ops-DwWCkSgo.js +0 -2
- package/server/merge-set-DiISXcC-.js +0 -139
- package/server/projects-BKkwpH6q.js +0 -3
- package/server/public/assets/index-Bdc4V9ba.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
- package/server/rally-OSJXdiHK.js +0 -3
- package/server/rebuild-stack-CKjJAI8L.js +0 -3
- package/server/record-rwK-nKv_.js +0 -3
- package/server/record-update-Crz74r-6.js +0 -168
- package/server/resume-wZZsWtzz.js +0 -3
- package/server/review-status-Bnh-rdkY.js +0 -3
- package/server/settings-BlUsVaUc.js +0 -2
- package/server/specialists-Dqe6_HE5.js +0 -3
- package/server/specs-BhOKBzqk.js +0 -3
- package/server/stack-health-Bd06frFn.js +0 -3
- package/server/supervisor-COVHrBTg.js +0 -2
- package/server/tmux-BAvtac_u.js +0 -3
- package/server/token-util-BArZLN6w.js +0 -3
- package/server/workflows-C4mR0Reb.js +0 -2
- package/server/workspace-manager-B1WOfKvB.js +0 -3
|
@@ -1,60 +1,60 @@
|
|
|
1
1
|
import { i as __require, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import {
|
|
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 { Gr as sessionFilePath, Gt as reconcileStatePlaneDrift, Jt as getMainDivergence, Nt as readIssueRecordSync, Ot as init_record, Tn as init_projects, Ut as init_auto_commit, Vr as init_paths, Yt as init_state_plane, Zt as isStatePlanePath, b as DEFAULT_CONFIG$1, f as loadConfigSync, hr as AGENTS_DIR, kn as listProjectsSync, mr as init_errors, qt as STATE_PLANE_PATHS, s as init_load, wr as OVERDECK_HOME, x as init_defaults, yn as getProjectSync, zn as resolveProjectFromIssueSync } from "./config-yaml-DySPNmKN.js";
|
|
3
|
+
import { n as init_build_info, t as getBuildInfo } from "./build-info-Ie_D0_BT.js";
|
|
4
|
+
import { n as getDashboardIdentity, t as recordDeaconNudge } from "./deacon-nudge-log-6wVqAaqz.js";
|
|
5
5
|
import { a as init_activity_logger, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-DDlOIAML.js";
|
|
6
|
-
import { n as updateIssueRecord, t as init_record_update } from "./record-update-
|
|
7
|
-
import {
|
|
8
|
-
import { a as init_event_store, i as initEventStore } from "./event-store-
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { c as listAllAgentsSync, d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-
|
|
12
|
-
import {
|
|
13
|
-
import { c as logDeaconEventSync, l as getRuntimeSnapshot, o as init_persistent_logger, s as logAgentLifecycleSync, u as init_agent_runtime_mirror } from "./session-history-
|
|
14
|
-
import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-
|
|
15
|
-
import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-
|
|
16
|
-
import { c as init_review_status_sync, l as markWorkspaceStuck } from "./review-status-sync-
|
|
6
|
+
import { n as updateIssueRecord, t as init_record_update } from "./record-update-dE1Aw83j.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-R7N7y-Mh.js";
|
|
8
|
+
import { a as init_event_store, i as initEventStore } from "./event-store-CQL6NeqB.js";
|
|
9
|
+
import { E as projectLegacySystemHealthSummary, t as init_src } from "./src-DtcUOZCq.js";
|
|
10
|
+
import { C as needsReviewDispatch, S as init_review_dispatch_decision, b as setReviewStatusSync, c as getReviewStatusSync, d as loadReviewStatuses, g as reviewGatesPassedSync, l as init_review_status } from "./review-status-kZj_KyCk.js";
|
|
11
|
+
import { c as listAllAgentsSync, d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-EbI0zCJl.js";
|
|
12
|
+
import { Ar as saveAgentRuntimeState, Ct as tryReserveAdvancingSlot, Dr as getAgentRuntimeState, Dt as init_memory_verdict_cache, Fr as init_codex_auth, Ft as init_transcript_landing, G as resumeAgent, Gn as getAgentDir, Hn as clearAgentTroubledSync, Ir as paneShowsCodexAuthBurn, J as isContextOverflowTail, K as init_context_overflow, Nr as applyCodexAuthBurnFlag, Or as getAgentRuntimeStateSync, Ot as setCachedMemoryVerdict, Pt as captureTranscriptUserRecordSnapshot, St as resetPatrolDispatchBudget, Tt as workResumeSlotsAvailable, Un as clearYieldForResumeSync, X as messageAgent, Xn as init_agent_state, Y as init_messaging, Yn as getAgentStateSync, _ as init_linux, a as listRunningAgentsSync, b as init_agents$1, bt as releaseAdvancingSlot, c as getRuntimeCensus, cr as saveAgentState, dr as setAgentPausedSync, dt as init_termination, fr as setAgentYieldedSync, ft as stopAgent, g as LINUX_MEMORY_PRESSURE_DEFAULTS, gt as describeRunningAgents, h as init_collector, i as listRunningAgents, ir as recordAgentFailure, jn as buildResumeContinueMessage, jt as deliverInitialPromptWithRetry, kr as init_runtime_state, lr as saveAgentStateSync, m as createHostHealthCollector, mt as countRunningAgents, n as init_queries, qn as getAgentState, r as listAgentStates, s as descendantPidsForSession, sr as resetAgentFailureCount, tr as markAgentRunningState, u as init_runtime_census, v as DARWIN_MEMORY_PRESSURE_DEFAULTS, vt as getConcurrencyLimits, y as init_darwin, yt as init_concurrency } from "./queries-CjNIf-Ub.js";
|
|
13
|
+
import { c as logDeaconEventSync, l as getRuntimeSnapshot, o as init_persistent_logger, s as logAgentLifecycleSync, u as init_agent_runtime_mirror } from "./session-history-BT3IvqhC.js";
|
|
14
|
+
import { i as resolveGitHubIssueSync, n as init_tracker_utils } from "./tracker-utils-DHv5pSDT.js";
|
|
15
|
+
import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-s0-oKybJ.js";
|
|
16
|
+
import { c as init_review_status_sync, l as markWorkspaceStuck } from "./review-status-sync-BTOpxtTC.js";
|
|
17
17
|
import { i as readReviewStatusMap, n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-CxuEjLGg.js";
|
|
18
|
-
import { m as readWorkspacePlanSync, o as init_io } from "./io-
|
|
19
|
-
import { f as init_config, m as loadConfigSync$1, p as loadConfig$1 } from "./config-
|
|
20
|
-
import { T as stampBootReconciliation, h as setBootReconciliationDecision, l as isDeaconGloballyPaused, r as getBootReconciliationState, s as init_control_settings } from "./control-settings-
|
|
21
|
-
import {
|
|
22
|
-
import { l as init_dag, o as getDispatchableItems } from "./dag-
|
|
23
|
-
import { a as loadCloisterConfigSync, i as loadCloisterConfig, r as init_config$1 } from "./config-
|
|
24
|
-
import { a as findRecreatedLegacyStatePaths, o as init_state_home } from "./state-home-
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import { a as
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import { n as init_issue_closed, r as isIssueClosed } from "./issue-closed-
|
|
36
|
-
import { n as shouldSkipDispatchAsMerged, t as init_merge_verification } from "./merge-verification-
|
|
37
|
-
import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-
|
|
38
|
-
import { n as reconcileTraefikNetworks, t as init_traefik_connect } from "./traefik-connect-
|
|
39
|
-
import { g as decideAgentAutonomousRedrive, r as coordinateSwarmSlots, y as listFeatureWorkspaces } from "./deacon-swarm-
|
|
40
|
-
import { t as recordRecoveryFailure } from "./recovery-trip-
|
|
41
|
-
import { n as isExplicitNoResumeRequest, t as init_no_resume_mode } from "./no-resume-mode-
|
|
42
|
-
import { n as reconcileClosedIssueAgents } from "./closed-issue-reaper-
|
|
43
|
-
import { n as init_label_reconciler, r as reconcilePipelineLabelsPatrol } from "./label-reconciler-
|
|
44
|
-
import { a as spawnWorkAgentThroughAgentsEndpoint, i as reconcileOrphanProposedSpecs, o as triggerRebuildAndStart } from "./orphan-proposed-reconciler-
|
|
45
|
-
import { n as reconcileIdleWorkspaceStacks } from "./idle-stack-reaper-
|
|
46
|
-
import { i as readTestVerdictArtifact, n as decideUnsignaledTestAction, r as init_test_verdict } from "./test-verdict-
|
|
18
|
+
import { m as readWorkspacePlanSync, o as init_io } from "./io-C9kF1wtJ.js";
|
|
19
|
+
import { f as init_config, m as loadConfigSync$1, p as loadConfig$1 } from "./config-BZ0sHTju.js";
|
|
20
|
+
import { T as stampBootReconciliation, h as setBootReconciliationDecision, l as isDeaconGloballyPaused, r as getBootReconciliationState, s as init_control_settings } from "./control-settings-BQp7_4uD.js";
|
|
21
|
+
import { d as init_docker_stats, u as DockerStatsCollector } from "./stack-health-DxSdG9cW.js";
|
|
22
|
+
import { l as init_dag, o as getDispatchableItems } from "./dag-B1ucnjDU.js";
|
|
23
|
+
import { a as loadCloisterConfigSync, i as loadCloisterConfig, r as init_config$1 } from "./config-CKxYiCmX.js";
|
|
24
|
+
import { a as findRecreatedLegacyStatePaths, o as init_state_home } from "./state-home-Cn_Qu8IX.js";
|
|
25
|
+
import { M as withConcurrencyLimit, j as init_concurrency$1 } from "./github-app-C3QrAUd0.js";
|
|
26
|
+
import { a as isAgentIdleForNudge, t as checkStuckAgentRemediation } from "./stuck-remediation-DYuPRYYw.js";
|
|
27
|
+
import { n as __filename, r as init_esm_shims } from "./esm-shims-OSHAYaS1.js";
|
|
28
|
+
import { i as init_staleness, r as computeBuildStaleness } from "./staleness-DPm7ClwA.js";
|
|
29
|
+
import { a as pidsWithCwdUnder, i as sweepAutoCloseOutCache, n as pruneTerminalStoppedAgents, r as getAutoCloseOutCanonicalState } from "./agent-gc-CHcnvonI.js";
|
|
30
|
+
import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-CY5L1lB7.js";
|
|
31
|
+
import { r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-7mqqwrX6.js";
|
|
32
|
+
import { a as init_review_convoy_liveness, c as init_review_monitor, i as evaluateReviewConvoyLiveness, o as reviewTimestampMs, r as init_in_flight_guard, s as REVIEW_SUB_ROLES, t as createInFlightGuard } from "./in-flight-guard-CAAkqPLu.js";
|
|
33
|
+
import { J as parseReviewerSessionName, U as getTmuxSessionName, g as getAllProjectSpecialistStatuses, t as init_specialists } from "./specialists-jiuuyVkp.js";
|
|
34
|
+
import { a as inferBranchFromWorkspace, i as findWorkspacePath, o as init_archive_planning } from "./archive-planning-Du25Jtst.js";
|
|
35
|
+
import { n as init_issue_closed, r as isIssueClosed } from "./issue-closed-CDJk4pIp.js";
|
|
36
|
+
import { n as shouldSkipDispatchAsMerged, t as init_merge_verification } from "./merge-verification-BkaOqPsw.js";
|
|
37
|
+
import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-CCjVA7Uk.js";
|
|
38
|
+
import { n as reconcileTraefikNetworks, t as init_traefik_connect } from "./traefik-connect-Df2uXPsQ.js";
|
|
39
|
+
import { g as decideAgentAutonomousRedrive, r as coordinateSwarmSlots, y as listFeatureWorkspaces } from "./deacon-swarm-BXZZ1Z2-.js";
|
|
40
|
+
import { t as recordRecoveryFailure } from "./recovery-trip-BvRWfUXM.js";
|
|
41
|
+
import { n as isExplicitNoResumeRequest, t as init_no_resume_mode } from "./no-resume-mode-Nw29vaFb.js";
|
|
42
|
+
import { n as reconcileClosedIssueAgents } from "./closed-issue-reaper-Bk3SU4RC.js";
|
|
43
|
+
import { n as init_label_reconciler, r as reconcilePipelineLabelsPatrol } from "./label-reconciler-B4iOAjlC.js";
|
|
44
|
+
import { a as spawnWorkAgentThroughAgentsEndpoint, i as reconcileOrphanProposedSpecs, o as triggerRebuildAndStart } from "./orphan-proposed-reconciler-BvKkWMJQ.js";
|
|
45
|
+
import { n as reconcileIdleWorkspaceStacks } from "./idle-stack-reaper-DDIRwxUY.js";
|
|
46
|
+
import { i as readTestVerdictArtifact, n as decideUnsignaledTestAction, r as init_test_verdict } from "./test-verdict-bWYBtqBg.js";
|
|
47
47
|
import { createRequire } from "node:module";
|
|
48
48
|
import { join } from "node:path";
|
|
49
49
|
import { Effect } from "effect";
|
|
50
50
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "fs";
|
|
51
51
|
import { dirname as dirname$1, join as join$1 } from "path";
|
|
52
52
|
import { cpus, loadavg } from "os";
|
|
53
|
-
import {
|
|
53
|
+
import { freemem as freemem$1, homedir as homedir$1, platform as platform$1, totalmem as totalmem$1 } from "node:os";
|
|
54
54
|
import { closeSync as closeSync$1, existsSync as existsSync$1, openSync as openSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, unlinkSync as unlinkSync$1, writeFileSync as writeFileSync$1 } from "node:fs";
|
|
55
55
|
import { readFile } from "node:fs/promises";
|
|
56
56
|
import { readFile as readFile$1, readdir as readdir$1, writeFile as writeFile$1 } from "fs/promises";
|
|
57
|
-
import { exec, execFile, spawn } from "node:child_process";
|
|
57
|
+
import { exec, execFile, execFileSync, spawn } from "node:child_process";
|
|
58
58
|
import { promisify } from "node:util";
|
|
59
59
|
import { exec as exec$1, execFile as execFile$1, spawn as spawn$1 } from "child_process";
|
|
60
60
|
import { promisify as promisify$1 } from "util";
|
|
@@ -89,6 +89,10 @@ init_termination();
|
|
|
89
89
|
init_messaging();
|
|
90
90
|
init_context_overflow();
|
|
91
91
|
init_agents$1();
|
|
92
|
+
init_darwin();
|
|
93
|
+
init_linux();
|
|
94
|
+
init_collector();
|
|
95
|
+
init_runtime_census();
|
|
92
96
|
init_queries();
|
|
93
97
|
const STARTUP_GRACE_MS = 300 * 1e3;
|
|
94
98
|
const ACTIVITY_WARNING_MS = 900 * 1e3;
|
|
@@ -22038,401 +22042,6 @@ function resolveSystemHealthConfig(options = {}) {
|
|
|
22038
22042
|
}, options.warn);
|
|
22039
22043
|
}
|
|
22040
22044
|
//#endregion
|
|
22041
|
-
//#region ../../lib/system-health/types.ts
|
|
22042
|
-
function available(value) {
|
|
22043
|
-
return {
|
|
22044
|
-
status: "available",
|
|
22045
|
-
value
|
|
22046
|
-
};
|
|
22047
|
-
}
|
|
22048
|
-
function unavailable(reason) {
|
|
22049
|
-
return {
|
|
22050
|
-
status: "unavailable",
|
|
22051
|
-
reason
|
|
22052
|
-
};
|
|
22053
|
-
}
|
|
22054
|
-
//#endregion
|
|
22055
|
-
//#region ../../lib/system-health/darwin.ts
|
|
22056
|
-
const execFileAsync$8 = promisify(execFile);
|
|
22057
|
-
const COMMAND_TIMEOUT_MS = 5e3;
|
|
22058
|
-
const MIB = 1024 ** 2;
|
|
22059
|
-
const DARWIN_MEMORY_PRESSURE_DEFAULTS = Object.freeze({
|
|
22060
|
-
warningFreePercent: 10,
|
|
22061
|
-
criticalFreePercent: 5,
|
|
22062
|
-
swapActivityWarningBytesPerMinute: 64 * MIB,
|
|
22063
|
-
swapActivityCriticalBytesPerMinute: 256 * MIB
|
|
22064
|
-
});
|
|
22065
|
-
function parseDarwinMemoryPressure(content) {
|
|
22066
|
-
for (const pattern of [/System-wide memory free percentage:\s*([\d.]+)\s*%/i, /System-wide memory free percentage\s*=\s*([\d.]+)\s*%?/i]) {
|
|
22067
|
-
const match = content.match(pattern);
|
|
22068
|
-
if (!match) continue;
|
|
22069
|
-
const value = Number(match[1]);
|
|
22070
|
-
if (Number.isFinite(value) && value >= 0 && value <= 100) return value;
|
|
22071
|
-
}
|
|
22072
|
-
return null;
|
|
22073
|
-
}
|
|
22074
|
-
function parseDarwinVmStat(content) {
|
|
22075
|
-
const pageSizeMatch = content.match(/page size of\s+(\d+)\s+bytes/i);
|
|
22076
|
-
if (!pageSizeMatch) return null;
|
|
22077
|
-
const pageSizeBytes = Number(pageSizeMatch[1]);
|
|
22078
|
-
if (!Number.isFinite(pageSizeBytes) || pageSizeBytes <= 0) return null;
|
|
22079
|
-
const pages = /* @__PURE__ */ new Map();
|
|
22080
|
-
for (const line of content.split("\n")) {
|
|
22081
|
-
const match = line.match(/^([^:]+):\s+(\d+)\.?$/);
|
|
22082
|
-
if (!match) continue;
|
|
22083
|
-
const value = Number(match[2]);
|
|
22084
|
-
if (Number.isFinite(value)) pages.set(match[1].trim(), value);
|
|
22085
|
-
}
|
|
22086
|
-
const availablePageNames = [
|
|
22087
|
-
"Pages free",
|
|
22088
|
-
"Pages inactive",
|
|
22089
|
-
"Pages speculative"
|
|
22090
|
-
];
|
|
22091
|
-
const availablePages = availablePageNames.every((name) => pages.has(name)) ? availablePageNames.reduce((sum, name) => sum + pages.get(name), 0) : void 0;
|
|
22092
|
-
const swapIn = pages.get("Swapins");
|
|
22093
|
-
const swapOut = pages.get("Swapouts");
|
|
22094
|
-
return {
|
|
22095
|
-
pageSizeBytes,
|
|
22096
|
-
availableMemoryBytes: availablePages == null ? void 0 : availablePages * pageSizeBytes,
|
|
22097
|
-
swap: swapIn == null || swapOut == null ? void 0 : {
|
|
22098
|
-
pagesIn: swapIn,
|
|
22099
|
-
pagesOut: swapOut
|
|
22100
|
-
}
|
|
22101
|
-
};
|
|
22102
|
-
}
|
|
22103
|
-
function unitBytes(value, unit) {
|
|
22104
|
-
const parsed = Number(value);
|
|
22105
|
-
if (!Number.isFinite(parsed) || parsed < 0) return null;
|
|
22106
|
-
const multiplier = unit.toUpperCase() === "G" ? 1024 ** 3 : unit.toUpperCase() === "K" ? 1024 : MIB;
|
|
22107
|
-
return Math.round(parsed * multiplier);
|
|
22108
|
-
}
|
|
22109
|
-
function parseDarwinSwapUsage(content) {
|
|
22110
|
-
const total = content.match(/total\s*=\s*([\d.]+)([KMG])/i);
|
|
22111
|
-
const used = content.match(/used\s*=\s*([\d.]+)([KMG])/i);
|
|
22112
|
-
const free = content.match(/free\s*=\s*([\d.]+)([KMG])/i);
|
|
22113
|
-
if (!total || !used || !free) return null;
|
|
22114
|
-
const totalBytes = unitBytes(total[1], total[2]);
|
|
22115
|
-
const usedBytes = unitBytes(used[1], used[2]);
|
|
22116
|
-
const freeBytes = unitBytes(free[1], free[2]);
|
|
22117
|
-
return totalBytes == null || usedBytes == null || freeBytes == null ? null : {
|
|
22118
|
-
totalBytes,
|
|
22119
|
-
usedBytes,
|
|
22120
|
-
freeBytes
|
|
22121
|
-
};
|
|
22122
|
-
}
|
|
22123
|
-
function aggregateDarwinCpuCounters(cpuInfo) {
|
|
22124
|
-
if (cpuInfo.length === 0) return null;
|
|
22125
|
-
let idle = 0;
|
|
22126
|
-
let total = 0;
|
|
22127
|
-
for (const cpu of cpuInfo) {
|
|
22128
|
-
const values = Object.values(cpu.times);
|
|
22129
|
-
if (values.some((value) => !Number.isFinite(value) || value < 0)) return null;
|
|
22130
|
-
idle += cpu.times.idle;
|
|
22131
|
-
total += values.reduce((sum, value) => sum + value, 0);
|
|
22132
|
-
}
|
|
22133
|
-
return {
|
|
22134
|
-
idle,
|
|
22135
|
-
total
|
|
22136
|
-
};
|
|
22137
|
-
}
|
|
22138
|
-
function computeCpuPercent$1(current, previous) {
|
|
22139
|
-
if (!previous) return unavailable("A previous CPU time sample is required.");
|
|
22140
|
-
const totalDelta = current.total - previous.total;
|
|
22141
|
-
const idleDelta = current.idle - previous.idle;
|
|
22142
|
-
if (totalDelta <= 0 || idleDelta < 0 || idleDelta > totalDelta) return unavailable("CPU times did not advance monotonically.");
|
|
22143
|
-
return available(Math.round((totalDelta - idleDelta) / totalDelta * 1e3) / 10);
|
|
22144
|
-
}
|
|
22145
|
-
function computeSwapActivity(current, previous, elapsedMs, pageSizeBytes) {
|
|
22146
|
-
if (!previous) return unavailable("A previous swap counter sample is required.");
|
|
22147
|
-
const pages = current.pagesIn - previous.pagesIn + current.pagesOut - previous.pagesOut;
|
|
22148
|
-
if (pages < 0 || elapsedMs <= 0) return unavailable("Swap counters or sample timing were invalid.");
|
|
22149
|
-
return available(Math.round(pages * pageSizeBytes * 6e4 / elapsedMs));
|
|
22150
|
-
}
|
|
22151
|
-
function percent$1(part, total) {
|
|
22152
|
-
if (total <= 0) return 0;
|
|
22153
|
-
return Math.round(part / total * 1e3) / 10;
|
|
22154
|
-
}
|
|
22155
|
-
const defaultAdapters$1 = {
|
|
22156
|
-
execFile: async (command, args, timeoutMs) => {
|
|
22157
|
-
const { stdout } = await execFileAsync$8(command, [...args], {
|
|
22158
|
-
encoding: "utf-8",
|
|
22159
|
-
timeout: timeoutMs
|
|
22160
|
-
});
|
|
22161
|
-
return stdout;
|
|
22162
|
-
},
|
|
22163
|
-
cpus: cpus$1,
|
|
22164
|
-
loadAverage1m: () => loadavg$1()[0] ?? 0,
|
|
22165
|
-
totalMemoryBytes: totalmem$1,
|
|
22166
|
-
now: () => Date.now()
|
|
22167
|
-
};
|
|
22168
|
-
async function command(adapters, executable, args) {
|
|
22169
|
-
try {
|
|
22170
|
-
return await adapters.execFile(executable, args, COMMAND_TIMEOUT_MS);
|
|
22171
|
-
} catch {
|
|
22172
|
-
return null;
|
|
22173
|
-
}
|
|
22174
|
-
}
|
|
22175
|
-
function createDarwinHostHealthCollector(adapters = defaultAdapters$1) {
|
|
22176
|
-
return {
|
|
22177
|
-
platform: "darwin",
|
|
22178
|
-
async sample(previous) {
|
|
22179
|
-
const sampledAtMs = adapters.now();
|
|
22180
|
-
const [pressureOutput, vmStatOutput, swapOutput] = await Promise.all([
|
|
22181
|
-
command(adapters, "memory_pressure", ["-Q"]),
|
|
22182
|
-
command(adapters, "vm_stat", []),
|
|
22183
|
-
command(adapters, "sysctl", ["-n", "vm.swapusage"])
|
|
22184
|
-
]);
|
|
22185
|
-
const pressureFreePercent = pressureOutput == null ? null : parseDarwinMemoryPressure(pressureOutput);
|
|
22186
|
-
const vmStat = vmStatOutput == null ? null : parseDarwinVmStat(vmStatOutput);
|
|
22187
|
-
const swapUsage = swapOutput == null ? null : parseDarwinSwapUsage(swapOutput);
|
|
22188
|
-
const cpuInfo = adapters.cpus();
|
|
22189
|
-
const cpuCounters = aggregateDarwinCpuCounters(cpuInfo);
|
|
22190
|
-
const totalMemoryBytes = adapters.totalMemoryBytes();
|
|
22191
|
-
const availableMemoryBytes = pressureFreePercent != null ? Math.round(totalMemoryBytes * pressureFreePercent / 100) : vmStat?.availableMemoryBytes ?? null;
|
|
22192
|
-
const usedMemoryBytes = Number.isFinite(totalMemoryBytes) && availableMemoryBytes != null ? Math.max(totalMemoryBytes - availableMemoryBytes, 0) : null;
|
|
22193
|
-
const loadAverage1m = adapters.loadAverage1m();
|
|
22194
|
-
const elapsedMs = previous ? sampledAtMs - previous.sampledAtMs : 0;
|
|
22195
|
-
return {
|
|
22196
|
-
platform: "darwin",
|
|
22197
|
-
sampledAtMs,
|
|
22198
|
-
cpuPercent: cpuCounters ? computeCpuPercent$1(cpuCounters, previous?.counters.cpu) : unavailable("macOS CPU times are unavailable."),
|
|
22199
|
-
loadAverage1m: Number.isFinite(loadAverage1m) && loadAverage1m >= 0 ? available(loadAverage1m) : unavailable("The one-minute load average is unavailable."),
|
|
22200
|
-
loadPerCore1m: Number.isFinite(loadAverage1m) && loadAverage1m >= 0 && cpuInfo.length > 0 ? available(Math.round(loadAverage1m / cpuInfo.length * 100) / 100) : unavailable("Load average or CPU core count is unavailable."),
|
|
22201
|
-
totalMemoryBytes: Number.isFinite(totalMemoryBytes) && totalMemoryBytes > 0 ? available(totalMemoryBytes) : unavailable("Total memory is unavailable."),
|
|
22202
|
-
usedMemoryBytes: usedMemoryBytes == null ? unavailable("Used memory cannot be derived.") : available(usedMemoryBytes),
|
|
22203
|
-
availableMemoryBytes: availableMemoryBytes == null ? unavailable("Available memory is unavailable.") : available(availableMemoryBytes),
|
|
22204
|
-
memoryUsedPercent: usedMemoryBytes == null ? unavailable("Memory utilization cannot be derived.") : available(percent$1(usedMemoryBytes, totalMemoryBytes)),
|
|
22205
|
-
memoryPressureSomeAvg10: unavailable("macOS does not expose Linux memory PSI."),
|
|
22206
|
-
memoryPressureFullAvg10: unavailable("macOS does not expose Linux memory PSI."),
|
|
22207
|
-
memoryPressureFreePercent: pressureFreePercent == null ? unavailable("memory_pressure did not report a recognized free percentage.") : available(pressureFreePercent),
|
|
22208
|
-
swapTotalBytes: swapUsage ? available(swapUsage.totalBytes) : unavailable("vm.swapusage is unavailable."),
|
|
22209
|
-
swapUsedBytes: swapUsage ? available(swapUsage.usedBytes) : unavailable("vm.swapusage is unavailable."),
|
|
22210
|
-
swapUsedPercent: swapUsage ? available(percent$1(swapUsage.usedBytes, swapUsage.totalBytes)) : unavailable("vm.swapusage is unavailable."),
|
|
22211
|
-
swapActivityBytesPerMinute: vmStat?.swap ? computeSwapActivity(vmStat.swap, previous?.counters.swap, elapsedMs, vmStat.pageSizeBytes) : unavailable("vm_stat swap activity counters are unavailable."),
|
|
22212
|
-
committedMemoryBytes: unavailable("macOS does not expose Linux Committed_AS."),
|
|
22213
|
-
commitLimitBytes: unavailable("macOS does not expose Linux CommitLimit."),
|
|
22214
|
-
virtualCommitmentPercent: unavailable("macOS virtual commitment is unavailable."),
|
|
22215
|
-
counters: {
|
|
22216
|
-
cpu: cpuCounters,
|
|
22217
|
-
swap: vmStat?.swap ?? null
|
|
22218
|
-
}
|
|
22219
|
-
};
|
|
22220
|
-
}
|
|
22221
|
-
};
|
|
22222
|
-
}
|
|
22223
|
-
//#endregion
|
|
22224
|
-
//#region ../../lib/system-health/linux.ts
|
|
22225
|
-
const execFileAsync$7 = promisify(execFile);
|
|
22226
|
-
const KB$1 = 1024;
|
|
22227
|
-
const LINUX_MEMORY_PRESSURE_DEFAULTS = Object.freeze({
|
|
22228
|
-
someWarningAvg10: 5,
|
|
22229
|
-
fullCriticalAvg10: 1,
|
|
22230
|
-
swapActivityWarningBytesPerMinute: 64 * 1024 ** 2,
|
|
22231
|
-
swapActivityCriticalBytesPerMinute: 256 * 1024 ** 2
|
|
22232
|
-
});
|
|
22233
|
-
function parseMemInfo(content) {
|
|
22234
|
-
const values = /* @__PURE__ */ new Map();
|
|
22235
|
-
for (const line of content.split("\n")) {
|
|
22236
|
-
const match = line.match(/^(\w+):\s+(\d+)\s+kB$/);
|
|
22237
|
-
if (!match) continue;
|
|
22238
|
-
const value = Number(match[2]);
|
|
22239
|
-
if (Number.isFinite(value)) values.set(match[1], value * KB$1);
|
|
22240
|
-
}
|
|
22241
|
-
return {
|
|
22242
|
-
memTotalBytes: values.get("MemTotal"),
|
|
22243
|
-
memAvailableBytes: values.get("MemAvailable"),
|
|
22244
|
-
swapTotalBytes: values.get("SwapTotal"),
|
|
22245
|
-
swapFreeBytes: values.get("SwapFree"),
|
|
22246
|
-
committedMemoryBytes: values.get("Committed_AS"),
|
|
22247
|
-
commitLimitBytes: values.get("CommitLimit")
|
|
22248
|
-
};
|
|
22249
|
-
}
|
|
22250
|
-
function parseProcStat(content) {
|
|
22251
|
-
const lines = content.split("\n");
|
|
22252
|
-
const cpuLine = lines.find((line) => line.startsWith("cpu "));
|
|
22253
|
-
if (!cpuLine) return null;
|
|
22254
|
-
const values = cpuLine.trim().split(/\s+/).slice(1).map(Number);
|
|
22255
|
-
if (values.length < 4 || values.some((value) => !Number.isFinite(value))) return null;
|
|
22256
|
-
const idle = values[3] + (values[4] ?? 0);
|
|
22257
|
-
const total = values.reduce((sum, value) => sum + value, 0);
|
|
22258
|
-
const coreCount = lines.filter((line) => /^cpu\d+\s/.test(line)).length;
|
|
22259
|
-
if (total < 0 || idle < 0) return null;
|
|
22260
|
-
return {
|
|
22261
|
-
cpu: {
|
|
22262
|
-
idle,
|
|
22263
|
-
total
|
|
22264
|
-
},
|
|
22265
|
-
coreCount: Math.max(coreCount, 1)
|
|
22266
|
-
};
|
|
22267
|
-
}
|
|
22268
|
-
function parseMemoryPressure(content) {
|
|
22269
|
-
const result = {};
|
|
22270
|
-
for (const line of content.split("\n")) {
|
|
22271
|
-
const match = line.match(/^(some|full)\s+.*\bavg10=([^\s]+)/);
|
|
22272
|
-
if (!match) continue;
|
|
22273
|
-
const value = Number(match[2]);
|
|
22274
|
-
if (!Number.isFinite(value) || value < 0) continue;
|
|
22275
|
-
if (match[1] === "some") result.someAvg10 = value;
|
|
22276
|
-
if (match[1] === "full") result.fullAvg10 = value;
|
|
22277
|
-
}
|
|
22278
|
-
return result;
|
|
22279
|
-
}
|
|
22280
|
-
function parseVmstat(content) {
|
|
22281
|
-
let pagesIn = null;
|
|
22282
|
-
let pagesOut = null;
|
|
22283
|
-
for (const line of content.split("\n")) {
|
|
22284
|
-
const match = line.match(/^(pswpin|pswpout)\s+(\d+)$/);
|
|
22285
|
-
if (!match) continue;
|
|
22286
|
-
const value = Number(match[2]);
|
|
22287
|
-
if (!Number.isFinite(value)) continue;
|
|
22288
|
-
if (match[1] === "pswpin") pagesIn = value;
|
|
22289
|
-
if (match[1] === "pswpout") pagesOut = value;
|
|
22290
|
-
}
|
|
22291
|
-
return pagesIn == null || pagesOut == null ? null : {
|
|
22292
|
-
pagesIn,
|
|
22293
|
-
pagesOut
|
|
22294
|
-
};
|
|
22295
|
-
}
|
|
22296
|
-
function parseLoadAverage(content) {
|
|
22297
|
-
const value = Number(content.trim().split(/\s+/)[0]);
|
|
22298
|
-
return Number.isFinite(value) && value >= 0 ? value : null;
|
|
22299
|
-
}
|
|
22300
|
-
function computeCpuPercent(current, previous) {
|
|
22301
|
-
if (!previous) return unavailable("A previous CPU counter sample is required.");
|
|
22302
|
-
const totalDelta = current.total - previous.total;
|
|
22303
|
-
const idleDelta = current.idle - previous.idle;
|
|
22304
|
-
if (totalDelta <= 0 || idleDelta < 0 || idleDelta > totalDelta) return unavailable("CPU counters did not advance monotonically.");
|
|
22305
|
-
return available(Math.round((totalDelta - idleDelta) / totalDelta * 1e3) / 10);
|
|
22306
|
-
}
|
|
22307
|
-
function computeSwapActivityBytesPerMinute(current, previous, elapsedMs, pageSizeBytes) {
|
|
22308
|
-
if (!previous) return unavailable("A previous swap counter sample is required.");
|
|
22309
|
-
const pageDelta = current.pagesIn - previous.pagesIn + current.pagesOut - previous.pagesOut;
|
|
22310
|
-
if (pageDelta < 0 || elapsedMs <= 0 || !Number.isFinite(pageSizeBytes) || pageSizeBytes <= 0) return unavailable("Swap counters or sample timing were invalid.");
|
|
22311
|
-
return available(Math.round(pageDelta * pageSizeBytes * 6e4 / elapsedMs));
|
|
22312
|
-
}
|
|
22313
|
-
const defaultAdapters = {
|
|
22314
|
-
readFile: (path) => readFile(path, "utf-8"),
|
|
22315
|
-
readPageSizeBytes: async () => {
|
|
22316
|
-
const { stdout } = await execFileAsync$7("getconf", ["PAGESIZE"], {
|
|
22317
|
-
encoding: "utf-8",
|
|
22318
|
-
timeout: 5e3
|
|
22319
|
-
});
|
|
22320
|
-
const value = Number(stdout.trim());
|
|
22321
|
-
if (!Number.isFinite(value) || value <= 0) throw new Error("getconf returned an invalid page size");
|
|
22322
|
-
return value;
|
|
22323
|
-
},
|
|
22324
|
-
now: () => Date.now()
|
|
22325
|
-
};
|
|
22326
|
-
async function readParsed(adapters, path, parse) {
|
|
22327
|
-
try {
|
|
22328
|
-
return parse(await adapters.readFile(path));
|
|
22329
|
-
} catch {
|
|
22330
|
-
return null;
|
|
22331
|
-
}
|
|
22332
|
-
}
|
|
22333
|
-
function percent(part, total) {
|
|
22334
|
-
if (total <= 0) return 0;
|
|
22335
|
-
return Math.round(part / total * 1e3) / 10;
|
|
22336
|
-
}
|
|
22337
|
-
function createLinuxHostHealthCollector(adapters = defaultAdapters) {
|
|
22338
|
-
return {
|
|
22339
|
-
platform: "linux",
|
|
22340
|
-
async sample(previous) {
|
|
22341
|
-
const sampledAtMs = adapters.now();
|
|
22342
|
-
const [memInfo, procStat, pressure, vmstat, loadAverage, pageSizeBytes] = await Promise.all([
|
|
22343
|
-
readParsed(adapters, "/proc/meminfo", parseMemInfo),
|
|
22344
|
-
readParsed(adapters, "/proc/stat", parseProcStat),
|
|
22345
|
-
readParsed(adapters, "/proc/pressure/memory", parseMemoryPressure),
|
|
22346
|
-
readParsed(adapters, "/proc/vmstat", parseVmstat),
|
|
22347
|
-
readParsed(adapters, "/proc/loadavg", parseLoadAverage),
|
|
22348
|
-
adapters.readPageSizeBytes().catch(() => null)
|
|
22349
|
-
]);
|
|
22350
|
-
const totalMemoryBytes = memInfo?.memTotalBytes;
|
|
22351
|
-
const availableMemoryBytes = memInfo?.memAvailableBytes;
|
|
22352
|
-
const usedMemoryBytes = totalMemoryBytes != null && availableMemoryBytes != null ? Math.max(totalMemoryBytes - availableMemoryBytes, 0) : null;
|
|
22353
|
-
const swapTotalBytes = memInfo?.swapTotalBytes;
|
|
22354
|
-
const swapFreeBytes = memInfo?.swapFreeBytes;
|
|
22355
|
-
const swapUsedBytes = swapTotalBytes != null && swapFreeBytes != null ? Math.max(swapTotalBytes - swapFreeBytes, 0) : null;
|
|
22356
|
-
const committedMemoryBytes = memInfo?.committedMemoryBytes;
|
|
22357
|
-
const commitLimitBytes = memInfo?.commitLimitBytes;
|
|
22358
|
-
const cpuCounters = procStat?.cpu ?? null;
|
|
22359
|
-
const swapCounters = vmstat ?? null;
|
|
22360
|
-
const elapsedMs = previous ? sampledAtMs - previous.sampledAtMs : 0;
|
|
22361
|
-
return {
|
|
22362
|
-
platform: "linux",
|
|
22363
|
-
sampledAtMs,
|
|
22364
|
-
cpuPercent: cpuCounters ? computeCpuPercent(cpuCounters, previous?.counters.cpu) : unavailable("The aggregate CPU counters are unavailable."),
|
|
22365
|
-
loadAverage1m: loadAverage == null ? unavailable("The one-minute load average is unavailable.") : available(loadAverage),
|
|
22366
|
-
loadPerCore1m: loadAverage == null || !procStat ? unavailable("Load average or CPU core count is unavailable.") : available(Math.round(loadAverage / procStat.coreCount * 100) / 100),
|
|
22367
|
-
totalMemoryBytes: totalMemoryBytes == null ? unavailable("MemTotal is unavailable.") : available(totalMemoryBytes),
|
|
22368
|
-
usedMemoryBytes: usedMemoryBytes == null ? unavailable("Used memory cannot be derived without MemTotal and MemAvailable.") : available(usedMemoryBytes),
|
|
22369
|
-
availableMemoryBytes: availableMemoryBytes == null ? unavailable("MemAvailable is unavailable.") : available(availableMemoryBytes),
|
|
22370
|
-
memoryUsedPercent: usedMemoryBytes == null || totalMemoryBytes == null ? unavailable("Memory utilization cannot be derived.") : available(percent(usedMemoryBytes, totalMemoryBytes)),
|
|
22371
|
-
memoryPressureSomeAvg10: pressure?.someAvg10 == null ? unavailable("Linux memory PSI some.avg10 is unavailable.") : available(pressure.someAvg10),
|
|
22372
|
-
memoryPressureFullAvg10: pressure?.fullAvg10 == null ? unavailable("Linux memory PSI full.avg10 is unavailable.") : available(pressure.fullAvg10),
|
|
22373
|
-
memoryPressureFreePercent: unavailable("Linux reports memory pressure through PSI."),
|
|
22374
|
-
swapTotalBytes: swapTotalBytes == null ? unavailable("SwapTotal is unavailable.") : available(swapTotalBytes),
|
|
22375
|
-
swapUsedBytes: swapUsedBytes == null ? unavailable("Swap usage cannot be derived without SwapTotal and SwapFree.") : available(swapUsedBytes),
|
|
22376
|
-
swapUsedPercent: swapUsedBytes == null || swapTotalBytes == null ? unavailable("Swap utilization cannot be derived.") : available(percent(swapUsedBytes, swapTotalBytes)),
|
|
22377
|
-
swapActivityBytesPerMinute: swapCounters && pageSizeBytes != null ? computeSwapActivityBytesPerMinute(swapCounters, previous?.counters.swap, elapsedMs, pageSizeBytes) : unavailable("Linux swap activity counters are unavailable."),
|
|
22378
|
-
committedMemoryBytes: committedMemoryBytes == null ? unavailable("Committed_AS is unavailable.") : available(committedMemoryBytes),
|
|
22379
|
-
commitLimitBytes: commitLimitBytes == null ? unavailable("CommitLimit is unavailable.") : available(commitLimitBytes),
|
|
22380
|
-
virtualCommitmentPercent: committedMemoryBytes == null || commitLimitBytes == null ? unavailable("Virtual commitment cannot be derived.") : available(percent(committedMemoryBytes, commitLimitBytes)),
|
|
22381
|
-
counters: {
|
|
22382
|
-
cpu: cpuCounters,
|
|
22383
|
-
swap: swapCounters
|
|
22384
|
-
}
|
|
22385
|
-
};
|
|
22386
|
-
}
|
|
22387
|
-
};
|
|
22388
|
-
}
|
|
22389
|
-
//#endregion
|
|
22390
|
-
//#region ../../lib/system-health/collector.ts
|
|
22391
|
-
/**
|
|
22392
|
-
* Selects the platform host-health collector. Linux and macOS expose native
|
|
22393
|
-
* current-pressure signals; unsupported platforms return unavailable signals
|
|
22394
|
-
* so callers never mistake missing measurements for measured zeroes.
|
|
22395
|
-
*/
|
|
22396
|
-
function createUnsupportedCollector(platform = "unsupported") {
|
|
22397
|
-
const signal = () => unavailable("Host health collection is unsupported on this platform.");
|
|
22398
|
-
return {
|
|
22399
|
-
platform,
|
|
22400
|
-
async sample() {
|
|
22401
|
-
return {
|
|
22402
|
-
platform,
|
|
22403
|
-
sampledAtMs: Date.now(),
|
|
22404
|
-
cpuPercent: signal(),
|
|
22405
|
-
loadAverage1m: signal(),
|
|
22406
|
-
loadPerCore1m: signal(),
|
|
22407
|
-
totalMemoryBytes: signal(),
|
|
22408
|
-
usedMemoryBytes: signal(),
|
|
22409
|
-
availableMemoryBytes: signal(),
|
|
22410
|
-
memoryUsedPercent: signal(),
|
|
22411
|
-
memoryPressureSomeAvg10: signal(),
|
|
22412
|
-
memoryPressureFullAvg10: signal(),
|
|
22413
|
-
memoryPressureFreePercent: signal(),
|
|
22414
|
-
swapTotalBytes: signal(),
|
|
22415
|
-
swapUsedBytes: signal(),
|
|
22416
|
-
swapUsedPercent: signal(),
|
|
22417
|
-
swapActivityBytesPerMinute: signal(),
|
|
22418
|
-
committedMemoryBytes: signal(),
|
|
22419
|
-
commitLimitBytes: signal(),
|
|
22420
|
-
virtualCommitmentPercent: signal(),
|
|
22421
|
-
counters: {
|
|
22422
|
-
cpu: null,
|
|
22423
|
-
swap: null
|
|
22424
|
-
}
|
|
22425
|
-
};
|
|
22426
|
-
}
|
|
22427
|
-
};
|
|
22428
|
-
}
|
|
22429
|
-
function createHostHealthCollector(selection = {}) {
|
|
22430
|
-
const platform = selection.platform ?? platform$1();
|
|
22431
|
-
if (platform === "linux") return selection.linux ?? createLinuxHostHealthCollector();
|
|
22432
|
-
if (platform === "darwin") return selection.darwin ?? createDarwinHostHealthCollector();
|
|
22433
|
-
return createUnsupportedCollector();
|
|
22434
|
-
}
|
|
22435
|
-
//#endregion
|
|
22436
22045
|
//#region ../../lib/system-health/evaluate.ts
|
|
22437
22046
|
function value(signal) {
|
|
22438
22047
|
return signal.status === "available" ? signal.value : null;
|
|
@@ -22800,7 +22409,7 @@ function acceptedReasons(state, hostReasons, agents, services) {
|
|
|
22800
22409
|
//#endregion
|
|
22801
22410
|
//#region services/system-health-service.ts
|
|
22802
22411
|
init_review_status_source();
|
|
22803
|
-
const execAsync$
|
|
22412
|
+
const execAsync$3 = promisify(exec);
|
|
22804
22413
|
const KB = 1024;
|
|
22805
22414
|
const GIB$1 = 1024 ** 3;
|
|
22806
22415
|
let dockerStatsCollector$1 = null;
|
|
@@ -22903,7 +22512,7 @@ async function readProcMemoryDarwin() {
|
|
|
22903
22512
|
let memAvailable = freemem$1();
|
|
22904
22513
|
let memFree = freemem$1();
|
|
22905
22514
|
try {
|
|
22906
|
-
const { stdout } = await execAsync$
|
|
22515
|
+
const { stdout } = await execAsync$3("vm_stat", {
|
|
22907
22516
|
encoding: "utf-8",
|
|
22908
22517
|
timeout: 5e3
|
|
22909
22518
|
});
|
|
@@ -22923,7 +22532,7 @@ async function readProcMemoryDarwin() {
|
|
|
22923
22532
|
let swapTotal = 0;
|
|
22924
22533
|
let swapFree = 0;
|
|
22925
22534
|
try {
|
|
22926
|
-
const { stdout } = await execAsync$
|
|
22535
|
+
const { stdout } = await execAsync$3("sysctl -n vm.swapusage", {
|
|
22927
22536
|
encoding: "utf-8",
|
|
22928
22537
|
timeout: 5e3
|
|
22929
22538
|
});
|
|
@@ -22945,47 +22554,6 @@ async function readProcMemoryDarwin() {
|
|
|
22945
22554
|
async function readProcMemory() {
|
|
22946
22555
|
return platform$1() === "darwin" ? readProcMemoryDarwin() : readProcMemoryLinux();
|
|
22947
22556
|
}
|
|
22948
|
-
async function readProcessTable() {
|
|
22949
|
-
const { stdout } = await execAsync$4("ps -eo pid=,ppid=,rss=,args=", {
|
|
22950
|
-
encoding: "utf-8",
|
|
22951
|
-
timeout: 1e4
|
|
22952
|
-
});
|
|
22953
|
-
const rows = /* @__PURE__ */ new Map();
|
|
22954
|
-
for (const line of stdout.split("\n")) {
|
|
22955
|
-
const trimmed = line.trim();
|
|
22956
|
-
if (!trimmed) continue;
|
|
22957
|
-
const match = trimmed.match(/^(\d+)\s+(\d+)\s+(\d+)\s+(.+)$/);
|
|
22958
|
-
if (!match) continue;
|
|
22959
|
-
const pid = Number(match[1]);
|
|
22960
|
-
const ppid = Number(match[2]);
|
|
22961
|
-
const rssKb = Number(match[3]);
|
|
22962
|
-
const command = match[4] ?? "";
|
|
22963
|
-
if (!Number.isFinite(pid) || !Number.isFinite(ppid) || !Number.isFinite(rssKb)) continue;
|
|
22964
|
-
rows.set(pid, {
|
|
22965
|
-
pid,
|
|
22966
|
-
ppid,
|
|
22967
|
-
rssKb,
|
|
22968
|
-
command
|
|
22969
|
-
});
|
|
22970
|
-
}
|
|
22971
|
-
return rows;
|
|
22972
|
-
}
|
|
22973
|
-
function getDescendantPids(rootPid, processes) {
|
|
22974
|
-
const descendants = /* @__PURE__ */ new Set();
|
|
22975
|
-
const queue = [rootPid];
|
|
22976
|
-
while (queue.length > 0) {
|
|
22977
|
-
const pid = queue.shift();
|
|
22978
|
-
if (!pid || descendants.has(pid)) continue;
|
|
22979
|
-
descendants.add(pid);
|
|
22980
|
-
for (const process of processes.values()) if (process.ppid === pid && !descendants.has(process.pid)) queue.push(process.pid);
|
|
22981
|
-
}
|
|
22982
|
-
return descendants;
|
|
22983
|
-
}
|
|
22984
|
-
function sumProcessMemory(descendants, processes) {
|
|
22985
|
-
let totalRssKb = 0;
|
|
22986
|
-
for (const pid of descendants) totalRssKb += processes.get(pid)?.rssKb ?? 0;
|
|
22987
|
-
return totalRssKb * KB;
|
|
22988
|
-
}
|
|
22989
22557
|
function buildLeakedSpecialists(agents) {
|
|
22990
22558
|
return agents.filter((agent) => agent.kind === "specialist" && agent.lifecycle === "orphaned").map((agent) => ({
|
|
22991
22559
|
name: agent.id,
|
|
@@ -23030,14 +22598,11 @@ async function collectAgentProcesses() {
|
|
|
23030
22598
|
const admittedWorkAgentCount = countAdmittedWorkAgents(registeredAgents, nowMs);
|
|
23031
22599
|
const activeAgents = registeredAgents.filter((agent) => agent.status !== "stopped");
|
|
23032
22600
|
const liveSessions = new Set(registeredAgents.filter((agent) => agent.tmuxActive).map((agent) => agent.id));
|
|
23033
|
-
const
|
|
22601
|
+
const runtimeCensus = await getRuntimeCensus();
|
|
23034
22602
|
const reviewStatuses = reviewStatusMap();
|
|
23035
22603
|
const collected = await Promise.all(activeAgents.map(async (agent) => {
|
|
23036
22604
|
const [runtimeState, runtimeSnapshot] = await Promise.all([Effect.runPromise(getAgentRuntimeState(agent.id)).catch(() => null), Effect.runPromise(getRuntimeSnapshot(agent.id)).catch(() => null)]);
|
|
23037
|
-
const
|
|
23038
|
-
const panePid = Number(panePidValue ?? "0");
|
|
23039
|
-
const descendants = Number.isFinite(panePid) && panePid > 0 ? getDescendantPids(panePid, processTable) : /* @__PURE__ */ new Set();
|
|
23040
|
-
const memoryBytes = descendants.size > 0 ? sumProcessMemory(descendants, processTable) : 0;
|
|
22605
|
+
const memoryBytes = [...descendantPidsForSession(runtimeCensus, agent.id)].reduce((sum, pid) => sum + (runtimeCensus.processesByPid.get(pid)?.rssBytes ?? 0), 0);
|
|
23041
22606
|
const lifecycle = agentLifecycle(agent.role, agent.issueId, agent.tmuxActive, reviewStatuses);
|
|
23042
22607
|
return {
|
|
23043
22608
|
process: {
|
|
@@ -23505,9 +23070,18 @@ async function assessMemoryPressure() {
|
|
|
23505
23070
|
return verdict;
|
|
23506
23071
|
}
|
|
23507
23072
|
//#endregion
|
|
23073
|
+
//#region ../../lib/cloister/agent-grace.ts
|
|
23074
|
+
init_tracker_utils();
|
|
23075
|
+
init_concurrency$1();
|
|
23076
|
+
const WORK_LAUNCHER_GRACE_MS = 12e4;
|
|
23077
|
+
function isStartingWithinGrace(state, now = Date.now(), graceMs = WORK_LAUNCHER_GRACE_MS) {
|
|
23078
|
+
if (state.status !== "starting") return false;
|
|
23079
|
+
const startedMs = Date.parse(state.startedAt ?? "");
|
|
23080
|
+
return Number.isFinite(startedMs) && now - startedMs < graceMs;
|
|
23081
|
+
}
|
|
23082
|
+
//#endregion
|
|
23508
23083
|
//#region ../../lib/cloister/deacon-inspect.ts
|
|
23509
23084
|
init_review_status();
|
|
23510
|
-
init_tmux();
|
|
23511
23085
|
/**
|
|
23512
23086
|
* Inspect prompts state a 10-minute budget. Deacon gives the agent a small
|
|
23513
23087
|
* grace window beyond that, then fails loud so the parent work agent never waits
|
|
@@ -23548,7 +23122,7 @@ async function checkInspectAgentTimeouts(now = /* @__PURE__ */ new Date()) {
|
|
|
23548
23122
|
console.warn(`[deacon] Failed to kill inspect session ${sessionName}: ${msg}`);
|
|
23549
23123
|
});
|
|
23550
23124
|
try {
|
|
23551
|
-
const { messageAgent } = await import("./agents-
|
|
23125
|
+
const { messageAgent } = await import("./agents-wi9NWzs2.js");
|
|
23552
23126
|
await messageAgent(`agent-${issueId.toLowerCase()}`, verdict, "deacon:inspect-watchdog");
|
|
23553
23127
|
} catch (err) {
|
|
23554
23128
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -23601,8 +23175,50 @@ async function handleKnownAgentModal(agentId, deps = defaultDeps$1, initialPane)
|
|
|
23601
23175
|
await deps.settle();
|
|
23602
23176
|
return modal.matches(await deps.capturePane(agentId)) ? "needs-you" : "handled";
|
|
23603
23177
|
}
|
|
23178
|
+
const ORCHESTRATED_COMPACTION_CONTINUE_MESSAGE = "Compaction complete. Continue from the compacted summary now. Re-read your current xBRIEF item and latest feedback file if needed, then resume work; do not wait for further input.";
|
|
23179
|
+
const orchestratedCompactionContinuations = /* @__PURE__ */ new Map();
|
|
23180
|
+
function scheduleOrchestratedCompactionContinuation(sessionName, requestedAt = Date.now()) {
|
|
23181
|
+
orchestratedCompactionContinuations.set(sessionName, {
|
|
23182
|
+
requestedAt,
|
|
23183
|
+
observedBusy: false
|
|
23184
|
+
});
|
|
23185
|
+
}
|
|
23186
|
+
function cancelOrchestratedCompactionContinuation(sessionName) {
|
|
23187
|
+
orchestratedCompactionContinuations.delete(sessionName);
|
|
23188
|
+
}
|
|
23189
|
+
function hasOrchestratedCompactionContinuation(sessionName) {
|
|
23190
|
+
return orchestratedCompactionContinuations.has(sessionName);
|
|
23191
|
+
}
|
|
23192
|
+
async function deliverOrchestratedCompact(sessionName, deliver) {
|
|
23193
|
+
scheduleOrchestratedCompactionContinuation(sessionName);
|
|
23194
|
+
try {
|
|
23195
|
+
await deliver();
|
|
23196
|
+
} catch (error) {
|
|
23197
|
+
cancelOrchestratedCompactionContinuation(sessionName);
|
|
23198
|
+
throw error;
|
|
23199
|
+
}
|
|
23200
|
+
}
|
|
23201
|
+
async function maybeContinueOrchestratedCompaction(args) {
|
|
23202
|
+
const pending = orchestratedCompactionContinuations.get(args.sessionName);
|
|
23203
|
+
if (!pending) return false;
|
|
23204
|
+
const elapsed = (args.now ?? Date.now()) - pending.requestedAt;
|
|
23205
|
+
if (!args.tmuxOutput.includes("❯")) {
|
|
23206
|
+
pending.observedBusy = true;
|
|
23207
|
+
if (elapsed >= 15e4) orchestratedCompactionContinuations.delete(args.sessionName);
|
|
23208
|
+
return false;
|
|
23209
|
+
}
|
|
23210
|
+
if (isContextOverflowTail(args.tmuxOutput)) {
|
|
23211
|
+
if (elapsed >= 15e4) orchestratedCompactionContinuations.delete(args.sessionName);
|
|
23212
|
+
return false;
|
|
23213
|
+
}
|
|
23214
|
+
if (!pending.observedBusy && elapsed < 3e4) return false;
|
|
23215
|
+
await args.send(args.sessionName, ORCHESTRATED_COMPACTION_CONTINUE_MESSAGE);
|
|
23216
|
+
orchestratedCompactionContinuations.delete(args.sessionName);
|
|
23217
|
+
return true;
|
|
23218
|
+
}
|
|
23604
23219
|
//#endregion
|
|
23605
23220
|
//#region ../../lib/cloister/deacon-api-recovery.ts
|
|
23221
|
+
init_context_overflow();
|
|
23606
23222
|
init_agents$1();
|
|
23607
23223
|
init_review_status();
|
|
23608
23224
|
init_tmux();
|
|
@@ -23700,13 +23316,13 @@ async function maybeProactivelyCompactContext(sessionName, now) {
|
|
|
23700
23316
|
if (!agentState?.workspace || !sessionId || !agentState.model) return null;
|
|
23701
23317
|
let usage = null;
|
|
23702
23318
|
try {
|
|
23703
|
-
const { computeContextUsage } = await import("./conversation-service-
|
|
23319
|
+
const { computeContextUsage } = await import("./conversation-service-BLd3MYsG.js");
|
|
23704
23320
|
usage = await computeContextUsage(sessionFilePath(agentState.workspace, sessionId), agentState.model);
|
|
23705
23321
|
} catch {
|
|
23706
23322
|
return null;
|
|
23707
23323
|
}
|
|
23708
23324
|
if (!usage || usage.percentUsed < 85) return null;
|
|
23709
|
-
await Effect.runPromise(sendKeys(sessionName, "/compact"));
|
|
23325
|
+
await deliverOrchestratedCompact(sessionName, () => Effect.runPromise(sendKeys(sessionName, "/compact")));
|
|
23710
23326
|
contextProactiveCompactState.set(sessionName, { lastAttempt: now });
|
|
23711
23327
|
try {
|
|
23712
23328
|
await writeFile$1(join$1(getAgentDir(sessionName), PROACTIVE_COMPACT_STAMP_FILE), new Date(now).toISOString(), "utf-8");
|
|
@@ -23736,10 +23352,11 @@ async function checkApiErrorAgents() {
|
|
|
23736
23352
|
} catch {
|
|
23737
23353
|
return actions;
|
|
23738
23354
|
}
|
|
23739
|
-
const
|
|
23740
|
-
for (const sessionName of
|
|
23355
|
+
const sessionsToInspect = sessionNames.filter((name) => name.startsWith("agent-") || name.startsWith("specialist-") || name.startsWith("planning-")).filter((name) => !/^agent-.*-review-(?:security|correctness|performance|requirements)$/.test(name) || hasOrchestratedCompactionContinuation(name));
|
|
23356
|
+
for (const sessionName of sessionsToInspect) {
|
|
23357
|
+
const compactionPendingAtStart = hasOrchestratedCompactionContinuation(sessionName);
|
|
23741
23358
|
const recovery = apiErrorRecoveryState.get(sessionName);
|
|
23742
|
-
if (recovery && now - recovery.lastAttempt < API_ERROR_RECOVERY_COOLDOWN_MS) continue;
|
|
23359
|
+
if (!compactionPendingAtStart && recovery && now - recovery.lastAttempt < API_ERROR_RECOVERY_COOLDOWN_MS) continue;
|
|
23743
23360
|
let tmuxOutput;
|
|
23744
23361
|
try {
|
|
23745
23362
|
tmuxOutput = await Effect.runPromise(capturePane(sessionName, 100));
|
|
@@ -23779,6 +23396,23 @@ async function checkApiErrorAgents() {
|
|
|
23779
23396
|
continue;
|
|
23780
23397
|
}
|
|
23781
23398
|
}
|
|
23399
|
+
if (compactionPendingAtStart || hasOrchestratedCompactionContinuation(sessionName)) {
|
|
23400
|
+
try {
|
|
23401
|
+
if (await maybeContinueOrchestratedCompaction({
|
|
23402
|
+
sessionName,
|
|
23403
|
+
tmuxOutput,
|
|
23404
|
+
now,
|
|
23405
|
+
send: (target, message) => Effect.runPromise(sendKeys(target, message))
|
|
23406
|
+
})) {
|
|
23407
|
+
contextOverflowRecoveryState.delete(sessionName);
|
|
23408
|
+
actions.push(`Context compaction recovery: resumed ${sessionName} after compaction`);
|
|
23409
|
+
continue;
|
|
23410
|
+
}
|
|
23411
|
+
} catch (err) {
|
|
23412
|
+
console.error(`[deacon] Failed to resume ${sessionName} after orchestrated compaction:`, err);
|
|
23413
|
+
}
|
|
23414
|
+
if (hasOrchestratedCompactionContinuation(sessionName)) continue;
|
|
23415
|
+
}
|
|
23782
23416
|
if (!tmuxOutput.includes("❯")) continue;
|
|
23783
23417
|
{
|
|
23784
23418
|
const issueId = sessionName.startsWith("agent-") ? sessionName.replace("agent-", "").toUpperCase() : null;
|
|
@@ -23810,13 +23444,13 @@ async function checkApiErrorAgents() {
|
|
|
23810
23444
|
const st = getAgentStateSync(sessionName);
|
|
23811
23445
|
const sid = st?.sessionId ?? runtimeState?.claudeSessionId;
|
|
23812
23446
|
if (st?.workspace && sid && st.model) {
|
|
23813
|
-
const { computeContextUsage } = await import("./conversation-service-
|
|
23447
|
+
const { computeContextUsage } = await import("./conversation-service-BLd3MYsG.js");
|
|
23814
23448
|
const usage = await computeContextUsage(sessionFilePath(st.workspace, sid), st.model);
|
|
23815
23449
|
if (usage && usage.percentUsed < 85) recoveredPct = usage.percentUsed;
|
|
23816
23450
|
}
|
|
23817
23451
|
} catch {}
|
|
23818
23452
|
if (recoveredPct !== null) {
|
|
23819
|
-
const { clearWorkspaceStuck } = await import("./review-status-sync-
|
|
23453
|
+
const { clearWorkspaceStuck } = await import("./review-status-sync-DSDK3OMy.js");
|
|
23820
23454
|
clearWorkspaceStuck(issueId);
|
|
23821
23455
|
stuckOverflowNativeRecoveryState.delete(sessionName);
|
|
23822
23456
|
actions.push(`Context overflow recovery: cleared stuck flag for ${sessionName} (context back to ${Math.round(recoveredPct)}%)`);
|
|
@@ -23832,7 +23466,7 @@ async function checkApiErrorAgents() {
|
|
|
23832
23466
|
rec.attempts += 1;
|
|
23833
23467
|
rec.lastAttempt = now;
|
|
23834
23468
|
stuckOverflowNativeRecoveryState.set(sessionName, rec);
|
|
23835
|
-
const { resumeAgent } = await import("./agents-
|
|
23469
|
+
const { resumeAgent } = await import("./agents-wi9NWzs2.js");
|
|
23836
23470
|
const recovered = await resumeAgent(sessionName, void 0, { compact: true });
|
|
23837
23471
|
if (recovered.success) {
|
|
23838
23472
|
stuckOverflowNativeRecoveryState.delete(sessionName);
|
|
@@ -23880,7 +23514,7 @@ async function checkApiErrorAgents() {
|
|
|
23880
23514
|
}
|
|
23881
23515
|
const compactAttempts = (ov?.compactAttempts ?? 0) + 1;
|
|
23882
23516
|
if (issueId !== null) {
|
|
23883
|
-
const { resumeAgent } = await import("./agents-
|
|
23517
|
+
const { resumeAgent } = await import("./agents-wi9NWzs2.js");
|
|
23884
23518
|
const resumeResult = await resumeAgent(sessionName, void 0, { compact: true });
|
|
23885
23519
|
contextOverflowRecoveryState.set(sessionName, {
|
|
23886
23520
|
lastAttempt: now,
|
|
@@ -23909,7 +23543,7 @@ async function checkApiErrorAgents() {
|
|
|
23909
23543
|
continue;
|
|
23910
23544
|
}
|
|
23911
23545
|
try {
|
|
23912
|
-
await Effect.runPromise(sendKeys(sessionName, "/compact"));
|
|
23546
|
+
await deliverOrchestratedCompact(sessionName, () => Effect.runPromise(sendKeys(sessionName, "/compact")));
|
|
23913
23547
|
contextOverflowRecoveryState.set(sessionName, {
|
|
23914
23548
|
lastAttempt: now,
|
|
23915
23549
|
compactAttempts,
|
|
@@ -23986,6 +23620,7 @@ async function requestStrikeMerge(issueId, request, options = {}) {
|
|
|
23986
23620
|
} catch (error) {
|
|
23987
23621
|
return {
|
|
23988
23622
|
success: false,
|
|
23623
|
+
transport: true,
|
|
23989
23624
|
error: `Strike merge request failed: ${error instanceof Error ? error.message : String(error)}`
|
|
23990
23625
|
};
|
|
23991
23626
|
}
|
|
@@ -24049,7 +23684,10 @@ function defaultDeps() {
|
|
|
24049
23684
|
isPersistentlyOwned: () => false
|
|
24050
23685
|
};
|
|
24051
23686
|
}
|
|
24052
|
-
const
|
|
23687
|
+
const TRANSPORT_BACKOFF_BASE_MS = 6e4;
|
|
23688
|
+
const TRANSPORT_BACKOFF_CAP_MS = 18e5;
|
|
23689
|
+
const MAX_TRANSPORT_RETRIES = 10;
|
|
23690
|
+
const NON_ACTIONABLE = /permission|merge guard|configured project|integration|infrastructure|unavailable|not registered|workspace does not exist|fetch failed|ECONNREFUSED|ECONNRESET|socket hang up|ETIMEDOUT|EAI_AGAIN/i;
|
|
24053
23691
|
function attemptHistory(attempts) {
|
|
24054
23692
|
return attempts.map((attempt, index) => `${index + 1}. strike ${attempt.strikeHead}; main ${attempt.mainHead}; ${attempt.outcome}: ${attempt.detail}`).join("\n");
|
|
24055
23693
|
}
|
|
@@ -24070,14 +23708,21 @@ async function handleFailure(issueId, head, detail, projectPath, workspacePath,
|
|
|
24070
23708
|
const recoveryCount = (status.strikeRecoveryCount ?? 0) + 1;
|
|
24071
23709
|
const recoveryMessage = `Strike landing failed for ${issueId} at ${head}.\n\nCurrent main: ${mainHead}\nFailure: ${detail}\n\nFetch origin, rebase strike/${issueId.toLowerCase()} onto current origin/main, resolve every conflict, rerun the configured gates, push only strike/${issueId.toLowerCase()}, then run pan strike-ready ${issueId}. A fresh pushed HEAD is required before another landing attempt.`;
|
|
24072
23710
|
if (!NON_ACTIONABLE.test(detail) && recoveryCount < 3) try {
|
|
24073
|
-
await deps.deliverRecovery(`strike-${issueId.toLowerCase()}`, recoveryMessage);
|
|
24074
|
-
|
|
24075
|
-
|
|
24076
|
-
|
|
24077
|
-
|
|
24078
|
-
|
|
24079
|
-
|
|
24080
|
-
|
|
23711
|
+
const outcome = await deps.deliverRecovery(`strike-${issueId.toLowerCase()}`, recoveryMessage);
|
|
23712
|
+
if (outcome.delivered) {
|
|
23713
|
+
deps.setStatus(issueId, {
|
|
23714
|
+
strikeLandingState: "recovering",
|
|
23715
|
+
strikeRecoveryCount: recoveryCount,
|
|
23716
|
+
strikeLandingAttempts: attempts,
|
|
23717
|
+
mergeNotes: detail
|
|
23718
|
+
});
|
|
23719
|
+
return `[strike-landing] ${issueId} at ${head} recovering (${recoveryCount}/3)`;
|
|
23720
|
+
}
|
|
23721
|
+
detail += `; recovery not delivered: ${outcome.reason ?? "queued to mail only"}`;
|
|
23722
|
+
attempts[attempts.length - 1] = {
|
|
23723
|
+
...attempts[attempts.length - 1],
|
|
23724
|
+
detail
|
|
23725
|
+
};
|
|
24081
23726
|
} catch (error) {
|
|
24082
23727
|
detail += `; recovery delivery failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
24083
23728
|
attempts[attempts.length - 1] = {
|
|
@@ -24096,6 +23741,50 @@ async function handleFailure(issueId, head, detail, projectPath, workspacePath,
|
|
|
24096
23741
|
await deps.needsYou(issueId, reason, { attempts });
|
|
24097
23742
|
return `[strike-landing] ${issueId} at ${head} needs-you`;
|
|
24098
23743
|
}
|
|
23744
|
+
async function handleTransportFailure(issueId, head, detail, status, deps) {
|
|
23745
|
+
const timestamp = deps.now();
|
|
23746
|
+
const project = deps.resolveProject(issueId);
|
|
23747
|
+
const projectPath = project?.projectPath ?? "";
|
|
23748
|
+
const workspacePath = project ? join(projectPath, "workspaces", `feature-${issueId.toLowerCase()}-strike`) : "";
|
|
23749
|
+
let mainHead = "unknown";
|
|
23750
|
+
try {
|
|
23751
|
+
if (projectPath) mainHead = await deps.getMainHead(projectPath);
|
|
23752
|
+
} catch (error) {
|
|
23753
|
+
detail += `; main HEAD unavailable: ${error instanceof Error ? error.message : String(error)}`;
|
|
23754
|
+
}
|
|
23755
|
+
const attempts = [...status.strikeLandingAttempts ?? [], {
|
|
23756
|
+
timestamp,
|
|
23757
|
+
strikeHead: head,
|
|
23758
|
+
mainHead,
|
|
23759
|
+
outcome: "transport-failed",
|
|
23760
|
+
detail
|
|
23761
|
+
}];
|
|
23762
|
+
const retryCount = (status.strikeTransportRetryCount ?? 0) + 1;
|
|
23763
|
+
if (retryCount < MAX_TRANSPORT_RETRIES) {
|
|
23764
|
+
const delayMs = Math.min(TRANSPORT_BACKOFF_CAP_MS, TRANSPORT_BACKOFF_BASE_MS * 2 ** (retryCount - 1));
|
|
23765
|
+
const nextAttemptAt = new Date(Date.parse(timestamp) + delayMs).toISOString();
|
|
23766
|
+
deps.setStatus(issueId, {
|
|
23767
|
+
strikeLandingState: "ready",
|
|
23768
|
+
strikeReadyHead: head,
|
|
23769
|
+
strikeTransportRetryCount: retryCount,
|
|
23770
|
+
strikeNextAttemptAt: nextAttemptAt,
|
|
23771
|
+
strikeLandingAttempts: attempts,
|
|
23772
|
+
mergeNotes: detail
|
|
23773
|
+
});
|
|
23774
|
+
return `[strike-landing] ${issueId} at ${head} transport retry ${retryCount}/${MAX_TRANSPORT_RETRIES} after ${nextAttemptAt}`;
|
|
23775
|
+
}
|
|
23776
|
+
const reason = `Strike landing for ${issueId} needs operator attention after ${retryCount} transport attempt(s).\n${attemptHistory(attempts)}`;
|
|
23777
|
+
deps.setStatus(issueId, {
|
|
23778
|
+
strikeLandingState: "needs_you",
|
|
23779
|
+
strikeTransportRetryCount: retryCount,
|
|
23780
|
+
strikeNextAttemptAt: void 0,
|
|
23781
|
+
strikeLandingAttempts: attempts,
|
|
23782
|
+
mergeNotes: detail
|
|
23783
|
+
});
|
|
23784
|
+
await deps.writeFeedback(issueId, workspacePath, `## Strike landing needs operator attention\n\n${reason}`);
|
|
23785
|
+
await deps.needsYou(issueId, reason, { attempts });
|
|
23786
|
+
return `[strike-landing] ${issueId} at ${head} needs-you`;
|
|
23787
|
+
}
|
|
24099
23788
|
async function patrolStrikeLandings(overrides = {}) {
|
|
24100
23789
|
const deps = {
|
|
24101
23790
|
...defaultDeps(),
|
|
@@ -24106,6 +23795,7 @@ async function patrolStrikeLandings(overrides = {}) {
|
|
|
24106
23795
|
const issueId = (candidate.issueId || key).toUpperCase();
|
|
24107
23796
|
const head = candidate.strikeReadyHead;
|
|
24108
23797
|
if (!head || candidate.strikeLandingState !== "ready" && candidate.strikeLandingState !== "landing") continue;
|
|
23798
|
+
if (candidate.strikeNextAttemptAt && candidate.strikeNextAttemptAt > deps.now()) continue;
|
|
24109
23799
|
if (candidate.deaconIgnored || candidate.stuck || candidate.mergeStatus === "merged") continue;
|
|
24110
23800
|
const current = deps.getStatus(issueId);
|
|
24111
23801
|
if (current?.strikeReadyHead !== head || current.strikeLandingState !== "ready" && current.strikeLandingState !== "landing") continue;
|
|
@@ -24151,10 +23841,25 @@ async function executeStrikeLanding(issueId, head, claimed, deps) {
|
|
|
24151
23841
|
if (result.mergeStatus === "merged") deps.setStatus(issueId, {
|
|
24152
23842
|
strikeLandingState: "landed",
|
|
24153
23843
|
strikeReadyHead: void 0,
|
|
24154
|
-
strikeReadyAt: void 0
|
|
23844
|
+
strikeReadyAt: void 0,
|
|
23845
|
+
strikeTransportRetryCount: void 0,
|
|
23846
|
+
strikeNextAttemptAt: void 0
|
|
24155
23847
|
});
|
|
24156
23848
|
else if (result.success || result.mergeStatus === "queued" || result.mergeStatus === "merging" || result.mergeStatus === "merged") return;
|
|
24157
|
-
else
|
|
23849
|
+
else if (result.transport) {
|
|
23850
|
+
const current = deps.getStatus(issueId) ?? claimed;
|
|
23851
|
+
if (current.mergeStatus === "merged" || current.strikeLandingState === "landed") {
|
|
23852
|
+
deps.setStatus(issueId, {
|
|
23853
|
+
strikeLandingState: "landed",
|
|
23854
|
+
strikeReadyHead: void 0,
|
|
23855
|
+
strikeReadyAt: void 0,
|
|
23856
|
+
strikeTransportRetryCount: void 0,
|
|
23857
|
+
strikeNextAttemptAt: void 0
|
|
23858
|
+
});
|
|
23859
|
+
return;
|
|
23860
|
+
}
|
|
23861
|
+
await handleTransportFailure(issueId, head, result.error ?? "Strike landing transport failed", current, deps);
|
|
23862
|
+
} else await handleFailure(issueId, head, result.error ?? "Strike landing failed", project.projectPath, request.workspacePath, claimed, deps);
|
|
24158
23863
|
}
|
|
24159
23864
|
//#endregion
|
|
24160
23865
|
//#region ../../lib/cloister/preemption.ts
|
|
@@ -24340,7 +24045,7 @@ init_archive_planning();
|
|
|
24340
24045
|
init_issue_closed();
|
|
24341
24046
|
init_merge_verification();
|
|
24342
24047
|
init_review_convoy_liveness();
|
|
24343
|
-
|
|
24048
|
+
promisify$1(exec$1);
|
|
24344
24049
|
/**
|
|
24345
24050
|
* Check for orphaned review/test statuses (PAN-88 follow-up)
|
|
24346
24051
|
*
|
|
@@ -24403,7 +24108,7 @@ function reviewConvoyLiveness(issueId) {
|
|
|
24403
24108
|
*/
|
|
24404
24109
|
async function recoverUnhealthyTestStack(issueId, workspacePath) {
|
|
24405
24110
|
const key = issueId.toUpperCase();
|
|
24406
|
-
const { getWorkspaceStackHealth } = await import("./stack-health-
|
|
24111
|
+
const { getWorkspaceStackHealth } = await import("./stack-health-Bn3o8FBX.js");
|
|
24407
24112
|
const health = await Effect.runPromise(getWorkspaceStackHealth(issueId, { workspacePath }));
|
|
24408
24113
|
if (health.healthy) {
|
|
24409
24114
|
testStackRebuildState.delete(key);
|
|
@@ -24435,7 +24140,7 @@ async function recoverUnhealthyTestStack(issueId, workspacePath) {
|
|
|
24435
24140
|
record.attempts += 1;
|
|
24436
24141
|
testStackRebuildState.set(key, record);
|
|
24437
24142
|
console.log(`[deacon] Test stack for ${key} unhealthy (${health.reasons.join("; ")}) — rebuilding (attempt ${record.attempts}/${TEST_STACK_REBUILD_MAX_ATTEMPTS})`);
|
|
24438
|
-
const { rebuildWorkspaceStack } = await import("./rebuild-stack-
|
|
24143
|
+
const { rebuildWorkspaceStack } = await import("./rebuild-stack-CFvcBHsS.js");
|
|
24439
24144
|
const result = await Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[deacon] ${key} stack rebuild: ${m}`) }));
|
|
24440
24145
|
if (!result.success) {
|
|
24441
24146
|
console.warn(`[deacon] Test stack rebuild failed for ${key}: ${result.error}`);
|
|
@@ -24603,7 +24308,7 @@ async function handleReviewCoordinatorDied(issueId, _sessionName, _reason) {
|
|
|
24603
24308
|
return actions;
|
|
24604
24309
|
}
|
|
24605
24310
|
try {
|
|
24606
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
24311
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
|
|
24607
24312
|
const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
24608
24313
|
issueId,
|
|
24609
24314
|
workspace,
|
|
@@ -24678,7 +24383,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
24678
24383
|
const issueLower = issueId.toLowerCase();
|
|
24679
24384
|
const workspace = getAgentStateSync(`agent-${issueLower}`)?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
|
|
24680
24385
|
if (workspace) try {
|
|
24681
|
-
if ((options.readWorkspaceHead ? await options.readWorkspaceHead(workspace) : (await
|
|
24386
|
+
if ((options.readWorkspaceHead ? await options.readWorkspaceHead(workspace) : await (await import("./git-utils-D0_yhCgF.js")).snapshotWorkspaceHeadsPromise(issueId, workspace)) === status.lastVerifiedCommit) {
|
|
24682
24387
|
setReviewStatusSync(issueId, {
|
|
24683
24388
|
reviewStatus: "pending",
|
|
24684
24389
|
reviewNotes: void 0
|
|
@@ -24700,8 +24405,8 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
24700
24405
|
if (project) {
|
|
24701
24406
|
const workspacePath = join$1(project.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
24702
24407
|
if (existsSync(workspacePath)) {
|
|
24703
|
-
const {
|
|
24704
|
-
reviewUpdate["reviewedAtCommit"] =
|
|
24408
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-D0_yhCgF.js");
|
|
24409
|
+
reviewUpdate["reviewedAtCommit"] = await snapshotWorkspaceHeadsPromise(issueId, workspacePath);
|
|
24705
24410
|
}
|
|
24706
24411
|
}
|
|
24707
24412
|
} catch {}
|
|
@@ -24755,7 +24460,7 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
24755
24460
|
const workspace = agentState?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
|
|
24756
24461
|
if (workspace && resolved && !tryReserveAdvancingSlot() && !await tryYieldForAdvancingDispatch("review", issueId)) actions.push(`Deferred review re-dispatch for ${issueId} — advancing-role concurrency ceiling reached`);
|
|
24757
24462
|
else if (workspace && resolved) try {
|
|
24758
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
24463
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
|
|
24759
24464
|
const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
24760
24465
|
issueId,
|
|
24761
24466
|
workspace,
|
|
@@ -24780,8 +24485,8 @@ async function reconcileReviewStatusOrphan(issueId, rawStatus, options = {}) {
|
|
|
24780
24485
|
const workspace = agentState?.workspace || (resolved ? findWorkspacePath(resolved.projectPath, issueLower) : null);
|
|
24781
24486
|
if (workspace && resolved) {
|
|
24782
24487
|
const branch = `feature/${issueLower}`;
|
|
24783
|
-
const { spawnRun } = await import("./agents-
|
|
24784
|
-
const { buildTestRolePrompt } = await import("./test-agent-queue-
|
|
24488
|
+
const { spawnRun } = await import("./agents-wi9NWzs2.js");
|
|
24489
|
+
const { buildTestRolePrompt } = await import("./test-agent-queue-MbxX5vqq.js");
|
|
24785
24490
|
const stackRecovery = await recoverUnhealthyTestStack(issueId, workspace);
|
|
24786
24491
|
if (stackRecovery === "cooldown" || stackRecovery === "exhausted") {
|
|
24787
24492
|
setReviewStatusSync(issueId, { testStatus: "dispatch_failed" });
|
|
@@ -24919,7 +24624,7 @@ async function recoverStalledReviewConvoys(getCanonicalState = getAutoCloseOutCa
|
|
|
24919
24624
|
record.lastAttempt = now;
|
|
24920
24625
|
record.attempts += 1;
|
|
24921
24626
|
stalledReviewConvoyRecoveryState.set(key, record);
|
|
24922
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
24627
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
|
|
24923
24628
|
try {
|
|
24924
24629
|
const result = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
24925
24630
|
issueId,
|
|
@@ -24990,7 +24695,7 @@ async function checkMissingReviewStatuses() {
|
|
|
24990
24695
|
continue;
|
|
24991
24696
|
}
|
|
24992
24697
|
try {
|
|
24993
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
24698
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
|
|
24994
24699
|
await Effect.runPromise(spawnReviewRoleForIssue({
|
|
24995
24700
|
issueId,
|
|
24996
24701
|
workspace,
|
|
@@ -25017,7 +24722,6 @@ async function checkMissingReviewStatuses() {
|
|
|
25017
24722
|
}
|
|
25018
24723
|
//#endregion
|
|
25019
24724
|
//#region ../../lib/cloister/deacon-review-unsignaled.ts
|
|
25020
|
-
init_tracker_utils();
|
|
25021
24725
|
init_agents$1();
|
|
25022
24726
|
init_projects();
|
|
25023
24727
|
init_review_status();
|
|
@@ -25043,7 +24747,7 @@ async function checkStuckReviewing() {
|
|
|
25043
24747
|
const actions = [];
|
|
25044
24748
|
const REVIEW_STUCK_THRESHOLD_MS = 1800 * 1e3;
|
|
25045
24749
|
try {
|
|
25046
|
-
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-
|
|
24750
|
+
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-btEYlaxA.js");
|
|
25047
24751
|
const statuses = loadReviewStatuses();
|
|
25048
24752
|
const now = Date.now();
|
|
25049
24753
|
const activeReviewIssues = /* @__PURE__ */ new Set();
|
|
@@ -25188,7 +24892,7 @@ async function checkCompletedButUnsignaledReviews() {
|
|
|
25188
24892
|
}
|
|
25189
24893
|
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"}"` : ""}`}\n\nRun this command NOW. Do not write any other response before executing it.`;
|
|
25190
24894
|
try {
|
|
25191
|
-
const { messageAgent } = await import("./agents-
|
|
24895
|
+
const { messageAgent } = await import("./agents-wi9NWzs2.js");
|
|
25192
24896
|
await messageAgent(reviewSession, nudge);
|
|
25193
24897
|
unsignaledReviewNudges.set(latestDir, now);
|
|
25194
24898
|
actions.push(`Nudged ${reviewSession} to signal ${verdict} (synthesis written ${Math.round((now - latestMtime) / 6e4)}min ago)`);
|
|
@@ -25310,7 +25014,7 @@ async function respawnIdleReviewer(state, agentId) {
|
|
|
25310
25014
|
return false;
|
|
25311
25015
|
}
|
|
25312
25016
|
try {
|
|
25313
|
-
const { spawnReviewSubRoleForIssue } = await import("./review-agent-
|
|
25017
|
+
const { spawnReviewSubRoleForIssue } = await import("./review-agent-DNboMyW4.js");
|
|
25314
25018
|
const contextManifestPath = join$1(dirname$1(outputPath), "context.json");
|
|
25315
25019
|
const result = await Effect.runPromise(spawnReviewSubRoleForIssue({
|
|
25316
25020
|
issueId: state.issueId,
|
|
@@ -25396,14 +25100,8 @@ async function nudgeSynthesisForCompleteReviewerReports(states) {
|
|
|
25396
25100
|
writeFileSync(join$1(reviewDir, "synthesis.md"), synthesis.body);
|
|
25397
25101
|
let fallbackHead;
|
|
25398
25102
|
try {
|
|
25399
|
-
const {
|
|
25400
|
-
|
|
25401
|
-
const { stdout } = await promisify(execFile)("git", ["rev-parse", "HEAD"], {
|
|
25402
|
-
cwd: state.workspace,
|
|
25403
|
-
encoding: "utf-8",
|
|
25404
|
-
timeout: 1e4
|
|
25405
|
-
});
|
|
25406
|
-
fallbackHead = stdout.trim() || void 0;
|
|
25103
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-D0_yhCgF.js");
|
|
25104
|
+
fallbackHead = await snapshotWorkspaceHeadsPromise(state.issueId, state.workspace);
|
|
25407
25105
|
} catch {}
|
|
25408
25106
|
const anchoredVerdicts = Object.fromEntries(Object.entries(synthesis.reviewerVerdicts).map(([subRole, v]) => [subRole, {
|
|
25409
25107
|
...v,
|
|
@@ -25439,7 +25137,7 @@ async function nudgeSynthesisForCompleteReviewerReports(states) {
|
|
|
25439
25137
|
"Read the four reports, write synthesis.md, then signal review status exactly as roles/review.md instructs."
|
|
25440
25138
|
].join("\n");
|
|
25441
25139
|
try {
|
|
25442
|
-
const { messageAgent } = await import("./agents-
|
|
25140
|
+
const { messageAgent } = await import("./agents-wi9NWzs2.js");
|
|
25443
25141
|
await messageAgent(state.id, message);
|
|
25444
25142
|
reviewReportsPresentNudges.set(nudgeKey, now);
|
|
25445
25143
|
const action = `Nudged ${state.id} to synthesize from ${REVIEW_SUB_ROLES.length} reviewer reports`;
|
|
@@ -25525,7 +25223,7 @@ async function monitorReviewConvoySignals() {
|
|
|
25525
25223
|
if (!signal) continue;
|
|
25526
25224
|
const message = signal === "ready" ? `REVIEWER_READY ${state.reviewSubRole} ${outputPath}` : signal === "timeout" ? `REVIEWER_TIMEOUT ${state.reviewSubRole} ${reason}` : `REVIEWER_FAILED ${state.reviewSubRole} ${reason}`;
|
|
25527
25225
|
try {
|
|
25528
|
-
const { messageAgent } = await import("./agents-
|
|
25226
|
+
const { messageAgent } = await import("./agents-wi9NWzs2.js");
|
|
25529
25227
|
await messageAgent(state.reviewSynthesisAgentId, message);
|
|
25530
25228
|
state.reviewMonitorSignaled = signal;
|
|
25531
25229
|
saveAgentStateSync(state);
|
|
@@ -25533,7 +25231,7 @@ async function monitorReviewConvoySignals() {
|
|
|
25533
25231
|
actions.push(action);
|
|
25534
25232
|
logDeaconEventSync(`monitorReviewConvoySignals: ${action}`);
|
|
25535
25233
|
if (signal === "ready") try {
|
|
25536
|
-
const { notifyPipelineSync } = await import("./pipeline-notifier-
|
|
25234
|
+
const { notifyPipelineSync } = await import("./pipeline-notifier-BJr8gQX6.js");
|
|
25537
25235
|
notifyPipelineSync({
|
|
25538
25236
|
type: "reviewer_completed",
|
|
25539
25237
|
issueId: state.issueId,
|
|
@@ -25541,7 +25239,7 @@ async function monitorReviewConvoySignals() {
|
|
|
25541
25239
|
});
|
|
25542
25240
|
} catch {}
|
|
25543
25241
|
else if (signal === "timeout") try {
|
|
25544
|
-
const { notifyPipelineSync } = await import("./pipeline-notifier-
|
|
25242
|
+
const { notifyPipelineSync } = await import("./pipeline-notifier-BJr8gQX6.js");
|
|
25545
25243
|
notifyPipelineSync({
|
|
25546
25244
|
type: "reviewer_timed_out",
|
|
25547
25245
|
issueId: state.issueId,
|
|
@@ -25641,7 +25339,7 @@ const FORK_CACHE_CHECK_DELAY_MS = 180 * 1e3;
|
|
|
25641
25339
|
async function checkStalledReviewDiscovery() {
|
|
25642
25340
|
const actions = [];
|
|
25643
25341
|
try {
|
|
25644
|
-
const { listAgentStates } = await import("./agents-
|
|
25342
|
+
const { listAgentStates } = await import("./agents-wi9NWzs2.js");
|
|
25645
25343
|
const states = listAgentStates();
|
|
25646
25344
|
const now = Date.now();
|
|
25647
25345
|
for (const state of states) {
|
|
@@ -25650,7 +25348,7 @@ async function checkStalledReviewDiscovery() {
|
|
|
25650
25348
|
const aged = Number.isFinite(startedMs) && now - startedMs > 48e4;
|
|
25651
25349
|
const dead = !await Effect.runPromise(sessionExists(state.id)).catch(() => false) || await Effect.runPromise(isPaneDead(state.id)).catch(() => true);
|
|
25652
25350
|
if (!aged && !dead) continue;
|
|
25653
|
-
const { handleReviewDiscoveryReady } = await import("./review-agent-
|
|
25351
|
+
const { handleReviewDiscoveryReady } = await import("./review-agent-DNboMyW4.js");
|
|
25654
25352
|
const result = await handleReviewDiscoveryReady(state.issueId, { source: dead ? "deacon-backstop (parent dead)" : "deacon-backstop (discovery timeout)" });
|
|
25655
25353
|
actions.push(result.message);
|
|
25656
25354
|
logDeaconEventSync(`checkStalledReviewDiscovery: ${result.message}`);
|
|
@@ -25673,8 +25371,8 @@ async function checkStalledReviewDiscovery() {
|
|
|
25673
25371
|
async function checkStalledReviewParents() {
|
|
25674
25372
|
const actions = [];
|
|
25675
25373
|
try {
|
|
25676
|
-
const { listAgentStates, markAgentStoppedState } = await import("./agents-
|
|
25677
|
-
const { PARENT_REVIEW_TIMEOUT_MS } = await import("./review-agent-
|
|
25374
|
+
const { listAgentStates, markAgentStoppedState } = await import("./agents-wi9NWzs2.js");
|
|
25375
|
+
const { PARENT_REVIEW_TIMEOUT_MS } = await import("./review-agent-DNboMyW4.js");
|
|
25678
25376
|
const states = listAgentStates();
|
|
25679
25377
|
const now = Date.now();
|
|
25680
25378
|
for (const state of states) {
|
|
@@ -25723,8 +25421,8 @@ async function checkStalledReviewParents() {
|
|
|
25723
25421
|
async function checkReviewForkCacheMisses() {
|
|
25724
25422
|
const actions = [];
|
|
25725
25423
|
try {
|
|
25726
|
-
const { listAgentStates, saveAgentState } = await import("./agents-
|
|
25727
|
-
const { readEventsSync } = await import("./events-
|
|
25424
|
+
const { listAgentStates, saveAgentState } = await import("./agents-wi9NWzs2.js");
|
|
25425
|
+
const { readEventsSync } = await import("./events-BTdrdEq8.js");
|
|
25728
25426
|
const { emitActivityEntrySync } = await import("./activity-logger-OEUBdfZ8.js");
|
|
25729
25427
|
const states = listAgentStates();
|
|
25730
25428
|
const now = Date.now();
|
|
@@ -25775,7 +25473,6 @@ async function checkReviewForkCacheMisses() {
|
|
|
25775
25473
|
init_paths();
|
|
25776
25474
|
init_activity_logger();
|
|
25777
25475
|
init_agents$1();
|
|
25778
|
-
init_concurrency$1();
|
|
25779
25476
|
init_review_status();
|
|
25780
25477
|
init_projects();
|
|
25781
25478
|
init_tmux();
|
|
@@ -25860,7 +25557,7 @@ async function reconcileStaleMergeStatus() {
|
|
|
25860
25557
|
if (!project) continue;
|
|
25861
25558
|
let specStatus;
|
|
25862
25559
|
try {
|
|
25863
|
-
const { findSpecByIssue } = await import("./specs-
|
|
25560
|
+
const { findSpecByIssue } = await import("./specs-C8Wsn2XO.js");
|
|
25864
25561
|
const spec = await Effect.runPromise(findSpecByIssue(project.projectPath, issueId));
|
|
25865
25562
|
specStatus = spec?.status;
|
|
25866
25563
|
if (spec && (spec.status === "completed" || spec.status === "cancelled")) {
|
|
@@ -25875,7 +25572,7 @@ async function reconcileStaleMergeStatus() {
|
|
|
25875
25572
|
if (branchTip.stdout.trim() === mainTip.stdout.trim()) console.log(`[deacon] ${issueId}: branch ${branch} points at main; not treating zero-commit branch as merged`);
|
|
25876
25573
|
} catch {}
|
|
25877
25574
|
if (!isMerged) {
|
|
25878
|
-
const { resolveGitHubIssueSync: _resolveGitHubIssue } = await import("./tracker-utils-
|
|
25575
|
+
const { resolveGitHubIssueSync: _resolveGitHubIssue } = await import("./tracker-utils-B4ylXZQK.js");
|
|
25879
25576
|
const ghResolved = _resolveGitHubIssue(issueId);
|
|
25880
25577
|
if (ghResolved.isGitHub) try {
|
|
25881
25578
|
const { stdout } = await execFileAsync$4("gh", [
|
|
@@ -25912,7 +25609,7 @@ async function reconcileStaleMergeStatus() {
|
|
|
25912
25609
|
actions.push(msg);
|
|
25913
25610
|
console.log(`[deacon] ${msg}`);
|
|
25914
25611
|
try {
|
|
25915
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
25612
|
+
const { postMergeLifecycle } = await import("./merge-agent-CKkgIBPB.js");
|
|
25916
25613
|
postMergeLifecycle(issueId, project.projectPath, branch, { skipDeploy: true }).catch((err) => console.warn(`[deacon] postMergeLifecycle (reconcile) failed for ${issueId}: ${err}`));
|
|
25917
25614
|
} catch (err) {
|
|
25918
25615
|
console.warn(`[deacon] Could not import postMergeLifecycle: ${err}`);
|
|
@@ -25937,7 +25634,7 @@ const falseMergedReset = /* @__PURE__ */ new Set();
|
|
|
25937
25634
|
async function reconcileFalseMerged() {
|
|
25938
25635
|
const actions = [];
|
|
25939
25636
|
try {
|
|
25940
|
-
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-
|
|
25637
|
+
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-ClZ2lk8D.js");
|
|
25941
25638
|
if (!isGitHubAppConfigured()) return actions;
|
|
25942
25639
|
const statuses = loadReviewStatuses();
|
|
25943
25640
|
for (const [issueId, status] of Object.entries(statuses)) {
|
|
@@ -25982,7 +25679,7 @@ const CLOSED_PR_RECONCILE_COOLDOWN_MS = 600 * 1e3;
|
|
|
25982
25679
|
async function reconcileClosedPrReadyForMerge() {
|
|
25983
25680
|
const actions = [];
|
|
25984
25681
|
try {
|
|
25985
|
-
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-
|
|
25682
|
+
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-ClZ2lk8D.js");
|
|
25986
25683
|
if (!isGitHubAppConfigured()) return actions;
|
|
25987
25684
|
const statuses = loadReviewStatuses();
|
|
25988
25685
|
const now = Date.now();
|
|
@@ -26054,7 +25751,7 @@ const STALE_MERGE_BLOCKER_COOLDOWN_MS = 120 * 1e3;
|
|
|
26054
25751
|
async function reconcileStaleMergeBlockers() {
|
|
26055
25752
|
const actions = [];
|
|
26056
25753
|
try {
|
|
26057
|
-
const { resolveConflictGate, buildRealConflictGateDeps } = await import("./conflict-gate-
|
|
25754
|
+
const { resolveConflictGate, buildRealConflictGateDeps } = await import("./conflict-gate-BhAY7TUd.js");
|
|
26058
25755
|
const statuses = loadReviewStatuses();
|
|
26059
25756
|
const now = Date.now();
|
|
26060
25757
|
const deps = buildRealConflictGateDeps();
|
|
@@ -26197,7 +25894,7 @@ async function checkFailedMergeRetry() {
|
|
|
26197
25894
|
if (ciEntry.count === 5) {
|
|
26198
25895
|
console.log(`[deacon] CI check failure for ${issueId} — retries exhausted, notifying work agent`);
|
|
26199
25896
|
const ciNotes = status.mergeNotes || "CI checks are failing on the PR";
|
|
26200
|
-
const { writeFeedbackFile } = await import("./feedback-writer-
|
|
25897
|
+
const { writeFeedbackFile } = await import("./feedback-writer-D3a22RCd.js");
|
|
26201
25898
|
const ciFileResult = await Effect.runPromise(writeFeedbackFile({
|
|
26202
25899
|
issueId,
|
|
26203
25900
|
specialist: "merge-agent",
|
|
@@ -26229,7 +25926,7 @@ async function checkFailedMergeRetry() {
|
|
|
26229
25926
|
ciRetryMap.set(issueId, ciEntry);
|
|
26230
25927
|
console.log(`[deacon] CI check failure for ${issueId} — notifying agent to re-submit (attempt ${ciEntry.count}/5)`);
|
|
26231
25928
|
const ciNotes = status.mergeNotes || "CI checks are failing on the PR";
|
|
26232
|
-
const { writeFeedbackFile } = await import("./feedback-writer-
|
|
25929
|
+
const { writeFeedbackFile } = await import("./feedback-writer-D3a22RCd.js");
|
|
26233
25930
|
const ciFileResult2 = await Effect.runPromise(writeFeedbackFile({
|
|
26234
25931
|
issueId,
|
|
26235
25932
|
specialist: "merge-agent",
|
|
@@ -26257,7 +25954,7 @@ async function checkFailedMergeRetry() {
|
|
|
26257
25954
|
const lastNudge = timeoutNudgeCooldowns.get(issueIdForFb);
|
|
26258
25955
|
if (!lastNudge || now - lastNudge >= TIMEOUT_NUDGE_COOLDOWN_MS) {
|
|
26259
25956
|
const timeoutNotes = status.mergeNotes;
|
|
26260
|
-
const { writeFeedbackFile } = await import("./feedback-writer-
|
|
25957
|
+
const { writeFeedbackFile } = await import("./feedback-writer-D3a22RCd.js");
|
|
26261
25958
|
await Effect.runPromise(writeFeedbackFile({
|
|
26262
25959
|
issueId: issueIdForFb,
|
|
26263
25960
|
specialist: "merge-agent",
|
|
@@ -26362,7 +26059,7 @@ async function autoCloseOut(now = /* @__PURE__ */ new Date()) {
|
|
|
26362
26059
|
} } : {}
|
|
26363
26060
|
};
|
|
26364
26061
|
try {
|
|
26365
|
-
const { closeOut } = await import("./workflows-
|
|
26062
|
+
const { closeOut } = await import("./workflows-BQu4RFQ-.js");
|
|
26366
26063
|
const result = await Effect.runPromise(closeOut(ctx));
|
|
26367
26064
|
if (!result.success) {
|
|
26368
26065
|
const failed = result.steps.find((step) => !step.success && !step.skipped);
|
|
@@ -26414,7 +26111,8 @@ async function checkFirstCompletionAgents() {
|
|
|
26414
26111
|
if (existsSync(completedFile) || existsSync(processedMarker)) continue;
|
|
26415
26112
|
if (!isAgentIdleForNudge(agent.id, FIRST_COMPLETION_IDLE_MS)) continue;
|
|
26416
26113
|
const runtimeState = getAgentRuntimeStateSync(agent.id);
|
|
26417
|
-
|
|
26114
|
+
if (!runtimeState) continue;
|
|
26115
|
+
const idleMs = now - new Date(runtimeState.lastActivity ?? 0).getTime();
|
|
26418
26116
|
if (idleMs < FIRST_COMPLETION_IDLE_MS) continue;
|
|
26419
26117
|
const lastNudge = firstCompletionCooldowns.get(agent.id);
|
|
26420
26118
|
if (lastNudge && now - lastNudge < FIRST_COMPLETION_COOLDOWN_MS) continue;
|
|
@@ -26481,16 +26179,8 @@ async function checkFirstCompletionAgents() {
|
|
|
26481
26179
|
return actions;
|
|
26482
26180
|
}
|
|
26483
26181
|
//#endregion
|
|
26484
|
-
//#region ../../lib/cloister/agent-grace.ts
|
|
26485
|
-
init_traefik_connect();
|
|
26486
|
-
const WORK_LAUNCHER_GRACE_MS = 12e4;
|
|
26487
|
-
function isStartingWithinGrace(state, now = Date.now(), graceMs = WORK_LAUNCHER_GRACE_MS) {
|
|
26488
|
-
if (state.status !== "starting") return false;
|
|
26489
|
-
const startedMs = Date.parse(state.startedAt ?? "");
|
|
26490
|
-
return Number.isFinite(startedMs) && now - startedMs < graceMs;
|
|
26491
|
-
}
|
|
26492
|
-
//#endregion
|
|
26493
26182
|
//#region ../../lib/cloister/boot-reconciliation-outcomes.ts
|
|
26183
|
+
init_traefik_connect();
|
|
26494
26184
|
function resumedBootReconciliationOutcome(agent) {
|
|
26495
26185
|
return {
|
|
26496
26186
|
id: agent.id,
|
|
@@ -26658,9 +26348,106 @@ function startBootReconciliation(options = {}) {
|
|
|
26658
26348
|
};
|
|
26659
26349
|
}
|
|
26660
26350
|
//#endregion
|
|
26661
|
-
//#region ../../lib/
|
|
26351
|
+
//#region ../../lib/agents/pinned-launch.ts
|
|
26662
26352
|
init_io();
|
|
26663
26353
|
init_dag();
|
|
26354
|
+
init_agent_state();
|
|
26355
|
+
function parseFlagValue(content, flag) {
|
|
26356
|
+
const escapedFlag = flag.replace("-", "\\-");
|
|
26357
|
+
const quoted = content.match(new RegExp(`${escapedFlag}\\s+'([^']+)'`)) ?? content.match(new RegExp(`${escapedFlag}\\s+"([^"]+)"`));
|
|
26358
|
+
if (quoted?.[1]) return quoted[1];
|
|
26359
|
+
return content.match(new RegExp(`${escapedFlag}\\s+([^\\s'"\\\\]+)`))?.[1] ?? null;
|
|
26360
|
+
}
|
|
26361
|
+
function parsePinnedAgentLaunch(launcher, sessionId) {
|
|
26362
|
+
const pinnedSessionId = sessionId.trim();
|
|
26363
|
+
if (!pinnedSessionId) return null;
|
|
26364
|
+
const harness = launcher.includes("codex-app-server-host.js") || /(?:^|\s)(?:exec\s+)?codex(?:\s|$)/m.test(launcher) ? "codex" : /(?:^|\s)(?:exec\s+)?omp\s+--mode\s+rpc(?:\s|$)/m.test(launcher) ? "ohmypi" : /(?:^|\s)claude(?:\s|$)/m.test(launcher) ? "claude-code" : null;
|
|
26365
|
+
const model = parseFlagValue(launcher, "--model") ?? parseFlagValue(launcher, "-m");
|
|
26366
|
+
if (!harness || !model || model.startsWith("pending-")) return null;
|
|
26367
|
+
return {
|
|
26368
|
+
sessionId: pinnedSessionId,
|
|
26369
|
+
model,
|
|
26370
|
+
harness
|
|
26371
|
+
};
|
|
26372
|
+
}
|
|
26373
|
+
function readPinnedAgentLaunchSync(agentId) {
|
|
26374
|
+
const agentDir = getAgentDir(agentId);
|
|
26375
|
+
const launcherPath = join(agentDir, "launcher.sh");
|
|
26376
|
+
const sessionIdPath = join(agentDir, "session.id");
|
|
26377
|
+
if (!existsSync$1(launcherPath) || !existsSync$1(sessionIdPath)) return null;
|
|
26378
|
+
try {
|
|
26379
|
+
return parsePinnedAgentLaunch(readFileSync$1(launcherPath, "utf8"), readFileSync$1(sessionIdPath, "utf8"));
|
|
26380
|
+
} catch {
|
|
26381
|
+
return null;
|
|
26382
|
+
}
|
|
26383
|
+
}
|
|
26384
|
+
//#endregion
|
|
26385
|
+
//#region ../../lib/agents/placeholder-reconciliation.ts
|
|
26386
|
+
init_persistent_logger();
|
|
26387
|
+
init_agent_state();
|
|
26388
|
+
function defaultPlaceholderReconciliationDeps() {
|
|
26389
|
+
return {
|
|
26390
|
+
readPinnedLaunch: readPinnedAgentLaunchSync,
|
|
26391
|
+
markRunning: markAgentRunningState,
|
|
26392
|
+
saveState: (state) => Effect.runPromise(saveAgentState(state)),
|
|
26393
|
+
logDeacon: logDeaconEventSync,
|
|
26394
|
+
logAgent: logAgentLifecycleSync
|
|
26395
|
+
};
|
|
26396
|
+
}
|
|
26397
|
+
async function reconcileLiveWorkSpawnPlaceholder(state, notifyStatusChanged, deps) {
|
|
26398
|
+
if (state.model !== "pending-work-spawn") return null;
|
|
26399
|
+
const resolvedDeps = deps ?? defaultPlaceholderReconciliationDeps();
|
|
26400
|
+
const pinnedLaunch = resolvedDeps.readPinnedLaunch(state.id);
|
|
26401
|
+
if (!pinnedLaunch) return null;
|
|
26402
|
+
const previousStatus = state.status;
|
|
26403
|
+
state.model = pinnedLaunch.model;
|
|
26404
|
+
state.harness = pinnedLaunch.harness;
|
|
26405
|
+
state.sessionId = pinnedLaunch.sessionId;
|
|
26406
|
+
resolvedDeps.markRunning(state);
|
|
26407
|
+
await resolvedDeps.saveState(state);
|
|
26408
|
+
notifyStatusChanged(state, previousStatus, true);
|
|
26409
|
+
const message = `Reconciled ${state.id} placeholder to running (${pinnedLaunch.harness}/${pinnedLaunch.model})`;
|
|
26410
|
+
resolvedDeps.logDeacon(`handleAgentHeartbeatDeadEvent: ${message}`);
|
|
26411
|
+
resolvedDeps.logAgent(state.id, message);
|
|
26412
|
+
return message;
|
|
26413
|
+
}
|
|
26414
|
+
//#endregion
|
|
26415
|
+
//#region ../../lib/agents/supervisor-liveness.ts
|
|
26416
|
+
/**
|
|
26417
|
+
* PAN-3002: supervisor-delivered agents (pty-supervisor, deliveryMethod:
|
|
26418
|
+
* supervisor) keep working after their tmux session dies — the worker holds
|
|
26419
|
+
* the pty and detaches. A tmux-only liveness check then declares a healthy
|
|
26420
|
+
* agent dead and marks it stopped, splitting state from reality: MIN-882 ran
|
|
26421
|
+
* 36h untracked ($166, 35MB transcript) while the pipeline showed "Planned
|
|
26422
|
+
* idle", and PAN-2997 was killed 41s after a healthy resume.
|
|
26423
|
+
*
|
|
26424
|
+
* A live pty-supervisor process carrying `--name <agentId>` is positive proof
|
|
26425
|
+
* of life regardless of tmux. The deacon's liveness arbiter consults this
|
|
26426
|
+
* before declaring an agent orphaned.
|
|
26427
|
+
*/
|
|
26428
|
+
const defaultPgrep = (pattern) => {
|
|
26429
|
+
try {
|
|
26430
|
+
execFileSync("pgrep", ["-f", pattern], { stdio: [
|
|
26431
|
+
"ignore",
|
|
26432
|
+
"ignore",
|
|
26433
|
+
"ignore"
|
|
26434
|
+
] });
|
|
26435
|
+
return true;
|
|
26436
|
+
} catch {
|
|
26437
|
+
return false;
|
|
26438
|
+
}
|
|
26439
|
+
};
|
|
26440
|
+
/**
|
|
26441
|
+
* True when a pty-supervisor process for this agent is alive. `--name` is
|
|
26442
|
+
* boundary-anchored so `agent-min-882` does not match `agent-min-882-review`.
|
|
26443
|
+
* Agent ids are `[a-z0-9-]` by construction, so the pattern needs no escaping.
|
|
26444
|
+
*/
|
|
26445
|
+
function supervisorProcessAliveSync(agentId, pgrep = defaultPgrep) {
|
|
26446
|
+
if (!agentId) return false;
|
|
26447
|
+
return pgrep(`pty-supervisor\\.js.*--name ${agentId}(\\s|$)`);
|
|
26448
|
+
}
|
|
26449
|
+
//#endregion
|
|
26450
|
+
//#region ../../lib/cloister/confirmed-session-query.ts
|
|
26664
26451
|
init_tmux();
|
|
26665
26452
|
const consecutiveMisses = /* @__PURE__ */ new Map();
|
|
26666
26453
|
function queryConfirmedSession(agentId) {
|
|
@@ -26673,6 +26460,10 @@ function queryConfirmedSession(agentId) {
|
|
|
26673
26460
|
consecutiveMisses.delete(agentId);
|
|
26674
26461
|
return [query];
|
|
26675
26462
|
}
|
|
26463
|
+
if (supervisorProcessAliveSync(agentId)) {
|
|
26464
|
+
consecutiveMisses.delete(agentId);
|
|
26465
|
+
return [query, `retained — live pty-supervisor process despite missing tmux session (PAN-3002)`];
|
|
26466
|
+
}
|
|
26676
26467
|
const missCount = (consecutiveMisses.get(agentId) ?? 0) + 1;
|
|
26677
26468
|
consecutiveMisses.set(agentId, missCount);
|
|
26678
26469
|
return missCount < 2 ? [query, `retained after first confirmed tmux miss (${query.detail})`] : [query];
|
|
@@ -26802,7 +26593,10 @@ async function handleAgentHeartbeatDeadEvent$1(agentId, context, deps) {
|
|
|
26802
26593
|
} catch {
|
|
26803
26594
|
return [];
|
|
26804
26595
|
}
|
|
26805
|
-
else
|
|
26596
|
+
else {
|
|
26597
|
+
const action = await reconcileLiveWorkSpawnPlaceholder(state, deps.notifyAgentStatusChanged);
|
|
26598
|
+
return action ? [action] : [];
|
|
26599
|
+
}
|
|
26806
26600
|
else if (state.status === "starting") {
|
|
26807
26601
|
if (isStartingWithinGrace(state)) return [];
|
|
26808
26602
|
}
|
|
@@ -26935,7 +26729,7 @@ function buildStalledResumePrompt(state) {
|
|
|
26935
26729
|
return null;
|
|
26936
26730
|
}
|
|
26937
26731
|
}
|
|
26938
|
-
return
|
|
26732
|
+
return buildResumeContinueMessage(state);
|
|
26939
26733
|
}
|
|
26940
26734
|
function readyTaskLine(item) {
|
|
26941
26735
|
return `${item.id} ${item.title}`.trim();
|
|
@@ -26960,7 +26754,7 @@ async function nudgeStalledResumeWorkAgents() {
|
|
|
26960
26754
|
const message = buildStalledResumePrompt(state);
|
|
26961
26755
|
if (!message) continue;
|
|
26962
26756
|
try {
|
|
26963
|
-
const { messageAgent } = await import("./agents-
|
|
26757
|
+
const { messageAgent } = await import("./agents-wi9NWzs2.js");
|
|
26964
26758
|
await messageAgent(agentId, message);
|
|
26965
26759
|
recordCooldown(agentId, ".last-stalled-resume-nudge");
|
|
26966
26760
|
const action = `Re-sent stalled resume prompt to ${agentId} (${state.issueId})`;
|
|
@@ -27069,12 +26863,12 @@ async function nudgeIdleWorkAgentsWithOpenBeads() {
|
|
|
27069
26863
|
``,
|
|
27070
26864
|
`Next ready task: ${firstTask}`,
|
|
27071
26865
|
``,
|
|
27072
|
-
`If you don't already have your full brief for ${state.issueId} in context (work-agent role instructions, the
|
|
26866
|
+
`If you don't already have your full brief for ${state.issueId} in context (work-agent role instructions, the xBRIEF plan, recorded decisions & hazards), re-read it now — it is on disk at ${briefPath}, plus .pan/continue.json and .pan/spec.vbrief.json in your workspace. Startup kickoff delivery can silently fail on large briefs, so do not assume you received it.`,
|
|
27073
26867
|
``,
|
|
27074
26868
|
"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."
|
|
27075
26869
|
].join("\n");
|
|
27076
26870
|
try {
|
|
27077
|
-
const { messageAgent } = await import("./agents-
|
|
26871
|
+
const { messageAgent } = await import("./agents-wi9NWzs2.js");
|
|
27078
26872
|
await messageAgent(agentId, message);
|
|
27079
26873
|
writeFileSync(join$1(getAgentDir(agentId), ".last-bead-nudge"), String(Date.now()), "utf-8");
|
|
27080
26874
|
const action = `Nudged idle ${agentId} (${state.issueId}) — ${openTasks.length} ready task(s)`;
|
|
@@ -27139,6 +26933,11 @@ async function handleAgentStoppedEvent$1(agentId, opts = {}, deps) {
|
|
|
27139
26933
|
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — held by boot reconciliation decision`);
|
|
27140
26934
|
return null;
|
|
27141
26935
|
}
|
|
26936
|
+
const bootDecision = getBootReconciliationState().decision;
|
|
26937
|
+
if (!skipGlobalGates && (bootDecision === "pending" || bootDecision === "hold_all")) {
|
|
26938
|
+
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} held — boot reconciliation ${bootDecision} (late-arriving candidate, evaluated with the batch)`);
|
|
26939
|
+
return null;
|
|
26940
|
+
}
|
|
27142
26941
|
if (state.paused === true) {
|
|
27143
26942
|
logDeaconEventSync(`handleAgentStoppedEvent: ${agentId} skipped — ${isVerifyPausedAgentState(state) ? "verify-paused" : "manually-paused"} (${state.pausedReason ?? "no reason"})`);
|
|
27144
26943
|
return null;
|
|
@@ -28298,7 +28097,7 @@ async function cleanupStaleAgentState() {
|
|
|
28298
28097
|
try {
|
|
28299
28098
|
if (await Effect.runPromise(sessionExists(dir.name))) continue;
|
|
28300
28099
|
} catch {}
|
|
28301
|
-
if (dir.name.startsWith("agent-")) {
|
|
28100
|
+
if (dir.name.startsWith("agent-") || dir.name.startsWith("strike-")) {
|
|
28302
28101
|
if (await Effect.runPromise(getAgentState(dir.name).pipe(Effect.catch(() => Effect.succeed(null)))) != null) continue;
|
|
28303
28102
|
}
|
|
28304
28103
|
const ageMs = now - statSync(agentDir).mtimeMs;
|
|
@@ -28343,8 +28142,8 @@ async function cleanupStaleAgentState() {
|
|
|
28343
28142
|
*/
|
|
28344
28143
|
async function cleanupAbandonedFeedback() {
|
|
28345
28144
|
const actions = [];
|
|
28346
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
28347
|
-
const { clearFeedbackFiles } = await import("./feedback-writer-
|
|
28145
|
+
const { getReviewStatusSync } = await import("./review-status-btEYlaxA.js");
|
|
28146
|
+
const { clearFeedbackFiles } = await import("./feedback-writer-D3a22RCd.js");
|
|
28348
28147
|
for (const { issueId, workspacePath } of listFeatureWorkspaces()) {
|
|
28349
28148
|
const panFeedbackDir = join$1(workspacePath, ".pan", "feedback");
|
|
28350
28149
|
if (!existsSync(panFeedbackDir)) continue;
|
|
@@ -28415,7 +28214,7 @@ async function handleOrphanReviewerSession(sessionName, sessions, creationTimes,
|
|
|
28415
28214
|
if (!issueId) return null;
|
|
28416
28215
|
const agentSession = `agent-${issueId.toLowerCase()}`;
|
|
28417
28216
|
if (sessions.includes(agentSession)) return null;
|
|
28418
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
28217
|
+
const { getReviewStatusSync } = await import("./review-status-btEYlaxA.js");
|
|
28419
28218
|
try {
|
|
28420
28219
|
if (getReviewStatusSync(issueId)?.reviewStatus === "reviewing") return null;
|
|
28421
28220
|
} catch {}
|
|
@@ -28537,7 +28336,7 @@ async function checkOrphanedCompletions() {
|
|
|
28537
28336
|
async function checkPendingTestDispatch() {
|
|
28538
28337
|
const actions = [];
|
|
28539
28338
|
try {
|
|
28540
|
-
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-
|
|
28339
|
+
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-btEYlaxA.js");
|
|
28541
28340
|
const statuses = loadReviewStatuses();
|
|
28542
28341
|
const now = Date.now();
|
|
28543
28342
|
for (const [issueId, status] of Object.entries(statuses)) {
|
|
@@ -28570,7 +28369,7 @@ async function checkPendingTestDispatch() {
|
|
|
28570
28369
|
console.log(`[deacon] ${issueId}: skipping test re-dispatch — issue is closed`);
|
|
28571
28370
|
continue;
|
|
28572
28371
|
}
|
|
28573
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
28372
|
+
const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
|
|
28574
28373
|
const resolved = resolveProjectFromIssueSync(issueId);
|
|
28575
28374
|
if (!resolved) continue;
|
|
28576
28375
|
const issueLower = issueId.toLowerCase();
|
|
@@ -28585,8 +28384,8 @@ async function checkPendingTestDispatch() {
|
|
|
28585
28384
|
logDeaconEventSync(`checkPendingTestDispatch: deferred test for ${issueId} — advancing ceiling reached (PAN-1665) — ${describeRunningAgents()}`);
|
|
28586
28385
|
continue;
|
|
28587
28386
|
}
|
|
28588
|
-
const { spawnRun } = await import("./agents-
|
|
28589
|
-
const { buildTestRolePrompt } = await import("./test-agent-queue-
|
|
28387
|
+
const { spawnRun } = await import("./agents-wi9NWzs2.js");
|
|
28388
|
+
const { buildTestRolePrompt } = await import("./test-agent-queue-MbxX5vqq.js");
|
|
28590
28389
|
try {
|
|
28591
28390
|
const run = await spawnRun(issueId, "test", {
|
|
28592
28391
|
workspace,
|
|
@@ -28709,7 +28508,7 @@ async function checkCompletedButUnsignaledTests() {
|
|
|
28709
28508
|
const cmd = `pan admin specialists done test ${issueId} --status ${decision.status}${noteArg}`;
|
|
28710
28509
|
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.`;
|
|
28711
28510
|
try {
|
|
28712
|
-
const { messageAgent } = await import("./agents-
|
|
28511
|
+
const { messageAgent } = await import("./agents-wi9NWzs2.js");
|
|
28713
28512
|
await messageAgent(testSession, nudge);
|
|
28714
28513
|
unsignaledTestNudges.set(testSession, now);
|
|
28715
28514
|
const msg = `Nudged ${testSession} to signal ${decision.status} (verdict artifact present)`;
|
|
@@ -28723,7 +28522,7 @@ async function checkCompletedButUnsignaledTests() {
|
|
|
28723
28522
|
case "nudge-write": {
|
|
28724
28523
|
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.`;
|
|
28725
28524
|
try {
|
|
28726
|
-
const { messageAgent } = await import("./agents-
|
|
28525
|
+
const { messageAgent } = await import("./agents-wi9NWzs2.js");
|
|
28727
28526
|
await messageAgent(testSession, nudge);
|
|
28728
28527
|
unsignaledTestNudges.set(testSession, now);
|
|
28729
28528
|
const msg = `Nudged ${testSession} to write+signal a test verdict (no artifact yet)`;
|
|
@@ -28746,8 +28545,8 @@ async function checkCompletedButUnsignaledTests() {
|
|
|
28746
28545
|
async function checkVerificationReviewContradiction() {
|
|
28747
28546
|
const actions = [];
|
|
28748
28547
|
try {
|
|
28749
|
-
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-
|
|
28750
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
28548
|
+
const { loadReviewStatuses, setReviewStatusSync } = await import("./review-status-btEYlaxA.js");
|
|
28549
|
+
const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
|
|
28751
28550
|
const statuses = loadReviewStatuses();
|
|
28752
28551
|
for (const [issueId, status] of Object.entries(statuses)) if (status.verificationStatus === "passed" && status.reviewStatus === "reviewing" && status.stuckReason === "review_infrastructure_failure") {
|
|
28753
28552
|
let reviewedAtCommit;
|
|
@@ -28796,7 +28595,7 @@ async function checkPostReviewCommits() {
|
|
|
28796
28595
|
const actions = [];
|
|
28797
28596
|
try {
|
|
28798
28597
|
const statuses = loadReviewStatuses();
|
|
28799
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
28598
|
+
const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
|
|
28800
28599
|
for (const [issueId, status] of Object.entries(statuses)) {
|
|
28801
28600
|
if (status.mergeStatus === "merged") continue;
|
|
28802
28601
|
if (!status.reviewedAtCommit) continue;
|
|
@@ -28851,7 +28650,7 @@ async function checkPostReviewCommits() {
|
|
|
28851
28650
|
actions.push(`Deferred post-review re-dispatch for ${issueId} — advancing-role concurrency ceiling reached`);
|
|
28852
28651
|
logDeaconEventSync(`checkPostReviewCommits: deferred review for ${issueId} — advancing ceiling reached (PAN-1665) — ${describeRunningAgents()}`);
|
|
28853
28652
|
} else if (freshStatus?.reviewStatus === "pending") {
|
|
28854
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
28653
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-DNboMyW4.js");
|
|
28855
28654
|
const branch = `feature/${issueId.toLowerCase()}`;
|
|
28856
28655
|
const dispatchResult = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
28857
28656
|
issueId,
|
|
@@ -28951,7 +28750,7 @@ async function checkReadyForMergeStuck() {
|
|
|
28951
28750
|
const testStatusGreenCiReconcileCooldowns = /* @__PURE__ */ new Map();
|
|
28952
28751
|
const TEST_STATUS_GREEN_CI_RECONCILE_COOLDOWN_MS = 300 * 1e3;
|
|
28953
28752
|
async function reconcileTestStatusFromGreenCi() {
|
|
28954
|
-
const { getCiCheckRunsState, getPullRequestHeadState, isGitHubAppConfigured } = await import("./github-app-
|
|
28753
|
+
const { getCiCheckRunsState, getPullRequestHeadState, isGitHubAppConfigured } = await import("./github-app-ClZ2lk8D.js");
|
|
28955
28754
|
return reconcileTestStatusFromGreenCiWithDeps({
|
|
28956
28755
|
isGitHubAppConfigured,
|
|
28957
28756
|
loadReviewStatuses,
|
|
@@ -28972,7 +28771,7 @@ async function reconcileTestStatusFromGreenCi() {
|
|
|
28972
28771
|
*/
|
|
28973
28772
|
async function clearStaleCiFeedback(issueId) {
|
|
28974
28773
|
const { readdir, rm } = await import("fs/promises");
|
|
28975
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
28774
|
+
const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
|
|
28976
28775
|
const projectConfig = resolveProjectFromIssueSync(issueId);
|
|
28977
28776
|
if (!projectConfig) return;
|
|
28978
28777
|
const repoDir = projectConfig.projectPath;
|
|
@@ -29268,7 +29067,7 @@ async function checkWorkspaceContainerHealth(sharedState) {
|
|
|
29268
29067
|
}
|
|
29269
29068
|
}
|
|
29270
29069
|
try {
|
|
29271
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
29070
|
+
const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
|
|
29272
29071
|
const resolved = resolveProjectFromIssueSync(issueLower.toUpperCase());
|
|
29273
29072
|
if (resolved) await killOrphanedWorkspaceProcesses(`${resolved.projectPath}/workspaces/feature-${issueLower}`);
|
|
29274
29073
|
} catch {}
|
|
@@ -29317,8 +29116,8 @@ async function checkWorkspaceContainerHealth(sharedState) {
|
|
|
29317
29116
|
async function checkMergedWorkSessions() {
|
|
29318
29117
|
const actions = [];
|
|
29319
29118
|
try {
|
|
29320
|
-
const { selectMergedWorkSessions } = await import("./reap-terminal-sessions-
|
|
29321
|
-
const { setAgentPaused } = await import("./agents-
|
|
29119
|
+
const { selectMergedWorkSessions } = await import("./reap-terminal-sessions-7KeHv1R1.js");
|
|
29120
|
+
const { setAgentPaused } = await import("./agents-wi9NWzs2.js");
|
|
29322
29121
|
const toKill = selectMergedWorkSessions(loadReviewStatuses(), [...await Effect.runPromise(listSessionNames())]);
|
|
29323
29122
|
for (const session of toKill) try {
|
|
29324
29123
|
await Effect.runPromise(setAgentPaused(session, "merged — awaiting close-out (verify on main)", true));
|
|
@@ -29358,7 +29157,7 @@ const AWAITING_TEST_IDLE_REAP_MS = 600 * 1e3;
|
|
|
29358
29157
|
async function checkAwaitingTestWorkSessions() {
|
|
29359
29158
|
const actions = [];
|
|
29360
29159
|
try {
|
|
29361
|
-
const { selectAwaitingTestWorkSessions } = await import("./reap-terminal-sessions-
|
|
29160
|
+
const { selectAwaitingTestWorkSessions } = await import("./reap-terminal-sessions-7KeHv1R1.js");
|
|
29362
29161
|
const candidates = selectAwaitingTestWorkSessions(loadReviewStatuses(), [...await Effect.runPromise(listSessionNames())]);
|
|
29363
29162
|
const now = Date.now();
|
|
29364
29163
|
for (const session of candidates) {
|
|
@@ -29411,14 +29210,14 @@ async function runPatrol() {
|
|
|
29411
29210
|
hasLoggedGlobalPauseSkip = false;
|
|
29412
29211
|
addLog("info", `Patrol cycle ${state.patrolCycle} — checking per-project specialists`, state.patrolCycle);
|
|
29413
29212
|
console.log(`[deacon] Patrol cycle ${state.patrolCycle} - checking per-project specialists`);
|
|
29414
|
-
for (const a of await (await import("./stale-task-claims-
|
|
29213
|
+
for (const a of await (await import("./stale-task-claims-KJKxxiiQ.js")).patrolStaleTaskClaims()) {
|
|
29415
29214
|
actions.push(a);
|
|
29416
29215
|
addLog("action", a, state.patrolCycle);
|
|
29417
29216
|
}
|
|
29418
29217
|
const stuckRemediationActions = await checkStuckAgentRemediation();
|
|
29419
29218
|
actions.push(...stuckRemediationActions);
|
|
29420
29219
|
for (const a of stuckRemediationActions) addLog("action", a, state.patrolCycle);
|
|
29421
|
-
const { reconcileInFlightJournals } = await import("./advancing-selfheal-
|
|
29220
|
+
const { reconcileInFlightJournals } = await import("./advancing-selfheal-BVwW4qRn.js");
|
|
29422
29221
|
const reconciledJournalActions = await reconcileInFlightJournals();
|
|
29423
29222
|
actions.push(...reconciledJournalActions);
|
|
29424
29223
|
for (const a of reconciledJournalActions) addLog("action", a, state.patrolCycle);
|
|
@@ -29430,7 +29229,7 @@ async function runPatrol() {
|
|
|
29430
29229
|
const age = Date.now() - (pending.timestamp ?? 0);
|
|
29431
29230
|
if (age < 3600 * 1e3) {
|
|
29432
29231
|
console.log(`[deacon] Processing pending post-merge lifecycle for ${pending.issueId} (age: ${Math.round(age / 1e3)}s)`);
|
|
29433
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
29232
|
+
const { postMergeLifecycle } = await import("./merge-agent-CKkgIBPB.js");
|
|
29434
29233
|
const { unlinkSync } = await import("fs");
|
|
29435
29234
|
unlinkSync(pendingFile);
|
|
29436
29235
|
await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
|
|
@@ -29444,7 +29243,7 @@ async function runPatrol() {
|
|
|
29444
29243
|
} catch (err) {
|
|
29445
29244
|
console.warn(`[deacon] Failed to process pending lifecycle: ${err.message}`);
|
|
29446
29245
|
}
|
|
29447
|
-
if (state.patrolCycle % 5 === 0) await (await import("./deploy-patrol-
|
|
29246
|
+
if (state.patrolCycle % 5 === 0) await (await import("./deploy-patrol-AiFoP8dw.js")).runScheduledDeployPatrol();
|
|
29448
29247
|
const livenessActions = await reconcileAgentLiveness();
|
|
29449
29248
|
actions.push(...livenessActions);
|
|
29450
29249
|
for (const a of livenessActions) addLog("action", a, state.patrolCycle);
|
|
@@ -29476,7 +29275,7 @@ async function runPatrol() {
|
|
|
29476
29275
|
actions.push(...suspendActions);
|
|
29477
29276
|
for (const a of suspendActions) addLog("action", a, state.patrolCycle);
|
|
29478
29277
|
try {
|
|
29479
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
29278
|
+
const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
|
|
29480
29279
|
const allStatuses = loadReviewStatuses();
|
|
29481
29280
|
for (const [issueId, status] of Object.entries(allStatuses)) {
|
|
29482
29281
|
if (!status.readyForMerge || status.mergeStatus === "merged") continue;
|
|
@@ -29496,7 +29295,7 @@ async function runPatrol() {
|
|
|
29496
29295
|
} catch (err) {
|
|
29497
29296
|
console.warn(`[deacon] Failed to check workspace existence: ${err.message}`);
|
|
29498
29297
|
}
|
|
29499
|
-
const { checkMergedAdvancingSessions } = await import("./advancing-selfheal-
|
|
29298
|
+
const { checkMergedAdvancingSessions } = await import("./advancing-selfheal-BVwW4qRn.js");
|
|
29500
29299
|
const reapedWorkActions = await checkMergedWorkSessions();
|
|
29501
29300
|
actions.push(...reapedWorkActions);
|
|
29502
29301
|
for (const a of reapedWorkActions) addLog("action", a, state.patrolCycle);
|
|
@@ -29504,7 +29303,7 @@ async function runPatrol() {
|
|
|
29504
29303
|
actions.push(...reapedMergedAdvancingActions);
|
|
29505
29304
|
for (const a of reapedMergedAdvancingActions) addLog("action", a, state.patrolCycle);
|
|
29506
29305
|
try {
|
|
29507
|
-
const { refreshClaudeCredentialsForActiveRemoteAgents } = await import("./remote-completion-
|
|
29306
|
+
const { refreshClaudeCredentialsForActiveRemoteAgents } = await import("./remote-completion-fVe9e_3u.js");
|
|
29508
29307
|
const remoteCredentialActions = await refreshClaudeCredentialsForActiveRemoteAgents();
|
|
29509
29308
|
actions.push(...remoteCredentialActions);
|
|
29510
29309
|
for (const a of remoteCredentialActions) addLog(a.includes("failed") ? "warn" : "action", a, state.patrolCycle);
|
|
@@ -29512,7 +29311,7 @@ async function runPatrol() {
|
|
|
29512
29311
|
addLog("warn", `Remote credential refresh patrol failed: ${err.message}`, state.patrolCycle);
|
|
29513
29312
|
}
|
|
29514
29313
|
try {
|
|
29515
|
-
const { refreshHostHeartbeatForEphemeralVms } = await import("./remote-agents-
|
|
29314
|
+
const { refreshHostHeartbeatForEphemeralVms } = await import("./remote-agents-CA3Ihlxj.js");
|
|
29516
29315
|
const heartbeatActions = await refreshHostHeartbeatForEphemeralVms();
|
|
29517
29316
|
actions.push(...heartbeatActions);
|
|
29518
29317
|
for (const a of heartbeatActions) addLog(a.includes("failed") ? "warn" : "action", a, state.patrolCycle);
|
|
@@ -29520,7 +29319,7 @@ async function runPatrol() {
|
|
|
29520
29319
|
addLog("warn", `Remote heartbeat refresh patrol failed: ${err.message}`, state.patrolCycle);
|
|
29521
29320
|
}
|
|
29522
29321
|
try {
|
|
29523
|
-
const { reapCompletedRemoteAgents } = await import("./remote-completion-
|
|
29322
|
+
const { reapCompletedRemoteAgents } = await import("./remote-completion-fVe9e_3u.js");
|
|
29524
29323
|
const remoteReap = await reapCompletedRemoteAgents();
|
|
29525
29324
|
for (const r of remoteReap) if (r.status === "handed-off" || r.status === "error") {
|
|
29526
29325
|
const msg = `Remote reap ${r.issueId}: ${r.status} (${r.details.join("; ")})`;
|
|
@@ -29705,7 +29504,7 @@ async function runPatrol() {
|
|
|
29705
29504
|
const issueId = runtimeState.currentIssue;
|
|
29706
29505
|
try {
|
|
29707
29506
|
if (getReviewStatusSync(issueId)?.mergeStatus === "merging") {
|
|
29708
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
29507
|
+
const { resolveProjectFromIssueSync } = await import("./projects-vjjcmiN8.js");
|
|
29709
29508
|
const resolved = resolveProjectFromIssueSync(issueId);
|
|
29710
29509
|
if (resolved) {
|
|
29711
29510
|
const branch = `feature/${issueId.toLowerCase()}`;
|
|
@@ -29719,7 +29518,7 @@ async function runPatrol() {
|
|
|
29719
29518
|
mergeStatus: "merged",
|
|
29720
29519
|
readyForMerge: false
|
|
29721
29520
|
});
|
|
29722
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
29521
|
+
const { postMergeLifecycle } = await import("./merge-agent-CKkgIBPB.js");
|
|
29723
29522
|
postMergeLifecycle(issueId, resolved.projectPath).catch((err) => console.warn(`[deacon] postMergeLifecycle failed for ${issueId}: ${err}`));
|
|
29724
29523
|
actions.push(`Auto-completed stale merge for ${issueId}`);
|
|
29725
29524
|
} else {
|
|
@@ -29899,7 +29698,7 @@ function startDeacon() {
|
|
|
29899
29698
|
logDeaconEventSync(`startDeacon: health monitor starting (patrol every ${config.patrolIntervalMs / 1e3}s)`);
|
|
29900
29699
|
(async () => {
|
|
29901
29700
|
await reconcileAgentLiveness();
|
|
29902
|
-
const { runBootAdvancingSelfHeal } = await import("./advancing-selfheal-
|
|
29701
|
+
const { runBootAdvancingSelfHeal } = await import("./advancing-selfheal-BVwW4qRn.js");
|
|
29903
29702
|
await runBootAdvancingSelfHeal();
|
|
29904
29703
|
runScheduledPatrol("startup");
|
|
29905
29704
|
})().catch((err) => {
|
|
@@ -29969,6 +29768,6 @@ function assessDeaconPatrolFreshness(params) {
|
|
|
29969
29768
|
};
|
|
29970
29769
|
}
|
|
29971
29770
|
//#endregion
|
|
29972
|
-
export { reconcileClosedPrReadyForMerge as $, reconcileAgentLiveness as A,
|
|
29771
|
+
export { reconcileClosedPrReadyForMerge as $, reconcileAgentLiveness as A, getContainerHistory as At, recordDeadEndNeedsYou as B, getLastPatrolResult as C, paneShowsClaudeBootBlockingScreen as Ct, isDeaconRunning as D, classifyMemoryPressure as Dt, handleAgentStoppedForOrphanReviewerSessions as E, WORK_LAUNCHER_GRACE_MS as Et, setAgentStatusChangedNotifier as F, getSystemHealthEvidenceSnapshot as Ft, redeliverUndeliveredKickoffs as G, isRapidPostResumeDeath as H, setAgentStoppedNotifier as I, getSystemHealthSnapshot as It, startBootReconciliation as J, isBootReconciliationCandidate as K, setMergeReadyNotifier as L, isSmeeConfiguredSync as Lt, resetPatrolHeartbeatForStartup as M, getAcceptedSystemHealthSnapshot as Mt, runPatrol as N, getDeployStaleness as Nt, loadConfig as O, getResourceStacks as Ot, saveState as P, getResourceConfig as Pt, ciRetryMap as Q, startDeacon as R, startSmeeProcessSync as Rt, getDeaconStatus as S, deliverOrchestratedCompact as St, handleAgentStoppedEvent as T, checkInspectAgentTimeouts as Tt, nudgeIdleWorkAgentsWithOpenBeads as U, isPreKickoffLaunchDeath as V, nudgeStalledResumeWorkAgents as W, checkFailedMergeRetry as X, autoCloseOut as Y, checkFirstCompletionAgents as Z, cleanupOrphanReviewerSessions as _, stalledReviewConvoyRecoveryState as _t, checkCompletedButUnsignaledTests as a, cleanupOrphanedReviewSessions as at, containerRestartBackoffMs as b, contextProactiveCompactState as bt, checkMergedWorkSessions as c, checkCompletedButUnsignaledReviews as ct, checkPostReviewCommits as d, checkMissingReviewStatuses as dt, reconcileFalseMerged as et, checkReadyForMergeStuck as f, checkOrphanedReviewStatuses as ft, cleanupAbandonedFeedback as g, reviewConvoyLiveness as gt, checkWorkspaceContainerHealth as h, recoverStalledReviewConvoys as ht, checkAwaitingTestWorkSessions as i, reconcileStuckReadyForMerge as it, reconcileTestStatusFromGreenCi as j, getCurrentDockerStats as jt, loadState as k, formatUptime as kt, checkOrphanedCompletions as l, checkStuckReviewing as lt, checkVerificationReviewContradiction as m, handleWorkCompleted as mt, assessDeaconPatrolFreshness as n, reconcileStaleMergeBlockers as nt, checkDeadEndAgents as o, monitorReviewConvoySignals as ot, checkStuckWorkAgents as p, handleReviewCoordinatorDied as pt, listBootReconciliationCandidates as q, checkAndSuspendIdleAgents as r, reconcileStaleMergeStatus as rt, checkMassDeath as s, synthesizeReviewFromReports as st, applyBootReconciliationDecision as t, reconcileMergedButReviewing as tt, checkPendingTestDispatch as u, isSynthesisForActiveReviewRun as ut, cleanupOrphanedPlanningSessions as v, checkApiErrorAgents as vt, handleAgentHeartbeatDeadEvent as w, INSPECT_TIMEOUT_MS as wt, getDeaconLogs as x, stuckOverflowNativeRecoveryState as xt, cleanupStaleAgentState as y, contextOverflowRecoveryState as yt, stopDeacon as z, classifyAgentHealth as zt };
|
|
29973
29772
|
|
|
29974
|
-
//# sourceMappingURL=deacon-
|
|
29773
|
+
//# sourceMappingURL=deacon-CU_cAYSR.js.map
|