very-happy-cli 0.2.185 → 0.2.186

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 (194) hide show
  1. package/dist/{AcpBackend-DkoqWhTa.mjs → AcpBackend-ConXUH67.mjs} +3 -3
  2. package/dist/{AcpBackend-CCqL9mP1.cjs → AcpBackend-aVv-_nH_.cjs} +3 -3
  3. package/dist/{AcpSessionManager-BNPex8tJ.mjs → AcpSessionManager-BxD1AQ8L.mjs} +2 -2
  4. package/dist/{AcpSessionManager-DrtAJQUH.cjs → AcpSessionManager-aRdzf_6R.cjs} +2 -2
  5. package/dist/{BasePermissionHandler-DJZITwmL.cjs → BasePermissionHandler-BsOLZCNB.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-Dd4oGPDg.mjs → BasePermissionHandler-Hj7Qregq.mjs} +1 -1
  7. package/dist/{acpSessionResume-_2NtETqb.mjs → acpSessionResume-CKacrrHV.mjs} +1 -1
  8. package/dist/{acpSessionResume-umHzSMbQ.cjs → acpSessionResume-CpPNoxaW.cjs} +1 -1
  9. package/dist/{agentHome-Dv_hRIt7.mjs → agentHome-CawmLuWV.mjs} +4 -4
  10. package/dist/{agentHome-CmIMqMWy.cjs → agentHome-VS7FrFQZ.cjs} +4 -4
  11. package/dist/{api-BTS8mqLy.mjs → api-DUFy21Nf.mjs} +10 -10
  12. package/dist/{api-BSz8MYte.cjs → api-DjqQTT16.cjs} +10 -10
  13. package/dist/{apiMachine-BcjccOmd.mjs → apiMachine-B0sBCHNZ.mjs} +14 -14
  14. package/dist/{apiMachine-utCDabnO.cjs → apiMachine-D2BrVBYu.cjs} +14 -14
  15. package/dist/{attachmentContent-hkdGP2NV.cjs → attachmentContent-2kInPZrP.cjs} +2 -2
  16. package/dist/{attachmentContent-DpOzgDTw.mjs → attachmentContent-D01-pLOB.mjs} +2 -2
  17. package/dist/{auth-CpbTj74y.mjs → auth-B-CqTcVh.mjs} +8 -8
  18. package/dist/{auth-B8nCUEiK.cjs → auth-CImUXAjH.cjs} +5 -5
  19. package/dist/{auth-DzXdF08E.cjs → auth-CujfCIv-.cjs} +8 -8
  20. package/dist/{auth-BKD2U9S2.mjs → auth-DP3eN2Fv.mjs} +5 -5
  21. package/dist/{auto-C-NK2JS8.mjs → auto-D4KRQIBu.mjs} +17 -17
  22. package/dist/{auto-E3ouHO37.cjs → auto-oWgZl7mM.cjs} +17 -17
  23. package/dist/{bootstrap-DIMkxIbR.cjs → bootstrap-B7YvJcVK.cjs} +2 -2
  24. package/dist/{bootstrap-DV4dqeCe.mjs → bootstrap-MFmMruyB.mjs} +2 -2
  25. package/dist/{browser-Ch50ZchJ.cjs → browser-C19iD31j.cjs} +1 -1
  26. package/dist/{browser-C0xt1NE-.mjs → browser-CfFbN1Us.mjs} +1 -1
  27. package/dist/{claudeLocal-Curd8-dn.cjs → claudeLocal-C4A7-BmS.cjs} +5 -5
  28. package/dist/{claudeLocal-D-U3fIdS.mjs → claudeLocal-C6wNx9qH.mjs} +5 -5
  29. package/dist/{claudeLocalLauncher-BEJ9Wad_.cjs → claudeLocalLauncher-BfCKs7Le.cjs} +10 -10
  30. package/dist/{claudeLocalLauncher-BTNUVzRK.mjs → claudeLocalLauncher-DdPfufcS.mjs} +10 -10
  31. package/dist/{claudeSessionFork-DMdeScGk.cjs → claudeSessionFork-B8NjdHYD.cjs} +1 -1
  32. package/dist/{claudeSessionFork-JPEHVbfR.mjs → claudeSessionFork-D8XT48Lf.mjs} +1 -1
  33. package/dist/{client-Ct1rnpJw.mjs → client-BfGuTBMO.mjs} +2 -2
  34. package/dist/{client-D1rJt15-.mjs → client-CKM07bJH.mjs} +4 -4
  35. package/dist/{client-qgKef7S6.cjs → client-CMIhQ32m.cjs} +2 -2
  36. package/dist/{client-C54hMWx6.cjs → client-CTNxuHVc.cjs} +2 -2
  37. package/dist/{client-D2lOnvzs.mjs → client-DAnQqPmc.mjs} +2 -2
  38. package/dist/{client-dpo5EbS9.cjs → client-jAdkYZRf.cjs} +4 -4
  39. package/dist/codex/happyMcpStdioBridge.cjs +16 -16
  40. package/dist/codex/happyMcpStdioBridge.mjs +16 -16
  41. package/dist/{codexAppServerClient-CM3O0zHW.mjs → codexAppServerClient-DhOC61k9.mjs} +3 -3
  42. package/dist/{codexAppServerClient-DGeqZViU.cjs → codexAppServerClient-Dv1Mh3MS.cjs} +3 -3
  43. package/dist/{codexCommand-D_8fbJEk.cjs → codexCommand-CWrFt3Ne.cjs} +42 -42
  44. package/dist/{codexCommand-CkdopWS7.mjs → codexCommand-D3_i93Rm.mjs} +42 -42
  45. package/dist/{codexTermination-FO52Ahcx.mjs → codexTermination-B08GgahL.mjs} +1 -1
  46. package/dist/{codexTermination-MG2j2DDX.cjs → codexTermination-DErS0cGt.cjs} +1 -1
  47. package/dist/{config-CppOKnWe.mjs → config-D3OBduhj.mjs} +3 -3
  48. package/dist/{config-IDbpY1Am.cjs → config-D_aj3xgw.cjs} +3 -3
  49. package/dist/{configuration-CwfmwaLU.cjs → configuration-CI0GWwaT.cjs} +1 -1
  50. package/dist/{configuration-HPdj5Til.mjs → configuration-DbCHeEeP.mjs} +1 -1
  51. package/dist/{connect-BNlBIAM8.cjs → connect-839tEkPN.cjs} +13 -13
  52. package/dist/{connect-1YK7vPbW.mjs → connect-BuwVpjkZ.mjs} +13 -13
  53. package/dist/{context-DetK5c-x.mjs → context-D2Y_qLs0.mjs} +1 -1
  54. package/dist/{context-D3vDWjiI.cjs → context-zhirgqSw.cjs} +1 -1
  55. package/dist/{controlClient-DTMI1aTp.cjs → controlClient-BIi1tzEo.cjs} +3 -3
  56. package/dist/{controlClient-DBylxaEh.mjs → controlClient-Dv80mB_j.mjs} +3 -3
  57. package/dist/{createSessionMetadata-D2Ll7PlQ.cjs → createSessionMetadata-DT24NjY2.cjs} +2 -2
  58. package/dist/{createSessionMetadata-D8pfpX4V.mjs → createSessionMetadata-Dqy_DfoF.mjs} +2 -2
  59. package/dist/{daemonSupervisor-DfzrtNhM.mjs → daemonSupervisor-BxohggqN.mjs} +40 -1
  60. package/dist/{daemonSupervisor-57JYYzMf.cjs → daemonSupervisor-alqGPANc.cjs} +43 -1
  61. package/dist/{defaultPermissionMode-DVXkcryy.cjs → defaultPermissionMode-BYqJbPhc.cjs} +2 -2
  62. package/dist/{defaultPermissionMode-Bkhj_DwT.mjs → defaultPermissionMode-yR27mevc.mjs} +2 -2
  63. package/dist/{deterministicJson-cEWItQun.mjs → deterministicJson-COiJcmUR.mjs} +13 -13
  64. package/dist/{deterministicJson-DUCYjhHe.cjs → deterministicJson-CoWlyn_X.cjs} +13 -13
  65. package/dist/{doctor-tLRILlmz.cjs → doctor-DI6aIOne.cjs} +7 -7
  66. package/dist/{doctor-DpWtxNeT.mjs → doctor-Ymj096qP.mjs} +7 -7
  67. package/dist/{downloadTarget-Ci5wcYC2.cjs → downloadTarget-BOXHrxbm.cjs} +6 -6
  68. package/dist/{downloadTarget-B5b5BHb2.mjs → downloadTarget-DRXCRDub.mjs} +6 -6
  69. package/dist/{ensureDaemonRunning-Dsv8UPwx.cjs → ensureDaemonRunning-BqNjYnar.cjs} +5 -5
  70. package/dist/{ensureDaemonRunning-GDGwNDGF.mjs → ensureDaemonRunning-DTrrXAdz.mjs} +5 -5
  71. package/dist/{handleResumeCommand-CncudrQd.cjs → handleResumeCommand-BBKUGhCv.cjs} +5 -5
  72. package/dist/{handleResumeCommand-DW7Ml1u5.mjs → handleResumeCommand-DW_MRgtz.mjs} +5 -5
  73. package/dist/{index-Wf6mKJq9.mjs → index-04pYyzsJ.mjs} +4 -4
  74. package/dist/{index-DisBaRvM.mjs → index-B9f1vKcC.mjs} +96 -0
  75. package/dist/{index-Dzb_Bsfu.cjs → index-Bq6VHNdk.cjs} +4 -4
  76. package/dist/{index-Ub-5xbcU.cjs → index-BumVulwx.cjs} +96 -0
  77. package/dist/{index-Vx4EQ6wI.cjs → index-CY573fnz.cjs} +4 -4
  78. package/dist/{index-bT1X9Brv.mjs → index-CmlAXizv.mjs} +4 -4
  79. package/dist/{index-DRWlaLbe.mjs → index-Cyu_8WAd.mjs} +3 -3
  80. package/dist/{index-BEHzEYP0.cjs → index-D9lJhXUk.cjs} +39 -39
  81. package/dist/{index-Bh806Q-1.cjs → index-W8wlfp57.cjs} +3 -3
  82. package/dist/{index-C1qLnBOk.mjs → index-WW17yjQO.mjs} +40 -40
  83. package/dist/index.cjs +2 -2
  84. package/dist/index.mjs +2 -2
  85. package/dist/{install-CRs4tGBa.cjs → install-C1y_g7kj.cjs} +3 -3
  86. package/dist/{install-DmF9wfwV.mjs → install-C5XCDwgD.mjs} +3 -3
  87. package/dist/lib.cjs +12 -12
  88. package/dist/lib.mjs +12 -12
  89. package/dist/{lidState-wwiu6M3p.cjs → lidState-BxHu6dus.cjs} +1 -1
  90. package/dist/{lidState-CG9jFcML.mjs → lidState-CZ1ggYiB.mjs} +1 -1
  91. package/dist/{localHappyAgentAuth-UoytSUX0.cjs → localHappyAgentAuth-BHklNDKQ.cjs} +1 -1
  92. package/dist/{localHappyAgentAuth-CWha8BiX.mjs → localHappyAgentAuth-OJk4xDwg.mjs} +1 -1
  93. package/dist/{logger-BjXkscIr.mjs → logger-CpaeM90D.mjs} +2 -2
  94. package/dist/{logger-CIUMiSLo.cjs → logger-L0pLBOLK.cjs} +2 -2
  95. package/dist/{machineMetadata-BPlyxzxb.cjs → machineMetadata-YeHF4gSY.cjs} +3 -3
  96. package/dist/{machineMetadata-Ca4Dpy6s.mjs → machineMetadata-ukaYmmlK.mjs} +3 -3
  97. package/dist/{main-FD8mmcsK.cjs → main-VyiAJXfb.cjs} +47 -47
  98. package/dist/{main-CS1U9i4s.mjs → main-pkH_VRP-.mjs} +47 -47
  99. package/dist/{mcp-BS6rdR8p.mjs → mcp-BwoAhEnN.mjs} +15 -15
  100. package/dist/{mcp-C7Rm1dTM.cjs → mcp-Y8Xsr2Xh.cjs} +15 -15
  101. package/dist/{mirrorProtocol-CMJ2HOZF.cjs → mirrorProtocol-Did0-1jn.cjs} +3 -3
  102. package/dist/{mirrorProtocol-C3Anki4S.mjs → mirrorProtocol-DukUp2Bj.mjs} +3 -3
  103. package/dist/{package-CRDjc5vK.cjs → package-BuATIMpK.cjs} +7 -7
  104. package/dist/{package-Do0Y9bGA.mjs → package-DagIeOhi.mjs} +7 -7
  105. package/dist/{panels-C-jss7nF.mjs → panels-C3dUoUbA.mjs} +5 -5
  106. package/dist/{panels-DwTHrZuo.cjs → panels-CZ_CRUbM.cjs} +5 -5
  107. package/dist/{peerTools-CL7zBxlC.mjs → peerTools-CUCqJ83-.mjs} +5 -5
  108. package/dist/{peerTools-SLRntgX6.cjs → peerTools-Cs3Ln6d0.cjs} +5 -5
  109. package/dist/{persistence-CNWBdUH2.cjs → persistence-CIzOAWK6.cjs} +2 -2
  110. package/dist/{persistence-CmVwM5uq.mjs → persistence-FgtDuVAP.mjs} +2 -2
  111. package/dist/{piRunnerArgs-CXJx3PPx.cjs → piRunnerArgs-CJhXFPM9.cjs} +1 -1
  112. package/dist/{piRunnerArgs-K0K9Y0Yq.mjs → piRunnerArgs-YbYkfixz.mjs} +1 -1
  113. package/dist/{piRuntime-Bv41vG05.cjs → piRuntime-CEzoAYHe.cjs} +1 -1
  114. package/dist/{piRuntime-BSoHy-QJ.mjs → piRuntime-CShuw-1A.mjs} +1 -1
  115. package/dist/{piTerminal-B8acGxsm.mjs → piTerminal-BvvcgVoW.mjs} +17 -17
  116. package/dist/{piTerminal-DSs-fnps.cjs → piTerminal-DVr2W6bI.cjs} +17 -17
  117. package/dist/{pushNotifications-DnpJJ7VR.mjs → pushNotifications-2CyhYAte.mjs} +3 -3
  118. package/dist/{pushNotifications-C651e0ZZ.cjs → pushNotifications-OtQY-Mfa.cjs} +3 -3
  119. package/dist/{query-rxLftxvh.mjs → query-B7DvMlYM.mjs} +1 -1
  120. package/dist/{query-DXFx2VZY.cjs → query-DimRl61I.cjs} +1 -1
  121. package/dist/{rateLimitWindows-D9mQRGHv.mjs → rateLimitWindows-C0zbGT7K.mjs} +1 -1
  122. package/dist/{rateLimitWindows-1WoBs8ln.cjs → rateLimitWindows-DwhrA5wy.cjs} +1 -1
  123. package/dist/{registerCommonHandlers-K-BTp2iR.cjs → registerCommonHandlers-De54jKz8.cjs} +2 -2
  124. package/dist/{registerCommonHandlers-DpBxSCBi.mjs → registerCommonHandlers-X9lnO2TF.mjs} +2 -2
  125. package/dist/{registerKillSessionHandler-DwPEAS2G.cjs → registerKillSessionHandler-CAif4Uz4.cjs} +6 -6
  126. package/dist/{registerKillSessionHandler-BDxd20fg.mjs → registerKillSessionHandler-CrLsN5m3.mjs} +6 -6
  127. package/dist/{remoteSessionClient-DnFblfFz.cjs → remoteSessionClient-9j3N_bzV.cjs} +5 -5
  128. package/dist/{remoteSessionClient-DHWfDMHA.mjs → remoteSessionClient-BApor-c2.mjs} +5 -5
  129. package/dist/{reportProgressTool-DJXfK6rp.mjs → reportProgressTool-6mDoxKuq.mjs} +3 -3
  130. package/dist/{reportProgressTool-CYgnezAO.cjs → reportProgressTool-RR5VkbDf.cjs} +3 -3
  131. package/dist/{run-BChqUxs6.cjs → run-B2ZorDI7.cjs} +216 -44
  132. package/dist/{run-BkixRBWm.mjs → run-CmA3cPD_.mjs} +219 -47
  133. package/dist/{runClaude-Bdw9vTgv.cjs → runClaude-Dk73bQ0n.cjs} +22 -22
  134. package/dist/{runClaude-FWTCLnVq.mjs → runClaude-bxwea9mX.mjs} +22 -22
  135. package/dist/{runClaudeDeps-C6mCzhtO.mjs → runClaudeDeps-DoaYM017.mjs} +43 -43
  136. package/dist/{runClaudeDeps-CN_moqup.cjs → runClaudeDeps-dVfReVd4.cjs} +38 -38
  137. package/dist/{runGemini-CzPwEltY.cjs → runGemini-BD-wQe5q.cjs} +33 -33
  138. package/dist/{runGemini-CI7ut_ng.mjs → runGemini-Dq2iv4UF.mjs} +33 -33
  139. package/dist/{runOpenClaw-CLw64Nmq.cjs → runOpenClaw-BXLv_bvU.cjs} +18 -18
  140. package/dist/{runOpenClaw-8V2K_-lg.mjs → runOpenClaw-C1NB1aLx.mjs} +18 -18
  141. package/dist/{sandbox-DD2oQTt3.cjs → sandbox-9MIBf8kS.cjs} +4 -4
  142. package/dist/{sandbox-BMkBdvHW.mjs → sandbox-Dqs_T8Jw.mjs} +4 -4
  143. package/dist/{selfCheck-0jELpLE9.cjs → selfCheck-CkUezhrg.cjs} +37 -37
  144. package/dist/selfCheck-Dz_Sm7w8.mjs +86 -0
  145. package/dist/{send-BNjwFaVp.mjs → send-4q066vij.mjs} +8 -8
  146. package/dist/{send-BoLglO1t.cjs → send-rdhpycNB.cjs} +8 -8
  147. package/dist/{server-C5wOp8jw.mjs → server-DN6TvjhP.mjs} +4 -4
  148. package/dist/{server-Uw82k7zD.cjs → server-DxTjt1mK.cjs} +6 -6
  149. package/dist/{sessionLock-YMRCi-Ec.mjs → sessionLock-DOsE5UUf.mjs} +3 -3
  150. package/dist/{sessionLock-BTo7Cdbi.cjs → sessionLock-h4162Jrf.cjs} +3 -3
  151. package/dist/{sessionOps-BO6AesNJ.mjs → sessionOps--9p2IzVA.mjs} +4 -4
  152. package/dist/{sessionOps-BDHEzyAY.cjs → sessionOps-tmBKG5qg.cjs} +4 -4
  153. package/dist/{sessionProvider-DLdJJV6A.cjs → sessionProvider-B9w7rFDR.cjs} +5 -5
  154. package/dist/{sessionProvider-CB9lGJdF.mjs → sessionProvider-C6MHJZ9Z.mjs} +5 -5
  155. package/dist/{sessionScanner-BkukogZy.mjs → sessionScanner-B6hzp5R9.mjs} +3 -3
  156. package/dist/{sessionScanner-3TevonZd.cjs → sessionScanner-Bgvz8Uiy.cjs} +3 -3
  157. package/dist/{sessions-BkBcZSj7.cjs → sessions-DJMVXKRz.cjs} +10 -10
  158. package/dist/{sessions-Bx-6fXTL.mjs → sessions-iItaUQAF.mjs} +10 -10
  159. package/dist/{setupOfflineReconnection-DYzysFFJ.mjs → setupOfflineReconnection-DF78nz1N.mjs} +2 -2
  160. package/dist/{setupOfflineReconnection-DMfoVL-0.cjs → setupOfflineReconnection-DL4HUMDJ.cjs} +2 -2
  161. package/dist/{spawn-DvyBhowH.cjs → spawn-CL9A8dBJ.cjs} +14 -14
  162. package/dist/{spawn-CHC32rLr.mjs → spawn-CoYfACsc.mjs} +14 -14
  163. package/dist/{spawnAgents-D15n6tAj.cjs → spawnAgents-DsJSyLDl.cjs} +1 -1
  164. package/dist/{spawnAgents-jXo9jIYo.mjs → spawnAgents-f2q31uUV.mjs} +1 -1
  165. package/dist/{spawnHappyCLI-WYJCvAWD.cjs → spawnHappyCLI-BWOub_Uf.cjs} +1 -1
  166. package/dist/{spawnHappyCLI-e9MaJWB0.mjs → spawnHappyCLI-BcSO1rF6.mjs} +1 -1
  167. package/dist/{specialCommands-D00VrQ09.mjs → specialCommands-B-DAeFrU.mjs} +3 -3
  168. package/dist/{specialCommands-DqrQnKHC.cjs → specialCommands-ByrcSYSh.cjs} +3 -3
  169. package/dist/{startFileWatcher-VFZ-Bpwa.cjs → startFileWatcher-BZrpUz7_.cjs} +1 -1
  170. package/dist/{startFileWatcher-CvUUesns.mjs → startFileWatcher-DVia64Vg.mjs} +1 -1
  171. package/dist/{startupSessionCreate-B25xTUJ4.cjs → startupSessionCreate-63ABDnfJ.cjs} +1 -1
  172. package/dist/{startupSessionCreate-B6HNLg0g.mjs → startupSessionCreate-CY4tPjlZ.mjs} +1 -1
  173. package/dist/{streamRelay-GzHxvMem.mjs → streamRelay-B3FloUTT.mjs} +1 -1
  174. package/dist/{streamRelay-CtTpf-Li.cjs → streamRelay-Cn_uGG6m.cjs} +1 -1
  175. package/dist/{sync-DliZ1zZh.cjs → sync-CKSmwxec.cjs} +1 -1
  176. package/dist/{sync-HPnxI4fz.mjs → sync-CZjyTC4v.mjs} +1 -1
  177. package/dist/{systemPrompt-D9JJpzl_.mjs → systemPrompt-BKUVX-fd.mjs} +2 -2
  178. package/dist/{systemPrompt-CYvRvanR.cjs → systemPrompt-BPzhf5d5.cjs} +2 -2
  179. package/dist/{teams-C0PJlIMz.mjs → teams-B2-KPjRg.mjs} +7 -7
  180. package/dist/{teams-D7Ad6YSf.cjs → teams-CHBszdmc.cjs} +7 -7
  181. package/dist/{template-BLJxflCH.cjs → template-DPsqlHJQ.cjs} +1 -1
  182. package/dist/{template-YlpbYGeQ.mjs → template-DuKZw-Sz.mjs} +1 -1
  183. package/dist/{time-BbJ-NWcl.mjs → time-BsNUVcKH.mjs} +1 -1
  184. package/dist/{time-BCGGrWp4.cjs → time-DcICfW0N.cjs} +1 -1
  185. package/dist/{titleGenerator-03Y2uoZW.mjs → titleGenerator-B4b4ah--.mjs} +1 -1
  186. package/dist/{titleGenerator-IrI84kqh.cjs → titleGenerator-Bvk1mx7G.cjs} +2 -2
  187. package/dist/{todo-DdV9_uEu.cjs → todo-BN4hhun6.cjs} +6 -6
  188. package/dist/{todo-DOh8KaxD.mjs → todo-C7--CBge.mjs} +6 -6
  189. package/dist/{tools-WXF7ApAe.mjs → tools-BILbS8Hh.mjs} +1 -1
  190. package/dist/{tools-DeoxWyQ0.cjs → tools-Bl5Q_6Nr.cjs} +1 -1
  191. package/dist/{uninstall-BVYlC0jw.mjs → uninstall-Bjwl9bqK.mjs} +3 -3
  192. package/dist/{uninstall-oGvAKOlN.cjs → uninstall-_qDbgdxh.cjs} +3 -3
  193. package/package.json +7 -7
  194. package/dist/selfCheck-DgWZfw5E.mjs +0 -86
