@vybestack/llxprt-code-core 0.1.18-nightly.250808.f9b79d74 → 0.1.18-nightly.250812.12fa8ad2

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 (563) hide show
  1. package/README.md +49 -2
  2. package/dist/index.d.ts +6 -0
  3. package/dist/index.js +5 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/auth/anthropic-device-flow.d.ts +53 -0
  6. package/dist/src/auth/anthropic-device-flow.js +208 -0
  7. package/dist/src/auth/anthropic-device-flow.js.map +1 -0
  8. package/dist/src/auth/precedence.d.ts +55 -0
  9. package/dist/src/auth/precedence.js +211 -0
  10. package/dist/src/auth/precedence.js.map +1 -0
  11. package/dist/src/auth/qwen-device-flow.d.ts +45 -0
  12. package/dist/src/auth/qwen-device-flow.js +179 -0
  13. package/dist/src/auth/qwen-device-flow.js.map +1 -0
  14. package/dist/src/auth/token-store.d.ts +66 -0
  15. package/dist/src/auth/token-store.js +151 -0
  16. package/dist/src/auth/token-store.js.map +1 -0
  17. package/dist/src/auth/types.d.ts +130 -0
  18. package/dist/src/auth/types.js +60 -0
  19. package/dist/src/auth/types.js.map +1 -0
  20. package/dist/src/code_assist/converter.d.ts +2 -1
  21. package/dist/src/code_assist/converter.js +1 -1
  22. package/dist/src/code_assist/converter.js.map +1 -1
  23. package/dist/src/code_assist/oauth2.js +2 -1
  24. package/dist/src/code_assist/oauth2.js.map +1 -1
  25. package/dist/src/config/config.d.ts +78 -3
  26. package/dist/src/config/config.js +159 -6
  27. package/dist/src/config/config.js.map +1 -1
  28. package/dist/src/config/endpoints.d.ts +60 -0
  29. package/dist/src/config/endpoints.js +126 -0
  30. package/dist/src/config/endpoints.js.map +1 -0
  31. package/dist/src/config/profileManager.d.ts +14 -4
  32. package/dist/src/config/profileManager.js +90 -11
  33. package/dist/src/config/profileManager.js.map +1 -1
  34. package/dist/src/core/client.js +16 -16
  35. package/dist/src/core/client.js.map +1 -1
  36. package/dist/src/core/contentGenerator.d.ts +4 -1
  37. package/dist/src/core/contentGenerator.js +3 -0
  38. package/dist/src/core/contentGenerator.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/loggingContentGenerator.d.ts +24 -0
  43. package/dist/src/core/loggingContentGenerator.js +89 -0
  44. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  45. package/dist/src/core/nonInteractiveToolExecutor.js +17 -0
  46. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  47. package/dist/src/core/subagent.js +12 -10
  48. package/dist/src/core/subagent.js.map +1 -1
  49. package/dist/src/ide/ide-client.d.ts +2 -2
  50. package/dist/src/ide/ide-client.js +56 -18
  51. package/dist/src/ide/ide-client.js.map +1 -1
  52. package/dist/src/index.d.ts +11 -0
  53. package/dist/src/index.js +12 -0
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/providers/BaseProvider.d.ts +149 -0
  56. package/dist/src/providers/BaseProvider.js +315 -0
  57. package/dist/src/providers/BaseProvider.js.map +1 -0
  58. package/dist/src/providers/IProvider.d.ts +1 -0
  59. package/dist/src/providers/IProviderManager.d.ts +5 -0
  60. package/dist/src/providers/LoggingProviderWrapper.d.ts +54 -0
  61. package/dist/src/providers/LoggingProviderWrapper.js +350 -0
  62. package/dist/src/providers/LoggingProviderWrapper.js.map +1 -0
  63. package/dist/src/providers/ProviderManager.d.ts +20 -1
  64. package/dist/src/providers/ProviderManager.js +236 -14
  65. package/dist/src/providers/ProviderManager.js.map +1 -1
  66. package/dist/src/providers/anthropic/AnthropicProvider.d.ts +20 -6
  67. package/dist/src/providers/anthropic/AnthropicProvider.js +172 -26
  68. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  69. package/dist/src/providers/gemini/GeminiProvider.d.ts +16 -7
  70. package/dist/src/providers/gemini/GeminiProvider.js +163 -148
  71. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  72. package/dist/src/providers/logging/ProviderContentExtractor.d.ts +27 -0
  73. package/dist/src/providers/logging/ProviderContentExtractor.js +198 -0
  74. package/dist/src/providers/logging/ProviderContentExtractor.js.map +1 -0
  75. package/dist/src/providers/logging/ProviderPerformanceTracker.d.ts +43 -0
  76. package/dist/src/providers/logging/ProviderPerformanceTracker.js +98 -0
  77. package/dist/src/providers/logging/ProviderPerformanceTracker.js.map +1 -0
  78. package/dist/src/providers/openai/OpenAIProvider.d.ts +53 -6
  79. package/dist/src/providers/openai/OpenAIProvider.js +373 -40
  80. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  81. package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +1 -1
  82. package/dist/src/providers/openai/RESPONSES_API_MODELS.js +1 -0
  83. package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -1
  84. package/dist/src/providers/openai/syntheticToolResponses.d.ts +52 -0
  85. package/dist/src/providers/openai/syntheticToolResponses.js +129 -0
  86. package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -0
  87. package/dist/src/providers/types.d.ts +47 -0
  88. package/dist/src/services/git-stats-service.d.ts +32 -0
  89. package/dist/src/services/git-stats-service.js +22 -0
  90. package/dist/src/services/git-stats-service.js.map +1 -0
  91. package/dist/src/services/loopDetectionService.js +10 -6
  92. package/dist/src/services/loopDetectionService.js.map +1 -1
  93. package/dist/src/services/shellExecutionService.js +44 -8
  94. package/dist/src/services/shellExecutionService.js.map +1 -1
  95. package/dist/src/settings/SettingsService.d.ts +32 -0
  96. package/dist/src/settings/SettingsService.js +204 -0
  97. package/dist/src/settings/SettingsService.js.map +1 -0
  98. package/dist/src/settings/settingsServiceInstance.d.ts +12 -0
  99. package/dist/src/settings/settingsServiceInstance.js +24 -0
  100. package/dist/src/settings/settingsServiceInstance.js.map +1 -0
  101. package/dist/src/settings/types.d.ts +141 -0
  102. package/dist/src/settings/types.js +5 -0
  103. package/dist/src/settings/types.js.map +1 -0
  104. package/dist/src/storage/ConversationFileWriter.d.ts +16 -0
  105. package/dist/src/storage/ConversationFileWriter.js +69 -0
  106. package/dist/src/storage/ConversationFileWriter.js.map +1 -0
  107. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +8 -0
  108. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +56 -3
  109. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  110. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
  111. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
  112. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  113. package/dist/src/telemetry/constants.d.ts +5 -0
  114. package/dist/src/telemetry/constants.js +5 -0
  115. package/dist/src/telemetry/constants.js.map +1 -1
  116. package/dist/src/telemetry/loggers.d.ts +5 -1
  117. package/dist/src/telemetry/loggers.js +87 -1
  118. package/dist/src/telemetry/loggers.js.map +1 -1
  119. package/dist/src/telemetry/metrics.d.ts +2 -1
  120. package/dist/src/telemetry/metrics.js +7 -1
  121. package/dist/src/telemetry/metrics.js.map +1 -1
  122. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  123. package/dist/src/telemetry/tool-call-decision.js +29 -0
  124. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  125. package/dist/src/telemetry/types.d.ts +56 -1
  126. package/dist/src/telemetry/types.js +123 -0
  127. package/dist/src/telemetry/types.js.map +1 -1
  128. package/dist/src/telemetry/uiTelemetry.d.ts +2 -1
  129. package/dist/src/telemetry/uiTelemetry.js +1 -1
  130. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  131. package/dist/src/tools/diffOptions.d.ts +2 -0
  132. package/dist/src/tools/diffOptions.js +28 -0
  133. package/dist/src/tools/diffOptions.js.map +1 -1
  134. package/dist/src/tools/edit.d.ts +8 -32
  135. package/dist/src/tools/edit.js +153 -136
  136. package/dist/src/tools/edit.js.map +1 -1
  137. package/dist/src/tools/glob.d.ts +3 -10
  138. package/dist/src/tools/glob.js +97 -99
  139. package/dist/src/tools/glob.js.map +1 -1
  140. package/dist/src/tools/grep.d.ts +3 -35
  141. package/dist/src/tools/grep.js +117 -88
  142. package/dist/src/tools/grep.js.map +1 -1
  143. package/dist/src/tools/mcp-client.d.ts +4 -3
  144. package/dist/src/tools/mcp-client.js +23 -6
  145. package/dist/src/tools/mcp-client.js.map +1 -1
  146. package/dist/src/tools/read-file.js +37 -9
  147. package/dist/src/tools/read-file.js.map +1 -1
  148. package/dist/src/tools/todo-pause.d.ts +22 -0
  149. package/dist/src/tools/todo-pause.js +93 -0
  150. package/dist/src/tools/todo-pause.js.map +1 -0
  151. package/dist/src/tools/tool-error.d.ts +4 -0
  152. package/dist/src/tools/tool-error.js +4 -0
  153. package/dist/src/tools/tool-error.js.map +1 -1
  154. package/dist/src/tools/tool-registry.js +3 -3
  155. package/dist/src/tools/tool-registry.js.map +1 -1
  156. package/dist/src/tools/tools.d.ts +18 -0
  157. package/dist/src/tools/tools.js +15 -0
  158. package/dist/src/tools/tools.js.map +1 -1
  159. package/dist/src/tools/write-file.d.ts +4 -0
  160. package/dist/src/tools/write-file.js +90 -16
  161. package/dist/src/tools/write-file.js.map +1 -1
  162. package/dist/src/types/modelParams.d.ts +2 -0
  163. package/dist/src/utils/environmentContext.js +1 -1
  164. package/dist/src/utils/errors.d.ts +3 -0
  165. package/dist/src/utils/errors.js +6 -0
  166. package/dist/src/utils/errors.js.map +1 -1
  167. package/dist/src/utils/fileUtils.d.ts +7 -0
  168. package/dist/src/utils/fileUtils.js +9 -0
  169. package/dist/src/utils/fileUtils.js.map +1 -1
  170. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  171. package/dist/src/utils/filesearch/fileSearch.js +27 -19
  172. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  173. package/package.json +4 -2
  174. package/dist/src/code_assist/converter.test.d.ts +0 -6
  175. package/dist/src/code_assist/converter.test.js +0 -232
  176. package/dist/src/code_assist/converter.test.js.map +0 -1
  177. package/dist/src/code_assist/oauth2.test.d.ts +0 -6
  178. package/dist/src/code_assist/oauth2.test.js +0 -370
  179. package/dist/src/code_assist/oauth2.test.js.map +0 -1
  180. package/dist/src/code_assist/server.test.d.ts +0 -6
  181. package/dist/src/code_assist/server.test.js +0 -131
  182. package/dist/src/code_assist/server.test.js.map +0 -1
  183. package/dist/src/code_assist/setup.test.d.ts +0 -6
  184. package/dist/src/code_assist/setup.test.js +0 -65
  185. package/dist/src/code_assist/setup.test.js.map +0 -1
  186. package/dist/src/config/config.alwaysAllow.test.d.ts +0 -6
  187. package/dist/src/config/config.alwaysAllow.test.js +0 -84
  188. package/dist/src/config/config.alwaysAllow.test.js.map +0 -1
  189. package/dist/src/config/config.test.d.ts +0 -6
  190. package/dist/src/config/config.test.js +0 -361
  191. package/dist/src/config/config.test.js.map +0 -1
  192. package/dist/src/config/flashFallback.test.d.ts +0 -6
  193. package/dist/src/config/flashFallback.test.js +0 -91
  194. package/dist/src/config/flashFallback.test.js.map +0 -1
  195. package/dist/src/core/client.test.d.ts +0 -6
  196. package/dist/src/core/client.test.js +0 -1317
  197. package/dist/src/core/client.test.js.map +0 -1
  198. package/dist/src/core/contentGenerator.test.d.ts +0 -6
  199. package/dist/src/core/contentGenerator.test.js +0 -103
  200. package/dist/src/core/contentGenerator.test.js.map +0 -1
  201. package/dist/src/core/coreToolScheduler.test.d.ts +0 -6
  202. package/dist/src/core/coreToolScheduler.test.js +0 -637
  203. package/dist/src/core/coreToolScheduler.test.js.map +0 -1
  204. package/dist/src/core/geminiChat.test.d.ts +0 -6
  205. package/dist/src/core/geminiChat.test.js +0 -425
  206. package/dist/src/core/geminiChat.test.js.map +0 -1
  207. package/dist/src/core/googleGenAIWrapper.test.d.ts +0 -6
  208. package/dist/src/core/googleGenAIWrapper.test.js +0 -104
  209. package/dist/src/core/googleGenAIWrapper.test.js.map +0 -1
  210. package/dist/src/core/logger.test.d.ts +0 -6
  211. package/dist/src/core/logger.test.js +0 -438
  212. package/dist/src/core/logger.test.js.map +0 -1
  213. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +0 -6
  214. package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -165
  215. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +0 -1
  216. package/dist/src/core/prompts-async.test.d.ts +0 -6
  217. package/dist/src/core/prompts-async.test.js +0 -115
  218. package/dist/src/core/prompts-async.test.js.map +0 -1
  219. package/dist/src/core/prompts.test.d.ts +0 -6
  220. package/dist/src/core/prompts.test.js +0 -68
  221. package/dist/src/core/prompts.test.js.map +0 -1
  222. package/dist/src/core/subagent.test.d.ts +0 -6
  223. package/dist/src/core/subagent.test.js +0 -519
  224. package/dist/src/core/subagent.test.js.map +0 -1
  225. package/dist/src/core/tokenLimits.test.d.ts +0 -6
  226. package/dist/src/core/tokenLimits.test.js +0 -66
  227. package/dist/src/core/tokenLimits.test.js.map +0 -1
  228. package/dist/src/core/turn.test.d.ts +0 -6
  229. package/dist/src/core/turn.test.js +0 -366
  230. package/dist/src/core/turn.test.js.map +0 -1
  231. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +0 -6
  232. package/dist/src/hooks/tool-render-suppression-hook.test.js +0 -59
  233. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +0 -1
  234. package/dist/src/ide/ide-installer.test.d.ts +0 -6
  235. package/dist/src/ide/ide-installer.test.js +0 -55
  236. package/dist/src/ide/ide-installer.test.js.map +0 -1
  237. package/dist/src/ide/ideContext.test.d.ts +0 -6
  238. package/dist/src/ide/ideContext.test.js +0 -265
  239. package/dist/src/ide/ideContext.test.js.map +0 -1
  240. package/dist/src/index.test.d.ts +0 -6
  241. package/dist/src/index.test.js +0 -12
  242. package/dist/src/index.test.js.map +0 -1
  243. package/dist/src/integration-tests/todo-system.test.d.ts +0 -6
  244. package/dist/src/integration-tests/todo-system.test.js +0 -46
  245. package/dist/src/integration-tests/todo-system.test.js.map +0 -1
  246. package/dist/src/mcp/google-auth-provider.test.d.ts +0 -6
  247. package/dist/src/mcp/google-auth-provider.test.js +0 -54
  248. package/dist/src/mcp/google-auth-provider.test.js.map +0 -1
  249. package/dist/src/mcp/oauth-provider.test.d.ts +0 -6
  250. package/dist/src/mcp/oauth-provider.test.js +0 -602
  251. package/dist/src/mcp/oauth-provider.test.js.map +0 -1
  252. package/dist/src/mcp/oauth-token-storage.test.d.ts +0 -6
  253. package/dist/src/mcp/oauth-token-storage.test.js +0 -205
  254. package/dist/src/mcp/oauth-token-storage.test.js.map +0 -1
  255. package/dist/src/mcp/oauth-utils.test.d.ts +0 -6
  256. package/dist/src/mcp/oauth-utils.test.js +0 -144
  257. package/dist/src/mcp/oauth-utils.test.js.map +0 -1
  258. package/dist/src/parsers/TextToolCallParser.multibyte.test.d.ts +0 -1
  259. package/dist/src/parsers/TextToolCallParser.multibyte.test.js +0 -42
  260. package/dist/src/parsers/TextToolCallParser.multibyte.test.js.map +0 -1
  261. package/dist/src/parsers/TextToolCallParser.test.d.ts +0 -1
  262. package/dist/src/parsers/TextToolCallParser.test.js +0 -225
  263. package/dist/src/parsers/TextToolCallParser.test.js.map +0 -1
  264. package/dist/src/prompt-config/TemplateEngine.test.d.ts +0 -1
  265. package/dist/src/prompt-config/TemplateEngine.test.js +0 -494
  266. package/dist/src/prompt-config/TemplateEngine.test.js.map +0 -1
  267. package/dist/src/prompt-config/prompt-cache.test.d.ts +0 -6
  268. package/dist/src/prompt-config/prompt-cache.test.js +0 -437
  269. package/dist/src/prompt-config/prompt-cache.test.js.map +0 -1
  270. package/dist/src/prompt-config/prompt-installer.test.d.ts +0 -7
  271. package/dist/src/prompt-config/prompt-installer.test.js +0 -503
  272. package/dist/src/prompt-config/prompt-installer.test.js.map +0 -1
  273. package/dist/src/prompt-config/prompt-loader.test.d.ts +0 -5
  274. package/dist/src/prompt-config/prompt-loader.test.js +0 -413
  275. package/dist/src/prompt-config/prompt-loader.test.js.map +0 -1
  276. package/dist/src/prompt-config/prompt-resolver.test.d.ts +0 -1
  277. package/dist/src/prompt-config/prompt-resolver.test.js +0 -529
  278. package/dist/src/prompt-config/prompt-resolver.test.js.map +0 -1
  279. package/dist/src/prompt-config/prompt-service.test.d.ts +0 -1
  280. package/dist/src/prompt-config/prompt-service.test.js +0 -811
  281. package/dist/src/prompt-config/prompt-service.test.js.map +0 -1
  282. package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +0 -6
  283. package/dist/src/providers/ProviderManager.gemini-switch.test.js +0 -57
  284. package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +0 -1
  285. package/dist/src/providers/ProviderManager.test.d.ts +0 -6
  286. package/dist/src/providers/ProviderManager.test.js +0 -284
  287. package/dist/src/providers/ProviderManager.test.js.map +0 -1
  288. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.d.ts +0 -6
  289. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +0 -273
  290. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +0 -1
  291. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.d.ts +0 -1
  292. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js +0 -48
  293. package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js.map +0 -1
  294. package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +0 -1
  295. package/dist/src/providers/anthropic/AnthropicProvider.test.js +0 -487
  296. package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +0 -1
  297. package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +0 -6
  298. package/dist/src/providers/gemini/GeminiProvider.integration.test.js +0 -126
  299. package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +0 -1
  300. package/dist/src/providers/gemini/GeminiProvider.test.d.ts +0 -6
  301. package/dist/src/providers/gemini/GeminiProvider.test.js +0 -136
  302. package/dist/src/providers/gemini/GeminiProvider.test.js.map +0 -1
  303. package/dist/src/providers/integration/multi-provider.integration.test.d.ts +0 -6
  304. package/dist/src/providers/integration/multi-provider.integration.test.js +0 -292
  305. package/dist/src/providers/integration/multi-provider.integration.test.js.map +0 -1
  306. package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +0 -1
  307. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +0 -97
  308. package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +0 -1
  309. package/dist/src/providers/openai/ConversationCache.test.d.ts +0 -1
  310. package/dist/src/providers/openai/ConversationCache.test.js +0 -113
  311. package/dist/src/providers/openai/ConversationCache.test.js.map +0 -1
  312. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +0 -1
  313. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +0 -189
  314. package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +0 -1
  315. package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +0 -6
  316. package/dist/src/providers/openai/OpenAIProvider.integration.test.js +0 -125
  317. package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +0 -1
  318. package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +0 -1
  319. package/dist/src/providers/openai/OpenAIProvider.responses.test.js +0 -350
  320. package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +0 -1
  321. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +0 -1
  322. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +0 -213
  323. package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +0 -1
  324. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +0 -1
  325. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +0 -59
  326. package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +0 -1
  327. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +0 -6
  328. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +0 -105
  329. package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +0 -1
  330. package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +0 -1
  331. package/dist/src/providers/openai/OpenAIProvider.switch.test.js +0 -256
  332. package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +0 -1
  333. package/dist/src/providers/openai/OpenAIProvider.test.d.ts +0 -16
  334. package/dist/src/providers/openai/OpenAIProvider.test.js +0 -620
  335. package/dist/src/providers/openai/OpenAIProvider.test.js.map +0 -1
  336. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +0 -1
  337. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +0 -210
  338. package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +0 -1
  339. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +0 -1
  340. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +0 -65
  341. package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +0 -1
  342. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +0 -1
  343. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +0 -129
  344. package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +0 -1
  345. package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +0 -1
  346. package/dist/src/providers/openai/buildResponsesRequest.test.js +0 -406
  347. package/dist/src/providers/openai/buildResponsesRequest.test.js.map +0 -1
  348. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +0 -1
  349. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +0 -50
  350. package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +0 -1
  351. package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +0 -1
  352. package/dist/src/providers/openai/estimateRemoteTokens.test.js +0 -125
  353. package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +0 -1
  354. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +0 -1
  355. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +0 -192
  356. package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +0 -1
  357. package/dist/src/providers/openai/parseResponsesStream.test.d.ts +0 -1
  358. package/dist/src/providers/openai/parseResponsesStream.test.js +0 -151
  359. package/dist/src/providers/openai/parseResponsesStream.test.js.map +0 -1
  360. package/dist/src/services/fileDiscoveryService.test.d.ts +0 -6
  361. package/dist/src/services/fileDiscoveryService.test.js +0 -143
  362. package/dist/src/services/fileDiscoveryService.test.js.map +0 -1
  363. package/dist/src/services/gitService.test.d.ts +0 -6
  364. package/dist/src/services/gitService.test.js +0 -209
  365. package/dist/src/services/gitService.test.js.map +0 -1
  366. package/dist/src/services/loopDetectionService.test.d.ts +0 -6
  367. package/dist/src/services/loopDetectionService.test.js +0 -345
  368. package/dist/src/services/loopDetectionService.test.js.map +0 -1
  369. package/dist/src/services/shellExecutionService.multibyte.test.d.ts +0 -6
  370. package/dist/src/services/shellExecutionService.multibyte.test.js +0 -72
  371. package/dist/src/services/shellExecutionService.multibyte.test.js.map +0 -1
  372. package/dist/src/services/shellExecutionService.test.d.ts +0 -6
  373. package/dist/src/services/shellExecutionService.test.js +0 -272
  374. package/dist/src/services/shellExecutionService.test.js.map +0 -1
  375. package/dist/src/services/shellExecutionService.windows.multibyte.test.d.ts +0 -6
  376. package/dist/src/services/shellExecutionService.windows.multibyte.test.js +0 -98
  377. package/dist/src/services/shellExecutionService.windows.multibyte.test.js.map +0 -1
  378. package/dist/src/services/shellExecutionService.windows.test.d.ts +0 -6
  379. package/dist/src/services/shellExecutionService.windows.test.js +0 -79
  380. package/dist/src/services/shellExecutionService.windows.test.js.map +0 -1
  381. package/dist/src/services/tool-call-tracker-service.test.d.ts +0 -6
  382. package/dist/src/services/tool-call-tracker-service.test.js +0 -99
  383. package/dist/src/services/tool-call-tracker-service.test.js.map +0 -1
  384. package/dist/src/telemetry/loggers.test.d.ts +0 -6
  385. package/dist/src/telemetry/loggers.test.js +0 -572
  386. package/dist/src/telemetry/loggers.test.js.map +0 -1
  387. package/dist/src/telemetry/metrics.test.d.ts +0 -6
  388. package/dist/src/telemetry/metrics.test.js +0 -162
  389. package/dist/src/telemetry/metrics.test.js.map +0 -1
  390. package/dist/src/telemetry/telemetry.test.d.ts +0 -6
  391. package/dist/src/telemetry/telemetry.test.js +0 -54
  392. package/dist/src/telemetry/telemetry.test.js.map +0 -1
  393. package/dist/src/telemetry/uiTelemetry.test.d.ts +0 -6
  394. package/dist/src/telemetry/uiTelemetry.test.js +0 -517
  395. package/dist/src/telemetry/uiTelemetry.test.js.map +0 -1
  396. package/dist/src/tools/ToolFormatter.test.d.ts +0 -16
  397. package/dist/src/tools/ToolFormatter.test.js +0 -349
  398. package/dist/src/tools/ToolFormatter.test.js.map +0 -1
  399. package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +0 -1
  400. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +0 -241
  401. package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +0 -1
  402. package/dist/src/tools/edit.test.d.ts +0 -6
  403. package/dist/src/tools/edit.test.js +0 -663
  404. package/dist/src/tools/edit.test.js.map +0 -1
  405. package/dist/src/tools/glob.test.d.ts +0 -6
  406. package/dist/src/tools/glob.test.js +0 -321
  407. package/dist/src/tools/glob.test.js.map +0 -1
  408. package/dist/src/tools/grep.test.d.ts +0 -6
  409. package/dist/src/tools/grep.test.js +0 -258
  410. package/dist/src/tools/grep.test.js.map +0 -1
  411. package/dist/src/tools/ls.test.d.ts +0 -6
  412. package/dist/src/tools/ls.test.js +0 -357
  413. package/dist/src/tools/ls.test.js.map +0 -1
  414. package/dist/src/tools/mcp-client.test.d.ts +0 -6
  415. package/dist/src/tools/mcp-client.test.js +0 -575
  416. package/dist/src/tools/mcp-client.test.js.map +0 -1
  417. package/dist/src/tools/mcp-tool.test.d.ts +0 -6
  418. package/dist/src/tools/mcp-tool.test.js +0 -501
  419. package/dist/src/tools/mcp-tool.test.js.map +0 -1
  420. package/dist/src/tools/memoryTool.test.d.ts +0 -6
  421. package/dist/src/tools/memoryTool.test.js +0 -266
  422. package/dist/src/tools/memoryTool.test.js.map +0 -1
  423. package/dist/src/tools/modifiable-tool.test.d.ts +0 -6
  424. package/dist/src/tools/modifiable-tool.test.js +0 -193
  425. package/dist/src/tools/modifiable-tool.test.js.map +0 -1
  426. package/dist/src/tools/read-file.test.d.ts +0 -6
  427. package/dist/src/tools/read-file.test.js +0 -313
  428. package/dist/src/tools/read-file.test.js.map +0 -1
  429. package/dist/src/tools/read-many-files.test.d.ts +0 -6
  430. package/dist/src/tools/read-many-files.test.js +0 -644
  431. package/dist/src/tools/read-many-files.test.js.map +0 -1
  432. package/dist/src/tools/shell.multibyte.test.d.ts +0 -6
  433. package/dist/src/tools/shell.multibyte.test.js +0 -75
  434. package/dist/src/tools/shell.multibyte.test.js.map +0 -1
  435. package/dist/src/tools/shell.test.d.ts +0 -6
  436. package/dist/src/tools/shell.test.js +0 -350
  437. package/dist/src/tools/shell.test.js.map +0 -1
  438. package/dist/src/tools/todo-read.test.d.ts +0 -6
  439. package/dist/src/tools/todo-read.test.js +0 -162
  440. package/dist/src/tools/todo-read.test.js.map +0 -1
  441. package/dist/src/tools/todo-schemas.test.d.ts +0 -6
  442. package/dist/src/tools/todo-schemas.test.js +0 -341
  443. package/dist/src/tools/todo-schemas.test.js.map +0 -1
  444. package/dist/src/tools/todo-store.test.d.ts +0 -6
  445. package/dist/src/tools/todo-store.test.js +0 -169
  446. package/dist/src/tools/todo-store.test.js.map +0 -1
  447. package/dist/src/tools/todo-write.test.d.ts +0 -6
  448. package/dist/src/tools/todo-write.test.js +0 -226
  449. package/dist/src/tools/todo-write.test.js.map +0 -1
  450. package/dist/src/tools/tool-registry.test.d.ts +0 -6
  451. package/dist/src/tools/tool-registry.test.js +0 -468
  452. package/dist/src/tools/tool-registry.test.js.map +0 -1
  453. package/dist/src/tools/tools.test.d.ts +0 -6
  454. package/dist/src/tools/tools.test.js +0 -117
  455. package/dist/src/tools/tools.test.js.map +0 -1
  456. package/dist/src/tools/web-fetch.integration.test.d.ts +0 -6
  457. package/dist/src/tools/web-fetch.integration.test.js +0 -532
  458. package/dist/src/tools/web-fetch.integration.test.js.map +0 -1
  459. package/dist/src/tools/web-search.test.d.ts +0 -6
  460. package/dist/src/tools/web-search.test.js +0 -229
  461. package/dist/src/tools/web-search.test.js.map +0 -1
  462. package/dist/src/tools/write-file.test.d.ts +0 -6
  463. package/dist/src/tools/write-file.test.js +0 -464
  464. package/dist/src/tools/write-file.test.js.map +0 -1
  465. package/dist/src/utils/bfsFileSearch.test.d.ts +0 -6
  466. package/dist/src/utils/bfsFileSearch.test.js +0 -191
  467. package/dist/src/utils/bfsFileSearch.test.js.map +0 -1
  468. package/dist/src/utils/editCorrector.test.d.ts +0 -6
  469. package/dist/src/utils/editCorrector.test.js +0 -564
  470. package/dist/src/utils/editCorrector.test.js.map +0 -1
  471. package/dist/src/utils/editor.test.d.ts +0 -6
  472. package/dist/src/utils/editor.test.js +0 -445
  473. package/dist/src/utils/editor.test.js.map +0 -1
  474. package/dist/src/utils/environmentContext.test.d.ts +0 -6
  475. package/dist/src/utils/environmentContext.test.js +0 -139
  476. package/dist/src/utils/environmentContext.test.js.map +0 -1
  477. package/dist/src/utils/errorReporting.test.d.ts +0 -6
  478. package/dist/src/utils/errorReporting.test.js +0 -130
  479. package/dist/src/utils/errorReporting.test.js.map +0 -1
  480. package/dist/src/utils/fileUtils.test.d.ts +0 -6
  481. package/dist/src/utils/fileUtils.test.js +0 -363
  482. package/dist/src/utils/fileUtils.test.js.map +0 -1
  483. package/dist/src/utils/filesearch/crawlCache.test.d.ts +0 -6
  484. package/dist/src/utils/filesearch/crawlCache.test.js +0 -103
  485. package/dist/src/utils/filesearch/crawlCache.test.js.map +0 -1
  486. package/dist/src/utils/filesearch/fileSearch.test.d.ts +0 -6
  487. package/dist/src/utils/filesearch/fileSearch.test.js +0 -654
  488. package/dist/src/utils/filesearch/fileSearch.test.js.map +0 -1
  489. package/dist/src/utils/filesearch/ignore.test.d.ts +0 -6
  490. package/dist/src/utils/filesearch/ignore.test.js +0 -57
  491. package/dist/src/utils/filesearch/ignore.test.js.map +0 -1
  492. package/dist/src/utils/filesearch/result-cache.test.d.ts +0 -6
  493. package/dist/src/utils/filesearch/result-cache.test.js +0 -47
  494. package/dist/src/utils/filesearch/result-cache.test.js.map +0 -1
  495. package/dist/src/utils/flashFallback.integration.test.d.ts +0 -6
  496. package/dist/src/utils/flashFallback.integration.test.js +0 -120
  497. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  498. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +0 -6
  499. package/dist/src/utils/generateContentResponseUtilities.test.js +0 -273
  500. package/dist/src/utils/generateContentResponseUtilities.test.js.map +0 -1
  501. package/dist/src/utils/getFolderStructure.test.d.ts +0 -6
  502. package/dist/src/utils/getFolderStructure.test.js +0 -282
  503. package/dist/src/utils/getFolderStructure.test.js.map +0 -1
  504. package/dist/src/utils/gitIgnoreParser.test.d.ts +0 -6
  505. package/dist/src/utils/gitIgnoreParser.test.js +0 -154
  506. package/dist/src/utils/gitIgnoreParser.test.js.map +0 -1
  507. package/dist/src/utils/memoryDiscovery.test.d.ts +0 -6
  508. package/dist/src/utils/memoryDiscovery.test.js +0 -181
  509. package/dist/src/utils/memoryDiscovery.test.js.map +0 -1
  510. package/dist/src/utils/memoryImportProcessor.test.d.ts +0 -6
  511. package/dist/src/utils/memoryImportProcessor.test.js +0 -715
  512. package/dist/src/utils/memoryImportProcessor.test.js.map +0 -1
  513. package/dist/src/utils/nextSpeakerChecker.test.d.ts +0 -6
  514. package/dist/src/utils/nextSpeakerChecker.test.js +0 -172
  515. package/dist/src/utils/nextSpeakerChecker.test.js.map +0 -1
  516. package/dist/src/utils/partUtils.test.d.ts +0 -6
  517. package/dist/src/utils/partUtils.test.js +0 -130
  518. package/dist/src/utils/partUtils.test.js.map +0 -1
  519. package/dist/src/utils/paths.test.d.ts +0 -6
  520. package/dist/src/utils/paths.test.js +0 -153
  521. package/dist/src/utils/paths.test.js.map +0 -1
  522. package/dist/src/utils/retry.test.d.ts +0 -6
  523. package/dist/src/utils/retry.test.js +0 -322
  524. package/dist/src/utils/retry.test.js.map +0 -1
  525. package/dist/src/utils/safeJsonStringify.test.d.ts +0 -6
  526. package/dist/src/utils/safeJsonStringify.test.js +0 -61
  527. package/dist/src/utils/safeJsonStringify.test.js.map +0 -1
  528. package/dist/src/utils/sanitization.test.d.ts +0 -6
  529. package/dist/src/utils/sanitization.test.js +0 -81
  530. package/dist/src/utils/sanitization.test.js.map +0 -1
  531. package/dist/src/utils/schemaValidator.test.d.ts +0 -6
  532. package/dist/src/utils/schemaValidator.test.js +0 -146
  533. package/dist/src/utils/schemaValidator.test.js.map +0 -1
  534. package/dist/src/utils/secure-browser-launcher.test.d.ts +0 -6
  535. package/dist/src/utils/secure-browser-launcher.test.js +0 -149
  536. package/dist/src/utils/secure-browser-launcher.test.js.map +0 -1
  537. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +0 -6
  538. package/dist/src/utils/shell-utils.shellReplacement.test.js +0 -149
  539. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +0 -1
  540. package/dist/src/utils/shell-utils.test.d.ts +0 -6
  541. package/dist/src/utils/shell-utils.test.js +0 -200
  542. package/dist/src/utils/shell-utils.test.js.map +0 -1
  543. package/dist/src/utils/summarizer.test.d.ts +0 -6
  544. package/dist/src/utils/summarizer.test.js +0 -131
  545. package/dist/src/utils/summarizer.test.js.map +0 -1
  546. package/dist/src/utils/systemEncoding.test.d.ts +0 -6
  547. package/dist/src/utils/systemEncoding.test.js +0 -368
  548. package/dist/src/utils/systemEncoding.test.js.map +0 -1
  549. package/dist/src/utils/toolOutputLimiter.test.d.ts +0 -6
  550. package/dist/src/utils/toolOutputLimiter.test.js +0 -164
  551. package/dist/src/utils/toolOutputLimiter.test.js.map +0 -1
  552. package/dist/src/utils/unicodeUtils.test.d.ts +0 -6
  553. package/dist/src/utils/unicodeUtils.test.js +0 -120
  554. package/dist/src/utils/unicodeUtils.test.js.map +0 -1
  555. package/dist/src/utils/user_account.test.d.ts +0 -6
  556. package/dist/src/utils/user_account.test.js +0 -153
  557. package/dist/src/utils/user_account.test.js.map +0 -1
  558. package/dist/src/utils/user_id.test.d.ts +0 -6
  559. package/dist/src/utils/user_id.test.js +0 -21
  560. package/dist/src/utils/user_id.test.js.map +0 -1
  561. package/dist/src/utils/workspaceContext.test.d.ts +0 -6
  562. package/dist/src/utils/workspaceContext.test.js +0 -209
  563. package/dist/src/utils/workspaceContext.test.js.map +0 -1
