@overdeck/desktop 0.45.22 → 0.45.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drizzle/overdeck/0000_overdeck_init.sql +2 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DDCnXF58.js} +5 -5
- package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BVwW4qRn.js} +6 -6
- package/server/{agent-gc-Dj2gncak.js → agent-gc-CHcnvonI.js} +4 -4
- package/server/agent-state-Bc3tzUC8.js +3 -0
- package/server/{agent-state-service-DistflNn.js → agent-state-service-BsgWxZuB.js} +5 -5
- package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-D5UGKIJL.js} +1 -1
- package/server/{agents-DXdHmRTC.js → agents-EbI0zCJl.js} +4 -4
- package/server/agents-wi9NWzs2.js +3 -0
- package/server/{archive-planning-Cp_DC1j-.js → archive-planning-BZDgzoEj.js} +1 -1
- package/server/{archive-planning-BvDuWNMo.js → archive-planning-Du25Jtst.js} +30 -6
- package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-CbEDfCDu.js} +2 -2
- package/server/assemble-J2ZZ2C15.js +339 -0
- package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-2R2jog7n.js} +3 -3
- package/server/{behavior-CGj16clS.js → behavior-B3exJ42O.js} +2 -2
- package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-D1wzUIWv.js} +2 -2
- package/server/{build-info-BRpqQvNd.js → build-info-CZk_TITh.js} +1 -1
- package/server/{build-info-NU3KbXYw.js → build-info-Ie_D0_BT.js} +3 -3
- package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-BI1Wxoku.js} +2 -2
- package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-DwbQoqrC.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-B5jFNi2G.js → checkpoints-BJIs5QIA.js} +1 -1
- package/server/{checkpoints-BJum14fs.js → checkpoints-CQB1h765.js} +2 -2
- package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-8Ngo8TpT.js} +1 -1
- package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-D8GXF3_s.js} +2 -2
- package/server/{claude-permissions-nSFKH78M.js → claude-permissions-DNWEVV6z.js} +2 -2
- package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CEdaqpWI.js} +2 -2
- package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-DWy-Bb4Y.js} +1 -1
- package/server/cli-B86rejVV.js +3 -0
- package/server/{cli-CbKNkFE5.js → cli-RoOx5DUf.js} +9 -9
- package/server/{cliproxy-Brf_5MuG.js → cliproxy-C8a1vtTU.js} +2 -2
- package/server/{cliproxy-bONZDBbC.js → cliproxy-fHfIeiGd.js} +1 -1
- package/server/{close-issue-CxReRxIc.js → close-issue-DoOifFIK.js} +5 -5
- package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-Bk3SU4RC.js} +9 -9
- package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CktPXo8m.js} +1 -1
- package/server/{codex-CbmztVcc.js → codex-BZXGhUVB.js} +27 -8
- package/server/codex-GcHuUF-k.js +3 -0
- package/server/{codex-parser-jl8AeAmB.js → codex-parser-CFZ1_1Jl.js} +2 -2
- package/server/{config-q4Gvd8dq.js → config-BZ0sHTju.js} +2 -2
- package/server/{config-DeTsoZdR.js → config-CKxYiCmX.js} +2 -2
- package/server/{config-BJKocXKd.js → config-DzV30TOm.js} +1 -1
- package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DySPNmKN.js} +77 -194
- package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-BaCVrH-N.js} +3 -3
- package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BhAY7TUd.js} +1 -1
- package/server/context-layers-BrPmE__h.js +4 -0
- package/server/context-layers-igZ4FI4_.js +37 -0
- package/server/{control-settings-D_odMIaC.js → control-settings-BQp7_4uD.js} +4 -4
- package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CgrR8YYp.js} +8 -8
- package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-eQB5CkOe.js} +1 -1
- package/server/{conversation-service-Dq33SYEj.js → conversation-service-BLd3MYsG.js} +1 -1
- package/server/{conversation-service-C3avRVEr.js → conversation-service-DPJ71F33.js} +329 -19
- package/server/{conversations-bYpM9-kZ.js → conversations-6AfUfbwc.js} +5 -5
- package/server/{conversations-H9if0bCQ.js → conversations-CAsJF9kh.js} +1 -1
- package/server/{cost-Codk1pc2.js → cost-B2ddP6wq.js} +18 -2
- package/server/{cost-wH46-WsJ.js → cost-R-m6Yi-W.js} +3 -3
- package/server/{cost-sync-D_cre6WM.js → cost-sync-BsN6ER0n.js} +3 -3
- package/server/{dag-CJpgf9A3.js → dag-B1ucnjDU.js} +9 -9
- package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-BXqeWVSf.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-CkT_kznS.js → deacon-CU_cAYSR.js} +406 -607
- package/server/{deacon-B8HbQdqU.js → deacon-kiQrb4ZT.js} +3 -3
- package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-6wVqAaqz.js} +3 -3
- package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-BXZZ1Z2-.js} +17 -17
- package/server/deacon-swarm-C-GwfjJy.js +2 -0
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-AiFoP8dw.js} +136 -19
- package/server/{deploy-window-wDf4UgHt.js → deploy-window-C3F-tihF.js} +77 -10
- package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-DkZraDyj.js} +1 -1
- package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-bcOWqdQE.js} +2 -2
- package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-_d6XhyND.js} +3 -3
- package/server/dist-Bzy0y69j.js +3 -0
- package/server/{dist-D-Ed5yVw.js → dist-Cb_0uvpS.js} +1 -1
- package/server/{docker-BCZ89M9X.js → docker-DcMTFTUC.js} +2 -2
- package/server/{dod-DbJLYcHv.js → dod-C6n9RV3G.js} +1 -1
- package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-BZgOhRo7.js} +1 -1
- package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DNi-ono3.js} +4 -4
- package/server/{esm-shims-dTeNdq7X.js → esm-shims-OSHAYaS1.js} +1 -1
- package/server/{event-store-TnWdydfB.js → event-store-CQL6NeqB.js} +3 -3
- package/server/{event-store-CpBGsO6_.js → event-store-EV2cMiXj.js} +1 -1
- package/server/{events-Dsuv6qyB.js → events-BTdrdEq8.js} +1 -1
- package/server/{events-DSUdR-04.js → events-DTfAe4My.js} +3 -3
- package/server/{factory-BMrK4TrE.js → factory-CFibJuaw.js} +50 -13
- package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-DKZFMbFt.js} +4 -4
- package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-BdPuLcBX.js} +2 -2
- package/server/{features-Bc-Bmiye.js → features-ez2271oH.js} +2 -2
- package/server/{feedback-target-DZ-iAnAa.js → feedback-target-7mqqwrX6.js} +7 -7
- package/server/{feedback-target-DS6NUuSs.js → feedback-target-CoFDHiM8.js} +1 -1
- package/server/{feedback-writer-BXP6g75N.js → feedback-writer-CY5L1lB7.js} +6 -5
- package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-D3a22RCd.js} +1 -1
- package/server/flywheel-DHrgCphM.js +1084 -0
- package/server/flywheel-DzGtWnJ1.js +477 -0
- package/server/flywheel-SVF02Jpq.js +2 -0
- package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-UU0tiUld.js} +10 -9
- package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-UUcsCDb6.js} +1 -1
- package/server/{forge-B1S_KZv4.js → forge-CNFnyqps.js} +2 -2
- package/server/forge-DXnS_YFH.js +2 -0
- package/server/{from-DpwQ-sc3.js → from-kNxT0bZC.js} +1 -1
- package/server/{fts-db-DmAcuCkV.js → fts-db-CE46vDkZ.js} +2 -2
- package/server/{fts-operations-7d_RkmWp.js → fts-operations-CqY6zl-i.js} +2 -2
- package/server/{git-utils-Cc3FHDKd.js → git-utils-CRw2zLPC.js} +68 -3
- package/server/git-utils-D0_yhCgF.js +3 -0
- package/server/{github-app-CDPtGF7J.js → github-app-C3QrAUd0.js} +27 -8
- package/server/{github-app-CU14oYzP.js → github-app-ClZ2lk8D.js} +1 -1
- package/server/{github-client-XjTJbBm7.js → github-client-BnIsSrEN.js} +2 -2
- package/server/{github-client-CwBZZ3t7.js → github-client-DfQYVUaw.js} +1 -1
- package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-D16NGsSO.js} +2 -2
- package/server/{harness-binary-B2CTcD84.js → harness-binary-DPUi-Pv8.js} +32 -6
- package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-3lNZkyT4.js} +18 -9
- package/server/{health-events-DREeevle.js → health-events-BBcTYQKU.js} +2 -2
- package/server/{health-events-C1whmd58.js → health-events-BDOHby5Q.js} +1 -1
- package/server/{hooks-yxRsjk-z.js → hooks-CKZgXlJb.js} +2 -2
- package/server/{hooks-B-HItBiS.js → hooks-DPVX1rwQ.js} +1 -1
- package/server/{hume-Dz_OymXE.js → hume-Cz8igP9E.js} +2 -2
- package/server/hume-ccTf4wTX.js +3 -0
- package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-CuLF0j2H.js} +1 -1
- package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-DDIRwxUY.js} +2 -2
- package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-CAAkqPLu.js} +2 -2
- package/server/{infra-D4iNWMA5.js → infra-BEqFxlJc.js} +14 -4
- package/server/{injection-D7T75Pye.js → injection-C8aiVJrF.js} +191 -183
- package/server/{injection-BVNa4MQW.js → injection-CPUIqNhI.js} +1 -1
- package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-BLuJ1AkT.js} +137 -81
- package/server/inspect-agent-Brtz0URj.js +2 -0
- package/server/{internal-token-C9DdEOKY.js → internal-token-BrcU6qfe.js} +1 -1
- package/server/{internal-token-CXsfxslp.js → internal-token-s0-oKybJ.js} +2 -2
- package/server/{io-DQR9PMgS.js → io-C9kF1wtJ.js} +160 -184
- package/server/{issue-closed-DtmJM0D0.js → issue-closed-CDJk4pIp.js} +7 -7
- package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-B8sZHVHh.js} +1 -1
- package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-ojZAzDBP.js} +22 -22
- package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-BvJ09SaR.js} +1 -1
- package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-Yx5DdmVJ.js} +8 -8
- package/server/{issues-pDW9VUNz.js → issues-BMmP_77e.js} +2 -2
- package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-BXSlHwEh.js} +3 -3
- package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-B0UJwnv5.js} +3 -3
- package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-B4iOAjlC.js} +4 -4
- package/server/{launcher-generator-COgR2By1.js → launcher-generator-BBWG_SiS.js} +105 -10
- package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-BREGpnLk.js} +37 -37
- package/server/lifecycle-io-DPo7x11I.js +3 -0
- package/server/{lifecycle-CtPDcZ9u.js → lifecycle-xmBfK2GJ.js} +6 -6
- package/server/lifecycle-yPd___5E.js +121 -0
- package/server/{linear-client-DsFkIxee.js → linear-client-BsuUvkdA.js} +2 -2
- package/server/{linear-client-YwZMDIwQ.js → linear-client-CTskEeT_.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-BwsyNRJV.js → merge-B1DiziGU.js} +1 -1
- package/server/{merge-C1t-bspg.js → merge-CefQNAnq.js} +3 -3
- package/server/{merge-agent-DDiIjzk-.js → merge-agent-4WOWlSYA.js} +28 -28
- package/server/{merge-agent-B-SnXOoc.js → merge-agent-CKkgIBPB.js} +1 -1
- package/server/{merge-batch-Byt-QnEl.js → merge-batch-ClFn2T-y.js} +1 -1
- package/server/merge-ops-CR44oU9-.js +2 -0
- package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-BfaTyXsw.js} +2 -2
- package/server/merge-set-DJ8-UErs.js +83 -0
- package/server/{merge-set-6LEglm6o.js → merge-set-bUqbm3yc.js} +1 -1
- package/server/{merge-sync-B95_4in_.js → merge-sync-BJYeOODr.js} +1 -1
- package/server/{merge-sync-Do8_q32h.js → merge-sync-VPV28g0g.js} +2 -2
- package/server/{merge-train-CKana8EH.js → merge-train-CHopycP0.js} +3 -3
- package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-D1cOZzy2.js} +4 -4
- package/server/{merge-verification-CqnUzGEK.js → merge-verification-BkaOqPsw.js} +4 -4
- package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-duPAfSBw.js} +2 -2
- package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Nw29vaFb.js} +11 -8
- package/server/node_modules/.package-lock.json +8 -8
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
- package/server/node_modules/undici/README.md +5 -0
- package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
- package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
- package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
- package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
- package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
- package/server/node_modules/undici/docs/docs/index.md +5 -0
- package/server/node_modules/undici/lib/core/request.js +1 -1
- package/server/node_modules/undici/lib/core/util.js +6 -1
- package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
- package/server/node_modules/undici/lib/dispatcher/client-h1.js +31 -6
- package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
- package/server/node_modules/undici/lib/handler/cache-handler.js +93 -5
- package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
- package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
- package/server/node_modules/undici/lib/handler/retry-handler.js +6 -4
- package/server/node_modules/undici/lib/interceptor/cache.js +21 -4
- package/server/node_modules/undici/lib/interceptor/decompress.js +4 -0
- package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
- package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
- package/server/node_modules/undici/lib/util/cache.js +49 -7
- package/server/node_modules/undici/lib/web/fetch/body.js +2 -1
- package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
- package/server/node_modules/undici/package.json +2 -2
- package/server/node_modules/undici/types/client.d.ts +2 -2
- package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
- package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
- package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-BvKkWMJQ.js} +15 -13
- package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-CTSGcK8p.js} +1 -1
- package/server/package-lock.json +9 -9
- package/server/package.json +1 -1
- package/server/{pan-dir-DOcf6ug3.js → pan-dir-B0c3w0Ya.js} +78 -58
- package/server/{paths-DooHpt9p.js → paths-D-xWGHdh.js} +2 -2
- package/server/{pickup-CaskQ7j6.js → pickup-DUCLWrJY.js} +17 -16
- package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-mY3GprlK.js} +186 -67
- package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-BJr8gQX6.js} +1 -1
- package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-BXkJzDC4.js} +2 -2
- package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-C0MWUeCU.js} +2 -2
- package/server/project-repos-B6GycDh9.js +94 -0
- package/server/project-repos-DXKQsc_m.js +3 -0
- package/server/projects-vjjcmiN8.js +3 -0
- package/server/{prompts-EvhMeeHG.js → prompts-DxzFXuLl.js} +2 -2
- package/server/{providers-BDDPULlp.js → providers-qQAwGQDW.js} +7 -7
- package/server/{providers-DNSQqy2V.js → providers-u4Ga0jOr.js} +1 -1
- package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-BamJdinX.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-DfOB8-w4.js} +1 -1
- package/server/public/assets/{dist-DukGS2YZ.js → dist-ByIuzMQW.js} +3 -3
- package/server/public/assets/{dist-Bio7THQU.js → dist-D7zYSEA6.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-EdmRyXL3.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-MerOfTX8.js} +1 -1
- package/server/public/assets/{index-Bwejq-5s.js → index-CWeMerGO.js} +147 -144
- package/server/public/assets/index-CenuJ3Cw.css +1 -0
- package/server/public/assets/{linear-qUWmMZ-c.js → linear-BBbArIcK.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-BKIddiJN.js} +1 -1
- package/server/public/assets/{prod-C8VtLuWC.js → prod-B8vYiu52.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-D6RtoULk.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-CLrCedZX.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-hznR8DYl.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-By_BteaL.js → pull-requests-7N8WKseP.js} +1 -1
- package/server/{pull-requests-8z2N1UOV.js → pull-requests-_lHueOHW.js} +13 -11
- package/server/{queries-ZABd5aXP.js → queries-CjNIf-Ub.js} +1200 -201
- package/server/{rally-i_goYmiA.js → rally-CyWT_lNO.js} +3 -3
- package/server/{rally-api-DqKqIMNR.js → rally-api-C8e_1JRi.js} +2 -2
- package/server/{rally-api-xHazRk0d.js → rally-api-ClOSd-Tt.js} +1 -1
- package/server/{rally-client-COYz1vYR.js → rally-client-lc-nokqr.js} +4 -4
- package/server/{rally-client-CGWEHaPd.js → rally-client-sgtVqzNU.js} +1 -1
- package/server/rally-zhhtXuDP.js +3 -0
- package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-7KeHv1R1.js} +1 -1
- package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-BtHPo6Xc.js} +1 -1
- package/server/rebuild-stack-CFvcBHsS.js +4 -0
- package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-lwtsW0GO.js} +26 -35
- package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-C3Ui7ojV.js} +6 -6
- package/server/record-CN0pj4_5.js +3 -0
- package/server/{record-update-D3N6WMFR.js → record-update-bLJxAXH4.js} +1 -1
- package/server/record-update-dE1Aw83j.js +310 -0
- package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BvRWfUXM.js} +2 -2
- package/server/{release-engine-DMINVN8S.js → release-engine-Cx48W7z8.js} +5 -5
- package/server/{release-set-DeUSOEHy.js → release-set-CQfuN9-v.js} +3 -3
- package/server/{remote-b-c5bOce.js → remote-C_2hasl7.js} +3 -3
- package/server/{remote-Dr5kGYSZ.js → remote-ChgimyYa.js} +3 -3
- package/server/{remote-agents-Ct_WOyke.js → remote-agents-By1ige5O.js} +6 -6
- package/server/{remote-agents-D6O_zETW.js → remote-agents-CA3Ihlxj.js} +1 -1
- package/server/{remote-completion-Dca3hAaa.js → remote-completion-fVe9e_3u.js} +12 -12
- package/server/resume-BFv1PGpA.js +3 -0
- package/server/{review-agent-CThvgK2r.js → review-agent-CIGOQYBD.js} +29 -25
- package/server/{review-agent-CCum8sGe.js → review-agent-DNboMyW4.js} +1 -1
- package/server/{review-artifacts-CXywD0F2.js → review-artifacts-nRDPuMxd.js} +5 -5
- package/server/{review-context-OYfKUprb.js → review-context-2uj-YQ8J.js} +70 -26
- package/server/review-status-btEYlaxA.js +3 -0
- package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-Dci-ZwEt.js} +3 -3
- package/server/{review-status-DFRjDFef.js → review-status-kZj_KyCk.js} +77 -28
- package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BTOpxtTC.js} +10 -5
- package/server/{review-status-sync-D60PJWNL.js → review-status-sync-DSDK3OMy.js} +1 -1
- package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CCjVA7Uk.js} +6 -6
- package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-CTd4QMBu.js} +1 -1
- package/server/{rollup-CZ02qgxk.js → rollup-BKQC7jp4.js} +1 -1
- package/server/{rollup-SyuF09e4.js → rollup-FGsKki9R.js} +8 -8
- package/server/{scanner-Br0Z5S6R.js → scanner-CnqEZeDy.js} +45 -14
- package/server/{sequence-io-fxU0DlwW.js → sequence-io-D909zgeH.js} +4 -4
- package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-CzkcK6P5.js} +5 -5
- package/server/server.js +2961 -919
- package/server/{service-Bagb90KZ.js → service-CLeAoU6G.js} +55 -54
- package/server/{session-fork-BqQxd-V6.js → session-fork-CHI1XvL9.js} +2 -2
- package/server/{session-history-XdS0JKp3.js → session-history-BT3IvqhC.js} +4 -4
- package/server/settings-66A6uvIA.js +2 -0
- package/server/{settings-BNbocWOg.js → settings-BTMvpNFU.js} +3 -3
- package/server/{settings-uLc6DEYI.js → settings-C0zgxOGf.js} +2 -2
- package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BJfgm-hX.js} +2 -2
- package/server/{shadow-state-C_NkP-sa.js → shadow-state-7a-524T8.js} +2 -2
- package/server/{shadow-state-CbvsN3qG.js → shadow-state-DnDyjujH.js} +1 -1
- package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-Db3oroFG.js} +2 -2
- package/server/{ship-log-__QtAFXG.js → ship-log-D9MlVzYU.js} +1 -1
- package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CV2ukKND.js} +1 -1
- package/server/{smart-compaction-CLZOWin1.js → smart-compaction-KCYScAU1.js} +7 -7
- package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DKpdFyOC.js} +35 -27
- package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-qUC2VWu3.js} +1 -1
- package/server/{specialist-completion-CqmduO92.js → specialist-completion-Ky9wCDpb.js} +1 -1
- package/server/{specialist-context-CJ-QjFR-.js → specialist-context-Bn3dCGS2.js} +5 -5
- package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-CMEwYxa2.js} +2 -2
- package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-C5p8G7tx.js} +3 -3
- package/server/{specialists-Bg9v4z3F.js → specialists-CC4r-c2s.js} +1015 -460
- package/server/{specialists-D0gGXMZx.js → specialists-CShuVGWT.js} +1 -1
- package/server/specialists-DM6bWjsi.js +3 -0
- package/server/{specialists-CwZHb5cb.js → specialists-jiuuyVkp.js} +66 -74
- package/server/specs-C8Wsn2XO.js +3 -0
- package/server/{src-BMMoA_ba.js → src-CXmtj0im.js} +6 -6
- package/server/{src-Bqdtd6po.js → src-CdmnTM2m.js} +5 -5
- package/server/{src-k039WVYY.js → src-DtcUOZCq.js} +112 -18
- package/server/stack-health-Bn3o8FBX.js +3 -0
- package/server/{stack-health-C-ifC7b0.js → stack-health-DxSdG9cW.js} +63 -9
- package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-KJKxxiiQ.js} +4 -4
- package/server/{staleness-_Tr-GwdA.js → staleness-CT34nwr9.js} +1 -1
- package/server/{staleness-BID1BKdr.js → staleness-DPm7ClwA.js} +15 -3
- package/server/{state-home-CONQvZR0.js → state-home-Cn_Qu8IX.js} +96 -44
- package/server/{state-migrate-BeBW0KXA.js → state-migrate-BGg2ZaOt.js} +12 -3
- package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-DYuPRYYw.js} +307 -26
- package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-s9_2qfi6.js} +1 -1
- package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-B-FwCs5V.js} +3 -3
- package/server/{summary-fork-bX6ax6X7.js → summary-fork-D1RAk9rJ.js} +78 -12
- package/server/{summary-fork-agEMsPSo.js → summary-fork-DpcxN9tf.js} +2 -2
- package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-Csw5tqfJ.js} +2 -41
- package/server/supervisor/pty-supervisor.js +2 -1
- package/server/supervisor/pty-token-x-ea28Us.js +43 -0
- package/server/supervisor-FTJAIsAK.js +2 -0
- package/server/{supervisor-Ctt4eRYz.js → supervisor-wM4ooB5O.js} +3 -3
- package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-DlP_UjHq.js} +4 -4
- package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-DUDj1YHf.js} +56 -29
- package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-DeTTImn-.js} +15 -15
- package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-MbxX5vqq.js} +7 -7
- package/server/{test-verdict-Cp5tljlJ.js → test-verdict-bWYBtqBg.js} +1 -1
- package/server/{test-verdict-D_-sXIz_.js → test-verdict-gscuksPv.js} +1 -1
- package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-BYFkts95.js} +1 -1
- package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-C-69c3OI.js} +2 -2
- package/server/tmux-B6z7h_vZ.js +3 -0
- package/server/{tmux-L5LgvGLp.js → tmux-R7N7y-Mh.js} +76 -44
- package/server/{token-BkQLy4yS.js → token-BK6t8BIT.js} +2 -2
- package/server/token-util-DuPuNriz.js +3 -0
- package/server/{token-util-DI8sGlmF.js → token-util-DxXu-vd1.js} +1 -1
- package/server/{tracker-config-DdT-nUAM.js → tracker-config-G6latr8C.js} +2 -2
- package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-B4ylXZQK.js} +1 -1
- package/server/{tracker-utils-CawsPSS2.js → tracker-utils-DHv5pSDT.js} +2 -2
- package/server/{traefik-connect-C6mJckNs.js → traefik-connect-Df2uXPsQ.js} +1 -1
- package/server/{tunnel-IdK1iTHx.js → tunnel-CDVKJpRv.js} +3 -3
- package/server/{tunnel-BIFl98rc.js → tunnel-DGdUkGoZ.js} +1 -1
- package/server/{types-7-GnJn0t.js → types-5M0lupud.js} +1 -1
- package/server/{uat-train-0Ujk8GCv.js → uat-train-B05BWkp-.js} +1 -1
- package/server/{uat-train-j0cPeMSj.js → uat-train-DDSrSoV1.js} +28 -28
- package/server/validate-IfDGkaVR.js +177 -0
- package/server/{validation-DcAgXTQp.js → validation-CC9OPqJZ.js} +1 -1
- package/server/{validation-CabEISJT.js → validation-Dw1pzDzr.js} +259 -9
- package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-B3itKTxu.js} +1 -1
- package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-TVFSz_q1.js} +1 -1
- package/server/{verification-runner-DlJezzef.js → verification-runner-BW4HOKAz.js} +1 -1
- package/server/{verification-runner-FiuAZ-H2.js → verification-runner-CkgX6EtI.js} +174 -124
- package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DYPbKcIJ.js} +1 -1
- package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Du8Vh2aJ.js} +13 -13
- package/server/workflows-BQu4RFQ-.js +2 -0
- package/server/{workflows-BZNNYkGC.js → workflows-mbQzh6mQ.js} +39 -77
- package/server/{workspace-3IC-UkAi.js → workspace--8tnhDI0.js} +1 -1
- package/server/{workspace-D9ppycdg.js → workspace-BPUws1-_.js} +3 -3
- package/server/{workspace-config-Bigl_-Lk.js → workspace-config-CIVWZOQr.js} +1 -1
- package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-CBhNdzE4.js} +76 -18
- package/server/workspace-manager-CWT55qeI.js +3 -0
- package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-BzHnwwX4.js} +1 -1
- package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-_WygnyoX.js} +2 -2
- package/server/{workspaces-CFPcL0vl.js → workspaces-Do_9J0LQ.js} +309 -124
- package/sync-sources/agents/pan-inspect-agent.md +1 -1
- package/sync-sources/agents/pan-merge-agent.md +1 -1
- package/sync-sources/agents/pan-planning-agent.md +4 -4
- package/sync-sources/agents/pan-work-agent.md +1 -1
- package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
- package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
- package/sync-sources/hooks/record-cost-event.js +369 -75
- package/sync-sources/hooks/session-start-hook +7 -0
- package/sync-sources/hooks/work-agent-stop-hook +1 -1
- package/sync-sources/rules/per-bead-durability.md +1 -1
- package/sync-sources/rules/prd-authoring.md +1 -1
- package/sync-sources/skills/feature-work/SKILL.md +1 -1
- package/sync-sources/skills/okf/README.md +11 -3
- package/sync-sources/skills/okf/SKILL.md +12 -1
- package/sync-sources/skills/okf/docs/USAGE.md +15 -0
- package/sync-sources/skills/okf/references/overdeck.md +28 -0
- package/sync-sources/skills/pan/SKILL.md +2 -2
- package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
- package/sync-sources/skills/pan-approve/SKILL.md +1 -1
- package/sync-sources/skills/pan-close/SKILL.md +1 -1
- package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
- package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
- package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
- package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
- package/sync-sources/skills/pan-orders/SKILL.md +33 -0
- package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
- package/sync-sources/skills/pan-plan/SKILL.md +6 -6
- package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
- package/sync-sources/skills/pan-recap/SKILL.md +2 -2
- package/sync-sources/skills/pan-review/SKILL.md +1 -1
- package/sync-sources/skills/pan-start/SKILL.md +7 -3
- package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/sync-sources/skills/pan-task/SKILL.md +2 -2
- package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
- package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
- package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
- package/sync-sources/skills/plan/SKILL.md +11 -11
- package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
- package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
- package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
- package/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
- package/server/agent-state-Co5Sy2Fw.js +0 -3
- package/server/agents-DyHKlq1I.js +0 -3
- package/server/cli-BRORS9qY.js +0 -3
- package/server/codex-DNyiQDKW.js +0 -3
- package/server/context-layers-15gDOk20.js +0 -165
- package/server/context-layers-DlQKkHH2.js +0 -4
- package/server/deacon-swarm-CV54eNmU.js +0 -2
- package/server/dist-j64RzSrQ.js +0 -3
- package/server/flywheel-6WHU4O7A.js +0 -207
- package/server/flywheel-COR0mbRI.js +0 -522
- package/server/flywheel-Ctr5uuvo.js +0 -2
- package/server/forge-B0_opi-V.js +0 -2
- package/server/git-utils-CsKGnzFA.js +0 -3
- package/server/hume-BmhvfVbV.js +0 -3
- package/server/inspect-agent-Dq0z1k3H.js +0 -2
- package/server/layers-Cp1To4L8.js +0 -93
- package/server/lifecycle-io-DmY2qwCn.js +0 -3
- package/server/merge-blockers-BYjeXrVN.js +0 -41
- package/server/merge-ops-DwWCkSgo.js +0 -2
- package/server/merge-set-DiISXcC-.js +0 -139
- package/server/projects-BKkwpH6q.js +0 -3
- package/server/public/assets/index-Bdc4V9ba.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
- package/server/rally-OSJXdiHK.js +0 -3
- package/server/rebuild-stack-CKjJAI8L.js +0 -3
- package/server/record-rwK-nKv_.js +0 -3
- package/server/record-update-Crz74r-6.js +0 -168
- package/server/resume-wZZsWtzz.js +0 -3
- package/server/review-status-Bnh-rdkY.js +0 -3
- package/server/settings-BlUsVaUc.js +0 -2
- package/server/specialists-Dqe6_HE5.js +0 -3
- package/server/specs-BhOKBzqk.js +0 -3
- package/server/stack-health-Bd06frFn.js +0 -3
- package/server/supervisor-COVHrBTg.js +0 -2
- package/server/tmux-BAvtac_u.js +0 -3
- package/server/token-util-BArZLN6w.js +0 -3
- package/server/workflows-C4mR0Reb.js +0 -2
- package/server/workspace-manager-B1WOfKvB.js +0 -3
|
@@ -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);
|
|
@@ -28024,7 +28121,8 @@ function validateRoleFields(role, roleConfig) {
|
|
|
28024
28121
|
if (!Number.isInteger(entry.weight) || entry.weight <= 0) throw new Error(`config.yaml: roles.${role}.model[${i}].weight must be a positive integer`);
|
|
28025
28122
|
}
|
|
28026
28123
|
}
|
|
28027
|
-
if (roleConfig.
|
|
28124
|
+
if (roleConfig.autonomousModel !== void 0 && typeof roleConfig.autonomousModel !== "string") throw new Error(`config.yaml: roles.${role}.autonomousModel must be a scalar model reference`);
|
|
28125
|
+
if (roleConfig.harness !== void 0 && roleConfig.harness !== "claude-code" && roleConfig.harness !== "ohmypi" && roleConfig.harness !== "codex" && roleConfig.harness !== "acp") throw new Error(`config.yaml: roles.${role}.harness must be claude-code, ohmypi, codex, or acp`);
|
|
28028
28126
|
if (roleConfig.effort !== void 0 && !ROLE_EFFORTS.includes(roleConfig.effort)) throw new Error(`config.yaml: roles.${role}.effort must be one of ${ROLE_EFFORTS.join(", ")}`);
|
|
28029
28127
|
if (roleConfig.mode !== void 0 && roleConfig.mode !== "quick" && roleConfig.mode !== "full" && roleConfig.mode !== "none") throw new Error(`config.yaml: roles.${role}.mode must be quick, full, or none`);
|
|
28030
28128
|
if (roleConfig.reReviewScope !== void 0 && roleConfig.reReviewScope !== "all" && roleConfig.reReviewScope !== "changed" && roleConfig.reReviewScope !== "blockers") throw new Error(`config.yaml: roles.${role}.reReviewScope must be all, changed, or blockers`);
|
|
@@ -28041,6 +28139,7 @@ function validateRoleModelRefs(config) {
|
|
|
28041
28139
|
}
|
|
28042
28140
|
for (const [role, roleConfig] of Object.entries(config.roles ?? {})) {
|
|
28043
28141
|
validateRoleFields(role, roleConfig);
|
|
28142
|
+
if (typeof roleConfig.autonomousModel === "string") derefWorkhorse(roleConfig.autonomousModel, config, `roles.${role}.autonomousModel`);
|
|
28044
28143
|
if (Array.isArray(roleConfig.model)) for (let i = 0; i < roleConfig.model.length; i++) derefWorkhorse(roleConfig.model[i].model, config, `roles.${role}.model[${i}].model`);
|
|
28045
28144
|
else if (roleConfig.model) {
|
|
28046
28145
|
const resolvedModel = derefWorkhorse(roleConfig.model, config, `roles.${role}.model`);
|
|
@@ -28637,7 +28736,7 @@ const DEFAULT_TIERED_EXECUTION_CONFIG = {
|
|
|
28637
28736
|
difficultyToTier: {}
|
|
28638
28737
|
};
|
|
28639
28738
|
function isRuntimeName(value) {
|
|
28640
|
-
return value === "claude-code" || value === "ohmypi" || value === "codex";
|
|
28739
|
+
return value === "claude-code" || value === "ohmypi" || value === "codex" || value === "acp";
|
|
28641
28740
|
}
|
|
28642
28741
|
function isDifficulty(value) {
|
|
28643
28742
|
return TIERED_EXECUTION_DIFFICULTIES.includes(value);
|
|
@@ -28660,7 +28759,7 @@ function knownModelIds() {
|
|
|
28660
28759
|
return ids;
|
|
28661
28760
|
}
|
|
28662
28761
|
function validateHarness(harness, path) {
|
|
28663
|
-
if (!isRuntimeName(harness)) throw new TieredExecutionConfigError(`${path}.harness '${harness}' is unknown; expected claude-code, ohmypi, or
|
|
28762
|
+
if (!isRuntimeName(harness)) throw new TieredExecutionConfigError(`${path}.harness '${harness}' is unknown; expected claude-code, ohmypi, codex, or acp`);
|
|
28664
28763
|
}
|
|
28665
28764
|
function validateModel(model, path) {
|
|
28666
28765
|
const resolved = resolveModelIdSync(model);
|
|
@@ -29191,7 +29290,7 @@ function normalizeProviderConfig(providerConfig, fallbackKey) {
|
|
|
29191
29290
|
};
|
|
29192
29291
|
}
|
|
29193
29292
|
function validateProviderHarness(provider, harness) {
|
|
29194
|
-
if (harness !== void 0 && harness !== "claude-code" && harness !== "ohmypi" && harness !== "codex") throw new Error(`config.yaml: models.providers.${provider}.harness must be claude-code, ohmypi, or
|
|
29293
|
+
if (harness !== void 0 && harness !== "claude-code" && harness !== "ohmypi" && harness !== "codex" && harness !== "acp") throw new Error(`config.yaml: models.providers.${provider}.harness must be claude-code, ohmypi, codex, or acp`);
|
|
29195
29294
|
}
|
|
29196
29295
|
function applyProviderHarness(result, provider, harness) {
|
|
29197
29296
|
validateProviderHarness(provider, harness);
|
|
@@ -32263,7 +32362,196 @@ function getOverdeckDatabasePath() {
|
|
|
32263
32362
|
return join$1(getOverdeckHome(), "overdeck.db");
|
|
32264
32363
|
}
|
|
32265
32364
|
//#endregion
|
|
32365
|
+
//#region ../../src/lib/overdeck/schema-audit.ts
|
|
32366
|
+
const EMPTY_TOP_UP_EXPECTATIONS = {
|
|
32367
|
+
columns: [],
|
|
32368
|
+
indexes: []
|
|
32369
|
+
};
|
|
32370
|
+
function splitTableDefinitions(body) {
|
|
32371
|
+
const definitions = [];
|
|
32372
|
+
let start = 0;
|
|
32373
|
+
let depth = 0;
|
|
32374
|
+
let quote = null;
|
|
32375
|
+
for (let index = 0; index < body.length; index += 1) {
|
|
32376
|
+
const character = body[index];
|
|
32377
|
+
if (quote) {
|
|
32378
|
+
if (character === quote && body[index - 1] !== "\\") quote = null;
|
|
32379
|
+
continue;
|
|
32380
|
+
}
|
|
32381
|
+
if (character === "'" || character === "\"" || character === "`") {
|
|
32382
|
+
quote = character;
|
|
32383
|
+
continue;
|
|
32384
|
+
}
|
|
32385
|
+
if (character === "(") depth += 1;
|
|
32386
|
+
if (character === ")") depth -= 1;
|
|
32387
|
+
if (character === "," && depth === 0) {
|
|
32388
|
+
definitions.push(body.slice(start, index).trim());
|
|
32389
|
+
start = index + 1;
|
|
32390
|
+
}
|
|
32391
|
+
}
|
|
32392
|
+
definitions.push(body.slice(start).trim());
|
|
32393
|
+
return definitions.filter(Boolean);
|
|
32394
|
+
}
|
|
32395
|
+
function parseOverdeckSchemaExpectations(migrationSql, topUps = EMPTY_TOP_UP_EXPECTATIONS) {
|
|
32396
|
+
const tables = /* @__PURE__ */ new Map();
|
|
32397
|
+
const indexes = /* @__PURE__ */ new Set();
|
|
32398
|
+
for (const statement of migrationSql.split("--> statement-breakpoint")) {
|
|
32399
|
+
const trimmed = statement.trim();
|
|
32400
|
+
const tableMatch = trimmed.match(/^CREATE TABLE(?: IF NOT EXISTS)?\s+`([^`]+)`\s*\(([\s\S]*)\)\s*;?$/i);
|
|
32401
|
+
if (tableMatch) {
|
|
32402
|
+
const [, tableName, body] = tableMatch;
|
|
32403
|
+
const columns = /* @__PURE__ */ new Set();
|
|
32404
|
+
for (const definition of splitTableDefinitions(body)) {
|
|
32405
|
+
const columnMatch = definition.match(/^`([^`]+)`\s+/);
|
|
32406
|
+
if (columnMatch) columns.add(columnMatch[1]);
|
|
32407
|
+
}
|
|
32408
|
+
tables.set(tableName, columns);
|
|
32409
|
+
continue;
|
|
32410
|
+
}
|
|
32411
|
+
const indexMatch = trimmed.match(/^CREATE (?:UNIQUE )?INDEX(?: IF NOT EXISTS)?\s+`([^`]+)`\s+ON\s+`[^`]+`/i);
|
|
32412
|
+
if (indexMatch) indexes.add(indexMatch[1]);
|
|
32413
|
+
}
|
|
32414
|
+
for (const { table, column } of topUps.columns) {
|
|
32415
|
+
const columns = tables.get(table) ?? /* @__PURE__ */ new Set();
|
|
32416
|
+
columns.add(column);
|
|
32417
|
+
tables.set(table, columns);
|
|
32418
|
+
}
|
|
32419
|
+
for (const index of topUps.indexes) indexes.add(index);
|
|
32420
|
+
return {
|
|
32421
|
+
tables,
|
|
32422
|
+
indexes
|
|
32423
|
+
};
|
|
32424
|
+
}
|
|
32425
|
+
function readOverdeckSchemaExpectationsSync(topUps = EMPTY_TOP_UP_EXPECTATIONS) {
|
|
32426
|
+
return parseOverdeckSchemaExpectations(readFileSync$1(OVERDECK_MIGRATION_PATH, "utf8"), topUps);
|
|
32427
|
+
}
|
|
32428
|
+
function quoteIdentifier(identifier) {
|
|
32429
|
+
return `"${identifier.replaceAll("\"", "\"\"")}"`;
|
|
32430
|
+
}
|
|
32431
|
+
function auditOverdeckSchemaSync(db, topUps = EMPTY_TOP_UP_EXPECTATIONS) {
|
|
32432
|
+
const expected = readOverdeckSchemaExpectationsSync(topUps);
|
|
32433
|
+
const artifacts = db.prepare(`
|
|
32434
|
+
SELECT type, name
|
|
32435
|
+
FROM sqlite_master
|
|
32436
|
+
WHERE type IN ('table', 'index')
|
|
32437
|
+
AND name NOT LIKE 'sqlite_%'
|
|
32438
|
+
`).all();
|
|
32439
|
+
const actualTables = new Set(artifacts.filter((artifact) => artifact.type === "table").map((artifact) => artifact.name));
|
|
32440
|
+
const actualIndexes = new Set(artifacts.filter((artifact) => artifact.type === "index").map((artifact) => artifact.name));
|
|
32441
|
+
const missingTables = [...expected.tables.keys()].filter((table) => !actualTables.has(table)).sort();
|
|
32442
|
+
const missingIndexes = [...expected.indexes].filter((index) => !actualIndexes.has(index)).sort();
|
|
32443
|
+
const missingColumns = [];
|
|
32444
|
+
for (const [table, expectedColumns] of expected.tables) {
|
|
32445
|
+
if (!actualTables.has(table)) continue;
|
|
32446
|
+
const actualColumns = new Set(db.prepare(`PRAGMA table_info(${quoteIdentifier(table)})`).all().map((column) => column.name));
|
|
32447
|
+
for (const column of expectedColumns) if (!actualColumns.has(column)) missingColumns.push({
|
|
32448
|
+
table,
|
|
32449
|
+
column
|
|
32450
|
+
});
|
|
32451
|
+
}
|
|
32452
|
+
missingColumns.sort((left, right) => left.table === right.table ? left.column.localeCompare(right.column) : left.table.localeCompare(right.table));
|
|
32453
|
+
return {
|
|
32454
|
+
missingTables,
|
|
32455
|
+
missingIndexes,
|
|
32456
|
+
missingColumns
|
|
32457
|
+
};
|
|
32458
|
+
}
|
|
32459
|
+
//#endregion
|
|
32266
32460
|
//#region ../../src/lib/overdeck/infra.ts
|
|
32461
|
+
/**
|
|
32462
|
+
* Runtime infrastructure for the canonical overdeck.db cache.
|
|
32463
|
+
* Schema top-ups tolerate idempotency errors, log unexpected failures without
|
|
32464
|
+
* blocking boot, and getOverdeckDatabaseSync follows them with a report-only
|
|
32465
|
+
* schema audit that warns about drift without mutating the database.
|
|
32466
|
+
*/
|
|
32467
|
+
const OVERDECK_SCHEMA_TOP_UP_EXPECTATIONS = {
|
|
32468
|
+
columns: [
|
|
32469
|
+
{
|
|
32470
|
+
table: "discovered_sessions",
|
|
32471
|
+
column: "harness"
|
|
32472
|
+
},
|
|
32473
|
+
{
|
|
32474
|
+
table: "flywheel_substrate_bugs",
|
|
32475
|
+
column: "affected_criteria"
|
|
32476
|
+
},
|
|
32477
|
+
{
|
|
32478
|
+
table: "review_status",
|
|
32479
|
+
column: "release_status"
|
|
32480
|
+
},
|
|
32481
|
+
{
|
|
32482
|
+
table: "review_status",
|
|
32483
|
+
column: "release_notes"
|
|
32484
|
+
},
|
|
32485
|
+
{
|
|
32486
|
+
table: "review_status",
|
|
32487
|
+
column: "inspect_owner_session"
|
|
32488
|
+
},
|
|
32489
|
+
{
|
|
32490
|
+
table: "review_status",
|
|
32491
|
+
column: "strike_ready_head"
|
|
32492
|
+
},
|
|
32493
|
+
{
|
|
32494
|
+
table: "review_status",
|
|
32495
|
+
column: "strike_ready_at"
|
|
32496
|
+
},
|
|
32497
|
+
{
|
|
32498
|
+
table: "review_status",
|
|
32499
|
+
column: "strike_landing_state"
|
|
32500
|
+
},
|
|
32501
|
+
{
|
|
32502
|
+
table: "review_status",
|
|
32503
|
+
column: "strike_recovery_count"
|
|
32504
|
+
},
|
|
32505
|
+
{
|
|
32506
|
+
table: "review_status",
|
|
32507
|
+
column: "strike_landing_attempts"
|
|
32508
|
+
},
|
|
32509
|
+
{
|
|
32510
|
+
table: "agents",
|
|
32511
|
+
column: "yielded_by_scheduler"
|
|
32512
|
+
},
|
|
32513
|
+
{
|
|
32514
|
+
table: "agents",
|
|
32515
|
+
column: "review_discovery_pending"
|
|
32516
|
+
},
|
|
32517
|
+
{
|
|
32518
|
+
table: "agents",
|
|
32519
|
+
column: "review_context_manifest_path"
|
|
32520
|
+
},
|
|
32521
|
+
{
|
|
32522
|
+
table: "agents",
|
|
32523
|
+
column: "review_discovery_ready_at"
|
|
32524
|
+
},
|
|
32525
|
+
{
|
|
32526
|
+
table: "agents",
|
|
32527
|
+
column: "review_convoy_forked_at"
|
|
32528
|
+
},
|
|
32529
|
+
{
|
|
32530
|
+
table: "agents",
|
|
32531
|
+
column: "review_fork_cache_checked"
|
|
32532
|
+
},
|
|
32533
|
+
{
|
|
32534
|
+
table: "agents",
|
|
32535
|
+
column: "review_forked_from_parent"
|
|
32536
|
+
},
|
|
32537
|
+
{
|
|
32538
|
+
table: "agents",
|
|
32539
|
+
column: "yielded_at"
|
|
32540
|
+
},
|
|
32541
|
+
{
|
|
32542
|
+
table: "agents",
|
|
32543
|
+
column: "last_yield_resume_at"
|
|
32544
|
+
}
|
|
32545
|
+
],
|
|
32546
|
+
indexes: [
|
|
32547
|
+
"cost_session_id_idx",
|
|
32548
|
+
"idx_cost_agent_id",
|
|
32549
|
+
"idx_cost_issue_upper",
|
|
32550
|
+
"release_sets_project_idx",
|
|
32551
|
+
"release_set_components_issue_component_idx",
|
|
32552
|
+
"release_set_components_issue_order_idx"
|
|
32553
|
+
]
|
|
32554
|
+
};
|
|
32267
32555
|
const overdeckEvents = sqliteTable("events", {
|
|
32268
32556
|
sequence: integer("sequence").primaryKey({ autoIncrement: true }),
|
|
32269
32557
|
type: text("type").notNull(),
|
|
@@ -32282,56 +32570,50 @@ function runOverdeckMigrationSync(db) {
|
|
|
32282
32570
|
}
|
|
32283
32571
|
}
|
|
32284
32572
|
/**
|
|
32573
|
+
* Run one idempotent schema top-up without hiding unexpected SQLite failures.
|
|
32574
|
+
* Only duplicate DDL is silent; missing tables and other failures are logged so
|
|
32575
|
+
* schema drift remains observable without blocking later top-ups or startup.
|
|
32576
|
+
*/
|
|
32577
|
+
function runSchemaTopUp(db, statement) {
|
|
32578
|
+
try {
|
|
32579
|
+
db.exec(statement);
|
|
32580
|
+
} catch (error) {
|
|
32581
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
32582
|
+
if (/duplicate column name|already exists/i.test(message)) return;
|
|
32583
|
+
console.error(`[schema] top-up failed: ${statement}\n${message}`);
|
|
32584
|
+
}
|
|
32585
|
+
}
|
|
32586
|
+
/**
|
|
32285
32587
|
* Idempotent schema top-ups for databases created before a field/index existed
|
|
32286
32588
|
* in the init migration. The init migration only runs on a fresh database.
|
|
32287
32589
|
* PAN-2220: the conversation ledger-cost query joins cost_events on session_id;
|
|
32288
32590
|
* without this index SQLite builds an automatic index on every query (~76ms → 7ms).
|
|
32289
32591
|
*/
|
|
32290
32592
|
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 {}
|
|
32593
|
+
runSchemaTopUp(db, "ALTER TABLE `discovered_sessions` ADD COLUMN `harness` text");
|
|
32594
|
+
runSchemaTopUp(db, "UPDATE `discovered_sessions` SET `harness` = 'claude-code' WHERE `harness` IS NULL");
|
|
32595
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `release_status` text");
|
|
32596
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `release_notes` text");
|
|
32597
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `inspect_owner_session` text");
|
|
32598
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_ready_head` text");
|
|
32599
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_ready_at` integer");
|
|
32600
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_landing_state` text");
|
|
32601
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_recovery_count` integer DEFAULT 0");
|
|
32602
|
+
runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_landing_attempts` text");
|
|
32303
32603
|
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 {}
|
|
32604
|
+
runSchemaTopUp(db, "ALTER TABLE `flywheel_substrate_bugs` ADD COLUMN `affected_criteria` text");
|
|
32605
|
+
runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `cost_session_id_idx` ON `cost_events` (`session_id`)");
|
|
32606
|
+
runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `idx_cost_agent_id` ON `cost_events` (`agent_id`, `ts`)");
|
|
32607
|
+
runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `idx_cost_issue_upper` ON `cost_events` (UPPER(`issue_id`))");
|
|
32608
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `yielded_by_scheduler` integer");
|
|
32609
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_discovery_pending` integer");
|
|
32610
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_context_manifest_path` text");
|
|
32611
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_discovery_ready_at` integer");
|
|
32612
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_convoy_forked_at` integer");
|
|
32613
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_fork_cache_checked` integer");
|
|
32614
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_forked_from_parent` integer");
|
|
32615
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `yielded_at` integer");
|
|
32616
|
+
runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `last_yield_resume_at` integer");
|
|
32335
32617
|
}
|
|
32336
32618
|
/**
|
|
32337
32619
|
* Idempotent schema top-up for release set tables (PAN-399). Existing overdeck.db
|
|
@@ -32373,6 +32655,17 @@ function ensureReleaseSetTablesSync(db) {
|
|
|
32373
32655
|
db.exec("CREATE UNIQUE INDEX IF NOT EXISTS `release_set_components_issue_component_idx` ON `release_set_components` (`issue_id`,`component_key`)");
|
|
32374
32656
|
db.exec("CREATE INDEX IF NOT EXISTS `release_set_components_issue_order_idx` ON `release_set_components` (`issue_id`,`release_order`,`component_key`)");
|
|
32375
32657
|
}
|
|
32658
|
+
function warnSchemaDriftSync(db) {
|
|
32659
|
+
try {
|
|
32660
|
+
const report = auditOverdeckSchemaSync(db, OVERDECK_SCHEMA_TOP_UP_EXPECTATIONS);
|
|
32661
|
+
for (const table of report.missingTables) console.warn(`[schema-audit] missing table: ${table}`);
|
|
32662
|
+
for (const index of report.missingIndexes) console.warn(`[schema-audit] missing index: ${index}`);
|
|
32663
|
+
for (const { table, column } of report.missingColumns) console.warn(`[schema-audit] missing column: ${table}.${column}`);
|
|
32664
|
+
} catch (error) {
|
|
32665
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
32666
|
+
console.warn(`[schema-audit] audit failed: ${message}`);
|
|
32667
|
+
}
|
|
32668
|
+
}
|
|
32376
32669
|
function getOverdeckDatabaseSync(dbPath = getOverdeckDatabasePath()) {
|
|
32377
32670
|
if (overdeckDbSync?.path === dbPath) return overdeckDbSync.db;
|
|
32378
32671
|
if (overdeckDbSync) {
|
|
@@ -32387,6 +32680,7 @@ function getOverdeckDatabaseSync(dbPath = getOverdeckDatabasePath()) {
|
|
|
32387
32680
|
db.pragma("synchronous = NORMAL");
|
|
32388
32681
|
runOverdeckMigrationSync(db);
|
|
32389
32682
|
ensureRuntimeIndexesSync(db);
|
|
32683
|
+
warnSchemaDriftSync(db);
|
|
32390
32684
|
overdeckDbSync = {
|
|
32391
32685
|
path: dbPath,
|
|
32392
32686
|
db
|