@@ -1,19 +1,19 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-CIUMiSLo.cjs');
3
+ var logger = require('./logger-L0pLBOLK.cjs');
4
4
  require('axios');
5
5
  require('node:events');
6
6
  require('socket.io-client');
7
- require('./pushNotifications-C651e0ZZ.cjs');
7
+ require('./pushNotifications-OtQY-Mfa.cjs');
8
8
  require('node:crypto');
9
9
  require('tweetnacl');
10
- require('./configuration-CwfmwaLU.cjs');
11
- require('./index-Ub-5xbcU.cjs');
12
- require('./registerCommonHandlers-K-BTp2iR.cjs');
10
+ require('./configuration-CI0GWwaT.cjs');
11
+ require('./index-BumVulwx.cjs');
12
+ require('./registerCommonHandlers-De54jKz8.cjs');
13
13
  require('os');
14
14
  require('child_process');
15
15
  require('@paralleldrive/cuid2');
16
- require('./persistence-CNWBdUH2.cjs');
16
+ require('./persistence-CIzOAWK6.cjs');
17
17
  require('chalk');
18
18
  require('./types-CRS-srZK.cjs');
19
19
 
@@ -1,17 +1,17 @@
1
- import { l as logger } from './logger-BjXkscIr.mjs';
1
+ import { l as logger } from './logger-CpaeM90D.mjs';
2
2
  import 'axios';
