@overdeck/desktop 0.45.12 → 0.45.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drizzle/overdeck/0000_overdeck_init.sql +33 -0
- package/package.json +7 -2
- package/server/{acceptance-criteria-1LHgD9vg.js → acceptance-criteria-DHZk2ceV.js} +2 -2
- package/server/{advancing-selfheal-BqsLWqEM.js → advancing-selfheal-CSuZ31bB.js} +5 -5
- package/server/{agent-gc-CUb52n7s.js → agent-gc-D_DxfBHR.js} +3 -3
- package/server/{agent-state-D-moNwhA.js → agent-state-EP2QFV9n.js} +1 -1
- package/server/{agent-state-service-BzESvLOf.js → agent-state-service-BZkvgQf4.js} +5 -5
- package/server/{agent-state-service-BaZH7sXJ.js → agent-state-service-C_2ZAQRP.js} +1 -1
- package/server/{agents-B5LfpLPv.js → agents-CsOzAmRg.js} +145 -78
- package/server/{agents-C4kZ8a2r.js → agents-DCvyTXNU.js} +1 -1
- package/server/{archive-planning-BbZe-8IK.js → archive-planning-CTILQRnV.js} +1 -1
- package/server/{archive-planning-oX1pj6nY.js → archive-planning-DkivCk1A.js} +4 -4
- package/server/{artifact-index-jobs-DGr6bxev.js → artifact-index-jobs-CmsvQ1ey.js} +2 -2
- package/server/auto-commit-QAfsu3Sb.js +3 -0
- package/server/{backlog-auto-trigger-BlJHikOm.js → backlog-auto-trigger-ueRaT8Dy.js} +2 -2
- package/server/{bd-process-lock-i3CYMS-B.js → bd-process-lock-D3S4T4o-.js} +32 -11
- package/server/{beads-DD7fYCl5.js → beads-BGGxrkZ5.js} +96 -196
- package/server/{beads-BNU-fb48.js → beads-CYsLiyIM.js} +1 -1
- package/server/{beads-query-e6oku4P5.js → beads-query-B1DlJVp9.js} +24 -99
- package/server/beads-restore-CyygSmmn.js +23 -0
- package/server/{behavior-CPf0pbOt.js → behavior-Cpj03N4v.js} +3 -3
- package/server/{briefing-freshness-B2FdLwIv.js → briefing-freshness-Kh5V8RTh.js} +4 -4
- package/server/{checkpoint-manager-eFgaMMu4.js → checkpoint-manager-CAFos8e1.js} +1 -1
- package/server/{checkpoint-manager-JryW6MpM.js → checkpoint-manager-fu9oVsR-.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-qvOqvMuC.js → checkpoints-1BqOlS4q.js} +2 -2
- package/server/{checkpoints-BK17oicz.js → checkpoints-DvhGi8P_.js} +1 -1
- package/server/claude-hooks-provision-s_wdpeVj.js +360 -0
- package/server/{claude-permissions-B6bWGh9d.js → claude-permissions-CaWqysff.js} +2 -2
- package/server/{claude-settings-overlay-BPdhTPjo.js → claude-settings-overlay-BbA4FbVI.js} +1 -1
- package/server/{claude-settings-overlay-CRyyKKXQ.js → claude-settings-overlay-CcTf0xzG.js} +2 -2
- package/server/{cli-B75AieAM.js → cli-BwCvCUBK.js} +9 -9
- package/server/cli-ClIQwgMI.js +3 -0
- package/server/{cliproxy-CCzwuSNe.js → cliproxy-BsoNNDAj.js} +2 -2
- package/server/{cliproxy-DOQf66G9.js → cliproxy-C2xC-3vH.js} +1 -1
- package/server/{close-issue-_X3MXJyG.js → close-issue-BleIwP3f.js} +5 -5
- package/server/{closed-issue-reaper-CLR7ClsO.js → closed-issue-reaper-BwUUvjEW.js} +1 -1
- package/server/{closed-issue-reaper-BsUfBSjM.js → closed-issue-reaper-mC5pujeb.js} +102 -30
- package/server/{codex-CY-QRuU9.js → codex-B7DTpwEw.js} +1 -1
- package/server/{codex-B4KEpX5V.js → codex-DW60_5j2.js} +5 -5
- package/server/{compact-beads-cZds2MTr.js → compact-beads-CK_hHEnB.js} +1 -1
- package/server/{compact-beads-uEDccC76.js → compact-beads-DKL54y6j.js} +15 -8
- package/server/{config-DARrpYWA.js → config-BRNQJXhA.js} +1 -1
- package/server/{config-8sjaU6jZ.js → config-ZNnMpIlh.js} +2 -2
- package/server/{config-yaml-ClpGgrf6.js → config-yaml-Dcz-8uit.js} +29 -3
- package/server/{conflict-gate-Ds9_2yjd.js → conflict-gate-DGT8jCLp.js} +1 -1
- package/server/{conflict-gate-BtB_o-Vi.js → conflict-gate-DTje2Ll7.js} +3 -3
- package/server/{context-layers-r2ywnQYA.js → context-layers-BdUCQ-cl.js} +3 -3
- package/server/{context-layers-CRCk1QG7.js → context-layers-ByOWUjUg.js} +2 -2
- package/server/{control-settings-D1B3u6HP.js → control-settings-DwkAeooY.js} +4 -4
- package/server/{conversation-compaction-D86Zo2Ci.js → conversation-compaction-OTYgd6eg.js} +8 -8
- package/server/{conversation-compaction-CZRVk4hg.js → conversation-compaction-WYQZUVDm.js} +1 -1
- package/server/{conversation-service-CuTVU8dV.js → conversation-service-BR1OgvxO.js} +5 -5
- package/server/{conversation-service-CkL-6MuG.js → conversation-service-C_kNZPLx.js} +1 -1
- package/server/{conversations-DfJKBDwB.js → conversations-DG2M8WnT.js} +4 -4
- package/server/{conversations-BmWEluPL.js → conversations-izHvSoAR.js} +1 -1
- package/server/{cost-DAPYN6iA.js → cost-B2mj17iG.js} +3 -3
- package/server/{cost-CCnqa5xK.js → cost-DQ2ajr_m.js} +2 -2
- package/server/{cost-sync-BDL10Nwu.js → cost-sync-gTayEuWP.js} +3 -3
- package/server/{dag-Dv2r5bVD.js → dag-CqTehWpY.js} +3 -3
- package/server/{dangerous-git-ops-Dcw7PbYo.js → dangerous-git-ops-DDWQlPC3.js} +1 -1
- package/server/dashboard-db-worker.js +6 -6
- package/server/{deacon-DYnZH7kC.js → deacon-BqW9HMew.js} +3 -3
- package/server/{deacon-CM0MxbS8.js → deacon-DrKDBeJL.js} +161 -1594
- package/server/{deacon-nudge-log-B-naf89q.js → deacon-nudge-log-D1wEK6zF.js} +1 -1
- package/server/deacon-swarm-BY5hKNaU.js +2 -0
- package/server/{deacon-swarm-BstYoz8Q.js → deacon-swarm-CO_A7xyd.js} +12 -105
- package/server/deacon.js +7 -7
- package/server/{devcontainer-renderer-CaYOG9JN.js → devcontainer-renderer-BQolp_qZ.js} +3 -3
- package/server/{dist-BIC8spJ0.js → dist-Bc32rWJB.js} +1 -1
- package/server/dist-DGTwcZhI.js +3 -0
- package/server/{docker-DDI1shu3.js → docker-s-esqZ__.js} +67 -28
- package/server/{ensure-devcontainer-DCAg3ksz.js → ensure-devcontainer-DA4-jF6R.js} +4 -4
- package/server/{ensure-devcontainer-CbSXvN9W.js → ensure-devcontainer-pUVaT0h3.js} +1 -1
- package/server/{esm-shims-DiV9jHa_.js → esm-shims-CJHy8CZY.js} +1 -1
- package/server/{event-store-DU3HkZlN.js → event-store-CcJAhKCl.js} +1 -1
- package/server/{event-store-DCMqyI07.js → event-store-DRte2Rwt.js} +3 -3
- package/server/{events-BfiosVAn.js → events-Bej1w_k8.js} +3 -3
- package/server/{events-DLRxpSuV.js → events-CtsLScn8.js} +1 -1
- package/server/export-Dx_qJ3h8.js +87 -0
- package/server/{factory-BMtWV9iv.js → factory-FN727tWr.js} +4 -4
- package/server/{feature-registry-population-DA7bO6Zn.js → feature-registry-population-ie-yBcQC.js} +4 -4
- package/server/{feature-registry-storage-nAY1fbBt.js → feature-registry-storage-CkZTFSsn.js} +2 -2
- package/server/{features-DMu7eGmU.js → features-Dtm9ABuz.js} +2 -2
- package/server/{feedback-target-DHqcw3cN.js → feedback-target-BYtpyt1i.js} +6 -6
- package/server/{feedback-target-B2SEai8-.js → feedback-target-DVJQDiE4.js} +1 -1
- package/server/{feedback-writer-DMBdS_jL.js → feedback-writer-DOUhyIW2.js} +1 -1
- package/server/{feedback-writer-qvm7UON7.js → feedback-writer-fdE1BzeL.js} +4 -4
- package/server/{flywheel-k4FPtCQ_.js → flywheel-Bi82iiNl.js} +1 -1
- package/server/{flywheel-Dfpx4bIV.js → flywheel-Bv3wv2S6.js} +23 -15
- package/server/{flywheel-D2LdPSic.js → flywheel-CUErLAyN.js} +13 -13
- package/server/{flywheel-merge-order-CB4lbXeJ.js → flywheel-merge-order-BaEN3iyN.js} +7 -7
- package/server/{flywheel-merge-order-CttTazRY.js → flywheel-merge-order-DXjeBnJ1.js} +1 -1
- package/server/{forge-CoPFXFyl.js → forge-ButEdJ31.js} +2 -2
- package/server/forge-XlDgPQWs.js +2 -0
- package/server/{from-B0YoJl9-.js → from-CbtTxftl.js} +1 -1
- package/server/{fts-db-DAHW1yA_.js → fts-db-CBgBLZcL.js} +2 -2
- package/server/{fts-operations-DDXDBi0d.js → fts-operations-CI9Xuo_1.js} +2 -2
- package/server/{git-utils-DbfC0zls.js → git-utils-BCLRWQ-y.js} +1 -1
- package/server/{git-utils-B90Zjzfl.js → git-utils-ClfpP47N.js} +2 -2
- package/server/{github-app-C7lftMNj.js → github-app-DRD2woO0.js} +1 -1
- package/server/{github-app-BecAnXRX.js → github-app-DscZ0_B6.js} +2 -2
- package/server/{github-client-D21rCIXk.js → github-client-DpiZnxGH.js} +2 -2
- package/server/{github-client-BwtKZtM0.js → github-client-iFRw8f7e.js} +1 -1
- package/server/{github-pr-lookup-CzVWuysl.js → github-pr-lookup-D-EBexxC.js} +2 -2
- package/server/{harness-resolve-SkRJm4a7.js → harness-resolve-iMjyNUJ2.js} +3 -3
- package/server/{health-events-DA_JLpgZ.js → health-events-B_WsQyYm.js} +1 -1
- package/server/{health-events-BT0aAfeA.js → health-events-CRdxDFN2.js} +2 -2
- package/server/{hooks-BQxRXtRb.js → hooks-C1ScyVxP.js} +1 -1
- package/server/{hooks-DxEn2BoY.js → hooks-C9b7Vqpw.js} +2 -2
- package/server/hume-K1pi8jC4.js +3 -0
- package/server/{hume-DkVOs1Qi.js → hume-TQ5pvOZ_.js} +2 -2
- package/server/{idle-stack-reaper-DGy7tvC9.js → idle-stack-reaper-B1kG7B_X.js} +2 -2
- package/server/{idle-stack-reaper-C7fJL8jH.js → idle-stack-reaper-iFVOAoJy.js} +1 -1
- package/server/{infra-DE3C4PMr.js → infra-bpq1MHKU.js} +50 -3
- package/server/{injection-Dt22tGvS.js → injection-BLWfwTVZ.js} +1 -1
- package/server/{injection-Cc4Qt8LZ.js → injection-DJqWld1v.js} +7 -7
- package/server/inspect-agent-477VxQim.js +2 -0
- package/server/{inspect-agent-DOaCDkCF.js → inspect-agent-DytCsltn.js} +9 -9
- package/server/{internal-token-nobT6FhA.js → internal-token-CCaWaTwE.js} +1 -1
- package/server/{internal-token-B_1YLWLI.js → internal-token-CjlhdufS.js} +2 -2
- package/server/{io-A7ZuOBkz.js → io-BiQ2Cs3k.js} +2 -2
- package/server/{issue-closed-Da3DeomA.js → issue-closed-FApNiOOs.js} +4 -4
- package/server/{issue-lifecycle-Bd9XBJAQ.js → issue-lifecycle-BkFWNjlD.js} +1 -1
- package/server/{issue-lifecycle-543pQX9D.js → issue-lifecycle-C-K53ASY.js} +21 -21
- package/server/{issue-service-singleton-Brc3t0SV.js → issue-service-singleton-CuHGpJJP.js} +8 -8
- package/server/{issue-service-singleton-BC2JLZi7.js → issue-service-singleton-bG1WdSdQ.js} +1 -1
- package/server/{issues-D3kt9UWE.js → issues-CwQMphDH.js} +2 -2
- package/server/jsonl-parser-dNIjHgym.js +245 -0
- package/server/{label-cleanup-w9X_T3AQ.js → label-cleanup-DYvAZknd.js} +3 -3
- package/server/{layers-Cwe1J-9o.js → layers-CD6FysRU.js} +2 -2
- package/server/{lifecycle-f1GbDK33.js → lifecycle-C_73gi-C.js} +7 -7
- package/server/{lifecycle-io-D56q8zlO.js → lifecycle-io-C_Wu0_i-.js} +1 -1
- package/server/{lifecycle-io-Bqvj0m3i.js → lifecycle-io-CeYxP3cE.js} +4 -4
- package/server/{linear-client-Bh4T4S-c.js → linear-client-4qoKnuQu.js} +1 -1
- package/server/{linear-client-CfJMTAYd.js → linear-client-EtVyblVz.js} +2 -2
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-ZrXFM3jv.js → merge-7rqkTUm2.js} +3 -3
- package/server/merge-agent-36wfYm2u.js +3 -0
- package/server/{merge-agent-CHHs5S_0.js → merge-agent-4Zhlgvqp.js} +62 -27
- package/server/{merge-batch-BwhGdlh4.js → merge-batch-itfnwdsT.js} +1 -1
- package/server/{merge-blockers-BMhDpMl_.js → merge-blockers-Bto_Oe_o.js} +2 -2
- package/server/{merge-DRMPa8CQ.js → merge-brm721Es.js} +1 -1
- package/server/merge-ops-PzqsW69V.js +2 -0
- package/server/{merge-rebase-R7MfqpiE.js → merge-rebase-Czfqfe4q.js} +2 -2
- package/server/{merge-set-B3Breacq.js → merge-set-BIkGQL9j.js} +9 -5
- package/server/{merge-set-D-iXNP0I.js → merge-set-G1RHcu3D.js} +1 -1
- package/server/{merge-sync-DHWbGtjR.js → merge-sync-B43Dybea.js} +2 -2
- package/server/{merge-sync-bOOtfeXR.js → merge-sync-DIrmlZUr.js} +1 -1
- package/server/{merge-train-98ptZrPT.js → merge-train-DGqVuNZV.js} +3 -3
- package/server/{merge-train-deps-B5FWJTE2.js → merge-train-deps-q15XLnAS.js} +4 -4
- package/server/{merge-verification-BGiuiXAK.js → merge-verification-Cqfxx6bE.js} +4 -4
- package/server/{multipart-parser-D7mzNNDm.js → multipart-parser-CiPxxfUH.js} +2 -2
- package/server/node_modules/.package-lock.json +1 -1
- package/server/{orphan-proposed-reconciler-BSGCNJ6X.js → orphan-proposed-reconciler-BWWHn4Lr.js} +15 -39
- package/server/{orphan-proposed-reconciler-CSuxivr9.js → orphan-proposed-reconciler-DAD9FJtQ.js} +1 -1
- package/server/package-lock.json +2 -2
- package/server/package.json +1 -1
- package/server/{pan-dir-DoPtdHrp.js → pan-dir-Bj7Hy8iu.js} +3 -3
- package/server/{paths-CVDLPxXp.js → paths-C9DkhIOT.js} +2 -2
- package/server/{pickup-KLRUhThD.js → pickup-CKRuGDsB.js} +1 -1
- package/server/{pipeline-notifier-BtYHbBPl.js → pipeline-notifier-BkKbQ8ji.js} +1 -1
- package/server/{pipeline-notifier-WD2dnOsR.js → pipeline-notifier-CAurUste.js} +2 -2
- package/server/project-pipelines-BRWaGmI4.js +162 -0
- package/server/projects-KJ94e50I.js +3 -0
- package/server/{prompts-Cg7e9FPb.js → prompts-DfI5qbTW.js} +2 -2
- package/server/{providers-fLduChnX.js → providers-CWDXoaMA.js} +7 -7
- package/server/providers-D-5txBRc.js +3 -0
- package/server/public/assets/{chunk-BO2N2NFS-aNlsGDCu.js → chunk-BO2N2NFS-ClukPsZQ.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-CnjkrvT8.js → diagram-OG6HWLK6-Avtvq2qI.js} +1 -1
- package/server/public/assets/{dist-Bg3Sbsx4.js → dist-BEHQuasD.js} +3 -3
- package/server/public/assets/{dist-CGKBCieA.js → dist-BvmY-qb1.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-C8LLKj23.js → ganttDiagram-6RSMTGT7-7KhCd0fH.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-BSDEUvhW.js → highlighted-body-OFNGDK62-iQoBMTf0.js} +1 -1
- package/server/public/assets/index-DUFDmvmH.css +1 -0
- package/server/public/assets/index-DnTZ2QeN.js +796 -0
- package/server/public/assets/{linear-DEbYZoxg.js → linear-CiJHW9g5.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-DZJOwgBG.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BtZL5pXE.js → pieDiagram-4H26LBE5-BOhmvUhW.js} +1 -1
- package/server/public/assets/{prod-DYVvIyuh.js → prod-DmLBBqat.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-a7vS8Jc8.js → quadrantDiagram-W4KKPZXB-Cjku660G.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-Ckbq2SWH.js → sankeyDiagram-5OEKKPKP-D52w5oPh.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-DJyeNa99.js → xychartDiagram-2RQKCTM6-BTO07_Iv.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-1WXmTBlo.js → pull-requests-Bmre-Xlz.js} +3 -3
- package/server/{pull-requests-D2SjJIwY.js → pull-requests-CKZPWhjD.js} +1 -1
- package/server/{rally-8aQlLLVj.js → rally-BBd9tQ__.js} +3 -3
- package/server/rally-Dc2Wnxw2.js +3 -0
- package/server/{rally-api-BtvwdX6d.js → rally-api-DDc85HIz.js} +1 -1
- package/server/{rally-api-H5I2CBO0.js → rally-api-DxZFObI_.js} +2 -2
- package/server/{rally-client-Bt-qHiOh.js → rally-client-BADHn0m_.js} +1 -1
- package/server/{rally-client-33CYZYYu.js → rally-client-DvvLiAQP.js} +4 -4
- package/server/{reap-terminal-sessions-CAmURC2h.js → reap-terminal-sessions-D6JDJsqF.js} +1 -1
- package/server/{reap-terminal-sessions-BwJb2DLJ.js → reap-terminal-sessions-D_xvy-Mk.js} +1 -1
- package/server/{rebuild-stack-KHkkrGjx.js → rebuild-stack-D19i080j.js} +6 -6
- package/server/{rebuild-stack-CXSgAGPR.js → rebuild-stack-GOsWqXi3.js} +1 -1
- package/server/{reconstruct-cache-D_Ml65_6.js → reconstruct-cache-lQrG4xGg.js} +6 -6
- package/server/record-pyB6VA32.js +3 -0
- package/server/recovery-trip-Dfh1tNHn.js +98 -0
- package/server/release-engine-DxcMWRuK.js +306 -0
- package/server/release-set-BYsgX7o6.js +125 -0
- package/server/{remote-CGuognN3.js → remote-8W2Yhygw.js} +3 -3
- package/server/{remote-D0Old0Cv.js → remote-DmeL21dF.js} +3 -3
- package/server/{remote-agents-DfhMq6kQ.js → remote-agents-BfQBE6MN.js} +5 -5
- package/server/{remote-agents-UHoi4oGr.js → remote-agents-DlvbzO7m.js} +1 -1
- package/server/{remote-completion-RZYePR_0.js → remote-completion-BgkiSQmx.js} +12 -12
- package/server/resolver-dTpSSzaH.js +158 -0
- package/server/resume-DhcIqsTm.js +3 -0
- package/server/{review-agent-sZBCpEVv.js → review-agent-D025Wt7w.js} +22 -22
- package/server/{review-agent-uwVftH98.js → review-agent-Rub0OpZc.js} +1 -1
- package/server/{review-artifacts-C7a45b1_.js → review-artifacts-CX951jTU.js} +6 -6
- package/server/{review-context-CErbQpKL.js → review-context-DGGGR_w5.js} +7 -7
- package/server/{review-monitor-DHD9m_kh.js → review-monitor-0_qqMcnS.js} +2 -2
- package/server/{review-status-gPndPUBc.js → review-status-4qqLkRMu.js} +24 -17
- package/server/{review-status-JhQ3qlDS.js → review-status-Br6lAFGO.js} +1 -1
- package/server/{review-status-enrichment-qWvWckYN.js → review-status-enrichment-Cr8m3uVL.js} +3 -3
- package/server/{review-status-sync-B_GrEke8.js → review-status-sync-D3KUhsdA.js} +1 -1
- package/server/{review-status-sync-D3A9KX95.js → review-status-sync-OC-l1lNt.js} +9 -5
- package/server/{review-verdict-feedback-4WZ5ZdbC.js → review-verdict-feedback-DrWMuRaj.js} +6 -6
- package/server/{review-verdict-feedback-Zo0r_z4m.js → review-verdict-feedback-YOzmsq9G.js} +1 -1
- package/server/{rollup-BrUIKMv_.js → rollup-CnxbwaLH.js} +8 -8
- package/server/{rollup-Bmhn80tB.js → rollup-DmazRY0j.js} +1 -1
- package/server/{scanner-BIGumel_.js → scanner-DE1MqAaF.js} +7 -7
- package/server/{sequence-io-DA0akEQN.js → sequence-io-C0uoqfGx.js} +4 -4
- package/server/{sequencer-agent-DeflKafB.js → sequencer-agent-i-b2u4SJ.js} +10 -6
- package/server/server.js +1115 -297
- package/server/{service-V0sUK-OR.js → service-D0_gh2tl.js} +1668 -1408
- package/server/{session-fork-Yx3UcAQf.js → session-fork-DZ12vipL.js} +2 -2
- package/server/{settings-CFEeQRj2.js → settings-ByqjPtFO.js} +2 -2
- package/server/{settings-CxVate0h.js → settings-DCC4BAqj.js} +3 -3
- package/server/settings-yydgaqhv.js +2 -0
- package/server/{shadow-engineering-BRxnVSDk.js → shadow-engineering-BhnmtW5m.js} +2 -2
- package/server/{shadow-state-1aS8FijU.js → shadow-state-ByXZehsy.js} +1 -1
- package/server/{shadow-state-BiMwdyl1.js → shadow-state-CKm8xWX9.js} +2 -2
- package/server/{ship-log-CMWH3H5-.js → ship-log-DE_0Cv_i.js} +1 -1
- package/server/{smart-compaction-Bw1K_Sbl.js → smart-compaction-D5Zen3AA.js} +7 -7
- package/server/{smart-compaction-xblMyVpT.js → smart-compaction-h4_ca6Uk.js} +1 -1
- package/server/{spawn-planning-session-CzDFSKAQ.js → spawn-planning-session-Bgi7Ub02.js} +1 -1
- package/server/{spawn-planning-session-DxLxcM7m.js → spawn-planning-session-Dueit4WX.js} +15 -15
- package/server/{specialist-completion-BiEXUHfD.js → specialist-completion-BZ8M-WZ0.js} +1 -1
- package/server/{specialist-context-BfkTA81h.js → specialist-context-BMq83C58.js} +5 -5
- package/server/{specialist-handoff-logger-BiKuLtNm.js → specialist-handoff-logger-BxX1YefH.js} +2 -2
- package/server/{specialist-logs-CFJjGsLC.js → specialist-logs-BWZYcJ6P.js} +3 -3
- package/server/{specialists-DdvpFNt1.js → specialists-8ZAguXef.js} +1 -1
- package/server/{specialists-B4byf18k.js → specialists-BudKrjOu.js} +76 -76
- package/server/{specialists-DjHbwQ_p.js → specialists-DrPrC9Y9.js} +20 -256
- package/server/{specialists-BLIreoE7.js → specialists-ZkW4Mb7U.js} +1 -1
- package/server/specs-DwoAEGrW.js +3 -0
- package/server/{src-fgbU-jJ-.js → src-DHn4Rd2F.js} +25 -3
- package/server/{src-mK_M_ZIj.js → src-DNUUqkec.js} +6 -6
- package/server/{src-CALBEUMX.js → src-Dv6L03vW.js} +3 -3
- package/server/{stack-health-BFM8YlHw.js → stack-health-Dclm7_tu.js} +1 -1
- package/server/{stack-health-Qd7rPiVe.js → stack-health-DxsTx7II.js} +2 -2
- package/server/{state-home-C2Bicw9N.js → state-home-CRowbXqU.js} +6 -6
- package/server/stuck-remediation-CFWUP8_I.js +1491 -0
- package/server/stuck-remediation-CLHd-lrF.js +2 -0
- package/server/{summary-fork-EWWBvzgE.js → summary-fork-CKc01Our.js} +2 -2
- package/server/{summary-fork-DezPkJSm.js → summary-fork-CtCwBJ2Z.js} +8 -8
- package/server/{supervisor-D5GC5jUM.js → supervisor-BA5D72Qa.js} +2 -2
- package/server/supervisor-DHjumXlL.js +2 -0
- package/server/{swarm-readiness-Cf9mommA.js → swarm-readiness-CL5sM9B1.js} +3 -3
- package/server/{system-prerequisites-BsI9hxh9.js → system-prerequisites-DmFSXIE5.js} +13 -1
- package/server/{teardown-workspace-CWz1pbEK.js → teardown-workspace-DWmFJzTw.js} +37 -68
- package/server/{test-agent-queue-TiVXe3ZT.js → test-agent-queue-DjsQoV5X.js} +6 -6
- package/server/{test-verdict-CCDd25uN.js → test-verdict-BSqsQp3G.js} +1 -1
- package/server/{test-verdict-Bm4uv_AA.js → test-verdict-D1AmZ2c0.js} +1 -1
- package/server/{tldr-daemon-C_1frSDj.js → tldr-daemon-C-MGomL8.js} +2 -2
- package/server/{tldr-daemon-Big5IZ_M.js → tldr-daemon-DD9rI5gA.js} +1 -1
- package/server/{tmux-D57f-XNv.js → tmux-C_d-lSIq.js} +2 -2
- package/server/{tmux-DClqWwb8.js → tmux-x291Gjjb.js} +1 -1
- package/server/{token-_qujO3JZ.js → token-DfBf1bsd.js} +1 -1
- package/server/{tracker-config-BmdJU_w6.js → tracker-config-CNODpd11.js} +2 -2
- package/server/{tracker-config-B_Ubts1Z.js → tracker-config-DItsdelv.js} +1 -1
- package/server/{tracker-utils-Bg-Sevcv.js → tracker-utils-B9ZoVA9b.js} +1 -1
- package/server/{tracker-utils-CWFt6jjV.js → tracker-utils-Ch2_5GGf.js} +2 -2
- package/server/{traefik-connect-5EP1WS_Z.js → traefik-connect-BF4x_LUQ.js} +1 -1
- package/server/{tunnel-hOBNQbmF.js → tunnel-YD80_IHr.js} +1 -1
- package/server/{tunnel-UBf2vyAL.js → tunnel-r_5nHAI6.js} +3 -3
- package/server/{types-B5u3NxMl.js → types-33JEP4LZ.js} +1 -1
- package/server/{uat-train-DGkIkLxu.js → uat-train-DDI00aqD.js} +1 -1
- package/server/{uat-train-qNanv5hN.js → uat-train-DjkFWXge.js} +25 -25
- package/server/{validation-C4wegCvH.js → validation-DUTiJnyz.js} +4 -4
- package/server/{validation-B0QaLIHP.js → validation-ict8hnXk.js} +1 -1
- package/server/{verification-runner-DdleMNLq.js → verification-runner-ATaLbpr5.js} +1 -1
- package/server/{verification-runner-CntudBes.js → verification-runner-inLgeQux.js} +12 -12
- package/server/{vtt-parser-CKc-smWM.js → vtt-parser-QnRfcjiU.js} +1 -1
- package/server/{work-agent-prompt-CG5jFV9A.js → work-agent-prompt-fZljjA1_.js} +12 -12
- package/server/{workflows-BK2xs_a8.js → workflows-oBnJ7Tm0.js} +14 -14
- package/server/workflows-tU7KKxQi.js +2 -0
- package/server/{workspace-C9lC5o3E.js → workspace-B2WOW9Hw.js} +1 -1
- package/server/{workspace-CLrSIRCx.js → workspace-CNuW2j41.js} +3 -3
- package/server/{workspace-config-DA8U97k9.js → workspace-config-CBgMGhWs.js} +1 -1
- package/server/{workspace-manager-BJhW2sky.js → workspace-manager-CB-R07R3.js} +12 -12
- package/server/{workspace-manager-Cb2a7bg9.js → workspace-manager-DjUAJCSs.js} +1 -1
- package/server/{workspace-metadata-QQmo_Z0l.js → workspace-metadata-9Nn5kgRl.js} +2 -2
- package/server/{workspace-metadata-CTRnr323.js → workspace-metadata-Fd58uUQG.js} +1 -1
- package/server/{workspaces-Ca4zZs12.js → workspaces-BjWXntty.js} +106 -120
- package/server/writer-CQMGzEkw.js +3 -0
- package/server/writer-fe1-8iGc.js +251 -0
- package/sync-sources/hooks/ask-user-question-hook +87 -0
- package/sync-sources/hooks/auto-approve-hook +96 -0
- package/sync-sources/hooks/codex-notify-hook +62 -0
- package/sync-sources/hooks/gh-issue-trailer-hook +4 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.d.ts +7 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.d.ts.map +1 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.js +239 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.js.map +1 -0
- package/sync-sources/hooks/gh-issue-trailer-hook.ts +296 -0
- package/sync-sources/hooks/git-hooks/post-checkout +109 -0
- package/sync-sources/hooks/heartbeat-hook +113 -0
- package/sync-sources/hooks/notification-hook +70 -0
- package/sync-sources/hooks/notify-complete +79 -0
- package/sync-sources/hooks/pan-hook-lib.sh +153 -0
- package/sync-sources/hooks/permission-event-hook +24 -0
- package/sync-sources/hooks/post-compact-hook +25 -0
- package/sync-sources/hooks/pre-compact-hook +26 -0
- package/sync-sources/hooks/pre-tool-hook +35 -0
- package/sync-sources/hooks/record-cost-event.d.ts +1 -0
- package/sync-sources/hooks/record-cost-event.js +31859 -0
- package/sync-sources/hooks/record-cost-event.js.map +1 -0
- package/sync-sources/hooks/record-cost-event.ts +267 -0
- package/sync-sources/hooks/rtk-bash-filter +152 -0
- package/sync-sources/hooks/session-start-hook +80 -0
- package/sync-sources/hooks/specialist-stop-hook +106 -0
- package/sync-sources/hooks/statusline.sh +169 -0
- package/sync-sources/hooks/stop-hook +217 -0
- package/sync-sources/hooks/tldr-post-edit +72 -0
- package/sync-sources/hooks/tldr-read-enforcer +340 -0
- package/sync-sources/hooks/tmux-send-keys-guard +87 -0
- package/sync-sources/hooks/tsdown.config.ts +14 -0
- package/sync-sources/hooks/user-prompt-submit-hook +57 -0
- package/sync-sources/hooks/work-agent-stop-hook +424 -0
- package/server/auto-commit-CGQlb4rV.js +0 -3
- package/server/bd-mutex-BItGvLQ8.js +0 -35
- package/server/beads-restore-CMbDSB5R.js +0 -60
- package/server/cli-Ch_BWJB2.js +0 -3
- package/server/deacon-swarm-CSWGRfzr.js +0 -2
- package/server/dist-BUplB3Od.js +0 -3
- package/server/forge-IgLR0Ist.js +0 -2
- package/server/hume-x9voULey.js +0 -3
- package/server/inspect-agent-CYoWAeeB.js +0 -2
- package/server/merge-agent-CfohxFWM.js +0 -3
- package/server/merge-ops-Czke6UAp.js +0 -2
- package/server/projects-Bqfwuqet.js +0 -3
- package/server/providers-JjK6izqX.js +0 -3
- package/server/public/assets/index-CZiADHcL.css +0 -1
- package/server/public/assets/index-LQIfhmgI.js +0 -796
- package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +0 -1
- package/server/rally-Ba9QoNYc.js +0 -3
- package/server/record-De2syxNB.js +0 -3
- package/server/resume-CmxF3Kjz.js +0 -3
- package/server/settings-DEhYpW0k.js +0 -2
- package/server/specs-CVH1kvz3.js +0 -3
- package/server/supervisor-DQMK2e3I.js +0 -2
- package/server/workflows-pKw9yRSV.js +0 -2
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/heartbeat-hook (PAN-800)
|
|
3
|
+
#
|
|
4
|
+
# Fires on Claude Code PostToolUse. POSTs agent.activity_changed(working, tool)
|
|
5
|
+
# to the dashboard, then records the cost event.
|
|
6
|
+
#
|
|
7
|
+
# Rewritten from the ~200-line jq read-modify-write version to a pure POST
|
|
8
|
+
# emitter. runtime.json and heartbeats/<id>.json are no longer written —
|
|
9
|
+
# AgentStateService's SubscriptionRef + projection_cache is canonical.
|
|
10
|
+
# activity.jsonl is retained as a forensic grep-able artifact (cheap to keep).
|
|
11
|
+
# The sessions.json append-only list is retained because it's a bookkeeping
|
|
12
|
+
# record of Claude session UUIDs, not runtime state.
|
|
13
|
+
# Cost-event recording stays on its own flock-serialized path.
|
|
14
|
+
|
|
15
|
+
set +e
|
|
16
|
+
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
18
|
+
# shellcheck source=pan-hook-lib.sh
|
|
19
|
+
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || exit 0
|
|
20
|
+
|
|
21
|
+
pan_resolve_agent_id || exit 0
|
|
22
|
+
|
|
23
|
+
TOOL_INFO=$(cat 2>/dev/null || echo '{}')
|
|
24
|
+
|
|
25
|
+
HAVE_JQ=0
|
|
26
|
+
if command -v jq >/dev/null 2>&1; then HAVE_JQ=1; fi
|
|
27
|
+
|
|
28
|
+
TOOL_NAME="unknown"
|
|
29
|
+
TOOL_INPUT=""
|
|
30
|
+
CLAUDE_SESSION_ID=""
|
|
31
|
+
if [ "$HAVE_JQ" = "1" ]; then
|
|
32
|
+
TOOL_NAME=$(echo "$TOOL_INFO" | jq -r '.tool_name // "unknown"' 2>/dev/null || echo "unknown")
|
|
33
|
+
TOOL_INPUT=$(echo "$TOOL_INFO" | jq -r '.tool_input | tostring | .[0:100] // ""' 2>/dev/null || echo "")
|
|
34
|
+
CLAUDE_SESSION_ID=$(echo "$TOOL_INFO" | jq -r '.session_id // ""' 2>/dev/null || echo "")
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
TS=$(date -Iseconds)
|
|
38
|
+
|
|
39
|
+
# ── Emit agent.activity_changed(working, tool) ─────────────────────────────
|
|
40
|
+
if [ "$HAVE_JQ" = "1" ]; then
|
|
41
|
+
BODY=$(jq -n --arg tool "$TOOL_NAME" --arg ts "$TS" \
|
|
42
|
+
'{kind: "activity", activity: "working", tool: $tool, timestamp: $ts}')
|
|
43
|
+
else
|
|
44
|
+
BODY="{\"kind\":\"activity\",\"activity\":\"working\",\"tool\":\"$TOOL_NAME\",\"timestamp\":\"$TS\"}"
|
|
45
|
+
fi
|
|
46
|
+
pan_emit_event "$AGENT_ID" "$BODY"
|
|
47
|
+
|
|
48
|
+
# ── Activity log (retained for forensics) ─────────────────────────────────
|
|
49
|
+
AGENT_DIR="$HOME/.overdeck/agents/$AGENT_ID"
|
|
50
|
+
mkdir -p "$AGENT_DIR" 2>/dev/null
|
|
51
|
+
if [ "$HAVE_JQ" = "1" ]; then
|
|
52
|
+
ENTRY=$(jq -n --arg ts "$TS" --arg tool "$TOOL_NAME" --arg action "$TOOL_INPUT" \
|
|
53
|
+
'{ts: $ts, tool: $tool, action: $action}' 2>/dev/null || echo "")
|
|
54
|
+
if [ -n "$ENTRY" ]; then
|
|
55
|
+
echo "$ENTRY" >> "$AGENT_DIR/activity.jsonl" 2>/dev/null || true
|
|
56
|
+
# Prune to last 100 entries.
|
|
57
|
+
if [ -f "$AGENT_DIR/activity.jsonl" ]; then
|
|
58
|
+
TMP="$AGENT_DIR/activity.jsonl.tmp"
|
|
59
|
+
tail -n 100 "$AGENT_DIR/activity.jsonl" > "$TMP" 2>/dev/null \
|
|
60
|
+
&& mv "$TMP" "$AGENT_DIR/activity.jsonl" 2>/dev/null || true
|
|
61
|
+
fi
|
|
62
|
+
fi
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# ── Claude session history (append-only bookkeeping) ──────────────────────
|
|
66
|
+
if [ "$HAVE_JQ" = "1" ] && [ -n "$CLAUDE_SESSION_ID" ]; then
|
|
67
|
+
SESSIONS_FILE="$AGENT_DIR/sessions.json"
|
|
68
|
+
if [ -f "$SESSIONS_FILE" ]; then
|
|
69
|
+
if ! jq -e --arg sid "$CLAUDE_SESSION_ID" 'any(.[]; . == $sid)' "$SESSIONS_FILE" >/dev/null 2>&1; then
|
|
70
|
+
TMP="$SESSIONS_FILE.tmp"
|
|
71
|
+
jq --arg sid "$CLAUDE_SESSION_ID" '. + [$sid]' "$SESSIONS_FILE" > "$TMP" 2>/dev/null \
|
|
72
|
+
&& mv "$TMP" "$SESSIONS_FILE" 2>/dev/null || true
|
|
73
|
+
fi
|
|
74
|
+
else
|
|
75
|
+
echo "[\"$CLAUDE_SESSION_ID\"]" > "$SESSIONS_FILE" 2>/dev/null || true
|
|
76
|
+
fi
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# ── Cost-event recording (unchanged, its own flock-serialized path) ──────
|
|
80
|
+
COST_SCRIPT=""
|
|
81
|
+
if [ -f "$HOME/.overdeck/bin/record-cost-event.js" ]; then
|
|
82
|
+
COST_SCRIPT="$HOME/.overdeck/bin/record-cost-event.js"
|
|
83
|
+
elif [ -f "$SCRIPT_DIR/record-cost-event.js" ]; then
|
|
84
|
+
COST_SCRIPT="$SCRIPT_DIR/record-cost-event.js"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
if [ -n "$COST_SCRIPT" ] && [ -n "$CLAUDE_SESSION_ID" ]; then
|
|
88
|
+
GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "")
|
|
89
|
+
WORKSPACE=$(pwd)
|
|
90
|
+
|
|
91
|
+
if [ -z "$OVERDECK_ISSUE_ID" ]; then
|
|
92
|
+
if [[ "$GIT_BRANCH" =~ (pan|min|aud|krux|cli|PAN|MIN|AUD|KRUX|CLI)[-]([0-9]+) ]]; then
|
|
93
|
+
OVERDECK_ISSUE_ID="${BASH_REMATCH[1]^^}-${BASH_REMATCH[2]}"
|
|
94
|
+
fi
|
|
95
|
+
fi
|
|
96
|
+
if [ -z "$OVERDECK_ISSUE_ID" ]; then
|
|
97
|
+
if [[ "$WORKSPACE" =~ (pan|min|aud|krux|cli|PAN|MIN|AUD|KRUX|CLI)[-]([0-9]+) ]]; then
|
|
98
|
+
OVERDECK_ISSUE_ID="${BASH_REMATCH[1]^^}-${BASH_REMATCH[2]}"
|
|
99
|
+
fi
|
|
100
|
+
fi
|
|
101
|
+
export OVERDECK_ISSUE_ID="${OVERDECK_ISSUE_ID:-UNKNOWN}"
|
|
102
|
+
export OVERDECK_SESSION_TYPE="${OVERDECK_SESSION_TYPE:-implementation}"
|
|
103
|
+
|
|
104
|
+
STATE_DIR="$HOME/.overdeck/costs/state"
|
|
105
|
+
mkdir -p "$STATE_DIR" 2>/dev/null
|
|
106
|
+
LOCK_FILE="$STATE_DIR/${CLAUDE_SESSION_ID}.lock"
|
|
107
|
+
{
|
|
108
|
+
flock -x -w 30 200
|
|
109
|
+
echo "$TOOL_INFO" | node "$COST_SCRIPT" 2>/dev/null || true
|
|
110
|
+
} 200>"$LOCK_FILE"
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
exit 0
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/notification-hook (PAN-800)
|
|
3
|
+
#
|
|
4
|
+
# Fires on Claude Code Notification events. If the notification looks like a
|
|
5
|
+
# permission prompt or a request for human input, emits
|
|
6
|
+
# agent.waiting_started(reason=...). Logs the raw payload for future analysis.
|
|
7
|
+
#
|
|
8
|
+
# PAN-709 note: the Notification event fires for system/desktop notifications
|
|
9
|
+
# from Claude Code, NOT for in-terminal tool approval dialogs. In-terminal
|
|
10
|
+
# prompts are detected separately by the deacon tmux-tail scanner (still
|
|
11
|
+
# active during the PAN-800 migration; scheduled for replacement in Phase 5).
|
|
12
|
+
|
|
13
|
+
set +e
|
|
14
|
+
|
|
15
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
16
|
+
# shellcheck source=pan-hook-lib.sh
|
|
17
|
+
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || exit 0
|
|
18
|
+
|
|
19
|
+
pan_resolve_agent_id || exit 0
|
|
20
|
+
|
|
21
|
+
NOTIF_INFO=$(cat 2>/dev/null || echo '{}')
|
|
22
|
+
|
|
23
|
+
HAVE_JQ=0
|
|
24
|
+
if command -v jq >/dev/null 2>&1; then HAVE_JQ=1; fi
|
|
25
|
+
|
|
26
|
+
NOTIF_MSG=""
|
|
27
|
+
if [ "$HAVE_JQ" = "1" ]; then
|
|
28
|
+
NOTIF_MSG=$(echo "$NOTIF_INFO" | jq -r '.message // ""' 2>/dev/null || echo "")
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
TS=$(date -Iseconds)
|
|
32
|
+
|
|
33
|
+
# Log the raw notification for forensics. Kept at 500 entries.
|
|
34
|
+
LOG_DIR="$HOME/.overdeck/logs"
|
|
35
|
+
mkdir -p "$LOG_DIR" 2>/dev/null
|
|
36
|
+
LOG_FILE="$LOG_DIR/notifications.jsonl"
|
|
37
|
+
if [ "$HAVE_JQ" = "1" ]; then
|
|
38
|
+
jq -n --arg ts "$TS" --arg agent "$AGENT_ID" --argjson payload "$NOTIF_INFO" \
|
|
39
|
+
'{ts: $ts, agent: $agent, payload: $payload}' >> "$LOG_FILE" 2>/dev/null || true
|
|
40
|
+
if [ -f "$LOG_FILE" ]; then
|
|
41
|
+
TMP="$LOG_FILE.tmp"
|
|
42
|
+
tail -n 500 "$LOG_FILE" > "$TMP" 2>/dev/null && mv "$TMP" "$LOG_FILE" 2>/dev/null || true
|
|
43
|
+
fi
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
# Classify the notification. The message strings come from Claude Code's own
|
|
47
|
+
# notification payloads; we're pattern-matching the keywords that indicate the
|
|
48
|
+
# agent is stalled waiting for the human.
|
|
49
|
+
REASON=""
|
|
50
|
+
if echo "$NOTIF_MSG" | grep -qiE '(permission|approval|allow.*tool|confirm.*tool)'; then
|
|
51
|
+
REASON="tool_permission"
|
|
52
|
+
elif echo "$NOTIF_MSG" | grep -qiE '(question|needs.*input|waiting.*for|needs your)'; then
|
|
53
|
+
REASON="user_question"
|
|
54
|
+
elif echo "$NOTIF_MSG" | grep -qiE '(disambiguat|choose|select|which)'; then
|
|
55
|
+
REASON="disambiguation"
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
if [ -n "$REASON" ]; then
|
|
59
|
+
if [ "$HAVE_JQ" = "1" ]; then
|
|
60
|
+
BODY=$(jq -n --arg reason "$REASON" --arg msg "$NOTIF_MSG" --arg ts "$TS" \
|
|
61
|
+
'{kind: "waiting_start", reason: $reason, message: $msg, timestamp: $ts}')
|
|
62
|
+
else
|
|
63
|
+
# Fallback: minimal body, no message field. Escaping arbitrary NOTIF_MSG
|
|
64
|
+
# into JSON by hand is error-prone.
|
|
65
|
+
BODY="{\"kind\":\"waiting_start\",\"reason\":\"$REASON\",\"timestamp\":\"$TS\"}"
|
|
66
|
+
fi
|
|
67
|
+
pan_emit_event "$AGENT_ID" "$BODY"
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
exit 0
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# notify-complete: Send desktop notification when agent completes work
|
|
3
|
+
# Part of Overdeck - works on WSL2/Windows, Linux, and macOS
|
|
4
|
+
#
|
|
5
|
+
# Usage: notify-complete <issue-id> <title> [mr-url]
|
|
6
|
+
#
|
|
7
|
+
# Examples:
|
|
8
|
+
# notify-complete MIN-665 "Fixed login button"
|
|
9
|
+
# notify-complete PAN-96 "Implemented templates" "https://gitlab.com/mr/123"
|
|
10
|
+
|
|
11
|
+
ISSUE_ID="${1:-UNKNOWN}"
|
|
12
|
+
TITLE="${2:-Agent completed work}"
|
|
13
|
+
MR_URL="${3:-}"
|
|
14
|
+
|
|
15
|
+
# Log to completion file
|
|
16
|
+
COMPLETION_LOG="$HOME/.overdeck/agent-completed.log"
|
|
17
|
+
mkdir -p "$(dirname "$COMPLETION_LOG")"
|
|
18
|
+
echo "$(date '+%Y-%m-%d %H:%M:%S') | ${ISSUE_ID} | ${TITLE} | ${MR_URL}" >> "$COMPLETION_LOG"
|
|
19
|
+
|
|
20
|
+
# Detect platform and send notification
|
|
21
|
+
send_notification() {
|
|
22
|
+
local title="$1"
|
|
23
|
+
local message="$2"
|
|
24
|
+
|
|
25
|
+
# WSL2/Windows - use PowerShell toast notifications
|
|
26
|
+
if command -v powershell.exe &>/dev/null; then
|
|
27
|
+
powershell.exe -Command "
|
|
28
|
+
\$xml = @\"
|
|
29
|
+
<toast>
|
|
30
|
+
<visual>
|
|
31
|
+
<binding template=\"ToastText02\">
|
|
32
|
+
<text id=\"1\">${title}</text>
|
|
33
|
+
<text id=\"2\">${message}</text>
|
|
34
|
+
</binding>
|
|
35
|
+
</visual>
|
|
36
|
+
<audio src=\"ms-winsoundevent:Notification.Default\"/>
|
|
37
|
+
</toast>
|
|
38
|
+
\"@
|
|
39
|
+
|
|
40
|
+
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
|
|
41
|
+
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
|
|
42
|
+
|
|
43
|
+
\$template = New-Object Windows.Data.Xml.Dom.XmlDocument
|
|
44
|
+
\$template.LoadXml(\$xml)
|
|
45
|
+
\$toast = New-Object Windows.UI.Notifications.ToastNotification \$template
|
|
46
|
+
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Overdeck').Show(\$toast)
|
|
47
|
+
" 2>/dev/null && return 0
|
|
48
|
+
|
|
49
|
+
# Fallback: MessageBox
|
|
50
|
+
powershell.exe -Command "[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('${message}', '${title}', 'OK', 'Information')" 2>/dev/null &
|
|
51
|
+
return 0
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# macOS - use osascript
|
|
55
|
+
if command -v osascript &>/dev/null; then
|
|
56
|
+
osascript -e "display notification \"${message}\" with title \"${title}\"" 2>/dev/null
|
|
57
|
+
return 0
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
# Linux - use notify-send
|
|
61
|
+
if command -v notify-send &>/dev/null; then
|
|
62
|
+
notify-send "${title}" "${message}" 2>/dev/null
|
|
63
|
+
return 0
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# Fallback - just print to console
|
|
67
|
+
echo "[NOTIFICATION] ${title}: ${message}"
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# Build notification message
|
|
71
|
+
if [ -n "$MR_URL" ]; then
|
|
72
|
+
MESSAGE="${TITLE} - Ready for review"
|
|
73
|
+
else
|
|
74
|
+
MESSAGE="${TITLE} - Work complete"
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
send_notification "Overdeck: ${ISSUE_ID}" "$MESSAGE"
|
|
78
|
+
|
|
79
|
+
echo "Notification sent for ${ISSUE_ID}"
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# PAN-800 — shared library sourced by all Overdeck hook scripts.
|
|
2
|
+
#
|
|
3
|
+
# Provides:
|
|
4
|
+
# pan_resolve_agent_id — sets AGENT_ID, returns 1 if cannot attribute
|
|
5
|
+
# pan_emit_event — POST a heartbeat body; on failure buffer in pending-events.jsonl
|
|
6
|
+
#
|
|
7
|
+
# Hooks that emit runtime events go through pan_emit_event. No hook directly
|
|
8
|
+
# writes runtime.json — the SubscriptionRef inside AgentStateService is the
|
|
9
|
+
# source of truth (PAN-800).
|
|
10
|
+
#
|
|
11
|
+
# Shell: intended to be sourced, not executed. Exports no subprocesses; all
|
|
12
|
+
# helpers are plain bash functions.
|
|
13
|
+
|
|
14
|
+
PAN_DASHBOARD_URL="${OVERDECK_DASHBOARD_URL:-http://localhost:3011}"
|
|
15
|
+
PAN_CURL_TIMEOUT="${OVERDECK_HOOK_TIMEOUT:-0.5}"
|
|
16
|
+
|
|
17
|
+
# Internal token for authenticated HTTP ingestion (PAN-1596). The
|
|
18
|
+
# /api/agents/:id/heartbeat route is token-gated — without this header every
|
|
19
|
+
# hook POST gets 403 and is dropped on 4xx, so hook-emitted runtime activity
|
|
20
|
+
# (thinking/working/idle/waiting) never reaches the AgentStateService mirror.
|
|
21
|
+
# No launcher exports OVERDECK_INTERNAL_TOKEN, so source it from the on-disk
|
|
22
|
+
# token as the primary path. Empty token => same 403/drop as before (no
|
|
23
|
+
# regression).
|
|
24
|
+
PAN_INTERNAL_TOKEN="${OVERDECK_INTERNAL_TOKEN:-}"
|
|
25
|
+
if [ -z "$PAN_INTERNAL_TOKEN" ]; then
|
|
26
|
+
_pan_token_path="${OVERDECK_HOME:-$HOME/.overdeck}/internal-token"
|
|
27
|
+
[ -f "$_pan_token_path" ] && PAN_INTERNAL_TOKEN=$(cat "$_pan_token_path" 2>/dev/null || true)
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Resolve the current agent ID without a "main-cli" fallback (PAN-69).
|
|
31
|
+
# Returns 0 and sets AGENT_ID on success; returns 1 on failure so the caller
|
|
32
|
+
# can exit cleanly. We refuse to emit events that can't be authoritatively
|
|
33
|
+
# attributed — the whole point of HTTP ingestion is explicit identity.
|
|
34
|
+
pan_resolve_agent_id() {
|
|
35
|
+
if [ -n "$OVERDECK_AGENT_ID" ]; then
|
|
36
|
+
AGENT_ID="$OVERDECK_AGENT_ID"
|
|
37
|
+
elif [ -n "$TMUX" ]; then
|
|
38
|
+
AGENT_ID=$(tmux display-message -p '#S' 2>/dev/null)
|
|
39
|
+
else
|
|
40
|
+
return 1
|
|
41
|
+
fi
|
|
42
|
+
[ -z "$AGENT_ID" ] && return 1
|
|
43
|
+
# Scrub to the same character class the legacy hooks accepted.
|
|
44
|
+
AGENT_ID=$(printf '%s' "$AGENT_ID" | tr -cd 'A-Za-z0-9._-')
|
|
45
|
+
[ -z "$AGENT_ID" ] && return 1
|
|
46
|
+
return 0
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# Emit a runtime event body to the dashboard.
|
|
50
|
+
#
|
|
51
|
+
# Order of operations:
|
|
52
|
+
# 1. If pending-events.jsonl has buffered events from prior failures, drain
|
|
53
|
+
# them FIRST so server sequence numbers line up with wall-clock order.
|
|
54
|
+
# (Posting the new event first would give it a lower sequence than the
|
|
55
|
+
# older buffered events — the reducer would then pick the older event
|
|
56
|
+
# as the most recent snapshot, which is wrong.)
|
|
57
|
+
# 2. POST the new event.
|
|
58
|
+
# 3. If that POST fails, append it to the buffer.
|
|
59
|
+
#
|
|
60
|
+
# Args:
|
|
61
|
+
# $1 = agent id
|
|
62
|
+
# $2 = JSON body
|
|
63
|
+
pan_emit_event() {
|
|
64
|
+
local agent_id="$1"
|
|
65
|
+
local body="$2"
|
|
66
|
+
[ -z "$agent_id" ] || [ -z "$body" ] && return 0
|
|
67
|
+
|
|
68
|
+
local dir="$HOME/.overdeck/agents/$agent_id"
|
|
69
|
+
mkdir -p "$dir" 2>/dev/null || return 0
|
|
70
|
+
|
|
71
|
+
local url="$PAN_DASHBOARD_URL/api/agents/$agent_id/heartbeat"
|
|
72
|
+
local pending="$dir/pending-events.jsonl"
|
|
73
|
+
local lockfile="$dir/pending.lock"
|
|
74
|
+
|
|
75
|
+
# Drain any previously-buffered events before emitting the new one.
|
|
76
|
+
if [ -s "$pending" ]; then
|
|
77
|
+
pan__drain_pending "$agent_id" "$url" "$pending" "$lockfile"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
local http_code
|
|
81
|
+
http_code=$(curl -s -m "$PAN_CURL_TIMEOUT" -o /dev/null -w '%{http_code}' \
|
|
82
|
+
-X POST "$url" -H 'Content-Type: application/json' \
|
|
83
|
+
-H "x-overdeck-internal-token: $PAN_INTERNAL_TOKEN" --data "$body" 2>/dev/null || echo '000')
|
|
84
|
+
|
|
85
|
+
if [[ "$http_code" =~ ^2 ]]; then
|
|
86
|
+
return 0
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# Drop on 4xx — server told us this body is invalid.
|
|
90
|
+
if [[ "$http_code" =~ ^4 ]]; then
|
|
91
|
+
return 0
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Network failure / 5xx — buffer with flock.
|
|
95
|
+
{
|
|
96
|
+
flock -x -w 5 200 || return 0
|
|
97
|
+
printf '%s\n' "$body" >> "$pending" 2>/dev/null || true
|
|
98
|
+
} 200>"$lockfile"
|
|
99
|
+
return 0
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# Drain pending-events.jsonl one line at a time. Each line is POSTed with the
|
|
103
|
+
# same timeout; failures put the remaining lines (including the failed one)
|
|
104
|
+
# back into the file so we try again next time the dashboard is up.
|
|
105
|
+
#
|
|
106
|
+
# Internal — do not call directly.
|
|
107
|
+
pan__drain_pending() {
|
|
108
|
+
local agent_id="$1"
|
|
109
|
+
local url="$2"
|
|
110
|
+
local pending="$3"
|
|
111
|
+
local lockfile="$4"
|
|
112
|
+
|
|
113
|
+
{
|
|
114
|
+
flock -x -w 5 200 || return 0
|
|
115
|
+
# Re-check size after acquiring the lock — a concurrent hook may have
|
|
116
|
+
# already drained the file.
|
|
117
|
+
[ ! -s "$pending" ] && return 0
|
|
118
|
+
|
|
119
|
+
local tempfile="$pending.draining.$$"
|
|
120
|
+
mv "$pending" "$tempfile" 2>/dev/null || return 0
|
|
121
|
+
|
|
122
|
+
local failed="$pending.failed.$$"
|
|
123
|
+
: > "$failed"
|
|
124
|
+
local stop_on_failure=0
|
|
125
|
+
while IFS= read -r line; do
|
|
126
|
+
[ -z "$line" ] && continue
|
|
127
|
+
if [ "$stop_on_failure" = "1" ]; then
|
|
128
|
+
printf '%s\n' "$line" >> "$failed"
|
|
129
|
+
continue
|
|
130
|
+
fi
|
|
131
|
+
local code
|
|
132
|
+
code=$(curl -s -m "$PAN_CURL_TIMEOUT" -o /dev/null -w '%{http_code}' \
|
|
133
|
+
-X POST "$url" -H 'Content-Type: application/json' \
|
|
134
|
+
-H "x-overdeck-internal-token: $PAN_INTERNAL_TOKEN" --data "$line" 2>/dev/null || echo '000')
|
|
135
|
+
if [[ "$code" =~ ^2 ]]; then
|
|
136
|
+
: # drained successfully
|
|
137
|
+
elif [[ "$code" =~ ^4 ]]; then
|
|
138
|
+
: # server-side rejection — drop
|
|
139
|
+
else
|
|
140
|
+
# Network failure — put this and the rest back, stop draining.
|
|
141
|
+
printf '%s\n' "$line" >> "$failed"
|
|
142
|
+
stop_on_failure=1
|
|
143
|
+
fi
|
|
144
|
+
done < "$tempfile"
|
|
145
|
+
|
|
146
|
+
if [ -s "$failed" ]; then
|
|
147
|
+
mv "$failed" "$pending" 2>/dev/null || true
|
|
148
|
+
else
|
|
149
|
+
rm -f "$failed" 2>/dev/null || true
|
|
150
|
+
fi
|
|
151
|
+
rm -f "$tempfile" 2>/dev/null || true
|
|
152
|
+
} 200>"$lockfile"
|
|
153
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/permission-event-hook
|
|
3
|
+
#
|
|
4
|
+
# Fires on Claude Code PermissionRequest, PostToolUse, and Stop hooks.
|
|
5
|
+
# POSTs the raw payload (stdin) to the dashboard's /api/hooks/permission-event
|
|
6
|
+
# endpoint so the dashboard can show/clear a "waiting for permission" indicator.
|
|
7
|
+
#
|
|
8
|
+
# Works for both conversation sessions (looked up by session_id) and agent
|
|
9
|
+
# sessions — the dashboard server handles routing internally.
|
|
10
|
+
|
|
11
|
+
set +e
|
|
12
|
+
|
|
13
|
+
PAN_DASHBOARD_URL="${OVERDECK_DASHBOARD_URL:-http://localhost:3011}"
|
|
14
|
+
PAYLOAD=$(cat 2>/dev/null || echo '{}')
|
|
15
|
+
|
|
16
|
+
curl -sf \
|
|
17
|
+
--max-time 1 \
|
|
18
|
+
-X POST \
|
|
19
|
+
-H "Content-Type: application/json" \
|
|
20
|
+
-d "$PAYLOAD" \
|
|
21
|
+
"${PAN_DASHBOARD_URL}/api/hooks/permission-event" \
|
|
22
|
+
>/dev/null 2>&1 || true
|
|
23
|
+
|
|
24
|
+
exit 0
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/post-compact-hook
|
|
3
|
+
#
|
|
4
|
+
# Fires on Claude Code PostCompact. Emits agent.activity_changed(idle) to clear
|
|
5
|
+
# the compacting indicator and return the agent to normal idle state.
|
|
6
|
+
|
|
7
|
+
set +e
|
|
8
|
+
|
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
10
|
+
# shellcheck source=pan-hook-lib.sh
|
|
11
|
+
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || exit 0
|
|
12
|
+
|
|
13
|
+
pan_resolve_agent_id || exit 0
|
|
14
|
+
|
|
15
|
+
TS=$(date -Iseconds)
|
|
16
|
+
|
|
17
|
+
if command -v jq >/dev/null 2>&1; then
|
|
18
|
+
BODY=$(jq -n --arg ts "$TS" \
|
|
19
|
+
'{kind: "activity", activity: "idle", timestamp: $ts}')
|
|
20
|
+
else
|
|
21
|
+
BODY="{\"kind\":\"activity\",\"activity\":\"idle\",\"timestamp\":\"$TS\"}"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
pan_emit_event "$AGENT_ID" "$BODY"
|
|
25
|
+
exit 0
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/pre-compact-hook
|
|
3
|
+
#
|
|
4
|
+
# Fires on Claude Code PreCompact. Emits agent.activity_changed(working, tool=compact)
|
|
5
|
+
# so the dashboard shows a "compacting" indicator while context is being summarised.
|
|
6
|
+
# PostCompact hook clears this back to idle.
|
|
7
|
+
|
|
8
|
+
set +e
|
|
9
|
+
|
|
10
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
11
|
+
# shellcheck source=pan-hook-lib.sh
|
|
12
|
+
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || exit 0
|
|
13
|
+
|
|
14
|
+
pan_resolve_agent_id || exit 0
|
|
15
|
+
|
|
16
|
+
TS=$(date -Iseconds)
|
|
17
|
+
|
|
18
|
+
if command -v jq >/dev/null 2>&1; then
|
|
19
|
+
BODY=$(jq -n --arg ts "$TS" \
|
|
20
|
+
'{kind: "activity", activity: "working", tool: "compact", timestamp: $ts}')
|
|
21
|
+
else
|
|
22
|
+
BODY="{\"kind\":\"activity\",\"activity\":\"working\",\"tool\":\"compact\",\"timestamp\":\"$TS\"}"
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
pan_emit_event "$AGENT_ID" "$BODY"
|
|
26
|
+
exit 0
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ~/.overdeck/bin/pre-tool-hook (PAN-800)
|
|
3
|
+
#
|
|
4
|
+
# Fires on Claude Code PreToolUse. POSTs agent.activity_changed(working, tool)
|
|
5
|
+
# to the dashboard. No runtime.json writes — AgentStateService's
|
|
6
|
+
# SubscriptionRef is the source of truth now.
|
|
7
|
+
#
|
|
8
|
+
# Never blocks Claude Code: strict timeout, silent failure, pending-events
|
|
9
|
+
# buffering via pan-hook-lib.
|
|
10
|
+
|
|
11
|
+
set +e
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
14
|
+
# shellcheck source=pan-hook-lib.sh
|
|
15
|
+
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || exit 0
|
|
16
|
+
|
|
17
|
+
pan_resolve_agent_id || exit 0
|
|
18
|
+
|
|
19
|
+
TOOL_INFO=$(cat 2>/dev/null || echo '{}')
|
|
20
|
+
TOOL_NAME="unknown"
|
|
21
|
+
if command -v jq >/dev/null 2>&1; then
|
|
22
|
+
TOOL_NAME=$(echo "$TOOL_INFO" | jq -r '.tool_name // "unknown"' 2>/dev/null || echo "unknown")
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
TS=$(date -Iseconds)
|
|
26
|
+
# jq -n produces correctly-escaped JSON even if TOOL_NAME contains quotes.
|
|
27
|
+
if command -v jq >/dev/null 2>&1; then
|
|
28
|
+
BODY=$(jq -n --arg tool "$TOOL_NAME" --arg ts "$TS" \
|
|
29
|
+
'{kind: "activity", activity: "working", tool: $tool, timestamp: $ts}')
|
|
30
|
+
else
|
|
31
|
+
BODY="{\"kind\":\"activity\",\"activity\":\"working\",\"tool\":\"$TOOL_NAME\",\"timestamp\":\"$TS\"}"
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
pan_emit_event "$AGENT_ID" "$BODY"
|
|
35
|
+
exit 0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|