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.
- package/dist/{AcpBackend-DUYFlyfN.cjs → AcpBackend-Bm2rdke8.cjs} +78 -76
- package/dist/{AcpBackend-VsfkZiVF.mjs → AcpBackend-mzv8Dhba.mjs} +4 -2
- package/dist/{AcpSessionManager-Bdv8LWXh.cjs → AcpSessionManager-BAY1Pggx.cjs} +9 -9
- package/dist/{AcpSessionManager-rYtVb0kN.mjs → AcpSessionManager-CoMWFVw3.mjs} +1 -1
- package/dist/BasePermissionHandler-CFHAxumV.cjs +157 -0
- package/dist/BasePermissionHandler-m3WVholL.mjs +155 -0
- package/dist/BaseReasoningProcessor-BFa9_rZA.cjs +200 -0
- package/dist/BaseReasoningProcessor-CYrKBXGm.mjs +198 -0
- package/dist/RemoteModeDisplay-D-HewyXg.mjs +150 -0
- package/dist/RemoteModeDisplay-NC1gPHtj.cjs +153 -0
- package/dist/agentAttachments-Dbw8iMCZ.cjs +20 -0
- package/dist/agentAttachments-M_B5qEF2.mjs +18 -0
- package/dist/agentGuidance-B5NATuFa.cjs +28 -0
- package/dist/agentGuidance-CQuNlNx8.mjs +20 -0
- package/dist/{agentHome-CHh4lmjM.cjs → agentHome-CboCeKWq.cjs} +14 -28
- package/dist/{agentHome-CvsJyeQB.mjs → agentHome-Dj1C43aJ.mjs} +8 -22
- package/dist/api-CLMUr-SX.mjs +3339 -0
- package/dist/api-CgundNNX.cjs +3346 -0
- package/dist/{types-Dh-s4Lqs.mjs → apiMachine-B9dLW_p5.mjs} +9116 -16205
- package/dist/{types-BbvK1Tr_.cjs → apiMachine-Bn8482VM.cjs} +9104 -16247
- package/dist/assistantTools-BTqPnlFl.cjs +380 -0
- package/dist/assistantTools-D6tuc6o4.mjs +376 -0
- package/dist/attachmentContent-DpiTJZb4.cjs +88 -0
- package/dist/attachmentContent-_kxRznNf.mjs +82 -0
- package/dist/attachmentLimits-CzVrqgLR.cjs +354 -0
- package/dist/attachmentLimits-yba1uHFO.mjs +348 -0
- package/dist/auth-BDOVh5h5.cjs +220 -0
- package/dist/auth-Cwutmdsa.mjs +225 -0
- package/dist/auth-PYHZQNPp.mjs +218 -0
- package/dist/auth-ba4WMYrN.cjs +227 -0
- package/dist/authRelay-BdYkC1Po.cjs +156 -0
- package/dist/authRelay-DSAvg1uv.mjs +143 -0
- package/dist/{auto-DKmEls8Z.cjs → auto-BOX_fgmR.cjs} +70 -79
- package/dist/{auto-nb8GhRRy.mjs → auto-BXu14yP_.mjs} +27 -36
- package/dist/backgroundTaskActivity-8PdPxrvy.mjs +149 -0
- package/dist/backgroundTaskActivity-CBvUdj39.cjs +157 -0
- package/dist/bootstrap-B5G1TijC.cjs +116 -0
- package/dist/bootstrap-hxXPCFMx.mjs +112 -0
- package/dist/browser-Y6Bl8L_O.cjs +22 -0
- package/dist/browser-jh2P0UVZ.mjs +20 -0
- package/dist/claudeCliPath-BqkaH2oR.mjs +8 -0
- package/dist/claudeCliPath-U4HHmV4r.cjs +10 -0
- package/dist/claudeLocal-BaY4fZKi.mjs +339 -0
- package/dist/claudeLocal-CRGG4Pea.cjs +343 -0
- package/dist/claudeLocalLauncher-D4T7MTqd.mjs +152 -0
- package/dist/claudeLocalLauncher-DyEbVzUN.cjs +154 -0
- package/dist/cliUpdate-DsKXPFYp.cjs +120 -0
- package/dist/cliUpdate-Y34VGe9Y.mjs +112 -0
- package/dist/client-3Ac-O4pw.cjs +104 -0
- package/dist/client-BPNbmtvO.cjs +119 -0
- package/dist/client-CeGKqqcJ.mjs +100 -0
- package/dist/client-ClR0K8zX.mjs +112 -0
- package/dist/codex/happyMcpStdioBridge.cjs +33 -14
- package/dist/codex/happyMcpStdioBridge.mjs +26 -7
- package/dist/codexAppServerClient-I3teiV-N.mjs +1088 -0
- package/dist/codexAppServerClient-q2FjnRcK.cjs +1090 -0
- package/dist/codexCommand-4zcccIoq.cjs +2088 -0
- package/dist/codexCommand-Cc9gcbdX.mjs +2086 -0
- package/dist/codexThreadFork-BH9IZPqD.cjs +350 -0
- package/dist/codexThreadFork-slzAseLx.mjs +338 -0
- package/dist/{config-ClLtM6F3.mjs → config-CTx_jb-C.mjs} +7 -40
- package/dist/{config-DLx-vW3I.cjs → config-Ci9Kpgwa.cjs} +26 -59
- package/dist/configuration-BSYpcPwE.cjs +181 -0
- package/dist/configuration-RfeNjFmd.mjs +170 -0
- package/dist/connect-BpOdzNbE.mjs +682 -0
- package/dist/connect-C2CiOUFs.cjs +684 -0
- package/dist/constants-BC4St0xd.mjs +11 -0
- package/dist/constants-VJ0N6WuG.cjs +17 -0
- package/dist/contentLogMetadata-BlWI0egu.mjs +51 -0
- package/dist/contentLogMetadata-ZSFk_NjQ.cjs +54 -0
- package/dist/context-DsDr6E2t.cjs +69 -0
- package/dist/context-H0Bcb9S_.mjs +65 -0
- package/dist/controlClient-BGbDcgWS.mjs +260 -0
- package/dist/controlClient-Bcwv3D21.cjs +279 -0
- package/dist/createSessionMetadata-BJxEnM-o.cjs +58 -0
- package/dist/createSessionMetadata-CVVkGjxV.mjs +54 -0
- package/dist/defaultPermissionMode-BnxJPVHT.mjs +4 -0
- package/dist/defaultPermissionMode-CxmTXUQR.cjs +7 -0
- package/dist/detectCLI-CSGMlV51.mjs +58 -0
- package/dist/detectCLI-DR9ZaN6B.cjs +61 -0
- package/dist/deterministicJson-C5CYTVpm.cjs +507 -0
- package/dist/deterministicJson-CzkFJWw1.mjs +502 -0
- package/dist/doctor-BPkYWSuq.mjs +75 -0
- package/dist/doctor-D2YJ-Yn2.cjs +395 -0
- package/dist/doctor-DOvByjbk.mjs +391 -0
- package/dist/doctor-u46qYYKX.cjs +79 -0
- package/dist/doctorReadiness-BCZGcN0a.cjs +151 -0
- package/dist/doctorReadiness-C208SMN9.mjs +142 -0
- package/dist/editPaths-BVfS_FFL.mjs +68 -0
- package/dist/editPaths-Bqp4OFPw.cjs +73 -0
- package/dist/ensureDaemonRunning-BCwNrMyv.cjs +64 -0
- package/dist/ensureDaemonRunning-Dqa2pOjY.mjs +61 -0
- package/dist/handleResumeCommand-BvXYf5El.mjs +240 -0
- package/dist/handleResumeCommand-C2cKchpX.cjs +245 -0
- package/dist/ids-B6ZC0HGt.cjs +13 -0
- package/dist/ids-DU6sLx4C.mjs +10 -0
- package/dist/index-B6UGRQ7h.mjs +102 -0
- package/dist/{index-BEOMECtE.cjs → index-B6pAdvJx.cjs} +121 -91
- package/dist/index-Bu5Zi_a9.cjs +182 -0
- package/dist/index-D3kI0hDR.cjs +107 -0
- package/dist/index-DA7yINuk.cjs +994 -0
- package/dist/index-DDeHXrIX.cjs +71 -0
- package/dist/index-DKLU_fD0.mjs +158 -0
- package/dist/{index-2mCaeKyf.mjs → index-DMZqWwsP.mjs} +68 -38
- package/dist/index-DVkMGPyS.mjs +68 -0
- package/dist/index-qdS1friN.mjs +949 -0
- package/dist/index.cjs +5 -46
- package/dist/index.mjs +5 -46
- package/dist/{install-BPhJppvd.mjs → install-BO_W7VhL.mjs} +37 -37
- package/dist/install-BgoC2e_2.cjs +88 -0
- package/dist/install-CFY3tYtJ.mjs +86 -0
- package/dist/{install-BOHrUaFM.cjs → install-Cs5qAPrB.cjs} +38 -38
- package/dist/{installPiTools-DuZ6jZvX.cjs → installPiTools-BKnXjrVu.cjs} +2 -3
- package/dist/{installPiTools-Cj7yU9Fc.mjs → installPiTools-B_CdM5_2.mjs} +1 -2
- package/dist/{installTerminalHooks-Cou3WUf3.cjs → installTerminalHooks-BQZbvxsZ.cjs} +5 -40
- package/dist/{installTerminalHooks-WeznjkuC.mjs → installTerminalHooks-By7gBMEF.mjs} +3 -38
- package/dist/lib.cjs +28 -19
- package/dist/lib.d.cts +12 -2
- package/dist/lib.d.mts +12 -2
- package/dist/lib.mjs +23 -14
- package/dist/lidState-BeDfxxEX.cjs +305 -0
- package/dist/lidState-CeEt442o.mjs +297 -0
- package/dist/limits-C-a7gr04.cjs +43 -0
- package/dist/limits-DIo7rEBR.mjs +36 -0
- package/dist/localHappyAgentAuth-C-HQyiv6.mjs +82 -0
- package/dist/localHappyAgentAuth-D6rFhaoc.cjs +86 -0
- package/dist/logger-6HYUEXNk.mjs +271 -0
- package/dist/logger-CS0mw3fa.cjs +275 -0
- package/dist/loginShellEnv-BkuYtExZ.cjs +182 -0
- package/dist/loginShellEnv-Dw8M7tkI.mjs +167 -0
- package/dist/machineMetadata-DyDbODYd.cjs +41 -0
- package/dist/machineMetadata-oOzBfDfs.mjs +38 -0
- package/dist/main-BkxJP6JQ.cjs +941 -0
- package/dist/main-BwNIAI1A.mjs +939 -0
- package/dist/manager-BQ4flvQZ.mjs +101 -0
- package/dist/manager-Cly8xVIR.cjs +105 -0
- package/dist/{mcp-Dy3f_K0h.mjs → mcp-B1A4I3TK.mjs} +27 -33
- package/dist/{mcp-CPYbtsYG.cjs → mcp-Hszd7qpS.cjs} +42 -48
- package/dist/messageBuffer-BWlGgR3A.mjs +71 -0
- package/dist/messageBuffer-fJMH6uY8.cjs +73 -0
- package/dist/mirrorProtocol-BNLtoWjO.mjs +170 -0
- package/dist/mirrorProtocol-BUtmg1ws.cjs +186 -0
- package/dist/oneShotPrompts-CL0dip9C.cjs +16 -0
- package/dist/oneShotPrompts-DT4p6RNd.mjs +12 -0
- package/dist/package-BhaKlnxz.mjs +171 -0
- package/dist/package-BwMrPwqH.cjs +173 -0
- package/dist/path-B7zW-WwE.cjs +18 -0
- package/dist/path-D2wdaNSk.mjs +15 -0
- package/dist/peerTools-BTqw97Gb.mjs +272 -0
- package/dist/peerTools-BvKtHXj8.cjs +283 -0
- package/dist/permissionMode-Cr5JCbB7.mjs +80 -0
- package/dist/permissionMode-CrV-XuMs.cjs +87 -0
- package/dist/persistence-HGW_ZVs9.mjs +372 -0
- package/dist/persistence-yKTH3-5X.cjs +414 -0
- package/dist/piExtension.mjs +2 -1
- package/dist/piRunnerArgs-BNloJCCg.cjs +66 -0
- package/dist/piRunnerArgs-BuX1UFWy.mjs +59 -0
- package/dist/{piRuntime-kLZNpAAl.mjs → piRuntime-CSGkwCKQ.mjs} +2 -2
- package/dist/{piRuntime-NtF0YqjH.cjs → piRuntime-C_H7MJCM.cjs} +4 -4
- package/dist/{piTerminal-B0fEOV_2.mjs → piTerminal-C8a1OrNQ.mjs} +32 -35
- package/dist/{piTerminal-9J0GAKzb.cjs → piTerminal-DNCZ6yTM.cjs} +32 -35
- package/dist/previewPath-B0rBdhy1.cjs +83 -0
- package/dist/previewPath-CXN4Vag0.mjs +81 -0
- package/dist/projectPath-BTBIMB57.mjs +10 -0
- package/dist/projectPath-ChLhdOyt.cjs +13 -0
- package/dist/registerCommonHandlers-Ccvsz7Ou.mjs +536 -0
- package/dist/registerCommonHandlers-DskirN-_.cjs +538 -0
- package/dist/registerKillSessionHandler-DZeLXWcB.cjs +361 -0
- package/dist/registerKillSessionHandler-GYvHdipX.mjs +358 -0
- package/dist/remoteSessionClient-B0LraSB9.cjs +634 -0
- package/dist/remoteSessionClient-CYnXRynE.mjs +612 -0
- package/dist/resources-BdFBQi8r.mjs +117 -0
- package/dist/resources-JDPugcDq.cjs +120 -0
- package/dist/run-CJzxoHVh.cjs +5762 -0
- package/dist/run-D3ifupU3.mjs +5739 -0
- package/dist/runClaude-Ba01qT-u.mjs +848 -0
- package/dist/runClaude-Da3RirzE.cjs +850 -0
- package/dist/runClaudeDeps-DOt79DjU.mjs +3624 -0
- package/dist/runClaudeDeps-DOzEBMls.cjs +3649 -0
- package/dist/{runGemini-DV6Ouadt.mjs → runGemini-BGeTz57m.mjs} +58 -31
- package/dist/{runGemini-F-mqx3_K.cjs → runGemini-DSr9LIxL.cjs} +202 -175
- package/dist/{runOpenClaw-Qqo9j63M.cjs → runOpenClaw-B1mTxN35.cjs} +64 -65
- package/dist/{runOpenClaw-D7MlPS5n.mjs → runOpenClaw-CogSedIc.mjs} +31 -32
- package/dist/sandbox-CG7IyDTU.cjs +187 -0
- package/dist/sandbox-DTe6d54R.mjs +180 -0
- package/dist/selfCheck-C9mVrQwf.mjs +84 -0
- package/dist/selfCheck-Dc-mNSLb.cjs +87 -0
- package/dist/{send-4qJTCAYW.cjs → send-B7J_eaG3.cjs} +16 -9
- package/dist/{send-CLhYXNgy.mjs → send-CBXJKc6O.mjs} +12 -5
- package/dist/server-CZTP_iOn.cjs +407 -0
- package/dist/server-DcVBv04l.mjs +404 -0
- package/dist/sessionLock-Bys1PNSo.cjs +205 -0
- package/dist/sessionLock-D-EG2CfG.mjs +197 -0
- package/dist/sessionModeFile-DMl3dw3r.mjs +32 -0
- package/dist/sessionModeFile-RSm0NQkH.cjs +36 -0
- package/dist/sessionOps-Dn8z85h_.cjs +783 -0
- package/dist/sessionOps-SuHW8Dfe.mjs +760 -0
- package/dist/sessionScanner-BOrGjMXL.cjs +209 -0
- package/dist/sessionScanner-CX3onqXh.mjs +206 -0
- package/dist/{sessions-CzIH2rGp.mjs → sessions-BEG_HTSi.mjs} +17 -8
- package/dist/{sessions-Bh1pyddi.cjs → sessions-D74aJbhL.cjs} +37 -28
- package/dist/setupOfflineReconnection-ByElY60m.cjs +74 -0
- package/dist/setupOfflineReconnection-DpvWTt69.mjs +72 -0
- package/dist/smallFastModel-BLNgMrwR.mjs +18 -0
- package/dist/smallFastModel-D_uxGMo3.cjs +21 -0
- package/dist/{spawn-CPIWlPOM.mjs → spawn-B7yro0b2.mjs} +26 -38
- package/dist/{spawn-CmFOSVdW.cjs → spawn-DgR0RKRs.cjs} +52 -64
- package/dist/spawnAgents-BGQiEF-w.cjs +52 -0
- package/dist/spawnAgents-DZzZ9jMI.mjs +45 -0
- package/dist/spawnHappyCLI-B2H5s4B_.mjs +64 -0
- package/dist/spawnHappyCLI-DBhwZT7O.cjs +66 -0
- package/dist/specialCommands-BSqhYg5X.mjs +52 -0
- package/dist/specialCommands-DSsTeRej.cjs +54 -0
- package/dist/startFileWatcher-B4VsLgjD.cjs +71 -0
- package/dist/startFileWatcher-DErVWZE4.mjs +69 -0
- package/dist/startupPlan-BLMbfQIH.cjs +12 -0
- package/dist/startupPlan-DFMyNgAs.mjs +10 -0
- package/dist/streamRelay-BiKw59Cc.cjs +233 -0
- package/dist/streamRelay-FPVbHpbM.mjs +231 -0
- package/dist/sync-C8gyQFMc.mjs +69 -0
- package/dist/sync-DccIKZ5_.cjs +71 -0
- package/dist/systemPrompt-BwTPWfMu.cjs +97 -0
- package/dist/systemPrompt-DX521JJz.mjs +94 -0
- package/dist/{teams-CEahj4cm.mjs → teams-C32F1hqd.mjs} +9 -40
- package/dist/{teams-CB1R9-Z9.cjs → teams-Dl8g8kTI.cjs} +14 -45
- package/dist/template-BaHAmH2K.cjs +129 -0
- package/dist/template-CiOPa2rd.mjs +121 -0
- package/dist/{terminalTitleSuggest-DKgX3osW.mjs → terminalTitleSuggest-CeKsX_V6.mjs} +1 -9
- package/dist/{terminalTitleSuggest-Dji8I0Jy.cjs → terminalTitleSuggest-DhvRFX3H.cjs} +0 -10
- package/dist/terminals-B_bfC9c2.cjs +250 -0
- package/dist/terminals-Dlg0x3nY.mjs +235 -0
- package/dist/time-D0XyHOid.mjs +38 -0
- package/dist/time-DCuTyook.cjs +42 -0
- package/dist/titleGenerator-CQ8CoGhg.mjs +166 -0
- package/dist/titleGenerator-ChzMJsyg.cjs +172 -0
- package/dist/tmuxSocket-B8Yx20sT.mjs +19 -0
- package/dist/tmuxSocket-D-Xt6Vn-.cjs +24 -0
- package/dist/{todo-DqyRI4wP.cjs → todo-BvUOTa8G.cjs} +15 -12
- package/dist/{todo-Cknp5D4U.mjs → todo-CZ6cFrrn.mjs} +11 -8
- package/dist/tools-BZtHF_qQ.mjs +177 -0
- package/dist/tools-Be3AoAwu.cjs +63 -0
- package/dist/tools-DQj0AeLk.cjs +180 -0
- package/dist/tools-DkluDcG4.mjs +60 -0
- package/dist/trimIdent-4gvk9Wk6.cjs +22 -0
- package/dist/trimIdent-BAjmv_TG.mjs +20 -0
- package/dist/types-CRS-srZK.cjs +66 -0
- package/dist/types-CkqAACXx.mjs +64 -0
- package/dist/uninstall-BkLzaJ6I.mjs +47 -0
- package/dist/uninstall-x-TUtf5H.cjs +49 -0
- package/package.json +7 -7
- package/dist/agentGuidance-BRDN1NoZ.cjs +0 -2217
- package/dist/agentGuidance-KgvYuF3R.mjs +0 -2145
- package/dist/index-BF6WfgV5.mjs +0 -19624
- package/dist/index-C-JazrMB.mjs +0 -52
- package/dist/index-blDSadUR.cjs +0 -58
- package/dist/index-rH3DrQ5B.cjs +0 -19688
- package/dist/limits-BH5CV5vR.cjs +0 -2683
- 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-BSYpcPwE.cjs');
|
|
12
|
+
var persistence = require('./persistence-yKTH3-5X.cjs');
|
|
13
|
+
require('node:os');
|
|
14
|
+
require('./package-BwMrPwqH.cjs');
|
|
15
|
+
require('node:fs/promises');
|
|
16
|
+
require('zod');
|
|
17
|
+
require('./authRelay-BdYkC1Po.cjs');
|
|
18
|
+
require('tweetnacl');
|
|
19
|
+
require('./logger-CS0mw3fa.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-CZTP_iOn.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-CZTP_iOn.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;
|