3
3
  import 'node:events';
4
4
  import 'socket.io-client';
5
- import './pushNotifications-DnpJJ7VR.mjs';
5
+ import './pushNotifications-2CyhYAte.mjs';
6
6
  import 'node:crypto';
7
7
  import 'tweetnacl';
8
- import './configuration-HPdj5Til.mjs';
9
- import './index-DisBaRvM.mjs';
10
- import './registerCommonHandlers-DpBxSCBi.mjs';
8
+ import './configuration-DbCHeEeP.mjs';
9
+ import './index-B9f1vKcC.mjs';
10
+ import './registerCommonHandlers-X9lnO2TF.mjs';
11
11
  import 'os';
12
12
  import 'child_process';
13
13
  import '@paralleldrive/cuid2';
14
- import './persistence-CmVwM5uq.mjs';
14
+ import './persistence-FgtDuVAP.mjs';
15
15
  import 'chalk';
16
16
  import './types-CkqAACXx.mjs';
17
17
 
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var controlClient = require('./controlClient-DTMI1aTp.cjs');
4
- var sessionOps = require('./sessionOps-BDHEzyAY.cjs');
5
- var time = require('./time-BCGGrWp4.cjs');
3
+ var controlClient = require('./controlClient-BIi1tzEo.cjs');
4
+ var sessionOps = require('./sessionOps-tmBKG5qg.cjs');
5
+ var time = require('./time-DcICfW0N.cjs');
6
6
  var axios = require('axios');
