@overdeck/desktop 0.45.12 → 0.45.15
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 +33 -0
- package/package.json +7 -2
- package/server/{acceptance-criteria-1LHgD9vg.js → acceptance-criteria-DHZk2ceV.js} +2 -2
- package/server/{advancing-selfheal-BqsLWqEM.js → advancing-selfheal-CSuZ31bB.js} +5 -5
- package/server/{agent-gc-CUb52n7s.js → agent-gc-D_DxfBHR.js} +3 -3
- package/server/{agent-state-D-moNwhA.js → agent-state-EP2QFV9n.js} +1 -1
- package/server/{agent-state-service-BzESvLOf.js → agent-state-service-BZkvgQf4.js} +5 -5
- package/server/{agent-state-service-BaZH7sXJ.js → agent-state-service-C_2ZAQRP.js} +1 -1
- package/server/{agents-B5LfpLPv.js → agents-CsOzAmRg.js} +145 -78
- package/server/{agents-C4kZ8a2r.js → agents-DCvyTXNU.js} +1 -1
- package/server/{archive-planning-BbZe-8IK.js → archive-planning-CTILQRnV.js} +1 -1
- package/server/{archive-planning-oX1pj6nY.js → archive-planning-DkivCk1A.js} +4 -4
- package/server/{artifact-index-jobs-DGr6bxev.js → artifact-index-jobs-CmsvQ1ey.js} +2 -2
- package/server/auto-commit-QAfsu3Sb.js +3 -0
- package/server/{backlog-auto-trigger-BlJHikOm.js → backlog-auto-trigger-ueRaT8Dy.js} +2 -2
- package/server/{bd-process-lock-i3CYMS-B.js → bd-process-lock-D3S4T4o-.js} +32 -11
- package/server/{beads-DD7fYCl5.js → beads-BGGxrkZ5.js} +96 -196
- package/server/{beads-BNU-fb48.js → beads-CYsLiyIM.js} +1 -1
- package/server/{beads-query-e6oku4P5.js → beads-query-B1DlJVp9.js} +24 -99
- package/server/beads-restore-CyygSmmn.js +23 -0
- package/server/{behavior-CPf0pbOt.js → behavior-Cpj03N4v.js} +3 -3
- package/server/{briefing-freshness-B2FdLwIv.js → briefing-freshness-Kh5V8RTh.js} +4 -4
- package/server/{checkpoint-manager-eFgaMMu4.js → checkpoint-manager-CAFos8e1.js} +1 -1
- package/server/{checkpoint-manager-JryW6MpM.js → checkpoint-manager-fu9oVsR-.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-qvOqvMuC.js → checkpoints-1BqOlS4q.js} +2 -2
- package/server/{checkpoints-BK17oicz.js → checkpoints-DvhGi8P_.js} +1 -1
- package/server/claude-hooks-provision-s_wdpeVj.js +360 -0
- package/server/{claude-permissions-B6bWGh9d.js → claude-permissions-CaWqysff.js} +2 -2
- package/server/{claude-settings-overlay-BPdhTPjo.js → claude-settings-overlay-BbA4FbVI.js} +1 -1
- package/server/{claude-settings-overlay-CRyyKKXQ.js → claude-settings-overlay-CcTf0xzG.js} +2 -2
- package/server/{cli-B75AieAM.js → cli-BwCvCUBK.js} +9 -9
- package/server/cli-ClIQwgMI.js +3 -0
- package/server/{cliproxy-CCzwuSNe.js → cliproxy-BsoNNDAj.js} +2 -2
- package/server/{cliproxy-DOQf66G9.js → cliproxy-C2xC-3vH.js} +1 -1
- package/server/{close-issue-_X3MXJyG.js → close-issue-BleIwP3f.js} +5 -5
- package/server/{closed-issue-reaper-CLR7ClsO.js → closed-issue-reaper-BwUUvjEW.js} +1 -1
- package/server/{closed-issue-reaper-BsUfBSjM.js → closed-issue-reaper-mC5pujeb.js} +102 -30
- package/server/{codex-CY-QRuU9.js → codex-B7DTpwEw.js} +1 -1
- package/server/{codex-B4KEpX5V.js → codex-DW60_5j2.js} +5 -5
- package/server/{compact-beads-cZds2MTr.js → compact-beads-CK_hHEnB.js} +1 -1
- package/server/{compact-beads-uEDccC76.js → compact-beads-DKL54y6j.js} +15 -8
- package/server/{config-DARrpYWA.js → config-BRNQJXhA.js} +1 -1
- package/server/{config-8sjaU6jZ.js → config-ZNnMpIlh.js} +2 -2
- package/server/{config-yaml-ClpGgrf6.js → config-yaml-Dcz-8uit.js} +29 -3
- package/server/{conflict-gate-Ds9_2yjd.js → conflict-gate-DGT8jCLp.js} +1 -1
- package/server/{conflict-gate-BtB_o-Vi.js → conflict-gate-DTje2Ll7.js} +3 -3
- package/server/{context-layers-r2ywnQYA.js → context-layers-BdUCQ-cl.js} +3 -3
- package/server/{context-layers-CRCk1QG7.js → context-layers-ByOWUjUg.js} +2 -2
- package/server/{control-settings-D1B3u6HP.js → control-settings-DwkAeooY.js} +4 -4
- package/server/{conversation-compaction-D86Zo2Ci.js → conversation-compaction-OTYgd6eg.js} +8 -8
- package/server/{conversation-compaction-CZRVk4hg.js → conversation-compaction-WYQZUVDm.js} +1 -1
- package/server/{conversation-service-CuTVU8dV.js → conversation-service-BR1OgvxO.js} +5 -5
- package/server/{conversation-service-CkL-6MuG.js → conversation-service-C_kNZPLx.js} +1 -1
- package/server/{conversations-DfJKBDwB.js → conversations-DG2M8WnT.js} +4 -4
- package/server/{conversations-BmWEluPL.js → conversations-izHvSoAR.js} +1 -1
- package/server/{cost-DAPYN6iA.js → cost-B2mj17iG.js} +3 -3
- package/server/{cost-CCnqa5xK.js → cost-DQ2ajr_m.js} +2 -2
- package/server/{cost-sync-BDL10Nwu.js → cost-sync-gTayEuWP.js} +3 -3
- package/server/{dag-Dv2r5bVD.js → dag-CqTehWpY.js} +3 -3
- package/server/{dangerous-git-ops-Dcw7PbYo.js → dangerous-git-ops-DDWQlPC3.js} +1 -1
- package/server/dashboard-db-worker.js +6 -6
- package/server/{deacon-DYnZH7kC.js → deacon-BqW9HMew.js} +3 -3
- package/server/{deacon-CM0MxbS8.js → deacon-DrKDBeJL.js} +161 -1594
- package/server/{deacon-nudge-log-B-naf89q.js → deacon-nudge-log-D1wEK6zF.js} +1 -1
- package/server/deacon-swarm-BY5hKNaU.js +2 -0
- package/server/{deacon-swarm-BstYoz8Q.js → deacon-swarm-CO_A7xyd.js} +12 -105
- package/server/deacon.js +7 -7
- package/server/{devcontainer-renderer-CaYOG9JN.js → devcontainer-renderer-BQolp_qZ.js} +3 -3
- package/server/{dist-BIC8spJ0.js → dist-Bc32rWJB.js} +1 -1
- package/server/dist-DGTwcZhI.js +3 -0
- package/server/{docker-DDI1shu3.js → docker-s-esqZ__.js} +67 -28
- package/server/{ensure-devcontainer-DCAg3ksz.js → ensure-devcontainer-DA4-jF6R.js} +4 -4
- package/server/{ensure-devcontainer-CbSXvN9W.js → ensure-devcontainer-pUVaT0h3.js} +1 -1
- package/server/{esm-shims-DiV9jHa_.js → esm-shims-CJHy8CZY.js} +1 -1
- package/server/{event-store-DU3HkZlN.js → event-store-CcJAhKCl.js} +1 -1
- package/server/{event-store-DCMqyI07.js → event-store-DRte2Rwt.js} +3 -3
- package/server/{events-BfiosVAn.js → events-Bej1w_k8.js} +3 -3
- package/server/{events-DLRxpSuV.js → events-CtsLScn8.js} +1 -1
- package/server/export-Dx_qJ3h8.js +87 -0
- package/server/{factory-BMtWV9iv.js → factory-FN727tWr.js} +4 -4
- package/server/{feature-registry-population-DA7bO6Zn.js → feature-registry-population-ie-yBcQC.js} +4 -4
- package/server/{feature-registry-storage-nAY1fbBt.js → feature-registry-storage-CkZTFSsn.js} +2 -2
- package/server/{features-DMu7eGmU.js → features-Dtm9ABuz.js} +2 -2
- package/server/{feedback-target-DHqcw3cN.js → feedback-target-BYtpyt1i.js} +6 -6
- package/server/{feedback-target-B2SEai8-.js → feedback-target-DVJQDiE4.js} +1 -1
- package/server/{feedback-writer-DMBdS_jL.js → feedback-writer-DOUhyIW2.js} +1 -1
- package/server/{feedback-writer-qvm7UON7.js → feedback-writer-fdE1BzeL.js} +4 -4
- package/server/{flywheel-k4FPtCQ_.js → flywheel-Bi82iiNl.js} +1 -1
- package/server/{flywheel-Dfpx4bIV.js → flywheel-Bv3wv2S6.js} +23 -15
- package/server/{flywheel-D2LdPSic.js → flywheel-CUErLAyN.js} +13 -13
- package/server/{flywheel-merge-order-CB4lbXeJ.js → flywheel-merge-order-BaEN3iyN.js} +7 -7
- package/server/{flywheel-merge-order-CttTazRY.js → flywheel-merge-order-DXjeBnJ1.js} +1 -1
- package/server/{forge-CoPFXFyl.js → forge-ButEdJ31.js} +2 -2
- package/server/forge-XlDgPQWs.js +2 -0
- package/server/{from-B0YoJl9-.js → from-CbtTxftl.js} +1 -1
- package/server/{fts-db-DAHW1yA_.js → fts-db-CBgBLZcL.js} +2 -2
- package/server/{fts-operations-DDXDBi0d.js → fts-operations-CI9Xuo_1.js} +2 -2
- package/server/{git-utils-DbfC0zls.js → git-utils-BCLRWQ-y.js} +1 -1
- package/server/{git-utils-B90Zjzfl.js → git-utils-ClfpP47N.js} +2 -2
- package/server/{github-app-C7lftMNj.js → github-app-DRD2woO0.js} +1 -1
- package/server/{github-app-BecAnXRX.js → github-app-DscZ0_B6.js} +2 -2
- package/server/{github-client-D21rCIXk.js → github-client-DpiZnxGH.js} +2 -2
- package/server/{github-client-BwtKZtM0.js → github-client-iFRw8f7e.js} +1 -1
- package/server/{github-pr-lookup-CzVWuysl.js → github-pr-lookup-D-EBexxC.js} +2 -2
- package/server/{harness-resolve-SkRJm4a7.js → harness-resolve-iMjyNUJ2.js} +3 -3
- package/server/{health-events-DA_JLpgZ.js → health-events-B_WsQyYm.js} +1 -1
- package/server/{health-events-BT0aAfeA.js → health-events-CRdxDFN2.js} +2 -2
- package/server/{hooks-BQxRXtRb.js → hooks-C1ScyVxP.js} +1 -1
- package/server/{hooks-DxEn2BoY.js → hooks-C9b7Vqpw.js} +2 -2
- package/server/hume-K1pi8jC4.js +3 -0
- package/server/{hume-DkVOs1Qi.js → hume-TQ5pvOZ_.js} +2 -2
- package/server/{idle-stack-reaper-DGy7tvC9.js → idle-stack-reaper-B1kG7B_X.js} +2 -2
- package/server/{idle-stack-reaper-C7fJL8jH.js → idle-stack-reaper-iFVOAoJy.js} +1 -1
- package/server/{infra-DE3C4PMr.js → infra-bpq1MHKU.js} +50 -3
- package/server/{injection-Dt22tGvS.js → injection-BLWfwTVZ.js} +1 -1
- package/server/{injection-Cc4Qt8LZ.js → injection-DJqWld1v.js} +7 -7
- package/server/inspect-agent-477VxQim.js +2 -0
- package/server/{inspect-agent-DOaCDkCF.js → inspect-agent-DytCsltn.js} +9 -9
- package/server/{internal-token-nobT6FhA.js → internal-token-CCaWaTwE.js} +1 -1
- package/server/{internal-token-B_1YLWLI.js → internal-token-CjlhdufS.js} +2 -2
- package/server/{io-A7ZuOBkz.js → io-BiQ2Cs3k.js} +2 -2
- package/server/{issue-closed-Da3DeomA.js → issue-closed-FApNiOOs.js} +4 -4
- package/server/{issue-lifecycle-Bd9XBJAQ.js → issue-lifecycle-BkFWNjlD.js} +1 -1
- package/server/{issue-lifecycle-543pQX9D.js → issue-lifecycle-C-K53ASY.js} +21 -21
- package/server/{issue-service-singleton-Brc3t0SV.js → issue-service-singleton-CuHGpJJP.js} +8 -8
- package/server/{issue-service-singleton-BC2JLZi7.js → issue-service-singleton-bG1WdSdQ.js} +1 -1
- package/server/{issues-D3kt9UWE.js → issues-CwQMphDH.js} +2 -2
- package/server/jsonl-parser-dNIjHgym.js +245 -0
- package/server/{label-cleanup-w9X_T3AQ.js → label-cleanup-DYvAZknd.js} +3 -3
- package/server/{layers-Cwe1J-9o.js → layers-CD6FysRU.js} +2 -2
- package/server/{lifecycle-f1GbDK33.js → lifecycle-C_73gi-C.js} +7 -7
- package/server/{lifecycle-io-D56q8zlO.js → lifecycle-io-C_Wu0_i-.js} +1 -1
- package/server/{lifecycle-io-Bqvj0m3i.js → lifecycle-io-CeYxP3cE.js} +4 -4
- package/server/{linear-client-Bh4T4S-c.js → linear-client-4qoKnuQu.js} +1 -1
- package/server/{linear-client-CfJMTAYd.js → linear-client-EtVyblVz.js} +2 -2
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-ZrXFM3jv.js → merge-7rqkTUm2.js} +3 -3
- package/server/merge-agent-36wfYm2u.js +3 -0
- package/server/{merge-agent-CHHs5S_0.js → merge-agent-4Zhlgvqp.js} +62 -27
- package/server/{merge-batch-BwhGdlh4.js → merge-batch-itfnwdsT.js} +1 -1
- package/server/{merge-blockers-BMhDpMl_.js → merge-blockers-Bto_Oe_o.js} +2 -2
- package/server/{merge-DRMPa8CQ.js → merge-brm721Es.js} +1 -1
- package/server/merge-ops-PzqsW69V.js +2 -0
- package/server/{merge-rebase-R7MfqpiE.js → merge-rebase-Czfqfe4q.js} +2 -2
- package/server/{merge-set-B3Breacq.js → merge-set-BIkGQL9j.js} +9 -5
- package/server/{merge-set-D-iXNP0I.js → merge-set-G1RHcu3D.js} +1 -1
- package/server/{merge-sync-DHWbGtjR.js → merge-sync-B43Dybea.js} +2 -2
- package/server/{merge-sync-bOOtfeXR.js → merge-sync-DIrmlZUr.js} +1 -1
- package/server/{merge-train-98ptZrPT.js → merge-train-DGqVuNZV.js} +3 -3
- package/server/{merge-train-deps-B5FWJTE2.js → merge-train-deps-q15XLnAS.js} +4 -4
- package/server/{merge-verification-BGiuiXAK.js → merge-verification-Cqfxx6bE.js} +4 -4
- package/server/{multipart-parser-D7mzNNDm.js → multipart-parser-CiPxxfUH.js} +2 -2
- package/server/node_modules/.package-lock.json +1 -1
- package/server/{orphan-proposed-reconciler-BSGCNJ6X.js → orphan-proposed-reconciler-BWWHn4Lr.js} +15 -39
- package/server/{orphan-proposed-reconciler-CSuxivr9.js → orphan-proposed-reconciler-DAD9FJtQ.js} +1 -1
- package/server/package-lock.json +2 -2
- package/server/package.json +1 -1
- package/server/{pan-dir-DoPtdHrp.js → pan-dir-Bj7Hy8iu.js} +3 -3
- package/server/{paths-CVDLPxXp.js → paths-C9DkhIOT.js} +2 -2
- package/server/{pickup-KLRUhThD.js → pickup-CKRuGDsB.js} +1 -1
- package/server/{pipeline-notifier-BtYHbBPl.js → pipeline-notifier-BkKbQ8ji.js} +1 -1
- package/server/{pipeline-notifier-WD2dnOsR.js → pipeline-notifier-CAurUste.js} +2 -2
- package/server/project-pipelines-BRWaGmI4.js +162 -0
- package/server/projects-KJ94e50I.js +3 -0
- package/server/{prompts-Cg7e9FPb.js → prompts-DfI5qbTW.js} +2 -2
- package/server/{providers-fLduChnX.js → providers-CWDXoaMA.js} +7 -7
- package/server/providers-D-5txBRc.js +3 -0
- package/server/public/assets/{chunk-BO2N2NFS-aNlsGDCu.js → chunk-BO2N2NFS-ClukPsZQ.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-CnjkrvT8.js → diagram-OG6HWLK6-Avtvq2qI.js} +1 -1
- package/server/public/assets/{dist-Bg3Sbsx4.js → dist-BEHQuasD.js} +3 -3
- package/server/public/assets/{dist-CGKBCieA.js → dist-BvmY-qb1.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-C8LLKj23.js → ganttDiagram-6RSMTGT7-7KhCd0fH.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-BSDEUvhW.js → highlighted-body-OFNGDK62-iQoBMTf0.js} +1 -1
- package/server/public/assets/index-DUFDmvmH.css +1 -0
- package/server/public/assets/index-DnTZ2QeN.js +796 -0
- package/server/public/assets/{linear-DEbYZoxg.js → linear-CiJHW9g5.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-DZJOwgBG.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BtZL5pXE.js → pieDiagram-4H26LBE5-BOhmvUhW.js} +1 -1
- package/server/public/assets/{prod-DYVvIyuh.js → prod-DmLBBqat.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-a7vS8Jc8.js → quadrantDiagram-W4KKPZXB-Cjku660G.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-Ckbq2SWH.js → sankeyDiagram-5OEKKPKP-D52w5oPh.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-DJyeNa99.js → xychartDiagram-2RQKCTM6-BTO07_Iv.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-1WXmTBlo.js → pull-requests-Bmre-Xlz.js} +3 -3
- package/server/{pull-requests-D2SjJIwY.js → pull-requests-CKZPWhjD.js} +1 -1
- package/server/{rally-8aQlLLVj.js → rally-BBd9tQ__.js} +3 -3
- package/server/rally-Dc2Wnxw2.js +3 -0
- package/server/{rally-api-BtvwdX6d.js → rally-api-DDc85HIz.js} +1 -1
- package/server/{rally-api-H5I2CBO0.js → rally-api-DxZFObI_.js} +2 -2
- package/server/{rally-client-Bt-qHiOh.js → rally-client-BADHn0m_.js} +1 -1
- package/server/{rally-client-33CYZYYu.js → rally-client-DvvLiAQP.js} +4 -4
- package/server/{reap-terminal-sessions-CAmURC2h.js → reap-terminal-sessions-D6JDJsqF.js} +1 -1
- package/server/{reap-terminal-sessions-BwJb2DLJ.js → reap-terminal-sessions-D_xvy-Mk.js} +1 -1
- package/server/{rebuild-stack-KHkkrGjx.js → rebuild-stack-D19i080j.js} +6 -6
- package/server/{rebuild-stack-CXSgAGPR.js → rebuild-stack-GOsWqXi3.js} +1 -1
- package/server/{reconstruct-cache-D_Ml65_6.js → reconstruct-cache-lQrG4xGg.js} +6 -6
- package/server/record-pyB6VA32.js +3 -0
- package/server/recovery-trip-Dfh1tNHn.js +98 -0
- package/server/release-engine-DxcMWRuK.js +306 -0
- package/server/release-set-BYsgX7o6.js +125 -0
- package/server/{remote-CGuognN3.js → remote-8W2Yhygw.js} +3 -3
- package/server/{remote-D0Old0Cv.js → remote-DmeL21dF.js} +3 -3
- package/server/{remote-agents-DfhMq6kQ.js → remote-agents-BfQBE6MN.js} +5 -5
- package/server/{remote-agents-UHoi4oGr.js → remote-agents-DlvbzO7m.js} +1 -1
- package/server/{remote-completion-RZYePR_0.js → remote-completion-BgkiSQmx.js} +12 -12
- package/server/resolver-dTpSSzaH.js +158 -0
- package/server/resume-DhcIqsTm.js +3 -0
- package/server/{review-agent-sZBCpEVv.js → review-agent-D025Wt7w.js} +22 -22
- package/server/{review-agent-uwVftH98.js → review-agent-Rub0OpZc.js} +1 -1
- package/server/{review-artifacts-C7a45b1_.js → review-artifacts-CX951jTU.js} +6 -6
- package/server/{review-context-CErbQpKL.js → review-context-DGGGR_w5.js} +7 -7
- package/server/{review-monitor-DHD9m_kh.js → review-monitor-0_qqMcnS.js} +2 -2
- package/server/{review-status-gPndPUBc.js → review-status-4qqLkRMu.js} +24 -17
- package/server/{review-status-JhQ3qlDS.js → review-status-Br6lAFGO.js} +1 -1
- package/server/{review-status-enrichment-qWvWckYN.js → review-status-enrichment-Cr8m3uVL.js} +3 -3
- package/server/{review-status-sync-B_GrEke8.js → review-status-sync-D3KUhsdA.js} +1 -1
- package/server/{review-status-sync-D3A9KX95.js → review-status-sync-OC-l1lNt.js} +9 -5
- package/server/{review-verdict-feedback-4WZ5ZdbC.js → review-verdict-feedback-DrWMuRaj.js} +6 -6
- package/server/{review-verdict-feedback-Zo0r_z4m.js → review-verdict-feedback-YOzmsq9G.js} +1 -1
- package/server/{rollup-BrUIKMv_.js → rollup-CnxbwaLH.js} +8 -8
- package/server/{rollup-Bmhn80tB.js → rollup-DmazRY0j.js} +1 -1
- package/server/{scanner-BIGumel_.js → scanner-DE1MqAaF.js} +7 -7
- package/server/{sequence-io-DA0akEQN.js → sequence-io-C0uoqfGx.js} +4 -4
- package/server/{sequencer-agent-DeflKafB.js → sequencer-agent-i-b2u4SJ.js} +10 -6
- package/server/server.js +1115 -297
- package/server/{service-V0sUK-OR.js → service-D0_gh2tl.js} +1668 -1408
- package/server/{session-fork-Yx3UcAQf.js → session-fork-DZ12vipL.js} +2 -2
- package/server/{settings-CFEeQRj2.js → settings-ByqjPtFO.js} +2 -2
- package/server/{settings-CxVate0h.js → settings-DCC4BAqj.js} +3 -3
- package/server/settings-yydgaqhv.js +2 -0
- package/server/{shadow-engineering-BRxnVSDk.js → shadow-engineering-BhnmtW5m.js} +2 -2
- package/server/{shadow-state-1aS8FijU.js → shadow-state-ByXZehsy.js} +1 -1
- package/server/{shadow-state-BiMwdyl1.js → shadow-state-CKm8xWX9.js} +2 -2
- package/server/{ship-log-CMWH3H5-.js → ship-log-DE_0Cv_i.js} +1 -1
- package/server/{smart-compaction-Bw1K_Sbl.js → smart-compaction-D5Zen3AA.js} +7 -7
- package/server/{smart-compaction-xblMyVpT.js → smart-compaction-h4_ca6Uk.js} +1 -1
- package/server/{spawn-planning-session-CzDFSKAQ.js → spawn-planning-session-Bgi7Ub02.js} +1 -1
- package/server/{spawn-planning-session-DxLxcM7m.js → spawn-planning-session-Dueit4WX.js} +15 -15
- package/server/{specialist-completion-BiEXUHfD.js → specialist-completion-BZ8M-WZ0.js} +1 -1
- package/server/{specialist-context-BfkTA81h.js → specialist-context-BMq83C58.js} +5 -5
- package/server/{specialist-handoff-logger-BiKuLtNm.js → specialist-handoff-logger-BxX1YefH.js} +2 -2
- package/server/{specialist-logs-CFJjGsLC.js → specialist-logs-BWZYcJ6P.js} +3 -3
- package/server/{specialists-DdvpFNt1.js → specialists-8ZAguXef.js} +1 -1
- package/server/{specialists-B4byf18k.js → specialists-BudKrjOu.js} +76 -76
- package/server/{specialists-DjHbwQ_p.js → specialists-DrPrC9Y9.js} +20 -256
- package/server/{specialists-BLIreoE7.js → specialists-ZkW4Mb7U.js} +1 -1
- package/server/specs-DwoAEGrW.js +3 -0
- package/server/{src-fgbU-jJ-.js → src-DHn4Rd2F.js} +25 -3
- package/server/{src-mK_M_ZIj.js → src-DNUUqkec.js} +6 -6
- package/server/{src-CALBEUMX.js → src-Dv6L03vW.js} +3 -3
- package/server/{stack-health-BFM8YlHw.js → stack-health-Dclm7_tu.js} +1 -1
- package/server/{stack-health-Qd7rPiVe.js → stack-health-DxsTx7II.js} +2 -2
- package/server/{state-home-C2Bicw9N.js → state-home-CRowbXqU.js} +6 -6
- package/server/stuck-remediation-CFWUP8_I.js +1491 -0
- package/server/stuck-remediation-CLHd-lrF.js +2 -0
- package/server/{summary-fork-EWWBvzgE.js → summary-fork-CKc01Our.js} +2 -2
- package/server/{summary-fork-DezPkJSm.js → summary-fork-CtCwBJ2Z.js} +8 -8
- package/server/{supervisor-D5GC5jUM.js → supervisor-BA5D72Qa.js} +2 -2
- package/server/supervisor-DHjumXlL.js +2 -0
- package/server/{swarm-readiness-Cf9mommA.js → swarm-readiness-CL5sM9B1.js} +3 -3
- package/server/{system-prerequisites-BsI9hxh9.js → system-prerequisites-DmFSXIE5.js} +13 -1
- package/server/{teardown-workspace-CWz1pbEK.js → teardown-workspace-DWmFJzTw.js} +37 -68
- package/server/{test-agent-queue-TiVXe3ZT.js → test-agent-queue-DjsQoV5X.js} +6 -6
- package/server/{test-verdict-CCDd25uN.js → test-verdict-BSqsQp3G.js} +1 -1
- package/server/{test-verdict-Bm4uv_AA.js → test-verdict-D1AmZ2c0.js} +1 -1
- package/server/{tldr-daemon-C_1frSDj.js → tldr-daemon-C-MGomL8.js} +2 -2
- package/server/{tldr-daemon-Big5IZ_M.js → tldr-daemon-DD9rI5gA.js} +1 -1
- package/server/{tmux-D57f-XNv.js → tmux-C_d-lSIq.js} +2 -2
- package/server/{tmux-DClqWwb8.js → tmux-x291Gjjb.js} +1 -1
- package/server/{token-_qujO3JZ.js → token-DfBf1bsd.js} +1 -1
- package/server/{tracker-config-BmdJU_w6.js → tracker-config-CNODpd11.js} +2 -2
- package/server/{tracker-config-B_Ubts1Z.js → tracker-config-DItsdelv.js} +1 -1
- package/server/{tracker-utils-Bg-Sevcv.js → tracker-utils-B9ZoVA9b.js} +1 -1
- package/server/{tracker-utils-CWFt6jjV.js → tracker-utils-Ch2_5GGf.js} +2 -2
- package/server/{traefik-connect-5EP1WS_Z.js → traefik-connect-BF4x_LUQ.js} +1 -1
- package/server/{tunnel-hOBNQbmF.js → tunnel-YD80_IHr.js} +1 -1
- package/server/{tunnel-UBf2vyAL.js → tunnel-r_5nHAI6.js} +3 -3
- package/server/{types-B5u3NxMl.js → types-33JEP4LZ.js} +1 -1
- package/server/{uat-train-DGkIkLxu.js → uat-train-DDI00aqD.js} +1 -1
- package/server/{uat-train-qNanv5hN.js → uat-train-DjkFWXge.js} +25 -25
- package/server/{validation-C4wegCvH.js → validation-DUTiJnyz.js} +4 -4
- package/server/{validation-B0QaLIHP.js → validation-ict8hnXk.js} +1 -1
- package/server/{verification-runner-DdleMNLq.js → verification-runner-ATaLbpr5.js} +1 -1
- package/server/{verification-runner-CntudBes.js → verification-runner-inLgeQux.js} +12 -12
- package/server/{vtt-parser-CKc-smWM.js → vtt-parser-QnRfcjiU.js} +1 -1
- package/server/{work-agent-prompt-CG5jFV9A.js → work-agent-prompt-fZljjA1_.js} +12 -12
- package/server/{workflows-BK2xs_a8.js → workflows-oBnJ7Tm0.js} +14 -14
- package/server/workflows-tU7KKxQi.js +2 -0
- package/server/{workspace-C9lC5o3E.js → workspace-B2WOW9Hw.js} +1 -1
- package/server/{workspace-CLrSIRCx.js → workspace-CNuW2j41.js} +3 -3
- package/server/{workspace-config-DA8U97k9.js → workspace-config-CBgMGhWs.js} +1 -1
- package/server/{workspace-manager-BJhW2sky.js → workspace-manager-CB-R07R3.js} +12 -12
- package/server/{workspace-manager-Cb2a7bg9.js → workspace-manager-DjUAJCSs.js} +1 -1
- package/server/{workspace-metadata-QQmo_Z0l.js → workspace-metadata-9Nn5kgRl.js} +2 -2
- package/server/{workspace-metadata-CTRnr323.js → workspace-metadata-Fd58uUQG.js} +1 -1
- package/server/{workspaces-Ca4zZs12.js → workspaces-BjWXntty.js} +106 -120
- package/server/writer-CQMGzEkw.js +3 -0
- package/server/writer-fe1-8iGc.js +251 -0
- package/sync-sources/hooks/ask-user-question-hook +87 -0
- package/sync-sources/hooks/auto-approve-hook +96 -0
- package/sync-sources/hooks/codex-notify-hook +62 -0
- package/sync-sources/hooks/gh-issue-trailer-hook +4 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.d.ts +7 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.d.ts.map +1 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.js +239 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.js.map +1 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.ts +296 -0
- package/sync-sources/hooks/git-hooks/post-checkout +109 -0
- package/sync-sources/hooks/heartbeat-hook +113 -0
- package/sync-sources/hooks/notification-hook +70 -0
- package/sync-sources/hooks/notify-complete +79 -0
- package/sync-sources/hooks/pan-hook-lib.sh +153 -0
- package/sync-sources/hooks/permission-event-hook +24 -0
- package/sync-sources/hooks/post-compact-hook +25 -0
- package/sync-sources/hooks/pre-compact-hook +26 -0
- package/sync-sources/hooks/pre-tool-hook +35 -0
- package/sync-sources/hooks/record-cost-event.d.ts +1 -0
- package/sync-sources/hooks/record-cost-event.js +31859 -0
- package/sync-sources/hooks/record-cost-event.js.map +1 -0
- package/sync-sources/hooks/record-cost-event.ts +267 -0
- package/sync-sources/hooks/rtk-bash-filter +152 -0
- package/sync-sources/hooks/session-start-hook +80 -0
- package/sync-sources/hooks/specialist-stop-hook +106 -0
- package/sync-sources/hooks/statusline.sh +169 -0
- package/sync-sources/hooks/stop-hook +217 -0
- package/sync-sources/hooks/tldr-post-edit +72 -0
- package/sync-sources/hooks/tldr-read-enforcer +340 -0
- package/sync-sources/hooks/tmux-send-keys-guard +87 -0
- package/sync-sources/hooks/tsdown.config.ts +14 -0
- package/sync-sources/hooks/user-prompt-submit-hook +57 -0
- package/sync-sources/hooks/work-agent-stop-hook +424 -0
- package/server/auto-commit-CGQlb4rV.js +0 -3
- package/server/bd-mutex-BItGvLQ8.js +0 -35
- package/server/beads-restore-CMbDSB5R.js +0 -60
- package/server/cli-Ch_BWJB2.js +0 -3
- package/server/deacon-swarm-CSWGRfzr.js +0 -2
- package/server/dist-BUplB3Od.js +0 -3
- package/server/forge-IgLR0Ist.js +0 -2
- package/server/hume-x9voULey.js +0 -3
- package/server/inspect-agent-CYoWAeeB.js +0 -2
- package/server/merge-agent-CfohxFWM.js +0 -3
- package/server/merge-ops-Czke6UAp.js +0 -2
- package/server/projects-Bqfwuqet.js +0 -3
- package/server/providers-JjK6izqX.js +0 -3
- package/server/public/assets/index-CZiADHcL.css +0 -1
- package/server/public/assets/index-LQIfhmgI.js +0 -796
- package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +0 -1
- package/server/rally-Ba9QoNYc.js +0 -3
- package/server/record-De2syxNB.js +0 -3
- package/server/resume-CmxF3Kjz.js +0 -3
- package/server/settings-DEhYpW0k.js +0 -2
- package/server/specs-CVH1kvz3.js +0 -3
- package/server/supervisor-DQMK2e3I.js +0 -2
- package/server/workflows-pKw9yRSV.js +0 -2
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
+
import { a as withBdProcessLock, n as init_bd_process_lock } from "./bd-process-lock-D3S4T4o-.js";
|
|
3
|
+
import { n as init_export, t as exportBeadsJsonl } from "./export-Dx_qJ3h8.js";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
6
|
+
import { execFile } from "node:child_process";
|
|
7
|
+
import { promisify } from "node:util";
|
|
8
|
+
//#region ../../lib/beads/telemetry.ts
|
|
9
|
+
function updateBeadsTelemetry(projectKey, patch) {
|
|
10
|
+
health.set(projectKey, {
|
|
11
|
+
...health.get(projectKey) ?? empty(),
|
|
12
|
+
...patch
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function recordBeadsPull(projectKey, localHead, remoteHead, at = /* @__PURE__ */ new Date()) {
|
|
16
|
+
updateBeadsTelemetry(projectKey, {
|
|
17
|
+
localHead,
|
|
18
|
+
lastPulledRemoteHead: remoteHead,
|
|
19
|
+
lastSuccessfulPullAt: at.toISOString(),
|
|
20
|
+
lastSyncError: null
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function recordBeadsPush(projectKey, localHead, at = /* @__PURE__ */ new Date()) {
|
|
24
|
+
updateBeadsTelemetry(projectKey, {
|
|
25
|
+
localHead,
|
|
26
|
+
lastSuccessfulPushAt: at.toISOString(),
|
|
27
|
+
lastConflict: null
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function recordBeadsSyncError(projectKey, message) {
|
|
31
|
+
updateBeadsTelemetry(projectKey, { lastSyncError: message });
|
|
32
|
+
}
|
|
33
|
+
function recordBeadsConflict(projectKey, message) {
|
|
34
|
+
updateBeadsTelemetry(projectKey, { lastConflict: message });
|
|
35
|
+
}
|
|
36
|
+
function parseSchemaVersion(value) {
|
|
37
|
+
if (!value || typeof value !== "object") return null;
|
|
38
|
+
const record = value;
|
|
39
|
+
const raw = record.schema_version ?? record.schemaVersion ?? record.database?.schema_version;
|
|
40
|
+
const parsed = typeof raw === "number" ? raw : Number(raw);
|
|
41
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
42
|
+
}
|
|
43
|
+
async function getBeadsHealth(projectKey, cwd, execute = async (args, directory) => {
|
|
44
|
+
const { stdout } = await execFileAsync$1("bd", [...args], {
|
|
45
|
+
cwd: directory,
|
|
46
|
+
encoding: "utf8",
|
|
47
|
+
timeout: 1e4
|
|
48
|
+
});
|
|
49
|
+
return stdout;
|
|
50
|
+
}) {
|
|
51
|
+
const state = health.get(projectKey) ?? empty();
|
|
52
|
+
let schemaVersion = null;
|
|
53
|
+
try {
|
|
54
|
+
schemaVersion = parseSchemaVersion(JSON.parse(await execute(["context", "--json"], cwd)));
|
|
55
|
+
} catch {}
|
|
56
|
+
return {
|
|
57
|
+
...state,
|
|
58
|
+
freshnessAgeMs: state.lastSuccessfulPullAt ? Math.max(0, Date.now() - Date.parse(state.lastSuccessfulPullAt)) : null,
|
|
59
|
+
schemaVersion,
|
|
60
|
+
designatedMigrator: process.env.BD_ALLOW_REMOTE_MIGRATE === "1"
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
var execFileAsync$1, health, empty;
|
|
64
|
+
var init_telemetry = __esmMin((() => {
|
|
65
|
+
execFileAsync$1 = promisify(execFile);
|
|
66
|
+
health = /* @__PURE__ */ new Map();
|
|
67
|
+
empty = () => ({
|
|
68
|
+
localHead: null,
|
|
69
|
+
lastPulledRemoteHead: null,
|
|
70
|
+
lastSuccessfulPullAt: null,
|
|
71
|
+
lastSuccessfulPushAt: null,
|
|
72
|
+
lastConflict: null,
|
|
73
|
+
lastSyncError: null
|
|
74
|
+
});
|
|
75
|
+
}));
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region ../../lib/beads/writer.ts
|
|
78
|
+
function errorText(error) {
|
|
79
|
+
if (!error || typeof error !== "object") return String(error);
|
|
80
|
+
const record = error;
|
|
81
|
+
return [
|
|
82
|
+
record.stderr,
|
|
83
|
+
record.message,
|
|
84
|
+
record.stdout
|
|
85
|
+
].filter((value) => typeof value === "string").join("\n");
|
|
86
|
+
}
|
|
87
|
+
function errorDiagnosticText(error) {
|
|
88
|
+
if (!error || typeof error !== "object") return String(error);
|
|
89
|
+
const record = error;
|
|
90
|
+
return [record.stderr, record.message].filter((value) => typeof value === "string").join("\n");
|
|
91
|
+
}
|
|
92
|
+
function formatMutationBatchFailure(result) {
|
|
93
|
+
if (!("cause" in result)) return result.message;
|
|
94
|
+
const cause = errorText(result.cause).trim();
|
|
95
|
+
return cause ? `${result.message}\nCause: ${cause}` : result.message;
|
|
96
|
+
}
|
|
97
|
+
function isConflict(error) {
|
|
98
|
+
return /conflict|non-fast-forward|rejected|diverge/i.test(errorDiagnosticText(error));
|
|
99
|
+
}
|
|
100
|
+
function parseHead(status) {
|
|
101
|
+
return /^\s*Commit:\s*([0-9a-v]{7,40})\s*$/im.exec(status)?.[1] ?? null;
|
|
102
|
+
}
|
|
103
|
+
async function defaultExecute(args, cwd) {
|
|
104
|
+
const { stdout } = await execFileAsync("bd", [...args], {
|
|
105
|
+
cwd,
|
|
106
|
+
encoding: "utf8",
|
|
107
|
+
timeout: 12e4,
|
|
108
|
+
maxBuffer: BD_EXEC_MAX_BUFFER
|
|
109
|
+
});
|
|
110
|
+
return stdout;
|
|
111
|
+
}
|
|
112
|
+
async function defaultExportSnapshot(client, cwd) {
|
|
113
|
+
await exportBeadsJsonl(cwd, { execute: (args) => client.run(args) });
|
|
114
|
+
}
|
|
115
|
+
async function readHead(client) {
|
|
116
|
+
try {
|
|
117
|
+
return parseHead(await client.run(["vc", "status"]));
|
|
118
|
+
} catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function readRemoteHead(client) {
|
|
123
|
+
try {
|
|
124
|
+
const output = await client.run([
|
|
125
|
+
"dolt",
|
|
126
|
+
"remote",
|
|
127
|
+
"show",
|
|
128
|
+
"origin",
|
|
129
|
+
"--json"
|
|
130
|
+
]);
|
|
131
|
+
const parsed = JSON.parse(output);
|
|
132
|
+
const head = parsed.head ?? parsed.commit ?? parsed.remote_head;
|
|
133
|
+
return typeof head === "string" ? head : null;
|
|
134
|
+
} catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function hasExistingEmbeddedDoltStore(cwd) {
|
|
139
|
+
try {
|
|
140
|
+
const storePath = join(await resolveBeadsDir(cwd), "embeddeddolt");
|
|
141
|
+
if (!(await stat(storePath)).isDirectory()) return false;
|
|
142
|
+
return (await readdir(storePath)).length > 0;
|
|
143
|
+
} catch {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function resolveBeadsDir(cwd) {
|
|
148
|
+
const localBeadsDir = join(cwd, ".beads");
|
|
149
|
+
try {
|
|
150
|
+
return (await readFile(join(localBeadsDir, "redirect"), "utf8")).trim() || localBeadsDir;
|
|
151
|
+
} catch {
|
|
152
|
+
return localBeadsDir;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The only canonical beads mutation transaction boundary.
|
|
157
|
+
*
|
|
158
|
+
* A batch owns one project lock and one bootstrap/pull/commit/export/push
|
|
159
|
+
* cycle. A failed callback is deliberately left unpushed for operator
|
|
160
|
+
* recovery because bd does not expose a universally safe embedded-mode
|
|
161
|
+
* rollback primitive.
|
|
162
|
+
*/
|
|
163
|
+
async function runMutationBatch(context, mutate, dependencies = {}) {
|
|
164
|
+
const execute = dependencies.execute ?? defaultExecute;
|
|
165
|
+
const exportSnapshot = dependencies.exportSnapshot ?? defaultExportSnapshot;
|
|
166
|
+
const withLock = dependencies.withLock ?? withBdProcessLock;
|
|
167
|
+
const cwd = context.project.workspacePath;
|
|
168
|
+
const telemetryKey = context.project.projectKey ?? cwd;
|
|
169
|
+
const client = {
|
|
170
|
+
run: (args) => execute(args, cwd),
|
|
171
|
+
mutate: (args) => execute([
|
|
172
|
+
...args,
|
|
173
|
+
"--dolt-auto-commit",
|
|
174
|
+
"batch"
|
|
175
|
+
], cwd)
|
|
176
|
+
};
|
|
177
|
+
return withLock(`beads mutation: ${context.reason}`, async () => {
|
|
178
|
+
let value;
|
|
179
|
+
try {
|
|
180
|
+
if (!await hasExistingEmbeddedDoltStore(cwd)) await client.run([
|
|
181
|
+
"bootstrap",
|
|
182
|
+
"--yes",
|
|
183
|
+
"--json"
|
|
184
|
+
]);
|
|
185
|
+
await client.run(["dolt", "pull"]);
|
|
186
|
+
recordBeadsPull(telemetryKey, await readHead(client), await readRemoteHead(client));
|
|
187
|
+
value = await mutate(client);
|
|
188
|
+
await client.run([
|
|
189
|
+
"dolt",
|
|
190
|
+
"commit",
|
|
191
|
+
"-m",
|
|
192
|
+
context.reason
|
|
193
|
+
]);
|
|
194
|
+
await exportSnapshot(client, cwd);
|
|
195
|
+
} catch (error) {
|
|
196
|
+
const localHead = await readHead(client);
|
|
197
|
+
if (isConflict(error)) {
|
|
198
|
+
recordBeadsConflict(telemetryKey, errorText(error));
|
|
199
|
+
return {
|
|
200
|
+
ok: false,
|
|
201
|
+
conflict: true,
|
|
202
|
+
localHead,
|
|
203
|
+
remoteHead: await readRemoteHead(client),
|
|
204
|
+
message: "The Dolt histories conflict. Nothing was pushed; pull and reconcile the working set before retrying."
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
recordBeadsSyncError(telemetryKey, errorText(error));
|
|
208
|
+
return {
|
|
209
|
+
ok: false,
|
|
210
|
+
needsOperatorRecovery: true,
|
|
211
|
+
localHead,
|
|
212
|
+
message: "The mutation batch failed before push. The local working set was preserved for operator recovery and no partial plan was published.",
|
|
213
|
+
cause: error
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
await client.run(["dolt", "push"]);
|
|
218
|
+
const localHead = await readHead(client);
|
|
219
|
+
recordBeadsPush(telemetryKey, localHead);
|
|
220
|
+
return {
|
|
221
|
+
ok: true,
|
|
222
|
+
value,
|
|
223
|
+
localHead
|
|
224
|
+
};
|
|
225
|
+
} catch (error) {
|
|
226
|
+
recordBeadsConflict(telemetryKey, errorText(error));
|
|
227
|
+
return {
|
|
228
|
+
ok: false,
|
|
229
|
+
conflict: true,
|
|
230
|
+
localHead: await readHead(client),
|
|
231
|
+
remoteHead: await readRemoteHead(client),
|
|
232
|
+
message: "The Dolt push was rejected. The batch is not durably complete; no force push was attempted."
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}, {
|
|
236
|
+
...context.lockOptions,
|
|
237
|
+
workspacePath: cwd
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
var execFileAsync, BD_EXEC_MAX_BUFFER;
|
|
241
|
+
var init_writer = __esmMin((() => {
|
|
242
|
+
init_bd_process_lock();
|
|
243
|
+
init_export();
|
|
244
|
+
init_telemetry();
|
|
245
|
+
execFileAsync = promisify(execFile);
|
|
246
|
+
BD_EXEC_MAX_BUFFER = 64 * 1024 * 1024;
|
|
247
|
+
}));
|
|
248
|
+
//#endregion
|
|
249
|
+
export { init_telemetry as a, getBeadsHealth as i, init_writer as n, recordBeadsPull as o, runMutationBatch as r, recordBeadsSyncError as s, formatMutationBatchFailure as t };
|
|
250
|
+
|
|
251
|
+
//# sourceMappingURL=writer-fe1-8iGc.js.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/ask-user-question-hook (PAN-1520)
|
|
3
|
+
#
|
|
4
|
+
# PreToolUse hook on AskUserQuestion — denies the tool call to prevent the
|
|
5
|
+
# upstream Claude Code silent-corruption bug (anthropics/claude-code#10229,
|
|
6
|
+
# #10400) where AskUserQuestion's choice menu does not render under
|
|
7
|
+
# --dangerously-skip-permissions and the harness returns option #1's literal
|
|
8
|
+
# label as the tool_result, fabricating an operator answer that never happened.
|
|
9
|
+
#
|
|
10
|
+
# Until the dashboard surfaces AskUserQuestion options interactively (the rest
|
|
11
|
+
# of PAN-1520), the only safe failure mode is "block until the agent re-asks
|
|
12
|
+
# in plain prose". This hook converts silent corruption -> visible block by
|
|
13
|
+
# returning a deny verdict with the full question text + option labels as
|
|
14
|
+
# additionalContext, so the agent restates the choice to the operator as
|
|
15
|
+
# regular text and waits for a normal response.
|
|
16
|
+
#
|
|
17
|
+
# Never breaks Claude Code: on any error the hook exits 0 silently (which
|
|
18
|
+
# lets the original AskUserQuestion call through — preserving the prior
|
|
19
|
+
# behaviour rather than introducing a new hang).
|
|
20
|
+
|
|
21
|
+
set +e
|
|
22
|
+
|
|
23
|
+
INPUT=$(cat 2>/dev/null || echo '{}')
|
|
24
|
+
|
|
25
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
26
|
+
# Without jq we cannot safely parse the question payload. Allow the call.
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
|
|
31
|
+
if [ "$TOOL_NAME" != "AskUserQuestion" ]; then
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# Emit an awareness event to the dashboard via the standard hook lib so the
|
|
36
|
+
# operator can see the question was asked, even though the tool call is denied.
|
|
37
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
38
|
+
# shellcheck source=pan-hook-lib.sh
|
|
39
|
+
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || true
|
|
40
|
+
if declare -f pan_resolve_agent_id >/dev/null && pan_resolve_agent_id; then
|
|
41
|
+
TS=$(date -Iseconds)
|
|
42
|
+
EVENT_BODY=$(echo "$INPUT" | jq --arg ts "$TS" '{
|
|
43
|
+
kind: "ask_user_question_blocked",
|
|
44
|
+
timestamp: $ts,
|
|
45
|
+
questions: (.tool_input.questions // [])
|
|
46
|
+
}' 2>/dev/null)
|
|
47
|
+
if [ -n "$EVENT_BODY" ] && declare -f pan_emit_event >/dev/null; then
|
|
48
|
+
pan_emit_event "$AGENT_ID" "$EVENT_BODY" 2>/dev/null || true
|
|
49
|
+
fi
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
REASON='Your question has been surfaced to the operator in the Overdeck dashboard, where they answer it directly. Restate the question and its options to the operator as a short plain-text message and wait for their reply (it arrives as a normal user message).'
|
|
53
|
+
|
|
54
|
+
CONTEXT=$(echo "$INPUT" | jq -r '
|
|
55
|
+
def fmt_option:
|
|
56
|
+
" - " + (.label // "(no label)")
|
|
57
|
+
+ (if .description then ": " + .description else "" end);
|
|
58
|
+
def fmt_question:
|
|
59
|
+
"Question: " + (.question // "(no question text)")
|
|
60
|
+
+ (if .header then "\nHeader: " + .header else "" end)
|
|
61
|
+
+ "\nOptions:\n" + ((.options // []) | map(fmt_option) | join("\n"));
|
|
62
|
+
(.tool_input.questions // [])
|
|
63
|
+
| map(fmt_question)
|
|
64
|
+
| join("\n\n")
|
|
65
|
+
' 2>/dev/null)
|
|
66
|
+
|
|
67
|
+
if [ -z "$CONTEXT" ]; then
|
|
68
|
+
CONTEXT="(failed to parse questions payload — restate your question to the operator as plain text)"
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
INSTRUCTION="Restate the following to the operator as a plain-text message, listing the options as a numbered list, and wait for their normal response. Do not call AskUserQuestion again."
|
|
72
|
+
|
|
73
|
+
jq -n \
|
|
74
|
+
--arg reason "$REASON" \
|
|
75
|
+
--arg context "${INSTRUCTION}
|
|
76
|
+
|
|
77
|
+
${CONTEXT}" \
|
|
78
|
+
'{
|
|
79
|
+
hookSpecificOutput: {
|
|
80
|
+
hookEventName: "PreToolUse",
|
|
81
|
+
permissionDecision: "deny",
|
|
82
|
+
permissionDecisionReason: $reason,
|
|
83
|
+
additionalContext: $context
|
|
84
|
+
}
|
|
85
|
+
}'
|
|
86
|
+
|
|
87
|
+
exit 0
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/auto-approve-hook
|
|
3
|
+
#
|
|
4
|
+
# PreToolUse hook that returns permissionDecision: "allow" — but ONLY for the
|
|
5
|
+
# fully-autonomous, headless pipeline agents that have no human to answer Claude
|
|
6
|
+
# Code's "Do you want to proceed?" prompt. Without this, an unapproved tool call
|
|
7
|
+
# hangs the session forever (PAN-1024's "Interrupted · What should Claude do
|
|
8
|
+
# instead?" loop). This is the replacement for launching those agents with
|
|
9
|
+
# --dangerously-skip-permissions, which Auto-mode (compliance) users forbid.
|
|
10
|
+
#
|
|
11
|
+
# SCOPE (by OVERDECK_AGENT_ID prefix):
|
|
12
|
+
# agent-* → AUTO-APPROVE. Work / review / test / ship pipeline agents run
|
|
13
|
+
# unattended; a prompt would hang them.
|
|
14
|
+
# flywheel-* → AUTO-APPROVE. The Fix-All Flywheel orchestrator
|
|
15
|
+
# (OVERDECK_AGENT_ID=flywheel-orchestrator) is fully headless —
|
|
16
|
+
# a prompt hangs the entire run. It does NOT use an agent-* id.
|
|
17
|
+
# sequencer-* → AUTO-APPROVE. The Backlog Sequencer
|
|
18
|
+
# (OVERDECK_AGENT_ID=sequencer-runner) is a headless singleton
|
|
19
|
+
# runner like the flywheel — it reads issues via `gh` with no human
|
|
20
|
+
# present, so an approval prompt stalls the whole ranking pass.
|
|
21
|
+
# strike-* / inspect-* → AUTO-APPROVE. Headless strike (implement+merge) and
|
|
22
|
+
# per-bead inspect agents, same autonomy as a work agent.
|
|
23
|
+
# planning-* → AUTO-APPROVE. A planning agent must not be MORE restrictive than
|
|
24
|
+
# a work agent (which is auto-approved) or a conversation (which
|
|
25
|
+
# runs under bypass) — otherwise it is the only thing in the system
|
|
26
|
+
# that stalls on Claude Code's native command gates (e.g. the
|
|
27
|
+
# "compound command contains cd with output redirection" prompt).
|
|
28
|
+
# Planning's interactivity is the AskUserQuestion DIALOG (decisions
|
|
29
|
+
# surface to the operator via ask-user-question-hook), NOT per-command
|
|
30
|
+
# approval. So its routine research is auto-approved like a work agent.
|
|
31
|
+
# conv-* → AUTO-APPROVE. Overdeck conversations run autonomously between
|
|
32
|
+
# operator turns; they used to rely on Claude Code's `--permission-mode
|
|
33
|
+
# auto` classifier to avoid per-command prompts, but Claude Code
|
|
34
|
+
# removed `auto` as a valid interactive mode (we now launch every
|
|
35
|
+
# Overdeck session with `--permission-mode default`). Without this
|
|
36
|
+
# the conversation stalls on Claude's native "requires approval"
|
|
37
|
+
# gate for routine commands (e.g. `pan status`). The operator still
|
|
38
|
+
# sees every command in the dashboard terminal and steers via
|
|
39
|
+
# `pan tell`; AskUserQuestion is still excluded below so operator
|
|
40
|
+
# decisions surface as a dialog.
|
|
41
|
+
# (unset) → NOT auto-approved. A human's own plain `claude` session keeps
|
|
42
|
+
# normal prompts.
|
|
43
|
+
#
|
|
44
|
+
# This hook is wired in the GLOBAL settings.json (frontmatter PreToolUse hooks'
|
|
45
|
+
# permissionDecision is NOT honored by Claude Code — only settings.json hooks can
|
|
46
|
+
# decide permission), so the prefix check above is what keeps it from leaking
|
|
47
|
+
# into interactive/human sessions.
|
|
48
|
+
#
|
|
49
|
+
# AskUserQuestion is also skipped so ask-user-question-hook's deny stands.
|
|
50
|
+
#
|
|
51
|
+
# Never breaks Claude Code: on any error it stays silent (exit 0), which falls
|
|
52
|
+
# back to the normal permission flow rather than forcing a decision.
|
|
53
|
+
|
|
54
|
+
set +e
|
|
55
|
+
|
|
56
|
+
LOG_DIR="$HOME/.overdeck/logs"
|
|
57
|
+
mkdir -p "$LOG_DIR" 2>/dev/null || true
|
|
58
|
+
|
|
59
|
+
INPUT=$(cat 2>/dev/null || echo '{}')
|
|
60
|
+
|
|
61
|
+
TOOL_NAME=""
|
|
62
|
+
if command -v jq >/dev/null 2>&1; then
|
|
63
|
+
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
echo "[$(date -Iseconds)] auto-approve-hook: AGENT=${OVERDECK_AGENT_ID:-unset} tool=${TOOL_NAME:-unknown}" \
|
|
67
|
+
>> "$LOG_DIR/auto-approve.log" 2>/dev/null || true
|
|
68
|
+
|
|
69
|
+
# Overdeck pipeline agents (work + planning) AND conversations, which run
|
|
70
|
+
# autonomously between operator turns. Only a plain human `claude` session
|
|
71
|
+
# (OVERDECK_AGENT_ID unset) keeps normal prompts.
|
|
72
|
+
case "${OVERDECK_AGENT_ID:-}" in
|
|
73
|
+
agent-*|planning-*|flywheel-*|strike-*|inspect-*|sequencer-*|conv-*) : ;;
|
|
74
|
+
*) exit 0 ;;
|
|
75
|
+
esac
|
|
76
|
+
|
|
77
|
+
# Let ask-user-question-hook own AskUserQuestion (its deny summons the dialog).
|
|
78
|
+
if [ "$TOOL_NAME" = "AskUserQuestion" ]; then
|
|
79
|
+
exit 0
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
REASON='Overdeck autonomous pipeline agent auto-approve: headless agent-* sessions replace --dangerously-skip-permissions with this scoped PreToolUse allow hook.'
|
|
83
|
+
|
|
84
|
+
if command -v jq >/dev/null 2>&1; then
|
|
85
|
+
jq -n --arg reason "$REASON" '{
|
|
86
|
+
hookSpecificOutput: {
|
|
87
|
+
hookEventName: "PreToolUse",
|
|
88
|
+
permissionDecision: "allow",
|
|
89
|
+
permissionDecisionReason: $reason
|
|
90
|
+
}
|
|
91
|
+
}'
|
|
92
|
+
else
|
|
93
|
+
printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","permissionDecisionReason":"Overdeck autonomous pipeline agent auto-approve"}}'
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
exit 0
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// ~/.overdeck/bin/codex-notify-hook (PAN-1574)
|
|
3
|
+
//
|
|
4
|
+
// Fires via Codex CLI notify mechanism on agent-turn-complete.
|
|
5
|
+
// Codex passes the event JSON as stdin or as a JSON argv argument.
|
|
6
|
+
//
|
|
7
|
+
// Writes ~/.overdeck/agents/<id>/heartbeat.json so codex.ts getHeartbeat
|
|
8
|
+
// can detect turn-end activity. Also writes a `completed` marker used by
|
|
9
|
+
// the recovery path to detect agent idle state.
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const { join } = require('node:path');
|
|
14
|
+
const { homedir } = require('node:os');
|
|
15
|
+
const { writeFileSync, mkdirSync, existsSync } = require('node:fs');
|
|
16
|
+
|
|
17
|
+
const agentId = process.env.OVERDECK_AGENT_ID;
|
|
18
|
+
if (!agentId) process.exit(0); // Not a Overdeck-managed agent
|
|
19
|
+
|
|
20
|
+
// Read event JSON from stdin (Codex delivers via stdin by default).
|
|
21
|
+
let eventData = {};
|
|
22
|
+
try {
|
|
23
|
+
const chunks = [];
|
|
24
|
+
process.stdin.setEncoding('utf8');
|
|
25
|
+
for (const chunk of []) { chunks.push(chunk); }
|
|
26
|
+
// Synchronous stdin read — Codex provides the event before invoking the shim.
|
|
27
|
+
const raw = require('node:fs').readFileSync('/dev/stdin', 'utf8').trim();
|
|
28
|
+
if (raw) eventData = JSON.parse(raw);
|
|
29
|
+
} catch {
|
|
30
|
+
// Ignore parse errors — best-effort heartbeat.
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const overdeckHome = process.env.OVERDECK_HOME || join(homedir(), '.overdeck');
|
|
34
|
+
const heartbeatsDir = join(overdeckHome, 'heartbeats');
|
|
35
|
+
const agentDir = join(overdeckHome, 'agents', agentId);
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
mkdirSync(heartbeatsDir, { recursive: true });
|
|
39
|
+
mkdirSync(agentDir, { recursive: true });
|
|
40
|
+
} catch { /* ignore */ }
|
|
41
|
+
|
|
42
|
+
const timestamp = new Date().toISOString();
|
|
43
|
+
const lastAction = typeof eventData['last-assistant-message'] === 'string'
|
|
44
|
+
? eventData['last-assistant-message'].slice(0, 200)
|
|
45
|
+
: undefined;
|
|
46
|
+
|
|
47
|
+
const heartbeat = {
|
|
48
|
+
timestamp,
|
|
49
|
+
tool_name: 'agent-turn-complete',
|
|
50
|
+
last_action: lastAction,
|
|
51
|
+
thread_id: eventData['thread-id'],
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Write heartbeat.json for the 3-tier ladder (tier 1 = active heartbeat <60s).
|
|
55
|
+
try {
|
|
56
|
+
writeFileSync(join(heartbeatsDir, `${agentId}.json`), JSON.stringify(heartbeat) + '\n');
|
|
57
|
+
} catch { /* ignore */ }
|
|
58
|
+
|
|
59
|
+
// Write completed marker so recovery path knows the agent finished a turn.
|
|
60
|
+
try {
|
|
61
|
+
writeFileSync(join(agentDir, 'turn-completed'), timestamp + '\n');
|
|
62
|
+
} catch { /* ignore */ }
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region gh-issue-trailer-hook.d.ts
|
|
2
|
+
type HookEnv = Record<string, string | undefined>;
|
|
3
|
+
declare function rewriteGhIssueCreateCommand(command: string, env?: HookEnv): string | null;
|
|
4
|
+
declare function runGhIssueTrailerHook(input: string, env?: HookEnv): string;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { rewriteGhIssueCreateCommand, runGhIssueTrailerHook };
|
|
7
|
+
//# sourceMappingURL=gh-issue-trailer-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-issue-trailer-hook.d.ts","names":[],"sources":["gh-issue-trailer-hook.ts"],"mappings":";KAoBK,OAAA,GAAU,MAAA;AAAA,iBA+OC,2BAAA,CAA4B,OAAA,UAAiB,GAAA,GAAK,OAAA;AAAA,iBAiBlD,qBAAA,CAAsB,KAAA,UAAe,GAAA,GAAK,OAAA"}
|