@google/gemini-cli 0.2.0-preview.1 → 0.2.0
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 +2 -32
- package/dist/google-gemini-cli-0.2.0-preview.2.tgz +0 -0
- package/dist/package.json +2 -2
- package/dist/src/config/config.d.ts +0 -1
- package/dist/src/config/config.js +1 -13
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +1 -0
- package/dist/src/config/extension.js +2 -3
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/settings.d.ts +3 -4
- package/dist/src/config/settings.js +19 -23
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +0 -36
- package/dist/src/config/settingsSchema.js +0 -36
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +0 -1
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/gemini.js +2 -25
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +1 -1
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/nonInteractiveCli.js +20 -21
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/services/FileCommandLoader.js +3 -4
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/services/McpPromptLoader.d.ts +1 -11
- package/dist/src/services/McpPromptLoader.js +16 -42
- package/dist/src/services/McpPromptLoader.js.map +1 -1
- package/dist/src/ui/App.js +6 -8
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +1 -2
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/copyCommand.js +1 -1
- package/dist/src/ui/commands/copyCommand.js.map +1 -1
- package/dist/src/ui/commands/restoreCommand.js +6 -2
- package/dist/src/ui/commands/restoreCommand.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.d.ts +1 -0
- package/dist/src/ui/commands/setupGithubCommand.js +9 -8
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.test.js +2 -7
- package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -1
- package/dist/src/ui/components/AuthDialog.test.js +10 -10
- package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.d.ts +0 -1
- package/dist/src/ui/components/FolderTrustDialog.js +3 -9
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +3 -40
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Help.js +1 -1
- package/dist/src/ui/components/Help.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +14 -141
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.js +34 -65
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +47 -107
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.js +3 -3
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/CompressionMessage.js +1 -2
- package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.js +1 -2
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.test.js +10 -11
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
- package/dist/src/ui/components/messages/GeminiMessage.js +1 -2
- package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
- package/dist/src/ui/components/messages/UserMessage.js +1 -2
- package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.js +45 -1
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/constants.d.ts +0 -2
- package/dist/src/ui/constants.js +0 -2
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.js +23 -1
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +58 -2
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +0 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +8 -4
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +3 -3
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.js +0 -1
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.d.ts +1 -4
- package/dist/src/ui/hooks/useCommandCompletion.js +8 -29
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.d.ts +0 -1
- package/dist/src/ui/hooks/useFolderTrust.js +8 -16
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +11 -28
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useLogger.d.ts +2 -2
- package/dist/src/ui/hooks/useLogger.js +3 -3
- package/dist/src/ui/hooks/useLogger.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js +1 -0
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useShellHistory.d.ts +1 -2
- package/dist/src/ui/hooks/useShellHistory.js +8 -7
- package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
- package/dist/src/ui/hooks/useShellHistory.test.js +1 -26
- package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +7 -0
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.js +1 -2
- package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.js +16 -17
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
- package/dist/src/ui/utils/commandUtils.js +11 -36
- package/dist/src/ui/utils/commandUtils.js.map +1 -1
- package/dist/src/ui/utils/commandUtils.test.js +19 -64
- package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
- package/dist/src/ui/utils/platformConstants.d.ts +2 -0
- package/dist/src/ui/utils/platformConstants.js +2 -0
- package/dist/src/ui/utils/platformConstants.js.map +1 -1
- package/dist/src/ui/utils/textUtils.d.ts +0 -18
- package/dist/src/ui/utils/textUtils.js +0 -44
- package/dist/src/ui/utils/textUtils.js.map +1 -1
- package/dist/src/utils/cleanup.js +2 -3
- package/dist/src/utils/cleanup.js.map +1 -1
- package/dist/src/utils/readStdin.js +18 -57
- package/dist/src/utils/readStdin.js.map +1 -1
- package/dist/src/utils/sandbox.d.ts +1 -1
- package/dist/src/utils/sandbox.js +6 -7
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/zed-integration/acp.js +1 -2
- package/dist/src/zed-integration/acp.js.map +1 -1
- package/dist/src/zed-integration/schema.d.ts +116 -13
- package/dist/src/zed-integration/schema.js +7 -1
- package/dist/src/zed-integration/schema.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.js +181 -136
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/src/services/McpPromptLoader.test.d.ts +0 -6
- package/dist/src/services/McpPromptLoader.test.js +0 -114
- package/dist/src/services/McpPromptLoader.test.js.map +0 -1
- package/dist/src/ui/hooks/usePromptCompletion.d.ts +0 -23
- package/dist/src/ui/hooks/usePromptCompletion.js +0 -176
- package/dist/src/ui/hooks/usePromptCompletion.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@google/gemini-cli",
|
|
3
|
-
"version": "0.2.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Gemini CLI",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
"dist"
|
|
26
26
|
],
|
|
27
27
|
"config": {
|
|
28
|
-
"sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.2.0
|
|
28
|
+
"sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.2.0"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@google/gemini-cli-core": "0.2.0
|
|
31
|
+
"@google/gemini-cli-core": "0.2.0",
|
|
32
32
|
"@google/genai": "1.13.0",
|
|
33
33
|
"@iarna/toml": "^2.2.5",
|
|
34
34
|
"@modelcontextprotocol/sdk": "^1.15.1",
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { McpPromptLoader } from './McpPromptLoader.js';
|
|
7
|
-
import { describe, it, expect } from 'vitest';
|
|
8
|
-
describe('McpPromptLoader', () => {
|
|
9
|
-
const mockConfig = {};
|
|
10
|
-
describe('parseArgs', () => {
|
|
11
|
-
it('should handle multi-word positional arguments', () => {
|
|
12
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
13
|
-
const promptArgs = [
|
|
14
|
-
{ name: 'arg1', required: true },
|
|
15
|
-
{ name: 'arg2', required: true },
|
|
16
|
-
];
|
|
17
|
-
const userArgs = 'hello world';
|
|
18
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
19
|
-
expect(result).toEqual({ arg1: 'hello', arg2: 'world' });
|
|
20
|
-
});
|
|
21
|
-
it('should handle quoted multi-word positional arguments', () => {
|
|
22
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
23
|
-
const promptArgs = [
|
|
24
|
-
{ name: 'arg1', required: true },
|
|
25
|
-
{ name: 'arg2', required: true },
|
|
26
|
-
];
|
|
27
|
-
const userArgs = '"hello world" foo';
|
|
28
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
29
|
-
expect(result).toEqual({ arg1: 'hello world', arg2: 'foo' });
|
|
30
|
-
});
|
|
31
|
-
it('should handle a single positional argument with multiple words', () => {
|
|
32
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
33
|
-
const promptArgs = [{ name: 'arg1', required: true }];
|
|
34
|
-
const userArgs = 'hello world';
|
|
35
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
36
|
-
expect(result).toEqual({ arg1: 'hello world' });
|
|
37
|
-
});
|
|
38
|
-
it('should handle escaped quotes in positional arguments', () => {
|
|
39
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
40
|
-
const promptArgs = [{ name: 'arg1', required: true }];
|
|
41
|
-
const userArgs = '"hello \\"world\\""';
|
|
42
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
43
|
-
expect(result).toEqual({ arg1: 'hello "world"' });
|
|
44
|
-
});
|
|
45
|
-
it('should handle escaped backslashes in positional arguments', () => {
|
|
46
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
47
|
-
const promptArgs = [{ name: 'arg1', required: true }];
|
|
48
|
-
const userArgs = '"hello\\\\world"';
|
|
49
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
50
|
-
expect(result).toEqual({ arg1: 'hello\\world' });
|
|
51
|
-
});
|
|
52
|
-
it('should handle named args followed by positional args', () => {
|
|
53
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
54
|
-
const promptArgs = [
|
|
55
|
-
{ name: 'named', required: true },
|
|
56
|
-
{ name: 'pos', required: true },
|
|
57
|
-
];
|
|
58
|
-
const userArgs = '--named="value" positional';
|
|
59
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
60
|
-
expect(result).toEqual({ named: 'value', pos: 'positional' });
|
|
61
|
-
});
|
|
62
|
-
it('should handle positional args followed by named args', () => {
|
|
63
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
64
|
-
const promptArgs = [
|
|
65
|
-
{ name: 'pos', required: true },
|
|
66
|
-
{ name: 'named', required: true },
|
|
67
|
-
];
|
|
68
|
-
const userArgs = 'positional --named="value"';
|
|
69
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
70
|
-
expect(result).toEqual({ pos: 'positional', named: 'value' });
|
|
71
|
-
});
|
|
72
|
-
it('should handle positional args interspersed with named args', () => {
|
|
73
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
74
|
-
const promptArgs = [
|
|
75
|
-
{ name: 'pos1', required: true },
|
|
76
|
-
{ name: 'named', required: true },
|
|
77
|
-
{ name: 'pos2', required: true },
|
|
78
|
-
];
|
|
79
|
-
const userArgs = 'p1 --named="value" p2';
|
|
80
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
81
|
-
expect(result).toEqual({ pos1: 'p1', named: 'value', pos2: 'p2' });
|
|
82
|
-
});
|
|
83
|
-
it('should treat an escaped quote at the start as a literal', () => {
|
|
84
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
85
|
-
const promptArgs = [
|
|
86
|
-
{ name: 'arg1', required: true },
|
|
87
|
-
{ name: 'arg2', required: true },
|
|
88
|
-
];
|
|
89
|
-
const userArgs = '\\"hello world';
|
|
90
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
91
|
-
expect(result).toEqual({ arg1: '"hello', arg2: 'world' });
|
|
92
|
-
});
|
|
93
|
-
it('should handle a complex mix of args', () => {
|
|
94
|
-
const loader = new McpPromptLoader(mockConfig);
|
|
95
|
-
const promptArgs = [
|
|
96
|
-
{ name: 'pos1', required: true },
|
|
97
|
-
{ name: 'named1', required: true },
|
|
98
|
-
{ name: 'pos2', required: true },
|
|
99
|
-
{ name: 'named2', required: true },
|
|
100
|
-
{ name: 'pos3', required: true },
|
|
101
|
-
];
|
|
102
|
-
const userArgs = 'p1 --named1="value 1" "p2 has spaces" --named2=value2 "p3 \\"with quotes\\""';
|
|
103
|
-
const result = loader.parseArgs(userArgs, promptArgs);
|
|
104
|
-
expect(result).toEqual({
|
|
105
|
-
pos1: 'p1',
|
|
106
|
-
named1: 'value 1',
|
|
107
|
-
pos2: 'p2 has spaces',
|
|
108
|
-
named2: 'value2',
|
|
109
|
-
pos3: 'p3 "with quotes"',
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
//# sourceMappingURL=McpPromptLoader.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"McpPromptLoader.test.js","sourceRoot":"","sources":["../../../src/services/McpPromptLoader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { Config } from '@google/gemini-cli-core';
|
|
7
|
-
import { TextBuffer } from '../components/shared/text-buffer.js';
|
|
8
|
-
export declare const PROMPT_COMPLETION_MIN_LENGTH = 5;
|
|
9
|
-
export declare const PROMPT_COMPLETION_DEBOUNCE_MS = 250;
|
|
10
|
-
export interface PromptCompletion {
|
|
11
|
-
text: string;
|
|
12
|
-
isLoading: boolean;
|
|
13
|
-
isActive: boolean;
|
|
14
|
-
accept: () => void;
|
|
15
|
-
clear: () => void;
|
|
16
|
-
markSelected: (selectedText: string) => void;
|
|
17
|
-
}
|
|
18
|
-
export interface UsePromptCompletionOptions {
|
|
19
|
-
buffer: TextBuffer;
|
|
20
|
-
config?: Config;
|
|
21
|
-
enabled: boolean;
|
|
22
|
-
}
|
|
23
|
-
export declare function usePromptCompletion({ buffer, config, enabled, }: UsePromptCompletionOptions): PromptCompletion;
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { useState, useCallback, useRef, useEffect, useMemo } from 'react';
|
|
7
|
-
import { DEFAULT_GEMINI_FLASH_LITE_MODEL, getResponseText, } from '@google/gemini-cli-core';
|
|
8
|
-
export const PROMPT_COMPLETION_MIN_LENGTH = 5;
|
|
9
|
-
export const PROMPT_COMPLETION_DEBOUNCE_MS = 250;
|
|
10
|
-
export function usePromptCompletion({ buffer, config, enabled, }) {
|
|
11
|
-
const [ghostText, setGhostText] = useState('');
|
|
12
|
-
const [isLoadingGhostText, setIsLoadingGhostText] = useState(false);
|
|
13
|
-
const abortControllerRef = useRef(null);
|
|
14
|
-
const [justSelectedSuggestion, setJustSelectedSuggestion] = useState(false);
|
|
15
|
-
const lastSelectedTextRef = useRef('');
|
|
16
|
-
const lastRequestedTextRef = useRef('');
|
|
17
|
-
const isPromptCompletionEnabled = enabled && (config?.getEnablePromptCompletion() ?? false);
|
|
18
|
-
const clearGhostText = useCallback(() => {
|
|
19
|
-
setGhostText('');
|
|
20
|
-
setIsLoadingGhostText(false);
|
|
21
|
-
}, []);
|
|
22
|
-
const acceptGhostText = useCallback(() => {
|
|
23
|
-
if (ghostText && ghostText.length > buffer.text.length) {
|
|
24
|
-
buffer.setText(ghostText);
|
|
25
|
-
setGhostText('');
|
|
26
|
-
setJustSelectedSuggestion(true);
|
|
27
|
-
lastSelectedTextRef.current = ghostText;
|
|
28
|
-
}
|
|
29
|
-
}, [ghostText, buffer]);
|
|
30
|
-
const markSuggestionSelected = useCallback((selectedText) => {
|
|
31
|
-
setJustSelectedSuggestion(true);
|
|
32
|
-
lastSelectedTextRef.current = selectedText;
|
|
33
|
-
}, []);
|
|
34
|
-
const generatePromptSuggestions = useCallback(async () => {
|
|
35
|
-
const trimmedText = buffer.text.trim();
|
|
36
|
-
const geminiClient = config?.getGeminiClient();
|
|
37
|
-
if (trimmedText === lastRequestedTextRef.current) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
if (abortControllerRef.current) {
|
|
41
|
-
abortControllerRef.current.abort();
|
|
42
|
-
}
|
|
43
|
-
if (trimmedText.length < PROMPT_COMPLETION_MIN_LENGTH ||
|
|
44
|
-
!geminiClient ||
|
|
45
|
-
trimmedText.startsWith('/') ||
|
|
46
|
-
trimmedText.includes('@') ||
|
|
47
|
-
!isPromptCompletionEnabled) {
|
|
48
|
-
clearGhostText();
|
|
49
|
-
lastRequestedTextRef.current = '';
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
lastRequestedTextRef.current = trimmedText;
|
|
53
|
-
setIsLoadingGhostText(true);
|
|
54
|
-
abortControllerRef.current = new AbortController();
|
|
55
|
-
const signal = abortControllerRef.current.signal;
|
|
56
|
-
try {
|
|
57
|
-
const contents = [
|
|
58
|
-
{
|
|
59
|
-
role: 'user',
|
|
60
|
-
parts: [
|
|
61
|
-
{
|
|
62
|
-
text: `You are a professional prompt engineering assistant. Complete the user's partial prompt with expert precision and clarity. User's input: "${trimmedText}" Continue this prompt by adding specific, actionable details that align with the user's intent. Focus on: clear, precise language; structured requirements; professional terminology; measurable outcomes. Length Guidelines: Keep suggestions concise (ideally 10-20 characters); prioritize brevity while maintaining clarity; use essential keywords only; avoid redundant phrases. Start your response with the exact user text ("${trimmedText}") followed by your completion. Provide practical, implementation-focused suggestions rather than creative interpretations. Format: Plain text only. Single completion. Match the user's language. Emphasize conciseness over elaboration.`,
|
|
63
|
-
},
|
|
64
|
-
],
|
|
65
|
-
},
|
|
66
|
-
];
|
|
67
|
-
const generationConfig = {
|
|
68
|
-
temperature: 0.3,
|
|
69
|
-
maxOutputTokens: 16000,
|
|
70
|
-
thinkingConfig: {
|
|
71
|
-
thinkingBudget: 0,
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
const response = await geminiClient.generateContent(contents, generationConfig, signal, DEFAULT_GEMINI_FLASH_LITE_MODEL);
|
|
75
|
-
if (signal.aborted) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
if (response) {
|
|
79
|
-
const responseText = getResponseText(response);
|
|
80
|
-
if (responseText) {
|
|
81
|
-
const suggestionText = responseText.trim();
|
|
82
|
-
if (suggestionText.length > 0 &&
|
|
83
|
-
suggestionText.startsWith(trimmedText)) {
|
|
84
|
-
setGhostText(suggestionText);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
clearGhostText();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
if (!(signal.aborted ||
|
|
94
|
-
(error instanceof Error && error.name === 'AbortError'))) {
|
|
95
|
-
console.error('prompt completion error:', error);
|
|
96
|
-
// Clear the last requested text to allow retry only on real errors
|
|
97
|
-
lastRequestedTextRef.current = '';
|
|
98
|
-
}
|
|
99
|
-
clearGhostText();
|
|
100
|
-
}
|
|
101
|
-
finally {
|
|
102
|
-
if (!signal.aborted) {
|
|
103
|
-
setIsLoadingGhostText(false);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}, [buffer.text, config, clearGhostText, isPromptCompletionEnabled]);
|
|
107
|
-
const isCursorAtEnd = useCallback(() => {
|
|
108
|
-
const [cursorRow, cursorCol] = buffer.cursor;
|
|
109
|
-
const totalLines = buffer.lines.length;
|
|
110
|
-
if (cursorRow !== totalLines - 1) {
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
|
-
const lastLine = buffer.lines[cursorRow] || '';
|
|
114
|
-
return cursorCol === lastLine.length;
|
|
115
|
-
}, [buffer.cursor, buffer.lines]);
|
|
116
|
-
const handlePromptCompletion = useCallback(() => {
|
|
117
|
-
if (!isCursorAtEnd()) {
|
|
118
|
-
clearGhostText();
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
const trimmedText = buffer.text.trim();
|
|
122
|
-
if (justSelectedSuggestion && trimmedText === lastSelectedTextRef.current) {
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
if (trimmedText !== lastSelectedTextRef.current) {
|
|
126
|
-
setJustSelectedSuggestion(false);
|
|
127
|
-
lastSelectedTextRef.current = '';
|
|
128
|
-
}
|
|
129
|
-
generatePromptSuggestions();
|
|
130
|
-
}, [
|
|
131
|
-
buffer.text,
|
|
132
|
-
generatePromptSuggestions,
|
|
133
|
-
justSelectedSuggestion,
|
|
134
|
-
isCursorAtEnd,
|
|
135
|
-
clearGhostText,
|
|
136
|
-
]);
|
|
137
|
-
// Debounce prompt completion
|
|
138
|
-
useEffect(() => {
|
|
139
|
-
const timeoutId = setTimeout(handlePromptCompletion, PROMPT_COMPLETION_DEBOUNCE_MS);
|
|
140
|
-
return () => clearTimeout(timeoutId);
|
|
141
|
-
}, [buffer.text, buffer.cursor, handlePromptCompletion]);
|
|
142
|
-
// Ghost text validation - clear if it doesn't match current text or cursor not at end
|
|
143
|
-
useEffect(() => {
|
|
144
|
-
const currentText = buffer.text.trim();
|
|
145
|
-
if (ghostText && !isCursorAtEnd()) {
|
|
146
|
-
clearGhostText();
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
if (ghostText &&
|
|
150
|
-
currentText.length > 0 &&
|
|
151
|
-
!ghostText.startsWith(currentText)) {
|
|
152
|
-
clearGhostText();
|
|
153
|
-
}
|
|
154
|
-
}, [buffer.text, buffer.cursor, ghostText, clearGhostText, isCursorAtEnd]);
|
|
155
|
-
// Cleanup on unmount
|
|
156
|
-
useEffect(() => () => abortControllerRef.current?.abort(), []);
|
|
157
|
-
const isActive = useMemo(() => {
|
|
158
|
-
if (!isPromptCompletionEnabled)
|
|
159
|
-
return false;
|
|
160
|
-
if (!isCursorAtEnd())
|
|
161
|
-
return false;
|
|
162
|
-
const trimmedText = buffer.text.trim();
|
|
163
|
-
return (trimmedText.length >= PROMPT_COMPLETION_MIN_LENGTH &&
|
|
164
|
-
!trimmedText.startsWith('/') &&
|
|
165
|
-
!trimmedText.includes('@'));
|
|
166
|
-
}, [buffer.text, isPromptCompletionEnabled, isCursorAtEnd]);
|
|
167
|
-
return {
|
|
168
|
-
text: ghostText,
|
|
169
|
-
isLoading: isLoadingGhostText,
|
|
170
|
-
isActive,
|
|
171
|
-
accept: acceptGhostText,
|
|
172
|
-
clear: clearGhostText,
|
|
173
|
-
markSelected: markSuggestionSelected,
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
//# sourceMappingURL=usePromptCompletion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePromptCompletion.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePromptCompletion.ts"],"names":[],"mappings":"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"}
|