very-happy-cli 0.2.159 → 0.2.161

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 (259) hide show
  1. package/dist/{AcpBackend-VsfkZiVF.mjs → AcpBackend-6U6pQgx1.mjs} +4 -2
  2. package/dist/{AcpBackend-DUYFlyfN.cjs → AcpBackend-Ba98QDif.cjs} +78 -76
  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-2R0uH2CI.cjs +157 -0
  6. package/dist/BasePermissionHandler-BvvhBTja.mjs +155 -0
  7. package/dist/BaseReasoningProcessor-DyhO1uoU.mjs +198 -0
  8. package/dist/BaseReasoningProcessor-fsVNmCEF.cjs +200 -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-CvsJyeQB.mjs → agentHome-Ck1i1TQB.mjs} +8 -22
  16. package/dist/{agentHome-CHh4lmjM.cjs → agentHome-DvNnGphb.cjs} +14 -28
  17. package/dist/api-B2vLMS-z.cjs +3346 -0
  18. package/dist/api-SffjRQ1b.mjs +3339 -0
  19. package/dist/{types-Dh-s4Lqs.mjs → apiMachine-BpW9t8MO.mjs} +9116 -16205
  20. package/dist/{types-BbvK1Tr_.cjs → apiMachine-gFA54X7y.cjs} +9104 -16247
  21. package/dist/assistantTools-BfA0R3_m.cjs +380 -0
  22. package/dist/assistantTools-CgiTbnWb.mjs +376 -0
  23. package/dist/attachmentContent-CSGxr71v.mjs +82 -0
  24. package/dist/attachmentContent-DMMZzevR.cjs +88 -0
  25. package/dist/attachmentLimits-CzVrqgLR.cjs +354 -0
  26. package/dist/attachmentLimits-yba1uHFO.mjs +348 -0
  27. package/dist/auth-Bt4ceBBy.cjs +227 -0
  28. package/dist/auth-CYHjQ8oQ.mjs +225 -0
  29. package/dist/auth-DdyVZSo6.mjs +218 -0
  30. package/dist/auth-x4CEoysH.cjs +220 -0
  31. package/dist/authRelay-BdYkC1Po.cjs +156 -0
  32. package/dist/authRelay-DSAvg1uv.mjs +143 -0
  33. package/dist/{auto-DKmEls8Z.cjs → auto-BDXDUnjB.cjs} +70 -79
  34. package/dist/{auto-nb8GhRRy.mjs → auto-CXLlRi3a.mjs} +27 -36
  35. package/dist/backgroundTaskActivity-8PdPxrvy.mjs +149 -0
  36. package/dist/backgroundTaskActivity-CBvUdj39.cjs +157 -0
  37. package/dist/bootstrap-BNQq05jR.mjs +112 -0
  38. package/dist/bootstrap-CkgIq8N3.cjs +116 -0
  39. package/dist/browser-9pyhQr1R.mjs +20 -0
  40. package/dist/browser-BDOlKWYe.cjs +22 -0
  41. package/dist/claudeCliPath-BqkaH2oR.mjs +8 -0
  42. package/dist/claudeCliPath-U4HHmV4r.cjs +10 -0
  43. package/dist/claudeLocal-BDuGFnjJ.cjs +343 -0
  44. package/dist/claudeLocal-CQa8qnwq.mjs +339 -0
  45. package/dist/claudeLocalLauncher-Bd5I2-j6.cjs +154 -0
  46. package/dist/claudeLocalLauncher-CDqQI9ak.mjs +152 -0
  47. package/dist/cliUpdate-DsKXPFYp.cjs +120 -0
  48. package/dist/cliUpdate-Y34VGe9Y.mjs +112 -0
  49. package/dist/client-Brn-UwVk.mjs +100 -0
  50. package/dist/client-CXb1VJui.mjs +112 -0
  51. package/dist/client-C_axwRry.cjs +104 -0
  52. package/dist/client-DOBWJL3u.cjs +119 -0
  53. package/dist/codex/happyMcpStdioBridge.cjs +33 -14
  54. package/dist/codex/happyMcpStdioBridge.mjs +26 -7
  55. package/dist/codexAppServerClient-ZzhUTWPo.cjs +1090 -0
  56. package/dist/codexAppServerClient-oeQKD6Qf.mjs +1088 -0
  57. package/dist/codexCommand-C7H0NpBe.cjs +2088 -0
  58. package/dist/codexCommand-CJ82bl3l.mjs +2086 -0
  59. package/dist/codexThreadFork-BCaEMBiM.mjs +338 -0
  60. package/dist/codexThreadFork-BZqF-9bX.cjs +350 -0
  61. package/dist/{config-ClLtM6F3.mjs → config-BglnktIo.mjs} +7 -40
  62. package/dist/{config-DLx-vW3I.cjs → config-CYpL1Ahd.cjs} +26 -59
  63. package/dist/configuration-DoWFJUPm.mjs +170 -0
  64. package/dist/configuration-v9f8LM9T.cjs +181 -0
  65. package/dist/connect-hgcNjyAB.mjs +682 -0
  66. package/dist/connect-yEvjdRvx.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-B45vMtSZ.cjs +69 -0
  72. package/dist/context-C9GHPLEm.mjs +65 -0
  73. package/dist/controlClient-DjoKTtgK.mjs +260 -0
  74. package/dist/controlClient-fEHE85bH.cjs +279 -0
  75. package/dist/createSessionMetadata-BRLB9CNO.cjs +58 -0
  76. package/dist/createSessionMetadata-mIeehclp.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-DKDP_mM-.cjs +507 -0
  82. package/dist/deterministicJson-p835AdAU.mjs +502 -0
  83. package/dist/doctor-BPkYWSuq.mjs +75 -0
  84. package/dist/doctor-BeUuQXFs.mjs +391 -0
  85. package/dist/doctor-hVNnSZJn.cjs +395 -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-CO7d1gOC.mjs +61 -0
  92. package/dist/ensureDaemonRunning-Dg9aZfjs.cjs +64 -0
  93. package/dist/handleResumeCommand-BiTPK0qd.mjs +240 -0
  94. package/dist/handleResumeCommand-DnVmy7a3.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-2mCaeKyf.mjs → index-CAFwetLk.mjs} +68 -38
  99. package/dist/index-Cqx-Raq6.mjs +68 -0
  100. package/dist/index-D3kI0hDR.cjs +107 -0
  101. package/dist/index-DA7yINuk.cjs +994 -0
  102. package/dist/{index-BEOMECtE.cjs → index-LIn6nCcq.cjs} +121 -91
  103. package/dist/index-Pf2cV9cn.cjs +182 -0
  104. package/dist/index-SPGPenK5.mjs +158 -0
  105. package/dist/index-gNTWtSKN.cjs +71 -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-Bu85vlHD.cjs +88 -0
  111. package/dist/install-ClUUl3yp.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-C2dI0FAN.mjs +297 -0
  122. package/dist/lidState-KHHu1015.cjs +305 -0
  123. package/dist/limits-C-a7gr04.cjs +43 -0
  124. package/dist/limits-DIo7rEBR.mjs +36 -0
  125. package/dist/localHappyAgentAuth-BXiHPXdC.cjs +86 -0
  126. package/dist/localHappyAgentAuth-DCsetiyG.mjs +82 -0
  127. package/dist/logger-Bc8-u1w0.cjs +275 -0
  128. package/dist/logger-fXoNzNuB.mjs +271 -0
  129. package/dist/loginShellEnv-BkuYtExZ.cjs +182 -0
  130. package/dist/loginShellEnv-Dw8M7tkI.mjs +167 -0
  131. package/dist/machineMetadata-BHjehxJY.mjs +38 -0
  132. package/dist/machineMetadata-BibDMFVx.cjs +41 -0
  133. package/dist/main-BktM4A1K.mjs +939 -0
  134. package/dist/main-CLaX-t-b.cjs +941 -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-CeUd9KDr.mjs} +27 -33
  138. package/dist/{mcp-CPYbtsYG.cjs → mcp-GBfE70nk.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-Cl5BEP5x.cjs +173 -0
  146. package/dist/package-uOg9SCKi.mjs +171 -0
  147. package/dist/path-B7zW-WwE.cjs +18 -0
  148. package/dist/path-D2wdaNSk.mjs +15 -0
  149. package/dist/peerTools-CIeiy9wn.cjs +283 -0
  150. package/dist/peerTools-Dz3_7Bkk.mjs +272 -0
  151. package/dist/permissionMode-CH4FoZfU.mjs +80 -0
  152. package/dist/permissionMode-CrV-XuMs.cjs +87 -0
  153. package/dist/persistence-CBNMzSa8.cjs +414 -0
  154. package/dist/persistence-oET5n61f.mjs +372 -0
  155. package/dist/piExtension.mjs +2 -1
  156. package/dist/piRunnerArgs-Bf7RUF__.cjs +66 -0
  157. package/dist/piRunnerArgs-Dk1ncwHF.mjs +59 -0
  158. package/dist/{piRuntime-NtF0YqjH.cjs → piRuntime-B_6TE9Eb.cjs} +4 -4
  159. package/dist/{piRuntime-kLZNpAAl.mjs → piRuntime-BwRdhK_N.mjs} +2 -2
  160. package/dist/{piTerminal-B0fEOV_2.mjs → piTerminal-Bap3R8Re.mjs} +32 -35
  161. package/dist/{piTerminal-9J0GAKzb.cjs → piTerminal-CagmEoez.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-BjSV2Skz.cjs +538 -0
  167. package/dist/registerCommonHandlers-CrgvJsOy.mjs +536 -0
  168. package/dist/registerKillSessionHandler-6TC2S3lf.cjs +366 -0
  169. package/dist/registerKillSessionHandler-Cbc8Rgtd.mjs +363 -0
  170. package/dist/remoteSessionClient-BNx78NLb.cjs +634 -0
  171. package/dist/remoteSessionClient-CO7qOjR0.mjs +612 -0
  172. package/dist/resources-BdFBQi8r.mjs +117 -0
  173. package/dist/resources-JDPugcDq.cjs +120 -0
  174. package/dist/run-2l5vSt2h.mjs +5743 -0
  175. package/dist/run-D5xAEWSB.cjs +5766 -0
  176. package/dist/runClaude-BX6ixjtW.cjs +894 -0
  177. package/dist/runClaude-BgN6xo05.mjs +892 -0
  178. package/dist/runClaudeDeps-Bp20MScE.cjs +4168 -0
  179. package/dist/runClaudeDeps-COBBhD9o.mjs +4129 -0
  180. package/dist/{runGemini-F-mqx3_K.cjs → runGemini-CSMPkt0p.cjs} +202 -175
  181. package/dist/{runGemini-DV6Ouadt.mjs → runGemini-Cc2jq-uh.mjs} +58 -31
  182. package/dist/{runOpenClaw-D7MlPS5n.mjs → runOpenClaw-CIlCwdW2.mjs} +31 -32
  183. package/dist/{runOpenClaw-Qqo9j63M.cjs → runOpenClaw-YBwua4Rf.cjs} +64 -65
  184. package/dist/sandbox-C4gXLP1p.cjs +187 -0
  185. package/dist/sandbox-CNkwOtHI.mjs +180 -0
  186. package/dist/selfCheck-CU8xSDsl.cjs +87 -0
  187. package/dist/selfCheck-hJ6PCh7v.mjs +84 -0
  188. package/dist/{send-CLhYXNgy.mjs → send-CGHcKZ-w.mjs} +12 -5
  189. package/dist/{send-4qJTCAYW.cjs → send-DY9Nr-x4.cjs} +16 -9
  190. package/dist/server-II51Mimf.cjs +407 -0
  191. package/dist/server-m2b5pamZ.mjs +404 -0
  192. package/dist/sessionLock-7ePAYDOg.cjs +205 -0
  193. package/dist/sessionLock-Cw6FmbMv.mjs +197 -0
  194. package/dist/sessionModeFile-BVCV5f7E.cjs +36 -0
  195. package/dist/sessionModeFile-CDmDyRkD.mjs +32 -0
  196. package/dist/sessionOps-C_f1wKOr.mjs +760 -0
  197. package/dist/sessionOps-DJdExmBy.cjs +783 -0
  198. package/dist/sessionScanner-CaAHLyNV.mjs +206 -0
  199. package/dist/sessionScanner-D1goKdd3.cjs +209 -0
  200. package/dist/{sessions-Bh1pyddi.cjs → sessions-DGs6ALNo.cjs} +37 -28
  201. package/dist/{sessions-CzIH2rGp.mjs → sessions-DnvmWUel.mjs} +17 -8
  202. package/dist/setupOfflineReconnection-CVViqZft.mjs +72 -0
  203. package/dist/setupOfflineReconnection-R7XuR_sj.cjs +74 -0
  204. package/dist/smallFastModel-BLNgMrwR.mjs +18 -0
  205. package/dist/smallFastModel-D_uxGMo3.cjs +21 -0
  206. package/dist/{spawn-CmFOSVdW.cjs → spawn-CXTH7qg1.cjs} +61 -65
  207. package/dist/{spawn-CPIWlPOM.mjs → spawn-DNYSvFtC.mjs} +35 -40
  208. package/dist/spawnAgents-BGQiEF-w.cjs +52 -0
  209. package/dist/spawnAgents-DZzZ9jMI.mjs +45 -0
  210. package/dist/spawnHappyCLI-BhYj84rv.cjs +66 -0
  211. package/dist/spawnHappyCLI-cqWQbwsb.mjs +64 -0
  212. package/dist/specialCommands-BSqhYg5X.mjs +52 -0
  213. package/dist/specialCommands-DSsTeRej.cjs +54 -0
  214. package/dist/startFileWatcher-CKKx-8ZO.cjs +71 -0
  215. package/dist/startFileWatcher-CdegMbJj.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-CVk4QERO.cjs +71 -0
  221. package/dist/sync-CxD-w_40.mjs +69 -0
  222. package/dist/systemPrompt-BygJcmbi.cjs +97 -0
  223. package/dist/systemPrompt-DmtypUc7.mjs +94 -0
  224. package/dist/{teams-CEahj4cm.mjs → teams-BOC6nIPL.mjs} +9 -40
  225. package/dist/{teams-CB1R9-Z9.cjs → teams-BsvpOBfn.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-BZNdNiIV.mjs +38 -0
  233. package/dist/time-CNRE4ChD.cjs +42 -0
  234. package/dist/titleGenerator-CFRhU-xq.cjs +172 -0
  235. package/dist/titleGenerator-ox6ptCsp.mjs +166 -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-B-KB7oAB.cjs} +15 -12
  239. package/dist/{todo-Cknp5D4U.mjs → todo-C5KBVbUw.mjs} +11 -8
  240. package/dist/tools-BZabNIid.mjs +177 -0
  241. package/dist/tools-BmQQUATY.mjs +60 -0
  242. package/dist/tools-CsSovyNp.cjs +180 -0
  243. package/dist/tools-lMDra4Pv.cjs +63 -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-B1WLtC1d.mjs +47 -0
  249. package/dist/uninstall-fvA5aWpU.cjs +49 -0
  250. package/package.json +7 -7
  251. package/scripts/session_hook_forwarder.cjs +9 -2
  252. package/dist/agentGuidance-BRDN1NoZ.cjs +0 -2217
  253. package/dist/agentGuidance-KgvYuF3R.mjs +0 -2145
  254. package/dist/index-BF6WfgV5.mjs +0 -19624
  255. package/dist/index-C-JazrMB.mjs +0 -52
  256. package/dist/index-blDSadUR.cjs +0 -58
  257. package/dist/index-rH3DrQ5B.cjs +0 -19688
  258. package/dist/limits-BH5CV5vR.cjs +0 -2683
  259. package/dist/limits-CjRj8IX5.mjs +0 -2558
@@ -0,0 +1,407 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
4
+ var node_fs = require('node:fs');
5
+ var path = require('node:path');
6
+ var node_url = require('node:url');
7
+ var module$1 = require('node:module');
8
+ var node_crypto = require('node:crypto');
9
+ var node_child_process = require('node:child_process');
10
+ var promises = require('node:readline/promises');
11
+ var configuration = require('./configuration-v9f8LM9T.cjs');
12
+ var persistence = require('./persistence-CBNMzSa8.cjs');
13
+ require('node:os');
14
+ require('./package-Cl5BEP5x.cjs');
15
+ require('node:fs/promises');
16
+ require('zod');
17
+ require('./authRelay-BdYkC1Po.cjs');
18
+ require('tweetnacl');
19
+ require('./logger-Bc8-u1w0.cjs');
20
+ require('node:util');
21
+
22
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
23
+ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, generatedInviteCode) {
24
+ const signupMode = configuredMode?.trim() || "invite";
25
+ const inviteCodes = configuredInviteCodes?.trim();
26
+ if (signupMode !== "invite" || inviteCodes) {
27
+ return { signupMode, signupInviteCodes: inviteCodes || void 0 };
28
+ }
29
+ return {
30
+ signupMode,
31
+ signupInviteCodes: generatedInviteCode,
32
+ generatedInviteCode
33
+ };
34
+ }
35
+
36
+ const __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('server-II51Mimf.cjs', document.baseURI).href)));
37
+ const __dirname$1 = path.dirname(__filename$1);
38
+ const require_ = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('server-II51Mimf.cjs', document.baseURI).href)));
39
+ const PRISMA_QUERY_ENGINE_FILES = {
40
+ "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
41
+ "x64-darwin": "libquery_engine-darwin.dylib.node",
42
+ "arm64-linux": "libquery_engine-linux-arm64-openssl-3.0.x.so.node",
43
+ "x64-linux": "libquery_engine-debian-openssl-3.0.x.so.node",
44
+ "x64-win32": "query_engine-windows.dll.node"
45
+ };
46
+ const SERVER_PACKAGE_NAME = "very-happy-server";
47
+ const SETTINGS_WRITE_CONFIRM_FLAG = "--i-understand-this-will-modify-default-happy-settings";
48
+ async function handleServerCommand(args) {
49
+ const opts = parseArgs(args);
50
+ if (opts === null) return;
51
+ const serverUrl = `http://${opts.host === "0.0.0.0" ? "127.0.0.1" : opts.host}:${opts.port}`;
52
+ await ensureSettingsWriteAllowed(opts, serverUrl);
53
+ const dataDir = path.join(configuration.configuration.happyHomeDir, "server-data");
54
+ const pgliteDir = path.join(dataDir, "pglite");
55
+ const secretFile = path.join(dataDir, "master-secret");
56
+ const bootstrapCodeFile = path.join(dataDir, "bootstrap-invite-code");
57
+ if (opts.reset && node_fs.existsSync(dataDir)) {
58
+ console.log(chalk.yellow(`Wiping ${dataDir}...`));
59
+ node_fs.rmSync(dataDir, { recursive: true, force: true });
60
+ }
61
+ node_fs.mkdirSync(dataDir, { recursive: true });
62
+ const masterSecret = opts.masterSecret ?? loadOrCreateMasterSecret(secretFile);
63
+ const signup = resolveLocalSignupBootstrap(
64
+ process.env.SIGNUP_MODE,
65
+ process.env.SIGNUP_INVITE_CODES,
66
+ loadOrCreateBootstrapInviteCode(bootstrapCodeFile)
67
+ );
68
+ const artifacts = resolveServerArtifacts();
69
+ if (!artifacts) {
70
+ console.error(chalk.red("Could not locate happy-server."));
71
+ console.error(chalk.gray(" Expected one of:"));
72
+ console.error(chalk.gray(` - installed ${SERVER_PACKAGE_NAME} package`));
73
+ console.error(chalk.gray(` - legacy bundled binary at ${path.join(__dirname$1, "..", "..", "tools", "server", currentPlatform(), bundledBinaryName())}`));
74
+ console.error(chalk.gray(" - sibling packages/happy-server/sources/standalone.ts in the monorepo"));
75
+ console.error(chalk.gray(` The fork-owned ${SERVER_PACKAGE_NAME} artifact may not be published yet.`));
76
+ console.error(chalk.gray(" Use Dockerfile.server from the repository for the supported self-host path."));
77
+ process.exit(1);
78
+ }
79
+ const staticDir = artifacts.webappDir ?? findWebappDir();
80
+ console.log(chalk.cyan(`
81
+ very-happy server`));
82
+ console.log(chalk.gray(` data dir: ${dataDir}`));
83
+ console.log(chalk.gray(` server url: ${serverUrl}`));
84
+ console.log(chalk.gray(` mode: ${serverArtifactMode(artifacts)}`));
85
+ if (staticDir) {
86
+ console.log(chalk.gray(` webapp: ${staticDir}`));
87
+ } else {
88
+ console.log(chalk.yellow(" webapp: (no production Web V2 build) \u2014 API only. Run `pnpm bundle:webapp` to build."));
89
+ }
90
+ console.log();
91
+ const env = {
92
+ ...process.env,
93
+ DB_PROVIDER: "pglite",
94
+ DATA_DIR: dataDir,
95
+ PGLITE_DIR: pgliteDir,
96
+ HANDY_MASTER_SECRET: masterSecret,
97
+ PORT: String(opts.port),
98
+ HOST: opts.host,
99
+ SIGNUP_MODE: signup.signupMode
100
+ };
101
+ if (signup.signupInviteCodes) env.SIGNUP_INVITE_CODES = signup.signupInviteCodes;
102
+ if (staticDir) env.HAPPY_STATIC_DIR = staticDir;
103
+ env.HAPPY_INJECT_HTML_CONFIG = JSON.stringify({
104
+ serverUrl,
105
+ disableAnalytics: true
106
+ });
107
+ if (signup.generatedInviteCode) {
108
+ console.log(chalk.yellow.bold(" First-account bootstrap"));
109
+ console.log(chalk.yellow(` Invite code: ${signup.generatedInviteCode}`));
110
+ console.log(chalk.gray(" Register the first operator, stop this server, then restart with:"));
111
+ console.log(chalk.cyan(" SIGNUP_MODE=closed very-happy server"));
112
+ console.log(chalk.gray(" The code remains valid until the server is restarted in closed mode."));
113
+ console.log();
114
+ }
115
+ if (artifacts.bundled) {
116
+ const prismaEngine = artifacts.prismaQueryEngineLibrary ?? resolvePrismaQueryEngineLibrary(artifacts.cwd);
117
+ if (!prismaEngine) {
118
+ console.error(chalk.red("Could not locate the Prisma query engine for this platform."));
119
+ if (artifacts.source === "package") {
120
+ console.error(chalk.gray(` Expected ${SERVER_PACKAGE_NAME} to install @prisma/engines.`));
121
+ console.error(chalk.gray(` Try reinstalling ${SERVER_PACKAGE_NAME}, then run \`very-happy server\` again.`));
122
+ } else {
123
+ console.error(chalk.gray(" Expected @prisma/engines to be available near the happy package."));
124
+ console.error(chalk.gray(" Try reinstalling happy, then run `very-happy server` again."));
125
+ }
126
+ process.exit(1);
127
+ }
128
+ env.PRISMA_QUERY_ENGINE_LIBRARY = prismaEngine;
129
+ }
130
+ console.log(chalk.gray("Running migrations..."));
131
+ await spawnAndWait(artifacts, env, ["migrate"]);
132
+ if (opts.persistServerUrl) {
133
+ await persistence.updateSettings((current) => ({ ...current, serverUrl, webappUrl: serverUrl }));
134
+ console.log(chalk.gray(`Wrote serverUrl + webappUrl=${serverUrl} to ${configuration.configuration.settingsFile}`));
135
+ }
136
+ console.log(chalk.gray("Starting server..."));
137
+ const child = spawnBackground(artifacts, env, ["serve"]);
138
+ console.log();
139
+ console.log(chalk.green.bold(`\u2713 happy-server starting at ${serverUrl}`));
140
+ if (staticDir) {
141
+ console.log(chalk.green(` Open ${serverUrl} in your browser.`));
142
+ }
143
+ if (opts.persistServerUrl) {
144
+ console.log(chalk.gray(" happy CLI + daemon will use this server automatically (settings.serverUrl)."));
145
+ }
146
+ console.log(chalk.gray(" Press Ctrl-C to stop."));
147
+ console.log();
148
+ const forwardSignal = (sig) => {
149
+ if (!child.killed) child.kill(sig);
150
+ };
151
+ process.on("SIGINT", () => forwardSignal("SIGINT"));
152
+ process.on("SIGTERM", () => forwardSignal("SIGTERM"));
153
+ const exitCode = await new Promise((resolve) => {
154
+ child.on("exit", (code) => {
155
+ console.log(chalk.gray(`
156
+ happy-server exited (code ${code ?? 0})`));
157
+ resolve(code ?? 0);
158
+ });
159
+ });
160
+ process.exit(exitCode);
161
+ }
162
+ function parseArgs(args) {
163
+ let port = 3005;
164
+ let host = "127.0.0.1";
165
+ let reset = false;
166
+ let persistServerUrl = true;
167
+ let allowSettingsWrite = false;
168
+ let masterSecret;
169
+ for (let i = 0; i < args.length; i++) {
170
+ const arg = args[i];
171
+ if (arg === "-h" || arg === "--help") {
172
+ showHelp();
173
+ return null;
174
+ } else if (arg === "--port" || arg === "-p") {
175
+ port = parseInt(args[++i], 10);
176
+ if (Number.isNaN(port)) {
177
+ console.error(chalk.red("Invalid --port"));
178
+ process.exit(1);
179
+ }
180
+ } else if (arg === "--host") {
181
+ host = args[++i];
182
+ } else if (arg === "--reset") {
183
+ reset = true;
184
+ } else if (arg === "--no-persist") {
185
+ persistServerUrl = false;
186
+ } else if (arg === SETTINGS_WRITE_CONFIRM_FLAG) {
187
+ allowSettingsWrite = true;
188
+ } else if (arg === "--master-secret") {
189
+ masterSecret = args[++i];
190
+ } else {
191
+ console.error(chalk.red(`Unknown arg: ${arg}`));
192
+ showHelp();
193
+ process.exit(1);
194
+ }
195
+ }
196
+ return { port, host, reset, persistServerUrl, allowSettingsWrite, masterSecret };
197
+ }
198
+ function showHelp() {
199
+ console.log(`
200
+ ${chalk.bold("very-happy server")} - Run Happy sync server + web app locally (self-host)
201
+
202
+ ${chalk.bold("Usage:")}
203
+ very-happy server [--port 3005] [--host 127.0.0.1] [--reset] [--no-persist]
204
+
205
+ ${chalk.bold("Options:")}
206
+ --port, -p <n> Port to listen on (default: 3005)
207
+ --host <ip> Host to bind (default: 127.0.0.1)
208
+ --reset Wipe local server data before starting
209
+ --no-persist Don't write serverUrl into settings.json
210
+ ${SETTINGS_WRITE_CONFIRM_FLAG}
211
+ Write settings.serverUrl/settings.webappUrl without prompting
212
+ --master-secret <hex> Use a specific master secret (default: auto-generated)
213
+
214
+ ${chalk.bold("Notes:")}
215
+ - Stores data in ${chalk.cyan("$HAPPY_HOME_DIR/server-data/")}
216
+ - Packaged installs require ${chalk.cyan(SERVER_PACKAGE_NAME)} once that fork-owned artifact is published
217
+ - Until then, use the repository's ${chalk.cyan("Dockerfile.server")} self-host path
218
+ - By default, asks before writing ${chalk.cyan("settings.serverUrl")} and ${chalk.cyan("settings.webappUrl")}
219
+ - Use ${chalk.cyan("--no-persist")} to run without modifying default Happy settings
220
+ - Fresh installs start in invite mode and print a persisted bootstrap code
221
+ - After the first account, restart with ${chalk.cyan("SIGNUP_MODE=closed")} to disable signup
222
+ - Open ${chalk.cyan("http://127.0.0.1:<port>")} for the web app (if bundled)
223
+ `);
224
+ }
225
+ async function ensureSettingsWriteAllowed(opts, serverUrl) {
226
+ if (!opts.persistServerUrl || opts.allowSettingsWrite) {
227
+ return;
228
+ }
229
+ const message = `very-happy server will write settings.serverUrl and settings.webappUrl to ${serverUrl} in ${configuration.configuration.settingsFile}.`;
230
+ if (!process.stdin.isTTY || !process.stderr.isTTY) {
231
+ console.error(chalk.red("Refusing to modify default Happy settings from a non-interactive run."));
232
+ console.error(chalk.gray(message));
233
+ console.error(chalk.gray(`Re-run with --no-persist, or pass ${SETTINGS_WRITE_CONFIRM_FLAG}.`));
234
+ process.exit(1);
235
+ }
236
+ const rl = promises.createInterface({ input: process.stdin, output: process.stderr });
237
+ try {
238
+ const answer = await rl.question(`${chalk.yellow(message)} Continue? ${chalk.gray("[y/N]")} `);
239
+ const normalized = answer.trim().toLowerCase();
240
+ if (normalized !== "y" && normalized !== "yes") {
241
+ console.error(chalk.gray("Cancelled. Re-run with --no-persist to start without changing settings."));
242
+ process.exit(1);
243
+ }
244
+ } finally {
245
+ rl.close();
246
+ }
247
+ }
248
+ function loadOrCreateMasterSecret(file) {
249
+ if (node_fs.existsSync(file)) {
250
+ return node_fs.readFileSync(file, "utf8").trim();
251
+ }
252
+ const secret = node_crypto.randomBytes(32).toString("hex");
253
+ node_fs.writeFileSync(file, secret, { mode: 384 });
254
+ return secret;
255
+ }
256
+ function loadOrCreateBootstrapInviteCode(file) {
257
+ if (node_fs.existsSync(file)) {
258
+ return node_fs.readFileSync(file, "utf8").trim();
259
+ }
260
+ const code = `vh-bootstrap-${node_crypto.randomBytes(18).toString("base64url")}`;
261
+ node_fs.writeFileSync(file, code, { mode: 384 });
262
+ return code;
263
+ }
264
+ function currentPlatform() {
265
+ return `${process.arch}-${process.platform}`;
266
+ }
267
+ function resolvePrismaQueryEngineLibrary(bundledServerDir) {
268
+ const fromDependency = findPrismaEngineFromDependency();
269
+ if (fromDependency) {
270
+ return fromDependency;
271
+ }
272
+ const legacyBundledEngine = path.join(bundledServerDir, "libquery_engine.node");
273
+ return node_fs.existsSync(legacyBundledEngine) ? legacyBundledEngine : void 0;
274
+ }
275
+ function findPrismaEngineFromDependency() {
276
+ const engineFile = PRISMA_QUERY_ENGINE_FILES[currentPlatform()];
277
+ if (!engineFile) {
278
+ return void 0;
279
+ }
280
+ try {
281
+ const enginesPackage = require_.resolve("@prisma/engines/package.json");
282
+ const candidate = path.join(path.dirname(enginesPackage), engineFile);
283
+ return node_fs.existsSync(candidate) ? candidate : void 0;
284
+ } catch {
285
+ return void 0;
286
+ }
287
+ }
288
+ function resolveToolsPath(name) {
289
+ let dir = __dirname$1;
290
+ for (let i = 0; i < 5; i++) {
291
+ const candidate = path.join(dir, "tools", name);
292
+ if (node_fs.existsSync(candidate)) return candidate;
293
+ const parent = path.dirname(dir);
294
+ if (parent === dir) break;
295
+ dir = parent;
296
+ }
297
+ return path.resolve(__dirname$1, "..", "tools", name);
298
+ }
299
+ function bundledBinaryName() {
300
+ return process.platform === "win32" ? "happy-server.exe" : "happy-server";
301
+ }
302
+ function ensureExecutable(file) {
303
+ if (process.platform === "win32") return;
304
+ try {
305
+ const mode = node_fs.statSync(file).mode;
306
+ if ((mode & 73) === 0) node_fs.chmodSync(file, mode | 493);
307
+ } catch {
308
+ }
309
+ }
310
+ function serverArtifactMode(artifacts) {
311
+ if (artifacts.source === "package") return SERVER_PACKAGE_NAME;
312
+ if (artifacts.source === "legacy-bundled") return "legacy bundled";
313
+ return "source (dev)";
314
+ }
315
+ function resolveServerArtifacts() {
316
+ const packageArtifact = resolveInstalledServerPackage();
317
+ if (packageArtifact) return packageArtifact;
318
+ const toolsRoot = resolveToolsPath("server");
319
+ const binDir = path.join(toolsRoot, currentPlatform());
320
+ const binary = path.join(binDir, bundledBinaryName());
321
+ if (node_fs.existsSync(binary)) {
322
+ ensureExecutable(binary);
323
+ return { command: binary, prefixArgs: [], cwd: binDir, bundled: true, source: "legacy-bundled" };
324
+ }
325
+ const sourceEntry = findSourceStandalone();
326
+ if (sourceEntry) {
327
+ const tsx = findTsxBinary(path.dirname(path.dirname(sourceEntry)));
328
+ const useNode = tsx !== "tsx";
329
+ return {
330
+ command: useNode ? process.execPath : "tsx",
331
+ prefixArgs: useNode ? [tsx, sourceEntry] : [sourceEntry],
332
+ cwd: path.dirname(path.dirname(sourceEntry)),
333
+ bundled: false,
334
+ source: "source"
335
+ };
336
+ }
337
+ return void 0;
338
+ }
339
+ function resolveInstalledServerPackage() {
340
+ try {
341
+ const serverPackage = require_(SERVER_PACKAGE_NAME);
342
+ const artifact = serverPackage.resolveServerArtifact?.();
343
+ if (!artifact || !artifact.command || !node_fs.existsSync(artifact.command)) {
344
+ return void 0;
345
+ }
346
+ return {
347
+ command: artifact.command,
348
+ prefixArgs: artifact.prefixArgs ?? [],
349
+ cwd: artifact.cwd,
350
+ bundled: artifact.bundled ?? true,
351
+ source: "package",
352
+ prismaQueryEngineLibrary: artifact.prismaQueryEngineLibrary,
353
+ webappDir: artifact.webappDir
354
+ };
355
+ } catch {
356
+ return void 0;
357
+ }
358
+ }
359
+ function findSourceStandalone() {
360
+ const candidates = [
361
+ path.resolve(__dirname$1, "../../../happy-server/sources/standalone.ts"),
362
+ path.resolve(__dirname$1, "../../happy-server/sources/standalone.ts"),
363
+ path.resolve(process.cwd(), "packages/happy-server/sources/standalone.ts"),
364
+ path.resolve(process.cwd(), "../happy-server/sources/standalone.ts")
365
+ ];
366
+ for (const c of candidates) {
367
+ if (node_fs.existsSync(c)) return c;
368
+ }
369
+ return void 0;
370
+ }
371
+ function findWebappDir() {
372
+ const bundled = resolveToolsPath("webapp");
373
+ if (node_fs.existsSync(path.join(bundled, "index.html"))) return bundled;
374
+ const candidates = [
375
+ path.resolve(__dirname$1, "../../../happy-web-v2/dist"),
376
+ path.resolve(__dirname$1, "../../happy-web-v2/dist"),
377
+ path.resolve(process.cwd(), "packages/happy-web-v2/dist")
378
+ ];
379
+ for (const c of candidates) {
380
+ if (node_fs.existsSync(path.join(c, "index.html"))) return c;
381
+ }
382
+ return void 0;
383
+ }
384
+ function findTsxBinary(cwd) {
385
+ try {
386
+ return require_.resolve("tsx/cli", { paths: [cwd] });
387
+ } catch {
388
+ return "tsx";
389
+ }
390
+ }
391
+ async function spawnAndWait(art, env, args) {
392
+ const cmdArgs = [...art.prefixArgs, ...args];
393
+ await new Promise((resolve, reject) => {
394
+ const child = node_child_process.spawn(art.command, cmdArgs, { cwd: art.cwd, env, stdio: "inherit" });
395
+ child.on("error", reject);
396
+ child.on("exit", (code) => {
397
+ if (code === 0) resolve();
398
+ else reject(new Error(`happy-server ${args[0]} exited with code ${code}`));
399
+ });
400
+ });
401
+ }
402
+ function spawnBackground(art, env, args) {
403
+ const cmdArgs = [...art.prefixArgs, ...args];
404
+ return node_child_process.spawn(art.command, cmdArgs, { cwd: art.cwd, env, stdio: "inherit" });
405
+ }
406
+
407
+ exports.handleServerCommand = handleServerCommand;