very-happy-cli 0.2.158 → 0.2.160

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 (258) hide show
  1. package/dist/{AcpBackend-DIDRig5G.cjs → AcpBackend-Bm2rdke8.cjs} +78 -76
  2. package/dist/{AcpBackend-vDVLHuYJ.mjs → AcpBackend-mzv8Dhba.mjs} +4 -2
  3. package/dist/{AcpSessionManager-C44U99CC.cjs → AcpSessionManager-BAY1Pggx.cjs} +9 -9
  4. package/dist/{AcpSessionManager-CmRjfhn3.mjs → AcpSessionManager-CoMWFVw3.mjs} +1 -1
  5. package/dist/BasePermissionHandler-CFHAxumV.cjs +157 -0
  6. package/dist/BasePermissionHandler-m3WVholL.mjs +155 -0
  7. package/dist/BaseReasoningProcessor-BFa9_rZA.cjs +200 -0
  8. package/dist/BaseReasoningProcessor-CYrKBXGm.mjs +198 -0
  9. package/dist/RemoteModeDisplay-D-HewyXg.mjs +150 -0
  10. package/dist/RemoteModeDisplay-NC1gPHtj.cjs +153 -0
  11. package/dist/agentAttachments-Dbw8iMCZ.cjs +20 -0
  12. package/dist/agentAttachments-M_B5qEF2.mjs +18 -0
  13. package/dist/agentGuidance-B5NATuFa.cjs +28 -0
  14. package/dist/agentGuidance-CQuNlNx8.mjs +20 -0
  15. package/dist/{agentHome-Dw8Jx_CJ.cjs → agentHome-CboCeKWq.cjs} +14 -28
  16. package/dist/{agentHome-CyLmGH5L.mjs → agentHome-Dj1C43aJ.mjs} +8 -22
  17. package/dist/api-CLMUr-SX.mjs +3339 -0
  18. package/dist/api-CgundNNX.cjs +3346 -0
  19. package/dist/{types-DIBF4U0Y.mjs → apiMachine-B9dLW_p5.mjs} +9116 -16015
  20. package/dist/{types-DnrPeN80.cjs → apiMachine-Bn8482VM.cjs} +9104 -16057
  21. package/dist/assistantTools-BTqPnlFl.cjs +380 -0
  22. package/dist/assistantTools-D6tuc6o4.mjs +376 -0
  23. package/dist/attachmentContent-DpiTJZb4.cjs +88 -0
  24. package/dist/attachmentContent-_kxRznNf.mjs +82 -0
  25. package/dist/attachmentLimits-CzVrqgLR.cjs +354 -0
  26. package/dist/attachmentLimits-yba1uHFO.mjs +348 -0
  27. package/dist/auth-BDOVh5h5.cjs +220 -0
  28. package/dist/auth-Cwutmdsa.mjs +225 -0
  29. package/dist/auth-PYHZQNPp.mjs +218 -0
  30. package/dist/auth-ba4WMYrN.cjs +227 -0
  31. package/dist/authRelay-BdYkC1Po.cjs +156 -0
  32. package/dist/authRelay-DSAvg1uv.mjs +143 -0
  33. package/dist/{auto-DZbNcTXx.cjs → auto-BOX_fgmR.cjs} +70 -79
  34. package/dist/{auto-BlMZPwOk.mjs → auto-BXu14yP_.mjs} +27 -36
  35. package/dist/backgroundTaskActivity-8PdPxrvy.mjs +149 -0
  36. package/dist/backgroundTaskActivity-CBvUdj39.cjs +157 -0
  37. package/dist/bootstrap-B5G1TijC.cjs +116 -0
  38. package/dist/bootstrap-hxXPCFMx.mjs +112 -0
  39. package/dist/browser-Y6Bl8L_O.cjs +22 -0
  40. package/dist/browser-jh2P0UVZ.mjs +20 -0
  41. package/dist/claudeCliPath-BqkaH2oR.mjs +8 -0
  42. package/dist/claudeCliPath-U4HHmV4r.cjs +10 -0
  43. package/dist/claudeLocal-BaY4fZKi.mjs +339 -0
  44. package/dist/claudeLocal-CRGG4Pea.cjs +343 -0
  45. package/dist/claudeLocalLauncher-D4T7MTqd.mjs +152 -0
  46. package/dist/claudeLocalLauncher-DyEbVzUN.cjs +154 -0
  47. package/dist/cliUpdate-DsKXPFYp.cjs +120 -0
  48. package/dist/cliUpdate-Y34VGe9Y.mjs +112 -0
  49. package/dist/client-3Ac-O4pw.cjs +104 -0
  50. package/dist/client-BPNbmtvO.cjs +119 -0
  51. package/dist/client-CeGKqqcJ.mjs +100 -0
  52. package/dist/client-ClR0K8zX.mjs +112 -0
  53. package/dist/codex/happyMcpStdioBridge.cjs +33 -14
  54. package/dist/codex/happyMcpStdioBridge.mjs +26 -7
  55. package/dist/codexAppServerClient-I3teiV-N.mjs +1088 -0
  56. package/dist/codexAppServerClient-q2FjnRcK.cjs +1090 -0
  57. package/dist/codexCommand-4zcccIoq.cjs +2088 -0
  58. package/dist/codexCommand-Cc9gcbdX.mjs +2086 -0
  59. package/dist/codexThreadFork-BH9IZPqD.cjs +350 -0
  60. package/dist/codexThreadFork-slzAseLx.mjs +338 -0
  61. package/dist/{config-BtPArqRH.mjs → config-CTx_jb-C.mjs} +7 -40
  62. package/dist/{config-DG84bjwF.cjs → config-Ci9Kpgwa.cjs} +26 -59
  63. package/dist/configuration-BSYpcPwE.cjs +181 -0
  64. package/dist/configuration-RfeNjFmd.mjs +170 -0
  65. package/dist/connect-BpOdzNbE.mjs +682 -0
  66. package/dist/connect-C2CiOUFs.cjs +684 -0
  67. package/dist/constants-BC4St0xd.mjs +11 -0
  68. package/dist/constants-VJ0N6WuG.cjs +17 -0
  69. package/dist/contentLogMetadata-BlWI0egu.mjs +51 -0
  70. package/dist/contentLogMetadata-ZSFk_NjQ.cjs +54 -0
  71. package/dist/context-DsDr6E2t.cjs +69 -0
  72. package/dist/context-H0Bcb9S_.mjs +65 -0
  73. package/dist/controlClient-BGbDcgWS.mjs +260 -0
  74. package/dist/controlClient-Bcwv3D21.cjs +279 -0
  75. package/dist/createSessionMetadata-BJxEnM-o.cjs +58 -0
  76. package/dist/createSessionMetadata-CVVkGjxV.mjs +54 -0
  77. package/dist/defaultPermissionMode-BnxJPVHT.mjs +4 -0
  78. package/dist/defaultPermissionMode-CxmTXUQR.cjs +7 -0
  79. package/dist/detectCLI-CSGMlV51.mjs +58 -0
  80. package/dist/detectCLI-DR9ZaN6B.cjs +61 -0
  81. package/dist/deterministicJson-C5CYTVpm.cjs +507 -0
  82. package/dist/deterministicJson-CzkFJWw1.mjs +502 -0
  83. package/dist/doctor-BPkYWSuq.mjs +75 -0
  84. package/dist/doctor-D2YJ-Yn2.cjs +395 -0
  85. package/dist/doctor-DOvByjbk.mjs +391 -0
  86. package/dist/doctor-u46qYYKX.cjs +79 -0
  87. package/dist/doctorReadiness-BCZGcN0a.cjs +151 -0
  88. package/dist/doctorReadiness-C208SMN9.mjs +142 -0
  89. package/dist/editPaths-BVfS_FFL.mjs +68 -0
  90. package/dist/editPaths-Bqp4OFPw.cjs +73 -0
  91. package/dist/ensureDaemonRunning-BCwNrMyv.cjs +64 -0
  92. package/dist/ensureDaemonRunning-Dqa2pOjY.mjs +61 -0
  93. package/dist/handleResumeCommand-BvXYf5El.mjs +240 -0
  94. package/dist/handleResumeCommand-C2cKchpX.cjs +245 -0
  95. package/dist/ids-B6ZC0HGt.cjs +13 -0
  96. package/dist/ids-DU6sLx4C.mjs +10 -0
  97. package/dist/index-B6UGRQ7h.mjs +102 -0
  98. package/dist/{index-DPCsWlWK.cjs → index-B6pAdvJx.cjs} +131 -91
  99. package/dist/index-Bu5Zi_a9.cjs +182 -0
  100. package/dist/index-D3kI0hDR.cjs +107 -0
  101. package/dist/index-DA7yINuk.cjs +994 -0
  102. package/dist/index-DDeHXrIX.cjs +71 -0
  103. package/dist/index-DKLU_fD0.mjs +158 -0
  104. package/dist/{index-ZChGsuB7.mjs → index-DMZqWwsP.mjs} +79 -39
  105. package/dist/index-DVkMGPyS.mjs +68 -0
  106. package/dist/index-qdS1friN.mjs +949 -0
  107. package/dist/index.cjs +5 -46
  108. package/dist/index.mjs +5 -46
  109. package/dist/{install-DarS_Wco.mjs → install-BO_W7VhL.mjs} +37 -37
  110. package/dist/install-BgoC2e_2.cjs +88 -0
  111. package/dist/install-CFY3tYtJ.mjs +86 -0
  112. package/dist/{install-wKQGgXvN.cjs → install-Cs5qAPrB.cjs} +38 -38
  113. package/dist/{installPiTools-DuZ6jZvX.cjs → installPiTools-BKnXjrVu.cjs} +2 -3
  114. package/dist/{installPiTools-Cj7yU9Fc.mjs → installPiTools-B_CdM5_2.mjs} +1 -2
  115. package/dist/{installTerminalHooks-DcQfee_O.cjs → installTerminalHooks-BQZbvxsZ.cjs} +5 -40
  116. package/dist/{installTerminalHooks-CpNbRFPz.mjs → installTerminalHooks-By7gBMEF.mjs} +3 -38
  117. package/dist/lib.cjs +28 -19
  118. package/dist/lib.d.cts +126 -2
  119. package/dist/lib.d.mts +126 -2
  120. package/dist/lib.mjs +23 -14
  121. package/dist/lidState-BeDfxxEX.cjs +305 -0
  122. package/dist/lidState-CeEt442o.mjs +297 -0
  123. package/dist/limits-C-a7gr04.cjs +43 -0
  124. package/dist/limits-DIo7rEBR.mjs +36 -0
  125. package/dist/localHappyAgentAuth-C-HQyiv6.mjs +82 -0
  126. package/dist/localHappyAgentAuth-D6rFhaoc.cjs +86 -0
  127. package/dist/logger-6HYUEXNk.mjs +271 -0
  128. package/dist/logger-CS0mw3fa.cjs +275 -0
  129. package/dist/loginShellEnv-BkuYtExZ.cjs +182 -0
  130. package/dist/loginShellEnv-Dw8M7tkI.mjs +167 -0
  131. package/dist/machineMetadata-DyDbODYd.cjs +41 -0
  132. package/dist/machineMetadata-oOzBfDfs.mjs +38 -0
  133. package/dist/main-BkxJP6JQ.cjs +941 -0
  134. package/dist/main-BwNIAI1A.mjs +939 -0
  135. package/dist/manager-BQ4flvQZ.mjs +101 -0
  136. package/dist/manager-Cly8xVIR.cjs +105 -0
  137. package/dist/{mcp-BN6bKIGb.mjs → mcp-B1A4I3TK.mjs} +27 -33
  138. package/dist/{mcp-DGdeUUDJ.cjs → mcp-Hszd7qpS.cjs} +42 -48
  139. package/dist/messageBuffer-BWlGgR3A.mjs +71 -0
  140. package/dist/messageBuffer-fJMH6uY8.cjs +73 -0
  141. package/dist/mirrorProtocol-BNLtoWjO.mjs +170 -0
  142. package/dist/mirrorProtocol-BUtmg1ws.cjs +186 -0
  143. package/dist/oneShotPrompts-CL0dip9C.cjs +16 -0
  144. package/dist/oneShotPrompts-DT4p6RNd.mjs +12 -0
  145. package/dist/package-BhaKlnxz.mjs +171 -0
  146. package/dist/package-BwMrPwqH.cjs +173 -0
  147. package/dist/path-B7zW-WwE.cjs +18 -0
  148. package/dist/path-D2wdaNSk.mjs +15 -0
  149. package/dist/peerTools-BTqw97Gb.mjs +272 -0
  150. package/dist/peerTools-BvKtHXj8.cjs +283 -0
  151. package/dist/permissionMode-Cr5JCbB7.mjs +80 -0
  152. package/dist/permissionMode-CrV-XuMs.cjs +87 -0
  153. package/dist/persistence-HGW_ZVs9.mjs +372 -0
  154. package/dist/persistence-yKTH3-5X.cjs +414 -0
  155. package/dist/piExtension.mjs +2 -1
  156. package/dist/piRunnerArgs-BNloJCCg.cjs +66 -0
  157. package/dist/piRunnerArgs-BuX1UFWy.mjs +59 -0
  158. package/dist/{piRuntime-bkw2NAZU.mjs → piRuntime-CSGkwCKQ.mjs} +2 -2
  159. package/dist/{piRuntime-3qtbKujX.cjs → piRuntime-C_H7MJCM.cjs} +4 -4
  160. package/dist/{piTerminal-DilKwM7B.mjs → piTerminal-C8a1OrNQ.mjs} +32 -35
  161. package/dist/{piTerminal-BYxp3LMr.cjs → piTerminal-DNCZ6yTM.cjs} +32 -35
  162. package/dist/previewPath-B0rBdhy1.cjs +83 -0
  163. package/dist/previewPath-CXN4Vag0.mjs +81 -0
  164. package/dist/projectPath-BTBIMB57.mjs +10 -0
  165. package/dist/projectPath-ChLhdOyt.cjs +13 -0
  166. package/dist/registerCommonHandlers-Ccvsz7Ou.mjs +536 -0
  167. package/dist/registerCommonHandlers-DskirN-_.cjs +538 -0
  168. package/dist/registerKillSessionHandler-DZeLXWcB.cjs +361 -0
  169. package/dist/registerKillSessionHandler-GYvHdipX.mjs +358 -0
  170. package/dist/remoteSessionClient-B0LraSB9.cjs +634 -0
  171. package/dist/remoteSessionClient-CYnXRynE.mjs +612 -0
  172. package/dist/resources-BdFBQi8r.mjs +117 -0
  173. package/dist/resources-JDPugcDq.cjs +120 -0
  174. package/dist/run-CJzxoHVh.cjs +5762 -0
  175. package/dist/run-D3ifupU3.mjs +5739 -0
  176. package/dist/runClaude-Ba01qT-u.mjs +848 -0
  177. package/dist/runClaude-Da3RirzE.cjs +850 -0
  178. package/dist/runClaudeDeps-DOt79DjU.mjs +3624 -0
  179. package/dist/runClaudeDeps-DOzEBMls.cjs +3649 -0
  180. package/dist/{runGemini-Cjii069p.mjs → runGemini-BGeTz57m.mjs} +58 -31
  181. package/dist/{runGemini-28O2sqyI.cjs → runGemini-DSr9LIxL.cjs} +202 -175
  182. package/dist/{runOpenClaw-CiMZad-H.cjs → runOpenClaw-B1mTxN35.cjs} +64 -65
  183. package/dist/{runOpenClaw-jaLr7KF1.mjs → runOpenClaw-CogSedIc.mjs} +31 -32
  184. package/dist/sandbox-CG7IyDTU.cjs +187 -0
  185. package/dist/sandbox-DTe6d54R.mjs +180 -0
  186. package/dist/selfCheck-C9mVrQwf.mjs +84 -0
  187. package/dist/selfCheck-Dc-mNSLb.cjs +87 -0
  188. package/dist/{send-D5ejHPXG.cjs → send-B7J_eaG3.cjs} +16 -9
  189. package/dist/{send-C9mOtChi.mjs → send-CBXJKc6O.mjs} +12 -5
  190. package/dist/server-CZTP_iOn.cjs +407 -0
  191. package/dist/server-DcVBv04l.mjs +404 -0
  192. package/dist/sessionLock-Bys1PNSo.cjs +205 -0
  193. package/dist/sessionLock-D-EG2CfG.mjs +197 -0
  194. package/dist/sessionModeFile-DMl3dw3r.mjs +32 -0
  195. package/dist/sessionModeFile-RSm0NQkH.cjs +36 -0
  196. package/dist/sessionOps-Dn8z85h_.cjs +783 -0
  197. package/dist/sessionOps-SuHW8Dfe.mjs +760 -0
  198. package/dist/sessionScanner-BOrGjMXL.cjs +209 -0
  199. package/dist/sessionScanner-CX3onqXh.mjs +206 -0
  200. package/dist/{sessions-W6771g3X.mjs → sessions-BEG_HTSi.mjs} +17 -8
  201. package/dist/{sessions-BNMPQoLE.cjs → sessions-D74aJbhL.cjs} +37 -28
  202. package/dist/setupOfflineReconnection-ByElY60m.cjs +74 -0
  203. package/dist/setupOfflineReconnection-DpvWTt69.mjs +72 -0
  204. package/dist/smallFastModel-BLNgMrwR.mjs +18 -0
  205. package/dist/smallFastModel-D_uxGMo3.cjs +21 -0
  206. package/dist/{spawn-D0QVhzRb.mjs → spawn-B7yro0b2.mjs} +26 -38
  207. package/dist/{spawn-Ddtom1cb.cjs → spawn-DgR0RKRs.cjs} +52 -64
  208. package/dist/spawnAgents-BGQiEF-w.cjs +52 -0
  209. package/dist/spawnAgents-DZzZ9jMI.mjs +45 -0
  210. package/dist/spawnHappyCLI-B2H5s4B_.mjs +64 -0
  211. package/dist/spawnHappyCLI-DBhwZT7O.cjs +66 -0
  212. package/dist/specialCommands-BSqhYg5X.mjs +52 -0
  213. package/dist/specialCommands-DSsTeRej.cjs +54 -0
  214. package/dist/startFileWatcher-B4VsLgjD.cjs +71 -0
  215. package/dist/startFileWatcher-DErVWZE4.mjs +69 -0
  216. package/dist/startupPlan-BLMbfQIH.cjs +12 -0
  217. package/dist/startupPlan-DFMyNgAs.mjs +10 -0
  218. package/dist/streamRelay-BiKw59Cc.cjs +233 -0
  219. package/dist/streamRelay-FPVbHpbM.mjs +231 -0
  220. package/dist/sync-C8gyQFMc.mjs +69 -0
  221. package/dist/sync-DccIKZ5_.cjs +71 -0
  222. package/dist/systemPrompt-BwTPWfMu.cjs +97 -0
  223. package/dist/systemPrompt-DX521JJz.mjs +94 -0
  224. package/dist/{teams-CqSwtw2O.mjs → teams-C32F1hqd.mjs} +9 -40
  225. package/dist/{teams-BZ1tayg_.cjs → teams-Dl8g8kTI.cjs} +14 -45
  226. package/dist/template-BaHAmH2K.cjs +129 -0
  227. package/dist/template-CiOPa2rd.mjs +121 -0
  228. package/dist/{terminalTitleSuggest-DKgX3osW.mjs → terminalTitleSuggest-CeKsX_V6.mjs} +1 -9
  229. package/dist/{terminalTitleSuggest-Dji8I0Jy.cjs → terminalTitleSuggest-DhvRFX3H.cjs} +0 -10
  230. package/dist/terminals-B_bfC9c2.cjs +250 -0
  231. package/dist/terminals-Dlg0x3nY.mjs +235 -0
  232. package/dist/time-D0XyHOid.mjs +38 -0
  233. package/dist/time-DCuTyook.cjs +42 -0
  234. package/dist/titleGenerator-CQ8CoGhg.mjs +166 -0
  235. package/dist/titleGenerator-ChzMJsyg.cjs +172 -0
  236. package/dist/tmuxSocket-B8Yx20sT.mjs +19 -0
  237. package/dist/tmuxSocket-D-Xt6Vn-.cjs +24 -0
  238. package/dist/{todo-BYMg0fR0.cjs → todo-BvUOTa8G.cjs} +15 -12
  239. package/dist/{todo-BbusB1zM.mjs → todo-CZ6cFrrn.mjs} +11 -8
  240. package/dist/tools-BZtHF_qQ.mjs +177 -0
  241. package/dist/tools-Be3AoAwu.cjs +63 -0
  242. package/dist/tools-DQj0AeLk.cjs +180 -0
  243. package/dist/tools-DkluDcG4.mjs +60 -0
  244. package/dist/trimIdent-4gvk9Wk6.cjs +22 -0
  245. package/dist/trimIdent-BAjmv_TG.mjs +20 -0
  246. package/dist/types-CRS-srZK.cjs +66 -0
  247. package/dist/types-CkqAACXx.mjs +64 -0
  248. package/dist/uninstall-BkLzaJ6I.mjs +47 -0
  249. package/dist/uninstall-x-TUtf5H.cjs +49 -0
  250. package/package.json +7 -7
  251. package/dist/agentGuidance-CrR9l62U.mjs +0 -2145
  252. package/dist/agentGuidance-DwOWbX55.cjs +0 -2217
  253. package/dist/index-BG932eCh.cjs +0 -19655
  254. package/dist/index-CVCt3kSt.mjs +0 -19591
  255. package/dist/index-D5ScEErM.cjs +0 -58
  256. package/dist/index-DgO0FHOx.mjs +0 -52
  257. package/dist/limits-D2uN090G.mjs +0 -2528
  258. package/dist/limits-kqFqhfsh.cjs +0 -2652
