@overdeck/desktop 0.45.15 → 0.45.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-electron/main.js +149 -158
- package/dist-electron/main.js.map +1 -1
- package/dist-electron/preload.js +17 -2
- package/dist-electron/preload.js.map +1 -1
- package/package.json +5 -4
- package/server/acceptance-criteria-aQFKQf-J.js +62 -0
- package/server/{advancing-selfheal-CSuZ31bB.js → advancing-selfheal-DgwQgm4D.js} +6 -5
- package/server/{agent-gc-D_DxfBHR.js → agent-gc-kpzxqT7P.js} +3 -3
- package/server/agent-state-C_6TG-Ad.js +3 -0
- package/server/{agent-state-service-C_2ZAQRP.js → agent-state-service-BUfovFfB.js} +1 -1
- package/server/{agent-state-service-BZkvgQf4.js → agent-state-service-nUD3qfob.js} +9 -52
- package/server/agents-BA15AQqo.js +3 -0
- package/server/{briefing-freshness-Kh5V8RTh.js → agents-BHBxr8c9.js} +5 -131
- package/server/{archive-planning-DkivCk1A.js → archive-planning-CzCW9Ifl.js} +5 -10
- package/server/{archive-planning-CTILQRnV.js → archive-planning-D-QsBufn.js} +1 -1
- package/server/{artifact-index-jobs-CmsvQ1ey.js → artifact-index-jobs-qqa51B2Z.js} +2 -2
- package/server/{backlog-auto-trigger-ueRaT8Dy.js → backlog-auto-trigger-B7Bi0bvY.js} +3 -3
- package/server/behavior-CWqNMqE5.js +10 -0
- package/server/briefing-freshness-DuxIE1yr.js +131 -0
- package/server/{checkpoint-manager-fu9oVsR-.js → checkpoint-manager-DF6hb9Jw.js} +3 -3
- package/server/{checkpoint-manager-CAFos8e1.js → checkpoint-manager-DixkLus7.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-DvhGi8P_.js → checkpoints-B1Z42tJE.js} +1 -1
- package/server/{checkpoints-1BqOlS4q.js → checkpoints-BiviJqei.js} +2 -2
- package/server/claude-hooks-provision-BeMGi4ty.js +3 -0
- package/server/{claude-hooks-provision-s_wdpeVj.js → claude-hooks-provision-Du_PkMsp.js} +132 -114
- package/server/{claude-permissions-CaWqysff.js → claude-permissions-BB6agcOZ.js} +2 -2
- package/server/{claude-settings-overlay-CcTf0xzG.js → claude-settings-overlay-CAq2oFSK.js} +2 -2
- package/server/{claude-settings-overlay-BbA4FbVI.js → claude-settings-overlay-DUWWLd6M.js} +1 -1
- package/server/cli-BFgrSWKV.js +3 -0
- package/server/{cli-BwCvCUBK.js → cli-C33xPZNm.js} +9 -9
- package/server/{cliproxy-C2xC-3vH.js → cliproxy-BQX1TL6N.js} +1 -1
- package/server/{cliproxy-BsoNNDAj.js → cliproxy-CGBA1GzA.js} +2 -2
- package/server/{close-issue-BleIwP3f.js → close-issue-DNv8npc1.js} +5 -5
- package/server/{closed-issue-reaper-BwUUvjEW.js → closed-issue-reaper-DrqgBJlr.js} +1 -1
- package/server/{closed-issue-reaper-mC5pujeb.js → closed-issue-reaper-LoMnnjtJ.js} +9 -9
- package/server/codex-DxLivxri.js +3 -0
- package/server/{behavior-Cpj03N4v.js → codex-parser-DboQnEXN.js} +3 -9
- package/server/{codex-DW60_5j2.js → codex-sgWVCGUd.js} +43 -17
- package/server/{config-BRNQJXhA.js → config-6MCHOZ2N.js} +1 -1
- package/server/{config-ZNnMpIlh.js → config-DfaUXr6r.js} +2 -2
- package/server/{config-yaml-Dcz-8uit.js → config-yaml-CqaAyn8y.js} +149 -80
- package/server/{conflict-gate-DTje2Ll7.js → conflict-gate-BF_zhcmb.js} +3 -3
- package/server/{conflict-gate-DGT8jCLp.js → conflict-gate-BubJprtD.js} +1 -1
- package/server/{context-layers-BdUCQ-cl.js → context-layers-BFrxfl0l.js} +17 -3
- package/server/{context-layers-ByOWUjUg.js → context-layers-DWL_8HhY.js} +2 -2
- package/server/{control-settings-DwkAeooY.js → control-settings-BguNQ1F_.js} +4 -4
- package/server/{conversation-compaction-WYQZUVDm.js → conversation-compaction-CRKAf2qP.js} +1 -1
- package/server/{conversation-compaction-OTYgd6eg.js → conversation-compaction-DxSXl0pT.js} +8 -8
- package/server/{conversation-service-C_kNZPLx.js → conversation-service-DzuY9qoH.js} +1 -1
- package/server/{conversation-service-BR1OgvxO.js → conversation-service-mFVFdDQK.js} +6 -5
- package/server/{conversations-DG2M8WnT.js → conversations-BX5aD-6F.js} +4 -4
- package/server/{conversations-izHvSoAR.js → conversations-BajHQ60c.js} +1 -1
- package/server/{cost-DQ2ajr_m.js → cost-BoqD1Pxz.js} +2 -2
- package/server/{cost-B2mj17iG.js → cost-DuZ5vlv-.js} +3 -3
- package/server/{cost-sync-gTayEuWP.js → cost-sync-BYnmnMkY.js} +3 -3
- package/server/{dag-CqTehWpY.js → dag-C6kYyF17.js} +7 -243
- package/server/{dangerous-git-ops-DDWQlPC3.js → dangerous-git-ops-q5OPtXMd.js} +1 -1
- package/server/dashboard-db-worker.js +6 -6
- package/server/{deacon-BqW9HMew.js → deacon-CwCiNuEZ.js} +3 -3
- package/server/{deacon-DrKDBeJL.js → deacon-Dru5onpk.js} +258 -167
- package/server/{deacon-nudge-log-D1wEK6zF.js → deacon-nudge-log-ilDfxrhK.js} +1 -1
- package/server/{deacon-swarm-CO_A7xyd.js → deacon-swarm-BPmBmSoU.js} +298 -72
- package/server/deacon-swarm-CKyGJng1.js +2 -0
- package/server/deacon.js +14 -7
- package/server/{devcontainer-renderer-BQolp_qZ.js → devcontainer-renderer-BqGNCzvN.js} +3 -3
- package/server/{dist-Bc32rWJB.js → dist-BwlEiLCU.js} +1 -1
- package/server/dist-Bx4KkgYL.js +3 -0
- package/server/{dist-src-Byxt1ifL.js → dist-src-BE0Denfs.js} +1 -1
- package/server/{docker-s-esqZ__.js → docker-CNjXS72x.js} +2 -2
- package/server/{ensure-devcontainer-DA4-jF6R.js → ensure-devcontainer-5e9xOve4.js} +4 -4
- package/server/{ensure-devcontainer-pUVaT0h3.js → ensure-devcontainer-C6gyUQdE.js} +1 -1
- package/server/{esm-shims-CJHy8CZY.js → esm-shims-Cso7IGBC.js} +1 -1
- package/server/{event-store-CcJAhKCl.js → event-store-D9UhQyMS.js} +1 -1
- package/server/{event-store-DRte2Rwt.js → event-store-KZnWUKWh.js} +3 -3
- package/server/{events-Bej1w_k8.js → events-2eFUPdqz.js} +3 -3
- package/server/{events-CtsLScn8.js → events-BYbvqZky.js} +1 -1
- package/server/{factory-FN727tWr.js → factory-BtaRsHFC.js} +20 -17
- package/server/{feature-registry-population-ie-yBcQC.js → feature-registry-population-Ca2UaV0U.js} +4 -4
- package/server/{feature-registry-storage-CkZTFSsn.js → feature-registry-storage-DaP-bQxO.js} +2 -2
- package/server/{features-Dtm9ABuz.js → features-DqvaoQoa.js} +2 -2
- package/server/{feedback-target-BYtpyt1i.js → feedback-target-BXWdOiYI.js} +9 -7
- package/server/{feedback-target-DVJQDiE4.js → feedback-target-BblmMe9P.js} +1 -1
- package/server/{feedback-writer-DOUhyIW2.js → feedback-writer-CULeOOY4.js} +1 -1
- package/server/{feedback-writer-fdE1BzeL.js → feedback-writer-Dn8o9ZyE.js} +4 -4
- package/server/{flywheel-Bi82iiNl.js → flywheel-BUWdcfhq.js} +1 -1
- package/server/{flywheel-Bv3wv2S6.js → flywheel-CqkO3cDj.js} +15 -28
- package/server/{flywheel-CUErLAyN.js → flywheel-D9r1mw2U.js} +13 -13
- package/server/{flywheel-merge-order-DXjeBnJ1.js → flywheel-merge-order-LDzQDwSg.js} +1 -1
- package/server/{flywheel-merge-order-BaEN3iyN.js → flywheel-merge-order-VtjUweEb.js} +7 -7
- package/server/forge-DJy3Zx4s.js +2 -0
- package/server/{forge-ButEdJ31.js → forge-wEollMCi.js} +22 -12
- package/server/{from-CbtTxftl.js → from-B2tOYhYV.js} +1 -1
- package/server/{fts-db-CBgBLZcL.js → fts-db-Bgzn2RO7.js} +2 -2
- package/server/{fts-operations-CI9Xuo_1.js → fts-operations-Bj8yutnR.js} +2 -2
- package/server/{git-utils-ClfpP47N.js → git-utils-GxlL0tmt.js} +2 -2
- package/server/{git-utils-BCLRWQ-y.js → git-utils-q8jNoBts.js} +1 -1
- package/server/{github-app-DRD2woO0.js → github-app-BrYwK_Gb.js} +1 -1
- package/server/{github-app-DscZ0_B6.js → github-app-tUbb8Ldr.js} +8 -3
- package/server/{github-client-DpiZnxGH.js → github-client-BwBU41jK.js} +3 -3
- package/server/{github-client-iFRw8f7e.js → github-client-D6CNsftm.js} +1 -1
- package/server/{github-pr-lookup-D-EBexxC.js → github-pr-lookup-BS5PqkJb.js} +2 -2
- package/server/{harness-resolve-iMjyNUJ2.js → harness-resolve-Dx8hUsvC.js} +3 -3
- package/server/{health-events-CRdxDFN2.js → health-events-2DLp-5Xp.js} +2 -2
- package/server/{health-events-B_WsQyYm.js → health-events-B0mj6Iae.js} +1 -1
- package/server/{hooks-C1ScyVxP.js → hooks-BDcQJDUe.js} +1 -1
- package/server/{hooks-C9b7Vqpw.js → hooks-BS_JrvYP.js} +3 -3
- package/server/hume-B4seN95Y.js +3 -0
- package/server/{hume-TQ5pvOZ_.js → hume-BRhNKyXQ.js} +2 -2
- package/server/{idle-stack-reaper-B1kG7B_X.js → idle-stack-reaper-BCITXNW5.js} +2 -2
- package/server/{idle-stack-reaper-iFVOAoJy.js → idle-stack-reaper-C1ymihno.js} +1 -1
- package/server/{infra-bpq1MHKU.js → infra-_Kx1m9pm.js} +9 -4
- package/server/{injection-BLWfwTVZ.js → injection-Bvhyg_MV.js} +1 -1
- package/server/{injection-DJqWld1v.js → injection-CCaYkofq.js} +7 -7
- package/server/{inspect-agent-DytCsltn.js → inspect-agent-BqyZ4pCo.js} +35 -67
- package/server/inspect-agent-DCJQm9Wu.js +2 -0
- package/server/{internal-token-CjlhdufS.js → internal-token-Cl-1IxaE.js} +2 -2
- package/server/{internal-token-CCaWaTwE.js → internal-token-D-t28de5.js} +1 -1
- package/server/{io-BiQ2Cs3k.js → io-DkC4sFSy.js} +42 -56
- package/server/{issue-closed-FApNiOOs.js → issue-closed-Cpl4VDUM.js} +41 -6
- package/server/{issue-lifecycle-C-K53ASY.js → issue-lifecycle-CFR8TJ22.js} +22 -37
- package/server/{issue-lifecycle-BkFWNjlD.js → issue-lifecycle-YNTy3OT3.js} +1 -1
- package/server/{issue-service-singleton-bG1WdSdQ.js → issue-service-singleton-D81mCts_.js} +1 -1
- package/server/{issue-service-singleton-CuHGpJJP.js → issue-service-singleton-ldvUUXi3.js} +29 -29
- package/server/{issues-CwQMphDH.js → issues-DIEHt9sq.js} +2 -2
- package/server/{jsonl-parser-dNIjHgym.js → jsonl-parser-Cd5jIqh7.js} +3 -3
- package/server/{label-cleanup-DYvAZknd.js → label-cleanup-Btny6Gyo.js} +3 -3
- package/server/{state-home-CRowbXqU.js → launcher-generator-BXLM9f4b.js} +7 -127
- package/server/{layers-CD6FysRU.js → layers-gCJlK62m.js} +2 -2
- package/server/lifecycle-D7aQUnTO.js +12 -0
- package/server/{lifecycle-io-C_Wu0_i-.js → lifecycle-io-DQBF-GHO.js} +1 -1
- package/server/{lifecycle-io-CeYxP3cE.js → lifecycle-io-FfPUtz-y.js} +36 -47
- package/server/{linear-client-EtVyblVz.js → linear-client-CDH2D6Qy.js} +3 -3
- package/server/{linear-client-4qoKnuQu.js → linear-client-WrYrUIAH.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-7rqkTUm2.js → merge-BsDgUxFz.js} +3 -3
- package/server/{merge-brm721Es.js → merge-Dervs4BF.js} +1 -1
- package/server/{merge-agent-4Zhlgvqp.js → merge-agent-D6DNhe9j.js} +64 -51
- package/server/{merge-agent-36wfYm2u.js → merge-agent-DMQTJMP0.js} +1 -1
- package/server/{merge-batch-itfnwdsT.js → merge-batch-Bv6Z5K2H.js} +1 -1
- package/server/{merge-blockers-Bto_Oe_o.js → merge-blockers-WWWi6Ur2.js} +2 -2
- package/server/merge-ops-h9OCnIVz.js +2 -0
- package/server/{merge-rebase-Czfqfe4q.js → merge-rebase-Czth9ggm.js} +2 -2
- package/server/{merge-set-BIkGQL9j.js → merge-set-DNc4zBqd.js} +3 -3
- package/server/{merge-set-G1RHcu3D.js → merge-set-vuE3MEVt.js} +1 -1
- package/server/{merge-sync-B43Dybea.js → merge-sync-B2KSk54U.js} +2 -2
- package/server/{merge-sync-DIrmlZUr.js → merge-sync-B9nHdUGx.js} +1 -1
- package/server/{merge-train-DGqVuNZV.js → merge-train-DJgr81tF.js} +3 -3
- package/server/{merge-train-deps-q15XLnAS.js → merge-train-deps-B2OWS0k9.js} +4 -4
- package/server/{merge-verification-Cqfxx6bE.js → merge-verification-BBIXUEqa.js} +4 -4
- package/server/{multipart-parser-CiPxxfUH.js → multipart-parser-9DhuAkPd.js} +2 -2
- package/server/{no-resume-mode-yrPEQ_pC.js → no-resume-mode-Gh5R_YLF.js} +1 -1
- package/server/node_modules/.package-lock.json +11 -11
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
- package/server/node_modules/toml/README.md +54 -0
- package/server/node_modules/toml/index.d.ts +42 -1
- package/server/node_modules/toml/index.js +3 -3
- package/server/node_modules/toml/lib/compiler.js +35 -3
- package/server/node_modules/toml/lib/parser.js +224 -143
- package/server/node_modules/toml/package.json +3 -1
- package/server/node_modules/ws/lib/receiver.js +15 -32
- package/server/node_modules/ws/lib/websocket-server.js +4 -4
- package/server/node_modules/ws/lib/websocket.js +4 -4
- package/server/node_modules/ws/package.json +5 -1
- package/server/{orphan-proposed-reconciler-BWWHn4Lr.js → orphan-proposed-reconciler-B8H41C4a.js} +14 -24
- package/server/{orphan-proposed-reconciler-DAD9FJtQ.js → orphan-proposed-reconciler-DbTmT7qy.js} +1 -1
- package/server/package-lock.json +12 -12
- package/server/package.json +1 -1
- package/server/{pan-dir-Bj7Hy8iu.js → pan-dir-BTw4MdSe.js} +4 -4
- package/server/{paths-C9DkhIOT.js → paths-Btkc8mzp.js} +2 -2
- package/server/{pickup-CKRuGDsB.js → pickup-BtvRBbvI.js} +1 -1
- package/server/{pipeline-notifier-BkKbQ8ji.js → pipeline-notifier-3frIvSi3.js} +1 -1
- package/server/{pipeline-notifier-CAurUste.js → pipeline-notifier-DTd19f18.js} +2 -2
- package/server/{project-pipelines-BRWaGmI4.js → project-pipelines-B95fcAek.js} +2 -2
- package/server/projects-Dc9aoVoG.js +3 -0
- package/server/{prompts-DfI5qbTW.js → prompts-CIVmjHxn.js} +2 -2
- package/server/{providers-D-5txBRc.js → providers-BLLk5IIb.js} +1 -1
- package/server/{providers-CWDXoaMA.js → providers-C-yWibCk.js} +7 -7
- package/server/public/assets/chunk-BO2N2NFS-DzKZyoKY.js +103 -0
- package/server/public/assets/{diagram-OG6HWLK6-Avtvq2qI.js → diagram-OG6HWLK6-Cx8mWUb8.js} +1 -1
- package/server/public/assets/{dist-BEHQuasD.js → dist-BqccLhaw.js} +3 -3
- package/server/public/assets/{dist-BvmY-qb1.js → dist-rC3nAs_O.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-7KhCd0fH.js → ganttDiagram-6RSMTGT7-DLYPLf5T.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-iQoBMTf0.js → highlighted-body-OFNGDK62-D4DqixbV.js} +1 -1
- package/server/public/assets/index-CPcysUHk.js +796 -0
- package/server/public/assets/index-H5M0yhM4.css +1 -0
- package/server/public/assets/{linear-CiJHW9g5.js → linear-yqcXkDfj.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-CWdZ_heB.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BOhmvUhW.js → pieDiagram-4H26LBE5-DhraIOaV.js} +1 -1
- package/server/public/assets/{prod-DmLBBqat.js → prod-DKUunUdN.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Cjku660G.js → quadrantDiagram-W4KKPZXB-DPiRcToa.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-D52w5oPh.js → sankeyDiagram-5OEKKPKP-3An5HNkZ.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-BTO07_Iv.js → xychartDiagram-2RQKCTM6-lbEOjfqQ.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-CKZPWhjD.js → pull-requests-D7AL5woD.js} +1 -1
- package/server/{pull-requests-Bmre-Xlz.js → pull-requests-NDDNtqNq.js} +3 -3
- package/server/{agents-CsOzAmRg.js → queries-C0LCGG21.js} +743 -399
- package/server/{rally-BBd9tQ__.js → rally-4oKvnxLG.js} +3 -3
- package/server/rally-DF5a3ioP.js +3 -0
- package/server/{rally-api-DxZFObI_.js → rally-api-41tT6ikZ.js} +2 -2
- package/server/{rally-api-DDc85HIz.js → rally-api-BsaQ8Vnz.js} +1 -1
- package/server/{rally-client-DvvLiAQP.js → rally-client-Bo4hNcCZ.js} +5 -5
- package/server/{rally-client-BADHn0m_.js → rally-client-b5PT1x5L.js} +1 -1
- package/server/{reap-terminal-sessions-D_xvy-Mk.js → reap-terminal-sessions-BR39qflC.js} +1 -1
- package/server/{reap-terminal-sessions-D6JDJsqF.js → reap-terminal-sessions-CFkuquQj.js} +1 -1
- package/server/{rebuild-stack-GOsWqXi3.js → rebuild-stack-C7JPUom6.js} +1 -1
- package/server/{rebuild-stack-D19i080j.js → rebuild-stack-Ddv6W017.js} +6 -6
- package/server/{reconstruct-cache-lQrG4xGg.js → reconstruct-cache-Gqhm---K.js} +6 -6
- package/server/record-DLOqfbkI.js +3 -0
- package/server/record-update-BltEmPge.js +168 -0
- package/server/record-update-CDp7aTaT.js +3 -0
- package/server/recovery-trip-Cn7KJVkS.js +44 -0
- package/server/{release-engine-DxcMWRuK.js → release-engine-BYzmIBf9.js} +5 -5
- package/server/{release-set-BYsgX7o6.js → release-set-7pnxFOWR.js} +3 -3
- package/server/{remote-DmeL21dF.js → remote-Cvu4CSDk.js} +3 -3
- package/server/{remote-agents-BfQBE6MN.js → remote-agents-C2C6z9tj.js} +6 -33
- package/server/{remote-agents-DlvbzO7m.js → remote-agents-DYY5fFpd.js} +1 -1
- package/server/{remote-completion-BgkiSQmx.js → remote-completion-2Kb4IDg_.js} +13 -13
- package/server/{remote-8W2Yhygw.js → remote-rN0ecjHE.js} +3 -3
- package/server/resume-BFLl-yLn.js +3 -0
- package/server/{review-agent-D025Wt7w.js → review-agent-BZvk0N5G.js} +31 -23
- package/server/{review-agent-Rub0OpZc.js → review-agent-CpSHLzed.js} +1 -1
- package/server/{review-artifacts-CX951jTU.js → review-artifacts-PCo53YMn.js} +5 -19
- package/server/{review-context-DGGGR_w5.js → review-context-M7QtJlJq.js} +8 -8
- package/server/{review-monitor-0_qqMcnS.js → review-monitor-BLC5mTTg.js} +2 -2
- package/server/{review-status-Br6lAFGO.js → review-status-77N3PoZr.js} +1 -1
- package/server/{review-status-4qqLkRMu.js → review-status-DANr0t-v.js} +33 -59
- package/server/{review-status-enrichment-Cr8m3uVL.js → review-status-enrichment-DwOg4UfL.js} +3 -3
- package/server/{review-status-sync-D3KUhsdA.js → review-status-sync-Bd08OOFA.js} +1 -1
- package/server/{review-status-sync-OC-l1lNt.js → review-status-sync-BjTUJ5fx.js} +2 -2
- package/server/{review-verdict-feedback-YOzmsq9G.js → review-verdict-feedback-BsFLjN_6.js} +1 -1
- package/server/{review-verdict-feedback-DrWMuRaj.js → review-verdict-feedback-CBf-J_wS.js} +8 -8
- package/server/{rollup-CnxbwaLH.js → rollup-Bu0f2EyN.js} +8 -8
- package/server/{rollup-DmazRY0j.js → rollup-DTCCdEy4.js} +1 -1
- package/server/{scanner-DE1MqAaF.js → scanner-BlZ2vB7j.js} +7 -7
- package/server/{sequence-io-C0uoqfGx.js → sequence-io-ylyDtz2J.js} +4 -4
- package/server/{sequencer-agent-i-b2u4SJ.js → sequencer-agent-DsWQ-87H.js} +6 -17
- package/server/server.js +5670 -6392
- package/server/{service-D0_gh2tl.js → service-CLVBC_1Y.js} +116 -90
- package/server/{session-fork-DZ12vipL.js → session-fork-DlEIAhRy.js} +2 -2
- package/server/session-history-bnOFKMwf.js +168 -0
- package/server/settings-CP3GGon2.js +2 -0
- package/server/{settings-ByqjPtFO.js → settings-Cqa-8nyj.js} +2 -2
- package/server/{settings-DCC4BAqj.js → settings-gJrdLZy2.js} +3 -3
- package/server/{shadow-engineering-BhnmtW5m.js → shadow-engineering-fq1YEKV3.js} +3 -3
- package/server/{shadow-state-ByXZehsy.js → shadow-state-BqeFAygK.js} +1 -1
- package/server/{shadow-state-CKm8xWX9.js → shadow-state-RptE9Cau.js} +2 -2
- package/server/shadow-utils-BMWr5tRT.js +39 -0
- package/server/{ship-log-DE_0Cv_i.js → ship-log-BRQQi2lU.js} +1 -1
- package/server/{smart-compaction-D5Zen3AA.js → smart-compaction-CmoXpjeU.js} +7 -7
- package/server/{smart-compaction-h4_ca6Uk.js → smart-compaction-DldUel4B.js} +1 -1
- package/server/{spawn-planning-session-Dueit4WX.js → spawn-planning-session-CoS6LTc6.js} +16 -16
- package/server/{spawn-planning-session-Bgi7Ub02.js → spawn-planning-session-DT2tSMxo.js} +1 -1
- package/server/{specialist-completion-BZ8M-WZ0.js → specialist-completion-pJtESo7m.js} +1 -1
- package/server/{specialist-context-BMq83C58.js → specialist-context-CspI4Eog.js} +5 -5
- package/server/{specialist-handoff-logger-BxX1YefH.js → specialist-handoff-logger-Duz9RGvk.js} +2 -2
- package/server/{specialist-logs-BWZYcJ6P.js → specialist-logs-DtSkPJZK.js} +3 -3
- package/server/{specialists-ZkW4Mb7U.js → specialists-CywEMwxk.js} +1 -1
- package/server/{specialists-8ZAguXef.js → specialists-D9-dMUtI.js} +1 -1
- package/server/{specialists-BudKrjOu.js → specialists-Dax7tqXC.js} +1817 -560
- package/server/{specialists-DrPrC9Y9.js → specialists-GF42OOqd.js} +18 -18
- package/server/specs-VwcFtEDi.js +3 -0
- package/server/{src-DHn4Rd2F.js → src-By3D85Ry.js} +77 -1
- package/server/{src-Dv6L03vW.js → src-CqyFg52C.js} +5 -5
- package/server/{src-DNUUqkec.js → src-DhxM-eCb.js} +6 -6
- package/server/{stack-health-Dclm7_tu.js → stack-health-BsEVrJZ6.js} +1 -1
- package/server/{stack-health-DxsTx7II.js → stack-health-C-SnpRHh.js} +2 -2
- package/server/stale-task-claims-vTxmRzLi.js +69 -0
- package/server/state-home-Bur1y4oH.js +213 -0
- package/server/{state-mapping-BvAgFK8n.js → state-mapping-Ci0pkac4.js} +1 -1
- package/server/state-migrate-D3VveYfO.js +362 -0
- package/server/{stuck-remediation-CFWUP8_I.js → stuck-remediation-B699-p8v.js} +63 -46
- package/server/{stuck-remediation-CLHd-lrF.js → stuck-remediation-CaFYYTQW.js} +1 -1
- package/server/{summary-fork-CKc01Our.js → summary-fork-BxnF8Xh0.js} +2 -2
- package/server/{summary-fork-CtCwBJ2Z.js → summary-fork-COqYpVa3.js} +8 -8
- package/server/supervisor/{paths-3R6b989k.js → paths-Bk6hJRH9.js} +4 -3
- package/server/supervisor/pty-supervisor.js +2 -2
- package/server/supervisor/{pty-token-CScQ32Rj.js → pty-token-BZS5GYdG.js} +2 -2
- package/server/supervisor-eWAAmXKu.js +2 -0
- package/server/{supervisor-BA5D72Qa.js → supervisor-liMgIPDF.js} +2 -2
- package/server/{swarm-readiness-CL5sM9B1.js → swarm-readiness-sXB1vhzo.js} +3 -3
- package/server/{system-prerequisites-DmFSXIE5.js → system-prerequisites-Bz6KdkFJ.js} +1 -13
- package/server/{teardown-workspace-DWmFJzTw.js → teardown-workspace-DvzqnmUF.js} +14 -71
- package/server/{test-agent-queue-DjsQoV5X.js → test-agent-queue-hAU1Ah08.js} +6 -6
- package/server/{test-verdict-BSqsQp3G.js → test-verdict-CRsPpByy.js} +1 -1
- package/server/{test-verdict-D1AmZ2c0.js → test-verdict-CXMLATGc.js} +1 -1
- package/server/{tldr-daemon-C-MGomL8.js → tldr-daemon-Bam7Xhoo.js} +2 -2
- package/server/{tldr-daemon-DD9rI5gA.js → tldr-daemon-DhGwd88s.js} +1 -1
- package/server/tmux-C-rgxRDA.js +3 -0
- package/server/{tmux-C_d-lSIq.js → tmux-U55cNGFG.js} +92 -4
- package/server/{token-DfBf1bsd.js → token-Dsa-i36o.js} +2 -2
- package/server/{token-util-CROoF5ic.js → token-util-BWNpH96m.js} +1 -1
- package/server/token-util-DRt0j2nQ.js +3 -0
- package/server/{tracker-config-CNODpd11.js → tracker-config-OkdbaUCm.js} +2 -2
- package/server/{tracker-utils-Ch2_5GGf.js → tracker-utils-CghXMF3q.js} +2 -2
- package/server/{tracker-utils-B9ZoVA9b.js → tracker-utils-DdzUiPNU.js} +1 -1
- package/server/{traefik-connect-BF4x_LUQ.js → traefik-connect-CZYB3dlm.js} +1 -1
- package/server/{tunnel-r_5nHAI6.js → tunnel-D1YxesBL.js} +3 -3
- package/server/{tunnel-YD80_IHr.js → tunnel-DjlzgTl3.js} +1 -1
- package/server/typed-errors-CH4roFIj.js +3 -0
- package/server/{typed-errors-BEJhbjJg.js → typed-errors-n_Tnb4Fh.js} +3 -4
- package/server/{types-CE1m_daD.js → types-DOjWNv3Z.js} +1 -1
- package/server/{types-33JEP4LZ.js → types-DXBMm4mX.js} +1 -1
- package/server/{uat-train-DDI00aqD.js → uat-train-CaaWs9Rp.js} +1 -1
- package/server/{uat-train-DjkFWXge.js → uat-train-CqN34zFx.js} +24 -25
- package/server/{validation-DUTiJnyz.js → validation-4-z2Cw4z.js} +70 -23
- package/server/validation-DpTNakM6.js +3 -0
- package/server/verification-artifact-DK1xb1zG.js +56 -0
- package/server/verification-artifact-JD_edpZ9.js +2 -0
- package/server/{verification-runner-inLgeQux.js → verification-runner-BjHN80pJ.js} +338 -58
- package/server/verification-runner-ShYu5Ph3.js +2 -0
- package/server/{work-agent-prompt-fZljjA1_.js → work-agent-prompt-BiJ43Der.js} +12 -88
- package/server/workflows-B4C3lY9E.js +2 -0
- package/server/{workflows-oBnJ7Tm0.js → workflows-DkTotz_m.js} +17 -24
- package/server/{workspace-CNuW2j41.js → workspace-CuN0ev4Z.js} +3 -3
- package/server/{workspace-B2WOW9Hw.js → workspace-DQ4vVivd.js} +1 -1
- package/server/{workspace-config-CBgMGhWs.js → workspace-config-C77NKnsV.js} +1 -1
- package/server/{workspace-manager-DjUAJCSs.js → workspace-manager-B1mYn0lN.js} +1 -1
- package/server/{workspace-manager-CB-R07R3.js → workspace-manager-Beeo2aKF.js} +23 -48
- package/server/{workspace-metadata-9Nn5kgRl.js → workspace-metadata-BZC5BmoP.js} +2 -2
- package/server/{workspace-metadata-Fd58uUQG.js → workspace-metadata-Cy7_ZACL.js} +1 -1
- package/server/{workspaces-BjWXntty.js → workspaces-CGuzW1Ia.js} +191 -153
- package/sync-sources/hooks/ask-user-question-hook +7 -1
- package/sync-sources/hooks/codex-notify-hook +64 -8
- package/sync-sources/hooks/record-cost-event.js +1109 -36
- package/sync-sources/hooks/record-cost-event.js.map +1 -1
- package/sync-sources/hooks/statusline.sh +2 -2
- package/sync-sources/hooks/work-agent-stop-hook +1 -2
- package/server/acceptance-criteria-DHZk2ceV.js +0 -33
- package/server/agent-runtime-mirror-DrWxopNA.js +0 -37
- package/server/agent-state-EP2QFV9n.js +0 -3
- package/server/agents-DCvyTXNU.js +0 -3
- package/server/auto-commit-QAfsu3Sb.js +0 -3
- package/server/bd-process-lock-D3S4T4o-.js +0 -390
- package/server/beads-BGGxrkZ5.js +0 -649
- package/server/beads-CYsLiyIM.js +0 -2
- package/server/beads-query-B1DlJVp9.js +0 -95
- package/server/beads-restore-CyygSmmn.js +0 -23
- package/server/cli-ClIQwgMI.js +0 -3
- package/server/codex-B7DTpwEw.js +0 -3
- package/server/compact-beads-CK_hHEnB.js +0 -3
- package/server/compact-beads-DKL54y6j.js +0 -94
- package/server/deacon-swarm-BY5hKNaU.js +0 -2
- package/server/dist-DGTwcZhI.js +0 -3
- package/server/export-Dx_qJ3h8.js +0 -87
- package/server/forge-XlDgPQWs.js +0 -2
- package/server/hume-K1pi8jC4.js +0 -3
- package/server/inspect-agent-477VxQim.js +0 -2
- package/server/lifecycle-C_73gi-C.js +0 -14
- package/server/merge-ops-PzqsW69V.js +0 -2
- package/server/projects-KJ94e50I.js +0 -3
- package/server/public/assets/chunk-BO2N2NFS-ClukPsZQ.js +0 -103
- package/server/public/assets/index-DUFDmvmH.css +0 -1
- package/server/public/assets/index-DnTZ2QeN.js +0 -796
- package/server/public/assets/mermaid-GHXKKRXX-DZJOwgBG.js +0 -1
- package/server/rally-Dc2Wnxw2.js +0 -3
- package/server/record-pyB6VA32.js +0 -3
- package/server/recovery-trip-Dfh1tNHn.js +0 -98
- package/server/resolver-dTpSSzaH.js +0 -158
- package/server/resume-DhcIqsTm.js +0 -3
- package/server/settings-yydgaqhv.js +0 -2
- package/server/specs-DwoAEGrW.js +0 -3
- package/server/supervisor-DHjumXlL.js +0 -2
- package/server/tmux-x291Gjjb.js +0 -3
- package/server/token-util-xNaV-00f.js +0 -3
- package/server/tracker-config-DItsdelv.js +0 -3
- package/server/typed-errors-DSPn_xWP.js +0 -3
- package/server/validation-ict8hnXk.js +0 -3
- package/server/verification-runner-ATaLbpr5.js +0 -2
- package/server/workflows-tU7KKxQi.js +0 -2
- package/server/writer-CQMGzEkw.js +0 -3
- package/server/writer-fe1-8iGc.js +0 -251
|
@@ -1,18 +1,187 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as init_review_status, f as markWorkspaceStuck, s as getReviewStatusSync, y as setReviewStatusSync } from "./review-status-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { n as
|
|
7
|
-
import { a as
|
|
8
|
-
import { n as
|
|
9
|
-
import {
|
|
1
|
+
import { Fn as init_projects, Jr as getOverdeckHome, Sn as findProjectByPathSync, Sr as init_errors, Yr as init_paths, Zr as packageRoot, cn as init_state_plane, qn as resolveProjectFromIssueSync, rr as init_issue_id } from "./config-yaml-CqaAyn8y.js";
|
|
2
|
+
import { C as init_review_status_source, c as init_review_status, f as markWorkspaceStuck, s as getReviewStatusSync, w as readReviewStatusMap, y as setReviewStatusSync } from "./review-status-DANr0t-v.js";
|
|
3
|
+
import { L as messageAgent, Q as stopAgent, Xn as setAgentPaused, s as init_agents } from "./queries-C0LCGG21.js";
|
|
4
|
+
import { n as init_tracker_utils } from "./tracker-utils-CghXMF3q.js";
|
|
5
|
+
import { m as readWorkspacePlanSync, o as init_io, t as VBriefMergeConflictError, v as init_types, y as subItemsOf } from "./io-DkC4sFSy.js";
|
|
6
|
+
import { n as init_shadow_utils } from "./shadow-utils-BMWr5tRT.js";
|
|
7
|
+
import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-Dn8o9ZyE.js";
|
|
8
|
+
import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-BXWdOiYI.js";
|
|
9
|
+
import { i as runQualityGates, n as init_validation, t as DEFAULT_GATES } from "./validation-4-z2Cw4z.js";
|
|
10
|
+
import { r as writeVerificationArtifact, t as readVerificationArtifact } from "./verification-artifact-DK1xb1zG.js";
|
|
11
|
+
import { n as getVBriefACStatusSync } from "./acceptance-criteria-aQFKQf-J.js";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { Data, Effect } from "effect";
|
|
10
14
|
import { existsSync } from "fs";
|
|
11
|
-
import { basename, dirname, join } from "path";
|
|
15
|
+
import { basename as basename$1, dirname as dirname$1, join as join$1 } from "path";
|
|
12
16
|
import { homedir } from "os";
|
|
17
|
+
import { closeSync as closeSync$1, existsSync as existsSync$1, mkdirSync as mkdirSync$1, openSync as openSync$1, readFileSync as readFileSync$1, renameSync as renameSync$1, writeFileSync as writeFileSync$1 } from "node:fs";
|
|
13
18
|
import { readdir } from "fs/promises";
|
|
14
|
-
import { exec } from "child_process";
|
|
15
|
-
import { promisify } from "util";
|
|
19
|
+
import { exec, spawn } from "node:child_process";
|
|
20
|
+
import { promisify } from "node:util";
|
|
21
|
+
import { exec as exec$1 } from "child_process";
|
|
22
|
+
import { promisify as promisify$1 } from "util";
|
|
23
|
+
//#region ../../lib/cloister/verification-feedback.ts
|
|
24
|
+
init_errors();
|
|
25
|
+
init_review_status_source();
|
|
26
|
+
init_review_status();
|
|
27
|
+
init_validation();
|
|
28
|
+
function buildFinalFailureInstructions(issueId) {
|
|
29
|
+
return `## NEEDS-YOU: Verification stuck
|
|
30
|
+
|
|
31
|
+
Automatic verification paused after repeated failures so it does not keep spending cycles on the same failing gate.
|
|
32
|
+
|
|
33
|
+
Fix every reported failure, commit and push the corrections, then run \`pan done ${issueId} -c "<summary>"\`. That command resets verification and returns the latest commit to the normal review, test, and merge pipeline. If you cannot complete the fixes, report the concrete blocker for operator help.`;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region ../../lib/cloister/verification-worker-supervisor.ts
|
|
37
|
+
init_paths();
|
|
38
|
+
const POLL_MS = 250;
|
|
39
|
+
const MAX_RUN_MS = 3900 * 1e3;
|
|
40
|
+
function safeIssueId(issueId) {
|
|
41
|
+
return issueId.toLowerCase().replace(/[^a-z0-9-]/g, "-");
|
|
42
|
+
}
|
|
43
|
+
function workerDir(issueId) {
|
|
44
|
+
return join(getOverdeckHome(), "verification-workers", safeIssueId(issueId));
|
|
45
|
+
}
|
|
46
|
+
function statePath(issueId) {
|
|
47
|
+
return join(workerDir(issueId), "state.json");
|
|
48
|
+
}
|
|
49
|
+
function isProcessAlive(pid) {
|
|
50
|
+
try {
|
|
51
|
+
process.kill(pid, 0);
|
|
52
|
+
return true;
|
|
53
|
+
} catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function readVerificationWorkerState(issueId) {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(readFileSync$1(statePath(issueId), "utf8"));
|
|
60
|
+
return parsed.issueId === issueId && Number.isInteger(parsed.pid) ? parsed : null;
|
|
61
|
+
} catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function isVerificationWorkerActive(issueId) {
|
|
66
|
+
const state = readVerificationWorkerState(issueId);
|
|
67
|
+
return !!state && isProcessAlive(state.pid) && !existsSync$1(state.resultPath);
|
|
68
|
+
}
|
|
69
|
+
function writeJsonAtomic(path, value) {
|
|
70
|
+
const temp = `${path}.${process.pid}.tmp`;
|
|
71
|
+
writeFileSync$1(temp, `${JSON.stringify(value, null, 2)}\n`);
|
|
72
|
+
renameSync$1(temp, path);
|
|
73
|
+
}
|
|
74
|
+
async function waitForResult(state) {
|
|
75
|
+
const deadline = Date.now() + MAX_RUN_MS;
|
|
76
|
+
while (Date.now() < deadline) {
|
|
77
|
+
if (existsSync$1(state.resultPath)) return JSON.parse(readFileSync$1(state.resultPath, "utf8"));
|
|
78
|
+
if (!isProcessAlive(state.pid)) return {
|
|
79
|
+
outcome: "error",
|
|
80
|
+
message: `Verification worker ${state.pid} exited before writing a result`
|
|
81
|
+
};
|
|
82
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_MS));
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
outcome: "error",
|
|
86
|
+
message: `Verification worker ${state.pid} exceeded ${MAX_RUN_MS}ms`
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function runSupervisedVerification(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
|
|
90
|
+
const existing = readVerificationWorkerState(issueId);
|
|
91
|
+
if (existing && existing.workspacePath === workspacePath && isProcessAlive(existing.pid) && !existsSync$1(existing.resultPath)) {
|
|
92
|
+
console.log(`[${logPrefix}] Joining live verification worker ${existing.pid} for ${issueId}`);
|
|
93
|
+
return waitForResult(existing);
|
|
94
|
+
}
|
|
95
|
+
const dir = workerDir(issueId);
|
|
96
|
+
mkdirSync$1(dir, { recursive: true });
|
|
97
|
+
const runId = `${Date.now()}-${process.pid}`;
|
|
98
|
+
const resultPath = join(dir, `result-${runId}.json`);
|
|
99
|
+
const logPath = join(dir, `worker-${runId}.log`);
|
|
100
|
+
const workerPath = process.env.OVERDECK_VERIFICATION_WORKER_PATH || join(packageRoot, "dist", "verification-worker.js");
|
|
101
|
+
if (!existsSync$1(workerPath)) return {
|
|
102
|
+
outcome: "error",
|
|
103
|
+
message: `Verification worker bundle missing at ${workerPath}; run npm run build`
|
|
104
|
+
};
|
|
105
|
+
const logFd = openSync$1(logPath, "a");
|
|
106
|
+
const child = spawn(process.execPath, [workerPath, JSON.stringify({
|
|
107
|
+
issueId,
|
|
108
|
+
workspacePath,
|
|
109
|
+
workspaceInfo,
|
|
110
|
+
logPrefix,
|
|
111
|
+
options,
|
|
112
|
+
runId,
|
|
113
|
+
resultPath
|
|
114
|
+
})], {
|
|
115
|
+
detached: true,
|
|
116
|
+
stdio: [
|
|
117
|
+
"ignore",
|
|
118
|
+
logFd,
|
|
119
|
+
logFd
|
|
120
|
+
],
|
|
121
|
+
env: {
|
|
122
|
+
...process.env,
|
|
123
|
+
OVERDECK_VERIFICATION_WORKER: "1"
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
closeSync$1(logFd);
|
|
127
|
+
if (!child.pid) return {
|
|
128
|
+
outcome: "error",
|
|
129
|
+
message: "Failed to spawn verification worker"
|
|
130
|
+
};
|
|
131
|
+
const state = {
|
|
132
|
+
runId,
|
|
133
|
+
issueId,
|
|
134
|
+
workspacePath,
|
|
135
|
+
pid: child.pid,
|
|
136
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
137
|
+
resultPath
|
|
138
|
+
};
|
|
139
|
+
writeJsonAtomic(statePath(issueId), state);
|
|
140
|
+
child.unref();
|
|
141
|
+
console.log(`[${logPrefix}] Verification worker ${child.pid} supervising ${issueId}`);
|
|
142
|
+
return waitForResult(state);
|
|
143
|
+
}
|
|
144
|
+
//#endregion
|
|
145
|
+
//#region ../../lib/work/test-requirement-gate.ts
|
|
146
|
+
init_projects();
|
|
147
|
+
init_state_plane();
|
|
148
|
+
init_types();
|
|
149
|
+
init_io();
|
|
150
|
+
init_agents();
|
|
151
|
+
init_feedback_writer();
|
|
152
|
+
init_feedback_target();
|
|
153
|
+
/**
|
|
154
|
+
* Pure helpers for the PAN-1501 test-requirement gate.
|
|
155
|
+
*
|
|
156
|
+
* The gate detects when an issue's body asks for tests but the feature branch
|
|
157
|
+
* adds no new lines under test files. This module holds the pure functions only;
|
|
158
|
+
* orchestration lives in done-preflight.ts.
|
|
159
|
+
*/
|
|
160
|
+
init_issue_id();
|
|
161
|
+
init_shadow_utils();
|
|
162
|
+
init_tracker_utils();
|
|
163
|
+
promisify$1(exec$1);
|
|
164
|
+
Data.TaggedError("TrackerFetchError");
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region ../../lib/work/done-preflight.ts
|
|
167
|
+
init_errors();
|
|
168
|
+
promisify(exec);
|
|
169
|
+
const terminal = new Set(["completed", "cancelled"]);
|
|
170
|
+
function checkIncompletePlanItemsSync(workspacePath) {
|
|
171
|
+
const doc = readWorkspacePlanSync(workspacePath);
|
|
172
|
+
if (!doc) return [" The required vBRIEF checklist is missing or unreadable; return the issue to planning before completion."];
|
|
173
|
+
const incomplete = doc.plan.items.flatMap((item) => {
|
|
174
|
+
const lines = [];
|
|
175
|
+
if (!terminal.has(item.status)) lines.push(` - ${item.id} ${item.title} (${item.status})`);
|
|
176
|
+
for (const child of subItemsOf(item)) if (!terminal.has(child.status)) lines.push(` - ${item.id}.${child.id} ${child.title} (${child.status})`);
|
|
177
|
+
return lines;
|
|
178
|
+
});
|
|
179
|
+
return incomplete.length === 0 ? [] : [` Incomplete plan items (${incomplete.length}):`, ...incomplete];
|
|
180
|
+
}
|
|
181
|
+
async function checkIncompletePlanItemsPromise(workspacePath, _issueId) {
|
|
182
|
+
return checkIncompletePlanItemsSync(workspacePath);
|
|
183
|
+
}
|
|
184
|
+
//#endregion
|
|
16
185
|
//#region ../../lib/cloister/verification-runner.ts
|
|
17
186
|
/**
|
|
18
187
|
* Verification Runner — orchestrates the full verification gate lifecycle.
|
|
@@ -23,14 +192,8 @@ import { promisify } from "util";
|
|
|
23
192
|
*
|
|
24
193
|
* Extracted from dashboard/server to be independently testable.
|
|
25
194
|
*/
|
|
26
|
-
init_review_status();
|
|
27
|
-
init_validation();
|
|
28
|
-
init_feedback_writer();
|
|
29
|
-
init_feedback_target();
|
|
30
|
-
init_agents();
|
|
31
|
-
init_projects();
|
|
32
195
|
init_io();
|
|
33
|
-
const execAsync = promisify(exec);
|
|
196
|
+
const execAsync = promisify$1(exec$1);
|
|
34
197
|
const NO_PROGRESS_REPEAT_THRESHOLD = 2;
|
|
35
198
|
function isFinalVerificationAttempt(cycleCount) {
|
|
36
199
|
return cycleCount >= 3;
|
|
@@ -42,13 +205,6 @@ function shouldEscalateVerificationFailure(status, failedCheck, cycleCount) {
|
|
|
42
205
|
if (isFinalVerificationAttempt(cycleCount)) return true;
|
|
43
206
|
return cycleCount >= NO_PROGRESS_REPEAT_THRESHOLD && isRepeatFailedCheck(status, failedCheck);
|
|
44
207
|
}
|
|
45
|
-
function buildFinalFailureInstructions(issueId) {
|
|
46
|
-
return `## NEEDS-YOU: Verification stuck
|
|
47
|
-
|
|
48
|
-
This was the final allowed verification attempt. The work agent is paused so it does not keep spending cycles on the same failing gate.
|
|
49
|
-
|
|
50
|
-
An operator needs to inspect ${issueId}, decide whether to fix-forward manually, restart the agent with new instructions, or move the issue through the normal pipeline. Do not re-request review automatically.`;
|
|
51
|
-
}
|
|
52
208
|
function setStateDerivedVerificationFailure(issueId, failedCheck, summary, cycleCount, currentStatus) {
|
|
53
209
|
setReviewStatusSync(issueId, {
|
|
54
210
|
verificationStatus: "failed",
|
|
@@ -81,10 +237,58 @@ async function escalateVerificationStuck(issueId, failedCheck, cycleCount, summa
|
|
|
81
237
|
console.error(`[${logPrefix}] Failed to pause ${agentId} after verification stuck:`, err);
|
|
82
238
|
}
|
|
83
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* Boot reconciliation for interrupted verifications. Live supervised workers
|
|
242
|
+
* survive dashboard restarts and retain ownership of their running status.
|
|
243
|
+
* A running status without a live worker is orphaned, so reset it to pending
|
|
244
|
+
* and finalize the artifact rather than leaving the issue wedged forever.
|
|
245
|
+
*/
|
|
246
|
+
function reconcileInterruptedVerifications(logPrefix = "boot-reconciliation") {
|
|
247
|
+
let reset = 0;
|
|
248
|
+
try {
|
|
249
|
+
const statuses = readReviewStatusMap() ?? {};
|
|
250
|
+
for (const [issueId, status] of Object.entries(statuses)) {
|
|
251
|
+
if (status.verificationStatus !== "running") continue;
|
|
252
|
+
if (isVerificationWorkerActive(issueId)) {
|
|
253
|
+
console.log(`[${logPrefix}] preserved live supervised verification for ${issueId}`);
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
setReviewStatusSync(issueId, {
|
|
257
|
+
verificationStatus: "pending",
|
|
258
|
+
verificationNotes: "The supervised verification worker stopped before recording a result; verification re-runs on the next cycle."
|
|
259
|
+
});
|
|
260
|
+
reset += 1;
|
|
261
|
+
try {
|
|
262
|
+
const resolved = resolveProjectFromIssueSync(issueId);
|
|
263
|
+
const workspacePath = resolved ? join$1(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`) : null;
|
|
264
|
+
const artifact = workspacePath ? readVerificationArtifact(workspacePath) : null;
|
|
265
|
+
if (workspacePath && artifact?.outcome === "running") writeVerificationArtifact(workspacePath, issueId, [...artifact.gates.map((gate) => ({
|
|
266
|
+
name: gate.name,
|
|
267
|
+
passed: gate.passed,
|
|
268
|
+
required: gate.required,
|
|
269
|
+
output: gate.output ?? "",
|
|
270
|
+
durationMs: gate.durationMs,
|
|
271
|
+
...gate.error ? { error: gate.error } : {}
|
|
272
|
+
})), {
|
|
273
|
+
name: artifact.currentGate ?? "interrupted",
|
|
274
|
+
passed: false,
|
|
275
|
+
required: true,
|
|
276
|
+
output: "The supervised verification worker stopped unexpectedly before this gate finished.",
|
|
277
|
+
durationMs: 0,
|
|
278
|
+
error: "supervised verification worker stopped unexpectedly"
|
|
279
|
+
}]);
|
|
280
|
+
} catch {}
|
|
281
|
+
console.log(`[${logPrefix}] reset stale running verification for ${issueId} (PAN-2669)`);
|
|
282
|
+
}
|
|
283
|
+
} catch (err) {
|
|
284
|
+
console.warn(`[${logPrefix}] interrupted-verification sweep failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
285
|
+
}
|
|
286
|
+
return reset;
|
|
287
|
+
}
|
|
84
288
|
async function deliverVerificationFeedback(issueId, message, details, logPrefix) {
|
|
85
289
|
const target = await resolveIssueFeedbackTarget(issueId);
|
|
86
290
|
if ("agentId" in target) {
|
|
87
|
-
await messageAgent(target.agentId, message);
|
|
291
|
+
await messageAgent(target.agentId, message, "internal", { owesRework: true });
|
|
88
292
|
console.log(`[${logPrefix}] Sent verification feedback for ${issueId} to ${target.agentId}`);
|
|
89
293
|
return;
|
|
90
294
|
}
|
|
@@ -94,20 +298,20 @@ async function deliverVerificationFeedback(issueId, message, details, logPrefix)
|
|
|
94
298
|
});
|
|
95
299
|
}
|
|
96
300
|
async function resolveGitDirs(workspacePath, projectConfig) {
|
|
97
|
-
if (!(projectConfig?.workspace?.type === "polyrepo") && existsSync(join(workspacePath, ".git"))) return {
|
|
301
|
+
if (!(projectConfig?.workspace?.type === "polyrepo") && existsSync(join$1(workspacePath, ".git"))) return {
|
|
98
302
|
gitDirs: [workspacePath],
|
|
99
303
|
isPolyrepo: false
|
|
100
304
|
};
|
|
101
305
|
const gitDirs = [];
|
|
102
306
|
try {
|
|
103
307
|
const entries = await readdir(workspacePath, { withFileTypes: true });
|
|
104
|
-
for (const entry of entries) if (entry.isDirectory() && !entry.name.startsWith(".") && existsSync(join(workspacePath, entry.name, ".git"))) gitDirs.push(join(workspacePath, entry.name));
|
|
308
|
+
for (const entry of entries) if (entry.isDirectory() && !entry.name.startsWith(".") && existsSync(join$1(workspacePath, entry.name, ".git"))) gitDirs.push(join$1(workspacePath, entry.name));
|
|
105
309
|
} catch {}
|
|
106
310
|
if (gitDirs.length > 0) return {
|
|
107
311
|
gitDirs,
|
|
108
312
|
isPolyrepo: true
|
|
109
313
|
};
|
|
110
|
-
if (existsSync(join(workspacePath, ".git"))) return {
|
|
314
|
+
if (existsSync(join$1(workspacePath, ".git"))) return {
|
|
111
315
|
gitDirs: [workspacePath],
|
|
112
316
|
isPolyrepo: false
|
|
113
317
|
};
|
|
@@ -117,7 +321,7 @@ async function resolveGitDirs(workspacePath, projectConfig) {
|
|
|
117
321
|
};
|
|
118
322
|
}
|
|
119
323
|
async function syncSingleRepo(gitDir, targetBranch) {
|
|
120
|
-
const repoName = basename(gitDir);
|
|
324
|
+
const repoName = basename$1(gitDir);
|
|
121
325
|
try {
|
|
122
326
|
await execAsync(`git fetch origin ${targetBranch}`, {
|
|
123
327
|
cwd: gitDir,
|
|
@@ -188,8 +392,8 @@ function getSyncTargetBranch(workspacePath, projectConfig, repoName) {
|
|
|
188
392
|
const matchingRepo = projectConfig.workspace?.repos?.find((repo) => repo.name === repoName);
|
|
189
393
|
return matchingRepo?.pr_target || projectConfig.workspace?.pr_target || matchingRepo?.default_branch || projectConfig.workspace?.default_branch || "main";
|
|
190
394
|
}
|
|
191
|
-
const wsName = basename(workspacePath);
|
|
192
|
-
const matchingRepo = projectConfig.workspace?.repos?.find((repo) => repo.name === wsName || basename(repo.path) === wsName);
|
|
395
|
+
const wsName = basename$1(workspacePath);
|
|
396
|
+
const matchingRepo = projectConfig.workspace?.repos?.find((repo) => repo.name === wsName || basename$1(repo.path) === wsName);
|
|
193
397
|
return matchingRepo?.pr_target || projectConfig.workspace?.pr_target || matchingRepo?.default_branch || projectConfig.workspace?.default_branch || "main";
|
|
194
398
|
}
|
|
195
399
|
/**
|
|
@@ -201,7 +405,7 @@ function getSyncTargetBranch(workspacePath, projectConfig, repoName) {
|
|
|
201
405
|
* sync-sources/, config) counts as content and is NOT flagged.
|
|
202
406
|
*/
|
|
203
407
|
function changesetHasNoContent(changedFiles) {
|
|
204
|
-
return changedFiles.map((f) => f.trim()).filter(Boolean).filter((f) => !f.startsWith(".pan/") && !f.
|
|
408
|
+
return changedFiles.map((f) => f.trim()).filter(Boolean).filter((f) => !f.startsWith(".pan/") && !f.endsWith(".vbrief.json")).length === 0;
|
|
205
409
|
}
|
|
206
410
|
async function runVerificationForIssuePromise(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
|
|
207
411
|
const currentStatus = getReviewStatusSync(issueId);
|
|
@@ -224,9 +428,9 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
224
428
|
else {
|
|
225
429
|
const syncResults = [];
|
|
226
430
|
for (const gitDir of gitDirs) {
|
|
227
|
-
const repoName = isPolyrepo ? basename(gitDir) : void 0;
|
|
431
|
+
const repoName = isPolyrepo ? basename$1(gitDir) : void 0;
|
|
228
432
|
const targetBranch = getSyncTargetBranch(workspacePath, projectConfig, repoName);
|
|
229
|
-
const displayName = repoName || basename(workspacePath);
|
|
433
|
+
const displayName = repoName || basename$1(workspacePath);
|
|
230
434
|
console.log(`[${logPrefix}] Syncing ${targetBranch} into ${displayName} for ${issueId}...`);
|
|
231
435
|
syncResults.push(await syncSingleRepo(gitDir, targetBranch));
|
|
232
436
|
}
|
|
@@ -254,8 +458,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
254
458
|
}));
|
|
255
459
|
if (fileResult.success) {
|
|
256
460
|
const hasConflicts = failures.some((f) => f.hasConflicts);
|
|
257
|
-
const repoList = isPolyrepo ? failures.map((f) => f.repoName).join(", ") : basename(workspacePath);
|
|
258
|
-
await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck}${hasConflicts ? " — merge conflicts" : ""} in ${repoList} after
|
|
461
|
+
const repoList = isPolyrepo ? failures.map((f) => f.repoName).join(", ") : basename$1(workspacePath);
|
|
462
|
+
await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck}${hasConflicts ? " — merge conflicts" : ""} in ${repoList} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck}${hasConflicts ? " — merge conflicts" : ""} in ${repoList}.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, fix the sync issues, commit and push every change, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
|
|
259
463
|
failedCheck,
|
|
260
464
|
feedbackPath: fileResult.filePath
|
|
261
465
|
}, logPrefix);
|
|
@@ -271,7 +475,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
271
475
|
};
|
|
272
476
|
}
|
|
273
477
|
for (const result of syncResults) {
|
|
274
|
-
const displayName = isPolyrepo ? result.repoName : basename(workspacePath);
|
|
478
|
+
const displayName = isPolyrepo ? result.repoName : basename$1(workspacePath);
|
|
275
479
|
if (result.alreadyUpToDate) console.log(`[${logPrefix}] ${displayName}: Already up to date with ${result.targetBranch}`);
|
|
276
480
|
else console.log(`[${logPrefix}] ${displayName}: Merged latest ${result.targetBranch}`);
|
|
277
481
|
}
|
|
@@ -279,20 +483,20 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
279
483
|
else console.log(`[${logPrefix}] Skipping target-branch sync for ${issueId}; verifying current workspace state`);
|
|
280
484
|
const gates = projectConfig?.quality_gates && Object.keys(projectConfig.quality_gates).length > 0 ? projectConfig.quality_gates : DEFAULT_GATES;
|
|
281
485
|
console.log(`[${logPrefix}] Project: ${projectConfig?.name || "NOT FOUND"}, gates: [${Object.keys(gates).join(", ")}], workspace: ${workspacePath}`);
|
|
282
|
-
const featureFolder = basename(workspacePath);
|
|
486
|
+
const featureFolder = basename$1(workspacePath);
|
|
283
487
|
const featureName = featureFolder.replace(/^feature-/, "");
|
|
284
|
-
const projectPath = projectConfig?.path || dirname(dirname(workspacePath));
|
|
488
|
+
const projectPath = projectConfig?.path || dirname$1(dirname$1(workspacePath));
|
|
285
489
|
const domain = projectConfig?.workspace?.dns?.domain || "localhost";
|
|
286
490
|
const changedBase = `origin/${getSyncTargetBranch(workspacePath, projectConfig, void 0)}`;
|
|
287
491
|
const placeholders = {
|
|
288
492
|
FEATURE_NAME: featureName,
|
|
289
493
|
FEATURE_FOLDER: featureFolder,
|
|
290
494
|
BRANCH_NAME: `feature/${featureName}`,
|
|
291
|
-
COMPOSE_PROJECT: `${basename(projectPath)}-${featureFolder}`,
|
|
495
|
+
COMPOSE_PROJECT: `${basename$1(projectPath)}-${featureFolder}`,
|
|
292
496
|
DOMAIN: domain,
|
|
293
|
-
PROJECT_NAME: basename(projectPath),
|
|
497
|
+
PROJECT_NAME: basename$1(projectPath),
|
|
294
498
|
PROJECT_PATH: projectPath,
|
|
295
|
-
PROJECTS_DIR: dirname(projectPath),
|
|
499
|
+
PROJECTS_DIR: dirname$1(projectPath),
|
|
296
500
|
WORKSPACE_PATH: workspacePath,
|
|
297
501
|
HOME: homedir(),
|
|
298
502
|
CHANGED_BASE: changedBase
|
|
@@ -313,7 +517,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
313
517
|
}
|
|
314
518
|
const workspacePackages = projectConfig?.workspace_packages;
|
|
315
519
|
if (workspacePackages) for (const pkg of workspacePackages) {
|
|
316
|
-
const pkgPath = join(workspacePath, pkg.path);
|
|
520
|
+
const pkgPath = join$1(workspacePath, pkg.path);
|
|
317
521
|
try {
|
|
318
522
|
console.log(`[${logPrefix}] Building workspace package: ${pkg.path}`);
|
|
319
523
|
await execAsync(pkg.build_command, {
|
|
@@ -326,20 +530,56 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
326
530
|
}
|
|
327
531
|
}
|
|
328
532
|
} else console.log(`[${logPrefix}] Polyrepo workspace — per-repo dependencies managed by quality gates`);
|
|
329
|
-
const
|
|
533
|
+
const liveGateResults = [];
|
|
534
|
+
let liveGateName;
|
|
535
|
+
let liveGateTail = "";
|
|
536
|
+
let lastTailWriteMs = 0;
|
|
537
|
+
const writeLiveArtifact = () => {
|
|
538
|
+
try {
|
|
539
|
+
writeVerificationArtifact(workspacePath, issueId, liveGateResults, {
|
|
540
|
+
currentGate: liveGateName,
|
|
541
|
+
currentGateOutput: liveGateTail || void 0
|
|
542
|
+
});
|
|
543
|
+
} catch {}
|
|
544
|
+
};
|
|
545
|
+
writeLiveArtifact();
|
|
546
|
+
const gateResults = await Effect.runPromise(runQualityGates(gates, workspacePath, "pre_push", {
|
|
330
547
|
isRemote: workspaceInfo.isRemote,
|
|
331
548
|
vmName: workspaceInfo.vmName,
|
|
332
549
|
placeholders,
|
|
333
|
-
...options.onGateLog ? { onLog: options.onGateLog } : {}
|
|
334
|
-
|
|
550
|
+
...options.onGateLog ? { onLog: options.onGateLog } : {},
|
|
551
|
+
onGateStart: (name) => {
|
|
552
|
+
liveGateName = name;
|
|
553
|
+
liveGateTail = "";
|
|
554
|
+
writeLiveArtifact();
|
|
555
|
+
},
|
|
556
|
+
onGateOutput: (_name, chunk) => {
|
|
557
|
+
liveGateTail = (liveGateTail + chunk.replace(/\u001b\[[0-9;]*[A-Za-z]/g, "")).slice(-4e3);
|
|
558
|
+
const now = Date.now();
|
|
559
|
+
if (now - lastTailWriteMs >= 1e3) {
|
|
560
|
+
lastTailWriteMs = now;
|
|
561
|
+
writeLiveArtifact();
|
|
562
|
+
}
|
|
563
|
+
},
|
|
564
|
+
onGateResult: (result) => {
|
|
565
|
+
liveGateResults.push(result);
|
|
566
|
+
liveGateName = void 0;
|
|
567
|
+
liveGateTail = "";
|
|
568
|
+
writeLiveArtifact();
|
|
569
|
+
}
|
|
570
|
+
}));
|
|
571
|
+
const failedGate = gateResults.find((r) => !r.passed && r.required !== false);
|
|
335
572
|
if (failedGate?.infraUnavailable) {
|
|
573
|
+
try {
|
|
574
|
+
writeVerificationArtifact(workspacePath, issueId, gateResults);
|
|
575
|
+
} catch {}
|
|
336
576
|
console.warn(`[${logPrefix}] Gate "${failedGate.name}" could not run for ${issueId}: ${failedGate.error} — triggering workspace stack rebuild, attempt NOT counted (${currentCycles}/3 used)`);
|
|
337
577
|
setReviewStatusSync(issueId, {
|
|
338
578
|
verificationStatus: "pending",
|
|
339
579
|
verificationNotes: `Verification deferred: ${failedGate.error}. Workspace stack rebuild triggered; verification re-runs on the next cycle.`
|
|
340
580
|
});
|
|
341
581
|
try {
|
|
342
|
-
const { rebuildWorkspaceStack } = await import("./rebuild-stack-
|
|
582
|
+
const { rebuildWorkspaceStack } = await import("./rebuild-stack-C7JPUom6.js");
|
|
343
583
|
Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[${logPrefix}] ${issueId} stack rebuild: ${m}`) })).then((r) => {
|
|
344
584
|
if (!r.success) console.warn(`[${logPrefix}] Stack rebuild for ${issueId} failed: ${r.error}`);
|
|
345
585
|
});
|
|
@@ -353,6 +593,11 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
353
593
|
maxCycles: 3
|
|
354
594
|
};
|
|
355
595
|
}
|
|
596
|
+
try {
|
|
597
|
+
writeVerificationArtifact(workspacePath, issueId, gateResults);
|
|
598
|
+
} catch (artifactErr) {
|
|
599
|
+
console.warn(`[${logPrefix}] Could not write verification artifact for ${issueId}: ${artifactErr.message}`);
|
|
600
|
+
}
|
|
356
601
|
if (failedGate) {
|
|
357
602
|
const newCycleCount = currentCycles + 1;
|
|
358
603
|
const failedCheck = failedGate.name;
|
|
@@ -378,7 +623,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
378
623
|
summary: `Verification FAILED at ${failedCheck} (attempt ${newCycleCount}/3)`,
|
|
379
624
|
markdownBody: feedbackBody
|
|
380
625
|
}));
|
|
381
|
-
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalate ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after
|
|
626
|
+
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalate ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck}.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, fix the failing check, commit every change, and invoke /rebase-and-submit. The skill will push and request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
|
|
382
627
|
failedCheck,
|
|
383
628
|
feedbackPath: fileResult.filePath
|
|
384
629
|
}, logPrefix);
|
|
@@ -412,7 +657,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
412
657
|
summary: `vBRIEF plan has merge conflicts (attempt ${newCycleCount}/3)`,
|
|
413
658
|
markdownBody: feedbackBody
|
|
414
659
|
}));
|
|
415
|
-
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after
|
|
660
|
+
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — plan.vbrief.json has merge conflict markers.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, resolve the merge conflict markers, commit and push the fix, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
|
|
416
661
|
failedCheck,
|
|
417
662
|
feedbackPath: fileResult.filePath
|
|
418
663
|
}, logPrefix);
|
|
@@ -438,7 +683,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
438
683
|
const summary = `Acceptance criteria check FAILED — ${acStatus.totalPending}/${acStatus.totalCount} AC incomplete:\n\n${incompleteList}`;
|
|
439
684
|
setStateDerivedVerificationFailure(issueId, failedCheck, summary, newCycleCount, currentStatus);
|
|
440
685
|
if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
|
|
441
|
-
const feedbackBody = shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n## REQUIRED: Complete all acceptance criteria BEFORE resubmitting\n\n1. Review the incomplete AC above\n2. Implement the missing requirements and write tests\n3. Close every completed
|
|
686
|
+
const feedbackBody = shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n## REQUIRED: Complete all acceptance criteria BEFORE resubmitting\n\n1. Review the incomplete AC above\n2. Implement the missing requirements and write tests\n3. Close every completed task with \`pan task close\` — the canonical writer publishes the close and AC statuses sync automatically; never hand-edit spec files\n4. Commit and push ALL changes\n5. ONLY THEN resubmit: pan review request ${issueId} -m "Completed acceptance criteria"\n\nDo NOT resubmit until all AC are completed.`;
|
|
442
687
|
try {
|
|
443
688
|
const fileResult = await Effect.runPromise(writeFeedbackFile({
|
|
444
689
|
issueId,
|
|
@@ -448,7 +693,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
448
693
|
summary: `AC check FAILED — ${acStatus.totalPending}/${acStatus.totalCount} incomplete (attempt ${newCycleCount}/3)`,
|
|
449
694
|
markdownBody: feedbackBody
|
|
450
695
|
}));
|
|
451
|
-
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after
|
|
696
|
+
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — ${acStatus.totalPending} AC incomplete.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, complete all pending acceptance criteria, commit and push every change, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
|
|
452
697
|
failedCheck,
|
|
453
698
|
feedbackPath: fileResult.filePath
|
|
454
699
|
}, logPrefix);
|
|
@@ -462,6 +707,38 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
462
707
|
maxCycles: 3
|
|
463
708
|
};
|
|
464
709
|
}
|
|
710
|
+
const taskBlockers = await checkIncompletePlanItemsPromise(workspacePath, issueId);
|
|
711
|
+
if (taskBlockers.length > 0) {
|
|
712
|
+
const newCycleCount = currentCycles + 1;
|
|
713
|
+
const failedCheck = "incomplete-plan-items";
|
|
714
|
+
const itemIds = taskBlockers.map((line) => line.match(/^\s+-\s+(\S+)/)?.[1]).filter((id) => Boolean(id));
|
|
715
|
+
const summary = `Checklist completion check FAILED — ${itemIds.length} incomplete item(s) remain:\n\n${taskBlockers.join("\n")}`;
|
|
716
|
+
setStateDerivedVerificationFailure(issueId, failedCheck, summary, newCycleCount, currentStatus);
|
|
717
|
+
if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
|
|
718
|
+
const feedbackBody = shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\nComplete each listed item with \`pan task done ${issueId} <item>\` after committing and pushing its implementation, then resubmit the review request.`;
|
|
719
|
+
try {
|
|
720
|
+
const fileResult = await Effect.runPromise(writeFeedbackFile({
|
|
721
|
+
issueId,
|
|
722
|
+
workspacePath,
|
|
723
|
+
specialist: "verification-gate",
|
|
724
|
+
outcome: "failed",
|
|
725
|
+
summary: `Checklist completion check FAILED — ${itemIds.length} incomplete item(s) remain (attempt ${newCycleCount}/3)`,
|
|
726
|
+
markdownBody: feedbackBody
|
|
727
|
+
}));
|
|
728
|
+
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — ${itemIds.length} incomplete item(s) remain.\n\nMUST READ: ${fileResult.filePath}\n\nRead the file, complete every listed item with pan task after committing and pushing, then request a new review with pan review request.`, {
|
|
729
|
+
failedCheck,
|
|
730
|
+
feedbackPath: fileResult.filePath
|
|
731
|
+
}, logPrefix);
|
|
732
|
+
} catch (feedbackErr) {
|
|
733
|
+
console.error(`[${logPrefix}] Failed to write open-task verification feedback for ${issueId}:`, feedbackErr);
|
|
734
|
+
}
|
|
735
|
+
return {
|
|
736
|
+
outcome: "failed",
|
|
737
|
+
failedCheck,
|
|
738
|
+
cycleCount: newCycleCount,
|
|
739
|
+
maxCycles: 3
|
|
740
|
+
};
|
|
741
|
+
}
|
|
465
742
|
try {
|
|
466
743
|
const { stdout: changedOut } = await execAsync(`git diff --name-only ${changedBase}...HEAD`, {
|
|
467
744
|
cwd: workspacePath,
|
|
@@ -471,7 +748,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
471
748
|
if (changesetHasNoContent(changedOut.split("\n"))) {
|
|
472
749
|
const newCycleCount = currentCycles + 1;
|
|
473
750
|
const failedCheck = "empty-changeset";
|
|
474
|
-
const summary = `Branch has no implementation — only pipeline artifacts (.pan/
|
|
751
|
+
const summary = `Branch has no implementation — only pipeline artifacts (.pan/vBRIEF task state) changed vs ${changedBase}. The work agent produced no code (likely a kickoff-delivery zombie — PAN-2179).`;
|
|
475
752
|
setReviewStatusSync(issueId, {
|
|
476
753
|
reviewStatus: "pending",
|
|
477
754
|
verificationStatus: "failed",
|
|
@@ -481,7 +758,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
481
758
|
});
|
|
482
759
|
if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
|
|
483
760
|
try {
|
|
484
|
-
await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts — branch still has no implementation.\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — your branch contains NO code (only .pan/
|
|
761
|
+
await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts — branch still has no implementation.\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — your branch contains NO code (only .pan/vBRIEF task state changed vs ${changedBase}).\n\nYou must actually implement the issue: read the plan (.pan/spec.vbrief.json + the issue body), write and commit the code, push, then run pan review request. Do NOT stop at the prompt — keep working until pan review request completes.`, {
|
|
485
762
|
failedCheck,
|
|
486
763
|
changedBase
|
|
487
764
|
}, logPrefix);
|
|
@@ -519,7 +796,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
519
796
|
const repo = findProjectByPathSync(workspacePath)?.github_repo;
|
|
520
797
|
if (!repo || !repo.includes("/")) return;
|
|
521
798
|
const [owner, name] = repo.split("/");
|
|
522
|
-
const { postOverdeckTestsStatus } = await import("./github-app-
|
|
799
|
+
const { postOverdeckTestsStatus } = await import("./github-app-BrYwK_Gb.js");
|
|
523
800
|
await postOverdeckTestsStatus(workspacePath, owner, name, "success", "Verification gate passed");
|
|
524
801
|
} catch (err) {
|
|
525
802
|
console.warn(`[${logPrefix}] Failed to post overdeck/tests status: ${err.message}`);
|
|
@@ -547,9 +824,12 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
547
824
|
* so the Effect error channel stays empty.
|
|
548
825
|
*/
|
|
549
826
|
function runVerificationForIssue(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
|
|
827
|
+
return process.env.OVERDECK_VERIFICATION_WORKER === "1" ? runVerificationForIssueInProcess(issueId, workspacePath, workspaceInfo, logPrefix, options) : Effect.promise(() => runSupervisedVerification(issueId, workspacePath, workspaceInfo, logPrefix, options));
|
|
828
|
+
}
|
|
829
|
+
function runVerificationForIssueInProcess(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
|
|
550
830
|
return Effect.promise(() => runVerificationForIssuePromise(issueId, workspacePath, workspaceInfo, logPrefix, options));
|
|
551
831
|
}
|
|
552
832
|
//#endregion
|
|
553
|
-
export {
|
|
833
|
+
export { runVerificationForIssueInProcess as i, reconcileInterruptedVerifications as n, runVerificationForIssue as r, changesetHasNoContent as t };
|
|
554
834
|
|
|
555
|
-
//# sourceMappingURL=verification-runner-
|
|
835
|
+
//# sourceMappingURL=verification-runner-BjHN80pJ.js.map
|