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