@overdeck/desktop 0.45.12 → 0.45.13
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-CfujPRrz.js} +2 -2
- package/server/{advancing-selfheal-BqsLWqEM.js → advancing-selfheal-Bn5QiLtn.js} +4 -4
- package/server/{agent-gc-CUb52n7s.js → agent-gc-Cl9Nm0Zu.js} +3 -3
- package/server/{agent-state-D-moNwhA.js → agent-state-C6Rm6FPR.js} +1 -1
- package/server/{agent-state-service-BzESvLOf.js → agent-state-service-JhFzYCP_.js} +5 -5
- package/server/{agent-state-service-BaZH7sXJ.js → agent-state-service-U8feBf8t.js} +1 -1
- package/server/{agents-C4kZ8a2r.js → agents-CxbuBjID.js} +1 -1
- package/server/{agents-B5LfpLPv.js → agents-DqQa4Dq_.js} +88 -64
- package/server/{archive-planning-oX1pj6nY.js → archive-planning-CPitEZo4.js} +3 -3
- package/server/{archive-planning-BbZe-8IK.js → archive-planning-DmpT1_14.js} +1 -1
- package/server/{artifact-index-jobs-DGr6bxev.js → artifact-index-jobs-sMnNtPhy.js} +2 -2
- package/server/{auto-commit-CGQlb4rV.js → auto-commit-wZ9X7Isd.js} +1 -1
- package/server/{backlog-auto-trigger-BlJHikOm.js → backlog-auto-trigger-Cf9C8fwD.js} +2 -2
- package/server/{bd-process-lock-i3CYMS-B.js → bd-process-lock-D1aJxeYv.js} +2 -2
- package/server/{beads-BNU-fb48.js → beads-CivpXztb.js} +1 -1
- package/server/{beads-DD7fYCl5.js → beads-DRoj6-e1.js} +4 -4
- package/server/{beads-query-e6oku4P5.js → beads-query-tOsAYP5h.js} +2 -2
- package/server/{behavior-CPf0pbOt.js → behavior-D3d2mVyD.js} +3 -3
- package/server/{briefing-freshness-B2FdLwIv.js → briefing-freshness-BL3Q6p7R.js} +4 -4
- package/server/{checkpoint-manager-JryW6MpM.js → checkpoint-manager-DCxjQvP_.js} +2 -2
- package/server/{checkpoint-manager-eFgaMMu4.js → checkpoint-manager-j5URlFY7.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-qvOqvMuC.js → checkpoints-BoX1H2Hf.js} +2 -2
- package/server/{checkpoints-BK17oicz.js → checkpoints-Bu_M_Q9W.js} +1 -1
- package/server/claude-hooks-provision-D-jGXmu1.js +360 -0
- package/server/{claude-permissions-B6bWGh9d.js → claude-permissions-DxIjkOVl.js} +2 -2
- package/server/{claude-settings-overlay-BPdhTPjo.js → claude-settings-overlay-5b9X2S0C.js} +1 -1
- package/server/{claude-settings-overlay-CRyyKKXQ.js → claude-settings-overlay-BPDS6GfE.js} +2 -2
- package/server/cli-CqgiSAU8.js +3 -0
- package/server/{cli-B75AieAM.js → cli-s7bPWy-E.js} +9 -9
- package/server/{cliproxy-CCzwuSNe.js → cliproxy-BituqWtR.js} +2 -2
- package/server/{cliproxy-DOQf66G9.js → cliproxy-D3sHB0sI.js} +1 -1
- package/server/{close-issue-_X3MXJyG.js → close-issue-CrBE7voz.js} +4 -4
- package/server/{closed-issue-reaper-CLR7ClsO.js → closed-issue-reaper-BRQBc7Xa.js} +1 -1
- package/server/{closed-issue-reaper-BsUfBSjM.js → closed-issue-reaper-DX9mYUji.js} +9 -9
- package/server/{codex-CY-QRuU9.js → codex-Bi1ITSOo.js} +1 -1
- package/server/{codex-B4KEpX5V.js → codex-CO0HrK3j.js} +5 -5
- package/server/{compact-beads-cZds2MTr.js → compact-beads-CrA8-k10.js} +1 -1
- package/server/{compact-beads-uEDccC76.js → compact-beads-DUkCUFxA.js} +3 -3
- package/server/{config-DARrpYWA.js → config-B4_d7z7z.js} +1 -1
- package/server/{config-8sjaU6jZ.js → config-DsCxzjXK.js} +2 -2
- package/server/{config-yaml-ClpGgrf6.js → config-yaml-C_djSurJ.js} +2 -2
- package/server/{conflict-gate-Ds9_2yjd.js → conflict-gate-CpOn9KC-.js} +1 -1
- package/server/{conflict-gate-BtB_o-Vi.js → conflict-gate-D47Kl78u.js} +3 -3
- package/server/{context-layers-r2ywnQYA.js → context-layers-BNhUBTkf.js} +3 -3
- package/server/{context-layers-CRCk1QG7.js → context-layers-CHl3Nroz.js} +2 -2
- package/server/{control-settings-D1B3u6HP.js → control-settings-KyYNXZLv.js} +4 -4
- package/server/{conversation-compaction-D86Zo2Ci.js → conversation-compaction-D3aS5PnS.js} +8 -8
- package/server/{conversation-compaction-CZRVk4hg.js → conversation-compaction-D4Wed1BJ.js} +1 -1
- package/server/{conversation-service-CuTVU8dV.js → conversation-service-CFZIjs-M.js} +5 -5
- package/server/{conversation-service-CkL-6MuG.js → conversation-service-DcDB5usR.js} +1 -1
- package/server/{conversations-DfJKBDwB.js → conversations-BSOU5qnu.js} +4 -4
- package/server/{conversations-BmWEluPL.js → conversations-BbDPrz89.js} +1 -1
- package/server/{cost-DAPYN6iA.js → cost-BE_ulOrw.js} +3 -3
- package/server/{cost-CCnqa5xK.js → cost-CaiG63FG.js} +2 -2
- package/server/{cost-sync-BDL10Nwu.js → cost-sync-D6AX8jv-.js} +3 -3
- package/server/{dag-Dv2r5bVD.js → dag-BQFtXOuJ.js} +3 -3
- package/server/{dangerous-git-ops-Dcw7PbYo.js → dangerous-git-ops-04Ba-Qu3.js} +1 -1
- package/server/dashboard-db-worker.js +6 -6
- package/server/{deacon-CM0MxbS8.js → deacon-2EvA9Ci3.js} +97 -97
- package/server/{deacon-DYnZH7kC.js → deacon-Bz-6Wjmn.js} +3 -3
- package/server/deacon-swarm-B8pgK2a7.js +2 -0
- package/server/{deacon-swarm-BstYoz8Q.js → deacon-swarm-DYYOzHRH.js} +10 -10
- package/server/deacon.js +7 -7
- package/server/{devcontainer-renderer-CaYOG9JN.js → devcontainer-renderer-Dx0C7VWJ.js} +2 -2
- package/server/dist-BYSj075e.js +3 -0
- package/server/{dist-BIC8spJ0.js → dist-ya66D9ze.js} +1 -1
- package/server/{docker-DDI1shu3.js → docker-D2TbXDO6.js} +2 -2
- package/server/{ensure-devcontainer-CbSXvN9W.js → ensure-devcontainer-BIShzs3M.js} +1 -1
- package/server/{ensure-devcontainer-DCAg3ksz.js → ensure-devcontainer-BTiMfFp5.js} +3 -3
- package/server/{event-store-DU3HkZlN.js → event-store-C02Gprug.js} +1 -1
- package/server/{event-store-DCMqyI07.js → event-store-C71x6h0i.js} +3 -3
- package/server/{events-BfiosVAn.js → events-BFDuPV6n.js} +3 -3
- package/server/{events-DLRxpSuV.js → events-D2gP2-Yv.js} +1 -1
- package/server/{factory-BMtWV9iv.js → factory-ByfbrCab.js} +4 -4
- package/server/{feature-registry-population-DA7bO6Zn.js → feature-registry-population-CSH66UO8.js} +4 -4
- package/server/{feature-registry-storage-nAY1fbBt.js → feature-registry-storage-DW7dUefc.js} +2 -2
- package/server/{features-DMu7eGmU.js → features-x_aLR7U9.js} +2 -2
- package/server/{feedback-target-DHqcw3cN.js → feedback-target-BFo9fScH.js} +6 -6
- package/server/{feedback-target-B2SEai8-.js → feedback-target-C4VMPTZu.js} +1 -1
- package/server/{feedback-writer-qvm7UON7.js → feedback-writer-B9ZqnnX3.js} +4 -4
- package/server/{feedback-writer-DMBdS_jL.js → feedback-writer-DCyd75yJ.js} +1 -1
- package/server/{flywheel-Dfpx4bIV.js → flywheel-D9NKvWqb.js} +11 -11
- package/server/{flywheel-k4FPtCQ_.js → flywheel-DB48X7Nn.js} +1 -1
- package/server/{flywheel-D2LdPSic.js → flywheel-DwQCoZQG.js} +13 -13
- package/server/{flywheel-merge-order-CB4lbXeJ.js → flywheel-merge-order-DrjmFXg4.js} +6 -6
- package/server/{flywheel-merge-order-CttTazRY.js → flywheel-merge-order-f1bi5XIf.js} +1 -1
- package/server/{forge-CoPFXFyl.js → forge-C-SoKy8U.js} +2 -2
- package/server/forge-CUCYK7h_.js +2 -0
- package/server/{from-B0YoJl9-.js → from-fu7ZumnY.js} +1 -1
- package/server/{fts-db-DAHW1yA_.js → fts-db-CL-YzSRG.js} +2 -2
- package/server/{fts-operations-DDXDBi0d.js → fts-operations-Bylu5NjM.js} +2 -2
- package/server/{git-utils-B90Zjzfl.js → git-utils-C8koBs8j.js} +2 -2
- package/server/{git-utils-DbfC0zls.js → git-utils-Ym380hJZ.js} +1 -1
- package/server/{github-app-C7lftMNj.js → github-app-DIr70YLg.js} +1 -1
- package/server/{github-app-BecAnXRX.js → github-app-DhycHVLF.js} +2 -2
- package/server/{github-client-D21rCIXk.js → github-client-7gkcXcBS.js} +2 -2
- package/server/{github-client-BwtKZtM0.js → github-client-Ji9lUTNF.js} +1 -1
- package/server/{github-pr-lookup-CzVWuysl.js → github-pr-lookup-rt7T9FwA.js} +2 -2
- package/server/{harness-resolve-SkRJm4a7.js → harness-resolve-CvGXUnAF.js} +3 -3
- package/server/{health-events-BT0aAfeA.js → health-events-D4E1DLN-.js} +2 -2
- package/server/{health-events-DA_JLpgZ.js → health-events-DDfkoO5a.js} +1 -1
- package/server/{hooks-DxEn2BoY.js → hooks-D_6pAbuJ.js} +2 -2
- package/server/{hooks-BQxRXtRb.js → hooks-DvdnCVv6.js} +1 -1
- package/server/{idle-stack-reaper-C7fJL8jH.js → idle-stack-reaper-DNbV9-fj.js} +1 -1
- package/server/{idle-stack-reaper-DGy7tvC9.js → idle-stack-reaper-cDRXDpgE.js} +2 -2
- package/server/{infra-DE3C4PMr.js → infra-Clew3DpF.js} +50 -3
- package/server/{injection-Dt22tGvS.js → injection-QCIHOpk6.js} +1 -1
- package/server/{injection-Cc4Qt8LZ.js → injection-ql0Nddcn.js} +7 -7
- package/server/inspect-agent-D8UBDgfR.js +2 -0
- package/server/{inspect-agent-DOaCDkCF.js → inspect-agent-DY18KEx4.js} +9 -9
- package/server/{internal-token-B_1YLWLI.js → internal-token-BeXjPLKy.js} +2 -2
- package/server/{internal-token-nobT6FhA.js → internal-token-C90jBp-y.js} +1 -1
- package/server/{io-A7ZuOBkz.js → io-CbAFXQge.js} +2 -2
- package/server/{issue-closed-Da3DeomA.js → issue-closed-BYC2TCk-.js} +4 -4
- package/server/{issue-lifecycle-543pQX9D.js → issue-lifecycle-BoJa6qIt.js} +21 -21
- package/server/{issue-lifecycle-Bd9XBJAQ.js → issue-lifecycle-CLHbj8RS.js} +1 -1
- package/server/{issue-service-singleton-BC2JLZi7.js → issue-service-singleton-3g_CCY-1.js} +1 -1
- package/server/{issue-service-singleton-Brc3t0SV.js → issue-service-singleton-BS9NENuR.js} +8 -8
- package/server/{issues-D3kt9UWE.js → issues-BPcqPqfV.js} +2 -2
- package/server/{label-cleanup-w9X_T3AQ.js → label-cleanup-CwiCSZrb.js} +2 -2
- package/server/{layers-Cwe1J-9o.js → layers-OHHLphl0.js} +2 -2
- package/server/{lifecycle-f1GbDK33.js → lifecycle-B8IdvUbt.js} +6 -6
- package/server/{lifecycle-io-D56q8zlO.js → lifecycle-io-BMCH1Bxg.js} +1 -1
- package/server/{lifecycle-io-Bqvj0m3i.js → lifecycle-io-C73m5e6R.js} +4 -4
- package/server/{linear-client-Bh4T4S-c.js → linear-client-BMxgycoy.js} +1 -1
- package/server/{linear-client-CfJMTAYd.js → linear-client-CgQlM4aT.js} +2 -2
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-ZrXFM3jv.js → merge-B7Oi-g6k.js} +3 -3
- package/server/{merge-DRMPa8CQ.js → merge-BRkVaIx-.js} +1 -1
- package/server/merge-agent-Bwm34MZ5.js +3 -0
- package/server/{merge-agent-CHHs5S_0.js → merge-agent-DNFFsiEm.js} +61 -26
- package/server/{merge-batch-BwhGdlh4.js → merge-batch-BpYXUaqJ.js} +1 -1
- package/server/{merge-blockers-BMhDpMl_.js → merge-blockers-DIOZmqdK.js} +2 -2
- package/server/merge-ops-B7m-hBEZ.js +2 -0
- package/server/{merge-rebase-R7MfqpiE.js → merge-rebase-C8WH39MB.js} +2 -2
- package/server/{merge-set-B3Breacq.js → merge-set-CsEE2CyQ.js} +9 -5
- package/server/{merge-set-D-iXNP0I.js → merge-set-DOsBTBQc.js} +1 -1
- package/server/{merge-sync-DHWbGtjR.js → merge-sync-C2B322Ot.js} +2 -2
- package/server/{merge-sync-bOOtfeXR.js → merge-sync-CcLM2vwW.js} +1 -1
- package/server/{merge-train-98ptZrPT.js → merge-train-BIm7-7cy.js} +3 -3
- package/server/{merge-train-deps-B5FWJTE2.js → merge-train-deps-DG1oQ2DT.js} +4 -4
- package/server/{merge-verification-BGiuiXAK.js → merge-verification-BAbjxEd5.js} +4 -4
- package/server/{multipart-parser-D7mzNNDm.js → multipart-parser-jKtKAXtl.js} +2 -2
- package/server/node_modules/.package-lock.json +1 -1
- package/server/{orphan-proposed-reconciler-CSuxivr9.js → orphan-proposed-reconciler-BqVGaOIj.js} +1 -1
- package/server/{orphan-proposed-reconciler-BSGCNJ6X.js → orphan-proposed-reconciler-zHrwJ3xr.js} +9 -9
- package/server/package-lock.json +2 -2
- package/server/package.json +1 -1
- package/server/{pan-dir-DoPtdHrp.js → pan-dir-BlNrLzW7.js} +3 -3
- package/server/{paths-CVDLPxXp.js → paths-CiVeo4N_.js} +2 -2
- package/server/{pipeline-notifier-WD2dnOsR.js → pipeline-notifier-DBF6dHxH.js} +2 -2
- package/server/{pipeline-notifier-BtYHbBPl.js → pipeline-notifier-nkWCe042.js} +1 -1
- package/server/{projects-Bqfwuqet.js → projects-BqRMlDOv.js} +1 -1
- package/server/{prompts-Cg7e9FPb.js → prompts-CXbQvevY.js} +2 -2
- package/server/{providers-fLduChnX.js → providers-CUdAb5Qu.js} +7 -7
- package/server/{providers-JjK6izqX.js → providers-gZ0cUgQM.js} +1 -1
- package/server/public/assets/{chunk-BO2N2NFS-aNlsGDCu.js → chunk-BO2N2NFS-C-6y8VFI.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-CnjkrvT8.js → diagram-OG6HWLK6-NACO1xW5.js} +1 -1
- package/server/public/assets/{dist-CGKBCieA.js → dist-D1FjqGgm.js} +1 -1
- package/server/public/assets/{dist-Bg3Sbsx4.js → dist-DQD-ZjQY.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-C8LLKj23.js → ganttDiagram-6RSMTGT7-CEMAKgmE.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-BSDEUvhW.js → highlighted-body-OFNGDK62-D5lC7FW8.js} +1 -1
- package/server/public/assets/{index-LQIfhmgI.js → index-BDqWyuZQ.js} +140 -140
- package/server/public/assets/{linear-DEbYZoxg.js → linear-DDHAMRPB.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-DRM2ANcR.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BtZL5pXE.js → pieDiagram-4H26LBE5-DwBdeKBb.js} +1 -1
- package/server/public/assets/{prod-DYVvIyuh.js → prod-DAZt0c4G.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-a7vS8Jc8.js → quadrantDiagram-W4KKPZXB-CNDLp-_m.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-Ckbq2SWH.js → sankeyDiagram-5OEKKPKP-oIUL_uO1.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-DJyeNa99.js → xychartDiagram-2RQKCTM6-B-IM6Cck.js} +1 -1
- package/server/public/index.html +1 -1
- package/server/{pull-requests-D2SjJIwY.js → pull-requests-DZ-V7_LB.js} +1 -1
- package/server/{pull-requests-1WXmTBlo.js → pull-requests-kTRl7cWC.js} +3 -3
- package/server/rally-CRteqXe0.js +3 -0
- package/server/{rally-api-H5I2CBO0.js → rally-api-DpZo3WwF.js} +2 -2
- package/server/{rally-api-BtvwdX6d.js → rally-api-jOk4vit_.js} +1 -1
- package/server/{rally-client-Bt-qHiOh.js → rally-client-BQjm3aaq.js} +1 -1
- package/server/{rally-client-33CYZYYu.js → rally-client-CoWZeVEj.js} +4 -4
- package/server/{rally-8aQlLLVj.js → rally-xCTZ-UcI.js} +3 -3
- package/server/{rebuild-stack-KHkkrGjx.js → rebuild-stack-BZ7j27xY.js} +5 -5
- package/server/{rebuild-stack-CXSgAGPR.js → rebuild-stack-r-cxcr26.js} +1 -1
- package/server/{reconstruct-cache-D_Ml65_6.js → reconstruct-cache-13EkMg_i.js} +6 -6
- package/server/{record-De2syxNB.js → record-CJsjvRO4.js} +1 -1
- package/server/release-engine-YLTnEO_K.js +306 -0
- package/server/release-set-DwvT_Opu.js +125 -0
- package/server/{remote-CGuognN3.js → remote-9u9WL0NJ.js} +3 -3
- package/server/{remote-D0Old0Cv.js → remote-B062S1Kc.js} +3 -3
- package/server/{remote-agents-UHoi4oGr.js → remote-agents-B4eWgwNd.js} +1 -1
- package/server/{remote-agents-DfhMq6kQ.js → remote-agents-BBTg-vLT.js} +5 -5
- package/server/{remote-completion-RZYePR_0.js → remote-completion-B0rmBnbL.js} +12 -12
- package/server/resume-R7xkSmLW.js +3 -0
- package/server/{review-agent-uwVftH98.js → review-agent-Bf9XjLnl.js} +1 -1
- package/server/{review-agent-sZBCpEVv.js → review-agent-tfR5RDzG.js} +22 -22
- package/server/{review-artifacts-C7a45b1_.js → review-artifacts-D0_IE6DQ.js} +6 -6
- package/server/{review-context-CErbQpKL.js → review-context-CXO5ml5D.js} +7 -7
- package/server/{review-monitor-DHD9m_kh.js → review-monitor-DfFUSx0J.js} +2 -2
- package/server/{review-status-JhQ3qlDS.js → review-status-B0Axo-Ma.js} +1 -1
- package/server/{review-status-gPndPUBc.js → review-status-BcfwcAcO.js} +23 -16
- package/server/{review-status-enrichment-qWvWckYN.js → review-status-enrichment-Cp5kFTGl.js} +3 -3
- package/server/{review-status-sync-B_GrEke8.js → review-status-sync-Bc0c_u12.js} +1 -1
- package/server/{review-status-sync-D3A9KX95.js → review-status-sync-CEFty1pW.js} +9 -5
- package/server/{review-verdict-feedback-4WZ5ZdbC.js → review-verdict-feedback-BOKRLLDf.js} +6 -6
- package/server/{review-verdict-feedback-Zo0r_z4m.js → review-verdict-feedback-BnGtT0vN.js} +1 -1
- package/server/{rollup-Bmhn80tB.js → rollup-BVqFuiS9.js} +1 -1
- package/server/{rollup-BrUIKMv_.js → rollup-C22QDVxh.js} +8 -8
- package/server/{scanner-BIGumel_.js → scanner-BLCnuXqY.js} +7 -7
- package/server/{sequence-io-DA0akEQN.js → sequence-io-BozlUb6f.js} +4 -4
- package/server/{sequencer-agent-DeflKafB.js → sequencer-agent-BEDEHfd2.js} +5 -5
- package/server/server.js +251 -160
- package/server/{service-V0sUK-OR.js → service-C8jKYZ0w.js} +42 -42
- package/server/{session-fork-Yx3UcAQf.js → session-fork-BDGksK4e.js} +2 -2
- package/server/{settings-CFEeQRj2.js → settings-CSLhh6qR.js} +2 -2
- package/server/settings-CSaXtkoA.js +2 -0
- package/server/{settings-CxVate0h.js → settings-DrRQCren.js} +3 -3
- package/server/{shadow-engineering-BRxnVSDk.js → shadow-engineering-BMcBN-Of.js} +2 -2
- package/server/{shadow-state-BiMwdyl1.js → shadow-state-B4ayC7nx.js} +2 -2
- package/server/{shadow-state-1aS8FijU.js → shadow-state-CHqWHD3T.js} +1 -1
- package/server/{ship-log-CMWH3H5-.js → ship-log-CDVmOlZP.js} +1 -1
- package/server/{smart-compaction-Bw1K_Sbl.js → smart-compaction-C-F5sP9P.js} +7 -7
- package/server/{smart-compaction-xblMyVpT.js → smart-compaction-V9DBrGcr.js} +1 -1
- package/server/{spawn-planning-session-CzDFSKAQ.js → spawn-planning-session-Bz4_JES2.js} +1 -1
- package/server/{spawn-planning-session-DxLxcM7m.js → spawn-planning-session-dSpOU0lP.js} +15 -15
- package/server/{specialist-completion-BiEXUHfD.js → specialist-completion-Coz3eTSr.js} +1 -1
- package/server/{specialist-context-BfkTA81h.js → specialist-context-fmb03vXQ.js} +5 -5
- package/server/{specialist-handoff-logger-BiKuLtNm.js → specialist-handoff-logger-B9HK_lRu.js} +2 -2
- package/server/{specialist-logs-CFJjGsLC.js → specialist-logs-B24R2B9Y.js} +3 -3
- package/server/{specialists-BLIreoE7.js → specialists-B6f5-5nG.js} +1 -1
- package/server/{specialists-DjHbwQ_p.js → specialists-BGNZ0_ZW.js} +18 -18
- package/server/{specialists-B4byf18k.js → specialists-CL7E8yUg.js} +75 -75
- package/server/{specialists-DdvpFNt1.js → specialists-Chvvwf5z.js} +1 -1
- package/server/specs-oaaYaA5c.js +3 -0
- package/server/{src-CALBEUMX.js → src-BVxZuHMg.js} +3 -3
- package/server/{src-mK_M_ZIj.js → src-D-VXCC9C.js} +5 -5
- package/server/{src-fgbU-jJ-.js → src-DGAEtABV.js} +13 -2
- package/server/{stack-health-BFM8YlHw.js → stack-health-BKbTTOT2.js} +1 -1
- package/server/{stack-health-Qd7rPiVe.js → stack-health-C-le5erA.js} +2 -2
- package/server/{state-home-C2Bicw9N.js → state-home-CoyWsECg.js} +6 -6
- package/server/{summary-fork-EWWBvzgE.js → summary-fork-BF_0vxrq.js} +2 -2
- package/server/{summary-fork-DezPkJSm.js → summary-fork-BlE30Q-I.js} +8 -8
- package/server/supervisor-03Tj_Wra.js +2 -0
- package/server/{supervisor-D5GC5jUM.js → supervisor-BSeML_p0.js} +2 -2
- package/server/{swarm-readiness-Cf9mommA.js → swarm-readiness-CQ4sjrXc.js} +3 -3
- package/server/{system-prerequisites-BsI9hxh9.js → system-prerequisites-DnmLYOnU.js} +13 -1
- package/server/{teardown-workspace-CWz1pbEK.js → teardown-workspace-CpcjDrZ4.js} +12 -12
- package/server/{test-agent-queue-TiVXe3ZT.js → test-agent-queue-Bq298zZl.js} +5 -5
- package/server/{tldr-daemon-C_1frSDj.js → tldr-daemon-CaSUXd9r.js} +2 -2
- package/server/{tldr-daemon-Big5IZ_M.js → tldr-daemon-Rn1Zue0P.js} +1 -1
- package/server/{tmux-D57f-XNv.js → tmux-BVc-NeKM.js} +2 -2
- package/server/{tmux-DClqWwb8.js → tmux-CbcrkUx5.js} +1 -1
- package/server/{token-_qujO3JZ.js → token-D2OC_9ms.js} +1 -1
- package/server/{tracker-config-BmdJU_w6.js → tracker-config-C1Y_2CIo.js} +2 -2
- package/server/{tracker-config-B_Ubts1Z.js → tracker-config-EsBoOWEy.js} +1 -1
- package/server/{tracker-utils-Bg-Sevcv.js → tracker-utils-DSb9cfrF.js} +1 -1
- package/server/{tracker-utils-CWFt6jjV.js → tracker-utils-lph9C3Pw.js} +2 -2
- package/server/{tunnel-UBf2vyAL.js → tunnel-BFBCeo97.js} +2 -2
- package/server/{tunnel-hOBNQbmF.js → tunnel-DDe-ATFF.js} +1 -1
- package/server/{uat-train-DGkIkLxu.js → uat-train-8T24rPzc.js} +1 -1
- package/server/{uat-train-qNanv5hN.js → uat-train-DtKHHy1U.js} +23 -23
- package/server/{validation-B0QaLIHP.js → validation-COOXwNXU.js} +1 -1
- package/server/{validation-C4wegCvH.js → validation-lyudzPvD.js} +3 -3
- package/server/{verification-runner-CntudBes.js → verification-runner-DO0nYTJx.js} +11 -11
- package/server/{verification-runner-DdleMNLq.js → verification-runner-Dd1FX8Qk.js} +1 -1
- package/server/{vtt-parser-CKc-smWM.js → vtt-parser-C57tEF7-.js} +1 -1
- package/server/{work-agent-prompt-CG5jFV9A.js → work-agent-prompt-B2F3ZwKm.js} +11 -11
- package/server/workflows-B4fIN8VP.js +2 -0
- package/server/{workflows-BK2xs_a8.js → workflows-Clz_AFwR.js} +13 -13
- package/server/{workspace-CLrSIRCx.js → workspace-CY_2-Ddv.js} +3 -3
- package/server/{workspace-C9lC5o3E.js → workspace-D0rCFemz.js} +1 -1
- package/server/{workspace-manager-Cb2a7bg9.js → workspace-manager-BIfpzqdU.js} +1 -1
- package/server/{workspace-manager-BJhW2sky.js → workspace-manager-D6NgGkiF.js} +10 -10
- package/server/{workspace-metadata-QQmo_Z0l.js → workspace-metadata-C8yn8kAH.js} +2 -2
- package/server/{workspace-metadata-CTRnr323.js → workspace-metadata-DfgR40YU.js} +1 -1
- package/server/{workspaces-Ca4zZs12.js → workspaces-DOeHyKmA.js} +104 -92
- 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 +31858 -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/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/inspect-agent-CYoWAeeB.js +0 -2
- package/server/merge-agent-CfohxFWM.js +0 -3
- package/server/merge-ops-Czke6UAp.js +0 -2
- package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +0 -1
- package/server/rally-Ba9QoNYc.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,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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { homedir, tmpdir } from "node:os";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
//#region gh-issue-trailer-hook.ts
|
|
7
|
+
const FLYWHEEL_RUN_ID_PATTERN = /^RUN-\d+$/;
|
|
8
|
+
function shellQuote(value) {
|
|
9
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
10
|
+
}
|
|
11
|
+
function tokenize(command) {
|
|
12
|
+
const tokens = [];
|
|
13
|
+
let text = "";
|
|
14
|
+
let start = -1;
|
|
15
|
+
let quote = null;
|
|
16
|
+
let escape = false;
|
|
17
|
+
const flush = (end) => {
|
|
18
|
+
if (start !== -1) tokens.push({
|
|
19
|
+
text,
|
|
20
|
+
start,
|
|
21
|
+
end
|
|
22
|
+
});
|
|
23
|
+
text = "";
|
|
24
|
+
start = -1;
|
|
25
|
+
};
|
|
26
|
+
for (let index = 0; index < command.length; index += 1) {
|
|
27
|
+
const char = command[index];
|
|
28
|
+
if (start === -1 && !/\s/.test(char)) start = index;
|
|
29
|
+
if (escape) {
|
|
30
|
+
text += char;
|
|
31
|
+
escape = false;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (quote === "single") {
|
|
35
|
+
if (char === "'") quote = null;
|
|
36
|
+
else text += char;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (quote === "double") {
|
|
40
|
+
if (char === "\"") quote = null;
|
|
41
|
+
else if (char === "\\") escape = true;
|
|
42
|
+
else text += char;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (/\s/.test(char)) {
|
|
46
|
+
flush(index);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (char === "'") {
|
|
50
|
+
quote = "single";
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (char === "\"") {
|
|
54
|
+
quote = "double";
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (char === "\\") {
|
|
58
|
+
escape = true;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
text += char;
|
|
62
|
+
}
|
|
63
|
+
flush(command.length);
|
|
64
|
+
return tokens;
|
|
65
|
+
}
|
|
66
|
+
function findGhIssueCreate(tokens) {
|
|
67
|
+
for (let index = 0; index <= tokens.length - 3; index += 1) if (tokens[index].text === "gh" && tokens[index + 1].text === "issue" && tokens[index + 2].text === "create") return index;
|
|
68
|
+
return -1;
|
|
69
|
+
}
|
|
70
|
+
function containsFlywheelRunId(body) {
|
|
71
|
+
return /^Flywheel-Run-Id:/m.test(body);
|
|
72
|
+
}
|
|
73
|
+
function resolveDiscoveredIn(env) {
|
|
74
|
+
const agentId = env.OVERDECK_AGENT_ID;
|
|
75
|
+
if (!agentId || basename(agentId) !== agentId) return null;
|
|
76
|
+
const statePath = join(env.OVERDECK_HOME ?? join(env.HOME ?? homedir(), ".overdeck"), "agents", agentId, "state.json");
|
|
77
|
+
if (!existsSync(statePath)) return null;
|
|
78
|
+
try {
|
|
79
|
+
const parsed = JSON.parse(readFileSync(statePath, "utf-8"));
|
|
80
|
+
return typeof parsed.issueId === "string" && parsed.issueId.trim() ? parsed.issueId.trim() : null;
|
|
81
|
+
} catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function buildTrailer(env) {
|
|
86
|
+
const runId = env.OVERDECK_FLYWHEEL_RUN_ID?.trim();
|
|
87
|
+
if (!runId || !FLYWHEEL_RUN_ID_PATTERN.test(runId)) return null;
|
|
88
|
+
const filedBy = env.OVERDECK_FLYWHEEL_AGENT_ROLE === "flywheel" ? "agent" : "operator";
|
|
89
|
+
const discoveredIn = resolveDiscoveredIn(env);
|
|
90
|
+
return `\n\n${[
|
|
91
|
+
"---",
|
|
92
|
+
`Flywheel-Run-Id: ${runId}`,
|
|
93
|
+
`Flywheel-Filed-By: ${filedBy}`,
|
|
94
|
+
discoveredIn ? `Flywheel-Discovered-In: ${discoveredIn}` : void 0
|
|
95
|
+
].filter((line) => line !== void 0).join("\n")}\n`;
|
|
96
|
+
}
|
|
97
|
+
function replaceSpan(command, start, end, replacement) {
|
|
98
|
+
return `${command.slice(0, start)}${replacement}${command.slice(end)}`;
|
|
99
|
+
}
|
|
100
|
+
function findFlag(tokens, ghIndex, flagName) {
|
|
101
|
+
for (let index = ghIndex + 3; index < tokens.length; index += 1) {
|
|
102
|
+
const token = tokens[index];
|
|
103
|
+
if (token.text === flagName) return {
|
|
104
|
+
flag: token,
|
|
105
|
+
value: tokens[index + 1],
|
|
106
|
+
inline: false
|
|
107
|
+
};
|
|
108
|
+
if (token.text.startsWith(`${flagName}=`)) return {
|
|
109
|
+
flag: token,
|
|
110
|
+
inline: true
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
function inlineFlagValue(flag) {
|
|
116
|
+
const equalsOffset = flag.text.indexOf("=");
|
|
117
|
+
if (equalsOffset === -1) return null;
|
|
118
|
+
const valueStart = flag.start + equalsOffset + 1;
|
|
119
|
+
return {
|
|
120
|
+
value: flag.text.slice(equalsOffset + 1),
|
|
121
|
+
valueStart,
|
|
122
|
+
valueEnd: flag.end
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function appendBodyFlag(command, tokens, ghIndex, trailer) {
|
|
126
|
+
const bodyFlag = findFlag(tokens, ghIndex, "--body");
|
|
127
|
+
if (!bodyFlag) return null;
|
|
128
|
+
const body = bodyFlag.inline ? inlineFlagValue(bodyFlag.flag) : bodyFlag.value;
|
|
129
|
+
if (!body) return null;
|
|
130
|
+
const bodyText = "text" in body ? body.text : body.value;
|
|
131
|
+
if (containsFlywheelRunId(bodyText)) return command;
|
|
132
|
+
const appended = `${bodyText}${trailer}`;
|
|
133
|
+
if ("text" in body) return replaceSpan(command, body.start, body.end, shellQuote(appended));
|
|
134
|
+
return replaceSpan(command, body.valueStart, body.valueEnd, shellQuote(appended));
|
|
135
|
+
}
|
|
136
|
+
function writeTempBodyFile(body) {
|
|
137
|
+
const path = join(mkdtempSync(join(tmpdir(), "pan-gh-issue-body-")), "body.md");
|
|
138
|
+
writeFileSync(path, body, "utf-8");
|
|
139
|
+
return path;
|
|
140
|
+
}
|
|
141
|
+
function appendBodyFileFlag(command, tokens, ghIndex, trailer) {
|
|
142
|
+
const bodyFileFlag = findFlag(tokens, ghIndex, "--body-file");
|
|
143
|
+
if (!bodyFileFlag) return null;
|
|
144
|
+
const pathValue = bodyFileFlag.inline ? inlineFlagValue(bodyFileFlag.flag) : bodyFileFlag.value;
|
|
145
|
+
if (!pathValue) return null;
|
|
146
|
+
const pathText = "text" in pathValue ? pathValue.text : pathValue.value;
|
|
147
|
+
if (pathText === "-") return appendStdinBody(command, tokens[ghIndex].start, trailer);
|
|
148
|
+
if (!existsSync(pathText)) return null;
|
|
149
|
+
const body = readFileSync(pathText, "utf-8");
|
|
150
|
+
if (containsFlywheelRunId(body)) return command;
|
|
151
|
+
const tempPath = writeTempBodyFile(`${body}${trailer}`);
|
|
152
|
+
if ("text" in pathValue) return replaceSpan(command, pathValue.start, pathValue.end, shellQuote(tempPath));
|
|
153
|
+
return replaceSpan(command, pathValue.valueStart, pathValue.valueEnd, shellQuote(tempPath));
|
|
154
|
+
}
|
|
155
|
+
function findPipeBefore(command, beforeIndex) {
|
|
156
|
+
let quote = null;
|
|
157
|
+
let escape = false;
|
|
158
|
+
let pipeIndex = -1;
|
|
159
|
+
for (let index = 0; index < beforeIndex; index += 1) {
|
|
160
|
+
const char = command[index];
|
|
161
|
+
if (escape) {
|
|
162
|
+
escape = false;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (quote === "single") {
|
|
166
|
+
if (char === "'") quote = null;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (quote === "double") {
|
|
170
|
+
if (char === "\"") quote = null;
|
|
171
|
+
else if (char === "\\") escape = true;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (char === "'") quote = "single";
|
|
175
|
+
else if (char === "\"") quote = "double";
|
|
176
|
+
else if (char === "\\") escape = true;
|
|
177
|
+
else if (char === "|" && command[index + 1] !== "|" && command[index - 1] !== "|") pipeIndex = index;
|
|
178
|
+
}
|
|
179
|
+
return pipeIndex;
|
|
180
|
+
}
|
|
181
|
+
function appendHereDoc(command, trailer) {
|
|
182
|
+
const match = command.match(/(<<-?\s*['"]?([A-Za-z_][A-Za-z0-9_-]*)['"]?[^\n]*\n)([\s\S]*?)(\n\2\s*)$/);
|
|
183
|
+
if (!match || match.index === void 0) return null;
|
|
184
|
+
const body = match[3];
|
|
185
|
+
if (containsFlywheelRunId(body)) return command;
|
|
186
|
+
const bodyStart = match.index + match[1].length;
|
|
187
|
+
return replaceSpan(command, bodyStart, bodyStart + body.length, `${body}${trailer}`);
|
|
188
|
+
}
|
|
189
|
+
function appendStdinBody(command, ghStart, trailer) {
|
|
190
|
+
if (command.includes("Flywheel-Run-Id:")) return command;
|
|
191
|
+
const hereDoc = appendHereDoc(command, trailer);
|
|
192
|
+
if (hereDoc) return hereDoc;
|
|
193
|
+
const pipeIndex = findPipeBefore(command, ghStart);
|
|
194
|
+
if (pipeIndex === -1) return null;
|
|
195
|
+
const producer = command.slice(0, pipeIndex).trim();
|
|
196
|
+
const consumer = command.slice(pipeIndex + 1).trimStart();
|
|
197
|
+
if (!producer || !consumer) return null;
|
|
198
|
+
return `{ ${producer}; printf %s ${shellQuote(trailer)}; } | ${consumer}`;
|
|
199
|
+
}
|
|
200
|
+
function buildUpdatedInput(command) {
|
|
201
|
+
return { hookSpecificOutput: {
|
|
202
|
+
hookEventName: "PreToolUse",
|
|
203
|
+
permissionDecisionReason: "Flywheel issue provenance trailers added",
|
|
204
|
+
updatedInput: { command }
|
|
205
|
+
} };
|
|
206
|
+
}
|
|
207
|
+
function rewriteGhIssueCreateCommand(command, env = process.env) {
|
|
208
|
+
const trailer = buildTrailer(env);
|
|
209
|
+
if (!trailer) return null;
|
|
210
|
+
const tokens = tokenize(command);
|
|
211
|
+
const ghIndex = findGhIssueCreate(tokens);
|
|
212
|
+
if (ghIndex === -1) return null;
|
|
213
|
+
const bodyCommand = appendBodyFlag(command, tokens, ghIndex, trailer);
|
|
214
|
+
if (bodyCommand !== null) return bodyCommand === command ? null : bodyCommand;
|
|
215
|
+
const bodyFileCommand = appendBodyFileFlag(command, tokens, ghIndex, trailer);
|
|
216
|
+
if (bodyFileCommand !== null) return bodyFileCommand === command ? null : bodyFileCommand;
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
function runGhIssueTrailerHook(input, env = process.env) {
|
|
220
|
+
let event;
|
|
221
|
+
try {
|
|
222
|
+
event = JSON.parse(input);
|
|
223
|
+
} catch {
|
|
224
|
+
return "{}";
|
|
225
|
+
}
|
|
226
|
+
const command = event.tool_name === "Bash" ? event.tool_input?.command : void 0;
|
|
227
|
+
if (typeof command !== "string") return "{}";
|
|
228
|
+
const updatedCommand = rewriteGhIssueCreateCommand(command, env);
|
|
229
|
+
if (!updatedCommand) return "{}";
|
|
230
|
+
return JSON.stringify(buildUpdatedInput(updatedCommand));
|
|
231
|
+
}
|
|
232
|
+
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
233
|
+
const input = readFileSync(0, "utf-8");
|
|
234
|
+
process.stdout.write(runGhIssueTrailerHook(input));
|
|
235
|
+
}
|
|
236
|
+
//#endregion
|
|
237
|
+
export { rewriteGhIssueCreateCommand, runGhIssueTrailerHook };
|
|
238
|
+
|
|
239
|
+
//# sourceMappingURL=gh-issue-trailer-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-issue-trailer-hook.js","names":[],"sources":["gh-issue-trailer-hook.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\ninterface PreToolUseEvent {\n tool_name?: string;\n tool_input?: {\n command?: string;\n [key: string]: unknown;\n };\n}\n\ninterface Token {\n text: string;\n start: number;\n end: number;\n}\n\ntype HookEnv = Record<string, string | undefined>;\n\nconst FLYWHEEL_RUN_ID_PATTERN = /^RUN-\\d+$/;\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction tokenize(command: string): Token[] {\n const tokens: Token[] = [];\n let text = '';\n let start = -1;\n let quote: 'single' | 'double' | null = null;\n let escape = false;\n\n const flush = (end: number): void => {\n if (start !== -1) tokens.push({ text, start, end });\n text = '';\n start = -1;\n };\n\n for (let index = 0; index < command.length; index += 1) {\n const char = command[index];\n if (start === -1 && !/\\s/.test(char)) start = index;\n\n if (escape) {\n text += char;\n escape = false;\n continue;\n }\n\n if (quote === 'single') {\n if (char === \"'\") quote = null;\n else text += char;\n continue;\n }\n\n if (quote === 'double') {\n if (char === '\"') quote = null;\n else if (char === '\\\\') escape = true;\n else text += char;\n continue;\n }\n\n if (/\\s/.test(char)) {\n flush(index);\n continue;\n }\n\n if (char === \"'\") {\n quote = 'single';\n continue;\n }\n\n if (char === '\"') {\n quote = 'double';\n continue;\n }\n\n if (char === '\\\\') {\n escape = true;\n continue;\n }\n\n text += char;\n }\n\n flush(command.length);\n return tokens;\n}\n\nfunction findGhIssueCreate(tokens: Token[]): number {\n for (let index = 0; index <= tokens.length - 3; index += 1) {\n if (tokens[index].text === 'gh' && tokens[index + 1].text === 'issue' && tokens[index + 2].text === 'create') {\n return index;\n }\n }\n return -1;\n}\n\nfunction containsFlywheelRunId(body: string): boolean {\n return /^Flywheel-Run-Id:/m.test(body);\n}\n\nfunction resolveDiscoveredIn(env: HookEnv): string | null {\n const agentId = env.OVERDECK_AGENT_ID;\n if (!agentId || basename(agentId) !== agentId) return null;\n\n const overdeckHome = env.OVERDECK_HOME ?? join(env.HOME ?? homedir(), '.overdeck');\n const statePath = join(overdeckHome, 'agents', agentId, 'state.json');\n if (!existsSync(statePath)) return null;\n\n try {\n const parsed = JSON.parse(readFileSync(statePath, 'utf-8')) as { issueId?: unknown };\n return typeof parsed.issueId === 'string' && parsed.issueId.trim() ? parsed.issueId.trim() : null;\n } catch {\n return null;\n }\n}\n\nfunction buildTrailer(env: HookEnv): string | null {\n const runId = env.OVERDECK_FLYWHEEL_RUN_ID?.trim();\n if (!runId || !FLYWHEEL_RUN_ID_PATTERN.test(runId)) return null;\n\n const filedBy = env.OVERDECK_FLYWHEEL_AGENT_ROLE === 'flywheel' ? 'agent' : 'operator';\n const discoveredIn = resolveDiscoveredIn(env);\n const lines = [\n '---',\n `Flywheel-Run-Id: ${runId}`,\n `Flywheel-Filed-By: ${filedBy}`,\n discoveredIn ? `Flywheel-Discovered-In: ${discoveredIn}` : undefined,\n ].filter((line): line is string => line !== undefined);\n return `\\n\\n${lines.join('\\n')}\\n`;\n}\n\nfunction replaceSpan(command: string, start: number, end: number, replacement: string): string {\n return `${command.slice(0, start)}${replacement}${command.slice(end)}`;\n}\n\nfunction findFlag(tokens: Token[], ghIndex: number, flagName: '--body' | '--body-file'): { flag: Token; value?: Token; inline: boolean } | null {\n for (let index = ghIndex + 3; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token.text === flagName) return { flag: token, value: tokens[index + 1], inline: false };\n if (token.text.startsWith(`${flagName}=`)) return { flag: token, inline: true };\n }\n return null;\n}\n\nfunction inlineFlagValue(flag: Token): { value: string; valueStart: number; valueEnd: number } | null {\n const equalsOffset = flag.text.indexOf('=');\n if (equalsOffset === -1) return null;\n const valueStart = flag.start + equalsOffset + 1;\n return { value: flag.text.slice(equalsOffset + 1), valueStart, valueEnd: flag.end };\n}\n\nfunction appendBodyFlag(command: string, tokens: Token[], ghIndex: number, trailer: string): string | null {\n const bodyFlag = findFlag(tokens, ghIndex, '--body');\n if (!bodyFlag) return null;\n\n const body = bodyFlag.inline ? inlineFlagValue(bodyFlag.flag) : bodyFlag.value;\n if (!body) return null;\n const bodyText = 'text' in body ? body.text : body.value;\n if (containsFlywheelRunId(bodyText)) return command;\n\n const appended = `${bodyText}${trailer}`;\n if ('text' in body) return replaceSpan(command, body.start, body.end, shellQuote(appended));\n return replaceSpan(command, body.valueStart, body.valueEnd, shellQuote(appended));\n}\n\nfunction writeTempBodyFile(body: string): string {\n const dir = mkdtempSync(join(tmpdir(), 'pan-gh-issue-body-'));\n const path = join(dir, 'body.md');\n writeFileSync(path, body, 'utf-8');\n return path;\n}\n\nfunction appendBodyFileFlag(command: string, tokens: Token[], ghIndex: number, trailer: string): string | null {\n const bodyFileFlag = findFlag(tokens, ghIndex, '--body-file');\n if (!bodyFileFlag) return null;\n\n const pathValue = bodyFileFlag.inline ? inlineFlagValue(bodyFileFlag.flag) : bodyFileFlag.value;\n if (!pathValue) return null;\n const pathText = 'text' in pathValue ? pathValue.text : pathValue.value;\n\n if (pathText === '-') return appendStdinBody(command, tokens[ghIndex].start, trailer);\n if (!existsSync(pathText)) return null;\n\n const body = readFileSync(pathText, 'utf-8');\n if (containsFlywheelRunId(body)) return command;\n\n const tempPath = writeTempBodyFile(`${body}${trailer}`);\n if ('text' in pathValue) return replaceSpan(command, pathValue.start, pathValue.end, shellQuote(tempPath));\n return replaceSpan(command, pathValue.valueStart, pathValue.valueEnd, shellQuote(tempPath));\n}\n\nfunction findPipeBefore(command: string, beforeIndex: number): number {\n let quote: 'single' | 'double' | null = null;\n let escape = false;\n let pipeIndex = -1;\n\n for (let index = 0; index < beforeIndex; index += 1) {\n const char = command[index];\n if (escape) {\n escape = false;\n continue;\n }\n if (quote === 'single') {\n if (char === \"'\") quote = null;\n continue;\n }\n if (quote === 'double') {\n if (char === '\"') quote = null;\n else if (char === '\\\\') escape = true;\n continue;\n }\n if (char === \"'\") quote = 'single';\n else if (char === '\"') quote = 'double';\n else if (char === '\\\\') escape = true;\n else if (char === '|' && command[index + 1] !== '|' && command[index - 1] !== '|') pipeIndex = index;\n }\n\n return pipeIndex;\n}\n\nfunction appendHereDoc(command: string, trailer: string): string | null {\n const match = command.match(/(<<-?\\s*['\"]?([A-Za-z_][A-Za-z0-9_-]*)['\"]?[^\\n]*\\n)([\\s\\S]*?)(\\n\\2\\s*)$/);\n if (!match || match.index === undefined) return null;\n const body = match[3];\n if (containsFlywheelRunId(body)) return command;\n const bodyStart = match.index + match[1].length;\n const bodyEnd = bodyStart + body.length;\n return replaceSpan(command, bodyStart, bodyEnd, `${body}${trailer}`);\n}\n\nfunction appendStdinBody(command: string, ghStart: number, trailer: string): string | null {\n if (command.includes('Flywheel-Run-Id:')) return command;\n\n const hereDoc = appendHereDoc(command, trailer);\n if (hereDoc) return hereDoc;\n\n const pipeIndex = findPipeBefore(command, ghStart);\n if (pipeIndex === -1) return null;\n\n const producer = command.slice(0, pipeIndex).trim();\n const consumer = command.slice(pipeIndex + 1).trimStart();\n if (!producer || !consumer) return null;\n return `{ ${producer}; printf %s ${shellQuote(trailer)}; } | ${consumer}`;\n}\n\nfunction buildUpdatedInput(command: string): Record<string, unknown> {\n return {\n hookSpecificOutput: {\n hookEventName: 'PreToolUse',\n permissionDecisionReason: 'Flywheel issue provenance trailers added',\n updatedInput: { command },\n },\n };\n}\n\nexport function rewriteGhIssueCreateCommand(command: string, env: HookEnv = process.env): string | null {\n const trailer = buildTrailer(env);\n if (!trailer) return null;\n\n const tokens = tokenize(command);\n const ghIndex = findGhIssueCreate(tokens);\n if (ghIndex === -1) return null;\n\n const bodyCommand = appendBodyFlag(command, tokens, ghIndex, trailer);\n if (bodyCommand !== null) return bodyCommand === command ? null : bodyCommand;\n\n const bodyFileCommand = appendBodyFileFlag(command, tokens, ghIndex, trailer);\n if (bodyFileCommand !== null) return bodyFileCommand === command ? null : bodyFileCommand;\n\n return null;\n}\n\nexport function runGhIssueTrailerHook(input: string, env: HookEnv = process.env): string {\n let event: PreToolUseEvent;\n try {\n event = JSON.parse(input) as PreToolUseEvent;\n } catch {\n return '{}';\n }\n\n const command = event.tool_name === 'Bash' ? event.tool_input?.command : undefined;\n if (typeof command !== 'string') return '{}';\n\n const updatedCommand = rewriteGhIssueCreateCommand(command, env);\n if (!updatedCommand) return '{}';\n return JSON.stringify(buildUpdatedInput(updatedCommand));\n}\n\nif (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {\n const input = readFileSync(0, 'utf-8');\n process.stdout.write(runGhIssueTrailerHook(input));\n}\n"],"mappings":"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"}
|