@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.
Files changed (355) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +33 -0
  2. package/package.json +7 -2
  3. package/server/{acceptance-criteria-1LHgD9vg.js → acceptance-criteria-DHZk2ceV.js} +2 -2
  4. package/server/{advancing-selfheal-BqsLWqEM.js → advancing-selfheal-CSuZ31bB.js} +5 -5
  5. package/server/{agent-gc-CUb52n7s.js → agent-gc-D_DxfBHR.js} +3 -3
  6. package/server/{agent-state-D-moNwhA.js → agent-state-EP2QFV9n.js} +1 -1
  7. package/server/{agent-state-service-BzESvLOf.js → agent-state-service-BZkvgQf4.js} +5 -5
  8. package/server/{agent-state-service-BaZH7sXJ.js → agent-state-service-C_2ZAQRP.js} +1 -1
  9. package/server/{agents-B5LfpLPv.js → agents-CsOzAmRg.js} +145 -78
  10. package/server/{agents-C4kZ8a2r.js → agents-DCvyTXNU.js} +1 -1
  11. package/server/{archive-planning-BbZe-8IK.js → archive-planning-CTILQRnV.js} +1 -1
  12. package/server/{archive-planning-oX1pj6nY.js → archive-planning-DkivCk1A.js} +4 -4
  13. package/server/{artifact-index-jobs-DGr6bxev.js → artifact-index-jobs-CmsvQ1ey.js} +2 -2
  14. package/server/auto-commit-QAfsu3Sb.js +3 -0
  15. package/server/{backlog-auto-trigger-BlJHikOm.js → backlog-auto-trigger-ueRaT8Dy.js} +2 -2
  16. package/server/{bd-process-lock-i3CYMS-B.js → bd-process-lock-D3S4T4o-.js} +32 -11
  17. package/server/{beads-DD7fYCl5.js → beads-BGGxrkZ5.js} +96 -196
  18. package/server/{beads-BNU-fb48.js → beads-CYsLiyIM.js} +1 -1
  19. package/server/{beads-query-e6oku4P5.js → beads-query-B1DlJVp9.js} +24 -99
  20. package/server/beads-restore-CyygSmmn.js +23 -0
  21. package/server/{behavior-CPf0pbOt.js → behavior-Cpj03N4v.js} +3 -3
  22. package/server/{briefing-freshness-B2FdLwIv.js → briefing-freshness-Kh5V8RTh.js} +4 -4
  23. package/server/{checkpoint-manager-eFgaMMu4.js → checkpoint-manager-CAFos8e1.js} +1 -1
  24. package/server/{checkpoint-manager-JryW6MpM.js → checkpoint-manager-fu9oVsR-.js} +2 -2
  25. package/server/checkpoint-worker.js +1 -1
  26. package/server/{checkpoints-qvOqvMuC.js → checkpoints-1BqOlS4q.js} +2 -2
  27. package/server/{checkpoints-BK17oicz.js → checkpoints-DvhGi8P_.js} +1 -1
  28. package/server/claude-hooks-provision-s_wdpeVj.js +360 -0
  29. package/server/{claude-permissions-B6bWGh9d.js → claude-permissions-CaWqysff.js} +2 -2
  30. package/server/{claude-settings-overlay-BPdhTPjo.js → claude-settings-overlay-BbA4FbVI.js} +1 -1
  31. package/server/{claude-settings-overlay-CRyyKKXQ.js → claude-settings-overlay-CcTf0xzG.js} +2 -2
  32. package/server/{cli-B75AieAM.js → cli-BwCvCUBK.js} +9 -9
  33. package/server/cli-ClIQwgMI.js +3 -0
  34. package/server/{cliproxy-CCzwuSNe.js → cliproxy-BsoNNDAj.js} +2 -2
  35. package/server/{cliproxy-DOQf66G9.js → cliproxy-C2xC-3vH.js} +1 -1
  36. package/server/{close-issue-_X3MXJyG.js → close-issue-BleIwP3f.js} +5 -5
  37. package/server/{closed-issue-reaper-CLR7ClsO.js → closed-issue-reaper-BwUUvjEW.js} +1 -1
  38. package/server/{closed-issue-reaper-BsUfBSjM.js → closed-issue-reaper-mC5pujeb.js} +102 -30
  39. package/server/{codex-CY-QRuU9.js → codex-B7DTpwEw.js} +1 -1
  40. package/server/{codex-B4KEpX5V.js → codex-DW60_5j2.js} +5 -5
  41. package/server/{compact-beads-cZds2MTr.js → compact-beads-CK_hHEnB.js} +1 -1
  42. package/server/{compact-beads-uEDccC76.js → compact-beads-DKL54y6j.js} +15 -8
  43. package/server/{config-DARrpYWA.js → config-BRNQJXhA.js} +1 -1
  44. package/server/{config-8sjaU6jZ.js → config-ZNnMpIlh.js} +2 -2
  45. package/server/{config-yaml-ClpGgrf6.js → config-yaml-Dcz-8uit.js} +29 -3
  46. package/server/{conflict-gate-Ds9_2yjd.js → conflict-gate-DGT8jCLp.js} +1 -1
  47. package/server/{conflict-gate-BtB_o-Vi.js → conflict-gate-DTje2Ll7.js} +3 -3
  48. package/server/{context-layers-r2ywnQYA.js → context-layers-BdUCQ-cl.js} +3 -3
  49. package/server/{context-layers-CRCk1QG7.js → context-layers-ByOWUjUg.js} +2 -2
  50. package/server/{control-settings-D1B3u6HP.js → control-settings-DwkAeooY.js} +4 -4
  51. package/server/{conversation-compaction-D86Zo2Ci.js → conversation-compaction-OTYgd6eg.js} +8 -8
  52. package/server/{conversation-compaction-CZRVk4hg.js → conversation-compaction-WYQZUVDm.js} +1 -1
  53. package/server/{conversation-service-CuTVU8dV.js → conversation-service-BR1OgvxO.js} +5 -5
  54. package/server/{conversation-service-CkL-6MuG.js → conversation-service-C_kNZPLx.js} +1 -1
  55. package/server/{conversations-DfJKBDwB.js → conversations-DG2M8WnT.js} +4 -4
  56. package/server/{conversations-BmWEluPL.js → conversations-izHvSoAR.js} +1 -1
  57. package/server/{cost-DAPYN6iA.js → cost-B2mj17iG.js} +3 -3
  58. package/server/{cost-CCnqa5xK.js → cost-DQ2ajr_m.js} +2 -2
  59. package/server/{cost-sync-BDL10Nwu.js → cost-sync-gTayEuWP.js} +3 -3
  60. package/server/{dag-Dv2r5bVD.js → dag-CqTehWpY.js} +3 -3
  61. package/server/{dangerous-git-ops-Dcw7PbYo.js → dangerous-git-ops-DDWQlPC3.js} +1 -1
  62. package/server/dashboard-db-worker.js +6 -6
  63. package/server/{deacon-DYnZH7kC.js → deacon-BqW9HMew.js} +3 -3
  64. package/server/{deacon-CM0MxbS8.js → deacon-DrKDBeJL.js} +161 -1594
  65. package/server/{deacon-nudge-log-B-naf89q.js → deacon-nudge-log-D1wEK6zF.js} +1 -1
  66. package/server/deacon-swarm-BY5hKNaU.js +2 -0
  67. package/server/{deacon-swarm-BstYoz8Q.js → deacon-swarm-CO_A7xyd.js} +12 -105
  68. package/server/deacon.js +7 -7
  69. package/server/{devcontainer-renderer-CaYOG9JN.js → devcontainer-renderer-BQolp_qZ.js} +3 -3
  70. package/server/{dist-BIC8spJ0.js → dist-Bc32rWJB.js} +1 -1
  71. package/server/dist-DGTwcZhI.js +3 -0
  72. package/server/{docker-DDI1shu3.js → docker-s-esqZ__.js} +67 -28
  73. package/server/{ensure-devcontainer-DCAg3ksz.js → ensure-devcontainer-DA4-jF6R.js} +4 -4
  74. package/server/{ensure-devcontainer-CbSXvN9W.js → ensure-devcontainer-pUVaT0h3.js} +1 -1
  75. package/server/{esm-shims-DiV9jHa_.js → esm-shims-CJHy8CZY.js} +1 -1
  76. package/server/{event-store-DU3HkZlN.js → event-store-CcJAhKCl.js} +1 -1
  77. package/server/{event-store-DCMqyI07.js → event-store-DRte2Rwt.js} +3 -3
  78. package/server/{events-BfiosVAn.js → events-Bej1w_k8.js} +3 -3
  79. package/server/{events-DLRxpSuV.js → events-CtsLScn8.js} +1 -1
  80. package/server/export-Dx_qJ3h8.js +87 -0
  81. package/server/{factory-BMtWV9iv.js → factory-FN727tWr.js} +4 -4
  82. package/server/{feature-registry-population-DA7bO6Zn.js → feature-registry-population-ie-yBcQC.js} +4 -4
  83. package/server/{feature-registry-storage-nAY1fbBt.js → feature-registry-storage-CkZTFSsn.js} +2 -2
  84. package/server/{features-DMu7eGmU.js → features-Dtm9ABuz.js} +2 -2
  85. package/server/{feedback-target-DHqcw3cN.js → feedback-target-BYtpyt1i.js} +6 -6
  86. package/server/{feedback-target-B2SEai8-.js → feedback-target-DVJQDiE4.js} +1 -1
  87. package/server/{feedback-writer-DMBdS_jL.js → feedback-writer-DOUhyIW2.js} +1 -1
  88. package/server/{feedback-writer-qvm7UON7.js → feedback-writer-fdE1BzeL.js} +4 -4
  89. package/server/{flywheel-k4FPtCQ_.js → flywheel-Bi82iiNl.js} +1 -1
  90. package/server/{flywheel-Dfpx4bIV.js → flywheel-Bv3wv2S6.js} +23 -15
  91. package/server/{flywheel-D2LdPSic.js → flywheel-CUErLAyN.js} +13 -13
  92. package/server/{flywheel-merge-order-CB4lbXeJ.js → flywheel-merge-order-BaEN3iyN.js} +7 -7
  93. package/server/{flywheel-merge-order-CttTazRY.js → flywheel-merge-order-DXjeBnJ1.js} +1 -1
  94. package/server/{forge-CoPFXFyl.js → forge-ButEdJ31.js} +2 -2
  95. package/server/forge-XlDgPQWs.js +2 -0
  96. package/server/{from-B0YoJl9-.js → from-CbtTxftl.js} +1 -1
  97. package/server/{fts-db-DAHW1yA_.js → fts-db-CBgBLZcL.js} +2 -2
  98. package/server/{fts-operations-DDXDBi0d.js → fts-operations-CI9Xuo_1.js} +2 -2
  99. package/server/{git-utils-DbfC0zls.js → git-utils-BCLRWQ-y.js} +1 -1
  100. package/server/{git-utils-B90Zjzfl.js → git-utils-ClfpP47N.js} +2 -2
  101. package/server/{github-app-C7lftMNj.js → github-app-DRD2woO0.js} +1 -1
  102. package/server/{github-app-BecAnXRX.js → github-app-DscZ0_B6.js} +2 -2
  103. package/server/{github-client-D21rCIXk.js → github-client-DpiZnxGH.js} +2 -2
  104. package/server/{github-client-BwtKZtM0.js → github-client-iFRw8f7e.js} +1 -1
  105. package/server/{github-pr-lookup-CzVWuysl.js → github-pr-lookup-D-EBexxC.js} +2 -2
  106. package/server/{harness-resolve-SkRJm4a7.js → harness-resolve-iMjyNUJ2.js} +3 -3
  107. package/server/{health-events-DA_JLpgZ.js → health-events-B_WsQyYm.js} +1 -1
  108. package/server/{health-events-BT0aAfeA.js → health-events-CRdxDFN2.js} +2 -2
  109. package/server/{hooks-BQxRXtRb.js → hooks-C1ScyVxP.js} +1 -1
  110. package/server/{hooks-DxEn2BoY.js → hooks-C9b7Vqpw.js} +2 -2
  111. package/server/hume-K1pi8jC4.js +3 -0
  112. package/server/{hume-DkVOs1Qi.js → hume-TQ5pvOZ_.js} +2 -2
  113. package/server/{idle-stack-reaper-DGy7tvC9.js → idle-stack-reaper-B1kG7B_X.js} +2 -2
  114. package/server/{idle-stack-reaper-C7fJL8jH.js → idle-stack-reaper-iFVOAoJy.js} +1 -1
  115. package/server/{infra-DE3C4PMr.js → infra-bpq1MHKU.js} +50 -3
  116. package/server/{injection-Dt22tGvS.js → injection-BLWfwTVZ.js} +1 -1
  117. package/server/{injection-Cc4Qt8LZ.js → injection-DJqWld1v.js} +7 -7
  118. package/server/inspect-agent-477VxQim.js +2 -0
  119. package/server/{inspect-agent-DOaCDkCF.js → inspect-agent-DytCsltn.js} +9 -9
  120. package/server/{internal-token-nobT6FhA.js → internal-token-CCaWaTwE.js} +1 -1
  121. package/server/{internal-token-B_1YLWLI.js → internal-token-CjlhdufS.js} +2 -2
  122. package/server/{io-A7ZuOBkz.js → io-BiQ2Cs3k.js} +2 -2
  123. package/server/{issue-closed-Da3DeomA.js → issue-closed-FApNiOOs.js} +4 -4
  124. package/server/{issue-lifecycle-Bd9XBJAQ.js → issue-lifecycle-BkFWNjlD.js} +1 -1
  125. package/server/{issue-lifecycle-543pQX9D.js → issue-lifecycle-C-K53ASY.js} +21 -21
  126. package/server/{issue-service-singleton-Brc3t0SV.js → issue-service-singleton-CuHGpJJP.js} +8 -8
  127. package/server/{issue-service-singleton-BC2JLZi7.js → issue-service-singleton-bG1WdSdQ.js} +1 -1
  128. package/server/{issues-D3kt9UWE.js → issues-CwQMphDH.js} +2 -2
  129. package/server/jsonl-parser-dNIjHgym.js +245 -0
  130. package/server/{label-cleanup-w9X_T3AQ.js → label-cleanup-DYvAZknd.js} +3 -3
  131. package/server/{layers-Cwe1J-9o.js → layers-CD6FysRU.js} +2 -2
  132. package/server/{lifecycle-f1GbDK33.js → lifecycle-C_73gi-C.js} +7 -7
  133. package/server/{lifecycle-io-D56q8zlO.js → lifecycle-io-C_Wu0_i-.js} +1 -1
  134. package/server/{lifecycle-io-Bqvj0m3i.js → lifecycle-io-CeYxP3cE.js} +4 -4
  135. package/server/{linear-client-Bh4T4S-c.js → linear-client-4qoKnuQu.js} +1 -1
  136. package/server/{linear-client-CfJMTAYd.js → linear-client-EtVyblVz.js} +2 -2
  137. package/server/memory-fts-worker.js +1 -1
  138. package/server/{merge-ZrXFM3jv.js → merge-7rqkTUm2.js} +3 -3
  139. package/server/merge-agent-36wfYm2u.js +3 -0
  140. package/server/{merge-agent-CHHs5S_0.js → merge-agent-4Zhlgvqp.js} +62 -27
  141. package/server/{merge-batch-BwhGdlh4.js → merge-batch-itfnwdsT.js} +1 -1
  142. package/server/{merge-blockers-BMhDpMl_.js → merge-blockers-Bto_Oe_o.js} +2 -2
  143. package/server/{merge-DRMPa8CQ.js → merge-brm721Es.js} +1 -1
  144. package/server/merge-ops-PzqsW69V.js +2 -0
  145. package/server/{merge-rebase-R7MfqpiE.js → merge-rebase-Czfqfe4q.js} +2 -2
  146. package/server/{merge-set-B3Breacq.js → merge-set-BIkGQL9j.js} +9 -5
  147. package/server/{merge-set-D-iXNP0I.js → merge-set-G1RHcu3D.js} +1 -1
  148. package/server/{merge-sync-DHWbGtjR.js → merge-sync-B43Dybea.js} +2 -2
  149. package/server/{merge-sync-bOOtfeXR.js → merge-sync-DIrmlZUr.js} +1 -1
  150. package/server/{merge-train-98ptZrPT.js → merge-train-DGqVuNZV.js} +3 -3
  151. package/server/{merge-train-deps-B5FWJTE2.js → merge-train-deps-q15XLnAS.js} +4 -4
  152. package/server/{merge-verification-BGiuiXAK.js → merge-verification-Cqfxx6bE.js} +4 -4
  153. package/server/{multipart-parser-D7mzNNDm.js → multipart-parser-CiPxxfUH.js} +2 -2
  154. package/server/node_modules/.package-lock.json +1 -1
  155. package/server/{orphan-proposed-reconciler-BSGCNJ6X.js → orphan-proposed-reconciler-BWWHn4Lr.js} +15 -39
  156. package/server/{orphan-proposed-reconciler-CSuxivr9.js → orphan-proposed-reconciler-DAD9FJtQ.js} +1 -1
  157. package/server/package-lock.json +2 -2
  158. package/server/package.json +1 -1
  159. package/server/{pan-dir-DoPtdHrp.js → pan-dir-Bj7Hy8iu.js} +3 -3
  160. package/server/{paths-CVDLPxXp.js → paths-C9DkhIOT.js} +2 -2
  161. package/server/{pickup-KLRUhThD.js → pickup-CKRuGDsB.js} +1 -1
  162. package/server/{pipeline-notifier-BtYHbBPl.js → pipeline-notifier-BkKbQ8ji.js} +1 -1
  163. package/server/{pipeline-notifier-WD2dnOsR.js → pipeline-notifier-CAurUste.js} +2 -2
  164. package/server/project-pipelines-BRWaGmI4.js +162 -0
  165. package/server/projects-KJ94e50I.js +3 -0
  166. package/server/{prompts-Cg7e9FPb.js → prompts-DfI5qbTW.js} +2 -2
  167. package/server/{providers-fLduChnX.js → providers-CWDXoaMA.js} +7 -7
  168. package/server/providers-D-5txBRc.js +3 -0
  169. package/server/public/assets/{chunk-BO2N2NFS-aNlsGDCu.js → chunk-BO2N2NFS-ClukPsZQ.js} +4 -4
  170. package/server/public/assets/{diagram-OG6HWLK6-CnjkrvT8.js → diagram-OG6HWLK6-Avtvq2qI.js} +1 -1
  171. package/server/public/assets/{dist-Bg3Sbsx4.js → dist-BEHQuasD.js} +3 -3
  172. package/server/public/assets/{dist-CGKBCieA.js → dist-BvmY-qb1.js} +1 -1
  173. package/server/public/assets/{ganttDiagram-6RSMTGT7-C8LLKj23.js → ganttDiagram-6RSMTGT7-7KhCd0fH.js} +1 -1
  174. package/server/public/assets/{highlighted-body-OFNGDK62-BSDEUvhW.js → highlighted-body-OFNGDK62-iQoBMTf0.js} +1 -1
  175. package/server/public/assets/index-DUFDmvmH.css +1 -0
  176. package/server/public/assets/index-DnTZ2QeN.js +796 -0
  177. package/server/public/assets/{linear-DEbYZoxg.js → linear-CiJHW9g5.js} +1 -1
  178. package/server/public/assets/mermaid-GHXKKRXX-DZJOwgBG.js +1 -0
  179. package/server/public/assets/{pieDiagram-4H26LBE5-BtZL5pXE.js → pieDiagram-4H26LBE5-BOhmvUhW.js} +1 -1
  180. package/server/public/assets/{prod-DYVvIyuh.js → prod-DmLBBqat.js} +4 -4
  181. package/server/public/assets/{quadrantDiagram-W4KKPZXB-a7vS8Jc8.js → quadrantDiagram-W4KKPZXB-Cjku660G.js} +1 -1
  182. package/server/public/assets/{sankeyDiagram-5OEKKPKP-Ckbq2SWH.js → sankeyDiagram-5OEKKPKP-D52w5oPh.js} +1 -1
  183. package/server/public/assets/{xychartDiagram-2RQKCTM6-DJyeNa99.js → xychartDiagram-2RQKCTM6-BTO07_Iv.js} +1 -1
  184. package/server/public/index.html +2 -2
  185. package/server/{pull-requests-1WXmTBlo.js → pull-requests-Bmre-Xlz.js} +3 -3
  186. package/server/{pull-requests-D2SjJIwY.js → pull-requests-CKZPWhjD.js} +1 -1
  187. package/server/{rally-8aQlLLVj.js → rally-BBd9tQ__.js} +3 -3
  188. package/server/rally-Dc2Wnxw2.js +3 -0
  189. package/server/{rally-api-BtvwdX6d.js → rally-api-DDc85HIz.js} +1 -1
  190. package/server/{rally-api-H5I2CBO0.js → rally-api-DxZFObI_.js} +2 -2
  191. package/server/{rally-client-Bt-qHiOh.js → rally-client-BADHn0m_.js} +1 -1
  192. package/server/{rally-client-33CYZYYu.js → rally-client-DvvLiAQP.js} +4 -4
  193. package/server/{reap-terminal-sessions-CAmURC2h.js → reap-terminal-sessions-D6JDJsqF.js} +1 -1
  194. package/server/{reap-terminal-sessions-BwJb2DLJ.js → reap-terminal-sessions-D_xvy-Mk.js} +1 -1
  195. package/server/{rebuild-stack-KHkkrGjx.js → rebuild-stack-D19i080j.js} +6 -6
  196. package/server/{rebuild-stack-CXSgAGPR.js → rebuild-stack-GOsWqXi3.js} +1 -1
  197. package/server/{reconstruct-cache-D_Ml65_6.js → reconstruct-cache-lQrG4xGg.js} +6 -6
  198. package/server/record-pyB6VA32.js +3 -0
  199. package/server/recovery-trip-Dfh1tNHn.js +98 -0
  200. package/server/release-engine-DxcMWRuK.js +306 -0
  201. package/server/release-set-BYsgX7o6.js +125 -0
  202. package/server/{remote-CGuognN3.js → remote-8W2Yhygw.js} +3 -3
  203. package/server/{remote-D0Old0Cv.js → remote-DmeL21dF.js} +3 -3
  204. package/server/{remote-agents-DfhMq6kQ.js → remote-agents-BfQBE6MN.js} +5 -5
  205. package/server/{remote-agents-UHoi4oGr.js → remote-agents-DlvbzO7m.js} +1 -1
  206. package/server/{remote-completion-RZYePR_0.js → remote-completion-BgkiSQmx.js} +12 -12
  207. package/server/resolver-dTpSSzaH.js +158 -0
  208. package/server/resume-DhcIqsTm.js +3 -0
  209. package/server/{review-agent-sZBCpEVv.js → review-agent-D025Wt7w.js} +22 -22
  210. package/server/{review-agent-uwVftH98.js → review-agent-Rub0OpZc.js} +1 -1
  211. package/server/{review-artifacts-C7a45b1_.js → review-artifacts-CX951jTU.js} +6 -6
  212. package/server/{review-context-CErbQpKL.js → review-context-DGGGR_w5.js} +7 -7
  213. package/server/{review-monitor-DHD9m_kh.js → review-monitor-0_qqMcnS.js} +2 -2
  214. package/server/{review-status-gPndPUBc.js → review-status-4qqLkRMu.js} +24 -17
  215. package/server/{review-status-JhQ3qlDS.js → review-status-Br6lAFGO.js} +1 -1
  216. package/server/{review-status-enrichment-qWvWckYN.js → review-status-enrichment-Cr8m3uVL.js} +3 -3
  217. package/server/{review-status-sync-B_GrEke8.js → review-status-sync-D3KUhsdA.js} +1 -1
  218. package/server/{review-status-sync-D3A9KX95.js → review-status-sync-OC-l1lNt.js} +9 -5
  219. package/server/{review-verdict-feedback-4WZ5ZdbC.js → review-verdict-feedback-DrWMuRaj.js} +6 -6
  220. package/server/{review-verdict-feedback-Zo0r_z4m.js → review-verdict-feedback-YOzmsq9G.js} +1 -1
  221. package/server/{rollup-BrUIKMv_.js → rollup-CnxbwaLH.js} +8 -8
  222. package/server/{rollup-Bmhn80tB.js → rollup-DmazRY0j.js} +1 -1
  223. package/server/{scanner-BIGumel_.js → scanner-DE1MqAaF.js} +7 -7
  224. package/server/{sequence-io-DA0akEQN.js → sequence-io-C0uoqfGx.js} +4 -4
  225. package/server/{sequencer-agent-DeflKafB.js → sequencer-agent-i-b2u4SJ.js} +10 -6
  226. package/server/server.js +1115 -297
  227. package/server/{service-V0sUK-OR.js → service-D0_gh2tl.js} +1668 -1408
  228. package/server/{session-fork-Yx3UcAQf.js → session-fork-DZ12vipL.js} +2 -2
  229. package/server/{settings-CFEeQRj2.js → settings-ByqjPtFO.js} +2 -2
  230. package/server/{settings-CxVate0h.js → settings-DCC4BAqj.js} +3 -3
  231. package/server/settings-yydgaqhv.js +2 -0
  232. package/server/{shadow-engineering-BRxnVSDk.js → shadow-engineering-BhnmtW5m.js} +2 -2
  233. package/server/{shadow-state-1aS8FijU.js → shadow-state-ByXZehsy.js} +1 -1
  234. package/server/{shadow-state-BiMwdyl1.js → shadow-state-CKm8xWX9.js} +2 -2
  235. package/server/{ship-log-CMWH3H5-.js → ship-log-DE_0Cv_i.js} +1 -1
  236. package/server/{smart-compaction-Bw1K_Sbl.js → smart-compaction-D5Zen3AA.js} +7 -7
  237. package/server/{smart-compaction-xblMyVpT.js → smart-compaction-h4_ca6Uk.js} +1 -1
  238. package/server/{spawn-planning-session-CzDFSKAQ.js → spawn-planning-session-Bgi7Ub02.js} +1 -1
  239. package/server/{spawn-planning-session-DxLxcM7m.js → spawn-planning-session-Dueit4WX.js} +15 -15
  240. package/server/{specialist-completion-BiEXUHfD.js → specialist-completion-BZ8M-WZ0.js} +1 -1
  241. package/server/{specialist-context-BfkTA81h.js → specialist-context-BMq83C58.js} +5 -5
  242. package/server/{specialist-handoff-logger-BiKuLtNm.js → specialist-handoff-logger-BxX1YefH.js} +2 -2
  243. package/server/{specialist-logs-CFJjGsLC.js → specialist-logs-BWZYcJ6P.js} +3 -3
  244. package/server/{specialists-DdvpFNt1.js → specialists-8ZAguXef.js} +1 -1
  245. package/server/{specialists-B4byf18k.js → specialists-BudKrjOu.js} +76 -76
  246. package/server/{specialists-DjHbwQ_p.js → specialists-DrPrC9Y9.js} +20 -256
  247. package/server/{specialists-BLIreoE7.js → specialists-ZkW4Mb7U.js} +1 -1
  248. package/server/specs-DwoAEGrW.js +3 -0
  249. package/server/{src-fgbU-jJ-.js → src-DHn4Rd2F.js} +25 -3
  250. package/server/{src-mK_M_ZIj.js → src-DNUUqkec.js} +6 -6
  251. package/server/{src-CALBEUMX.js → src-Dv6L03vW.js} +3 -3
  252. package/server/{stack-health-BFM8YlHw.js → stack-health-Dclm7_tu.js} +1 -1
  253. package/server/{stack-health-Qd7rPiVe.js → stack-health-DxsTx7II.js} +2 -2
  254. package/server/{state-home-C2Bicw9N.js → state-home-CRowbXqU.js} +6 -6
  255. package/server/stuck-remediation-CFWUP8_I.js +1491 -0
  256. package/server/stuck-remediation-CLHd-lrF.js +2 -0
  257. package/server/{summary-fork-EWWBvzgE.js → summary-fork-CKc01Our.js} +2 -2
  258. package/server/{summary-fork-DezPkJSm.js → summary-fork-CtCwBJ2Z.js} +8 -8
  259. package/server/{supervisor-D5GC5jUM.js → supervisor-BA5D72Qa.js} +2 -2
  260. package/server/supervisor-DHjumXlL.js +2 -0
  261. package/server/{swarm-readiness-Cf9mommA.js → swarm-readiness-CL5sM9B1.js} +3 -3
  262. package/server/{system-prerequisites-BsI9hxh9.js → system-prerequisites-DmFSXIE5.js} +13 -1
  263. package/server/{teardown-workspace-CWz1pbEK.js → teardown-workspace-DWmFJzTw.js} +37 -68
  264. package/server/{test-agent-queue-TiVXe3ZT.js → test-agent-queue-DjsQoV5X.js} +6 -6
  265. package/server/{test-verdict-CCDd25uN.js → test-verdict-BSqsQp3G.js} +1 -1
  266. package/server/{test-verdict-Bm4uv_AA.js → test-verdict-D1AmZ2c0.js} +1 -1
  267. package/server/{tldr-daemon-C_1frSDj.js → tldr-daemon-C-MGomL8.js} +2 -2
  268. package/server/{tldr-daemon-Big5IZ_M.js → tldr-daemon-DD9rI5gA.js} +1 -1
  269. package/server/{tmux-D57f-XNv.js → tmux-C_d-lSIq.js} +2 -2
  270. package/server/{tmux-DClqWwb8.js → tmux-x291Gjjb.js} +1 -1
  271. package/server/{token-_qujO3JZ.js → token-DfBf1bsd.js} +1 -1
  272. package/server/{tracker-config-BmdJU_w6.js → tracker-config-CNODpd11.js} +2 -2
  273. package/server/{tracker-config-B_Ubts1Z.js → tracker-config-DItsdelv.js} +1 -1
  274. package/server/{tracker-utils-Bg-Sevcv.js → tracker-utils-B9ZoVA9b.js} +1 -1
  275. package/server/{tracker-utils-CWFt6jjV.js → tracker-utils-Ch2_5GGf.js} +2 -2
  276. package/server/{traefik-connect-5EP1WS_Z.js → traefik-connect-BF4x_LUQ.js} +1 -1
  277. package/server/{tunnel-hOBNQbmF.js → tunnel-YD80_IHr.js} +1 -1
  278. package/server/{tunnel-UBf2vyAL.js → tunnel-r_5nHAI6.js} +3 -3
  279. package/server/{types-B5u3NxMl.js → types-33JEP4LZ.js} +1 -1
  280. package/server/{uat-train-DGkIkLxu.js → uat-train-DDI00aqD.js} +1 -1
  281. package/server/{uat-train-qNanv5hN.js → uat-train-DjkFWXge.js} +25 -25
  282. package/server/{validation-C4wegCvH.js → validation-DUTiJnyz.js} +4 -4
  283. package/server/{validation-B0QaLIHP.js → validation-ict8hnXk.js} +1 -1
  284. package/server/{verification-runner-DdleMNLq.js → verification-runner-ATaLbpr5.js} +1 -1
  285. package/server/{verification-runner-CntudBes.js → verification-runner-inLgeQux.js} +12 -12
  286. package/server/{vtt-parser-CKc-smWM.js → vtt-parser-QnRfcjiU.js} +1 -1
  287. package/server/{work-agent-prompt-CG5jFV9A.js → work-agent-prompt-fZljjA1_.js} +12 -12
  288. package/server/{workflows-BK2xs_a8.js → workflows-oBnJ7Tm0.js} +14 -14
  289. package/server/workflows-tU7KKxQi.js +2 -0
  290. package/server/{workspace-C9lC5o3E.js → workspace-B2WOW9Hw.js} +1 -1
  291. package/server/{workspace-CLrSIRCx.js → workspace-CNuW2j41.js} +3 -3
  292. package/server/{workspace-config-DA8U97k9.js → workspace-config-CBgMGhWs.js} +1 -1
  293. package/server/{workspace-manager-BJhW2sky.js → workspace-manager-CB-R07R3.js} +12 -12
  294. package/server/{workspace-manager-Cb2a7bg9.js → workspace-manager-DjUAJCSs.js} +1 -1
  295. package/server/{workspace-metadata-QQmo_Z0l.js → workspace-metadata-9Nn5kgRl.js} +2 -2
  296. package/server/{workspace-metadata-CTRnr323.js → workspace-metadata-Fd58uUQG.js} +1 -1
  297. package/server/{workspaces-Ca4zZs12.js → workspaces-BjWXntty.js} +106 -120
  298. package/server/writer-CQMGzEkw.js +3 -0
  299. package/server/writer-fe1-8iGc.js +251 -0
  300. package/sync-sources/hooks/ask-user-question-hook +87 -0
  301. package/sync-sources/hooks/auto-approve-hook +96 -0
  302. package/sync-sources/hooks/codex-notify-hook +62 -0
  303. package/sync-sources/hooks/gh-issue-trailer-hook +4 -0
  304. package/sync-sources/hooks/gh-issue-trailer-hook.d.ts +7 -0
  305. package/sync-sources/hooks/gh-issue-trailer-hook.d.ts.map +1 -0
  306. package/sync-sources/hooks/gh-issue-trailer-hook.js +239 -0
  307. package/sync-sources/hooks/gh-issue-trailer-hook.js.map +1 -0
  308. package/sync-sources/hooks/gh-issue-trailer-hook.ts +296 -0
  309. package/sync-sources/hooks/git-hooks/post-checkout +109 -0
  310. package/sync-sources/hooks/heartbeat-hook +113 -0
  311. package/sync-sources/hooks/notification-hook +70 -0
  312. package/sync-sources/hooks/notify-complete +79 -0
  313. package/sync-sources/hooks/pan-hook-lib.sh +153 -0
  314. package/sync-sources/hooks/permission-event-hook +24 -0
  315. package/sync-sources/hooks/post-compact-hook +25 -0
  316. package/sync-sources/hooks/pre-compact-hook +26 -0
  317. package/sync-sources/hooks/pre-tool-hook +35 -0
  318. package/sync-sources/hooks/record-cost-event.d.ts +1 -0
  319. package/sync-sources/hooks/record-cost-event.js +31859 -0
  320. package/sync-sources/hooks/record-cost-event.js.map +1 -0
  321. package/sync-sources/hooks/record-cost-event.ts +267 -0
  322. package/sync-sources/hooks/rtk-bash-filter +152 -0
  323. package/sync-sources/hooks/session-start-hook +80 -0
  324. package/sync-sources/hooks/specialist-stop-hook +106 -0
  325. package/sync-sources/hooks/statusline.sh +169 -0
  326. package/sync-sources/hooks/stop-hook +217 -0
  327. package/sync-sources/hooks/tldr-post-edit +72 -0
  328. package/sync-sources/hooks/tldr-read-enforcer +340 -0
  329. package/sync-sources/hooks/tmux-send-keys-guard +87 -0
  330. package/sync-sources/hooks/tsdown.config.ts +14 -0
  331. package/sync-sources/hooks/user-prompt-submit-hook +57 -0
  332. package/sync-sources/hooks/work-agent-stop-hook +424 -0
  333. package/server/auto-commit-CGQlb4rV.js +0 -3
  334. package/server/bd-mutex-BItGvLQ8.js +0 -35
  335. package/server/beads-restore-CMbDSB5R.js +0 -60
  336. package/server/cli-Ch_BWJB2.js +0 -3
  337. package/server/deacon-swarm-CSWGRfzr.js +0 -2
  338. package/server/dist-BUplB3Od.js +0 -3
  339. package/server/forge-IgLR0Ist.js +0 -2
  340. package/server/hume-x9voULey.js +0 -3
  341. package/server/inspect-agent-CYoWAeeB.js +0 -2
  342. package/server/merge-agent-CfohxFWM.js +0 -3
  343. package/server/merge-ops-Czke6UAp.js +0 -2
  344. package/server/projects-Bqfwuqet.js +0 -3
  345. package/server/providers-JjK6izqX.js +0 -3
  346. package/server/public/assets/index-CZiADHcL.css +0 -1
  347. package/server/public/assets/index-LQIfhmgI.js +0 -796
  348. package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +0 -1
  349. package/server/rally-Ba9QoNYc.js +0 -3
  350. package/server/record-De2syxNB.js +0 -3
  351. package/server/resume-CmxF3Kjz.js +0 -3
  352. package/server/settings-DEhYpW0k.js +0 -2
  353. package/server/specs-CVH1kvz3.js +0 -3
  354. package/server/supervisor-DQMK2e3I.js +0 -2
  355. 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 { };