@google/gemini-cli-core 0.1.18 → 0.1.19

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 (231) hide show
  1. package/README.md +199 -132
  2. package/dist/google-gemini-cli-core-0.1.18.tgz +0 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/code_assist/converter.d.ts +3 -2
  7. package/dist/src/code_assist/converter.js +2 -2
  8. package/dist/src/code_assist/converter.js.map +1 -1
  9. package/dist/src/code_assist/converter.test.js +48 -1
  10. package/dist/src/code_assist/converter.test.js.map +1 -1
  11. package/dist/src/code_assist/oauth2.js +1 -1
  12. package/dist/src/code_assist/oauth2.js.map +1 -1
  13. package/dist/src/code_assist/server.test.js +4 -1
  14. package/dist/src/code_assist/server.test.js.map +1 -1
  15. package/dist/src/code_assist/setup.js +4 -4
  16. package/dist/src/code_assist/setup.js.map +1 -1
  17. package/dist/src/config/config.d.ts +19 -0
  18. package/dist/src/config/config.js +29 -5
  19. package/dist/src/config/config.js.map +1 -1
  20. package/dist/src/config/config.test.js +8 -0
  21. package/dist/src/config/config.test.js.map +1 -1
  22. package/dist/src/core/client.d.ts +5 -4
  23. package/dist/src/core/client.js +162 -116
  24. package/dist/src/core/client.js.map +1 -1
  25. package/dist/src/core/client.test.js +275 -30
  26. package/dist/src/core/client.test.js.map +1 -1
  27. package/dist/src/core/contentGenerator.js +3 -2
  28. package/dist/src/core/contentGenerator.js.map +1 -1
  29. package/dist/src/core/contentGenerator.test.js +3 -2
  30. package/dist/src/core/contentGenerator.test.js.map +1 -1
  31. package/dist/src/core/coreToolScheduler.d.ts +21 -8
  32. package/dist/src/core/coreToolScheduler.js +170 -61
  33. package/dist/src/core/coreToolScheduler.js.map +1 -1
  34. package/dist/src/core/coreToolScheduler.test.js +181 -37
  35. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  36. package/dist/src/core/geminiChat.d.ts +7 -6
  37. package/dist/src/core/geminiChat.js +43 -43
  38. package/dist/src/core/geminiChat.js.map +1 -1
  39. package/dist/src/core/logger.d.ts +1 -0
  40. package/dist/src/core/logger.js +18 -0
  41. package/dist/src/core/logger.js.map +1 -1
  42. package/dist/src/core/logger.test.js +29 -0
  43. package/dist/src/core/logger.test.js.map +1 -1
  44. package/dist/src/core/loggingContentGenerator.d.ts +29 -0
  45. package/dist/src/core/loggingContentGenerator.js +97 -0
  46. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  47. package/dist/src/core/nonInteractiveToolExecutor.js +20 -1
  48. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  49. package/dist/src/core/nonInteractiveToolExecutor.test.js +7 -31
  50. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  51. package/dist/src/core/subagent.d.ts +230 -0
  52. package/dist/src/core/subagent.js +447 -0
  53. package/dist/src/core/subagent.js.map +1 -0
  54. package/dist/src/core/subagent.test.d.ts +6 -0
  55. package/dist/src/core/subagent.test.js +515 -0
  56. package/dist/src/core/subagent.test.js.map +1 -0
  57. package/dist/src/core/turn.js +1 -0
  58. package/dist/src/core/turn.js.map +1 -1
  59. package/dist/src/core/turn.test.js +4 -0
  60. package/dist/src/core/turn.test.js.map +1 -1
  61. package/dist/src/ide/detect-ide.d.ts +8 -1
  62. package/dist/src/ide/detect-ide.js +40 -3
  63. package/dist/src/ide/detect-ide.js.map +1 -1
  64. package/dist/src/ide/ide-client.d.ts +20 -1
  65. package/dist/src/ide/ide-client.js +144 -18
  66. package/dist/src/ide/ide-client.js.map +1 -1
  67. package/dist/src/ide/ide-installer.js +20 -1
  68. package/dist/src/ide/ide-installer.js.map +1 -1
  69. package/dist/src/ide/ide-installer.test.js +37 -2
  70. package/dist/src/ide/ide-installer.test.js.map +1 -1
  71. package/dist/src/ide/ideContext.d.ts +95 -0
  72. package/dist/src/ide/ideContext.js +45 -0
  73. package/dist/src/ide/ideContext.js.map +1 -1
  74. package/dist/src/mcp/google-auth-provider.js +9 -0
  75. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  76. package/dist/src/mcp/google-auth-provider.test.js +45 -10
  77. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  78. package/dist/src/services/loopDetectionService.js +14 -11
  79. package/dist/src/services/loopDetectionService.js.map +1 -1
  80. package/dist/src/services/loopDetectionService.test.js +191 -0
  81. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  82. package/dist/src/services/shellExecutionService.js +29 -9
  83. package/dist/src/services/shellExecutionService.js.map +1 -1
  84. package/dist/src/services/shellExecutionService.test.js +8 -0
  85. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  86. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +27 -2
  87. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +187 -58
  88. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  89. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +6 -0
  90. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +186 -0
  91. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
  92. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
  93. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +8 -0
  94. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  95. package/dist/src/telemetry/loggers.test.circular.js +7 -2
  96. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  97. package/dist/src/telemetry/loggers.test.js +7 -2
  98. package/dist/src/telemetry/loggers.test.js.map +1 -1
  99. package/dist/src/telemetry/metrics.d.ts +3 -2
  100. package/dist/src/telemetry/metrics.js +7 -1
  101. package/dist/src/telemetry/metrics.js.map +1 -1
  102. package/dist/src/telemetry/metrics.test.js +50 -0
  103. package/dist/src/telemetry/metrics.test.js.map +1 -1
  104. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  105. package/dist/src/telemetry/tool-call-decision.js +29 -0
  106. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  107. package/dist/src/telemetry/types.d.ts +4 -7
  108. package/dist/src/telemetry/types.js +17 -21
  109. package/dist/src/telemetry/types.js.map +1 -1
  110. package/dist/src/telemetry/uiTelemetry.d.ts +4 -1
  111. package/dist/src/telemetry/uiTelemetry.js +3 -1
  112. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  113. package/dist/src/telemetry/uiTelemetry.test.js +13 -2
  114. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  115. package/dist/src/test-utils/tools.d.ts +23 -0
  116. package/dist/src/test-utils/tools.js +41 -0
  117. package/dist/src/test-utils/tools.js.map +1 -0
  118. package/dist/src/tools/diffOptions.d.ts +2 -0
  119. package/dist/src/tools/diffOptions.js +28 -0
  120. package/dist/src/tools/diffOptions.js.map +1 -1
  121. package/dist/src/tools/diffOptions.test.d.ts +6 -0
  122. package/dist/src/tools/diffOptions.test.js +119 -0
  123. package/dist/src/tools/diffOptions.test.js.map +1 -0
  124. package/dist/src/tools/edit.d.ts +9 -33
  125. package/dist/src/tools/edit.js +143 -132
  126. package/dist/src/tools/edit.js.map +1 -1
  127. package/dist/src/tools/edit.test.js +117 -51
  128. package/dist/src/tools/edit.test.js.map +1 -1
  129. package/dist/src/tools/glob.d.ts +3 -10
  130. package/dist/src/tools/glob.js +85 -89
  131. package/dist/src/tools/glob.js.map +1 -1
  132. package/dist/src/tools/glob.test.js +22 -12
  133. package/dist/src/tools/glob.test.js.map +1 -1
  134. package/dist/src/tools/grep.d.ts +3 -35
  135. package/dist/src/tools/grep.js +111 -83
  136. package/dist/src/tools/grep.js.map +1 -1
  137. package/dist/src/tools/grep.test.js +40 -23
  138. package/dist/src/tools/grep.test.js.map +1 -1
  139. package/dist/src/tools/ls.js +8 -9
  140. package/dist/src/tools/ls.js.map +1 -1
  141. package/dist/src/tools/mcp-client.d.ts +14 -3
  142. package/dist/src/tools/mcp-client.js +82 -6
  143. package/dist/src/tools/mcp-client.js.map +1 -1
  144. package/dist/src/tools/mcp-client.test.js +340 -5
  145. package/dist/src/tools/mcp-client.test.js.map +1 -1
  146. package/dist/src/tools/mcp-tool.d.ts +3 -8
  147. package/dist/src/tools/mcp-tool.js +5 -18
  148. package/dist/src/tools/mcp-tool.js.map +1 -1
  149. package/dist/src/tools/memoryTool.d.ts +2 -2
  150. package/dist/src/tools/memoryTool.js +5 -5
  151. package/dist/src/tools/memoryTool.js.map +1 -1
  152. package/dist/src/tools/memoryTool.test.js +10 -1
  153. package/dist/src/tools/memoryTool.test.js.map +1 -1
  154. package/dist/src/tools/modifiable-tool.d.ts +8 -5
  155. package/dist/src/tools/modifiable-tool.js +4 -1
  156. package/dist/src/tools/modifiable-tool.js.map +1 -1
  157. package/dist/src/tools/modifiable-tool.test.js +3 -3
  158. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  159. package/dist/src/tools/read-file.d.ts +4 -6
  160. package/dist/src/tools/read-file.js +92 -45
  161. package/dist/src/tools/read-file.js.map +1 -1
  162. package/dist/src/tools/read-file.test.js +192 -130
  163. package/dist/src/tools/read-file.test.js.map +1 -1
  164. package/dist/src/tools/read-many-files.js +25 -20
  165. package/dist/src/tools/read-many-files.js.map +1 -1
  166. package/dist/src/tools/read-many-files.test.js +22 -11
  167. package/dist/src/tools/read-many-files.test.js.map +1 -1
  168. package/dist/src/tools/shell.js +11 -7
  169. package/dist/src/tools/shell.js.map +1 -1
  170. package/dist/src/tools/shell.test.js +21 -0
  171. package/dist/src/tools/shell.test.js.map +1 -1
  172. package/dist/src/tools/tool-error.d.ts +4 -0
  173. package/dist/src/tools/tool-error.js +4 -0
  174. package/dist/src/tools/tool-error.js.map +1 -1
  175. package/dist/src/tools/tool-registry.d.ts +12 -20
  176. package/dist/src/tools/tool-registry.js +23 -76
  177. package/dist/src/tools/tool-registry.js.map +1 -1
  178. package/dist/src/tools/tool-registry.test.js +19 -192
  179. package/dist/src/tools/tool-registry.test.js.map +1 -1
  180. package/dist/src/tools/tools.d.ts +144 -43
  181. package/dist/src/tools/tools.js +181 -11
  182. package/dist/src/tools/tools.js.map +1 -1
  183. package/dist/src/tools/tools.test.d.ts +6 -0
  184. package/dist/src/tools/tools.test.js +117 -0
  185. package/dist/src/tools/tools.test.js.map +1 -0
  186. package/dist/src/tools/web-fetch.js +3 -4
  187. package/dist/src/tools/web-fetch.js.map +1 -1
  188. package/dist/src/tools/web-search.js +1 -1
  189. package/dist/src/tools/web-search.js.map +1 -1
  190. package/dist/src/tools/write-file.d.ts +6 -2
  191. package/dist/src/tools/write-file.js +85 -20
  192. package/dist/src/tools/write-file.js.map +1 -1
  193. package/dist/src/tools/write-file.test.js +113 -8
  194. package/dist/src/tools/write-file.test.js.map +1 -1
  195. package/dist/src/utils/bfsFileSearch.test.js +28 -56
  196. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  197. package/dist/src/utils/editCorrector.js +8 -9
  198. package/dist/src/utils/editCorrector.js.map +1 -1
  199. package/dist/src/utils/environmentContext.d.ts +21 -0
  200. package/dist/src/utils/environmentContext.js +90 -0
  201. package/dist/src/utils/environmentContext.js.map +1 -0
  202. package/dist/src/utils/environmentContext.test.d.ts +6 -0
  203. package/dist/src/utils/environmentContext.test.js +139 -0
  204. package/dist/src/utils/environmentContext.test.js.map +1 -0
  205. package/dist/src/utils/fileUtils.d.ts +7 -0
  206. package/dist/src/utils/fileUtils.js +15 -12
  207. package/dist/src/utils/fileUtils.js.map +1 -1
  208. package/dist/src/utils/fileUtils.test.js +6 -5
  209. package/dist/src/utils/fileUtils.test.js.map +1 -1
  210. package/dist/src/utils/filesearch/crawlCache.d.ts +1 -1
  211. package/dist/src/utils/filesearch/crawlCache.js +4 -1
  212. package/dist/src/utils/filesearch/crawlCache.js.map +1 -1
  213. package/dist/src/utils/filesearch/crawlCache.test.js +10 -0
  214. package/dist/src/utils/filesearch/crawlCache.test.js.map +1 -1
  215. package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
  216. package/dist/src/utils/filesearch/fileSearch.js +32 -7
  217. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  218. package/dist/src/utils/filesearch/fileSearch.test.js +139 -0
  219. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  220. package/dist/src/utils/memoryDiscovery.js +4 -1
  221. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  222. package/dist/src/utils/nextSpeakerChecker.js +5 -6
  223. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  224. package/dist/src/utils/nextSpeakerChecker.test.js +2 -2
  225. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  226. package/dist/src/utils/schemaValidator.d.ts +1 -8
  227. package/dist/src/utils/schemaValidator.js +1 -32
  228. package/dist/src/utils/schemaValidator.js.map +1 -1
  229. package/dist/tsconfig.tsbuildinfo +1 -1
  230. package/package.json +3 -1
  231. package/dist/google-gemini-cli-core-0.1.17.tgz +0 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, expect, it } from 'vitest';
