very-happy-cli 0.2.178 → 0.2.179

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 (201) hide show
  1. package/dist/{AcpBackend-DCQXHRzT.mjs → AcpBackend-CHp3y7cb.mjs} +135 -16
  2. package/dist/{AcpBackend-CDkAQXYf.cjs → AcpBackend-DFipFF7-.cjs} +135 -16
  3. package/dist/{AcpSessionManager-DckmUZza.cjs → AcpSessionManager-0zpvRJXc.cjs} +38 -4
  4. package/dist/{AcpSessionManager-BXrQcqwC.mjs → AcpSessionManager-d2-rKWWa.mjs} +38 -4
  5. package/dist/{BasePermissionHandler-DyLmKKtO.cjs → BasePermissionHandler-CH3zuEkA.cjs} +5 -2
  6. package/dist/{BasePermissionHandler-BVlrEhIi.mjs → BasePermissionHandler-DdZBYIR4.mjs} +5 -2
  7. package/dist/acpSessionResume-DTGmAPLt.mjs +67 -0
  8. package/dist/acpSessionResume-oiCBnAVA.cjs +74 -0
  9. package/dist/{agentHome-CEp9RMyK.cjs → agentHome-BWcz8mz0.cjs} +4 -4
  10. package/dist/{agentHome-C1xi37as.mjs → agentHome-CghLvL_1.mjs} +4 -4
  11. package/dist/{api-JANhFdZV.cjs → api-Cmjfr8Z7.cjs} +28 -260
  12. package/dist/{api-Dib0dmqC.mjs → api-CzwFpJQc.mjs} +21 -253
  13. package/dist/{apiMachine-DNTJidYH.mjs → apiMachine-DJkTEiqy.mjs} +43 -15
  14. package/dist/{apiMachine-QhK-sKcr.cjs → apiMachine-G6OogT08.cjs} +43 -15
  15. package/dist/{attachmentContent-DkkdpSSJ.mjs → attachmentContent-B2os4HbA.mjs} +2 -2
  16. package/dist/{attachmentContent-bpQTBJ0y.cjs → attachmentContent-Bo0UAsSu.cjs} +4 -4
  17. package/dist/{auth-BRjd2esb.mjs → auth-BS6PaOOG.mjs} +5 -5
  18. package/dist/{auth-DgIV0Cvt.cjs → auth-D6bBUwZa.cjs} +5 -5
  19. package/dist/{auth-DNct7VUi.mjs → auth-DMX0xPNK.mjs} +8 -8
  20. package/dist/{auth-omWDtgR8.cjs → auth-HEhRaNgL.cjs} +8 -8
  21. package/dist/{auto-CI16FZmX.cjs → auto-C6I55iOh.cjs} +18 -17
  22. package/dist/{auto-DKGFOJBo.mjs → auto-Cl1SEDcD.mjs} +18 -17
  23. package/dist/{bootstrap-DCQ87Aan.cjs → bootstrap-exVucYav.cjs} +2 -2
  24. package/dist/{bootstrap-BUagGC_-.mjs → bootstrap-iuyufnp3.mjs} +2 -2
  25. package/dist/{browser-CSKhc0Bl.cjs → browser-BohJK12g.cjs} +1 -1
  26. package/dist/{browser-Dj_DYQEh.mjs → browser-CSYum7xH.mjs} +1 -1
  27. package/dist/{claudeLocal-CCCvAeMd.mjs → claudeLocal-Dq_R3Ax_.mjs} +6 -5
  28. package/dist/{claudeLocal-CdIVnOZp.cjs → claudeLocal-re4yjSTx.cjs} +6 -5
  29. package/dist/{claudeLocalLauncher-21-xh5gc.cjs → claudeLocalLauncher-B4hJHpCA.cjs} +11 -10
  30. package/dist/{claudeLocalLauncher-BmrpaRYJ.mjs → claudeLocalLauncher-CN67lN7-.mjs} +11 -10
  31. package/dist/{claudeSessionFork-DvxMKAmY.mjs → claudeSessionFork-BihfD0Ik.mjs} +1 -1
  32. package/dist/{claudeSessionFork-kYCP1IJB.cjs → claudeSessionFork-DiSMYerV.cjs} +1 -1
  33. package/dist/{client-Dnza1hgN.cjs → client-BKcK1Bi-.cjs} +3 -3
  34. package/dist/client-BhoEBnuN.mjs +71 -0
  35. package/dist/{client-C4zKGjiJ.cjs → client-CuVdN6PP.cjs} +2 -2
  36. package/dist/{client-BTX9hsbr.mjs → client-DuTDwWSQ.mjs} +3 -3
  37. package/dist/client-ZjOsn6nZ.cjs +76 -0
  38. package/dist/{client-CnlkkrZO.mjs → client-wo9nbxuf.mjs} +2 -2
  39. package/dist/codex/happyMcpStdioBridge.cjs +24 -15
  40. package/dist/codex/happyMcpStdioBridge.mjs +24 -15
  41. package/dist/{codexAppServerClient-DvkpQgyv.mjs → codexAppServerClient-BK3zra_1.mjs} +3 -3
  42. package/dist/{codexAppServerClient-CRlBWGn3.cjs → codexAppServerClient-Dt5zxrun.cjs} +3 -3
  43. package/dist/{codexCommand-BxjogBzU.mjs → codexCommand-B6pY7CMh.mjs} +65 -60
  44. package/dist/{codexCommand-DzxIWXIT.cjs → codexCommand-CAZ1SLjg.cjs} +88 -83
  45. package/dist/{codexTermination-ySDNMEhd.mjs → codexTermination-Cd1Eon_4.mjs} +1 -1
  46. package/dist/{codexTermination-C28FzlLb.cjs → codexTermination-DmGbHxcD.cjs} +1 -1
  47. package/dist/{config-DwfEpFr3.mjs → config-2oMG_fEI.mjs} +3 -3
  48. package/dist/{config-BFB5uJ4t.cjs → config-B0uK6K7n.cjs} +3 -3
  49. package/dist/{configuration-4TGMrjul.cjs → configuration-CMHZnp6G.cjs} +1 -1
  50. package/dist/{configuration-DVrb61aY.mjs → configuration-WMi4idBB.mjs} +1 -1
  51. package/dist/{connect-C7FPY0PI.mjs → connect-BLVHhHzA.mjs} +14 -14
  52. package/dist/{connect-QH2VJGBG.cjs → connect-uaglGrde.cjs} +14 -14
  53. package/dist/{context-JoKu0V54.cjs → context-DXzU5bFM.cjs} +1 -1
  54. package/dist/{context-B3XPVJlj.mjs → context-DploEcoN.mjs} +1 -1
  55. package/dist/{controlClient-BYKyGyxj.mjs → controlClient-BWUJrj3t.mjs} +3 -3
  56. package/dist/{controlClient-BTaZlbC6.cjs → controlClient-C-5qCt8W.cjs} +3 -3
  57. package/dist/{createSessionMetadata-8Fuj2-IV.mjs → createSessionMetadata-3uXrJgOW.mjs} +2 -2
  58. package/dist/{createSessionMetadata-B2NynaWZ.cjs → createSessionMetadata-BkIzHALd.cjs} +2 -2
  59. package/dist/{defaultPermissionMode-B8kJG9uI.mjs → defaultPermissionMode-BzxLh20a.mjs} +2 -2
  60. package/dist/{defaultPermissionMode-BEWCqJU-.cjs → defaultPermissionMode-pS3vmiSg.cjs} +2 -2
  61. package/dist/{deterministicJson-BjNQsAjO.cjs → deterministicJson-B8z2GPi9.cjs} +220 -14
  62. package/dist/{deterministicJson-C5ZwZ7hu.mjs → deterministicJson-D_whDMFd.mjs} +217 -12
  63. package/dist/{doctor-BshRnjLi.cjs → doctor-Br1Kcy2J.cjs} +7 -7
  64. package/dist/{doctor-0BiGwJXk.mjs → doctor-CmtSsR2-.mjs} +7 -7
  65. package/dist/{downloadTarget-BN5vZt3K.cjs → downloadTarget-BQJK_6oH.cjs} +6 -6
  66. package/dist/{downloadTarget-DJPwAZlu.mjs → downloadTarget-BoNwTIH_.mjs} +6 -6
  67. package/dist/{ensureDaemonRunning-C5QfToCe.cjs → ensureDaemonRunning-BRUmsq6J.cjs} +5 -5
  68. package/dist/{ensureDaemonRunning-CSmb_mqt.mjs → ensureDaemonRunning-Czo9IHJQ.mjs} +5 -5
  69. package/dist/{handleResumeCommand-CgjpsdDe.mjs → handleResumeCommand-C8thKjqf.mjs} +21 -5
  70. package/dist/{handleResumeCommand-BwnUZmbo.cjs → handleResumeCommand-tKD_Hpxc.cjs} +21 -5
  71. package/dist/{index-BYOZ_8WZ.cjs → index-B0UjHlAe.cjs} +4 -4
  72. package/dist/{index-BehVbAsA.mjs → index-BTxHphpV.mjs} +254 -49
  73. package/dist/index-BiyC7cZ3.mjs +18 -0
  74. package/dist/{index-_l1Sdmbi.cjs → index-C6O2vVjm.cjs} +154 -33
  75. package/dist/index-CUuc6iCn.cjs +24 -0
  76. package/dist/{index-Bvldtdny.mjs → index-CdQI0C9p.mjs} +4 -4
  77. package/dist/{index-BRClDe07.cjs → index-D09T1m8Y.cjs} +3 -3
  78. package/dist/{index-BYgfern_.mjs → index-D3bidoG8.mjs} +3 -3
  79. package/dist/{index-piJPsTsm.cjs → index-DMqDMT1Q.cjs} +256 -51
  80. package/dist/{index-Clqlu17M.mjs → index-DPOa4NhL.mjs} +153 -34
  81. package/dist/index.cjs +2 -2
  82. package/dist/index.mjs +2 -2
  83. package/dist/{install-BdvKiOQw.mjs → install-BX3lv3NO.mjs} +1 -1
  84. package/dist/{install-Cf6AFSWC.cjs → install-BXvf2E3o.cjs} +1 -1
  85. package/dist/{install-TO4taKW7.cjs → install-CYRZxS87.cjs} +3 -3
  86. package/dist/{install-fYWHrPcC.mjs → install-hnve_9vq.mjs} +3 -3
  87. package/dist/lib.cjs +13 -13
  88. package/dist/lib.d.cts +62 -1
  89. package/dist/lib.d.mts +62 -1
  90. package/dist/lib.mjs +13 -13
  91. package/dist/{lidState-DNMlIhX0.mjs → lidState-Bb8fgXg3.mjs} +1 -1
  92. package/dist/{lidState-BeOwj6eW.cjs → lidState-Dv2wwFTj.cjs} +1 -1
  93. package/dist/{localHappyAgentAuth-Br-mgogg.cjs → localHappyAgentAuth-DjYvkXvV.cjs} +1 -1
  94. package/dist/{localHappyAgentAuth-BezKSFDi.mjs → localHappyAgentAuth-NEU7fax7.mjs} +1 -1
  95. package/dist/{logger--vAVtXB_.mjs → logger-BtVhHnD8.mjs} +2 -2
  96. package/dist/{logger-DXTWlPzP.cjs → logger-C1GWx3gi.cjs} +2 -2
  97. package/dist/{machineMetadata-DcUupMje.cjs → machineMetadata-CLHS9sv_.cjs} +3 -3
  98. package/dist/{machineMetadata-B1H9gNbN.mjs → machineMetadata-D-g--oU_.mjs} +3 -3
  99. package/dist/{main-CshDb5-1.mjs → main-B2LWV8DI.mjs} +58 -45
  100. package/dist/{main-DoMFJ2Cl.cjs → main-CWhSsbtU.cjs} +58 -45
  101. package/dist/{mcp-pNc1EbQf.cjs → mcp-CARUsXHV.cjs} +14 -14
  102. package/dist/{mcp-DKT_lrvQ.mjs → mcp-ext92q3Y.mjs} +14 -14
  103. package/dist/{mirrorProtocol-6IFGPpjJ.mjs → mirrorProtocol-BwYibqry.mjs} +3 -3
  104. package/dist/{mirrorProtocol-qKflWTX_.cjs → mirrorProtocol-DEy2g1CB.cjs} +3 -3
  105. package/dist/{package-B7B03ejW.mjs → package-BPPebGQF.mjs} +7 -7
  106. package/dist/{package-DY4zTbKS.cjs → package-SgqTYsjn.cjs} +7 -7
  107. package/dist/panels-BZ0_Tt7B.mjs +137 -0
  108. package/dist/panels-D1c7q2dD.cjs +142 -0
  109. package/dist/{peerTools-3R9RUARX.mjs → peerTools-CWKzcQ7u.mjs} +60 -10
  110. package/dist/{peerTools-iy3_6Yc5.cjs → peerTools-DRQETXaz.cjs} +60 -9
  111. package/dist/{persistence-BfX72dne.cjs → persistence-BegE7NPa.cjs} +2 -2
  112. package/dist/{persistence-DTk4sNpd.mjs → persistence-Cr-wutZ4.mjs} +3 -3
  113. package/dist/{piRunnerArgs-CRQVR9o-.cjs → piRunnerArgs-Cs-378Vz.cjs} +8 -2
  114. package/dist/{piRunnerArgs-AT8QJY7x.mjs → piRunnerArgs-DwvM_yWA.mjs} +7 -1
  115. package/dist/{piRuntime-BHRT5MKO.cjs → piRuntime-BG-1td_n.cjs} +2 -2
  116. package/dist/{piRuntime-E44qTVQ4.mjs → piRuntime-Bue5mnlc.mjs} +2 -2
  117. package/dist/{piTerminal-De8nbciM.mjs → piTerminal-B5x9X5yV.mjs} +17 -17
  118. package/dist/{piTerminal-hI4WFdWm.cjs → piTerminal-G4z-xVyy.cjs} +17 -17
  119. package/dist/processTreeSnapshot-CuLJDNC-.mjs +101 -0
  120. package/dist/processTreeSnapshot-mDbnuojn.cjs +105 -0
  121. package/dist/prompt-BOouDaTM.mjs +99 -0
  122. package/dist/prompt-lgF9IE82.cjs +105 -0
  123. package/dist/{attachmentLimits-UyFn8fkQ.mjs → pushNotifications-BdFjDjQe.mjs} +303 -3
  124. package/dist/{attachmentLimits-SqeAHrVC.cjs → pushNotifications-DaLQUyi0.cjs} +304 -2
  125. package/dist/{index-DFPT4HOO.cjs → query-Ctfg-5gy.cjs} +25 -5
  126. package/dist/{index-CEjJnq05.mjs → query-DYP_W1wp.mjs} +26 -3
  127. package/dist/{rateLimitWindows-XrJiiBpU.mjs → rateLimitWindows-CuEqk_0g.mjs} +1 -1
  128. package/dist/{rateLimitWindows-Czb7_7cK.cjs → rateLimitWindows-Dj_8voBK.cjs} +1 -1
  129. package/dist/{registerCommonHandlers-CvIedVRf.mjs → registerCommonHandlers-BAlP7SGc.mjs} +2 -2
  130. package/dist/{registerCommonHandlers-C0_fyBQ0.cjs → registerCommonHandlers-Cj084Sg7.cjs} +2 -2
  131. package/dist/{registerKillSessionHandler-gwJ5lTf0.mjs → registerKillSessionHandler-PD0jWtQo.mjs} +6 -6
  132. package/dist/{registerKillSessionHandler-DYl7l4Ts.cjs → registerKillSessionHandler-qMju0ZfF.cjs} +6 -6
  133. package/dist/{remoteSessionClient-BRTIOX5b.cjs → remoteSessionClient-B7i7MkYV.cjs} +5 -5
  134. package/dist/{remoteSessionClient-DRb2Jr5s.mjs → remoteSessionClient-Bn2qu5C5.mjs} +5 -5
  135. package/dist/{reportProgressTool-B9nCzbkL.cjs → reportProgressTool-CM1JFAHg.cjs} +84 -2
  136. package/dist/{reportProgressTool-D5tEoXMW.mjs → reportProgressTool-gHItlSzz.mjs} +82 -3
  137. package/dist/{resources-JDPugcDq.cjs → resources-CvIlkzpP.cjs} +30 -0
  138. package/dist/{resources-BdFBQi8r.mjs → resources-y9jfyO-_.mjs} +30 -0
  139. package/dist/{run-BQ_FGaOL.mjs → run-BM4TxiyN.mjs} +177 -41
  140. package/dist/{run-CKe_WeLW.cjs → run-CNXwIe0A.cjs} +191 -55
  141. package/dist/{runClaude-MHI5IKM-.cjs → runClaude-CWhj2V4Q.cjs} +36 -40
  142. package/dist/{runClaude-zrrNcQC_.mjs → runClaude-C_3I8hvR.mjs} +36 -40
  143. package/dist/{runClaudeDeps-RRw-Nusc.cjs → runClaudeDeps-B81cOKnH.cjs} +294 -156
  144. package/dist/{runClaudeDeps-CVBCokOS.mjs → runClaudeDeps-QGrOeDe2.mjs} +294 -159
  145. package/dist/{runGemini-kipag2ag.mjs → runGemini-BEdWEZLR.mjs} +60 -54
  146. package/dist/{runGemini-D7Lg9yCr.cjs → runGemini-CgRLYbt5.cjs} +60 -54
  147. package/dist/{runOpenClaw-DCcQ0L2N.cjs → runOpenClaw-C1NVmzOL.cjs} +18 -18
  148. package/dist/{runOpenClaw-C_lRY3Do.mjs → runOpenClaw-DdQZAYj1.mjs} +18 -18
  149. package/dist/{sandbox-BSyXFVFp.mjs → sandbox-DjQUdCMG.mjs} +4 -4
  150. package/dist/{sandbox-dMwPTmjm.cjs → sandbox-nocIjliq.cjs} +4 -4
  151. package/dist/selfCheck-CjCF4C3v.mjs +85 -0
  152. package/dist/{selfCheck-DkzDDUsE.cjs → selfCheck-DCt4Uzbq.cjs} +36 -35
  153. package/dist/{send-C-k9nsd3.mjs → send-Ct7X4pPU.mjs} +8 -8
  154. package/dist/{send-dxC0miIA.cjs → send-Dydf_hwZ.cjs} +8 -8
  155. package/dist/{server-B-W6P7Qr.cjs → server-CosABFbd.cjs} +6 -6
  156. package/dist/{server-DxoTYNlw.mjs → server-DTQGZMxh.mjs} +4 -4
  157. package/dist/{sessionLock-DWX6BbiU.cjs → sessionLock-DokGab2R.cjs} +16 -3
  158. package/dist/{sessionLock-DBdtZGOL.mjs → sessionLock-WYIyaVO4.mjs} +16 -4
  159. package/dist/{sessionOps-BVoXe12O.mjs → sessionOps-BIGgRube.mjs} +10 -5
  160. package/dist/{sessionOps-BAnr7n8t.cjs → sessionOps-S-qPBLFf.cjs} +10 -5
  161. package/dist/{sessionScanner-CDOYsEUD.cjs → sessionScanner-CIMM2hvZ.cjs} +3 -3
  162. package/dist/{sessionScanner-BtxoeluY.mjs → sessionScanner-o5hnMi5e.mjs} +3 -3
  163. package/dist/{sessions-C3sZJkzI.mjs → sessions-BJHEZpi2.mjs} +39 -17
  164. package/dist/{sessions-hAitoN-m.cjs → sessions-JchI1w3z.cjs} +39 -16
  165. package/dist/{setupOfflineReconnection-C2EeYTFH.cjs → setupOfflineReconnection-CNiAt5ZP.cjs} +2 -2
  166. package/dist/{setupOfflineReconnection-_eD4cuUT.mjs → setupOfflineReconnection-DMiBO2y9.mjs} +2 -2
  167. package/dist/{spawn-Bc9v7pIf.cjs → spawn-6PD7nnoC.cjs} +48 -17
  168. package/dist/{spawn-qNrB2CD_.mjs → spawn-DgvUNYEo.mjs} +48 -17
  169. package/dist/{spawnAgents-BVEaz35W.cjs → spawnAgents-DsXgegHM.cjs} +37 -1
  170. package/dist/spawnAgents-P006Hqio.mjs +79 -0
  171. package/dist/{spawnHappyCLI-C2stUioM.mjs → spawnHappyCLI-CCOrEtf9.mjs} +1 -1
  172. package/dist/{spawnHappyCLI-fzUagkKV.cjs → spawnHappyCLI-Dywezwk6.cjs} +1 -1
  173. package/dist/{specialCommands-C6W-rVyh.mjs → specialCommands-DPcd9edP.mjs} +3 -3
  174. package/dist/{specialCommands-BJ-nqY4s.cjs → specialCommands-QxPpkGKf.cjs} +3 -3
  175. package/dist/{startFileWatcher-CR09Snmz.mjs → startFileWatcher-DghDOCO4.mjs} +1 -1
  176. package/dist/{startFileWatcher-Bqlqjt93.cjs → startFileWatcher-RECH5qY8.cjs} +1 -1
  177. package/dist/{streamRelay-CJoMk_d2.mjs → streamRelay-DMV_TXfS.mjs} +1 -1
  178. package/dist/{streamRelay-9kBPpbvU.cjs → streamRelay-DlUWKUpo.cjs} +1 -1
  179. package/dist/{sync-DbW07iQS.mjs → sync-CSe0Rf45.mjs} +1 -1
  180. package/dist/{sync-Dhmtk66S.cjs → sync-D23jbqVa.cjs} +1 -1
  181. package/dist/{systemPrompt-3PYi3EUY.cjs → systemPrompt-BOy4kU4P.cjs} +4 -3
  182. package/dist/{systemPrompt-CQcuUmVp.mjs → systemPrompt-CFNKnh65.mjs} +4 -3
  183. package/dist/{teams-CwF4Z2fA.mjs → teams-DyY669f0.mjs} +8 -8
  184. package/dist/{teams-DpxLcUU_.cjs → teams-Ov2BDT-A.cjs} +8 -8
  185. package/dist/{time-BuGWTVP6.mjs → time-65DcU6Jx.mjs} +1 -1
  186. package/dist/{time-A6zR3Iy6.cjs → time-CrwIMHta.cjs} +1 -1
  187. package/dist/{titleGenerator-D26gvNaS.cjs → titleGenerator-CS_rh2_J.cjs} +9 -8
  188. package/dist/{titleGenerator-BGEzNWC9.mjs → titleGenerator-CiAMxf7s.mjs} +9 -8
  189. package/dist/{todo-DrZc76H5.mjs → todo-BDONw0sK.mjs} +6 -6
  190. package/dist/{todo-73g3NCIO.cjs → todo-KY-okGii.cjs} +6 -6
  191. package/dist/{tools-BtsrQnNS.mjs → tools-D8-PnZEG.mjs} +1 -1
  192. package/dist/{tools-CxJp4T1T.cjs → tools-_w52DZG6.cjs} +1 -1
  193. package/dist/{uninstall-DWNYvewQ.cjs → uninstall-8vnLN-IE.cjs} +3 -3
  194. package/dist/{uninstall-DOb2mTwV.mjs → uninstall-_fjGRP9b.mjs} +3 -3
  195. package/dist/webPanels-B2_C2-3g.mjs +49 -0
  196. package/dist/webPanels-FCgFKvVe.cjs +53 -0
  197. package/package.json +7 -7
  198. package/dist/selfCheck-CF7XGJPb.mjs +0 -84
  199. package/dist/sessionModeFile-ByLbXTbg.mjs +0 -32
  200. package/dist/sessionModeFile-CLLdidiJ.cjs +0 -36
  201. package/dist/spawnAgents-Bw6j4tqz.mjs +0 -45
