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,395 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
4
+ var configuration = require('./configuration-BSYpcPwE.cjs');
5
+ var persistence = require('./persistence-yKTH3-5X.cjs');
6
+ var controlClient = require('./controlClient-Bcwv3D21.cjs');
7
+ var doctor$1 = require('./doctor-u46qYYKX.cjs');
8
+ var node_fs = require('node:fs');
9
+ var path = require('node:path');
10
+ var projectPath = require('./projectPath-ChLhdOyt.cjs');
11
+ var _package = require('./package-BwMrPwqH.cjs');
12
+ var doctorReadiness = require('./doctorReadiness-BCZGcN0a.cjs');
13
+ var authRelay = require('./authRelay-BdYkC1Po.cjs');
14
+ var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
15
+ var node_child_process = require('node:child_process');
16
+
17
+ function shareSafeProcessLine(process2) {
18
+ return `PID ${process2.pid}: command arguments hidden for privacy`;
19
+ }
20
+ function shareSafeDaemonState(state) {
21
+ const { controlToken, ...shareSafeState } = state;
22
+ return {
23
+ ...shareSafeState,
24
+ controlAuthentication: controlToken ? "configured" : "legacy"
25
+ };
26
+ }
27
+ function shareSafeEnvironmentInfo(env = process.env, runtime = process) {
28
+ const knownNodeEnvironments = /* @__PURE__ */ new Set(["development", "production", "test"]);
29
+ const nodeEnvironment = env.NODE_ENV ? knownNodeEnvironments.has(env.NODE_ENV) ? env.NODE_ENV : "custom" : "not set";
30
+ return {
31
+ happyHomeDirConfigured: Boolean(env.HAPPY_HOME_DIR),
32
+ happyVariantConfigured: Boolean(env.HAPPY_VARIANT),
33
+ customServerUrlConfigured: Boolean(env.HAPPY_SERVER_URL),
34
+ projectRootConfigured: Boolean(env.HAPPY_PROJECT_ROOT),
35
+ remoteDebugLoggingEnabled: Boolean(env.DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING),
36
+ debugEnabled: Boolean(env.DEBUG),
37
+ nodeEnvironment,
38
+ processPid: runtime.pid,
39
+ nodeVersion: runtime.version,
40
+ platform: runtime.platform,
41
+ arch: runtime.arch,
42
+ shellConfigured: Boolean(env.SHELL),
43
+ terminalConfigured: Boolean(env.TERM)
44
+ };
45
+ }
46
+
47
+ const NPM_SAFE_ARG = /^[A-Za-z0-9@=.,+/_-]+$/;
48
+ function globalPrefixForPackage(packageDir) {
49
+ if (!path.isAbsolute(packageDir)) return null;
50
+ const dir = path.resolve(packageDir);
51
+ const nodeModules = path.dirname(dir);
52
+ const lib = path.dirname(nodeModules);
53
+ const prefix = path.dirname(lib);
54
+ if (path.basename(dir) !== "very-happy-cli" || path.basename(nodeModules) !== "node_modules" || path.basename(lib) !== "lib") return null;
55
+ if (prefix === lib || path.resolve(prefix) === "/" || !NPM_SAFE_ARG.test(prefix)) return null;
56
+ return prefix;
57
+ }
58
+ function packageDirForBin(realBin) {
59
+ const packageDir = path.dirname(path.dirname(realBin));
60
+ return path.basename(path.dirname(realBin)) === "bin" && path.basename(packageDir) === "very-happy-cli" ? packageDir : null;
61
+ }
62
+ function installLocationWarnings(facts, version) {
63
+ const warnings = [];
64
+ const running = path.resolve(facts.runningPackageDir);
65
+ const packages = [...new Set(facts.onPath.map(packageDirForBin).filter((dir) => Boolean(dir)).map((dir) => path.resolve(dir)))];
66
+ if (packages.length > 1) {
67
+ warnings.push(`Found ${packages.length} very-happy installs on PATH (first one wins): ${packages.join(", ")}. Updating one does not update the others; remove the ones you do not use.`);
68
+ }
69
+ if (packages[0] && packages[0] !== running) {
70
+ warnings.push(`The very-happy command runs ${packages[0]}, but this CLI runs from ${running}.`);
71
+ }
72
+ const prefix = globalPrefixForPackage(running);
73
+ if (prefix && facts.npmGlobalPrefix && path.resolve(facts.npmGlobalPrefix) !== path.resolve(prefix)) {
74
+ const target = version ? `very-happy-cli@${version}` : "very-happy-cli@latest";
75
+ warnings.push(`npm install -g writes to ${facts.npmGlobalPrefix}, but this CLI runs from ${prefix}; a plain update will not take effect. Update with: npm install -g --prefix ${prefix} --allow-scripts=very-happy-cli,node-pty ${target} && very-happy daemon start`);
76
+ }
77
+ return warnings;
78
+ }
79
+ function gatherInstallLocationFacts(runningPackageDir, env = process.env) {
80
+ if (process.platform === "win32") return null;
81
+ const onPath = [];
82
+ for (const dir of (env.PATH ?? "").split(path.delimiter)) {
83
+ if (!dir) continue;
84
+ try {
85
+ const candidate = path.join(dir, "very-happy");
86
+ if (!node_fs.statSync(candidate).isFile()) continue;
87
+ const real = node_fs.realpathSync(candidate);
88
+ if (!onPath.includes(real)) onPath.push(real);
89
+ } catch {
90
+ }
91
+ }
92
+ let npmGlobalPrefix = null;
93
+ try {
94
+ const result = node_child_process.spawnSync("npm", ["prefix", "-g"], { encoding: "utf8", timeout: 5e3, env });
95
+ const out = result.status === 0 ? result.stdout.trim() : "";
96
+ npmGlobalPrefix = out && path.isAbsolute(out) && !out.includes("\n") ? out : null;
97
+ } catch {
98
+ }
99
+ return { runningPackageDir, onPath, npmGlobalPrefix };
100
+ }
101
+
102
+ function printCliUpdateStatus(state) {
103
+ const installed = configuration.configuration.currentCliVersion;
104
+ const running = state?.startedWithCliVersion ?? null;
105
+ const summary = cliUpdate.deriveLocalCliUpdateSummary(installed, running, state?.cliUpdate);
106
+ console.log(` Installed CLI: ${installed}`);
107
+ console.log(` Running daemon: ${running ?? "not running"}`);
108
+ if (state?.cliUpdate?.recommendedVersion) console.log(` Recommended: ${state.cliUpdate.recommendedVersion}`);
109
+ if (state?.cliUpdate?.minimumVersion) console.log(` Minimum: ${state.cliUpdate.minimumVersion}`);
110
+ if (summary.daemonMismatch) {
111
+ console.log(chalk.yellow(" \u26A0 Installed CLI and running daemon differ; run `very-happy daemon start` to hand over safely."));
112
+ }
113
+ if (summary.installedStatus === "required") {
114
+ console.log(chalk.red(" \u2717 This CLI is below the relay minimum supported version."));
115
+ } else if (summary.installedStatus === "available") {
116
+ console.log(chalk.yellow(" \u25B3 A newer CLI is available."));
117
+ }
118
+ if (summary.installCommand) console.log(` Update: ${summary.installCommand}`);
119
+ const facts = gatherInstallLocationFacts(projectPath.projectPath());
120
+ for (const warning of facts ? installLocationWarnings(facts, state?.cliUpdate?.recommendedVersion ?? void 0) : []) {
121
+ console.log(chalk.yellow(` \u26A0 ${warning}`));
122
+ }
123
+ }
124
+ function getEnvironmentInfo() {
125
+ return shareSafeEnvironmentInfo();
126
+ }
127
+ function getLogFiles(logDir) {
128
+ if (!node_fs.existsSync(logDir)) {
129
+ return [];
130
+ }
131
+ try {
132
+ return node_fs.readdirSync(logDir).filter((file) => file.endsWith(".log")).map((file) => {
133
+ const path$1 = path.join(logDir, file);
134
+ const stats = node_fs.statSync(path$1);
135
+ return { file, path: path$1, modified: stats.mtime };
136
+ }).sort((a, b) => b.modified.getTime() - a.modified.getTime());
137
+ } catch {
138
+ return [];
139
+ }
140
+ }
141
+ async function runDoctorDaemon() {
142
+ console.log(chalk.bold("\n\u{1F916} Daemon Status"));
143
+ try {
144
+ const isRunning = await controlClient.checkIfDaemonRunningAndCleanupStaleState();
145
+ const state = await persistence.readDaemonState();
146
+ if (isRunning && state) {
147
+ console.log(chalk.green("\u2713 Daemon is running"));
148
+ console.log(` PID: ${state.pid}`);
149
+ console.log(` Port: ${state.httpPort}`);
150
+ console.log(` Started: ${new Date(state.startTime).toLocaleString()}`);
151
+ printCliUpdateStatus(state);
152
+ console.log(` Relay: ${state.serverUrl ?? "unknown (started by an older CLI)"}`);
153
+ console.log(` Web UI: ${state.webappUrl ?? "unknown (started by an older CLI)"}`);
154
+ console.log(` Claude: ${state.claudeCredentialSource ?? "not detected at daemon start"}`);
155
+ if (!doctorReadiness.daemonEndpointsMatch(state.serverUrl, state.webappUrl, configuration.configuration.serverUrl, configuration.configuration.webappUrl)) {
156
+ console.log(chalk.red(" \u2717 Running daemon endpoints differ from this shell; run `very-happy daemon start` to restart it safely."));
157
+ }
158
+ } else if (state && !isRunning) {
159
+ console.log(chalk.yellow("\u26A0\uFE0F Daemon state exists but process not running (stale)"));
160
+ printCliUpdateStatus(state);
161
+ } else {
162
+ console.log(chalk.red("\u274C Daemon is not running"));
163
+ printCliUpdateStatus(null);
164
+ }
165
+ if (state) {
166
+ console.log(chalk.bold("\n\u{1F4C4} Daemon State:"));
167
+ console.log(chalk.blue(`Location: ${configuration.configuration.daemonStateFile}`));
168
+ console.log(chalk.gray(JSON.stringify(shareSafeDaemonState(state), null, 2)));
169
+ }
170
+ } catch (error) {
171
+ console.log(chalk.red("\u274C Error checking daemon status"));
172
+ }
173
+ console.log(chalk.gray("\nRun `very-happy doctor` for full diagnostics.\n"));
174
+ }
175
+ async function runDoctorCommand() {
176
+ console.log(chalk.bold.cyan("\n\u{1FA7A} Happy CLI Doctor\n"));
177
+ try {
178
+ const allProcesses = await doctor$1.findAllHappyProcesses();
179
+ if (allProcesses.length > 0) {
180
+ console.log(chalk.bold("\u{1F50D} All Happy CLI Processes"));
181
+ const grouped = allProcesses.reduce((groups, process2) => {
182
+ if (!groups[process2.type]) groups[process2.type] = [];
183
+ groups[process2.type].push(process2);
184
+ return groups;
185
+ }, {});
186
+ Object.entries(grouped).forEach(([type, processes]) => {
187
+ const typeLabels = {
188
+ "current": "\u{1F4CD} Current Process",
189
+ "daemon": "\u{1F916} Daemon",
190
+ "daemon-version-check": "\u{1F50D} Daemon Version Check (stuck)",
191
+ "daemon-spawned-session": "\u{1F517} Daemon-Spawned Sessions",
192
+ "user-session": "\u{1F464} User Sessions",
193
+ "dev-daemon": "\u{1F6E0}\uFE0F Dev Daemon",
194
+ "dev-daemon-version-check": "\u{1F6E0}\uFE0F Dev Daemon Version Check (stuck)",
195
+ "dev-session": "\u{1F6E0}\uFE0F Dev Sessions",
196
+ "dev-doctor": "\u{1F6E0}\uFE0F Dev Doctor",
197
+ "dev-related": "\u{1F6E0}\uFE0F Dev Related",
198
+ "doctor": "\u{1FA7A} Doctor",
199
+ "unknown": "\u2753 Unknown"
200
+ };
201
+ console.log(chalk.blue(`
202
+ ${typeLabels[type] || type}:`));
203
+ processes.forEach((process2) => {
204
+ const color = type === "current" ? chalk.green : type.startsWith("dev") ? chalk.cyan : type.includes("daemon") ? chalk.blue : chalk.gray;
205
+ console.log(` ${color(shareSafeProcessLine(process2))}`);
206
+ });
207
+ });
208
+ if (allProcesses.length > 1) {
209
+ console.log(chalk.bold("\n\u{1F4A1} Process Management"));
210
+ console.log(chalk.gray("To clean up runaway processes: very-happy doctor clean"));
211
+ }
212
+ } else {
213
+ console.log(chalk.red("\u274C No happy processes found"));
214
+ }
215
+ } catch (error) {
216
+ console.log(chalk.red("\u274C Error listing processes"));
217
+ }
218
+ console.log(chalk.bold("\n\u{1F4DD} Log Files"));
219
+ const allLogs = getLogFiles(configuration.configuration.logsDir);
220
+ if (allLogs.length > 0) {
221
+ const daemonLogs = allLogs.filter(({ file }) => file.includes("daemon"));
222
+ const regularLogs = allLogs.filter(({ file }) => !file.includes("daemon"));
223
+ if (regularLogs.length > 0) {
224
+ console.log(chalk.blue("\nRecent Logs:"));
225
+ const logsToShow = regularLogs.slice(0, 10);
226
+ logsToShow.forEach(({ file, path, modified }) => {
227
+ console.log(` ${chalk.green(file)} - ${modified.toLocaleString()}`);
228
+ console.log(chalk.gray(` ${path}`));
229
+ });
230
+ if (regularLogs.length > 10) {
231
+ console.log(chalk.gray(` ... and ${regularLogs.length - 10} more log files`));
232
+ }
233
+ }
234
+ if (daemonLogs.length > 0) {
235
+ console.log(chalk.blue("\nDaemon Logs:"));
236
+ const daemonLogsToShow = daemonLogs.slice(0, 5);
237
+ daemonLogsToShow.forEach(({ file, path, modified }) => {
238
+ console.log(` ${chalk.green(file)} - ${modified.toLocaleString()}`);
239
+ console.log(chalk.gray(` ${path}`));
240
+ });
241
+ if (daemonLogs.length > 5) {
242
+ console.log(chalk.gray(` ... and ${daemonLogs.length - 5} more daemon log files`));
243
+ }
244
+ } else {
245
+ console.log(chalk.yellow("\nNo daemon log files found"));
246
+ }
247
+ } else {
248
+ console.log(chalk.yellow("No log files found"));
249
+ }
250
+ console.log(chalk.bold("\n\u{1F527} Daemon Spawn Diagnostics"));
251
+ const projectRoot = projectPath.projectPath();
252
+ const wrapperPath = path.join(projectRoot, "bin", "very-happy.mjs");
253
+ const cliEntrypoint = path.join(projectRoot, "dist", "index.mjs");
254
+ console.log(`Project Root: ${chalk.blue(projectRoot)}`);
255
+ console.log(`Wrapper Script: ${chalk.blue(wrapperPath)}`);
256
+ console.log(`CLI Entrypoint: ${chalk.blue(cliEntrypoint)}`);
257
+ console.log(`Wrapper Exists: ${node_fs.existsSync(wrapperPath) ? chalk.green("\u2713 Yes") : chalk.red("\u274C No")}`);
258
+ console.log(`CLI Exists: ${node_fs.existsSync(cliEntrypoint) ? chalk.green("\u2713 Yes") : chalk.red("\u274C No")}`);
259
+ console.log(chalk.bold("\n\u{1F30D} Environment Variables"));
260
+ const env = getEnvironmentInfo();
261
+ console.log(`HAPPY_HOME_DIR: ${env.happyHomeDirConfigured ? chalk.green("set (path hidden here)") : chalk.gray("not set")}`);
262
+ console.log(`HAPPY_SERVER_URL: ${env.customServerUrlConfigured ? chalk.green("set (resolved origin shown below)") : chalk.gray("not set")}`);
263
+ console.log(`DANGEROUSLY_LOG_TO_SERVER: ${env.remoteDebugLoggingEnabled ? chalk.yellow("ENABLED") : chalk.gray("not set")}`);
264
+ console.log(`DEBUG: ${env.debugEnabled ? chalk.green("enabled (value hidden)") : chalk.gray("not set")}`);
265
+ console.log(`NODE_ENV: ${chalk.green(env.nodeEnvironment)}`);
266
+ try {
267
+ const settings = await persistence.readSettings();
268
+ console.log(chalk.bold("\n\u{1F4C4} Settings (share-safe summary):"));
269
+ console.log(chalk.gray(JSON.stringify(doctorReadiness.shareableSettingsSummary(settings), null, 2)));
270
+ console.log(chalk.gray("Unknown fields, commands, arguments, paths, and credential-like values are omitted."));
271
+ } catch (error) {
272
+ console.log(chalk.bold("\n\u{1F4C4} Settings:"));
273
+ console.log(chalk.red("\u274C Failed to read settings"));
274
+ }
275
+ console.log(chalk.bold("\n\u{1F41B} Support & Bug Reports"));
276
+ console.log(`Report issues: ${chalk.blue("https://github.com/Mereithhh/very-happy/issues")}`);
277
+ console.log(`Documentation: ${chalk.blue("https://github.com/Mereithhh/very-happy/tree/main/docs")}`);
278
+ console.log(chalk.bold("\n\u{1F4CB} Basic Information"));
279
+ console.log(`Happy CLI Version: ${chalk.green(_package.packageJson.version)}`);
280
+ console.log(`Platform: ${chalk.green(process.platform)} ${process.arch}`);
281
+ console.log(`Node.js Version: ${chalk.green(process.version)}`);
282
+ console.log(chalk.bold("\n\u2699\uFE0F Configuration"));
283
+ console.log(`Happy Home: ${chalk.blue(configuration.configuration.happyHomeDir)}`);
284
+ console.log(`Configured server URL: ${chalk.blue(configuration.configuration.serverUrl)}`);
285
+ console.log(`Configured approval UI: ${chalk.blue(configuration.configuration.webappUrl)}`);
286
+ console.log(`Logs Dir: ${chalk.blue(configuration.configuration.logsDir)}`);
287
+ const readiness = doctorReadiness.collectRuntimeReadiness();
288
+ console.log(chalk.bold("\n\u{1F9ED} First-use Readiness"));
289
+ if (readiness.node.supported) {
290
+ console.log(chalk.green(`\u2713 Node.js ${readiness.node.version} (supported: ${doctorReadiness.SUPPORTED_NODE_LABEL})`));
291
+ } else {
292
+ console.log(chalk.red(`\u274C Node.js ${readiness.node.version} is unsupported; install Node.js ${doctorReadiness.SUPPORTED_NODE_LABEL}`));
293
+ }
294
+ if (!readiness.tmux.available) {
295
+ console.log(chalk.yellow("\u25CB tmux not found \u2014 Web terminals use a non-persistent direct shell"));
296
+ console.log(chalk.gray(" Install tmux for reconnectable terminals; use tmux 3.2+ for the optional Claude mirror."));
297
+ } else if (!readiness.tmux.supportsSessionEnv) {
298
+ console.log(chalk.yellow(`\u25B3 ${readiness.tmux.version ?? "tmux found"} \u2014 durable terminals work, but 3.2+ is required for the optional Claude mirror`));
299
+ } else {
300
+ console.log(chalk.green(`\u2713 ${readiness.tmux.version ?? "tmux 3.2+"} \u2014 durable Web terminals and the optional Claude mirror are available`));
301
+ }
302
+ const availableAgents = readiness.agents.filter((agent) => agent.available);
303
+ console.log(chalk.green("\u2713 Claude structured runtime: bundled Agent SDK"));
304
+ const currentClaudeCredentials = doctorReadiness.resolveClaudeCredentialReadiness();
305
+ if (currentClaudeCredentials.configured) {
306
+ console.log(chalk.green(`\u2713 Claude credential source in this process: ${currentClaudeCredentials.source}`));
307
+ console.log(chalk.gray(" Restart the daemon after changing its credentials or service-manager environment."));
308
+ } else {
309
+ console.log(chalk.yellow("\u25CB No Claude credential source detected in this process"));
310
+ console.log(chalk.gray(" Set ANTHROPIC_API_KEY or a supported cloud provider for the daemon user, then restart it."));
311
+ console.log(chalk.gray(" OS-keychain credentials cannot be verified here; see /docs/configuration#claude-credentials."));
312
+ }
313
+ console.log(chalk.gray(" An external claude command is only needed for native terminal/mirror use."));
314
+ try {
315
+ const { resolveAgentHomesForCli } = await Promise.resolve().then(function () { return require('./agentHome-CboCeKWq.cjs'); });
316
+ const { describeAgentHome } = await Promise.resolve().then(function () { return require('./index-Bu5Zi_a9.cjs'); });
317
+ const homes = await resolveAgentHomesForCli();
318
+ console.log(chalk.green(`\u2713 Claude config dir: ${describeAgentHome(homes.claudeConfigDir)}`));
319
+ console.log(chalk.green(`\u2713 Codex home: ${describeAgentHome(homes.codexHome)}`));
320
+ console.log(chalk.gray(" Resolved from settings.json, then your login shell, then the daemon environment; pin with `very-happy agent-home`."));
321
+ } catch {
322
+ console.log(chalk.yellow("\u25CB Could not resolve the Claude/Codex home directories"));
323
+ }
324
+ if (availableAgents.length === 0) {
325
+ console.log(chalk.yellow("\u25CB No external agent command found on this daemon PATH"));
326
+ console.log(chalk.gray(" Codex, Gemini, OpenCode, OpenClaw, and native Claude terminal paths need their local command or gateway."));
327
+ console.log(chalk.gray(" Bundled structured Claude and plain Web terminals remain available."));
328
+ } else {
329
+ console.log(chalk.green(`\u2713 External agent command${availableAgents.length === 1 ? "" : "s"}: ${availableAgents.map(doctorReadiness.toolProbeLabel).join(", ")}`));
330
+ }
331
+ const piProbe = readiness.agents.find((agent) => agent.command === "pi");
332
+ if (piProbe?.available && !readiness.piAdapter.available) {
333
+ console.log(chalk.yellow("\u25CB pi found, but the pi-acp adapter is not on PATH \u2014 `very-happy pi` and spawning pi from the Web need it"));
334
+ console.log(chalk.gray(" Install it for the daemon user: npm install -g pi-acp@0.0.33"));
335
+ }
336
+ console.log(chalk.bold("\n\u{1F510} Authentication"));
337
+ let authenticated = false;
338
+ try {
339
+ const credentials = await persistence.readCredentials();
340
+ if (credentials) {
341
+ const relayProblem = authRelay.credentialRelayProblem(credentials.authServerUrl, configuration.configuration.serverUrl);
342
+ if (relayProblem) {
343
+ console.log(chalk.red(`\u2717 Not paired to the configured relay: ${relayProblem}`));
344
+ console.log(chalk.gray(" Use a separate HAPPY_HOME_DIR or run `very-happy auth login --force`."));
345
+ } else {
346
+ authenticated = true;
347
+ console.log(chalk.green("\u2713 Authenticated to the configured relay"));
348
+ }
349
+ } else {
350
+ console.log(chalk.yellow("\u26A0\uFE0F Not authenticated (no credentials)"));
351
+ }
352
+ } catch (error) {
353
+ console.log(chalk.red("\u274C Error reading credentials"));
354
+ }
355
+ console.log(chalk.bold("\n\u{1F916} Daemon Status"));
356
+ try {
357
+ const isRunning = await controlClient.checkIfDaemonRunningAndCleanupStaleState();
358
+ const state = await persistence.readDaemonState();
359
+ const summary = doctorReadiness.daemonReadiness(authenticated, isRunning, Boolean(state));
360
+ if (summary.level === "ready" && state) {
361
+ console.log(chalk.green(summary.message));
362
+ console.log(` PID: ${state.pid}`);
363
+ console.log(` Port: ${state.httpPort}`);
364
+ console.log(` Started: ${new Date(state.startTime).toLocaleString()}`);
365
+ printCliUpdateStatus(state);
366
+ console.log(` Relay: ${state.serverUrl ?? "unknown (started by an older CLI)"}`);
367
+ console.log(` Web UI: ${state.webappUrl ?? "unknown (started by an older CLI)"}`);
368
+ console.log(` Claude: ${state.claudeCredentialSource ?? "not detected at daemon start"}`);
369
+ if (!doctorReadiness.daemonEndpointsMatch(state.serverUrl, state.webappUrl, configuration.configuration.serverUrl, configuration.configuration.webappUrl)) {
370
+ console.log(chalk.red(" \u2717 Running daemon endpoints differ from the configured endpoints; run `very-happy daemon start` to restart it."));
371
+ }
372
+ } else {
373
+ console.log(chalk.yellow(summary.message));
374
+ }
375
+ if (state) {
376
+ console.log(chalk.bold("\n\u{1F4C4} Daemon State:"));
377
+ console.log(chalk.blue(`Location: ${configuration.configuration.daemonStateFile}`));
378
+ console.log(chalk.gray(JSON.stringify(shareSafeDaemonState(state), null, 2)));
379
+ }
380
+ } catch (error) {
381
+ console.log(chalk.red("\u274C Error checking daemon status"));
382
+ }
383
+ console.log(chalk.green("\n\u2705 Doctor diagnosis complete!\n"));
384
+ }
385
+
386
+ var doctor = /*#__PURE__*/Object.freeze({
387
+ __proto__: null,
388
+ getEnvironmentInfo: getEnvironmentInfo,
389
+ runDoctorCommand: runDoctorCommand,
390
+ runDoctorDaemon: runDoctorDaemon
391
+ });
392
+
393
+ exports.doctor = doctor;
394
+ exports.getEnvironmentInfo = getEnvironmentInfo;
395
+ exports.globalPrefixForPackage = globalPrefixForPackage;