7
+ import { getDiffStat } from './diffOptions.js';
8
+ describe('getDiffStat', () => {
9
+ const fileName = 'test.txt';
10
+ it('should return 0 for all stats when there are no changes', () => {
11
+ const oldStr = 'line1\nline2\n';
12
+ const aiStr = 'line1\nline2\n';
13
+ const userStr = 'line1\nline2\n';
14
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
15
+ expect(diffStat).toEqual({
16
+ ai_added_lines: 0,
17
+ ai_removed_lines: 0,
18
+ user_added_lines: 0,
19
+ user_removed_lines: 0,
20
+ });
21
+ });
22
+ it('should correctly report AI additions', () => {
23
+ const oldStr = 'line1\nline2\n';
24
+ const aiStr = 'line1\nline2\nline3\n';
25
+ const userStr = 'line1\nline2\nline3\n';
26
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
27
+ expect(diffStat).toEqual({
28
+ ai_added_lines: 1,
29
+ ai_removed_lines: 0,
30
+ user_added_lines: 0,
31
+ user_removed_lines: 0,
32
+ });
33
+ });
34
+ it('should correctly report AI removals', () => {
35
+ const oldStr = 'line1\nline2\nline3\n';
36
+ const aiStr = 'line1\nline3\n';
37
+ const userStr = 'line1\nline3\n';
38
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
39
+ expect(diffStat).toEqual({
40
+ ai_added_lines: 0,
41
+ ai_removed_lines: 1,
42
+ user_added_lines: 0,
43
+ user_removed_lines: 0,
44
+ });
45
+ });
46
+ it('should correctly report AI modifications', () => {
47
+ const oldStr = 'line1\nline2\nline3\n';
48
+ const aiStr = 'line1\nline_two\nline3\n';
49
+ const userStr = 'line1\nline_two\nline3\n';
50
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
51
+ expect(diffStat).toEqual({
52
+ ai_added_lines: 1,
53
+ ai_removed_lines: 1,
54
+ user_added_lines: 0,
55
+ user_removed_lines: 0,
56
+ });
57
+ });
58
+ it('should correctly report user additions', () => {
59
+ const oldStr = 'line1\nline2\n';
60
+ const aiStr = 'line1\nline2\nline3\n';
61
+ const userStr = 'line1\nline2\nline3\nline4\n';
62
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
63
+ expect(diffStat).toEqual({
64
+ ai_added_lines: 1,
65
+ ai_removed_lines: 0,
66
+ user_added_lines: 1,
67
+ user_removed_lines: 0,
68
+ });
69
+ });
70
+ it('should correctly report user removals', () => {
71
+ const oldStr = 'line1\nline2\n';
72
+ const aiStr = 'line1\nline2\nline3\n';
73
+ const userStr = 'line1\nline2\n';
74
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
75
+ expect(diffStat).toEqual({
76
+ ai_added_lines: 1,
77
+ ai_removed_lines: 0,
78
+ user_added_lines: 0,
79
+ user_removed_lines: 1,
80
+ });
81
+ });
82
+ it('should correctly report user modifications', () => {
83
+ const oldStr = 'line1\nline2\n';
84
+ const aiStr = 'line1\nline2\nline3\n';
85
+ const userStr = 'line1\nline2\nline_three\n';
86
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
87
+ expect(diffStat).toEqual({
88
+ ai_added_lines: 1,
89
+ ai_removed_lines: 0,
90
+ user_added_lines: 1,
91
+ user_removed_lines: 1,
92
+ });
93
+ });
94
+ it('should handle complex changes from both AI and user', () => {
95
+ const oldStr = 'line1\nline2\nline3\nline4\n';
96
+ const aiStr = 'line_one\nline2\nline_three\nline4\n';
97
+ const userStr = 'line_one\nline_two\nline_three\nline4\nline5\n';
98
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
99
+ expect(diffStat).toEqual({
100
+ ai_added_lines: 2,
101
+ ai_removed_lines: 2,
102
+ user_added_lines: 2,
103
+ user_removed_lines: 1,
104
+ });
105
+ });
106
+ it('should report a single line modification as one addition and one removal', () => {
107
+ const oldStr = 'hello world';
108
+ const aiStr = 'hello universe';
109
+ const userStr = 'hello universe';
110
+ const diffStat = getDiffStat(fileName, oldStr, aiStr, userStr);
111
+ expect(diffStat).toEqual({
112
+ ai_added_lines: 1,
113
+ ai_removed_lines: 1,
114
+ user_added_lines: 0,
115
+ user_removed_lines: 0,
116
+ });
117
+ });
118
+ });
119
+ //# sourceMappingURL=diffOptions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffOptions.test.js","sourceRoot":"","sources":["../../../src/tools/diffOptions.test.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,10 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { BaseTool, ToolCallConfirmationDetails, ToolLocation, ToolResult } from './tools.js';
6
+ import { BaseDeclarativeTool, ToolInvocation, ToolResult } from './tools.js';
7
7
  import { Config } from '../config/config.js';
