@overdeck/desktop 0.45.12 → 0.45.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) 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-CfujPRrz.js} +2 -2
  4. package/server/{advancing-selfheal-BqsLWqEM.js → advancing-selfheal-Bn5QiLtn.js} +4 -4
  5. package/server/{agent-gc-CUb52n7s.js → agent-gc-Cl9Nm0Zu.js} +3 -3
  6. package/server/{agent-state-D-moNwhA.js → agent-state-C6Rm6FPR.js} +1 -1
  7. package/server/{agent-state-service-BzESvLOf.js → agent-state-service-JhFzYCP_.js} +5 -5
  8. package/server/{agent-state-service-BaZH7sXJ.js → agent-state-service-U8feBf8t.js} +1 -1
  9. package/server/{agents-C4kZ8a2r.js → agents-CxbuBjID.js} +1 -1
  10. package/server/{agents-B5LfpLPv.js → agents-DqQa4Dq_.js} +88 -64
  11. package/server/{archive-planning-oX1pj6nY.js → archive-planning-CPitEZo4.js} +3 -3
  12. package/server/{archive-planning-BbZe-8IK.js → archive-planning-DmpT1_14.js} +1 -1
  13. package/server/{artifact-index-jobs-DGr6bxev.js → artifact-index-jobs-sMnNtPhy.js} +2 -2
  14. package/server/{auto-commit-CGQlb4rV.js → auto-commit-wZ9X7Isd.js} +1 -1
  15. package/server/{backlog-auto-trigger-BlJHikOm.js → backlog-auto-trigger-Cf9C8fwD.js} +2 -2
  16. package/server/{bd-process-lock-i3CYMS-B.js → bd-process-lock-D1aJxeYv.js} +2 -2
  17. package/server/{beads-BNU-fb48.js → beads-CivpXztb.js} +1 -1
  18. package/server/{beads-DD7fYCl5.js → beads-DRoj6-e1.js} +4 -4
  19. package/server/{beads-query-e6oku4P5.js → beads-query-tOsAYP5h.js} +2 -2
  20. package/server/{behavior-CPf0pbOt.js → behavior-D3d2mVyD.js} +3 -3
  21. package/server/{briefing-freshness-B2FdLwIv.js → briefing-freshness-BL3Q6p7R.js} +4 -4
  22. package/server/{checkpoint-manager-JryW6MpM.js → checkpoint-manager-DCxjQvP_.js} +2 -2
  23. package/server/{checkpoint-manager-eFgaMMu4.js → checkpoint-manager-j5URlFY7.js} +1 -1
  24. package/server/checkpoint-worker.js +1 -1
  25. package/server/{checkpoints-qvOqvMuC.js → checkpoints-BoX1H2Hf.js} +2 -2
  26. package/server/{checkpoints-BK17oicz.js → checkpoints-Bu_M_Q9W.js} +1 -1
  27. package/server/claude-hooks-provision-D-jGXmu1.js +360 -0
  28. package/server/{claude-permissions-B6bWGh9d.js → claude-permissions-DxIjkOVl.js} +2 -2
  29. package/server/{claude-settings-overlay-BPdhTPjo.js → claude-settings-overlay-5b9X2S0C.js} +1 -1
  30. package/server/{claude-settings-overlay-CRyyKKXQ.js → claude-settings-overlay-BPDS6GfE.js} +2 -2
  31. package/server/cli-CqgiSAU8.js +3 -0
  32. package/server/{cli-B75AieAM.js → cli-s7bPWy-E.js} +9 -9
  33. package/server/{cliproxy-CCzwuSNe.js → cliproxy-BituqWtR.js} +2 -2
  34. package/server/{cliproxy-DOQf66G9.js → cliproxy-D3sHB0sI.js} +1 -1
  35. package/server/{close-issue-_X3MXJyG.js → close-issue-CrBE7voz.js} +4 -4
  36. package/server/{closed-issue-reaper-CLR7ClsO.js → closed-issue-reaper-BRQBc7Xa.js} +1 -1
  37. package/server/{closed-issue-reaper-BsUfBSjM.js → closed-issue-reaper-DX9mYUji.js} +9 -9
  38. package/server/{codex-CY-QRuU9.js → codex-Bi1ITSOo.js} +1 -1
  39. package/server/{codex-B4KEpX5V.js → codex-CO0HrK3j.js} +5 -5
  40. package/server/{compact-beads-cZds2MTr.js → compact-beads-CrA8-k10.js} +1 -1
  41. package/server/{compact-beads-uEDccC76.js → compact-beads-DUkCUFxA.js} +3 -3
  42. package/server/{config-DARrpYWA.js → config-B4_d7z7z.js} +1 -1
  43. package/server/{config-8sjaU6jZ.js → config-DsCxzjXK.js} +2 -2
  44. package/server/{config-yaml-ClpGgrf6.js → config-yaml-C_djSurJ.js} +2 -2
  45. package/server/{conflict-gate-Ds9_2yjd.js → conflict-gate-CpOn9KC-.js} +1 -1
  46. package/server/{conflict-gate-BtB_o-Vi.js → conflict-gate-D47Kl78u.js} +3 -3
  47. package/server/{context-layers-r2ywnQYA.js → context-layers-BNhUBTkf.js} +3 -3
  48. package/server/{context-layers-CRCk1QG7.js → context-layers-CHl3Nroz.js} +2 -2
  49. package/server/{control-settings-D1B3u6HP.js → control-settings-KyYNXZLv.js} +4 -4
  50. package/server/{conversation-compaction-D86Zo2Ci.js → conversation-compaction-D3aS5PnS.js} +8 -8
  51. package/server/{conversation-compaction-CZRVk4hg.js → conversation-compaction-D4Wed1BJ.js} +1 -1
  52. package/server/{conversation-service-CuTVU8dV.js → conversation-service-CFZIjs-M.js} +5 -5
  53. package/server/{conversation-service-CkL-6MuG.js → conversation-service-DcDB5usR.js} +1 -1
  54. package/server/{conversations-DfJKBDwB.js → conversations-BSOU5qnu.js} +4 -4
  55. package/server/{conversations-BmWEluPL.js → conversations-BbDPrz89.js} +1 -1
  56. package/server/{cost-DAPYN6iA.js → cost-BE_ulOrw.js} +3 -3
  57. package/server/{cost-CCnqa5xK.js → cost-CaiG63FG.js} +2 -2
  58. package/server/{cost-sync-BDL10Nwu.js → cost-sync-D6AX8jv-.js} +3 -3
  59. package/server/{dag-Dv2r5bVD.js → dag-BQFtXOuJ.js} +3 -3
  60. package/server/{dangerous-git-ops-Dcw7PbYo.js → dangerous-git-ops-04Ba-Qu3.js} +1 -1
  61. package/server/dashboard-db-worker.js +6 -6
  62. package/server/{deacon-CM0MxbS8.js → deacon-2EvA9Ci3.js} +97 -97
  63. package/server/{deacon-DYnZH7kC.js → deacon-Bz-6Wjmn.js} +3 -3
  64. package/server/deacon-swarm-B8pgK2a7.js +2 -0
  65. package/server/{deacon-swarm-BstYoz8Q.js → deacon-swarm-DYYOzHRH.js} +10 -10
  66. package/server/deacon.js +7 -7
  67. package/server/{devcontainer-renderer-CaYOG9JN.js → devcontainer-renderer-Dx0C7VWJ.js} +2 -2
  68. package/server/dist-BYSj075e.js +3 -0
  69. package/server/{dist-BIC8spJ0.js → dist-ya66D9ze.js} +1 -1
  70. package/server/{docker-DDI1shu3.js → docker-D2TbXDO6.js} +2 -2
  71. package/server/{ensure-devcontainer-CbSXvN9W.js → ensure-devcontainer-BIShzs3M.js} +1 -1
  72. package/server/{ensure-devcontainer-DCAg3ksz.js → ensure-devcontainer-BTiMfFp5.js} +3 -3
  73. package/server/{event-store-DU3HkZlN.js → event-store-C02Gprug.js} +1 -1
  74. package/server/{event-store-DCMqyI07.js → event-store-C71x6h0i.js} +3 -3
  75. package/server/{events-BfiosVAn.js → events-BFDuPV6n.js} +3 -3
  76. package/server/{events-DLRxpSuV.js → events-D2gP2-Yv.js} +1 -1
  77. package/server/{factory-BMtWV9iv.js → factory-ByfbrCab.js} +4 -4
  78. package/server/{feature-registry-population-DA7bO6Zn.js → feature-registry-population-CSH66UO8.js} +4 -4
  79. package/server/{feature-registry-storage-nAY1fbBt.js → feature-registry-storage-DW7dUefc.js} +2 -2
  80. package/server/{features-DMu7eGmU.js → features-x_aLR7U9.js} +2 -2
  81. package/server/{feedback-target-DHqcw3cN.js → feedback-target-BFo9fScH.js} +6 -6
  82. package/server/{feedback-target-B2SEai8-.js → feedback-target-C4VMPTZu.js} +1 -1
  83. package/server/{feedback-writer-qvm7UON7.js → feedback-writer-B9ZqnnX3.js} +4 -4
  84. package/server/{feedback-writer-DMBdS_jL.js → feedback-writer-DCyd75yJ.js} +1 -1
  85. package/server/{flywheel-Dfpx4bIV.js → flywheel-D9NKvWqb.js} +11 -11
  86. package/server/{flywheel-k4FPtCQ_.js → flywheel-DB48X7Nn.js} +1 -1
  87. package/server/{flywheel-D2LdPSic.js → flywheel-DwQCoZQG.js} +13 -13
  88. package/server/{flywheel-merge-order-CB4lbXeJ.js → flywheel-merge-order-DrjmFXg4.js} +6 -6
  89. package/server/{flywheel-merge-order-CttTazRY.js → flywheel-merge-order-f1bi5XIf.js} +1 -1
  90. package/server/{forge-CoPFXFyl.js → forge-C-SoKy8U.js} +2 -2
  91. package/server/forge-CUCYK7h_.js +2 -0
  92. package/server/{from-B0YoJl9-.js → from-fu7ZumnY.js} +1 -1
  93. package/server/{fts-db-DAHW1yA_.js → fts-db-CL-YzSRG.js} +2 -2
  94. package/server/{fts-operations-DDXDBi0d.js → fts-operations-Bylu5NjM.js} +2 -2
  95. package/server/{git-utils-B90Zjzfl.js → git-utils-C8koBs8j.js} +2 -2
  96. package/server/{git-utils-DbfC0zls.js → git-utils-Ym380hJZ.js} +1 -1
  97. package/server/{github-app-C7lftMNj.js → github-app-DIr70YLg.js} +1 -1
  98. package/server/{github-app-BecAnXRX.js → github-app-DhycHVLF.js} +2 -2
  99. package/server/{github-client-D21rCIXk.js → github-client-7gkcXcBS.js} +2 -2
  100. package/server/{github-client-BwtKZtM0.js → github-client-Ji9lUTNF.js} +1 -1
  101. package/server/{github-pr-lookup-CzVWuysl.js → github-pr-lookup-rt7T9FwA.js} +2 -2
  102. package/server/{harness-resolve-SkRJm4a7.js → harness-resolve-CvGXUnAF.js} +3 -3
  103. package/server/{health-events-BT0aAfeA.js → health-events-D4E1DLN-.js} +2 -2
  104. package/server/{health-events-DA_JLpgZ.js → health-events-DDfkoO5a.js} +1 -1
  105. package/server/{hooks-DxEn2BoY.js → hooks-D_6pAbuJ.js} +2 -2
  106. package/server/{hooks-BQxRXtRb.js → hooks-DvdnCVv6.js} +1 -1
  107. package/server/{idle-stack-reaper-C7fJL8jH.js → idle-stack-reaper-DNbV9-fj.js} +1 -1
  108. package/server/{idle-stack-reaper-DGy7tvC9.js → idle-stack-reaper-cDRXDpgE.js} +2 -2
  109. package/server/{infra-DE3C4PMr.js → infra-Clew3DpF.js} +50 -3
  110. package/server/{injection-Dt22tGvS.js → injection-QCIHOpk6.js} +1 -1
  111. package/server/{injection-Cc4Qt8LZ.js → injection-ql0Nddcn.js} +7 -7
  112. package/server/inspect-agent-D8UBDgfR.js +2 -0
  113. package/server/{inspect-agent-DOaCDkCF.js → inspect-agent-DY18KEx4.js} +9 -9
  114. package/server/{internal-token-B_1YLWLI.js → internal-token-BeXjPLKy.js} +2 -2
  115. package/server/{internal-token-nobT6FhA.js → internal-token-C90jBp-y.js} +1 -1
  116. package/server/{io-A7ZuOBkz.js → io-CbAFXQge.js} +2 -2
  117. package/server/{issue-closed-Da3DeomA.js → issue-closed-BYC2TCk-.js} +4 -4
  118. package/server/{issue-lifecycle-543pQX9D.js → issue-lifecycle-BoJa6qIt.js} +21 -21
  119. package/server/{issue-lifecycle-Bd9XBJAQ.js → issue-lifecycle-CLHbj8RS.js} +1 -1
  120. package/server/{issue-service-singleton-BC2JLZi7.js → issue-service-singleton-3g_CCY-1.js} +1 -1
  121. package/server/{issue-service-singleton-Brc3t0SV.js → issue-service-singleton-BS9NENuR.js} +8 -8
  122. package/server/{issues-D3kt9UWE.js → issues-BPcqPqfV.js} +2 -2
  123. package/server/{label-cleanup-w9X_T3AQ.js → label-cleanup-CwiCSZrb.js} +2 -2
  124. package/server/{layers-Cwe1J-9o.js → layers-OHHLphl0.js} +2 -2
  125. package/server/{lifecycle-f1GbDK33.js → lifecycle-B8IdvUbt.js} +6 -6
  126. package/server/{lifecycle-io-D56q8zlO.js → lifecycle-io-BMCH1Bxg.js} +1 -1
  127. package/server/{lifecycle-io-Bqvj0m3i.js → lifecycle-io-C73m5e6R.js} +4 -4
  128. package/server/{linear-client-Bh4T4S-c.js → linear-client-BMxgycoy.js} +1 -1
  129. package/server/{linear-client-CfJMTAYd.js → linear-client-CgQlM4aT.js} +2 -2
  130. package/server/memory-fts-worker.js +1 -1
  131. package/server/{merge-ZrXFM3jv.js → merge-B7Oi-g6k.js} +3 -3
  132. package/server/{merge-DRMPa8CQ.js → merge-BRkVaIx-.js} +1 -1
  133. package/server/merge-agent-Bwm34MZ5.js +3 -0
  134. package/server/{merge-agent-CHHs5S_0.js → merge-agent-DNFFsiEm.js} +61 -26
  135. package/server/{merge-batch-BwhGdlh4.js → merge-batch-BpYXUaqJ.js} +1 -1
  136. package/server/{merge-blockers-BMhDpMl_.js → merge-blockers-DIOZmqdK.js} +2 -2
  137. package/server/merge-ops-B7m-hBEZ.js +2 -0
  138. package/server/{merge-rebase-R7MfqpiE.js → merge-rebase-C8WH39MB.js} +2 -2
  139. package/server/{merge-set-B3Breacq.js → merge-set-CsEE2CyQ.js} +9 -5
  140. package/server/{merge-set-D-iXNP0I.js → merge-set-DOsBTBQc.js} +1 -1
  141. package/server/{merge-sync-DHWbGtjR.js → merge-sync-C2B322Ot.js} +2 -2
  142. package/server/{merge-sync-bOOtfeXR.js → merge-sync-CcLM2vwW.js} +1 -1
  143. package/server/{merge-train-98ptZrPT.js → merge-train-BIm7-7cy.js} +3 -3
  144. package/server/{merge-train-deps-B5FWJTE2.js → merge-train-deps-DG1oQ2DT.js} +4 -4
  145. package/server/{merge-verification-BGiuiXAK.js → merge-verification-BAbjxEd5.js} +4 -4
  146. package/server/{multipart-parser-D7mzNNDm.js → multipart-parser-jKtKAXtl.js} +2 -2
  147. package/server/node_modules/.package-lock.json +1 -1
  148. package/server/{orphan-proposed-reconciler-CSuxivr9.js → orphan-proposed-reconciler-BqVGaOIj.js} +1 -1
  149. package/server/{orphan-proposed-reconciler-BSGCNJ6X.js → orphan-proposed-reconciler-zHrwJ3xr.js} +9 -9
  150. package/server/package-lock.json +2 -2
  151. package/server/package.json +1 -1
  152. package/server/{pan-dir-DoPtdHrp.js → pan-dir-BlNrLzW7.js} +3 -3
  153. package/server/{paths-CVDLPxXp.js → paths-CiVeo4N_.js} +2 -2
  154. package/server/{pipeline-notifier-WD2dnOsR.js → pipeline-notifier-DBF6dHxH.js} +2 -2
  155. package/server/{pipeline-notifier-BtYHbBPl.js → pipeline-notifier-nkWCe042.js} +1 -1
  156. package/server/{projects-Bqfwuqet.js → projects-BqRMlDOv.js} +1 -1
  157. package/server/{prompts-Cg7e9FPb.js → prompts-CXbQvevY.js} +2 -2
  158. package/server/{providers-fLduChnX.js → providers-CUdAb5Qu.js} +7 -7
  159. package/server/{providers-JjK6izqX.js → providers-gZ0cUgQM.js} +1 -1
  160. package/server/public/assets/{chunk-BO2N2NFS-aNlsGDCu.js → chunk-BO2N2NFS-C-6y8VFI.js} +4 -4
  161. package/server/public/assets/{diagram-OG6HWLK6-CnjkrvT8.js → diagram-OG6HWLK6-NACO1xW5.js} +1 -1
  162. package/server/public/assets/{dist-CGKBCieA.js → dist-D1FjqGgm.js} +1 -1
  163. package/server/public/assets/{dist-Bg3Sbsx4.js → dist-DQD-ZjQY.js} +3 -3
  164. package/server/public/assets/{ganttDiagram-6RSMTGT7-C8LLKj23.js → ganttDiagram-6RSMTGT7-CEMAKgmE.js} +1 -1
  165. package/server/public/assets/{highlighted-body-OFNGDK62-BSDEUvhW.js → highlighted-body-OFNGDK62-D5lC7FW8.js} +1 -1
  166. package/server/public/assets/{index-LQIfhmgI.js → index-BDqWyuZQ.js} +140 -140
  167. package/server/public/assets/{linear-DEbYZoxg.js → linear-DDHAMRPB.js} +1 -1
  168. package/server/public/assets/mermaid-GHXKKRXX-DRM2ANcR.js +1 -0
  169. package/server/public/assets/{pieDiagram-4H26LBE5-BtZL5pXE.js → pieDiagram-4H26LBE5-DwBdeKBb.js} +1 -1
  170. package/server/public/assets/{prod-DYVvIyuh.js → prod-DAZt0c4G.js} +4 -4
  171. package/server/public/assets/{quadrantDiagram-W4KKPZXB-a7vS8Jc8.js → quadrantDiagram-W4KKPZXB-CNDLp-_m.js} +1 -1
  172. package/server/public/assets/{sankeyDiagram-5OEKKPKP-Ckbq2SWH.js → sankeyDiagram-5OEKKPKP-oIUL_uO1.js} +1 -1
  173. package/server/public/assets/{xychartDiagram-2RQKCTM6-DJyeNa99.js → xychartDiagram-2RQKCTM6-B-IM6Cck.js} +1 -1
  174. package/server/public/index.html +1 -1
  175. package/server/{pull-requests-D2SjJIwY.js → pull-requests-DZ-V7_LB.js} +1 -1
  176. package/server/{pull-requests-1WXmTBlo.js → pull-requests-kTRl7cWC.js} +3 -3
  177. package/server/rally-CRteqXe0.js +3 -0
  178. package/server/{rally-api-H5I2CBO0.js → rally-api-DpZo3WwF.js} +2 -2
  179. package/server/{rally-api-BtvwdX6d.js → rally-api-jOk4vit_.js} +1 -1
  180. package/server/{rally-client-Bt-qHiOh.js → rally-client-BQjm3aaq.js} +1 -1
  181. package/server/{rally-client-33CYZYYu.js → rally-client-CoWZeVEj.js} +4 -4
  182. package/server/{rally-8aQlLLVj.js → rally-xCTZ-UcI.js} +3 -3
  183. package/server/{rebuild-stack-KHkkrGjx.js → rebuild-stack-BZ7j27xY.js} +5 -5
  184. package/server/{rebuild-stack-CXSgAGPR.js → rebuild-stack-r-cxcr26.js} +1 -1
  185. package/server/{reconstruct-cache-D_Ml65_6.js → reconstruct-cache-13EkMg_i.js} +6 -6
  186. package/server/{record-De2syxNB.js → record-CJsjvRO4.js} +1 -1
  187. package/server/release-engine-YLTnEO_K.js +306 -0
  188. package/server/release-set-DwvT_Opu.js +125 -0
  189. package/server/{remote-CGuognN3.js → remote-9u9WL0NJ.js} +3 -3
  190. package/server/{remote-D0Old0Cv.js → remote-B062S1Kc.js} +3 -3
  191. package/server/{remote-agents-UHoi4oGr.js → remote-agents-B4eWgwNd.js} +1 -1
  192. package/server/{remote-agents-DfhMq6kQ.js → remote-agents-BBTg-vLT.js} +5 -5
  193. package/server/{remote-completion-RZYePR_0.js → remote-completion-B0rmBnbL.js} +12 -12
  194. package/server/resume-R7xkSmLW.js +3 -0
  195. package/server/{review-agent-uwVftH98.js → review-agent-Bf9XjLnl.js} +1 -1
  196. package/server/{review-agent-sZBCpEVv.js → review-agent-tfR5RDzG.js} +22 -22
  197. package/server/{review-artifacts-C7a45b1_.js → review-artifacts-D0_IE6DQ.js} +6 -6
  198. package/server/{review-context-CErbQpKL.js → review-context-CXO5ml5D.js} +7 -7
  199. package/server/{review-monitor-DHD9m_kh.js → review-monitor-DfFUSx0J.js} +2 -2
  200. package/server/{review-status-JhQ3qlDS.js → review-status-B0Axo-Ma.js} +1 -1
  201. package/server/{review-status-gPndPUBc.js → review-status-BcfwcAcO.js} +23 -16
  202. package/server/{review-status-enrichment-qWvWckYN.js → review-status-enrichment-Cp5kFTGl.js} +3 -3
  203. package/server/{review-status-sync-B_GrEke8.js → review-status-sync-Bc0c_u12.js} +1 -1
  204. package/server/{review-status-sync-D3A9KX95.js → review-status-sync-CEFty1pW.js} +9 -5
  205. package/server/{review-verdict-feedback-4WZ5ZdbC.js → review-verdict-feedback-BOKRLLDf.js} +6 -6
  206. package/server/{review-verdict-feedback-Zo0r_z4m.js → review-verdict-feedback-BnGtT0vN.js} +1 -1
  207. package/server/{rollup-Bmhn80tB.js → rollup-BVqFuiS9.js} +1 -1
  208. package/server/{rollup-BrUIKMv_.js → rollup-C22QDVxh.js} +8 -8
  209. package/server/{scanner-BIGumel_.js → scanner-BLCnuXqY.js} +7 -7
  210. package/server/{sequence-io-DA0akEQN.js → sequence-io-BozlUb6f.js} +4 -4
  211. package/server/{sequencer-agent-DeflKafB.js → sequencer-agent-BEDEHfd2.js} +5 -5
  212. package/server/server.js +251 -160
  213. package/server/{service-V0sUK-OR.js → service-C8jKYZ0w.js} +42 -42
  214. package/server/{session-fork-Yx3UcAQf.js → session-fork-BDGksK4e.js} +2 -2
  215. package/server/{settings-CFEeQRj2.js → settings-CSLhh6qR.js} +2 -2
  216. package/server/settings-CSaXtkoA.js +2 -0
  217. package/server/{settings-CxVate0h.js → settings-DrRQCren.js} +3 -3
  218. package/server/{shadow-engineering-BRxnVSDk.js → shadow-engineering-BMcBN-Of.js} +2 -2
  219. package/server/{shadow-state-BiMwdyl1.js → shadow-state-B4ayC7nx.js} +2 -2
  220. package/server/{shadow-state-1aS8FijU.js → shadow-state-CHqWHD3T.js} +1 -1
  221. package/server/{ship-log-CMWH3H5-.js → ship-log-CDVmOlZP.js} +1 -1
  222. package/server/{smart-compaction-Bw1K_Sbl.js → smart-compaction-C-F5sP9P.js} +7 -7
  223. package/server/{smart-compaction-xblMyVpT.js → smart-compaction-V9DBrGcr.js} +1 -1
  224. package/server/{spawn-planning-session-CzDFSKAQ.js → spawn-planning-session-Bz4_JES2.js} +1 -1
  225. package/server/{spawn-planning-session-DxLxcM7m.js → spawn-planning-session-dSpOU0lP.js} +15 -15
  226. package/server/{specialist-completion-BiEXUHfD.js → specialist-completion-Coz3eTSr.js} +1 -1
  227. package/server/{specialist-context-BfkTA81h.js → specialist-context-fmb03vXQ.js} +5 -5
  228. package/server/{specialist-handoff-logger-BiKuLtNm.js → specialist-handoff-logger-B9HK_lRu.js} +2 -2
  229. package/server/{specialist-logs-CFJjGsLC.js → specialist-logs-B24R2B9Y.js} +3 -3
  230. package/server/{specialists-BLIreoE7.js → specialists-B6f5-5nG.js} +1 -1
  231. package/server/{specialists-DjHbwQ_p.js → specialists-BGNZ0_ZW.js} +18 -18
  232. package/server/{specialists-B4byf18k.js → specialists-CL7E8yUg.js} +75 -75
  233. package/server/{specialists-DdvpFNt1.js → specialists-Chvvwf5z.js} +1 -1
  234. package/server/specs-oaaYaA5c.js +3 -0
  235. package/server/{src-CALBEUMX.js → src-BVxZuHMg.js} +3 -3
  236. package/server/{src-mK_M_ZIj.js → src-D-VXCC9C.js} +5 -5
  237. package/server/{src-fgbU-jJ-.js → src-DGAEtABV.js} +13 -2
  238. package/server/{stack-health-BFM8YlHw.js → stack-health-BKbTTOT2.js} +1 -1
  239. package/server/{stack-health-Qd7rPiVe.js → stack-health-C-le5erA.js} +2 -2
  240. package/server/{state-home-C2Bicw9N.js → state-home-CoyWsECg.js} +6 -6
  241. package/server/{summary-fork-EWWBvzgE.js → summary-fork-BF_0vxrq.js} +2 -2
  242. package/server/{summary-fork-DezPkJSm.js → summary-fork-BlE30Q-I.js} +8 -8
  243. package/server/supervisor-03Tj_Wra.js +2 -0
  244. package/server/{supervisor-D5GC5jUM.js → supervisor-BSeML_p0.js} +2 -2
  245. package/server/{swarm-readiness-Cf9mommA.js → swarm-readiness-CQ4sjrXc.js} +3 -3
  246. package/server/{system-prerequisites-BsI9hxh9.js → system-prerequisites-DnmLYOnU.js} +13 -1
  247. package/server/{teardown-workspace-CWz1pbEK.js → teardown-workspace-CpcjDrZ4.js} +12 -12
  248. package/server/{test-agent-queue-TiVXe3ZT.js → test-agent-queue-Bq298zZl.js} +5 -5
  249. package/server/{tldr-daemon-C_1frSDj.js → tldr-daemon-CaSUXd9r.js} +2 -2
  250. package/server/{tldr-daemon-Big5IZ_M.js → tldr-daemon-Rn1Zue0P.js} +1 -1
  251. package/server/{tmux-D57f-XNv.js → tmux-BVc-NeKM.js} +2 -2
  252. package/server/{tmux-DClqWwb8.js → tmux-CbcrkUx5.js} +1 -1
  253. package/server/{token-_qujO3JZ.js → token-D2OC_9ms.js} +1 -1
  254. package/server/{tracker-config-BmdJU_w6.js → tracker-config-C1Y_2CIo.js} +2 -2
  255. package/server/{tracker-config-B_Ubts1Z.js → tracker-config-EsBoOWEy.js} +1 -1
  256. package/server/{tracker-utils-Bg-Sevcv.js → tracker-utils-DSb9cfrF.js} +1 -1
  257. package/server/{tracker-utils-CWFt6jjV.js → tracker-utils-lph9C3Pw.js} +2 -2
  258. package/server/{tunnel-UBf2vyAL.js → tunnel-BFBCeo97.js} +2 -2
  259. package/server/{tunnel-hOBNQbmF.js → tunnel-DDe-ATFF.js} +1 -1
  260. package/server/{uat-train-DGkIkLxu.js → uat-train-8T24rPzc.js} +1 -1
  261. package/server/{uat-train-qNanv5hN.js → uat-train-DtKHHy1U.js} +23 -23
  262. package/server/{validation-B0QaLIHP.js → validation-COOXwNXU.js} +1 -1
  263. package/server/{validation-C4wegCvH.js → validation-lyudzPvD.js} +3 -3
  264. package/server/{verification-runner-CntudBes.js → verification-runner-DO0nYTJx.js} +11 -11
  265. package/server/{verification-runner-DdleMNLq.js → verification-runner-Dd1FX8Qk.js} +1 -1
  266. package/server/{vtt-parser-CKc-smWM.js → vtt-parser-C57tEF7-.js} +1 -1
  267. package/server/{work-agent-prompt-CG5jFV9A.js → work-agent-prompt-B2F3ZwKm.js} +11 -11
  268. package/server/workflows-B4fIN8VP.js +2 -0
  269. package/server/{workflows-BK2xs_a8.js → workflows-Clz_AFwR.js} +13 -13
  270. package/server/{workspace-CLrSIRCx.js → workspace-CY_2-Ddv.js} +3 -3
  271. package/server/{workspace-C9lC5o3E.js → workspace-D0rCFemz.js} +1 -1
  272. package/server/{workspace-manager-Cb2a7bg9.js → workspace-manager-BIfpzqdU.js} +1 -1
  273. package/server/{workspace-manager-BJhW2sky.js → workspace-manager-D6NgGkiF.js} +10 -10
  274. package/server/{workspace-metadata-QQmo_Z0l.js → workspace-metadata-C8yn8kAH.js} +2 -2
  275. package/server/{workspace-metadata-CTRnr323.js → workspace-metadata-DfgR40YU.js} +1 -1
  276. package/server/{workspaces-Ca4zZs12.js → workspaces-DOeHyKmA.js} +104 -92
  277. package/sync-sources/hooks/ask-user-question-hook +87 -0
  278. package/sync-sources/hooks/auto-approve-hook +96 -0
  279. package/sync-sources/hooks/codex-notify-hook +62 -0
  280. package/sync-sources/hooks/gh-issue-trailer-hook +4 -0
  281. package/sync-sources/hooks/gh-issue-trailer-hook.d.ts +7 -0
  282. package/sync-sources/hooks/gh-issue-trailer-hook.d.ts.map +1 -0
  283. package/sync-sources/hooks/gh-issue-trailer-hook.js +239 -0
  284. package/sync-sources/hooks/gh-issue-trailer-hook.js.map +1 -0
  285. package/sync-sources/hooks/gh-issue-trailer-hook.ts +296 -0
  286. package/sync-sources/hooks/git-hooks/post-checkout +109 -0
  287. package/sync-sources/hooks/heartbeat-hook +113 -0
  288. package/sync-sources/hooks/notification-hook +70 -0
  289. package/sync-sources/hooks/notify-complete +79 -0
  290. package/sync-sources/hooks/pan-hook-lib.sh +153 -0
  291. package/sync-sources/hooks/permission-event-hook +24 -0
  292. package/sync-sources/hooks/post-compact-hook +25 -0
  293. package/sync-sources/hooks/pre-compact-hook +26 -0
  294. package/sync-sources/hooks/pre-tool-hook +35 -0
  295. package/sync-sources/hooks/record-cost-event.d.ts +1 -0
  296. package/sync-sources/hooks/record-cost-event.js +31858 -0
  297. package/sync-sources/hooks/record-cost-event.js.map +1 -0
  298. package/sync-sources/hooks/record-cost-event.ts +267 -0
  299. package/sync-sources/hooks/rtk-bash-filter +152 -0
  300. package/sync-sources/hooks/session-start-hook +80 -0
  301. package/sync-sources/hooks/specialist-stop-hook +106 -0
  302. package/sync-sources/hooks/statusline.sh +169 -0
  303. package/sync-sources/hooks/stop-hook +217 -0
  304. package/sync-sources/hooks/tldr-post-edit +72 -0
  305. package/sync-sources/hooks/tldr-read-enforcer +340 -0
  306. package/sync-sources/hooks/tmux-send-keys-guard +87 -0
  307. package/sync-sources/hooks/tsdown.config.ts +14 -0
  308. package/sync-sources/hooks/user-prompt-submit-hook +57 -0
  309. package/sync-sources/hooks/work-agent-stop-hook +424 -0
  310. package/server/cli-Ch_BWJB2.js +0 -3
  311. package/server/deacon-swarm-CSWGRfzr.js +0 -2
  312. package/server/dist-BUplB3Od.js +0 -3
  313. package/server/forge-IgLR0Ist.js +0 -2
  314. package/server/inspect-agent-CYoWAeeB.js +0 -2
  315. package/server/merge-agent-CfohxFWM.js +0 -3
  316. package/server/merge-ops-Czke6UAp.js +0 -2
  317. package/server/public/assets/mermaid-GHXKKRXX-CZOsRYoT.js +0 -1
  318. package/server/rally-Ba9QoNYc.js +0 -3
  319. package/server/resume-CmxF3Kjz.js +0 -3
  320. package/server/settings-DEhYpW0k.js +0 -2
  321. package/server/specs-CVH1kvz3.js +0 -3
  322. package/server/supervisor-DQMK2e3I.js +0 -2
  323. package/server/workflows-pKw9yRSV.js +0 -2
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env bash
2
+ # Claude Code status line — all available info + plan usage limits
3
+ # JSON is piped via stdin on each update
4
+
5
+ input=$(cat)
6
+
7
+ # Single jq call to extract all fields at once
8
+ eval "$(echo "$input" | jq -r '
9
+ @sh "model=\(.model.display_name // "")",
10
+ @sh "model_id=\(.model.id // "")",
11
+ @sh "current_dir=\(.workspace.current_dir // "")",
12
+ @sh "project_dir=\(.workspace.project_dir // "")",
13
+ @sh "cost=\(.cost.total_cost_usd // 0)",
14
+ @sh "lines_added=\(.cost.total_lines_added // 0)",
15
+ @sh "lines_removed=\(.cost.total_lines_removed // 0)",
16
+ @sh "ctx_used_pct=\(.context_window.used_percentage // 0)",
17
+ @sh "ctx_size=\(.context_window.context_window_size // 0)",
18
+ @sh "ctx_in=\(.context_window.current_usage.input_tokens // 0)",
19
+ @sh "ctx_out=\(.context_window.current_usage.output_tokens // 0)"
20
+ ' 2>/dev/null)"
21
+
22
+ # ANSI colors
23
+ RST='\033[0m'; DIM='\033[2m'
24
+ CYN='\033[36m'; GRN='\033[32m'; YLW='\033[33m'
25
+ MAG='\033[35m'; RED='\033[31m'; WHT='\033[37m'
26
+
27
+ # Helper: format token count
28
+ fmt() {
29
+ local n=${1:-0}
30
+ if (( n >= 1000000 )); then printf "%.1fM" "$(echo "scale=1;$n/1000000" | bc)"
31
+ elif (( n >= 1000 )); then printf "%.1fk" "$(echo "scale=1;$n/1000" | bc)"
32
+ else echo "$n"; fi
33
+ }
34
+
35
+ # Helper: color a percentage (green < 50, yellow < 80, red >= 80)
36
+ pct_color() {
37
+ local pct_int=${1%.*}
38
+ if (( ${pct_int:-0} >= 80 )); then echo "$RED"
39
+ elif (( ${pct_int:-0} >= 50 )); then echo "$YLW"
40
+ else echo "$GRN"; fi
41
+ }
42
+
43
+ # Helper: format time remaining from ISO timestamp
44
+ time_remaining() {
45
+ local reset_at="$1"
46
+ [ -z "$reset_at" ] || [ "$reset_at" = "null" ] && return
47
+ local reset_epoch now_epoch diff_s hours mins
48
+ reset_epoch=$(date -d "$reset_at" +%s 2>/dev/null) || return
49
+ now_epoch=$(date +%s)
50
+ diff_s=$(( reset_epoch - now_epoch ))
51
+ (( diff_s <= 0 )) && { echo "now"; return; }
52
+ hours=$(( diff_s / 3600 ))
53
+ mins=$(( (diff_s % 3600) / 60 ))
54
+ if (( hours > 0 )); then echo "${hours}h${mins}m"
55
+ else echo "${mins}m"; fi
56
+ }
57
+
58
+ # --- Usage limits (cached for 60s) ---
59
+ CACHE_FILE="/tmp/.claude-usage-cache-$(id -u)"
60
+ CACHE_TTL=60
61
+ usage_5h="" usage_7d="" reset_5h="" reset_7d=""
62
+
63
+ fetch_usage() {
64
+ local creds_file="$HOME/.claude/.credentials.json"
65
+ [ -f "$creds_file" ] || return
66
+ local token
67
+ token=$(jq -r '.claudeAiOauth.accessToken // empty' "$creds_file" 2>/dev/null)
68
+ [ -z "$token" ] && return
69
+ local response
70
+ response=$(curl -sf --max-time 3 \
71
+ -H "Accept: application/json" \
72
+ -H "Content-Type: application/json" \
73
+ -H "Authorization: Bearer $token" \
74
+ -H "anthropic-beta: oauth-2025-04-20" \
75
+ "https://api.anthropic.com/api/oauth/usage" 2>/dev/null) || return
76
+ echo "$response" > "$CACHE_FILE"
77
+ }
78
+
79
+ # Use cache if fresh, otherwise fetch in background
80
+ if [ -f "$CACHE_FILE" ]; then
81
+ cache_age=$(( $(date +%s) - $(stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0) ))
82
+ if (( cache_age > CACHE_TTL )); then
83
+ # Fetch in background so we don't block the statusline
84
+ fetch_usage &
85
+ fi
86
+ else
87
+ # First run — fetch synchronously (one-time cost)
88
+ fetch_usage
89
+ fi
90
+
91
+ # Read cached data
92
+ if [ -f "$CACHE_FILE" ]; then
93
+ eval "$(jq -r '
94
+ @sh "usage_5h=\(.five_hour.utilization // "")",
95
+ @sh "reset_5h=\(.five_hour.resets_at // "")",
96
+ @sh "usage_7d=\(.seven_day.utilization // "")",
97
+ @sh "reset_7d=\(.seven_day.resets_at // "")"
98
+ ' "$CACHE_FILE" 2>/dev/null)"
99
+ fi
100
+
101
+ # Git branch (fast — reads file directly, no subprocess)
102
+ git_branch=""
103
+ dir="${current_dir:-.}"
104
+ while [ "$dir" != "/" ]; do
105
+ if [ -f "$dir/.git/HEAD" ]; then
106
+ ref=$(< "$dir/.git/HEAD")
107
+ git_branch="${ref#ref: refs/heads/}"
108
+ break
109
+ fi
110
+ dir=$(dirname "$dir")
111
+ done
112
+
113
+ # Context % color
114
+ ctx_color=$(pct_color "$ctx_used_pct")
115
+
116
+ # Cost formatting
117
+ cost_fmt=$(printf '$%.4f' "${cost:-0}")
118
+
119
+ # Line 1: model | dir | git branch
120
+ line1=""
121
+ [ -n "$model" ] && line1+=$(printf "%b%s%b" "$MAG" "$model" "$RST")
122
+ [ -n "$model_id" ] && line1+=$(printf " %b(%s)%b" "$DIM" "$model_id" "$RST")
123
+ if [ -n "$current_dir" ]; then
124
+ short_dir="${current_dir/#$HOME/~}"
125
+ line1+=$(printf " %b%s%b" "$CYN" "$short_dir" "$RST")
126
+ fi
127
+ [ -n "$git_branch" ] && line1+=$(printf " %b%b%s%b" "$DIM" "$GRN" "$git_branch" "$RST")
128
+
129
+ # Line 2: context usage | cost | lines changed
130
+ line2=""
131
+ line2+=$(printf "%bctx%b %b%.0f%%%b" "$DIM" "$RST" "$ctx_color" "$ctx_used_pct" "$RST")
132
+ line2+=$(printf " %b%s%b/%b%s%b" "$WHT" "$(fmt "$ctx_in")" "$RST" "$DIM" "$(fmt "$ctx_size")" "$RST")
133
+ line2+=$(printf " %bout%b %s" "$DIM" "$RST" "$(fmt "$ctx_out")")
134
+ line2+=$(printf " %bcost%b %b%s%b" "$DIM" "$RST" "$YLW" "$cost_fmt" "$RST")
135
+ if (( lines_added > 0 || lines_removed > 0 )); then
136
+ line2+=$(printf " %b+%d%b/%b-%d%b" "$GRN" "$lines_added" "$RST" "$RED" "$lines_removed" "$RST")
137
+ fi
138
+
139
+ # Line 3: plan usage limits (5h + 7d)
140
+ line3=""
141
+ if [ -n "$usage_5h" ]; then
142
+ u5_color=$(pct_color "$usage_5h")
143
+ u5_reset=$(time_remaining "$reset_5h")
144
+ line3+=$(printf "%b5h%b %b%.0f%%%b" "$DIM" "$RST" "$u5_color" "$usage_5h" "$RST")
145
+ [ -n "$u5_reset" ] && line3+=$(printf " %b(%s)%b" "$DIM" "$u5_reset" "$RST")
146
+ fi
147
+ if [ -n "$usage_7d" ]; then
148
+ u7_color=$(pct_color "$usage_7d")
149
+ u7_reset=$(time_remaining "$reset_7d")
150
+ [ -n "$line3" ] && line3+=" "
151
+ line3+=$(printf "%b7d%b %b%.0f%%%b" "$DIM" "$RST" "$u7_color" "$usage_7d" "$RST")
152
+ [ -n "$u7_reset" ] && line3+=$(printf " %b(%s)%b" "$DIM" "$u7_reset" "$RST")
153
+ fi
154
+
155
+ # Write context % to agent dir for dashboard monitoring (non-blocking)
156
+ if [ -n "$OVERDECK_AGENT_ID" ] && [ -n "$ctx_used_pct" ]; then
157
+ CTX_DIR="$HOME/.overdeck/agents/$OVERDECK_AGENT_ID"
158
+ if [ -d "$CTX_DIR" ]; then
159
+ printf '%.0f' "$ctx_used_pct" > "$CTX_DIR/context-pct" 2>/dev/null || true
160
+ # Capture initial context % (first time only)
161
+ if [ ! -f "$CTX_DIR/initial-context-pct" ]; then
162
+ printf '%.0f' "$ctx_used_pct" > "$CTX_DIR/initial-context-pct" 2>/dev/null || true
163
+ fi
164
+ fi
165
+ fi
166
+
167
+ printf "%b\n" "$line1"
168
+ printf "%b\n" "$line2"
169
+ [ -n "$line3" ] && printf "%b\n" "$line3"
@@ -0,0 +1,217 @@
1
+ #!/bin/bash
2
+ # ~/.overdeck/bin/stop-hook (PAN-800)
3
+ #
4
+ # Fires on Claude Code Stop. Emits agent.activity_changed(idle) — the reducer
5
+ # clears currentTool / thinking / waiting on that transition, so no separate
6
+ # waiting_cleared is needed. Still chains to specialist-stop-hook and
7
+ # work-agent-stop-hook, and still fires the planning auto-completion call.
8
+
9
+ set +e
10
+
11
+ # Capture stdin once, early, so later background work cannot consume it and the
12
+ # hook can forward the session_id to the turn-complete title-refinement endpoint.
13
+ INPUT=$(cat 2>/dev/null || echo '{}')
14
+
15
+ # Log first-thing so we have empirical evidence the hook fired, regardless of
16
+ # whether anything downstream succeeded. Silent failures in pan_resolve_agent_id
17
+ # used to leave zero trace, making "did the Stop hook even fire?" impossible to
18
+ # answer post-hoc.
19
+ LOG_DIR="$HOME/.overdeck/logs"
20
+ mkdir -p "$LOG_DIR" 2>/dev/null || true
21
+ echo "[$(date -Iseconds)] stop-hook: invoked CLAUDE_SESSION_ID=${CLAUDE_SESSION_ID:-unset} OVERDECK_AGENT_ID=${OVERDECK_AGENT_ID:-unset} cwd=$(pwd)" \
22
+ >> "$LOG_DIR/hooks.log" 2>/dev/null || true
23
+
24
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
25
+ # shellcheck source=pan-hook-lib.sh
26
+ . "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || {
27
+ echo "[$(date -Iseconds)] stop-hook: pan-hook-lib.sh source failed — exiting" \
28
+ >> "$LOG_DIR/hooks.log" 2>/dev/null || true
29
+ exit 0
30
+ }
31
+
32
+ if ! pan_resolve_agent_id; then
33
+ echo "[$(date -Iseconds)] stop-hook: pan_resolve_agent_id failed (CLAUDE_SESSION_ID=${CLAUDE_SESSION_ID:-unset} cwd=$(pwd)) — exiting" \
34
+ >> "$LOG_DIR/hooks.log" 2>/dev/null || true
35
+ exit 0
36
+ fi
37
+
38
+ echo "[$(date -Iseconds)] stop-hook: resolved AGENT_ID=$AGENT_ID — proceeding" \
39
+ >> "$LOG_DIR/hooks.log" 2>/dev/null || true
40
+
41
+ TS=$(date -Iseconds)
42
+ BODY="{\"kind\":\"activity\",\"activity\":\"idle\",\"timestamp\":\"$TS\"}"
43
+ pan_emit_event "$AGENT_ID" "$BODY"
44
+
45
+ # ── API error detection (all agent types) ────────────────────────────────
46
+ # Run before the turn-complete notification so a Stop caused by a transient
47
+ # API error is not treated as a completed assistant turn.
48
+ LOG_DIR="$HOME/.overdeck/logs"
49
+ mkdir -p "$LOG_DIR"
50
+ API_ERROR_DETECTED=false
51
+ API_ERROR_NUDGE_FILE="$HOME/.overdeck/agents/$AGENT_ID/.last-api-error-nudge"
52
+
53
+ OUTPUT=$(tmux capture-pane -t "$AGENT_ID" -p -S -100 2>/dev/null || echo "")
54
+ if [ -n "$OUTPUT" ]; then
55
+ for pattern in \
56
+ "API Error: The server had an error while processing your request" \
57
+ "API Error: Overloaded" \
58
+ "API Error: Rate limit" \
59
+ "API Error: Request was aborted" \
60
+ "API Error: Timed out" \
61
+ "529 Overloaded" \
62
+ "502 Bad Gateway" \
63
+ "503 Service Unavailable"; do
64
+ if echo "$OUTPUT" | grep -qF "$pattern"; then
65
+ API_ERROR_DETECTED=true
66
+ break
67
+ fi
68
+ done
69
+ fi
70
+
71
+ # PAN-1644: notify the dashboard that a turn completed, so it can progressively
72
+ # refine the conversation title. Skip this when an API error caused the Stop.
73
+ # Fire-and-forget: the dashboard may be down or busy; the stop-hook must still
74
+ # exit 0 and chain to downstream hooks.
75
+ if [ "$API_ERROR_DETECTED" != "true" ]; then
76
+ INTERNAL_TOKEN="${OVERDECK_INTERNAL_TOKEN:-}"
77
+ if [ -z "$INTERNAL_TOKEN" ]; then
78
+ TOKEN_PATH="${OVERDECK_HOME:-$HOME/.overdeck}/internal-token"
79
+ if [ -f "$TOKEN_PATH" ]; then
80
+ INTERNAL_TOKEN=$(cat "$TOKEN_PATH" 2>/dev/null || true)
81
+ fi
82
+ fi
83
+
84
+ if command -v jq >/dev/null 2>&1; then
85
+ SESSION_ID=$(printf '%s' "$INPUT" | jq -r '(.session_id // "")' 2>/dev/null)
86
+ if [ -z "$SESSION_ID" ]; then
87
+ SESSION_ID="${CLAUDE_SESSION_ID:-}"
88
+ fi
89
+ if [ -n "$SESSION_ID" ]; then
90
+ TURN_COMPLETE_BODY=$(jq -n --arg session_id "$SESSION_ID" '{session_id: $session_id}' 2>/dev/null)
91
+ if [ -n "$TURN_COMPLETE_BODY" ]; then
92
+ curl -s -m 1 -X POST -H 'Content-Type: application/json' -H "x-overdeck-internal-token: $INTERNAL_TOKEN" --data "$TURN_COMPLETE_BODY" "$PAN_DASHBOARD_URL/api/hooks/turn-complete" >/dev/null 2>&1 || true
93
+ fi
94
+ fi
95
+ fi
96
+ fi
97
+
98
+ # If the agent stopped because of a transient API error, nudge it to retry.
99
+ # This runs before chaining to specialist/work-agent hooks because it
100
+ # applies universally. 5-minute cooldown per agent.
101
+ if [ "$API_ERROR_DETECTED" = "true" ]; then
102
+ SHOULD_NUDGE=true
103
+ if [ -f "$API_ERROR_NUDGE_FILE" ]; then
104
+ LAST_API_NUDGE=$(cat "$API_ERROR_NUDGE_FILE" 2>/dev/null || echo "0")
105
+ NOW=$(date +%s)
106
+ if [ $(( NOW - LAST_API_NUDGE )) -lt 300 ]; then
107
+ SHOULD_NUDGE=false
108
+ fi
109
+ fi
110
+
111
+ if [ "$SHOULD_NUDGE" = "true" ]; then
112
+ mkdir -p "$(dirname "$API_ERROR_NUDGE_FILE")"
113
+ date +%s > "$API_ERROR_NUDGE_FILE" 2>/dev/null || true
114
+
115
+ echo "[$(date -Iseconds)] stop-hook: $AGENT_ID api_error detected — nudging retry" \
116
+ >> "$LOG_DIR/hooks.log" 2>/dev/null || true
117
+
118
+ tmpfile=$(mktemp)
119
+ echo "You stopped due to a transient API error. This is a temporary server issue, not a problem with your work. Continue from where you left off. Do NOT start over — pick up exactly where you stopped." > "$tmpfile"
120
+ tmux load-buffer "$tmpfile" 2>/dev/null
121
+ tmux paste-buffer -t "$AGENT_ID" 2>/dev/null
122
+ sleep 0.3
123
+ tmux send-keys -t "$AGENT_ID" C-m 2>/dev/null
124
+ rm -f "$tmpfile"
125
+ fi
126
+ fi
127
+
128
+ # Chain to specialist-specific hook (auto-completion detection).
129
+ SPECIALIST_HOOK="$HOME/.overdeck/bin/specialist-stop-hook"
130
+ if [ -x "$SPECIALIST_HOOK" ]; then
131
+ "$SPECIALIST_HOOK" &
132
+ fi
133
+
134
+ # Chain to work-agent completion detection (nudges agents that forgot `pan work done`).
135
+ WORK_AGENT_HOOK="$HOME/.overdeck/bin/work-agent-stop-hook"
136
+ if [ -x "$WORK_AGENT_HOOK" ]; then
137
+ "$WORK_AGENT_HOOK" &
138
+ fi
139
+
140
+ # Auto-mark planning complete when a planning agent finishes.
141
+ if [[ "$AGENT_ID" == planning-* ]]; then
142
+ ISSUE_ID=$(echo "$AGENT_ID" | sed 's/^planning-//' | tr '[:lower:]' '[:upper:]')
143
+ if [ -n "$ISSUE_ID" ]; then
144
+ curl -s -m 1.0 -X POST "$PAN_DASHBOARD_URL/api/issues/$ISSUE_ID/complete-planning" \
145
+ -H "Content-Type: application/json" \
146
+ -d '{"skipKill":true}' > /dev/null 2>&1 &
147
+ fi
148
+ fi
149
+
150
+ # PAN-1557: interactive convoy reviewer finished a turn. If it wrote its report
151
+ # and hasn't signaled yet, deliver REVIEWER_READY to the synthesis agent.
152
+ # Interactive reviewers (no `claude --print`) don't exit, so the launcher can't
153
+ # own this signal the way it did for headless reviewers — the Stop-hook does.
154
+ # A bare idle stop with no report is left alone: Deacon's REVIEWER_TIMEOUT is
155
+ # the failure path, so we never emit a premature REVIEWER_FAILED.
156
+ # Pattern: agent-<issueId>-review-<subRole>
157
+ if [[ "$AGENT_ID" =~ ^agent-.+-review-(security|correctness|performance|requirements)$ ]]; then
158
+ R_STATE="$HOME/.overdeck/agents/$AGENT_ID/state.json"
159
+ R_MARKER="$HOME/.overdeck/agents/$AGENT_ID/reviewer-signaled"
160
+ if [ -f "$R_STATE" ] && [ ! -f "$R_MARKER" ]; then
161
+ # state.json is pretty-printed ("key": "value" with whitespace after the
162
+ # colon), so the extraction must tolerate optional whitespace.
163
+ R_OUT=$(sed -nE 's/.*"reviewOutputPath"[[:space:]]*:[[:space:]]*"([^"]*)".*/\1/p' "$R_STATE" | head -1)
164
+ R_SUB=$(sed -nE 's/.*"reviewSubRole"[[:space:]]*:[[:space:]]*"([^"]*)".*/\1/p' "$R_STATE" | head -1)
165
+ R_SYNTH=$(sed -nE 's/.*"reviewSynthesisAgentId"[[:space:]]*:[[:space:]]*"([^"]*)".*/\1/p' "$R_STATE" | head -1)
166
+ if [ -n "$R_OUT" ] && [ -n "$R_SUB" ] && [ -n "$R_SYNTH" ] && [ -s "$R_OUT" ]; then
167
+ # Deliver via the load-buffer + paste-buffer + Enter pattern on the
168
+ # overdeck socket (matches the API-error nudge above and the project's
169
+ # tmux-delivery rule). The synthesis session is always an interactive
170
+ # tmux session, so the paste reaches its prompt.
171
+ R_TMP=$(mktemp)
172
+ printf 'REVIEWER_READY %s %s' "$R_SUB" "$R_OUT" > "$R_TMP"
173
+ tmux -L overdeck load-buffer "$R_TMP" 2>/dev/null
174
+ tmux -L overdeck paste-buffer -t "$R_SYNTH" 2>/dev/null
175
+ sleep 0.3
176
+ tmux -L overdeck send-keys -t "$R_SYNTH" C-m 2>/dev/null
177
+ rm -f "$R_TMP"
178
+ touch "$R_MARKER"
179
+ echo "[$(date -Iseconds)] stop-hook: $AGENT_ID signaled REVIEWER_READY $R_SUB to $R_SYNTH" \
180
+ >> "$LOG_DIR/hooks.log" 2>/dev/null || true
181
+ fi
182
+ fi
183
+ fi
184
+
185
+ # PAN-1059 session-reaper: when the review synthesis session ends, kill any
186
+ # convoy sub-reviewer sessions (agent-<id>-review-{security,correctness,...}).
187
+ # Pattern: agent-<issueId>-review (no trailing sub-role suffix → synthesis)
188
+ if [[ "$AGENT_ID" =~ ^agent-(.+)-review$ ]]; then
189
+ REVIEW_ISSUE="${BASH_REMATCH[1]}"
190
+ KILLED_ANY=false
191
+ for SUBROLE in security correctness performance requirements; do
192
+ CONVOY_SESSION="agent-${REVIEW_ISSUE}-review-${SUBROLE}"
193
+ # PAN-1557: only reap a convoy reviewer that has SIGNALED (its
194
+ # `reviewer-signaled` marker is present). The marker is cleared at spawn
195
+ # (review-agent.ts) and touched when the reviewer signals REVIEWER_READY
196
+ # — headless launchers and the interactive Stop-hook both honor it — so a
197
+ # present marker means "this cycle's reviewer is done; safe to reap." A
198
+ # reviewer with NO marker is either still running OR belongs to a newer
199
+ # review cycle that reused this session name; reaping it would be the
200
+ # cross-cycle race that left running reviewers terminal-less. Skip it.
201
+ CONVOY_MARKER="$HOME/.overdeck/agents/$CONVOY_SESSION/reviewer-signaled"
202
+ if [ ! -f "$CONVOY_MARKER" ]; then
203
+ continue
204
+ fi
205
+ if tmux -L overdeck kill-session -t "$CONVOY_SESSION" 2>/dev/null; then
206
+ KILLED_ANY=true
207
+ echo "[$(date -Iseconds)] stop-hook: $AGENT_ID killed convoy $CONVOY_SESSION (signaled)" \
208
+ >> "$LOG_DIR/hooks.log" 2>/dev/null || true
209
+ fi
210
+ done
211
+ if [ "$KILLED_ANY" = "true" ]; then
212
+ echo "[$(date -Iseconds)] stop-hook: $AGENT_ID synthesis ended — convoy reaped for $REVIEW_ISSUE" \
213
+ >> "$LOG_DIR/hooks.log" 2>/dev/null || true
214
+ fi
215
+ fi
216
+
217
+ exit 0
@@ -0,0 +1,72 @@
1
+ #!/bin/bash
2
+ # ~/.overdeck/bin/tldr-post-edit
3
+ # PostToolUse hook on Edit/Write — notifies TLDR to re-warm after code changes.
4
+ #
5
+ # Tracks dirty files in a lightweight file. When the dirty count exceeds a
6
+ # threshold, triggers a background re-warm so the index stays fresh.
7
+
8
+ # Don't use set -e — never break Claude Code execution
9
+ INPUT=$(cat 2>/dev/null || echo '{}')
10
+
11
+ # Only act on Edit and Write tools
12
+ TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
13
+ if [ "$TOOL_NAME" != "Edit" ] && [ "$TOOL_NAME" != "Write" ]; then
14
+ exit 0
15
+ fi
16
+
17
+ # Extract file path
18
+ FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""' 2>/dev/null)
19
+ if [ -z "$FILE_PATH" ]; then
20
+ exit 0
21
+ fi
22
+
23
+ # Only track code files
24
+ EXT="${FILE_PATH##*.}"
25
+ EXT_LOWER=$(echo "$EXT" | tr '[:upper:]' '[:lower:]')
26
+ case "$EXT_LOWER" in
27
+ ts|tsx|js|jsx|py|java|go|rs|cpp|c|h|hpp|rb|php|kt|swift|cs|scala|lua|ex|exs)
28
+ ;;
29
+ *)
30
+ exit 0
31
+ ;;
32
+ esac
33
+
34
+ # Find project root (where .venv lives)
35
+ PROJECT_DIR=""
36
+ DIR="$(dirname "$FILE_PATH")"
37
+ while [ "$DIR" != "/" ]; do
38
+ if [ -d "$DIR/.venv" ]; then
39
+ PROJECT_DIR="$DIR"
40
+ break
41
+ fi
42
+ DIR=$(dirname "$DIR")
43
+ done
44
+
45
+ if [ -z "$PROJECT_DIR" ]; then
46
+ exit 0
47
+ fi
48
+
49
+ # Track dirty files
50
+ DIRTY_FILE="$PROJECT_DIR/.tldr/dirty-files"
51
+ mkdir -p "$PROJECT_DIR/.tldr" 2>/dev/null || true
52
+
53
+ # Append the changed file (deduplicated on warm)
54
+ REL_PATH="${FILE_PATH#$PROJECT_DIR/}"
55
+ echo "$REL_PATH" >> "$DIRTY_FILE" 2>/dev/null || true
56
+
57
+ # Count dirty files (fast line count)
58
+ DIRTY_COUNT=$(wc -l < "$DIRTY_FILE" 2>/dev/null || echo 0)
59
+
60
+ # Trigger background re-warm after 10 edits (keeps index reasonably fresh)
61
+ WARM_THRESHOLD=10
62
+ if [ "$DIRTY_COUNT" -ge "$WARM_THRESHOLD" ]; then
63
+ TLDR_BIN="$PROJECT_DIR/.venv/bin/tldr"
64
+ if [ -x "$TLDR_BIN" ]; then
65
+ # Clear dirty tracking before warm
66
+ : > "$DIRTY_FILE" 2>/dev/null || true
67
+ # Background warm — non-blocking
68
+ (cd "$PROJECT_DIR" && "$TLDR_BIN" warm . --background) >/dev/null 2>&1 &
69
+ fi
70
+ fi
71
+
72
+ exit 0