@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,169 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Claude Code status line — all available info + plan usage limits
|
|
3
|
+
# JSON is piped via stdin on each update
|
|
4
|
+
|
|
5
|
+
input=$(cat)
|
|
6
|
+
|
|
7
|
+
# Single jq call to extract all fields at once
|
|
8
|
+
eval "$(echo "$input" | jq -r '
|
|
9
|
+
@sh "model=\(.model.display_name // "")",
|
|
10
|
+
@sh "model_id=\(.model.id // "")",
|
|
11
|
+
@sh "current_dir=\(.workspace.current_dir // "")",
|
|
12
|
+
@sh "project_dir=\(.workspace.project_dir // "")",
|
|
13
|
+
@sh "cost=\(.cost.total_cost_usd // 0)",
|
|
14
|
+
@sh "lines_added=\(.cost.total_lines_added // 0)",
|
|
15
|
+
@sh "lines_removed=\(.cost.total_lines_removed // 0)",
|
|
16
|
+
@sh "ctx_used_pct=\(.context_window.used_percentage // 0)",
|
|
17
|
+
@sh "ctx_size=\(.context_window.context_window_size // 0)",
|
|
18
|
+
@sh "ctx_in=\(.context_window.current_usage.input_tokens // 0)",
|
|
19
|
+
@sh "ctx_out=\(.context_window.current_usage.output_tokens // 0)"
|
|
20
|
+
' 2>/dev/null)"
|
|
21
|
+
|
|
22
|
+
# ANSI colors
|
|
23
|
+
RST='\033[0m'; DIM='\033[2m'
|
|
24
|
+
CYN='\033[36m'; GRN='\033[32m'; YLW='\033[33m'
|
|
25
|
+
MAG='\033[35m'; RED='\033[31m'; WHT='\033[37m'
|
|
26
|
+
|
|
27
|
+
# Helper: format token count
|
|
28
|
+
fmt() {
|
|
29
|
+
local n=${1:-0}
|
|
30
|
+
if (( n >= 1000000 )); then printf "%.1fM" "$(echo "scale=1;$n/1000000" | bc)"
|
|
31
|
+
elif (( n >= 1000 )); then printf "%.1fk" "$(echo "scale=1;$n/1000" | bc)"
|
|
32
|
+
else echo "$n"; fi
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# Helper: color a percentage (green < 50, yellow < 80, red >= 80)
|
|
36
|
+
pct_color() {
|
|
37
|
+
local pct_int=${1%.*}
|
|
38
|
+
if (( ${pct_int:-0} >= 80 )); then echo "$RED"
|
|
39
|
+
elif (( ${pct_int:-0} >= 50 )); then echo "$YLW"
|
|
40
|
+
else echo "$GRN"; fi
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Helper: format time remaining from ISO timestamp
|
|
44
|
+
time_remaining() {
|
|
45
|
+
local reset_at="$1"
|
|
46
|
+
[ -z "$reset_at" ] || [ "$reset_at" = "null" ] && return
|
|
47
|
+
local reset_epoch now_epoch diff_s hours mins
|
|
48
|
+
reset_epoch=$(date -d "$reset_at" +%s 2>/dev/null) || return
|
|
49
|
+
now_epoch=$(date +%s)
|
|
50
|
+
diff_s=$(( reset_epoch - now_epoch ))
|
|
51
|
+
(( diff_s <= 0 )) && { echo "now"; return; }
|
|
52
|
+
hours=$(( diff_s / 3600 ))
|
|
53
|
+
mins=$(( (diff_s % 3600) / 60 ))
|
|
54
|
+
if (( hours > 0 )); then echo "${hours}h${mins}m"
|
|
55
|
+
else echo "${mins}m"; fi
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
# --- Usage limits (cached for 60s) ---
|
|
59
|
+
CACHE_FILE="/tmp/.claude-usage-cache-$(id -u)"
|
|
60
|
+
CACHE_TTL=60
|
|
61
|
+
usage_5h="" usage_7d="" reset_5h="" reset_7d=""
|
|
62
|
+
|
|
63
|
+
fetch_usage() {
|
|
64
|
+
local creds_file="$HOME/.claude/.credentials.json"
|
|
65
|
+
[ -f "$creds_file" ] || return
|
|
66
|
+
local token
|
|
67
|
+
token=$(jq -r '.claudeAiOauth.accessToken // empty' "$creds_file" 2>/dev/null)
|
|
68
|
+
[ -z "$token" ] && return
|
|
69
|
+
local response
|
|
70
|
+
response=$(curl -sf --max-time 3 \
|
|
71
|
+
-H "Accept: application/json" \
|
|
72
|
+
-H "Content-Type: application/json" \
|
|
73
|
+
-H "Authorization: Bearer $token" \
|
|
74
|
+
-H "anthropic-beta: oauth-2025-04-20" \
|
|
75
|
+
"https://api.anthropic.com/api/oauth/usage" 2>/dev/null) || return
|
|
76
|
+
echo "$response" > "$CACHE_FILE"
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
# Use cache if fresh, otherwise fetch in background
|
|
80
|
+
if [ -f "$CACHE_FILE" ]; then
|
|
81
|
+
cache_age=$(( $(date +%s) - $(stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0) ))
|
|
82
|
+
if (( cache_age > CACHE_TTL )); then
|
|
83
|
+
# Fetch in background so we don't block the statusline
|
|
84
|
+
fetch_usage &
|
|
85
|
+
fi
|
|
86
|
+
else
|
|
87
|
+
# First run — fetch synchronously (one-time cost)
|
|
88
|
+
fetch_usage
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# Read cached data
|
|
92
|
+
if [ -f "$CACHE_FILE" ]; then
|
|
93
|
+
eval "$(jq -r '
|
|
94
|
+
@sh "usage_5h=\(.five_hour.utilization // "")",
|
|
95
|
+
@sh "reset_5h=\(.five_hour.resets_at // "")",
|
|
96
|
+
@sh "usage_7d=\(.seven_day.utilization // "")",
|
|
97
|
+
@sh "reset_7d=\(.seven_day.resets_at // "")"
|
|
98
|
+
' "$CACHE_FILE" 2>/dev/null)"
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
# Git branch (fast — reads file directly, no subprocess)
|
|
102
|
+
git_branch=""
|
|
103
|
+
dir="${current_dir:-.}"
|
|
104
|
+
while [ "$dir" != "/" ]; do
|
|
105
|
+
if [ -f "$dir/.git/HEAD" ]; then
|
|
106
|
+
ref=$(< "$dir/.git/HEAD")
|
|
107
|
+
git_branch="${ref#ref: refs/heads/}"
|
|
108
|
+
break
|
|
109
|
+
fi
|
|
110
|
+
dir=$(dirname "$dir")
|
|
111
|
+
done
|
|
112
|
+
|
|
113
|
+
# Context % color
|
|
114
|
+
ctx_color=$(pct_color "$ctx_used_pct")
|
|
115
|
+
|
|
116
|
+
# Cost formatting
|
|
117
|
+
cost_fmt=$(printf '$%.4f' "${cost:-0}")
|
|
118
|
+
|
|
119
|
+
# Line 1: model | dir | git branch
|
|
120
|
+
line1=""
|
|
121
|
+
[ -n "$model" ] && line1+=$(printf "%b%s%b" "$MAG" "$model" "$RST")
|
|
122
|
+
[ -n "$model_id" ] && line1+=$(printf " %b(%s)%b" "$DIM" "$model_id" "$RST")
|
|
123
|
+
if [ -n "$current_dir" ]; then
|
|
124
|
+
short_dir="${current_dir/#$HOME/~}"
|
|
125
|
+
line1+=$(printf " %b%s%b" "$CYN" "$short_dir" "$RST")
|
|
126
|
+
fi
|
|
127
|
+
[ -n "$git_branch" ] && line1+=$(printf " %b%b%s%b" "$DIM" "$GRN" "$git_branch" "$RST")
|
|
128
|
+
|
|
129
|
+
# Line 2: context usage | cost | lines changed
|
|
130
|
+
line2=""
|
|
131
|
+
line2+=$(printf "%bctx%b %b%.0f%%%b" "$DIM" "$RST" "$ctx_color" "$ctx_used_pct" "$RST")
|
|
132
|
+
line2+=$(printf " %b%s%b/%b%s%b" "$WHT" "$(fmt "$ctx_in")" "$RST" "$DIM" "$(fmt "$ctx_size")" "$RST")
|
|
133
|
+
line2+=$(printf " %bout%b %s" "$DIM" "$RST" "$(fmt "$ctx_out")")
|
|
134
|
+
line2+=$(printf " %bcost%b %b%s%b" "$DIM" "$RST" "$YLW" "$cost_fmt" "$RST")
|
|
135
|
+
if (( lines_added > 0 || lines_removed > 0 )); then
|
|
136
|
+
line2+=$(printf " %b+%d%b/%b-%d%b" "$GRN" "$lines_added" "$RST" "$RED" "$lines_removed" "$RST")
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
# Line 3: plan usage limits (5h + 7d)
|
|
140
|
+
line3=""
|
|
141
|
+
if [ -n "$usage_5h" ]; then
|
|
142
|
+
u5_color=$(pct_color "$usage_5h")
|
|
143
|
+
u5_reset=$(time_remaining "$reset_5h")
|
|
144
|
+
line3+=$(printf "%b5h%b %b%.0f%%%b" "$DIM" "$RST" "$u5_color" "$usage_5h" "$RST")
|
|
145
|
+
[ -n "$u5_reset" ] && line3+=$(printf " %b(%s)%b" "$DIM" "$u5_reset" "$RST")
|
|
146
|
+
fi
|
|
147
|
+
if [ -n "$usage_7d" ]; then
|
|
148
|
+
u7_color=$(pct_color "$usage_7d")
|
|
149
|
+
u7_reset=$(time_remaining "$reset_7d")
|
|
150
|
+
[ -n "$line3" ] && line3+=" "
|
|
151
|
+
line3+=$(printf "%b7d%b %b%.0f%%%b" "$DIM" "$RST" "$u7_color" "$usage_7d" "$RST")
|
|
152
|
+
[ -n "$u7_reset" ] && line3+=$(printf " %b(%s)%b" "$DIM" "$u7_reset" "$RST")
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
# Write context % to agent dir for dashboard monitoring (non-blocking)
|
|
156
|
+
if [ -n "$OVERDECK_AGENT_ID" ] && [ -n "$ctx_used_pct" ]; then
|
|
157
|
+
CTX_DIR="$HOME/.overdeck/agents/$OVERDECK_AGENT_ID"
|
|
158
|
+
if [ -d "$CTX_DIR" ]; then
|
|
159
|
+
printf '%.0f' "$ctx_used_pct" > "$CTX_DIR/context-pct" 2>/dev/null || true
|
|
160
|
+
# Capture initial context % (first time only)
|
|
161
|
+
if [ ! -f "$CTX_DIR/initial-context-pct" ]; then
|
|
162
|
+
printf '%.0f' "$ctx_used_pct" > "$CTX_DIR/initial-context-pct" 2>/dev/null || true
|
|
163
|
+
fi
|
|
164
|
+
fi
|
|
165
|
+
fi
|
|
166
|
+
|
|
167
|
+
printf "%b\n" "$line1"
|
|
168
|
+
printf "%b\n" "$line2"
|
|
169
|
+
[ -n "$line3" ] && printf "%b\n" "$line3"
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/stop-hook (PAN-800)
|
|
3
|
+
#
|
|
4
|
+
# Fires on Claude Code Stop. Emits agent.activity_changed(idle) — the reducer
|
|
5
|
+
# clears currentTool / thinking / waiting on that transition, so no separate
|
|
6
|
+
# waiting_cleared is needed. Still chains to specialist-stop-hook and
|
|
7
|
+
# work-agent-stop-hook, and still fires the planning auto-completion call.
|
|
8
|
+
|
|
9
|
+
set +e
|
|
10
|
+
|
|
11
|
+
# Capture stdin once, early, so later background work cannot consume it and the
|
|
12
|
+
# hook can forward the session_id to the turn-complete title-refinement endpoint.
|
|
13
|
+
INPUT=$(cat 2>/dev/null || echo '{}')
|
|
14
|
+
|
|
15
|
+
# Log first-thing so we have empirical evidence the hook fired, regardless of
|
|
16
|
+
# whether anything downstream succeeded. Silent failures in pan_resolve_agent_id
|
|
17
|
+
# used to leave zero trace, making "did the Stop hook even fire?" impossible to
|
|
18
|
+
# answer post-hoc.
|
|
19
|
+
LOG_DIR="$HOME/.overdeck/logs"
|
|
20
|
+
mkdir -p "$LOG_DIR" 2>/dev/null || true
|
|
21
|
+
echo "[$(date -Iseconds)] stop-hook: invoked CLAUDE_SESSION_ID=${CLAUDE_SESSION_ID:-unset} OVERDECK_AGENT_ID=${OVERDECK_AGENT_ID:-unset} cwd=$(pwd)" \
|
|
22
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
23
|
+
|
|
24
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
25
|
+
# shellcheck source=pan-hook-lib.sh
|
|
26
|
+
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || {
|
|
27
|
+
echo "[$(date -Iseconds)] stop-hook: pan-hook-lib.sh source failed — exiting" \
|
|
28
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
29
|
+
exit 0
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if ! pan_resolve_agent_id; then
|
|
33
|
+
echo "[$(date -Iseconds)] stop-hook: pan_resolve_agent_id failed (CLAUDE_SESSION_ID=${CLAUDE_SESSION_ID:-unset} cwd=$(pwd)) — exiting" \
|
|
34
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
35
|
+
exit 0
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
echo "[$(date -Iseconds)] stop-hook: resolved AGENT_ID=$AGENT_ID — proceeding" \
|
|
39
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
40
|
+
|
|
41
|
+
TS=$(date -Iseconds)
|
|
42
|
+
BODY="{\"kind\":\"activity\",\"activity\":\"idle\",\"timestamp\":\"$TS\"}"
|
|
43
|
+
pan_emit_event "$AGENT_ID" "$BODY"
|
|
44
|
+
|
|
45
|
+
# ── API error detection (all agent types) ────────────────────────────────
|
|
46
|
+
# Run before the turn-complete notification so a Stop caused by a transient
|
|
47
|
+
# API error is not treated as a completed assistant turn.
|
|
48
|
+
LOG_DIR="$HOME/.overdeck/logs"
|
|
49
|
+
mkdir -p "$LOG_DIR"
|
|
50
|
+
API_ERROR_DETECTED=false
|
|
51
|
+
API_ERROR_NUDGE_FILE="$HOME/.overdeck/agents/$AGENT_ID/.last-api-error-nudge"
|
|
52
|
+
|
|
53
|
+
OUTPUT=$(tmux capture-pane -t "$AGENT_ID" -p -S -100 2>/dev/null || echo "")
|
|
54
|
+
if [ -n "$OUTPUT" ]; then
|
|
55
|
+
for pattern in \
|
|
56
|
+
"API Error: The server had an error while processing your request" \
|
|
57
|
+
"API Error: Overloaded" \
|
|
58
|
+
"API Error: Rate limit" \
|
|
59
|
+
"API Error: Request was aborted" \
|
|
60
|
+
"API Error: Timed out" \
|
|
61
|
+
"529 Overloaded" \
|
|
62
|
+
"502 Bad Gateway" \
|
|
63
|
+
"503 Service Unavailable"; do
|
|
64
|
+
if echo "$OUTPUT" | grep -qF "$pattern"; then
|
|
65
|
+
API_ERROR_DETECTED=true
|
|
66
|
+
break
|
|
67
|
+
fi
|
|
68
|
+
done
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# PAN-1644: notify the dashboard that a turn completed, so it can progressively
|
|
72
|
+
# refine the conversation title. Skip this when an API error caused the Stop.
|
|
73
|
+
# Fire-and-forget: the dashboard may be down or busy; the stop-hook must still
|
|
74
|
+
# exit 0 and chain to downstream hooks.
|
|
75
|
+
if [ "$API_ERROR_DETECTED" != "true" ]; then
|
|
76
|
+
INTERNAL_TOKEN="${OVERDECK_INTERNAL_TOKEN:-}"
|
|
77
|
+
if [ -z "$INTERNAL_TOKEN" ]; then
|
|
78
|
+
TOKEN_PATH="${OVERDECK_HOME:-$HOME/.overdeck}/internal-token"
|
|
79
|
+
if [ -f "$TOKEN_PATH" ]; then
|
|
80
|
+
INTERNAL_TOKEN=$(cat "$TOKEN_PATH" 2>/dev/null || true)
|
|
81
|
+
fi
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
if command -v jq >/dev/null 2>&1; then
|
|
85
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '(.session_id // "")' 2>/dev/null)
|
|
86
|
+
if [ -z "$SESSION_ID" ]; then
|
|
87
|
+
SESSION_ID="${CLAUDE_SESSION_ID:-}"
|
|
88
|
+
fi
|
|
89
|
+
if [ -n "$SESSION_ID" ]; then
|
|
90
|
+
TURN_COMPLETE_BODY=$(jq -n --arg session_id "$SESSION_ID" '{session_id: $session_id}' 2>/dev/null)
|
|
91
|
+
if [ -n "$TURN_COMPLETE_BODY" ]; then
|
|
92
|
+
curl -s -m 1 -X POST -H 'Content-Type: application/json' -H "x-overdeck-internal-token: $INTERNAL_TOKEN" --data "$TURN_COMPLETE_BODY" "$PAN_DASHBOARD_URL/api/hooks/turn-complete" >/dev/null 2>&1 || true
|
|
93
|
+
fi
|
|
94
|
+
fi
|
|
95
|
+
fi
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# If the agent stopped because of a transient API error, nudge it to retry.
|
|
99
|
+
# This runs before chaining to specialist/work-agent hooks because it
|
|
100
|
+
# applies universally. 5-minute cooldown per agent.
|
|
101
|
+
if [ "$API_ERROR_DETECTED" = "true" ]; then
|
|
102
|
+
SHOULD_NUDGE=true
|
|
103
|
+
if [ -f "$API_ERROR_NUDGE_FILE" ]; then
|
|
104
|
+
LAST_API_NUDGE=$(cat "$API_ERROR_NUDGE_FILE" 2>/dev/null || echo "0")
|
|
105
|
+
NOW=$(date +%s)
|
|
106
|
+
if [ $(( NOW - LAST_API_NUDGE )) -lt 300 ]; then
|
|
107
|
+
SHOULD_NUDGE=false
|
|
108
|
+
fi
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
if [ "$SHOULD_NUDGE" = "true" ]; then
|
|
112
|
+
mkdir -p "$(dirname "$API_ERROR_NUDGE_FILE")"
|
|
113
|
+
date +%s > "$API_ERROR_NUDGE_FILE" 2>/dev/null || true
|
|
114
|
+
|
|
115
|
+
echo "[$(date -Iseconds)] stop-hook: $AGENT_ID api_error detected — nudging retry" \
|
|
116
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
117
|
+
|
|
118
|
+
tmpfile=$(mktemp)
|
|
119
|
+
echo "You stopped due to a transient API error. This is a temporary server issue, not a problem with your work. Continue from where you left off. Do NOT start over — pick up exactly where you stopped." > "$tmpfile"
|
|
120
|
+
tmux load-buffer "$tmpfile" 2>/dev/null
|
|
121
|
+
tmux paste-buffer -t "$AGENT_ID" 2>/dev/null
|
|
122
|
+
sleep 0.3
|
|
123
|
+
tmux send-keys -t "$AGENT_ID" C-m 2>/dev/null
|
|
124
|
+
rm -f "$tmpfile"
|
|
125
|
+
fi
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
# Chain to specialist-specific hook (auto-completion detection).
|
|
129
|
+
SPECIALIST_HOOK="$HOME/.overdeck/bin/specialist-stop-hook"
|
|
130
|
+
if [ -x "$SPECIALIST_HOOK" ]; then
|
|
131
|
+
"$SPECIALIST_HOOK" &
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
# Chain to work-agent completion detection (nudges agents that forgot `pan work done`).
|
|
135
|
+
WORK_AGENT_HOOK="$HOME/.overdeck/bin/work-agent-stop-hook"
|
|
136
|
+
if [ -x "$WORK_AGENT_HOOK" ]; then
|
|
137
|
+
"$WORK_AGENT_HOOK" &
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
# Auto-mark planning complete when a planning agent finishes.
|
|
141
|
+
if [[ "$AGENT_ID" == planning-* ]]; then
|
|
142
|
+
ISSUE_ID=$(echo "$AGENT_ID" | sed 's/^planning-//' | tr '[:lower:]' '[:upper:]')
|
|
143
|
+
if [ -n "$ISSUE_ID" ]; then
|
|
144
|
+
curl -s -m 1.0 -X POST "$PAN_DASHBOARD_URL/api/issues/$ISSUE_ID/complete-planning" \
|
|
145
|
+
-H "Content-Type: application/json" \
|
|
146
|
+
-d '{"skipKill":true}' > /dev/null 2>&1 &
|
|
147
|
+
fi
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# PAN-1557: interactive convoy reviewer finished a turn. If it wrote its report
|
|
151
|
+
# and hasn't signaled yet, deliver REVIEWER_READY to the synthesis agent.
|
|
152
|
+
# Interactive reviewers (no `claude --print`) don't exit, so the launcher can't
|
|
153
|
+
# own this signal the way it did for headless reviewers — the Stop-hook does.
|
|
154
|
+
# A bare idle stop with no report is left alone: Deacon's REVIEWER_TIMEOUT is
|
|
155
|
+
# the failure path, so we never emit a premature REVIEWER_FAILED.
|
|
156
|
+
# Pattern: agent-<issueId>-review-<subRole>
|
|
157
|
+
if [[ "$AGENT_ID" =~ ^agent-.+-review-(security|correctness|performance|requirements)$ ]]; then
|
|
158
|
+
R_STATE="$HOME/.overdeck/agents/$AGENT_ID/state.json"
|
|
159
|
+
R_MARKER="$HOME/.overdeck/agents/$AGENT_ID/reviewer-signaled"
|
|
160
|
+
if [ -f "$R_STATE" ] && [ ! -f "$R_MARKER" ]; then
|
|
161
|
+
# state.json is pretty-printed ("key": "value" with whitespace after the
|
|
162
|
+
# colon), so the extraction must tolerate optional whitespace.
|
|
163
|
+
R_OUT=$(sed -nE 's/.*"reviewOutputPath"[[:space:]]*:[[:space:]]*"([^"]*)".*/\1/p' "$R_STATE" | head -1)
|
|
164
|
+
R_SUB=$(sed -nE 's/.*"reviewSubRole"[[:space:]]*:[[:space:]]*"([^"]*)".*/\1/p' "$R_STATE" | head -1)
|
|
165
|
+
R_SYNTH=$(sed -nE 's/.*"reviewSynthesisAgentId"[[:space:]]*:[[:space:]]*"([^"]*)".*/\1/p' "$R_STATE" | head -1)
|
|
166
|
+
if [ -n "$R_OUT" ] && [ -n "$R_SUB" ] && [ -n "$R_SYNTH" ] && [ -s "$R_OUT" ]; then
|
|
167
|
+
# Deliver via the load-buffer + paste-buffer + Enter pattern on the
|
|
168
|
+
# overdeck socket (matches the API-error nudge above and the project's
|
|
169
|
+
# tmux-delivery rule). The synthesis session is always an interactive
|
|
170
|
+
# tmux session, so the paste reaches its prompt.
|
|
171
|
+
R_TMP=$(mktemp)
|
|
172
|
+
printf 'REVIEWER_READY %s %s' "$R_SUB" "$R_OUT" > "$R_TMP"
|
|
173
|
+
tmux -L overdeck load-buffer "$R_TMP" 2>/dev/null
|
|
174
|
+
tmux -L overdeck paste-buffer -t "$R_SYNTH" 2>/dev/null
|
|
175
|
+
sleep 0.3
|
|
176
|
+
tmux -L overdeck send-keys -t "$R_SYNTH" C-m 2>/dev/null
|
|
177
|
+
rm -f "$R_TMP"
|
|
178
|
+
touch "$R_MARKER"
|
|
179
|
+
echo "[$(date -Iseconds)] stop-hook: $AGENT_ID signaled REVIEWER_READY $R_SUB to $R_SYNTH" \
|
|
180
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
181
|
+
fi
|
|
182
|
+
fi
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
# PAN-1059 session-reaper: when the review synthesis session ends, kill any
|
|
186
|
+
# convoy sub-reviewer sessions (agent-<id>-review-{security,correctness,...}).
|
|
187
|
+
# Pattern: agent-<issueId>-review (no trailing sub-role suffix → synthesis)
|
|
188
|
+
if [[ "$AGENT_ID" =~ ^agent-(.+)-review$ ]]; then
|
|
189
|
+
REVIEW_ISSUE="${BASH_REMATCH[1]}"
|
|
190
|
+
KILLED_ANY=false
|
|
191
|
+
for SUBROLE in security correctness performance requirements; do
|
|
192
|
+
CONVOY_SESSION="agent-${REVIEW_ISSUE}-review-${SUBROLE}"
|
|
193
|
+
# PAN-1557: only reap a convoy reviewer that has SIGNALED (its
|
|
194
|
+
# `reviewer-signaled` marker is present). The marker is cleared at spawn
|
|
195
|
+
# (review-agent.ts) and touched when the reviewer signals REVIEWER_READY
|
|
196
|
+
# — headless launchers and the interactive Stop-hook both honor it — so a
|
|
197
|
+
# present marker means "this cycle's reviewer is done; safe to reap." A
|
|
198
|
+
# reviewer with NO marker is either still running OR belongs to a newer
|
|
199
|
+
# review cycle that reused this session name; reaping it would be the
|
|
200
|
+
# cross-cycle race that left running reviewers terminal-less. Skip it.
|
|
201
|
+
CONVOY_MARKER="$HOME/.overdeck/agents/$CONVOY_SESSION/reviewer-signaled"
|
|
202
|
+
if [ ! -f "$CONVOY_MARKER" ]; then
|
|
203
|
+
continue
|
|
204
|
+
fi
|
|
205
|
+
if tmux -L overdeck kill-session -t "$CONVOY_SESSION" 2>/dev/null; then
|
|
206
|
+
KILLED_ANY=true
|
|
207
|
+
echo "[$(date -Iseconds)] stop-hook: $AGENT_ID killed convoy $CONVOY_SESSION (signaled)" \
|
|
208
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
209
|
+
fi
|
|
210
|
+
done
|
|
211
|
+
if [ "$KILLED_ANY" = "true" ]; then
|
|
212
|
+
echo "[$(date -Iseconds)] stop-hook: $AGENT_ID synthesis ended — convoy reaped for $REVIEW_ISSUE" \
|
|
213
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
214
|
+
fi
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
exit 0
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/tldr-post-edit
|
|
3
|
+
# PostToolUse hook on Edit/Write — notifies TLDR to re-warm after code changes.
|
|
4
|
+
#
|
|
5
|
+
# Tracks dirty files in a lightweight file. When the dirty count exceeds a
|
|
6
|
+
# threshold, triggers a background re-warm so the index stays fresh.
|
|
7
|
+
|
|
8
|
+
# Don't use set -e — never break Claude Code execution
|
|
9
|
+
INPUT=$(cat 2>/dev/null || echo '{}')
|
|
10
|
+
|
|
11
|
+
# Only act on Edit and Write tools
|
|
12
|
+
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
|
|
13
|
+
if [ "$TOOL_NAME" != "Edit" ] && [ "$TOOL_NAME" != "Write" ]; then
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# Extract file path
|
|
18
|
+
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""' 2>/dev/null)
|
|
19
|
+
if [ -z "$FILE_PATH" ]; then
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
# Only track code files
|
|
24
|
+
EXT="${FILE_PATH##*.}"
|
|
25
|
+
EXT_LOWER=$(echo "$EXT" | tr '[:upper:]' '[:lower:]')
|
|
26
|
+
case "$EXT_LOWER" in
|
|
27
|
+
ts|tsx|js|jsx|py|java|go|rs|cpp|c|h|hpp|rb|php|kt|swift|cs|scala|lua|ex|exs)
|
|
28
|
+
;;
|
|
29
|
+
*)
|
|
30
|
+
exit 0
|
|
31
|
+
;;
|
|
32
|
+
esac
|
|
33
|
+
|
|
34
|
+
# Find project root (where .venv lives)
|
|
35
|
+
PROJECT_DIR=""
|
|
36
|
+
DIR="$(dirname "$FILE_PATH")"
|
|
37
|
+
while [ "$DIR" != "/" ]; do
|
|
38
|
+
if [ -d "$DIR/.venv" ]; then
|
|
39
|
+
PROJECT_DIR="$DIR"
|
|
40
|
+
break
|
|
41
|
+
fi
|
|
42
|
+
DIR=$(dirname "$DIR")
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
if [ -z "$PROJECT_DIR" ]; then
|
|
46
|
+
exit 0
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Track dirty files
|
|
50
|
+
DIRTY_FILE="$PROJECT_DIR/.tldr/dirty-files"
|
|
51
|
+
mkdir -p "$PROJECT_DIR/.tldr" 2>/dev/null || true
|
|
52
|
+
|
|
53
|
+
# Append the changed file (deduplicated on warm)
|
|
54
|
+
REL_PATH="${FILE_PATH#$PROJECT_DIR/}"
|
|
55
|
+
echo "$REL_PATH" >> "$DIRTY_FILE" 2>/dev/null || true
|
|
56
|
+
|
|
57
|
+
# Count dirty files (fast line count)
|
|
58
|
+
DIRTY_COUNT=$(wc -l < "$DIRTY_FILE" 2>/dev/null || echo 0)
|
|
59
|
+
|
|
60
|
+
# Trigger background re-warm after 10 edits (keeps index reasonably fresh)
|
|
61
|
+
WARM_THRESHOLD=10
|
|
62
|
+
if [ "$DIRTY_COUNT" -ge "$WARM_THRESHOLD" ]; then
|
|
63
|
+
TLDR_BIN="$PROJECT_DIR/.venv/bin/tldr"
|
|
64
|
+
if [ -x "$TLDR_BIN" ]; then
|
|
65
|
+
# Clear dirty tracking before warm
|
|
66
|
+
: > "$DIRTY_FILE" 2>/dev/null || true
|
|
67
|
+
# Background warm — non-blocking
|
|
68
|
+
(cd "$PROJECT_DIR" && "$TLDR_BIN" warm . --background) >/dev/null 2>&1 &
|
|
69
|
+
fi
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
exit 0
|