@google/gemini-cli-core 0.13.0-preview.2 → 0.14.0-preview.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.
Files changed (134) hide show
  1. package/dist/src/agents/executor.d.ts +3 -0
  2. package/dist/src/agents/executor.js +21 -0
  3. package/dist/src/agents/executor.js.map +1 -1
  4. package/dist/src/agents/executor.test.js +177 -2
  5. package/dist/src/agents/executor.test.js.map +1 -1
  6. package/dist/src/config/config.d.ts +4 -0
  7. package/dist/src/config/config.js +21 -5
  8. package/dist/src/config/config.js.map +1 -1
  9. package/dist/src/config/config.test.js +88 -0
  10. package/dist/src/config/config.test.js.map +1 -1
  11. package/dist/src/config/defaultModelConfigs.d.ts +7 -0
  12. package/dist/src/config/defaultModelConfigs.js +127 -0
  13. package/dist/src/config/defaultModelConfigs.js.map +1 -0
  14. package/dist/src/confirmation-bus/message-bus.js +1 -1
  15. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  16. package/dist/src/confirmation-bus/types.d.ts +1 -0
  17. package/dist/src/core/prompts.js +0 -2
  18. package/dist/src/core/prompts.js.map +1 -1
  19. package/dist/src/fallback/handler.js +1 -3
  20. package/dist/src/fallback/handler.js.map +1 -1
  21. package/dist/src/fallback/handler.test.js +4 -12
  22. package/dist/src/fallback/handler.test.js.map +1 -1
  23. package/dist/src/fallback/types.d.ts +1 -1
  24. package/dist/src/generated/git-commit.d.ts +2 -2
  25. package/dist/src/generated/git-commit.js +2 -2
  26. package/dist/src/index.d.ts +1 -0
  27. package/dist/src/index.js +1 -0
  28. package/dist/src/index.js.map +1 -1
  29. package/dist/src/policy/config.test.js +17 -0
  30. package/dist/src/policy/config.test.js.map +1 -1
  31. package/dist/src/policy/policies/discovered.toml +8 -0
  32. package/dist/src/policy/policy-engine.d.ts +1 -1
  33. package/dist/src/policy/policy-engine.js +11 -3
  34. package/dist/src/policy/policy-engine.js.map +1 -1
  35. package/dist/src/policy/policy-engine.test.js +98 -50
  36. package/dist/src/policy/policy-engine.test.js.map +1 -1
  37. package/dist/src/policy/toml-loader.test.js +220 -336
  38. package/dist/src/policy/toml-loader.test.js.map +1 -1
  39. package/dist/src/services/modelConfig.golden.test.d.ts +6 -0
  40. package/dist/src/services/modelConfig.golden.test.js +42 -0
  41. package/dist/src/services/modelConfig.golden.test.js.map +1 -0
  42. package/dist/src/services/modelConfig.integration.test.d.ts +6 -0
  43. package/dist/src/services/modelConfig.integration.test.js +213 -0
  44. package/dist/src/services/modelConfig.integration.test.js.map +1 -0
  45. package/dist/src/services/modelConfigService.d.ts +46 -0
  46. package/dist/src/services/modelConfigService.js +146 -0
  47. package/dist/src/services/modelConfigService.js.map +1 -0
  48. package/dist/src/services/modelConfigService.test.d.ts +6 -0
  49. package/dist/src/services/modelConfigService.test.js +509 -0
  50. package/dist/src/services/modelConfigService.test.js.map +1 -0
  51. package/dist/src/services/test-data/resolved-aliases.golden.json +123 -0
  52. package/dist/src/tools/base-tool-invocation.test.d.ts +6 -0
  53. package/dist/src/tools/base-tool-invocation.test.js +85 -0
  54. package/dist/src/tools/base-tool-invocation.test.js.map +1 -0
  55. package/dist/src/tools/edit.d.ts +1 -1
  56. package/dist/src/tools/edit.js +31 -33
  57. package/dist/src/tools/edit.js.map +1 -1
  58. package/dist/src/tools/edit.test.js +30 -20
  59. package/dist/src/tools/edit.test.js.map +1 -1
  60. package/dist/src/tools/glob.d.ts +1 -1
  61. package/dist/src/tools/glob.js +7 -7
  62. package/dist/src/tools/glob.js.map +1 -1
  63. package/dist/src/tools/glob.test.js +20 -17
  64. package/dist/src/tools/glob.test.js.map +1 -1
  65. package/dist/src/tools/grep.d.ts +1 -1
  66. package/dist/src/tools/grep.js +9 -9
  67. package/dist/src/tools/grep.js.map +1 -1
  68. package/dist/src/tools/grep.test.js +15 -12
  69. package/dist/src/tools/grep.test.js.map +1 -1
  70. package/dist/src/tools/ls.d.ts +1 -1
  71. package/dist/src/tools/ls.js +14 -15
  72. package/dist/src/tools/ls.js.map +1 -1
  73. package/dist/src/tools/ls.test.js +32 -33
  74. package/dist/src/tools/ls.test.js.map +1 -1
  75. package/dist/src/tools/mcp-client.js +2 -0
  76. package/dist/src/tools/mcp-client.js.map +1 -1
  77. package/dist/src/tools/mcp-client.test.js +5 -0
  78. package/dist/src/tools/mcp-client.test.js.map +1 -1
  79. package/dist/src/tools/mcp-tool.js +1 -1
  80. package/dist/src/tools/mcp-tool.js.map +1 -1
  81. package/dist/src/tools/read-file.d.ts +2 -2
  82. package/dist/src/tools/read-file.js +20 -24
  83. package/dist/src/tools/read-file.js.map +1 -1
  84. package/dist/src/tools/read-file.test.js +62 -51
  85. package/dist/src/tools/read-file.test.js.map +1 -1
  86. package/dist/src/tools/read-many-files.d.ts +2 -9
  87. package/dist/src/tools/read-many-files.js +10 -21
  88. package/dist/src/tools/read-many-files.js.map +1 -1
  89. package/dist/src/tools/read-many-files.test.js +35 -35
  90. package/dist/src/tools/read-many-files.test.js.map +1 -1
  91. package/dist/src/tools/ripGrep.d.ts +1 -1
  92. package/dist/src/tools/ripGrep.js +8 -8
  93. package/dist/src/tools/ripGrep.js.map +1 -1
  94. package/dist/src/tools/ripGrep.test.js +23 -14
  95. package/dist/src/tools/ripGrep.test.js.map +1 -1
  96. package/dist/src/tools/shell.d.ts +1 -1
  97. package/dist/src/tools/shell.js +16 -14
  98. package/dist/src/tools/shell.js.map +1 -1
  99. package/dist/src/tools/shell.test.js +64 -34
  100. package/dist/src/tools/shell.test.js.map +1 -1
  101. package/dist/src/tools/smart-edit.d.ts +1 -1
  102. package/dist/src/tools/smart-edit.js +8 -11
  103. package/dist/src/tools/smart-edit.js.map +1 -1
  104. package/dist/src/tools/tool-registry.d.ts +12 -2
  105. package/dist/src/tools/tool-registry.js +49 -14
  106. package/dist/src/tools/tool-registry.js.map +1 -1
  107. package/dist/src/tools/tool-registry.test.js +70 -4
  108. package/dist/src/tools/tool-registry.test.js.map +1 -1
  109. package/dist/src/tools/tools.d.ts +2 -1
  110. package/dist/src/tools/tools.js +4 -1
  111. package/dist/src/tools/tools.js.map +1 -1
  112. package/dist/src/tools/write-file.js +31 -31
  113. package/dist/src/tools/write-file.js.map +1 -1
  114. package/dist/src/tools/write-file.test.js +23 -5
  115. package/dist/src/tools/write-file.test.js.map +1 -1
  116. package/dist/src/utils/extensionLoader.js +7 -3
  117. package/dist/src/utils/extensionLoader.js.map +1 -1
  118. package/dist/src/utils/fileUtils.test.js +75 -60
  119. package/dist/src/utils/fileUtils.test.js.map +1 -1
  120. package/dist/src/utils/pathReader.js +4 -4
  121. package/dist/src/utils/pathReader.js.map +1 -1
  122. package/dist/src/utils/pathReader.test.js +44 -1
  123. package/dist/src/utils/pathReader.test.js.map +1 -1
  124. package/dist/src/utils/paths.d.ts +1 -1
  125. package/dist/src/utils/paths.js +5 -3
  126. package/dist/src/utils/paths.js.map +1 -1
  127. package/dist/src/utils/workspaceContext.d.ts +4 -3
  128. package/dist/src/utils/workspaceContext.js +10 -11
  129. package/dist/src/utils/workspaceContext.js.map +1 -1
  130. package/dist/src/utils/workspaceContext.test.js +1 -1
  131. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  132. package/dist/tsconfig.tsbuildinfo +1 -1
  133. package/package.json +1 -1
  134. package/dist/google-gemini-cli-core-0.13.0-preview.1.tgz +0 -0
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import { BaseToolInvocation } from './tools.js';
8
+ import { MessageBusType, } from '../confirmation-bus/types.js';
9
+ class TestBaseToolInvocation extends BaseToolInvocation {
10
+ getDescription() {
11
+ return 'test description';
12
+ }
13
+ async execute() {
14
+ return { llmContent: [], returnDisplay: '' };
15
+ }
16
+ }
17
+ describe('BaseToolInvocation', () => {
18
+ let messageBus;
19
+ let abortController;
20
+ beforeEach(() => {
21
+ messageBus = {
22
+ publish: vi.fn(),
23
+ subscribe: vi.fn(),
24
+ unsubscribe: vi.fn(),
25
+ };
26
+ abortController = new AbortController();
27
+ });
28
+ it('should propagate serverName to ToolConfirmationRequest', async () => {
29
+ const serverName = 'test-server';
30
+ const tool = new TestBaseToolInvocation({}, messageBus, 'test-tool', 'Test Tool', serverName);
31
+ let capturedRequest;
32
+ vi.mocked(messageBus.publish).mockImplementation((request) => {
33
+ if (request.type === MessageBusType.TOOL_CONFIRMATION_REQUEST) {
34
+ capturedRequest = request;
35
+ }
36
+ });
37
+ let responseHandler;
38
+ vi.mocked(messageBus.subscribe).mockImplementation((type, handler) => {
39
+ if (type === MessageBusType.TOOL_CONFIRMATION_RESPONSE) {
40
+ responseHandler = handler;
41
+ }
42
+ });
43
+ const confirmationPromise = tool.shouldConfirmExecute(abortController.signal);
44
+ // Wait for microtasks to ensure publish is called
45
+ await new Promise((resolve) => setTimeout(resolve, 0));
46
+ expect(messageBus.publish).toHaveBeenCalledTimes(1);
47
+ expect(capturedRequest).toBeDefined();
48
+ expect(capturedRequest?.type).toBe(MessageBusType.TOOL_CONFIRMATION_REQUEST);
49
+ expect(capturedRequest?.serverName).toBe(serverName);
50
+ // Simulate response to finish the promise cleanly
51
+ if (responseHandler && capturedRequest) {
52
+ responseHandler({
53
+ type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
54
+ correlationId: capturedRequest.correlationId,
55
+ confirmed: true,
56
+ });
57
+ }
58
+ await confirmationPromise;
59
+ });
60
+ it('should NOT propagate serverName if not provided', async () => {
61
+ const tool = new TestBaseToolInvocation({}, messageBus, 'test-tool', 'Test Tool');
62
+ let capturedRequest;
63
+ vi.mocked(messageBus.publish).mockImplementation((request) => {
64
+ if (request.type === MessageBusType.TOOL_CONFIRMATION_REQUEST) {
65
+ capturedRequest = request;
66
+ }
67
+ });
68
+ // We need to mock subscribe to avoid hanging if we want to await the promise,
69
+ // but for this test we just need to check publish.
70
+ // We'll abort to clean up.
71
+ const confirmationPromise = tool.shouldConfirmExecute(abortController.signal);
72
+ await new Promise((resolve) => setTimeout(resolve, 0));
73
+ expect(messageBus.publish).toHaveBeenCalledTimes(1);
74
+ expect(capturedRequest).toBeDefined();
75
+ expect(capturedRequest?.serverName).toBeUndefined();
76
+ abortController.abort();
77
+ try {
78
+ await confirmationPromise;
79
+ }
80
+ catch {
81
+ // ignore abort error
82
+ }
83
+ });
84
+ });
85
+ //# sourceMappingURL=base-tool-invocation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-tool-invocation.test.js","sourceRoot":"","sources":["../../../src/tools/base-tool-invocation.test.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ export declare function applyReplacement(currentContent: string | null, oldStrin
14
14
  */