7
7
  var os = require('node:os');
8
- var configuration = require('./configuration-CwfmwaLU.cjs');
9
- var persistence = require('./persistence-CNWBdUH2.cjs');
8
+ var configuration = require('./configuration-CI0GWwaT.cjs');
9
+ var persistence = require('./persistence-CIzOAWK6.cjs');
10
10
  var node_crypto = require('node:crypto');
11
11
 
12
12
  const ACTIVE_FRESH_WINDOW_MS = 15 * 60 * 1e3;
@@ -1,10 +1,10 @@
1
- import { j as resumeDaemonSession, l as listDaemonSessions } from './controlClient-DBylxaEh.mjs';
2
- import { d as archiveSession, u as unarchiveSession, h as sessionLiveness, e as sendUserMessage, i as readSessionState, o as openUserScopedSocket } from './sessionOps-BO6AesNJ.mjs';
3
- import { d as delay } from './time-BbJ-NWcl.mjs';
1
+ import { j as resumeDaemonSession, l as listDaemonSessions } from './controlClient-Dv80mB_j.mjs';
2
+ import { d as archiveSession, u as unarchiveSession, h as sessionLiveness, e as sendUserMessage, i as readSessionState, o as openUserScopedSocket } from './sessionOps--9p2IzVA.mjs';
3
+ import { d as delay } from './time-BsNUVcKH.mjs';
4
4
  import axios from 'axios';
