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