@overdeck/core 0.50.3 → 0.50.4
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/dist/agents-DNMRPC8n.js.map +1 -1
- package/dist/{build-info-BJuEVWOh.js → build-info-ioRdOmqT.js} +3 -3
- package/dist/{build-info-BJuEVWOh.js.map → build-info-ioRdOmqT.js.map} +1 -1
- package/dist/build-info-kMMitDOP.js +2 -0
- package/dist/cli/index.js +4 -4
- package/dist/conversation-compaction-GFfO5UZL.js.map +1 -1
- package/dist/dashboard/{advancing-selfheal-Bq8V0QUa.js → advancing-selfheal-Dp5_Gai3.js} +3 -3
- package/dist/dashboard/{advancing-selfheal-Bq8V0QUa.js.map → advancing-selfheal-Dp5_Gai3.js.map} +1 -1
- package/dist/dashboard/{agent-gc-Coz8zQt_.js → agent-gc-JzoSs5Pi.js} +3 -3
- package/dist/dashboard/{agent-gc-Coz8zQt_.js.map → agent-gc-JzoSs5Pi.js.map} +1 -1
- package/dist/dashboard/{agent-idle-CAwB-K6M.js → agent-idle-D-Qy5BN_.js} +2 -2
- package/dist/dashboard/{agent-idle-CAwB-K6M.js.map → agent-idle-D-Qy5BN_.js.map} +1 -1
- package/dist/dashboard/{agent-state-Ci6PhjOE.js → agent-state-B196fj1h.js} +38 -16
- package/dist/dashboard/agent-state-B196fj1h.js.map +1 -0
- package/dist/dashboard/{agent-state-CbUEwUEQ.js → agent-state-IpWnw8lv.js} +1 -1
- package/dist/dashboard/{agent-state-service-D6IVrX3B.js → agent-state-service-CCo5-9DR.js} +3 -3
- package/dist/dashboard/{agent-state-service-D6IVrX3B.js.map → agent-state-service-CCo5-9DR.js.map} +1 -1
- package/dist/dashboard/{agent-state-service-DcN1j6eK.js → agent-state-service-D_F3VZ23.js} +1 -1
- package/dist/dashboard/{agents-BVvL4o_4.js → agents-CkGhnAmu.js} +1 -1
- package/dist/dashboard/{backlog-auto-trigger-BuSBqG2V.js → backlog-auto-trigger-B5Z2zBtC.js} +2 -2
- package/dist/dashboard/{backlog-auto-trigger-BuSBqG2V.js.map → backlog-auto-trigger-B5Z2zBtC.js.map} +1 -1
- package/dist/dashboard/build-info-BTjOB0Xr.js +2 -0
- package/dist/dashboard/{build-info-Cj3Y0K87.js → build-info-D0EJNj6C.js} +3 -3
- package/dist/dashboard/{build-info-Cj3Y0K87.js.map → build-info-D0EJNj6C.js.map} +1 -1
- package/dist/dashboard/cli-CIznFrcE.js +2 -0
- package/dist/dashboard/{cli-DIhQieif.js → cli-DCbVrSsg.js} +2 -2
- package/dist/dashboard/{cli-DIhQieif.js.map → cli-DCbVrSsg.js.map} +1 -1
- package/dist/dashboard/{close-issue-CRlmrE5g.js → close-issue-Bmu9aOIx.js} +2 -2
- package/dist/dashboard/{close-issue-CRlmrE5g.js.map → close-issue-Bmu9aOIx.js.map} +1 -1
- package/dist/dashboard/{closed-issue-reaper-DrHyYgJR.js → closed-issue-reaper-COxfTtLz.js} +5 -5
- package/dist/dashboard/{closed-issue-reaper-DrHyYgJR.js.map → closed-issue-reaper-COxfTtLz.js.map} +1 -1
- package/dist/dashboard/{closed-issue-reaper-DWlw2EtL.js → closed-issue-reaper-DwMwG_Pz.js} +1 -1
- package/dist/dashboard/{compaction-continuation-DhYgsXmF.js → compaction-continuation-Bqc212Zm.js} +2 -2
- package/dist/dashboard/{compaction-continuation-DhYgsXmF.js.map → compaction-continuation-Bqc212Zm.js.map} +1 -1
- package/dist/dashboard/{conflict-gate-vczgdVTa.js → conflict-gate-9mPVg7-5.js} +1 -1
- package/dist/dashboard/{conflict-gate-Bt-lLgYf.js → conflict-gate-CGQTcR0I.js} +3 -3
- package/dist/dashboard/{conflict-gate-Bt-lLgYf.js.map → conflict-gate-CGQTcR0I.js.map} +1 -1
- package/dist/dashboard/{conversation-compaction-CsdCbcQB.js → conversation-compaction-C7P6V8Iw.js} +5 -5
- package/dist/dashboard/{conversation-compaction-CsdCbcQB.js.map → conversation-compaction-C7P6V8Iw.js.map} +1 -1
- package/dist/dashboard/{conversation-compaction-D0zgWM1f.js → conversation-compaction-Cck5oi-V.js} +1 -1
- package/dist/dashboard/{conversation-service-6LaymUV-.js → conversation-service-CsOpwI9Y.js} +37 -5
- package/dist/dashboard/{conversation-service-6LaymUV-.js.map → conversation-service-CsOpwI9Y.js.map} +1 -1
- package/dist/dashboard/conversation-service-plOFkoMo.js +3 -0
- package/dist/dashboard/dashboard-db-worker.js +1 -1
- package/dist/dashboard/{deacon-CU47dU7U.js → deacon-B8oMMIgN.js} +62 -62
- package/dist/dashboard/{deacon-CU47dU7U.js.map → deacon-B8oMMIgN.js.map} +1 -1
- package/dist/dashboard/{deacon-DYsOa_ss.js → deacon-b7J57Svt.js} +2 -2
- package/dist/dashboard/{deacon-pending-lifecycle-ijGX8wLb.js → deacon-pending-lifecycle-3NIJ7ew5.js} +2 -2
- package/dist/dashboard/{deacon-pending-lifecycle-ijGX8wLb.js.map → deacon-pending-lifecycle-3NIJ7ew5.js.map} +1 -1
- package/dist/dashboard/deacon.js +5 -5
- package/dist/dashboard/{delivery-DMYxIE0J.js → delivery-lnI-gQKo.js} +1 -1
- package/dist/dashboard/{deploy-patrol-C4eXco1S.js → deploy-patrol-u3v2krg9.js} +2 -2
- package/dist/dashboard/{deploy-patrol-C4eXco1S.js.map → deploy-patrol-u3v2krg9.js.map} +1 -1
- package/dist/dashboard/{feedback-stuck-retirement-Dd5XNrMr.js → feedback-stuck-retirement-CoFNqjCc.js} +2 -2
- package/dist/dashboard/{feedback-stuck-retirement-Dd5XNrMr.js.map → feedback-stuck-retirement-CoFNqjCc.js.map} +1 -1
- package/dist/dashboard/{feedback-target-BzdJ2wIR.js → feedback-target-BBCh3RRq.js} +1 -1
- package/dist/dashboard/{feedback-target-BcsA_GRV.js → feedback-target-CeCq6EhW.js} +5 -5
- package/dist/dashboard/{feedback-target-BcsA_GRV.js.map → feedback-target-CeCq6EhW.js.map} +1 -1
- package/dist/dashboard/{flywheel-Is3w2lcT.js → flywheel-DKldI63J.js} +7 -7
- package/dist/dashboard/{flywheel-Is3w2lcT.js.map → flywheel-DKldI63J.js.map} +1 -1
- package/dist/dashboard/{flywheel-D0guNqkh.js → flywheel-DpRPLErh.js} +7 -7
- package/dist/dashboard/{flywheel-D0guNqkh.js.map → flywheel-DpRPLErh.js.map} +1 -1
- package/dist/dashboard/{flywheel-B34cdfbd.js → flywheel-jeZFYvm-.js} +1 -1
- package/dist/dashboard/{flywheel-merge-order-6HiPR2WG.js → flywheel-merge-order-0OnoosaO.js} +1 -1
- package/dist/dashboard/{flywheel-merge-order-BsNPMu0S.js → flywheel-merge-order-PG5op4j7.js} +2 -2
- package/dist/dashboard/{flywheel-merge-order-BsNPMu0S.js.map → flywheel-merge-order-PG5op4j7.js.map} +1 -1
- package/dist/dashboard/{harness-resolve-CzTFVZ5l.js → harness-resolve-C0HWj3H9.js} +2 -2
- package/dist/dashboard/{harness-resolve-CzTFVZ5l.js.map → harness-resolve-C0HWj3H9.js.map} +1 -1
- package/dist/dashboard/{identity-Dc7rQLln.js → identity-Cot1Hg4G.js} +2 -2
- package/dist/dashboard/{identity-Dc7rQLln.js.map → identity-Cot1Hg4G.js.map} +1 -1
- package/dist/dashboard/{inspect-agent-CP7Bu47O.js → inspect-agent-BDmLWbGx.js} +3 -3
- package/dist/dashboard/{inspect-agent-CP7Bu47O.js.map → inspect-agent-BDmLWbGx.js.map} +1 -1
- package/dist/dashboard/inspect-agent-BcOkA-hC.js +2 -0
- package/dist/dashboard/{issue-lifecycle-BPbczKyy.js → issue-lifecycle-1B_v8Rf5.js} +6 -6
- package/dist/dashboard/{issue-lifecycle-BPbczKyy.js.map → issue-lifecycle-1B_v8Rf5.js.map} +1 -1
- package/dist/dashboard/{issue-lifecycle-FaugTi39.js → issue-lifecycle-CIrfbIbj.js} +1 -1
- package/dist/dashboard/{issue-service-singleton-Dsad9NTt.js → issue-service-singleton-BVwPzjwF.js} +1 -1
- package/dist/dashboard/{issue-service-singleton-BrZQJLRI.js → issue-service-singleton-KcRrOiFD.js} +2 -2
- package/dist/dashboard/{issue-service-singleton-BrZQJLRI.js.map → issue-service-singleton-KcRrOiFD.js.map} +1 -1
- package/dist/dashboard/{jsonl-resolver-DQEe0DHM.js → jsonl-resolver-jxbif7MD.js} +3 -3
- package/dist/dashboard/{jsonl-resolver-DQEe0DHM.js.map → jsonl-resolver-jxbif7MD.js.map} +1 -1
- package/dist/dashboard/{kimi-code-Cx5YUJpS.js → kimi-code-BZh3NgcN.js} +1 -1
- package/dist/dashboard/{lifecycle-DZFHmpGI.js → lifecycle-CvcZ4_fA.js} +4 -4
- package/dist/dashboard/{lifecycle-DZFHmpGI.js.map → lifecycle-CvcZ4_fA.js.map} +1 -1
- package/dist/dashboard/{linear-mcp-auth-DylPJABZ.js → linear-mcp-auth-CZoj_-d7.js} +1 -1
- package/dist/dashboard/{linear-mcp-auth-BFlpMvWh.js → linear-mcp-auth-Dx74yCAY.js} +2 -2
- package/dist/dashboard/{linear-mcp-auth-BFlpMvWh.js.map → linear-mcp-auth-Dx74yCAY.js.map} +1 -1
- package/dist/dashboard/{memory-governor-B7uDWRo9.js → memory-governor-Bv3LAqk3.js} +5 -5
- package/dist/dashboard/{memory-governor-B7uDWRo9.js.map → memory-governor-Bv3LAqk3.js.map} +1 -1
- package/dist/dashboard/{merge-agent-ddEcZDZD.js → merge-agent-1zVLl6k_.js} +1 -1
- package/dist/dashboard/{merge-agent-ttRY053V.js → merge-agent-8zrQu48t.js} +8 -8
- package/dist/dashboard/{merge-agent-ttRY053V.js.map → merge-agent-8zrQu48t.js.map} +1 -1
- package/dist/dashboard/merge-ops-CFJaMPLu.js +2 -0
- package/dist/dashboard/{merge-train-f_un38UJ.js → merge-train-BYH_cF7G.js} +2 -2
- package/dist/dashboard/{merge-train-f_un38UJ.js.map → merge-train-BYH_cF7G.js.map} +1 -1
- package/dist/dashboard/{merge-train-deps-GPlHOjK6.js → merge-train-deps-BTfXM5AR.js} +2 -2
- package/dist/dashboard/{merge-train-deps-GPlHOjK6.js.map → merge-train-deps-BTfXM5AR.js.map} +1 -1
- package/dist/dashboard/{messaging-BasbftDu.js → messaging-Bk6vGsMw.js} +1 -1
- package/dist/dashboard/{orphan-proposed-reconciler-DFHdQSEg.js → orphan-proposed-reconciler-B898fk26.js} +6 -6
- package/dist/dashboard/{orphan-proposed-reconciler-DFHdQSEg.js.map → orphan-proposed-reconciler-B898fk26.js.map} +1 -1
- package/dist/dashboard/{orphan-proposed-reconciler-DzAxrM99.js → orphan-proposed-reconciler-Bx_aWS4B.js} +1 -1
- package/dist/dashboard/{parked-residue-DMtbxJml.js → parked-residue-q2kzrYSm.js} +9 -9
- package/dist/dashboard/{parked-residue-DMtbxJml.js.map → parked-residue-q2kzrYSm.js.map} +1 -1
- package/dist/dashboard/{post-merge-lifecycle-worker-jzN2g_EY.js → post-merge-lifecycle-worker-Cl7-uf4g.js} +2 -2
- package/dist/dashboard/{post-merge-lifecycle-worker-jzN2g_EY.js.map → post-merge-lifecycle-worker-Cl7-uf4g.js.map} +1 -1
- package/dist/dashboard/{project-resource-refresh-queue-cqOeJ0fB.js → project-resource-refresh-queue-O_dRfPHn.js} +1 -1
- package/dist/dashboard/{project-resource-refresh-queue-DebwjPPA.js → project-resource-refresh-queue-se3T9IYP.js} +4 -4
- package/dist/dashboard/{project-resource-refresh-queue-DebwjPPA.js.map → project-resource-refresh-queue-se3T9IYP.js.map} +1 -1
- package/dist/dashboard/{reconstruct-cache-Bb2Jg2DZ.js → reconstruct-cache-XpWC9L0F.js} +2 -2
- package/dist/dashboard/{reconstruct-cache-Bb2Jg2DZ.js.map → reconstruct-cache-XpWC9L0F.js.map} +1 -1
- package/dist/dashboard/{release-engine-78iCajIc.js → release-engine-BuzxOamf.js} +2 -2
- package/dist/dashboard/{release-engine-78iCajIc.js.map → release-engine-BuzxOamf.js.map} +1 -1
- package/dist/dashboard/{remote-completion-D5wzZCte.js → remote-completion-BCZgeKPS.js} +3 -3
- package/dist/dashboard/{remote-completion-D5wzZCte.js.map → remote-completion-BCZgeKPS.js.map} +1 -1
- package/dist/dashboard/{resolver-BGZh3lXA.js → resolver-BeNrqNou.js} +5 -5
- package/dist/dashboard/{resolver-BGZh3lXA.js.map → resolver-BeNrqNou.js.map} +1 -1
- package/dist/dashboard/{resource-pressure-patrol-Bg23rPV-.js → resource-pressure-patrol-Ccg_aCgO.js} +3 -3
- package/dist/dashboard/{resource-pressure-patrol-Bg23rPV-.js.map → resource-pressure-patrol-Ccg_aCgO.js.map} +1 -1
- package/dist/dashboard/{resume-BKyB4hA1.js → resume-KGCrn0DV.js} +1 -1
- package/dist/dashboard/{review-agent-ZdP-HmwY.js → review-agent-BmM6YMZW.js} +1 -1
- package/dist/dashboard/{review-agent-DHs-JngN.js → review-agent-DRWVU8fP.js} +13 -13
- package/dist/dashboard/{review-agent-DHs-JngN.js.map → review-agent-DRWVU8fP.js.map} +1 -1
- package/dist/dashboard/{review-convoy-liveness-BTMvU4CA.js → review-convoy-liveness-EvCDv8Q_.js} +3 -3
- package/dist/dashboard/{review-convoy-liveness-BTMvU4CA.js.map → review-convoy-liveness-EvCDv8Q_.js.map} +1 -1
- package/dist/dashboard/{review-run-recovery-BYalQzbh.js → review-run-recovery-Ctm48Snt.js} +1 -1
- package/dist/dashboard/{review-run-recovery-BvVG3oUr.js → review-run-recovery-DNDI58cM.js} +2 -2
- package/dist/dashboard/{review-run-recovery-BvVG3oUr.js.map → review-run-recovery-DNDI58cM.js.map} +1 -1
- package/dist/dashboard/{review-status-DXTFzCmR.js → review-status-FnlvQuPI.js} +1 -1
- package/dist/dashboard/{review-status-emit-C9YW6SQL.js → review-status-emit-CeMS31DX.js} +2 -2
- package/dist/dashboard/{review-status-emit-C9YW6SQL.js.map → review-status-emit-CeMS31DX.js.map} +1 -1
- package/dist/dashboard/{review-status-BegAr86G.js → review-status-yY5qt7Rl.js} +5 -5
- package/dist/dashboard/{review-status-BegAr86G.js.map → review-status-yY5qt7Rl.js.map} +1 -1
- package/dist/dashboard/{review-verdict-feedback-qlVBi19-.js → review-verdict-feedback-BNgRj1e3.js} +4 -4
- package/dist/dashboard/{review-verdict-feedback-qlVBi19-.js.map → review-verdict-feedback-BNgRj1e3.js.map} +1 -1
- package/dist/dashboard/{review-verdict-feedback-Dp139Lmv.js → review-verdict-feedback-D39cuSV1.js} +1 -1
- package/dist/dashboard/{review-verdict-writer-CJr_Ob0Y.js → review-verdict-writer-DvFfKAn-.js} +2 -2
- package/dist/dashboard/{review-verdict-writer-CJr_Ob0Y.js.map → review-verdict-writer-DvFfKAn-.js.map} +1 -1
- package/dist/dashboard/{review-verdict-writer-BVco3WoI.js → review-verdict-writer-PcGBkvJ4.js} +1 -1
- package/dist/dashboard/{sequence-io-iljWlslY.js → sequence-io-DZyschsf.js} +2 -2
- package/dist/dashboard/{sequence-io-iljWlslY.js.map → sequence-io-DZyschsf.js.map} +1 -1
- package/dist/dashboard/{sequencer-agent-BGGVKxtw.js → sequencer-agent-BXDw5cNx.js} +5 -5
- package/dist/dashboard/{sequencer-agent-BGGVKxtw.js.map → sequencer-agent-BXDw5cNx.js.map} +1 -1
- package/dist/dashboard/server.js +79 -72
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/{service-kzhN0DLg.js → service-DP50Omvn.js} +33 -33
- package/dist/dashboard/{service-kzhN0DLg.js.map → service-DP50Omvn.js.map} +1 -1
- package/dist/dashboard/{smart-compaction-owKHJDbL.js → smart-compaction-944GL8PN.js} +1 -1
- package/dist/dashboard/{smart-compaction-C96F2aFQ.js → smart-compaction-BzDfF6yb.js} +2 -2
- package/dist/dashboard/{smart-compaction-C96F2aFQ.js.map → smart-compaction-BzDfF6yb.js.map} +1 -1
- package/dist/dashboard/{spawn-planning-session-CiJdOHTD.js → spawn-planning-session-BcVnHJjm.js} +1 -1
- package/dist/dashboard/{spawn-planning-session-FmJa6PCS.js → spawn-planning-session-CH8IYli7.js} +3 -3
- package/dist/dashboard/{spawn-planning-session-FmJa6PCS.js.map → spawn-planning-session-CH8IYli7.js.map} +1 -1
- package/dist/dashboard/{specialist-context-_ootmzn2.js → specialist-context-DhDTXVht.js} +3 -3
- package/dist/dashboard/{specialist-context-_ootmzn2.js.map → specialist-context-DhDTXVht.js.map} +1 -1
- package/dist/dashboard/{specialist-logs-BbAX221-.js → specialist-logs-C1bcnZ-G.js} +2 -2
- package/dist/dashboard/{specialist-logs-BbAX221-.js.map → specialist-logs-C1bcnZ-G.js.map} +1 -1
- package/dist/dashboard/{specialists-COZoYaiz.js → specialists-BKmReEWT.js} +53 -53
- package/dist/dashboard/{specialists-COZoYaiz.js.map → specialists-BKmReEWT.js.map} +1 -1
- package/dist/dashboard/{specialists-RPLJnYc1.js → specialists-Bvrvt0br.js} +12 -12
- package/dist/dashboard/{specialists-RPLJnYc1.js.map → specialists-Bvrvt0br.js.map} +1 -1
- package/dist/dashboard/{specialists-DTAOVZpU.js → specialists-CD6GEKXk.js} +1 -1
- package/dist/dashboard/{specialists-D8sYZnPb.js → specialists-eFWpJRBc.js} +1 -1
- package/dist/dashboard/{stall-sweeper-9bRBZhrQ.js → stall-sweeper-D3fZvg7O.js} +3 -3
- package/dist/dashboard/{stall-sweeper-9bRBZhrQ.js.map → stall-sweeper-D3fZvg7O.js.map} +1 -1
- package/dist/dashboard/{state-migrate-J3tFJnbd.js → state-migrate-KZ2goscQ.js} +2 -2
- package/dist/dashboard/{state-migrate-J3tFJnbd.js.map → state-migrate-KZ2goscQ.js.map} +1 -1
- package/dist/dashboard/{stuck-remediation-BvTK_NYN.js → stuck-remediation-Cb2V1roj.js} +1 -1
- package/dist/dashboard/{stuck-remediation-4Rf_xMEb.js → stuck-remediation-CnoV0kcv.js} +5 -5
- package/dist/dashboard/{stuck-remediation-4Rf_xMEb.js.map → stuck-remediation-CnoV0kcv.js.map} +1 -1
- package/dist/dashboard/{summary-fork-PLcckTRE.js → summary-fork-CxuNBM0F.js} +2 -2
- package/dist/dashboard/{summary-fork-D-cylknJ.js → summary-fork-lC2vMXly.js} +4 -4
- package/dist/dashboard/{summary-fork-D-cylknJ.js.map → summary-fork-lC2vMXly.js.map} +1 -1
- package/dist/dashboard/{teardown-workspace-CTL16rnG.js → teardown-workspace-C-9murBw.js} +4 -4
- package/dist/dashboard/{teardown-workspace-CTL16rnG.js.map → teardown-workspace-C-9murBw.js.map} +1 -1
- package/dist/dashboard/{test-agent-queue-CMgYZiR_.js → test-agent-queue-YCBRzaAB.js} +3 -3
- package/dist/dashboard/{test-agent-queue-CMgYZiR_.js.map → test-agent-queue-YCBRzaAB.js.map} +1 -1
- package/dist/dashboard/{uat-failure-feedback-DS6W9X3I.js → uat-failure-feedback-B-1mL8Zp.js} +3 -3
- package/dist/dashboard/{uat-failure-feedback-DS6W9X3I.js.map → uat-failure-feedback-B-1mL8Zp.js.map} +1 -1
- package/dist/dashboard/{uat-promote-verification-CRsIHE_q.js → uat-promote-verification-BEBPcpPg.js} +2 -2
- package/dist/dashboard/{uat-promote-verification-CRsIHE_q.js.map → uat-promote-verification-BEBPcpPg.js.map} +1 -1
- package/dist/dashboard/{uat-train-BoA9r6_I.js → uat-train-BFo3OQUB.js} +1 -1
- package/dist/dashboard/{uat-train-Cd8CJeNe.js → uat-train-COgoJomz.js} +8 -8
- package/dist/dashboard/{uat-train-Cd8CJeNe.js.map → uat-train-COgoJomz.js.map} +1 -1
- package/dist/dashboard/{validate-BdmvTIym.js → validate-069_N1e2.js} +2 -2
- package/dist/dashboard/{validate-BdmvTIym.js.map → validate-069_N1e2.js.map} +1 -1
- package/dist/dashboard/{verification-runner-BO0K3xNA.js → verification-runner-CQnZyC5A.js} +1 -1
- package/dist/dashboard/{verification-runner-fEY1Qj-l.js → verification-runner-fy3wNrWn.js} +4 -4
- package/dist/dashboard/{verification-runner-fEY1Qj-l.js.map → verification-runner-fy3wNrWn.js.map} +1 -1
- package/dist/dashboard/workflows-Bk6Kt0ZQ.js +2 -0
- package/dist/dashboard/{workflows-CxVnygYU.js → workflows-N4QMkDzN.js} +10 -10
- package/dist/dashboard/{workflows-CxVnygYU.js.map → workflows-N4QMkDzN.js.map} +1 -1
- package/dist/dashboard/{workspaces-Cpz0xJWQ.js → workspaces-DmoyfHoU.js} +33 -33
- package/dist/dashboard/{workspaces-Cpz0xJWQ.js.map → workspaces-DmoyfHoU.js.map} +1 -1
- package/dist/{lifecycle-C6k0HWEO.js → lifecycle-DCFcjg7y.js} +1 -1
- package/dist/{lifecycle-D5oRpvvB.js → lifecycle-GkaHQJNK.js} +2 -2
- package/dist/{lifecycle-D5oRpvvB.js.map → lifecycle-GkaHQJNK.js.map} +1 -1
- package/dist/{merge-agent-Drufc7tU.js → merge-agent-CogNFasY.js} +2 -2
- package/dist/{merge-agent-Drufc7tU.js.map → merge-agent-CogNFasY.js.map} +1 -1
- package/dist/{merge-agent-CBOVY_eC.js → merge-agent-eteKQ9Rb.js} +1 -1
- package/package.json +1 -1
- package/dist/build-info-BgrwLUy6.js +0 -2
- package/dist/dashboard/agent-state-Ci6PhjOE.js.map +0 -1
- package/dist/dashboard/build-info-CYlxvZSQ.js +0 -2
- package/dist/dashboard/cli-ZAS502uC.js +0 -2
- package/dist/dashboard/conversation-service-Dlks_hSS.js +0 -3
- package/dist/dashboard/inspect-agent-DTuSg95i.js +0 -2
- package/dist/dashboard/merge-ops-Bgc-EScO.js +0 -2
- package/dist/dashboard/workflows-CgGNyl1z.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-pressure-patrol-Bg23rPV-.js","names":["formatGib","promisify","execFile"],"sources":["../../src/lib/cloister/disk-pressure-patrol.ts","../../src/lib/cloister/memory-pressure-patrol.ts","../../src/lib/cloister/resource-pressure-patrol.ts"],"sourcesContent":["/**\n * PAN-3809: Reclaim unused BuildKit cache before it can exhaust the host disk.\n * The Deacon calls this on its resource-pressure timer. Pruning is intentionally\n * limited to Docker's unused build cache; images, volumes, and workspaces stay\n * behind their existing explicit lifecycle gates.\n */\n\nimport { execFile } from 'node:child_process';\nimport { statfs } from 'node:fs/promises';\nimport { promisify } from 'node:util';\n\nimport { emitActivityEntrySync, type EmitActivityOptions } from '../activity-logger.js';\nimport { getOverdeckHome } from '../paths.js';\n\nconst execFileAsync = promisify(execFile);\nconst GIB = 1024 ** 3;\n\nexport const DISK_PRUNE_TRIGGER_BYTES = 10 * GIB;\nexport const DISK_PRUNE_RETRY_MS = 5 * 60_000;\n\nexport interface DiskSpaceSnapshot {\n availableBytes: number;\n totalBytes: number;\n}\n\nexport interface DiskPressurePatrolDeps {\n readDiskSpace: () => Promise<DiskSpaceSnapshot>;\n pruneBuildCache: () => Promise<string>;\n emit: (entry: EmitActivityOptions) => void;\n now: () => number;\n}\n\nlet pruneInFlight = false;\nlet nextPruneAttemptAt = 0;\n\nfunction formatGib(bytes: number): string {\n return `${(bytes / GIB).toFixed(1)} GiB`;\n}\n\nasync function readDiskSpace(): Promise<DiskSpaceSnapshot> {\n const stats = await statfs(getOverdeckHome());\n return {\n availableBytes: stats.bavail * stats.bsize,\n totalBytes: stats.blocks * stats.bsize,\n };\n}\n\nasync function pruneBuildCache(): Promise<string> {\n const { stdout, stderr } = await execFileAsync(\n 'docker',\n ['builder', 'prune', '--all', '--force'],\n { encoding: 'utf-8', timeout: 10 * 60_000 },\n );\n return [stdout, stderr]\n .flatMap((value) => value.split('\\n'))\n .map((line) => line.trim())\n .filter(Boolean)\n .at(-1) ?? '';\n}\n\n/** Run one disk-pressure check. Calls are safe to overlap; only one prune runs. */\nexport async function patrolDiskPressure(\n deps: Partial<DiskPressurePatrolDeps> = {},\n): Promise<string[]> {\n const d: DiskPressurePatrolDeps = {\n readDiskSpace: deps.readDiskSpace ?? readDiskSpace,\n pruneBuildCache: deps.pruneBuildCache ?? pruneBuildCache,\n emit: deps.emit ?? emitActivityEntrySync,\n now: deps.now ?? Date.now,\n };\n const before = await d.readDiskSpace();\n if (before.availableBytes >= DISK_PRUNE_TRIGGER_BYTES) {\n nextPruneAttemptAt = 0;\n return [];\n }\n\n const now = d.now();\n if (pruneInFlight || now < nextPruneAttemptAt) return [];\n pruneInFlight = true;\n nextPruneAttemptAt = now + DISK_PRUNE_RETRY_MS;\n\n try {\n const output = await d.pruneBuildCache();\n const after = await d.readDiskSpace();\n const reclaimed = Math.max(0, after.availableBytes - before.availableBytes);\n const recovered = after.availableBytes >= DISK_PRUNE_TRIGGER_BYTES;\n const message = recovered\n ? `Disk pressure recovery pruned unused BuildKit cache and reclaimed ${formatGib(reclaimed)}; ${formatGib(after.availableBytes)} is now available.`\n : `Disk pressure recovery pruned unused BuildKit cache, but only ${formatGib(after.availableBytes)} is available; the ${formatGib(DISK_PRUNE_TRIGGER_BYTES)} safety floor is still unmet.`;\n d.emit({\n level: recovered ? 'info' : 'error',\n source: 'cloister',\n link: '/resources',\n message,\n details: [\n `Before: ${formatGib(before.availableBytes)} available of ${formatGib(before.totalBytes)}`,\n `After: ${formatGib(after.availableBytes)} available of ${formatGib(after.totalBytes)}`,\n output ? `Docker: ${output}` : 'Docker did not report reclaimed bytes.',\n ].join('\\n'),\n desktop: !recovered,\n });\n return [`disk-pressure-patrol: pruned BuildKit cache (${formatGib(reclaimed)} reclaimed, ${formatGib(after.availableBytes)} available)`];\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n d.emit({\n level: 'error',\n source: 'cloister',\n link: '/resources',\n message: `Disk pressure recovery could not prune unused BuildKit cache: ${reason}`,\n details: `${formatGib(before.availableBytes)} is available; the safety floor is ${formatGib(DISK_PRUNE_TRIGGER_BYTES)}. Deacon will retry in 5 minutes.`,\n desktop: true,\n });\n return [`disk-pressure-patrol: BuildKit prune failed (${reason})`];\n } finally {\n pruneInFlight = false;\n }\n}\n\nexport function resetDiskPressurePatrolForTests(): void {\n pruneInFlight = false;\n nextPruneAttemptAt = 0;\n}\n","/**\n * PAN-3550: Activity-feed signals for memory pressure. Runs every 15 seconds\n * in the deacon child, independent of the 60s patrol, to warn before the kernel acts.\n *\n * Three levels: ok → watch (warn), holding (soft band, warn), shedding (hard band, error).\n * Transition-only emit: one row per level change, never repeats while the level persists.\n * No frontend changes needed — activity.entry already renders in ActivityPanel.\n */\n\nimport { MemoryPressureBand, MemoryVerdict, assessMemoryPressure, readGovernorPsiCalmConfig, readGovernorReserves, readGovernorWatchReserveBytes } from './memory-governor.js';\nimport { RuntimeCensus, getRuntimeCensus } from '../runtime-census.js';\nimport { emitActivityEntrySync, EmitActivityOptions } from '../activity-logger.js';\nimport { logDeaconEventSync } from '../persistent-logger.js';\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { homedir } from 'os';\nimport { resolve } from 'path';\n\nexport type MemoryFeedLevel = 'ok' | 'watch' | 'holding' | 'shedding';\n\n/**\n * Pure: fold the governor's band and the WATCH reserve into one feed level.\n * The band already encodes SOFT/HARD hysteresis; WATCH only applies while the\n * governor is still admitting.\n */\nexport function memoryFeedLevel(\n band: MemoryPressureBand,\n availableBytes: number,\n watchBytes: number,\n): MemoryFeedLevel {\n if (band === 'hard') return 'shedding';\n if (band === 'soft') return 'holding';\n return availableBytes < watchBytes ? 'watch' : 'ok';\n}\n\n/**\n * Format bytes as human-readable GiB string, e.g., \"7.2 GiB\"\n */\nfunction formatGib(bytes: number): string {\n const gib = bytes / (1024 ** 3);\n return `${gib.toFixed(1)} GiB`;\n}\n\nfunction formatPsi(value: number | null | undefined): string {\n return value == null ? 'unavailable (pressure stall data not readable)' : value.toFixed(2);\n}\n\nfunction formatTrigger(verdict: MemoryVerdict): string {\n const trigger = verdict.trigger;\n if (!trigger) {\n return verdict.band === 'hard'\n ? 'Memory critical: the governor entered shedding before trigger details were available.'\n : 'Overdeck stopped admitting work before trigger details were available.';\n }\n\n const since = new Date(trigger.at).toISOString().slice(11, 16);\n if (trigger.kind === 'soft-dip') {\n return `Overdeck stopped admitting work at ${since} UTC when available memory dipped to ${formatGib(trigger.readingBytes)}, under the ${formatGib(trigger.thresholdBytes)} soft reserve.`;\n }\n if (trigger.kind === 'hard') {\n return `Overdeck entered critical memory shedding at ${since} UTC when available memory fell to ${formatGib(trigger.readingBytes)}, under the ${formatGib(trigger.thresholdBytes)} hard reserve.`;\n }\n if (trigger.kind === 'swap-psi') {\n return `Overdeck entered critical memory shedding at ${since} UTC when swap free fell to ${formatGib(trigger.readingBytes)}, under the ${formatGib(trigger.thresholdBytes)} swap runway threshold, while memory pressure stalls were active.`;\n }\n return `Overdeck stopped admitting work at ${since} UTC when swap free fell to ${formatGib(trigger.readingBytes)}, under the ${formatGib(trigger.thresholdBytes)} swap runway threshold, and memory pressure stall data was unavailable.`;\n}\n\nfunction formatCalmWindow(windowMs: number): string {\n const minutes = windowMs / 60_000;\n return Number.isInteger(minutes) ? `${minutes} minutes` : `${windowMs} ms`;\n}\n\nfunction formatSheddingExit(verdict: MemoryVerdict, hardBytes: number, recoveryBytes: number): string {\n if (verdict.trigger?.kind === 'swap-psi') {\n return `Shedding ends when live memory stalls clear or swap runway recovers. Admissions resume at the ${formatGib(recoveryBytes)} recovery reserve or through the PSI-calm condition.`;\n }\n return `Shedding ends when available memory reaches the ${formatGib(hardBytes)} hard reserve. Admissions resume at the ${formatGib(recoveryBytes)} recovery reserve or through the PSI-calm condition.`;\n}\n\n/**\n * Format a multi-line memory details string for activity entry.\n */\nfunction buildMemoryDetails(\n verdict: MemoryVerdict,\n watchBytes: number,\n softBytes: number,\n hardBytes: number,\n recoveryBytes: number,\n): string {\n const swap = verdict.swapFreeBytes == null || verdict.swapTotalBytes == null\n ? 'Swap: unavailable'\n : `Swap: ${formatGib(verdict.swapFreeBytes)} free of ${formatGib(verdict.swapTotalBytes)}`;\n return [\n `MemAvailable: ${formatGib(verdict.availableBytes)}`,\n `Watch reserve: ${formatGib(watchBytes)} | Soft: ${formatGib(softBytes)} | Hard: ${formatGib(hardBytes)} | Recovery: ${formatGib(recoveryBytes)}`,\n swap,\n `PSI some avg10: ${formatPsi(verdict.psiSomeAvg10)} | full avg10: ${formatPsi(verdict.psiFullAvg10)}`,\n ].join('\\n');\n}\n\nexport interface MemoryPressurePatrolDeps {\n assess: () => Promise<MemoryVerdict>;\n readWatchReserveBytes: () => number;\n readSoftReserveBytes: () => number;\n readHardReserveBytes: () => number;\n readRecoveryReserveBytes: () => number;\n readPsiCalmConfig: () => { readmitAvg10: number; windowMs: number };\n census: () => Promise<RuntimeCensus>;\n readNewKernelJournal: () => Promise<string>;\n emit: (entry: EmitActivityOptions) => void;\n}\n\n// Module-level state for transition-only emission\nlet lastLevel: MemoryFeedLevel | null = null;\n\n// Module-level state for OOM canary: disabled if journal reading fails\nlet oomCanaryDisabled = false;\n\n/**\n * WI-4: Read new kernel journal entries via journalctl with cursor-file persistence.\n * On first call (cursor file absent), uses -n 0 to initialize and returns empty string.\n * On ANY error, disables the canary permanently and returns empty string.\n */\nasync function readNewKernelJournal(): Promise<string> {\n if (oomCanaryDisabled) return '';\n\n try {\n const overdeckHome = process.env.OVERDECK_HOME || resolve(homedir(), '.overdeck');\n const cursorFile = resolve(overdeckHome, 'oom-canary.cursor');\n\n // Check if cursor file exists to determine if we should use -n 0\n const fs = await import('fs/promises');\n let cursorExists = false;\n try {\n await fs.stat(cursorFile);\n cursorExists = true;\n } catch {\n // Cursor doesn't exist yet\n }\n\n const execFileAsync = promisify(execFile);\n const args = ['-k', '--cursor-file', cursorFile, '--no-pager', '-o', 'cat'];\n\n // On first run (no cursor), use -n 0 to initialize without replaying\n if (!cursorExists) {\n args.push('-n', '0');\n }\n\n const result = await execFileAsync('journalctl', args, { timeout: 10000 });\n return result.stdout;\n } catch (err) {\n console.warn('[memory-pressure-patrol] Journal reader failed, disabling OOM canary:', err);\n oomCanaryDisabled = true;\n return '';\n }\n}\n\n/**\n * Patrol memory pressure once and emit a transition-only activity entry if the level changed.\n * Returns a human-readable list of actions taken (for deacon log).\n */\nexport async function patrolMemoryPressure(deps: Partial<MemoryPressurePatrolDeps> = {}): Promise<string[]> {\n // Fill in defaults\n const d: MemoryPressurePatrolDeps = {\n assess: deps.assess || (() => assessMemoryPressure()),\n readWatchReserveBytes: deps.readWatchReserveBytes || (() => readGovernorWatchReserveBytes()),\n readSoftReserveBytes: deps.readSoftReserveBytes || (() => readGovernorReserves().softBytes),\n readHardReserveBytes: deps.readHardReserveBytes || (() => readGovernorReserves().hardBytes),\n readRecoveryReserveBytes: deps.readRecoveryReserveBytes || (() => readGovernorReserves().recoveryBytes),\n readPsiCalmConfig: deps.readPsiCalmConfig || (() => readGovernorPsiCalmConfig()),\n census: deps.census || (() => getRuntimeCensus()),\n readNewKernelJournal: deps.readNewKernelJournal || readNewKernelJournal,\n emit: deps.emit || emitActivityEntrySync,\n };\n\n const verdict = await d.assess();\n const watchBytes = d.readWatchReserveBytes();\n const softBytes = d.readSoftReserveBytes();\n const hardBytes = d.readHardReserveBytes();\n const recoveryBytes = d.readRecoveryReserveBytes();\n const psiCalmConfig = d.readPsiCalmConfig();\n const actions: string[] = [];\n\n // WI-4: Check for new OOM kills in the journal (runs even if level unchanged)\n const journalText = await d.readNewKernelJournal();\n const oomKills = parseOomKills(journalText);\n\n // Emit OOM kills with backpressure: aggregate burst into one event per level\n // to avoid unbounded durable writes when the machine is memory-constrained\n if (oomKills.length > 0) {\n const overdeckKills = oomKills.filter((k) => k.inOverdeckTree);\n const hostKills = oomKills.filter((k) => !k.inOverdeckTree);\n\n // Emit Overdeck-tree kills as error\n if (overdeckKills.length > 0) {\n const plural = overdeckKills.length === 1 ? '' : 's';\n const message =\n overdeckKills.length === 1\n ? `Kernel OOM: Killed process ${overdeckKills[0].pid} (${overdeckKills[0].comm}), ${formatGib(overdeckKills[0].rssBytes)} RSS in Overdeck tmux-server`\n : `Kernel OOM: Killed ${overdeckKills.length} process${plural} in Overdeck tmux-server (${overdeckKills.map((k) => `${k.pid}/${k.comm}`).join(', ')})`;\n\n const details = overdeckKills\n .map((k) => ` PID ${k.pid} (${k.comm}): ${formatGib(k.rssBytes)} RSS | Cgroup: ${k.cgroup || '(unknown)'}`)\n .join('\\n');\n\n d.emit({\n level: 'error',\n source: 'cloister',\n link: '/resources',\n message,\n details: `OOM kills in Overdeck tree:\\n${details}\\n\\n${buildMemoryDetails(verdict, watchBytes, softBytes, hardBytes, recoveryBytes)}`,\n desktop: true,\n });\n\n const action = `memory-pressure-patrol: oom-kills (${overdeckKills.length} in Overdeck tree)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n }\n\n // Emit host kills as warn (less urgent)\n if (hostKills.length > 0) {\n const plural = hostKills.length === 1 ? '' : 's';\n const message =\n hostKills.length === 1\n ? `Kernel OOM: Killed process ${hostKills[0].pid} (${hostKills[0].comm}), ${formatGib(hostKills[0].rssBytes)} RSS outside Overdeck`\n : `Kernel OOM: Killed ${hostKills.length} process${plural} outside Overdeck (${hostKills.map((k) => `${k.pid}/${k.comm}`).join(', ')})`;\n\n const details = hostKills\n .map((k) => ` PID ${k.pid} (${k.comm}): ${formatGib(k.rssBytes)} RSS | Cgroup: ${k.cgroup || '(unknown)'}`)\n .join('\\n');\n\n d.emit({\n level: 'warn',\n source: 'cloister',\n link: '/resources',\n message,\n details: `OOM kills outside Overdeck:\\n${details}\\n\\n${buildMemoryDetails(verdict, watchBytes, softBytes, hardBytes, recoveryBytes)}`,\n desktop: false,\n });\n\n const action = `memory-pressure-patrol: oom-kills (${hostKills.length} outside Overdeck)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n }\n }\n\n const level = memoryFeedLevel(verdict.band, verdict.availableBytes, watchBytes);\n\n // Transition-only: if level hasn't changed, emit nothing for level transition\n if (level === lastLevel) {\n return oomKills.length > 0 ? actions : [];\n }\n\n lastLevel = level;\n\n // Fetch the runtime census for top-consumer attribution\n const census = await d.census();\n\n // Build details with the base reserves and top consumers\n let details = buildMemoryDetails(\n verdict,\n watchBytes,\n softBytes,\n hardBytes,\n recoveryBytes,\n );\n\n // WI-3: Append top memory consumers to details\n if (!census.processAvailable) {\n details += '\\n\\nTop memory consumers: unavailable (process census could not be read)';\n } else {\n const topConsumers = topMemoryConsumers(census, 5);\n if (topConsumers.length > 0) {\n const consumerLines = topConsumers.map(\n (c) =>\n ` ${formatGib(c.rssBytes)} | pid ${c.pid} (${c.comm}) in session ${c.sessionName || '(host)'}`,\n );\n details += '\\n\\nTop memory consumers:\\n' + consumerLines.join('\\n');\n }\n }\n\n // Build the activity entry based on level\n if (level === 'watch') {\n const message =\n `Memory is getting tight — ${formatGib(verdict.availableBytes)} available, below the ${formatGib(watchBytes)} watch reserve. ` +\n `Overdeck is still admitting new agents; it will stop admitting if available memory falls below the ${formatGib(softBytes)} soft reserve.`;\n\n d.emit({\n level: 'warn',\n source: 'cloister',\n link: '/resources',\n message,\n details,\n desktop: false,\n });\n\n const action = `memory-pressure-patrol: watch-level (${formatGib(verdict.availableBytes)} available)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n } else if (level === 'holding') {\n const message =\n `${formatTrigger(verdict)} ${formatGib(verdict.availableBytes)} is available now. ` +\n `Admissions resume at the ${formatGib(recoveryBytes)} recovery reserve, or at the ${formatGib(softBytes)} soft reserve once memory pressure stalls (PSI full avg10) stay below ${psiCalmConfig.readmitAvg10} for ${formatCalmWindow(psiCalmConfig.windowMs)}. ` +\n `Nothing has been stopped or killed.`;\n\n d.emit({\n level: 'warn',\n source: 'cloister',\n link: '/resources',\n message,\n details,\n desktop: false,\n });\n\n const action = `memory-pressure-patrol: admission-hold (${formatGib(verdict.availableBytes)} available)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n } else if (level === 'shedding') {\n const message =\n `${formatTrigger(verdict)} ${formatGib(verdict.availableBytes)} is available now. ` +\n `Overdeck admits nothing while shedding is active. ${formatSheddingExit(verdict, hardBytes, recoveryBytes)} ` +\n `Free memory on this host now; automatic shedding is not wired, so Overdeck will not reclaim anything on its own.`;\n\n d.emit({\n level: 'error',\n source: 'cloister',\n link: '/resources',\n message,\n details,\n desktop: true,\n });\n\n const action = `memory-pressure-patrol: shedding-level (${formatGib(verdict.availableBytes)} available)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n } else if (level === 'ok') {\n const message =\n `Memory pressure cleared — ${formatGib(verdict.availableBytes)} available, at or above the ${formatGib(watchBytes)} watch reserve. ` +\n `Overdeck is admitting work again.`;\n\n d.emit({\n level: 'info',\n source: 'cloister',\n link: '/resources',\n message,\n details,\n desktop: false,\n });\n\n const action = `memory-pressure-patrol: recovered (${formatGib(verdict.availableBytes)} available)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n }\n\n return actions;\n}\n\n/**\n * Test-only: reset the module-level state between test cases.\n */\nexport function __resetMemoryPressurePatrolState(): void {\n lastLevel = null;\n oomCanaryDisabled = false;\n}\n\n/**\n * WI-3: Top consumer attribution\n */\nexport interface TopConsumer {\n pid: number;\n rssBytes: number;\n comm: string;\n sessionName: string | null;\n}\n\n/**\n * Pure: the N largest-RSS processes in the census, each attributed to a tmux session.\n */\nexport function topMemoryConsumers(census: RuntimeCensus, limit: number): TopConsumer[] {\n if (!census.processAvailable) return [];\n \n const sessionByPanePid = new Map<number, string>();\n for (const [sessionName, panes] of census.panesBySession) {\n for (const pane of panes) {\n sessionByPanePid.set(pane.panePid, sessionName);\n }\n }\n\n const topProcs = [...census.processesByPid.values()]\n .sort((a, b) => b.rssBytes - a.rssBytes)\n .slice(0, limit);\n\n return topProcs.map((proc) => {\n const visited = new Set<number>();\n let current = proc.pid;\n let sessionName: string | null = null;\n\n while (current > 1 && !visited.has(current)) {\n visited.add(current);\n if (sessionByPanePid.has(current)) {\n sessionName = sessionByPanePid.get(current)!;\n break;\n }\n const parent = census.processesByPid.get(current);\n if (!parent?.ppid) break;\n current = parent.ppid;\n }\n\n return {\n pid: proc.pid,\n rssBytes: proc.rssBytes,\n comm: proc.comm,\n sessionName,\n };\n });\n}\n\n/**\n * WI-4: OOM kill detection\n */\nexport interface OomKillRecord {\n pid: number;\n comm: string;\n rssBytes: number;\n cgroup: string | null;\n inOverdeckTree: boolean;\n}\n\nconst OOM_OVERDECK_TREE_REGEX = /overdeck-tmux-server\\.service|overdeck-/;\n\nexport function parseOomKills(journalText: string): OomKillRecord[] {\n const kills = new Map<number, OomKillRecord>();\n\n const oomkillPattern = /task_memcg=(\\S+?),task=([^,]+),pid=(\\d+)/g;\n let match;\n while ((match = oomkillPattern.exec(journalText)) !== null) {\n const [_, cgroup, comm, pidStr] = match;\n const pid = parseInt(pidStr, 10);\n kills.set(pid, {\n pid,\n comm,\n rssBytes: 0,\n cgroup,\n inOverdeckTree: OOM_OVERDECK_TREE_REGEX.test(cgroup),\n });\n }\n\n const victimPattern = /Out of memory: Killed process (\\d+) \\(([^)]+)\\)(.*?)$/gm;\n while ((match = victimPattern.exec(journalText)) !== null) {\n const [_, pidStr, comm, tail] = match;\n const pid = parseInt(pidStr, 10);\n\n let rssBytes = 0;\n const rssPattern = /(?:anon|file|shmem)-rss:(\\d+)kB/g;\n let rssMatch;\n while ((rssMatch = rssPattern.exec(tail)) !== null) {\n rssBytes += parseInt(rssMatch[1], 10) * 1024;\n }\n\n if (kills.has(pid)) {\n kills.get(pid)!.rssBytes = rssBytes;\n } else {\n kills.set(pid, {\n pid,\n comm,\n rssBytes,\n cgroup: null,\n inOverdeckTree: false,\n });\n }\n }\n\n return Array.from(kills.values());\n}\n","import { patrolDiskPressure } from './disk-pressure-patrol.js';\nimport { patrolMemoryPressure } from './memory-pressure-patrol.js';\n\ninterface ResourcePressurePatrolDeps {\n patrolMemory: () => Promise<string[]>;\n patrolDisk: () => Promise<string[]>;\n}\n\nexport async function patrolResourcePressure(\n deps: Partial<ResourcePressurePatrolDeps> = {},\n): Promise<string[]> {\n const results = await Promise.allSettled([\n (deps.patrolMemory ?? patrolMemoryPressure)(),\n (deps.patrolDisk ?? patrolDiskPressure)(),\n ]);\n return results.flatMap((result, index) => {\n if (result.status === 'fulfilled') return result.value;\n const source = index === 0 ? 'memory-pressure-patrol' : 'disk-pressure-patrol';\n const reason = result.reason instanceof Error ? result.reason.message : String(result.reason);\n return [`${source}: error: ${reason}`];\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resource-pressure-patrol-Ccg_aCgO.js","names":["formatGib","promisify","execFile"],"sources":["../../src/lib/cloister/disk-pressure-patrol.ts","../../src/lib/cloister/memory-pressure-patrol.ts","../../src/lib/cloister/resource-pressure-patrol.ts"],"sourcesContent":["/**\n * PAN-3809: Reclaim unused BuildKit cache before it can exhaust the host disk.\n * The Deacon calls this on its resource-pressure timer. Pruning is intentionally\n * limited to Docker's unused build cache; images, volumes, and workspaces stay\n * behind their existing explicit lifecycle gates.\n */\n\nimport { execFile } from 'node:child_process';\nimport { statfs } from 'node:fs/promises';\nimport { promisify } from 'node:util';\n\nimport { emitActivityEntrySync, type EmitActivityOptions } from '../activity-logger.js';\nimport { getOverdeckHome } from '../paths.js';\n\nconst execFileAsync = promisify(execFile);\nconst GIB = 1024 ** 3;\n\nexport const DISK_PRUNE_TRIGGER_BYTES = 10 * GIB;\nexport const DISK_PRUNE_RETRY_MS = 5 * 60_000;\n\nexport interface DiskSpaceSnapshot {\n availableBytes: number;\n totalBytes: number;\n}\n\nexport interface DiskPressurePatrolDeps {\n readDiskSpace: () => Promise<DiskSpaceSnapshot>;\n pruneBuildCache: () => Promise<string>;\n emit: (entry: EmitActivityOptions) => void;\n now: () => number;\n}\n\nlet pruneInFlight = false;\nlet nextPruneAttemptAt = 0;\n\nfunction formatGib(bytes: number): string {\n return `${(bytes / GIB).toFixed(1)} GiB`;\n}\n\nasync function readDiskSpace(): Promise<DiskSpaceSnapshot> {\n const stats = await statfs(getOverdeckHome());\n return {\n availableBytes: stats.bavail * stats.bsize,\n totalBytes: stats.blocks * stats.bsize,\n };\n}\n\nasync function pruneBuildCache(): Promise<string> {\n const { stdout, stderr } = await execFileAsync(\n 'docker',\n ['builder', 'prune', '--all', '--force'],\n { encoding: 'utf-8', timeout: 10 * 60_000 },\n );\n return [stdout, stderr]\n .flatMap((value) => value.split('\\n'))\n .map((line) => line.trim())\n .filter(Boolean)\n .at(-1) ?? '';\n}\n\n/** Run one disk-pressure check. Calls are safe to overlap; only one prune runs. */\nexport async function patrolDiskPressure(\n deps: Partial<DiskPressurePatrolDeps> = {},\n): Promise<string[]> {\n const d: DiskPressurePatrolDeps = {\n readDiskSpace: deps.readDiskSpace ?? readDiskSpace,\n pruneBuildCache: deps.pruneBuildCache ?? pruneBuildCache,\n emit: deps.emit ?? emitActivityEntrySync,\n now: deps.now ?? Date.now,\n };\n const before = await d.readDiskSpace();\n if (before.availableBytes >= DISK_PRUNE_TRIGGER_BYTES) {\n nextPruneAttemptAt = 0;\n return [];\n }\n\n const now = d.now();\n if (pruneInFlight || now < nextPruneAttemptAt) return [];\n pruneInFlight = true;\n nextPruneAttemptAt = now + DISK_PRUNE_RETRY_MS;\n\n try {\n const output = await d.pruneBuildCache();\n const after = await d.readDiskSpace();\n const reclaimed = Math.max(0, after.availableBytes - before.availableBytes);\n const recovered = after.availableBytes >= DISK_PRUNE_TRIGGER_BYTES;\n const message = recovered\n ? `Disk pressure recovery pruned unused BuildKit cache and reclaimed ${formatGib(reclaimed)}; ${formatGib(after.availableBytes)} is now available.`\n : `Disk pressure recovery pruned unused BuildKit cache, but only ${formatGib(after.availableBytes)} is available; the ${formatGib(DISK_PRUNE_TRIGGER_BYTES)} safety floor is still unmet.`;\n d.emit({\n level: recovered ? 'info' : 'error',\n source: 'cloister',\n link: '/resources',\n message,\n details: [\n `Before: ${formatGib(before.availableBytes)} available of ${formatGib(before.totalBytes)}`,\n `After: ${formatGib(after.availableBytes)} available of ${formatGib(after.totalBytes)}`,\n output ? `Docker: ${output}` : 'Docker did not report reclaimed bytes.',\n ].join('\\n'),\n desktop: !recovered,\n });\n return [`disk-pressure-patrol: pruned BuildKit cache (${formatGib(reclaimed)} reclaimed, ${formatGib(after.availableBytes)} available)`];\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n d.emit({\n level: 'error',\n source: 'cloister',\n link: '/resources',\n message: `Disk pressure recovery could not prune unused BuildKit cache: ${reason}`,\n details: `${formatGib(before.availableBytes)} is available; the safety floor is ${formatGib(DISK_PRUNE_TRIGGER_BYTES)}. Deacon will retry in 5 minutes.`,\n desktop: true,\n });\n return [`disk-pressure-patrol: BuildKit prune failed (${reason})`];\n } finally {\n pruneInFlight = false;\n }\n}\n\nexport function resetDiskPressurePatrolForTests(): void {\n pruneInFlight = false;\n nextPruneAttemptAt = 0;\n}\n","/**\n * PAN-3550: Activity-feed signals for memory pressure. Runs every 15 seconds\n * in the deacon child, independent of the 60s patrol, to warn before the kernel acts.\n *\n * Three levels: ok → watch (warn), holding (soft band, warn), shedding (hard band, error).\n * Transition-only emit: one row per level change, never repeats while the level persists.\n * No frontend changes needed — activity.entry already renders in ActivityPanel.\n */\n\nimport { MemoryPressureBand, MemoryVerdict, assessMemoryPressure, readGovernorPsiCalmConfig, readGovernorReserves, readGovernorWatchReserveBytes } from './memory-governor.js';\nimport { RuntimeCensus, getRuntimeCensus } from '../runtime-census.js';\nimport { emitActivityEntrySync, EmitActivityOptions } from '../activity-logger.js';\nimport { logDeaconEventSync } from '../persistent-logger.js';\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { homedir } from 'os';\nimport { resolve } from 'path';\n\nexport type MemoryFeedLevel = 'ok' | 'watch' | 'holding' | 'shedding';\n\n/**\n * Pure: fold the governor's band and the WATCH reserve into one feed level.\n * The band already encodes SOFT/HARD hysteresis; WATCH only applies while the\n * governor is still admitting.\n */\nexport function memoryFeedLevel(\n band: MemoryPressureBand,\n availableBytes: number,\n watchBytes: number,\n): MemoryFeedLevel {\n if (band === 'hard') return 'shedding';\n if (band === 'soft') return 'holding';\n return availableBytes < watchBytes ? 'watch' : 'ok';\n}\n\n/**\n * Format bytes as human-readable GiB string, e.g., \"7.2 GiB\"\n */\nfunction formatGib(bytes: number): string {\n const gib = bytes / (1024 ** 3);\n return `${gib.toFixed(1)} GiB`;\n}\n\nfunction formatPsi(value: number | null | undefined): string {\n return value == null ? 'unavailable (pressure stall data not readable)' : value.toFixed(2);\n}\n\nfunction formatTrigger(verdict: MemoryVerdict): string {\n const trigger = verdict.trigger;\n if (!trigger) {\n return verdict.band === 'hard'\n ? 'Memory critical: the governor entered shedding before trigger details were available.'\n : 'Overdeck stopped admitting work before trigger details were available.';\n }\n\n const since = new Date(trigger.at).toISOString().slice(11, 16);\n if (trigger.kind === 'soft-dip') {\n return `Overdeck stopped admitting work at ${since} UTC when available memory dipped to ${formatGib(trigger.readingBytes)}, under the ${formatGib(trigger.thresholdBytes)} soft reserve.`;\n }\n if (trigger.kind === 'hard') {\n return `Overdeck entered critical memory shedding at ${since} UTC when available memory fell to ${formatGib(trigger.readingBytes)}, under the ${formatGib(trigger.thresholdBytes)} hard reserve.`;\n }\n if (trigger.kind === 'swap-psi') {\n return `Overdeck entered critical memory shedding at ${since} UTC when swap free fell to ${formatGib(trigger.readingBytes)}, under the ${formatGib(trigger.thresholdBytes)} swap runway threshold, while memory pressure stalls were active.`;\n }\n return `Overdeck stopped admitting work at ${since} UTC when swap free fell to ${formatGib(trigger.readingBytes)}, under the ${formatGib(trigger.thresholdBytes)} swap runway threshold, and memory pressure stall data was unavailable.`;\n}\n\nfunction formatCalmWindow(windowMs: number): string {\n const minutes = windowMs / 60_000;\n return Number.isInteger(minutes) ? `${minutes} minutes` : `${windowMs} ms`;\n}\n\nfunction formatSheddingExit(verdict: MemoryVerdict, hardBytes: number, recoveryBytes: number): string {\n if (verdict.trigger?.kind === 'swap-psi') {\n return `Shedding ends when live memory stalls clear or swap runway recovers. Admissions resume at the ${formatGib(recoveryBytes)} recovery reserve or through the PSI-calm condition.`;\n }\n return `Shedding ends when available memory reaches the ${formatGib(hardBytes)} hard reserve. Admissions resume at the ${formatGib(recoveryBytes)} recovery reserve or through the PSI-calm condition.`;\n}\n\n/**\n * Format a multi-line memory details string for activity entry.\n */\nfunction buildMemoryDetails(\n verdict: MemoryVerdict,\n watchBytes: number,\n softBytes: number,\n hardBytes: number,\n recoveryBytes: number,\n): string {\n const swap = verdict.swapFreeBytes == null || verdict.swapTotalBytes == null\n ? 'Swap: unavailable'\n : `Swap: ${formatGib(verdict.swapFreeBytes)} free of ${formatGib(verdict.swapTotalBytes)}`;\n return [\n `MemAvailable: ${formatGib(verdict.availableBytes)}`,\n `Watch reserve: ${formatGib(watchBytes)} | Soft: ${formatGib(softBytes)} | Hard: ${formatGib(hardBytes)} | Recovery: ${formatGib(recoveryBytes)}`,\n swap,\n `PSI some avg10: ${formatPsi(verdict.psiSomeAvg10)} | full avg10: ${formatPsi(verdict.psiFullAvg10)}`,\n ].join('\\n');\n}\n\nexport interface MemoryPressurePatrolDeps {\n assess: () => Promise<MemoryVerdict>;\n readWatchReserveBytes: () => number;\n readSoftReserveBytes: () => number;\n readHardReserveBytes: () => number;\n readRecoveryReserveBytes: () => number;\n readPsiCalmConfig: () => { readmitAvg10: number; windowMs: number };\n census: () => Promise<RuntimeCensus>;\n readNewKernelJournal: () => Promise<string>;\n emit: (entry: EmitActivityOptions) => void;\n}\n\n// Module-level state for transition-only emission\nlet lastLevel: MemoryFeedLevel | null = null;\n\n// Module-level state for OOM canary: disabled if journal reading fails\nlet oomCanaryDisabled = false;\n\n/**\n * WI-4: Read new kernel journal entries via journalctl with cursor-file persistence.\n * On first call (cursor file absent), uses -n 0 to initialize and returns empty string.\n * On ANY error, disables the canary permanently and returns empty string.\n */\nasync function readNewKernelJournal(): Promise<string> {\n if (oomCanaryDisabled) return '';\n\n try {\n const overdeckHome = process.env.OVERDECK_HOME || resolve(homedir(), '.overdeck');\n const cursorFile = resolve(overdeckHome, 'oom-canary.cursor');\n\n // Check if cursor file exists to determine if we should use -n 0\n const fs = await import('fs/promises');\n let cursorExists = false;\n try {\n await fs.stat(cursorFile);\n cursorExists = true;\n } catch {\n // Cursor doesn't exist yet\n }\n\n const execFileAsync = promisify(execFile);\n const args = ['-k', '--cursor-file', cursorFile, '--no-pager', '-o', 'cat'];\n\n // On first run (no cursor), use -n 0 to initialize without replaying\n if (!cursorExists) {\n args.push('-n', '0');\n }\n\n const result = await execFileAsync('journalctl', args, { timeout: 10000 });\n return result.stdout;\n } catch (err) {\n console.warn('[memory-pressure-patrol] Journal reader failed, disabling OOM canary:', err);\n oomCanaryDisabled = true;\n return '';\n }\n}\n\n/**\n * Patrol memory pressure once and emit a transition-only activity entry if the level changed.\n * Returns a human-readable list of actions taken (for deacon log).\n */\nexport async function patrolMemoryPressure(deps: Partial<MemoryPressurePatrolDeps> = {}): Promise<string[]> {\n // Fill in defaults\n const d: MemoryPressurePatrolDeps = {\n assess: deps.assess || (() => assessMemoryPressure()),\n readWatchReserveBytes: deps.readWatchReserveBytes || (() => readGovernorWatchReserveBytes()),\n readSoftReserveBytes: deps.readSoftReserveBytes || (() => readGovernorReserves().softBytes),\n readHardReserveBytes: deps.readHardReserveBytes || (() => readGovernorReserves().hardBytes),\n readRecoveryReserveBytes: deps.readRecoveryReserveBytes || (() => readGovernorReserves().recoveryBytes),\n readPsiCalmConfig: deps.readPsiCalmConfig || (() => readGovernorPsiCalmConfig()),\n census: deps.census || (() => getRuntimeCensus()),\n readNewKernelJournal: deps.readNewKernelJournal || readNewKernelJournal,\n emit: deps.emit || emitActivityEntrySync,\n };\n\n const verdict = await d.assess();\n const watchBytes = d.readWatchReserveBytes();\n const softBytes = d.readSoftReserveBytes();\n const hardBytes = d.readHardReserveBytes();\n const recoveryBytes = d.readRecoveryReserveBytes();\n const psiCalmConfig = d.readPsiCalmConfig();\n const actions: string[] = [];\n\n // WI-4: Check for new OOM kills in the journal (runs even if level unchanged)\n const journalText = await d.readNewKernelJournal();\n const oomKills = parseOomKills(journalText);\n\n // Emit OOM kills with backpressure: aggregate burst into one event per level\n // to avoid unbounded durable writes when the machine is memory-constrained\n if (oomKills.length > 0) {\n const overdeckKills = oomKills.filter((k) => k.inOverdeckTree);\n const hostKills = oomKills.filter((k) => !k.inOverdeckTree);\n\n // Emit Overdeck-tree kills as error\n if (overdeckKills.length > 0) {\n const plural = overdeckKills.length === 1 ? '' : 's';\n const message =\n overdeckKills.length === 1\n ? `Kernel OOM: Killed process ${overdeckKills[0].pid} (${overdeckKills[0].comm}), ${formatGib(overdeckKills[0].rssBytes)} RSS in Overdeck tmux-server`\n : `Kernel OOM: Killed ${overdeckKills.length} process${plural} in Overdeck tmux-server (${overdeckKills.map((k) => `${k.pid}/${k.comm}`).join(', ')})`;\n\n const details = overdeckKills\n .map((k) => ` PID ${k.pid} (${k.comm}): ${formatGib(k.rssBytes)} RSS | Cgroup: ${k.cgroup || '(unknown)'}`)\n .join('\\n');\n\n d.emit({\n level: 'error',\n source: 'cloister',\n link: '/resources',\n message,\n details: `OOM kills in Overdeck tree:\\n${details}\\n\\n${buildMemoryDetails(verdict, watchBytes, softBytes, hardBytes, recoveryBytes)}`,\n desktop: true,\n });\n\n const action = `memory-pressure-patrol: oom-kills (${overdeckKills.length} in Overdeck tree)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n }\n\n // Emit host kills as warn (less urgent)\n if (hostKills.length > 0) {\n const plural = hostKills.length === 1 ? '' : 's';\n const message =\n hostKills.length === 1\n ? `Kernel OOM: Killed process ${hostKills[0].pid} (${hostKills[0].comm}), ${formatGib(hostKills[0].rssBytes)} RSS outside Overdeck`\n : `Kernel OOM: Killed ${hostKills.length} process${plural} outside Overdeck (${hostKills.map((k) => `${k.pid}/${k.comm}`).join(', ')})`;\n\n const details = hostKills\n .map((k) => ` PID ${k.pid} (${k.comm}): ${formatGib(k.rssBytes)} RSS | Cgroup: ${k.cgroup || '(unknown)'}`)\n .join('\\n');\n\n d.emit({\n level: 'warn',\n source: 'cloister',\n link: '/resources',\n message,\n details: `OOM kills outside Overdeck:\\n${details}\\n\\n${buildMemoryDetails(verdict, watchBytes, softBytes, hardBytes, recoveryBytes)}`,\n desktop: false,\n });\n\n const action = `memory-pressure-patrol: oom-kills (${hostKills.length} outside Overdeck)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n }\n }\n\n const level = memoryFeedLevel(verdict.band, verdict.availableBytes, watchBytes);\n\n // Transition-only: if level hasn't changed, emit nothing for level transition\n if (level === lastLevel) {\n return oomKills.length > 0 ? actions : [];\n }\n\n lastLevel = level;\n\n // Fetch the runtime census for top-consumer attribution\n const census = await d.census();\n\n // Build details with the base reserves and top consumers\n let details = buildMemoryDetails(\n verdict,\n watchBytes,\n softBytes,\n hardBytes,\n recoveryBytes,\n );\n\n // WI-3: Append top memory consumers to details\n if (!census.processAvailable) {\n details += '\\n\\nTop memory consumers: unavailable (process census could not be read)';\n } else {\n const topConsumers = topMemoryConsumers(census, 5);\n if (topConsumers.length > 0) {\n const consumerLines = topConsumers.map(\n (c) =>\n ` ${formatGib(c.rssBytes)} | pid ${c.pid} (${c.comm}) in session ${c.sessionName || '(host)'}`,\n );\n details += '\\n\\nTop memory consumers:\\n' + consumerLines.join('\\n');\n }\n }\n\n // Build the activity entry based on level\n if (level === 'watch') {\n const message =\n `Memory is getting tight — ${formatGib(verdict.availableBytes)} available, below the ${formatGib(watchBytes)} watch reserve. ` +\n `Overdeck is still admitting new agents; it will stop admitting if available memory falls below the ${formatGib(softBytes)} soft reserve.`;\n\n d.emit({\n level: 'warn',\n source: 'cloister',\n link: '/resources',\n message,\n details,\n desktop: false,\n });\n\n const action = `memory-pressure-patrol: watch-level (${formatGib(verdict.availableBytes)} available)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n } else if (level === 'holding') {\n const message =\n `${formatTrigger(verdict)} ${formatGib(verdict.availableBytes)} is available now. ` +\n `Admissions resume at the ${formatGib(recoveryBytes)} recovery reserve, or at the ${formatGib(softBytes)} soft reserve once memory pressure stalls (PSI full avg10) stay below ${psiCalmConfig.readmitAvg10} for ${formatCalmWindow(psiCalmConfig.windowMs)}. ` +\n `Nothing has been stopped or killed.`;\n\n d.emit({\n level: 'warn',\n source: 'cloister',\n link: '/resources',\n message,\n details,\n desktop: false,\n });\n\n const action = `memory-pressure-patrol: admission-hold (${formatGib(verdict.availableBytes)} available)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n } else if (level === 'shedding') {\n const message =\n `${formatTrigger(verdict)} ${formatGib(verdict.availableBytes)} is available now. ` +\n `Overdeck admits nothing while shedding is active. ${formatSheddingExit(verdict, hardBytes, recoveryBytes)} ` +\n `Free memory on this host now; automatic shedding is not wired, so Overdeck will not reclaim anything on its own.`;\n\n d.emit({\n level: 'error',\n source: 'cloister',\n link: '/resources',\n message,\n details,\n desktop: true,\n });\n\n const action = `memory-pressure-patrol: shedding-level (${formatGib(verdict.availableBytes)} available)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n } else if (level === 'ok') {\n const message =\n `Memory pressure cleared — ${formatGib(verdict.availableBytes)} available, at or above the ${formatGib(watchBytes)} watch reserve. ` +\n `Overdeck is admitting work again.`;\n\n d.emit({\n level: 'info',\n source: 'cloister',\n link: '/resources',\n message,\n details,\n desktop: false,\n });\n\n const action = `memory-pressure-patrol: recovered (${formatGib(verdict.availableBytes)} available)`;\n actions.push(action);\n logDeaconEventSync(`[deacon] ${action}`);\n }\n\n return actions;\n}\n\n/**\n * Test-only: reset the module-level state between test cases.\n */\nexport function __resetMemoryPressurePatrolState(): void {\n lastLevel = null;\n oomCanaryDisabled = false;\n}\n\n/**\n * WI-3: Top consumer attribution\n */\nexport interface TopConsumer {\n pid: number;\n rssBytes: number;\n comm: string;\n sessionName: string | null;\n}\n\n/**\n * Pure: the N largest-RSS processes in the census, each attributed to a tmux session.\n */\nexport function topMemoryConsumers(census: RuntimeCensus, limit: number): TopConsumer[] {\n if (!census.processAvailable) return [];\n \n const sessionByPanePid = new Map<number, string>();\n for (const [sessionName, panes] of census.panesBySession) {\n for (const pane of panes) {\n sessionByPanePid.set(pane.panePid, sessionName);\n }\n }\n\n const topProcs = [...census.processesByPid.values()]\n .sort((a, b) => b.rssBytes - a.rssBytes)\n .slice(0, limit);\n\n return topProcs.map((proc) => {\n const visited = new Set<number>();\n let current = proc.pid;\n let sessionName: string | null = null;\n\n while (current > 1 && !visited.has(current)) {\n visited.add(current);\n if (sessionByPanePid.has(current)) {\n sessionName = sessionByPanePid.get(current)!;\n break;\n }\n const parent = census.processesByPid.get(current);\n if (!parent?.ppid) break;\n current = parent.ppid;\n }\n\n return {\n pid: proc.pid,\n rssBytes: proc.rssBytes,\n comm: proc.comm,\n sessionName,\n };\n });\n}\n\n/**\n * WI-4: OOM kill detection\n */\nexport interface OomKillRecord {\n pid: number;\n comm: string;\n rssBytes: number;\n cgroup: string | null;\n inOverdeckTree: boolean;\n}\n\nconst OOM_OVERDECK_TREE_REGEX = /overdeck-tmux-server\\.service|overdeck-/;\n\nexport function parseOomKills(journalText: string): OomKillRecord[] {\n const kills = new Map<number, OomKillRecord>();\n\n const oomkillPattern = /task_memcg=(\\S+?),task=([^,]+),pid=(\\d+)/g;\n let match;\n while ((match = oomkillPattern.exec(journalText)) !== null) {\n const [_, cgroup, comm, pidStr] = match;\n const pid = parseInt(pidStr, 10);\n kills.set(pid, {\n pid,\n comm,\n rssBytes: 0,\n cgroup,\n inOverdeckTree: OOM_OVERDECK_TREE_REGEX.test(cgroup),\n });\n }\n\n const victimPattern = /Out of memory: Killed process (\\d+) \\(([^)]+)\\)(.*?)$/gm;\n while ((match = victimPattern.exec(journalText)) !== null) {\n const [_, pidStr, comm, tail] = match;\n const pid = parseInt(pidStr, 10);\n\n let rssBytes = 0;\n const rssPattern = /(?:anon|file|shmem)-rss:(\\d+)kB/g;\n let rssMatch;\n while ((rssMatch = rssPattern.exec(tail)) !== null) {\n rssBytes += parseInt(rssMatch[1], 10) * 1024;\n }\n\n if (kills.has(pid)) {\n kills.get(pid)!.rssBytes = rssBytes;\n } else {\n kills.set(pid, {\n pid,\n comm,\n rssBytes,\n cgroup: null,\n inOverdeckTree: false,\n });\n }\n }\n\n return Array.from(kills.values());\n}\n","import { patrolDiskPressure } from './disk-pressure-patrol.js';\nimport { patrolMemoryPressure } from './memory-pressure-patrol.js';\n\ninterface ResourcePressurePatrolDeps {\n patrolMemory: () => Promise<string[]>;\n patrolDisk: () => Promise<string[]>;\n}\n\nexport async function patrolResourcePressure(\n deps: Partial<ResourcePressurePatrolDeps> = {},\n): Promise<string[]> {\n const results = await Promise.allSettled([\n (deps.patrolMemory ?? patrolMemoryPressure)(),\n (deps.patrolDisk ?? patrolDiskPressure)(),\n ]);\n return results.flatMap((result, index) => {\n if (result.status === 'fulfilled') return result.value;\n const source = index === 0 ? 'memory-pressure-patrol' : 'disk-pressure-patrol';\n const reason = result.reason instanceof Error ? result.reason.message : String(result.reason);\n return [`${source}: error: ${reason}`];\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { d as isReviewSessionForIssue } from "./specialists-registry-CNbvfOcy.js";
|
|
2
|
-
import { a as killAllReviewSessions, c as resolveReviewMode, d as recoverMissingConvoyReviewers, f as spawnReviewSubRoleForIssue, i as isReviewStaleSync, l as spawnReviewRoleForIssue, n as buildReviewRolePrompt, o as killAllReviewerSessions, p as reviewResumeDecision, r as isExtendedReviewEnabled, s as purgeReviewAgentsForIssue, t as PARENT_REVIEW_TIMEOUT_MS, u as buildConvoyPrompt } from "./review-agent-
|
|
2
|
+
import { a as killAllReviewSessions, c as resolveReviewMode, d as recoverMissingConvoyReviewers, f as spawnReviewSubRoleForIssue, i as isReviewStaleSync, l as spawnReviewRoleForIssue, n as buildReviewRolePrompt, o as killAllReviewerSessions, p as reviewResumeDecision, r as isExtendedReviewEnabled, s as purgeReviewAgentsForIssue, t as PARENT_REVIEW_TIMEOUT_MS, u as buildConvoyPrompt } from "./review-agent-DRWVU8fP.js";
|
|
3
3
|
export { PARENT_REVIEW_TIMEOUT_MS, buildConvoyPrompt, buildReviewRolePrompt, isExtendedReviewEnabled, isReviewSessionForIssue, isReviewStaleSync, killAllReviewSessions, killAllReviewerSessions, purgeReviewAgentsForIssue, recoverMissingConvoyReviewers, resolveReviewMode, reviewResumeDecision, spawnReviewRoleForIssue, spawnReviewSubRoleForIssue };
|
|
@@ -3,19 +3,19 @@ import { f as getDevrootPathSync, p as init_config } from "./config-BUjU7GZQ.js"
|
|
|
3
3
|
import { l as init_activity_logger, o as emitActivityEntrySync } from "./activity-logger-DNYDzAOU.js";
|
|
4
4
|
import { C as init_tmux, E as killSession, T as isPaneDead, j as listSessionNames } from "./tmux-l-yvNWhg.js";
|
|
5
5
|
import { c as init_agents, d as removeAgentRecordSync, l as listAgentIdsByPrefixSync, s as ensureAgentTombstoneSync, u as listAllAgentsSync } from "./agents-CkngXhQr.js";
|
|
6
|
-
import { Gn as removeAgentStateDir, Hn as init_state_dir_removal, It as init_review_lifecycle_guard, Lt as withReviewLifecycleGuard, Wn as markRetainedTranscripts, _ as init_agent_state, g as getAgentStateSync } from "./agent-state-
|
|
6
|
+
import { Gn as removeAgentStateDir, Hn as init_state_dir_removal, It as init_review_lifecycle_guard, Lt as withReviewLifecycleGuard, Wn as markRetainedTranscripts, _ as init_agent_state, g as getAgentStateSync } from "./agent-state-B196fj1h.js";
|
|
7
7
|
import { a as PAN_DIRNAME, m as init_types } from "./types-pLpbsNto.js";
|
|
8
8
|
import { d as readPlan, i as findPlanSync, s as init_io } from "./io-Cm4Sf_6P.js";
|
|
9
9
|
import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos } from "./project-repos-J6jc42uD.js";
|
|
10
10
|
import { a as init_lifecycle_io, i as findXBriefByIssueSync } from "./lifecycle-io-CW__VX8s.js";
|
|
11
|
-
import { E as init_review_verdict_guards, T as clearSupersededReviewInfrastructureFailure, d as getReviewStatusSync, p as init_review_status, w as setReviewStatusSync } from "./review-status-
|
|
12
|
-
import { i as convergeRowFromVerdictOfRecord, r as REVIEW_SUB_ROLES, t as evaluateReviewConvoyLiveness } from "./review-convoy-liveness-
|
|
11
|
+
import { E as init_review_verdict_guards, T as clearSupersededReviewInfrastructureFailure, d as getReviewStatusSync, p as init_review_status, w as setReviewStatusSync } from "./review-status-yY5qt7Rl.js";
|
|
12
|
+
import { i as convergeRowFromVerdictOfRecord, r as REVIEW_SUB_ROLES, t as evaluateReviewConvoyLiveness } from "./review-convoy-liveness-EvCDv8Q_.js";
|
|
13
13
|
import { d as isReviewSessionForIssue, l as init_specialists_registry } from "./specialists-registry-CNbvfOcy.js";
|
|
14
14
|
import { n as shouldSkipDispatchAsMerged } from "./merge-verification-BPBW3Hu3.js";
|
|
15
|
-
import "./review-verdict-feedback-
|
|
15
|
+
import "./review-verdict-feedback-BNgRj1e3.js";
|
|
16
16
|
import { n as createPromiseCoalescer } from "./in-flight-guard-HoToxzGt.js";
|
|
17
17
|
import { r as lookupPullRequestNumberForBranch } from "./github-pr-lookup-DQEtdiyR.js";
|
|
18
|
-
import { o as resolveConflictGate, r as getCachedConflictGateMergeability, t as buildRealConflictGateDeps } from "./conflict-gate-
|
|
18
|
+
import { o as resolveConflictGate, r as getCachedConflictGateMergeability, t as buildRealConflictGateDeps } from "./conflict-gate-CGQTcR0I.js";
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
import { Effect } from "effect";
|
|
21
21
|
import { existsSync } from "fs";
|
|
@@ -922,7 +922,7 @@ async function buildConvoyPromptPromise(opts) {
|
|
|
922
922
|
}
|
|
923
923
|
async function spawnReviewSubRoleForIssuePromise(opts) {
|
|
924
924
|
try {
|
|
925
|
-
const { saveAgentState, spawnRun, getAgentStateSync, getLatestSessionIdSync, resumeAgent, stopAgent } = await import("./agents-
|
|
925
|
+
const { saveAgentState, spawnRun, getAgentStateSync, getLatestSessionIdSync, resumeAgent, stopAgent } = await import("./agents-CkGhnAmu.js");
|
|
926
926
|
const cfg = loadConfigSync().config;
|
|
927
927
|
const outputPath = opts.outputPath ?? reviewerAgentOutputPath(opts.workspace, opts.runId, opts.subRole);
|
|
928
928
|
const synthesisAgentId = opts.synthesisAgentId ?? `agent-${opts.issueId.toLowerCase()}-review`;
|
|
@@ -1058,7 +1058,7 @@ async function launchConvoyReviewersPromise(params) {
|
|
|
1058
1058
|
allowHost: params.allowHost ?? false
|
|
1059
1059
|
}));
|
|
1060
1060
|
if (!result.success) try {
|
|
1061
|
-
const { messageAgent } = await import("./agents-
|
|
1061
|
+
const { messageAgent } = await import("./agents-CkGhnAmu.js");
|
|
1062
1062
|
await messageAgent(params.synthesisAgentId, `REVIEWER_FAILED ${subRole} ${result.error ?? result.message}`);
|
|
1063
1063
|
} catch (signalErr) {
|
|
1064
1064
|
console.warn(`[review-agent] Failed to signal ${subRole} spawn failure to ${params.synthesisAgentId}:`, signalErr);
|
|
@@ -1088,7 +1088,7 @@ const spawnReviewSubRoleForIssue = (opts) => Effect.promise(() => spawnReviewSub
|
|
|
1088
1088
|
async function recoverMissingConvoyReviewers(issueId, opts = {}) {
|
|
1089
1089
|
const normalized = issueId.toUpperCase();
|
|
1090
1090
|
const parentId = `agent-${normalized.toLowerCase()}-review`;
|
|
1091
|
-
const { saveAgentState, getAgentStateSync } = await import("./agents-
|
|
1091
|
+
const { saveAgentState, getAgentStateSync } = await import("./agents-CkGhnAmu.js");
|
|
1092
1092
|
const parentState = getAgentStateSync(parentId);
|
|
1093
1093
|
if (!parentState) return {
|
|
1094
1094
|
success: false,
|
|
@@ -1096,7 +1096,7 @@ async function recoverMissingConvoyReviewers(issueId, opts = {}) {
|
|
|
1096
1096
|
};
|
|
1097
1097
|
let parent;
|
|
1098
1098
|
try {
|
|
1099
|
-
const { resolveReviewParentRunState } = await import("./review-run-recovery-
|
|
1099
|
+
const { resolveReviewParentRunState } = await import("./review-run-recovery-Ctm48Snt.js");
|
|
1100
1100
|
parent = await resolveReviewParentRunState(parentState, { persistCurrent: true });
|
|
1101
1101
|
} catch (error) {
|
|
1102
1102
|
return {
|
|
@@ -1128,7 +1128,7 @@ async function recoverMissingConvoyReviewers(issueId, opts = {}) {
|
|
|
1128
1128
|
if (stateClaimsLive) {
|
|
1129
1129
|
if (!livenessProbeOk) continue;
|
|
1130
1130
|
try {
|
|
1131
|
-
const { markAgentStoppedState } = await import("./agent-state-
|
|
1131
|
+
const { markAgentStoppedState } = await import("./agent-state-IpWnw8lv.js");
|
|
1132
1132
|
await Effect.runPromise(saveAgentState(markAgentStoppedState(reviewer, "system")));
|
|
1133
1133
|
} catch {}
|
|
1134
1134
|
}
|
|
@@ -1558,7 +1558,7 @@ async function spawnReviewRoleForIssuePromise(opts) {
|
|
|
1558
1558
|
});
|
|
1559
1559
|
} catch {}
|
|
1560
1560
|
try {
|
|
1561
|
-
const { spawnRun, saveAgentState, getAgentState, getAgentStateSync, getLatestSessionIdSync, resumeAgent, wipeAgentStateDirs } = await import("./agents-
|
|
1561
|
+
const { spawnRun, saveAgentState, getAgentState, getAgentStateSync, getLatestSessionIdSync, resumeAgent, wipeAgentStateDirs } = await import("./agents-CkGhnAmu.js");
|
|
1562
1562
|
const workAgentState = await Effect.runPromise(getAgentState(`agent-${opts.issueId.toLowerCase()}`));
|
|
1563
1563
|
const allowHost = opts.allowHost === true || workAgentState?.hostOverride === true;
|
|
1564
1564
|
const head8 = await deriveReviewRunHead8(opts.issueId, opts.workspace);
|
|
@@ -1702,7 +1702,7 @@ async function spawnReviewRoleForIssuePromise(opts) {
|
|
|
1702
1702
|
if (orphan !== null && orphan !== void 0 && Number.isFinite(orphanStartedMs) && orphanStartedMs >= dispatchStartedAtMs - 5e3) {
|
|
1703
1703
|
if ((await Effect.runPromise(listSessionNames()).catch(() => [])).includes(reviewSessionName)) await Effect.runPromise(killSession(reviewSessionName)).catch(() => {});
|
|
1704
1704
|
orphan.status = "error";
|
|
1705
|
-
const { saveAgentState } = await import("./agents-
|
|
1705
|
+
const { saveAgentState } = await import("./agents-CkGhnAmu.js");
|
|
1706
1706
|
await Effect.runPromise(saveAgentState(orphan)).catch(() => {});
|
|
1707
1707
|
}
|
|
1708
1708
|
} catch {}
|
|
@@ -1865,4 +1865,4 @@ async function purgeReviewAgentsForIssue(projectKey, issueId) {
|
|
|
1865
1865
|
//#endregion
|
|
1866
1866
|
export { killAllReviewSessions as a, resolveReviewMode as c, recoverMissingConvoyReviewers as d, spawnReviewSubRoleForIssue as f, getDiffStat as g, getDiffBase as h, isReviewStaleSync as i, spawnReviewRoleForIssue as l, getChangedFiles as m, buildReviewRolePrompt as n, killAllReviewerSessions as o, reviewResumeDecision as p, isExtendedReviewEnabled as r, purgeReviewAgentsForIssue as s, PARENT_REVIEW_TIMEOUT_MS as t, buildConvoyPrompt as u };
|
|
1867
1867
|
|
|
1868
|
-
//# sourceMappingURL=review-agent-
|
|
1868
|
+
//# sourceMappingURL=review-agent-DRWVU8fP.js.map
|