5
5
  import { hostname } from 'node:os';
6
- import { c as configuration } from './configuration-HPdj5Til.mjs';
7
- import { r as readSettings, b as readCredentialsForConfiguredRelay } from './persistence-CmVwM5uq.mjs';
6
+ import { c as configuration } from './configuration-DbCHeEeP.mjs';
7
+ import { r as readSettings, b as readCredentialsForConfiguredRelay } from './persistence-FgtDuVAP.mjs';
8
8
  import { randomUUID } from 'node:crypto';
9
9
 
10
10
  const ACTIVE_FRESH_WINDOW_MS = 15 * 60 * 1e3;
@@ -1,8 +1,8 @@
1
1
  import { z } from 'zod';
2
- import { o as AutomationNameSchema, d as AUTOMATION_ATTENTION_REASON_MAX_CHARS, e as AUTOMATION_SUMMARY_MAX_CHARS, c as AutomationPrecheckSchema, p as AutomationConcurrencySchema, q as AutomationActionSchema, t as AutomationTriggerSchema } from './index-DisBaRvM.mjs';
3
- import { a as authenticatedAutomationsClient, b as automationRunIdFromEnv } from './client-Ct1rnpJw.mjs';
2
+ import { o as AutomationNameSchema, d as AUTOMATION_ATTENTION_REASON_MAX_CHARS, e as AUTOMATION_SUMMARY_MAX_CHARS, c as AutomationPrecheckSchema, p as AutomationConcurrencySchema, q as AutomationActionSchema, t as AutomationTriggerSchema } from './index-B9f1vKcC.mjs';
3
+ import { a as authenticatedAutomationsClient, b as automationRunIdFromEnv } from './client-BfGuTBMO.mjs';
4
4
  import { u as updateAutomationChecked, c as createAutomationChecked } from './precheckCompat-DeEbilbr.mjs';
5
- import { P as ProjectsUnsupportedError, a as ProjectRequestError, s as sharedProjectsClient } from './client-D2lOnvzs.mjs';
5
+ import { P as ProjectsUnsupportedError, a as ProjectRequestError, s as sharedProjectsClient } from './client-DAnQqPmc.mjs';
6
6
  import { f as formatContextForTool } from './prompt-QHuFx9j6.mjs';
7
7
  import { R as REPORT_PROGRESS_TOOL_NAME, d as REPORT_PROGRESS_TOOL_TITLE, e as REPORT_PROGRESS_TOOL_DESCRIPTION } from './agentGuidance-BDYt2Qy2.mjs';
8
8
 
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var z = require('zod');
4
- var index = require('./index-Ub-5xbcU.cjs');
5
- var client = require('./client-qgKef7S6.cjs');
4
+ var index = require('./index-BumVulwx.cjs');
5
+ var client = require('./client-CMIhQ32m.cjs');
6
6
  var precheckCompat = require('./precheckCompat-CWOi5c9L.cjs');
7
- var client$1 = require('./client-C54hMWx6.cjs');
7
+ var client$1 = require('./client-CTNxuHVc.cjs');
8
8
  var prompt = require('./prompt-Bof2aQkI.cjs');
9
9
  var agentGuidance = require('./agentGuidance-BtBx2xxE.cjs');
10
10
 
@@ -1,27 +1,27 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-CMJ2HOZF.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-Did0-1jn.cjs');
4
4
  var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
5
- var piRunnerArgs = require('./piRunnerArgs-CXJx3PPx.cjs');
5
+ var piRunnerArgs = require('./piRunnerArgs-CJhXFPM9.cjs');
6
6
  var fs = require('fs/promises');
7
7
  var os$1 = require('os');
8
8
  var tmp = require('tmp');
9
9
  var axios = require('axios');
10
10
  var node_fs = require('node:fs');
11
11
  var path = require('node:path');
12
- var configuration = require('./configuration-CwfmwaLU.cjs');
13
- var api = require('./api-BSz8MYte.cjs');
14
- var spawnAgents = require('./spawnAgents-D15n6tAj.cjs');
15
- var logger = require('./logger-CIUMiSLo.cjs');
16
- var index$2 = require('./index-Bh806Q-1.cjs');
17
- var auth = require('./auth-B8nCUEiK.cjs');
12
+ var configuration = require('./configuration-CI0GWwaT.cjs');
13
+ var api = require('./api-DjqQTT16.cjs');
14
+ var spawnAgents = require('./spawnAgents-DsJSyLDl.cjs');
15
+ var logger = require('./logger-L0pLBOLK.cjs');
16
+ var index$2 = require('./index-W8wlfp57.cjs');
17
+ var auth = require('./auth-CImUXAjH.cjs');
18
18
  var child_process = require('child_process');
19
- var _package = require('./package-CRDjc5vK.cjs');
20
- var doctor = require('./doctor-tLRILlmz.cjs');
21
- var spawnHappyCLI = require('./spawnHappyCLI-WYJCvAWD.cjs');
22
- var persistence = require('./persistence-CNWBdUH2.cjs');
23
- var controlClient = require('./controlClient-DTMI1aTp.cjs');
24
- var sessionOps = require('./sessionOps-BDHEzyAY.cjs');
19
+ var _package = require('./package-BuATIMpK.cjs');
20
+ var doctor = require('./doctor-DI6aIOne.cjs');
21
+ var spawnHappyCLI = require('./spawnHappyCLI-BWOub_Uf.cjs');
22
+ var persistence = require('./persistence-CIzOAWK6.cjs');
23
+ var controlClient = require('./controlClient-BIi1tzEo.cjs');
24
+ var sessionOps = require('./sessionOps-tmBKG5qg.cjs');
25
25
  var fastify = require('fastify');
26
26
  var z = require('zod');
27
27
  var fastifyTypeProviderZod = require('fastify-type-provider-zod');
@@ -29,62 +29,62 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
29
29
  var node_crypto = require('node:crypto');
30
30
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
31
31
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
32
- var rateLimitWindows = require('./rateLimitWindows-1WoBs8ln.cjs');
33
- var peerTools = require('./peerTools-SLRntgX6.cjs');
32
+ var rateLimitWindows = require('./rateLimitWindows-DwhrA5wy.cjs');
33
+ var peerTools = require('./peerTools-Cs3Ln6d0.cjs');
34
34
  var os = require('node:os');
