@overdeck/core 0.45.10 → 0.45.11
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/{agent-state-KVbJEG5f.js → agent-state-RLhS7ckO.js} +1 -1
- package/dist/{agents-pp8FO7Uj.js → agents-By3u_fQ8.js} +1 -1
- package/dist/{agents-CQHK0CSA.js → agents-CgVr77Qq.js} +12 -12
- package/dist/{agents-CQHK0CSA.js.map → agents-CgVr77Qq.js.map} +1 -1
- package/dist/{backlog-auto-trigger-CyuoS0nl.js → backlog-auto-trigger-B_-1tk4e.js} +5 -5
- package/dist/{backlog-auto-trigger-CyuoS0nl.js.map → backlog-auto-trigger-B_-1tk4e.js.map} +1 -1
- package/dist/cli/index.js +45 -45
- package/dist/{cli-Cewlu3yU.js → cli-DGeSW85B.js} +2 -2
- package/dist/{cli-Cewlu3yU.js.map → cli-DGeSW85B.js.map} +1 -1
- package/dist/cli-MTB9IOoR.js +3 -0
- package/dist/{close-issue-BJGX9_z7.js → close-issue-Djajb6Sv.js} +2 -2
- package/dist/{close-issue-BJGX9_z7.js.map → close-issue-Djajb6Sv.js.map} +1 -1
- package/dist/{concurrency-Ca-fC7tA.js → concurrency-4rzjHAQA.js} +1 -1
- package/dist/{conversation-compaction-B_6s9EvM.js → conversation-compaction-BQvZh09I.js} +4 -4
- package/dist/{conversation-compaction-B_6s9EvM.js.map → conversation-compaction-BQvZh09I.js.map} +1 -1
- package/dist/dashboard/{advancing-selfheal-CMlGznKv.js → advancing-selfheal-BezNfM3P.js} +3 -3
- package/dist/dashboard/{advancing-selfheal-CMlGznKv.js.map → advancing-selfheal-BezNfM3P.js.map} +1 -1
- package/dist/dashboard/{agent-state-xk_G8t90.js → agent-state-BUANcaA7.js} +1 -1
- package/dist/dashboard/{agent-state-service-C1iUF9Ft.js → agent-state-service-DmFpIMbP.js} +1 -1
- package/dist/dashboard/{agent-state-service-5ge9xxhx.js → agent-state-service-tXUdp6UF.js} +2 -2
- package/dist/dashboard/{agent-state-service-5ge9xxhx.js.map → agent-state-service-tXUdp6UF.js.map} +1 -1
- package/dist/dashboard/{agents-BIggLvi_.js → agents-C-vqmKDi.js} +1 -1
- package/dist/dashboard/{agents-DHvsjsuP.js → agents-C7V4odQ6.js} +11 -11
- package/dist/dashboard/{agents-DHvsjsuP.js.map → agents-C7V4odQ6.js.map} +1 -1
- package/dist/dashboard/{backlog-auto-trigger-COm_R96V.js → backlog-auto-trigger-Cb8PR-5w.js} +2 -2
- package/dist/dashboard/{backlog-auto-trigger-COm_R96V.js.map → backlog-auto-trigger-Cb8PR-5w.js.map} +1 -1
- package/dist/dashboard/{cli-CvK9xuSS.js → cli-BgzbB6h3.js} +2 -2
- package/dist/dashboard/{cli-CvK9xuSS.js.map → cli-BgzbB6h3.js.map} +1 -1
- package/dist/dashboard/cli-DCqy_wFa.js +3 -0
- package/dist/dashboard/{close-issue-BnpErnD1.js → close-issue-BWf3pxn4.js} +2 -2
- package/dist/dashboard/{close-issue-BnpErnD1.js.map → close-issue-BWf3pxn4.js.map} +1 -1
- package/dist/dashboard/{closed-issue-reaper-DRqK5k39.js → closed-issue-reaper-D7XPq5pY.js} +4 -4
- package/dist/dashboard/{closed-issue-reaper-DRqK5k39.js.map → closed-issue-reaper-D7XPq5pY.js.map} +1 -1
- package/dist/dashboard/{closed-issue-reaper-BLCQwTpF.js → closed-issue-reaper-VSTSTROK.js} +1 -1
- package/dist/dashboard/{conflict-gate-JdFuhKuF.js → conflict-gate-DwOslTij.js} +1 -1
- package/dist/dashboard/{conflict-gate-BhKvrPxn.js → conflict-gate-FFEvTDVA.js} +3 -3
- package/dist/dashboard/{conflict-gate-BhKvrPxn.js.map → conflict-gate-FFEvTDVA.js.map} +1 -1
- package/dist/dashboard/{conversation-compaction-C5o_eKEm.js → conversation-compaction-CCqN4hWk.js} +4 -4
- package/dist/dashboard/{conversation-compaction-C5o_eKEm.js.map → conversation-compaction-CCqN4hWk.js.map} +1 -1
- package/dist/dashboard/{conversation-compaction-Ba5aZdrb.js → conversation-compaction-CL5Ti4j4.js} +1 -1
- package/dist/dashboard/{deacon-j3qSZ7--.js → deacon-CGHl90eC.js} +107 -50
- package/dist/dashboard/{deacon-j3qSZ7--.js.map → deacon-CGHl90eC.js.map} +1 -1
- package/dist/dashboard/{deacon-Cv2RMfHs.js → deacon-DMPh40Im.js} +2 -2
- package/dist/dashboard/deacon-swarm-CVTiNL0N.js +2 -0
- package/dist/dashboard/{deacon-swarm-DadWNi5J.js → deacon-swarm-aMMJTq6t.js} +4 -4
- package/dist/dashboard/{deacon-swarm-DadWNi5J.js.map → deacon-swarm-aMMJTq6t.js.map} +1 -1
- package/dist/dashboard/deacon.js +4 -4
- package/dist/dashboard/{feedback-target-oE4-Esxl.js → feedback-target-dJjFfITP.js} +4 -4
- package/dist/dashboard/{feedback-target-oE4-Esxl.js.map → feedback-target-dJjFfITP.js.map} +1 -1
- package/dist/dashboard/{feedback-target-C4DaDSZ8.js → feedback-target-nQSM6ygL.js} +1 -1
- package/dist/dashboard/{flywheel-ClMjGW_u.js → flywheel-BLoVNtJV.js} +6 -6
- package/dist/dashboard/{flywheel-ClMjGW_u.js.map → flywheel-BLoVNtJV.js.map} +1 -1
- package/dist/dashboard/{flywheel-DefHRzY4.js → flywheel-Cqf8vu7N.js} +6 -6
- package/dist/dashboard/{flywheel-DefHRzY4.js.map → flywheel-Cqf8vu7N.js.map} +1 -1
- package/dist/dashboard/{flywheel-BqDdGvrQ.js → flywheel-PJsbrXNY.js} +1 -1
- package/dist/dashboard/{flywheel-merge-order-CuDcqTRJ.js → flywheel-merge-order-B7BH8mZ3.js} +2 -2
- package/dist/dashboard/{flywheel-merge-order-CuDcqTRJ.js.map → flywheel-merge-order-B7BH8mZ3.js.map} +1 -1
- package/dist/dashboard/{flywheel-merge-order-B6YDSElh.js → flywheel-merge-order-CCwF60b-.js} +1 -1
- package/dist/dashboard/{harness-resolve-DKeSVsJL.js → harness-resolve-B3f9G1Kp.js} +2 -2
- package/dist/dashboard/{harness-resolve-DKeSVsJL.js.map → harness-resolve-B3f9G1Kp.js.map} +1 -1
- package/dist/dashboard/{inspect-agent-BKKc0XnB.js → inspect-agent-CKF5-SJr.js} +3 -3
- package/dist/dashboard/{inspect-agent-BKKc0XnB.js.map → inspect-agent-CKF5-SJr.js.map} +1 -1
- package/dist/dashboard/inspect-agent-CqpEWGWy.js +2 -0
- package/dist/dashboard/{issue-lifecycle-DnhQgddB.js → issue-lifecycle-5LbOcATP.js} +7 -7
- package/dist/dashboard/{issue-lifecycle-DnhQgddB.js.map → issue-lifecycle-5LbOcATP.js.map} +1 -1
- package/dist/dashboard/{issue-lifecycle-nY4esZn8.js → issue-lifecycle-CjYqQ669.js} +1 -1
- package/dist/dashboard/{issue-service-singleton-Bnqv1uaa.js → issue-service-singleton-B8iu_TKV.js} +1 -1
- package/dist/dashboard/{issue-service-singleton-_AquSBTl.js → issue-service-singleton-CDGt__oQ.js} +2 -2
- package/dist/dashboard/{issue-service-singleton-_AquSBTl.js.map → issue-service-singleton-CDGt__oQ.js.map} +1 -1
- package/dist/dashboard/{lifecycle-CGKm7doE.js → lifecycle-CEg4sHZH.js} +4 -4
- package/dist/dashboard/{lifecycle-CGKm7doE.js.map → lifecycle-CEg4sHZH.js.map} +1 -1
- package/dist/dashboard/{merge-agent-Dh8Y9PDO.js → merge-agent-7nBiCytp.js} +1 -1
- package/dist/dashboard/{merge-agent-BcgAYStl.js → merge-agent-C81xPIGd.js} +6 -6
- package/dist/dashboard/{merge-agent-BcgAYStl.js.map → merge-agent-C81xPIGd.js.map} +1 -1
- package/dist/dashboard/merge-ops-DE_6CnmZ.js +2 -0
- package/dist/dashboard/{merge-train-DmxlYbEo.js → merge-train-D3qzRccL.js} +2 -2
- package/dist/dashboard/{merge-train-DmxlYbEo.js.map → merge-train-D3qzRccL.js.map} +1 -1
- package/dist/dashboard/{merge-train-deps-DBHsOWt9.js → merge-train-deps-Be5ElC_P.js} +2 -2
- package/dist/dashboard/{merge-train-deps-DBHsOWt9.js.map → merge-train-deps-Be5ElC_P.js.map} +1 -1
- package/dist/dashboard/{orphan-proposed-reconciler-Db8tUhce.js → orphan-proposed-reconciler-Boq_XaRe.js} +3 -3
- package/dist/dashboard/{orphan-proposed-reconciler-Db8tUhce.js.map → orphan-proposed-reconciler-Boq_XaRe.js.map} +1 -1
- package/dist/dashboard/{orphan-proposed-reconciler-mXV--tcB.js → orphan-proposed-reconciler-C0sPnDq_.js} +1 -1
- package/dist/dashboard/{reconstruct-cache-_tDZ2D72.js → reconstruct-cache-C2pCltOq.js} +3 -3
- package/dist/dashboard/{reconstruct-cache-_tDZ2D72.js.map → reconstruct-cache-C2pCltOq.js.map} +1 -1
- package/dist/dashboard/{remote-completion-Bklh6loJ.js → remote-completion-BmxD5UMQ.js} +3 -3
- package/dist/dashboard/{remote-completion-Bklh6loJ.js.map → remote-completion-BmxD5UMQ.js.map} +1 -1
- package/dist/dashboard/resume-C-nxu9Y4.js +3 -0
- package/dist/dashboard/{review-agent-phzqNqIs.js → review-agent-D6P6d3pz.js} +26 -17
- package/dist/dashboard/review-agent-D6P6d3pz.js.map +1 -0
- package/dist/dashboard/review-agent-DTINEffB.js +3 -0
- package/dist/dashboard/{review-context-CCq56O_Y.js → review-context-Dyo0tsBa.js} +2 -2
- package/dist/dashboard/{review-context-CCq56O_Y.js.map → review-context-Dyo0tsBa.js.map} +1 -1
- package/dist/dashboard/{review-status-BQjqQXZG.js → review-status-B5ZASOo4.js} +18 -5
- package/dist/dashboard/review-status-B5ZASOo4.js.map +1 -0
- package/dist/dashboard/{review-status-bBkqUj5i.js → review-status-h7BXIA4z.js} +1 -1
- package/dist/dashboard/{review-verdict-feedback-wqnikhMK.js → review-verdict-feedback-B70VbfRL.js} +4 -4
- package/dist/dashboard/{review-verdict-feedback-wqnikhMK.js.map → review-verdict-feedback-B70VbfRL.js.map} +1 -1
- package/dist/dashboard/{review-verdict-feedback-cZh9Wi9G.js → review-verdict-feedback-CorgH49f.js} +1 -1
- package/dist/dashboard/{sequence-io-B2GmilSI.js → sequence-io-6YP8fVpH.js} +2 -2
- package/dist/dashboard/{sequence-io-B2GmilSI.js.map → sequence-io-6YP8fVpH.js.map} +1 -1
- package/dist/dashboard/{sequencer-agent-D8pW2aU_.js → sequencer-agent-ja-nkEc1.js} +5 -5
- package/dist/dashboard/{sequencer-agent-D8pW2aU_.js.map → sequencer-agent-ja-nkEc1.js.map} +1 -1
- package/dist/dashboard/server.js +66 -55
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/{service-CILd-uOt.js → service-HKDrIy0h.js} +24 -24
- package/dist/dashboard/{service-CILd-uOt.js.map → service-HKDrIy0h.js.map} +1 -1
- package/dist/dashboard/{smart-compaction-Bgp_gwcA.js → smart-compaction-L0LSnF0_.js} +1 -1
- package/dist/dashboard/{smart-compaction-CrP90OFE.js → smart-compaction-uke1npUz.js} +2 -2
- package/dist/dashboard/{smart-compaction-CrP90OFE.js.map → smart-compaction-uke1npUz.js.map} +1 -1
- package/dist/dashboard/{spawn-planning-session-D15KbPOy.js → spawn-planning-session-CSMWco8B.js} +1 -1
- package/dist/dashboard/{spawn-planning-session-BmJWHSCu.js → spawn-planning-session-CXc0NkwV.js} +3 -3
- package/dist/dashboard/{spawn-planning-session-BmJWHSCu.js.map → spawn-planning-session-CXc0NkwV.js.map} +1 -1
- package/dist/dashboard/{specialist-context-CwKkcXL9.js → specialist-context-BGCJ24LH.js} +3 -3
- package/dist/dashboard/{specialist-context-CwKkcXL9.js.map → specialist-context-BGCJ24LH.js.map} +1 -1
- package/dist/dashboard/{specialist-logs-CvDxquV_.js → specialist-logs--Uz-r8ia.js} +2 -2
- package/dist/dashboard/{specialist-logs-CvDxquV_.js.map → specialist-logs--Uz-r8ia.js.map} +1 -1
- package/dist/dashboard/{specialists-BCjcG4uE.js → specialists-Ca9XSBCS.js} +1 -1
- package/dist/dashboard/{specialists-D07ybnam.js → specialists-DEfrAbWs.js} +36 -36
- package/dist/dashboard/{specialists-D07ybnam.js.map → specialists-DEfrAbWs.js.map} +1 -1
- package/dist/dashboard/{specialists-F2uMO4QS.js → specialists-DeZx9xom.js} +1 -1
- package/dist/dashboard/{specialists-BYi0k8CZ.js → specialists-nZ0mRwpZ.js} +12 -12
- package/dist/dashboard/{specialists-BYi0k8CZ.js.map → specialists-nZ0mRwpZ.js.map} +1 -1
- package/dist/dashboard/{summary-fork-DedqguZb.js → summary-fork-2a1L2DIU.js} +2 -2
- package/dist/dashboard/{summary-fork-EjvOkEPl.js → summary-fork-Xn0QUNmb.js} +3 -3
- package/dist/dashboard/{summary-fork-EjvOkEPl.js.map → summary-fork-Xn0QUNmb.js.map} +1 -1
- package/dist/dashboard/{teardown-workspace-5LCVbjfq.js → teardown-workspace-DhA6oAIK.js} +2 -2
- package/dist/dashboard/{teardown-workspace-5LCVbjfq.js.map → teardown-workspace-DhA6oAIK.js.map} +1 -1
- package/dist/dashboard/{test-agent-queue-qfsq6uaC.js → test-agent-queue-B_ukPyIK.js} +3 -3
- package/dist/dashboard/{test-agent-queue-qfsq6uaC.js.map → test-agent-queue-B_ukPyIK.js.map} +1 -1
- package/dist/dashboard/{uat-train-CtNGgXxj.js → uat-train-BLBAbJ8Y.js} +10 -10
- package/dist/dashboard/{uat-train-CtNGgXxj.js.map → uat-train-BLBAbJ8Y.js.map} +1 -1
- package/dist/dashboard/{uat-train-C3hWXtip.js → uat-train-DPfGR9_I.js} +1 -1
- package/dist/dashboard/{verification-runner-DuZRHjPU.js → verification-runner-KTGTNugM.js} +1 -1
- package/dist/dashboard/{verification-runner-BPAhPWR7.js → verification-runner-R2-4XgMO.js} +4 -4
- package/dist/dashboard/{verification-runner-BPAhPWR7.js.map → verification-runner-R2-4XgMO.js.map} +1 -1
- package/dist/dashboard/{workflows-H-COJ84X.js → workflows-CSKX5MhC.js} +7 -7
- package/dist/dashboard/{workflows-H-COJ84X.js.map → workflows-CSKX5MhC.js.map} +1 -1
- package/dist/dashboard/workflows-DVwXauef.js +2 -0
- package/dist/dashboard/{workspaces-CRU9_vRn.js → workspaces-DXLDgXo2.js} +32 -32
- package/dist/dashboard/{workspaces-CRU9_vRn.js.map → workspaces-DXLDgXo2.js.map} +1 -1
- package/dist/docs-index.sqlite +0 -0
- package/dist/{feedback-target-DTGAhFkM.js → feedback-target-BsKN4Tr_.js} +4 -4
- package/dist/{feedback-target-DTGAhFkM.js.map → feedback-target-BsKN4Tr_.js.map} +1 -1
- package/dist/{feedback-target-DutF088V.js → feedback-target-DM1WzOKy.js} +1 -1
- package/dist/{harness-resolve-Bz1prk6B.js → harness-resolve-B-YDNwNW.js} +2 -2
- package/dist/{harness-resolve-Bz1prk6B.js.map → harness-resolve-B-YDNwNW.js.map} +1 -1
- package/dist/{issue-lifecycle-fVqvCdKM.js → issue-lifecycle-Bc1l3U9f.js} +7 -7
- package/dist/{issue-lifecycle-fVqvCdKM.js.map → issue-lifecycle-Bc1l3U9f.js.map} +1 -1
- package/dist/{issue-service-singleton-CZm8p6Rj.js → issue-service-singleton-D-8Q6tdT.js} +1 -1
- package/dist/{issue-service-singleton-Cr73JAaR.js → issue-service-singleton-D1433I7n.js} +2 -2
- package/dist/{issue-service-singleton-Cr73JAaR.js.map → issue-service-singleton-D1433I7n.js.map} +1 -1
- package/dist/{lifecycle-CR6tZfl1.js → lifecycle-SmrqysDf.js} +7 -7
- package/dist/{lifecycle-CR6tZfl1.js.map → lifecycle-SmrqysDf.js.map} +1 -1
- package/dist/{lifecycle-D_EWiUjk.js → lifecycle-mRMyiIXs.js} +2 -2
- package/dist/{merge-agent-LM4avOtA.js → merge-agent-B9hIZ6Z0.js} +6 -6
- package/dist/{merge-agent-LM4avOtA.js.map → merge-agent-B9hIZ6Z0.js.map} +1 -1
- package/dist/{merge-agent-Bj046HE1.js → merge-agent-DUj22cXL.js} +1 -1
- package/dist/{merge-fulfillment-DrnC1Kmg.js → merge-fulfillment-__P4WE-T.js} +3 -3
- package/dist/{merge-fulfillment-DrnC1Kmg.js.map → merge-fulfillment-__P4WE-T.js.map} +1 -1
- package/dist/{reconstruct-cache-NPqoAUg-.js → reconstruct-cache-9SWp82SQ.js} +3 -3
- package/dist/{reconstruct-cache-NPqoAUg-.js.map → reconstruct-cache-9SWp82SQ.js.map} +1 -1
- package/dist/{records-BIkN1LQ4.js → records-CTmvuRzz.js} +14 -1
- package/dist/{records-BIkN1LQ4.js.map → records-CTmvuRzz.js.map} +1 -1
- package/dist/records-backfill-BQcmTmwF.js +2 -0
- package/dist/{records-backfill-HM0Pln6N.js → records-backfill-BrNsv_zT.js} +2 -2
- package/dist/{records-backfill-HM0Pln6N.js.map → records-backfill-BrNsv_zT.js.map} +1 -1
- package/dist/resume-Bn4kDk9x.js +3 -0
- package/dist/{review-agent-DFosQzCG.js → review-agent-PhqOhpx3.js} +24 -16
- package/dist/{review-agent-DFosQzCG.js.map → review-agent-PhqOhpx3.js.map} +1 -1
- package/dist/review-agent-hLbRRxZF.js +3 -0
- package/dist/{review-status-iJwfEoNX.js → review-status-B_XXomV0.js} +6 -6
- package/dist/{review-status-iJwfEoNX.js.map → review-status-B_XXomV0.js.map} +1 -1
- package/dist/{review-status-BbNVlXh1.js → review-status-Bo-EFVKh.js} +1 -1
- package/dist/{review-verdict-feedback-BGPw3z1X.js → review-verdict-feedback-CXHkoiKZ.js} +1 -1
- package/dist/{review-verdict-feedback-CCZ05atV.js → review-verdict-feedback-DGV13LDb.js} +4 -4
- package/dist/{review-verdict-feedback-CCZ05atV.js.map → review-verdict-feedback-DGV13LDb.js.map} +1 -1
- package/dist/{sequence-io-CcxZNHcD.js → sequence-io-Cg4NHAco.js} +1 -1
- package/dist/{sequence-io-Cx1usxG3.js → sequence-io-CyxvNHfA.js} +2 -2
- package/dist/{sequence-io-Cx1usxG3.js.map → sequence-io-CyxvNHfA.js.map} +1 -1
- package/dist/{smart-compaction-ByUEgQkF.js → smart-compaction-ByKXTQNy.js} +2 -2
- package/dist/{smart-compaction-ByUEgQkF.js.map → smart-compaction-ByKXTQNy.js.map} +1 -1
- package/dist/{smart-compaction-DfLe_CtH.js → smart-compaction-U6e_uB1E.js} +1 -1
- package/dist/{specialist-context-McuGkaeR.js → specialist-context-BUTadO-U.js} +3 -3
- package/dist/{specialist-context-McuGkaeR.js.map → specialist-context-BUTadO-U.js.map} +1 -1
- package/dist/{specialist-logs-CUUJ4eiB.js → specialist-logs-pEMCTtGZ.js} +2 -2
- package/dist/{specialist-logs-CUUJ4eiB.js.map → specialist-logs-pEMCTtGZ.js.map} +1 -1
- package/dist/{specialists-BSrylD1S.js → specialists-BGFnrQ8n.js} +1 -1
- package/dist/{specialists-B0elgInc.js → specialists-DeTkkp8b.js} +12 -12
- package/dist/{specialists-B0elgInc.js.map → specialists-DeTkkp8b.js.map} +1 -1
- package/dist/{summary-fork-DskMRnyb.js → summary-fork-CgzThE2-.js} +2 -2
- package/dist/{summary-fork-CPUTKcAT.js → summary-fork-Dx1RMuvU.js} +3 -3
- package/dist/{summary-fork-CPUTKcAT.js.map → summary-fork-Dx1RMuvU.js.map} +1 -1
- package/dist/{sync-BiNVQHBf.js → sync-Bsww9tuj.js} +2 -2
- package/dist/{sync-BiNVQHBf.js.map → sync-Bsww9tuj.js.map} +1 -1
- package/dist/sync-CylE_SjB.js +2 -0
- package/dist/{verdict-restore-DQiV7_fe.js → verdict-restore-DGpX0ZOJ.js} +5 -5
- package/dist/{verdict-restore-DQiV7_fe.js.map → verdict-restore-DGpX0ZOJ.js.map} +1 -1
- package/dist/{webhook-handlers-DHBSEDEm.js → webhook-handlers-BjsfIL7u.js} +3 -3
- package/dist/{webhook-handlers-DHBSEDEm.js.map → webhook-handlers-BjsfIL7u.js.map} +1 -1
- package/dist/{workspace-migrate-duUsWNpd.js → workspace-migrate-BBQ8nAnP.js} +2 -2
- package/dist/{workspace-migrate-duUsWNpd.js.map → workspace-migrate-BBQ8nAnP.js.map} +1 -1
- package/dist/{workspace-reap-DLCIoJmn.js → workspace-reap-12O9354k.js} +2 -2
- package/dist/{workspace-reap-DLCIoJmn.js.map → workspace-reap-12O9354k.js.map} +1 -1
- package/package.json +1 -1
- package/scripts/file-size-baseline.txt +1 -1
- package/dist/cli-DBWG12XK.js +0 -3
- package/dist/dashboard/cli-CJDWXE_Y.js +0 -3
- package/dist/dashboard/deacon-swarm-D1iAUX-P.js +0 -2
- package/dist/dashboard/inspect-agent-vm88mLYr.js +0 -2
- package/dist/dashboard/merge-ops-QdBiQ8XB.js +0 -2
- package/dist/dashboard/resume-DnIsmIgC.js +0 -3
- package/dist/dashboard/review-agent-DgySDb-G.js +0 -3
- package/dist/dashboard/review-agent-phzqNqIs.js.map +0 -1
- package/dist/dashboard/review-status-BQjqQXZG.js.map +0 -1
- package/dist/dashboard/workflows-Cz8OtiB4.js +0 -2
- package/dist/records-backfill-DEgtRyKL.js +0 -2
- package/dist/resume-DGymuXZM.js +0 -3
- package/dist/review-agent-DjVadURa.js +0 -3
- package/dist/sync-4jqukkxz.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-gate-BhKvrPxn.js","names":[],"sources":["../../src/lib/cloister/conflict-gate.ts"],"sourcesContent":["import { exec, type ExecOptions } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { emitActivityEntrySync } from '../activity-logger.js';\nimport { messageAgent, spawnRun } from '../agents.js';\nimport { getReviewStatusSync, setReviewStatusSync, type BlockerReason, type ReviewStatus } from '../review-status.js';\n\nconst execAsync = promisify(exec);\nconst GIT_TIMEOUT_MS = 30_000;\nconst GIT_MAX_BUFFER = 4 * 1024 * 1024;\nconst MERGE_BLOCKER_TYPES = new Set<BlockerReason['type']>(['merge_conflict', 'not_mergeable']);\nconst PROBE_CACHE_MS = 3 * 60 * 1000;\nconst DISPATCH_THROTTLE_MS = 30 * 60 * 1000;\n\nexport type BranchMergeability = 'clean' | 'conflicts' | 'unknown';\n\nexport interface ExecResult {\n stdout: string | Buffer;\n stderr: string | Buffer;\n}\n\nexport type ExecRunner = (command: string, options: ExecOptions) => Promise<ExecResult>;\n\nexport interface CheckBranchMergeabilityDeps {\n exec?: ExecRunner;\n}\n\nexport type ResolverDispatchState = 'dispatched' | 'already_running' | 'throttled';\n\nexport interface ConflictGateResult {\n gated: boolean;\n reason?: string;\n clearedStaleBlocker?: boolean;\n resolverDispatchState?: ResolverDispatchState;\n}\n\nexport interface DispatchResolverInput {\n issueId: string;\n workspacePath: string;\n targetBranch: string;\n blockerReasons: BlockerReason[];\n reason: string;\n}\n\nexport interface ResolveConflictGateDeps {\n getReviewStatus: (issueId: string) => ReviewStatus | null | Promise<ReviewStatus | null>;\n setReviewStatus: (\n issueId: string,\n update: Partial<ReviewStatus>,\n existing?: ReviewStatus,\n ) => ReviewStatus | Promise<ReviewStatus>;\n probeMergeability?: (workspacePath: string, targetBranch: string) => BranchMergeability | Promise<BranchMergeability>;\n dispatchResolver: (input: DispatchResolverInput) => ResolverDispatchState | void | Promise<ResolverDispatchState | void>;\n now?: () => Date;\n log?: (message: string) => void;\n}\n\ninterface RealConflictGateDepsOverrides {\n spawnRun?: typeof spawnRun;\n messageAgent?: typeof messageAgent;\n getReviewStatus?: typeof getReviewStatusSync;\n setReviewStatus?: typeof setReviewStatusSync;\n emitActivityEntry?: typeof emitActivityEntrySync;\n now?: () => Date;\n log?: (message: string) => void;\n}\n\nconst PROBE_CACHE_MAX_ENTRIES = 256;\n\nconst probeCache = new Map<string, { checkedAtMs: number; result: BranchMergeability }>();\nconst probeInFlight = new Map<string, Promise<BranchMergeability>>();\n\n/**\n * Non-destructively checks whether HEAD can merge with origin/<targetBranch>.\n * Uses git merge-tree only — never git merge — so HEAD, the index, and the\n * working tree are left untouched.\n */\nexport async function checkBranchMergeability(\n workspacePath: string,\n targetBranch: string,\n deps: CheckBranchMergeabilityDeps = {},\n): Promise<BranchMergeability> {\n const run = deps.exec ?? execAsync;\n const options: ExecOptions = {\n cwd: workspacePath,\n encoding: 'utf-8',\n timeout: GIT_TIMEOUT_MS,\n maxBuffer: GIT_MAX_BUFFER,\n };\n\n try {\n await run(`git fetch origin ${shellQuote(targetBranch)}`, options);\n } catch {\n return 'unknown';\n }\n\n try {\n const result = await run(\n `git merge-tree --write-tree --name-only HEAD ${shellQuote(`origin/${targetBranch}`)}`,\n options,\n );\n return outputHasConflictMarker(result.stdout, result.stderr) ? 'conflicts' : 'clean';\n } catch (err) {\n return mergeTreeFailureIndicatesConflict(err) ? 'conflicts' : 'unknown';\n }\n}\n\nexport function buildRealConflictGateDeps(overrides: RealConflictGateDepsOverrides = {}): ResolveConflictGateDeps {\n const runSpawn = overrides.spawnRun ?? spawnRun;\n const deliverMessage = overrides.messageAgent ?? messageAgent;\n const readStatus = overrides.getReviewStatus ?? getReviewStatusSync;\n const writeStatus = overrides.setReviewStatus ?? setReviewStatusSync;\n const emitActivity = overrides.emitActivityEntry ?? emitActivityEntrySync;\n const now = overrides.now ?? (() => new Date());\n\n return {\n getReviewStatus: readStatus,\n setReviewStatus: writeStatus,\n probeMergeability: checkBranchMergeability,\n now,\n log: overrides.log,\n dispatchResolver: async (input) => {\n const prompt = buildConflictResolverPrompt(input);\n let dispatchState: ResolverDispatchState = 'dispatched';\n try {\n await runSpawn(input.issueId, 'work', { prompt });\n } catch (err) {\n if (isAlreadyRunningError(err)) {\n await deliverMessage(`agent-${input.issueId.toLowerCase()}`, prompt, 'conflict-gate');\n dispatchState = 'already_running';\n overrides.log?.(`[conflict-gate] ${input.issueId}: conflict resolver already running; delivered resolver prompt`);\n } else {\n throw err;\n }\n }\n\n const dispatchedAt = now().toISOString();\n const existing = readStatus(input.issueId) ?? undefined;\n writeStatus(input.issueId, { conflictResolutionDispatchedAt: dispatchedAt }, existing);\n emitActivity({\n source: 'review',\n level: 'info',\n issueId: input.issueId,\n message: dispatchState === 'already_running'\n ? `Review deferred — conflict resolver already running for ${input.issueId}; delivered resolver prompt`\n : `Review deferred — conflict resolver dispatched for ${input.issueId}`,\n details: input.reason,\n });\n return dispatchState;\n },\n };\n}\n\nexport async function resolveConflictGate(\n issueId: string,\n workspacePath: string,\n targetBranch: string,\n deps: ResolveConflictGateDeps,\n): Promise<ConflictGateResult> {\n const status = await deps.getReviewStatus(issueId);\n const mergeBlockers = (status?.blockerReasons ?? []).filter(isMergeBlocker);\n if (!status || mergeBlockers.length === 0) return { gated: false };\n\n const now = deps.now ?? (() => new Date());\n const checkedAtMs = now().getTime();\n const mergeability = await getCachedMergeability(issueId, checkedAtMs, workspacePath, targetBranch, deps);\n\n if (mergeability === 'clean') {\n const remainingBlockers = (status.blockerReasons ?? []).filter((blocker) => !isMergeBlocker(blocker));\n await deps.setReviewStatus(\n issueId,\n { blockerReasons: remainingBlockers.length > 0 ? remainingBlockers : undefined },\n status,\n );\n deps.log?.(`[conflict-gate] ${issueId}: cleared stale merge blocker; review can proceed`);\n return { gated: false, clearedStaleBlocker: true };\n }\n\n const reason = mergeability === 'conflicts'\n ? `merge conflict with ${targetBranch} must be resolved before review dispatch`\n : `mergeability against ${targetBranch} could not be verified; deferring review conservatively`;\n\n let resolverDispatchState: ResolverDispatchState;\n if (!isResolverDispatchThrottled(status, mergeBlockers, checkedAtMs)) {\n resolverDispatchState = await deps.dispatchResolver({\n issueId,\n workspacePath,\n targetBranch,\n blockerReasons: mergeBlockers,\n reason,\n }) ?? 'dispatched';\n } else {\n resolverDispatchState = 'throttled';\n deps.log?.(`[conflict-gate] ${issueId}: conflict resolver dispatch is throttled`);\n }\n\n return {\n gated: true,\n reason: `${reason}; ${formatResolverDispatchState(resolverDispatchState)}`,\n resolverDispatchState,\n };\n}\n\nexport function __resetConflictGateProbeCacheForTests(): void {\n probeCache.clear();\n probeInFlight.clear();\n}\n\n/**\n * Synchronous, non-blocking read of the conflict-gate probe cache.\n * Returns the cached mergeability result only when a fresh value is available;\n * returns undefined when the cache is absent or stale. This function performs\n * NO I/O and NO status writes so it is safe on HTTP request hot paths.\n */\nexport function getCachedConflictGateMergeability(\n issueId: string,\n): BranchMergeability | undefined {\n const nowMs = Date.now();\n sweepExpiredProbeCache(nowMs);\n const key = issueId.toUpperCase();\n const cached = probeCache.get(key);\n if (cached && nowMs - cached.checkedAtMs < PROBE_CACHE_MS) return cached.result;\n return undefined;\n}\n\nasync function getCachedMergeability(\n issueId: string,\n nowMs: number,\n workspacePath: string,\n targetBranch: string,\n deps: ResolveConflictGateDeps,\n): Promise<BranchMergeability> {\n const key = issueId.toUpperCase();\n sweepExpiredProbeCache(nowMs);\n const cached = probeCache.get(key);\n if (cached && nowMs - cached.checkedAtMs < PROBE_CACHE_MS) return cached.result;\n\n const existing = probeInFlight.get(key);\n if (existing) return existing;\n\n const promise = (async () => {\n try {\n const result = await (deps.probeMergeability ?? checkBranchMergeability)(workspacePath, targetBranch);\n // Move to end for LRU ordering, then enforce size cap.\n probeCache.delete(key);\n probeCache.set(key, { checkedAtMs: nowMs, result });\n enforceProbeCacheSizeLimit();\n return result;\n } finally {\n probeInFlight.delete(key);\n }\n })();\n\n probeInFlight.set(key, promise);\n return promise;\n}\n\nfunction isResolverDispatchThrottled(\n status: ReviewStatus,\n mergeBlockers: BlockerReason[],\n nowMs: number,\n): boolean {\n if (!status.conflictResolutionDispatchedAt) return false;\n const dispatchedAtMs = Date.parse(status.conflictResolutionDispatchedAt);\n if (!Number.isFinite(dispatchedAtMs)) return false;\n\n const newestBlockerMs = Math.max(\n ...mergeBlockers\n .map((blocker) => Date.parse(blocker.detectedAt))\n .filter((detectedAtMs) => Number.isFinite(detectedAtMs)),\n );\n if (Number.isFinite(newestBlockerMs) && dispatchedAtMs < newestBlockerMs) return false;\n\n return nowMs - dispatchedAtMs < DISPATCH_THROTTLE_MS;\n}\n\nfunction formatResolverDispatchState(state: ResolverDispatchState): string {\n switch (state) {\n case 'already_running':\n return 'conflict resolver already running; resolver prompt delivered';\n case 'throttled':\n return 'conflict resolver dispatch throttled';\n case 'dispatched':\n return 'conflict resolver dispatched';\n }\n}\n\nfunction sweepExpiredProbeCache(nowMs: number): void {\n for (const [key, cached] of probeCache.entries()) {\n if (nowMs - cached.checkedAtMs >= PROBE_CACHE_MS) probeCache.delete(key);\n }\n}\n\nfunction enforceProbeCacheSizeLimit(): void {\n while (probeCache.size > PROBE_CACHE_MAX_ENTRIES) {\n const first = probeCache.keys().next().value;\n if (first) probeCache.delete(first);\n }\n}\n\nfunction isMergeBlocker(blocker: BlockerReason): boolean {\n return MERGE_BLOCKER_TYPES.has(blocker.type);\n}\n\nfunction buildConflictResolverPrompt(input: DispatchResolverInput): string {\n const blockerSummary = input.blockerReasons\n .map((blocker) => `- ${blocker.type}: ${blocker.summary} (detected ${blocker.detectedAt})`)\n .join('\\n');\n\n return [\n `Review for ${input.issueId} was deferred because the feature branch has a standing merge conflict with origin/${input.targetBranch}.`,\n '',\n 'Resolve the conflict WITHOUT degrading either side of the change:',\n `1. Read what origin/${input.targetBranch} changed and what ${input.issueId} intended before editing.`,\n `2. Rebase this branch onto origin/${input.targetBranch} and resolve every conflict so BOTH intents are preserved.`,\n '3. Build, run the relevant tests, and commit the resolved state.',\n '4. Re-request review when the branch is clean (use pan done or pan review request as appropriate for this workspace).',\n '',\n 'Do not blindly accept one side of a conflict — understand both changesets first.',\n '',\n 'Current blocker details:',\n blockerSummary || '- mergeability blocker present',\n ].join('\\n');\n}\n\nfunction isAlreadyRunningError(err: unknown): boolean {\n const message = err instanceof Error ? err.message : String(err);\n return /already running/i.test(message);\n}\n\nfunction mergeTreeFailureIndicatesConflict(err: unknown): boolean {\n const maybe = err as { code?: unknown; stdout?: unknown; stderr?: unknown; message?: unknown };\n const output = [maybe.stdout, maybe.stderr, maybe.message].map(toText).join('\\n');\n\n if (outputHasConflictMarker(output, '')) return true;\n\n // `git merge-tree --write-tree` exits 1 for merge conflicts. Treat fatal/git\n // usage failures as unknown so missing workspaces, old git, and bad refs do not\n // masquerade as real branch conflicts.\n return maybe.code === 1 && !/\\b(fatal|usage:|unknown option|not a git repository)\\b/i.test(output);\n}\n\nfunction outputHasConflictMarker(stdout: unknown, stderr: unknown): boolean {\n const output = `${toText(stdout)}\\n${toText(stderr)}`;\n return /\\bCONFLICT\\b/i.test(output) || /contains conflicts/i.test(output);\n}\n\nfunction toText(value: unknown): string {\n if (typeof value === 'string') return value;\n if (Buffer.isBuffer(value)) return value.toString('utf-8');\n if (value instanceof Error) return value.message;\n return value == null ? '' : String(value);\n}\n\nfunction shellQuote(value: string): string {\n if (/^[A-Za-z0-9._/@:-]+$/.test(value)) return value;\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conflict-gate-FFEvTDVA.js","names":[],"sources":["../../src/lib/cloister/conflict-gate.ts"],"sourcesContent":["import { exec, type ExecOptions } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { emitActivityEntrySync } from '../activity-logger.js';\nimport { messageAgent, spawnRun } from '../agents.js';\nimport { getReviewStatusSync, setReviewStatusSync, type BlockerReason, type ReviewStatus } from '../review-status.js';\n\nconst execAsync = promisify(exec);\nconst GIT_TIMEOUT_MS = 30_000;\nconst GIT_MAX_BUFFER = 4 * 1024 * 1024;\nconst MERGE_BLOCKER_TYPES = new Set<BlockerReason['type']>(['merge_conflict', 'not_mergeable']);\nconst PROBE_CACHE_MS = 3 * 60 * 1000;\nconst DISPATCH_THROTTLE_MS = 30 * 60 * 1000;\n\nexport type BranchMergeability = 'clean' | 'conflicts' | 'unknown';\n\nexport interface ExecResult {\n stdout: string | Buffer;\n stderr: string | Buffer;\n}\n\nexport type ExecRunner = (command: string, options: ExecOptions) => Promise<ExecResult>;\n\nexport interface CheckBranchMergeabilityDeps {\n exec?: ExecRunner;\n}\n\nexport type ResolverDispatchState = 'dispatched' | 'already_running' | 'throttled';\n\nexport interface ConflictGateResult {\n gated: boolean;\n reason?: string;\n clearedStaleBlocker?: boolean;\n resolverDispatchState?: ResolverDispatchState;\n}\n\nexport interface DispatchResolverInput {\n issueId: string;\n workspacePath: string;\n targetBranch: string;\n blockerReasons: BlockerReason[];\n reason: string;\n}\n\nexport interface ResolveConflictGateDeps {\n getReviewStatus: (issueId: string) => ReviewStatus | null | Promise<ReviewStatus | null>;\n setReviewStatus: (\n issueId: string,\n update: Partial<ReviewStatus>,\n existing?: ReviewStatus,\n ) => ReviewStatus | Promise<ReviewStatus>;\n probeMergeability?: (workspacePath: string, targetBranch: string) => BranchMergeability | Promise<BranchMergeability>;\n dispatchResolver: (input: DispatchResolverInput) => ResolverDispatchState | void | Promise<ResolverDispatchState | void>;\n now?: () => Date;\n log?: (message: string) => void;\n}\n\ninterface RealConflictGateDepsOverrides {\n spawnRun?: typeof spawnRun;\n messageAgent?: typeof messageAgent;\n getReviewStatus?: typeof getReviewStatusSync;\n setReviewStatus?: typeof setReviewStatusSync;\n emitActivityEntry?: typeof emitActivityEntrySync;\n now?: () => Date;\n log?: (message: string) => void;\n}\n\nconst PROBE_CACHE_MAX_ENTRIES = 256;\n\nconst probeCache = new Map<string, { checkedAtMs: number; result: BranchMergeability }>();\nconst probeInFlight = new Map<string, Promise<BranchMergeability>>();\n\n/**\n * Non-destructively checks whether HEAD can merge with origin/<targetBranch>.\n * Uses git merge-tree only — never git merge — so HEAD, the index, and the\n * working tree are left untouched.\n */\nexport async function checkBranchMergeability(\n workspacePath: string,\n targetBranch: string,\n deps: CheckBranchMergeabilityDeps = {},\n): Promise<BranchMergeability> {\n const run = deps.exec ?? execAsync;\n const options: ExecOptions = {\n cwd: workspacePath,\n encoding: 'utf-8',\n timeout: GIT_TIMEOUT_MS,\n maxBuffer: GIT_MAX_BUFFER,\n };\n\n try {\n await run(`git fetch origin ${shellQuote(targetBranch)}`, options);\n } catch {\n return 'unknown';\n }\n\n try {\n const result = await run(\n `git merge-tree --write-tree --name-only HEAD ${shellQuote(`origin/${targetBranch}`)}`,\n options,\n );\n return outputHasConflictMarker(result.stdout, result.stderr) ? 'conflicts' : 'clean';\n } catch (err) {\n return mergeTreeFailureIndicatesConflict(err) ? 'conflicts' : 'unknown';\n }\n}\n\nexport function buildRealConflictGateDeps(overrides: RealConflictGateDepsOverrides = {}): ResolveConflictGateDeps {\n const runSpawn = overrides.spawnRun ?? spawnRun;\n const deliverMessage = overrides.messageAgent ?? messageAgent;\n const readStatus = overrides.getReviewStatus ?? getReviewStatusSync;\n const writeStatus = overrides.setReviewStatus ?? setReviewStatusSync;\n const emitActivity = overrides.emitActivityEntry ?? emitActivityEntrySync;\n const now = overrides.now ?? (() => new Date());\n\n return {\n getReviewStatus: readStatus,\n setReviewStatus: writeStatus,\n probeMergeability: checkBranchMergeability,\n now,\n log: overrides.log,\n dispatchResolver: async (input) => {\n const prompt = buildConflictResolverPrompt(input);\n let dispatchState: ResolverDispatchState = 'dispatched';\n try {\n await runSpawn(input.issueId, 'work', { prompt });\n } catch (err) {\n if (isAlreadyRunningError(err)) {\n await deliverMessage(`agent-${input.issueId.toLowerCase()}`, prompt, 'conflict-gate');\n dispatchState = 'already_running';\n overrides.log?.(`[conflict-gate] ${input.issueId}: conflict resolver already running; delivered resolver prompt`);\n } else {\n throw err;\n }\n }\n\n const dispatchedAt = now().toISOString();\n const existing = readStatus(input.issueId) ?? undefined;\n writeStatus(input.issueId, { conflictResolutionDispatchedAt: dispatchedAt }, existing);\n emitActivity({\n source: 'review',\n level: 'info',\n issueId: input.issueId,\n message: dispatchState === 'already_running'\n ? `Review deferred — conflict resolver already running for ${input.issueId}; delivered resolver prompt`\n : `Review deferred — conflict resolver dispatched for ${input.issueId}`,\n details: input.reason,\n });\n return dispatchState;\n },\n };\n}\n\nexport async function resolveConflictGate(\n issueId: string,\n workspacePath: string,\n targetBranch: string,\n deps: ResolveConflictGateDeps,\n): Promise<ConflictGateResult> {\n const status = await deps.getReviewStatus(issueId);\n const mergeBlockers = (status?.blockerReasons ?? []).filter(isMergeBlocker);\n if (!status || mergeBlockers.length === 0) return { gated: false };\n\n const now = deps.now ?? (() => new Date());\n const checkedAtMs = now().getTime();\n const mergeability = await getCachedMergeability(issueId, checkedAtMs, workspacePath, targetBranch, deps);\n\n if (mergeability === 'clean') {\n const remainingBlockers = (status.blockerReasons ?? []).filter((blocker) => !isMergeBlocker(blocker));\n await deps.setReviewStatus(\n issueId,\n { blockerReasons: remainingBlockers.length > 0 ? remainingBlockers : undefined },\n status,\n );\n deps.log?.(`[conflict-gate] ${issueId}: cleared stale merge blocker; review can proceed`);\n return { gated: false, clearedStaleBlocker: true };\n }\n\n const reason = mergeability === 'conflicts'\n ? `merge conflict with ${targetBranch} must be resolved before review dispatch`\n : `mergeability against ${targetBranch} could not be verified; deferring review conservatively`;\n\n let resolverDispatchState: ResolverDispatchState;\n if (!isResolverDispatchThrottled(status, mergeBlockers, checkedAtMs)) {\n resolverDispatchState = await deps.dispatchResolver({\n issueId,\n workspacePath,\n targetBranch,\n blockerReasons: mergeBlockers,\n reason,\n }) ?? 'dispatched';\n } else {\n resolverDispatchState = 'throttled';\n deps.log?.(`[conflict-gate] ${issueId}: conflict resolver dispatch is throttled`);\n }\n\n return {\n gated: true,\n reason: `${reason}; ${formatResolverDispatchState(resolverDispatchState)}`,\n resolverDispatchState,\n };\n}\n\nexport function __resetConflictGateProbeCacheForTests(): void {\n probeCache.clear();\n probeInFlight.clear();\n}\n\n/**\n * Synchronous, non-blocking read of the conflict-gate probe cache.\n * Returns the cached mergeability result only when a fresh value is available;\n * returns undefined when the cache is absent or stale. This function performs\n * NO I/O and NO status writes so it is safe on HTTP request hot paths.\n */\nexport function getCachedConflictGateMergeability(\n issueId: string,\n): BranchMergeability | undefined {\n const nowMs = Date.now();\n sweepExpiredProbeCache(nowMs);\n const key = issueId.toUpperCase();\n const cached = probeCache.get(key);\n if (cached && nowMs - cached.checkedAtMs < PROBE_CACHE_MS) return cached.result;\n return undefined;\n}\n\nasync function getCachedMergeability(\n issueId: string,\n nowMs: number,\n workspacePath: string,\n targetBranch: string,\n deps: ResolveConflictGateDeps,\n): Promise<BranchMergeability> {\n const key = issueId.toUpperCase();\n sweepExpiredProbeCache(nowMs);\n const cached = probeCache.get(key);\n if (cached && nowMs - cached.checkedAtMs < PROBE_CACHE_MS) return cached.result;\n\n const existing = probeInFlight.get(key);\n if (existing) return existing;\n\n const promise = (async () => {\n try {\n const result = await (deps.probeMergeability ?? checkBranchMergeability)(workspacePath, targetBranch);\n // Move to end for LRU ordering, then enforce size cap.\n probeCache.delete(key);\n probeCache.set(key, { checkedAtMs: nowMs, result });\n enforceProbeCacheSizeLimit();\n return result;\n } finally {\n probeInFlight.delete(key);\n }\n })();\n\n probeInFlight.set(key, promise);\n return promise;\n}\n\nfunction isResolverDispatchThrottled(\n status: ReviewStatus,\n mergeBlockers: BlockerReason[],\n nowMs: number,\n): boolean {\n if (!status.conflictResolutionDispatchedAt) return false;\n const dispatchedAtMs = Date.parse(status.conflictResolutionDispatchedAt);\n if (!Number.isFinite(dispatchedAtMs)) return false;\n\n const newestBlockerMs = Math.max(\n ...mergeBlockers\n .map((blocker) => Date.parse(blocker.detectedAt))\n .filter((detectedAtMs) => Number.isFinite(detectedAtMs)),\n );\n if (Number.isFinite(newestBlockerMs) && dispatchedAtMs < newestBlockerMs) return false;\n\n return nowMs - dispatchedAtMs < DISPATCH_THROTTLE_MS;\n}\n\nfunction formatResolverDispatchState(state: ResolverDispatchState): string {\n switch (state) {\n case 'already_running':\n return 'conflict resolver already running; resolver prompt delivered';\n case 'throttled':\n return 'conflict resolver dispatch throttled';\n case 'dispatched':\n return 'conflict resolver dispatched';\n }\n}\n\nfunction sweepExpiredProbeCache(nowMs: number): void {\n for (const [key, cached] of probeCache.entries()) {\n if (nowMs - cached.checkedAtMs >= PROBE_CACHE_MS) probeCache.delete(key);\n }\n}\n\nfunction enforceProbeCacheSizeLimit(): void {\n while (probeCache.size > PROBE_CACHE_MAX_ENTRIES) {\n const first = probeCache.keys().next().value;\n if (first) probeCache.delete(first);\n }\n}\n\nfunction isMergeBlocker(blocker: BlockerReason): boolean {\n return MERGE_BLOCKER_TYPES.has(blocker.type);\n}\n\nfunction buildConflictResolverPrompt(input: DispatchResolverInput): string {\n const blockerSummary = input.blockerReasons\n .map((blocker) => `- ${blocker.type}: ${blocker.summary} (detected ${blocker.detectedAt})`)\n .join('\\n');\n\n return [\n `Review for ${input.issueId} was deferred because the feature branch has a standing merge conflict with origin/${input.targetBranch}.`,\n '',\n 'Resolve the conflict WITHOUT degrading either side of the change:',\n `1. Read what origin/${input.targetBranch} changed and what ${input.issueId} intended before editing.`,\n `2. Rebase this branch onto origin/${input.targetBranch} and resolve every conflict so BOTH intents are preserved.`,\n '3. Build, run the relevant tests, and commit the resolved state.',\n '4. Re-request review when the branch is clean (use pan done or pan review request as appropriate for this workspace).',\n '',\n 'Do not blindly accept one side of a conflict — understand both changesets first.',\n '',\n 'Current blocker details:',\n blockerSummary || '- mergeability blocker present',\n ].join('\\n');\n}\n\nfunction isAlreadyRunningError(err: unknown): boolean {\n const message = err instanceof Error ? err.message : String(err);\n return /already running/i.test(message);\n}\n\nfunction mergeTreeFailureIndicatesConflict(err: unknown): boolean {\n const maybe = err as { code?: unknown; stdout?: unknown; stderr?: unknown; message?: unknown };\n const output = [maybe.stdout, maybe.stderr, maybe.message].map(toText).join('\\n');\n\n if (outputHasConflictMarker(output, '')) return true;\n\n // `git merge-tree --write-tree` exits 1 for merge conflicts. Treat fatal/git\n // usage failures as unknown so missing workspaces, old git, and bad refs do not\n // masquerade as real branch conflicts.\n return maybe.code === 1 && !/\\b(fatal|usage:|unknown option|not a git repository)\\b/i.test(output);\n}\n\nfunction outputHasConflictMarker(stdout: unknown, stderr: unknown): boolean {\n const output = `${toText(stdout)}\\n${toText(stderr)}`;\n return /\\bCONFLICT\\b/i.test(output) || /contains conflicts/i.test(output);\n}\n\nfunction toText(value: unknown): string {\n if (typeof value === 'string') return value;\n if (Buffer.isBuffer(value)) return value.toString('utf-8');\n if (value instanceof Error) return value.message;\n return value == null ? '' : String(value);\n}\n\nfunction shellQuote(value: string): string {\n if (/^[A-Za-z0-9._/@:-]+$/.test(value)) return value;\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n"],"mappings":"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"}
|
package/dist/dashboard/{conversation-compaction-C5o_eKEm.js → conversation-compaction-CCqN4hWk.js}
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
2
|
import { f as loadConfigSync, t as init_config_yaml } from "./config-yaml-DPAieL_G.js";
|
|
3
3
|
import { a as init_event_store, n as getEventStore } from "./event-store-DTJXZjCl.js";
|
|
4
|
-
import { Gt as getAgentRuntimeBaseCommand, t as init_agents, un as getProviderExportsForModel } from "./agents-
|
|
4
|
+
import { Gt as getAgentRuntimeBaseCommand, t as init_agents, un as getProviderExportsForModel } from "./agents-C7V4odQ6.js";
|
|
5
5
|
import { t as init_conversation_service, u as findLastCompactBoundary } from "./conversation-service-DvG8vZSV.js";
|
|
6
6
|
import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-CYY2_Eeh.js";
|
|
7
|
-
import { r as init_smart_compaction, t as generateSmartSummary } from "./smart-compaction-
|
|
8
|
-
import { a as generateFallbackSummary, l as init_summary_fork } from "./summary-fork-
|
|
7
|
+
import { r as init_smart_compaction, t as generateSmartSummary } from "./smart-compaction-uke1npUz.js";
|
|
8
|
+
import { a as generateFallbackSummary, l as init_summary_fork } from "./summary-fork-Xn0QUNmb.js";
|
|
9
9
|
import { Effect } from "effect";
|
|
10
10
|
import { existsSync } from "node:fs";
|
|
11
11
|
import { dirname, join } from "node:path";
|
|
@@ -179,4 +179,4 @@ var init_conversation_compaction = __esmMin((() => {
|
|
|
179
179
|
//#endregion
|
|
180
180
|
export { init_conversation_compaction as a, shouldInterceptManualCompact as c, getConversationCompactionSettings as i, compactConversationNative as n, isCompacting as o, estimateContextTokens as r, maybeCompactBeforeRespawn as s, buildCompactionRuntimeInfo as t };
|
|
181
181
|
|
|
182
|
-
//# sourceMappingURL=conversation-compaction-
|
|
182
|
+
//# sourceMappingURL=conversation-compaction-CCqN4hWk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-compaction-C5o_eKEm.js","names":[],"sources":["../../src/dashboard/server/services/conversation-compaction.ts"],"sourcesContent":["import { Effect } from 'effect';\nimport { writeFile, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\n\nimport { findLastCompactBoundary } from './conversation-service.js';\nimport { generateSmartSummary } from '../../../lib/conversations/smart-compaction.js';\nimport { generateFallbackSummary } from '../../../lib/conversations/summary-fork.js';\nimport { loadConfigSync } from '../../../lib/config-yaml.js';\nimport { getAgentRuntimeBaseCommand, getProviderExportsForModel } from '../../../lib/agents.js';\nimport { getEventStore } from '../event-store.js';\nimport { isBackgroundFeatureEnabled } from '../../../lib/background-ai/features.js';\n\nconst activeCompactions = new Set<string>();\nexport function isCompacting(sessionFile: string): boolean {\n return activeCompactions.has(sessionFile);\n}\n\nexport interface NativeCompactionResult {\n summary: string;\n tokensBefore: number;\n boundaryUuid: string;\n model: string;\n forkedSessionId: string;\n forkedSessionFile: string;\n}\n\nexport interface MaybeCompactBeforeRespawnOptions {\n sessionFile: string | null | undefined;\n cwd: string;\n shouldCompact: boolean;\n}\n\nexport function getConversationCompactionSettings() {\n const { config } = loadConfigSync();\n return {\n model: config.conversations.compactionModel,\n manualCompactMode: config.conversations.manualCompactMode,\n richCompaction: config.conversations.richCompaction,\n };\n}\n\nexport function shouldInterceptManualCompact(message: string): boolean {\n const trimmed = message.trim();\n if (trimmed !== '/compact') return false;\n return getConversationCompactionSettings().manualCompactMode === 'overdeck-native';\n}\n\nexport async function estimateContextTokens(sessionFile: string | null | undefined): Promise<number> {\n if (!sessionFile || !existsSync(sessionFile)) return 0;\n try {\n const content = await readFile(sessionFile, 'utf-8');\n const lines = content.split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (!line) continue;\n try {\n const entry = JSON.parse(line);\n const usage = entry?.message?.usage ?? entry?.usage;\n if (usage && typeof usage.input_tokens === 'number') {\n const total = (usage.input_tokens ?? 0)\n + (usage.cache_creation_input_tokens ?? 0)\n + (usage.cache_read_input_tokens ?? 0);\n if (total > 0) return total;\n }\n } catch {\n // Skip malformed line\n }\n }\n } catch (err) {\n console.warn(`[conversation-compaction] estimateContextTokens failed for ${sessionFile}:`, err);\n }\n return 0;\n}\n\nfunction buildContinuationSummary(summary: string, model: string): string {\n return [\n 'This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.',\n '',\n summary,\n '',\n `Overdeck native compaction model: ${model}`,\n '',\n 'Continue from this summary without redoing already-completed work.',\n ].join('\\n');\n}\n\nexport async function compactConversationNative(sessionFile: string, conversationName?: string): Promise<NativeCompactionResult> {\n if (!existsSync(sessionFile)) {\n throw new Error(`Session file not found: ${sessionFile}`);\n }\n activeCompactions.add(sessionFile);\n if (conversationName) {\n getEventStore().emitOnly({ type: 'conversation.compacting_changed', timestamp: new Date().toISOString(), payload: { conversationName, compacting: true } });\n }\n try {\n return await doCompact(sessionFile);\n } finally {\n activeCompactions.delete(sessionFile);\n if (conversationName) {\n getEventStore().emitOnly({ type: 'conversation.compacting_changed', timestamp: new Date().toISOString(), payload: { conversationName, compacting: false } });\n }\n }\n}\n\nasync function doCompact(sessionFile: string): Promise<NativeCompactionResult> {\n\n const settings = getConversationCompactionSettings();\n const tokensBefore = await estimateContextTokens(sessionFile);\n\n let summary: string;\n try {\n const result = await Effect.runPromise(generateSmartSummary({\n jsonlPath: sessionFile,\n model: settings.model,\n richMode: settings.richCompaction,\n mode: 'fork',\n }));\n summary = result.summary;\n } catch (error) {\n console.warn(`[conversation-compaction] Smart summary failed, falling back to heuristic:`, error);\n summary = await Effect.runPromise(generateFallbackSummary(sessionFile));\n }\n\n const continuation = buildContinuationSummary(summary, settings.model);\n const boundaryUuid = randomUUID();\n const timestamp = new Date().toISOString();\n const boundaryOffset = await findLastCompactBoundary(sessionFile);\n\n const entries = [\n JSON.stringify({\n parentUuid: null,\n isSidechain: false,\n type: 'system',\n subtype: 'compact_boundary',\n content: 'Conversation compacted',\n isMeta: false,\n timestamp,\n uuid: boundaryUuid,\n level: 'info',\n compactMetadata: {\n trigger: 'overdeck-native',\n preTokens: tokensBefore,\n model: settings.model,\n previousBoundaryOffset: boundaryOffset,\n },\n }),\n JSON.stringify({\n parentUuid: boundaryUuid,\n isSidechain: false,\n type: 'user',\n message: {\n role: 'user',\n content: continuation,\n },\n isVisibleInTranscriptOnly: true,\n isCompactSummary: true,\n uuid: randomUUID(),\n timestamp,\n }),\n ];\n\n const forkedSessionId = randomUUID();\n const forkedSessionFile = join(dirname(sessionFile), `${forkedSessionId}.jsonl`);\n await writeFile(forkedSessionFile, `${entries.join('\\n')}\\n`, 'utf-8');\n\n return {\n summary: continuation,\n tokensBefore,\n boundaryUuid,\n model: settings.model,\n forkedSessionId,\n forkedSessionFile,\n };\n}\n\nexport async function maybeCompactBeforeRespawn(\n opts: MaybeCompactBeforeRespawnOptions,\n): Promise<{ forkedSessionId: string; forkedSessionFile: string } | null> {\n if (!opts.sessionFile || !existsSync(opts.sessionFile)) return null;\n if (!opts.shouldCompact) {\n console.log('[conversation-compaction] Skipping compact (shouldCompact=false)');\n return null;\n }\n // Background AI gate: low-cost mode (or the summaryFork toggle) skips\n // automatic LLM compaction before respawn.\n if (!isBackgroundFeatureEnabled('summaryFork')) return null;\n\n const tokens = await estimateContextTokens(opts.sessionFile);\n console.log(`[conversation-compaction] Compacting before respawn (shouldCompact=true, tokens=${tokens})`);\n const result = await compactConversationNative(opts.sessionFile);\n return { forkedSessionId: result.forkedSessionId, forkedSessionFile: result.forkedSessionFile };\n}\n\nexport async function buildCompactionRuntimeInfo(model: string): Promise<{ command: string; exports: string }> {\n return {\n command: await getAgentRuntimeBaseCommand(model),\n exports: await getProviderExportsForModel(model),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-compaction-CCqN4hWk.js","names":[],"sources":["../../src/dashboard/server/services/conversation-compaction.ts"],"sourcesContent":["import { Effect } from 'effect';\nimport { writeFile, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\n\nimport { findLastCompactBoundary } from './conversation-service.js';\nimport { generateSmartSummary } from '../../../lib/conversations/smart-compaction.js';\nimport { generateFallbackSummary } from '../../../lib/conversations/summary-fork.js';\nimport { loadConfigSync } from '../../../lib/config-yaml.js';\nimport { getAgentRuntimeBaseCommand, getProviderExportsForModel } from '../../../lib/agents.js';\nimport { getEventStore } from '../event-store.js';\nimport { isBackgroundFeatureEnabled } from '../../../lib/background-ai/features.js';\n\nconst activeCompactions = new Set<string>();\nexport function isCompacting(sessionFile: string): boolean {\n return activeCompactions.has(sessionFile);\n}\n\nexport interface NativeCompactionResult {\n summary: string;\n tokensBefore: number;\n boundaryUuid: string;\n model: string;\n forkedSessionId: string;\n forkedSessionFile: string;\n}\n\nexport interface MaybeCompactBeforeRespawnOptions {\n sessionFile: string | null | undefined;\n cwd: string;\n shouldCompact: boolean;\n}\n\nexport function getConversationCompactionSettings() {\n const { config } = loadConfigSync();\n return {\n model: config.conversations.compactionModel,\n manualCompactMode: config.conversations.manualCompactMode,\n richCompaction: config.conversations.richCompaction,\n };\n}\n\nexport function shouldInterceptManualCompact(message: string): boolean {\n const trimmed = message.trim();\n if (trimmed !== '/compact') return false;\n return getConversationCompactionSettings().manualCompactMode === 'overdeck-native';\n}\n\nexport async function estimateContextTokens(sessionFile: string | null | undefined): Promise<number> {\n if (!sessionFile || !existsSync(sessionFile)) return 0;\n try {\n const content = await readFile(sessionFile, 'utf-8');\n const lines = content.split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (!line) continue;\n try {\n const entry = JSON.parse(line);\n const usage = entry?.message?.usage ?? entry?.usage;\n if (usage && typeof usage.input_tokens === 'number') {\n const total = (usage.input_tokens ?? 0)\n + (usage.cache_creation_input_tokens ?? 0)\n + (usage.cache_read_input_tokens ?? 0);\n if (total > 0) return total;\n }\n } catch {\n // Skip malformed line\n }\n }\n } catch (err) {\n console.warn(`[conversation-compaction] estimateContextTokens failed for ${sessionFile}:`, err);\n }\n return 0;\n}\n\nfunction buildContinuationSummary(summary: string, model: string): string {\n return [\n 'This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.',\n '',\n summary,\n '',\n `Overdeck native compaction model: ${model}`,\n '',\n 'Continue from this summary without redoing already-completed work.',\n ].join('\\n');\n}\n\nexport async function compactConversationNative(sessionFile: string, conversationName?: string): Promise<NativeCompactionResult> {\n if (!existsSync(sessionFile)) {\n throw new Error(`Session file not found: ${sessionFile}`);\n }\n activeCompactions.add(sessionFile);\n if (conversationName) {\n getEventStore().emitOnly({ type: 'conversation.compacting_changed', timestamp: new Date().toISOString(), payload: { conversationName, compacting: true } });\n }\n try {\n return await doCompact(sessionFile);\n } finally {\n activeCompactions.delete(sessionFile);\n if (conversationName) {\n getEventStore().emitOnly({ type: 'conversation.compacting_changed', timestamp: new Date().toISOString(), payload: { conversationName, compacting: false } });\n }\n }\n}\n\nasync function doCompact(sessionFile: string): Promise<NativeCompactionResult> {\n\n const settings = getConversationCompactionSettings();\n const tokensBefore = await estimateContextTokens(sessionFile);\n\n let summary: string;\n try {\n const result = await Effect.runPromise(generateSmartSummary({\n jsonlPath: sessionFile,\n model: settings.model,\n richMode: settings.richCompaction,\n mode: 'fork',\n }));\n summary = result.summary;\n } catch (error) {\n console.warn(`[conversation-compaction] Smart summary failed, falling back to heuristic:`, error);\n summary = await Effect.runPromise(generateFallbackSummary(sessionFile));\n }\n\n const continuation = buildContinuationSummary(summary, settings.model);\n const boundaryUuid = randomUUID();\n const timestamp = new Date().toISOString();\n const boundaryOffset = await findLastCompactBoundary(sessionFile);\n\n const entries = [\n JSON.stringify({\n parentUuid: null,\n isSidechain: false,\n type: 'system',\n subtype: 'compact_boundary',\n content: 'Conversation compacted',\n isMeta: false,\n timestamp,\n uuid: boundaryUuid,\n level: 'info',\n compactMetadata: {\n trigger: 'overdeck-native',\n preTokens: tokensBefore,\n model: settings.model,\n previousBoundaryOffset: boundaryOffset,\n },\n }),\n JSON.stringify({\n parentUuid: boundaryUuid,\n isSidechain: false,\n type: 'user',\n message: {\n role: 'user',\n content: continuation,\n },\n isVisibleInTranscriptOnly: true,\n isCompactSummary: true,\n uuid: randomUUID(),\n timestamp,\n }),\n ];\n\n const forkedSessionId = randomUUID();\n const forkedSessionFile = join(dirname(sessionFile), `${forkedSessionId}.jsonl`);\n await writeFile(forkedSessionFile, `${entries.join('\\n')}\\n`, 'utf-8');\n\n return {\n summary: continuation,\n tokensBefore,\n boundaryUuid,\n model: settings.model,\n forkedSessionId,\n forkedSessionFile,\n };\n}\n\nexport async function maybeCompactBeforeRespawn(\n opts: MaybeCompactBeforeRespawnOptions,\n): Promise<{ forkedSessionId: string; forkedSessionFile: string } | null> {\n if (!opts.sessionFile || !existsSync(opts.sessionFile)) return null;\n if (!opts.shouldCompact) {\n console.log('[conversation-compaction] Skipping compact (shouldCompact=false)');\n return null;\n }\n // Background AI gate: low-cost mode (or the summaryFork toggle) skips\n // automatic LLM compaction before respawn.\n if (!isBackgroundFeatureEnabled('summaryFork')) return null;\n\n const tokens = await estimateContextTokens(opts.sessionFile);\n console.log(`[conversation-compaction] Compacting before respawn (shouldCompact=true, tokens=${tokens})`);\n const result = await compactConversationNative(opts.sessionFile);\n return { forkedSessionId: result.forkedSessionId, forkedSessionFile: result.forkedSessionFile };\n}\n\nexport async function buildCompactionRuntimeInfo(model: string): Promise<{ command: string; exports: string }> {\n return {\n command: await getAgentRuntimeBaseCommand(model),\n exports: await getProviderExportsForModel(model),\n };\n}\n"],"mappings":"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"}
|
package/dist/dashboard/{conversation-compaction-Ba5aZdrb.js → conversation-compaction-CL5Ti4j4.js}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as init_conversation_compaction, c as shouldInterceptManualCompact, i as getConversationCompactionSettings, n as compactConversationNative, o as isCompacting, r as estimateContextTokens, s as maybeCompactBeforeRespawn, t as buildCompactionRuntimeInfo } from "./conversation-compaction-
|
|
1
|
+
import { a as init_conversation_compaction, c as shouldInterceptManualCompact, i as getConversationCompactionSettings, n as compactConversationNative, o as isCompacting, r as estimateContextTokens, s as maybeCompactBeforeRespawn, t as buildCompactionRuntimeInfo } from "./conversation-compaction-CCqN4hWk.js";
|
|
2
2
|
init_conversation_compaction();
|
|
3
3
|
export { buildCompactionRuntimeInfo, compactConversationNative, estimateContextTokens, getConversationCompactionSettings, isCompacting, maybeCompactBeforeRespawn, shouldInterceptManualCompact };
|