@@ -1,25 +1,25 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-qKflWTX_.cjs');
4
- var piRunnerArgs = require('./piRunnerArgs-CRQVR9o-.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-DEy2g1CB.cjs');
4
+ var piRunnerArgs = require('./piRunnerArgs-Cs-378Vz.cjs');
5
5
  var fs = require('fs/promises');
6
6
  var tmp = require('tmp');
7
7
  var axios = require('axios');
8
- var api = require('./api-JANhFdZV.cjs');
9
- var spawnAgents = require('./spawnAgents-BVEaz35W.cjs');
10
- var logger = require('./logger-DXTWlPzP.cjs');
8
+ var api = require('./api-Cmjfr8Z7.cjs');
9
+ var spawnAgents = require('./spawnAgents-DsXgegHM.cjs');
10
+ var logger = require('./logger-C1GWx3gi.cjs');
11
11
  var node_fs = require('node:fs');
12
12
  var path = require('node:path');
13
- var index$2 = require('./index-BRClDe07.cjs');
14
- var auth = require('./auth-DgIV0Cvt.cjs');
15
- var configuration = require('./configuration-4TGMrjul.cjs');
13
+ var index$2 = require('./index-D09T1m8Y.cjs');
14
+ var auth = require('./auth-D6bBUwZa.cjs');
15
+ var configuration = require('./configuration-CMHZnp6G.cjs');
16
16
  var child_process = require('child_process');