@@ -1,663 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- /* eslint-disable @typescript-eslint/no-explicit-any */
7
- const mockEnsureCorrectEdit = vi.hoisted(() => vi.fn());
8
- const mockGenerateJson = vi.hoisted(() => vi.fn());
9
- const mockOpenDiff = vi.hoisted(() => vi.fn());
10
- import { IDEConnectionStatus } from '../ide/ide-client.js';
11
- vi.mock('../utils/editCorrector.js', () => ({
12
- ensureCorrectEdit: mockEnsureCorrectEdit,
13
- }));
14
- vi.mock('../core/client.js', () => ({
15
- GeminiClient: vi.fn().mockImplementation(() => ({
16
- generateJson: mockGenerateJson,
17
- })),
18
- }));
19
- vi.mock('../utils/editor.js', () => ({
20
- openDiff: mockOpenDiff,
21
- }));
22
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
23
- import { EditTool } from './edit.js';
24
- import { ToolConfirmationOutcome } from './tools.js';
25
- import { ToolErrorType } from './tool-error.js';
26
- import path from 'path';
27
- import fs from 'fs';
28
- import os from 'os';
29
- import { ApprovalMode } from '../config/config.js';
30
- import { createMockWorkspaceContext } from '../test-utils/mockWorkspaceContext.js';
31
- describe('EditTool', () => {
32
- let tool;
33
- let tempDir;
34
- let rootDir;
35
- let mockConfig;
36
- let geminiClient;
37
- beforeEach(() => {
38
- vi.restoreAllMocks();
39
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'edit-tool-test-'));
40
- rootDir = path.join(tempDir, 'root');
41
- fs.mkdirSync(rootDir);
42
- geminiClient = {
43
- generateJson: mockGenerateJson, // mockGenerateJson is already defined and hoisted
44
- };
45
- mockConfig = {
46
- getGeminiClient: vi.fn().mockReturnValue(geminiClient),
47
- getTargetDir: () => rootDir,
48
- getApprovalMode: vi.fn(),
49
- setApprovalMode: vi.fn(),
50
- getWorkspaceContext: () => createMockWorkspaceContext(rootDir),
51
- getIdeClient: () => undefined,
52
- getIdeMode: () => false,
53
- getIdeModeFeature: () => false,
54
- // getGeminiConfig: () => ({ apiKey: 'test-api-key' }), // This was not a real Config method
55
- // Add other properties/methods of Config if EditTool uses them
56
- // Minimal other methods to satisfy Config type if needed by EditTool constructor or other direct uses:
57
- getApiKey: () => 'test-api-key',
58
- getModel: () => 'test-model',
59
- getSandbox: () => false,
60
- getDebugMode: () => false,
61
- getQuestion: () => undefined,
62
- getFullContext: () => false,
63
- getToolDiscoveryCommand: () => undefined,
64
- getToolCallCommand: () => undefined,
65
- getMcpServerCommand: () => undefined,
66
- getMcpServers: () => undefined,
67
- getUserAgent: () => 'test-agent',
68
- getUserMemory: () => '',
69
- setUserMemory: vi.fn(),
70
- getLlxprtMdFileCount: () => 0,
71
- setLlxprtMdFileCount: vi.fn(),
72
- getToolRegistry: () => ({}), // Minimal mock for ToolRegistry
73
- };
74
- // Reset mocks before each test
75
- mockConfig.getApprovalMode.mockClear();
76
- // Default to not skipping confirmation
77
- mockConfig.getApprovalMode.mockReturnValue(ApprovalMode.DEFAULT);
78
- // Reset mocks and set default implementation for ensureCorrectEdit
79
- mockEnsureCorrectEdit.mockReset();
80
- mockEnsureCorrectEdit.mockImplementation(async (_, currentContent, params) => {
81
- let occurrences = 0;
82
- if (params.old_string && currentContent) {
83
- // Simple string counting for the mock
84
- let index = currentContent.indexOf(params.old_string);
85
- while (index !== -1) {
86
- occurrences++;
87
- index = currentContent.indexOf(params.old_string, index + 1);
88
- }
89
- }
90
- else if (params.old_string === '') {
91
- occurrences = 0; // Creating a new file
92
- }
93
- return Promise.resolve({ params, occurrences });
94
- });
95
- // Default mock for generateJson to return the snippet unchanged
96
- mockGenerateJson.mockReset();
97
- mockGenerateJson.mockImplementation(async (contents, schema) => {
98
- // The problematic_snippet is the last part of the user's content
99
- const userContent = contents.find((c) => c.role === 'user');
100
- let promptText = '';
101
- if (userContent && userContent.parts) {
102
- promptText = userContent.parts
103
- .filter((p) => typeof p.text === 'string')
104
- .map((p) => p.text)
105
- .join('\n');
106
- }
107
- const snippetMatch = promptText.match(/Problematic target snippet:\n```\n([\s\S]*?)\n```/);
108
- const problematicSnippet = snippetMatch && snippetMatch[1] ? snippetMatch[1] : '';
109
- if (schema.properties?.corrected_target_snippet) {
110
- return Promise.resolve({
111
- corrected_target_snippet: problematicSnippet,
112
- });
113
- }
114
- if (schema.properties?.corrected_new_string) {
115
- // For new_string correction, we might need more sophisticated logic,
116
- // but for now, returning original is a safe default if not specified by a test.
117
- const originalNewStringMatch = promptText.match(/original_new_string \(what was intended to replace original_old_string\):\n```\n([\s\S]*?)\n```/);
118
- const originalNewString = originalNewStringMatch && originalNewStringMatch[1]
119
- ? originalNewStringMatch[1]
120
- : '';
121
- return Promise.resolve({ corrected_new_string: originalNewString });
122
- }
123
- return Promise.resolve({}); // Default empty object if schema doesn't match
124
- });
125
- tool = new EditTool(mockConfig);
126
- });
127
- afterEach(() => {
128
- fs.rmSync(tempDir, { recursive: true, force: true });
129
- });
130
- describe('_applyReplacement', () => {
131
- // Access private method for testing
132
- // Note: `tool` is initialized in `beforeEach` of the parent describe block
133
- it('should return newString if isNewFile is true', () => {
134
- expect(tool._applyReplacement(null, 'old', 'new', true)).toBe('new');
135
- expect(tool._applyReplacement('existing', 'old', 'new', true)).toBe('new');
136
- });
137
- it('should return newString if currentContent is null and oldString is empty (defensive)', () => {
138
- expect(tool._applyReplacement(null, '', 'new', false)).toBe('new');
139
- });
140
- it('should return empty string if currentContent is null and oldString is not empty (defensive)', () => {
141
- expect(tool._applyReplacement(null, 'old', 'new', false)).toBe('');
142
- });
143
- it('should replace oldString with newString in currentContent', () => {
144
- expect(tool._applyReplacement('hello old world old', 'old', 'new', false)).toBe('hello new world new');
145
- });
146
- it('should return currentContent if oldString is empty and not a new file', () => {
147
- expect(tool._applyReplacement('hello world', '', 'new', false)).toBe('hello world');
148
- });
149
- });
150
- describe('validateToolParams', () => {
151
- it('should return null for valid params', () => {
152
- const params = {
153
- file_path: path.join(rootDir, 'test.txt'),
154
- old_string: 'old',
155
- new_string: 'new',
156
- };
157
- expect(tool.validateToolParams(params)).toBeNull();
158
- });
159
- it('should return error for relative path', () => {
160
- const params = {
161
- file_path: 'test.txt',
162
- old_string: 'old',
163
- new_string: 'new',
164
- };
165
- expect(tool.validateToolParams(params)).toMatch(/File path must be absolute/);
166
- });
167
- it('should return error for path outside root', () => {
168
- const params = {
169
- file_path: path.join(tempDir, 'outside-root.txt'),
170
- old_string: 'old',
171
- new_string: 'new',
172
- };
173
- const error = tool.validateToolParams(params);
174
- expect(error).toContain('File path must be within one of the workspace directories');
175
- });
176
- });
177
- describe('shouldConfirmExecute', () => {
178
- const testFile = 'edit_me.txt';
179
- let filePath;
180
- beforeEach(() => {
181
- filePath = path.join(rootDir, testFile);
182
- });
183
- it('should return false if params are invalid', async () => {
184
- const params = {
185
- file_path: 'relative.txt',
186
- old_string: 'old',
187
- new_string: 'new',
188
- };
189
- expect(await tool.shouldConfirmExecute(params, new AbortController().signal)).toBe(false);
190
- });
191
- it('should request confirmation for valid edit', async () => {
192
- fs.writeFileSync(filePath, 'some old content here');
193
- const params = {
194
- file_path: filePath,
195
- old_string: 'old',
196
- new_string: 'new',
197
- };
198
- // ensureCorrectEdit will be called by shouldConfirmExecute
199
- mockEnsureCorrectEdit.mockResolvedValueOnce({ params, occurrences: 1 });
200
- const confirmation = await tool.shouldConfirmExecute(params, new AbortController().signal);
201
- expect(confirmation).toEqual(expect.objectContaining({
202
- title: `Confirm Edit: ${testFile}`,
203
- fileName: testFile,
204
- fileDiff: expect.any(String),
205
- }));
206
- });
207
- it('should return false if old_string is not found (ensureCorrectEdit returns 0)', async () => {
208
- fs.writeFileSync(filePath, 'some content here');
209
- const params = {
210
- file_path: filePath,
211
- old_string: 'not_found',
212
- new_string: 'new',
213
- };
214
- mockEnsureCorrectEdit.mockResolvedValueOnce({ params, occurrences: 0 });
215
- expect(await tool.shouldConfirmExecute(params, new AbortController().signal)).toBe(false);
216
- });
217
- it('should return false if multiple occurrences of old_string are found (ensureCorrectEdit returns > 1)', async () => {
218
- fs.writeFileSync(filePath, 'old old content here');
219
- const params = {
220
- file_path: filePath,
221
- old_string: 'old',
222
- new_string: 'new',
223
- };
224
- mockEnsureCorrectEdit.mockResolvedValueOnce({ params, occurrences: 2 });
225
- expect(await tool.shouldConfirmExecute(params, new AbortController().signal)).toBe(false);
226
- });
227
- it('should request confirmation for creating a new file (empty old_string)', async () => {
228
- const newFileName = 'new_file.txt';
229
- const newFilePath = path.join(rootDir, newFileName);
230
- const params = {
231
- file_path: newFilePath,
232
- old_string: '',
233
- new_string: 'new file content',
234
- };
235
- // ensureCorrectEdit might not be called if old_string is empty,
236
- // as shouldConfirmExecute handles this for diff generation.
237
- // If it is called, it should return 0 occurrences for a new file.
238
- mockEnsureCorrectEdit.mockResolvedValueOnce({ params, occurrences: 0 });
239
- const confirmation = await tool.shouldConfirmExecute(params, new AbortController().signal);
240
- expect(confirmation).toEqual(expect.objectContaining({
241
- title: `Confirm Edit: ${newFileName}`,
242
- fileName: newFileName,
243
- fileDiff: expect.any(String),
244
- }));
245
- });
246
- it('should use corrected params from ensureCorrectEdit for diff generation', async () => {
247
- const originalContent = 'This is the original string to be replaced.';
248
- const originalOldString = 'original string';
249
- const originalNewString = 'new string';
250
- const correctedOldString = 'original string to be replaced'; // More specific
251
- const correctedNewString = 'completely new string'; // Different replacement
252
- const expectedFinalContent = 'This is the completely new string.';
253
- fs.writeFileSync(filePath, originalContent);
254
- const params = {
255
- file_path: filePath,
256
- old_string: originalOldString,
257
- new_string: originalNewString,
258
- };
259
- // The main beforeEach already calls mockEnsureCorrectEdit.mockReset()
260
- // Set a specific mock for this test case
261
- let mockCalled = false;
262
- mockEnsureCorrectEdit.mockImplementationOnce(async (_, content, p, client) => {
263
- mockCalled = true;
264
- expect(content).toBe(originalContent);
265
- expect(p).toBe(params);
266
- expect(client).toBe(geminiClient);
267
- return {
268
- params: {
269
- file_path: filePath,
270
- old_string: correctedOldString,
271
- new_string: correctedNewString,
272
- },
273
- occurrences: 1,
274
- };
275
- });
276
- const confirmation = (await tool.shouldConfirmExecute(params, new AbortController().signal));
277
- expect(mockCalled).toBe(true); // Check if the mock implementation was run
278
- // expect(mockEnsureCorrectEdit).toHaveBeenCalledWith(originalContent, params, expect.anything()); // Keep this commented for now
279
- expect(confirmation).toEqual(expect.objectContaining({
280
- title: `Confirm Edit: ${testFile}`,
281
- fileName: testFile,
282
- }));
283
- // Check that the diff is based on the corrected strings leading to the new state
284
- expect(confirmation.fileDiff).toContain(`-${originalContent}`);
285
- expect(confirmation.fileDiff).toContain(`+${expectedFinalContent}`);
286
- // Verify that applying the correctedOldString and correctedNewString to originalContent
287
- // indeed produces the expectedFinalContent, which is what the diff should reflect.
288
- const patchedContent = originalContent.replace(correctedOldString, // This was the string identified by ensureCorrectEdit for replacement
289
- correctedNewString);
290
- expect(patchedContent).toBe(expectedFinalContent);
291
- });
292
- });
293
- describe('execute', () => {
294
- const testFile = 'execute_me.txt';
295
- let filePath;
296
- beforeEach(() => {
297
- filePath = path.join(rootDir, testFile);
298
- // Default for execute tests, can be overridden
299
- mockEnsureCorrectEdit.mockImplementation(async (_, content, params) => {
300
- let occurrences = 0;
301
- if (params.old_string && content) {
302
- let index = content.indexOf(params.old_string);
303
- while (index !== -1) {
304
- occurrences++;
305
- index = content.indexOf(params.old_string, index + 1);
306
- }
307
- }
308
- else if (params.old_string === '') {
309
- occurrences = 0;
310
- }
311
- return { params, occurrences };
312
- });
313
- });
314
- it('should return error if params are invalid', async () => {
315
- const params = {
316
- file_path: 'relative.txt',
317
- old_string: 'old',
318
- new_string: 'new',
319
- };
320
- const result = await tool.execute(params, new AbortController().signal);
321
- expect(result.llmContent).toMatch(/Error: Invalid parameters provided/);
322
- expect(result.returnDisplay).toMatch(/Error: File path must be absolute/);
323
- });
324
- it('should edit an existing file and return diff with fileName', async () => {
325
- const initialContent = 'This is some old text.';
326
- const newContent = 'This is some new text.'; // old -> new
327
- fs.writeFileSync(filePath, initialContent, 'utf8');
328
- const params = {
329
- file_path: filePath,
330
- old_string: 'old',
331
- new_string: 'new',
332
- };
333
- // Specific mock for this test's execution path in calculateEdit
334
- // ensureCorrectEdit is NOT called by calculateEdit, only by shouldConfirmExecute
335
- // So, the default mockEnsureCorrectEdit should correctly return 1 occurrence for 'old' in initialContent
336
- // Simulate confirmation by setting shouldAlwaysEdit
337
- tool.shouldAlwaysEdit = true;
338
- const result = await tool.execute(params, new AbortController().signal);
339
- tool.shouldAlwaysEdit = false; // Reset for other tests
340
- expect(result.llmContent).toMatch(/Successfully modified file/);
341
- expect(fs.readFileSync(filePath, 'utf8')).toBe(newContent);
342
- const display = result.returnDisplay;
343
- expect(display.fileDiff).toMatch(initialContent);
344
- expect(display.fileDiff).toMatch(newContent);
345
- expect(display.fileName).toBe(testFile);
346
- });
347
- it('should create a new file if old_string is empty and file does not exist, and return created message', async () => {
348
- const newFileName = 'brand_new_file.txt';
349
- const newFilePath = path.join(rootDir, newFileName);
350
- const fileContent = 'Content for the new file.';
351
- const params = {
352
- file_path: newFilePath,
353
- old_string: '',
354
- new_string: fileContent,
355
- };
356
- mockConfig.getApprovalMode.mockReturnValueOnce(ApprovalMode.AUTO_EDIT);
357
- const result = await tool.execute(params, new AbortController().signal);
358
- expect(result.llmContent).toMatch(/Created new file/);
359
- expect(fs.existsSync(newFilePath)).toBe(true);
360
- expect(fs.readFileSync(newFilePath, 'utf8')).toBe(fileContent);
361
- expect(result.returnDisplay).toBe(`Created ${newFileName}`);
362
- });
363
- it('should return error if old_string is not found in file', async () => {
364
- fs.writeFileSync(filePath, 'Some content.', 'utf8');
365
- const params = {
366
- file_path: filePath,
367
- old_string: 'nonexistent',
368
- new_string: 'replacement',
369
- };
370
- // The default mockEnsureCorrectEdit will return 0 occurrences for 'nonexistent'
371
- const result = await tool.execute(params, new AbortController().signal);
372
- expect(result.llmContent).toMatch(/0 occurrences found for old_string in/);
373
- expect(result.returnDisplay).toMatch(/Failed to edit, could not find the string to replace./);
374
- });
375
- it('should return error if multiple occurrences of old_string are found', async () => {
376
- fs.writeFileSync(filePath, 'multiple old old strings', 'utf8');
377
- const params = {
378
- file_path: filePath,
379
- old_string: 'old',
380
- new_string: 'new',
381
- };
382
- // The default mockEnsureCorrectEdit will return 2 occurrences for 'old'
383
- const result = await tool.execute(params, new AbortController().signal);
384
- expect(result.llmContent).toMatch(/Expected 1 occurrence but found 2 for old_string in file/);
385
- expect(result.returnDisplay).toMatch(/Failed to edit, expected 1 occurrence but found 2/);
386
- });
387
- it('should successfully replace multiple occurrences when expected_replacements specified', async () => {
388
- fs.writeFileSync(filePath, 'old text old text old text', 'utf8');
389
- const params = {
390
- file_path: filePath,
391
- old_string: 'old',
392
- new_string: 'new',
393
- expected_replacements: 3,
394
- };
395
- // Simulate confirmation by setting shouldAlwaysEdit
396
- tool.shouldAlwaysEdit = true;
397
- const result = await tool.execute(params, new AbortController().signal);
398
- tool.shouldAlwaysEdit = false; // Reset for other tests
399
- expect(result.llmContent).toMatch(/Successfully modified file/);
400
- expect(fs.readFileSync(filePath, 'utf8')).toBe('new text new text new text');
401
- const display = result.returnDisplay;
402
- expect(display.fileDiff).toMatch(/old text old text old text/);
403
- expect(display.fileDiff).toMatch(/new text new text new text/);
404
- expect(display.fileName).toBe(testFile);
405
- });
406
- it('should return error if expected_replacements does not match actual occurrences', async () => {
407
- fs.writeFileSync(filePath, 'old text old text', 'utf8');
408
- const params = {
409
- file_path: filePath,
410
- old_string: 'old',
411
- new_string: 'new',
412
- expected_replacements: 3, // Expecting 3 but only 2 exist
413
- };
414
- const result = await tool.execute(params, new AbortController().signal);
415
- expect(result.llmContent).toMatch(/Expected 3 occurrences but found 2 for old_string in file/);
416
- expect(result.returnDisplay).toMatch(/Failed to edit, expected 3 occurrences but found 2/);
417
- });
418
- it('should return error if trying to create a file that already exists (empty old_string)', async () => {
419
- fs.writeFileSync(filePath, 'Existing content', 'utf8');
420
- const params = {
421
- file_path: filePath,
422
- old_string: '',
423
- new_string: 'new content',
424
- };
425
- const result = await tool.execute(params, new AbortController().signal);
426
- expect(result.llmContent).toMatch(/File already exists, cannot create/);
427
- expect(result.returnDisplay).toMatch(/Attempted to create a file that already exists/);
428
- });
429
- it('should include modification message when proposed content is modified', async () => {
430
- const initialContent = 'This is some old text.';
431
- fs.writeFileSync(filePath, initialContent, 'utf8');
432
- const params = {
433
- file_path: filePath,
434
- old_string: 'old',
435
- new_string: 'new',
436
- modified_by_user: true,
437
- };
438
- mockConfig.getApprovalMode.mockReturnValueOnce(ApprovalMode.AUTO_EDIT);
439
- const result = await tool.execute(params, new AbortController().signal);
440
- expect(result.llmContent).toMatch(/User modified the `new_string` content/);
441
- });
442
- it('should not include modification message when proposed content is not modified', async () => {
443
- const initialContent = 'This is some old text.';
444
- fs.writeFileSync(filePath, initialContent, 'utf8');
445
- const params = {
446
- file_path: filePath,
447
- old_string: 'old',
448
- new_string: 'new',
449
- modified_by_user: false,
450
- };
451
- mockConfig.getApprovalMode.mockReturnValueOnce(ApprovalMode.AUTO_EDIT);
452
- const result = await tool.execute(params, new AbortController().signal);
453
- expect(result.llmContent).not.toMatch(/User modified the `new_string` content/);
454
- });
455
- it('should not include modification message when modified_by_user is not provided', async () => {
456
- const initialContent = 'This is some old text.';
457
- fs.writeFileSync(filePath, initialContent, 'utf8');
458
- const params = {
459
- file_path: filePath,
460
- old_string: 'old',
461
- new_string: 'new',
462
- };
463
- mockConfig.getApprovalMode.mockReturnValueOnce(ApprovalMode.AUTO_EDIT);
464
- const result = await tool.execute(params, new AbortController().signal);
465
- expect(result.llmContent).not.toMatch(/User modified the `new_string` content/);
466
- });
467
- it('should return error if old_string and new_string are identical', async () => {
468
- const initialContent = 'This is some identical text.';
469
- fs.writeFileSync(filePath, initialContent, 'utf8');
470
- const params = {
471
- file_path: filePath,
472
- old_string: 'identical',
473
- new_string: 'identical',
474
- };
475
- const result = await tool.execute(params, new AbortController().signal);
476
- expect(result.llmContent).toMatch(/No changes to apply/);
477
- expect(result.returnDisplay).toMatch(/No changes to apply/);
478
- });
479
- });
480
- describe('Error Scenarios', () => {
481
- const testFile = 'error_test.txt';
482
- let filePath;
483
- beforeEach(() => {
484
- filePath = path.join(rootDir, testFile);
485
- });
486
- it('should return FILE_NOT_FOUND error', async () => {
487
- const params = {
488
- file_path: filePath,
489
- old_string: 'any',
490
- new_string: 'new',
491
- };
492
- const result = await tool.execute(params, new AbortController().signal);
493
- expect(result.error?.type).toBe(ToolErrorType.FILE_NOT_FOUND);
494
- });
495
- it('should return ATTEMPT_TO_CREATE_EXISTING_FILE error', async () => {
496
- fs.writeFileSync(filePath, 'existing content', 'utf8');
497
- const params = {
498
- file_path: filePath,
499
- old_string: '',
500
- new_string: 'new content',
501
- };
502
- const result = await tool.execute(params, new AbortController().signal);
503
- expect(result.error?.type).toBe(ToolErrorType.ATTEMPT_TO_CREATE_EXISTING_FILE);
504
- });
505
- it('should return NO_OCCURRENCE_FOUND error', async () => {
506
- fs.writeFileSync(filePath, 'content', 'utf8');
507
- const params = {
508
- file_path: filePath,
509
- old_string: 'not-found',
510
- new_string: 'new',
511
- };
512
- const result = await tool.execute(params, new AbortController().signal);
513
- expect(result.error?.type).toBe(ToolErrorType.EDIT_NO_OCCURRENCE_FOUND);
514
- });
515
- it('should return EXPECTED_OCCURRENCE_MISMATCH error', async () => {
516
- fs.writeFileSync(filePath, 'one one two', 'utf8');
517
- const params = {
518
- file_path: filePath,
519
- old_string: 'one',
520
- new_string: 'new',
521
- expected_replacements: 3,
522
- };
523
- const result = await tool.execute(params, new AbortController().signal);
524
- expect(result.error?.type).toBe(ToolErrorType.EDIT_EXPECTED_OCCURRENCE_MISMATCH);
525
- });
526
- it('should return NO_CHANGE error', async () => {
527
- fs.writeFileSync(filePath, 'content', 'utf8');
528
- const params = {
529
- file_path: filePath,
530
- old_string: 'content',
531
- new_string: 'content',
532
- };
533
- const result = await tool.execute(params, new AbortController().signal);
534
- expect(result.error?.type).toBe(ToolErrorType.EDIT_NO_CHANGE);
535
- });
536
- it('should return INVALID_PARAMETERS error for relative path', async () => {
537
- const params = {
538
- file_path: 'relative/path.txt',
539
- old_string: 'a',
540
- new_string: 'b',
541
- };
542
- const result = await tool.execute(params, new AbortController().signal);
543
- expect(result.error?.type).toBe(ToolErrorType.INVALID_TOOL_PARAMS);
544
- });
545
- it('should return FILE_WRITE_FAILURE on write error', async () => {
546
- fs.writeFileSync(filePath, 'content', 'utf8');
547
- // Make file readonly to trigger a write error
548
- fs.chmodSync(filePath, '444');
549
- const params = {
550
- file_path: filePath,
551
- old_string: 'content',
552
- new_string: 'new content',
553
- };
554
- const result = await tool.execute(params, new AbortController().signal);
555
- expect(result.error?.type).toBe(ToolErrorType.FILE_WRITE_FAILURE);
556
- });
557
- });
558
- describe('getDescription', () => {
559
- it('should return "No file changes to..." if old_string and new_string are the same', () => {
560
- const testFileName = 'test.txt';
561
- const params = {
562
- file_path: path.join(rootDir, testFileName),
563
- old_string: 'identical_string',
564
- new_string: 'identical_string',
565
- };
566
- // shortenPath will be called internally, resulting in just the file name
567
- expect(tool.getDescription(params)).toBe(`No file changes to ${testFileName}`);
568
- });
569
- it('should return a snippet of old and new strings if they are different', () => {
570
- const testFileName = 'test.txt';
571
- const params = {
572
- file_path: path.join(rootDir, testFileName),
573
- old_string: 'this is the old string value',
574
- new_string: 'this is the new string value',
575
- };
576
- // shortenPath will be called internally, resulting in just the file name
577
- // The snippets are truncated at 30 chars + '...'
578
- expect(tool.getDescription(params)).toBe(`${testFileName}: this is the old string value => this is the new string value`);
579
- });
580
- it('should handle very short strings correctly in the description', () => {
581
- const testFileName = 'short.txt';
582
- const params = {
583
- file_path: path.join(rootDir, testFileName),
584
- old_string: 'old',
585
- new_string: 'new',
586
- };
587
- expect(tool.getDescription(params)).toBe(`${testFileName}: old => new`);
588
- });
589
- it('should truncate long strings in the description', () => {
590
- const testFileName = 'long.txt';
591
- const params = {
592
- file_path: path.join(rootDir, testFileName),
593
- old_string: 'this is a very long old string that will definitely be truncated',
594
- new_string: 'this is a very long new string that will also be truncated',
595
- };
596
- expect(tool.getDescription(params)).toBe(`${testFileName}: this is a very long old string... => this is a very long new string...`);
597
- });
598
- });
599
- describe('workspace boundary validation', () => {
600
- it('should validate paths are within workspace root', () => {
601
- const validPath = {
602
- file_path: path.join(rootDir, 'file.txt'),
603
- old_string: 'old',
604
- new_string: 'new',
605
- };
606
- expect(tool.validateToolParams(validPath)).toBeNull();
607
- });
608
- it('should reject paths outside workspace root', () => {
609
- const invalidPath = {
610
- file_path: '/etc/passwd',
611
- old_string: 'root',
612
- new_string: 'hacked',
613
- };
614
- const error = tool.validateToolParams(invalidPath);
615
- expect(error).toContain('File path must be within one of the workspace directories');
616
- expect(error).toContain(rootDir);
617
- });
618
- });
619
- describe('IDE mode', () => {
620
- const testFile = 'edit_me.txt';
621
- let filePath;
622
- let ideClient;
623
- beforeEach(() => {
624
- filePath = path.join(rootDir, testFile);
625
- ideClient = {
626
- openDiff: vi.fn(),
627
- getConnectionStatus: vi.fn().mockReturnValue({
628
- status: IDEConnectionStatus.Connected,
629
- }),
630
- };
631
- mockConfig.getIdeMode = () => true;
632
- mockConfig.getIdeModeFeature = () => true;
633
- mockConfig.getIdeClient = () => ideClient;
634
- });
635
- it('should call ideClient.openDiff and update params on confirmation', async () => {
636
- const initialContent = 'some old content here';
637
- const newContent = 'some new content here';
638
- const modifiedContent = 'some modified content here';
639
- fs.writeFileSync(filePath, initialContent);
640
- const params = {
641
- file_path: filePath,
642
- old_string: 'old',
643
- new_string: 'new',
644
- };
645
- mockEnsureCorrectEdit.mockResolvedValueOnce({
646
- params: { ...params, old_string: 'old', new_string: 'new' },
647
- occurrences: 1,
648
- });
649
- ideClient.openDiff.mockResolvedValueOnce({
650
- status: 'accepted',
651
- content: modifiedContent,
652
- });
653
- const confirmation = await tool.shouldConfirmExecute(params, new AbortController().signal);
654
- expect(ideClient.openDiff).toHaveBeenCalledWith(filePath, newContent);
655
- if (confirmation && 'onConfirm' in confirmation) {
656
- await confirmation.onConfirm(ToolConfirmationOutcome.ProceedOnce);
657
- }
658
- expect(params.old_string).toBe(initialContent);
659
- expect(params.new_string).toBe(modifiedContent);
660
- });
661
- });
662
- });
663
- //# sourceMappingURL=edit.test.js.map