35
- var remoteSessionClient = require('./remoteSessionClient-DnFblfFz.cjs');
36
- var bootstrap = require('./bootstrap-DIMkxIbR.cjs');
37
- var index$1 = require('./index-Dzb_Bsfu.cjs');
35
+ var remoteSessionClient = require('./remoteSessionClient-9j3N_bzV.cjs');
36
+ var bootstrap = require('./bootstrap-B7YvJcVK.cjs');
37
+ var index$1 = require('./index-Bq6VHNdk.cjs');
38
38
  var require$$0 = require('fs');
39
39
  var require$$1 = require('path');
40
40
  var node_child_process = require('node:child_process');
41
41
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
42
42
  var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
43
- var machineMetadata = require('./machineMetadata-BPlyxzxb.cjs');
43
+ var machineMetadata = require('./machineMetadata-YeHF4gSY.cjs');
44
44
  var fileStore = require('./fileStore-7qhnbs6N.cjs');
45
45
  var pi = require('./pi-DlsrPCTa.cjs');
46
46
  var require$$3 = require('crypto');
47
47
  var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
48
- var handleResumeCommand = require('./handleResumeCommand-CncudrQd.cjs');
48
+ var handleResumeCommand = require('./handleResumeCommand-BBKUGhCv.cjs');
49
49
  var webPanels = require('./webPanels-FCgFKvVe.cjs');
50
- var index = require('./index-Ub-5xbcU.cjs');
50
+ var index = require('./index-BumVulwx.cjs');
51
51
  var promises = require('node:fs/promises');
52
52
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
53
- var client = require('./client-C54hMWx6.cjs');
54
- var client$1 = require('./client-qgKef7S6.cjs');
55
- var daemonSupervisor = require('./daemonSupervisor-57JYYzMf.cjs');
53
+ var client = require('./client-CTNxuHVc.cjs');
54
+ var client$1 = require('./client-CMIhQ32m.cjs');
55
+ var daemonSupervisor = require('./daemonSupervisor-alqGPANc.cjs');
56
56
  var path$1 = require('./path-B7zW-WwE.cjs');
57
57
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
58
- var startFileWatcher = require('./startFileWatcher-VFZ-Bpwa.cjs');
59
- var sync = require('./sync-DliZ1zZh.cjs');
58
+ var startFileWatcher = require('./startFileWatcher-BZrpUz7_.cjs');
59
+ var sync = require('./sync-CKSmwxec.cjs');
60
60
  var types = require('./types-CRS-srZK.cjs');
61
61
  var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
62
- var sessionLock = require('./sessionLock-BTo7Cdbi.cjs');
62
+ var sessionLock = require('./sessionLock-h4162Jrf.cjs');
63
63
  var doctor$1 = require('./doctor-u46qYYKX.cjs');
64
64
  var resources = require('./resources-CqwHPhdK.cjs');
65
65
  var node_util = require('node:util');
66
- var template = require('./template-BLJxflCH.cjs');
66
+ var template = require('./template-DPsqlHJQ.cjs');
67
67
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
68
- require('./acpSessionResume-umHzSMbQ.cjs');
69
- require('./lidState-wwiu6M3p.cjs');
68
+ require('./acpSessionResume-CpPNoxaW.cjs');
69
+ require('./lidState-BxHu6dus.cjs');
70
70
  require('node:events');
71
71
  require('socket.io-client');
72
- require('./pushNotifications-C651e0ZZ.cjs');
72
+ require('./pushNotifications-OtQY-Mfa.cjs');
73
73
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
74
74
  require('./limits-C-a7gr04.cjs');
75
- require('./time-BCGGrWp4.cjs');
76
- require('./registerCommonHandlers-K-BTp2iR.cjs');
75
+ require('./time-DcICfW0N.cjs');
76
+ require('./registerCommonHandlers-De54jKz8.cjs');
77
77
  require('util');
78
78
  require('cross-spawn');
79
79
  require('@paralleldrive/cuid2');
80
80
  require('chalk');
81
81
  require('node:module');
82
82
  require('tweetnacl');
83
- require('./browser-Ch50ZchJ.cjs');
83
+ require('./browser-C19iD31j.cjs');
84
84
  require('open');
85
85
  require('./ids-B6ZC0HGt.cjs');
86
86
  require('url');
87
- require('./localHappyAgentAuth-UoytSUX0.cjs');
87
+ require('./localHappyAgentAuth-BHklNDKQ.cjs');
88
88
  require('./processTreeSnapshot-mDbnuojn.cjs');
89
89
  require('ps-list');
90
90
 
@@ -4431,7 +4431,7 @@ const runNpmProcess = (args, deps = processDefaults) => new Promise((resolveResu
4431
4431
  child.on("close", (code) => done({ code: timedOut ? null : code, stdout, stderr, terminationConfirmed: !timedOut || treeKilled }));
4432
4432
  });
4433
4433
  const runNpm = (args) => runNpmProcess(args);