8
- import { ModifiableTool, ModifyContext } from './modifiable-tool.js';
8
+ import { ModifiableDeclarativeTool, ModifyContext } from './modifiable-tool.js';
9
+ export declare function applyReplacement(currentContent: string | null, oldString: string, newString: string, isNewFile: boolean): string;
9
10
  /**
10
11
  * Parameters for the Edit tool
11
12
  */
@@ -31,11 +32,15 @@ export interface EditToolParams {
31
32
  * Whether the edit was modified manually by the user.
32
33
  */
33
34
  modified_by_user?: boolean;
35
+ /**
36
+ * Initially proposed string.
37
+ */
38
+ ai_proposed_string?: string;
34
39
  }
35
40
  /**
36
41
  * Implementation of the Edit tool logic
37
42
  */
38
- export declare class EditTool extends BaseTool<EditToolParams, ToolResult> implements ModifiableTool<EditToolParams> {
43
+ export declare class EditTool extends BaseDeclarativeTool<EditToolParams, ToolResult> implements ModifiableDeclarativeTool<EditToolParams> {
39
44
  private readonly config;
40
45
  static readonly Name = "replace";
41
46
  constructor(config: Config);
@@ -45,35 +50,6 @@ export declare class EditTool extends BaseTool<EditToolParams, ToolResult> imple
45
50
  * @returns Error message string or null if valid
46
51
  */
47
52
  validateToolParams(params: EditToolParams): string | null;
48
- /**
49
- * Determines any file locations affected by the tool execution
50
- * @param params Parameters for the tool execution
51
- * @returns A list of such paths
52
- */
53
- toolLocations(params: EditToolParams): ToolLocation[];
54
- private _applyReplacement;
55
- /**
56
- * Calculates the potential outcome of an edit operation.
57
- * @param params Parameters for the edit operation
58
- * @returns An object describing the potential edit outcome
59
- * @throws File system errors if reading the file fails unexpectedly (e.g., permissions)
60
- */
61
- private calculateEdit;
62
- /**
63
- * Handles the confirmation prompt for the Edit tool in the CLI.
64
- * It needs to calculate the diff to show the user.
65
- */
66
- shouldConfirmExecute(params: EditToolParams, abortSignal: AbortSignal): Promise<ToolCallConfirmationDetails | false>;
67
- getDescription(params: EditToolParams): string;
68
- /**
69
- * Executes the edit operation with the given parameters.
70
- * @param params Parameters for the edit operation
71
- * @returns Result of the edit operation
72
- */
73
- execute(params: EditToolParams, signal: AbortSignal): Promise<ToolResult>;
74
- /**
75
- * Creates parent directories if they don't exist
76
- */
77
- private ensureParentDirectoriesExist;
53
+ protected createInvocation(params: EditToolParams): ToolInvocation<EditToolParams, ToolResult>;
78
54
  getModifyContext(_: AbortSignal): ModifyContext<EditToolParams>;
79
55
  }
@@ -6,99 +6,39 @@
6
6
  import * as fs from 'fs';
7
7
  import * as path from 'path';
8
8
  import * as Diff from 'diff';
9
- import { BaseTool, Icon, ToolConfirmationOutcome, } from './tools.js';
9
+ import { BaseDeclarativeTool, Icon, ToolConfirmationOutcome, } from './tools.js';
10
10
  import { ToolErrorType } from './tool-error.js';
11
- import { Type } from '@google/genai';
12
11
  import { SchemaValidator } from '../utils/schemaValidator.js';
13
12
  import { makeRelative, shortenPath } from '../utils/paths.js';
14
13
  import { isNodeError } from '../utils/errors.js';
15
14
  import { ApprovalMode } from '../config/config.js';
16
15
  import { ensureCorrectEdit } from '../utils/editCorrector.js';
17
- import { DEFAULT_DIFF_OPTIONS } from './diffOptions.js';
16
+ import { DEFAULT_DIFF_OPTIONS, getDiffStat } from './diffOptions.js';
18
17
  import { ReadFileTool } from './read-file.js';
19
- /**
20
- * Implementation of the Edit tool logic
21
- */
22
- export class EditTool extends BaseTool {
23
- config;
24
- static Name = 'replace';
25
- constructor(config) {
26
- super(EditTool.Name, 'Edit', `Replaces text within a file. By default, replaces a single occurrence, but can replace multiple occurrences when \`expected_replacements\` is specified. This tool requires providing significant context around the change to ensure precise targeting. Always use the ${ReadFileTool.Name} tool to examine the file's current content before attempting a text replacement.
27
-
28
- The user has the ability to modify the \`new_string\` content. If modified, this will be stated in the response.
29
-
30
- Expectation for required parameters:
31
- 1. \`file_path\` MUST be an absolute path; otherwise an error will be thrown.
32
- 2. \`old_string\` MUST be the exact literal text to replace (including all whitespace, indentation, newlines, and surrounding code etc.).
33
- 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.
34
- 4. NEVER escape \`old_string\` or \`new_string\`, that would break the exact literal text requirement.
35
- **Important:** If ANY of the above are not satisfied, the tool will fail. CRITICAL for \`old_string\`: Must uniquely identify the single instance to change. Include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. If this string matches multiple locations, or does not match exactly, the tool will fail.
36
- **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.`, Icon.Pencil, {
37
- properties: {
38
- file_path: {
39
- description: "The absolute path to the file to modify. Must start with '/'.",
40
- type: Type.STRING,
41
- },
42
- old_string: {
43
- description: 'The exact literal text to replace, preferably unescaped. For single replacements (default), include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. For multiple replacements, specify expected_replacements parameter. If this string is not the exact literal text (i.e. you escaped it) or does not match exactly, the tool will fail.',
44
- type: Type.STRING,
45
- },
46
- new_string: {
47
- description: 'The exact literal text to replace `old_string` with, preferably unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic.',
48
- type: Type.STRING,
49
- },
50
- expected_replacements: {
51
- type: Type.NUMBER,
52
- description: 'Number of replacements expected. Defaults to 1 if not specified. Use when you want to replace multiple occurrences.',
53
- minimum: 1,
54
- },
55
- },
56
- required: ['file_path', 'old_string', 'new_string'],
57
- type: Type.OBJECT,
58
- });
59
- this.config = config;
18
+ import { IDEConnectionStatus } from '../ide/ide-client.js';
19
+ export function applyReplacement(currentContent, oldString, newString, isNewFile) {
20
+ if (isNewFile) {
21
+ return newString;
60
22
  }
61
- /**
62
- * Validates the parameters for the Edit tool
63
- * @param params Parameters to validate
64
- * @returns Error message string or null if valid
65
- */
66
- validateToolParams(params) {
67
- const errors = SchemaValidator.validate(this.schema.parameters, params);
68
- if (errors) {
69
- return errors;
70
- }
71
- if (!path.isAbsolute(params.file_path)) {
72
- return `File path must be absolute: ${params.file_path}`;
73
- }
74
- const workspaceContext = this.config.getWorkspaceContext();
75
- if (!workspaceContext.isPathWithinWorkspace(params.file_path)) {
76
- const directories = workspaceContext.getDirectories();
77
- return `File path must be within one of the workspace directories: ${directories.join(', ')}`;
78
- }
79
- return null;
23
+ if (currentContent === null) {
24
+ // Should not happen if not a new file, but defensively return empty or newString if oldString is also empty
25
+ return oldString === '' ? newString : '';
80
26
  }
81
- /**
82
- * Determines any file locations affected by the tool execution
83
- * @param params Parameters for the tool execution
84
- * @returns A list of such paths
85
- */
86
- toolLocations(params) {
87
- return [{ path: params.file_path }];
27
+ // If oldString is empty and it's not a new file, do not modify the content.
28
+ if (oldString === '' && !isNewFile) {
29
+ return currentContent;
88
30
  }
89
- _applyReplacement(currentContent, oldString, newString, isNewFile) {
90
- if (isNewFile) {
91
- return newString;
92
- }
93
- if (currentContent === null) {
94
- // Should not happen if not a new file, but defensively return empty or newString if oldString is also empty
95
- return oldString === '' ? newString : '';
96
- }
97
- // If oldString is empty and it's not a new file, do not modify the content.
98
- if (oldString === '' && !isNewFile) {
99
- return currentContent;
100
- }
101
- return currentContent.replaceAll(oldString, newString);
31
+ return currentContent.replaceAll(oldString, newString);
32
+ }
33
+ class EditToolInvocation {
34
+ config;
35
+ params;
36
+ constructor(config, params) {
37
+ this.config = config;
38
+ this.params = params;
39
+ }
40
+ toolLocations() {
41
+ return [{ path: this.params.file_path }];
102
42
  }
103
43
  /**
104
44
  * Calculates the potential outcome of an edit operation.
@@ -185,7 +125,7 @@ Expectation for required parameters:
185
125
  type: ToolErrorType.READ_CONTENT_FAILURE,
186
126
  };
187
127
  }
188
- const newContent = this._applyReplacement(currentContent, finalOldString, finalNewString, isNewFile);
128
+ const newContent = applyReplacement(currentContent, finalOldString, finalNewString, isNewFile);
189
129
  return {
190
130
  currentContent,
191
131
  newContent,
@@ -198,18 +138,13 @@ Expectation for required parameters:
198
138
  * Handles the confirmation prompt for the Edit tool in the CLI.
199
139
  * It needs to calculate the diff to show the user.
200
140
  */
201
- async shouldConfirmExecute(params, abortSignal) {
141
+ async shouldConfirmExecute(abortSignal) {
202
142
  if (this.config.getApprovalMode() === ApprovalMode.AUTO_EDIT) {
203
143
  return false;
204
144
  }
205
- const validationError = this.validateToolParams(params);
206
- if (validationError) {
207
- console.error(`[EditTool Wrapper] Attempted confirmation with invalid parameters: ${validationError}`);
208
- return false;
209
- }
210
145
  let editData;
211
146
  try {
212
- editData = await this.calculateEdit(params, abortSignal);
147
+ editData = await this.calculateEdit(this.params, abortSignal);
213
148
  }
214
149
  catch (error) {
215
150
  const errorMsg = error instanceof Error ? error.message : String(error);
@@ -220,12 +155,19 @@ Expectation for required parameters:
220
155
  console.log(`Error: ${editData.error.display}`);
221
156
  return false;
222
157
  }
223
- const fileName = path.basename(params.file_path);
158
+ const fileName = path.basename(this.params.file_path);
224
159
  const fileDiff = Diff.createPatch(fileName, editData.currentContent ?? '', editData.newContent, 'Current', 'Proposed', DEFAULT_DIFF_OPTIONS);
160
+ const ideClient = this.config.getIdeClient();
161
+ const ideConfirmation = this.config.getIdeModeFeature() &&
162
+ this.config.getIdeMode() &&
163
+ ideClient?.getConnectionStatus().status === IDEConnectionStatus.Connected
164
+ ? ideClient.openDiff(this.params.file_path, editData.newContent)
165
+ : undefined;
225
166
  const confirmationDetails = {
226
167
  type: 'edit',
227
- title: `Confirm Edit: ${shortenPath(makeRelative(params.file_path, this.config.getTargetDir()))}`,
168
+ title: `Confirm Edit: ${shortenPath(makeRelative(this.params.file_path, this.config.getTargetDir()))}`,
228
169
  fileName,
170
+ filePath: this.params.file_path,
229
171
  fileDiff,
230
172
  originalContent: editData.currentContent,
231
173
  newContent: editData.newContent,
@@ -233,23 +175,30 @@ Expectation for required parameters:
233
175
  if (outcome === ToolConfirmationOutcome.ProceedAlways) {
234
176
  this.config.setApprovalMode(ApprovalMode.AUTO_EDIT);
235
177
  }
178
+ if (ideConfirmation) {
179
+ const result = await ideConfirmation;
180
+ if (result.status === 'accepted' && result.content) {
181
+ // TODO(chrstn): See https://github.com/google-gemini/gemini-cli/pull/5618#discussion_r2255413084
182
+ // for info on a possible race condition where the file is modified on disk while being edited.
183
+ this.params.old_string = editData.currentContent ?? '';
184
+ this.params.new_string = result.content;
185
+ }
186
+ }
236
187
  },
188
+ ideConfirmation,
237
189
  };
238
190
  return confirmationDetails;
239
191
  }
240
- getDescription(params) {
241
- if (!params.file_path || !params.old_string || !params.new_string) {
242
- return `Model did not provide valid parameters for edit tool`;
243
- }
244
- const relativePath = makeRelative(params.file_path, this.config.getTargetDir());
245
- if (params.old_string === '') {
192
+ getDescription() {
193
+ const relativePath = makeRelative(this.params.file_path, this.config.getTargetDir());
194
+ if (this.params.old_string === '') {
246
195
  return `Create ${shortenPath(relativePath)}`;
247
196
  }
248
- const oldStringSnippet = params.old_string.split('\n')[0].substring(0, 30) +
249
- (params.old_string.length > 30 ? '...' : '');
250
- const newStringSnippet = params.new_string.split('\n')[0].substring(0, 30) +
251
- (params.new_string.length > 30 ? '...' : '');
252
- if (params.old_string === params.new_string) {
197
+ const oldStringSnippet = this.params.old_string.split('\n')[0].substring(0, 30) +
198
+ (this.params.old_string.length > 30 ? '...' : '');
199
+ const newStringSnippet = this.params.new_string.split('\n')[0].substring(0, 30) +
200
+ (this.params.new_string.length > 30 ? '...' : '');
201
+ if (this.params.old_string === this.params.new_string) {
253
202
  return `No file changes to ${shortenPath(relativePath)}`;
254
203
  }
255
204
  return `${shortenPath(relativePath)}: ${oldStringSnippet} => ${newStringSnippet}`;
@@ -259,21 +208,10 @@ Expectation for required parameters:
259
208
  * @param params Parameters for the edit operation
260
209
  * @returns Result of the edit operation
261
210
  */
262
- async execute(params, signal) {
263
- const validationError = this.validateToolParams(params);
264
- if (validationError) {
265
- return {
266
- llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
267
- returnDisplay: `Error: ${validationError}`,
268
- error: {
269
- message: validationError,
270
- type: ToolErrorType.INVALID_TOOL_PARAMS,
271
- },
272
- };
273
- }
211
+ async execute(signal) {
274
212
  let editData;
275
213
  try {
276
- editData = await this.calculateEdit(params, signal);
214
+ editData = await this.calculateEdit(this.params, signal);
277
215
  }
278
216
  catch (error) {
279
217
  const errorMsg = error instanceof Error ? error.message : String(error);
@@ -297,32 +235,35 @@ Expectation for required parameters:
297
235
  };
298
236
  }
299
237
  try {
300
- this.ensureParentDirectoriesExist(params.file_path);
301
- fs.writeFileSync(params.file_path, editData.newContent, 'utf8');
238
+ this.ensureParentDirectoriesExist(this.params.file_path);
239
+ fs.writeFileSync(this.params.file_path, editData.newContent, 'utf8');
302
240
  let displayResult;
303
241
  if (editData.isNewFile) {
304
- displayResult = `Created ${shortenPath(makeRelative(params.file_path, this.config.getTargetDir()))}`;
242
+ displayResult = `Created ${shortenPath(makeRelative(this.params.file_path, this.config.getTargetDir()))}`;
305
243
  }
306
244
  else {
307
245
  // Generate diff for display, even though core logic doesn't technically need it
308
246
  // The CLI wrapper will use this part of the ToolResult
309
- const fileName = path.basename(params.file_path);
247
+ const fileName = path.basename(this.params.file_path);
310
248
  const fileDiff = Diff.createPatch(fileName, editData.currentContent ?? '', // Should not be null here if not isNewFile
311
249
  editData.newContent, 'Current', 'Proposed', DEFAULT_DIFF_OPTIONS);
250
+ const originallyProposedContent = this.params.ai_proposed_string || this.params.new_string;
251
+ const diffStat = getDiffStat(fileName, editData.currentContent ?? '', originallyProposedContent, this.params.new_string);
312
252
  displayResult = {
313
253
  fileDiff,
314
254
  fileName,
315
255
  originalContent: editData.currentContent,
316
256
  newContent: editData.newContent,
257
+ diffStat,
317
258
  };
318
259
  }
319
260
  const llmSuccessMessageParts = [
320
261
  editData.isNewFile
321
- ? `Created new file: ${params.file_path} with provided content.`
322
- : `Successfully modified file: ${params.file_path} (${editData.occurrences} replacements).`,
262
+ ? `Created new file: ${this.params.file_path} with provided content.`
263
+ : `Successfully modified file: ${this.params.file_path} (${editData.occurrences} replacements).`,
323
264
  ];
324
- if (params.modified_by_user) {
325
- llmSuccessMessageParts.push(`User modified the \`new_string\` content to be: ${params.new_string}.`);
265
+ if (this.params.modified_by_user) {
266
+ llmSuccessMessageParts.push(`User modified the \`new_string\` content to be: ${this.params.new_string}.`);
326
267
  }
327
268
  return {
328
269
  llmContent: llmSuccessMessageParts.join(' '),
@@ -350,6 +291,72 @@ Expectation for required parameters:
350
291
  fs.mkdirSync(dirName, { recursive: true });
351
292
  }
352
293
  }
294
+ }
295
+ /**
296
+ * Implementation of the Edit tool logic
297
+ */
298
+ export class EditTool extends BaseDeclarativeTool {
299
+ config;
300
+ static Name = 'replace';
301
+ constructor(config) {
302
+ super(EditTool.Name, 'Edit', `Replaces text within a file. By default, replaces a single occurrence, but can replace multiple occurrences when \`expected_replacements\` is specified. This tool requires providing significant context around the change to ensure precise targeting. Always use the ${ReadFileTool.Name} tool to examine the file's current content before attempting a text replacement.
303
+
304
+ The user has the ability to modify the \`new_string\` content. If modified, this will be stated in the response.
305
+
306
+ Expectation for required parameters:
307
+ 1. \`file_path\` MUST be an absolute path; otherwise an error will be thrown.
308
+ 2. \`old_string\` MUST be the exact literal text to replace (including all whitespace, indentation, newlines, and surrounding code etc.).
309
+ 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.
310
+ 4. NEVER escape \`old_string\` or \`new_string\`, that would break the exact literal text requirement.
311
+ **Important:** If ANY of the above are not satisfied, the tool will fail. CRITICAL for \`old_string\`: Must uniquely identify the single instance to change. Include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. If this string matches multiple locations, or does not match exactly, the tool will fail.
312
+ **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.`, Icon.Pencil, {
313
+ properties: {
314
+ file_path: {
315
+ description: "The absolute path to the file to modify. Must start with '/'.",
316
+ type: 'string',
317
+ },
318
+ old_string: {
319
+ description: 'The exact literal text to replace, preferably unescaped. For single replacements (default), include at least 3 lines of context BEFORE and AFTER the target text, matching whitespace and indentation precisely. For multiple replacements, specify expected_replacements parameter. If this string is not the exact literal text (i.e. you escaped it) or does not match exactly, the tool will fail.',
320
+ type: 'string',
321
+ },
322
+ new_string: {
323
+ description: 'The exact literal text to replace `old_string` with, preferably unescaped. Provide the EXACT text. Ensure the resulting code is correct and idiomatic.',
324
+ type: 'string',
325
+ },
326
+ expected_replacements: {
327
+ type: 'number',
328
+ description: 'Number of replacements expected. Defaults to 1 if not specified. Use when you want to replace multiple occurrences.',
329
+ minimum: 1,
330
+ },
331
+ },
332
+ required: ['file_path', 'old_string', 'new_string'],
333
+ type: 'object',
334
+ });
335
+ this.config = config;
336
+ }
337
+ /**
338
+ * Validates the parameters for the Edit tool
339
+ * @param params Parameters to validate
340
+ * @returns Error message string or null if valid
341
+ */
342
+ validateToolParams(params) {
343
+ const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
344
+ if (errors) {
345
+ return errors;
346
+ }
347
+ if (!path.isAbsolute(params.file_path)) {
348
+ return `File path must be absolute: ${params.file_path}`;
349
+ }
350
+ const workspaceContext = this.config.getWorkspaceContext();
351
+ if (!workspaceContext.isPathWithinWorkspace(params.file_path)) {
352
+ const directories = workspaceContext.getDirectories();
353
+ return `File path must be within one of the workspace directories: ${directories.join(', ')}`;
354
+ }
355
+ return null;
356
+ }
357
+ createInvocation(params) {
358
+ return new EditToolInvocation(this.config, params);
359
+ }
353
360
  getModifyContext(_) {
354
361
  return {
355
362
  getFilePath: (params) => params.file_path,
@@ -366,7 +373,7 @@ Expectation for required parameters:
366
373
  getProposedContent: async (params) => {
367
374
  try {
368
375
  const currentContent = fs.readFileSync(params.file_path, 'utf8');
369
- return this._applyReplacement(currentContent, params.old_string, params.new_string, params.old_string === '' && currentContent === '');
376
+ return applyReplacement(currentContent, params.old_string, params.new_string, params.old_string === '' && currentContent === '');
370
377
  }
371
378
  catch (err) {
372
379
  if (!isNodeError(err) || err.code !== 'ENOENT')
@@ -374,12 +381,16 @@ Expectation for required parameters:
374
381
  return '';
375
382
  }
376
383
  },
377
- createUpdatedParams: (oldContent, modifiedProposedContent, originalParams) => ({
378
- ...originalParams,
379
- old_string: oldContent,
380
- new_string: modifiedProposedContent,
381
- modified_by_user: true,
382
- }),
384
+ createUpdatedParams: (oldContent, modifiedProposedContent, originalParams) => {
385
+ const content = originalParams.new_string;
386
+ return {
387
+ ...originalParams,
388
+ ai_proposed_string: content,
389
+ old_string: oldContent,
390
+ new_string: modifiedProposedContent,
391
+ modified_by_user: true,
392
+ };
393
+ },
383
394
  };
384
395
  }
385
396
  }
@@ -1 +1 @@
1
- {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,QAAQ,EACR,IAAI,EAEJ,uBAAuB,GAKxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAU,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0C9C;;GAEG;AACH,MAAM,OAAO,QACX,SAAQ,QAAoC;IAKf;IAF7B,MAAM,CAAU,IAAI,GAAG,SAAS,CAAC;IAEjC,YAA6B,MAAc;QACzC,KAAK,CACH,QAAQ,CAAC,IAAI,EACb,MAAM,EACN,2QAA2Q,YAAY,CAAC,IAAI;;;;;;;;;;gPAUlD,EAC1O,IAAI,CAAC,MAAM,EACX;YACE,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,WAAW,EACT,+DAA+D;oBACjE,IAAI,EAAE,IAAI,CAAC,MAAM;iBAClB;gBACD,UAAU,EAAE;oBACV,WAAW,EACT,wYAAwY;oBAC1Y,IAAI,EAAE,IAAI,CAAC,MAAM;iBAClB;gBACD,UAAU,EAAE;oBACV,WAAW,EACT,wJAAwJ;oBAC1J,IAAI,EAAE,IAAI,CAAC,MAAM;iBAClB;gBACD,qBAAqB,EAAE;oBACrB,IAAI,EAAE,IAAI,CAAC,MAAM;oBACjB,WAAW,EACT,qHAAqH;oBACvH,OAAO,EAAE,CAAC;iBACX;aACF;YACD,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACnD,IAAI,EAAE,IAAI,CAAC,MAAM;SAClB,CACF,CAAC;QA3CyB,WAAM,GAAN,MAAM,CAAQ;IA4C3C,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,MAAsB;QACvC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,OAAO,+BAA+B,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3D,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAC3D,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9D,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;YACtD,OAAO,8DAA8D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChG,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,MAAsB;QAClC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACtC,CAAC;IAEO,iBAAiB,CACvB,cAA6B,EAC7B,SAAiB,EACjB,SAAiB,EACjB,SAAkB;QAElB,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,4GAA4G;YAC5G,OAAO,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,CAAC;QACD,4EAA4E;QAC5E,IAAI,SAAS,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,OAAO,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,aAAa,CACzB,MAAsB,EACtB,WAAwB;QAExB,MAAM,oBAAoB,GAAG,MAAM,CAAC,qBAAqB,IAAI,CAAC,CAAC;QAC/D,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;QACvC,IAAI,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;QACvC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,KAAK,GAEO,SAAS,CAAC;QAE1B,IAAI,CAAC;YACH,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC3D,0DAA0D;YAC1D,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvD,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/C,mDAAmD;gBACnD,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5C,sBAAsB;YACtB,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,kEAAkE;YAClE,KAAK,GAAG;gBACN,OAAO,EAAE,kFAAkF;gBAC3F,GAAG,EAAE,mBAAmB,MAAM,CAAC,SAAS,EAAE;gBAC1C,IAAI,EAAE,aAAa,CAAC,cAAc;aACnC,CAAC;QACJ,CAAC;aAAM,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YACnC,2BAA2B;YAC3B,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAC3C,MAAM,CAAC,SAAS,EAChB,cAAc,EACd,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAC7B,WAAW,CACZ,CAAC;YACF,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;YACjD,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;YACjD,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;YAExC,IAAI,MAAM,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;gBAC7B,qDAAqD;gBACrD,KAAK,GAAG;oBACN,OAAO,EAAE,iEAAiE;oBAC1E,GAAG,EAAE,uCAAuC,MAAM,CAAC,SAAS,EAAE;oBAC9D,IAAI,EAAE,aAAa,CAAC,+BAA+B;iBACpD,CAAC;YACJ,CAAC;iBAAM,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBAC7B,KAAK,GAAG;oBACN,OAAO,EAAE,uDAAuD;oBAChE,GAAG,EAAE,yDAAyD,MAAM,CAAC,SAAS,mKAAmK,YAAY,CAAC,IAAI,kBAAkB;oBACpR,IAAI,EAAE,aAAa,CAAC,wBAAwB;iBAC7C,CAAC;YACJ,CAAC;iBAAM,IAAI,WAAW,KAAK,oBAAoB,EAAE,CAAC;gBAChD,MAAM,cAAc,GAClB,oBAAoB,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;gBAE5D,KAAK,GAAG;oBACN,OAAO,EAAE,4BAA4B,oBAAoB,IAAI,cAAc,cAAc,WAAW,GAAG;oBACvG,GAAG,EAAE,4BAA4B,oBAAoB,IAAI,cAAc,cAAc,WAAW,4BAA4B,MAAM,CAAC,SAAS,EAAE;oBAC9I,IAAI,EAAE,aAAa,CAAC,iCAAiC;iBACtD,CAAC;YACJ,CAAC;iBAAM,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;gBAC7C,KAAK,GAAG;oBACN,OAAO,EAAE,mEAAmE;oBAC5E,GAAG,EAAE,6EAA6E,MAAM,CAAC,SAAS,EAAE;oBACpG,IAAI,EAAE,aAAa,CAAC,cAAc;iBACnC,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gFAAgF;YAChF,KAAK,GAAG;gBACN,OAAO,EAAE,iCAAiC;gBAC1C,GAAG,EAAE,4CAA4C,MAAM,CAAC,SAAS,EAAE;gBACnE,IAAI,EAAE,aAAa,CAAC,oBAAoB;aACzC,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CACvC,cAAc,EACd,cAAc,EACd,cAAc,EACd,SAAS,CACV,CAAC;QAEF,OAAO;YACL,cAAc;YACd,UAAU;YACV,WAAW;YACX,KAAK;YACL,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,oBAAoB,CACxB,MAAsB,EACtB,WAAwB;QAExB,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CACX,sEAAsE,eAAe,EAAE,CACxF,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,QAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAC/B,QAAQ,EACR,QAAQ,CAAC,cAAc,IAAI,EAAE,EAC7B,QAAQ,CAAC,UAAU,EACnB,SAAS,EACT,UAAU,EACV,oBAAoB,CACrB,CAAC;QACF,MAAM,mBAAmB,GAAgC;YACvD,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,iBAAiB,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;YACjG,QAAQ;YACR,QAAQ;YACR,eAAe,EAAE,QAAQ,CAAC,cAAc;YACxC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,SAAS,EAAE,KAAK,EAAE,OAAgC,EAAE,EAAE;gBACpD,IAAI,OAAO,KAAK,uBAAuB,CAAC,aAAa,EAAE,CAAC;oBACtD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;SACF,CAAC;QACF,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,MAAsB;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAClE,OAAO,sDAAsD,CAAC;QAChE,CAAC;QACD,MAAM,YAAY,GAAG,YAAY,CAC/B,MAAM,CAAC,SAAS,EAChB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAC3B,CAAC;QACF,IAAI,MAAM,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;YAC7B,OAAO,UAAU,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,gBAAgB,GACpB,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;YACjD,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,gBAAgB,GACpB,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;YACjD,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE/C,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5C,OAAO,sBAAsB,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,KAAK,gBAAgB,OAAO,gBAAgB,EAAE,CAAC;IACpF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CACX,MAAsB,EACtB,MAAmB;QAEnB,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO;gBACL,UAAU,EAAE,+CAA+C,eAAe,EAAE;gBAC5E,aAAa,EAAE,UAAU,eAAe,EAAE;gBAC1C,KAAK,EAAE;oBACL,OAAO,EAAE,eAAe;oBACxB,IAAI,EAAE,aAAa,CAAC,mBAAmB;iBACxC;aACF,CAAC;QACJ,CAAC;QAED,IAAI,QAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO;gBACL,UAAU,EAAE,yBAAyB,QAAQ,EAAE;gBAC/C,aAAa,EAAE,yBAAyB,QAAQ,EAAE;gBAClD,KAAK,EAAE;oBACL,OAAO,EAAE,QAAQ;oBACjB,IAAI,EAAE,aAAa,CAAC,wBAAwB;iBAC7C;aACF,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO;gBACL,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG;gBAC9B,aAAa,EAAE,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;gBACjD,KAAK,EAAE;oBACL,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG;oBAC3B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;iBAC1B;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpD,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAEhE,IAAI,aAAgC,CAAC;YACrC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvB,aAAa,GAAG,WAAW,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC;YACvG,CAAC;iBAAM,CAAC;gBACN,gFAAgF;gBAChF,uDAAuD;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAC/B,QAAQ,EACR,QAAQ,CAAC,cAAc,IAAI,EAAE,EAAE,2CAA2C;gBAC1E,QAAQ,CAAC,UAAU,EACnB,SAAS,EACT,UAAU,EACV,oBAAoB,CACrB,CAAC;gBACF,aAAa,GAAG;oBACd,QAAQ;oBACR,QAAQ;oBACR,eAAe,EAAE,QAAQ,CAAC,cAAc;oBACxC,UAAU,EAAE,QAAQ,CAAC,UAAU;iBAChC,CAAC;YACJ,CAAC;YAED,MAAM,sBAAsB,GAAG;gBAC7B,QAAQ,CAAC,SAAS;oBAChB,CAAC,CAAC,qBAAqB,MAAM,CAAC,SAAS,yBAAyB;oBAChE,CAAC,CAAC,+BAA+B,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,WAAW,iBAAiB;aAC9F,CAAC;YACF,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,sBAAsB,CAAC,IAAI,CACzB,mDAAmD,MAAM,CAAC,UAAU,GAAG,CACxE,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,UAAU,EAAE,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC5C,aAAa,EAAE,aAAa;aAC7B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO;gBACL,UAAU,EAAE,yBAAyB,QAAQ,EAAE;gBAC/C,aAAa,EAAE,uBAAuB,QAAQ,EAAE;gBAChD,KAAK,EAAE;oBACL,OAAO,EAAE,QAAQ;oBACjB,IAAI,EAAE,aAAa,CAAC,kBAAkB;iBACvC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,4BAA4B,CAAC,QAAgB;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,CAAc;QAC7B,OAAO;YACL,WAAW,EAAE,CAAC,MAAsB,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS;YACzD,iBAAiB,EAAE,KAAK,EAAE,MAAsB,EAAmB,EAAE;gBACnE,IAAI,CAAC;oBACH,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACnD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,GAAG,CAAC;oBAC1D,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,kBAAkB,EAAE,KAAK,EAAE,MAAsB,EAAmB,EAAE;gBACpE,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBACjE,OAAO,IAAI,CAAC,iBAAiB,CAC3B,cAAc,EACd,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,KAAK,EAAE,IAAI,cAAc,KAAK,EAAE,CAClD,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,GAAG,CAAC;oBAC1D,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,mBAAmB,EAAE,CACnB,UAAkB,EAClB,uBAA+B,EAC/B,cAA8B,EACd,EAAE,CAAC,CAAC;gBACpB,GAAG,cAAc;gBACjB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,uBAAuB;gBACnC,gBAAgB,EAAE,IAAI;aACvB,CAAC;SACH,CAAC;IACJ,CAAC"}
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/edit.ts"],"names":[],"mappings":"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"}