@google/gemini-cli 0.1.13 → 0.1.14
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/README.md +22 -1
- package/dist/google-gemini-cli-0.1.13.tgz +0 -0
- package/dist/package.json +6 -3
- package/dist/src/config/config.d.ts +3 -2
- package/dist/src/config/config.js +19 -29
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/settings.d.ts +6 -2
- package/dist/src/config/settings.js +25 -10
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/gemini.js +7 -21
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +1 -1
- package/dist/src/generated/git-commit.js +1 -1
- package/dist/src/patches/is-in-ci.d.ts +7 -0
- package/dist/src/patches/is-in-ci.js +15 -0
- package/dist/src/patches/is-in-ci.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.d.ts +24 -0
- package/dist/src/services/BuiltinCommandLoader.js +70 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -0
- package/dist/src/services/CommandService.d.ts +43 -7
- package/dist/src/services/CommandService.js +61 -56
- package/dist/src/services/CommandService.js.map +1 -1
- package/dist/src/services/FileCommandLoader.d.ts +37 -0
- package/dist/src/services/FileCommandLoader.js +156 -0
- package/dist/src/services/FileCommandLoader.js.map +1 -0
- package/dist/src/services/prompt-processors/argumentProcessor.d.ts +21 -0
- package/dist/src/services/prompt-processors/argumentProcessor.js +28 -0
- package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -0
- package/dist/src/services/prompt-processors/types.d.ts +34 -0
- package/dist/src/services/prompt-processors/types.js +10 -0
- package/dist/src/services/prompt-processors/types.js.map +1 -0
- package/dist/src/services/types.d.ts +22 -0
- package/dist/src/services/types.js +7 -0
- package/dist/src/services/types.js.map +1 -0
- package/dist/src/ui/App.js +15 -25
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/colors.js +6 -0
- package/dist/src/ui/colors.js.map +1 -1
- package/dist/src/ui/commands/aboutCommand.js +2 -0
- package/dist/src/ui/commands/aboutCommand.js.map +1 -1
- package/dist/src/ui/commands/authCommand.js +2 -0
- package/dist/src/ui/commands/authCommand.js.map +1 -1
- package/dist/src/ui/commands/bugCommand.js +2 -0
- package/dist/src/ui/commands/bugCommand.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +12 -2
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/clearCommand.js +2 -0
- package/dist/src/ui/commands/clearCommand.js.map +1 -1
- package/dist/src/ui/commands/compressCommand.js +3 -1
- package/dist/src/ui/commands/compressCommand.js.map +1 -1
- package/dist/src/ui/commands/copyCommand.d.ts +7 -0
- package/dist/src/ui/commands/copyCommand.js +59 -0
- package/dist/src/ui/commands/copyCommand.js.map +1 -0
- package/dist/src/ui/commands/corgiCommand.js +2 -0
- package/dist/src/ui/commands/corgiCommand.js.map +1 -1
- package/dist/src/ui/commands/docsCommand.js +2 -0
- package/dist/src/ui/commands/docsCommand.js.map +1 -1
- package/dist/src/ui/commands/editorCommand.js +2 -0
- package/dist/src/ui/commands/editorCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +2 -0
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/helpCommand.js +3 -1
- package/dist/src/ui/commands/helpCommand.js.map +1 -1
- package/dist/src/ui/commands/ideCommand.js +20 -22
- package/dist/src/ui/commands/ideCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +181 -5
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +11 -4
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/commands/privacyCommand.js +2 -0
- package/dist/src/ui/commands/privacyCommand.js.map +1 -1
- package/dist/src/ui/commands/quitCommand.js +3 -1
- package/dist/src/ui/commands/quitCommand.js.map +1 -1
- package/dist/src/ui/commands/restoreCommand.js +2 -0
- package/dist/src/ui/commands/restoreCommand.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.js +5 -1
- package/dist/src/ui/commands/statsCommand.js.map +1 -1
- package/dist/src/ui/commands/themeCommand.js +2 -0
- package/dist/src/ui/commands/themeCommand.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.js +2 -0
- package/dist/src/ui/commands/toolsCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +24 -3
- package/dist/src/ui/commands/types.js +5 -1
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/ContextSummaryDisplay.d.ts +2 -2
- package/dist/src/ui/components/ContextSummaryDisplay.js +12 -12
- package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/Footer.js +1 -1
- package/dist/src/ui/components/Help.d.ts +1 -1
- package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +11 -0
- package/dist/src/ui/components/IDEContextDetailDisplay.js +19 -0
- package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -0
- package/dist/src/ui/components/InputPrompt.d.ts +1 -1
- package/dist/src/ui/components/InputPrompt.js +9 -99
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.js +42 -17
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.d.ts +1 -0
- package/dist/src/ui/components/messages/DiffRenderer.js +12 -11
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +5 -4
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.d.ts +3 -1
- package/dist/src/ui/components/shared/text-buffer.js +10 -9
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +54 -15
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +22 -8
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +40 -10
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.js +2 -2
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useCompletion.d.ts +3 -1
- package/dist/src/ui/hooks/useCompletion.js +113 -24
- package/dist/src/ui/hooks/useCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +57 -11
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useInputHistory.d.ts +1 -1
- package/dist/src/ui/hooks/useShellHistory.d.ts +3 -2
- package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
- package/dist/src/ui/hooks/useThemeCommand.js +24 -23
- package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
- package/dist/src/ui/themes/ansi-light.js +2 -0
- package/dist/src/ui/themes/ansi-light.js.map +1 -1
- package/dist/src/ui/themes/ansi.js +2 -0
- package/dist/src/ui/themes/ansi.js.map +1 -1
- package/dist/src/ui/themes/atom-one-dark.js +2 -0
- package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
- package/dist/src/ui/themes/ayu-light.js +3 -1
- package/dist/src/ui/themes/ayu-light.js.map +1 -1
- package/dist/src/ui/themes/ayu.js +3 -1
- package/dist/src/ui/themes/ayu.js.map +1 -1
- package/dist/src/ui/themes/color-utils.d.ts +21 -0
- package/dist/src/ui/themes/color-utils.js +221 -0
- package/dist/src/ui/themes/color-utils.js.map +1 -0
- package/dist/src/ui/themes/dracula.js +2 -0
- package/dist/src/ui/themes/dracula.js.map +1 -1
- package/dist/src/ui/themes/github-dark.js +2 -0
- package/dist/src/ui/themes/github-dark.js.map +1 -1
- package/dist/src/ui/themes/github-light.js +2 -0
- package/dist/src/ui/themes/github-light.js.map +1 -1
- package/dist/src/ui/themes/googlecode.js +2 -0
- package/dist/src/ui/themes/googlecode.js.map +1 -1
- package/dist/src/ui/themes/no-color.js +3 -1
- package/dist/src/ui/themes/no-color.js.map +1 -1
- package/dist/src/ui/themes/shades-of-purple.d.ts +1 -1
- package/dist/src/ui/themes/shades-of-purple.js +3 -1
- package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
- package/dist/src/ui/themes/theme-manager.d.ts +31 -6
- package/dist/src/ui/themes/theme-manager.js +104 -34
- package/dist/src/ui/themes/theme-manager.js.map +1 -1
- package/dist/src/ui/themes/theme.d.ts +22 -3
- package/dist/src/ui/themes/theme.js +229 -182
- package/dist/src/ui/themes/theme.js.map +1 -1
- package/dist/src/ui/themes/xcode.js +2 -0
- package/dist/src/ui/themes/xcode.js.map +1 -1
- package/dist/src/ui/types.d.ts +9 -1
- package/dist/src/ui/utils/CodeColorizer.d.ts +3 -1
- package/dist/src/ui/utils/CodeColorizer.js +23 -11
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
- package/dist/src/ui/utils/commandUtils.d.ts +1 -0
- package/dist/src/ui/utils/commandUtils.js +47 -0
- package/dist/src/ui/utils/commandUtils.js.map +1 -1
- package/dist/src/ui/utils/markdownUtilities.js +1 -1
- package/dist/src/utils/sandbox.js +7 -3
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/userStartupWarnings.js +22 -1
- package/dist/src/utils/userStartupWarnings.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.d.ts +7 -0
- package/dist/src/validateNonInterActiveAuth.js +35 -0
- package/dist/src/validateNonInterActiveAuth.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -4
- package/dist/google-gemini-cli-0.1.12.tgz +0 -0
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { spawn } from 'child_process';
|
|
7
|
-
import {
|
|
7
|
+
import { TextDecoder } from 'util';
|
|
8
8
|
import { ToolCallStatus, } from '../types.js';
|
|
9
9
|
import { useCallback } from 'react';
|
|
10
|
+
import { getCachedEncodingForBuffer, } from '@google/gemini-cli-core';
|
|
10
11
|
import { formatMemoryUsage } from '../utils/formatters.js';
|
|
11
12
|
import { isBinary } from '../utils/textUtils.js';
|
|
12
13
|
import { SHELL_COMMAND_NAME } from '../constants.js';
|
|
@@ -39,10 +40,14 @@ function executeShellCommand(commandToExecute, cwd, abortSignal, onOutputChunk,
|
|
|
39
40
|
cwd,
|
|
40
41
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
41
42
|
detached: !isWindows, // Use process groups on non-Windows for robust killing
|
|
43
|
+
env: {
|
|
44
|
+
...process.env,
|
|
45
|
+
GEMINI_CLI: '1',
|
|
46
|
+
},
|
|
42
47
|
});
|
|
43
48
|
// Use decoders to handle multi-byte characters safely (for streaming output).
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
let stdoutDecoder = null;
|
|
50
|
+
let stderrDecoder = null;
|
|
46
51
|
let stdout = '';
|
|
47
52
|
let stderr = '';
|
|
48
53
|
const outputChunks = [];
|
|
@@ -52,6 +57,11 @@ function executeShellCommand(commandToExecute, cwd, abortSignal, onOutputChunk,
|
|
|
52
57
|
const MAX_SNIFF_SIZE = 4096;
|
|
53
58
|
let sniffedBytes = 0;
|
|
54
59
|
const handleOutput = (data, stream) => {
|
|
60
|
+
if (!stdoutDecoder || !stderrDecoder) {
|
|
61
|
+
const encoding = getCachedEncodingForBuffer(data);
|
|
62
|
+
stdoutDecoder = new TextDecoder(encoding);
|
|
63
|
+
stderrDecoder = new TextDecoder(encoding);
|
|
64
|
+
}
|
|
55
65
|
outputChunks.push(data);
|
|
56
66
|
if (streamToUi && sniffedBytes < MAX_SNIFF_SIZE) {
|
|
57
67
|
// Use a limited-size buffer for the check to avoid performance issues.
|
|
@@ -64,8 +74,8 @@ function executeShellCommand(commandToExecute, cwd, abortSignal, onOutputChunk,
|
|
|
64
74
|
}
|
|
65
75
|
}
|
|
66
76
|
const decodedChunk = stream === 'stdout'
|
|
67
|
-
? stdoutDecoder.
|
|
68
|
-
: stderrDecoder.
|
|
77
|
+
? stdoutDecoder.decode(data, { stream: true })
|
|
78
|
+
: stderrDecoder.decode(data, { stream: true });
|
|
69
79
|
if (stream === 'stdout') {
|
|
70
80
|
stdout += stripAnsi(decodedChunk);
|
|
71
81
|
}
|
|
@@ -105,7 +115,7 @@ function executeShellCommand(commandToExecute, cwd, abortSignal, onOutputChunk,
|
|
|
105
115
|
}
|
|
106
116
|
}
|
|
107
117
|
catch (_e) {
|
|
108
|
-
//
|
|
118
|
+
// Fall back to killing just the main process if group kill fails.
|
|
109
119
|
if (!exited)
|
|
110
120
|
child.kill('SIGKILL');
|
|
111
121
|
}
|
|
@@ -117,8 +127,12 @@ function executeShellCommand(commandToExecute, cwd, abortSignal, onOutputChunk,
|
|
|
117
127
|
exited = true;
|
|
118
128
|
abortSignal.removeEventListener('abort', abortHandler);
|
|
119
129
|
// Handle any final bytes lingering in the decoders
|
|
120
|
-
|
|
121
|
-
|
|
130
|
+
if (stdoutDecoder) {
|
|
131
|
+
stdout += stdoutDecoder.decode();
|
|
132
|
+
}
|
|
133
|
+
if (stderrDecoder) {
|
|
134
|
+
stderr += stderrDecoder.decode();
|
|
135
|
+
}
|
|
122
136
|
const finalBuffer = Buffer.concat(outputChunks);
|
|
123
137
|
resolve({
|
|
124
138
|
rawOutput: finalBuffer,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shellCommandProcessor.js","sourceRoot":"","sources":["../../../../src/ui/hooks/shellCommandProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"shellCommandProcessor.js","sourceRoot":"","sources":["../../../../src/ui/hooks/shellCommandProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAGL,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAGL,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAchC;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAC1B,gBAAwB,EACxB,GAAW,EACX,WAAwB,EACxB,aAAsC,EACtC,cAAyC;IAEzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;QAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7C,MAAM,SAAS,GAAG,SAAS;YACzB,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC;YAC1B,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAE7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE;YACpC,GAAG;YACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,QAAQ,EAAE,CAAC,SAAS,EAAE,uDAAuD;YAC7E,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,UAAU,EAAE,GAAG;aAChB;SACF,CAAC,CAAC;QAEH,8EAA8E;QAC9E,IAAI,aAAa,GAAuB,IAAI,CAAC;QAC7C,IAAI,aAAa,GAAuB,IAAI,CAAC;QAE7C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,IAAI,KAAK,GAAiB,IAAI,CAAC;QAC/B,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,IAAI,UAAU,GAAG,IAAI,CAAC;QACtB,MAAM,cAAc,GAAG,IAAI,CAAC;QAC5B,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,MAA2B,EAAE,EAAE;YACjE,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;gBAClD,aAAa,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC1C,aAAa,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC5C,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAExB,IAAI,UAAU,IAAI,YAAY,GAAG,cAAc,EAAE,CAAC;gBAChD,uEAAuE;gBACvE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC7D,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC;gBAElC,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1B,UAAU,GAAG,KAAK,CAAC;oBACnB,0EAA0E;oBAC1E,aAAa,CAAC,6CAA6C,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAChB,MAAM,KAAK,QAAQ;gBACjB,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBAC9C,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,MAAM,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;gBAC1B,kEAAkE;gBAClE,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9D,aAAa,CAAC,cAAc,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClC,8CAA8C;gBAC9C,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CACpC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAClC,CAAC,CACF,CAAC;gBACF,aAAa,CACX,+BAA+B,iBAAiB,CAAC,UAAU,CAAC,YAAY,CACzE,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,KAAK,GAAG,GAAG,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;YAC9B,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzB,cAAc,CAAC,gCAAgC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC7D,IAAI,SAAS,EAAE,CAAC;oBACd,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC;wBACH,gDAAgD;wBAChD,iDAAiD;wBACjD,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;wBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;wBACjD,IAAI,CAAC,MAAM,EAAE,CAAC;4BACZ,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;wBACtC,CAAC;oBACH,CAAC;oBAAC,OAAO,EAAE,EAAE,CAAC;wBACZ,kEAAkE;wBAClE,IAAI,CAAC,MAAM;4BAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,MAAM,GAAG,IAAI,CAAC;YACd,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEvD,mDAAmD;YACnD,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACnC,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACnC,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAEhD,OAAO,CAAC;gBACN,SAAS,EAAE,WAAW;gBACtB,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,QAAQ,EAAE,IAAI;gBACd,MAAM;gBACN,KAAK;gBACL,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,8BAA8B,CACrC,YAA0B,EAC1B,QAAgB,EAChB,UAAkB;IAElB,MAAM,YAAY,GAChB,UAAU,CAAC,MAAM,GAAG,iBAAiB;QACnC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,mBAAmB;QAClE,CAAC,CAAC,UAAU,CAAC;IAEjB,YAAY,CAAC,UAAU,CAAC;QACtB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE;YACL;gBACE,IAAI,EAAE;;EAEZ,QAAQ;;;;;EAKR,YAAY;OACP;aACA;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,gBAAoD,EACpD,qBAEC,EACD,MAAwC,EACxC,cAAyC,EACzC,MAAc,EACd,YAA0B,EAC1B,EAAE;IACF,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,QAAuB,EAAE,WAAwB,EAAW,EAAE;QAC7D,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAAC;QAC/C,gBAAgB,CACd,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,EACtC,oBAAoB,CACrB,CAAC;QAEF,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACxC,IAAI,gBAAgB,GAAG,QAAQ,CAAC;QAChC,IAAI,WAA+B,CAAC;QAEpC,2EAA2E;QAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,aAAa,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YAC7E,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;YAClD,8DAA8D;YAC9D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO,IAAI,GAAG,CAAC;YACjB,CAAC;YACD,gBAAgB,GAAG,KAAK,OAAO,yBAAyB,WAAW,iBAAiB,CAAC;QACvF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChD,IAAI,cAAc,GAAG,CAAC,CAAC;YAEvB,MAAM,kBAAkB,GAA8B;gBACpD,MAAM;gBACN,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EAAE,QAAQ;gBACrB,MAAM,EAAE,cAAc,CAAC,SAAS;gBAChC,aAAa,EAAE,EAAE;gBACjB,mBAAmB,EAAE,SAAS;aAC/B,CAAC;YAEF,qBAAqB,CAAC;gBACpB,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,CAAC,kBAAkB,CAAC;aAC5B,CAAC,CAAC;YAEH,cAAc,CAAC,gBAAgB,SAAS,KAAK,gBAAgB,EAAE,CAAC,CAAC;YACjE,mBAAmB,CACjB,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,CAAC,cAAc,EAAE,EAAE;gBACjB,6DAA6D;gBAC7D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,yBAAyB,EAAE,CAAC;oBAC5D,qBAAqB,CAAC;wBACpB,IAAI,EAAE,YAAY;wBAClB,KAAK,EAAE;4BACL,EAAE,GAAG,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE;yBACzD;qBACF,CAAC,CAAC;oBACH,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC9B,CAAC;YACH,CAAC,EACD,cAAc,CACf;iBACE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAE5B,IAAI,WAAmB,CAAC;gBAExB,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC/B,WAAW;wBACT,uDAAuD,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,WAAW;wBACT,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,8BAA8B,CAAC;gBAC3D,CAAC;gBAED,IAAI,WAAW,GAAG,WAAW,CAAC;gBAC9B,IAAI,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC;gBAEzC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC;oBACnC,WAAW,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;gBAC1D,CAAC;qBAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC1B,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC;oBACtC,WAAW,GAAG,2BAA2B,WAAW,EAAE,CAAC;gBACzD,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBACzB,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC;oBACnC,WAAW,GAAG,iCAAiC,MAAM,CAAC,MAAM,MAAM,WAAW,EAAE,CAAC;gBAClF,CAAC;qBAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACjC,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC;oBACnC,WAAW,GAAG,4BAA4B,MAAM,CAAC,QAAQ,MAAM,WAAW,EAAE,CAAC;gBAC/E,CAAC;gBAED,IAAI,WAAW,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC9C,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC7D,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;wBACvC,MAAM,OAAO,GAAG,8DAA8D,QAAQ,qBAAqB,CAAC;wBAC5G,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBAED,MAAM,gBAAgB,GAA8B;oBAClD,GAAG,kBAAkB;oBACrB,MAAM,EAAE,WAAW;oBACnB,aAAa,EAAE,WAAW;iBAC3B,CAAC;gBAEF,+DAA+D;gBAC/D,gBAAgB,CACd;oBACE,IAAI,EAAE,YAAY;oBAClB,KAAK,EAAE,CAAC,gBAAgB,CAAC;iBACF,EACzB,oBAAoB,CACrB,CAAC;gBAEF,iEAAiE;gBACjE,8BAA8B,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YACtE,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,MAAM,YAAY,GAChB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACnD,gBAAgB,CACd;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,iCAAiC,YAAY,EAAE;iBACtD,EACD,oBAAoB,CACrB,CAAC;YACJ,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACZ,IAAI,WAAW,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC9C,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC7B,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC,CAAC,wBAAwB;IACvC,CAAC,EACD;QACE,MAAM;QACN,cAAc;QACd,gBAAgB;QAChB,qBAAqB;QACrB,MAAM;QACN,YAAY;KACb,CACF,CAAC;IAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAChC,CAAC,CAAC"}
|
|
@@ -14,7 +14,7 @@ import { type CommandContext, type SlashCommand } from '../commands/types.js';
|
|
|
14
14
|
*/
|
|
15
15
|
export declare const useSlashCommandProcessor: (config: Config | null, settings: LoadedSettings, addItem: UseHistoryManagerReturn["addItem"], clearItems: UseHistoryManagerReturn["clearItems"], loadHistory: UseHistoryManagerReturn["loadHistory"], refreshStatic: () => void, setShowHelp: React.Dispatch<React.SetStateAction<boolean>>, onDebugMessage: (message: string) => void, openThemeDialog: () => void, openAuthDialog: () => void, openEditorDialog: () => void, toggleCorgiMode: () => void, setQuittingMessages: (message: HistoryItem[]) => void, openPrivacyNotice: () => void) => {
|
|
16
16
|
handleSlashCommand: (rawQuery: PartListUnion) => Promise<SlashCommandProcessorResult | false>;
|
|
17
|
-
slashCommands: SlashCommand[];
|
|
17
|
+
slashCommands: readonly SlashCommand[];
|
|
18
18
|
pendingHistoryItems: HistoryItemWithoutId[];
|
|
19
19
|
commandContext: CommandContext;
|
|
20
20
|
};
|
|
@@ -10,6 +10,8 @@ import { GitService, Logger } from '@google/gemini-cli-core';
|
|
|
10
10
|
import { useSessionStats } from '../contexts/SessionContext.js';
|
|
11
11
|
import { MessageType, } from '../types.js';
|
|
12
12
|
import { CommandService } from '../../services/CommandService.js';
|
|
13
|
+
import { BuiltinCommandLoader } from '../../services/BuiltinCommandLoader.js';
|
|
14
|
+
import { FileCommandLoader } from '../../services/FileCommandLoader.js';
|
|
13
15
|
/**
|
|
14
16
|
* Hook to define and process slash commands (e.g., /help, /clear).
|
|
15
17
|
*/
|
|
@@ -124,14 +126,21 @@ export const useSlashCommandProcessor = (config, settings, addItem, clearItems,
|
|
|
124
126
|
setPendingCompressionItem,
|
|
125
127
|
toggleCorgiMode,
|
|
126
128
|
]);
|
|
127
|
-
const commandService = useMemo(() => new CommandService(config), [config]);
|
|
128
129
|
useEffect(() => {
|
|
130
|
+
const controller = new AbortController();
|
|
129
131
|
const load = async () => {
|
|
130
|
-
|
|
132
|
+
const loaders = [
|
|
133
|
+
new BuiltinCommandLoader(config),
|
|
134
|
+
new FileCommandLoader(config),
|
|
135
|
+
];
|
|
136
|
+
const commandService = await CommandService.create(loaders, controller.signal);
|
|
131
137
|
setCommands(commandService.getCommands());
|
|
132
138
|
};
|
|
133
139
|
load();
|
|
134
|
-
|
|
140
|
+
return () => {
|
|
141
|
+
controller.abort();
|
|
142
|
+
};
|
|
143
|
+
}, [config]);
|
|
135
144
|
const handleSlashCommand = useCallback(async (rawQuery) => {
|
|
136
145
|
if (typeof rawQuery !== 'string') {
|
|
137
146
|
return false;
|
|
@@ -141,16 +150,24 @@ export const useSlashCommandProcessor = (config, settings, addItem, clearItems,
|
|
|
141
150
|
return false;
|
|
142
151
|
}
|
|
143
152
|
const userMessageTimestamp = Date.now();
|
|
144
|
-
|
|
145
|
-
addItem({ type: MessageType.USER, text: trimmed }, userMessageTimestamp);
|
|
146
|
-
}
|
|
153
|
+
addItem({ type: MessageType.USER, text: trimmed }, userMessageTimestamp);
|
|
147
154
|
const parts = trimmed.substring(1).trim().split(/\s+/);
|
|
148
155
|
const commandPath = parts.filter((p) => p); // The parts of the command, e.g., ['memory', 'add']
|
|
149
156
|
let currentCommands = commands;
|
|
150
157
|
let commandToExecute;
|
|
151
158
|
let pathIndex = 0;
|
|
152
159
|
for (const part of commandPath) {
|
|
153
|
-
|
|
160
|
+
// TODO: For better performance and architectural clarity, this two-pass
|
|
161
|
+
// search could be replaced. A more optimal approach would be to
|
|
162
|
+
// pre-compute a single lookup map in `CommandService.ts` that resolves
|
|
163
|
+
// all name and alias conflicts during the initial loading phase. The
|
|
164
|
+
// processor would then perform a single, fast lookup on that map.
|
|
165
|
+
// First pass: check for an exact match on the primary command name.
|
|
166
|
+
let foundCommand = currentCommands.find((cmd) => cmd.name === part);
|
|
167
|
+
// Second pass: if no primary name matches, check for an alias.
|
|
168
|
+
if (!foundCommand) {
|
|
169
|
+
foundCommand = currentCommands.find((cmd) => cmd.altNames?.includes(part));
|
|
170
|
+
}
|
|
154
171
|
if (foundCommand) {
|
|
155
172
|
commandToExecute = foundCommand;
|
|
156
173
|
pathIndex++;
|
|
@@ -168,7 +185,15 @@ export const useSlashCommandProcessor = (config, settings, addItem, clearItems,
|
|
|
168
185
|
if (commandToExecute) {
|
|
169
186
|
const args = parts.slice(pathIndex).join(' ');
|
|
170
187
|
if (commandToExecute.action) {
|
|
171
|
-
const
|
|
188
|
+
const fullCommandContext = {
|
|
189
|
+
...commandContext,
|
|
190
|
+
invocation: {
|
|
191
|
+
raw: trimmed,
|
|
192
|
+
name: commandToExecute.name,
|
|
193
|
+
args,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
const result = await commandToExecute.action(fullCommandContext, args);
|
|
172
197
|
if (result) {
|
|
173
198
|
switch (result.type) {
|
|
174
199
|
case 'tool':
|
|
@@ -211,9 +236,9 @@ export const useSlashCommandProcessor = (config, settings, addItem, clearItems,
|
|
|
211
236
|
await config
|
|
212
237
|
?.getGeminiClient()
|
|
213
238
|
?.setHistory(result.clientHistory);
|
|
214
|
-
|
|
239
|
+
fullCommandContext.ui.clear();
|
|
215
240
|
result.history.forEach((item, index) => {
|
|
216
|
-
|
|
241
|
+
fullCommandContext.ui.addItem(item, index);
|
|
217
242
|
});
|
|
218
243
|
return { type: 'handled' };
|
|
219
244
|
}
|
|
@@ -223,6 +248,11 @@ export const useSlashCommandProcessor = (config, settings, addItem, clearItems,
|
|
|
223
248
|
process.exit(0);
|
|
224
249
|
}, 100);
|
|
225
250
|
return { type: 'handled' };
|
|
251
|
+
case 'submit_prompt':
|
|
252
|
+
return {
|
|
253
|
+
type: 'submit_prompt',
|
|
254
|
+
content: result.content,
|
|
255
|
+
};
|
|
226
256
|
default: {
|
|
227
257
|
const unhandled = result;
|
|
228
258
|
throw new Error(`Unhandled slash command result: ${unhandled}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slashCommandProcessor.js","sourceRoot":"","sources":["../../../../src/ui/hooks/slashCommandProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAU,UAAU,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAEL,WAAW,GAIZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"slashCommandProcessor.js","sourceRoot":"","sources":["../../../../src/ui/hooks/slashCommandProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAU,UAAU,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAEL,WAAW,GAIZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAExE;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,MAAqB,EACrB,QAAwB,EACxB,OAA2C,EAC3C,UAAiD,EACjD,WAAmD,EACnD,aAAyB,EACzB,WAA0D,EAC1D,cAAyC,EACzC,eAA2B,EAC3B,cAA0B,EAC1B,gBAA4B,EAC5B,eAA2B,EAC3B,mBAAqD,EACrD,iBAA6B,EAC7B,EAAE;IACF,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,mEAAmE;QACnE,qEAAqE;QACrE,OAAO,CAAC,CAAC;IACX,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,GAC1D,cAAc,CAA8B,IAAI,CAAC,CAAC;IAEpD,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,EAAE;QACvC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,yBAAyB,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,OAAgB,EAAE,EAAE;QACnB,0CAA0C;QAC1C,IAAI,kBAAwC,CAAC;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC;YACvC,kBAAkB,GAAG;gBACnB,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gBAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC;YAC9C,kBAAkB,GAAG;gBACnB,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;YACpD,kBAAkB,GAAG;gBACnB,IAAI,EAAE,aAAa;aACpB,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,UAAU,EAAE,CAAC;YACnD,kBAAkB,GAAG;gBACnB,IAAI,EAAE,YAAY;aACnB,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YAC7C,kBAAkB,GAAG;gBACnB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;YACpD,kBAAkB,GAAG;gBACnB,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,kBAAkB,GAAG;gBACnB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,OAAO;aACtB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAmB,EAAE,CAAC,CAAC;QACrB,QAAQ,EAAE;YACR,MAAM;YACN,QAAQ;YACR,GAAG,EAAE,UAAU;YACf,MAAM;SACP;QACD,EAAE,EAAE;YACF,OAAO;YACP,KAAK,EAAE,GAAG,EAAE;gBACV,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,aAAa,EAAE,CAAC;YAClB,CAAC;YACD,WAAW;YACX,eAAe,EAAE,cAAc;YAC/B,WAAW,EAAE,yBAAyB,CAAC,OAAO;YAC9C,cAAc,EAAE,yBAAyB;YACzC,eAAe;SAChB;QACD,OAAO,EAAE;YACP,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB;KACF,CAAC,EACF;QACE,MAAM;QACN,QAAQ;QACR,UAAU;QACV,MAAM;QACN,WAAW;QACX,OAAO;QACP,UAAU;QACV,aAAa;QACb,OAAO,CAAC,KAAK;QACb,cAAc;QACd,yBAAyB;QACzB,yBAAyB;QACzB,eAAe;KAChB,CACF,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,MAAM,OAAO,GAAG;gBACd,IAAI,oBAAoB,CAAC,MAAM,CAAC;gBAChC,IAAI,iBAAiB,CAAC,MAAM,CAAC;aAC9B,CAAC;YACF,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,MAAM,CAChD,OAAO,EACP,UAAU,CAAC,MAAM,CAClB,CAAC;YACF,WAAW,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,IAAI,EAAE,CAAC;QAEP,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,kBAAkB,GAAG,WAAW,CACpC,KAAK,EACH,QAAuB,EACuB,EAAE;QAChD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAEzE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,oDAAoD;QAEhG,IAAI,eAAe,GAAG,QAAQ,CAAC;QAC/B,IAAI,gBAA0C,CAAC;QAC/C,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,wEAAwE;YACxE,gEAAgE;YAChE,uEAAuE;YACvE,qEAAqE;YACrE,kEAAkE;YAElE,oEAAoE;YACpE,IAAI,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAEpE,+DAA+D;YAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1C,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAC7B,CAAC;YACJ,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,gBAAgB,GAAG,YAAY,CAAC;gBAChC,SAAS,EAAE,CAAC;gBACZ,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC7B,eAAe,GAAG,YAAY,CAAC,WAAW,CAAC;gBAC7C,CAAC;qBAAM,CAAC;oBACN,MAAM;gBACR,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9C,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,kBAAkB,GAAmB;oBACzC,GAAG,cAAc;oBACjB,UAAU,EAAE;wBACV,GAAG,EAAE,OAAO;wBACZ,IAAI,EAAE,gBAAgB,CAAC,IAAI;wBAC3B,IAAI;qBACL;iBACF,CAAC;gBACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAC1C,kBAAkB,EAClB,IAAI,CACL,CAAC;gBAEF,IAAI,MAAM,EAAE,CAAC;oBACX,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;wBACpB,KAAK,MAAM;4BACT,OAAO;gCACL,IAAI,EAAE,eAAe;gCACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;6BAC1B,CAAC;wBACJ,KAAK,SAAS;4BACZ,OAAO,CACL;gCACE,IAAI,EACF,MAAM,CAAC,WAAW,KAAK,OAAO;oCAC5B,CAAC,CAAC,WAAW,CAAC,KAAK;oCACnB,CAAC,CAAC,WAAW,CAAC,IAAI;gCACtB,IAAI,EAAE,MAAM,CAAC,OAAO;6BACrB,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;4BACF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;wBAC7B,KAAK,QAAQ;4BACX,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;gCACtB,KAAK,MAAM;oCACT,WAAW,CAAC,IAAI,CAAC,CAAC;oCAClB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gCAC7B,KAAK,MAAM;oCACT,cAAc,EAAE,CAAC;oCACjB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gCAC7B,KAAK,OAAO;oCACV,eAAe,EAAE,CAAC;oCAClB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gCAC7B,KAAK,QAAQ;oCACX,gBAAgB,EAAE,CAAC;oCACnB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gCAC7B,KAAK,SAAS;oCACZ,iBAAiB,EAAE,CAAC;oCACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gCAC7B,OAAO,CAAC,CAAC,CAAC;oCACR,MAAM,SAAS,GAAU,MAAM,CAAC,MAAM,CAAC;oCACvC,MAAM,IAAI,KAAK,CACb,mCAAmC,SAAS,EAAE,CAC/C,CAAC;gCACJ,CAAC;4BACH,CAAC;wBACH,KAAK,cAAc,CAAC,CAAC,CAAC;4BACpB,MAAM,MAAM;gCACV,EAAE,eAAe,EAAE;gCACnB,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;4BACrC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;4BAC9B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gCACrC,kBAAkB,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;4BAC7C,CAAC,CAAC,CAAC;4BACH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;wBAC7B,CAAC;wBACD,KAAK,MAAM;4BACT,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;4BACrC,UAAU,CAAC,GAAG,EAAE;gCACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BAClB,CAAC,EAAE,GAAG,CAAC,CAAC;4BACR,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;wBAE7B,KAAK,eAAe;4BAClB,OAAO;gCACL,IAAI,EAAE,eAAe;gCACrB,OAAO,EAAE,MAAM,CAAC,OAAO;6BACxB,CAAC;wBACJ,OAAO,CAAC,CAAC,CAAC;4BACR,MAAM,SAAS,GAAU,MAAM,CAAC;4BAChC,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;wBAClE,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC7B,CAAC;iBAAM,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,aAAa,gBAAgB,CAAC,IAAI,wCAAwC,gBAAgB,CAAC,WAAW;qBACpH,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;qBACtD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChB,UAAU,CAAC;oBACT,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,OAAO,EAAE,QAAQ;oBACjB,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAC,CAAC;gBACH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,UAAU,CAAC;YACT,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,OAAO,EAAE,oBAAoB,OAAO,EAAE;YACtC,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC,EACD;QACE,MAAM;QACN,OAAO;QACP,WAAW;QACX,cAAc;QACd,QAAQ;QACR,cAAc;QACd,UAAU;QACV,eAAe;QACf,iBAAiB;QACjB,gBAAgB;QAChB,mBAAmB;KACpB,CACF,CAAC;IAEF,OAAO;QACL,kBAAkB;QAClB,aAAa,EAAE,QAAQ;QACvB,mBAAmB;QACnB,cAAc;KACf,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { useState, useCallback, useEffect } from 'react';
|
|
7
|
-
import { AuthType, clearCachedCredentialFile, getErrorMessage,
|
|
7
|
+
import { AuthType, clearCachedCredentialFile, getErrorMessage, } from '@google/gemini-cli-core';
|
|
8
8
|
import { runExitCleanup } from '../../utils/cleanup.js';
|
|
9
9
|
export const useAuthCommand = (settings, setAuthError, config) => {
|
|
10
10
|
const [isAuthDialogOpen, setIsAuthDialogOpen] = useState(settings.merged.selectedAuthType === undefined);
|
|
@@ -38,7 +38,7 @@ export const useAuthCommand = (settings, setAuthError, config) => {
|
|
|
38
38
|
await clearCachedCredentialFile();
|
|
39
39
|
settings.setValue(scope, 'selectedAuthType', authType);
|
|
40
40
|
if (authType === AuthType.LOGIN_WITH_GOOGLE &&
|
|
41
|
-
|
|
41
|
+
config.isBrowserLaunchSuppressed()) {
|
|
42
42
|
runExitCleanup();
|
|
43
43
|
console.log(`
|
|
44
44
|
----------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthCommand.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useAuthCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EACL,QAAQ,EAER,yBAAyB,EACzB,eAAe,
|
|
1
|
+
{"version":3,"file":"useAuthCommand.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useAuthCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EACL,QAAQ,EAER,yBAAyB,EACzB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAwB,EACxB,YAA4C,EAC5C,MAAc,EACd,EAAE;IACF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CACtD,QAAQ,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAC/C,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAClD,IAAI,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC1B,MAAM,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,IAAI,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,YAAY,CAAC,6BAA6B,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChE,cAAc,EAAE,CAAC;YACnB,CAAC;oBAAS,CAAC;gBACT,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAEvE,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,QAA8B,EAAE,KAAmB,EAAE,EAAE;QAC5D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,yBAAyB,EAAE,CAAC;YAElC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;YACvD,IACE,QAAQ,KAAK,QAAQ,CAAC,iBAAiB;gBACvC,MAAM,CAAC,yBAAyB,EAAE,EAClC,CAAC;gBACD,cAAc,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CACT;;;;aAIC,CACF,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3B,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,EACD,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CACjC,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,gBAAgB;QAChB,cAAc;QACd,gBAAgB;QAChB,gBAAgB;QAChB,oBAAoB;KACrB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { Config } from '@google/gemini-cli-core';
|
|
7
7
|
import { Suggestion } from '../components/SuggestionsDisplay.js';
|
|
8
8
|
import { CommandContext, SlashCommand } from '../commands/types.js';
|
|
9
|
+
import { TextBuffer } from '../components/shared/text-buffer.js';
|
|
9
10
|
export interface UseCompletionReturn {
|
|
10
11
|
suggestions: Suggestion[];
|
|
11
12
|
activeSuggestionIndex: number;
|
|
@@ -18,5 +19,6 @@ export interface UseCompletionReturn {
|
|
|
18
19
|
resetCompletionState: () => void;
|
|
19
20
|
navigateUp: () => void;
|
|
20
21
|
navigateDown: () => void;
|
|
22
|
+
handleAutocomplete: (indexToUse: number) => void;
|
|
21
23
|
}
|
|
22
|
-
export declare function useCompletion(
|
|
24
|
+
export declare function useCompletion(buffer: TextBuffer, cwd: string, slashCommands: readonly SlashCommand[], commandContext: CommandContext, config?: Config): UseCompletionReturn;
|
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { useState, useEffect, useCallback } from 'react';
|
|
6
|
+
import { useState, useEffect, useCallback, useMemo } from 'react';
|
|
7
7
|
import * as fs from 'fs/promises';
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
import { glob } from 'glob';
|
|
10
|
-
import { isNodeError, escapePath, unescapePath, getErrorMessage, } from '@google/gemini-cli-core';
|
|
10
|
+
import { isNodeError, escapePath, unescapePath, getErrorMessage, DEFAULT_FILE_FILTERING_OPTIONS, } from '@google/gemini-cli-core';
|
|
11
11
|
import { MAX_SUGGESTIONS_TO_SHOW, } from '../components/SuggestionsDisplay.js';
|
|
12
|
-
|
|
12
|
+
import { isSlashCommand } from '../utils/commandUtils.js';
|
|
13
|
+
import { toCodePoints } from '../utils/textUtils.js';
|
|
14
|
+
export function useCompletion(buffer, cwd, slashCommands, commandContext, config) {
|
|
13
15
|
const [suggestions, setSuggestions] = useState([]);
|
|
14
16
|
const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(-1);
|
|
15
17
|
const [visibleStartIndex, setVisibleStartIndex] = useState(0);
|
|
@@ -71,12 +73,40 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
71
73
|
return newActiveIndex;
|
|
72
74
|
});
|
|
73
75
|
}, [suggestions.length]);
|
|
76
|
+
// Check if cursor is after @ or / without unescaped spaces
|
|
77
|
+
const isActive = useMemo(() => {
|
|
78
|
+
if (isSlashCommand(buffer.text.trim())) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
// For other completions like '@', we search backwards from the cursor.
|
|
82
|
+
const [row, col] = buffer.cursor;
|
|
83
|
+
const currentLine = buffer.lines[row] || '';
|
|
84
|
+
const codePoints = toCodePoints(currentLine);
|
|
85
|
+
for (let i = col - 1; i >= 0; i--) {
|
|
86
|
+
const char = codePoints[i];
|
|
87
|
+
if (char === ' ') {
|
|
88
|
+
// Check for unescaped spaces.
|
|
89
|
+
let backslashCount = 0;
|
|
90
|
+
for (let j = i - 1; j >= 0 && codePoints[j] === '\\'; j--) {
|
|
91
|
+
backslashCount++;
|
|
92
|
+
}
|
|
93
|
+
if (backslashCount % 2 === 0) {
|
|
94
|
+
return false; // Inactive on unescaped space.
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (char === '@') {
|
|
98
|
+
// Active if we find an '@' before any unescaped space.
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}, [buffer.text, buffer.cursor, buffer.lines]);
|
|
74
104
|
useEffect(() => {
|
|
75
105
|
if (!isActive) {
|
|
76
106
|
resetCompletionState();
|
|
77
107
|
return;
|
|
78
108
|
}
|
|
79
|
-
const trimmedQuery =
|
|
109
|
+
const trimmedQuery = buffer.text.trimStart();
|
|
80
110
|
if (trimmedQuery.startsWith('/')) {
|
|
81
111
|
// Always reset perfect match at the beginning of processing.
|
|
82
112
|
setIsPerfectMatch(false);
|
|
@@ -101,7 +131,7 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
101
131
|
currentLevel = [];
|
|
102
132
|
break;
|
|
103
133
|
}
|
|
104
|
-
const found = currentLevel.find((cmd) => cmd.name === part || cmd.
|
|
134
|
+
const found = currentLevel.find((cmd) => cmd.name === part || cmd.altNames?.includes(part));
|
|
105
135
|
if (found) {
|
|
106
136
|
leafCommand = found;
|
|
107
137
|
currentLevel = found.subCommands;
|
|
@@ -114,7 +144,7 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
114
144
|
}
|
|
115
145
|
// Handle the Ambiguous Case
|
|
116
146
|
if (!hasTrailingSpace && currentLevel) {
|
|
117
|
-
const exactMatchAsParent = currentLevel.find((cmd) => (cmd.name === partial || cmd.
|
|
147
|
+
const exactMatchAsParent = currentLevel.find((cmd) => (cmd.name === partial || cmd.altNames?.includes(partial)) &&
|
|
118
148
|
cmd.subCommands);
|
|
119
149
|
if (exactMatchAsParent) {
|
|
120
150
|
// It's a perfect match for a parent command. Override our initial guess.
|
|
@@ -132,7 +162,8 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
132
162
|
}
|
|
133
163
|
else if (currentLevel) {
|
|
134
164
|
// Case: /command subcommand<enter>
|
|
135
|
-
const perfectMatch = currentLevel.find((cmd) => (cmd.name === partial || cmd.
|
|
165
|
+
const perfectMatch = currentLevel.find((cmd) => (cmd.name === partial || cmd.altNames?.includes(partial)) &&
|
|
166
|
+
cmd.action);
|
|
136
167
|
if (perfectMatch) {
|
|
137
168
|
setIsPerfectMatch(true);
|
|
138
169
|
}
|
|
@@ -161,11 +192,12 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
161
192
|
const commandsToSearch = currentLevel || [];
|
|
162
193
|
if (commandsToSearch.length > 0) {
|
|
163
194
|
let potentialSuggestions = commandsToSearch.filter((cmd) => cmd.description &&
|
|
164
|
-
(cmd.name.startsWith(partial) ||
|
|
195
|
+
(cmd.name.startsWith(partial) ||
|
|
196
|
+
cmd.altNames?.some((alt) => alt.startsWith(partial))));
|
|
165
197
|
// If a user's input is an exact match and it is a leaf command,
|
|
166
198
|
// enter should submit immediately.
|
|
167
199
|
if (potentialSuggestions.length > 0 && !hasTrailingSpace) {
|
|
168
|
-
const perfectMatch = potentialSuggestions.find((s) => s.name === partial || s.
|
|
200
|
+
const perfectMatch = potentialSuggestions.find((s) => s.name === partial || s.altNames?.includes(partial));
|
|
169
201
|
if (perfectMatch && perfectMatch.action) {
|
|
170
202
|
potentialSuggestions = [];
|
|
171
203
|
}
|
|
@@ -186,12 +218,12 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
186
218
|
return;
|
|
187
219
|
}
|
|
188
220
|
// Handle At Command Completion
|
|
189
|
-
const atIndex =
|
|
221
|
+
const atIndex = buffer.text.lastIndexOf('@');
|
|
190
222
|
if (atIndex === -1) {
|
|
191
223
|
resetCompletionState();
|
|
192
224
|
return;
|
|
193
225
|
}
|
|
194
|
-
const partialPath =
|
|
226
|
+
const partialPath = buffer.text.substring(atIndex + 1);
|
|
195
227
|
const lastSlashIndex = partialPath.lastIndexOf('/');
|
|
196
228
|
const baseDirRelative = lastSlashIndex === -1
|
|
197
229
|
? '.'
|
|
@@ -253,13 +285,10 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
253
285
|
nocase: true,
|
|
254
286
|
});
|
|
255
287
|
const suggestions = files
|
|
256
|
-
.map((file) => {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
value: escapePath(relativePath),
|
|
261
|
-
};
|
|
262
|
-
})
|
|
288
|
+
.map((file) => ({
|
|
289
|
+
label: file,
|
|
290
|
+
value: escapePath(file),
|
|
291
|
+
}))
|
|
263
292
|
.filter((s) => {
|
|
264
293
|
if (fileDiscoveryService) {
|
|
265
294
|
return !fileDiscoveryService.shouldIgnoreFile(s.label, filterOptions); // relative path
|
|
@@ -274,10 +303,7 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
274
303
|
let fetchedSuggestions = [];
|
|
275
304
|
const fileDiscoveryService = config ? config.getFileService() : null;
|
|
276
305
|
const enableRecursiveSearch = config?.getEnableRecursiveFileSearch() ?? true;
|
|
277
|
-
const filterOptions =
|
|
278
|
-
respectGitIgnore: config?.getFileFilteringRespectGitIgnore() ?? true,
|
|
279
|
-
respectGeminiIgnore: true,
|
|
280
|
-
};
|
|
306
|
+
const filterOptions = config?.getFileFilteringOptions() ?? DEFAULT_FILE_FILTERING_OPTIONS;
|
|
281
307
|
try {
|
|
282
308
|
// If there's no slash, or it's the root, do a recursive search from cwd
|
|
283
309
|
if (partialPath.indexOf('/') === -1 &&
|
|
@@ -287,7 +313,7 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
287
313
|
fetchedSuggestions = await findFilesWithGlob(prefix, fileDiscoveryService, filterOptions);
|
|
288
314
|
}
|
|
289
315
|
else {
|
|
290
|
-
fetchedSuggestions = await findFilesRecursively(cwd, prefix,
|
|
316
|
+
fetchedSuggestions = await findFilesRecursively(cwd, prefix, null, filterOptions);
|
|
291
317
|
}
|
|
292
318
|
}
|
|
293
319
|
else {
|
|
@@ -320,6 +346,12 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
320
346
|
};
|
|
321
347
|
});
|
|
322
348
|
}
|
|
349
|
+
// Like glob, we always return forwardslashes, even in windows.
|
|
350
|
+
fetchedSuggestions = fetchedSuggestions.map((suggestion) => ({
|
|
351
|
+
...suggestion,
|
|
352
|
+
label: suggestion.label.replace(/\\/g, '/'),
|
|
353
|
+
value: suggestion.value.replace(/\\/g, '/'),
|
|
354
|
+
}));
|
|
323
355
|
// Sort by depth, then directories first, then alphabetically
|
|
324
356
|
fetchedSuggestions.sort((a, b) => {
|
|
325
357
|
const depthA = (a.label.match(/\//g) || []).length;
|
|
@@ -369,7 +401,7 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
369
401
|
clearTimeout(debounceTimeout);
|
|
370
402
|
};
|
|
371
403
|
}, [
|
|
372
|
-
|
|
404
|
+
buffer.text,
|
|
373
405
|
cwd,
|
|
374
406
|
isActive,
|
|
375
407
|
resetCompletionState,
|
|
@@ -377,6 +409,62 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
377
409
|
commandContext,
|
|
378
410
|
config,
|
|
379
411
|
]);
|
|
412
|
+
const handleAutocomplete = useCallback((indexToUse) => {
|
|
413
|
+
if (indexToUse < 0 || indexToUse >= suggestions.length) {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
const query = buffer.text;
|
|
417
|
+
const suggestion = suggestions[indexToUse].value;
|
|
418
|
+
if (query.trimStart().startsWith('/')) {
|
|
419
|
+
const hasTrailingSpace = query.endsWith(' ');
|
|
420
|
+
const parts = query
|
|
421
|
+
.trimStart()
|
|
422
|
+
.substring(1)
|
|
423
|
+
.split(/\s+/)
|
|
424
|
+
.filter(Boolean);
|
|
425
|
+
let isParentPath = false;
|
|
426
|
+
// If there's no trailing space, we need to check if the current query
|
|
427
|
+
// is already a complete path to a parent command.
|
|
428
|
+
if (!hasTrailingSpace) {
|
|
429
|
+
let currentLevel = slashCommands;
|
|
430
|
+
for (let i = 0; i < parts.length; i++) {
|
|
431
|
+
const part = parts[i];
|
|
432
|
+
const found = currentLevel?.find((cmd) => cmd.name === part || cmd.altNames?.includes(part));
|
|
433
|
+
if (found) {
|
|
434
|
+
if (i === parts.length - 1 && found.subCommands) {
|
|
435
|
+
isParentPath = true;
|
|
436
|
+
}
|
|
437
|
+
currentLevel = found.subCommands;
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
// Path is invalid, so it can't be a parent path.
|
|
441
|
+
currentLevel = undefined;
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
// Determine the base path of the command.
|
|
447
|
+
// - If there's a trailing space, the whole command is the base.
|
|
448
|
+
// - If it's a known parent path, the whole command is the base.
|
|
449
|
+
// - Otherwise, the base is everything EXCEPT the last partial part.
|
|
450
|
+
const basePath = hasTrailingSpace || isParentPath ? parts : parts.slice(0, -1);
|
|
451
|
+
const newValue = `/${[...basePath, suggestion].join(' ')}`;
|
|
452
|
+
buffer.setText(newValue);
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
const atIndex = query.lastIndexOf('@');
|
|
456
|
+
if (atIndex === -1)
|
|
457
|
+
return;
|
|
458
|
+
const pathPart = query.substring(atIndex + 1);
|
|
459
|
+
const lastSlashIndexInPath = pathPart.lastIndexOf('/');
|
|
460
|
+
let autoCompleteStartIndex = atIndex + 1;
|
|
461
|
+
if (lastSlashIndexInPath !== -1) {
|
|
462
|
+
autoCompleteStartIndex += lastSlashIndexInPath + 1;
|
|
463
|
+
}
|
|
464
|
+
buffer.replaceRangeByOffset(autoCompleteStartIndex, buffer.text.length, suggestion);
|
|
465
|
+
}
|
|
466
|
+
resetCompletionState();
|
|
467
|
+
}, [resetCompletionState, buffer, suggestions, slashCommands]);
|
|
380
468
|
return {
|
|
381
469
|
suggestions,
|
|
382
470
|
activeSuggestionIndex,
|
|
@@ -389,6 +477,7 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
|
|
|
389
477
|
resetCompletionState,
|
|
390
478
|
navigateUp,
|
|
391
479
|
navigateDown,
|
|
480
|
+
handleAutocomplete,
|
|
392
481
|
};
|
|
393
482
|
}
|
|
394
483
|
//# sourceMappingURL=useCompletion.js.map
|