very-happy-cli 0.2.176 → 0.2.177
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-9_ZI1Bv3.cjs → AcpBackend-B-ny68XM.cjs} +188 -37
- package/dist/{AcpBackend-COp6D8gl.mjs → AcpBackend-B0K0WrtW.mjs} +187 -38
- package/dist/{BasePermissionHandler-DPvLN7aR.cjs → BasePermissionHandler-DR6nxuEn.cjs} +1 -1
- package/dist/{BasePermissionHandler-ChMkmsGD.mjs → BasePermissionHandler-hdY7kTqX.mjs} +1 -1
- package/dist/{agentHome-BKi7tsE9.cjs → agentHome-BdTXEUPe.cjs} +4 -4
- package/dist/{agentHome-D61ZMLXM.mjs → agentHome-GRN2VfHv.mjs} +4 -4
- package/dist/{api-Buc_ejoA.cjs → api-BWX10o97.cjs} +15 -8
- package/dist/{api-CbwDDXJt.mjs → api-CKBViqI3.mjs} +16 -9
- package/dist/{apiMachine--PXoXwKq.cjs → apiMachine-BYYFGgFs.cjs} +14 -13
- package/dist/{apiMachine-CS7t3Rg-.mjs → apiMachine-DttO4UFj.mjs} +15 -14
- package/dist/{attachmentContent-BQYc8KpE.mjs → attachmentContent-cPVF463_.mjs} +1 -1
- package/dist/{attachmentContent-CFzzTeV9.cjs → attachmentContent-kJKXpkMX.cjs} +1 -1
- package/dist/{auth-B3xMoveE.mjs → auth-BmESeKuM.mjs} +5 -5
- package/dist/{auth-CBkmRIGw.mjs → auth-CKdXb9zp.mjs} +8 -8
- package/dist/{auth-CpO3ZUMz.cjs → auth-CTECt2Oz.cjs} +5 -5
- package/dist/{auth-LPvsVriN.cjs → auth-DNxVmVbn.cjs} +8 -8
- package/dist/{auto-DHGch_zK.mjs → auto-Ch3203qd.mjs} +16 -15
- package/dist/{auto-Dm3EIKT7.cjs → auto-D1ypjjfx.cjs} +14 -13
- package/dist/{backgroundTaskActivity-8PdPxrvy.mjs → backgroundTaskActivity-BVwJBl02.mjs} +1 -1
- package/dist/{bootstrap-BboDz_w2.cjs → bootstrap-6OI698q9.cjs} +2 -2
- package/dist/{bootstrap-CxuBAkJU.mjs → bootstrap-C0s2bPFQ.mjs} +2 -2
- package/dist/{browser-BvARP-YR.mjs → browser-BlLWZUMx.mjs} +1 -1
- package/dist/{browser-GQZJxD2n.cjs → browser-DG6Uof5O.cjs} +1 -1
- package/dist/{claudeLocal-B9EhFmD7.mjs → claudeLocal-CcWcKnoo.mjs} +5 -5
- package/dist/{claudeLocal-D-mujSX1.cjs → claudeLocal-CemsIArT.cjs} +4 -4
- package/dist/{claudeLocalLauncher-Bdl-9aU_.mjs → claudeLocalLauncher-7p6y88nj.mjs} +15 -18
- package/dist/{claudeLocalLauncher-Tbrx6TXF.cjs → claudeLocalLauncher-A4VuevIi.cjs} +14 -17
- package/dist/{claudeSessionFork-D_DKvDKE.mjs → claudeSessionFork-BtROOjqf.mjs} +1 -1
- package/dist/{claudeSessionFork-sOz97qqW.cjs → claudeSessionFork-CbDfm8Fz.cjs} +1 -1
- package/dist/{client-Cg6ABRe-.mjs → client-BPMWutfs.mjs} +3 -3
- package/dist/{client-D9pEOhn4.cjs → client-COmgDDy0.cjs} +2 -2
- package/dist/{client-Ryu9fllj.mjs → client-DG5ndWLw.mjs} +2 -2
- package/dist/{client-D7sSU04O.cjs → client-DyvBTYee.cjs} +3 -3
- package/dist/codex/happyMcpStdioBridge.cjs +14 -14
- package/dist/codex/happyMcpStdioBridge.mjs +15 -15
- package/dist/{codexAppServerClient-C70pJ-BB.mjs → codexAppServerClient-D-Z8qSfI.mjs} +10 -58
- package/dist/{codexAppServerClient-DsIUkVnX.cjs → codexAppServerClient-R24WZZfg.cjs} +6 -54
- package/dist/{codexCommand-Aycux-B7.cjs → codexCommand-6hW19gsq.cjs} +41 -63
- package/dist/{codexCommand-DWbA3pJN.mjs → codexCommand-CVTkZJ1o.mjs} +41 -63
- package/dist/{BaseReasoningProcessor-Dnf16mtJ.cjs → codexTermination-BBU7e92y.cjs} +25 -1
- package/dist/{BaseReasoningProcessor-pjvLSTQF.mjs → codexTermination-CCIfwzcx.mjs} +25 -2
- package/dist/{config-Bztmzu8z.mjs → config-CvsNChKX.mjs} +3 -3
- package/dist/{config-BcL0bxO5.cjs → config-DhdrvOLV.cjs} +3 -3
- package/dist/{configuration-BAwOtWFY.mjs → configuration-D55F0t16.mjs} +1 -1
- package/dist/{configuration-CpBrilxV.cjs → configuration-DZPy0T9Z.cjs} +1 -1
- package/dist/{connect-BeWQ4MMA.mjs → connect-CwCXMRmD.mjs} +12 -12
- package/dist/{connect-BBNCMTi8.cjs → connect-Wz-XZYXW.cjs} +11 -11
- package/dist/{context-Hk0j2Y9-.cjs → context-BKbrZ55r.cjs} +1 -1
- package/dist/{context-j114QJre.mjs → context-CCRpVXFo.mjs} +1 -1
- package/dist/{controlClient-00KYAjsI.mjs → controlClient-C4xB5J6O.mjs} +4 -4
- package/dist/{controlClient-bs_YqwDl.cjs → controlClient-SX8gSza2.cjs} +3 -3
- package/dist/{createSessionMetadata-D4Sj6H95.cjs → createSessionMetadata-BCFmYlBo.cjs} +2 -2
- package/dist/{createSessionMetadata-xlycGog5.mjs → createSessionMetadata-Bi-m0Y_O.mjs} +2 -2
- package/dist/{defaultPermissionMode-CMsiaRzr.cjs → defaultPermissionMode-DMBEnXll.cjs} +2 -2
- package/dist/{defaultPermissionMode-B97ox9p1.mjs → defaultPermissionMode-wBcbBezm.mjs} +2 -2
- package/dist/{deterministicJson-ucyv8j6b.mjs → deterministicJson-BkQETt8_.mjs} +8 -8
- package/dist/{deterministicJson-aHxtYLha.cjs → deterministicJson-ChGfQEF6.cjs} +8 -8
- package/dist/{doctor-D554c6Bg.mjs → doctor-B9c2C9dF.mjs} +8 -8
- package/dist/{doctor-BXkNXcok.cjs → doctor-BsN3JZJn.cjs} +7 -7
- package/dist/{downloadTarget-2_zMvt2N.mjs → downloadTarget-ByXzbDK4.mjs} +6 -6
- package/dist/{downloadTarget-CmdlljZW.cjs → downloadTarget-Dj3WoVJa.cjs} +6 -6
- package/dist/{ensureDaemonRunning-DJlziY-m.mjs → ensureDaemonRunning--HYzs5Ce.mjs} +5 -5
- package/dist/{ensureDaemonRunning-CY7iC--U.cjs → ensureDaemonRunning-7Wb8M7Lv.cjs} +5 -5
- package/dist/{handleResumeCommand-CNTnXBXA.mjs → handleResumeCommand-DHddBkNJ.mjs} +5 -5
- package/dist/{handleResumeCommand-lSVnvTNC.cjs → handleResumeCommand-OmuUGYjQ.cjs} +5 -5
- package/dist/{index-jeD70GGH.cjs → index-BRJzH4sc.cjs} +137 -83
- package/dist/{index-DY3I8j0W.mjs → index-BzJNDsJq.mjs} +139 -85
- package/dist/{index-B6UGRQ7h.mjs → index-CEjJnq05.mjs} +3 -0
- package/dist/{index-59hR7nVz.mjs → index-CEm0MYiS.mjs} +3 -3
- package/dist/{index-DhARRePz.cjs → index-CrR4JISa.cjs} +4 -4
- package/dist/{index-MwTVbeGW.cjs → index-D9NoYc5I.cjs} +3 -3
- package/dist/{index-D3kI0hDR.cjs → index-DFPT4HOO.cjs} +3 -0
- package/dist/{index-CxSLrTPA.mjs → index-Dhl6_bw7.mjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-DXUEtGfU.cjs → install-1qn-D9FS.cjs} +3 -3
- package/dist/{install-DytIJ_Ia.mjs → install-BDIUtPXi.mjs} +3 -3
- package/dist/lib.cjs +10 -10
- package/dist/lib.d.cts +7 -1
- package/dist/lib.d.mts +7 -1
- package/dist/lib.mjs +11 -11
- package/dist/{lidState-CduPmrM0.mjs → lidState-BqVsw7H1.mjs} +1 -1
- package/dist/{lidState-UasMvPzw.cjs → lidState-DxbK0qfu.cjs} +1 -1
- package/dist/{localHappyAgentAuth-DL8JjHTV.mjs → localHappyAgentAuth-Ce8kO2yc.mjs} +1 -1
- package/dist/{localHappyAgentAuth-CA02WOny.cjs → localHappyAgentAuth-D5tANdRD.cjs} +1 -1
- package/dist/{logger-CihCDWDw.mjs → logger-13cBr_ew.mjs} +2 -2
- package/dist/{logger-zoO54Zsy.cjs → logger-LvwVeATU.cjs} +2 -2
- package/dist/{machineMetadata-BAKVtr-k.cjs → machineMetadata-29h7vgf4.cjs} +3 -3
- package/dist/{machineMetadata-DEZcQ_CQ.mjs → machineMetadata-dMida2qq.mjs} +3 -3
- package/dist/{main-BIvxyX71.cjs → main-DpM5jaFH.cjs} +44 -44
- package/dist/{main-DyJfNlL_.mjs → main-x4nAhdH5.mjs} +44 -44
- package/dist/{manager-2Il8XJVq.mjs → manager-BEsI4qt3.mjs} +1 -1
- package/dist/{mcp-yoIdGe6C.mjs → mcp-DMiFGYMT.mjs} +15 -15
- package/dist/{mcp-Dd11vHij.cjs → mcp-DQv3caXs.cjs} +14 -14
- package/dist/{mirrorProtocol-D-hF_SE5.cjs → mirrorProtocol-BfrERW7Z.cjs} +2 -2
- package/dist/{mirrorProtocol-BukXB5s3.mjs → mirrorProtocol-Bz8tEabR.mjs} +2 -2
- package/dist/{package-A7zOGx8B.cjs → package-Ch9WGDV_.cjs} +7 -7
- package/dist/{package-ayqGDKSp.mjs → package-CjlsAaRe.mjs} +7 -7
- package/dist/{peerTools-DDMSViPu.mjs → peerTools-CxmrKnfV.mjs} +4 -4
- package/dist/{peerTools-dPc9hRC5.cjs → peerTools-DtGKWli5.cjs} +4 -4
- package/dist/{persistence-Dy3lmall.mjs → persistence-C_tYtOqK.mjs} +2 -2
- package/dist/{persistence-Cih2AWml.cjs → persistence-DXbKOHxl.cjs} +2 -2
- package/dist/{piRunnerArgs-BuJgnUI5.cjs → piRunnerArgs-BVRZe2AR.cjs} +1 -1
- package/dist/{piRunnerArgs-D3z3-1VJ.mjs → piRunnerArgs-BpHc-JZl.mjs} +1 -1
- package/dist/{piRuntime-B-SPcWIr.cjs → piRuntime-D7eio8Ix.cjs} +1 -1
- package/dist/{piRuntime-kVGue-_5.mjs → piRuntime-DOdGF395.mjs} +1 -1
- package/dist/{piTerminal-aEtVdCJ2.mjs → piTerminal-dpxz4Q8D.mjs} +17 -17
- package/dist/{piTerminal-DSxK5aAm.cjs → piTerminal-y_PRo2NY.cjs} +16 -16
- package/dist/processTree-CMHWlVse.cjs +66 -0
- package/dist/processTree-CP5IvQ2Z.mjs +61 -0
- package/dist/{rateLimitWindows-82izLQy8.cjs → rateLimitWindows-DFnMU2Vt.cjs} +1 -1
- package/dist/{rateLimitWindows-E5DRjfE6.mjs → rateLimitWindows-DYHDGuzQ.mjs} +1 -1
- package/dist/{registerCommonHandlers-CqO075-X.cjs → registerCommonHandlers-60VuTkdg.cjs} +2 -2
- package/dist/{registerCommonHandlers-Bm7CMqMv.mjs → registerCommonHandlers-D8OMpBbQ.mjs} +2 -2
- package/dist/{registerKillSessionHandler-D02OY4vi.mjs → registerKillSessionHandler-Drhf7-Vz.mjs} +4 -4
- package/dist/{registerKillSessionHandler-WQra3T9B.cjs → registerKillSessionHandler-pqChBKwO.cjs} +4 -4
- package/dist/{remoteSessionClient-f3DYorl8.cjs → remoteSessionClient-B7NvjHD3.cjs} +5 -5
- package/dist/{remoteSessionClient-Buh6NejV.mjs → remoteSessionClient-D01Hso2-.mjs} +5 -5
- package/dist/{reportProgressTool-C5aSoKYX.mjs → reportProgressTool-B203EZCR.mjs} +1 -1
- package/dist/{reportProgressTool-C2gn_HWD.cjs → reportProgressTool-Du_zAK4h.cjs} +1 -1
- package/dist/{run-Drxogp0j.mjs → run-DX4Zs3Ug.mjs} +31 -31
- package/dist/{run-CDEmq6Zs.cjs → run-DZ5jU53c.cjs} +31 -31
- package/dist/{runClaude-BF6U2Js7.mjs → runClaude-CgPHXP0L.mjs} +25 -21
- package/dist/{runClaude-yEcZTCt_.cjs → runClaude-ClRhHpwR.cjs} +24 -20
- package/dist/{runClaudeDeps-CnNNFjlI.cjs → runClaudeDeps-D2v_WDSL.cjs} +384 -86
- package/dist/{runClaudeDeps-Bl4ndq7N.mjs → runClaudeDeps-Dz2iydq4.mjs} +390 -92
- package/dist/{runGemini-DDVDRNg4.cjs → runGemini-BtZqGFkp.cjs} +206 -191
- package/dist/{runGemini-C3wt7iv7.mjs → runGemini-DBXxpoY8.mjs} +206 -191
- package/dist/{runOpenClaw-CY6YHAvj.mjs → runOpenClaw-BOHpzCEU.mjs} +16 -16
- package/dist/{runOpenClaw-BzlVA_9Q.cjs → runOpenClaw-D8q8G57u.cjs} +15 -15
- package/dist/{sandbox-CX_wLwpq.mjs → sandbox-C452Vrsc.mjs} +4 -4
- package/dist/{sandbox-0UNHR3hP.cjs → sandbox-Cu9mMzjx.cjs} +4 -4
- package/dist/selfCheck-BAvqBwBR.mjs +84 -0
- package/dist/{selfCheck-FNwMFY8p.cjs → selfCheck-gKa3uVr1.cjs} +35 -35
- package/dist/{send-BQkl25g0.cjs → send-2Vb5eppI.cjs} +8 -8
- package/dist/{send-CpEGYict.mjs → send-B8HARi7x.mjs} +9 -9
- package/dist/{server-DnINX_Lm.mjs → server-BBWCIZyS.mjs} +4 -4
- package/dist/{server-BodFZ5sW.cjs → server-Db9Wuam3.cjs} +6 -6
- package/dist/{sessionLock-DOj6mMXn.cjs → sessionLock-6qL_N6Rn.cjs} +3 -3
- package/dist/{sessionLock-Ddn-fhZ0.mjs → sessionLock-ZfvFVdUi.mjs} +3 -3
- package/dist/{sessionModeFile-DDbonFR_.mjs → sessionModeFile-CWVq8AT9.mjs} +1 -1
- package/dist/{sessionModeFile-DVukoSp7.cjs → sessionModeFile-CsLtn_PL.cjs} +1 -1
- package/dist/{sessionOps-B1vQ25GS.mjs → sessionOps-CdgbEJgf.mjs} +5 -5
- package/dist/{sessionOps-Nryt1DZt.cjs → sessionOps-Dmt7WUUs.cjs} +4 -4
- package/dist/{sessionScanner-DCr3ofhR.mjs → sessionScanner-CNVaSNOn.mjs} +34 -4
- package/dist/{sessionScanner-D1h-cdte.cjs → sessionScanner-CQL_WSaC.cjs} +34 -3
- package/dist/{sessions-D2HsTbLf.cjs → sessions-BJblG_Hx.cjs} +9 -9
- package/dist/{sessions-DpAN6Ft9.mjs → sessions-DTomHfFg.mjs} +10 -10
- package/dist/{setupOfflineReconnection-DQHEp330.mjs → setupOfflineReconnection-C5trsV-j.mjs} +2 -2
- package/dist/{setupOfflineReconnection-B9Tw1Ouj.cjs → setupOfflineReconnection-DVA0VpQL.cjs} +2 -2
- package/dist/{spawn-CNjm1yOi.mjs → spawn-CQJFgoOq.mjs} +14 -13
- package/dist/{spawn-CvDZ38hi.cjs → spawn-DRyNAqD8.cjs} +12 -11
- package/dist/{spawnHappyCLI-C8Vl56wB.mjs → spawnHappyCLI-B_0RWxD4.mjs} +1 -1
- package/dist/{spawnHappyCLI-ahi4j6Mh.cjs → spawnHappyCLI-ChniczJ5.cjs} +1 -1
- package/dist/{specialCommands-BpqnGrOP.cjs → specialCommands-DbntVs0d.cjs} +3 -3
- package/dist/{specialCommands-DfVMGXTl.mjs → specialCommands-DkdFJi4N.mjs} +3 -3
- package/dist/{startFileWatcher-Ddn3L0u3.cjs → startFileWatcher-C292fhra.cjs} +1 -1
- package/dist/{startFileWatcher-DXJXY4AE.mjs → startFileWatcher-UQyTSRAP.mjs} +1 -1
- package/dist/{sync-BKvgkhPs.mjs → sync-C3p7-KLn.mjs} +1 -1
- package/dist/{sync-BgZuthoS.cjs → sync-C7sxoUYG.cjs} +1 -1
- package/dist/{systemPrompt-DuPem6c9.mjs → systemPrompt-CdHOlyVW.mjs} +1 -1
- package/dist/{systemPrompt-C6O1cHUg.cjs → systemPrompt-DtibzbRU.cjs} +1 -1
- package/dist/{teams-DifEhhmk.cjs → teams-D7O7TpVU.cjs} +6 -6
- package/dist/{teams-CffMBBfU.mjs → teams-ujXr3AFn.mjs} +6 -6
- package/dist/{time-s8CaneqW.cjs → time-Dg5tVB8S.cjs} +1 -1
- package/dist/{time-DxCTiteK.mjs → time-yEL6wHUF.mjs} +1 -1
- package/dist/{titleGenerator-CXr7t6cf.cjs → titleGenerator-BMEaDTwU.cjs} +2 -2
- package/dist/{titleGenerator-B5T7QSzu.mjs → titleGenerator-Dr-BtjzO.mjs} +1 -1
- package/dist/{todo-B41GKMcI.cjs → todo-CUcFamGs.cjs} +5 -5
- package/dist/{todo-DNO7s8td.mjs → todo-CvJe4M2C.mjs} +5 -5
- package/dist/{tools-697R1uqn.mjs → tools-BrM3bZW5.mjs} +1 -1
- package/dist/{tools-lotMyxIE.cjs → tools-DDKTB5aQ.cjs} +1 -1
- package/dist/{uninstall-CRu96len.cjs → uninstall-7oLuhYIu.cjs} +3 -3
- package/dist/{uninstall-CYO7EDjO.mjs → uninstall-CEcMMQGz.mjs} +3 -3
- package/package.json +7 -7
- package/dist/selfCheck-ClVv8NK3.mjs +0 -84
|
@@ -4,26 +4,26 @@ 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 api = require('./api-
|
|
8
|
-
var logger = require('./logger-
|
|
9
|
-
var persistence = require('./persistence-
|
|
10
|
-
var createSessionMetadata = require('./createSessionMetadata-
|
|
7
|
+
var api = require('./api-BWX10o97.cjs');
|
|
8
|
+
var logger = require('./logger-LvwVeATU.cjs');
|
|
9
|
+
var persistence = require('./persistence-DXbKOHxl.cjs');
|
|
10
|
+
var createSessionMetadata = require('./createSessionMetadata-BCFmYlBo.cjs');
|
|
11
11
|
var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
12
|
-
var machineMetadata = require('./machineMetadata-
|
|
13
|
-
var registerKillSessionHandler = require('./registerKillSessionHandler-
|
|
14
|
-
var deterministicJson = require('./deterministicJson-
|
|
12
|
+
var machineMetadata = require('./machineMetadata-29h7vgf4.cjs');
|
|
13
|
+
var registerKillSessionHandler = require('./registerKillSessionHandler-pqChBKwO.cjs');
|
|
14
|
+
var deterministicJson = require('./deterministicJson-ChGfQEF6.cjs');
|
|
15
15
|
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
16
16
|
var messageBuffer = require('./messageBuffer-fJMH6uY8.cjs');
|
|
17
|
-
var controlClient = require('./controlClient-
|
|
17
|
+
var controlClient = require('./controlClient-SX8gSza2.cjs');
|
|
18
18
|
var authRelay = require('./authRelay-BdYkC1Po.cjs');
|
|
19
|
-
var setupOfflineReconnection = require('./setupOfflineReconnection-
|
|
20
|
-
var AcpBackend = require('./AcpBackend-
|
|
19
|
+
var setupOfflineReconnection = require('./setupOfflineReconnection-DVA0VpQL.cjs');
|
|
20
|
+
var AcpBackend = require('./AcpBackend-B-ny68XM.cjs');
|
|
21
21
|
var constants = require('./constants-VJ0N6WuG.cjs');
|
|
22
|
-
var config = require('./config-
|
|
23
|
-
var BasePermissionHandler = require('./BasePermissionHandler-
|
|
24
|
-
var
|
|
22
|
+
var config = require('./config-DhdrvOLV.cjs');
|
|
23
|
+
var BasePermissionHandler = require('./BasePermissionHandler-DR6nxuEn.cjs');
|
|
24
|
+
var codexTermination = require('./codexTermination-BBU7e92y.cjs');
|
|
25
25
|
require('axios');
|
|
26
|
-
require('./lidState-
|
|
26
|
+
require('./lidState-DxbK0qfu.cjs');
|
|
27
27
|
require('os');
|
|
28
28
|
require('child_process');
|
|
29
29
|
require('node:events');
|
|
@@ -33,52 +33,53 @@ require('zod');
|
|
|
33
33
|
require('./index-De8L5lFK.cjs');
|
|
34
34
|
require('@paralleldrive/cuid2');
|
|
35
35
|
require('./limits-C-a7gr04.cjs');
|
|
36
|
-
require('./time-
|
|
37
|
-
require('./configuration-
|
|
36
|
+
require('./time-Dg5tVB8S.cjs');
|
|
37
|
+
require('./configuration-DZPy0T9Z.cjs');
|
|
38
38
|
require('node:fs');
|
|
39
39
|
require('node:os');
|
|
40
|
-
require('./package-
|
|
40
|
+
require('./package-Ch9WGDV_.cjs');
|
|
41
41
|
require('node:fs/promises');
|
|
42
|
-
require('./registerCommonHandlers-
|
|
42
|
+
require('./registerCommonHandlers-60VuTkdg.cjs');
|
|
43
43
|
require('util');
|
|
44
44
|
require('fs/promises');
|
|
45
45
|
require('crypto');
|
|
46
46
|
require('path');
|
|
47
47
|
require('cross-spawn');
|
|
48
|
-
require('./sync-
|
|
48
|
+
require('./sync-C7sxoUYG.cjs');
|
|
49
49
|
require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
50
50
|
require('chalk');
|
|
51
51
|
require('node:util');
|
|
52
52
|
require('./detectCLI-DR9ZaN6B.cjs');
|
|
53
53
|
require('fs');
|
|
54
|
-
require('./localHappyAgentAuth-
|
|
54
|
+
require('./localHappyAgentAuth-D5tANdRD.cjs');
|
|
55
55
|
require('tweetnacl');
|
|
56
56
|
require('./types-CRS-srZK.cjs');
|
|
57
|
-
require('./client-
|
|
58
|
-
require('./context-
|
|
59
|
-
require('./sessionOps-
|
|
57
|
+
require('./client-DyvBTYee.cjs');
|
|
58
|
+
require('./context-BKbrZ55r.cjs');
|
|
59
|
+
require('./sessionOps-Dmt7WUUs.cjs');
|
|
60
60
|
require('./resources-JDPugcDq.cjs');
|
|
61
|
-
require('./tools-
|
|
62
|
-
require('./reportProgressTool-
|
|
63
|
-
require('./client-
|
|
61
|
+
require('./tools-DDKTB5aQ.cjs');
|
|
62
|
+
require('./reportProgressTool-Du_zAK4h.cjs');
|
|
63
|
+
require('./client-COmgDDy0.cjs');
|
|
64
64
|
require('./precheckCompat-CWOi5c9L.cjs');
|
|
65
65
|
require('./agentGuidance-BtBx2xxE.cjs');
|
|
66
66
|
require('./trimIdent-4gvk9Wk6.cjs');
|
|
67
|
-
require('./peerTools-
|
|
67
|
+
require('./peerTools-DtGKWli5.cjs');
|
|
68
68
|
require('./ids-B6ZC0HGt.cjs');
|
|
69
|
-
require('./remoteSessionClient-
|
|
69
|
+
require('./remoteSessionClient-B7NvjHD3.cjs');
|
|
70
70
|
require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
71
71
|
require('node:http');
|
|
72
72
|
require('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
73
|
-
require('./downloadTarget-
|
|
73
|
+
require('./downloadTarget-Dj3WoVJa.cjs');
|
|
74
74
|
require('./terminals-B_bfC9c2.cjs');
|
|
75
75
|
require('node:child_process');
|
|
76
76
|
require('./terminalTitleSuggest-DhvRFX3H.cjs');
|
|
77
77
|
require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
78
|
-
require('./bootstrap-
|
|
78
|
+
require('./bootstrap-6OI698q9.cjs');
|
|
79
79
|
require('./previewPath-B0rBdhy1.cjs');
|
|
80
80
|
require('url');
|
|
81
81
|
require('@agentclientprotocol/sdk');
|
|
82
|
+
require('./processTree-CMHWlVse.cjs');
|
|
82
83
|
|
|
83
84
|
const GEMINI_TIMEOUTS = {
|
|
84
85
|
/** Gemini CLI can be slow on first start (downloading models, etc.) */
|
|
@@ -602,7 +603,7 @@ class GeminiPermissionHandler extends BasePermissionHandler.BasePermissionHandle
|
|
|
602
603
|
}
|
|
603
604
|
}
|
|
604
605
|
|
|
605
|
-
class GeminiReasoningProcessor extends
|
|
606
|
+
class GeminiReasoningProcessor extends codexTermination.BaseReasoningProcessor {
|
|
606
607
|
getToolName() {
|
|
607
608
|
return "GeminiReasoning";
|
|
608
609
|
}
|
|
@@ -893,6 +894,74 @@ ${formattedMessages}
|
|
|
893
894
|
}
|
|
894
895
|
}
|
|
895
896
|
|
|
897
|
+
function factsOf(error) {
|
|
898
|
+
if (error instanceof Error) {
|
|
899
|
+
const record = error;
|
|
900
|
+
const details = typeof record.data?.details === "string" ? record.data.details : typeof record.details === "string" ? record.details : "";
|
|
901
|
+
return { code: record.code, details, message: error.message, whole: `${details} ${error.message}`, empty: false };
|
|
902
|
+
}
|
|
903
|
+
if (error && typeof error === "object") {
|
|
904
|
+
const record = error;
|
|
905
|
+
const details = typeof record.data?.details === "string" ? record.data.details : typeof record.details === "string" ? record.details : "";
|
|
906
|
+
const message = typeof record.message === "string" ? record.message : typeof record.error?.message === "string" ? record.error.message : "";
|
|
907
|
+
let whole = `${details} ${message}`;
|
|
908
|
+
try {
|
|
909
|
+
whole += ` ${JSON.stringify(error)}`;
|
|
910
|
+
} catch {
|
|
911
|
+
}
|
|
912
|
+
return { code: record.code ?? record.status ?? record.response?.status, details, message, whole, empty: Object.keys(error).length === 0 };
|
|
913
|
+
}
|
|
914
|
+
return { code: void 0, details: "", message: String(error), whole: String(error), empty: false };
|
|
915
|
+
}
|
|
916
|
+
function quotaResetSuffix(text) {
|
|
917
|
+
const match = text.match(/reset after (\d+h)?(\d+m)?(\d+s)?/i);
|
|
918
|
+
if (!match) return "";
|
|
919
|
+
const parts = match.slice(1).filter(Boolean).join("");
|
|
920
|
+
return parts ? ` Quota resets in ${parts}.` : "";
|
|
921
|
+
}
|
|
922
|
+
const EMPTY_RESPONSE = /empty response|Model stream ended/i;
|
|
923
|
+
const TRANSIENT = /overloaded|UNAVAILABLE|\b503\b|ECONNRESET|socket hang up|ETIMEDOUT/i;
|
|
924
|
+
function isRetryableGeminiError(error) {
|
|
925
|
+
if (AcpBackend.isAgentExitError(error)) return false;
|
|
926
|
+
const facts = factsOf(error);
|
|
927
|
+
if (/exhausted|quota|capacity/i.test(facts.whole)) return false;
|
|
928
|
+
return EMPTY_RESPONSE.test(facts.whole) || TRANSIENT.test(facts.whole);
|
|
929
|
+
}
|
|
930
|
+
function describeGeminiFailure(error, ctx) {
|
|
931
|
+
if (AcpBackend.isAgentExitError(error)) {
|
|
932
|
+
return { kind: "exited", message: `Process exited unexpectedly: ${error.message}` };
|
|
933
|
+
}
|
|
934
|
+
const f = factsOf(error);
|
|
935
|
+
if (f.code === 404 || /notFound|\b404\b/.test(f.details) || /not found|\b404\b/.test(f.message)) {
|
|
936
|
+
return { kind: "not-found", message: `Gemini error: model "${ctx.model}" not found. Available models: gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite` };
|
|
937
|
+
}
|
|
938
|
+
if (EMPTY_RESPONSE.test(f.whole)) {
|
|
939
|
+
return { kind: "empty", message: "Gemini error: the API returned an empty response after retries. This is usually temporary \u2014 please try again." };
|
|
940
|
+
}
|
|
941
|
+
if (f.code === 429 || /\b429\b|rateLimitExceeded|RESOURCE_EXHAUSTED|Rate limit exceeded|Resource exhausted/i.test(f.whole)) {
|
|
942
|
+
return { kind: "rate-limit", message: "Gemini error: API rate limit exceeded. Please wait a moment and try again." };
|
|
943
|
+
}
|
|
944
|
+
if (/quota|exhausted|capacity/i.test(f.whole)) {
|
|
945
|
+
return { kind: "quota", message: `Gemini error: quota exceeded.${quotaResetSuffix(f.whole)} Try another model (gemini-2.5-flash-lite) or wait for the quota to reset.` };
|
|
946
|
+
}
|
|
947
|
+
if (f.code === -32e3 || /Authentication required/i.test(f.whole)) {
|
|
948
|
+
return {
|
|
949
|
+
kind: "auth",
|
|
950
|
+
message: "Gemini error: authentication required. For Google Workspace accounts set a Google Cloud project: `very-happy gemini project set <your-project-id>`; or use another Google account: `very-happy connect gemini`. Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca"
|
|
951
|
+
};
|
|
952
|
+
}
|
|
953
|
+
if (f.empty) {
|
|
954
|
+
return { kind: "not-installed", message: 'Gemini error: failed to start Gemini. Is the "gemini" CLI installed? Run: npm install -g @google/gemini-cli' };
|
|
955
|
+
}
|
|
956
|
+
const text = (f.details || f.message || "process error occurred").replace(/\s+/g, " ").trim();
|
|
957
|
+
return { kind: "other", message: `Gemini error: ${text.length > 400 ? `${text.slice(0, 399)}\u2026` : text}` };
|
|
958
|
+
}
|
|
959
|
+
function describeGeminiRetry(attempt, maxAttempts, error) {
|
|
960
|
+
const f = factsOf(error);
|
|
961
|
+
const why = EMPTY_RESPONSE.test(f.whole) ? "an empty response" : "a transient API error";
|
|
962
|
+
return `Gemini is retrying after ${why} (attempt ${attempt}/${maxAttempts})`;
|
|
963
|
+
}
|
|
964
|
+
|
|
896
965
|
async function runGemini(opts) {
|
|
897
966
|
const sessionTag = node_crypto.randomUUID();
|
|
898
967
|
api.connectionState.setBackend("Gemini");
|
|
@@ -1097,8 +1166,12 @@ async function runGemini(opts) {
|
|
|
1097
1166
|
let geminiBackend = null;
|
|
1098
1167
|
let acpSessionId = null;
|
|
1099
1168
|
let wasSessionCreated = false;
|
|
1169
|
+
let turnEnding = "completed";
|
|
1170
|
+
const turnAborted = () => turnEnding === "aborted";
|
|
1171
|
+
let backendGone = null;
|
|
1100
1172
|
async function handleAbort() {
|
|
1101
1173
|
logger.logger.debug("[Gemini] Abort requested - stopping current task");
|
|
1174
|
+
turnEnding = "aborted";
|
|
1102
1175
|
session.sendAgentMessage("gemini", {
|
|
1103
1176
|
type: "turn_aborted",
|
|
1104
1177
|
id: node_crypto.randomUUID()
|
|
@@ -1106,6 +1179,7 @@ async function runGemini(opts) {
|
|
|
1106
1179
|
reasoningProcessor.abort();
|
|
1107
1180
|
diffProcessor.reset();
|
|
1108
1181
|
try {
|
|
1182
|
+
permissionHandler.abortAll();
|
|
1109
1183
|
abortController.abort();
|
|
1110
1184
|
messageQueue.reset();
|
|
1111
1185
|
if (geminiBackend && acpSessionId) {
|
|
@@ -1118,22 +1192,13 @@ async function runGemini(opts) {
|
|
|
1118
1192
|
abortController = new AbortController();
|
|
1119
1193
|
}
|
|
1120
1194
|
}
|
|
1121
|
-
const handleKillSession = async () => {
|
|
1122
|
-
logger.logger.debug(
|
|
1195
|
+
const handleKillSession = async (intent = "archive") => {
|
|
1196
|
+
logger.logger.debug(`[Gemini] Kill session requested (${intent}) - terminating process`);
|
|
1123
1197
|
await handleAbort();
|
|
1124
1198
|
logger.logger.debug("[Gemini] Abort completed, proceeding with termination");
|
|
1125
1199
|
try {
|
|
1126
1200
|
if (session) {
|
|
1127
|
-
session.
|
|
1128
|
-
...currentMetadata,
|
|
1129
|
-
lifecycleState: "archived",
|
|
1130
|
-
lifecycleStateSince: Date.now(),
|
|
1131
|
-
archivedBy: "cli",
|
|
1132
|
-
archiveReason: "User terminated"
|
|
1133
|
-
}));
|
|
1134
|
-
session.sendSessionDeath();
|
|
1135
|
-
await session.flush();
|
|
1136
|
-
await session.close();
|
|
1201
|
+
await codexTermination.settleCodexSession(session, intent, (id) => api$1.deactivateSession(id), (m, e) => logger.logger.debug(m, e));
|
|
1137
1202
|
}
|
|
1138
1203
|
happyServer.stop();
|
|
1139
1204
|
if (geminiBackend) {
|
|
@@ -1147,7 +1212,7 @@ async function runGemini(opts) {
|
|
|
1147
1212
|
}
|
|
1148
1213
|
};
|
|
1149
1214
|
session.rpcHandlerManager.registerHandler("abort", handleAbort);
|
|
1150
|
-
registerKillSessionHandler.registerKillSessionHandler(session.rpcHandlerManager, handleKillSession, session);
|
|
1215
|
+
registerKillSessionHandler.registerKillSessionHandler(session.rpcHandlerManager, () => handleKillSession("archive"), session, { processSignals: true, onSignal: () => handleKillSession("offline") });
|
|
1151
1216
|
const messageBuffer$1 = new messageBuffer.MessageBuffer();
|
|
1152
1217
|
const hasTTY = process.stdout.isTTY && process.stdin.isTTY;
|
|
1153
1218
|
let inkInstance = null;
|
|
@@ -1250,10 +1315,9 @@ async function runGemini(opts) {
|
|
|
1250
1315
|
});
|
|
1251
1316
|
if (msg.status === "error") {
|
|
1252
1317
|
logger.logger.debug("[gemini] Error status received:", contentLogMetadata.contentLogMetadata(statusDetail));
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
});
|
|
1318
|
+
}
|
|
1319
|
+
if (msg.status === "stopped") {
|
|
1320
|
+
backendGone = new Error(statusDetail || "gemini process exited");
|
|
1257
1321
|
}
|
|
1258
1322
|
if (msg.status === "running") {
|
|
1259
1323
|
thinking = true;
|
|
@@ -1268,31 +1332,6 @@ async function runGemini(opts) {
|
|
|
1268
1332
|
messageBuffer$1.addMessage("Thinking...", "system");
|
|
1269
1333
|
} else if (msg.status === "idle" || msg.status === "stopped") {
|
|
1270
1334
|
reasoningProcessor.complete();
|
|
1271
|
-
} else if (msg.status === "error") {
|
|
1272
|
-
thinking = false;
|
|
1273
|
-
session.keepAlive(thinking, "remote");
|
|
1274
|
-
accumulatedResponse = "";
|
|
1275
|
-
isResponseInProgress = false;
|
|
1276
|
-
let errorMessage = "Unknown error";
|
|
1277
|
-
if (msg.detail) {
|
|
1278
|
-
if (typeof msg.detail === "object") {
|
|
1279
|
-
const detailObj = msg.detail;
|
|
1280
|
-
errorMessage = detailObj.message || detailObj.details || JSON.stringify(detailObj);
|
|
1281
|
-
} else {
|
|
1282
|
-
errorMessage = String(msg.detail);
|
|
1283
|
-
}
|
|
1284
|
-
}
|
|
1285
|
-
if (errorMessage.includes("Authentication required")) {
|
|
1286
|
-
errorMessage = `Authentication required.
|
|
1287
|
-
For Google Workspace accounts, run: very-happy gemini project set <project-id>
|
|
1288
|
-
Or use a different Google account: very-happy connect gemini
|
|
1289
|
-
Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
1290
|
-
}
|
|
1291
|
-
messageBuffer$1.addMessage(`Error: ${errorMessage}`, "status");
|
|
1292
|
-
session.sendAgentMessage("gemini", {
|
|
1293
|
-
type: "message",
|
|
1294
|
-
message: `Error: ${errorMessage}`
|
|
1295
|
-
});
|
|
1296
1335
|
}
|
|
1297
1336
|
break;
|
|
1298
1337
|
case "tool-call":
|
|
@@ -1485,55 +1524,68 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1485
1524
|
if (!message) {
|
|
1486
1525
|
break;
|
|
1487
1526
|
}
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
messageBuffer$1.addMessage("\u2550".repeat(40), "status");
|
|
1492
|
-
if (conversationHistory.hasHistory()) {
|
|
1493
|
-
messageBuffer$1.addMessage(`Switching model (preserving ${conversationHistory.size()} messages of context)...`, "status");
|
|
1494
|
-
injectHistoryContext = true;
|
|
1495
|
-
logger.logger.debug("[Gemini] Will inject conversation history");
|
|
1496
|
-
} else {
|
|
1497
|
-
messageBuffer$1.addMessage("Starting new Gemini session (mode changed)...", "status");
|
|
1498
|
-
}
|
|
1499
|
-
permissionHandler.reset();
|
|
1500
|
-
reasoningProcessor.abort();
|
|
1501
|
-
if (geminiBackend) {
|
|
1502
|
-
await geminiBackend.dispose();
|
|
1503
|
-
geminiBackend = null;
|
|
1504
|
-
}
|
|
1505
|
-
const modelToUse = message.mode?.model === void 0 ? void 0 : message.mode.model || null;
|
|
1506
|
-
const backendResult = createGeminiBackend({
|
|
1507
|
-
cwd: process.cwd(),
|
|
1508
|
-
mcpServers,
|
|
1509
|
-
permissionHandler,
|
|
1510
|
-
cloudToken,
|
|
1511
|
-
currentUserEmail,
|
|
1512
|
-
// Pass model from message - if undefined, will use local config/env/default
|
|
1513
|
-
// If explicitly null, will skip local config and use env/default
|
|
1514
|
-
model: modelToUse
|
|
1515
|
-
});
|
|
1516
|
-
geminiBackend = backendResult.backend;
|
|
1517
|
-
setupGeminiMessageHandler(geminiBackend);
|
|
1518
|
-
const actualModel = backendResult.model;
|
|
1519
|
-
logger.logger.debug(`[gemini] Model change - modelToUse=${modelToUse}, actualModel=${actualModel} (from ${backendResult.modelSource})`);
|
|
1520
|
-
conversationHistory.setCurrentModel(actualModel);
|
|
1521
|
-
logger.logger.debug("[gemini] Starting new ACP session with model:", actualModel);
|
|
1522
|
-
const { sessionId } = await geminiBackend.startSession();
|
|
1523
|
-
acpSessionId = sessionId;
|
|
1524
|
-
logger.logger.debug(`[gemini] New ACP session started: ${acpSessionId}`);
|
|
1525
|
-
logger.logger.debug(`[gemini] Calling updateDisplayedModel with: ${actualModel}`);
|
|
1526
|
-
updateDisplayedModel(actualModel, false);
|
|
1527
|
-
updatePermissionMode(message.mode.permissionMode);
|
|
1528
|
-
wasSessionCreated = true;
|
|
1529
|
-
currentModeHash = message.hash;
|
|
1530
|
-
first = false;
|
|
1527
|
+
if (!thinking) {
|
|
1528
|
+
thinking = true;
|
|
1529
|
+
session.keepAlive(thinking, "remote");
|
|
1531
1530
|
}
|
|
1531
|
+
turnEnding = "completed";
|
|
1532
|
+
let injectHistoryContext = false;
|
|
1533
|
+
let restartAfterExit = false;
|
|
1532
1534
|
currentModeHash = message.hash;
|
|
1533
1535
|
const userMessageToShow = message.mode?.originalUserMessage || message.message;
|
|
1534
1536
|
messageBuffer$1.addMessage(userMessageToShow, "user");
|
|
1535
1537
|
isProcessingMessage = true;
|
|
1536
1538
|
try {
|
|
1539
|
+
restartAfterExit = backendGone !== null;
|
|
1540
|
+
if (restartAfterExit) {
|
|
1541
|
+
logger.logger.debug(`[Gemini] Restarting Gemini after it exited: ${backendGone?.message ?? "unknown"}`);
|
|
1542
|
+
backendGone = null;
|
|
1543
|
+
session.sendSessionEvent({ type: "message", message: `Gemini was restarted after its process exited; the conversation so far is re-sent to it as context.` });
|
|
1544
|
+
}
|
|
1545
|
+
if (restartAfterExit || wasSessionCreated && currentModeHash && message.hash !== currentModeHash) {
|
|
1546
|
+
logger.logger.debug("[Gemini] Mode changed or process gone \u2013 restarting Gemini session");
|
|
1547
|
+
messageBuffer$1.addMessage("\u2550".repeat(40), "status");
|
|
1548
|
+
if (conversationHistory.hasHistory()) {
|
|
1549
|
+
messageBuffer$1.addMessage(`${restartAfterExit ? "Restarting Gemini" : "Switching model"} (preserving ${conversationHistory.size()} messages of context)...`, "status");
|
|
1550
|
+
injectHistoryContext = true;
|
|
1551
|
+
logger.logger.debug("[Gemini] Will inject conversation history");
|
|
1552
|
+
} else {
|
|
1553
|
+
messageBuffer$1.addMessage(restartAfterExit ? "Restarting Gemini..." : "Starting new Gemini session (mode changed)...", "status");
|
|
1554
|
+
}
|
|
1555
|
+
permissionHandler.reset();
|
|
1556
|
+
reasoningProcessor.abort();
|
|
1557
|
+
if (geminiBackend) {
|
|
1558
|
+
await geminiBackend.dispose();
|
|
1559
|
+
geminiBackend = null;
|
|
1560
|
+
}
|
|
1561
|
+
acpSessionId = null;
|
|
1562
|
+
const modelToUse = message.mode?.model === void 0 ? void 0 : message.mode.model || null;
|
|
1563
|
+
const backendResult = createGeminiBackend({
|
|
1564
|
+
cwd: process.cwd(),
|
|
1565
|
+
mcpServers,
|
|
1566
|
+
permissionHandler,
|
|
1567
|
+
cloudToken,
|
|
1568
|
+
currentUserEmail,
|
|
1569
|
+
// Pass model from message - if undefined, will use local config/env/default
|
|
1570
|
+
// If explicitly null, will skip local config and use env/default
|
|
1571
|
+
model: modelToUse
|
|
1572
|
+
});
|
|
1573
|
+
geminiBackend = backendResult.backend;
|
|
1574
|
+
setupGeminiMessageHandler(geminiBackend);
|
|
1575
|
+
const actualModel = backendResult.model;
|
|
1576
|
+
logger.logger.debug(`[gemini] Model change - modelToUse=${modelToUse}, actualModel=${actualModel} (from ${backendResult.modelSource})`);
|
|
1577
|
+
conversationHistory.setCurrentModel(actualModel);
|
|
1578
|
+
logger.logger.debug("[gemini] Starting new ACP session with model:", actualModel);
|
|
1579
|
+
const { sessionId } = await geminiBackend.startSession();
|
|
1580
|
+
acpSessionId = sessionId;
|
|
1581
|
+
logger.logger.debug(`[gemini] New ACP session started: ${acpSessionId}`);
|
|
1582
|
+
logger.logger.debug(`[gemini] Calling updateDisplayedModel with: ${actualModel}`);
|
|
1583
|
+
updateDisplayedModel(actualModel, false);
|
|
1584
|
+
updatePermissionMode(message.mode.permissionMode);
|
|
1585
|
+
wasSessionCreated = true;
|
|
1586
|
+
currentModeHash = message.hash;
|
|
1587
|
+
first = false;
|
|
1588
|
+
}
|
|
1537
1589
|
if (first || !wasSessionCreated) {
|
|
1538
1590
|
if (!geminiBackend) {
|
|
1539
1591
|
const modelToUse = message.mode?.model === void 0 ? void 0 : message.mode.model || null;
|
|
@@ -1587,49 +1639,37 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1587
1639
|
logger.logger.debug("[gemini] Sending prompt to Gemini:", contentLogMetadata.contentLogMetadata(promptToSend));
|
|
1588
1640
|
const MAX_RETRIES = 3;
|
|
1589
1641
|
const RETRY_DELAY_MS = 2e3;
|
|
1590
|
-
let lastError = null;
|
|
1591
1642
|
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
1592
1643
|
try {
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1644
|
+
accumulatedResponse = "";
|
|
1645
|
+
isResponseInProgress = false;
|
|
1646
|
+
const outcome = await geminiBackend.sendPrompt(acpSessionId, promptToSend);
|
|
1647
|
+
const stopReason = outcome && typeof outcome === "object" ? outcome.stopReason : void 0;
|
|
1648
|
+
logger.logger.debug(`[gemini] Prompt answered (stopReason=${stopReason ?? "none"})`);
|
|
1649
|
+
if (stopReason === "cancelled") {
|
|
1650
|
+
if (!turnAborted()) {
|
|
1651
|
+
turnEnding = "aborted";
|
|
1652
|
+
session.sendAgentMessage("gemini", { type: "turn_aborted", id: node_crypto.randomUUID() });
|
|
1653
|
+
}
|
|
1654
|
+
} else if (stopReason === "error") {
|
|
1655
|
+
throw new Error("the turn ended with an error reported by the agent");
|
|
1656
|
+
} else if (stopReason && stopReason !== "end_turn") {
|
|
1657
|
+
session.sendSessionEvent({ type: "message", message: `Gemini stopped the turn: ${stopReason}` });
|
|
1598
1658
|
}
|
|
1599
1659
|
break;
|
|
1600
1660
|
} catch (promptError) {
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
if (isQuotaError) {
|
|
1607
|
-
const resetTimeMatch = errorDetails.match(/reset after (\d+h)?(\d+m)?(\d+s)?/i);
|
|
1608
|
-
let resetTimeMsg = "";
|
|
1609
|
-
if (resetTimeMatch) {
|
|
1610
|
-
const parts = resetTimeMatch.slice(1).filter(Boolean).join("");
|
|
1611
|
-
resetTimeMsg = ` Quota resets in ${parts}.`;
|
|
1612
|
-
}
|
|
1613
|
-
const quotaMsg = `Gemini quota exceeded.${resetTimeMsg} Try using a different model (gemini-2.5-flash-lite) or wait for quota reset.`;
|
|
1614
|
-
messageBuffer$1.addMessage(quotaMsg, "status");
|
|
1615
|
-
session.sendAgentMessage("gemini", { type: "message", message: quotaMsg });
|
|
1616
|
-
throw promptError;
|
|
1617
|
-
}
|
|
1618
|
-
const isEmptyResponseError = errorDetails.includes("empty response") || errorDetails.includes("Model stream ended");
|
|
1619
|
-
const isInternalError = errorCode === -32603;
|
|
1620
|
-
const isRetryable = isEmptyResponseError || isInternalError;
|
|
1621
|
-
if (isRetryable && attempt < MAX_RETRIES) {
|
|
1622
|
-
logger.logger.debug(`[gemini] Retryable error on attempt ${attempt}/${MAX_RETRIES}:`, contentLogMetadata.contentLogMetadata(errorDetails));
|
|
1623
|
-
messageBuffer$1.addMessage(`Gemini returned empty response, retrying (${attempt}/${MAX_RETRIES})...`, "status");
|
|
1661
|
+
if (isRetryableGeminiError(promptError) && attempt < MAX_RETRIES) {
|
|
1662
|
+
const notice = describeGeminiRetry(attempt, MAX_RETRIES, promptError);
|
|
1663
|
+
logger.logger.debug(`[gemini] Retryable error on attempt ${attempt}/${MAX_RETRIES}:`, contentLogMetadata.errorLogMetadata(promptError));
|
|
1664
|
+
messageBuffer$1.addMessage(notice, "status");
|
|
1665
|
+
session.sendSessionEvent({ type: "message", message: notice });
|
|
1624
1666
|
await new Promise((resolve2) => setTimeout(resolve2, RETRY_DELAY_MS * attempt));
|
|
1667
|
+
if (turnAborted()) throw promptError;
|
|
1625
1668
|
continue;
|
|
1626
1669
|
}
|
|
1627
1670
|
throw promptError;
|
|
1628
1671
|
}
|
|
1629
1672
|
}
|
|
1630
|
-
if (lastError && MAX_RETRIES > 1) {
|
|
1631
|
-
logger.logger.debug("[gemini] Prompt succeeded after retries");
|
|
1632
|
-
}
|
|
1633
1673
|
if (first) {
|
|
1634
1674
|
first = false;
|
|
1635
1675
|
}
|
|
@@ -1637,49 +1677,22 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1637
1677
|
logger.logger.debug("[gemini] Error in gemini session:", contentLogMetadata.errorLogMetadata(error));
|
|
1638
1678
|
const isAbortError = error instanceof Error && error.name === "AbortError";
|
|
1639
1679
|
if (isAbortError) {
|
|
1680
|
+
turnEnding = "aborted";
|
|
1640
1681
|
messageBuffer$1.addMessage("Aborted by user", "status");
|
|
1641
1682
|
session.sendSessionEvent({ type: "message", message: "Aborted by user" });
|
|
1642
1683
|
} else {
|
|
1643
|
-
|
|
1644
|
-
if (
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
errorMsg = "Gemini API returned empty response after retries. This is a temporary issue - please try again.";
|
|
1655
|
-
} else if (errorCode === 429 || errorDetails.includes("429") || errorMessage.includes("429") || errorString.includes("429") || errorDetails.includes("rateLimitExceeded") || errorDetails.includes("RESOURCE_EXHAUSTED") || errorMessage.includes("Rate limit exceeded") || errorMessage.includes("Resource exhausted") || errorString.includes("rateLimitExceeded") || errorString.includes("RESOURCE_EXHAUSTED")) {
|
|
1656
|
-
errorMsg = "Gemini API rate limit exceeded. Please wait a moment and try again. The API will retry automatically.";
|
|
1657
|
-
} else if (errorDetails.includes("quota") || errorMessage.includes("quota") || errorString.includes("quota") || errorDetails.includes("exhausted") || errorDetails.includes("capacity")) {
|
|
1658
|
-
const resetTimeMatch = (errorDetails + errorMessage + errorString).match(/reset after (\d+h)?(\d+m)?(\d+s)?/i);
|
|
1659
|
-
let resetTimeMsg = "";
|
|
1660
|
-
if (resetTimeMatch) {
|
|
1661
|
-
const parts = resetTimeMatch.slice(1).filter(Boolean).join("");
|
|
1662
|
-
resetTimeMsg = ` Quota resets in ${parts}.`;
|
|
1663
|
-
}
|
|
1664
|
-
errorMsg = `Gemini quota exceeded.${resetTimeMsg} Try using a different model (gemini-2.5-flash-lite) or wait for quota reset.`;
|
|
1665
|
-
} else if (errorMessage.includes("Authentication required") || errorDetails.includes("Authentication required") || errorCode === -32e3) {
|
|
1666
|
-
errorMsg = `Authentication required. For Google Workspace accounts, you need to set a Google Cloud Project:
|
|
1667
|
-
very-happy gemini project set <your-project-id>
|
|
1668
|
-
Or use a different Google account: very-happy connect gemini
|
|
1669
|
-
Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
1670
|
-
} else if (Object.keys(error).length === 0) {
|
|
1671
|
-
errorMsg = 'Failed to start Gemini. Is "gemini" CLI installed? Run: npm install -g @google/gemini-cli';
|
|
1672
|
-
} else if (errObj.message || errorMessage) {
|
|
1673
|
-
errorMsg = errorDetails || errorMessage || errObj.message;
|
|
1674
|
-
}
|
|
1675
|
-
} else if (error instanceof Error) {
|
|
1676
|
-
errorMsg = error.message;
|
|
1684
|
+
const failure = describeGeminiFailure(error, { model: displayedModel || "gemini-2.5-pro" });
|
|
1685
|
+
if (failure.kind === "exited" && error instanceof Error) {
|
|
1686
|
+
backendGone = error;
|
|
1687
|
+
} else if (restartAfterExit && !acpSessionId && error instanceof Error) {
|
|
1688
|
+
backendGone = error;
|
|
1689
|
+
}
|
|
1690
|
+
messageBuffer$1.addMessage(failure.message, "status");
|
|
1691
|
+
session.sendSessionEvent({ type: "message", message: failure.message });
|
|
1692
|
+
if (!turnAborted()) {
|
|
1693
|
+
turnEnding = "failed";
|
|
1694
|
+
session.sendAgentMessage("gemini", { type: "turn_aborted", id: node_crypto.randomUUID() });
|
|
1677
1695
|
}
|
|
1678
|
-
messageBuffer$1.addMessage(errorMsg, "status");
|
|
1679
|
-
session.sendAgentMessage("gemini", {
|
|
1680
|
-
type: "message",
|
|
1681
|
-
message: errorMsg
|
|
1682
|
-
});
|
|
1683
1696
|
}
|
|
1684
1697
|
} finally {
|
|
1685
1698
|
permissionHandler.reset();
|
|
@@ -1707,10 +1720,12 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
|
|
|
1707
1720
|
accumulatedResponse = "";
|
|
1708
1721
|
isResponseInProgress = false;
|
|
1709
1722
|
}
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1723
|
+
if (turnEnding === "completed") {
|
|
1724
|
+
session.sendAgentMessage("gemini", {
|
|
1725
|
+
type: "task_complete",
|
|
1726
|
+
id: node_crypto.randomUUID()
|
|
1727
|
+
});
|
|
1728
|
+
}
|
|
1714
1729
|
hadToolCallInTurn = false;
|
|
1715
1730
|
pendingChangeTitle = false;
|
|
1716
1731
|
changeTitleCompleted = false;
|