17
- var _package = require('./package-DY4zTbKS.cjs');
18
- var doctor = require('./doctor-BshRnjLi.cjs');
19
- var spawnHappyCLI = require('./spawnHappyCLI-fzUagkKV.cjs');
20
- var persistence = require('./persistence-BfX72dne.cjs');
21
- var controlClient = require('./controlClient-BTaZlbC6.cjs');
22
- var sessionOps = require('./sessionOps-BAnr7n8t.cjs');
17
+ var _package = require('./package-SgqTYsjn.cjs');
18
+ var doctor = require('./doctor-Br1Kcy2J.cjs');
19
+ var spawnHappyCLI = require('./spawnHappyCLI-Dywezwk6.cjs');
20
+ var persistence = require('./persistence-BegE7NPa.cjs');
21
+ var controlClient = require('./controlClient-C-5qCt8W.cjs');
22
+ var sessionOps = require('./sessionOps-S-qPBLFf.cjs');
23
23
  var fastify = require('fastify');
24
24
  var z = require('zod');
25
25
  var fastifyTypeProviderZod = require('fastify-type-provider-zod');
@@ -27,59 +27,62 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
27
27
  var node_crypto = require('node:crypto');
28
28
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
29
29
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
30
- var rateLimitWindows = require('./rateLimitWindows-Czb7_7cK.cjs');
31
- var peerTools = require('./peerTools-iy3_6Yc5.cjs');
30
+ var rateLimitWindows = require('./rateLimitWindows-Dj_8voBK.cjs');
31
+ var peerTools = require('./peerTools-DRQETXaz.cjs');
32
32
  var os = require('node:os');
