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
|
@@ -4,51 +4,78 @@ var ink = require('ink');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var node_crypto = require('node:crypto');
|
|
6
6
|
var path = require('node:path');
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
7
|
+
var api = require('./api-CgundNNX.cjs');
|
|
8
|
+
var logger = require('./logger-CS0mw3fa.cjs');
|
|
9
|
+
var persistence = require('./persistence-yKTH3-5X.cjs');
|
|
10
|
+
var createSessionMetadata = require('./createSessionMetadata-BJxEnM-o.cjs');
|
|
11
|
+
var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
12
|
+
var machineMetadata = require('./machineMetadata-DyDbODYd.cjs');
|
|
13
|
+
var registerKillSessionHandler = require('./registerKillSessionHandler-DZeLXWcB.cjs');
|
|
14
|
+
var deterministicJson = require('./deterministicJson-C5CYTVpm.cjs');
|
|
15
|
+
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
16
|
+
var messageBuffer = require('./messageBuffer-fJMH6uY8.cjs');
|
|
17
|
+
var controlClient = require('./controlClient-Bcwv3D21.cjs');
|
|
18
|
+
var authRelay = require('./authRelay-BdYkC1Po.cjs');
|
|
19
|
+
var setupOfflineReconnection = require('./setupOfflineReconnection-ByElY60m.cjs');
|
|
20
|
+
var AcpBackend = require('./AcpBackend-Bm2rdke8.cjs');
|
|
21
|
+
var constants = require('./constants-VJ0N6WuG.cjs');
|
|
22
|
+
var config = require('./config-Ci9Kpgwa.cjs');
|
|
23
|
+
var BasePermissionHandler = require('./BasePermissionHandler-CFHAxumV.cjs');
|
|
24
|
+
var BaseReasoningProcessor = require('./BaseReasoningProcessor-BFa9_rZA.cjs');
|
|
13
25
|
require('axios');
|
|
14
26
|
require('node:events');
|
|
15
27
|
require('socket.io-client');
|
|
28
|
+
require('./attachmentLimits-CzVrqgLR.cjs');
|
|
16
29
|
require('zod');
|
|
30
|
+
require('./index-DA7yINuk.cjs');
|
|
31
|
+
require('@paralleldrive/cuid2');
|
|
32
|
+
require('./limits-C-a7gr04.cjs');
|
|
33
|
+
require('./time-DCuTyook.cjs');
|
|
34
|
+
require('./lidState-BeDfxxEX.cjs');
|
|
35
|
+
require('os');
|
|
17
36
|
require('child_process');
|
|
37
|
+
require('./configuration-BSYpcPwE.cjs');
|
|
38
|
+
require('node:fs');
|
|
39
|
+
require('node:os');
|
|
40
|
+
require('./package-BwMrPwqH.cjs');
|
|
41
|
+
require('node:fs/promises');
|
|
42
|
+
require('./registerCommonHandlers-DskirN-_.cjs');
|
|
18
43
|
require('util');
|
|
19
44
|
require('fs/promises');
|
|
20
45
|
require('crypto');
|
|
21
46
|
require('path');
|
|
22
47
|
require('cross-spawn');
|
|
23
|
-
require('
|
|
24
|
-
require('
|
|
25
|
-
require('node:fs/promises');
|
|
26
|
-
require('node:os');
|
|
27
|
-
require('node:child_process');
|
|
28
|
-
require('node-pty');
|
|
29
|
-
require('node:fs');
|
|
30
|
-
require('fs');
|
|
31
|
-
require('tweetnacl');
|
|
32
|
-
require('node:readline');
|
|
33
|
-
require('@anthropic-ai/sandbox-runtime');
|
|
34
|
-
require('expo-server-sdk');
|
|
48
|
+
require('./sync-DccIKZ5_.cjs');
|
|
49
|
+
require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
35
50
|
require('chalk');
|
|
36
51
|
require('node:util');
|
|
37
|
-
require('
|
|
38
|
-
require('
|
|
39
|
-
require('
|
|
40
|
-
require('
|
|
41
|
-
require('
|
|
42
|
-
require('
|
|
43
|
-
require('
|
|
44
|
-
require('
|
|
52
|
+
require('tweetnacl');
|
|
53
|
+
require('./detectCLI-DR9ZaN6B.cjs');
|
|
54
|
+
require('fs');
|
|
55
|
+
require('./localHappyAgentAuth-D6rFhaoc.cjs');
|
|
56
|
+
require('./types-CRS-srZK.cjs');
|
|
57
|
+
require('./client-3Ac-O4pw.cjs');
|
|
58
|
+
require('./context-DsDr6E2t.cjs');
|
|
59
|
+
require('./sessionOps-Dn8z85h_.cjs');
|
|
60
|
+
require('./resources-JDPugcDq.cjs');
|
|
61
|
+
require('./tools-Be3AoAwu.cjs');
|
|
62
|
+
require('./tools-DQj0AeLk.cjs');
|
|
63
|
+
require('./client-BPNbmtvO.cjs');
|
|
64
|
+
require('./peerTools-BvKtHXj8.cjs');
|
|
65
|
+
require('./ids-B6ZC0HGt.cjs');
|
|
66
|
+
require('./remoteSessionClient-B0LraSB9.cjs');
|
|
45
67
|
require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
46
68
|
require('node:http');
|
|
47
69
|
require('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
48
|
-
require('
|
|
49
|
-
require('
|
|
50
|
-
require('node:
|
|
51
|
-
require('
|
|
70
|
+
require('./assistantTools-BTqPnlFl.cjs');
|
|
71
|
+
require('./terminals-B_bfC9c2.cjs');
|
|
72
|
+
require('node:child_process');
|
|
73
|
+
require('./terminalTitleSuggest-DhvRFX3H.cjs');
|
|
74
|
+
require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
75
|
+
require('./bootstrap-B5G1TijC.cjs');
|
|
76
|
+
require('./agentGuidance-B5NATuFa.cjs');
|
|
77
|
+
require('./trimIdent-4gvk9Wk6.cjs');
|
|
78
|
+
require('./previewPath-B0rBdhy1.cjs');
|
|
52
79
|
require('url');
|
|
53
80
|
require('@agentclientprotocol/sdk');
|
|
54
81
|
|
|
@@ -252,7 +279,7 @@ class GeminiTransport {
|
|
|
252
279
|
}
|
|
253
280
|
if (toolName === "other" || toolName === "Unknown tool") {
|
|
254
281
|
const inputKeys = input && typeof input === "object" ? Object.keys(input) : [];
|
|
255
|
-
|
|
282
|
+
logger.logger.debug(
|
|
256
283
|
`[GeminiTransport] Unknown tool pattern - toolCallId: "${toolCallId}", toolName: "${toolName}", inputKeys: [${inputKeys.join(", ")}]. Consider adding a new pattern to GEMINI_TOOL_PATTERNS if this tool appears frequently.`
|
|
257
284
|
);
|
|
258
285
|
}
|
|
@@ -263,9 +290,9 @@ const geminiTransport = new GeminiTransport();
|
|
|
263
290
|
|
|
264
291
|
function createGeminiBackend(options) {
|
|
265
292
|
const localConfig = config.readGeminiLocalConfig();
|
|
266
|
-
let apiKey = options.cloudToken || localConfig.token || process.env[
|
|
293
|
+
let apiKey = options.cloudToken || localConfig.token || process.env[constants.GEMINI_API_KEY_ENV] || process.env[constants.GOOGLE_API_KEY_ENV] || options.apiKey;
|
|
267
294
|
if (!apiKey) {
|
|
268
|
-
|
|
295
|
+
logger.logger.warn(`[Gemini] No API key found. Run 'very-happy connect gemini' to authenticate via Google OAuth, or set ${constants.GEMINI_API_KEY_ENV} environment variable.`);
|
|
269
296
|
}
|
|
270
297
|
const geminiCommand = "gemini";
|
|
271
298
|
const model = config.determineGeminiModel(options.model, localConfig);
|
|
@@ -276,9 +303,9 @@ function createGeminiBackend(options) {
|
|
|
276
303
|
const currentEmail = options.currentUserEmail;
|
|
277
304
|
if (!storedEmail || storedEmail === currentEmail) {
|
|
278
305
|
googleCloudProject = localConfig.googleCloudProject;
|
|
279
|
-
|
|
306
|
+
logger.logger.debug(`[Gemini] Using Google Cloud Project: ${googleCloudProject}${storedEmail ? ` (for ${storedEmail})` : " (global)"}`);
|
|
280
307
|
} else {
|
|
281
|
-
|
|
308
|
+
logger.logger.debug(`[Gemini] Skipping stored Google Cloud Project (stored for ${storedEmail}, current user is ${currentEmail || "unknown"})`);
|
|
282
309
|
}
|
|
283
310
|
}
|
|
284
311
|
const backendOptions = {
|
|
@@ -288,9 +315,9 @@ function createGeminiBackend(options) {
|
|
|
288
315
|
args: geminiArgs,
|
|
289
316
|
env: {
|
|
290
317
|
...options.env,
|
|
291
|
-
...apiKey ? { [
|
|
318
|
+
...apiKey ? { [constants.GEMINI_API_KEY_ENV]: apiKey, [constants.GOOGLE_API_KEY_ENV]: apiKey } : {},
|
|
292
319
|
// Pass model via env var - gemini CLI reads GEMINI_MODEL automatically
|
|
293
|
-
[
|
|
320
|
+
[constants.GEMINI_MODEL_ENV]: model,
|
|
294
321
|
// Pass Google Cloud Project for Workspace accounts
|
|
295
322
|
...googleCloudProject ? {
|
|
296
323
|
GOOGLE_CLOUD_PROJECT: googleCloudProject,
|
|
@@ -310,7 +337,7 @@ function createGeminiBackend(options) {
|
|
|
310
337
|
}
|
|
311
338
|
};
|
|
312
339
|
const modelSource = config.getGeminiModelSource(options.model, localConfig);
|
|
313
|
-
|
|
340
|
+
logger.logger.debug("[Gemini] Creating ACP SDK backend with options:", {
|
|
314
341
|
cwd: backendOptions.cwd,
|
|
315
342
|
command: backendOptions.command,
|
|
316
343
|
args: backendOptions.args,
|
|
@@ -469,7 +496,7 @@ const GeminiDisplay = ({ messageBuffer, logPath, currentModel, onExit }) => {
|
|
|
469
496
|
));
|
|
470
497
|
};
|
|
471
498
|
|
|
472
|
-
class GeminiPermissionHandler extends
|
|
499
|
+
class GeminiPermissionHandler extends BasePermissionHandler.BasePermissionHandler {
|
|
473
500
|
currentPermissionMode = "default";
|
|
474
501
|
constructor(session) {
|
|
475
502
|
super(session);
|
|
@@ -489,7 +516,7 @@ class GeminiPermissionHandler extends index.BasePermissionHandler {
|
|
|
489
516
|
*/
|
|
490
517
|
setPermissionMode(mode) {
|
|
491
518
|
this.currentPermissionMode = mode;
|
|
492
|
-
|
|
519
|
+
logger.logger.debug(`${this.getLogPrefix()} Permission mode set to: ${mode}`);
|
|
493
520
|
}
|
|
494
521
|
/**
|
|
495
522
|
* Check if a tool should be auto-approved based on permission mode
|
|
@@ -536,7 +563,7 @@ class GeminiPermissionHandler extends index.BasePermissionHandler {
|
|
|
536
563
|
*/
|
|
537
564
|
async handleToolCall(toolCallId, toolName, input) {
|
|
538
565
|
if (this.shouldAutoApprove(toolName, toolCallId, input)) {
|
|
539
|
-
|
|
566
|
+
logger.logger.debug(`${this.getLogPrefix()} Auto-approving tool ${toolName} (${toolCallId}) in ${this.currentPermissionMode} mode`);
|
|
540
567
|
this.session.updateAgentState((currentState) => ({
|
|
541
568
|
...currentState,
|
|
542
569
|
completedRequests: {
|
|
@@ -563,12 +590,12 @@ class GeminiPermissionHandler extends index.BasePermissionHandler {
|
|
|
563
590
|
input
|
|
564
591
|
});
|
|
565
592
|
this.addPendingRequestToState(toolCallId, toolName, input);
|
|
566
|
-
|
|
593
|
+
logger.logger.debug(`${this.getLogPrefix()} Permission request sent for tool: ${toolName} (${toolCallId}) in ${this.currentPermissionMode} mode`);
|
|
567
594
|
});
|
|
568
595
|
}
|
|
569
596
|
}
|
|
570
597
|
|
|
571
|
-
class GeminiReasoningProcessor extends
|
|
598
|
+
class GeminiReasoningProcessor extends BaseReasoningProcessor.BaseReasoningProcessor {
|
|
572
599
|
getToolName() {
|
|
573
600
|
return "GeminiReasoning";
|
|
574
601
|
}
|
|
@@ -603,7 +630,7 @@ class GeminiDiffProcessor {
|
|
|
603
630
|
* Process an fs-edit event and check if it contains diff information
|
|
604
631
|
*/
|
|
605
632
|
processFsEdit(path, description, diff) {
|
|
606
|
-
|
|
633
|
+
logger.logger.debug(`[GeminiDiffProcessor] Processing fs-edit for path: ${path}`);
|
|
607
634
|
if (diff) {
|
|
608
635
|
this.processDiff(path, diff, description);
|
|
609
636
|
} else {
|
|
@@ -619,7 +646,7 @@ class GeminiDiffProcessor {
|
|
|
619
646
|
const diff = result.diff || result.unified_diff || result.patch;
|
|
620
647
|
const path = result.path || result.file;
|
|
621
648
|
if (diff && path) {
|
|
622
|
-
|
|
649
|
+
logger.logger.debug(`[GeminiDiffProcessor] Found diff in tool result: ${toolName} (${callId})`);
|
|
623
650
|
this.processDiff(path, diff, result.description);
|
|
624
651
|
} else if (result.changes && typeof result.changes === "object") {
|
|
625
652
|
for (const [filePath, change] of Object.entries(result.changes)) {
|
|
@@ -635,7 +662,7 @@ class GeminiDiffProcessor {
|
|
|
635
662
|
processDiff(path, unifiedDiff, description) {
|
|
636
663
|
const previousDiff = this.previousDiffs.get(path);
|
|
637
664
|
if (previousDiff !== unifiedDiff) {
|
|
638
|
-
|
|
665
|
+
logger.logger.debug(`[GeminiDiffProcessor] Unified diff changed for ${path}, sending GeminiDiff tool call`);
|
|
639
666
|
const callId = node_crypto.randomUUID();
|
|
640
667
|
const toolCall = {
|
|
641
668
|
type: "tool-call",
|
|
@@ -660,13 +687,13 @@ class GeminiDiffProcessor {
|
|
|
660
687
|
this.onMessage?.(toolResult);
|
|
661
688
|
}
|
|
662
689
|
this.previousDiffs.set(path, unifiedDiff);
|
|
663
|
-
|
|
690
|
+
logger.logger.debug(`[GeminiDiffProcessor] Updated stored diff for ${path}`);
|
|
664
691
|
}
|
|
665
692
|
/**
|
|
666
693
|
* Reset the processor state (called on task_complete or turn_aborted)
|
|
667
694
|
*/
|
|
668
695
|
reset() {
|
|
669
|
-
|
|
696
|
+
logger.logger.debug("[GeminiDiffProcessor] Resetting diff state");
|
|
670
697
|
this.previousDiffs.clear();
|
|
671
698
|
}
|
|
672
699
|
/**
|
|
@@ -759,7 +786,7 @@ class ConversationHistory {
|
|
|
759
786
|
if (!content.trim()) return;
|
|
760
787
|
const trimmedContent = content.trim();
|
|
761
788
|
if (this.isDuplicate("user", trimmedContent)) {
|
|
762
|
-
|
|
789
|
+
logger.logger.debug(`[ConversationHistory] Skipping duplicate user message (${trimmedContent.length} chars)`);
|
|
763
790
|
return;
|
|
764
791
|
}
|
|
765
792
|
this.messages.push({
|
|
@@ -768,7 +795,7 @@ class ConversationHistory {
|
|
|
768
795
|
timestamp: Date.now()
|
|
769
796
|
});
|
|
770
797
|
this.trimHistory();
|
|
771
|
-
|
|
798
|
+
logger.logger.debug(`[ConversationHistory] Added user message (${trimmedContent.length} chars), total: ${this.messages.length}`);
|
|
772
799
|
}
|
|
773
800
|
/**
|
|
774
801
|
* Add an assistant response to history
|
|
@@ -778,7 +805,7 @@ class ConversationHistory {
|
|
|
778
805
|
if (!content.trim()) return;
|
|
779
806
|
const trimmedContent = content.trim();
|
|
780
807
|
if (this.isDuplicate("assistant", trimmedContent)) {
|
|
781
|
-
|
|
808
|
+
logger.logger.debug(`[ConversationHistory] Skipping duplicate assistant message (${trimmedContent.length} chars)`);
|
|
782
809
|
return;
|
|
783
810
|
}
|
|
784
811
|
this.messages.push({
|
|
@@ -788,7 +815,7 @@ class ConversationHistory {
|
|
|
788
815
|
model: this.currentModel
|
|
789
816
|
});
|
|
790
817
|
this.trimHistory();
|
|
791
|
-
|
|
818
|
+
logger.logger.debug(`[ConversationHistory] Added assistant message (${trimmedContent.length} chars), total: ${this.messages.length}`);
|
|
792
819
|
}
|
|
793
820
|
/**
|
|
794
821
|
* Get the number of messages in history
|
|
@@ -807,7 +834,7 @@ class ConversationHistory {
|
|
|
807
834
|
*/
|
|
808
835
|
clear() {
|
|
809
836
|
this.messages = [];
|
|
810
|
-
|
|
837
|
+
logger.logger.debug("[ConversationHistory] History cleared");
|
|
811
838
|
}
|
|
812
839
|
/**
|
|
813
840
|
* Get formatted context for injecting into a new session.
|
|
@@ -861,8 +888,8 @@ ${formattedMessages}
|
|
|
861
888
|
|
|
862
889
|
async function runGemini(opts) {
|
|
863
890
|
const sessionTag = node_crypto.randomUUID();
|
|
864
|
-
|
|
865
|
-
const api = await
|
|
891
|
+
api.connectionState.setBackend("Gemini");
|
|
892
|
+
const api$1 = await api.ApiClient.create(opts.credentials);
|
|
866
893
|
const settings = await persistence.readSettings();
|
|
867
894
|
const machineId = settings?.machineId;
|
|
868
895
|
const sandboxConfig = settings?.sandboxConfig;
|
|
@@ -870,18 +897,18 @@ async function runGemini(opts) {
|
|
|
870
897
|
console.error(`[START] No machine ID found in settings, which is unexpected since authAndSetupMachineIfNeeded should have created it. Please report this issue on https://github.com/Mereithhh/very-happy/issues`);
|
|
871
898
|
process.exit(1);
|
|
872
899
|
}
|
|
873
|
-
|
|
874
|
-
await api.getOrCreateMachine({
|
|
900
|
+
logger.logger.debug(`Using machineId: ${machineId}`);
|
|
901
|
+
await api$1.getOrCreateMachine({
|
|
875
902
|
machineId,
|
|
876
|
-
metadata:
|
|
903
|
+
metadata: machineMetadata.getInitialMachineMetadata()
|
|
877
904
|
});
|
|
878
905
|
let cloudToken = void 0;
|
|
879
906
|
let currentUserEmail = void 0;
|
|
880
907
|
try {
|
|
881
|
-
const vendorToken = await api.getVendorToken("gemini");
|
|
908
|
+
const vendorToken = await api$1.getVendorToken("gemini");
|
|
882
909
|
if (vendorToken?.oauth?.access_token) {
|
|
883
910
|
cloudToken = vendorToken.oauth.access_token;
|
|
884
|
-
|
|
911
|
+
logger.logger.debug("[Gemini] Using OAuth token from Happy cloud");
|
|
885
912
|
if (vendorToken.oauth.id_token) {
|
|
886
913
|
try {
|
|
887
914
|
const parts = vendorToken.oauth.id_token.split(".");
|
|
@@ -889,31 +916,31 @@ async function runGemini(opts) {
|
|
|
889
916
|
const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
|
|
890
917
|
if (payload.email) {
|
|
891
918
|
currentUserEmail = payload.email;
|
|
892
|
-
|
|
919
|
+
logger.logger.debug("[Gemini] Cloud identity includes an email claim");
|
|
893
920
|
}
|
|
894
921
|
}
|
|
895
922
|
} catch {
|
|
896
|
-
|
|
923
|
+
logger.logger.debug("[Gemini] Failed to decode id_token for email");
|
|
897
924
|
}
|
|
898
925
|
}
|
|
899
926
|
}
|
|
900
927
|
} catch (error) {
|
|
901
|
-
|
|
928
|
+
logger.logger.debug("[Gemini] Failed to fetch cloud token:", contentLogMetadata.errorLogMetadata(error));
|
|
902
929
|
}
|
|
903
|
-
const { state, metadata } =
|
|
930
|
+
const { state, metadata } = createSessionMetadata.createSessionMetadata({
|
|
904
931
|
flavor: "gemini",
|
|
905
932
|
machineId,
|
|
906
933
|
startedBy: opts.startedBy,
|
|
907
934
|
sandbox: sandboxConfig
|
|
908
935
|
});
|
|
909
|
-
const response = await api.getOrCreateSession({ tag: sessionTag, metadata, state });
|
|
936
|
+
const response = await api$1.getOrCreateSession({ tag: sessionTag, metadata, state });
|
|
910
937
|
let session;
|
|
911
938
|
let permissionHandler;
|
|
912
939
|
let isProcessingMessage = false;
|
|
913
940
|
let pendingSessionSwap = null;
|
|
914
941
|
const applyPendingSessionSwap = () => {
|
|
915
942
|
if (pendingSessionSwap) {
|
|
916
|
-
|
|
943
|
+
logger.logger.debug("[gemini] Applying pending session swap");
|
|
917
944
|
session = pendingSessionSwap;
|
|
918
945
|
if (permissionHandler) {
|
|
919
946
|
permissionHandler.updateSession(pendingSessionSwap);
|
|
@@ -921,15 +948,15 @@ async function runGemini(opts) {
|
|
|
921
948
|
pendingSessionSwap = null;
|
|
922
949
|
}
|
|
923
950
|
};
|
|
924
|
-
const { session: initialSession, reconnectionHandle } =
|
|
925
|
-
api,
|
|
951
|
+
const { session: initialSession, reconnectionHandle } = setupOfflineReconnection.setupOfflineReconnection({
|
|
952
|
+
api: api$1,
|
|
926
953
|
sessionTag,
|
|
927
954
|
metadata,
|
|
928
955
|
state,
|
|
929
956
|
response,
|
|
930
957
|
onSessionSwap: (newSession) => {
|
|
931
958
|
if (isProcessingMessage) {
|
|
932
|
-
|
|
959
|
+
logger.logger.debug("[gemini] Session swap requested during message processing - queueing");
|
|
933
960
|
pendingSessionSwap = newSession;
|
|
934
961
|
} else {
|
|
935
962
|
session = newSession;
|
|
@@ -942,24 +969,24 @@ async function runGemini(opts) {
|
|
|
942
969
|
session = initialSession;
|
|
943
970
|
if (response) {
|
|
944
971
|
try {
|
|
945
|
-
|
|
946
|
-
const result = await
|
|
947
|
-
encryptionKey:
|
|
972
|
+
logger.logger.debug(`[START] Reporting session ${response.id} to daemon`);
|
|
973
|
+
const result = await controlClient.notifyDaemonSessionStarted(response.id, metadata, {
|
|
974
|
+
encryptionKey: authRelay.encodeBase64(response.encryptionKey),
|
|
948
975
|
encryptionVariant: response.encryptionVariant,
|
|
949
976
|
seq: response.seq,
|
|
950
977
|
metadataVersion: response.metadataVersion,
|
|
951
978
|
agentStateVersion: response.agentStateVersion
|
|
952
979
|
});
|
|
953
980
|
if (result.error) {
|
|
954
|
-
|
|
981
|
+
logger.logger.debug(`[START] Failed to report to daemon (may not be running):`, result.error);
|
|
955
982
|
} else {
|
|
956
|
-
|
|
983
|
+
logger.logger.debug(`[START] Reported session ${response.id} to daemon`);
|
|
957
984
|
}
|
|
958
985
|
} catch (error) {
|
|
959
|
-
|
|
986
|
+
logger.logger.debug("[START] Failed to report to daemon (may not be running):", error);
|
|
960
987
|
}
|
|
961
988
|
}
|
|
962
|
-
const messageQueue = new
|
|
989
|
+
const messageQueue = new registerKillSessionHandler.MessageQueue2((mode) => deterministicJson.hashObject({
|
|
963
990
|
permissionMode: mode.permissionMode,
|
|
964
991
|
model: mode.model
|
|
965
992
|
}));
|
|
@@ -978,12 +1005,12 @@ async function runGemini(opts) {
|
|
|
978
1005
|
messagePermissionMode = message.meta.permissionMode;
|
|
979
1006
|
currentPermissionMode = messagePermissionMode;
|
|
980
1007
|
updatePermissionMode(messagePermissionMode);
|
|
981
|
-
|
|
1008
|
+
logger.logger.debug(`[Gemini] Permission mode updated from user message to: ${currentPermissionMode}`);
|
|
982
1009
|
} else {
|
|
983
|
-
|
|
1010
|
+
logger.logger.debug(`[Gemini] Invalid permission mode received: ${message.meta.permissionMode}`);
|
|
984
1011
|
}
|
|
985
1012
|
} else {
|
|
986
|
-
|
|
1013
|
+
logger.logger.debug(`[Gemini] User message received with no permission mode override, using current: ${currentPermissionMode ?? "default (effective)"}`);
|
|
987
1014
|
}
|
|
988
1015
|
if (currentPermissionMode === void 0) {
|
|
989
1016
|
currentPermissionMode = "default";
|
|
@@ -1000,15 +1027,15 @@ async function runGemini(opts) {
|
|
|
1000
1027
|
currentModel = messageModel;
|
|
1001
1028
|
if (previousModel !== messageModel) {
|
|
1002
1029
|
updateDisplayedModel(messageModel, true);
|
|
1003
|
-
messageBuffer.addMessage(`Model changed to: ${messageModel}`, "system");
|
|
1004
|
-
|
|
1030
|
+
messageBuffer$1.addMessage(`Model changed to: ${messageModel}`, "system");
|
|
1031
|
+
logger.logger.debug(`[Gemini] Model changed from ${previousModel} to ${messageModel}`);
|
|
1005
1032
|
}
|
|
1006
1033
|
}
|
|
1007
1034
|
}
|
|
1008
1035
|
const originalUserMessage = message.content.text;
|
|
1009
1036
|
let fullPrompt = originalUserMessage;
|
|
1010
1037
|
if (isFirstMessage && message.meta?.appendSystemPrompt) {
|
|
1011
|
-
fullPrompt = message.meta.appendSystemPrompt + "\n\n" + originalUserMessage + "\n\n" +
|
|
1038
|
+
fullPrompt = message.meta.appendSystemPrompt + "\n\n" + originalUserMessage + "\n\n" + constants.CHANGE_TITLE_INSTRUCTION;
|
|
1012
1039
|
isFirstMessage = false;
|
|
1013
1040
|
}
|
|
1014
1041
|
const mode = {
|
|
@@ -1029,7 +1056,7 @@ async function runGemini(opts) {
|
|
|
1029
1056
|
const sendReady = () => {
|
|
1030
1057
|
session.sendSessionEvent({ type: "ready" });
|
|
1031
1058
|
try {
|
|
1032
|
-
api.push().sendSessionNotification({
|
|
1059
|
+
api$1.push().sendSessionNotification({
|
|
1033
1060
|
kind: "done",
|
|
1034
1061
|
metadata: session.getMetadata(),
|
|
1035
1062
|
data: {
|
|
@@ -1039,7 +1066,7 @@ async function runGemini(opts) {
|
|
|
1039
1066
|
}
|
|
1040
1067
|
});
|
|
1041
1068
|
} catch (pushError) {
|
|
1042
|
-
|
|
1069
|
+
logger.logger.debug("[Gemini] Failed to send ready push", pushError);
|
|
1043
1070
|
}
|
|
1044
1071
|
};
|
|
1045
1072
|
const emitReadyIfIdle = () => {
|
|
@@ -1064,7 +1091,7 @@ async function runGemini(opts) {
|
|
|
1064
1091
|
let acpSessionId = null;
|
|
1065
1092
|
let wasSessionCreated = false;
|
|
1066
1093
|
async function handleAbort() {
|
|
1067
|
-
|
|
1094
|
+
logger.logger.debug("[Gemini] Abort requested - stopping current task");
|
|
1068
1095
|
session.sendAgentMessage("gemini", {
|
|
1069
1096
|
type: "turn_aborted",
|
|
1070
1097
|
id: node_crypto.randomUUID()
|
|
@@ -1077,17 +1104,17 @@ async function runGemini(opts) {
|
|
|
1077
1104
|
if (geminiBackend && acpSessionId) {
|
|
1078
1105
|
await geminiBackend.cancel(acpSessionId);
|
|
1079
1106
|
}
|
|
1080
|
-
|
|
1107
|
+
logger.logger.debug("[Gemini] Abort completed - session remains active");
|
|
1081
1108
|
} catch (error) {
|
|
1082
|
-
|
|
1109
|
+
logger.logger.debug("[Gemini] Error during abort:", error);
|
|
1083
1110
|
} finally {
|
|
1084
1111
|
abortController = new AbortController();
|
|
1085
1112
|
}
|
|
1086
1113
|
}
|
|
1087
1114
|
const handleKillSession = async () => {
|
|
1088
|
-
|
|
1115
|
+
logger.logger.debug("[Gemini] Kill session requested - terminating process");
|
|
1089
1116
|
await handleAbort();
|
|
1090
|
-
|
|
1117
|
+
logger.logger.debug("[Gemini] Abort completed, proceeding with termination");
|
|
1091
1118
|
try {
|
|
1092
1119
|
if (session) {
|
|
1093
1120
|
session.updateMetadata((currentMetadata) => ({
|
|
@@ -1105,37 +1132,37 @@ async function runGemini(opts) {
|
|
|
1105
1132
|
if (geminiBackend) {
|
|
1106
1133
|
await geminiBackend.dispose();
|
|
1107
1134
|
}
|
|
1108
|
-
|
|
1135
|
+
logger.logger.debug("[Gemini] Session termination complete, exiting");
|
|
1109
1136
|
process.exit(0);
|
|
1110
1137
|
} catch (error) {
|
|
1111
|
-
|
|
1138
|
+
logger.logger.debug("[Gemini] Error during session termination:", error);
|
|
1112
1139
|
process.exit(1);
|
|
1113
1140
|
}
|
|
1114
1141
|
};
|
|
1115
1142
|
session.rpcHandlerManager.registerHandler("abort", handleAbort);
|
|
1116
|
-
|
|
1117
|
-
const messageBuffer = new
|
|
1143
|
+
registerKillSessionHandler.registerKillSessionHandler(session.rpcHandlerManager, handleKillSession, session);
|
|
1144
|
+
const messageBuffer$1 = new messageBuffer.MessageBuffer();
|
|
1118
1145
|
const hasTTY = process.stdout.isTTY && process.stdin.isTTY;
|
|
1119
1146
|
let inkInstance = null;
|
|
1120
1147
|
let displayedModel = config.getInitialGeminiModel();
|
|
1121
1148
|
const localConfig = config.readGeminiLocalConfig();
|
|
1122
|
-
|
|
1149
|
+
logger.logger.debug(`[gemini] Initial model setup: env[GEMINI_MODEL_ENV]=${process.env[constants.GEMINI_MODEL_ENV] || "not set"}, localConfig=${localConfig.model || "not set"}, displayedModel=${displayedModel}`);
|
|
1123
1150
|
const updateDisplayedModel = (model, saveToConfig = false) => {
|
|
1124
1151
|
if (model === void 0) {
|
|
1125
|
-
|
|
1152
|
+
logger.logger.debug(`[gemini] updateDisplayedModel called with undefined, skipping update`);
|
|
1126
1153
|
return;
|
|
1127
1154
|
}
|
|
1128
1155
|
const oldModel = displayedModel;
|
|
1129
1156
|
displayedModel = model;
|
|
1130
|
-
|
|
1157
|
+
logger.logger.debug(`[gemini] updateDisplayedModel called: oldModel=${oldModel}, newModel=${model}, saveToConfig=${saveToConfig}`);
|
|
1131
1158
|
if (saveToConfig) {
|
|
1132
1159
|
config.saveGeminiModelToConfig(model);
|
|
1133
1160
|
}
|
|
1134
1161
|
if (hasTTY && oldModel !== model) {
|
|
1135
|
-
|
|
1136
|
-
messageBuffer.addMessage(`[MODEL:${model}]`, "system");
|
|
1162
|
+
logger.logger.debug(`[gemini] Adding model update message to buffer: [MODEL:${model}]`);
|
|
1163
|
+
messageBuffer$1.addMessage(`[MODEL:${model}]`, "system");
|
|
1137
1164
|
} else if (hasTTY) {
|
|
1138
|
-
|
|
1165
|
+
logger.logger.debug(`[gemini] Model unchanged, skipping update message`);
|
|
1139
1166
|
}
|
|
1140
1167
|
};
|
|
1141
1168
|
if (hasTTY) {
|
|
@@ -1143,11 +1170,11 @@ async function runGemini(opts) {
|
|
|
1143
1170
|
const DisplayComponent = () => {
|
|
1144
1171
|
const currentModelValue = displayedModel || "gemini-2.5-pro";
|
|
1145
1172
|
return React.createElement(GeminiDisplay, {
|
|
1146
|
-
messageBuffer,
|
|
1147
|
-
logPath: process.env.DEBUG ?
|
|
1173
|
+
messageBuffer: messageBuffer$1,
|
|
1174
|
+
logPath: process.env.DEBUG ? logger.logger.getLogPath() : void 0,
|
|
1148
1175
|
currentModel: currentModelValue,
|
|
1149
1176
|
onExit: async () => {
|
|
1150
|
-
|
|
1177
|
+
logger.logger.debug("[gemini]: Exiting agent via Ctrl-C");
|
|
1151
1178
|
shouldExit = true;
|
|
1152
1179
|
await handleAbort();
|
|
1153
1180
|
}
|
|
@@ -1158,8 +1185,8 @@ async function runGemini(opts) {
|
|
|
1158
1185
|
patchConsole: false
|
|
1159
1186
|
});
|
|
1160
1187
|
const initialModelName = displayedModel || "gemini-2.5-pro";
|
|
1161
|
-
|
|
1162
|
-
messageBuffer.addMessage(`[MODEL:${initialModelName}]`, "system");
|
|
1188
|
+
logger.logger.debug(`[gemini] Sending initial model to UI: ${initialModelName}`);
|
|
1189
|
+
messageBuffer$1.addMessage(`[MODEL:${initialModelName}]`, "system");
|
|
1163
1190
|
}
|
|
1164
1191
|
if (hasTTY) {
|
|
1165
1192
|
process.stdin.resume();
|
|
@@ -1168,8 +1195,8 @@ async function runGemini(opts) {
|
|
|
1168
1195
|
}
|
|
1169
1196
|
process.stdin.setEncoding("utf8");
|
|
1170
1197
|
}
|
|
1171
|
-
const happyServer = await
|
|
1172
|
-
const bridgeCommand = path.join(
|
|
1198
|
+
const happyServer = await deterministicJson.startHappyServer(session);
|
|
1199
|
+
const bridgeCommand = path.join(projectPath.projectPath(), "bin", "very-happy-mcp.mjs");
|
|
1173
1200
|
const mcpServers = {
|
|
1174
1201
|
happy: {
|
|
1175
1202
|
command: bridgeCommand,
|
|
@@ -1198,24 +1225,24 @@ async function runGemini(opts) {
|
|
|
1198
1225
|
case "model-output":
|
|
1199
1226
|
if (msg.textDelta) {
|
|
1200
1227
|
if (!isResponseInProgress) {
|
|
1201
|
-
messageBuffer.removeLastMessage("system");
|
|
1202
|
-
messageBuffer.addMessage(msg.textDelta, "assistant");
|
|
1228
|
+
messageBuffer$1.removeLastMessage("system");
|
|
1229
|
+
messageBuffer$1.addMessage(msg.textDelta, "assistant");
|
|
1203
1230
|
isResponseInProgress = true;
|
|
1204
|
-
|
|
1231
|
+
logger.logger.debug(`[gemini] Started new response, first chunk length: ${msg.textDelta.length}`);
|
|
1205
1232
|
} else {
|
|
1206
|
-
messageBuffer.updateLastMessage(msg.textDelta, "assistant");
|
|
1207
|
-
|
|
1233
|
+
messageBuffer$1.updateLastMessage(msg.textDelta, "assistant");
|
|
1234
|
+
logger.logger.debug(`[gemini] Updated response, chunk length: ${msg.textDelta.length}, total accumulated: ${accumulatedResponse.length + msg.textDelta.length}`);
|
|
1208
1235
|
}
|
|
1209
1236
|
accumulatedResponse += msg.textDelta;
|
|
1210
1237
|
}
|
|
1211
1238
|
break;
|
|
1212
1239
|
case "status":
|
|
1213
1240
|
const statusDetail = msg.detail ? typeof msg.detail === "object" ? JSON.stringify(msg.detail) : String(msg.detail) : "";
|
|
1214
|
-
|
|
1215
|
-
detail:
|
|
1241
|
+
logger.logger.debug(`[gemini] Status changed: ${msg.status}`, {
|
|
1242
|
+
detail: contentLogMetadata.contentLogMetadata(statusDetail)
|
|
1216
1243
|
});
|
|
1217
1244
|
if (msg.status === "error") {
|
|
1218
|
-
|
|
1245
|
+
logger.logger.debug("[gemini] Error status received:", contentLogMetadata.contentLogMetadata(statusDetail));
|
|
1219
1246
|
session.sendAgentMessage("gemini", {
|
|
1220
1247
|
type: "turn_aborted",
|
|
1221
1248
|
id: node_crypto.randomUUID()
|
|
@@ -1231,7 +1258,7 @@ async function runGemini(opts) {
|
|
|
1231
1258
|
});
|
|
1232
1259
|
taskStartedSent = true;
|
|
1233
1260
|
}
|
|
1234
|
-
messageBuffer.addMessage("Thinking...", "system");
|
|
1261
|
+
messageBuffer$1.addMessage("Thinking...", "system");
|
|
1235
1262
|
} else if (msg.status === "idle" || msg.status === "stopped") {
|
|
1236
1263
|
reasoningProcessor.complete();
|
|
1237
1264
|
} else if (msg.status === "error") {
|
|
@@ -1254,7 +1281,7 @@ For Google Workspace accounts, run: very-happy gemini project set <project-id>
|
|
|
1254
1281
|
Or use a different Google account: very-happy connect gemini
|
|
1255
1282
|
Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
1256
1283
|
}
|
|
1257
|
-
messageBuffer.addMessage(`Error: ${errorMessage}`, "status");
|
|
1284
|
+
messageBuffer$1.addMessage(`Error: ${errorMessage}`, "status");
|
|
1258
1285
|
session.sendAgentMessage("gemini", {
|
|
1259
1286
|
type: "message",
|
|
1260
1287
|
message: `Error: ${errorMessage}`
|
|
@@ -1265,11 +1292,11 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1265
1292
|
hadToolCallInTurn = true;
|
|
1266
1293
|
const toolArgs = msg.args ? JSON.stringify(msg.args).substring(0, 100) : "";
|
|
1267
1294
|
const isInvestigationTool = msg.toolName === "codebase_investigator" || typeof msg.toolName === "string" && msg.toolName.includes("investigator");
|
|
1268
|
-
|
|
1295
|
+
logger.logger.debug(`[gemini] \u{1F527} Tool call received: ${msg.toolName} (${msg.callId})${isInvestigationTool ? " [INVESTIGATION]" : ""}`);
|
|
1269
1296
|
if (isInvestigationTool && msg.args && typeof msg.args === "object" && "objective" in msg.args) {
|
|
1270
|
-
|
|
1297
|
+
logger.logger.debug("[gemini] Investigation objective received:", contentLogMetadata.contentLogMetadata(msg.args.objective));
|
|
1271
1298
|
}
|
|
1272
|
-
messageBuffer.addMessage(`Executing: ${msg.toolName}${toolArgs ? ` ${toolArgs}${toolArgs.length >= 100 ? "..." : ""}` : ""}`, "tool");
|
|
1299
|
+
messageBuffer$1.addMessage(`Executing: ${msg.toolName}${toolArgs ? ` ${toolArgs}${toolArgs.length >= 100 ? "..." : ""}` : ""}`, "tool");
|
|
1273
1300
|
session.sendAgentMessage("gemini", {
|
|
1274
1301
|
type: "tool-call",
|
|
1275
1302
|
name: msg.toolName,
|
|
@@ -1281,25 +1308,25 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1281
1308
|
case "tool-result":
|
|
1282
1309
|
if (msg.toolName === "change_title" || msg.callId?.includes("change_title") || msg.toolName === "happy__change_title") {
|
|
1283
1310
|
changeTitleCompleted = true;
|
|
1284
|
-
|
|
1311
|
+
logger.logger.debug("[gemini] change_title completed");
|
|
1285
1312
|
}
|
|
1286
1313
|
const isError = msg.result && typeof msg.result === "object" && "error" in msg.result;
|
|
1287
1314
|
const resultText = typeof msg.result === "string" ? msg.result.substring(0, 200) : JSON.stringify(msg.result).substring(0, 200);
|
|
1288
1315
|
const truncatedResult = resultText + (typeof msg.result === "string" && msg.result.length > 200 ? "..." : "");
|
|
1289
1316
|
const resultSize = typeof msg.result === "string" ? msg.result.length : JSON.stringify(msg.result).length;
|
|
1290
|
-
|
|
1317
|
+
logger.logger.debug(`[gemini] ${isError ? "\u274C" : "\u2705"} Tool result received: ${msg.toolName} (${msg.callId}) - Size: ${resultSize} bytes${isError ? " [ERROR]" : ""}`);
|
|
1291
1318
|
if (!isError) {
|
|
1292
1319
|
diffProcessor.processToolResult(msg.toolName, msg.result, msg.callId);
|
|
1293
1320
|
}
|
|
1294
1321
|
if (isError) {
|
|
1295
1322
|
const errorMsg = msg.result.error || "Tool call failed";
|
|
1296
|
-
|
|
1297
|
-
messageBuffer.addMessage(`Error: ${errorMsg}`, "status");
|
|
1323
|
+
logger.logger.debug("[gemini] Tool call error received:", contentLogMetadata.contentLogMetadata(errorMsg));
|
|
1324
|
+
messageBuffer$1.addMessage(`Error: ${errorMsg}`, "status");
|
|
1298
1325
|
} else {
|
|
1299
1326
|
if (resultSize > 1e3) {
|
|
1300
|
-
|
|
1327
|
+
logger.logger.debug(`[gemini] Large tool result received (${resultSize} bytes)`);
|
|
1301
1328
|
}
|
|
1302
|
-
messageBuffer.addMessage(`Result: ${truncatedResult}`, "result");
|
|
1329
|
+
messageBuffer$1.addMessage(`Result: ${truncatedResult}`, "result");
|
|
1303
1330
|
}
|
|
1304
1331
|
session.sendAgentMessage("gemini", {
|
|
1305
1332
|
type: "tool-result",
|
|
@@ -1309,7 +1336,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1309
1336
|
});
|
|
1310
1337
|
break;
|
|
1311
1338
|
case "fs-edit":
|
|
1312
|
-
messageBuffer.addMessage(`File edit: ${msg.description}`, "tool");
|
|
1339
|
+
messageBuffer$1.addMessage(`File edit: ${msg.description}`, "tool");
|
|
1313
1340
|
diffProcessor.processFsEdit(msg.path || "", msg.description, msg.diff);
|
|
1314
1341
|
session.sendAgentMessage("gemini", {
|
|
1315
1342
|
type: "file-edit",
|
|
@@ -1330,7 +1357,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1330
1357
|
}
|
|
1331
1358
|
break;
|
|
1332
1359
|
case "terminal-output":
|
|
1333
|
-
messageBuffer.addMessage(msg.data, "result");
|
|
1360
|
+
messageBuffer$1.addMessage(msg.data, "result");
|
|
1334
1361
|
session.sendAgentMessage("gemini", {
|
|
1335
1362
|
type: "terminal-output",
|
|
1336
1363
|
data: msg.data,
|
|
@@ -1351,8 +1378,8 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1351
1378
|
const execApprovalMsg = msg;
|
|
1352
1379
|
const callId = execApprovalMsg.call_id || execApprovalMsg.callId || node_crypto.randomUUID();
|
|
1353
1380
|
const { call_id, type, ...inputs } = execApprovalMsg;
|
|
1354
|
-
|
|
1355
|
-
messageBuffer.addMessage(`Exec approval requested: ${callId}`, "tool");
|
|
1381
|
+
logger.logger.debug(`[gemini] Exec approval request received: ${callId}`);
|
|
1382
|
+
messageBuffer$1.addMessage(`Exec approval requested: ${callId}`, "tool");
|
|
1356
1383
|
session.sendAgentMessage("gemini", {
|
|
1357
1384
|
type: "tool-call",
|
|
1358
1385
|
name: "GeminiBash",
|
|
@@ -1368,8 +1395,8 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1368
1395
|
const { call_id: patchCallIdVar, type: patchType, auto_approved, changes } = patchBeginMsg;
|
|
1369
1396
|
const changeCount = changes ? Object.keys(changes).length : 0;
|
|
1370
1397
|
const filesMsg = changeCount === 1 ? "1 file" : `${changeCount} files`;
|
|
1371
|
-
messageBuffer.addMessage(`Modifying ${filesMsg}...`, "tool");
|
|
1372
|
-
|
|
1398
|
+
messageBuffer$1.addMessage(`Modifying ${filesMsg}...`, "tool");
|
|
1399
|
+
logger.logger.debug(`[gemini] Patch apply begin: ${patchCallId}, files: ${changeCount}`);
|
|
1373
1400
|
session.sendAgentMessage("gemini", {
|
|
1374
1401
|
type: "tool-call",
|
|
1375
1402
|
name: "GeminiPatch",
|
|
@@ -1388,12 +1415,12 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1388
1415
|
const { call_id: patchEndCallIdVar, type: patchEndType, stdout, stderr, success } = patchEndMsg;
|
|
1389
1416
|
if (success) {
|
|
1390
1417
|
const message = stdout || "Files modified successfully";
|
|
1391
|
-
messageBuffer.addMessage(message.substring(0, 200), "result");
|
|
1418
|
+
messageBuffer$1.addMessage(message.substring(0, 200), "result");
|
|
1392
1419
|
} else {
|
|
1393
1420
|
const errorMsg = stderr || "Failed to modify files";
|
|
1394
|
-
messageBuffer.addMessage(`Error: ${errorMsg.substring(0, 200)}`, "result");
|
|
1421
|
+
messageBuffer$1.addMessage(`Error: ${errorMsg.substring(0, 200)}`, "result");
|
|
1395
1422
|
}
|
|
1396
|
-
|
|
1423
|
+
logger.logger.debug(`[gemini] Patch apply end: ${patchEndCallId}, success: ${success}`);
|
|
1397
1424
|
session.sendAgentMessage("gemini", {
|
|
1398
1425
|
type: "tool-result",
|
|
1399
1426
|
callId: patchEndCallId,
|
|
@@ -1411,10 +1438,10 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1411
1438
|
const thinkingText = thinkingPayload && typeof thinkingPayload === "object" && "text" in thinkingPayload ? String(thinkingPayload.text || "") : "";
|
|
1412
1439
|
if (thinkingText) {
|
|
1413
1440
|
reasoningProcessor.processChunk(thinkingText);
|
|
1414
|
-
|
|
1441
|
+
logger.logger.debug("[gemini] Thinking chunk received:", contentLogMetadata.contentLogMetadata(thinkingText));
|
|
1415
1442
|
if (!thinkingText.startsWith("**")) {
|
|
1416
1443
|
const thinkingPreview = thinkingText.substring(0, 100);
|
|
1417
|
-
messageBuffer.updateLastMessage(`[Thinking] ${thinkingPreview}...`, "system");
|
|
1444
|
+
messageBuffer$1.updateLastMessage(`[Thinking] ${thinkingPreview}...`, "system");
|
|
1418
1445
|
}
|
|
1419
1446
|
}
|
|
1420
1447
|
session.sendAgentMessage("gemini", {
|
|
@@ -1434,18 +1461,18 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1434
1461
|
let message = pending;
|
|
1435
1462
|
pending = null;
|
|
1436
1463
|
if (!message) {
|
|
1437
|
-
|
|
1464
|
+
logger.logger.debug("[gemini] Main loop: waiting for messages from queue...");
|
|
1438
1465
|
const waitSignal = abortController.signal;
|
|
1439
1466
|
const batch = await messageQueue.waitForMessagesAndGetAsString(waitSignal);
|
|
1440
1467
|
if (!batch) {
|
|
1441
1468
|
if (waitSignal.aborted && !shouldExit) {
|
|
1442
|
-
|
|
1469
|
+
logger.logger.debug("[gemini] Main loop: wait aborted, continuing...");
|
|
1443
1470
|
continue;
|
|
1444
1471
|
}
|
|
1445
|
-
|
|
1472
|
+
logger.logger.debug("[gemini] Main loop: no batch received, breaking...");
|
|
1446
1473
|
break;
|
|
1447
1474
|
}
|
|
1448
|
-
|
|
1475
|
+
logger.logger.debug(`[gemini] Main loop: received message from queue (length: ${batch.message.length})`);
|
|
1449
1476
|
message = batch;
|
|
1450
1477
|
}
|
|
1451
1478
|
if (!message) {
|
|
@@ -1453,14 +1480,14 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1453
1480
|
}
|
|
1454
1481
|
let injectHistoryContext = false;
|
|
1455
1482
|
if (wasSessionCreated && currentModeHash && message.hash !== currentModeHash) {
|
|
1456
|
-
|
|
1457
|
-
messageBuffer.addMessage("\u2550".repeat(40), "status");
|
|
1483
|
+
logger.logger.debug("[Gemini] Mode changed \u2013 restarting Gemini session");
|
|
1484
|
+
messageBuffer$1.addMessage("\u2550".repeat(40), "status");
|
|
1458
1485
|
if (conversationHistory.hasHistory()) {
|
|
1459
|
-
messageBuffer.addMessage(`Switching model (preserving ${conversationHistory.size()} messages of context)...`, "status");
|
|
1486
|
+
messageBuffer$1.addMessage(`Switching model (preserving ${conversationHistory.size()} messages of context)...`, "status");
|
|
1460
1487
|
injectHistoryContext = true;
|
|
1461
|
-
|
|
1488
|
+
logger.logger.debug("[Gemini] Will inject conversation history");
|
|
1462
1489
|
} else {
|
|
1463
|
-
messageBuffer.addMessage("Starting new Gemini session (mode changed)...", "status");
|
|
1490
|
+
messageBuffer$1.addMessage("Starting new Gemini session (mode changed)...", "status");
|
|
1464
1491
|
}
|
|
1465
1492
|
permissionHandler.reset();
|
|
1466
1493
|
reasoningProcessor.abort();
|
|
@@ -1482,13 +1509,13 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1482
1509
|
geminiBackend = backendResult.backend;
|
|
1483
1510
|
setupGeminiMessageHandler(geminiBackend);
|
|
1484
1511
|
const actualModel = backendResult.model;
|
|
1485
|
-
|
|
1512
|
+
logger.logger.debug(`[gemini] Model change - modelToUse=${modelToUse}, actualModel=${actualModel} (from ${backendResult.modelSource})`);
|
|
1486
1513
|
conversationHistory.setCurrentModel(actualModel);
|
|
1487
|
-
|
|
1514
|
+
logger.logger.debug("[gemini] Starting new ACP session with model:", actualModel);
|
|
1488
1515
|
const { sessionId } = await geminiBackend.startSession();
|
|
1489
1516
|
acpSessionId = sessionId;
|
|
1490
|
-
|
|
1491
|
-
|
|
1517
|
+
logger.logger.debug(`[gemini] New ACP session started: ${acpSessionId}`);
|
|
1518
|
+
logger.logger.debug(`[gemini] Calling updateDisplayedModel with: ${actualModel}`);
|
|
1492
1519
|
updateDisplayedModel(actualModel, false);
|
|
1493
1520
|
updatePermissionMode(message.mode.permissionMode);
|
|
1494
1521
|
wasSessionCreated = true;
|
|
@@ -1497,7 +1524,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1497
1524
|
}
|
|
1498
1525
|
currentModeHash = message.hash;
|
|
1499
1526
|
const userMessageToShow = message.mode?.originalUserMessage || message.message;
|
|
1500
|
-
messageBuffer.addMessage(userMessageToShow, "user");
|
|
1527
|
+
messageBuffer$1.addMessage(userMessageToShow, "user");
|
|
1501
1528
|
isProcessingMessage = true;
|
|
1502
1529
|
try {
|
|
1503
1530
|
if (first || !wasSessionCreated) {
|
|
@@ -1516,20 +1543,20 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1516
1543
|
geminiBackend = backendResult.backend;
|
|
1517
1544
|
setupGeminiMessageHandler(geminiBackend);
|
|
1518
1545
|
const actualModel = backendResult.model;
|
|
1519
|
-
|
|
1520
|
-
|
|
1546
|
+
logger.logger.debug(`[gemini] Backend created, model will be: ${actualModel} (from ${backendResult.modelSource})`);
|
|
1547
|
+
logger.logger.debug(`[gemini] Calling updateDisplayedModel with: ${actualModel}`);
|
|
1521
1548
|
updateDisplayedModel(actualModel, false);
|
|
1522
1549
|
conversationHistory.setCurrentModel(actualModel);
|
|
1523
1550
|
}
|
|
1524
1551
|
if (!acpSessionId) {
|
|
1525
|
-
|
|
1552
|
+
logger.logger.debug("[gemini] Starting ACP session...");
|
|
1526
1553
|
updatePermissionMode(message.mode.permissionMode);
|
|
1527
1554
|
const { sessionId } = await geminiBackend.startSession();
|
|
1528
1555
|
acpSessionId = sessionId;
|
|
1529
|
-
|
|
1556
|
+
logger.logger.debug(`[gemini] ACP session started: ${acpSessionId}`);
|
|
1530
1557
|
wasSessionCreated = true;
|
|
1531
1558
|
currentModeHash = message.hash;
|
|
1532
|
-
|
|
1559
|
+
logger.logger.debug(`[gemini] Displaying model in UI: ${displayedModel || "gemini-2.5-pro"}, displayedModel: ${displayedModel}`);
|
|
1533
1560
|
}
|
|
1534
1561
|
}
|
|
1535
1562
|
if (!acpSessionId) {
|
|
@@ -1548,19 +1575,19 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1548
1575
|
if (injectHistoryContext && conversationHistory.hasHistory()) {
|
|
1549
1576
|
const historyContext = conversationHistory.getContextForNewSession();
|
|
1550
1577
|
promptToSend = historyContext + promptToSend;
|
|
1551
|
-
|
|
1578
|
+
logger.logger.debug(`[gemini] Injected conversation history context (${historyContext.length} chars)`);
|
|
1552
1579
|
}
|
|
1553
|
-
|
|
1580
|
+
logger.logger.debug("[gemini] Sending prompt to Gemini:", contentLogMetadata.contentLogMetadata(promptToSend));
|
|
1554
1581
|
const MAX_RETRIES = 3;
|
|
1555
1582
|
const RETRY_DELAY_MS = 2e3;
|
|
1556
1583
|
let lastError = null;
|
|
1557
1584
|
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
1558
1585
|
try {
|
|
1559
1586
|
await geminiBackend.sendPrompt(acpSessionId, promptToSend);
|
|
1560
|
-
|
|
1587
|
+
logger.logger.debug("[gemini] Prompt sent successfully");
|
|
1561
1588
|
if (geminiBackend.waitForResponseComplete) {
|
|
1562
1589
|
await geminiBackend.waitForResponseComplete(12e4);
|
|
1563
|
-
|
|
1590
|
+
logger.logger.debug("[gemini] Response complete");
|
|
1564
1591
|
}
|
|
1565
1592
|
break;
|
|
1566
1593
|
} catch (promptError) {
|
|
@@ -1577,7 +1604,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1577
1604
|
resetTimeMsg = ` Quota resets in ${parts}.`;
|
|
1578
1605
|
}
|
|
1579
1606
|
const quotaMsg = `Gemini quota exceeded.${resetTimeMsg} Try using a different model (gemini-2.5-flash-lite) or wait for quota reset.`;
|
|
1580
|
-
messageBuffer.addMessage(quotaMsg, "status");
|
|
1607
|
+
messageBuffer$1.addMessage(quotaMsg, "status");
|
|
1581
1608
|
session.sendAgentMessage("gemini", { type: "message", message: quotaMsg });
|
|
1582
1609
|
throw promptError;
|
|
1583
1610
|
}
|
|
@@ -1585,8 +1612,8 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1585
1612
|
const isInternalError = errorCode === -32603;
|
|
1586
1613
|
const isRetryable = isEmptyResponseError || isInternalError;
|
|
1587
1614
|
if (isRetryable && attempt < MAX_RETRIES) {
|
|
1588
|
-
|
|
1589
|
-
messageBuffer.addMessage(`Gemini returned empty response, retrying (${attempt}/${MAX_RETRIES})...`, "status");
|
|
1615
|
+
logger.logger.debug(`[gemini] Retryable error on attempt ${attempt}/${MAX_RETRIES}:`, contentLogMetadata.contentLogMetadata(errorDetails));
|
|
1616
|
+
messageBuffer$1.addMessage(`Gemini returned empty response, retrying (${attempt}/${MAX_RETRIES})...`, "status");
|
|
1590
1617
|
await new Promise((resolve2) => setTimeout(resolve2, RETRY_DELAY_MS * attempt));
|
|
1591
1618
|
continue;
|
|
1592
1619
|
}
|
|
@@ -1594,16 +1621,16 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1594
1621
|
}
|
|
1595
1622
|
}
|
|
1596
1623
|
if (lastError && MAX_RETRIES > 1) {
|
|
1597
|
-
|
|
1624
|
+
logger.logger.debug("[gemini] Prompt succeeded after retries");
|
|
1598
1625
|
}
|
|
1599
1626
|
if (first) {
|
|
1600
1627
|
first = false;
|
|
1601
1628
|
}
|
|
1602
1629
|
} catch (error) {
|
|
1603
|
-
|
|
1630
|
+
logger.logger.debug("[gemini] Error in gemini session:", contentLogMetadata.errorLogMetadata(error));
|
|
1604
1631
|
const isAbortError = error instanceof Error && error.name === "AbortError";
|
|
1605
1632
|
if (isAbortError) {
|
|
1606
|
-
messageBuffer.addMessage("Aborted by user", "status");
|
|
1633
|
+
messageBuffer$1.addMessage("Aborted by user", "status");
|
|
1607
1634
|
session.sendSessionEvent({ type: "message", message: "Aborted by user" });
|
|
1608
1635
|
} else {
|
|
1609
1636
|
let errorMsg = "Process error occurred";
|
|
@@ -1641,7 +1668,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1641
1668
|
} else if (error instanceof Error) {
|
|
1642
1669
|
errorMsg = error.message;
|
|
1643
1670
|
}
|
|
1644
|
-
messageBuffer.addMessage(errorMsg, "status");
|
|
1671
|
+
messageBuffer$1.addMessage(errorMsg, "status");
|
|
1645
1672
|
session.sendAgentMessage("gemini", {
|
|
1646
1673
|
type: "message",
|
|
1647
1674
|
message: errorMsg
|
|
@@ -1658,9 +1685,9 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1658
1685
|
if (options.length > 0) {
|
|
1659
1686
|
const optionsXml = formatOptionsXml(options);
|
|
1660
1687
|
finalMessageText = messageText + optionsXml;
|
|
1661
|
-
|
|
1688
|
+
logger.logger.debug(`[gemini] Found ${options.length} options in response`);
|
|
1662
1689
|
} else if (hasIncompleteOptions(accumulatedResponse)) {
|
|
1663
|
-
|
|
1690
|
+
logger.logger.debug(`[gemini] Warning: Incomplete options block detected`);
|
|
1664
1691
|
}
|
|
1665
1692
|
const messagePayload = {
|
|
1666
1693
|
type: "message",
|
|
@@ -1668,7 +1695,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1668
1695
|
id: node_crypto.randomUUID(),
|
|
1669
1696
|
...options.length > 0 && { options }
|
|
1670
1697
|
};
|
|
1671
|
-
|
|
1698
|
+
logger.logger.debug("[gemini] Sending complete message to mobile:", contentLogMetadata.contentLogMetadata(finalMessageText));
|
|
1672
1699
|
session.sendAgentMessage("gemini", messagePayload);
|
|
1673
1700
|
accumulatedResponse = "";
|
|
1674
1701
|
isResponseInProgress = false;
|
|
@@ -1686,13 +1713,13 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1686
1713
|
emitReadyIfIdle();
|
|
1687
1714
|
isProcessingMessage = false;
|
|
1688
1715
|
applyPendingSessionSwap();
|
|
1689
|
-
|
|
1716
|
+
logger.logger.debug(`[gemini] Main loop: turn completed, continuing to next iteration (queue size: ${messageQueue.size()})`);
|
|
1690
1717
|
}
|
|
1691
1718
|
}
|
|
1692
1719
|
} finally {
|
|
1693
|
-
|
|
1720
|
+
logger.logger.debug("[gemini]: Final cleanup start");
|
|
1694
1721
|
if (reconnectionHandle) {
|
|
1695
|
-
|
|
1722
|
+
logger.logger.debug("[gemini]: Cancelling offline reconnection");
|
|
1696
1723
|
reconnectionHandle.cancel();
|
|
1697
1724
|
}
|
|
1698
1725
|
try {
|
|
@@ -1700,7 +1727,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1700
1727
|
await session.flush();
|
|
1701
1728
|
await session.close();
|
|
1702
1729
|
} catch (e) {
|
|
1703
|
-
|
|
1730
|
+
logger.logger.debug("[gemini]: Error while closing session", e);
|
|
1704
1731
|
}
|
|
1705
1732
|
if (geminiBackend) {
|
|
1706
1733
|
await geminiBackend.dispose();
|
|
@@ -1722,8 +1749,8 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1722
1749
|
if (inkInstance) {
|
|
1723
1750
|
inkInstance.unmount();
|
|
1724
1751
|
}
|
|
1725
|
-
messageBuffer.clear();
|
|
1726
|
-
|
|
1752
|
+
messageBuffer$1.clear();
|
|
1753
|
+
logger.logger.debug("[gemini]: Final cleanup completed");
|
|
1727
1754
|
}
|
|
1728
1755
|
}
|
|
1729
1756
|
|