@google/gemini-cli-core 0.1.21 → 0.1.22
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 +26 -28
- package/dist/src/code_assist/converter.d.ts +1 -0
- package/dist/src/code_assist/converter.js +1 -0
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +1 -0
- package/dist/src/code_assist/oauth2.js +37 -20
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +51 -8
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +1 -1
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +1 -1
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +14 -8
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/config/config.d.ts +2 -0
- package/dist/src/config/config.js +7 -6
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +22 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/client.d.ts +4 -11
- package/dist/src/core/client.js +46 -28
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +294 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +19 -9
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +39 -15
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +6 -2
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +46 -63
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/logger.d.ts +22 -1
- package/dist/src/core/logger.js +103 -17
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +86 -20
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +79 -36
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +4 -4
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +7 -0
- package/dist/src/generated/git-commit.js +10 -0
- package/dist/src/generated/git-commit.js.map +1 -0
- package/dist/src/ide/constants.d.ts +6 -0
- package/dist/src/ide/constants.js +7 -0
- package/dist/src/ide/constants.js.map +1 -0
- package/dist/src/ide/detect-ide.js +8 -8
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +5 -1
- package/dist/src/ide/ide-client.js +57 -21
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-client.test.d.ts +6 -0
- package/dist/src/ide/ide-client.test.js +43 -0
- package/dist/src/ide/ide-client.test.js.map +1 -0
- package/dist/src/ide/ide-installer.js +5 -4
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ideContext.d.ts +6 -6
- package/dist/src/ide/process-utils.d.ts +14 -0
- package/dist/src/ide/process-utils.js +57 -0
- package/dist/src/ide/process-utils.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.js +176 -58
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +132 -62
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +3 -1
- package/dist/src/mcp/oauth-utils.js +50 -12
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +17 -2
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +5 -5
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +13 -3
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +22 -4
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +60 -34
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +11 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +91 -39
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -2
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +10 -11
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +1 -0
- package/dist/src/telemetry/constants.js +1 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/integration.test.circular.js +1 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +22 -4
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +27 -2
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +4 -0
- package/dist/src/telemetry/metrics.js +21 -8
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +31 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sdk.js +64 -36
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/sdk.test.d.ts +6 -0
- package/dist/src/telemetry/sdk.test.js +82 -0
- package/dist/src/telemetry/sdk.test.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +8 -1
- package/dist/src/telemetry/types.js +8 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/tools.d.ts +21 -6
- package/dist/src/test-utils/tools.js +77 -12
- package/dist/src/test-utils/tools.js.map +1 -1
- package/dist/src/tools/mcp-client.js +40 -10
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +31 -1
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +21 -3
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +57 -0
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/shell.js +25 -8
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +12 -0
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +1 -0
- package/dist/src/tools/tool-error.js +1 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +3 -3
- package/dist/src/tools/tool-registry.js +45 -30
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +14 -73
- package/dist/src/tools/tools.js +52 -108
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +91 -2
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +4 -5
- package/dist/src/tools/web-search.js +51 -50
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.d.ts +6 -0
- package/dist/src/tools/web-search.test.js +139 -0
- package/dist/src/tools/web-search.test.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +15 -11
- package/dist/src/tools/write-file.js +133 -144
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +57 -88
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/browser.js +4 -3
- package/dist/src/utils/browser.js.map +1 -1
- package/dist/src/utils/editCorrector.js +13 -13
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editor.js +1 -1
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +10 -10
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/filesearch/crawler.d.ts +15 -0
- package/dist/src/utils/filesearch/crawler.js +50 -0
- package/dist/src/utils/filesearch/crawler.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawler.test.js +468 -0
- package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +9 -53
- package/dist/src/utils/filesearch/fileSearch.js +62 -117
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +95 -197
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.d.ts +7 -0
- package/dist/src/utils/filesearch/ignore.js +25 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.test.js +89 -2
- package/dist/src/utils/filesearch/ignore.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +3 -3
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +3 -2
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +2 -6
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/paths.d.ts +7 -0
- package/dist/src/utils/paths.js +15 -0
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +74 -2
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/secure-browser-launcher.js +4 -3
- package/dist/src/utils/secure-browser-launcher.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +39 -0
- package/dist/src/utils/shell-utils.js +72 -2
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +132 -4
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +1 -1
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/systemEncoding.test.js +23 -23
- package/dist/src/utils/systemEncoding.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +22 -7
- package/dist/src/utils/workspaceContext.js +81 -55
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +221 -137
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { WebSearchTool } from './web-search.js';
|
|
8
|
+
import { GeminiClient } from '../core/client.js';
|
|
9
|
+
// Mock GeminiClient and Config constructor
|
|
10
|
+
vi.mock('../core/client.js');
|
|
11
|
+
vi.mock('../config/config.js');
|
|
12
|
+
describe('WebSearchTool', () => {
|
|
13
|
+
const abortSignal = new AbortController().signal;
|
|
14
|
+
let mockGeminiClient;
|
|
15
|
+
let tool;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
const mockConfigInstance = {
|
|
18
|
+
getGeminiClient: () => mockGeminiClient,
|
|
19
|
+
getProxy: () => undefined,
|
|
20
|
+
};
|
|
21
|
+
mockGeminiClient = new GeminiClient(mockConfigInstance);
|
|
22
|
+
tool = new WebSearchTool(mockConfigInstance);
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
vi.restoreAllMocks();
|
|
26
|
+
});
|
|
27
|
+
describe('build', () => {
|
|
28
|
+
it('should return an invocation for a valid query', () => {
|
|
29
|
+
const params = { query: 'test query' };
|
|
30
|
+
const invocation = tool.build(params);
|
|
31
|
+
expect(invocation).toBeDefined();
|
|
32
|
+
expect(invocation.params).toEqual(params);
|
|
33
|
+
});
|
|
34
|
+
it('should throw an error for an empty query', () => {
|
|
35
|
+
const params = { query: '' };
|
|
36
|
+
expect(() => tool.build(params)).toThrow("The 'query' parameter cannot be empty.");
|
|
37
|
+
});
|
|
38
|
+
it('should throw an error for a query with only whitespace', () => {
|
|
39
|
+
const params = { query: ' ' };
|
|
40
|
+
expect(() => tool.build(params)).toThrow("The 'query' parameter cannot be empty.");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('getDescription', () => {
|
|
44
|
+
it('should return a description of the search', () => {
|
|
45
|
+
const params = { query: 'test query' };
|
|
46
|
+
const invocation = tool.build(params);
|
|
47
|
+
expect(invocation.getDescription()).toBe('Searching the web for: "test query"');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('execute', () => {
|
|
51
|
+
it('should return search results for a successful query', async () => {
|
|
52
|
+
const params = { query: 'successful query' };
|
|
53
|
+
mockGeminiClient.generateContent.mockResolvedValue({
|
|
54
|
+
candidates: [
|
|
55
|
+
{
|
|
56
|
+
content: {
|
|
57
|
+
role: 'model',
|
|
58
|
+
parts: [{ text: 'Here are your results.' }],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
const invocation = tool.build(params);
|
|
64
|
+
const result = await invocation.execute(abortSignal);
|
|
65
|
+
expect(result.llmContent).toBe('Web search results for "successful query":\n\nHere are your results.');
|
|
66
|
+
expect(result.returnDisplay).toBe('Search results for "successful query" returned.');
|
|
67
|
+
expect(result.sources).toBeUndefined();
|
|
68
|
+
});
|
|
69
|
+
it('should handle no search results found', async () => {
|
|
70
|
+
const params = { query: 'no results query' };
|
|
71
|
+
mockGeminiClient.generateContent.mockResolvedValue({
|
|
72
|
+
candidates: [
|
|
73
|
+
{
|
|
74
|
+
content: {
|
|
75
|
+
role: 'model',
|
|
76
|
+
parts: [{ text: '' }],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
const invocation = tool.build(params);
|
|
82
|
+
const result = await invocation.execute(abortSignal);
|
|
83
|
+
expect(result.llmContent).toBe('No search results or information found for query: "no results query"');
|
|
84
|
+
expect(result.returnDisplay).toBe('No information found.');
|
|
85
|
+
});
|
|
86
|
+
it('should handle API errors gracefully', async () => {
|
|
87
|
+
const params = { query: 'error query' };
|
|
88
|
+
const testError = new Error('API Failure');
|
|
89
|
+
mockGeminiClient.generateContent.mockRejectedValue(testError);
|
|
90
|
+
const invocation = tool.build(params);
|
|
91
|
+
const result = await invocation.execute(abortSignal);
|
|
92
|
+
expect(result.llmContent).toContain('Error:');
|
|
93
|
+
expect(result.llmContent).toContain('API Failure');
|
|
94
|
+
expect(result.returnDisplay).toBe('Error performing web search.');
|
|
95
|
+
});
|
|
96
|
+
it('should correctly format results with sources and citations', async () => {
|
|
97
|
+
const params = { query: 'grounding query' };
|
|
98
|
+
mockGeminiClient.generateContent.mockResolvedValue({
|
|
99
|
+
candidates: [
|
|
100
|
+
{
|
|
101
|
+
content: {
|
|
102
|
+
role: 'model',
|
|
103
|
+
parts: [{ text: 'This is a test response.' }],
|
|
104
|
+
},
|
|
105
|
+
groundingMetadata: {
|
|
106
|
+
groundingChunks: [
|
|
107
|
+
{ web: { uri: 'https://example.com', title: 'Example Site' } },
|
|
108
|
+
{ web: { uri: 'https://google.com', title: 'Google' } },
|
|
109
|
+
],
|
|
110
|
+
groundingSupports: [
|
|
111
|
+
{
|
|
112
|
+
segment: { startIndex: 5, endIndex: 14 },
|
|
113
|
+
groundingChunkIndices: [0],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
segment: { startIndex: 15, endIndex: 24 },
|
|
117
|
+
groundingChunkIndices: [0, 1],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
});
|
|
124
|
+
const invocation = tool.build(params);
|
|
125
|
+
const result = await invocation.execute(abortSignal);
|
|
126
|
+
const expectedLlmContent = `Web search results for "grounding query":
|
|
127
|
+
|
|
128
|
+
This is a test[1] response.[1][2]
|
|
129
|
+
|
|
130
|
+
Sources:
|
|
131
|
+
[1] Example Site (https://example.com)
|
|
132
|
+
[2] Google (https://google.com)`;
|
|
133
|
+
expect(result.llmContent).toBe(expectedLlmContent);
|
|
134
|
+
expect(result.returnDisplay).toBe('Search results for "grounding query" returned.');
|
|
135
|
+
expect(result.sources).toHaveLength(2);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=web-search.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.test.js","sourceRoot":"","sources":["../../../src/tools/web-search.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { Config } from '../config/config.js';
|
|
7
|
-
import {
|
|
7
|
+
import { BaseDeclarativeTool, ToolInvocation, ToolResult } from './tools.js';
|
|
8
8
|
import { ModifiableDeclarativeTool, ModifyContext } from './modifiable-tool.js';
|
|
9
9
|
/**
|
|
10
10
|
* Parameters for the WriteFile tool
|
|
@@ -27,21 +27,25 @@ export interface WriteFileToolParams {
|
|
|
27
27
|
*/
|
|
28
28
|
ai_proposed_content?: string;
|
|
29
29
|
}
|
|
30
|
+
interface GetCorrectedFileContentResult {
|
|
31
|
+
originalContent: string;
|
|
32
|
+
correctedContent: string;
|
|
33
|
+
fileExists: boolean;
|
|
34
|
+
error?: {
|
|
35
|
+
message: string;
|
|
36
|
+
code?: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export declare function getCorrectedFileContent(config: Config, filePath: string, proposedContent: string, abortSignal: AbortSignal): Promise<GetCorrectedFileContentResult>;
|
|
30
40
|
/**
|
|
31
41
|
* Implementation of the WriteFile tool logic
|
|
32
42
|
*/
|
|
33
|
-
export declare class WriteFileTool extends
|
|
43
|
+
export declare class WriteFileTool extends BaseDeclarativeTool<WriteFileToolParams, ToolResult> implements ModifiableDeclarativeTool<WriteFileToolParams> {
|
|
34
44
|
private readonly config;
|
|
35
45
|
static readonly Name: string;
|
|
36
46
|
constructor(config: Config);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
getDescription(params: WriteFileToolParams): string;
|
|
40
|
-
/**
|
|
41
|
-
* Handles the confirmation prompt for the WriteFile tool.
|
|
42
|
-
*/
|
|
43
|
-
shouldConfirmExecute(params: WriteFileToolParams, abortSignal: AbortSignal): Promise<ToolCallConfirmationDetails | false>;
|
|
44
|
-
execute(params: WriteFileToolParams, abortSignal: AbortSignal): Promise<ToolResult>;
|
|
45
|
-
private _getCorrectedFileContent;
|
|
47
|
+
protected validateToolParams(params: WriteFileToolParams): string | null;
|
|
48
|
+
protected createInvocation(params: WriteFileToolParams): ToolInvocation<WriteFileToolParams, ToolResult>;
|
|
46
49
|
getModifyContext(abortSignal: AbortSignal): ModifyContext<WriteFileToolParams>;
|
|
47
50
|
}
|
|
51
|
+
export {};
|
|
@@ -7,7 +7,7 @@ import fs from 'fs';
|
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import * as Diff from 'diff';
|
|
9
9
|
import { ApprovalMode } from '../config/config.js';
|
|
10
|
-
import {
|
|
10
|
+
import { BaseDeclarativeTool, BaseToolInvocation, Kind, ToolConfirmationOutcome, } from './tools.js';
|
|
11
11
|
import { ToolErrorType } from './tool-error.js';
|
|
12
12
|
import { SchemaValidator } from '../utils/schemaValidator.js';
|
|
13
13
|
import { makeRelative, shortenPath } from '../utils/paths.js';
|
|
@@ -17,104 +17,87 @@ import { DEFAULT_DIFF_OPTIONS, getDiffStat } from './diffOptions.js';
|
|
|
17
17
|
import { getSpecificMimeType } from '../utils/fileUtils.js';
|
|
18
18
|
import { recordFileOperationMetric, FileOperation, } from '../telemetry/metrics.js';
|
|
19
19
|
import { IDEConnectionStatus } from '../ide/ide-client.js';
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
super(WriteFileTool.Name, 'WriteFile', `Writes content to a specified file in the local filesystem.
|
|
28
|
-
|
|
29
|
-
The user has the ability to modify \`content\`. If modified, this will be stated in the response.`, Kind.Edit, {
|
|
30
|
-
properties: {
|
|
31
|
-
file_path: {
|
|
32
|
-
description: "The absolute path to the file to write to (e.g., '/home/user/project/file.txt'). Relative paths are not supported.",
|
|
33
|
-
type: 'string',
|
|
34
|
-
},
|
|
35
|
-
content: {
|
|
36
|
-
description: 'The content to write to the file.',
|
|
37
|
-
type: 'string',
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
required: ['file_path', 'content'],
|
|
41
|
-
type: 'object',
|
|
42
|
-
});
|
|
43
|
-
this.config = config;
|
|
20
|
+
export async function getCorrectedFileContent(config, filePath, proposedContent, abortSignal) {
|
|
21
|
+
let originalContent = '';
|
|
22
|
+
let fileExists = false;
|
|
23
|
+
let correctedContent = proposedContent;
|
|
24
|
+
try {
|
|
25
|
+
originalContent = fs.readFileSync(filePath, 'utf8');
|
|
26
|
+
fileExists = true; // File exists and was read
|
|
44
27
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
|
|
50
|
-
if (errors) {
|
|
51
|
-
return errors;
|
|
52
|
-
}
|
|
53
|
-
const filePath = params.file_path;
|
|
54
|
-
if (!path.isAbsolute(filePath)) {
|
|
55
|
-
return `File path must be absolute: ${filePath}`;
|
|
56
|
-
}
|
|
57
|
-
const workspaceContext = this.config.getWorkspaceContext();
|
|
58
|
-
if (!workspaceContext.isPathWithinWorkspace(filePath)) {
|
|
59
|
-
const directories = workspaceContext.getDirectories();
|
|
60
|
-
return `File path must be within one of the workspace directories: ${directories.join(', ')}`;
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
// This check should be performed only if the path exists.
|
|
64
|
-
// If it doesn't exist, it's a new file, which is valid for writing.
|
|
65
|
-
if (fs.existsSync(filePath)) {
|
|
66
|
-
const stats = fs.lstatSync(filePath);
|
|
67
|
-
if (stats.isDirectory()) {
|
|
68
|
-
return `Path is a directory, not a file: ${filePath}`;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (isNodeError(err) && err.code === 'ENOENT') {
|
|
30
|
+
fileExists = false;
|
|
31
|
+
originalContent = '';
|
|
71
32
|
}
|
|
72
|
-
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
33
|
+
else {
|
|
34
|
+
// File exists but could not be read (permissions, etc.)
|
|
35
|
+
fileExists = true; // Mark as existing but problematic
|
|
36
|
+
originalContent = ''; // Can't use its content
|
|
37
|
+
const error = {
|
|
38
|
+
message: getErrorMessage(err),
|
|
39
|
+
code: isNodeError(err) ? err.code : undefined,
|
|
40
|
+
};
|
|
41
|
+
// Return early as we can't proceed with content correction meaningfully
|
|
42
|
+
return { originalContent, correctedContent, fileExists, error };
|
|
76
43
|
}
|
|
77
|
-
return null;
|
|
78
44
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
45
|
+
// If readError is set, we have returned.
|
|
46
|
+
// So, file was either read successfully (fileExists=true, originalContent set)
|
|
47
|
+
// or it was ENOENT (fileExists=false, originalContent='').
|
|
48
|
+
if (fileExists) {
|
|
49
|
+
// This implies originalContent is available
|
|
50
|
+
const { params: correctedParams } = await ensureCorrectEdit(filePath, originalContent, {
|
|
51
|
+
old_string: originalContent, // Treat entire current content as old_string
|
|
52
|
+
new_string: proposedContent,
|
|
53
|
+
file_path: filePath,
|
|
54
|
+
}, config.getGeminiClient(), abortSignal);
|
|
55
|
+
correctedContent = correctedParams.new_string;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// This implies new file (ENOENT)
|
|
59
|
+
correctedContent = await ensureCorrectFileContent(proposedContent, config.getGeminiClient(), abortSignal);
|
|
60
|
+
}
|
|
61
|
+
return { originalContent, correctedContent, fileExists };
|
|
62
|
+
}
|
|
63
|
+
class WriteFileToolInvocation extends BaseToolInvocation {
|
|
64
|
+
config;
|
|
65
|
+
constructor(config, params) {
|
|
66
|
+
super(params);
|
|
67
|
+
this.config = config;
|
|
68
|
+
}
|
|
69
|
+
toolLocations() {
|
|
70
|
+
return [{ path: this.params.file_path }];
|
|
71
|
+
}
|
|
72
|
+
getDescription() {
|
|
73
|
+
const relativePath = makeRelative(this.params.file_path, this.config.getTargetDir());
|
|
84
74
|
return `Writing to ${shortenPath(relativePath)}`;
|
|
85
75
|
}
|
|
86
|
-
|
|
87
|
-
* Handles the confirmation prompt for the WriteFile tool.
|
|
88
|
-
*/
|
|
89
|
-
async shouldConfirmExecute(params, abortSignal) {
|
|
76
|
+
async shouldConfirmExecute(abortSignal) {
|
|
90
77
|
if (this.config.getApprovalMode() === ApprovalMode.AUTO_EDIT) {
|
|
91
78
|
return false;
|
|
92
79
|
}
|
|
93
|
-
const
|
|
94
|
-
if (validationError) {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
const correctedContentResult = await this._getCorrectedFileContent(params.file_path, params.content, abortSignal);
|
|
80
|
+
const correctedContentResult = await getCorrectedFileContent(this.config, this.params.file_path, this.params.content, abortSignal);
|
|
98
81
|
if (correctedContentResult.error) {
|
|
99
82
|
// If file exists but couldn't be read, we can't show a diff for confirmation.
|
|
100
83
|
return false;
|
|
101
84
|
}
|
|
102
85
|
const { originalContent, correctedContent } = correctedContentResult;
|
|
103
|
-
const relativePath = makeRelative(params.file_path, this.config.getTargetDir());
|
|
104
|
-
const fileName = path.basename(params.file_path);
|
|
86
|
+
const relativePath = makeRelative(this.params.file_path, this.config.getTargetDir());
|
|
87
|
+
const fileName = path.basename(this.params.file_path);
|
|
105
88
|
const fileDiff = Diff.createPatch(fileName, originalContent, // Original content (empty if new file or unreadable)
|
|
106
89
|
correctedContent, // Content after potential correction
|
|
107
90
|
'Current', 'Proposed', DEFAULT_DIFF_OPTIONS);
|
|
108
91
|
const ideClient = this.config.getIdeClient();
|
|
109
92
|
const ideConfirmation = this.config.getIdeMode() &&
|
|
110
93
|
ideClient.getConnectionStatus().status === IDEConnectionStatus.Connected
|
|
111
|
-
? ideClient.openDiff(params.file_path, correctedContent)
|
|
94
|
+
? ideClient.openDiff(this.params.file_path, correctedContent)
|
|
112
95
|
: undefined;
|
|
113
96
|
const confirmationDetails = {
|
|
114
97
|
type: 'edit',
|
|
115
98
|
title: `Confirm Write: ${shortenPath(relativePath)}`,
|
|
116
99
|
fileName,
|
|
117
|
-
filePath: params.file_path,
|
|
100
|
+
filePath: this.params.file_path,
|
|
118
101
|
fileDiff,
|
|
119
102
|
originalContent,
|
|
120
103
|
newContent: correctedContent,
|
|
@@ -125,7 +108,7 @@ export class WriteFileTool extends BaseTool {
|
|
|
125
108
|
if (ideConfirmation) {
|
|
126
109
|
const result = await ideConfirmation;
|
|
127
110
|
if (result.status === 'accepted' && result.content) {
|
|
128
|
-
params.content = result.content;
|
|
111
|
+
this.params.content = result.content;
|
|
129
112
|
}
|
|
130
113
|
}
|
|
131
114
|
},
|
|
@@ -133,23 +116,13 @@ export class WriteFileTool extends BaseTool {
|
|
|
133
116
|
};
|
|
134
117
|
return confirmationDetails;
|
|
135
118
|
}
|
|
136
|
-
async execute(
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
llmContent: `Could not write file due to invalid parameters: ${validationError}`,
|
|
141
|
-
returnDisplay: validationError,
|
|
142
|
-
error: {
|
|
143
|
-
message: validationError,
|
|
144
|
-
type: ToolErrorType.INVALID_TOOL_PARAMS,
|
|
145
|
-
},
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
const correctedContentResult = await this._getCorrectedFileContent(params.file_path, params.content, abortSignal);
|
|
119
|
+
async execute(abortSignal) {
|
|
120
|
+
const { file_path, content, ai_proposed_content, modified_by_user } = this.params;
|
|
121
|
+
const correctedContentResult = await getCorrectedFileContent(this.config, file_path, content, abortSignal);
|
|
149
122
|
if (correctedContentResult.error) {
|
|
150
123
|
const errDetails = correctedContentResult.error;
|
|
151
124
|
const errorMsg = errDetails.code
|
|
152
|
-
? `Error checking existing file '${
|
|
125
|
+
? `Error checking existing file '${file_path}': ${errDetails.message} (${errDetails.code})`
|
|
153
126
|
: `Error checking existing file: ${errDetails.message}`;
|
|
154
127
|
return {
|
|
155
128
|
llmContent: errorMsg,
|
|
@@ -167,13 +140,13 @@ export class WriteFileTool extends BaseTool {
|
|
|
167
140
|
(correctedContentResult.error !== undefined &&
|
|
168
141
|
!correctedContentResult.fileExists);
|
|
169
142
|
try {
|
|
170
|
-
const dirName = path.dirname(
|
|
143
|
+
const dirName = path.dirname(file_path);
|
|
171
144
|
if (!fs.existsSync(dirName)) {
|
|
172
145
|
fs.mkdirSync(dirName, { recursive: true });
|
|
173
146
|
}
|
|
174
|
-
fs.writeFileSync(
|
|
147
|
+
fs.writeFileSync(file_path, fileContent, 'utf8');
|
|
175
148
|
// Generate diff for display result
|
|
176
|
-
const fileName = path.basename(
|
|
149
|
+
const fileName = path.basename(file_path);
|
|
177
150
|
// If there was a readError, originalContent in correctedContentResult is '',
|
|
178
151
|
// but for the diff, we want to show the original content as it was before the write if possible.
|
|
179
152
|
// However, if it was unreadable, currentContentForDiff will be empty.
|
|
@@ -181,15 +154,15 @@ export class WriteFileTool extends BaseTool {
|
|
|
181
154
|
? '' // Or some indicator of unreadable content
|
|
182
155
|
: originalContent;
|
|
183
156
|
const fileDiff = Diff.createPatch(fileName, currentContentForDiff, fileContent, 'Original', 'Written', DEFAULT_DIFF_OPTIONS);
|
|
184
|
-
const originallyProposedContent =
|
|
185
|
-
const diffStat = getDiffStat(fileName, currentContentForDiff, originallyProposedContent,
|
|
157
|
+
const originallyProposedContent = ai_proposed_content || content;
|
|
158
|
+
const diffStat = getDiffStat(fileName, currentContentForDiff, originallyProposedContent, content);
|
|
186
159
|
const llmSuccessMessageParts = [
|
|
187
160
|
isNewFile
|
|
188
|
-
? `Successfully created and wrote to new file: ${
|
|
189
|
-
: `Successfully overwrote file: ${
|
|
161
|
+
? `Successfully created and wrote to new file: ${file_path}.`
|
|
162
|
+
: `Successfully overwrote file: ${file_path}.`,
|
|
190
163
|
];
|
|
191
|
-
if (
|
|
192
|
-
llmSuccessMessageParts.push(`User modified the \`content\` to be: ${
|
|
164
|
+
if (modified_by_user) {
|
|
165
|
+
llmSuccessMessageParts.push(`User modified the \`content\` to be: ${content}`);
|
|
193
166
|
}
|
|
194
167
|
const displayResult = {
|
|
195
168
|
fileDiff,
|
|
@@ -199,8 +172,8 @@ export class WriteFileTool extends BaseTool {
|
|
|
199
172
|
diffStat,
|
|
200
173
|
};
|
|
201
174
|
const lines = fileContent.split('\n').length;
|
|
202
|
-
const mimetype = getSpecificMimeType(
|
|
203
|
-
const extension = path.extname(
|
|
175
|
+
const mimetype = getSpecificMimeType(file_path);
|
|
176
|
+
const extension = path.extname(file_path); // Get extension
|
|
204
177
|
if (isNewFile) {
|
|
205
178
|
recordFileOperationMetric(this.config, FileOperation.CREATE, lines, mimetype, extension, diffStat);
|
|
206
179
|
}
|
|
@@ -218,18 +191,18 @@ export class WriteFileTool extends BaseTool {
|
|
|
218
191
|
let errorType = ToolErrorType.FILE_WRITE_FAILURE;
|
|
219
192
|
if (isNodeError(error)) {
|
|
220
193
|
// Handle specific Node.js errors with their error codes
|
|
221
|
-
errorMsg = `Error writing to file '${
|
|
194
|
+
errorMsg = `Error writing to file '${file_path}': ${error.message} (${error.code})`;
|
|
222
195
|
// Log specific error types for better debugging
|
|
223
196
|
if (error.code === 'EACCES') {
|
|
224
|
-
errorMsg = `Permission denied writing to file: ${
|
|
197
|
+
errorMsg = `Permission denied writing to file: ${file_path} (${error.code})`;
|
|
225
198
|
errorType = ToolErrorType.PERMISSION_DENIED;
|
|
226
199
|
}
|
|
227
200
|
else if (error.code === 'ENOSPC') {
|
|
228
|
-
errorMsg = `No space left on device: ${
|
|
201
|
+
errorMsg = `No space left on device: ${file_path} (${error.code})`;
|
|
229
202
|
errorType = ToolErrorType.NO_SPACE_LEFT;
|
|
230
203
|
}
|
|
231
204
|
else if (error.code === 'EISDIR') {
|
|
232
|
-
errorMsg = `Target is a directory, not a file: ${
|
|
205
|
+
errorMsg = `Target is a directory, not a file: ${file_path} (${error.code})`;
|
|
233
206
|
errorType = ToolErrorType.TARGET_IS_DIRECTORY;
|
|
234
207
|
}
|
|
235
208
|
// Include stack trace in debug mode for better troubleshooting
|
|
@@ -253,58 +226,74 @@ export class WriteFileTool extends BaseTool {
|
|
|
253
226
|
};
|
|
254
227
|
}
|
|
255
228
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Implementation of the WriteFile tool logic
|
|
232
|
+
*/
|
|
233
|
+
export class WriteFileTool extends BaseDeclarativeTool {
|
|
234
|
+
config;
|
|
235
|
+
static Name = 'write_file';
|
|
236
|
+
constructor(config) {
|
|
237
|
+
super(WriteFileTool.Name, 'WriteFile', `Writes content to a specified file in the local filesystem.
|
|
238
|
+
|
|
239
|
+
The user has the ability to modify \`content\`. If modified, this will be stated in the response.`, Kind.Edit, {
|
|
240
|
+
properties: {
|
|
241
|
+
file_path: {
|
|
242
|
+
description: "The absolute path to the file to write to (e.g., '/home/user/project/file.txt'). Relative paths are not supported.",
|
|
243
|
+
type: 'string',
|
|
244
|
+
},
|
|
245
|
+
content: {
|
|
246
|
+
description: 'The content to write to the file.',
|
|
247
|
+
type: 'string',
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
required: ['file_path', 'content'],
|
|
251
|
+
type: 'object',
|
|
252
|
+
});
|
|
253
|
+
this.config = config;
|
|
254
|
+
}
|
|
255
|
+
validateToolParams(params) {
|
|
256
|
+
const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
|
|
257
|
+
if (errors) {
|
|
258
|
+
return errors;
|
|
263
259
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
originalContent = '';
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
// File exists but could not be read (permissions, etc.)
|
|
271
|
-
fileExists = true; // Mark as existing but problematic
|
|
272
|
-
originalContent = ''; // Can't use its content
|
|
273
|
-
const error = {
|
|
274
|
-
message: getErrorMessage(err),
|
|
275
|
-
code: isNodeError(err) ? err.code : undefined,
|
|
276
|
-
};
|
|
277
|
-
// Return early as we can't proceed with content correction meaningfully
|
|
278
|
-
return { originalContent, correctedContent, fileExists, error };
|
|
279
|
-
}
|
|
260
|
+
const filePath = params.file_path;
|
|
261
|
+
if (!filePath) {
|
|
262
|
+
return `Missing or empty "file_path"`;
|
|
280
263
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
// or it was ENOENT (fileExists=false, originalContent='').
|
|
284
|
-
if (fileExists) {
|
|
285
|
-
// This implies originalContent is available
|
|
286
|
-
const { params: correctedParams } = await ensureCorrectEdit(filePath, originalContent, {
|
|
287
|
-
old_string: originalContent, // Treat entire current content as old_string
|
|
288
|
-
new_string: proposedContent,
|
|
289
|
-
file_path: filePath,
|
|
290
|
-
}, this.config.getGeminiClient(), abortSignal);
|
|
291
|
-
correctedContent = correctedParams.new_string;
|
|
264
|
+
if (!path.isAbsolute(filePath)) {
|
|
265
|
+
return `File path must be absolute: ${filePath}`;
|
|
292
266
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
267
|
+
const workspaceContext = this.config.getWorkspaceContext();
|
|
268
|
+
if (!workspaceContext.isPathWithinWorkspace(filePath)) {
|
|
269
|
+
const directories = workspaceContext.getDirectories();
|
|
270
|
+
return `File path must be within one of the workspace directories: ${directories.join(', ')}`;
|
|
296
271
|
}
|
|
297
|
-
|
|
272
|
+
try {
|
|
273
|
+
if (fs.existsSync(filePath)) {
|
|
274
|
+
const stats = fs.lstatSync(filePath);
|
|
275
|
+
if (stats.isDirectory()) {
|
|
276
|
+
return `Path is a directory, not a file: ${filePath}`;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (statError) {
|
|
281
|
+
return `Error accessing path properties for validation: ${filePath}. Reason: ${statError instanceof Error ? statError.message : String(statError)}`;
|
|
282
|
+
}
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
createInvocation(params) {
|
|
286
|
+
return new WriteFileToolInvocation(this.config, params);
|
|
298
287
|
}
|
|
299
288
|
getModifyContext(abortSignal) {
|
|
300
289
|
return {
|
|
301
290
|
getFilePath: (params) => params.file_path,
|
|
302
291
|
getCurrentContent: async (params) => {
|
|
303
|
-
const correctedContentResult = await this.
|
|
292
|
+
const correctedContentResult = await getCorrectedFileContent(this.config, params.file_path, params.content, abortSignal);
|
|
304
293
|
return correctedContentResult.originalContent;
|
|
305
294
|
},
|
|
306
295
|
getProposedContent: async (params) => {
|
|
307
|
-
const correctedContentResult = await this.
|
|
296
|
+
const correctedContentResult = await getCorrectedFileContent(this.config, params.file_path, params.content, abortSignal);
|
|
308
297
|
return correctedContentResult.correctedContent;
|
|
309
298
|
},
|
|
310
299
|
createUpdatedParams: (_oldContent, modifiedProposedContent, originalParams) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../../src/tools/write-file.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../../src/tools/write-file.ts"],"names":[],"mappings":"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"}
|