33
- var remoteSessionClient = require('./remoteSessionClient-BRTIOX5b.cjs');
34
- var bootstrap = require('./bootstrap-DCQ87Aan.cjs');
35
- var index$1 = require('./index-BYOZ_8WZ.cjs');
33
+ var remoteSessionClient = require('./remoteSessionClient-B7i7MkYV.cjs');
34
+ var bootstrap = require('./bootstrap-exVucYav.cjs');
35
+ var index$1 = require('./index-B0UjHlAe.cjs');
36
36
  var fs$1 = require('fs');
37
37
  var path$2 = require('path');
38
38
  var node_child_process = require('node:child_process');
39
39
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
40
40
  var doctorReadiness = require('./doctorReadiness-BCZGcN0a.cjs');
41
- var machineMetadata = require('./machineMetadata-DcUupMje.cjs');
42
- var handleResumeCommand = require('./handleResumeCommand-BwnUZmbo.cjs');
43
- var index = require('./index-_l1Sdmbi.cjs');
41
+ var machineMetadata = require('./machineMetadata-CLHS9sv_.cjs');
42
+ var handleResumeCommand = require('./handleResumeCommand-tKD_Hpxc.cjs');
43
+ var webPanels = require('./webPanels-FCgFKvVe.cjs');
44
+ var index = require('./index-C6O2vVjm.cjs');
44
45
  var promises = require('node:fs/promises');
45
46
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
46
- var client = require('./client-C4zKGjiJ.cjs');
47
+ var client = require('./client-ZjOsn6nZ.cjs');
48
+ var client$1 = require('./client-CuVdN6PP.cjs');
47
49
  var module$1 = require('node:module');
48
50
  var path$1 = require('./path-B7zW-WwE.cjs');
49
51
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
50
- var startFileWatcher = require('./startFileWatcher-Bqlqjt93.cjs');
51
- var sync = require('./sync-Dhmtk66S.cjs');
52
+ var startFileWatcher = require('./startFileWatcher-RECH5qY8.cjs');
53
+ var sync = require('./sync-D23jbqVa.cjs');
52
54
  var types = require('./types-CRS-srZK.cjs');
53
55
  var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
54
- var sessionLock = require('./sessionLock-DWX6BbiU.cjs');
56
+ var sessionLock = require('./sessionLock-DokGab2R.cjs');
55
57
  var doctor$1 = require('./doctor-u46qYYKX.cjs');
56
- var resources = require('./resources-JDPugcDq.cjs');
58
+ var resources = require('./resources-CvIlkzpP.cjs');
57
59
  var node_util = require('node:util');
58
60
  var template = require('./template-BaHAmH2K.cjs');
59
61
  var daemonSupervisor = require('./daemonSupervisor-B-SPSqhs.cjs');
60
62
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
61
- require('./sessionModeFile-CLLdidiJ.cjs');
62
- require('./lidState-BeOwj6eW.cjs');
63
+ require('./acpSessionResume-oiCBnAVA.cjs');
64
+ require('./lidState-Dv2wwFTj.cjs');
63
65
  require('os');
64
66
  require('node:events');
65
67
  require('socket.io-client');
66
- require('./attachmentLimits-SqeAHrVC.cjs');
68
+ require('./pushNotifications-DaLQUyi0.cjs');
69
+ require('./contentLogMetadata-ZSFk_NjQ.cjs');
67
70
  require('./limits-C-a7gr04.cjs');
68
- require('./time-A6zR3Iy6.cjs');
69
- require('./registerCommonHandlers-C0_fyBQ0.cjs');
71
+ require('./time-CrwIMHta.cjs');
72
+ require('./registerCommonHandlers-Cj084Sg7.cjs');
70
73
  require('util');
71
74
  require('crypto');
72
75
  require('cross-spawn');
73
76
  require('@paralleldrive/cuid2');
74
- require('./contentLogMetadata-ZSFk_NjQ.cjs');
75
77
  require('chalk');
76
78
  require('tweetnacl');
77
- require('./browser-CSKhc0Bl.cjs');
79
+ require('./browser-BohJK12g.cjs');
78
80
  require('open');
79
81
  require('./ids-B6ZC0HGt.cjs');
80
82
  require('url');
81
83
  require('./detectCLI-DR9ZaN6B.cjs');
82
- require('./localHappyAgentAuth-Br-mgogg.cjs');
84
+ require('./localHappyAgentAuth-DjYvkXvV.cjs');
85
+ require('./processTreeSnapshot-mDbnuojn.cjs');
83
86
  require('ps-list');
84
87
 
85
88
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
@@ -187,7 +190,7 @@ function startCaffeinate() {
187
190
  }
188
191
  killOrphanedCaffeinateProcesses();