15
15
  export interface EditToolParams {
16
16
  /**
17
- * The absolute path to the file to modify
17
+ * The path to the file to modify
18
18
  */
19
19
  file_path: string;
20
20
  /**
@@ -6,7 +6,6 @@
6
6
  import * as fs from 'node:fs';
7
7
  import * as path from 'node:path';
8
8
  import * as Diff from 'diff';
9
- import process from 'node:process';
10
9
  import { BaseDeclarativeTool, BaseToolInvocation, Kind, ToolConfirmationOutcome, } from './tools.js';
11
10
  import { ToolErrorType } from './tool-error.js';
12
11
  import { makeRelative, shortenPath } from '../utils/paths.js';
@@ -40,12 +39,14 @@ export function applyReplacement(currentContent, oldString, newString, isNewFile
40
39
  }
41
40
  class EditToolInvocation extends BaseToolInvocation {
42
41
  config;
42
+ resolvedPath;
43
43
  constructor(config, params, messageBus, toolName, displayName) {
44
44
  super(params, messageBus, toolName, displayName);
45
45
  this.config = config;
46
+ this.resolvedPath = path.resolve(this.config.getTargetDir(), this.params.file_path);
46
47
  }
47
48
  toolLocations() {
48
- return [{ path: this.params.file_path }];
49
+ return [{ path: this.resolvedPath }];
49
50
  }
50
51
  /**
51
52
  * Calculates the potential outcome of an edit operation.
@@ -65,7 +66,7 @@ class EditToolInvocation extends BaseToolInvocation {
65
66
  try {
66
67
  currentContent = await this.config
67
68
  .getFileSystemService()
68
- .readTextFile(params.file_path);
69
+ .readTextFile(this.resolvedPath);
69
70
  // Normalize line endings to LF for consistent processing.
70
71
  currentContent = currentContent.replace(/\r\n/g, '\n');
71
72
  fileExists = true;
@@ -85,13 +86,13 @@ class EditToolInvocation extends BaseToolInvocation {
85
86
  // Trying to edit a nonexistent file (and old_string is not empty)
86
87
  error = {
87
88
  display: `File not found. Cannot apply edit. Use an empty old_string to create a new file.`,
88
- raw: `File not found: ${params.file_path}`,
89
+ raw: `File not found: ${this.resolvedPath}`,
89
90
  type: ToolErrorType.FILE_NOT_FOUND,
90
91
  };
91
92
  }
92
93
  else if (currentContent !== null) {
93
94
  // Editing an existing file
94
- const correctedEdit = await ensureCorrectEdit(params.file_path, currentContent, params, this.config.getGeminiClient(), this.config.getBaseLlmClient(), abortSignal);
95
+ const correctedEdit = await ensureCorrectEdit(this.resolvedPath, currentContent, params, this.config.getGeminiClient(), this.config.getBaseLlmClient(), abortSignal);
95
96
  finalOldString = correctedEdit.params.old_string;
96
97
  finalNewString = correctedEdit.params.new_string;
97
98
  occurrences = correctedEdit.occurrences;
@@ -99,14 +100,14 @@ class EditToolInvocation extends BaseToolInvocation {
99
100
  // Error: Trying to create a file that already exists
100
101
  error = {
101
102
  display: `Failed to edit. Attempted to create a file that already exists.`,
102
- raw: `File already exists, cannot create: ${params.file_path}`,
103
+ raw: `File already exists, cannot create: ${this.resolvedPath}`,
103
104
  type: ToolErrorType.ATTEMPT_TO_CREATE_EXISTING_FILE,
104
105
  };
105
106
  }
106
107
  else if (occurrences === 0) {
107
108
  error = {
108
109
  display: `Failed to edit, could not find the string to replace.`,
109
- raw: `Failed to edit, 0 occurrences found for old_string in ${params.file_path}. No edits made. The exact text in old_string was not found. Ensure you're not escaping content incorrectly and check whitespace, indentation, and context. Use ${READ_FILE_TOOL_NAME} tool to verify.`,
110
+ raw: `Failed to edit, 0 occurrences found for old_string in ${this.resolvedPath}. No edits made. The exact text in old_string was not found. Ensure you're not escaping content incorrectly and check whitespace, indentation, and context. Use ${READ_FILE_TOOL_NAME} tool to verify.`,
110
111
  type: ToolErrorType.EDIT_NO_OCCURRENCE_FOUND,
111
112
  };
112
113
  }
@@ -114,14 +115,14 @@ class EditToolInvocation extends BaseToolInvocation {
114
115
  const occurrenceTerm = expectedReplacements === 1 ? 'occurrence' : 'occurrences';
115
116
  error = {
116
117
  display: `Failed to edit, expected ${expectedReplacements} ${occurrenceTerm} but found ${occurrences}.`,
117
- raw: `Failed to edit, Expected ${expectedReplacements} ${occurrenceTerm} but found ${occurrences} for old_string in file: ${params.file_path}`,
118
+ raw: `Failed to edit, Expected ${expectedReplacements} ${occurrenceTerm} but found ${occurrences} for old_string in file: ${this.resolvedPath}`,
118
119
  type: ToolErrorType.EDIT_EXPECTED_OCCURRENCE_MISMATCH,
119
120
  };
120
121
  }
121
122
  else if (finalOldString === finalNewString) {
122
123
  error = {
123
124
  display: `No changes to apply. The old_string and new_string are identical.`,
124
- raw: `No changes to apply. The old_string and new_string are identical in file: ${params.file_path}`,
125
+ raw: `No changes to apply. The old_string and new_string are identical in file: ${this.resolvedPath}`,
125
126
  type: ToolErrorType.EDIT_NO_CHANGE,
126
127
  };
127
128
  }
@@ -130,7 +131,7 @@ class EditToolInvocation extends BaseToolInvocation {
130
131
  // Should not happen if fileExists and no exception was thrown, but defensively:
131
132
  error = {
132
133
  display: `Failed to read content of file.`,
133
- raw: `Failed to read content of existing file: ${params.file_path}`,
134
+ raw: `Failed to read content of existing file: ${this.resolvedPath}`,
134
135
  type: ToolErrorType.READ_CONTENT_FAILURE,
135
136
  };
136
137
  }
@@ -140,7 +141,7 @@ class EditToolInvocation extends BaseToolInvocation {
140
141
  if (!error && fileExists && currentContent === newContent) {
141
142
  error = {
142
143
  display: 'No changes to apply. The new content is identical to the current content.',
143
- raw: `No changes to apply. The new content is identical to the current content in file: ${params.file_path}`,
144
+ raw: `No changes to apply. The new content is identical to the current content in file: ${this.resolvedPath}`,
144
145
  type: ToolErrorType.EDIT_NO_CHANGE,
145
146
  };
146
147
  }
@@ -176,17 +177,17 @@ class EditToolInvocation extends BaseToolInvocation {
176
177
  debugLogger.log(`Error: ${editData.error.display}`);
177
178
  return false;
178
179
  }
179
- const fileName = path.basename(this.params.file_path);
180
+ const fileName = path.basename(this.resolvedPath);
180
181
  const fileDiff = Diff.createPatch(fileName, editData.currentContent ?? '', editData.newContent, 'Current', 'Proposed', DEFAULT_DIFF_OPTIONS);
181
182
  const ideClient = await IdeClient.getInstance();
182
183
  const ideConfirmation = this.config.getIdeMode() && ideClient.isDiffingEnabled()
183
- ? ideClient.openDiff(this.params.file_path, editData.newContent)
184
+ ? ideClient.openDiff(this.resolvedPath, editData.newContent)
184
185
  : undefined;
185
186
  const confirmationDetails = {
186
187
  type: 'edit',
187
188
  title: `Confirm Edit: ${shortenPath(makeRelative(this.params.file_path, this.config.getTargetDir()))}`,
188
189
  fileName,
189
- filePath: this.params.file_path,
190
+ filePath: this.resolvedPath,
190
191
  fileDiff,
191
192
  originalContent: editData.currentContent,
192
193
  newContent: editData.newContent,
@@ -257,11 +258,11 @@ class EditToolInvocation extends BaseToolInvocation {
257
258
  };
258
259
  }
259
260
  try {
260
- this.ensureParentDirectoriesExist(this.params.file_path);
261
+ this.ensureParentDirectoriesExist(this.resolvedPath);
261
262
  await this.config
262
263
  .getFileSystemService()
263
- .writeTextFile(this.params.file_path, editData.newContent);
264
- const fileName = path.basename(this.params.file_path);
264
+ .writeTextFile(this.resolvedPath, editData.newContent);
265
+ const fileName = path.basename(this.resolvedPath);
265
266
  const originallyProposedContent = this.params.ai_proposed_content || editData.newContent;
266
267
  const diffStat = getDiffStat(fileName, editData.currentContent ?? '', originallyProposedContent, editData.newContent);
267
268
  const fileDiff = Diff.createPatch(fileName, editData.currentContent ?? '', // Should not be null here if not isNewFile
@@ -274,17 +275,17 @@ class EditToolInvocation extends BaseToolInvocation {
274
275
  diffStat,
275
276
  };
276
277
  // Log file operation for telemetry (without diff_stat to avoid double-counting)
277
- const mimetype = getSpecificMimeType(this.params.file_path);
278
- const programmingLanguage = getLanguageFromFilePath(this.params.file_path);
279
- const extension = path.extname(this.params.file_path);
278
+ const mimetype = getSpecificMimeType(this.resolvedPath);
279
+ const programmingLanguage = getLanguageFromFilePath(this.resolvedPath);
280
+ const extension = path.extname(this.resolvedPath);
280
281
  const operation = editData.isNewFile
281
282
  ? FileOperation.CREATE
282
283
  : FileOperation.UPDATE;
283
284
  logFileOperation(this.config, new FileOperationEvent(EDIT_TOOL_NAME, operation, editData.newContent.split('\n').length, mimetype, extension, programmingLanguage));
284
285
  const llmSuccessMessageParts = [
285
286
  editData.isNewFile
286
- ? `Created new file: ${this.params.file_path} with provided content.`
287
- : `Successfully modified file: ${this.params.file_path} (${editData.occurrences} replacements).`,
287
+ ? `Created new file: ${this.resolvedPath} with provided content.`
288
+ : `Successfully modified file: ${this.resolvedPath} (${editData.occurrences} replacements).`,
288
289
  ];
289
290
  if (this.params.modified_by_user) {
290
291
  llmSuccessMessageParts.push(`User modified the \`new_string\` content to be: ${this.params.new_string}.`);
@@ -328,7 +329,7 @@ export class EditTool extends BaseDeclarativeTool {
328
329
  The user has the ability to modify the \`new_string\` content. If modified, this will be stated in the response.
329
330
 
330
331
  Expectation for required parameters:
331
- 1. \`file_path\` MUST be an absolute path; otherwise an error will be thrown.
332
+ 1. \`file_path\` is the path to the file to modify.
332
333
  2. \`old_string\` MUST be the exact literal text to replace (including all whitespace, indentation, newlines, and surrounding code etc.).
333
334
  3. \`new_string\` MUST be the exact literal text to replace \`old_string\` with (also including all whitespace, indentation, newlines, and surrounding code etc.). Ensure the resulting code is correct and idiomatic.
334
335
  4. NEVER escape \`old_string\` or \`new_string\`, that would break the exact literal text requirement.
@@ -336,9 +337,7 @@ Expectation for required parameters:
336
337
  **Multiple replacements:** Set \`expected_replacements\` to the number of occurrences you want to replace. The tool will replace ALL occurrences that match \`old_string\` exactly. Ensure the number of replacements matches your expectation.`, Kind.Edit, {
337
338
  properties: {
338
339
  file_path: {
339
- description: process.platform === 'win32'
340
- ? "The absolute path to the file to modify (e.g., 'C:\\Users\\project\\file.txt'). Must be an absolute path."
341
- : "The absolute path to the file to modify (e.g., '/home/user/project/file.txt'). Must start with '/'.",
340
+ description: 'The path to the file to modify.',
342
341
  type: 'string',
343
342
  },
344
343
  old_string: {
@@ -371,11 +370,9 @@ Expectation for required parameters:
371
370
  if (!params.file_path) {
372
371
  return "The 'file_path' parameter must be non-empty.";
373
372
  }
374
- if (!path.isAbsolute(params.file_path)) {
375
- return `File path must be absolute: ${params.file_path}`;
376
- }
373
+ const resolvedPath = path.resolve(this.config.getTargetDir(), params.file_path);
377
374
  const workspaceContext = this.config.getWorkspaceContext();
378
- if (!workspaceContext.isPathWithinWorkspace(params.file_path)) {
375
+ if (!workspaceContext.isPathWithinWorkspace(resolvedPath)) {
379
376
  const directories = workspaceContext.getDirectories();
380
377
  return `File path must be within one of the workspace directories: ${directories.join(', ')}`;
381
378
  }
@@ -385,13 +382,14 @@ Expectation for required parameters:
385
382
  return new EditToolInvocation(this.config, params, messageBus ?? this.messageBus, toolName ?? this.name, displayName ?? this.displayName);
386
383
  }
387
384
  getModifyContext(_) {
385
+ const resolvePath = (filePath) => path.resolve(this.config.getTargetDir(), filePath);
388
386
  return {
389
387
  getFilePath: (params) => params.file_path,
390
388
  getCurrentContent: async (params) => {
391
389
  try {
392
- return this.config
390
+ return await this.config
393
391
  .getFileSystemService()
394
- .readTextFile(params.file_path);
392
+ .readTextFile(resolvePath(params.file_path));
395
393
  }
396
394
  catch (err) {
397
395
  if (!isNodeError(err) || err.code !== 'ENOENT')
@@ -403,7 +401,7 @@ Expectation for required parameters:
403
401
  try {
404
402
  const currentContent = await this.config
405
403
  .getFileSystemService()
406
- .readTextFile(params.file_path);
404
+ .readTextFile(resolvePath(params.file_path));
407
405
  return applyReplacement(currentContent, params.old_string, params.new_string, params.old_string === '' && currentContent === '');
408
406
  }
409
407
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/edit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/edit.ts"],"names":[],"mappings":"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"}
@@ -35,8 +35,8 @@ import path from 'node:path';
35
35
  import fs from 'node:fs';
36
36
  import os from 'node:os';
37
37
  import { ApprovalMode } from '../policy/types.js';
38
- import { createMockWorkspaceContext } from '../test-utils/mockWorkspaceContext.js';
39
38
  import { StandardFileSystemService } from '../services/fileSystemService.js';
39
+ import { WorkspaceContext } from '../utils/workspaceContext.js';
40
40
  describe('EditTool', () => {
41
41
  let tool;
42
42
  let tempDir;
@@ -61,7 +61,7 @@ describe('EditTool', () => {
61
61
  getTargetDir: () => rootDir,
62
62
  getApprovalMode: vi.fn(),
63
63
  setApprovalMode: vi.fn(),
64
- getWorkspaceContext: () => createMockWorkspaceContext(rootDir),
64
+ getWorkspaceContext: () => new WorkspaceContext(rootDir),
65
65
  getFileSystemService: () => new StandardFileSystemService(),
66
66
  getIdeMode: () => false,
67
67
  // getGeminiConfig: () => ({ apiKey: 'test-api-key' }), // This was not a real Config method
@@ -236,14 +236,6 @@ describe('EditTool', () => {
236
236
  };
237
237
  expect(tool.validateToolParams(params)).toBeNull();
238
238
  });
239
- it('should return error for relative path', () => {
240
- const params = {
241
- file_path: 'test.txt',
242
- old_string: 'old',
243
- new_string: 'new',
244
- };
245
- expect(tool.validateToolParams(params)).toMatch(/File path must be absolute/);
246
- });
247
239
  it('should return error for path outside root', () => {
248
240
  const params = {
249
241
  file_path: path.join(tempDir, 'outside-root.txt'),
@@ -260,13 +252,25 @@ describe('EditTool', () => {
260
252
  beforeEach(() => {
261
253
  filePath = path.join(rootDir, testFile);
262
254
  });
263
- it('should throw an error if params are invalid', async () => {
255
+ it('should resolve relative path and request confirmation', async () => {
256
+ fs.writeFileSync(filePath, 'some old content here');
264
257
  const params = {
265
- file_path: 'relative.txt',
258
+ file_path: testFile, // relative path
266
259
  old_string: 'old',
267
260
  new_string: 'new',
268
261
  };
269
- expect(() => tool.build(params)).toThrow();
262
+ // ensureCorrectEdit will be called by shouldConfirmExecute
263
+ mockEnsureCorrectEdit.mockResolvedValueOnce({
264
+ params: { ...params, file_path: filePath },
265
+ occurrences: 1,
266
+ });
267
+ const invocation = tool.build(params);
268
+ const confirmation = await invocation.shouldConfirmExecute(new AbortController().signal);
269
+ expect(confirmation).toEqual(expect.objectContaining({
270
+ title: `Confirm Edit: ${testFile}`,
271
+ fileName: testFile,
272
+ fileDiff: expect.any(String),
273
+ }));
270
274
  });
271
275
  it('should request confirmation for valid edit', async () => {
272
276
  fs.writeFileSync(filePath, 'some old content here');
@@ -420,13 +424,19 @@ describe('EditTool', () => {
420
424
  return { params, occurrences };
421
425
  });
422
426
  });
423
- it('should throw error if file path is not absolute', async () => {
427
+ it('should resolve relative path and execute successfully', async () => {
428
+ const initialContent = 'This is some old text.';
429
+ const newContent = 'This is some new text.';
430
+ fs.writeFileSync(filePath, initialContent, 'utf8');
424
431
  const params = {
425
- file_path: 'relative.txt',
432
+ file_path: testFile, // relative path
426
433
  old_string: 'old',
427
434
  new_string: 'new',
428
435
  };
429
- expect(() => tool.build(params)).toThrow(/File path must be absolute/);
436
+ const invocation = tool.build(params);
437
+ const result = await invocation.execute(new AbortController().signal);
438
+ expect(result.llmContent).toMatch(/Successfully modified file/);
439
+ expect(fs.readFileSync(filePath, 'utf8')).toBe(newContent);
430
440
  });
431
441
  it('should throw error if file path is empty', async () => {
432
442
  const params = {
@@ -732,13 +742,13 @@ describe('EditTool', () => {
732
742
  const result = await invocation.execute(new AbortController().signal);
733
743
  expect(result.error?.type).toBe(ToolErrorType.EDIT_NO_CHANGE);
734
744
  });
735
- it('should throw INVALID_PARAMETERS error for relative path', async () => {
745
+ it('should not throw error for relative path', async () => {
736
746
  const params = {
737
747
  file_path: 'relative/path.txt',
738
748
  old_string: 'a',
739
749
  new_string: 'b',
740
750
  };
741
- expect(() => tool.build(params)).toThrow();
751
+ expect(() => tool.build(params)).not.toThrow();
742
752
  });
743
753
  it('should return FILE_WRITE_FAILURE on write error', async () => {
744
754
  fs.writeFileSync(filePath, 'content', 'utf8');
@@ -828,14 +838,14 @@ describe('EditTool', () => {
828
838
  const tool = new EditTool({});
829
839
  const schema = tool.schema;
830
840
  expect(schema.parametersJsonSchema.properties
831
- .file_path.description).toBe("The absolute path to the file to modify (e.g., 'C:\\Users\\project\\file.txt'). Must be an absolute path.");
841
+ .file_path.description).toBe('The path to the file to modify.');
832
842
  });
833
843
  it('should use unix-style path examples on non-windows platforms', () => {
834
844
  vi.spyOn(process, 'platform', 'get').mockReturnValue('linux');
835
845
  const tool = new EditTool({});
836
846
  const schema = tool.schema;
837
847
  expect(schema.parametersJsonSchema.properties
838
- .file_path.description).toBe("The absolute path to the file to modify (e.g., '/home/user/project/file.txt'). Must start with '/'.");
848
+ .file_path.description).toBe('The path to the file to modify.');
839
849
  });
840
850
  });
841
851
  describe('IDE mode', () => {