@@ -0,0 +1,941 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
4
+ var logger = require('./logger-CS0mw3fa.cjs');
5
+ var persistence = require('./persistence-yKTH3-5X.cjs');
6
+ var auth = require('./auth-ba4WMYrN.cjs');
7
+ var _package = require('./package-BwMrPwqH.cjs');
8
+ var z = require('zod');
9
+ var controlClient = require('./controlClient-Bcwv3D21.cjs');
10
+ var piRunnerArgs = require('./piRunnerArgs-BNloJCCg.cjs');
11
+ var spawnHappyCLI = require('./spawnHappyCLI-DBhwZT7O.cjs');
12
+ var node_child_process = require('node:child_process');
13
+ var ensureDaemonRunning = require('./ensureDaemonRunning-BCwNrMyv.cjs');
14
+ var startupPlan = require('./startupPlan-BLMbfQIH.cjs');
15
+ var index = require('./index-DDeHXrIX.cjs');
16
+ var configuration = require('./configuration-BSYpcPwE.cjs');
17
+ var doctorReadiness = require('./doctorReadiness-BCZGcN0a.cjs');
18
+ require('node:util');
19
+ require('node:fs');
20
+ require('node:path');
21
+ require('node:fs/promises');
22
+ require('./authRelay-BdYkC1Po.cjs');
23
+ require('node:crypto');
24
+ require('tweetnacl');
25
+ require('node:os');
26
+ require('axios');
27
+ require('./time-DCuTyook.cjs');
28
+ require('./browser-Y6Bl8L_O.cjs');
29
+ require('open');
30
+ require('./sessionModeFile-RSm0NQkH.cjs');
31
+ require('cross-spawn');
32
+ require('./projectPath-ChLhdOyt.cjs');
33
+ require('path');
34
+ require('url');
35
+ require('node:module');
36
+ require('./detectCLI-DR9ZaN6B.cjs');
37
+ require('child_process');
38
+ require('os');
39
+ require('fs');
40
+
41
+ const DAEMON_STOP_HELP = "Stop the daemon (tmux sessions stay alive; direct-shell terminals end)";
42
+ const CLAUDE_OPTIONS_HELP = `Very Happy forwards most Claude options.
43
+ Use Claude flags with very-happy as you would with claude. The --settings flag
44
+ is reserved for Very Happy's session hooks and is ignored with a warning.`;
45
+
46
+ async function main() {
47
+ const args = process.argv.slice(2);
48
+ if (index.isStandaloneVersionRequest(args)) {
49
+ console.log(`very-happy version: ${_package.packageJson.version}`);
50
+ return;
51
+ }
52
+ if (!args.includes("--version")) {
53
+ logger.logger.debug("Starting happy CLI with args: ", process.argv);
54
+ }
55
+ const subcommand = args[0];
56
+ if (!args.includes("--version")) ;
57
+ if (subcommand === "doctor") {
58
+ if (args[1] === "clean") {
59
+ if (args.slice(2).some((a) => a === "--help" || a === "-h")) {
60
+ console.log(`
61
+ ${chalk.bold("very-happy doctor clean")} - Kill all Very Happy processes (daemon + sessions)
62
+
63
+ ${chalk.bold("Usage:")}
64
+ very-happy doctor clean
65
+
66
+ ${chalk.bold("Warning:")} This is destructive \u2014 it terminates the daemon and every running session.
67
+ Conversation history is preserved on the server, but in-flight tool calls are interrupted.
68
+ `);
69
+ process.exit(0);
70
+ }
71
+ const result = await (await Promise.resolve().then(function () { return require('./doctor-u46qYYKX.cjs'); })).killRunawayHappyProcesses();
72
+ console.log(`Cleaned up ${result.killed} runaway processes`);
73
+ if (result.errors.length > 0) {
74
+ console.log("Errors:", result.errors);
75
+ }
76
+ process.exit(0);
77
+ }
78
+ await (await Promise.resolve().then(function () { return require('./doctor-D2YJ-Yn2.cjs'); }).then(function (n) { return n.doctor; })).runDoctorCommand();
79
+ return;
80
+ } else if (subcommand === "auth") {
81
+ try {
82
+ await (await Promise.resolve().then(function () { return require('./auth-BDOVh5h5.cjs'); })).handleAuthCommand(args.slice(1));
83
+ } catch (error) {
84
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
85
+ if (process.env.DEBUG) {
86
+ console.error(error);
87
+ }
88
+ process.exit(1);
89
+ }
90
+ return;
91
+ } else if (subcommand === "connect") {
92
+ try {
93
+ await (await Promise.resolve().then(function () { return require('./connect-C2CiOUFs.cjs'); })).handleConnectCommand(args.slice(1));
94
+ } catch (error) {
95
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
96
+ if (process.env.DEBUG) {
97
+ console.error(error);
98
+ }
99
+ process.exit(1);
100
+ }
101
+ return;
102
+ } else if (subcommand === "sandbox") {
103
+ try {
104
+ await (await Promise.resolve().then(function () { return require('./sandbox-CG7IyDTU.cjs'); })).handleSandboxCommand(args.slice(1));
105
+ } catch (error) {
106
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
107
+ if (process.env.DEBUG) {
108
+ console.error(error);
109
+ }
110
+ process.exit(1);
111
+ }
112
+ return;
113
+ } else if (subcommand === "server") {
114
+ try {
115
+ await (await Promise.resolve().then(function () { return require('./server-CZTP_iOn.cjs'); })).handleServerCommand(args.slice(1));
116
+ } catch (error) {
117
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
118
+ if (process.env.DEBUG) {
119
+ console.error(error);
120
+ }
121
+ process.exit(1);
122
+ }
123
+ return;
124
+ } else if (subcommand === "bye") {
125
+ console.log("Bye!");
126
+ process.exit(0);
127
+ } else if (subcommand === "install-pi-tools") {
128
+ try {
129
+ const { handleInstallPiTools } = await Promise.resolve().then(function () { return require('./installPiTools-BKnXjrVu.cjs'); });
130
+ await handleInstallPiTools(args.slice(1));
131
+ } catch (error) {
132
+ console.error(error instanceof Error ? error.message : "Pi tools installation failed");
133
+ process.exitCode = 1;
134
+ }
135
+ return;
136
+ } else if (subcommand === "install-terminal-hooks") {
137
+ try {
138
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-BQZbvxsZ.cjs'); });
139
+ const command = parseTerminalHooksArgs(args.slice(1));
140
+ if (command.action === "help") {
141
+ console.log(TERMINAL_HOOKS_HELP);
142
+ return;
143
+ }
144
+ await installTerminalHooks({ remove: command.action === "remove" });
145
+ process.exit(0);
146
+ } catch (error) {
147
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
148
+ if (process.env.DEBUG) {
149
+ console.error(error);
150
+ }
151
+ process.exit(1);
152
+ }
153
+ } else if (subcommand === "agent-home") {
154
+ try {
155
+ const { parseAgentHomeArgs, runAgentHomeCommand } = await Promise.resolve().then(function () { return require('./agentHome-CboCeKWq.cjs'); });
156
+ await runAgentHomeCommand(parseAgentHomeArgs(args.slice(1)));
157
+ process.exit(0);
158
+ } catch (error) {
159
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
160
+ process.exit(1);
161
+ }
162
+ } else if (subcommand === "spawn") {
163
+ try {
164
+ const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-DgR0RKRs.cjs'); });
165
+ await handleSpawnCommand(args.slice(1));
166
+ } catch (error) {
167
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
168
+ if (process.env.DEBUG) {
169
+ console.error(error);
170
+ }
171
+ process.exit(1);
172
+ }
173
+ return;
174
+ } else if (subcommand === "sessions") {
175
+ try {
176
+ const { handleSessionsCommand } = await Promise.resolve().then(function () { return require('./sessions-D74aJbhL.cjs'); });
177
+ await handleSessionsCommand(args.slice(1));
178
+ } catch (error) {
179
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
180
+ if (process.env.DEBUG) {
181
+ console.error(error);
182
+ }
183
+ process.exit(1);
184
+ }
185
+ return;
186
+ } else if (subcommand === "send") {
187
+ try {
188
+ const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-B7J_eaG3.cjs'); });
189
+ await handleSendCommand(args.slice(1));
190
+ } catch (error) {
191
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
192
+ if (process.env.DEBUG) {
193
+ console.error(error);
194
+ }
195
+ process.exit(1);
196
+ }
197
+ return;
198
+ } else if (subcommand === "resume") {
199
+ try {
200
+ await (await Promise.resolve().then(function () { return require('./handleResumeCommand-C2cKchpX.cjs'); })).handleResumeCommand(args.slice(1));
201
+ } catch (error) {
202
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
203
+ if (process.env.DEBUG) {
204
+ console.error(error);
205
+ }
206
+ process.exit(1);
207
+ }
208
+ return;
209
+ } else if (subcommand === "codex") {
210
+ try {
211
+ await (await Promise.resolve().then(function () { return require('./codexCommand-4zcccIoq.cjs'); })).handleCodexCommand(args.slice(1));
212
+ } catch (error) {
213
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
214
+ if (process.env.DEBUG) {
215
+ console.error(error);
216
+ }
217
+ process.exit(1);
218
+ }
219
+ return;
220
+ } else if (subcommand === "gemini") {
221
+ const geminiSubcommand = args[1];
222
+ if (geminiSubcommand === "model" && args[2] === "set" && args[3]) {
223
+ const modelName = args[3];
224
+ const validModels = ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"];
225
+ if (!validModels.includes(modelName)) {
226
+ console.error(`Invalid model: ${modelName}`);
227
+ console.error(`Available models: ${validModels.join(", ")}`);
228
+ process.exit(1);
229
+ }
230
+ try {
231
+ const { existsSync, readFileSync, writeFileSync, mkdirSync } = require("fs");
232
+ const { join } = require("path");
233
+ const { homedir } = require("os");
234
+ const configDir = join(homedir(), ".gemini");
235
+ const configPath = join(configDir, "config.json");
236
+ if (!existsSync(configDir)) {
237
+ mkdirSync(configDir, { recursive: true });
238
+ }
239
+ let config = {};
240
+ if (existsSync(configPath)) {
241
+ try {
242
+ config = JSON.parse(readFileSync(configPath, "utf-8"));
243
+ } catch (error) {
244
+ config = {};
245
+ }
246
+ }
247
+ config.model = modelName;
248
+ writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
249
+ console.log(`\u2713 Model set to: ${modelName}`);
250
+ console.log(` Config saved to: ${configPath}`);
251
+ console.log(` This model will be used in future sessions.`);
252
+ process.exit(0);
253
+ } catch (error) {
254
+ console.error("Failed to save model configuration:", error);
255
+ process.exit(1);
256
+ }
257
+ }
258
+ if (geminiSubcommand === "model" && args[2] === "get") {
259
+ try {
260
+ const { existsSync, readFileSync } = require("fs");
261
+ const { join } = require("path");
262
+ const { homedir } = require("os");
263
+ const configPaths = [
264
+ join(homedir(), ".gemini", "config.json"),
265
+ join(homedir(), ".config", "gemini", "config.json")
266
+ ];
267
+ let model = null;
268
+ for (const configPath of configPaths) {
269
+ if (existsSync(configPath)) {
270
+ try {
271
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
272
+ model = config.model || config.GEMINI_MODEL || null;
273
+ if (model) break;
274
+ } catch (error) {
275
+ }
276
+ }
277
+ }
278
+ if (model) {
279
+ console.log(`Current model: ${model}`);
280
+ } else if (process.env.GEMINI_MODEL) {
281
+ console.log(`Current model: ${process.env.GEMINI_MODEL} (from GEMINI_MODEL env var)`);
282
+ } else {
283
+ console.log("Current model: gemini-2.5-pro (default)");
284
+ }
285
+ process.exit(0);
286
+ } catch (error) {
287
+ console.error("Failed to read model configuration:", error);
288
+ process.exit(1);
289
+ }
290
+ }
291
+ if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
292
+ const projectId = args[3];
293
+ try {
294
+ const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-Ci9Kpgwa.cjs'); });
295
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./persistence-yKTH3-5X.cjs'); });
296
+ const { ApiClient } = await Promise.resolve().then(function () { return require('./api-CgundNNX.cjs'); }).then(function (n) { return n.api; });
297
+ let userEmail = void 0;
298
+ try {
299
+ const credentials = await readCredentialsForConfiguredRelay2();
300
+ if (credentials) {
301
+ const api = await ApiClient.create(credentials);
302
+ const vendorToken = await api.getVendorToken("gemini");
303
+ if (vendorToken?.oauth?.id_token) {
304
+ const parts = vendorToken.oauth.id_token.split(".");
305
+ if (parts.length === 3) {
306
+ const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
307
+ userEmail = payload.email;
308
+ }
309
+ }
310
+ }
311
+ } catch {
312
+ }
313
+ saveGoogleCloudProjectToConfig(projectId, userEmail);
314
+ console.log(`\u2713 Google Cloud Project set to: ${projectId}`);
315
+ if (userEmail) {
316
+ console.log(` Linked to account: ${userEmail}`);
317
+ }
318
+ console.log(` This project will be used for Google Workspace accounts.`);
319
+ process.exit(0);
320
+ } catch (error) {
321
+ console.error("Failed to save project configuration:", error);
322
+ process.exit(1);
323
+ }
324
+ }
325
+ if (geminiSubcommand === "project" && args[2] === "get") {
326
+ try {
327
+ const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-Ci9Kpgwa.cjs'); });
328
+ const config = readGeminiLocalConfig();
329
+ if (config.googleCloudProject) {
330
+ console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
331
+ if (config.googleCloudProjectEmail) {
332
+ console.log(` Linked to account: ${config.googleCloudProjectEmail}`);
333
+ } else {
334
+ console.log(` Applies to: all accounts (global)`);
335
+ }
336
+ } else if (process.env.GOOGLE_CLOUD_PROJECT) {
337
+ console.log(`Current Google Cloud Project: ${process.env.GOOGLE_CLOUD_PROJECT} (from env var)`);
338
+ } else {
339
+ console.log("No Google Cloud Project configured.");
340
+ console.log("");
341
+ console.log('If you see "Authentication required" error, you may need to set a project:');
342
+ console.log(" very-happy gemini project set <your-project-id>");
343
+ console.log("");
344
+ console.log("This is required for Google Workspace accounts.");
345
+ console.log("Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca");
346
+ }
347
+ process.exit(0);
348
+ } catch (error) {
349
+ console.error("Failed to read project configuration:", error);
350
+ process.exit(1);
351
+ }
352
+ }
353
+ if (geminiSubcommand === "project" && !args[2]) {
354
+ console.log("Usage: very-happy gemini project <command>");
355
+ console.log("");
356
+ console.log("Commands:");
357
+ console.log(" set <project-id> Set Google Cloud Project ID");
358
+ console.log(" get Show current Google Cloud Project ID");
359
+ console.log("");
360
+ console.log("Google Workspace accounts require a Google Cloud Project.");
361
+ console.log('If you see "Authentication required" error, set your project ID.');
362
+ console.log("");
363
+ console.log("Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca");
364
+ process.exit(0);
365
+ }
366
+ try {
367
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-DSr9LIxL.cjs'); });
368
+ let startedBy = void 0;
369
+ for (let i = 1; i < args.length; i++) {
370
+ if (args[i] === "--started-by") {
371
+ startedBy = args[++i];
372
+ }
373
+ }
374
+ const {
375
+ credentials
376
+ } = await auth.authAndSetupMachineIfNeeded();
377
+ await ensureDaemonRunning.ensureDaemonRunning();
378
+ await runGemini({ credentials, startedBy });
379
+ } catch (error) {
380
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
381
+ if (process.env.DEBUG) {
382
+ console.error(error);
383
+ }
384
+ process.exit(1);
385
+ }
386
+ return;
387
+ } else if (subcommand === "pi") {
388
+ if (args[1] === "--terminal") {
389
+ try {
390
+ const { runPiTerminal } = await Promise.resolve().then(function () { return require('./piTerminal-DNCZ6yTM.cjs'); });
391
+ process.exitCode = await runPiTerminal(args.slice(2));
392
+ } catch (error) {
393
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
394
+ process.exitCode = 1;
395
+ }
396
+ return;
397
+ }
398
+ let hintPrinted = false;
399
+ const printHint = (detail) => {
400
+ const hint = piRunnerArgs.piAdapterMissingHint(detail);
401
+ if (hint && !hintPrinted) {
402
+ hintPrinted = true;
403
+ console.error(chalk.gray(hint));
404
+ }
405
+ };
406
+ try {
407
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-B6pAdvJx.cjs'); });
408
+ const parsed = piRunnerArgs.parsePiRunnerArgs(args.slice(1));
409
+ const resolved = resolveAcpAgentConfig(["pi", ...parsed.passthrough]);
410
+ const { credentials } = await auth.authAndSetupMachineIfNeeded();
411
+ await ensureDaemonRunning.ensureDaemonRunning();
412
+ await runAcp({
413
+ credentials,
414
+ startedBy: parsed.startedBy,
415
+ verbose: parsed.verbose,
416
+ permissionMode: parsed.permissionMode,
417
+ model: parsed.model,
418
+ agentName: resolved.agentName,
419
+ command: resolved.command,
420
+ args: resolved.args,
421
+ onBackendError: printHint
422
+ });
423
+ if (hintPrinted) process.exit(1);
424
+ } catch (error) {
425
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
426
+ printHint(error instanceof Error ? error.message : void 0);
427
+ if (process.env.DEBUG) {
428
+ console.error(error);
429
+ }
430
+ process.exit(1);
431
+ }
432
+ return;
433
+ } else if (subcommand === "acp") {
434
+ try {
435
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-B6pAdvJx.cjs'); });
436
+ let startedBy = void 0;
437
+ let verbose = false;
438
+ const acpArgs = [];
439
+ let customCommandMode = false;
440
+ for (let i = 1; i < args.length; i++) {
441
+ if (!customCommandMode && args[i] === "--started-by") {
442
+ startedBy = args[++i];
443
+ continue;
444
+ }
445
+ if (!customCommandMode && args[i] === "--verbose") {
446
+ verbose = true;
447
+ continue;
448
+ }
449
+ if (args[i] === "--") {
450
+ customCommandMode = true;
451
+ }
452
+ acpArgs.push(args[i]);
453
+ }
454
+ const resolved = resolveAcpAgentConfig(acpArgs);
455
+ const { credentials } = await auth.authAndSetupMachineIfNeeded();
456
+ await ensureDaemonRunning.ensureDaemonRunning();
457
+ await runAcp({
458
+ credentials,
459
+ startedBy,
460
+ verbose,
461
+ agentName: resolved.agentName,
462
+ command: resolved.command,
463
+ args: resolved.args
464
+ });
465
+ } catch (error) {
466
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
467
+ if (process.env.DEBUG) {
468
+ console.error(error);
469
+ }
470
+ process.exit(1);
471
+ }
472
+ return;
473
+ } else if (subcommand === "openclaw") {
474
+ try {
475
+ const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-B1mTxN35.cjs'); });
476
+ let startedBy = void 0;
477
+ let verbose = false;
478
+ let gatewayUrl;
479
+ let gatewayToken;
480
+ let gatewayPassword;
481
+ for (let i = 1; i < args.length; i++) {
482
+ if (args[i] === "--started-by") {
483
+ startedBy = args[++i];
484
+ } else if (args[i] === "--verbose") {
485
+ verbose = true;
486
+ } else if (args[i] === "--gateway-url") {
487
+ gatewayUrl = args[++i];
488
+ } else if (args[i] === "--gateway-token") {
489
+ gatewayToken = args[++i];
490
+ } else if (args[i] === "--gateway-password") {
491
+ gatewayPassword = args[++i];
492
+ }
493
+ }
494
+ const { credentials } = await auth.authAndSetupMachineIfNeeded();
495
+ await ensureDaemonRunning.ensureDaemonRunning();
496
+ await runOpenClaw({
497
+ credentials,
498
+ startedBy,
499
+ verbose,
500
+ gatewayUrl,
501
+ gatewayToken,
502
+ gatewayPassword
503
+ });
504
+ } catch (error) {
505
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
506
+ if (process.env.DEBUG) {
507
+ console.error(error);
508
+ }
509
+ process.exit(1);
510
+ }
511
+ return;
512
+ } else if (subcommand === "logout") {
513
+ console.log(chalk.yellow('Note: "very-happy logout" is deprecated. Use "very-happy auth logout" instead.\n'));
514
+ try {
515
+ await (await Promise.resolve().then(function () { return require('./auth-BDOVh5h5.cjs'); })).handleAuthCommand(["logout"]);
516
+ } catch (error) {
517
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
518
+ if (process.env.DEBUG) {
519
+ console.error(error);
520
+ }
521
+ process.exit(1);
522
+ }
523
+ return;
524
+ } else if (subcommand === "todo") {
525
+ try {
526
+ const { handleTodoCommand } = await Promise.resolve().then(function () { return require('./todo-BvUOTa8G.cjs'); });
527
+ await handleTodoCommand(args.slice(1));
528
+ } catch (error) {
529
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : "Todo command failed" }));
530
+ process.exitCode = 1;
531
+ }
532
+ return;
533
+ } else if (subcommand === "teams") {
534
+ try {
535
+ const { handleTeamsCommand } = await Promise.resolve().then(function () { return require('./teams-Dl8g8kTI.cjs'); });
536
+ await handleTeamsCommand(args.slice(1));
537
+ } catch (error) {
538
+ console.error(error instanceof Error ? error.message : "Teams command failed");
539
+ process.exitCode = 1;
540
+ }
541
+ return;
542
+ } else if (subcommand === "auto") {
543
+ try {
544
+ const { handleAutoCommand } = await Promise.resolve().then(function () { return require('./auto-BOX_fgmR.cjs'); });
545
+ await handleAutoCommand(args.slice(1));
546
+ } catch (error) {
547
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Automation command failed");
548
+ if (process.env.DEBUG) {
549
+ console.error(error);
550
+ }
551
+ process.exitCode = 1;
552
+ }
553
+ return;
554
+ } else if (subcommand === "mcp" && (args.length === 1 || args.length === 2 && args[1] === "--terminal-tools")) {
555
+ try {
556
+ const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-Hszd7qpS.cjs'); });
557
+ await handleMcpCommand(args[1] === "--terminal-tools");
558
+ } catch (error) {
559
+ process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
560
+ `);
561
+ process.exit(1);
562
+ }
563
+ return;
564
+ } else if (subcommand === "notify") {
565
+ try {
566
+ await handleNotifyCommand(args.slice(1));
567
+ } catch (error) {
568
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
569
+ if (process.env.DEBUG) {
570
+ console.error(error);
571
+ }
572
+ process.exit(1);
573
+ }
574
+ return;
575
+ } else if (subcommand === "daemon") {
576
+ const daemonSubcommand = args[1];
577
+ if (daemonSubcommand === "list") {
578
+ try {
579
+ const sessions = await controlClient.listDaemonSessions();
580
+ if (sessions.length === 0) {
581
+ console.log("No active sessions this daemon is aware of (they might have been started by a previous version of the daemon)");
582
+ } else {
583
+ console.log("Active sessions:");
584
+ console.log(JSON.stringify(sessions, null, 2));
585
+ const busy = sessions.filter((s) => s.turnActive === true);
586
+ console.log(busy.length === 0 ? "No turn in flight on this machine (wrappers older than 0.2.139 do not report turns)." : `${busy.length} session(s) with a turn in flight: ${busy.map((s) => s.happySessionId).join(", ")}`);
587
+ const background = sessions.filter((s) => (s.backgroundTasks?.count ?? 0) > 0);
588
+ console.log(background.length === 0 ? "No background tasks in flight (wrappers older than 0.2.157 do not report them)." : `${background.length} session(s) with background tasks in flight: ${background.map((s) => `${s.happySessionId} (${s.backgroundTasks?.count})`).join(", ")}`);
589
+ }
590
+ } catch (error) {
591
+ console.log("No daemon running");
592
+ }
593
+ return;
594
+ } else if (daemonSubcommand === "stop-session") {
595
+ const sessionId = args[2];
596
+ if (!sessionId) {
597
+ console.error("Session ID required");
598
+ process.exit(1);
599
+ }
600
+ try {
601
+ const success = await controlClient.stopDaemonSession(sessionId);
602
+ console.log(success ? "Session stopped" : "Failed to stop session");
603
+ } catch (error) {
604
+ console.log("No daemon running");
605
+ }
606
+ return;
607
+ } else if (daemonSubcommand === "start") {
608
+ const currentState = await persistence.readDaemonState();
609
+ const running = await controlClient.checkIfDaemonRunningAndCleanupStaleState();
610
+ const currentDaemonMatches = currentState && currentState.startedWithCliVersion === configuration.configuration.currentCliVersion && doctorReadiness.daemonEndpointsMatch(
611
+ currentState.serverUrl,
612
+ currentState.webappUrl,
613
+ configuration.configuration.serverUrl,
614
+ configuration.configuration.webappUrl
615
+ );
616
+ if (running && !currentDaemonMatches) {
617
+ if (currentState?.supervisor === "systemd") {
618
+ console.error(`The running daemon is supervised by systemd; hand over through the unit instead:
619
+ ${piRunnerArgs.SYSTEMD_RESTART_HINT}`);
620
+ process.exit(1);
621
+ }
622
+ console.log("Configured relay or CLI version changed; restarting the existing daemon");
623
+ await controlClient.stopDaemon();
624
+ }
625
+ const { HAPPY_DAEMON_SUPERVISOR: _supervisor, INVOCATION_ID: _invocation, ...detachedEnv } = process.env;
626
+ const child = spawnHappyCLI.spawnHappyCLI(["daemon", "start-sync"], {
627
+ detached: true,
628
+ stdio: "ignore",
629
+ env: detachedEnv
630
+ });
631
+ child.unref();
632
+ let started = false;
633
+ for (let i = 0; i < 50; i++) {
634
+ if (await controlClient.checkIfDaemonRunningAndCleanupStaleState()) {
635
+ started = true;
636
+ break;
637
+ }
638
+ await new Promise((resolve) => setTimeout(resolve, 100));
639
+ }
640
+ if (started) {
641
+ console.log("Daemon started successfully");
642
+ } else {
643
+ console.error("Failed to start daemon");
644
+ process.exit(1);
645
+ }
646
+ process.exit(0);
647
+ } else if (daemonSubcommand === "start-sync") {
648
+ await (await Promise.resolve().then(function () { return require('./run-CJzxoHVh.cjs'); })).startDaemon();
649
+ process.exit(0);
650
+ } else if (daemonSubcommand === "stop") {
651
+ await controlClient.stopDaemon();
652
+ process.exit(0);
653
+ } else if (daemonSubcommand === "status") {
654
+ await (await Promise.resolve().then(function () { return require('./doctor-D2YJ-Yn2.cjs'); }).then(function (n) { return n.doctor; })).runDoctorDaemon();
655
+ process.exit(0);
656
+ } else if (daemonSubcommand === "logs") {
657
+ const latest = await logger.getLatestDaemonLog();
658
+ if (!latest) {
659
+ console.log("No daemon logs found");
660
+ } else {
661
+ console.log(latest.path);
662
+ }
663
+ process.exit(0);
664
+ } else if (daemonSubcommand === "install") {
665
+ try {
666
+ await (await Promise.resolve().then(function () { return require('./install-BgoC2e_2.cjs'); })).install();
667
+ } catch (error) {
668
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
669
+ process.exit(1);
670
+ }
671
+ } else if (daemonSubcommand === "uninstall") {
672
+ try {
673
+ await (await Promise.resolve().then(function () { return require('./uninstall-x-TUtf5H.cjs'); })).uninstall();
674
+ } catch (error) {
675
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
676
+ process.exit(1);
677
+ }
678
+ } else {
679
+ console.log(`
680
+ ${chalk.bold("very-happy daemon")} - Daemon management
681
+
682
+ ${chalk.bold("Usage:")}
683
+ very-happy daemon start Start the daemon (detached)
684
+ very-happy daemon stop ${DAEMON_STOP_HELP}
685
+ very-happy daemon status Show daemon status
686
+ very-happy daemon list List active sessions
687
+
688
+ If you want to kill all happy related processes run
689
+ ${chalk.cyan("very-happy doctor clean")}
690
+
691
+ ${chalk.bold("Note:")} The daemon runs in the background and manages agent sessions and Web terminals.
692
+
693
+ ${chalk.bold("To clean up runaway processes:")} Use ${chalk.cyan("very-happy doctor clean")}
694
+ `);
695
+ }
696
+ return;
697
+ } else {
698
+ if (args.length > 0 && args[0] === "claude") {
699
+ args.shift();
700
+ }
701
+ const options = {};
702
+ let showHelp = false;
703
+ let showVersion = false;
704
+ let chromeOverride = void 0;
705
+ const unknownArgs = [];
706
+ const parsedSandboxFlag = ensureDaemonRunning.extractNoSandboxFlag(args);
707
+ options.noSandbox = parsedSandboxFlag.noSandbox;
708
+ args.length = 0;
709
+ args.push(...parsedSandboxFlag.args);
710
+ for (let i = 0; i < args.length; i++) {
711
+ const arg = args[i];
712
+ if (arg === "-h" || arg === "--help") {
713
+ showHelp = true;
714
+ unknownArgs.push(arg);
715
+ } else if (arg === "-v" || arg === "--version") {
716
+ showVersion = true;
717
+ unknownArgs.push(arg);
718
+ } else if (arg === "--happy-starting-mode") {
719
+ options.startingMode = z.z.enum(["local", "remote"]).parse(args[++i]);
720
+ } else if (arg === "--yolo") {
721
+ unknownArgs.push("--dangerously-skip-permissions");
722
+ } else if (arg === "--model") {
723
+ options.model = args[++i];
724
+ } else if (arg === "--started-by") {
725
+ options.startedBy = args[++i];
726
+ } else if (arg === "--js-runtime") {
727
+ const runtime = args[++i];
728
+ if (runtime !== "node" && runtime !== "bun") {
729
+ console.error(chalk.red(`Invalid --js-runtime value: ${runtime}. Must be 'node' or 'bun'`));
730
+ process.exit(1);
731
+ }
732
+ options.jsRuntime = runtime;
733
+ } else if (arg === "--claude-env") {
734
+ const envArg = args[++i];
735
+ if (envArg && envArg.includes("=")) {
736
+ const eqIndex = envArg.indexOf("=");
737
+ const key = envArg.substring(0, eqIndex);
738
+ const value = envArg.substring(eqIndex + 1);
739
+ options.claudeEnvVars = options.claudeEnvVars || {};
740
+ options.claudeEnvVars[key] = value;
741
+ } else {
742
+ console.error(chalk.red(`Invalid --claude-env format: ${envArg}. Expected KEY=VALUE`));
743
+ process.exit(1);
744
+ }
745
+ } else if (arg === "--chrome") {
746
+ chromeOverride = true;
747
+ } else if (arg === "--no-chrome") {
748
+ chromeOverride = false;
749
+ } else if (arg === "--settings") {
750
+ const settingsValue = args[++i];
751
+ console.warn(chalk.yellow(`\u26A0\uFE0F Warning: --settings is used internally by Happy for session tracking.`));
752
+ console.warn(chalk.yellow(` Your settings file "${settingsValue}" will be ignored.`));
753
+ console.warn(chalk.yellow(` To configure Claude, edit ~/.claude/settings.json instead.`));
754
+ } else {
755
+ unknownArgs.push(arg);
756
+ if (i + 1 < args.length && !args[i + 1].startsWith("-")) {
757
+ unknownArgs.push(args[++i]);
758
+ }
759
+ }
760
+ }
761
+ if (unknownArgs.length > 0) {
762
+ options.claudeArgs = [...options.claudeArgs || [], ...unknownArgs];
763
+ }
764
+ const settings = await persistence.readSettings();
765
+ const chromeEnabled = chromeOverride ?? settings.chromeMode ?? false;
766
+ if (chromeEnabled) {
767
+ options.claudeArgs = [...options.claudeArgs || [], "--chrome"];
768
+ }
769
+ if (showHelp) {
770
+ console.log(`
771
+ ${chalk.bold("very-happy")} - Open agent workspace for Web and terminal
772
+
773
+ ${chalk.bold("Usage:")}
774
+ very-happy [options] Start the native Claude TUI with browser control
775
+ (requires the external claude command)
776
+ very-happy auth Manage authentication
777
+ very-happy spawn Spawn a remote session via the local daemon and
778
+ print its web URL (for automation; see spawn --help)
779
+ very-happy send Send a message into an existing session
780
+ (for automation; see send --help)
781
+ very-happy sessions List, read, stop, archive, approve or deny
782
+ sessions and their permission requests (for
783
+ automation; see sessions --help)
784
+ very-happy codex Start Codex mode
785
+ very-happy gemini Start Gemini mode (ACP)
786
+ very-happy pi Start pi mode (ACP via the pi-acp adapter)
787
+ very-happy pi --terminal Run native pi with title, clipboard and preview tools
788
+ inside a Very Happy terminal
789
+ very-happy install-pi-tools Install tools for directly launched pi sessions
790
+ (add --remove to uninstall)
791
+ very-happy acp Start a generic ACP-compatible agent
792
+ very-happy openclaw Connect through a configured OpenClaw gateway
793
+ very-happy install-terminal-hooks
794
+ Install optional Claude terminal mirror hooks
795
+ (add --remove to uninstall them)
796
+ very-happy agent-home Show or pin where Claude Code / Codex keep their
797
+ conversations on this machine (agent-home --help)
798
+ very-happy connect Connect AI vendor API keys
799
+ very-happy todo Built-in Todos and official agent skill (todo --help)
800
+ very-happy auto Scheduled / triggered automations: spawn, sticky
801
+ sessions or scripts with tracked runs (auto --help)
802
+ very-happy sandbox Configure and manage OS-level sandboxing
803
+ very-happy notify Send push notification
804
+ very-happy mcp Stdio MCP server exposing copy_to_clipboard for a
805
+ plain claude CLI (register once with:
806
+ claude mcp add --scope user very-happy-clipboard -- very-happy mcp)
807
+ very-happy daemon Manage background service that allows
808
+ to spawn new sessions away from your computer
809
+ very-happy doctor System diagnostics & troubleshooting
810
+
811
+ ${chalk.bold("Examples:")}
812
+ very-happy Start the native Claude TUI (external claude required)
813
+ very-happy --yolo Start with bypassing permissions
814
+ shorthand for --dangerously-skip-permissions
815
+ very-happy --chrome Enable Chrome browser access for this session
816
+ very-happy --no-chrome Disable Chrome even if default is on
817
+ very-happy --no-sandbox Disable the Very Happy sandbox for this session
818
+ very-happy --js-runtime bun Use bun instead of node to spawn Claude Code
819
+ very-happy --claude-env ANTHROPIC_BASE_URL=http://127.0.0.1:3456
820
+ Use a custom API endpoint (e.g., claude-code-router)
821
+ very-happy pi Start pi (needs pi-acp on PATH)
822
+ very-happy acp gemini Start Gemini via generic ACP runner
823
+ very-happy acp opencode Start OpenCode through its built-in ACP adapter
824
+ very-happy acp -- your-agent --acp
825
+ Start a custom ACP command that accepts --acp
826
+ very-happy acp opencode --verbose
827
+ Print raw ACP backend/envelope events
828
+ very-happy install-terminal-hooks
829
+ Mirror hand-started Claude inside Very Happy terminals
830
+ very-happy auth login --force Authenticate
831
+ very-happy doctor Run diagnostics
832
+
833
+ ${chalk.bold(CLAUDE_OPTIONS_HELP)}
834
+ For example:
835
+
836
+ very-happy --resume
837
+
838
+ ${chalk.gray("\u2500".repeat(60))}
839
+ ${chalk.bold.cyan("Claude Code Options (from `claude --help`):")}
840
+ `);
841
+ try {
842
+ const { claudeCliPath } = await Promise.resolve().then(function () { return require('./claudeCliPath-U4HHmV4r.cjs'); });
843
+ const claudeHelp = node_child_process.execFileSync(claudeCliPath, ["--help"], { encoding: "utf8", windowsHide: true });
844
+ console.log(claudeHelp);
845
+ } catch (e) {
846
+ console.log(chalk.yellow("Could not retrieve claude help. Make sure claude is installed."));
847
+ }
848
+ process.exit(0);
849
+ }
850
+ if (showVersion) {
851
+ console.log(`very-happy version: ${_package.packageJson.version}`);
852
+ }
853
+ const {
854
+ credentials
855
+ } = await auth.authAndSetupMachineIfNeeded();
856
+ if (startupPlan.planClaudeStartup({ startedBy: options.startedBy, reconnect: false }).ensureDaemonRunning) {
857
+ await ensureDaemonRunning.ensureDaemonRunning();
858
+ }
859
+ try {
860
+ const { runClaude } = await Promise.resolve().then(function () { return require('./runClaude-Da3RirzE.cjs'); });
861
+ await runClaude(credentials, options);
862
+ } catch (error) {
863
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
864
+ if (process.env.DEBUG) {
865
+ console.error(error);
866
+ }
867
+ process.exit(1);
868
+ }
869
+ }
870
+ }
871
+ async function handleNotifyCommand(args) {
872
+ let message = "";
873
+ let title = "";
874
+ let showHelp = false;
875
+ for (let i = 0; i < args.length; i++) {
876
+ const arg = args[i];
877
+ if (arg === "-p" && i + 1 < args.length) {
878
+ message = args[++i];
879
+ } else if (arg === "-t" && i + 1 < args.length) {
880
+ title = args[++i];
881
+ } else if (arg === "-h" || arg === "--help") {
882
+ showHelp = true;
883
+ } else {
884
+ console.error(chalk.red(`Unknown argument for notify command: ${arg}`));
885
+ process.exit(1);
886
+ }
887
+ }
888
+ if (showHelp) {
889
+ console.log(`
890
+ ${chalk.bold("very-happy notify")} - Send notification
891
+
892
+ ${chalk.bold("Usage:")}
893
+ very-happy notify -p <message> [-t <title>] Send notification with custom message and optional title
894
+ very-happy notify -h, --help Show this help
895
+
896
+ ${chalk.bold("Options:")}
897
+ -p <message> Notification message (required)
898
+ -t <title> Notification title (optional, defaults to "Happy")
899
+
900
+ ${chalk.bold("Examples:")}
901
+ very-happy notify -p "Deployment complete!"
902
+ very-happy notify -p "System update complete" -t "Server Status"
903
+ very-happy notify -t "Alert" -p "Database connection restored"
904
+ `);
905
+ return;
906
+ }
907
+ if (!message) {
908
+ console.error(chalk.red('Error: Message is required. Use -p "your message" to specify the notification text.'));
909
+ console.log(chalk.gray('Run "very-happy notify --help" for usage information.'));
910
+ process.exit(1);
911
+ }
912
+ let credentials = await persistence.readCredentialsForConfiguredRelay();
913
+ if (!credentials) {
914
+ console.error(chalk.red('Error: Not authenticated. Please run "very-happy auth login" first.'));
915
+ process.exit(1);
916
+ }
917
+ console.log(chalk.blue("\u{1F4F1} Sending push notification..."));
918
+ try {
919
+ const { ApiClient } = await Promise.resolve().then(function () { return require('./api-CgundNNX.cjs'); }).then(function (n) { return n.api; });
920
+ const api = await ApiClient.create(credentials);
921
+ const notificationTitle = title || "Happy";
922
+ api.push().sendToAllDevices(
923
+ notificationTitle,
924
+ message,
925
+ {
926
+ source: "cli",
927
+ timestamp: Date.now()
928
+ }
929
+ );
930
+ console.log(chalk.green("\u2713 Push notification sent successfully!"));
931
+ console.log(chalk.gray(` Title: ${notificationTitle}`));
932
+ console.log(chalk.gray(` Message: ${message}`));
933
+ console.log(chalk.gray(" Check your mobile device for the notification."));
934
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
935
+ } catch (error) {
936
+ console.error(chalk.red("\u2717 Failed to send push notification"));
937
+ throw error;
938
+ }
939
+ }
940
+
941
+ exports.main = main;