189
192
  try {
190
- caffeinateProcess = child_process.spawn("caffeinate", ["-im"], {
193
+ caffeinateProcess = child_process.spawn("caffeinate", caffeinateArgs(process.pid), {
191
194
  stdio: "ignore",
192
195
  detached: false
193
196
  });
@@ -254,12 +257,36 @@ function setupCleanupHandlers() {
254
257
  cleanup();
255
258
  });
256
259
  }
260
+ function caffeinateArgs(daemonPid) {
261
+ return ["-im", "-w", String(daemonPid)];
262
+ }
263
+ function orphanedLegacyCaffeinatePids(psOutput) {
264
+ const pids = [];
265
+ for (const line of psOutput.split("\n")) {
266
+ const m = /^\s*(\d+)\s+(\d+)\s+(.*?)\s*$/.exec(line);
267
+ if (!m) continue;
268
+ const [, pid, ppid, command] = m;
269
+ if (ppid !== "1") continue;
270
+ if (!/^(?:\/usr\/bin\/)?caffeinate -im$/.test(command)) continue;
271
+ pids.push(Number(pid));
272
+ }
273
+ return pids;
274
+ }
257
275
  function killOrphanedCaffeinateProcesses() {
258
276
  if (process.platform !== "darwin") return;
277
+ let ps;
259
278
  try {
260
- child_process.execSync('pkill -f "caffeinate -im"', { timeout: 5e3, stdio: "ignore" });
261
- logger.logger.debug("[caffeinate] Killed orphaned caffeinate processes");
262
- } catch {
279
+ ps = child_process.execSync("ps -A -o pid=,ppid=,command=", { timeout: 5e3, encoding: "utf8" });
280
+ } catch (error) {
281
+ logger.logger.debug("[caffeinate] Could not list processes; skipping orphan cleanup:", error);
282
+ return;
283
+ }
284
+ for (const pid of orphanedLegacyCaffeinatePids(ps)) {
285
+ try {
286
+ process.kill(pid, "SIGTERM");
287
+ logger.logger.debug(`[caffeinate] Killed orphaned legacy caffeinate PID ${pid}`);
288
+ } catch {
289
+ }
263
290
  }
264
291
  }
265
292
 
@@ -369,6 +396,12 @@ function formatAssistantReportMessage(title, sessionId, event) {
369
396
 
370
397
  function resumePrecheck(metadata, fs) {
371
398
  const flavor = metadata.flavor ?? "claude";
399
+ if (flavor === "acp" && metadata.piSessionId) {
400
+ if (!metadata.path || !fs.cwdExists(metadata.path)) {
401
+ return { ok: false, reason: "missing-cwd", detail: `working directory ${metadata.path ?? "(none)"} does not exist` };
402
+ }
403
+ return { ok: true };
404
+ }
372
405
  if (flavor !== "claude" && flavor !== "codex") {
373
406
  return { ok: false, reason: "unsupported-flavor", detail: `flavor "${flavor}" cannot be resumed` };
374
407
  }
@@ -2052,6 +2085,43 @@ function spawnAgentUnavailableError(agent, availability) {
2052
2085
  return null;
2053
2086
  }
2054
2087
 
2088
+ function startWebPanelsSync(deps) {
2089
+ let lastMtime;
2090
+ let lastProblems = "";
2091
+ let stopped = false;
2092
+ let inflight = null;
2093
+ const run = async () => {
2094
+ try {
2095
+ const mtime = await deps.statMtime();
2096
+ if (mtime === lastMtime) return;
2097
+ lastMtime = mtime;
2098
+ const { panels, problems } = webPanels.normalizeWebPanels(mtime === null ? void 0 : await deps.readRaw());
2099
+ const key = JSON.stringify(problems);
2100
+ if (problems.length > 0 && key !== lastProblems) deps.logProblems(problems);
2101
+ lastProblems = key;
2102
+ await deps.publish(panels);
2103
+ } catch {
2104
+ lastMtime = void 0;
2105
+ }
2106
+ };
2107
+ const tick = () => {
2108
+ if (stopped) return Promise.resolve();
2109
+ inflight ??= run().finally(() => {
2110
+ inflight = null;
2111
+ });
2112
+ return inflight;
2113
+ };
2114
+ void tick();
2115
+ const timer = setInterval(() => {
2116
+ void tick();
2117
+ }, deps.intervalMs ?? 2e3);
2118
+ timer.unref?.();
2119
+ return { stop: () => {
2120
+ stopped = true;
2121
+ clearInterval(timer);
2122
+ }, tick };
2123
+ }
2124
+
2055
2125
  function isAcceptableRelayUrl(url) {
2056
2126
  try {
2057
2127
  const parsed = new URL(url);
@@ -2507,6 +2577,44 @@ function createUpdateController(deps) {
2507
2577
  return { refresh, retry, request, tick, withHandover, holdHandover, isRunning: () => running };
2508
2578
  }
2509
2579
 
2580
+ function buildPresenceBatch(live, previous) {
2581
+ const current = new Set(live.map((s) => s.sessionId));
2582
+ const sessions = live.slice(0, 200).map((s) => ({
2583
+ sessionId: s.sessionId,
2584
+ state: s.running ? "running" : "idle",
2585
+ ...s.flavor ? { agent: s.flavor } : {},
2586
+ ...s.branch ? { branch: s.branch.slice(0, 200) } : {}
2587
+ }));
2588
+ const gone = [...previous].filter((id) => !current.has(id)).slice(0, 200);
2589
+ return { sessions, gone, current };
2590
+ }
2591
+ function createProjectPresenceReporter(deps) {
2592
+ let previous = /* @__PURE__ */ new Set();
2593
+ let running = false;
2594
+ async function tick() {
2595
+ if (running || deps.client.isDisabled()) return;
2596
+ running = true;
2597
+ try {
2598
+ const batch = buildPresenceBatch(deps.live(), previous);
2599
+ if (batch.sessions.length === 0 && batch.gone.length === 0) {
2600
+ previous = batch.current;
2601
+ return;
2602
+ }
2603
+ await deps.client.presence(deps.machineId, batch.sessions, batch.gone);
2604
+ previous = batch.current;
2605
+ } catch (error) {
2606
+ if (!(error instanceof client.ProjectsUnsupportedError)) deps.log(`project presence tick failed: ${String(error)}`);
2607
+ } finally {
2608
+ running = false;
2609
+ }
2610
+ }
2611
+ const timer = setInterval(() => {
2612
+ void tick();
2613
+ }, deps.intervalMs ?? 6e4);
2614
+ timer.unref?.();
2615
+ return { tick, stop: () => clearInterval(timer) };
2616
+ }
2617
+
2510
2618
  const AUTOMATION_BINDINGS_TTL_MS = 10 * 60 * 1e3;
2511
2619
  const HIBERNATION_IN_FLIGHT_MS = 6e4;
2512
2620
  const HIBERNATION_EXIT_WAIT_MS = 15e3;
@@ -2697,7 +2805,7 @@ function parseJsonObject(text) {
2697
2805
  return null;
2698
2806
  }
2699
2807
  }
2700
- function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('run-CKe_WeLW.cjs', document.baseURI).href))).resolve(s)) {
2808
+ function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('run-CNXwIe0A.cjs', document.baseURI).href))).resolve(s)) {
2701
2809
  const platformArch = `${platform}-${arch}`;
2702
2810
  const candidates = [
2703
2811
  `@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
@@ -4308,7 +4416,7 @@ function expandHome(path$1) {
4308
4416
  return path$1;
4309
4417
  }
4310
4418
  function isSettledByServer(error) {
4311
- if (!(error instanceof client.AutomationsRequestError)) return false;
4419
+ if (!(error instanceof client$1.AutomationsRequestError)) return false;
4312
4420
  if (error.status === 409 && (error.code === "run_finished" || error.code === "claim_mismatch")) return true;
4313
4421
  return error.status === 404 && error.code === "run_not_found";
4314
4422
  }
@@ -4317,7 +4425,7 @@ function scriptAlive(item) {
4317
4425
  }
4318
4426
  function createAutomationRunner(deps) {
4319
4427
  const home = deps.home ?? configuration.configuration.happyHomeDir;
4320
- const client$1 = deps.client ?? client.createAutomationsClient({ serverUrl: deps.serverUrl ?? configuration.configuration.serverUrl, token: deps.token, client: "daemon-auto" });
4428
+ const client = deps.client ?? client$1.createAutomationsClient({ serverUrl: deps.serverUrl ?? configuration.configuration.serverUrl, token: deps.token, client: "daemon-auto" });
4321
4429
  const runScript$1 = deps.runScript ?? runScript;
4322
4430
  const runPrecheck$1 = deps.runPrecheck ?? runPrecheck;
4323
4431
  const readTurn = deps.readTurn ?? defaultReadTurn;
@@ -4337,9 +4445,9 @@ function createAutomationRunner(deps) {
4337
4445
  }
4338
4446
  async function finish(item, report2) {
4339
4447
  try {
4340
- await client$1.report(item.runId, report2);
4448
+ await client.report(item.runId, report2);
4341
4449
  } catch (error) {
4342
- if (report2.status === "skipped" && error instanceof client.AutomationsRequestError && error.status === 400) {
4450
+ if (report2.status === "skipped" && error instanceof client$1.AutomationsRequestError && error.status === 400) {
4343
4451
  await finish(item, { ...report2, status: "failed" });
4344
4452
  return;
4345
4453
  }
@@ -4365,7 +4473,7 @@ function createAutomationRunner(deps) {
4365
4473
  async function reportRunning(item, sessionId, stickyKey) {
4366
4474
  const body = { claimId: item.claimId, status: "running", ...sessionId ? { sessionId } : {}, ...stickyKey ? { stickyKey } : {} };
4367
4475
  try {
4368
- await client$1.report(item.runId, body);
4476
+ await client.report(item.runId, body);
4369
4477
  } catch (error) {
4370
4478
  if (isSettledByServer(error)) {
4371
4479
  settleExternally(item);
@@ -4550,7 +4658,7 @@ ${action.prompt}`, { localId: `automation-${run.id}` });
4550
4658
  await reportRunning(track(claimed, "send", bound.sessionId), bound.sessionId, stickyKey);
4551
4659
  return;
4552
4660
  }
