@joeytheman/gemini-mcp-tool 1.3.0 → 2.3.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 +127 -35
- package/dist/__tests__/agyModelSteps.test.d.ts +2 -0
- package/dist/__tests__/agyModelSteps.test.d.ts.map +1 -0
- package/dist/__tests__/agyModelSteps.test.js +58 -0
- package/dist/__tests__/agyModelSteps.test.js.map +1 -0
- package/dist/__tests__/ask-gemini.test.js +99 -37
- package/dist/__tests__/ask-gemini.test.js.map +1 -1
- package/dist/__tests__/capture-script.chromium.test.d.ts +2 -0
- package/dist/__tests__/capture-script.chromium.test.d.ts.map +1 -0
- package/dist/__tests__/capture-script.chromium.test.js +235 -0
- package/dist/__tests__/capture-script.chromium.test.js.map +1 -0
- package/dist/__tests__/layout-snippet.chromium.test.d.ts +2 -0
- package/dist/__tests__/layout-snippet.chromium.test.d.ts.map +1 -0
- package/dist/__tests__/layout-snippet.chromium.test.js +333 -0
- package/dist/__tests__/layout-snippet.chromium.test.js.map +1 -0
- package/dist/__tests__/layout-snippet.test.d.ts +2 -0
- package/dist/__tests__/layout-snippet.test.d.ts.map +1 -0
- package/dist/__tests__/layout-snippet.test.js +12 -0
- package/dist/__tests__/layout-snippet.test.js.map +1 -0
- package/dist/__tests__/live-pass.test.d.ts +2 -0
- package/dist/__tests__/live-pass.test.d.ts.map +1 -0
- package/dist/__tests__/live-pass.test.js +1249 -0
- package/dist/__tests__/live-pass.test.js.map +1 -0
- package/dist/__tests__/screen-review.test.d.ts +2 -0
- package/dist/__tests__/screen-review.test.d.ts.map +1 -0
- package/dist/__tests__/screen-review.test.js +553 -0
- package/dist/__tests__/screen-review.test.js.map +1 -0
- package/dist/__tests__/server-progress.test.d.ts +2 -0
- package/dist/__tests__/server-progress.test.d.ts.map +1 -0
- package/dist/__tests__/server-progress.test.js +63 -0
- package/dist/__tests__/server-progress.test.js.map +1 -0
- package/dist/__tests__/server.test.js +17 -19
- package/dist/__tests__/server.test.js.map +1 -1
- package/dist/__tests__/simple-tools.test.d.ts +2 -0
- package/dist/__tests__/simple-tools.test.d.ts.map +1 -0
- package/dist/__tests__/simple-tools.test.js +30 -0
- package/dist/__tests__/simple-tools.test.js.map +1 -0
- package/dist/__tests__/tools.test.js +91 -0
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/__tests__/utils/agyExecutor.test.d.ts +2 -0
- package/dist/__tests__/utils/agyExecutor.test.d.ts.map +1 -0
- package/dist/__tests__/utils/agyExecutor.test.js +731 -0
- package/dist/__tests__/utils/agyExecutor.test.js.map +1 -0
- package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts +2 -0
- package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts.map +1 -0
- package/dist/__tests__/utils/agyTranscriptRecovery.test.js +127 -0
- package/dist/__tests__/utils/agyTranscriptRecovery.test.js.map +1 -0
- package/dist/__tests__/utils/chunkCache.test.js +26 -2
- package/dist/__tests__/utils/chunkCache.test.js.map +1 -1
- package/dist/__tests__/utils/commandExecutor.test.js +185 -7
- package/dist/__tests__/utils/commandExecutor.test.js.map +1 -1
- package/dist/__tests__/utils/fileReferences.test.d.ts +2 -0
- package/dist/__tests__/utils/fileReferences.test.d.ts.map +1 -0
- package/dist/__tests__/utils/fileReferences.test.js +87 -0
- package/dist/__tests__/utils/fileReferences.test.js.map +1 -0
- package/dist/__tests__/utils/gitStatusGuard.test.d.ts +2 -0
- package/dist/__tests__/utils/gitStatusGuard.test.d.ts.map +1 -0
- package/dist/__tests__/utils/gitStatusGuard.test.js +106 -0
- package/dist/__tests__/utils/gitStatusGuard.test.js.map +1 -0
- package/dist/__tests__/utils/progressUpdates.test.d.ts +2 -0
- package/dist/__tests__/utils/progressUpdates.test.d.ts.map +1 -0
- package/dist/__tests__/utils/progressUpdates.test.js +62 -0
- package/dist/__tests__/utils/progressUpdates.test.js.map +1 -0
- package/dist/__tests__/utils/responseCache.test.js +31 -11
- package/dist/__tests__/utils/responseCache.test.js.map +1 -1
- package/dist/__tests__/utils/test-helpers.d.ts +4 -0
- package/dist/__tests__/utils/test-helpers.d.ts.map +1 -1
- package/dist/__tests__/utils/test-helpers.js +16 -0
- package/dist/__tests__/utils/test-helpers.js.map +1 -1
- package/dist/constants.d.ts +91 -26
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +101 -28
- package/dist/constants.js.map +1 -1
- package/dist/index.js +20 -95
- package/dist/index.js.map +1 -1
- package/dist/layoutCheckSnippet.generated.d.ts +2 -0
- package/dist/layoutCheckSnippet.generated.d.ts.map +1 -0
- package/dist/layoutCheckSnippet.generated.js +3 -0
- package/dist/layoutCheckSnippet.generated.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +34 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -1
- package/dist/tools/ask-gemini.tool.js +40 -23
- package/dist/tools/ask-gemini.tool.js.map +1 -1
- package/dist/tools/brainstorm.tool.d.ts.map +1 -1
- package/dist/tools/brainstorm.tool.js +7 -5
- package/dist/tools/brainstorm.tool.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/live-pass.tool.d.ts +206 -0
- package/dist/tools/live-pass.tool.d.ts.map +1 -0
- package/dist/tools/live-pass.tool.js +670 -0
- package/dist/tools/live-pass.tool.js.map +1 -0
- package/dist/tools/registry.d.ts +6 -4
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +14 -11
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/screen-review.tool.d.ts +124 -0
- package/dist/tools/screen-review.tool.d.ts.map +1 -0
- package/dist/tools/screen-review.tool.js +449 -0
- package/dist/tools/screen-review.tool.js.map +1 -0
- package/dist/tools/simple-tools.d.ts.map +1 -1
- package/dist/tools/simple-tools.js +9 -3
- package/dist/tools/simple-tools.js.map +1 -1
- package/dist/utils/agyExecutor.d.ts +76 -0
- package/dist/utils/agyExecutor.d.ts.map +1 -0
- package/dist/utils/agyExecutor.js +449 -0
- package/dist/utils/agyExecutor.js.map +1 -0
- package/dist/utils/agyModelSteps.d.ts +5 -0
- package/dist/utils/agyModelSteps.d.ts.map +1 -0
- package/dist/utils/agyModelSteps.js +33 -0
- package/dist/utils/agyModelSteps.js.map +1 -0
- package/dist/utils/agyReport.d.ts +19 -0
- package/dist/utils/agyReport.d.ts.map +1 -0
- package/dist/utils/agyReport.js +62 -0
- package/dist/utils/agyReport.js.map +1 -0
- package/dist/utils/agyTranscriptRecovery.d.ts +16 -0
- package/dist/utils/agyTranscriptRecovery.d.ts.map +1 -0
- package/dist/utils/agyTranscriptRecovery.js +149 -0
- package/dist/utils/agyTranscriptRecovery.js.map +1 -0
- package/dist/utils/artifactFile.d.ts +6 -0
- package/dist/utils/artifactFile.d.ts.map +1 -0
- package/dist/utils/artifactFile.js +55 -0
- package/dist/utils/artifactFile.js.map +1 -0
- package/dist/utils/captureScript.d.ts +24 -0
- package/dist/utils/captureScript.d.ts.map +1 -0
- package/dist/utils/captureScript.js +83 -0
- package/dist/utils/captureScript.js.map +1 -0
- package/dist/utils/chunkCache.d.ts.map +1 -1
- package/dist/utils/chunkCache.js +19 -5
- package/dist/utils/chunkCache.js.map +1 -1
- package/dist/utils/commandExecutor.d.ts +7 -1
- package/dist/utils/commandExecutor.d.ts.map +1 -1
- package/dist/utils/commandExecutor.js +162 -22
- package/dist/utils/commandExecutor.js.map +1 -1
- package/dist/utils/fileReferences.d.ts +45 -0
- package/dist/utils/fileReferences.d.ts.map +1 -0
- package/dist/utils/fileReferences.js +169 -0
- package/dist/utils/fileReferences.js.map +1 -0
- package/dist/utils/gitCheckout.d.ts +14 -0
- package/dist/utils/gitCheckout.d.ts.map +1 -0
- package/dist/utils/gitCheckout.js +36 -0
- package/dist/utils/gitCheckout.js.map +1 -0
- package/dist/utils/gitStatusGuard.d.ts +35 -0
- package/dist/utils/gitStatusGuard.d.ts.map +1 -0
- package/dist/utils/gitStatusGuard.js +82 -0
- package/dist/utils/gitStatusGuard.js.map +1 -0
- package/dist/utils/layoutCheck.d.ts +58 -0
- package/dist/utils/layoutCheck.d.ts.map +1 -0
- package/dist/utils/layoutCheck.js +84 -0
- package/dist/utils/layoutCheck.js.map +1 -0
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/progressUpdates.d.ts +14 -0
- package/dist/utils/progressUpdates.d.ts.map +1 -0
- package/dist/utils/progressUpdates.js +40 -0
- package/dist/utils/progressUpdates.js.map +1 -0
- package/dist/utils/responseCache.d.ts +3 -3
- package/dist/utils/responseCache.d.ts.map +1 -1
- package/dist/utils/responseCache.js +11 -6
- package/dist/utils/responseCache.js.map +1 -1
- package/package.json +19 -16
- package/dist/__tests__/utils/geminiExecutor.test.d.ts +0 -2
- package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +0 -1
- package/dist/__tests__/utils/geminiExecutor.test.js +0 -337
- package/dist/__tests__/utils/geminiExecutor.test.js.map +0 -1
- package/dist/utils/geminiExecutor.d.ts +0 -17
- package/dist/utils/geminiExecutor.d.ts.map +0 -1
- package/dist/utils/geminiExecutor.js +0 -238
- package/dist/utils/geminiExecutor.js.map +0 -1
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
// Mock logger
|
|
3
|
-
vi.mock('../../utils/logger.js', () => ({
|
|
4
|
-
Logger: {
|
|
5
|
-
debug: vi.fn(),
|
|
6
|
-
warn: vi.fn(),
|
|
7
|
-
error: vi.fn(),
|
|
8
|
-
log: vi.fn(),
|
|
9
|
-
commandExecution: vi.fn(),
|
|
10
|
-
commandComplete: vi.fn(),
|
|
11
|
-
},
|
|
12
|
-
}));
|
|
13
|
-
// Mock commandExecutor
|
|
14
|
-
const mockExecuteCommand = vi.fn();
|
|
15
|
-
vi.mock('../../utils/commandExecutor.js', () => ({
|
|
16
|
-
executeCommand: (...args) => mockExecuteCommand(...args),
|
|
17
|
-
}));
|
|
18
|
-
// Mock responseCache
|
|
19
|
-
const mockIsCacheEnabled = vi.fn().mockReturnValue(false);
|
|
20
|
-
const mockGenerateCacheKey = vi.fn().mockReturnValue('mock-cache-key');
|
|
21
|
-
const mockGetCachedResponse = vi.fn().mockReturnValue(undefined);
|
|
22
|
-
const mockCacheResponse = vi.fn();
|
|
23
|
-
vi.mock('../../utils/responseCache.js', () => ({
|
|
24
|
-
isCacheEnabled: () => mockIsCacheEnabled(),
|
|
25
|
-
generateCacheKey: (...args) => mockGenerateCacheKey(...args),
|
|
26
|
-
getCachedResponse: (...args) => mockGetCachedResponse(...args),
|
|
27
|
-
cacheResponse: (...args) => mockCacheResponse(...args),
|
|
28
|
-
}));
|
|
29
|
-
// Mock chunkCache
|
|
30
|
-
vi.mock('../../utils/chunkCache.js', () => ({
|
|
31
|
-
cacheChunks: vi.fn().mockReturnValue('chunk123'),
|
|
32
|
-
getChunks: vi.fn().mockReturnValue(null),
|
|
33
|
-
}));
|
|
34
|
-
import { executeGeminiCLI, processChangeModeOutput } from '../../utils/geminiExecutor.js';
|
|
35
|
-
import { CLI, MODELS, ERROR_MESSAGES } from '../../constants.js';
|
|
36
|
-
describe('executeGeminiCLI', () => {
|
|
37
|
-
beforeEach(() => {
|
|
38
|
-
vi.clearAllMocks();
|
|
39
|
-
mockIsCacheEnabled.mockReturnValue(false);
|
|
40
|
-
mockGenerateCacheKey.mockReturnValue('mock-cache-key');
|
|
41
|
-
mockGetCachedResponse.mockReturnValue(undefined);
|
|
42
|
-
mockExecuteCommand.mockResolvedValue('Gemini response');
|
|
43
|
-
});
|
|
44
|
-
describe('argument building', () => {
|
|
45
|
-
it('should add model flag when specified', async () => {
|
|
46
|
-
await executeGeminiCLI('test', { model: 'gemini-3-flash-preview' });
|
|
47
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
48
|
-
expect(args).toContain(CLI.FLAGS.MODEL);
|
|
49
|
-
expect(args).toContain('gemini-3-flash-preview');
|
|
50
|
-
});
|
|
51
|
-
it('should add sandbox flag when specified', async () => {
|
|
52
|
-
await executeGeminiCLI('test', { sandbox: true });
|
|
53
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
54
|
-
expect(args).toContain(CLI.FLAGS.SANDBOX);
|
|
55
|
-
});
|
|
56
|
-
it('should add yolo flag when specified', async () => {
|
|
57
|
-
await executeGeminiCLI('test', { yolo: true });
|
|
58
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
59
|
-
expect(args).toContain(CLI.FLAGS.YOLO);
|
|
60
|
-
});
|
|
61
|
-
it('should add debug flag when specified', async () => {
|
|
62
|
-
await executeGeminiCLI('test', { debug: true });
|
|
63
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
64
|
-
expect(args).toContain(CLI.FLAGS.DEBUG);
|
|
65
|
-
});
|
|
66
|
-
it('should add approval mode when specified', async () => {
|
|
67
|
-
await executeGeminiCLI('test', { approvalMode: 'auto_edit' });
|
|
68
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
69
|
-
expect(args).toContain(CLI.FLAGS.APPROVAL_MODE);
|
|
70
|
-
expect(args).toContain('auto_edit');
|
|
71
|
-
});
|
|
72
|
-
it('should add output format when specified', async () => {
|
|
73
|
-
await executeGeminiCLI('test', { outputFormat: 'json' });
|
|
74
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
75
|
-
expect(args).toContain(CLI.FLAGS.OUTPUT_FORMAT);
|
|
76
|
-
expect(args).toContain('json');
|
|
77
|
-
});
|
|
78
|
-
it('should join includeDirectories array', async () => {
|
|
79
|
-
await executeGeminiCLI('test', { includeDirectories: ['src', 'lib'] });
|
|
80
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
81
|
-
expect(args).toContain(CLI.FLAGS.INCLUDE_DIRECTORIES);
|
|
82
|
-
expect(args).toContain('src,lib');
|
|
83
|
-
});
|
|
84
|
-
it('should pass includeDirectories string directly', async () => {
|
|
85
|
-
await executeGeminiCLI('test', { includeDirectories: 'src,lib' });
|
|
86
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
87
|
-
expect(args).toContain(CLI.FLAGS.INCLUDE_DIRECTORIES);
|
|
88
|
-
expect(args).toContain('src,lib');
|
|
89
|
-
});
|
|
90
|
-
it('should join extensions array', async () => {
|
|
91
|
-
await executeGeminiCLI('test', { extensions: ['ts', 'js'] });
|
|
92
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
93
|
-
expect(args).toContain(CLI.FLAGS.EXTENSIONS);
|
|
94
|
-
expect(args).toContain('ts,js');
|
|
95
|
-
});
|
|
96
|
-
it('should add resume flag when specified', async () => {
|
|
97
|
-
await executeGeminiCLI('test', { resume: 'latest' });
|
|
98
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
99
|
-
expect(args).toContain(CLI.FLAGS.RESUME);
|
|
100
|
-
expect(args).toContain('latest');
|
|
101
|
-
});
|
|
102
|
-
it('should pass prompt as positional argument', async () => {
|
|
103
|
-
await executeGeminiCLI('analyze @file.ts', {});
|
|
104
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
105
|
-
expect(args[args.length - 1]).toBe('analyze @file.ts');
|
|
106
|
-
expect(args).not.toContain(CLI.FLAGS.PROMPT);
|
|
107
|
-
});
|
|
108
|
-
it('should pass cwd when specified', async () => {
|
|
109
|
-
await executeGeminiCLI('test', { cwd: '/some/path' });
|
|
110
|
-
const cwd = mockExecuteCommand.mock.calls[0][3];
|
|
111
|
-
expect(cwd).toBe('/some/path');
|
|
112
|
-
});
|
|
113
|
-
it('should handle string options for backward compatibility', async () => {
|
|
114
|
-
await executeGeminiCLI('test', 'gemini-3-flash-preview');
|
|
115
|
-
const args = mockExecuteCommand.mock.calls[0][1];
|
|
116
|
-
expect(args).toContain(CLI.FLAGS.MODEL);
|
|
117
|
-
expect(args).toContain('gemini-3-flash-preview');
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
describe('fallback logic', () => {
|
|
121
|
-
it('should retry with Flash on quota error with non-Flash model', async () => {
|
|
122
|
-
mockExecuteCommand
|
|
123
|
-
.mockRejectedValueOnce(new Error(`Command failed: ${ERROR_MESSAGES.QUOTA_EXCEEDED}`))
|
|
124
|
-
.mockResolvedValueOnce('Flash response');
|
|
125
|
-
const result = await executeGeminiCLI('test', { model: 'gemini-2.5-pro' });
|
|
126
|
-
expect(result).toBe('Flash response');
|
|
127
|
-
expect(mockExecuteCommand).toHaveBeenCalledTimes(2);
|
|
128
|
-
// Second call should use Flash model
|
|
129
|
-
const fallbackArgs = mockExecuteCommand.mock.calls[1][1];
|
|
130
|
-
expect(fallbackArgs).toContain(MODELS.FLASH);
|
|
131
|
-
});
|
|
132
|
-
it('should throw without fallback when already using Flash', async () => {
|
|
133
|
-
mockExecuteCommand
|
|
134
|
-
.mockRejectedValueOnce(new Error(`Command failed: ${ERROR_MESSAGES.QUOTA_EXCEEDED}`));
|
|
135
|
-
await expect(executeGeminiCLI('test', { model: MODELS.FLASH })).rejects.toThrow(ERROR_MESSAGES.QUOTA_EXCEEDED);
|
|
136
|
-
expect(mockExecuteCommand).toHaveBeenCalledTimes(1);
|
|
137
|
-
});
|
|
138
|
-
it('should throw fallback error when Flash fallback also fails', async () => {
|
|
139
|
-
mockExecuteCommand
|
|
140
|
-
.mockRejectedValueOnce(new Error(`${ERROR_MESSAGES.QUOTA_EXCEEDED}`))
|
|
141
|
-
.mockRejectedValueOnce(new Error('Flash also failed'));
|
|
142
|
-
await expect(executeGeminiCLI('test', { model: 'gemini-2.5-pro' })).rejects.toThrow('fallback also failed');
|
|
143
|
-
});
|
|
144
|
-
it('should not retry for non-quota errors', async () => {
|
|
145
|
-
mockExecuteCommand.mockRejectedValueOnce(new Error('network error'));
|
|
146
|
-
await expect(executeGeminiCLI('test', {})).rejects.toThrow('network error');
|
|
147
|
-
expect(mockExecuteCommand).toHaveBeenCalledTimes(1);
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
describe('cache integration', () => {
|
|
151
|
-
it('should return cached response when cache is enabled', async () => {
|
|
152
|
-
mockIsCacheEnabled.mockReturnValue(true);
|
|
153
|
-
mockGetCachedResponse.mockReturnValue('cached result');
|
|
154
|
-
const result = await executeGeminiCLI('test', {});
|
|
155
|
-
expect(result).toBe('cached result');
|
|
156
|
-
expect(mockExecuteCommand).not.toHaveBeenCalled();
|
|
157
|
-
});
|
|
158
|
-
it('should cache successful responses when cache is enabled', async () => {
|
|
159
|
-
mockIsCacheEnabled.mockReturnValue(true);
|
|
160
|
-
mockGetCachedResponse.mockReturnValue(undefined);
|
|
161
|
-
mockExecuteCommand.mockResolvedValue('fresh result');
|
|
162
|
-
await executeGeminiCLI('test', {});
|
|
163
|
-
expect(mockCacheResponse).toHaveBeenCalledWith('mock-cache-key', 'fresh result');
|
|
164
|
-
});
|
|
165
|
-
it('should not cache changeMode responses', async () => {
|
|
166
|
-
mockIsCacheEnabled.mockReturnValue(true);
|
|
167
|
-
mockGetCachedResponse.mockReturnValue(undefined);
|
|
168
|
-
mockExecuteCommand.mockResolvedValue('edit result');
|
|
169
|
-
await executeGeminiCLI('test', { changeMode: true });
|
|
170
|
-
expect(mockCacheResponse).not.toHaveBeenCalled();
|
|
171
|
-
});
|
|
172
|
-
it('should cache successful fallback responses when cache is enabled', async () => {
|
|
173
|
-
mockIsCacheEnabled.mockReturnValue(true);
|
|
174
|
-
mockGetCachedResponse.mockReturnValue(undefined);
|
|
175
|
-
mockExecuteCommand
|
|
176
|
-
.mockRejectedValueOnce(new Error(`${ERROR_MESSAGES.QUOTA_EXCEEDED}`))
|
|
177
|
-
.mockResolvedValueOnce('fallback result');
|
|
178
|
-
const result = await executeGeminiCLI('test', { model: 'gemini-2.5-pro' });
|
|
179
|
-
expect(result).toBe('fallback result');
|
|
180
|
-
expect(mockCacheResponse).toHaveBeenCalledWith('mock-cache-key', 'fallback result');
|
|
181
|
-
});
|
|
182
|
-
it('should not use cache when disabled', async () => {
|
|
183
|
-
mockIsCacheEnabled.mockReturnValue(false);
|
|
184
|
-
await executeGeminiCLI('test', {});
|
|
185
|
-
expect(mockGetCachedResponse).not.toHaveBeenCalled();
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
describe('processChangeModeOutput', () => {
|
|
190
|
-
beforeEach(() => {
|
|
191
|
-
vi.clearAllMocks();
|
|
192
|
-
});
|
|
193
|
-
it('should parse raw result and return formatted edits', async () => {
|
|
194
|
-
const raw = `**FILE: src/a.ts:10**
|
|
195
|
-
\`\`\`
|
|
196
|
-
OLD:
|
|
197
|
-
const x = 1;
|
|
198
|
-
NEW:
|
|
199
|
-
const x = 2;
|
|
200
|
-
\`\`\``;
|
|
201
|
-
const result = await processChangeModeOutput(raw);
|
|
202
|
-
expect(result).toContain('[CHANGEMODE OUTPUT');
|
|
203
|
-
expect(result).toContain('src/a.ts');
|
|
204
|
-
expect(result).toContain('const x = 1;');
|
|
205
|
-
expect(result).toContain('const x = 2;');
|
|
206
|
-
});
|
|
207
|
-
it('should return "No edits found" for unparseable input', async () => {
|
|
208
|
-
const result = await processChangeModeOutput('just some random text');
|
|
209
|
-
expect(result).toContain('No edits found');
|
|
210
|
-
});
|
|
211
|
-
it('should return validation errors for invalid edits', async () => {
|
|
212
|
-
// Create input that parses to an edit with both oldCode and newCode empty
|
|
213
|
-
// This is tricky because the parser requires specific format - use legacy format
|
|
214
|
-
// Actually, let's just test through the flow. An edit with empty old+new
|
|
215
|
-
// isn't easily created through parsing (parser trims but keeps content).
|
|
216
|
-
// Instead, test a scenario that validates correctly: multi-line edits with bad line numbers won't happen from parser.
|
|
217
|
-
// The parser always produces valid line ranges, so validation errors from parser output are unlikely.
|
|
218
|
-
// Let's just verify the function handles the flow for valid edits.
|
|
219
|
-
const raw = `**FILE: src/a.ts:10**
|
|
220
|
-
\`\`\`
|
|
221
|
-
OLD:
|
|
222
|
-
old code
|
|
223
|
-
NEW:
|
|
224
|
-
new code
|
|
225
|
-
\`\`\``;
|
|
226
|
-
const result = await processChangeModeOutput(raw);
|
|
227
|
-
expect(result).not.toContain('validation failed');
|
|
228
|
-
});
|
|
229
|
-
it('should handle cached chunks when cacheKey provided', async () => {
|
|
230
|
-
const { getChunks } = await import('../../utils/chunkCache.js');
|
|
231
|
-
vi.mocked(getChunks).mockReturnValueOnce([
|
|
232
|
-
{
|
|
233
|
-
edits: [{
|
|
234
|
-
filename: 'cached.ts',
|
|
235
|
-
oldStartLine: 1,
|
|
236
|
-
oldEndLine: 1,
|
|
237
|
-
oldCode: 'cached old',
|
|
238
|
-
newStartLine: 1,
|
|
239
|
-
newEndLine: 1,
|
|
240
|
-
newCode: 'cached new',
|
|
241
|
-
}],
|
|
242
|
-
chunkIndex: 1,
|
|
243
|
-
totalChunks: 2,
|
|
244
|
-
hasMore: true,
|
|
245
|
-
estimatedChars: 500,
|
|
246
|
-
},
|
|
247
|
-
{
|
|
248
|
-
edits: [{
|
|
249
|
-
filename: 'cached2.ts',
|
|
250
|
-
oldStartLine: 1,
|
|
251
|
-
oldEndLine: 1,
|
|
252
|
-
oldCode: 'old2',
|
|
253
|
-
newStartLine: 1,
|
|
254
|
-
newEndLine: 1,
|
|
255
|
-
newCode: 'new2',
|
|
256
|
-
}],
|
|
257
|
-
chunkIndex: 2,
|
|
258
|
-
totalChunks: 2,
|
|
259
|
-
hasMore: false,
|
|
260
|
-
estimatedChars: 400,
|
|
261
|
-
},
|
|
262
|
-
]);
|
|
263
|
-
const result = await processChangeModeOutput('ignored', 1, 'cache-key');
|
|
264
|
-
expect(result).toContain('cached.ts');
|
|
265
|
-
expect(result).toContain('Chunk 1 of 2');
|
|
266
|
-
});
|
|
267
|
-
it('should add summary for cached chunk 1 with >5 edits', async () => {
|
|
268
|
-
const { getChunks } = await import('../../utils/chunkCache.js');
|
|
269
|
-
// Create chunk 1 with >5 edits to trigger the summary prepend
|
|
270
|
-
const manyEdits = Array.from({ length: 6 }, (_, i) => ({
|
|
271
|
-
filename: `file${i}.ts`,
|
|
272
|
-
oldStartLine: 1,
|
|
273
|
-
oldEndLine: 1,
|
|
274
|
-
oldCode: `old${i}`,
|
|
275
|
-
newStartLine: 1,
|
|
276
|
-
newEndLine: 1,
|
|
277
|
-
newCode: `new${i}`,
|
|
278
|
-
}));
|
|
279
|
-
vi.mocked(getChunks).mockReturnValueOnce([
|
|
280
|
-
{
|
|
281
|
-
edits: manyEdits,
|
|
282
|
-
chunkIndex: 1,
|
|
283
|
-
totalChunks: 2,
|
|
284
|
-
hasMore: true,
|
|
285
|
-
estimatedChars: 2000,
|
|
286
|
-
},
|
|
287
|
-
{
|
|
288
|
-
edits: [{
|
|
289
|
-
filename: 'extra.ts',
|
|
290
|
-
oldStartLine: 1,
|
|
291
|
-
oldEndLine: 1,
|
|
292
|
-
oldCode: 'old',
|
|
293
|
-
newStartLine: 1,
|
|
294
|
-
newEndLine: 1,
|
|
295
|
-
newCode: 'new',
|
|
296
|
-
}],
|
|
297
|
-
chunkIndex: 2,
|
|
298
|
-
totalChunks: 2,
|
|
299
|
-
hasMore: false,
|
|
300
|
-
estimatedChars: 200,
|
|
301
|
-
},
|
|
302
|
-
]);
|
|
303
|
-
const result = await processChangeModeOutput('ignored', 1, 'cache-key');
|
|
304
|
-
expect(result).toContain('ChangeMode Summary');
|
|
305
|
-
expect(result).toContain('Chunk 1 of 2');
|
|
306
|
-
});
|
|
307
|
-
it('should cache multi-chunk results and return first chunk with summary', async () => {
|
|
308
|
-
// Generate >5 edits across enough content to produce multiple chunks
|
|
309
|
-
const editBlocks = Array.from({ length: 7 }, (_, i) => `**FILE: src/file${i}.ts:1**
|
|
310
|
-
\`\`\`
|
|
311
|
-
OLD:
|
|
312
|
-
${'x'.repeat(3000)}
|
|
313
|
-
NEW:
|
|
314
|
-
${'y'.repeat(3000)}
|
|
315
|
-
\`\`\``).join('\n\n');
|
|
316
|
-
const result = await processChangeModeOutput(editBlocks, undefined, undefined, 'original prompt');
|
|
317
|
-
// Should contain changeMode output
|
|
318
|
-
expect(result).toContain('[CHANGEMODE OUTPUT');
|
|
319
|
-
// With >5 edits, should have summary
|
|
320
|
-
expect(result).toContain('ChangeMode Summary');
|
|
321
|
-
expect(result).toContain('Total edits: 7');
|
|
322
|
-
});
|
|
323
|
-
it('should process new result when cache misses', async () => {
|
|
324
|
-
const { getChunks } = await import('../../utils/chunkCache.js');
|
|
325
|
-
vi.mocked(getChunks).mockReturnValueOnce(null);
|
|
326
|
-
const raw = `**FILE: src/fresh.ts:1**
|
|
327
|
-
\`\`\`
|
|
328
|
-
OLD:
|
|
329
|
-
old
|
|
330
|
-
NEW:
|
|
331
|
-
new
|
|
332
|
-
\`\`\``;
|
|
333
|
-
const result = await processChangeModeOutput(raw, 1, 'bad-key');
|
|
334
|
-
expect(result).toContain('src/fresh.ts');
|
|
335
|
-
});
|
|
336
|
-
});
|
|
337
|
-
//# sourceMappingURL=geminiExecutor.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geminiExecutor.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/geminiExecutor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export interface GeminiCLIOptions {
|
|
2
|
-
model?: string;
|
|
3
|
-
sandbox?: boolean;
|
|
4
|
-
changeMode?: boolean;
|
|
5
|
-
yolo?: boolean;
|
|
6
|
-
approvalMode?: string;
|
|
7
|
-
outputFormat?: string;
|
|
8
|
-
includeDirectories?: string | string[];
|
|
9
|
-
debug?: boolean;
|
|
10
|
-
promptInteractive?: string;
|
|
11
|
-
extensions?: string | string[];
|
|
12
|
-
resume?: string;
|
|
13
|
-
cwd?: string;
|
|
14
|
-
}
|
|
15
|
-
export declare function executeGeminiCLI(prompt: string, options: GeminiCLIOptions | string, onProgress?: (newOutput: string) => void): Promise<string>;
|
|
16
|
-
export declare function processChangeModeOutput(rawResult: string, chunkIndex?: number, chunkCacheKey?: string, prompt?: string): Promise<string>;
|
|
17
|
-
//# sourceMappingURL=geminiExecutor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geminiExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/geminiExecutor.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAsED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAClC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,MAAM,CAAC,CAiIjB;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CA8DjB"}
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { executeCommand } from './commandExecutor.js';
|
|
2
|
-
import { Logger } from './logger.js';
|
|
3
|
-
import { ERROR_MESSAGES, STATUS_MESSAGES, MODELS, CLI } from '../constants.js';
|
|
4
|
-
import { parseChangeModeOutput, validateChangeModeEdits } from './changeModeParser.js';
|
|
5
|
-
import { formatChangeModeResponse, summarizeChangeModeEdits } from './changeModeTranslator.js';
|
|
6
|
-
import { chunkChangeModeEdits } from './changeModeChunker.js';
|
|
7
|
-
import { cacheChunks, getChunks } from './chunkCache.js';
|
|
8
|
-
import { generateCacheKey, getCachedResponse, cacheResponse, isCacheEnabled } from './responseCache.js';
|
|
9
|
-
/**
|
|
10
|
-
* Helper function to build Gemini CLI arguments from options
|
|
11
|
-
* Eliminates code duplication between main execution and fallback
|
|
12
|
-
*/
|
|
13
|
-
function buildGeminiArgs(opts, prompt, forceModel) {
|
|
14
|
-
const args = [];
|
|
15
|
-
const model = forceModel || opts.model;
|
|
16
|
-
// Model selection
|
|
17
|
-
if (model) {
|
|
18
|
-
args.push(CLI.FLAGS.MODEL, model);
|
|
19
|
-
}
|
|
20
|
-
// Boolean flags
|
|
21
|
-
if (opts.sandbox) {
|
|
22
|
-
args.push(CLI.FLAGS.SANDBOX);
|
|
23
|
-
}
|
|
24
|
-
if (opts.yolo) {
|
|
25
|
-
args.push(CLI.FLAGS.YOLO);
|
|
26
|
-
}
|
|
27
|
-
if (opts.debug) {
|
|
28
|
-
args.push(CLI.FLAGS.DEBUG);
|
|
29
|
-
}
|
|
30
|
-
// Approval mode (overrides yolo if both are set)
|
|
31
|
-
if (opts.approvalMode) {
|
|
32
|
-
args.push(CLI.FLAGS.APPROVAL_MODE, opts.approvalMode);
|
|
33
|
-
}
|
|
34
|
-
// Output format
|
|
35
|
-
if (opts.outputFormat) {
|
|
36
|
-
args.push(CLI.FLAGS.OUTPUT_FORMAT, opts.outputFormat);
|
|
37
|
-
}
|
|
38
|
-
// Include directories (array or comma-separated string)
|
|
39
|
-
if (opts.includeDirectories) {
|
|
40
|
-
const dirs = Array.isArray(opts.includeDirectories)
|
|
41
|
-
? opts.includeDirectories.join(',')
|
|
42
|
-
: opts.includeDirectories;
|
|
43
|
-
args.push(CLI.FLAGS.INCLUDE_DIRECTORIES, dirs);
|
|
44
|
-
}
|
|
45
|
-
// Extensions (array or comma-separated string)
|
|
46
|
-
if (opts.extensions) {
|
|
47
|
-
const exts = Array.isArray(opts.extensions)
|
|
48
|
-
? opts.extensions.join(',')
|
|
49
|
-
: opts.extensions;
|
|
50
|
-
args.push(CLI.FLAGS.EXTENSIONS, exts);
|
|
51
|
-
}
|
|
52
|
-
// Resume session
|
|
53
|
-
if (opts.resume) {
|
|
54
|
-
args.push(CLI.FLAGS.RESUME, opts.resume);
|
|
55
|
-
}
|
|
56
|
-
// Prompt interactive
|
|
57
|
-
if (opts.promptInteractive) {
|
|
58
|
-
args.push(CLI.FLAGS.PROMPT_INTERACTIVE, opts.promptInteractive);
|
|
59
|
-
}
|
|
60
|
-
// Use positional prompt (not -p flag which is deprecated in Gemini CLI v0.18+).
|
|
61
|
-
// @ symbols are safe here: with spawn(cmd, argsArray, {shell: true}),
|
|
62
|
-
// Node.js auto-quotes each arg for cmd.exe, and @ is not a cmd.exe metacharacter.
|
|
63
|
-
args.push(prompt);
|
|
64
|
-
return args;
|
|
65
|
-
}
|
|
66
|
-
export async function executeGeminiCLI(prompt, options, onProgress) {
|
|
67
|
-
// Handle backward compatibility - if options is a string, it's the old 'model' parameter
|
|
68
|
-
let opts;
|
|
69
|
-
if (typeof options === 'string') {
|
|
70
|
-
opts = { model: options };
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
opts = options || {};
|
|
74
|
-
}
|
|
75
|
-
// Check cache first for non-changeMode requests (changeMode needs fresh responses)
|
|
76
|
-
if (isCacheEnabled() && !opts.changeMode) {
|
|
77
|
-
const cacheKey = generateCacheKey(prompt, opts);
|
|
78
|
-
const cached = getCachedResponse(cacheKey);
|
|
79
|
-
if (cached) {
|
|
80
|
-
Logger.debug('Returning cached response');
|
|
81
|
-
return cached;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
let prompt_processed = prompt;
|
|
85
|
-
if (opts.changeMode) {
|
|
86
|
-
prompt_processed = prompt.replace(/file:(\S+)/g, '@$1');
|
|
87
|
-
const changeModeInstructions = `
|
|
88
|
-
[CHANGEMODE INSTRUCTIONS]
|
|
89
|
-
You are generating code modifications that will be processed by an automated system. The output format is critical because it enables programmatic application of changes without human intervention.
|
|
90
|
-
|
|
91
|
-
INSTRUCTIONS:
|
|
92
|
-
1. Analyze each provided file thoroughly
|
|
93
|
-
2. Identify locations requiring changes based on the user request
|
|
94
|
-
3. For each change, output in the exact format specified
|
|
95
|
-
4. The OLD section must be EXACTLY what appears in the file (copy-paste exact match)
|
|
96
|
-
5. Provide complete, directly replacing code blocks
|
|
97
|
-
6. Verify line numbers are accurate
|
|
98
|
-
|
|
99
|
-
CRITICAL REQUIREMENTS:
|
|
100
|
-
1. Output edits in the EXACT format specified below - no deviations
|
|
101
|
-
2. The OLD string MUST be findable with Ctrl+F - it must be a unique, exact match
|
|
102
|
-
3. Include enough surrounding lines to make the OLD string unique
|
|
103
|
-
4. If a string appears multiple times (like </div>), include enough context lines above and below to make it unique
|
|
104
|
-
5. Copy the OLD content EXACTLY as it appears - including all whitespace, indentation, line breaks
|
|
105
|
-
6. Never use partial lines - always include complete lines from start to finish
|
|
106
|
-
|
|
107
|
-
OUTPUT FORMAT (follow exactly):
|
|
108
|
-
**FILE: [filename]:[line_number]**
|
|
109
|
-
\`\`\`
|
|
110
|
-
OLD:
|
|
111
|
-
[exact code to be replaced - must match file content precisely]
|
|
112
|
-
NEW:
|
|
113
|
-
[new code to insert - complete and functional]
|
|
114
|
-
\`\`\`
|
|
115
|
-
|
|
116
|
-
EXAMPLE 1 - Simple unique match:
|
|
117
|
-
**FILE: src/utils/helper.js:100**
|
|
118
|
-
\`\`\`
|
|
119
|
-
OLD:
|
|
120
|
-
function getMessage() {
|
|
121
|
-
return "Hello World";
|
|
122
|
-
}
|
|
123
|
-
NEW:
|
|
124
|
-
function getMessage() {
|
|
125
|
-
return "Hello Universe!";
|
|
126
|
-
}
|
|
127
|
-
\`\`\`
|
|
128
|
-
|
|
129
|
-
EXAMPLE 2 - Common tag needing context:
|
|
130
|
-
**FILE: index.html:245**
|
|
131
|
-
\`\`\`
|
|
132
|
-
OLD:
|
|
133
|
-
</div>
|
|
134
|
-
</div>
|
|
135
|
-
</section>
|
|
136
|
-
NEW:
|
|
137
|
-
</div>
|
|
138
|
-
</footer>
|
|
139
|
-
</section>
|
|
140
|
-
\`\`\`
|
|
141
|
-
|
|
142
|
-
IMPORTANT: The OLD section must be an EXACT copy from the file that can be found with Ctrl+F!
|
|
143
|
-
|
|
144
|
-
USER REQUEST:
|
|
145
|
-
${prompt_processed}
|
|
146
|
-
`;
|
|
147
|
-
prompt_processed = changeModeInstructions;
|
|
148
|
-
}
|
|
149
|
-
// Use helper function to build args (eliminates code duplication)
|
|
150
|
-
const args = buildGeminiArgs(opts, prompt_processed);
|
|
151
|
-
try {
|
|
152
|
-
const result = await executeCommand(CLI.COMMANDS.GEMINI, args, onProgress, opts.cwd);
|
|
153
|
-
// Cache successful non-changeMode responses
|
|
154
|
-
if (isCacheEnabled() && !opts.changeMode) {
|
|
155
|
-
const cacheKey = generateCacheKey(prompt, opts);
|
|
156
|
-
cacheResponse(cacheKey, result);
|
|
157
|
-
}
|
|
158
|
-
return result;
|
|
159
|
-
}
|
|
160
|
-
catch (error) {
|
|
161
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
162
|
-
if (errorMessage.includes(ERROR_MESSAGES.QUOTA_EXCEEDED) && opts.model !== MODELS.FLASH) {
|
|
163
|
-
Logger.warn(`${ERROR_MESSAGES.QUOTA_EXCEEDED}. Falling back to ${MODELS.FLASH}.`);
|
|
164
|
-
await sendStatusMessage(STATUS_MESSAGES.FLASH_RETRY);
|
|
165
|
-
// Use helper function with Flash model override (eliminates code duplication)
|
|
166
|
-
const fallbackArgs = buildGeminiArgs(opts, prompt_processed, MODELS.FLASH);
|
|
167
|
-
try {
|
|
168
|
-
const result = await executeCommand(CLI.COMMANDS.GEMINI, fallbackArgs, onProgress, opts.cwd);
|
|
169
|
-
Logger.warn(`Successfully executed with ${MODELS.FLASH} fallback.`);
|
|
170
|
-
await sendStatusMessage(STATUS_MESSAGES.FLASH_SUCCESS);
|
|
171
|
-
// Cache successful fallback response (non-changeMode only)
|
|
172
|
-
if (isCacheEnabled() && !opts.changeMode) {
|
|
173
|
-
const cacheKey = generateCacheKey(prompt, opts);
|
|
174
|
-
cacheResponse(cacheKey, result);
|
|
175
|
-
}
|
|
176
|
-
return result;
|
|
177
|
-
}
|
|
178
|
-
catch (fallbackError) {
|
|
179
|
-
const fallbackErrorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
|
|
180
|
-
throw new Error(`${MODELS.PRO} quota exceeded, ${MODELS.FLASH} fallback also failed: ${fallbackErrorMessage}`);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
throw error;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
export async function processChangeModeOutput(rawResult, chunkIndex, chunkCacheKey, prompt) {
|
|
189
|
-
// Check for cached chunks first
|
|
190
|
-
if (chunkIndex && chunkCacheKey) {
|
|
191
|
-
const cachedChunks = getChunks(chunkCacheKey);
|
|
192
|
-
if (cachedChunks && chunkIndex > 0 && chunkIndex <= cachedChunks.length) {
|
|
193
|
-
Logger.debug(`Using cached chunk ${chunkIndex} of ${cachedChunks.length}`);
|
|
194
|
-
const chunk = cachedChunks[chunkIndex - 1];
|
|
195
|
-
let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: cachedChunks.length, cacheKey: chunkCacheKey });
|
|
196
|
-
// Add summary for first chunk only
|
|
197
|
-
if (chunkIndex === 1 && chunk.edits.length > 5) {
|
|
198
|
-
const allEdits = cachedChunks.flatMap(c => c.edits);
|
|
199
|
-
result = summarizeChangeModeEdits(allEdits) + '\n\n' + result;
|
|
200
|
-
}
|
|
201
|
-
return result;
|
|
202
|
-
}
|
|
203
|
-
Logger.debug(`Cache miss or invalid chunk index, processing new result`);
|
|
204
|
-
}
|
|
205
|
-
// Parse OLD/NEW format
|
|
206
|
-
const edits = parseChangeModeOutput(rawResult);
|
|
207
|
-
if (edits.length === 0) {
|
|
208
|
-
return `No edits found in Gemini's response. Please ensure Gemini uses the OLD/NEW format. \n\n+ ${rawResult}`;
|
|
209
|
-
}
|
|
210
|
-
// Validate edits
|
|
211
|
-
const validation = validateChangeModeEdits(edits);
|
|
212
|
-
if (!validation.valid) {
|
|
213
|
-
return `Edit validation failed:\n${validation.errors.join('\n')}`;
|
|
214
|
-
}
|
|
215
|
-
const chunks = chunkChangeModeEdits(edits);
|
|
216
|
-
// Cache if multiple chunks and we have the original prompt
|
|
217
|
-
let cacheKey;
|
|
218
|
-
if (chunks.length > 1 && prompt) {
|
|
219
|
-
cacheKey = cacheChunks(prompt, chunks);
|
|
220
|
-
Logger.debug(`Cached ${chunks.length} chunks with key: ${cacheKey}`);
|
|
221
|
-
}
|
|
222
|
-
// Return requested chunk or first chunk
|
|
223
|
-
const returnChunkIndex = (chunkIndex && chunkIndex > 0 && chunkIndex <= chunks.length) ? chunkIndex : 1;
|
|
224
|
-
const returnChunk = chunks[returnChunkIndex - 1];
|
|
225
|
-
// Format the response
|
|
226
|
-
let result = formatChangeModeResponse(returnChunk.edits, chunks.length > 1 ? { current: returnChunkIndex, total: chunks.length, cacheKey } : undefined);
|
|
227
|
-
// Add summary if helpful (only for first chunk)
|
|
228
|
-
if (returnChunkIndex === 1 && edits.length > 5) {
|
|
229
|
-
result = summarizeChangeModeEdits(edits, chunks.length > 1) + '\n\n' + result;
|
|
230
|
-
}
|
|
231
|
-
Logger.debug(`ChangeMode: Parsed ${edits.length} edits, ${chunks.length} chunks, returning chunk ${returnChunkIndex}`);
|
|
232
|
-
return result;
|
|
233
|
-
}
|
|
234
|
-
// Placeholder
|
|
235
|
-
async function sendStatusMessage(message) {
|
|
236
|
-
Logger.debug(`Status: ${message}`);
|
|
237
|
-
}
|
|
238
|
-
//# sourceMappingURL=geminiExecutor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"geminiExecutor.js","sourceRoot":"","sources":["../../src/utils/geminiExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,cAAc,EACd,eAAe,EACf,MAAM,EACN,GAAG,EACJ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAiBxG;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAsB,EAAE,MAAc,EAAE,UAAmB;IAClF,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC;IAEvC,kBAAkB;IAClB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,gBAAgB;IAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,iDAAiD;IACjD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,gBAAgB;IAChB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,wDAAwD;IACxD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;YACjD,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,+CAA+C;IAC/C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,iBAAiB;IACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,qBAAqB;IACrB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClE,CAAC;IAED,gFAAgF;IAChF,sEAAsE;IACtE,kFAAkF;IAClF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAElB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,OAAkC,EAClC,UAAwC;IAExC,yFAAyF;IACzF,IAAI,IAAsB,CAAC;IAC3B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,mFAAmF;IACnF,IAAI,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,GAAG,MAAM,CAAC;IAE9B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAExD,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0DjC,gBAAgB;CACjB,CAAC;QACE,gBAAgB,GAAG,sBAAsB,CAAC;IAC5C,CAAC;IAED,kEAAkE;IAClE,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAErF,4CAA4C;QAC5C,IAAI,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAChD,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;YACxF,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,cAAc,qBAAqB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YAClF,MAAM,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAErD,8EAA8E;YAC9E,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAE3E,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7F,MAAM,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC;gBACpE,MAAM,iBAAiB,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;gBAEvD,2DAA2D;gBAC3D,IAAI,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBAChD,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAClC,CAAC;gBAED,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,aAAa,EAAE,CAAC;gBACvB,MAAM,oBAAoB,GAAG,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC5G,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,oBAAoB,MAAM,CAAC,KAAK,0BAA0B,oBAAoB,EAAE,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiB,EACjB,UAAmB,EACnB,aAAsB,EACtB,MAAe;IAEf,gCAAgC;IAChC,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,YAAY,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,sBAAsB,UAAU,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3E,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAC3C,IAAI,MAAM,GAAG,wBAAwB,CACnC,KAAK,CAAC,KAAK,EACX,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,CAC7E,CAAC;YAEF,mCAAmC;YACnC,IAAI,UAAU,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACpD,MAAM,GAAG,wBAAwB,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;YAChE,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC3E,CAAC;IAED,uBAAuB;IACvB,MAAM,KAAK,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,4FAA4F,SAAS,EAAE,CAAC;IACjH,CAAC;IAED,iBAAiB;IACjB,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,4BAA4B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAE3C,2DAA2D;IAC3D,IAAI,QAA4B,CAAC;IACjC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;QAChC,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,MAAM,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,wCAAwC;IACxC,MAAM,gBAAgB,GAAG,CAAC,UAAU,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAEjD,sBAAsB;IACtB,IAAI,MAAM,GAAG,wBAAwB,CACnC,WAAW,CAAC,KAAK,EACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAC9F,CAAC;IAEF,gDAAgD;IAChD,IAAI,gBAAgB,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,GAAG,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,MAAM,4BAA4B,gBAAgB,EAAE,CAAC,CAAC;IACvH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,cAAc;AACd,KAAK,UAAU,iBAAiB,CAAC,OAAe;IAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC"}
|