@overdeck/desktop 0.45.22 → 0.45.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DOA0KgXx.js} +5 -5
- package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BBu6DSNm.js} +6 -6
- package/server/{agent-gc-Dj2gncak.js → agent-gc-BV1q_2EV.js} +4 -4
- package/server/agent-state-Bg0lhqwj.js +3 -0
- package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-CnzFKSAQ.js} +1 -1
- package/server/{agent-state-service-DistflNn.js → agent-state-service-HoK8U4jW.js} +5 -5
- package/server/{agents-DXdHmRTC.js → agents-B4Bjbkfv.js} +4 -4
- package/server/agents-FlIgQ3ql.js +3 -0
- package/server/{archive-planning-BvDuWNMo.js → archive-planning-DYrYojxl.js} +30 -6
- package/server/{archive-planning-Cp_DC1j-.js → archive-planning-zkJb3BeM.js} +1 -1
- package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-C-xy7Z5v.js} +2 -2
- package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-GtG71X8H.js} +3 -3
- package/server/{behavior-CGj16clS.js → behavior-B_-4EKF3.js} +2 -2
- package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-DWdW7vUm.js} +2 -2
- package/server/{build-info-NU3KbXYw.js → build-info-BT096lEl.js} +3 -3
- package/server/{build-info-BRpqQvNd.js → build-info-DgTqZkL5.js} +1 -1
- package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-B7Bt29J0.js} +1 -1
- package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-DDqcGyu8.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-BJum14fs.js → checkpoints-C-AXLfYT.js} +2 -2
- package/server/{checkpoints-B5jFNi2G.js → checkpoints-CpgCjAlN.js} +1 -1
- package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-C8wdRnN1.js} +1 -1
- package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-but-_qGY.js} +2 -2
- package/server/{claude-permissions-nSFKH78M.js → claude-permissions-H_5wHQZQ.js} +2 -2
- package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-BTENVmYf.js} +1 -1
- package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CbSz0Dvb.js} +2 -2
- package/server/cli-BsVIHwzC.js +3 -0
- package/server/{cli-CbKNkFE5.js → cli-vBeXbPrq.js} +9 -9
- package/server/{cliproxy-Brf_5MuG.js → cliproxy-Bgb2XCqi.js} +2 -2
- package/server/{cliproxy-bONZDBbC.js → cliproxy-DW0V86F8.js} +1 -1
- package/server/{close-issue-CxReRxIc.js → close-issue-Dn_4c4G8.js} +5 -5
- package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CWpY2uBw.js} +1 -1
- package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-hANY_ehE.js} +9 -9
- package/server/codex-Dg7Is5yb.js +3 -0
- package/server/{codex-CbmztVcc.js → codex-TmSi-yTv.js} +27 -8
- package/server/{codex-parser-jl8AeAmB.js → codex-parser-C4gSH-IR.js} +2 -2
- package/server/{config-q4Gvd8dq.js → config-CCvjQf27.js} +2 -2
- package/server/{config-BJKocXKd.js → config-DUIhMN_T.js} +1 -1
- package/server/{config-DeTsoZdR.js → config-DjLOdbgT.js} +2 -2
- package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DvyMuOle.js} +55 -186
- package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BSJkNTdp.js} +1 -1
- package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-CmrYpa47.js} +3 -3
- package/server/{context-layers-DlQKkHH2.js → context-layers-B3Nt58jl.js} +2 -2
- package/server/{context-layers-15gDOk20.js → context-layers-ZYFcWiyc.js} +3 -3
- package/server/{control-settings-D_odMIaC.js → control-settings-aP1ANIlI.js} +4 -4
- package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CNbTLB86.js} +8 -8
- package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-DiG5zWQq.js} +1 -1
- package/server/{conversation-service-C3avRVEr.js → conversation-service-Du-MTNpJ.js} +6 -6
- package/server/{conversation-service-Dq33SYEj.js → conversation-service-Up7FEzIC.js} +1 -1
- package/server/{conversations-H9if0bCQ.js → conversations-6mPANqvL.js} +1 -1
- package/server/{conversations-bYpM9-kZ.js → conversations-DbOs1e9Q.js} +4 -4
- package/server/{cost-wH46-WsJ.js → cost-CW4WSe72.js} +3 -3
- package/server/{cost-Codk1pc2.js → cost-Ca0YTWDw.js} +18 -2
- package/server/{cost-sync-D_cre6WM.js → cost-sync-C0VdGme1.js} +3 -3
- package/server/{dag-CJpgf9A3.js → dag-CdOjJVDT.js} +9 -9
- package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-CT-IypG3.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-B8HbQdqU.js → deacon-DYSEJb48.js} +3 -3
- package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-Bjg8U4Y9.js} +3 -3
- package/server/{deacon-CkT_kznS.js → deacon-pRnyD5w9.js} +266 -577
- package/server/deacon-swarm-9jRLS5Ke.js +2 -0
- package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-DftYRDo8.js} +17 -17
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-Bjsho_ha.js} +136 -19
- package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-CM6W1-c6.js} +1 -1
- package/server/{deploy-window-wDf4UgHt.js → deploy-window-DeP_OIRk.js} +77 -10
- package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-BpMoHlkR.js} +2 -2
- package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-CtUgrVKW.js} +3 -3
- package/server/dist-Bd3vn0Hw.js +3 -0
- package/server/{dist-D-Ed5yVw.js → dist-DyRx4cI7.js} +1 -1
- package/server/{docker-BCZ89M9X.js → docker-BK7HIcBj.js} +2 -2
- package/server/{dod-DbJLYcHv.js → dod-BrSfUHm0.js} +1 -1
- package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-DRqaAkBR.js} +1 -1
- package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DseivYEy.js} +4 -4
- package/server/{esm-shims-dTeNdq7X.js → esm-shims-CbI3BVkl.js} +1 -1
- package/server/{event-store-CpBGsO6_.js → event-store-Cr5PQwFC.js} +1 -1
- package/server/{event-store-TnWdydfB.js → event-store-tdiY5eDZ.js} +3 -3
- package/server/{events-DSUdR-04.js → events-CC1dgUpx.js} +3 -3
- package/server/{events-Dsuv6qyB.js → events-CvvGK6LT.js} +1 -1
- package/server/{factory-BMrK4TrE.js → factory-CynerjXO.js} +50 -13
- package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-B0pmAz0a.js} +4 -4
- package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-_wUBRD3J.js} +2 -2
- package/server/{features-Bc-Bmiye.js → features-Dhxz-wLc.js} +2 -2
- package/server/{feedback-target-DZ-iAnAa.js → feedback-target-CPS15Vte.js} +7 -7
- package/server/{feedback-target-DS6NUuSs.js → feedback-target-iygZwmMc.js} +1 -1
- package/server/{feedback-writer-BXP6g75N.js → feedback-writer-C9b6ccN1.js} +6 -5
- package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-qmiMbqTZ.js} +1 -1
- package/server/{flywheel-Ctr5uuvo.js → flywheel-DMCUzDWg.js} +1 -1
- package/server/{flywheel-COR0mbRI.js → flywheel-DSSpWmqF.js} +13 -13
- package/server/{flywheel-6WHU4O7A.js → flywheel-DcBkQvgE.js} +14 -14
- package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-C-6zRLvM.js} +1 -1
- package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-DxbQKE1d.js} +8 -8
- package/server/forge-B-ZWyTRm.js +2 -0
- package/server/{forge-B1S_KZv4.js → forge-Ch9gCFod.js} +2 -2
- package/server/{from-DpwQ-sc3.js → from-CJ_aH5jD.js} +1 -1
- package/server/{fts-db-DmAcuCkV.js → fts-db-CKgg0VKg.js} +2 -2
- package/server/{fts-operations-7d_RkmWp.js → fts-operations-BrL_VTRr.js} +2 -2
- package/server/{git-utils-Cc3FHDKd.js → git-utils-BVa07a4a.js} +2 -2
- package/server/{git-utils-CsKGnzFA.js → git-utils-Dry_Ka_D.js} +1 -1
- package/server/{github-app-CDPtGF7J.js → github-app-CMBdIFBQ.js} +11 -3
- package/server/{github-app-CU14oYzP.js → github-app-CPfoFAdV.js} +1 -1
- package/server/{github-client-XjTJbBm7.js → github-client--XVlDpwM.js} +2 -2
- package/server/{github-client-CwBZZ3t7.js → github-client-B4QsdE-X.js} +1 -1
- package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-BRbDW-qk.js} +2 -2
- package/server/{harness-binary-B2CTcD84.js → harness-binary-CVio2m-u.js} +1 -1
- package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-qHJBhy3Z.js} +4 -4
- package/server/{health-events-DREeevle.js → health-events-C9B8y1Hm.js} +2 -2
- package/server/{health-events-C1whmd58.js → health-events-CpfvuVmm.js} +1 -1
- package/server/{hooks-yxRsjk-z.js → hooks-DUXw8A0-.js} +2 -2
- package/server/{hooks-B-HItBiS.js → hooks-ltecuFqZ.js} +1 -1
- package/server/{hume-Dz_OymXE.js → hume-BEq0bUDg.js} +2 -2
- package/server/hume-B_DbflNM.js +3 -0
- package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-D7w9t3fE.js} +1 -1
- package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-w1ISSlhs.js} +2 -2
- package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-aQ1IxeI3.js} +2 -2
- package/server/{infra-D4iNWMA5.js → infra-CzaSOgul.js} +4 -4
- package/server/{injection-D7T75Pye.js → injection-DZ0PfYa4.js} +7 -7
- package/server/{injection-BVNa4MQW.js → injection-oNZeoDhL.js} +1 -1
- package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-DJKLWcVT.js} +12 -12
- package/server/inspect-agent-ch-F-5Ci.js +2 -0
- package/server/{internal-token-CXsfxslp.js → internal-token-Bb4XeV2x.js} +2 -2
- package/server/{internal-token-C9DdEOKY.js → internal-token-DXdfprGr.js} +1 -1
- package/server/{io-DQR9PMgS.js → io-B3_AHDfr.js} +160 -184
- package/server/{issue-closed-DtmJM0D0.js → issue-closed-zhdvQicO.js} +7 -7
- package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-CreaCkjW.js} +22 -22
- package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-Dy4vd0Oa.js} +1 -1
- package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-B5ushCvE.js} +8 -8
- package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-DabvBWUp.js} +1 -1
- package/server/{issues-pDW9VUNz.js → issues-B6ToV6x1.js} +2 -2
- package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-Dhflo1SH.js} +3 -3
- package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-BKPJm4Hv.js} +3 -3
- package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-DdWbHEBu.js} +4 -4
- package/server/{launcher-generator-COgR2By1.js → launcher-generator-CHVm7bGT.js} +10 -9
- package/server/{layers-Cp1To4L8.js → layers-DzxSTGNA.js} +2 -2
- package/server/lifecycle-DfeyBDwA.js +121 -0
- package/server/lifecycle-io-Bsnr2K4F.js +3 -0
- package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-D8iNBcux.js} +37 -37
- package/server/{lifecycle-CtPDcZ9u.js → lifecycle-sycO16hj.js} +6 -6
- package/server/{linear-client-DsFkIxee.js → linear-client-D4zqMnX7.js} +2 -2
- package/server/{linear-client-YwZMDIwQ.js → linear-client-DqhDQO9k.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-C1t-bspg.js → merge-C_ZEhbqI.js} +3 -3
- package/server/{merge-BwsyNRJV.js → merge-DK23JEdS.js} +1 -1
- package/server/{merge-agent-B-SnXOoc.js → merge-agent-BQM3a8z5.js} +1 -1
- package/server/{merge-agent-DDiIjzk-.js → merge-agent-XrB80vfT.js} +28 -28
- package/server/{merge-batch-Byt-QnEl.js → merge-batch-Bwoyr8Je.js} +1 -1
- package/server/{merge-blockers-BYjeXrVN.js → merge-blockers-BsFjGrQ8.js} +2 -2
- package/server/merge-ops-DlB1IM0Y.js +2 -0
- package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-C1KIVr0s.js} +2 -2
- package/server/{merge-set-DiISXcC-.js → merge-set-DLz0MkGT.js} +3 -3
- package/server/{merge-set-6LEglm6o.js → merge-set-DnSYdBEp.js} +1 -1
- package/server/{merge-sync-Do8_q32h.js → merge-sync-DZ9dojJn.js} +2 -2
- package/server/{merge-sync-B95_4in_.js → merge-sync-SSv3E-pl.js} +1 -1
- package/server/{merge-train-CKana8EH.js → merge-train-DxDfBTjr.js} +3 -3
- package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-CyYQUksx.js} +4 -4
- package/server/{merge-verification-CqnUzGEK.js → merge-verification-CSizH3HY.js} +4 -4
- package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-Dt8YPN5S.js} +2 -2
- package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Cx3K0hHi.js} +11 -8
- package/server/node_modules/.package-lock.json +1 -1
- package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-BTkDrl4R.js} +1 -1
- package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-neK8dHQk.js} +15 -13
- package/server/package-lock.json +2 -2
- package/server/package.json +1 -1
- package/server/{pan-dir-DOcf6ug3.js → pan-dir-DeVUgwA7.js} +78 -58
- package/server/{paths-DooHpt9p.js → paths-_zEts6wc.js} +2 -2
- package/server/{pickup-CaskQ7j6.js → pickup-Dd0Znxxy.js} +1 -1
- package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-0HaEGDlH.js} +186 -67
- package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-6iCJplFZ.js} +1 -1
- package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-D0ykk59O.js} +2 -2
- package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-2sK1apsO.js} +2 -2
- package/server/projects-9SkRpES9.js +3 -0
- package/server/{prompts-EvhMeeHG.js → prompts-Dp4Tpk39.js} +2 -2
- package/server/{providers-DNSQqy2V.js → providers-DKkBXhxU.js} +1 -1
- package/server/{providers-BDDPULlp.js → providers-DV7ec8l7.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-CltymLRg.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-D2f6pjgA.js} +1 -1
- package/server/public/assets/{dist-Bio7THQU.js → dist-BWR4qFiV.js} +1 -1
- package/server/public/assets/{dist-DukGS2YZ.js → dist-DEmlBBNQ.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-DnfiViPK.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-B8Wrmj9H.js} +1 -1
- package/server/public/assets/index-CUr1xv8w.css +1 -0
- package/server/public/assets/{index-Bwejq-5s.js → index-CsSuZQBI.js} +145 -144
- package/server/public/assets/{linear-qUWmMZ-c.js → linear-C9zFQpkX.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-lR8H7Yjd.js} +1 -1
- package/server/public/assets/{prod-C8VtLuWC.js → prod-B1jCQihw.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-CVQ2guem.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-eD1RB4gm.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-ChEC6dQn.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-By_BteaL.js → pull-requests--Ib2jTgy.js} +1 -1
- package/server/{pull-requests-8z2N1UOV.js → pull-requests-CXIhdCYD.js} +13 -11
- package/server/{queries-ZABd5aXP.js → queries-6d7Cdtm7.js} +693 -104
- package/server/{rally-i_goYmiA.js → rally-B708-nZn.js} +3 -3
- package/server/{rally-api-DqKqIMNR.js → rally-api-nY0ZANw3.js} +2 -2
- package/server/{rally-api-xHazRk0d.js → rally-api-yjQ0TfHd.js} +1 -1
- package/server/{rally-client-COYz1vYR.js → rally-client-B1EJhfV0.js} +4 -4
- package/server/{rally-client-CGWEHaPd.js → rally-client-CULK2XAY.js} +1 -1
- package/server/rally-njs_mJrt.js +3 -0
- package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-MWnqdLCJ.js} +1 -1
- package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-N3BTkmX_.js} +1 -1
- package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-Dp4eLkt4.js} +6 -6
- package/server/{rebuild-stack-CKjJAI8L.js → rebuild-stack-kA7XngID.js} +1 -1
- package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-uWbZfjms.js} +6 -6
- package/server/record-t6V-3Dcj.js +3 -0
- package/server/{record-update-D3N6WMFR.js → record-update-DACtKh6_.js} +1 -1
- package/server/record-update-Dq0t2uBG.js +310 -0
- package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BJtIQuag.js} +2 -2
- package/server/{release-engine-DMINVN8S.js → release-engine-DZpmGGzb.js} +5 -5
- package/server/{release-set-DeUSOEHy.js → release-set-hnXd_kga.js} +3 -3
- package/server/{remote-Dr5kGYSZ.js → remote-4tiENDaI.js} +3 -3
- package/server/{remote-b-c5bOce.js → remote-Br-ZWVIP.js} +3 -3
- package/server/{remote-agents-D6O_zETW.js → remote-agents-CRCg1L4H.js} +1 -1
- package/server/{remote-agents-Ct_WOyke.js → remote-agents-nmty1mLu.js} +6 -6
- package/server/{remote-completion-Dca3hAaa.js → remote-completion-BbWNd10K.js} +12 -12
- package/server/resume-CcKqnTvE.js +3 -0
- package/server/{review-agent-CCum8sGe.js → review-agent-DJRO8EG8.js} +1 -1
- package/server/{review-agent-CThvgK2r.js → review-agent-sKkE1FEL.js} +22 -22
- package/server/{review-artifacts-CXywD0F2.js → review-artifacts-BLbSC4ke.js} +5 -5
- package/server/{review-context-OYfKUprb.js → review-context-BgX3lcCx.js} +8 -8
- package/server/{review-status-DFRjDFef.js → review-status-A7quS5KJ.js} +54 -21
- package/server/review-status-C6n6-9f_.js +3 -0
- package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-tbOn_A_u.js} +3 -3
- package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BhSQ0d0l.js} +2 -2
- package/server/{review-status-sync-D60PJWNL.js → review-status-sync-To3-iS-N.js} +1 -1
- package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-C1Kg8n7t.js} +1 -1
- package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CTRNtzXO.js} +6 -6
- package/server/{rollup-CZ02qgxk.js → rollup-B53Y81xK.js} +1 -1
- package/server/{rollup-SyuF09e4.js → rollup-WA0VD-Rr.js} +8 -8
- package/server/{scanner-Br0Z5S6R.js → scanner-D2743cp8.js} +11 -7
- package/server/{sequence-io-fxU0DlwW.js → sequence-io-Cg0zYj_E.js} +4 -4
- package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-BGY8gjg-.js} +5 -5
- package/server/server.js +941 -752
- package/server/{service-Bagb90KZ.js → service-DCpB_SGd.js} +53 -53
- package/server/{session-fork-BqQxd-V6.js → session-fork-BQ8_6H32.js} +2 -2
- package/server/{session-history-XdS0JKp3.js → session-history-CVZDpS3c.js} +4 -4
- package/server/{settings-BNbocWOg.js → settings-BZ5m1UCl.js} +3 -3
- package/server/settings-D0OSwos5.js +2 -0
- package/server/{settings-uLc6DEYI.js → settings-ylxwqwQG.js} +2 -2
- package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BlxG6Xye.js} +2 -2
- package/server/{shadow-state-CbvsN3qG.js → shadow-state-C2_epgx2.js} +1 -1
- package/server/{shadow-state-C_NkP-sa.js → shadow-state-Dh-HzF2J.js} +2 -2
- package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-4bvjn9b3.js} +2 -2
- package/server/{ship-log-__QtAFXG.js → ship-log-ClSMIzZX.js} +1 -1
- package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CHIxLr_d.js} +1 -1
- package/server/{smart-compaction-CLZOWin1.js → smart-compaction-r4pHQBIr.js} +7 -7
- package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DWAorh2B.js} +22 -21
- package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-KC_UduxD.js} +1 -1
- package/server/{specialist-completion-CqmduO92.js → specialist-completion-BXhav38U.js} +1 -1
- package/server/{specialist-context-CJ-QjFR-.js → specialist-context-DtrYvGJ-.js} +5 -5
- package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-C45ouoZ6.js} +2 -2
- package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-DJ3RzKxW.js} +3 -3
- package/server/{specialists-D0gGXMZx.js → specialists-D5fRZXmN.js} +1 -1
- package/server/specialists-DVj0hvaL.js +3 -0
- package/server/{specialists-CwZHb5cb.js → specialists-DyFeedjn.js} +66 -76
- package/server/{specialists-Bg9v4z3F.js → specialists-JVO00bs7.js} +340 -214
- package/server/specs-nN45DG2X.js +3 -0
- package/server/{src-BMMoA_ba.js → src-CG9mCkP6.js} +6 -6
- package/server/{src-Bqdtd6po.js → src-CMTQGyCK.js} +3 -3
- package/server/{src-k039WVYY.js → src-U7_kTPEE.js} +2 -1
- package/server/{stack-health-Bd06frFn.js → stack-health-Df0YEZKa.js} +1 -1
- package/server/{stack-health-C-ifC7b0.js → stack-health-puygdaMd.js} +2 -2
- package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-BbFwCTb0.js} +4 -4
- package/server/{staleness-BID1BKdr.js → staleness-Bpy41ngS.js} +15 -3
- package/server/{staleness-_Tr-GwdA.js → staleness-Cbl_w4Bw.js} +1 -1
- package/server/{state-home-CONQvZR0.js → state-home-CIGjwNfJ.js} +96 -44
- package/server/{state-migrate-BeBW0KXA.js → state-migrate-Dkzaxvny.js} +12 -3
- package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-CzEov_fq.js} +26 -22
- package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-sY_MHHgQ.js} +1 -1
- package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-BH66lhm7.js} +3 -3
- package/server/{summary-fork-agEMsPSo.js → summary-fork-D8bXjCr7.js} +2 -2
- package/server/{summary-fork-bX6ax6X7.js → summary-fork-DHhJIsAL.js} +8 -8
- package/server/{supervisor-Ctt4eRYz.js → supervisor-BO-Zk_h-.js} +3 -3
- package/server/supervisor-BPy-o1A8.js +2 -0
- package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-CQ_fwUWF.js} +4 -4
- package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-Bza0ffAh.js} +2 -2
- package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-CEgauF4U.js} +15 -15
- package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-DXDt0Xa-.js} +7 -7
- package/server/{test-verdict-Cp5tljlJ.js → test-verdict-CmUBK5cT.js} +1 -1
- package/server/{test-verdict-D_-sXIz_.js → test-verdict-DFjjIHR5.js} +1 -1
- package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-BDtLOIlO.js} +2 -2
- package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-DL566HbH.js} +1 -1
- package/server/tmux-DoThH6aj.js +3 -0
- package/server/{tmux-L5LgvGLp.js → tmux-ftABRAmc.js} +76 -44
- package/server/{token-BkQLy4yS.js → token-CsOhvw42.js} +2 -2
- package/server/{token-util-DI8sGlmF.js → token-util-CTmczIfW.js} +1 -1
- package/server/token-util-DrHg8abn.js +3 -0
- package/server/{tracker-config-DdT-nUAM.js → tracker-config-B4itFzDo.js} +2 -2
- package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-BePq_oj-.js} +1 -1
- package/server/{tracker-utils-CawsPSS2.js → tracker-utils-tnxxqROg.js} +2 -2
- package/server/{traefik-connect-C6mJckNs.js → traefik-connect-m73vGebA.js} +1 -1
- package/server/{tunnel-IdK1iTHx.js → tunnel-B2vxjx_b.js} +3 -3
- package/server/{tunnel-BIFl98rc.js → tunnel-Cgj-IGIl.js} +1 -1
- package/server/{types-7-GnJn0t.js → types-BBNjPcqU.js} +1 -1
- package/server/{uat-train-j0cPeMSj.js → uat-train-CuEn0t9M.js} +28 -28
- package/server/{uat-train-0Ujk8GCv.js → uat-train-cKfM-_WW.js} +1 -1
- package/server/{validation-CabEISJT.js → validation-B5JxoPUS.js} +259 -9
- package/server/{validation-DcAgXTQp.js → validation-CIi6pnI2.js} +1 -1
- package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-BcnIbigL.js} +1 -1
- package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-C-lIHfUa.js} +1 -1
- package/server/{verification-runner-FiuAZ-H2.js → verification-runner-Br0S_Ous.js} +102 -37
- package/server/{verification-runner-DlJezzef.js → verification-runner-CDj4lD4t.js} +1 -1
- package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DKpNNW5i.js} +1 -1
- package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Yb2bd3Fq.js} +13 -13
- package/server/{workflows-BZNNYkGC.js → workflows-C9WmILql.js} +39 -77
- package/server/workflows-D90rMOya.js +2 -0
- package/server/{workspace-D9ppycdg.js → workspace-BVl4rihN.js} +3 -3
- package/server/{workspace-3IC-UkAi.js → workspace-DuUdndHe.js} +1 -1
- package/server/{workspace-config-Bigl_-Lk.js → workspace-config-cEGcO6UT.js} +1 -1
- package/server/{workspace-manager-B1WOfKvB.js → workspace-manager-ZTdJAy9M.js} +1 -1
- package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-hLUv3ADC.js} +22 -15
- package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-CskwzzhL.js} +2 -2
- package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-DNpMixRq.js} +1 -1
- package/server/{workspaces-CFPcL0vl.js → workspaces-hWvy9eKs.js} +275 -109
- package/sync-sources/agents/pan-inspect-agent.md +1 -1
- package/sync-sources/agents/pan-merge-agent.md +1 -1
- package/sync-sources/agents/pan-planning-agent.md +4 -4
- package/sync-sources/agents/pan-work-agent.md +1 -1
- package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
- package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
- package/sync-sources/hooks/record-cost-event.js +363 -71
- package/sync-sources/hooks/session-start-hook +7 -0
- package/sync-sources/hooks/work-agent-stop-hook +1 -1
- package/sync-sources/rules/per-bead-durability.md +1 -1
- package/sync-sources/rules/prd-authoring.md +1 -1
- package/sync-sources/skills/feature-work/SKILL.md +1 -1
- package/sync-sources/skills/pan/SKILL.md +2 -2
- package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
- package/sync-sources/skills/pan-approve/SKILL.md +1 -1
- package/sync-sources/skills/pan-close/SKILL.md +1 -1
- package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
- package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
- package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
- package/sync-sources/skills/pan-plan/SKILL.md +6 -6
- package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
- package/sync-sources/skills/pan-recap/SKILL.md +2 -2
- package/sync-sources/skills/pan-review/SKILL.md +1 -1
- package/sync-sources/skills/pan-start/SKILL.md +3 -3
- package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/sync-sources/skills/pan-task/SKILL.md +2 -2
- package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
- package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
- package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
- package/sync-sources/skills/plan/SKILL.md +11 -11
- package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
- package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
- package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
- package/server/agent-state-Co5Sy2Fw.js +0 -3
- package/server/agents-DyHKlq1I.js +0 -3
- package/server/cli-BRORS9qY.js +0 -3
- package/server/codex-DNyiQDKW.js +0 -3
- package/server/deacon-swarm-CV54eNmU.js +0 -2
- package/server/dist-j64RzSrQ.js +0 -3
- package/server/forge-B0_opi-V.js +0 -2
- package/server/hume-BmhvfVbV.js +0 -3
- package/server/inspect-agent-Dq0z1k3H.js +0 -2
- package/server/lifecycle-io-DmY2qwCn.js +0 -3
- package/server/merge-ops-DwWCkSgo.js +0 -2
- package/server/projects-BKkwpH6q.js +0 -3
- package/server/public/assets/index-Bdc4V9ba.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
- package/server/rally-OSJXdiHK.js +0 -3
- package/server/record-rwK-nKv_.js +0 -3
- package/server/record-update-Crz74r-6.js +0 -168
- package/server/resume-wZZsWtzz.js +0 -3
- package/server/review-status-Bnh-rdkY.js +0 -3
- package/server/settings-BlUsVaUc.js +0 -2
- package/server/specialists-Dqe6_HE5.js +0 -3
- package/server/specs-BhOKBzqk.js +0 -3
- package/server/supervisor-COVHrBTg.js +0 -2
- package/server/tmux-BAvtac_u.js +0 -3
- package/server/token-util-BArZLN6w.js +0 -3
- package/server/workflows-C4mR0Reb.js +0 -2
|
@@ -17,7 +17,7 @@ Merge specialist. Runs after review + test specialists pass and the human clicks
|
|
|
17
17
|
4. Re-run verification gates (typecheck, lint, test) after the rebase
|
|
18
18
|
5. Push the rebased branch
|
|
19
19
|
6. Run `gh pr merge --squash` to land the PR
|
|
20
|
-
7. Trigger `postMergeLifecycle` cleanup (Docker network/container cleanup,
|
|
20
|
+
7. Trigger `postMergeLifecycle` cleanup (Docker network/container cleanup, xBRIEF lifecycle completion, task-state finalization)
|
|
21
21
|
|
|
22
22
|
## Boundaries
|
|
23
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pan-planning-agent
|
|
3
|
-
description: Overdeck planning agent — researches the issue and writes the executable
|
|
3
|
+
description: Overdeck planning agent — researches the issue and writes the executable xBRIEF plan. Never writes implementation code.
|
|
4
4
|
model: sonnet
|
|
5
5
|
permissionMode: bypassPermissions
|
|
6
6
|
effort: high
|
|
@@ -13,9 +13,9 @@ Research-only agent that produces an executable plan for an issue. Never writes
|
|
|
13
13
|
## Outputs
|
|
14
14
|
|
|
15
15
|
1. **PRD draft** in `<projectRoot>/.pan/drafts/<ISSUE-ID>.md` if missing (markdown narrative)
|
|
16
|
-
2. **
|
|
16
|
+
2. **xBRIEF plan** in `.pan/spec.vbrief.json` (deliberate legacy-compatible workspace path; `plan-finalize` promotes it to canonical state)
|
|
17
17
|
3. **Continue context** in `.pan/continue.json` with decisions, hazards, and a clear `resumePoint` for the implementation agent
|
|
18
|
-
`pan plan-finalize` stamps the plan and writes the canonical spec to
|
|
18
|
+
`pan plan-finalize` stamps the plan and writes the canonical spec to `specs/<YYYY-MM-DD>-<ISSUE>-<slug>.xbrief.json` on `overdeck-state` with `plan.status: "proposed"`. Work agents read the immutable canonical spec through the read door — item/subItem status changes live in the workspace continue file's `statusOverrides` map, not in the spec itself.
|
|
19
19
|
|
|
20
20
|
## Process
|
|
21
21
|
|
|
@@ -34,4 +34,4 @@ Status is a JSON field, not a directory. `plan.status` advances `draft → propo
|
|
|
34
34
|
|
|
35
35
|
- No implementation code. No commits to feature files. The implementation agent does that.
|
|
36
36
|
- Caveman compression is disabled for this agent — narrative fields in continue.json must remain full prose so crash recovery and downstream specialists have the context they need.
|
|
37
|
-
- Planning ends at finalization; implementation agents claim and complete
|
|
37
|
+
- Planning ends at finalization; implementation agents claim and complete xBRIEF items through `pan task`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pan-work-agent
|
|
3
|
-
description: Autonomous Overdeck implementation agent — claims
|
|
3
|
+
description: Autonomous Overdeck implementation agent — claims xBRIEF items, writes code, commits per item, and signals completion via pan done.
|
|
4
4
|
model: sonnet
|
|
5
5
|
permissionMode: bypassPermissions
|
|
6
6
|
effort: high
|
|
@@ -191,7 +191,7 @@ If merge-agent can't complete:
|
|
|
191
191
|
cd ~/Projects/overdeck
|
|
192
192
|
git status
|
|
193
193
|
|
|
194
|
-
#
|
|
194
|
+
# Workspace `.overdeck/` runtime files are gitignored and should not be staged
|
|
195
195
|
# Other uncommitted changes need to be committed or stashed
|
|
196
196
|
```
|
|
197
197
|
|
|
@@ -25962,9 +25962,11 @@ function stateMigrationLockPath(projectKey) {
|
|
|
25962
25962
|
return join$1(getOverdeckHome(), "locks", "state-migration", `${projectKey}.lock`);
|
|
25963
25963
|
}
|
|
25964
25964
|
function isStateMigrationLocked(projectKey) {
|
|
25965
|
+
const path = stateMigrationLockPath(projectKey);
|
|
25966
|
+
mkdirSync$1(dirname$1(path), { recursive: true });
|
|
25965
25967
|
try {
|
|
25966
|
-
closeSync$1(openSync$1(
|
|
25967
|
-
rmSync(
|
|
25968
|
+
closeSync$1(openSync$1(path, "wx"));
|
|
25969
|
+
rmSync(path);
|
|
25968
25970
|
return false;
|
|
25969
25971
|
} catch {
|
|
25970
25972
|
return true;
|
|
@@ -26025,7 +26027,9 @@ async function isStatePlaneOnlyDiff(baseSha, tipSha, repoRoot) {
|
|
|
26025
26027
|
* sync-state-via-commit shape this helper produces is the substrate for that.
|
|
26026
26028
|
*/
|
|
26027
26029
|
const spawnerLayer = layer$4.pipe(provide$2(mergeAll(layer$2, layer)));
|
|
26030
|
+
const DEFAULT_STATE_GIT_TIMEOUT_MS = 3e4;
|
|
26028
26031
|
const DEFAULT_STATE_PUSH_TIMEOUT_MS = 3e4;
|
|
26032
|
+
const DEFAULT_STATE_FLUSH_TIMEOUT_MS = 6e4;
|
|
26029
26033
|
function parsePositiveInteger(value, fallback) {
|
|
26030
26034
|
if (!value) return fallback;
|
|
26031
26035
|
const parsed = Number(value);
|
|
@@ -26054,9 +26058,10 @@ function isAutoCommitExcludedPath(relativePath) {
|
|
|
26054
26058
|
return false;
|
|
26055
26059
|
}
|
|
26056
26060
|
const pending = /* @__PURE__ */ new Map();
|
|
26057
|
-
|
|
26061
|
+
const active = /* @__PURE__ */ new Map();
|
|
26062
|
+
const serializers = /* @__PURE__ */ new Map();
|
|
26058
26063
|
/** Run a git subcommand. Fails with GitError on non-zero exit. */
|
|
26059
|
-
function
|
|
26064
|
+
function runGitRaw(args, cwd) {
|
|
26060
26065
|
return gen(function* () {
|
|
26061
26066
|
const handle = yield* make$1("git", [...args], {
|
|
26062
26067
|
cwd,
|
|
@@ -26076,10 +26081,13 @@ function runGit(args, cwd) {
|
|
|
26076
26081
|
stderr: stderrBuf.toString("utf-8"),
|
|
26077
26082
|
exitCode
|
|
26078
26083
|
};
|
|
26079
|
-
}).pipe(scoped, provide(spawnerLayer)
|
|
26084
|
+
}).pipe(scoped, provide(spawnerLayer));
|
|
26085
|
+
}
|
|
26086
|
+
function runGit(args, cwd) {
|
|
26087
|
+
return runGitWithTimeout(args, cwd, parsePositiveInteger(process.env.OVERDECK_STATE_GIT_TIMEOUT_MS, DEFAULT_STATE_GIT_TIMEOUT_MS));
|
|
26080
26088
|
}
|
|
26081
26089
|
function runGitWithTimeout(args, cwd, timeoutMs) {
|
|
26082
|
-
return
|
|
26090
|
+
return runGitRaw(args, cwd).pipe(timeout(millis(timeoutMs)), catchCause((cause) => fail(causeToGitError(cause, args))));
|
|
26083
26091
|
}
|
|
26084
26092
|
function causeToGitError(cause, args) {
|
|
26085
26093
|
const squashed = squash(cause);
|
|
@@ -26139,31 +26147,120 @@ function queueAutoCommit(opts) {
|
|
|
26139
26147
|
});
|
|
26140
26148
|
}
|
|
26141
26149
|
/**
|
|
26142
|
-
* Force a flush of
|
|
26143
|
-
*
|
|
26150
|
+
* Force a flush of every pending or active commit that targets the same Git
|
|
26151
|
+
* checkout as `projectRoot`. Callers may pass either a logical project root or
|
|
26152
|
+
* the effective Git root; the Effect resolves only after every matching writer
|
|
26153
|
+
* has settled.
|
|
26144
26154
|
*/
|
|
26145
|
-
function flushAutoCommits(projectRoot) {
|
|
26146
|
-
return promise(() => flushPromise(projectRoot));
|
|
26155
|
+
function flushAutoCommits(projectRoot, signal) {
|
|
26156
|
+
return promise(() => flushPromise(projectRoot, signal));
|
|
26147
26157
|
}
|
|
26148
|
-
function flushPromise(projectRoot) {
|
|
26149
|
-
const
|
|
26150
|
-
|
|
26151
|
-
|
|
26152
|
-
|
|
26153
|
-
|
|
26154
|
-
|
|
26155
|
-
|
|
26158
|
+
function flushPromise(projectRoot, signal) {
|
|
26159
|
+
const gitRoot = pending.get(projectRoot)?.repoRoot ?? active.get(projectRoot)?.gitRoot ?? projectRoot;
|
|
26160
|
+
const matching = /* @__PURE__ */ new Set();
|
|
26161
|
+
for (const [queuedProjectRoot, batch] of pending) {
|
|
26162
|
+
if ((batch.repoRoot ?? queuedProjectRoot) !== gitRoot) continue;
|
|
26163
|
+
clearTimeout(batch.timer);
|
|
26164
|
+
const started = flushInner(queuedProjectRoot);
|
|
26165
|
+
if (started) matching.add(started);
|
|
26166
|
+
}
|
|
26167
|
+
for (const activeFlush of active.values()) if (activeFlush.gitRoot === gitRoot) matching.add(activeFlush);
|
|
26168
|
+
if (matching.size === 0) {
|
|
26169
|
+
signal?.throwIfAborted();
|
|
26170
|
+
return Promise.resolve({
|
|
26171
|
+
committed: false,
|
|
26172
|
+
reason: "no pending"
|
|
26173
|
+
});
|
|
26174
|
+
}
|
|
26175
|
+
return waitForFlushes(gitRoot, [...matching], signal);
|
|
26156
26176
|
}
|
|
26157
26177
|
function flushInner(projectRoot) {
|
|
26158
26178
|
const batch = pending.get(projectRoot);
|
|
26159
|
-
if (!batch) return
|
|
26160
|
-
committed: false,
|
|
26161
|
-
reason: "no pending"
|
|
26162
|
-
});
|
|
26179
|
+
if (!batch) return active.get(projectRoot);
|
|
26163
26180
|
pending.delete(projectRoot);
|
|
26164
|
-
|
|
26165
|
-
|
|
26166
|
-
|
|
26181
|
+
return startSerializedFlush(projectRoot, batch.repoRoot ?? projectRoot, doBoundedCommit(projectRoot, batch));
|
|
26182
|
+
}
|
|
26183
|
+
function startSerializedFlush(projectRoot, gitRoot, operation) {
|
|
26184
|
+
const prior = serializers.get(gitRoot) ?? Promise.resolve();
|
|
26185
|
+
const controller = new AbortController();
|
|
26186
|
+
const promise = prior.then(() => {
|
|
26187
|
+
controller.signal.throwIfAborted();
|
|
26188
|
+
return runPromise(operation, { signal: controller.signal });
|
|
26189
|
+
});
|
|
26190
|
+
const activeFlush = {
|
|
26191
|
+
controller,
|
|
26192
|
+
gitRoot,
|
|
26193
|
+
promise
|
|
26194
|
+
};
|
|
26195
|
+
active.set(projectRoot, activeFlush);
|
|
26196
|
+
const tail = promise.catch(() => void 0);
|
|
26197
|
+
serializers.set(gitRoot, tail);
|
|
26198
|
+
promise.then(() => clearActiveFlush(projectRoot, activeFlush, tail), () => clearActiveFlush(projectRoot, activeFlush, tail));
|
|
26199
|
+
return activeFlush;
|
|
26200
|
+
}
|
|
26201
|
+
async function waitForFlushes(gitRoot, activeFlushes, signal) {
|
|
26202
|
+
const completion = Promise.all(activeFlushes.map((flush) => flush.promise)).then(combineFlushResults);
|
|
26203
|
+
if (!signal) return completion;
|
|
26204
|
+
if (signal.aborted) {
|
|
26205
|
+
await abortAndSettleGitRoot(gitRoot, signal.reason);
|
|
26206
|
+
throw signal.reason;
|
|
26207
|
+
}
|
|
26208
|
+
return new Promise((resolve, reject) => {
|
|
26209
|
+
let completed = false;
|
|
26210
|
+
const onAbort = () => {
|
|
26211
|
+
if (completed) return;
|
|
26212
|
+
completed = true;
|
|
26213
|
+
signal.removeEventListener("abort", onAbort);
|
|
26214
|
+
abortAndSettleGitRoot(gitRoot, signal.reason).then(() => reject(signal.reason), reject);
|
|
26215
|
+
};
|
|
26216
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
26217
|
+
completion.then((result) => {
|
|
26218
|
+
if (completed) return;
|
|
26219
|
+
completed = true;
|
|
26220
|
+
signal.removeEventListener("abort", onAbort);
|
|
26221
|
+
resolve(result);
|
|
26222
|
+
}, (error) => {
|
|
26223
|
+
if (completed) return;
|
|
26224
|
+
completed = true;
|
|
26225
|
+
signal.removeEventListener("abort", onAbort);
|
|
26226
|
+
reject(error);
|
|
26227
|
+
});
|
|
26228
|
+
if (signal.aborted) onAbort();
|
|
26229
|
+
});
|
|
26230
|
+
}
|
|
26231
|
+
function combineFlushResults(results) {
|
|
26232
|
+
if (results.length === 1) return results[0];
|
|
26233
|
+
const combined = { committed: results.some((result) => result.committed) };
|
|
26234
|
+
const committed = results.filter((result) => result.committed);
|
|
26235
|
+
if (committed.some((result) => result.pushed === false)) combined.pushed = false;
|
|
26236
|
+
else if (committed.length > 0 && committed.every((result) => result.pushed === true)) combined.pushed = true;
|
|
26237
|
+
if (results.some((result) => result.errored)) combined.errored = true;
|
|
26238
|
+
const reasons = results.flatMap((result) => result.reason ? [result.reason] : []);
|
|
26239
|
+
if (reasons.length > 0) combined.reason = reasons.join("; ");
|
|
26240
|
+
return combined;
|
|
26241
|
+
}
|
|
26242
|
+
async function abortAndSettleGitRoot(gitRoot, reason) {
|
|
26243
|
+
const matching = [...active.values()].filter((flush) => flush.gitRoot === gitRoot);
|
|
26244
|
+
for (const flush of matching) flush.controller.abort(reason);
|
|
26245
|
+
await Promise.allSettled(matching.map((flush) => flush.promise));
|
|
26246
|
+
}
|
|
26247
|
+
function clearActiveFlush(projectRoot, activeFlush, tail) {
|
|
26248
|
+
if (active.get(projectRoot) === activeFlush) active.delete(projectRoot);
|
|
26249
|
+
if (serializers.get(activeFlush.gitRoot) === tail) serializers.delete(activeFlush.gitRoot);
|
|
26250
|
+
}
|
|
26251
|
+
function doBoundedCommit(projectRoot, batch) {
|
|
26252
|
+
return boundStateFlush(doCommit(projectRoot, batch));
|
|
26253
|
+
}
|
|
26254
|
+
function boundStateFlush(operation, timeoutMs = parsePositiveInteger(process.env.OVERDECK_STATE_FLUSH_TIMEOUT_MS, DEFAULT_STATE_FLUSH_TIMEOUT_MS)) {
|
|
26255
|
+
return operation.pipe(timeout(millis(timeoutMs)), catchCause((cause) => {
|
|
26256
|
+
const reason = `state writer timed out after ${timeoutMs / 1e3}s: ${String(squash(cause))}`;
|
|
26257
|
+
console.warn(`[pan-dir/auto-commit] ${reason}`);
|
|
26258
|
+
return succeed({
|
|
26259
|
+
committed: false,
|
|
26260
|
+
errored: true,
|
|
26261
|
+
reason
|
|
26262
|
+
});
|
|
26263
|
+
}));
|
|
26167
26264
|
}
|
|
26168
26265
|
function doCommit(projectRoot, batch) {
|
|
26169
26266
|
const gitRoot = batch.repoRoot ?? projectRoot;
|
|
@@ -26443,10 +26540,10 @@ function getIssueRecordBasePath(project, issueId) {
|
|
|
26443
26540
|
*/
|
|
26444
26541
|
function preserveCloseOutSync(path, record) {
|
|
26445
26542
|
const incoming = record.closeOut;
|
|
26446
|
-
if (!(!incoming || Object.keys(incoming.usage?.byStage ?? {}).length === 0 && Object.keys(incoming.usage?.totals ?? {}).length === 0 && (incoming.merges ?? []).length === 0) || !existsSync$1(path)) return record;
|
|
26543
|
+
if (!(!incoming || Object.keys(incoming.usage?.byStage ?? {}).length === 0 && Object.keys(incoming.usage?.totals ?? {}).length === 0 && (incoming.merges ?? []).length === 0 && !incoming.dodGate) || !existsSync$1(path)) return record;
|
|
26447
26544
|
try {
|
|
26448
26545
|
const disk = JSON.parse(readFileSync$1(path, "utf-8")).closeOut;
|
|
26449
|
-
if (disk && (Object.keys(disk.usage?.byStage ?? {}).length > 0 || Object.keys(disk.usage?.totals ?? {}).length > 0 || (disk.merges ?? []).length > 0)) {
|
|
26546
|
+
if (disk && (Object.keys(disk.usage?.byStage ?? {}).length > 0 || Object.keys(disk.usage?.totals ?? {}).length > 0 || (disk.merges ?? []).length > 0 || Boolean(disk.dodGate))) {
|
|
26450
26547
|
console.warn(`[record] Preserving populated closeOut for ${record.issueId} — incoming write carried an empty closeOut (PAN-2466 guard)`);
|
|
26451
26548
|
return {
|
|
26452
26549
|
...record,
|
|
@@ -26490,7 +26587,7 @@ function preserveCorruptRecordSync(path) {
|
|
|
26490
26587
|
* renamed file parses as JSON. A mid-write crash can no longer truncate the
|
|
26491
26588
|
* record in place (rename is atomic); a write that somehow produces unparseable
|
|
26492
26589
|
* bytes throws instead of leaving a corrupt record for readers to silently
|
|
26493
|
-
* fabricate over. Modeled on writePlanFileAtomic (src/lib/
|
|
26590
|
+
* fabricate over. Modeled on writePlanFileAtomic (src/lib/xbrief/dag-cli.ts:101).
|
|
26494
26591
|
*/
|
|
26495
26592
|
function writeRecordFileAtomicSync(path, record) {
|
|
26496
26593
|
preserveCorruptRecordSync(path);
|
|
@@ -32263,7 +32360,196 @@ function getOverdeckDatabasePath() {
|
|
|
32263
32360
|
return join$1(getOverdeckHome(), "overdeck.db");
|
|
32264
32361
|
}
|
|
32265
32362
|
//#endregion
|
|
32363
|
+
//#region ../../src/lib/overdeck/schema-audit.ts
|
|
32364
|
+
const EMPTY_TOP_UP_EXPECTATIONS = {
|
|
32365
|
+
columns: [],
|
|
32366
|
+
indexes: []
|
|
32367
|
+
};
|
|
32368
|
+
function splitTableDefinitions(body) {
|
|
32369
|
+
const definitions = [];
|
|
32370
|
+
let start = 0;
|
|
32371
|
+
let depth = 0;
|
|
32372
|
+
let quote = null;
|
|
32373
|
+
for (let index = 0; index < body.length; index += 1) {
|
|
32374
|
+
const character = body[index];
|
|
32375
|
+
if (quote) {
|
|
32376
|
+
if (character === quote && body[index - 1] !== "\\") quote = null;
|
|
32377
|
+
continue;
|
|
32378
|
+
}
|
|
32379
|
+
if (character === "'" || character === "\"" || character === "`") {
|
|
32380
|
+
quote = character;
|
|
32381
|
+
continue;
|
|
32382
|
+
}
|
|
32383
|
+
if (character === "(") depth += 1;
|
|
32384
|
+
if (character === ")") depth -= 1;
|
|
32385
|
+
if (character === "," && depth === 0) {
|
|
32386
|
+
definitions.push(body.slice(start, index).trim());
|
|
32387
|
+
start = index + 1;
|
|
32388
|
+
}
|
|
32389
|
+
}
|
|
32390
|
+
definitions.push(body.slice(start).trim());
|
|
32391
|
+
return definitions.filter(Boolean);
|
|
32392
|
+
}
|
|
32393
|
+
function parseOverdeckSchemaExpectations(migrationSql, topUps = EMPTY_TOP_UP_EXPECTATIONS) {
|
|
32394
|
+
const tables = /* @__PURE__ */ new Map();
|
|
32395
|
+
const indexes = /* @__PURE__ */ new Set();
|
|
32396
|
+
for (const statement of migrationSql.split("--> statement-breakpoint")) {
|
|
32397
|
+
const trimmed = statement.trim();
|
|
32398
|
+
const tableMatch = trimmed.match(/^CREATE TABLE(?: IF NOT EXISTS)?\s+`([^`]+)`\s*\(([\s\S]*)\)\s*;?$/i);
|
|
32399
|
+
if (tableMatch) {
|
|
32400
|
+
const [, tableName, body] = tableMatch;
|
|
32401
|
+
const columns = /* @__PURE__ */ new Set();
|
|
32402
|
+
for (const definition of splitTableDefinitions(body)) {
|
|
32403
|
+
const columnMatch = definition.match(/^`([^`]+)`\s+/);
|
|
32404
|
+
if (columnMatch) columns.add(columnMatch[1]);
|
|
32405
|
+
}
|
|
32406
|
+
tables.set(tableName, columns);
|
|
32407
|
+
continue;
|
|
32408
|
+
}
|
|
32409
|
+
const indexMatch = trimmed.match(/^CREATE (?:UNIQUE )?INDEX(?: IF NOT EXISTS)?\s+`([^`]+)`\s+ON\s+`[^`]+`/i);
|
|
32410
|
+
if (indexMatch) indexes.add(indexMatch[1]);
|
|
32411
|
+
}
|
|
32412
|
+
for (const { table, column } of topUps.columns) {
|
|
32413
|
+
const columns = tables.get(table) ?? /* @__PURE__ */ new Set();
|
|
32414
|
+
columns.add(column);
|
|
32415
|
+
tables.set(table, columns);
|
|
32416
|
+
}
|
|
32417
|
+
for (const index of topUps.indexes) indexes.add(index);
|
|
32418
|
+
return {
|
|
32419
|
+
tables,
|
|
32420
|
+
indexes
|
|
32421
|
+
};
|
|
32422
|
+
}
|
|
32423
|
+
function readOverdeckSchemaExpectationsSync(topUps = EMPTY_TOP_UP_EXPECTATIONS) {
|
|
32424
|
+
return parseOverdeckSchemaExpectations(readFileSync$1(OVERDECK_MIGRATION_PATH, "utf8"), topUps);
|
|
32425
|
+
}
|
|
32426
|
+
function quoteIdentifier(identifier) {
|
|
32427
|
+
return `"${identifier.replaceAll("\"", "\"\"")}"`;
|
|
32428
|
+
}
|
|
32429
|
+
function auditOverdeckSchemaSync(db, topUps = EMPTY_TOP_UP_EXPECTATIONS) {
|
|
32430
|
+
const expected = readOverdeckSchemaExpectationsSync(topUps);
|
|
32431
|
+
const artifacts = db.prepare(`
|
|
32432
|
+
SELECT type, name
|
|
32433
|
+
FROM sqlite_master
|
|
32434
|
+
WHERE type IN ('table', 'index')
|
|
32435
|
+
AND name NOT LIKE 'sqlite_%'
|
|
32436
|
+
`).all();
|
|
32437
|
+
const actualTables = new Set(artifacts.filter((artifact) => artifact.type === "table").map((artifact) => artifact.name));
|
|
32438
|
+
const actualIndexes = new Set(artifacts.filter((artifact) => artifact.type === "index").map((artifact) => artifact.name));
|
|
32439
|
+
const missingTables = [...expected.tables.keys()].filter((table) => !actualTables.has(table)).sort();
|
|
32440
|
+
const missingIndexes = [...expected.indexes].filter((index) => !actualIndexes.has(index)).sort();
|
|
32441
|
+
const missingColumns = [];
|
|
32442
|
+
for (const [table, expectedColumns] of expected.tables) {
|
|
32443
|
+
if (!actualTables.has(table)) continue;
|
|
32444
|
+
const actualColumns = new Set(db.prepare(`PRAGMA table_info(${quoteIdentifier(table)})`).all().map((column) => column.name));
|
|
32445
|
+
for (const column of expectedColumns) if (!actualColumns.has(column)) missingColumns.push({
|
|
32446
|
+
table,
|
|
32447
|
+
column
|
|
32448
|
+
});
|
|
32449
|
+
}
|
|
32450
|
+
missingColumns.sort((left, right) => left.table === right.table ? left.column.localeCompare(right.column) : left.table.localeCompare(right.table));
|
|
32451
|
+
return {
|
|
32452
|
+
missingTables,
|
|
32453
|
+
missingIndexes,
|
|
32454
|
+
missingColumns
|
|
32455
|
+
};
|
|
32456
|
+
}
|
|
32457
|
+
//#endregion
|
|
32266
32458
|
//#region ../../src/lib/overdeck/infra.ts
|
|
32459
|
+
/**
|
|
32460
|
+
* Runtime infrastructure for the canonical overdeck.db cache.
|
|
32461
|
+
* Schema top-ups tolerate idempotency errors, log unexpected failures without
|
|
32462
|
+
* blocking boot, and getOverdeckDatabaseSync follows them with a report-only
|
|
32463
|
+
* schema audit that warns about drift without mutating the database.
|
|
32464
|
+
*/
|
|
32465
|
+
const OVERDECK_SCHEMA_TOP_UP_EXPECTATIONS = {
|
|
32466
|
+
columns: [
|
|
32467
|
+
{
|
|
32468
|
+
table: "discovered_sessions",
|
|
32469
|
+
column: "harness"
|
|
32470
|
+
},
|
|
32471
|
+
{
|
|
32472
|
+
table: "flywheel_substrate_bugs",
|
|
32473
|
+
column: "affected_criteria"
|
|
32474
|
+
},
|
|
32475
|
+
{
|
|
32476
|
+
table: "review_status",
|
|
32477
|
+
column: "release_status"
|
|
32478
|
+
},
|
|
32479
|
+
{
|
|
32480
|
+
table: "review_status",
|
|
32481
|
+
column: "release_notes"
|
|
32482
|
+
},
|
|
32483
|
+
{
|
|
32484
|
+
table: "review_status",
|
|
32485
|
+
column: "inspect_owner_session"
|
|
32486
|
+
},
|
|
32487
|
+
{
|
|
32488
|
+
table: "review_status",
|
|
32489
|
+
column: "strike_ready_head"
|
|
32490
|
+
},
|
|
32491
|
+
{
|
|
32492
|
+
table: "review_status",
|
|
32493
|
+
column: "strike_ready_at"
|
|
32494
|
+
},
|
|
32495
|
+
{
|
|
32496
|
+
table: "review_status",
|
|
32497
|
+
column: "strike_landing_state"
|
|
32498
|
+
},
|
|
32499
|
+
{
|
|
32500
|
+
table: "review_status",
|
|
32501
|
+
column: "strike_recovery_count"
|
|
32502
|
+
},
|
|
32503
|
+
{
|
|
32504
|
+
table: "review_status",
|
|
32505
|
+
column: "strike_landing_attempts"
|
|
32506
|
+
},
|
|
32507
|
+
{
|
|
32508
|
+
table: "agents",
|
|
32509
|
+
column: "yielded_by_scheduler"
|
|
32510
|
+
},
|
|
32511
|
+
{
|
|
32512
|
+
table: "agents",
|
|
32513
|
+
column: "review_discovery_pending"
|
|
32514
|
+
},
|
|
32515
|
+
{
|
|
32516
|
+
table: "agents",
|
|
32517
|
+
column: "review_context_manifest_path"
|
|
32518
|
+
},
|
|
32519
|
+
{
|
|
32520
|
+
table: "agents",
|
|
32521
|
+
column: "review_discovery_ready_at"
|
|
32522
|
+
},
|
|
32523
|
+
{
|
|
32524
|
+
table: "agents",
|
|
32525
|
+
column: "review_convoy_forked_at"
|
|
32526
|
+
},
|
|
32527
|
+
{
|
|
32528
|
+
table: "agents",
|
|
32529
|
+
column: "review_fork_cache_checked"
|
|
32530
|
+
},
|
|
32531
|
+
{
|
|
32532
|
+
table: "agents",
|
|
32533
|
+
column: "review_forked_from_parent"
|
|
32534
|
+
},
|
|
32535
|
+
{
|
|
32536
|
+
table: "agents",
|
|
32537
|
+
column: "yielded_at"
|
|
32538
|
+
},
|
|
32539
|
+
{
|
|
32540
|
+
table: "agents",
|
|
32541
|
+
column: "last_yield_resume_at"
|
|
32542
|
+
}
|
|
32543
|
+
],
|
|
32544
|
+
indexes: [
|
|
32545
|
+
"cost_session_id_idx",
|
|
32546
|
+
"idx_cost_agent_id",
|
|
32547
|
+
"idx_cost_issue_upper",
|
|
32548
|
+
"release_sets_project_idx",
|
|
32549
|
+
"release_set_components_issue_component_idx",
|
|
32550
|
+
"release_set_components_issue_order_idx"
|
|
32551
|
+
]
|
|
32552
|
+
};
|
|
32267
32553
|
const overdeckEvents = sqliteTable("events", {
|
|
32268
32554
|
sequence: integer("sequence").primaryKey({ autoIncrement: true }),
|
|
32269
32555
|
type: text("type").notNull(),
|
|
@@ -32282,56 +32568,50 @@ function runOverdeckMigrationSync(db) {
|
|
|
32282
32568
|
}
|
|
32283
32569
|
}
|
|
32284
32570
|
/**
|
|
32571
|
+
* Run one idempotent schema top-up without hiding unexpected SQLite failures.
|
|
32572
|
+
* Only duplicate DDL is silent; missing tables and other failures are logged so
|
|
32573
|
+
* schema drift remains observable without blocking later top-ups or startup.
|
|
32574
|
+
*/
|
|
32575
|
+
function runSchemaTopUp(db, statement) {
|
|
32576
|
+
try {
|
|
32577
|
+
db.exec(statement);
|
|
32578
|
+
} catch (error) {
|
|
32579
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
32580
|
+
if (/duplicate column name|already exists/i.test(message)) return;
|
|
32581
|
+
console.error(`[schema] top-up failed: ${statement}\n${message}`);
|
|
32582
|
+
}
|
|
32583
|
+
}
|
|
32584
|
+
/**
|
|
32285
32585
|
* Idempotent schema top-ups for databases created before a field/index existed
|
|
32286
32586
|
* in the init migration. The init migration only runs on a fresh database.
|
|
32287
32587
|
* PAN-2220: the conversation ledger-cost query joins cost_events on session_id;
|
|
32288
32588
|
* without this index SQLite builds an automatic index on every query (~76ms → 7ms).
|
|
32289
32589
|
*/
|
|
32290
32590
|
function ensureRuntimeIndexesSync(db) {
|
|
32291
|
-
|
|
32292
|
-
|
|
32293
|
-
|
|
32294
|
-
|
|
32295
|
-
|
|
32296
|
-
|
|
32297
|
-
|
|
32298
|
-
|
|
32299
|
-
|
|
32300
|
-
|
|
32301
|
-
db.exec("ALTER TABLE `review_status` ADD COLUMN `release_notes` text");
|
|
32302
|
-
} catch {}
|
|
32591
|
+
runSchemaTopUp(db, "ALTER TABLE `discovered_sessions` ADD COLUMN `harness` text");
|
|
32592
|
+
runSchemaTopUp(db, "UPDATE `discovered_sessions` SET `harness` = 'claude-code' WHERE `harness` IS NULL");
|
|
32593
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `release_status` text");
|
|
32594
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `release_notes` text");
|
|
32595
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `inspect_owner_session` text");
|
|
32596
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_ready_head` text");
|
|
32597
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_ready_at` integer");
|
|
32598
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_landing_state` text");
|
|
32599
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_recovery_count` integer DEFAULT 0");
|
|
32600
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_landing_attempts` text");
|
|
32303
32601
|
ensureReleaseSetTablesSync(db);
|
|
32304
|
-
|
|
32305
|
-
|
|
32306
|
-
|
|
32307
|
-
db
|
|
32308
|
-
|
|
32309
|
-
|
|
32310
|
-
|
|
32311
|
-
|
|
32312
|
-
|
|
32313
|
-
|
|
32314
|
-
|
|
32315
|
-
|
|
32316
|
-
|
|
32317
|
-
try {
|
|
32318
|
-
db.exec("ALTER TABLE `agents` ADD COLUMN `review_discovery_ready_at` integer");
|
|
32319
|
-
} catch {}
|
|
32320
|
-
try {
|
|
32321
|
-
db.exec("ALTER TABLE `agents` ADD COLUMN `review_convoy_forked_at` integer");
|
|
32322
|
-
} catch {}
|
|
32323
|
-
try {
|
|
32324
|
-
db.exec("ALTER TABLE `agents` ADD COLUMN `review_fork_cache_checked` integer");
|
|
32325
|
-
} catch {}
|
|
32326
|
-
try {
|
|
32327
|
-
db.exec("ALTER TABLE `agents` ADD COLUMN `review_forked_from_parent` integer");
|
|
32328
|
-
} catch {}
|
|
32329
|
-
try {
|
|
32330
|
-
db.exec("ALTER TABLE `agents` ADD COLUMN `yielded_at` integer");
|
|
32331
|
-
} catch {}
|
|
32332
|
-
try {
|
|
32333
|
-
db.exec("ALTER TABLE `agents` ADD COLUMN `last_yield_resume_at` integer");
|
|
32334
|
-
} catch {}
|
|
32602
|
+
runSchemaTopUp(db, "ALTER TABLE `flywheel_substrate_bugs` ADD COLUMN `affected_criteria` text");
|
|
32603
|
+
runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `cost_session_id_idx` ON `cost_events` (`session_id`)");
|
|
32604
|
+
runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `idx_cost_agent_id` ON `cost_events` (`agent_id`, `ts`)");
|
|
32605
|
+
runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `idx_cost_issue_upper` ON `cost_events` (UPPER(`issue_id`))");
|
|
32606
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `yielded_by_scheduler` integer");
|
|
32607
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_discovery_pending` integer");
|
|
32608
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_context_manifest_path` text");
|
|
32609
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_discovery_ready_at` integer");
|
|
32610
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_convoy_forked_at` integer");
|
|
32611
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_fork_cache_checked` integer");
|
|
32612
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_forked_from_parent` integer");
|
|
32613
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `yielded_at` integer");
|
|
32614
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `last_yield_resume_at` integer");
|
|
32335
32615
|
}
|
|
32336
32616
|
/**
|
|
32337
32617
|
* Idempotent schema top-up for release set tables (PAN-399). Existing overdeck.db
|
|
@@ -32373,6 +32653,17 @@ function ensureReleaseSetTablesSync(db) {
|
|
|
32373
32653
|
db.exec("CREATE UNIQUE INDEX IF NOT EXISTS `release_set_components_issue_component_idx` ON `release_set_components` (`issue_id`,`component_key`)");
|
|
32374
32654
|
db.exec("CREATE INDEX IF NOT EXISTS `release_set_components_issue_order_idx` ON `release_set_components` (`issue_id`,`release_order`,`component_key`)");
|
|
32375
32655
|
}
|
|
32656
|
+
function warnSchemaDriftSync(db) {
|
|
32657
|
+
try {
|
|
32658
|
+
const report = auditOverdeckSchemaSync(db, OVERDECK_SCHEMA_TOP_UP_EXPECTATIONS);
|
|
32659
|
+
for (const table of report.missingTables) console.warn(`[schema-audit] missing table: ${table}`);
|
|
32660
|
+
for (const index of report.missingIndexes) console.warn(`[schema-audit] missing index: ${index}`);
|
|
32661
|
+
for (const { table, column } of report.missingColumns) console.warn(`[schema-audit] missing column: ${table}.${column}`);
|
|
32662
|
+
} catch (error) {
|
|
32663
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
32664
|
+
console.warn(`[schema-audit] audit failed: ${message}`);
|
|
32665
|
+
}
|
|
32666
|
+
}
|
|
32376
32667
|
function getOverdeckDatabaseSync(dbPath = getOverdeckDatabasePath()) {
|
|
32377
32668
|
if (overdeckDbSync?.path === dbPath) return overdeckDbSync.db;
|
|
32378
32669
|
if (overdeckDbSync) {
|
|
@@ -32387,6 +32678,7 @@ function getOverdeckDatabaseSync(dbPath = getOverdeckDatabasePath()) {
|
|
|
32387
32678
|
db.pragma("synchronous = NORMAL");
|
|
32388
32679
|
runOverdeckMigrationSync(db);
|
|
32389
32680
|
ensureRuntimeIndexesSync(db);
|
|
32681
|
+
warnSchemaDriftSync(db);
|
|
32390
32682
|
overdeckDbSync = {
|
|
32391
32683
|
path: dbPath,
|
|
32392
32684
|
db
|
|
@@ -21,9 +21,11 @@ INPUT=$(cat 2>/dev/null || echo '{}')
|
|
|
21
21
|
|
|
22
22
|
CLAUDE_SESSION_ID=""
|
|
23
23
|
MODEL=""
|
|
24
|
+
SOURCE=""
|
|
24
25
|
if command -v jq >/dev/null 2>&1; then
|
|
25
26
|
CLAUDE_SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // ""' 2>/dev/null)
|
|
26
27
|
MODEL=$(echo "$INPUT" | jq -r '.model // .model_name // ""' 2>/dev/null)
|
|
28
|
+
SOURCE=$(echo "$INPUT" | jq -r '.source // ""' 2>/dev/null)
|
|
27
29
|
fi
|
|
28
30
|
[ -z "$MODEL" ] && MODEL="${ANTHROPIC_MODEL:-}"
|
|
29
31
|
|
|
@@ -77,4 +79,9 @@ if command -v jq >/dev/null 2>&1; then
|
|
|
77
79
|
fi
|
|
78
80
|
fi
|
|
79
81
|
|
|
82
|
+
if [ "$SOURCE" = "compact" ] && command -v jq >/dev/null 2>&1; then
|
|
83
|
+
jq -n --arg context "The preceding compaction summary may quote harness-only instructions requiring text-only output or forbidding tools. Those instructions applied only to Claude Code's summarization turn and are no longer active. Resume the latest actual user task and use tools normally." \
|
|
84
|
+
'{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext: $context}}'
|
|
85
|
+
fi
|
|
86
|
+
|
|
80
87
|
exit 0
|
|
@@ -356,7 +356,7 @@ $OUTPUT
|
|
|
356
356
|
</terminal_output>
|
|
357
357
|
|
|
358
358
|
Decide FORGOT_COMPLETION if ANY of these are true AND the transcript does NOT show a 'pan work done' Bash invocation in the tail:
|
|
359
|
-
- the agent wrote a summary/wrap-up message ('all tests pass', 'implementation complete', 'all
|
|
359
|
+
- the agent wrote a summary/wrap-up message ('all tests pass', 'implementation complete', 'all xBRIEF tasks closed', 'ready for review', etc.) and then stopped
|
|
360
360
|
- the agent committed + pushed and the last message is a status summary instead of a pan-work-done command
|
|
361
361
|
|
|
362
362
|
Decide STILL_WORKING only if the tail clearly shows an in-progress task (mid-edit, running tests, reading files) with no wrap-up summary.
|
|
@@ -3,7 +3,7 @@ scope: universal
|
|
|
3
3
|
---
|
|
4
4
|
### Push every managed-work item before completing it
|
|
5
5
|
|
|
6
|
-
For an Overdeck-managed work issue, commit exactly one
|
|
6
|
+
For an Overdeck-managed work issue, commit exactly one xBRIEF item at a time and immediately
|
|
7
7
|
push the feature branch before running `pan task done`. This invariant applies on
|
|
8
8
|
local and remote machines and overrides generic project Git profiles; an unpushed item
|
|
9
9
|
can be lost before Overdeck advances durable pipeline state.
|
|
@@ -16,7 +16,7 @@ Author every plan so it can be executed without re-research or judgment calls:
|
|
|
16
16
|
paths, and before/after code. The downstream executor is a model, not a senior
|
|
17
17
|
engineer who can fill gaps from taste and tribal knowledge — so the *how* must be
|
|
18
18
|
on the page. Specifying the implementation is required, not scope-creep. (`pan
|
|
19
|
-
plan` then mechanically lowers the PRD into
|
|
19
|
+
plan` then mechanically lowers the PRD into an xBRIEF; the richer the PRD, the
|
|
20
20
|
less the planner has to invent.)
|
|
21
21
|
|
|
22
22
|
- **Glossary first.** Define every term of art the document uses before using it.
|