4553
- if (bound) await client$1.deleteSticky(automation.id, stickyKey).catch(() => deps.log(`Automation ${automation.name}: stale sticky ${stickyKey} not cleared`));
4661
+ if (bound) await client.deleteSticky(automation.id, stickyKey).catch(() => deps.log(`Automation ${automation.name}: stale sticky ${stickyKey} not cleared`));
4554
4662
  }
4555
4663
  let directory = expandHome(action.directory);
4556
4664
  if (!path.isAbsolute(directory)) {
@@ -4573,6 +4681,7 @@ ${action.prompt}`, { localId: `automation-${run.id}` });
4573
4681
  }
4574
4682
  persist({ runId: run.id, automationId: automation.id, kind: "spawn", phase: "running", claimId: run.claimId, sessionId: spawned.sessionId, stickyKey, ...action.worktree ? { directory } : {} });
4575
4683
  const item = track(claimed, "spawn", spawned.sessionId);
4684
+ if (automation.projectId && deps.joinProject) await deps.joinProject(spawned.sessionId, automation.projectId).catch(() => void 0);
4576
4685
  try {
4577
4686
  const capabilities = persistence.readPersistedSessions()[spawned.sessionId]?.metadata?.capabilities ?? null;
4578
4687
  const meta = spawnAgents.resolveFirstMessageMeta({ agent, permissionMode, explicitModel: action.model ?? void 0, capabilities });
@@ -4630,7 +4739,7 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
4630
4739
  item.lastLeaseAt = at;
4631
4740
  const body = { claimId: item.claimId, leaseMs: index.AUTOMATION_DEFAULT_LEASE_MS, ...item.pendingRunning ? { status: "running", ...item.pendingRunning } : {} };
4632
4741
  try {
4633
- const run = await client$1.report(item.runId, body);
4742
+ const run = await client.report(item.runId, body);
4634
4743
  item.pendingRunning = void 0;
4635
4744
  if (index.isAutomationRunTerminal(run.status)) settleExternally(item);
4636
4745
  } catch (error) {
@@ -4676,10 +4785,10 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
4676
4785
  const capacity = AUTOMATION_MAX_CONCURRENT - tracked.size;
4677
4786
  if (now() >= disabledUntil && capacity > 0) {
4678
4787
  try {
4679
- const claimed = await client$1.claim({ machineId: deps.machineId, limit: capacity, leaseMs: index.AUTOMATION_DEFAULT_LEASE_MS, capabilities: [index.AUTOMATION_DAEMON_CAPABILITY_PRECHECK] });
4788
+ const claimed = await client.claim({ machineId: deps.machineId, limit: capacity, leaseMs: index.AUTOMATION_DEFAULT_LEASE_MS, capabilities: [index.AUTOMATION_DAEMON_CAPABILITY_PRECHECK] });
4680
4789
  await Promise.all(claimed.runs.map((entry) => closed ? Promise.resolve() : execute(entry).catch((error) => deps.log(`Automation run ${entry.run.id} failed to start: ${error instanceof Error ? error.message : String(error)}`))));
4681
4790
  } catch (error) {
4682
- if (client.isAutomationsUnavailable(error)) {
4791
+ if (client$1.isAutomationsUnavailable(error)) {
4683
4792
  disabledUntil = now() + 6e4;
4684
4793
  if (now() - lastUnavailableLogAt >= AUTOMATION_UNAVAILABLE_LOG_MS) {
4685
4794
  lastUnavailableLogAt = now();
@@ -4687,7 +4796,7 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
4687
4796
  }
4688
4797
  } else {
4689
4798
  disabledUntil = now() + 1e4;
4690
- deps.log(`Automation claim failed${error instanceof client.AutomationsRequestError ? ` (${error.status})` : ""}`);
4799
+ deps.log(`Automation claim failed${error instanceof client$1.AutomationsRequestError ? ` (${error.status})` : ""}`);
4691
4800
  }
4692
4801
  }
4693
4802
  }
@@ -4702,7 +4811,7 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
4702
4811
  if (event === "idle") item.attentionReported = false;
4703
4812
  if (event === "blocked" && !item.attentionReported) {
4704
4813
  item.attentionReported = true;
4705
- void client$1.report(item.runId, { claimId: item.claimId, needsAttention: true, attentionReason: "needs_input" }).catch(() => deps.log(`Automation run ${item.runId} attention report failed`));
4814
+ void client.report(item.runId, { claimId: item.claimId, needsAttention: true, attentionReason: "needs_input" }).catch(() => deps.log(`Automation run ${item.runId} attention report failed`));
4706
4815
  }
4707
4816
  }
4708
4817
  }
@@ -4896,7 +5005,7 @@ async function startDaemon() {
4896
5005
  const turnActivity = new api.TurnActivityTracker();
4897
5006
  const backgroundTasks = new backgroundTaskActivity.BackgroundTaskTracker();
4898
5007
  const peerCoordinator = createPeerCoordinator({ getChildren: () => Array.from(pidToTrackedSession.values()) });
4899
- const hibernationAutomations = client.createAutomationsClient({ serverUrl: configuration.configuration.serverUrl, token: credentials.token, client: "daemon-hibernate" });
5008
+ const hibernationAutomations = client$1.createAutomationsClient({ serverUrl: configuration.configuration.serverUrl, token: credentials.token, client: "daemon-hibernate" });
4900
5009
  const daemonHibernation = createDaemonHibernation({
4901
5010
  idleMs: () => persistence.resolveIdleMs(agentHibernationSetting),
4902
5011
  checkMs: persistence.resolveCheckMs(),
@@ -4919,7 +5028,7 @@ async function startDaemon() {
4919
5028
  try {
4920
5029
  return await collectAutomationBindings(hibernationAutomations, machineId);
4921
5030
  } catch (error) {
4922
- if (client.isAutomationsUnavailable(error)) return [];
5031
+ if (client$1.isAutomationsUnavailable(error)) return [];
4923
5032
  throw error;
4924
5033
  }
4925
5034
  },
@@ -4933,6 +5042,7 @@ async function startDaemon() {
4933
5042
  const sessionIdToFinishedSession = /* @__PURE__ */ new Map();
4934
5043
  let teamWorker;
4935
5044
  let automationRunner;
5045
+ let projectPresence;
4936
5046
  const persisted = persistence.readPersistedSessions();
4937
5047
  const liveHappyProcesses = await doctor$1.findAllHappyProcesses();
4938
5048
  for (const [id, s] of Object.entries(persisted)) {
@@ -5022,6 +5132,7 @@ async function startDaemon() {
5022
5132
  }
5023
5133
  };
5024
5134
  const assistantSpawnGate = createSpawnGate();
5135
+ const projectsClient = client.createProjectsClient({ token: async () => credentials.token });
5025
5136
  const spawnSession = async (options) => {
5026
5137
  const timer = createSpawnTimer();
5027
5138
  await index$1.refreshAgentHomes(Date.now(), { allowStale: true });
@@ -5033,6 +5144,10 @@ async function startDaemon() {
5033
5144
  result = await (options.forceNew ? assistantSpawnGate.replace(() => spawnSessionImpl(options, timer)) : assistantSpawnGate.join(() => spawnSessionImpl(options, timer)));
5034
5145
  }
5035
5146
  logger.logger.debug(timer.format({ agent: options.agent ?? "claude", outcome: result.type }));
5147
+ if (result.type === "success" && options.parentSessionId) {
5148
+ const outcome = await spawnAgents.joinProject(projectsClient, result.sessionId, { kind: "lineage", parentSessionId: options.parentSessionId });
5149
+ if (outcome.joined) logger.logger.debug(`[DAEMON RUN] fork ${result.sessionId} joined project ${outcome.projectId} (lineage)`);
5150
+ }
5036
5151
  return result;
5037
5152
  };
5038
5153
  const currentCliAvailability = () => apiMachineRef?.getCLIAvailability() ?? startupCliAvailability;
@@ -5663,7 +5778,7 @@ async function startDaemon() {
5663
5778
  resolve();
5664
5779
  }
5665
5780
  };
5666
- const requested = sessionLock.terminateProcess(pid, () => {
5781
+ const requested = sessionLock.terminateProcessTree(pid, () => {
5667
5782
  const tracked = pidToTrackedSession.get(pid);
5668
5783
  if (tracked) {
5669
5784
  if (tracked.happySessionId && tracked.encryption) {
@@ -5779,7 +5894,7 @@ async function startDaemon() {
5779
5894
  logger.logger.debug(`[DAEMON RUN] Attempting to stop session ${sessionId}`);
5780
5895
  for (const [pid, session] of pidToTrackedSession.entries()) {
5781
5896
  if (session.happySessionId === sessionId || sessionId.startsWith("PID-") && pid === parseInt(sessionId.replace("PID-", ""))) {
5782
- const requested = sessionLock.terminateProcess(pid, (stopped) => {
5897
+ const requested = sessionLock.terminateProcessTree(pid, (stopped) => {
5783
5898
  if (!stopped) {
5784
5899
  logger.logger.debug(`[DAEMON RUN] Session ${sessionId} survived SIGTERM and SIGKILL attempts`);
5785
5900
  return;
@@ -6042,6 +6157,12 @@ async function startDaemon() {
6042
6157
  daemonHibernation.invalidateBindings();
6043
6158
  return persistence.resolveIdleMs(agentHibernationSetting);
6044
6159
  });
6160
+ const webPanelsSync = startWebPanelsSync({
6161
+ statMtime: async () => (await fs.stat(configuration.configuration.settingsFile).catch(() => null))?.mtimeMs ?? null,
6162
+ readRaw: async () => (await persistence.readSettings()).webPanels,
6163
+ publish: (panels) => apiMachine.setWebPanels(panels),
6164
+ logProblems: (problems) => logger.logger.warn(`[DAEMON RUN] settings.json webPanels: skipped ${problems.length} entr${problems.length === 1 ? "y" : "ies"}: ${problems.map((p) => `#${p.index}${p.id ? ` (${p.id})` : ""} ${p.reason}`).join("; ")}`)
6165
+ });
6045
6166
  apiMachine.connect();
6046
6167
  if (identityConflict?.confidence === "weak") {
6047
6168
  void apiMachine.updateMachineMetadata((current) => ({
@@ -6149,6 +6270,7 @@ async function startDaemon() {
6149
6270
  logger.logger.debug(relayMove ? `[DAEMON RUN] Relay moved to ${relayMove.serverUrl}; handing off to a new daemon on the new settings` : "[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
6150
6271
  teamWorker?.stop();
6151
6272
  automationRunner?.stop();
6273
+ projectPresence?.stop();
6152
6274
  clearInterval(restartOnStaleVersionAndHeartbeat);
6153
6275
  clearInterval(cliUpdateInterval);
6154
6276
  stopAgentVersionChecks();
@@ -6222,6 +6344,18 @@ async function startDaemon() {
6222
6344
  if (result.type !== "success") return false;
6223
6345
  return waitForSessionLive(id, (sid) => [...pidToTrackedSession.values()].some((s) => s.happySessionId === sid && isPidAlive(s.pid)));
6224
6346
  },
6347
+ joinProject: (sessionId, projectId) => spawnAgents.joinProject(projectsClient, sessionId, { kind: "explicit", projectId }, { via: "automation" }),
6348
+ log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
6349
+ });
6350
+ projectPresence = createProjectPresenceReporter({
6351
+ machineId,
6352
+ client: projectsClient,
6353
+ live: () => [...pidToTrackedSession.values()].filter((s) => s.happySessionId && isPidAlive(s.pid)).map((s) => ({
6354
+ sessionId: s.happySessionId,
6355
+ flavor: s.happySessionMetadataFromLocalWebhook?.flavor ?? null,
6356
+ branch: s.happySessionMetadataFromLocalWebhook?.worktree?.branch ?? null,
6357
+ running: turnActivity.activeSessions().includes(s.happySessionId)
6358
+ })),
6225
6359
  log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
6226
6360
  });
6227
6361
  void apiMachine.updateMachineMetadata((current) => ({
@@ -6232,10 +6366,12 @@ async function startDaemon() {
6232
6366
  worktreeVersion: mirrorProtocol.WORKTREE_CAPABILITY_VERSION
6233
6367
  })).catch(() => logger.logger.debug("[DAEMON RUN] Teams capability publication will retry on reconnect"));
6234
6368
  const cleanupAndShutdown = async (source, errorMessage) => {
6369
+ webPanelsSync.stop();
6235
6370
  logger.logger.debug(`[DAEMON RUN] Starting proper cleanup (source: ${source}, errorMessage: ${errorMessage})...`);
6236
6371
  const scrollbackFlush = apiMachine.flushTerminalScrollback();
6237
6372
  teamWorker?.stop();
6238
6373
  automationRunner?.stop({ killScripts: true });
6374
+ projectPresence?.stop();
6239
6375
  mirrorProtocol.currentWorktreeService()?.stopAll();
6240
6376
  if (restartOnStaleVersionAndHeartbeat) {
6241
6377
  clearInterval(restartOnStaleVersionAndHeartbeat);
@@ -1,59 +1,61 @@
1
1
  'use strict';
2
2
 
3
3
  var os = require('node:os');
4
- var sessionLock = require('./sessionLock-DWX6BbiU.cjs');
5
- var persistence = require('./persistence-BfX72dne.cjs');
6
- var defaultPermissionMode = require('./defaultPermissionMode-BEWCqJU-.cjs');
4
+ var sessionLock = require('./sessionLock-DokGab2R.cjs');
5
+ var persistence = require('./persistence-BegE7NPa.cjs');
6
+ var defaultPermissionMode = require('./defaultPermissionMode-pS3vmiSg.cjs');
7
7
  var node_crypto = require('node:crypto');
8
- var api = require('./api-JANhFdZV.cjs');
9
- var logger = require('./logger-DXTWlPzP.cjs');
10
- var createSessionMetadata = require('./createSessionMetadata-B2NynaWZ.cjs');
11
- var _package = require('./package-DY4zTbKS.cjs');
12
- var index = require('./index-_l1Sdmbi.cjs');
8
+ var api = require('./api-Cmjfr8Z7.cjs');
9
+ var logger = require('./logger-C1GWx3gi.cjs');
10
+ var createSessionMetadata = require('./createSessionMetadata-BkIzHALd.cjs');
11
+ var _package = require('./package-SgqTYsjn.cjs');
12
+ var index = require('./index-C6O2vVjm.cjs');
13
13
  var forkBackfill = require('./forkBackfill-8eLDeS73.cjs');
14
- var configuration = require('./configuration-4TGMrjul.cjs');
15
- var controlClient = require('./controlClient-BTaZlbC6.cjs');
16
- var machineMetadata = require('./machineMetadata-DcUupMje.cjs');
14
+ var configuration = require('./configuration-CMHZnp6G.cjs');
15
+ var controlClient = require('./controlClient-C-5qCt8W.cjs');
16
+ var machineMetadata = require('./machineMetadata-CLHS9sv_.cjs');
17
17
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
18
18
  var path = require('node:path');
19
19
  var permissionMode = require('./permissionMode-CrV-XuMs.cjs');
20
20
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
21
21
  var promises = require('node:fs/promises');
22
- var attachmentContent = require('./attachmentContent-bpQTBJ0y.cjs');
22
+ var attachmentContent = require('./attachmentContent-Bo0UAsSu.cjs');
23
23
  var transcriptCursor = require('./transcriptCursor-DcXGLeSc.cjs');
24
24
  var startupPlan = require('./startupPlan-BLMbfQIH.cjs');
25
25
  require('node:fs');
26
+ require('./processTreeSnapshot-mDbnuojn.cjs');
27
+ require('node:child_process');
26
28
  require('zod');
27
29
  require('axios');
28
- require('./lidState-BeOwj6eW.cjs');
30
+ require('./lidState-Dv2wwFTj.cjs');
29
31
  require('os');
30
32
  require('child_process');
31
33
  require('node:events');
32
34
  require('socket.io-client');
33
- require('./attachmentLimits-SqeAHrVC.cjs');
35
+ require('./pushNotifications-DaLQUyi0.cjs');
36
+ require('./contentLogMetadata-ZSFk_NjQ.cjs');
34
37
  require('./limits-C-a7gr04.cjs');
35
- require('./time-A6zR3Iy6.cjs');
36
- require('./registerCommonHandlers-C0_fyBQ0.cjs');
38
+ require('./time-CrwIMHta.cjs');
39
+ require('./registerCommonHandlers-Cj084Sg7.cjs');
37
40
  require('util');
38
41
  require('fs/promises');
39
42
  require('crypto');
40
43
  require('path');
41
44
  require('cross-spawn');
42
45
  require('@paralleldrive/cuid2');
43
- require('./sync-Dhmtk66S.cjs');
46
+ require('./sync-D23jbqVa.cjs');
44
47
  require('./backgroundTaskActivity-CBvUdj39.cjs');
45
- require('./contentLogMetadata-ZSFk_NjQ.cjs');
46
48
  require('chalk');
47
49
  require('node:util');
48
50
  require('./detectCLI-DR9ZaN6B.cjs');
49
51
  require('fs');
50
- require('./localHappyAgentAuth-Br-mgogg.cjs');
52
+ require('./localHappyAgentAuth-DjYvkXvV.cjs');
51
53
  require('tweetnacl');
52
54
  require('url');
53
55
 
54
56
  const DEFAULT_CLAUDE_MODEL = void 0;
55
57
  const DEFAULT_CLAUDE_EFFORT = void 0;
56
- const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-RRw-Nusc.cjs'); });
58
+ const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-B81cOKnH.cjs'); });
57
59
  async function runClaude(credentials, options = {}) {
58
60
  logger.logger.debug(`[CLAUDE] ===== CLAUDE MODE STARTING =====`);
59
61
  logger.logger.debug(`[CLAUDE] This is the Claude agent, NOT Gemini`);
@@ -67,7 +69,7 @@ async function runClaude(credentials, options = {}) {
67
69
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
68
70
  if (isAssistantVariant) {
69
71
  try {
70
- const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-DCQ87Aan.cjs'); });
72
+ const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-exVucYav.cjs'); });
71
73
  await bootstrapAssistantHome();
72
74
  } catch (error) {
73
75
  logger.logger.debug("[START] Assistant home bootstrap failed:", error);
@@ -142,7 +144,7 @@ async function runClaude(credentials, options = {}) {
142
144
  // a brand-new session cannot pick a PDF until after sending once.
143
145
  attachmentKinds: [...attachmentContent.CLAUDE_ATTACHMENT_KINDS],
144
146
  queueCancellation: true,
145
- capabilities: ["claude-steer-v1", "claude-live-permission-v1", "claude-live-permission-v2", "claude-btw-v1", "claude-runtime-controls-v1", "claude-opus-5-5-v1", index.PROMPT_QUEUE_CAPABILITY, forkBackfill.FORK_BACKFILL_CAPABILITY, persistence.HIBERNATION_CAPABILITY],
147
+ capabilities: ["claude-steer-v1", "claude-live-permission-v1", "claude-live-permission-v2", "claude-btw-v1", "claude-runtime-controls-v1", "claude-opus-5-5-v1", index.PROMPT_QUEUE_CAPABILITY, forkBackfill.FORK_BACKFILL_CAPABILITY, persistence.HIBERNATION_CAPABILITY, index.PROJECT_SESSION_CAPABILITY],
146
148
  // Effective mode this process enforces. Kept current by
147
149
  // publishPermissionMode below; the web renders it instead of guessing.
148
150
  permissionMode: permissionMode.mapToClaudeMode(initialPermissionMode ?? "default"),
@@ -187,7 +189,7 @@ async function runClaude(credentials, options = {}) {
187
189
  }
188
190
  if (!response) {
189
191
  let offlineSessionId = null;
190
- const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-CdIVnOZp.cjs'); });
192
+ const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-re4yjSTx.cjs'); });
191
193
  const { createSessionScanner: createSessionScanner2 } = await loadDeps();
192
194
  const reconnection = api.startOfflineReconnection({
193
195
  serverUrl: configuration.configuration.serverUrl,
@@ -309,7 +311,9 @@ async function runClaude(credentials, options = {}) {
309
311
  claudeCheckSession,
310
312
  createSessionScanner,
311
313
  getProjectPath,
312
- RawJSONLinesSchema,
314
+ replayClaudeForkJsonl,
315
+ snapshotTree,
316
+ terminateSurvivors,
313
317
  TitleGenerator,
314
318
  BoardAnalyzer,
315
319
  FileRateLimiter,
@@ -351,21 +355,10 @@ async function runClaude(credentials, options = {}) {
351
355
  const jsonlPath = path.join(getProjectPath(workingDirectory), `${forkClaudeSessionId}.jsonl`);
352
356
  try {
353
357
  const file = await promises.readFile(jsonlPath, "utf-8");
354
- const lines = file.split("\n");
355
- let backfilled = 0;
356
- for (const line of lines) {
357
- if (line.trim().length === 0) continue;
358
- let parsed;
359
- try {
360
- parsed = JSON.parse(line);
361
- } catch {
362
- continue;
363
- }
364
- const result = RawJSONLinesSchema.safeParse(parsed);
365
- if (!result.success) continue;
366
- session.sendClaudeSessionMessage(result.data);
367
- backfilled += 1;
368
- }
358
+ const backfilled = replayClaudeForkJsonl(file, {
359
+ send: (line) => session.sendClaudeSessionMessage(line),
360
+ closeTurn: () => session.closeReplayedClaudeTurn()
361
+ });
369
362
  logger.logger.debug(`[FORK BACKFILL] Replayed ${backfilled} historical messages from ${jsonlPath}`);
370
363
  session.updateMetadata((meta) => ({ ...meta, claudeSessionId: forkClaudeSessionId }));
371
364
  void forkBackfill.publishForkBackfillWhenCommitted(session, { count: backfilled }).then((published) => logger.logger.debug(`[FORK BACKFILL] ${published ? "Committed" : "Session closed before commit of"} ${backfilled} replayed messages`));
@@ -449,7 +442,7 @@ async function runClaude(credentials, options = {}) {
449
442
  session.sendClaudeSessionMessage(raw);
450
443
  }
451
444
  });
452
- const happyServer = await startHappyServer(session, { assistant: isAssistantVariant, selfReportState: boardSelfReport });
445
+ const happyServer = await startHappyServer(session, { assistant: isAssistantVariant, selfReportState: boardSelfReport, push: { sendAttention: (input) => api$1.push().sendAttention(input) } });
453
446
  logger.logger.debug(`[START] Happy MCP server started at ${happyServer.url}`);
454
447
  let currentSession = null;
455
448
  const prewarmHookGate = new PrewarmHookGate();
@@ -803,6 +796,7 @@ async function runClaude(credentials, options = {}) {
803
796
  logger.logger.debug(`[START] Received termination signal, cleaning up (archive=${intent === "archive"})...`);
804
797
  promptQueueDrain.close();
805
798
  cleanupPrewarm();
799
+ const wrapperTree = snapshotTree(process.pid);
806
800
  try {
807
801
  if (session) {
808
802
  currentSession?.cleanup();
@@ -822,9 +816,11 @@ async function runClaude(credentials, options = {}) {
822
816
  cleanupHookSettingsFile(hookSettingsPath);
823
817
  await remoteScanner.cleanup();
824
818
  logger.logger.debug("[START] Cleanup complete, exiting");
819
+ await terminateSurvivors(wrapperTree);
825
820
  process.exit(0);
826
821
  } catch (error) {
827
822
  logger.logger.debug("[START] Error during cleanup:", error);
823
+ await terminateSurvivors(wrapperTree).catch(() => void 0);
828
824
  process.exit(1);
829
825
  }
830
826
  };