4434
- const defaults = {
4434
+ const defaults$1 = {
4435
4435
  npm: runNpm,
4436
4436
  fs: { lstat: promises.lstat, readlink: promises.readlink, unlink: promises.unlink, rm: promises.rm, readFile: promises.readFile, symlink: promises.symlink, access: promises.access },
4437
4437
  platform: process.platform,
@@ -4463,7 +4463,7 @@ function ownedCliLink(link, target, packageDir) {
4463
4463
  const resolved = path.resolve(path.dirname(link), target);
4464
4464
  return resolved.startsWith(path.join(packageDir, "bin") + path.sep);
4465
4465
  }
4466
- async function installCliSafely(version, deps = defaults) {
4466
+ async function installCliSafely(version, deps = defaults$1) {
4467
4467
  const parsed = cliUpdate.parseExactVersion(version);
4468
4468
  if (!parsed) throw new Error("Invalid exact CLI version");
4469
4469
  if (deps.platform === "win32") {
@@ -4560,6 +4560,12 @@ async function installCliSafely(version, deps = defaults) {
4560
4560
  }
4561
4561
  }
4562
4562
 
4563
+ const DEFAULT_BUSY_INSTALL_GRACE_MS = 15 * 6e4;
4564
+ function resolveBusyInstallGrace(raw) {
4565
+ if (raw === void 0 || raw.trim() === "") return DEFAULT_BUSY_INSTALL_GRACE_MS;
4566
+ const value = Number(raw);
4567
+ return Number.isInteger(value) && value >= 0 && value <= 24 * 60 * 6e4 ? value : DEFAULT_BUSY_INSTALL_GRACE_MS;
4568
+ }
4563
4569
  function createUpdateController(deps) {
4564
4570
  let policy = null;
4565
4571
  let outcome = null;
@@ -4570,6 +4576,8 @@ function createUpdateController(deps) {
4570
4576
  let handoverHold;
4571
4577
  let lastPublished = "";
4572
4578
  let autoUpdateEnabled;
4579
+ let busySince = null;
4580
+ let busyDeferred = null;
4573
4581
  let lastInstall = (() => {
4574
4582
  try {
4575
4583
  return deps.lastInstall?.read() ?? null;
@@ -4636,14 +4644,29 @@ function createUpdateController(deps) {
4636
4644
  publish(order === null ? "policy_stale" : "current", target);
4637
4645
  return;
4638
4646
  }
4647
+ let whileBusy = false;
4639
4648
  if (!deps.idle()) {
4640
- publish("waiting_idle", target);
4641
- return;
4649
+ if (busySince?.version !== target) busySince = { version: target, at: now() };
4650
+ whileBusy = !!deps.installWhileBusy && busyDeferred?.version !== target && !deps.installFenced?.() && now() - busySince.at >= (deps.busyGraceMs ?? DEFAULT_BUSY_INSTALL_GRACE_MS);
4651
+ if (!whileBusy) {
4652
+ publish("waiting_idle", target, busyDeferred?.version === target ? busyDeferred.reason : void 0);
4653
+ return;
4654
+ }
4642
4655
  }
4643
4656
  running = true;
4644
- publish("installing", target);
4657
+ publish("installing", target, whileBusy ? "while_busy" : void 0);
4645
4658
  try {
4646
- const code = await deps.install(target);
4659
+ const code = whileBusy ? await deps.installWhileBusy(target) : await deps.install(target);
4660
+ if (code && typeof code === "object" && "deferred" in code) {
4661
+ busyDeferred = { version: target, reason: code.deferred };
4662
+ publish("waiting_idle", target, code.deferred);
4663
+ return;
4664
+ }
4665
+ if (code && typeof code === "object" && "blocked" in code) {
4666
+ blocked = true;
4667
+ publish("manual_required", target, code.blocked);
4668
+ return;
4669
+ }
4647
4670
  if (code && typeof code === "object") {
4648
4671
  if ("manual" in code) publish("manual_required", target, code.manual);
4649
4672
  else publish("failed", target, code.failed);
@@ -4761,6 +4784,134 @@ function createUpdateController(deps) {
4761
4784
  return { refresh, retry, request, tick, withHandover, holdHandover, isRunning: () => running, currentTarget: () => policy?.autoUpdateVersion ?? null };
4762
4785
  }
4763
4786
 
4787
+ const defaults = {
4788
+ npm: runNpm,
4789
+ fs: { lstat: promises.lstat, readlink: promises.readlink, readFile: promises.readFile, readdir: promises.readdir, copyFile: promises.copyFile, mkdir: promises.mkdir, rename: promises.rename, rm: promises.rm, access: promises.access },
4790
+ platform: process.platform,
4791
+ runningPackageDir: projectPath.projectPath(),
4792
+ now: Date.now
4793
+ };
4794
+ const MANAGED_BINS = ["very-happy", "very-happy-mcp"];
4795
+ async function manifest(dir, deps) {
4796
+ try {
4797
+ return JSON.parse(await deps.fs.readFile(path.join(dir, "package.json"), "utf8"));
4798
+ } catch {
4799
+ return null;
4800
+ }
4801
+ }
4802
+ async function isFile(path, deps) {
4803
+ const stat = await deps.fs.lstat(path).catch(() => null);
4804
+ return !!stat?.isFile();
4805
+ }
4806
+ function packageRelative(path$1) {
4807
+ const normalized = path.relative("/pkg", path.resolve("/pkg", path$1));
4808
+ return normalized && !normalized.startsWith("..") && !normalized.startsWith(path.sep) ? normalized : null;
4809
+ }
4810
+ async function binsUnchanged(stagedDir, liveDir, prefix, deps) {
4811
+ const staged = await manifest(stagedDir, deps);
4812
+ const bin = staged?.bin;
4813
+ if (!bin || typeof bin !== "object") return "staged_bin_map_unreadable";
4814
+ const names = Object.keys(bin).sort();
4815
+ if (names.join(",") !== [...MANAGED_BINS].sort().join(",")) return "staged_bin_map_changed";
4816
+ for (const name of MANAGED_BINS) {
4817
+ const target = packageRelative(String(bin[name]));
4818
+ if (!target || !await isFile(path.join(stagedDir, target), deps)) return "staged_bin_missing";
4819
+ const link = path.join(prefix, "bin", name);
4820
+ const stat = await deps.fs.lstat(link).catch(() => null);
4821
+ if (!stat?.isSymbolicLink()) return "live_bin_not_linked";
4822
+ const linkTarget = await deps.fs.readlink(link);
4823
+ if (!ownedCliLink(link, linkTarget, liveDir)) return "live_bin_not_owned";
4824
+ if (path.relative(liveDir, path.resolve(path.dirname(link), linkTarget)) !== target) return "staged_bin_map_changed";
4825
+ }
4826
+ return null;
4827
+ }
4828
+ async function keepOldChunks(liveDir, stagedDir, deps, sub = "dist") {
4829
+ const live = await deps.fs.readdir(path.join(liveDir, sub)).catch(() => []);
4830
+ const staged = new Set(await deps.fs.readdir(path.join(stagedDir, sub)).catch(() => []));
4831
+ let kept = 0;
4832
+ for (const name of live) {
4833
+ if (path.basename(name) !== name) continue;
4834
+ const from = path.join(liveDir, sub, name);
4835
+ const stat = await deps.fs.lstat(from).catch(() => null);
4836
+ if (stat?.isDirectory()) {
4837
+ if (!staged.has(name)) await deps.fs.mkdir(path.join(stagedDir, sub, name));
4838
+ kept += await keepOldChunks(liveDir, stagedDir, deps, path.join(sub, name));
4839
+ continue;
4840
+ }
4841
+ if (staged.has(name) || !stat?.isFile()) continue;
4842
+ await deps.fs.copyFile(from, path.join(stagedDir, sub, name), node_fs.constants.COPYFILE_EXCL);
4843
+ kept++;
4844
+ }
4845
+ return kept;
4846
+ }
4847
+ async function installCliStaged(version, deps = defaults) {
4848
+ const parsed = cliUpdate.parseExactVersion(version);
4849
+ if (!parsed) throw new Error("Invalid exact CLI version");
4850
+ if (deps.platform === "win32") return { outcome: { deferred: "staged_install_unsupported" } };
4851
+ const liveDir = deps.runningPackageDir;
4852
+ const prefix = liveDir ? doctor.globalPrefixForPackage(liveDir) : null;
4853
+ if (!liveDir || !prefix) return { outcome: { manual: "install_location_unverified" } };
4854
+ const liveStat = await deps.fs.lstat(liveDir).catch(() => null);
4855
+ const live = await manifest(liveDir, deps);
4856
+ if (!liveStat?.isDirectory() || liveStat.isSymbolicLink() || live?.name !== "very-happy-cli" || typeof live.version !== "string") {
4857
+ return { outcome: { manual: "install_location_unverified" } };
4858
+ }
4859
+ const root = path.dirname(liveDir);
4860
+ try {
4861
+ await deps.fs.access(root, node_fs.constants.W_OK);
4862
+ await deps.fs.access(liveDir, node_fs.constants.W_OK);
4863
+ } catch {
4864
+ return { outcome: { manual: "install_location_not_writable" } };
4865
+ }
4866
+ const stagePrefix = path.join(root, `.very-happy-cli-stage-${parsed.exact}`);
4867
+ const stagedDir = path.join(stagePrefix, "lib", "node_modules", "very-happy-cli");
4868
+ const retiredDir = path.join(root, `.very-happy-cli-retired-${live.version}-${deps.now()}`);
4869
+ const cleanup = async (path) => {
4870
+ await deps.fs.rm(path, { recursive: true, force: true }).catch(() => void 0);
4871
+ };
4872
+ await cleanup(stagePrefix);
4873
+ let swapped = false;
4874
+ try {
4875
+ const result = await deps.npm(autoUpdateInstallArgs(parsed.exact, stagePrefix));
4876
+ if (result.terminationConfirmed === false) return { outcome: "blocked" };
4877
+ if (result.code !== 0) return { outcome: result.code };
4878
+ const staged = await manifest(stagedDir, deps);
4879
+ if (staged?.name !== "very-happy-cli" || staged.version !== parsed.exact) return { outcome: { deferred: "staged_package_unverified" } };
4880
+ const binProblem = await binsUnchanged(stagedDir, liveDir, prefix, deps);
4881
+ if (binProblem) return { outcome: { deferred: binProblem } };
4882
+ let keptChunks;
4883
+ try {
4884
+ keptChunks = await keepOldChunks(liveDir, stagedDir, deps);
4885
+ } catch {
4886
+ return { outcome: { deferred: "staged_copy_failed" } };
4887
+ }
4888
+ try {
4889
+ await deps.fs.rename(liveDir, retiredDir);
4890
+ } catch {
4891
+ return { outcome: { deferred: "staged_retire_failed" } };
4892
+ }
4893
+ try {
4894
+ await deps.fs.rename(stagedDir, liveDir);
4895
+ } catch {
4896
+ try {
4897
+ await deps.fs.rename(retiredDir, liveDir);
4898
+ } catch {
4899
+ return { outcome: { blocked: "staged_rollback_failed", retiredDir }, keptChunks };
4900
+ }
4901
+ return { outcome: { deferred: "staged_swap_failed" } };
4902
+ }
4903
+ swapped = true;
4904
+ const installed = await manifest(liveDir, deps);
4905
+ return { outcome: installed?.version === parsed.exact ? 0 : { failed: "installed_elsewhere" }, keptChunks };
4906
+ } finally {
4907
+ await cleanup(stagePrefix);
4908
+ if (swapped) {
4909
+ await cleanup(retiredDir);
4910
+ await cleanup(path.join(root, ".package-lock.json"));
4911
+ }
4912
+ }
4913
+ }
4914
+
4764
4915
  function parseLastInstall(raw) {
4765
4916
  if (!raw || typeof raw !== "object") return null;
4766
4917
  const { from, to, at, source } = raw;
@@ -8446,6 +8597,17 @@ async function startDaemon() {
8446
8597
  const daemonSupervisor$1 = daemonSupervisor.detectDaemonSupervisor(process.env, process.platform, launchdJob);
8447
8598
  const lineage = daemonSupervisor.daemonLineage(daemonSupervisor$1, process.env, process.platform, launchdJob);
8448
8599
  logger.logger.debug(`[DAEMON RUN] Supervisor: ${daemonSupervisor$1} (lineage ${lineage}${launchdJob ? `, launchd job pid ${launchdJob.jobPid ?? "-"}` : ""})`);
8600
+ const systemdKillMode = daemonSupervisor$1 === "systemd" ? await daemonSupervisor.probeSystemdKillMode() : null;
8601
+ const handoverSparesWrappers = daemonSupervisor.wrappersSurviveHandover({
8602
+ supervisor: daemonSupervisor$1,
8603
+ env: process.env,
8604
+ platform: process.platform,
8605
+ pid: process.pid,
8606
+ ppid: process.ppid,
8607
+ inContainer: require$$0.existsSync("/.dockerenv") || require$$0.existsSync("/run/.containerenv"),
8608
+ systemdKillMode
8609
+ });
8610
+ logger.logger.debug(`[DAEMON RUN] Handover spares wrappers: ${handoverSparesWrappers}${daemonSupervisor$1 === "systemd" ? ` (KillMode ${systemdKillMode ?? "unknown"})` : ""}`);
8449
8611
  let fileState = {
8450
8612
  pid: process.pid,
8451
8613
  httpPort: controlPort,
@@ -8579,6 +8741,15 @@ async function startDaemon() {
8579
8741
  // whose turn ended but still has background tasks is busy too.
8580
8742
  idle: () => !turnActivity.hasActiveTurn() && !backgroundTasks.hasAny() && !harnessInstaller?.isRunning(),
8581
8743
  install: installCliSafely,
8744
+ // B-817: a machine that is never idle installs after the grace period
8745
+ // through the staged path, which never leaves the live tree incomplete.
8746
+ installWhileBusy: async (version) => {
8747
+ const report = await installCliStaged(version);
8748
+ logger.logger.warn(`[DAEMON RUN] CLI update: staged install while busy -> ${JSON.stringify(report.outcome)} keptChunks=${report.keptChunks ?? 0}`);
8749
+ return report.outcome;
8750
+ },
8751
+ installFenced: () => !!harnessInstaller?.isRunning(),
8752
+ busyGraceMs: resolveBusyInstallGrace(process.env.HAPPY_CLI_UPDATE_BUSY_GRACE_MS),
8582
8753
  lastInstall: lastInstallStore(configuration.configuration.happyHomeDir),
8583
8754
  publish: (state) => {
8584
8755
  cliUpdateStateRef = state;
@@ -8680,7 +8851,8 @@ async function startDaemon() {
8680
8851
  }
8681
8852
  }
8682
8853
  const relayMove = pendingRelayMove;
8683
- if ((bundleReplaced || relayMove) && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !harnessInstaller?.isRunning() && !turnActivity.hasActiveTurn() && !backgroundTasks.hasAny()) {
8854
+ const sessionsHold = () => daemonSupervisor.handoverWaitsForSessions({ bundleReplaced, relayMove: !!relayMove, sparesWrappers: handoverSparesWrappers }) && (turnActivity.hasActiveTurn() || backgroundTasks.hasAny());
8855
+ if ((bundleReplaced || relayMove) && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !harnessInstaller?.isRunning() && !sessionsHold()) {
8684
8856
  const preflight = bundleReplaced ? await preflightNewBundle(bundlePath) : { action: "proceed" };
8685
8857
  if (preflight.action === "hold") {
8686
8858
  if (lastHandoverHold !== preflight.reason) {
@@ -8690,7 +8862,7 @@ async function startDaemon() {
8690
8862
  updateController.holdHandover(preflight.reason);
8691
8863
  return;
8692
8864
  }
8693
- if (teamWorker?.busy || automationRunner?.busy || updateController.isRunning() || harnessInstaller?.isRunning() || turnActivity.hasActiveTurn() || backgroundTasks.hasAny()) return;
8865
+ if (teamWorker?.busy || automationRunner?.busy || updateController.isRunning() || harnessInstaller?.isRunning() || sessionsHold()) return;
8694
8866
  lastHandoverHold = null;
8695
8867
  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");
8696
8868
  teamWorker?.stop();