@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,96 @@
1
+ #!/bin/bash
2
+ # ~/.overdeck/bin/auto-approve-hook
3
+ #
4
+ # PreToolUse hook that returns permissionDecision: "allow" — but ONLY for the
5
+ # fully-autonomous, headless pipeline agents that have no human to answer Claude
6
+ # Code's "Do you want to proceed?" prompt. Without this, an unapproved tool call
7
+ # hangs the session forever (PAN-1024's "Interrupted · What should Claude do
8
+ # instead?" loop). This is the replacement for launching those agents with
9
+ # --dangerously-skip-permissions, which Auto-mode (compliance) users forbid.
10
+ #
11
+ # SCOPE (by OVERDECK_AGENT_ID prefix):
12
+ # agent-* → AUTO-APPROVE. Work / review / test / ship pipeline agents run
13
+ # unattended; a prompt would hang them.
14
+ # flywheel-* → AUTO-APPROVE. The Fix-All Flywheel orchestrator
15
+ # (OVERDECK_AGENT_ID=flywheel-orchestrator) is fully headless —
16
+ # a prompt hangs the entire run. It does NOT use an agent-* id.
17
+ # sequencer-* → AUTO-APPROVE. The Backlog Sequencer
18
+ # (OVERDECK_AGENT_ID=sequencer-runner) is a headless singleton
19
+ # runner like the flywheel — it reads issues via `gh` with no human
20
+ # present, so an approval prompt stalls the whole ranking pass.
21
+ # strike-* / inspect-* → AUTO-APPROVE. Headless strike (implement+merge) and
22
+ # per-bead inspect agents, same autonomy as a work agent.
23
+ # planning-* → AUTO-APPROVE. A planning agent must not be MORE restrictive than
24
+ # a work agent (which is auto-approved) or a conversation (which
25
+ # runs under bypass) — otherwise it is the only thing in the system
26
+ # that stalls on Claude Code's native command gates (e.g. the
27
+ # "compound command contains cd with output redirection" prompt).
28
+ # Planning's interactivity is the AskUserQuestion DIALOG (decisions
29
+ # surface to the operator via ask-user-question-hook), NOT per-command
30
+ # approval. So its routine research is auto-approved like a work agent.
31
+ # conv-* → AUTO-APPROVE. Overdeck conversations run autonomously between
32
+ # operator turns; they used to rely on Claude Code's `--permission-mode
33
+ # auto` classifier to avoid per-command prompts, but Claude Code
34
+ # removed `auto` as a valid interactive mode (we now launch every
35
+ # Overdeck session with `--permission-mode default`). Without this
36
+ # the conversation stalls on Claude's native "requires approval"
37
+ # gate for routine commands (e.g. `pan status`). The operator still
38
+ # sees every command in the dashboard terminal and steers via
39
+ # `pan tell`; AskUserQuestion is still excluded below so operator
40
+ # decisions surface as a dialog.
41
+ # (unset) → NOT auto-approved. A human's own plain `claude` session keeps
42
+ # normal prompts.
43
+ #
44
+ # This hook is wired in the GLOBAL settings.json (frontmatter PreToolUse hooks'
45
+ # permissionDecision is NOT honored by Claude Code — only settings.json hooks can
46
+ # decide permission), so the prefix check above is what keeps it from leaking
47
+ # into interactive/human sessions.
48
+ #
49
+ # AskUserQuestion is also skipped so ask-user-question-hook's deny stands.
50
+ #
51
+ # Never breaks Claude Code: on any error it stays silent (exit 0), which falls
52
+ # back to the normal permission flow rather than forcing a decision.
53
+
54
+ set +e
55
+
56
+ LOG_DIR="$HOME/.overdeck/logs"
57
+ mkdir -p "$LOG_DIR" 2>/dev/null || true
58
+
59
+ INPUT=$(cat 2>/dev/null || echo '{}')
60
+
61
+ TOOL_NAME=""
62
+ if command -v jq >/dev/null 2>&1; then
63
+ TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
64
+ fi
65
+
66
+ echo "[$(date -Iseconds)] auto-approve-hook: AGENT=${OVERDECK_AGENT_ID:-unset} tool=${TOOL_NAME:-unknown}" \
67
+ >> "$LOG_DIR/auto-approve.log" 2>/dev/null || true
68
+
69
+ # Overdeck pipeline agents (work + planning) AND conversations, which run
70
+ # autonomously between operator turns. Only a plain human `claude` session
71
+ # (OVERDECK_AGENT_ID unset) keeps normal prompts.
72
+ case "${OVERDECK_AGENT_ID:-}" in
73
+ agent-*|planning-*|flywheel-*|strike-*|inspect-*|sequencer-*|conv-*) : ;;
74
+ *) exit 0 ;;
75
+ esac
76
+
77
+ # Let ask-user-question-hook own AskUserQuestion (its deny summons the dialog).
78
+ if [ "$TOOL_NAME" = "AskUserQuestion" ]; then
79
+ exit 0
80
+ fi
81
+
82
+ REASON='Overdeck autonomous pipeline agent auto-approve: headless agent-* sessions replace --dangerously-skip-permissions with this scoped PreToolUse allow hook.'
83
+
84
+ if command -v jq >/dev/null 2>&1; then
85
+ jq -n --arg reason "$REASON" '{
86
+ hookSpecificOutput: {
87
+ hookEventName: "PreToolUse",
88
+ permissionDecision: "allow",
89
+ permissionDecisionReason: $reason
90
+ }
91
+ }'
92
+ else
93
+ printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","permissionDecisionReason":"Overdeck autonomous pipeline agent auto-approve"}}'
94
+ fi
95
+
96
+ exit 0
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ // ~/.overdeck/bin/codex-notify-hook (PAN-1574)
3
+ //
4
+ // Fires via Codex CLI notify mechanism on agent-turn-complete.
5
+ // Codex passes the event JSON as stdin or as a JSON argv argument.
6
+ //
7
+ // Writes ~/.overdeck/agents/<id>/heartbeat.json so codex.ts getHeartbeat
8
+ // can detect turn-end activity. Also writes a `completed` marker used by
9
+ // the recovery path to detect agent idle state.
10
+
11
+ 'use strict';
12
+
13
+ const { join } = require('node:path');
14
+ const { homedir } = require('node:os');
15
+ const { writeFileSync, mkdirSync, existsSync } = require('node:fs');
16
+
17
+ const agentId = process.env.OVERDECK_AGENT_ID;
18
+ if (!agentId) process.exit(0); // Not a Overdeck-managed agent
19
+
20
+ // Read event JSON from stdin (Codex delivers via stdin by default).
21
+ let eventData = {};
22
+ try {
23
+ const chunks = [];
24
+ process.stdin.setEncoding('utf8');
25
+ for (const chunk of []) { chunks.push(chunk); }
26
+ // Synchronous stdin read — Codex provides the event before invoking the shim.
27
+ const raw = require('node:fs').readFileSync('/dev/stdin', 'utf8').trim();
28
+ if (raw) eventData = JSON.parse(raw);
29
+ } catch {
30
+ // Ignore parse errors — best-effort heartbeat.
31
+ }
32
+
33
+ const overdeckHome = process.env.OVERDECK_HOME || join(homedir(), '.overdeck');
34
+ const heartbeatsDir = join(overdeckHome, 'heartbeats');
35
+ const agentDir = join(overdeckHome, 'agents', agentId);
36
+
37
+ try {
38
+ mkdirSync(heartbeatsDir, { recursive: true });
39
+ mkdirSync(agentDir, { recursive: true });
40
+ } catch { /* ignore */ }
41
+
42
+ const timestamp = new Date().toISOString();
43
+ const lastAction = typeof eventData['last-assistant-message'] === 'string'
44
+ ? eventData['last-assistant-message'].slice(0, 200)
45
+ : undefined;
46
+
47
+ const heartbeat = {
48
+ timestamp,
49
+ tool_name: 'agent-turn-complete',
50
+ last_action: lastAction,
51
+ thread_id: eventData['thread-id'],
52
+ };
53
+
54
+ // Write heartbeat.json for the 3-tier ladder (tier 1 = active heartbeat <60s).
55
+ try {
56
+ writeFileSync(join(heartbeatsDir, `${agentId}.json`), JSON.stringify(heartbeat) + '\n');
57
+ } catch { /* ignore */ }
58
+
59
+ // Write completed marker so recovery path knows the agent finished a turn.
60
+ try {
61
+ writeFileSync(join(agentDir, 'turn-completed'), timestamp + '\n');
62
+ } catch { /* ignore */ }
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
4
+ exec node "$SCRIPT_DIR/gh-issue-trailer-hook.js"
@@ -0,0 +1,7 @@
1
+ //#region gh-issue-trailer-hook.d.ts
2
+ type HookEnv = Record<string, string | undefined>;
3
+ declare function rewriteGhIssueCreateCommand(command: string, env?: HookEnv): string | null;
4
+ declare function runGhIssueTrailerHook(input: string, env?: HookEnv): string;
5
+ //#endregion
6
+ export { rewriteGhIssueCreateCommand, runGhIssueTrailerHook };
7
+ //# sourceMappingURL=gh-issue-trailer-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-issue-trailer-hook.d.ts","names":[],"sources":["gh-issue-trailer-hook.ts"],"mappings":";KAoBK,OAAA,GAAU,MAAA;AAAA,iBA+OC,2BAAA,CAA4B,OAAA,UAAiB,GAAA,GAAK,OAAA;AAAA,iBAiBlD,qBAAA,CAAsB,KAAA,UAAe,GAAA,GAAK,OAAA"}
@@ -0,0 +1,239 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { basename, join } from "node:path";
4
+ import { homedir, tmpdir } from "node:os";
5
+ import { fileURLToPath } from "node:url";
6
+ //#region gh-issue-trailer-hook.ts
7
+ const FLYWHEEL_RUN_ID_PATTERN = /^RUN-\d+$/;
8
+ function shellQuote(value) {
9
+ return `'${value.replace(/'/g, `'"'"'`)}'`;
10
+ }
11
+ function tokenize(command) {
12
+ const tokens = [];
13
+ let text = "";
14
+ let start = -1;
15
+ let quote = null;
16
+ let escape = false;
17
+ const flush = (end) => {
18
+ if (start !== -1) tokens.push({
19
+ text,
20
+ start,
21
+ end
22
+ });
23
+ text = "";
24
+ start = -1;
25
+ };
26
+ for (let index = 0; index < command.length; index += 1) {
27
+ const char = command[index];
28
+ if (start === -1 && !/\s/.test(char)) start = index;
29
+ if (escape) {
30
+ text += char;
31
+ escape = false;
32
+ continue;
33
+ }
34
+ if (quote === "single") {
35
+ if (char === "'") quote = null;
36
+ else text += char;
37
+ continue;
38
+ }
39
+ if (quote === "double") {
40
+ if (char === "\"") quote = null;
41
+ else if (char === "\\") escape = true;
42
+ else text += char;
43
+ continue;
44
+ }
45
+ if (/\s/.test(char)) {
46
+ flush(index);
47
+ continue;
48
+ }
49
+ if (char === "'") {
50
+ quote = "single";
51
+ continue;
52
+ }
53
+ if (char === "\"") {
54
+ quote = "double";
55
+ continue;
56
+ }
57
+ if (char === "\\") {
58
+ escape = true;
59
+ continue;
60
+ }
61
+ text += char;
62
+ }
63
+ flush(command.length);
64
+ return tokens;
65
+ }
66
+ function findGhIssueCreate(tokens) {
67
+ for (let index = 0; index <= tokens.length - 3; index += 1) if (tokens[index].text === "gh" && tokens[index + 1].text === "issue" && tokens[index + 2].text === "create") return index;
68
+ return -1;
69
+ }
70
+ function containsFlywheelRunId(body) {
71
+ return /^Flywheel-Run-Id:/m.test(body);
72
+ }
73
+ function resolveDiscoveredIn(env) {
74
+ const agentId = env.OVERDECK_AGENT_ID;
75
+ if (!agentId || basename(agentId) !== agentId) return null;
76
+ const statePath = join(env.OVERDECK_HOME ?? join(env.HOME ?? homedir(), ".overdeck"), "agents", agentId, "state.json");
77
+ if (!existsSync(statePath)) return null;
78
+ try {
79
+ const parsed = JSON.parse(readFileSync(statePath, "utf-8"));
80
+ return typeof parsed.issueId === "string" && parsed.issueId.trim() ? parsed.issueId.trim() : null;
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+ function buildTrailer(env) {
86
+ const runId = env.OVERDECK_FLYWHEEL_RUN_ID?.trim();
87
+ if (!runId || !FLYWHEEL_RUN_ID_PATTERN.test(runId)) return null;
88
+ const filedBy = env.OVERDECK_FLYWHEEL_AGENT_ROLE === "flywheel" ? "agent" : "operator";
89
+ const discoveredIn = resolveDiscoveredIn(env);
90
+ return `\n\n${[
91
+ "---",
92
+ `Flywheel-Run-Id: ${runId}`,
93
+ `Flywheel-Filed-By: ${filedBy}`,
94
+ discoveredIn ? `Flywheel-Discovered-In: ${discoveredIn}` : void 0
95
+ ].filter((line) => line !== void 0).join("\n")}\n`;
96
+ }
97
+ function replaceSpan(command, start, end, replacement) {
98
+ return `${command.slice(0, start)}${replacement}${command.slice(end)}`;
99
+ }
100
+ function findFlag(tokens, ghIndex, flagName) {
101
+ for (let index = ghIndex + 3; index < tokens.length; index += 1) {
102
+ const token = tokens[index];
103
+ if (token.text === flagName) return {
104
+ flag: token,
105
+ value: tokens[index + 1],
106
+ inline: false
107
+ };
108
+ if (token.text.startsWith(`${flagName}=`)) return {
109
+ flag: token,
110
+ inline: true
111
+ };
112
+ }
113
+ return null;
114
+ }
115
+ function inlineFlagValue(flag) {
116
+ const equalsOffset = flag.text.indexOf("=");
117
+ if (equalsOffset === -1) return null;
118
+ const valueStart = flag.start + equalsOffset + 1;
119
+ return {
120
+ value: flag.text.slice(equalsOffset + 1),
121
+ valueStart,
122
+ valueEnd: flag.end
123
+ };
124
+ }
125
+ function appendBodyFlag(command, tokens, ghIndex, trailer) {
126
+ const bodyFlag = findFlag(tokens, ghIndex, "--body");
127
+ if (!bodyFlag) return null;
128
+ const body = bodyFlag.inline ? inlineFlagValue(bodyFlag.flag) : bodyFlag.value;
129
+ if (!body) return null;
130
+ const bodyText = "text" in body ? body.text : body.value;
131
+ if (containsFlywheelRunId(bodyText)) return command;
132
+ const appended = `${bodyText}${trailer}`;
133
+ if ("text" in body) return replaceSpan(command, body.start, body.end, shellQuote(appended));
134
+ return replaceSpan(command, body.valueStart, body.valueEnd, shellQuote(appended));
135
+ }
136
+ function writeTempBodyFile(body) {
137
+ const path = join(mkdtempSync(join(tmpdir(), "pan-gh-issue-body-")), "body.md");
138
+ writeFileSync(path, body, "utf-8");
139
+ return path;
140
+ }
141
+ function appendBodyFileFlag(command, tokens, ghIndex, trailer) {
142
+ const bodyFileFlag = findFlag(tokens, ghIndex, "--body-file");
143
+ if (!bodyFileFlag) return null;
144
+ const pathValue = bodyFileFlag.inline ? inlineFlagValue(bodyFileFlag.flag) : bodyFileFlag.value;
145
+ if (!pathValue) return null;
146
+ const pathText = "text" in pathValue ? pathValue.text : pathValue.value;
147
+ if (pathText === "-") return appendStdinBody(command, tokens[ghIndex].start, trailer);
148
+ if (!existsSync(pathText)) return null;
149
+ const body = readFileSync(pathText, "utf-8");
150
+ if (containsFlywheelRunId(body)) return command;
151
+ const tempPath = writeTempBodyFile(`${body}${trailer}`);
152
+ if ("text" in pathValue) return replaceSpan(command, pathValue.start, pathValue.end, shellQuote(tempPath));
153
+ return replaceSpan(command, pathValue.valueStart, pathValue.valueEnd, shellQuote(tempPath));
154
+ }
155
+ function findPipeBefore(command, beforeIndex) {
156
+ let quote = null;
157
+ let escape = false;
158
+ let pipeIndex = -1;
159
+ for (let index = 0; index < beforeIndex; index += 1) {
160
+ const char = command[index];
161
+ if (escape) {
162
+ escape = false;
163
+ continue;
164
+ }
165
+ if (quote === "single") {
166
+ if (char === "'") quote = null;
167
+ continue;
168
+ }
169
+ if (quote === "double") {
170
+ if (char === "\"") quote = null;
171
+ else if (char === "\\") escape = true;
172
+ continue;
173
+ }
174
+ if (char === "'") quote = "single";
175
+ else if (char === "\"") quote = "double";
176
+ else if (char === "\\") escape = true;
177
+ else if (char === "|" && command[index + 1] !== "|" && command[index - 1] !== "|") pipeIndex = index;
178
+ }
179
+ return pipeIndex;
180
+ }
181
+ function appendHereDoc(command, trailer) {
182
+ const match = command.match(/(<<-?\s*['"]?([A-Za-z_][A-Za-z0-9_-]*)['"]?[^\n]*\n)([\s\S]*?)(\n\2\s*)$/);
183
+ if (!match || match.index === void 0) return null;
184
+ const body = match[3];
185
+ if (containsFlywheelRunId(body)) return command;
186
+ const bodyStart = match.index + match[1].length;
187
+ return replaceSpan(command, bodyStart, bodyStart + body.length, `${body}${trailer}`);
188
+ }
189
+ function appendStdinBody(command, ghStart, trailer) {
190
+ if (command.includes("Flywheel-Run-Id:")) return command;
191
+ const hereDoc = appendHereDoc(command, trailer);
192
+ if (hereDoc) return hereDoc;
193
+ const pipeIndex = findPipeBefore(command, ghStart);
194
+ if (pipeIndex === -1) return null;
195
+ const producer = command.slice(0, pipeIndex).trim();
196
+ const consumer = command.slice(pipeIndex + 1).trimStart();
197
+ if (!producer || !consumer) return null;
198
+ return `{ ${producer}; printf %s ${shellQuote(trailer)}; } | ${consumer}`;
199
+ }
200
+ function buildUpdatedInput(command) {
201
+ return { hookSpecificOutput: {
202
+ hookEventName: "PreToolUse",
203
+ permissionDecisionReason: "Flywheel issue provenance trailers added",
204
+ updatedInput: { command }
205
+ } };
206
+ }
207
+ function rewriteGhIssueCreateCommand(command, env = process.env) {
208
+ const trailer = buildTrailer(env);
209
+ if (!trailer) return null;
210
+ const tokens = tokenize(command);
211
+ const ghIndex = findGhIssueCreate(tokens);
212
+ if (ghIndex === -1) return null;
213
+ const bodyCommand = appendBodyFlag(command, tokens, ghIndex, trailer);
214
+ if (bodyCommand !== null) return bodyCommand === command ? null : bodyCommand;
215
+ const bodyFileCommand = appendBodyFileFlag(command, tokens, ghIndex, trailer);
216
+ if (bodyFileCommand !== null) return bodyFileCommand === command ? null : bodyFileCommand;
217
+ return null;
218
+ }
219
+ function runGhIssueTrailerHook(input, env = process.env) {
220
+ let event;
221
+ try {
222
+ event = JSON.parse(input);
223
+ } catch {
224
+ return "{}";
225
+ }
226
+ const command = event.tool_name === "Bash" ? event.tool_input?.command : void 0;
227
+ if (typeof command !== "string") return "{}";
228
+ const updatedCommand = rewriteGhIssueCreateCommand(command, env);
229
+ if (!updatedCommand) return "{}";
230
+ return JSON.stringify(buildUpdatedInput(updatedCommand));
231
+ }
232
+ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
233
+ const input = readFileSync(0, "utf-8");
234
+ process.stdout.write(runGhIssueTrailerHook(input));
235
+ }
236
+ //#endregion
237
+ export { rewriteGhIssueCreateCommand, runGhIssueTrailerHook };
238
+
239
+ //# sourceMappingURL=gh-issue-trailer-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-issue-trailer-hook.js","names":[],"sources":["gh-issue-trailer-hook.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\ninterface PreToolUseEvent {\n tool_name?: string;\n tool_input?: {\n command?: string;\n [key: string]: unknown;\n };\n}\n\ninterface Token {\n text: string;\n start: number;\n end: number;\n}\n\ntype HookEnv = Record<string, string | undefined>;\n\nconst FLYWHEEL_RUN_ID_PATTERN = /^RUN-\\d+$/;\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction tokenize(command: string): Token[] {\n const tokens: Token[] = [];\n let text = '';\n let start = -1;\n let quote: 'single' | 'double' | null = null;\n let escape = false;\n\n const flush = (end: number): void => {\n if (start !== -1) tokens.push({ text, start, end });\n text = '';\n start = -1;\n };\n\n for (let index = 0; index < command.length; index += 1) {\n const char = command[index];\n if (start === -1 && !/\\s/.test(char)) start = index;\n\n if (escape) {\n text += char;\n escape = false;\n continue;\n }\n\n if (quote === 'single') {\n if (char === \"'\") quote = null;\n else text += char;\n continue;\n }\n\n if (quote === 'double') {\n if (char === '\"') quote = null;\n else if (char === '\\\\') escape = true;\n else text += char;\n continue;\n }\n\n if (/\\s/.test(char)) {\n flush(index);\n continue;\n }\n\n if (char === \"'\") {\n quote = 'single';\n continue;\n }\n\n if (char === '\"') {\n quote = 'double';\n continue;\n }\n\n if (char === '\\\\') {\n escape = true;\n continue;\n }\n\n text += char;\n }\n\n flush(command.length);\n return tokens;\n}\n\nfunction findGhIssueCreate(tokens: Token[]): number {\n for (let index = 0; index <= tokens.length - 3; index += 1) {\n if (tokens[index].text === 'gh' && tokens[index + 1].text === 'issue' && tokens[index + 2].text === 'create') {\n return index;\n }\n }\n return -1;\n}\n\nfunction containsFlywheelRunId(body: string): boolean {\n return /^Flywheel-Run-Id:/m.test(body);\n}\n\nfunction resolveDiscoveredIn(env: HookEnv): string | null {\n const agentId = env.OVERDECK_AGENT_ID;\n if (!agentId || basename(agentId) !== agentId) return null;\n\n const overdeckHome = env.OVERDECK_HOME ?? join(env.HOME ?? homedir(), '.overdeck');\n const statePath = join(overdeckHome, 'agents', agentId, 'state.json');\n if (!existsSync(statePath)) return null;\n\n try {\n const parsed = JSON.parse(readFileSync(statePath, 'utf-8')) as { issueId?: unknown };\n return typeof parsed.issueId === 'string' && parsed.issueId.trim() ? parsed.issueId.trim() : null;\n } catch {\n return null;\n }\n}\n\nfunction buildTrailer(env: HookEnv): string | null {\n const runId = env.OVERDECK_FLYWHEEL_RUN_ID?.trim();\n if (!runId || !FLYWHEEL_RUN_ID_PATTERN.test(runId)) return null;\n\n const filedBy = env.OVERDECK_FLYWHEEL_AGENT_ROLE === 'flywheel' ? 'agent' : 'operator';\n const discoveredIn = resolveDiscoveredIn(env);\n const lines = [\n '---',\n `Flywheel-Run-Id: ${runId}`,\n `Flywheel-Filed-By: ${filedBy}`,\n discoveredIn ? `Flywheel-Discovered-In: ${discoveredIn}` : undefined,\n ].filter((line): line is string => line !== undefined);\n return `\\n\\n${lines.join('\\n')}\\n`;\n}\n\nfunction replaceSpan(command: string, start: number, end: number, replacement: string): string {\n return `${command.slice(0, start)}${replacement}${command.slice(end)}`;\n}\n\nfunction findFlag(tokens: Token[], ghIndex: number, flagName: '--body' | '--body-file'): { flag: Token; value?: Token; inline: boolean } | null {\n for (let index = ghIndex + 3; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token.text === flagName) return { flag: token, value: tokens[index + 1], inline: false };\n if (token.text.startsWith(`${flagName}=`)) return { flag: token, inline: true };\n }\n return null;\n}\n\nfunction inlineFlagValue(flag: Token): { value: string; valueStart: number; valueEnd: number } | null {\n const equalsOffset = flag.text.indexOf('=');\n if (equalsOffset === -1) return null;\n const valueStart = flag.start + equalsOffset + 1;\n return { value: flag.text.slice(equalsOffset + 1), valueStart, valueEnd: flag.end };\n}\n\nfunction appendBodyFlag(command: string, tokens: Token[], ghIndex: number, trailer: string): string | null {\n const bodyFlag = findFlag(tokens, ghIndex, '--body');\n if (!bodyFlag) return null;\n\n const body = bodyFlag.inline ? inlineFlagValue(bodyFlag.flag) : bodyFlag.value;\n if (!body) return null;\n const bodyText = 'text' in body ? body.text : body.value;\n if (containsFlywheelRunId(bodyText)) return command;\n\n const appended = `${bodyText}${trailer}`;\n if ('text' in body) return replaceSpan(command, body.start, body.end, shellQuote(appended));\n return replaceSpan(command, body.valueStart, body.valueEnd, shellQuote(appended));\n}\n\nfunction writeTempBodyFile(body: string): string {\n const dir = mkdtempSync(join(tmpdir(), 'pan-gh-issue-body-'));\n const path = join(dir, 'body.md');\n writeFileSync(path, body, 'utf-8');\n return path;\n}\n\nfunction appendBodyFileFlag(command: string, tokens: Token[], ghIndex: number, trailer: string): string | null {\n const bodyFileFlag = findFlag(tokens, ghIndex, '--body-file');\n if (!bodyFileFlag) return null;\n\n const pathValue = bodyFileFlag.inline ? inlineFlagValue(bodyFileFlag.flag) : bodyFileFlag.value;\n if (!pathValue) return null;\n const pathText = 'text' in pathValue ? pathValue.text : pathValue.value;\n\n if (pathText === '-') return appendStdinBody(command, tokens[ghIndex].start, trailer);\n if (!existsSync(pathText)) return null;\n\n const body = readFileSync(pathText, 'utf-8');\n if (containsFlywheelRunId(body)) return command;\n\n const tempPath = writeTempBodyFile(`${body}${trailer}`);\n if ('text' in pathValue) return replaceSpan(command, pathValue.start, pathValue.end, shellQuote(tempPath));\n return replaceSpan(command, pathValue.valueStart, pathValue.valueEnd, shellQuote(tempPath));\n}\n\nfunction findPipeBefore(command: string, beforeIndex: number): number {\n let quote: 'single' | 'double' | null = null;\n let escape = false;\n let pipeIndex = -1;\n\n for (let index = 0; index < beforeIndex; index += 1) {\n const char = command[index];\n if (escape) {\n escape = false;\n continue;\n }\n if (quote === 'single') {\n if (char === \"'\") quote = null;\n continue;\n }\n if (quote === 'double') {\n if (char === '\"') quote = null;\n else if (char === '\\\\') escape = true;\n continue;\n }\n if (char === \"'\") quote = 'single';\n else if (char === '\"') quote = 'double';\n else if (char === '\\\\') escape = true;\n else if (char === '|' && command[index + 1] !== '|' && command[index - 1] !== '|') pipeIndex = index;\n }\n\n return pipeIndex;\n}\n\nfunction appendHereDoc(command: string, trailer: string): string | null {\n const match = command.match(/(<<-?\\s*['\"]?([A-Za-z_][A-Za-z0-9_-]*)['\"]?[^\\n]*\\n)([\\s\\S]*?)(\\n\\2\\s*)$/);\n if (!match || match.index === undefined) return null;\n const body = match[3];\n if (containsFlywheelRunId(body)) return command;\n const bodyStart = match.index + match[1].length;\n const bodyEnd = bodyStart + body.length;\n return replaceSpan(command, bodyStart, bodyEnd, `${body}${trailer}`);\n}\n\nfunction appendStdinBody(command: string, ghStart: number, trailer: string): string | null {\n if (command.includes('Flywheel-Run-Id:')) return command;\n\n const hereDoc = appendHereDoc(command, trailer);\n if (hereDoc) return hereDoc;\n\n const pipeIndex = findPipeBefore(command, ghStart);\n if (pipeIndex === -1) return null;\n\n const producer = command.slice(0, pipeIndex).trim();\n const consumer = command.slice(pipeIndex + 1).trimStart();\n if (!producer || !consumer) return null;\n return `{ ${producer}; printf %s ${shellQuote(trailer)}; } | ${consumer}`;\n}\n\nfunction buildUpdatedInput(command: string): Record<string, unknown> {\n return {\n hookSpecificOutput: {\n hookEventName: 'PreToolUse',\n permissionDecisionReason: 'Flywheel issue provenance trailers added',\n updatedInput: { command },\n },\n };\n}\n\nexport function rewriteGhIssueCreateCommand(command: string, env: HookEnv = process.env): string | null {\n const trailer = buildTrailer(env);\n if (!trailer) return null;\n\n const tokens = tokenize(command);\n const ghIndex = findGhIssueCreate(tokens);\n if (ghIndex === -1) return null;\n\n const bodyCommand = appendBodyFlag(command, tokens, ghIndex, trailer);\n if (bodyCommand !== null) return bodyCommand === command ? null : bodyCommand;\n\n const bodyFileCommand = appendBodyFileFlag(command, tokens, ghIndex, trailer);\n if (bodyFileCommand !== null) return bodyFileCommand === command ? null : bodyFileCommand;\n\n return null;\n}\n\nexport function runGhIssueTrailerHook(input: string, env: HookEnv = process.env): string {\n let event: PreToolUseEvent;\n try {\n event = JSON.parse(input) as PreToolUseEvent;\n } catch {\n return '{}';\n }\n\n const command = event.tool_name === 'Bash' ? event.tool_input?.command : undefined;\n if (typeof command !== 'string') return '{}';\n\n const updatedCommand = rewriteGhIssueCreateCommand(command, env);\n if (!updatedCommand) return '{}';\n return JSON.stringify(buildUpdatedInput(updatedCommand));\n}\n\nif (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {\n const input = readFileSync(0, 'utf-8');\n process.stdout.write(runGhIssueTrailerHook(input));\n}\n"],"mappings":"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"}