@google/gemini-cli-core 0.0.1

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 (854) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +320 -0
  3. package/dist/.last_build +0 -0
  4. package/dist/index.d.ts +16 -0
  5. package/dist/index.js +17 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/__mocks__/fs/promises.d.ts +11 -0
  8. package/dist/src/__mocks__/fs/promises.js +17 -0
  9. package/dist/src/__mocks__/fs/promises.js.map +1 -0
  10. package/dist/src/code_assist/codeAssist.d.ts +12 -0
  11. package/dist/src/code_assist/codeAssist.js +31 -0
  12. package/dist/src/code_assist/codeAssist.js.map +1 -0
  13. package/dist/src/code_assist/converter.d.ts +74 -0
  14. package/dist/src/code_assist/converter.js +160 -0
  15. package/dist/src/code_assist/converter.js.map +1 -0
  16. package/dist/src/code_assist/converter.test.d.ts +6 -0
  17. package/dist/src/code_assist/converter.test.js +372 -0
  18. package/dist/src/code_assist/converter.test.js.map +1 -0
  19. package/dist/src/code_assist/oauth-credential-storage.d.ts +25 -0
  20. package/dist/src/code_assist/oauth-credential-storage.js +109 -0
  21. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -0
  22. package/dist/src/code_assist/oauth-credential-storage.test.d.ts +6 -0
  23. package/dist/src/code_assist/oauth-credential-storage.test.js +136 -0
  24. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -0
  25. package/dist/src/code_assist/oauth2.d.ts +22 -0
  26. package/dist/src/code_assist/oauth2.js +416 -0
  27. package/dist/src/code_assist/oauth2.js.map +1 -0
  28. package/dist/src/code_assist/oauth2.test.d.ts +6 -0
  29. package/dist/src/code_assist/oauth2.test.js +817 -0
  30. package/dist/src/code_assist/oauth2.test.js.map +1 -0
  31. package/dist/src/code_assist/server.d.ts +37 -0
  32. package/dist/src/code_assist/server.js +148 -0
  33. package/dist/src/code_assist/server.js.map +1 -0
  34. package/dist/src/code_assist/server.test.d.ts +6 -0
  35. package/dist/src/code_assist/server.test.js +159 -0
  36. package/dist/src/code_assist/server.test.js.map +1 -0
  37. package/dist/src/code_assist/setup.d.ts +20 -0
  38. package/dist/src/code_assist/setup.js +101 -0
  39. package/dist/src/code_assist/setup.js.map +1 -0
  40. package/dist/src/code_assist/setup.test.d.ts +6 -0
  41. package/dist/src/code_assist/setup.test.js +171 -0
  42. package/dist/src/code_assist/setup.test.js.map +1 -0
  43. package/dist/src/code_assist/types.d.ts +163 -0
  44. package/dist/src/code_assist/types.js +46 -0
  45. package/dist/src/code_assist/types.js.map +1 -0
  46. package/dist/src/config/config.d.ts +378 -0
  47. package/dist/src/config/config.js +765 -0
  48. package/dist/src/config/config.js.map +1 -0
  49. package/dist/src/config/config.test.d.ts +6 -0
  50. package/dist/src/config/config.test.js +712 -0
  51. package/dist/src/config/config.test.js.map +1 -0
  52. package/dist/src/config/flashFallback.test.d.ts +6 -0
  53. package/dist/src/config/flashFallback.test.js +87 -0
  54. package/dist/src/config/flashFallback.test.js.map +1 -0
  55. package/dist/src/config/models.d.ts +25 -0
  56. package/dist/src/config/models.js +39 -0
  57. package/dist/src/config/models.js.map +1 -0
  58. package/dist/src/config/models.test.d.ts +6 -0
  59. package/dist/src/config/models.test.js +55 -0
  60. package/dist/src/config/models.test.js.map +1 -0
  61. package/dist/src/config/storage.d.ts +34 -0
  62. package/dist/src/config/storage.js +95 -0
  63. package/dist/src/config/storage.js.map +1 -0
  64. package/dist/src/config/storage.test.d.ts +6 -0
  65. package/dist/src/config/storage.test.js +47 -0
  66. package/dist/src/config/storage.test.js.map +1 -0
  67. package/dist/src/confirmation-bus/index.d.ts +7 -0
  68. package/dist/src/confirmation-bus/index.js +8 -0
  69. package/dist/src/confirmation-bus/index.js.map +1 -0
  70. package/dist/src/confirmation-bus/message-bus.d.ts +17 -0
  71. package/dist/src/confirmation-bus/message-bus.js +81 -0
  72. package/dist/src/confirmation-bus/message-bus.js.map +1 -0
  73. package/dist/src/confirmation-bus/message-bus.test.d.ts +6 -0
  74. package/dist/src/confirmation-bus/message-bus.test.js +164 -0
  75. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -0
  76. package/dist/src/confirmation-bus/types.d.ts +38 -0
  77. package/dist/src/confirmation-bus/types.js +15 -0
  78. package/dist/src/confirmation-bus/types.js.map +1 -0
  79. package/dist/src/core/baseLlmClient.d.ts +46 -0
  80. package/dist/src/core/baseLlmClient.js +112 -0
  81. package/dist/src/core/baseLlmClient.js.map +1 -0
  82. package/dist/src/core/baseLlmClient.test.d.ts +6 -0
  83. package/dist/src/core/baseLlmClient.test.js +253 -0
  84. package/dist/src/core/baseLlmClient.test.js.map +1 -0
  85. package/dist/src/core/client.d.ts +60 -0
  86. package/dist/src/core/client.js +602 -0
  87. package/dist/src/core/client.js.map +1 -0
  88. package/dist/src/core/client.test.d.ts +6 -0
  89. package/dist/src/core/client.test.js +1758 -0
  90. package/dist/src/core/client.test.js.map +1 -0
  91. package/dist/src/core/contentGenerator.d.ts +32 -0
  92. package/dist/src/core/contentGenerator.js +76 -0
  93. package/dist/src/core/contentGenerator.js.map +1 -0
  94. package/dist/src/core/contentGenerator.test.d.ts +6 -0
  95. package/dist/src/core/contentGenerator.test.js +122 -0
  96. package/dist/src/core/contentGenerator.test.js.map +1 -0
  97. package/dist/src/core/coreToolScheduler.d.ts +131 -0
  98. package/dist/src/core/coreToolScheduler.js +706 -0
  99. package/dist/src/core/coreToolScheduler.js.map +1 -0
  100. package/dist/src/core/coreToolScheduler.test.d.ts +6 -0
  101. package/dist/src/core/coreToolScheduler.test.js +1151 -0
  102. package/dist/src/core/coreToolScheduler.test.js.map +1 -0
  103. package/dist/src/core/geminiChat.d.ts +128 -0
  104. package/dist/src/core/geminiChat.js +537 -0
  105. package/dist/src/core/geminiChat.js.map +1 -0
  106. package/dist/src/core/geminiChat.test.d.ts +6 -0
  107. package/dist/src/core/geminiChat.test.js +1163 -0
  108. package/dist/src/core/geminiChat.test.js.map +1 -0
  109. package/dist/src/core/geminiRequest.d.ts +13 -0
  110. package/dist/src/core/geminiRequest.js +11 -0
  111. package/dist/src/core/geminiRequest.js.map +1 -0
  112. package/dist/src/core/logger.d.ts +60 -0
  113. package/dist/src/core/logger.js +360 -0
  114. package/dist/src/core/logger.js.map +1 -0
  115. package/dist/src/core/logger.test.d.ts +6 -0
  116. package/dist/src/core/logger.test.js +534 -0
  117. package/dist/src/core/logger.test.js.map +1 -0
  118. package/dist/src/core/loggingContentGenerator.d.ts +25 -0
  119. package/dist/src/core/loggingContentGenerator.js +94 -0
  120. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  121. package/dist/src/core/nonInteractiveToolExecutor.d.ts +10 -0
  122. package/dist/src/core/nonInteractiveToolExecutor.js +24 -0
  123. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
  124. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
  125. package/dist/src/core/nonInteractiveToolExecutor.test.js +294 -0
  126. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
  127. package/dist/src/core/prompts.d.ts +17 -0
  128. package/dist/src/core/prompts.js +380 -0
  129. package/dist/src/core/prompts.js.map +1 -0
  130. package/dist/src/core/prompts.test.d.ts +6 -0
  131. package/dist/src/core/prompts.test.js +343 -0
  132. package/dist/src/core/prompts.test.js.map +1 -0
  133. package/dist/src/core/subagent.d.ts +236 -0
  134. package/dist/src/core/subagent.js +482 -0
  135. package/dist/src/core/subagent.js.map +1 -0
  136. package/dist/src/core/subagent.test.d.ts +6 -0
  137. package/dist/src/core/subagent.test.js +530 -0
  138. package/dist/src/core/subagent.test.js.map +1 -0
  139. package/dist/src/core/tokenLimits.d.ts +10 -0
  140. package/dist/src/core/tokenLimits.js +28 -0
  141. package/dist/src/core/tokenLimits.js.map +1 -0
  142. package/dist/src/core/turn.d.ts +141 -0
  143. package/dist/src/core/turn.js +188 -0
  144. package/dist/src/core/turn.js.map +1 -0
  145. package/dist/src/core/turn.test.d.ts +6 -0
  146. package/dist/src/core/turn.test.js +628 -0
  147. package/dist/src/core/turn.test.js.map +1 -0
  148. package/dist/src/fallback/handler.d.ts +7 -0
  149. package/dist/src/fallback/handler.js +51 -0
  150. package/dist/src/fallback/handler.js.map +1 -0
  151. package/dist/src/fallback/handler.test.d.ts +6 -0
  152. package/dist/src/fallback/handler.test.js +130 -0
  153. package/dist/src/fallback/handler.test.js.map +1 -0
  154. package/dist/src/fallback/types.d.ts +14 -0
  155. package/dist/src/fallback/types.js +7 -0
  156. package/dist/src/fallback/types.js.map +1 -0
  157. package/dist/src/generated/git-commit.d.ts +7 -0
  158. package/dist/src/generated/git-commit.js +10 -0
  159. package/dist/src/generated/git-commit.js.map +1 -0
  160. package/dist/src/ide/constants.d.ts +9 -0
  161. package/dist/src/ide/constants.js +10 -0
  162. package/dist/src/ide/constants.js.map +1 -0
  163. package/dist/src/ide/detect-ide.d.ts +53 -0
  164. package/dist/src/ide/detect-ide.js +58 -0
  165. package/dist/src/ide/detect-ide.js.map +1 -0
  166. package/dist/src/ide/detect-ide.test.d.ts +6 -0
  167. package/dist/src/ide/detect-ide.test.js +69 -0
  168. package/dist/src/ide/detect-ide.test.js.map +1 -0
  169. package/dist/src/ide/ide-client.d.ts +109 -0
  170. package/dist/src/ide/ide-client.js +640 -0
  171. package/dist/src/ide/ide-client.js.map +1 -0
  172. package/dist/src/ide/ide-client.test.d.ts +6 -0
  173. package/dist/src/ide/ide-client.test.js +388 -0
  174. package/dist/src/ide/ide-client.test.js.map +1 -0
  175. package/dist/src/ide/ide-installer.d.ts +14 -0
  176. package/dist/src/ide/ide-installer.js +111 -0
  177. package/dist/src/ide/ide-installer.js.map +1 -0
  178. package/dist/src/ide/ide-installer.test.d.ts +6 -0
  179. package/dist/src/ide/ide-installer.test.js +131 -0
  180. package/dist/src/ide/ide-installer.test.js.map +1 -0
  181. package/dist/src/ide/ideContext.d.ts +44 -0
  182. package/dist/src/ide/ideContext.js +101 -0
  183. package/dist/src/ide/ideContext.js.map +1 -0
  184. package/dist/src/ide/ideContext.test.d.ts +6 -0
  185. package/dist/src/ide/ideContext.test.js +393 -0
  186. package/dist/src/ide/ideContext.test.js.map +1 -0
  187. package/dist/src/ide/process-utils.d.ts +21 -0
  188. package/dist/src/ide/process-utils.js +171 -0
  189. package/dist/src/ide/process-utils.js.map +1 -0
  190. package/dist/src/ide/process-utils.test.d.ts +6 -0
  191. package/dist/src/ide/process-utils.test.js +158 -0
  192. package/dist/src/ide/process-utils.test.js.map +1 -0
  193. package/dist/src/ide/types.d.ts +486 -0
  194. package/dist/src/ide/types.js +138 -0
  195. package/dist/src/ide/types.js.map +1 -0
  196. package/dist/src/index.d.ts +87 -0
  197. package/dist/src/index.js +97 -0
  198. package/dist/src/index.js.map +1 -0
  199. package/dist/src/index.test.d.ts +6 -0
  200. package/dist/src/index.test.js +12 -0
  201. package/dist/src/index.test.js.map +1 -0
  202. package/dist/src/mcp/google-auth-provider.d.ts +23 -0
  203. package/dist/src/mcp/google-auth-provider.js +72 -0
  204. package/dist/src/mcp/google-auth-provider.js.map +1 -0
  205. package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
  206. package/dist/src/mcp/google-auth-provider.test.js +89 -0
  207. package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
  208. package/dist/src/mcp/oauth-provider.d.ts +149 -0
  209. package/dist/src/mcp/oauth-provider.js +608 -0
  210. package/dist/src/mcp/oauth-provider.js.map +1 -0
  211. package/dist/src/mcp/oauth-provider.test.d.ts +6 -0
  212. package/dist/src/mcp/oauth-provider.test.js +711 -0
  213. package/dist/src/mcp/oauth-provider.test.js.map +1 -0
  214. package/dist/src/mcp/oauth-token-storage.d.ts +65 -0
  215. package/dist/src/mcp/oauth-token-storage.js +180 -0
  216. package/dist/src/mcp/oauth-token-storage.js.map +1 -0
  217. package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  218. package/dist/src/mcp/oauth-token-storage.test.js +299 -0
  219. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  220. package/dist/src/mcp/oauth-utils.d.ts +119 -0
  221. package/dist/src/mcp/oauth-utils.js +235 -0
  222. package/dist/src/mcp/oauth-utils.js.map +1 -0
  223. package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
  224. package/dist/src/mcp/oauth-utils.test.js +199 -0
  225. package/dist/src/mcp/oauth-utils.test.js.map +1 -0
  226. package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
  227. package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
  228. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
  229. package/dist/src/mcp/token-storage/base-token-storage.test.d.ts +6 -0
  230. package/dist/src/mcp/token-storage/base-token-storage.test.js +160 -0
  231. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -0
  232. package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  233. package/dist/src/mcp/token-storage/file-token-storage.js +144 -0
  234. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  235. package/dist/src/mcp/token-storage/file-token-storage.test.d.ts +6 -0
  236. package/dist/src/mcp/token-storage/file-token-storage.test.js +235 -0
  237. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -0
  238. package/dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
  239. package/dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
  240. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
  241. package/dist/src/mcp/token-storage/hybrid-token-storage.test.d.ts +6 -0
  242. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js +193 -0
  243. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -0
  244. package/dist/src/mcp/token-storage/index.d.ts +11 -0
  245. package/dist/src/mcp/token-storage/index.js +12 -0
  246. package/dist/src/mcp/token-storage/index.js.map +1 -0
  247. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +31 -0
  248. package/dist/src/mcp/token-storage/keychain-token-storage.js +190 -0
  249. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
  250. package/dist/src/mcp/token-storage/keychain-token-storage.test.d.ts +6 -0
  251. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +254 -0
  252. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -0
  253. package/dist/src/mcp/token-storage/types.d.ts +38 -0
  254. package/dist/src/mcp/token-storage/types.js +11 -0
  255. package/dist/src/mcp/token-storage/types.js.map +1 -0
  256. package/dist/src/mocks/msw.d.ts +6 -0
  257. package/dist/src/mocks/msw.js +8 -0
  258. package/dist/src/mocks/msw.js.map +1 -0
  259. package/dist/src/output/json-formatter.d.ts +11 -0
  260. package/dist/src/output/json-formatter.js +30 -0
  261. package/dist/src/output/json-formatter.js.map +1 -0
  262. package/dist/src/output/json-formatter.test.d.ts +6 -0
  263. package/dist/src/output/json-formatter.test.js +266 -0
  264. package/dist/src/output/json-formatter.test.js.map +1 -0
  265. package/dist/src/output/types.d.ts +20 -0
  266. package/dist/src/output/types.js +11 -0
  267. package/dist/src/output/types.js.map +1 -0
  268. package/dist/src/policy/index.d.ts +7 -0
  269. package/dist/src/policy/index.js +8 -0
  270. package/dist/src/policy/index.js.map +1 -0
  271. package/dist/src/policy/policy-engine.d.ts +30 -0
  272. package/dist/src/policy/policy-engine.js +83 -0
  273. package/dist/src/policy/policy-engine.js.map +1 -0
  274. package/dist/src/policy/policy-engine.test.d.ts +6 -0
  275. package/dist/src/policy/policy-engine.test.js +470 -0
  276. package/dist/src/policy/policy-engine.test.js.map +1 -0
  277. package/dist/src/policy/stable-stringify.d.ts +58 -0
  278. package/dist/src/policy/stable-stringify.js +122 -0
  279. package/dist/src/policy/stable-stringify.js.map +1 -0
  280. package/dist/src/policy/types.d.ts +47 -0
  281. package/dist/src/policy/types.js +12 -0
  282. package/dist/src/policy/types.js.map +1 -0
  283. package/dist/src/prompts/mcp-prompts.d.ts +8 -0
  284. package/dist/src/prompts/mcp-prompts.js +13 -0
  285. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  286. package/dist/src/prompts/prompt-registry.d.ts +34 -0
  287. package/dist/src/prompts/prompt-registry.js +63 -0
  288. package/dist/src/prompts/prompt-registry.js.map +1 -0
  289. package/dist/src/routing/modelRouterService.d.ts +23 -0
  290. package/dist/src/routing/modelRouterService.js +70 -0
  291. package/dist/src/routing/modelRouterService.js.map +1 -0
  292. package/dist/src/routing/modelRouterService.test.d.ts +6 -0
  293. package/dist/src/routing/modelRouterService.test.js +98 -0
  294. package/dist/src/routing/modelRouterService.test.js.map +1 -0
  295. package/dist/src/routing/routingStrategy.d.ts +62 -0
  296. package/dist/src/routing/routingStrategy.js +7 -0
  297. package/dist/src/routing/routingStrategy.js.map +1 -0
  298. package/dist/src/routing/strategies/classifierStrategy.d.ts +12 -0
  299. package/dist/src/routing/strategies/classifierStrategy.js +173 -0
  300. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -0
  301. package/dist/src/routing/strategies/classifierStrategy.test.d.ts +6 -0
  302. package/dist/src/routing/strategies/classifierStrategy.test.js +192 -0
  303. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -0
  304. package/dist/src/routing/strategies/compositeStrategy.d.ts +26 -0
  305. package/dist/src/routing/strategies/compositeStrategy.js +67 -0
  306. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -0
  307. package/dist/src/routing/strategies/compositeStrategy.test.d.ts +6 -0
  308. package/dist/src/routing/strategies/compositeStrategy.test.js +123 -0
  309. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -0
  310. package/dist/src/routing/strategies/defaultStrategy.d.ts +12 -0
  311. package/dist/src/routing/strategies/defaultStrategy.js +20 -0
  312. package/dist/src/routing/strategies/defaultStrategy.js.map +1 -0
  313. package/dist/src/routing/strategies/defaultStrategy.test.d.ts +6 -0
  314. package/dist/src/routing/strategies/defaultStrategy.test.js +26 -0
  315. package/dist/src/routing/strategies/defaultStrategy.test.js.map +1 -0
  316. package/dist/src/routing/strategies/fallbackStrategy.d.ts +12 -0
  317. package/dist/src/routing/strategies/fallbackStrategy.js +25 -0
  318. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -0
  319. package/dist/src/routing/strategies/fallbackStrategy.test.d.ts +6 -0
  320. package/dist/src/routing/strategies/fallbackStrategy.test.js +55 -0
  321. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -0
  322. package/dist/src/routing/strategies/overrideStrategy.d.ts +15 -0
  323. package/dist/src/routing/strategies/overrideStrategy.js +28 -0
  324. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -0
  325. package/dist/src/routing/strategies/overrideStrategy.test.d.ts +6 -0
  326. package/dist/src/routing/strategies/overrideStrategy.test.js +42 -0
  327. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -0
  328. package/dist/src/services/chatRecordingService.d.ts +144 -0
  329. package/dist/src/services/chatRecordingService.js +330 -0
  330. package/dist/src/services/chatRecordingService.js.map +1 -0
  331. package/dist/src/services/chatRecordingService.test.d.ts +6 -0
  332. package/dist/src/services/chatRecordingService.test.js +332 -0
  333. package/dist/src/services/chatRecordingService.test.js.map +1 -0
  334. package/dist/src/services/fileDiscoveryService.d.ts +45 -0
  335. package/dist/src/services/fileDiscoveryService.js +105 -0
  336. package/dist/src/services/fileDiscoveryService.js.map +1 -0
  337. package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
  338. package/dist/src/services/fileDiscoveryService.test.js +143 -0
  339. package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
  340. package/dist/src/services/fileSystemService.d.ts +31 -0
  341. package/dist/src/services/fileSystemService.js +18 -0
  342. package/dist/src/services/fileSystemService.js.map +1 -0
  343. package/dist/src/services/fileSystemService.test.d.ts +6 -0
  344. package/dist/src/services/fileSystemService.test.js +41 -0
  345. package/dist/src/services/fileSystemService.test.js.map +1 -0
  346. package/dist/src/services/gitService.d.ts +23 -0
  347. package/dist/src/services/gitService.js +107 -0
  348. package/dist/src/services/gitService.js.map +1 -0
  349. package/dist/src/services/gitService.test.d.ts +6 -0
  350. package/dist/src/services/gitService.test.js +202 -0
  351. package/dist/src/services/gitService.test.js.map +1 -0
  352. package/dist/src/services/loopDetectionService.d.ts +103 -0
  353. package/dist/src/services/loopDetectionService.js +379 -0
  354. package/dist/src/services/loopDetectionService.js.map +1 -0
  355. package/dist/src/services/loopDetectionService.test.d.ts +6 -0
  356. package/dist/src/services/loopDetectionService.test.js +587 -0
  357. package/dist/src/services/loopDetectionService.test.js.map +1 -0
  358. package/dist/src/services/shellExecutionService.d.ts +100 -0
  359. package/dist/src/services/shellExecutionService.js +466 -0
  360. package/dist/src/services/shellExecutionService.js.map +1 -0
  361. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  362. package/dist/src/services/shellExecutionService.test.js +614 -0
  363. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  364. package/dist/src/telemetry/activity-detector.d.ts +41 -0
  365. package/dist/src/telemetry/activity-detector.js +61 -0
  366. package/dist/src/telemetry/activity-detector.js.map +1 -0
  367. package/dist/src/telemetry/activity-detector.test.d.ts +6 -0
  368. package/dist/src/telemetry/activity-detector.test.js +136 -0
  369. package/dist/src/telemetry/activity-detector.test.js.map +1 -0
  370. package/dist/src/telemetry/activity-types.d.ts +19 -0
  371. package/dist/src/telemetry/activity-types.js +21 -0
  372. package/dist/src/telemetry/activity-types.js.map +1 -0
  373. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +135 -0
  374. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +892 -0
  375. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
  376. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +17 -0
  377. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +507 -0
  378. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
  379. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +107 -0
  380. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +275 -0
  381. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
  382. package/dist/src/telemetry/constants.d.ts +40 -0
  383. package/dist/src/telemetry/constants.js +41 -0
  384. package/dist/src/telemetry/constants.js.map +1 -0
  385. package/dist/src/telemetry/file-exporters.d.ts +29 -0
  386. package/dist/src/telemetry/file-exporters.js +62 -0
  387. package/dist/src/telemetry/file-exporters.js.map +1 -0
  388. package/dist/src/telemetry/gcp-exporters.d.ts +34 -0
  389. package/dist/src/telemetry/gcp-exporters.js +117 -0
  390. package/dist/src/telemetry/gcp-exporters.js.map +1 -0
  391. package/dist/src/telemetry/gcp-exporters.test.d.ts +6 -0
  392. package/dist/src/telemetry/gcp-exporters.test.js +318 -0
  393. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -0
  394. package/dist/src/telemetry/high-water-mark-tracker.d.ts +43 -0
  395. package/dist/src/telemetry/high-water-mark-tracker.js +88 -0
  396. package/dist/src/telemetry/high-water-mark-tracker.js.map +1 -0
  397. package/dist/src/telemetry/high-water-mark-tracker.test.d.ts +6 -0
  398. package/dist/src/telemetry/high-water-mark-tracker.test.js +152 -0
  399. package/dist/src/telemetry/high-water-mark-tracker.test.js.map +1 -0
  400. package/dist/src/telemetry/index.d.ts +26 -0
  401. package/dist/src/telemetry/index.js +26 -0
  402. package/dist/src/telemetry/index.js.map +1 -0
  403. package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
  404. package/dist/src/telemetry/integration.test.circular.js +54 -0
  405. package/dist/src/telemetry/integration.test.circular.js.map +1 -0
  406. package/dist/src/telemetry/loggers.d.ts +33 -0
  407. package/dist/src/telemetry/loggers.js +536 -0
  408. package/dist/src/telemetry/loggers.js.map +1 -0
  409. package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  410. package/dist/src/telemetry/loggers.test.circular.js +107 -0
  411. package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
  412. package/dist/src/telemetry/loggers.test.d.ts +6 -0
  413. package/dist/src/telemetry/loggers.test.js +887 -0
  414. package/dist/src/telemetry/loggers.test.js.map +1 -0
  415. package/dist/src/telemetry/metrics.d.ts +37 -0
  416. package/dist/src/telemetry/metrics.js +231 -0
  417. package/dist/src/telemetry/metrics.js.map +1 -0
  418. package/dist/src/telemetry/metrics.test.d.ts +6 -0
  419. package/dist/src/telemetry/metrics.test.js +264 -0
  420. package/dist/src/telemetry/metrics.test.js.map +1 -0
  421. package/dist/src/telemetry/rate-limiter.d.ts +48 -0
  422. package/dist/src/telemetry/rate-limiter.js +100 -0
  423. package/dist/src/telemetry/rate-limiter.js.map +1 -0
  424. package/dist/src/telemetry/rate-limiter.test.d.ts +6 -0
  425. package/dist/src/telemetry/rate-limiter.test.js +207 -0
  426. package/dist/src/telemetry/rate-limiter.test.js.map +1 -0
  427. package/dist/src/telemetry/sdk.d.ts +9 -0
  428. package/dist/src/telemetry/sdk.js +178 -0
  429. package/dist/src/telemetry/sdk.js.map +1 -0
  430. package/dist/src/telemetry/sdk.test.d.ts +6 -0
  431. package/dist/src/telemetry/sdk.test.js +177 -0
  432. package/dist/src/telemetry/sdk.test.js.map +1 -0
  433. package/dist/src/telemetry/telemetry-utils.d.ts +6 -0
  434. package/dist/src/telemetry/telemetry-utils.js +14 -0
  435. package/dist/src/telemetry/telemetry-utils.js.map +1 -0
  436. package/dist/src/telemetry/telemetry-utils.test.d.ts +6 -0
  437. package/dist/src/telemetry/telemetry-utils.test.js +40 -0
  438. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -0
  439. package/dist/src/telemetry/telemetry.test.d.ts +6 -0
  440. package/dist/src/telemetry/telemetry.test.js +50 -0
  441. package/dist/src/telemetry/telemetry.test.js.map +1 -0
  442. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  443. package/dist/src/telemetry/tool-call-decision.js +29 -0
  444. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  445. package/dist/src/telemetry/types.d.ts +284 -0
  446. package/dist/src/telemetry/types.js +487 -0
  447. package/dist/src/telemetry/types.js.map +1 -0
  448. package/dist/src/telemetry/uiTelemetry.d.ts +75 -0
  449. package/dist/src/telemetry/uiTelemetry.js +152 -0
  450. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  451. package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  452. package/dist/src/telemetry/uiTelemetry.test.js +558 -0
  453. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  454. package/dist/src/test-utils/config.d.ts +17 -0
  455. package/dist/src/test-utils/config.js +32 -0
  456. package/dist/src/test-utils/config.js.map +1 -0
  457. package/dist/src/test-utils/index.d.ts +6 -0
  458. package/dist/src/test-utils/index.js +7 -0
  459. package/dist/src/test-utils/index.js.map +1 -0
  460. package/dist/src/test-utils/mock-tool.d.ts +41 -0
  461. package/dist/src/test-utils/mock-tool.js +51 -0
  462. package/dist/src/test-utils/mock-tool.js.map +1 -0
  463. package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
  464. package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
  465. package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
  466. package/dist/src/test-utils/tools.d.ts +45 -0
  467. package/dist/src/test-utils/tools.js +105 -0
  468. package/dist/src/test-utils/tools.js.map +1 -0
  469. package/dist/src/tools/diffOptions.d.ts +9 -0
  470. package/dist/src/tools/diffOptions.js +46 -0
  471. package/dist/src/tools/diffOptions.js.map +1 -0
  472. package/dist/src/tools/diffOptions.test.d.ts +6 -0
  473. package/dist/src/tools/diffOptions.test.js +155 -0
  474. package/dist/src/tools/diffOptions.test.js.map +1 -0
  475. package/dist/src/tools/edit.d.ts +56 -0
  476. package/dist/src/tools/edit.js +414 -0
  477. package/dist/src/tools/edit.js.map +1 -0
  478. package/dist/src/tools/edit.test.d.ts +6 -0
  479. package/dist/src/tools/edit.test.js +824 -0
  480. package/dist/src/tools/edit.test.js.map +1 -0
  481. package/dist/src/tools/glob.d.ts +56 -0
  482. package/dist/src/tools/glob.js +243 -0
  483. package/dist/src/tools/glob.js.map +1 -0
  484. package/dist/src/tools/glob.test.d.ts +6 -0
  485. package/dist/src/tools/glob.test.js +426 -0
  486. package/dist/src/tools/glob.test.js.map +1 -0
  487. package/dist/src/tools/grep.d.ts +47 -0
  488. package/dist/src/tools/grep.js +517 -0
  489. package/dist/src/tools/grep.js.map +1 -0
  490. package/dist/src/tools/grep.test.d.ts +6 -0
  491. package/dist/src/tools/grep.test.js +295 -0
  492. package/dist/src/tools/grep.test.js.map +1 -0
  493. package/dist/src/tools/ls.d.ts +68 -0
  494. package/dist/src/tools/ls.js +214 -0
  495. package/dist/src/tools/ls.js.map +1 -0
  496. package/dist/src/tools/ls.test.d.ts +6 -0
  497. package/dist/src/tools/ls.test.js +249 -0
  498. package/dist/src/tools/ls.test.js.map +1 -0
  499. package/dist/src/tools/mcp-client-manager.d.ts +40 -0
  500. package/dist/src/tools/mcp-client-manager.js +83 -0
  501. package/dist/src/tools/mcp-client-manager.js.map +1 -0
  502. package/dist/src/tools/mcp-client-manager.test.d.ts +6 -0
  503. package/dist/src/tools/mcp-client-manager.test.js +58 -0
  504. package/dist/src/tools/mcp-client-manager.test.js.map +1 -0
  505. package/dist/src/tools/mcp-client.d.ts +199 -0
  506. package/dist/src/tools/mcp-client.js +1000 -0
  507. package/dist/src/tools/mcp-client.js.map +1 -0
  508. package/dist/src/tools/mcp-client.test.d.ts +6 -0
  509. package/dist/src/tools/mcp-client.test.js +454 -0
  510. package/dist/src/tools/mcp-client.test.js.map +1 -0
  511. package/dist/src/tools/mcp-tool.d.ts +24 -0
  512. package/dist/src/tools/mcp-tool.js +240 -0
  513. package/dist/src/tools/mcp-tool.js.map +1 -0
  514. package/dist/src/tools/mcp-tool.test.d.ts +6 -0
  515. package/dist/src/tools/mcp-tool.test.js +597 -0
  516. package/dist/src/tools/mcp-tool.test.js.map +1 -0
  517. package/dist/src/tools/memoryTool.d.ts +40 -0
  518. package/dist/src/tools/memoryTool.js +268 -0
  519. package/dist/src/tools/memoryTool.js.map +1 -0
  520. package/dist/src/tools/memoryTool.test.d.ts +6 -0
  521. package/dist/src/tools/memoryTool.test.js +298 -0
  522. package/dist/src/tools/memoryTool.test.js.map +1 -0
  523. package/dist/src/tools/modifiable-tool.d.ts +32 -0
  524. package/dist/src/tools/modifiable-tool.js +88 -0
  525. package/dist/src/tools/modifiable-tool.js.map +1 -0
  526. package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
  527. package/dist/src/tools/modifiable-tool.test.js +193 -0
  528. package/dist/src/tools/modifiable-tool.test.js.map +1 -0
  529. package/dist/src/tools/read-file.d.ts +35 -0
  530. package/dist/src/tools/read-file.js +132 -0
  531. package/dist/src/tools/read-file.js.map +1 -0
  532. package/dist/src/tools/read-file.test.d.ts +6 -0
  533. package/dist/src/tools/read-file.test.js +340 -0
  534. package/dist/src/tools/read-file.test.js.map +1 -0
  535. package/dist/src/tools/read-many-files.d.ts +60 -0
  536. package/dist/src/tools/read-many-files.js +382 -0
  537. package/dist/src/tools/read-many-files.js.map +1 -0
  538. package/dist/src/tools/read-many-files.test.d.ts +6 -0
  539. package/dist/src/tools/read-many-files.test.js +565 -0
  540. package/dist/src/tools/read-many-files.test.js.map +1 -0
  541. package/dist/src/tools/ripGrep.d.ts +55 -0
  542. package/dist/src/tools/ripGrep.js +393 -0
  543. package/dist/src/tools/ripGrep.js.map +1 -0
  544. package/dist/src/tools/ripGrep.test.d.ts +6 -0
  545. package/dist/src/tools/ripGrep.test.js +976 -0
  546. package/dist/src/tools/ripGrep.test.js.map +1 -0
  547. package/dist/src/tools/shell.d.ts +32 -0
  548. package/dist/src/tools/shell.js +316 -0
  549. package/dist/src/tools/shell.js.map +1 -0
  550. package/dist/src/tools/shell.test.d.ts +6 -0
  551. package/dist/src/tools/shell.test.js +301 -0
  552. package/dist/src/tools/shell.test.js.map +1 -0
  553. package/dist/src/tools/smart-edit.d.ts +72 -0
  554. package/dist/src/tools/smart-edit.js +594 -0
  555. package/dist/src/tools/smart-edit.js.map +1 -0
  556. package/dist/src/tools/smart-edit.test.d.ts +6 -0
  557. package/dist/src/tools/smart-edit.test.js +419 -0
  558. package/dist/src/tools/smart-edit.test.js.map +1 -0
  559. package/dist/src/tools/tool-error.d.ts +43 -0
  560. package/dist/src/tools/tool-error.js +58 -0
  561. package/dist/src/tools/tool-error.js.map +1 -0
  562. package/dist/src/tools/tool-registry.d.ts +87 -0
  563. package/dist/src/tools/tool-registry.js +370 -0
  564. package/dist/src/tools/tool-registry.js.map +1 -0
  565. package/dist/src/tools/tool-registry.test.d.ts +6 -0
  566. package/dist/src/tools/tool-registry.test.js +332 -0
  567. package/dist/src/tools/tool-registry.test.js.map +1 -0
  568. package/dist/src/tools/tools.d.ts +281 -0
  569. package/dist/src/tools/tools.js +257 -0
  570. package/dist/src/tools/tools.js.map +1 -0
  571. package/dist/src/tools/tools.test.d.ts +6 -0
  572. package/dist/src/tools/tools.test.js +205 -0
  573. package/dist/src/tools/tools.test.js.map +1 -0
  574. package/dist/src/tools/web-fetch.d.ts +27 -0
  575. package/dist/src/tools/web-fetch.js +244 -0
  576. package/dist/src/tools/web-fetch.js.map +1 -0
  577. package/dist/src/tools/web-fetch.test.d.ts +6 -0
  578. package/dist/src/tools/web-fetch.test.js +114 -0
  579. package/dist/src/tools/web-fetch.test.js.map +1 -0
  580. package/dist/src/tools/web-search.d.ts +49 -0
  581. package/dist/src/tools/web-search.js +139 -0
  582. package/dist/src/tools/web-search.js.map +1 -0
  583. package/dist/src/tools/web-search.test.d.ts +6 -0
  584. package/dist/src/tools/web-search.test.js +207 -0
  585. package/dist/src/tools/web-search.test.js.map +1 -0
  586. package/dist/src/tools/write-file.d.ts +52 -0
  587. package/dist/src/tools/write-file.js +309 -0
  588. package/dist/src/tools/write-file.js.map +1 -0
  589. package/dist/src/tools/write-file.test.d.ts +6 -0
  590. package/dist/src/tools/write-file.test.js +611 -0
  591. package/dist/src/tools/write-file.test.js.map +1 -0
  592. package/dist/src/utils/LruCache.d.ts +13 -0
  593. package/dist/src/utils/LruCache.js +38 -0
  594. package/dist/src/utils/LruCache.js.map +1 -0
  595. package/dist/src/utils/bfsFileSearch.d.ts +24 -0
  596. package/dist/src/utils/bfsFileSearch.js +95 -0
  597. package/dist/src/utils/bfsFileSearch.js.map +1 -0
  598. package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
  599. package/dist/src/utils/bfsFileSearch.test.js +163 -0
  600. package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
  601. package/dist/src/utils/browser.d.ts +13 -0
  602. package/dist/src/utils/browser.js +50 -0
  603. package/dist/src/utils/browser.js.map +1 -0
  604. package/dist/src/utils/editCorrector.d.ts +54 -0
  605. package/dist/src/utils/editCorrector.js +588 -0
  606. package/dist/src/utils/editCorrector.js.map +1 -0
  607. package/dist/src/utils/editCorrector.test.d.ts +6 -0
  608. package/dist/src/utils/editCorrector.test.js +515 -0
  609. package/dist/src/utils/editCorrector.test.js.map +1 -0
  610. package/dist/src/utils/editor.d.ts +28 -0
  611. package/dist/src/utils/editor.js +173 -0
  612. package/dist/src/utils/editor.js.map +1 -0
  613. package/dist/src/utils/editor.test.d.ts +6 -0
  614. package/dist/src/utils/editor.test.js +431 -0
  615. package/dist/src/utils/editor.test.js.map +1 -0
  616. package/dist/src/utils/environmentContext.d.ts +21 -0
  617. package/dist/src/utils/environmentContext.js +90 -0
  618. package/dist/src/utils/environmentContext.js.map +1 -0
  619. package/dist/src/utils/environmentContext.test.d.ts +6 -0
  620. package/dist/src/utils/environmentContext.test.js +140 -0
  621. package/dist/src/utils/environmentContext.test.js.map +1 -0
  622. package/dist/src/utils/errorParsing.d.ts +8 -0
  623. package/dist/src/utils/errorParsing.js +93 -0
  624. package/dist/src/utils/errorParsing.js.map +1 -0
  625. package/dist/src/utils/errorParsing.test.d.ts +6 -0
  626. package/dist/src/utils/errorParsing.test.js +172 -0
  627. package/dist/src/utils/errorParsing.test.js.map +1 -0
  628. package/dist/src/utils/errorReporting.d.ts +14 -0
  629. package/dist/src/utils/errorReporting.js +88 -0
  630. package/dist/src/utils/errorReporting.js.map +1 -0
  631. package/dist/src/utils/errorReporting.test.d.ts +6 -0
  632. package/dist/src/utils/errorReporting.test.js +130 -0
  633. package/dist/src/utils/errorReporting.test.js.map +1 -0
  634. package/dist/src/utils/errors.d.ts +39 -0
  635. package/dist/src/utils/errors.js +96 -0
  636. package/dist/src/utils/errors.js.map +1 -0
  637. package/dist/src/utils/fetch.d.ts +11 -0
  638. package/dist/src/utils/fetch.js +51 -0
  639. package/dist/src/utils/fetch.js.map +1 -0
  640. package/dist/src/utils/fileUtils.d.ts +69 -0
  641. package/dist/src/utils/fileUtils.js +405 -0
  642. package/dist/src/utils/fileUtils.js.map +1 -0
  643. package/dist/src/utils/fileUtils.test.d.ts +6 -0
  644. package/dist/src/utils/fileUtils.test.js +682 -0
  645. package/dist/src/utils/fileUtils.test.js.map +1 -0
  646. package/dist/src/utils/filesearch/crawlCache.d.ts +25 -0
  647. package/dist/src/utils/filesearch/crawlCache.js +57 -0
  648. package/dist/src/utils/filesearch/crawlCache.js.map +1 -0
  649. package/dist/src/utils/filesearch/crawlCache.test.d.ts +6 -0
  650. package/dist/src/utils/filesearch/crawlCache.test.js +103 -0
  651. package/dist/src/utils/filesearch/crawlCache.test.js.map +1 -0
  652. package/dist/src/utils/filesearch/crawler.d.ts +15 -0
  653. package/dist/src/utils/filesearch/crawler.js +50 -0
  654. package/dist/src/utils/filesearch/crawler.js.map +1 -0
  655. package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
  656. package/dist/src/utils/filesearch/crawler.test.js +468 -0
  657. package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
  658. package/dist/src/utils/filesearch/fileSearch.d.ts +38 -0
  659. package/dist/src/utils/filesearch/fileSearch.js +191 -0
  660. package/dist/src/utils/filesearch/fileSearch.js.map +1 -0
  661. package/dist/src/utils/filesearch/fileSearch.test.d.ts +6 -0
  662. package/dist/src/utils/filesearch/fileSearch.test.js +642 -0
  663. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -0
  664. package/dist/src/utils/filesearch/ignore.d.ts +42 -0
  665. package/dist/src/utils/filesearch/ignore.js +106 -0
  666. package/dist/src/utils/filesearch/ignore.js.map +1 -0
  667. package/dist/src/utils/filesearch/ignore.test.d.ts +6 -0
  668. package/dist/src/utils/filesearch/ignore.test.js +144 -0
  669. package/dist/src/utils/filesearch/ignore.test.js.map +1 -0
  670. package/dist/src/utils/filesearch/result-cache.d.ts +33 -0
  671. package/dist/src/utils/filesearch/result-cache.js +59 -0
  672. package/dist/src/utils/filesearch/result-cache.js.map +1 -0
  673. package/dist/src/utils/filesearch/result-cache.test.d.ts +6 -0
  674. package/dist/src/utils/filesearch/result-cache.test.js +46 -0
  675. package/dist/src/utils/filesearch/result-cache.test.js.map +1 -0
  676. package/dist/src/utils/flashFallback.test.d.ts +6 -0
  677. package/dist/src/utils/flashFallback.test.js +122 -0
  678. package/dist/src/utils/flashFallback.test.js.map +1 -0
  679. package/dist/src/utils/formatters.d.ts +6 -0
  680. package/dist/src/utils/formatters.js +16 -0
  681. package/dist/src/utils/formatters.js.map +1 -0
  682. package/dist/src/utils/geminiIgnoreParser.d.ts +18 -0
  683. package/dist/src/utils/geminiIgnoreParser.js +61 -0
  684. package/dist/src/utils/geminiIgnoreParser.js.map +1 -0
  685. package/dist/src/utils/geminiIgnoreParser.test.d.ts +6 -0
  686. package/dist/src/utils/geminiIgnoreParser.test.js +50 -0
  687. package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -0
  688. package/dist/src/utils/generateContentResponseUtilities.d.ts +13 -0
  689. package/dist/src/utils/generateContentResponseUtilities.js +80 -0
  690. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
  691. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
  692. package/dist/src/utils/generateContentResponseUtilities.test.js +235 -0
  693. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
  694. package/dist/src/utils/getFolderStructure.d.ts +31 -0
  695. package/dist/src/utils/getFolderStructure.js +246 -0
  696. package/dist/src/utils/getFolderStructure.js.map +1 -0
  697. package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
  698. package/dist/src/utils/getFolderStructure.test.js +282 -0
  699. package/dist/src/utils/getFolderStructure.test.js.map +1 -0
  700. package/dist/src/utils/getPty.d.ts +19 -0
  701. package/dist/src/utils/getPty.js +23 -0
  702. package/dist/src/utils/getPty.js.map +1 -0
  703. package/dist/src/utils/gitIgnoreParser.d.ts +16 -0
  704. package/dist/src/utils/gitIgnoreParser.js +152 -0
  705. package/dist/src/utils/gitIgnoreParser.js.map +1 -0
  706. package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
  707. package/dist/src/utils/gitIgnoreParser.test.js +185 -0
  708. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
  709. package/dist/src/utils/gitUtils.d.ts +17 -0
  710. package/dist/src/utils/gitUtils.js +61 -0
  711. package/dist/src/utils/gitUtils.js.map +1 -0
  712. package/dist/src/utils/ignorePatterns.d.ts +103 -0
  713. package/dist/src/utils/ignorePatterns.js +220 -0
  714. package/dist/src/utils/ignorePatterns.js.map +1 -0
  715. package/dist/src/utils/ignorePatterns.test.d.ts +6 -0
  716. package/dist/src/utils/ignorePatterns.test.js +250 -0
  717. package/dist/src/utils/ignorePatterns.test.js.map +1 -0
  718. package/dist/src/utils/installationManager.d.ts +16 -0
  719. package/dist/src/utils/installationManager.js +50 -0
  720. package/dist/src/utils/installationManager.js.map +1 -0
  721. package/dist/src/utils/installationManager.test.d.ts +6 -0
  722. package/dist/src/utils/installationManager.test.js +83 -0
  723. package/dist/src/utils/installationManager.test.js.map +1 -0
  724. package/dist/src/utils/language-detection.d.ts +6 -0
  725. package/dist/src/utils/language-detection.js +101 -0
  726. package/dist/src/utils/language-detection.js.map +1 -0
  727. package/dist/src/utils/llm-edit-fixer.d.ts +26 -0
  728. package/dist/src/utils/llm-edit-fixer.js +121 -0
  729. package/dist/src/utils/llm-edit-fixer.js.map +1 -0
  730. package/dist/src/utils/llm-edit-fixer.test.d.ts +6 -0
  731. package/dist/src/utils/llm-edit-fixer.test.js +105 -0
  732. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -0
  733. package/dist/src/utils/memoryDiscovery.d.ts +16 -0
  734. package/dist/src/utils/memoryDiscovery.js +254 -0
  735. package/dist/src/utils/memoryDiscovery.js.map +1 -0
  736. package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
  737. package/dist/src/utils/memoryDiscovery.test.js +244 -0
  738. package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
  739. package/dist/src/utils/memoryImportProcessor.d.ts +42 -0
  740. package/dist/src/utils/memoryImportProcessor.js +296 -0
  741. package/dist/src/utils/memoryImportProcessor.js.map +1 -0
  742. package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  743. package/dist/src/utils/memoryImportProcessor.test.js +573 -0
  744. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  745. package/dist/src/utils/messageInspectors.d.ts +8 -0
  746. package/dist/src/utils/messageInspectors.js +16 -0
  747. package/dist/src/utils/messageInspectors.js.map +1 -0
  748. package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
  749. package/dist/src/utils/nextSpeakerChecker.js +97 -0
  750. package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
  751. package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
  752. package/dist/src/utils/nextSpeakerChecker.test.js +179 -0
  753. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
  754. package/dist/src/utils/partUtils.d.ts +35 -0
  755. package/dist/src/utils/partUtils.js +133 -0
  756. package/dist/src/utils/partUtils.js.map +1 -0
  757. package/dist/src/utils/partUtils.test.d.ts +6 -0
  758. package/dist/src/utils/partUtils.test.js +241 -0
  759. package/dist/src/utils/partUtils.test.js.map +1 -0
  760. package/dist/src/utils/pathReader.d.ts +17 -0
  761. package/dist/src/utils/pathReader.js +92 -0
  762. package/dist/src/utils/pathReader.js.map +1 -0
  763. package/dist/src/utils/pathReader.test.d.ts +6 -0
  764. package/dist/src/utils/pathReader.test.js +363 -0
  765. package/dist/src/utils/pathReader.test.js.map +1 -0
  766. package/dist/src/utils/paths.d.ts +58 -0
  767. package/dist/src/utils/paths.js +159 -0
  768. package/dist/src/utils/paths.js.map +1 -0
  769. package/dist/src/utils/paths.test.d.ts +6 -0
  770. package/dist/src/utils/paths.test.js +225 -0
  771. package/dist/src/utils/paths.test.js.map +1 -0
  772. package/dist/src/utils/promptIdContext.d.ts +7 -0
  773. package/dist/src/utils/promptIdContext.js +8 -0
  774. package/dist/src/utils/promptIdContext.js.map +1 -0
  775. package/dist/src/utils/quotaErrorDetection.d.ts +18 -0
  776. package/dist/src/utils/quotaErrorDetection.js +65 -0
  777. package/dist/src/utils/quotaErrorDetection.js.map +1 -0
  778. package/dist/src/utils/retry.d.ts +30 -0
  779. package/dist/src/utils/retry.js +276 -0
  780. package/dist/src/utils/retry.js.map +1 -0
  781. package/dist/src/utils/retry.test.d.ts +6 -0
  782. package/dist/src/utils/retry.test.js +325 -0
  783. package/dist/src/utils/retry.test.js.map +1 -0
  784. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  785. package/dist/src/utils/safeJsonStringify.js +25 -0
  786. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  787. package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  788. package/dist/src/utils/safeJsonStringify.test.js +61 -0
  789. package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
  790. package/dist/src/utils/schemaValidator.d.ts +15 -0
  791. package/dist/src/utils/schemaValidator.js +38 -0
  792. package/dist/src/utils/schemaValidator.js.map +1 -0
  793. package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
  794. package/dist/src/utils/secure-browser-launcher.js +165 -0
  795. package/dist/src/utils/secure-browser-launcher.js.map +1 -0
  796. package/dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
  797. package/dist/src/utils/secure-browser-launcher.test.js +149 -0
  798. package/dist/src/utils/secure-browser-launcher.test.js.map +1 -0
  799. package/dist/src/utils/session.d.ts +6 -0
  800. package/dist/src/utils/session.js +8 -0
  801. package/dist/src/utils/session.js.map +1 -0
  802. package/dist/src/utils/shell-utils.d.ts +122 -0
  803. package/dist/src/utils/shell-utils.js +393 -0
  804. package/dist/src/utils/shell-utils.js.map +1 -0
  805. package/dist/src/utils/shell-utils.test.d.ts +6 -0
  806. package/dist/src/utils/shell-utils.test.js +332 -0
  807. package/dist/src/utils/shell-utils.test.js.map +1 -0
  808. package/dist/src/utils/summarizer.d.ts +25 -0
  809. package/dist/src/utils/summarizer.js +51 -0
  810. package/dist/src/utils/summarizer.js.map +1 -0
  811. package/dist/src/utils/summarizer.test.d.ts +6 -0
  812. package/dist/src/utils/summarizer.test.js +131 -0
  813. package/dist/src/utils/summarizer.test.js.map +1 -0
  814. package/dist/src/utils/systemEncoding.d.ts +40 -0
  815. package/dist/src/utils/systemEncoding.js +149 -0
  816. package/dist/src/utils/systemEncoding.js.map +1 -0
  817. package/dist/src/utils/systemEncoding.test.d.ts +6 -0
  818. package/dist/src/utils/systemEncoding.test.js +368 -0
  819. package/dist/src/utils/systemEncoding.test.js.map +1 -0
  820. package/dist/src/utils/terminalSerializer.d.ts +28 -0
  821. package/dist/src/utils/terminalSerializer.js +432 -0
  822. package/dist/src/utils/terminalSerializer.js.map +1 -0
  823. package/dist/src/utils/terminalSerializer.test.d.ts +6 -0
  824. package/dist/src/utils/terminalSerializer.test.js +176 -0
  825. package/dist/src/utils/terminalSerializer.test.js.map +1 -0
  826. package/dist/src/utils/testUtils.d.ts +29 -0
  827. package/dist/src/utils/testUtils.js +70 -0
  828. package/dist/src/utils/testUtils.js.map +1 -0
  829. package/dist/src/utils/textUtils.d.ts +18 -0
  830. package/dist/src/utils/textUtils.js +42 -0
  831. package/dist/src/utils/textUtils.js.map +1 -0
  832. package/dist/src/utils/textUtils.test.d.ts +6 -0
  833. package/dist/src/utils/textUtils.test.js +59 -0
  834. package/dist/src/utils/textUtils.test.js.map +1 -0
  835. package/dist/src/utils/tool-utils.d.ts +19 -0
  836. package/dist/src/utils/tool-utils.js +58 -0
  837. package/dist/src/utils/tool-utils.js.map +1 -0
  838. package/dist/src/utils/tool-utils.test.d.ts +6 -0
  839. package/dist/src/utils/tool-utils.test.js +61 -0
  840. package/dist/src/utils/tool-utils.test.js.map +1 -0
  841. package/dist/src/utils/userAccountManager.d.ts +20 -0
  842. package/dist/src/utils/userAccountManager.js +114 -0
  843. package/dist/src/utils/userAccountManager.js.map +1 -0
  844. package/dist/src/utils/userAccountManager.test.d.ts +6 -0
  845. package/dist/src/utils/userAccountManager.test.js +223 -0
  846. package/dist/src/utils/userAccountManager.test.js.map +1 -0
  847. package/dist/src/utils/workspaceContext.d.ts +66 -0
  848. package/dist/src/utils/workspaceContext.js +171 -0
  849. package/dist/src/utils/workspaceContext.js.map +1 -0
  850. package/dist/src/utils/workspaceContext.test.d.ts +6 -0
  851. package/dist/src/utils/workspaceContext.test.js +318 -0
  852. package/dist/src/utils/workspaceContext.test.js.map +1 -0
  853. package/dist/tsconfig.tsbuildinfo +1 -0
  854. package/package.json +91 -0
@@ -0,0 +1,611 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach, vi, } from 'vitest';
7
+ import { getCorrectedFileContent, WriteFileTool } from './write-file.js';
8
+ import { ToolErrorType } from './tool-error.js';
9
+ import { ToolConfirmationOutcome } from './tools.js';
10
+ import {} from './edit.js';
11
+ import { ApprovalMode } from '../config/config.js';
12
+ import path from 'node:path';
13
+ import fs from 'node:fs';
14
+ import os from 'node:os';
15
+ import { GeminiClient } from '../core/client.js';
16
+ import { ensureCorrectEdit, ensureCorrectFileContent, } from '../utils/editCorrector.js';
17
+ import { createMockWorkspaceContext } from '../test-utils/mockWorkspaceContext.js';
18
+ import { StandardFileSystemService } from '../services/fileSystemService.js';
19
+ import { IdeClient } from '../ide/ide-client.js';
20
+ const rootDir = path.resolve(os.tmpdir(), 'gemini-cli-test-root');
21
+ // --- MOCKS ---
22
+ vi.mock('../core/client.js');
23
+ vi.mock('../utils/editCorrector.js');
24
+ vi.mock('../ide/ide-client.js', () => ({
25
+ IdeClient: {
26
+ getInstance: vi.fn(),
27
+ },
28
+ }));
29
+ let mockGeminiClientInstance;
30
+ let mockBaseLlmClientInstance;
31
+ const mockEnsureCorrectEdit = vi.fn();
32
+ const mockEnsureCorrectFileContent = vi.fn();
33
+ const mockIdeClient = {
34
+ openDiff: vi.fn(),
35
+ isDiffingEnabled: vi.fn(),
36
+ };
37
+ // Wire up the mocked functions to be used by the actual module imports
38
+ vi.mocked(ensureCorrectEdit).mockImplementation(mockEnsureCorrectEdit);
39
+ vi.mocked(ensureCorrectFileContent).mockImplementation(mockEnsureCorrectFileContent);
40
+ vi.mocked(IdeClient.getInstance).mockResolvedValue(mockIdeClient);
41
+ // Mock Config
42
+ const fsService = new StandardFileSystemService();
43
+ const mockConfigInternal = {
44
+ getTargetDir: () => rootDir,
45
+ getApprovalMode: vi.fn(() => ApprovalMode.DEFAULT),
46
+ setApprovalMode: vi.fn(),
47
+ getGeminiClient: vi.fn(), // Initialize as a plain mock function
48
+ getBaseLlmClient: vi.fn(), // Initialize as a plain mock function
49
+ getFileSystemService: () => fsService,
50
+ getIdeMode: vi.fn(() => false),
51
+ getWorkspaceContext: () => createMockWorkspaceContext(rootDir),
52
+ getApiKey: () => 'test-key',
53
+ getModel: () => 'test-model',
54
+ getSandbox: () => false,
55
+ getDebugMode: () => false,
56
+ getQuestion: () => undefined,
57
+ getFullContext: () => false,
58
+ getToolDiscoveryCommand: () => undefined,
59
+ getToolCallCommand: () => undefined,
60
+ getMcpServerCommand: () => undefined,
61
+ getMcpServers: () => undefined,
62
+ getUserAgent: () => 'test-agent',
63
+ getUserMemory: () => '',
64
+ setUserMemory: vi.fn(),
65
+ getGeminiMdFileCount: () => 0,
66
+ setGeminiMdFileCount: vi.fn(),
67
+ getToolRegistry: () => ({
68
+ registerTool: vi.fn(),
69
+ discoverTools: vi.fn(),
70
+ }),
71
+ };
72
+ const mockConfig = mockConfigInternal;
73
+ vi.mock('../telemetry/loggers.js', () => ({
74
+ logFileOperation: vi.fn(),
75
+ }));
76
+ // --- END MOCKS ---
77
+ describe('WriteFileTool', () => {
78
+ let tool;
79
+ let tempDir;
80
+ beforeEach(() => {
81
+ vi.clearAllMocks();
82
+ // Create a unique temporary directory for files created outside the root
83
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'write-file-test-external-'));
84
+ // Ensure the rootDir for the tool exists
85
+ if (!fs.existsSync(rootDir)) {
86
+ fs.mkdirSync(rootDir, { recursive: true });
87
+ }
88
+ // Setup GeminiClient mock
89
+ mockGeminiClientInstance = new (vi.mocked(GeminiClient))(mockConfig);
90
+ vi.mocked(GeminiClient).mockImplementation(() => mockGeminiClientInstance);
91
+ // Setup BaseLlmClient mock
92
+ mockBaseLlmClientInstance = {
93
+ generateJson: vi.fn(),
94
+ };
95
+ vi.mocked(ensureCorrectEdit).mockImplementation(mockEnsureCorrectEdit);
96
+ vi.mocked(ensureCorrectFileContent).mockImplementation(mockEnsureCorrectFileContent);
97
+ // Now that mock instances are initialized, set the mock implementations for config getters
98
+ mockConfigInternal.getGeminiClient.mockReturnValue(mockGeminiClientInstance);
99
+ mockConfigInternal.getBaseLlmClient.mockReturnValue(mockBaseLlmClientInstance);
100
+ tool = new WriteFileTool(mockConfig);
101
+ // Reset mocks before each test
102
+ mockConfigInternal.getApprovalMode.mockReturnValue(ApprovalMode.DEFAULT);
103
+ mockConfigInternal.setApprovalMode.mockClear();
104
+ mockEnsureCorrectEdit.mockReset();
105
+ mockEnsureCorrectFileContent.mockReset();
106
+ // Default mock implementations that return valid structures
107
+ mockEnsureCorrectEdit.mockImplementation(async (filePath, _currentContent, params, _client, _baseClient, signal) => {
108
+ if (signal?.aborted) {
109
+ return Promise.reject(new Error('Aborted'));
110
+ }
111
+ return Promise.resolve({
112
+ params: { ...params, new_string: params.new_string ?? '' },
113
+ occurrences: 1,
114
+ });
115
+ });
116
+ mockEnsureCorrectFileContent.mockImplementation(async (content, _baseClient, signal) => {
117
+ if (signal?.aborted) {
118
+ return Promise.reject(new Error('Aborted'));
119
+ }
120
+ return Promise.resolve(content ?? '');
121
+ });
122
+ });
123
+ afterEach(() => {
124
+ // Clean up the temporary directories
125
+ if (fs.existsSync(tempDir)) {
126
+ fs.rmSync(tempDir, { recursive: true, force: true });
127
+ }
128
+ if (fs.existsSync(rootDir)) {
129
+ fs.rmSync(rootDir, { recursive: true, force: true });
130
+ }
131
+ vi.clearAllMocks();
132
+ });
133
+ describe('build', () => {
134
+ it('should return an invocation for a valid absolute path within root', () => {
135
+ const params = {
136
+ file_path: path.join(rootDir, 'test.txt'),
137
+ content: 'hello',
138
+ };
139
+ const invocation = tool.build(params);
140
+ expect(invocation).toBeDefined();
141
+ expect(invocation.params).toEqual(params);
142
+ });
143
+ it('should throw an error for a relative path', () => {
144
+ const params = { file_path: 'test.txt', content: 'hello' };
145
+ expect(() => tool.build(params)).toThrow(/File path must be absolute/);
146
+ });
147
+ it('should throw an error for a path outside root', () => {
148
+ const outsidePath = path.resolve(tempDir, 'outside-root.txt');
149
+ const params = {
150
+ file_path: outsidePath,
151
+ content: 'hello',
152
+ };
153
+ expect(() => tool.build(params)).toThrow(/File path must be within one of the workspace directories/);
154
+ });
155
+ it('should throw an error if path is a directory', () => {
156
+ const dirAsFilePath = path.join(rootDir, 'a_directory');
157
+ fs.mkdirSync(dirAsFilePath);
158
+ const params = {
159
+ file_path: dirAsFilePath,
160
+ content: 'hello',
161
+ };
162
+ expect(() => tool.build(params)).toThrow(`Path is a directory, not a file: ${dirAsFilePath}`);
163
+ });
164
+ it('should throw an error if the content is null', () => {
165
+ const dirAsFilePath = path.join(rootDir, 'a_directory');
166
+ fs.mkdirSync(dirAsFilePath);
167
+ const params = {
168
+ file_path: dirAsFilePath,
169
+ content: null,
170
+ }; // Intentionally non-conforming
171
+ expect(() => tool.build(params)).toThrow('params/content must be string');
172
+ });
173
+ it('should throw error if the file_path is empty', () => {
174
+ const dirAsFilePath = path.join(rootDir, 'a_directory');
175
+ fs.mkdirSync(dirAsFilePath);
176
+ const params = {
177
+ file_path: '',
178
+ content: '',
179
+ };
180
+ expect(() => tool.build(params)).toThrow(`Missing or empty "file_path"`);
181
+ });
182
+ });
183
+ describe('getCorrectedFileContent', () => {
184
+ it('should call ensureCorrectFileContent for a new file', async () => {
185
+ const filePath = path.join(rootDir, 'new_corrected_file.txt');
186
+ const proposedContent = 'Proposed new content.';
187
+ const correctedContent = 'Corrected new content.';
188
+ const abortSignal = new AbortController().signal;
189
+ // Ensure the mock is set for this specific test case if needed, or rely on beforeEach
190
+ mockEnsureCorrectFileContent.mockResolvedValue(correctedContent);
191
+ const result = await getCorrectedFileContent(mockConfig, filePath, proposedContent, abortSignal);
192
+ expect(mockEnsureCorrectFileContent).toHaveBeenCalledWith(proposedContent, mockBaseLlmClientInstance, abortSignal);
193
+ expect(mockEnsureCorrectEdit).not.toHaveBeenCalled();
194
+ expect(result.correctedContent).toBe(correctedContent);
195
+ expect(result.originalContent).toBe('');
196
+ expect(result.fileExists).toBe(false);
197
+ expect(result.error).toBeUndefined();
198
+ });
199
+ it('should call ensureCorrectEdit for an existing file', async () => {
200
+ const filePath = path.join(rootDir, 'existing_corrected_file.txt');
201
+ const originalContent = 'Original existing content.';
202
+ const proposedContent = 'Proposed replacement content.';
203
+ const correctedProposedContent = 'Corrected replacement content.';
204
+ const abortSignal = new AbortController().signal;
205
+ fs.writeFileSync(filePath, originalContent, 'utf8');
206
+ // Ensure this mock is active and returns the correct structure
207
+ mockEnsureCorrectEdit.mockResolvedValue({
208
+ params: {
209
+ file_path: filePath,
210
+ old_string: originalContent,
211
+ new_string: correctedProposedContent,
212
+ },
213
+ occurrences: 1,
214
+ });
215
+ const result = await getCorrectedFileContent(mockConfig, filePath, proposedContent, abortSignal);
216
+ expect(mockEnsureCorrectEdit).toHaveBeenCalledWith(filePath, originalContent, {
217
+ old_string: originalContent,
218
+ new_string: proposedContent,
219
+ file_path: filePath,
220
+ }, mockGeminiClientInstance, mockBaseLlmClientInstance, abortSignal);
221
+ expect(mockEnsureCorrectFileContent).not.toHaveBeenCalled();
222
+ expect(result.correctedContent).toBe(correctedProposedContent);
223
+ expect(result.originalContent).toBe(originalContent);
224
+ expect(result.fileExists).toBe(true);
225
+ expect(result.error).toBeUndefined();
226
+ });
227
+ it('should return error if reading an existing file fails (e.g. permissions)', async () => {
228
+ const filePath = path.join(rootDir, 'unreadable_file.txt');
229
+ const proposedContent = 'some content';
230
+ const abortSignal = new AbortController().signal;
231
+ fs.writeFileSync(filePath, 'content', { mode: 0o000 });
232
+ const readError = new Error('Permission denied');
233
+ vi.spyOn(fsService, 'readTextFile').mockImplementationOnce(() => Promise.reject(readError));
234
+ const result = await getCorrectedFileContent(mockConfig, filePath, proposedContent, abortSignal);
235
+ expect(fsService.readTextFile).toHaveBeenCalledWith(filePath);
236
+ expect(mockEnsureCorrectEdit).not.toHaveBeenCalled();
237
+ expect(mockEnsureCorrectFileContent).not.toHaveBeenCalled();
238
+ expect(result.correctedContent).toBe(proposedContent);
239
+ expect(result.originalContent).toBe('');
240
+ expect(result.fileExists).toBe(true);
241
+ expect(result.error).toEqual({
242
+ message: 'Permission denied',
243
+ code: undefined,
244
+ });
245
+ fs.chmodSync(filePath, 0o600);
246
+ });
247
+ });
248
+ describe('shouldConfirmExecute', () => {
249
+ const abortSignal = new AbortController().signal;
250
+ it('should return false if _getCorrectedFileContent returns an error', async () => {
251
+ const filePath = path.join(rootDir, 'confirm_error_file.txt');
252
+ const params = { file_path: filePath, content: 'test content' };
253
+ fs.writeFileSync(filePath, 'original', { mode: 0o000 });
254
+ const readError = new Error('Simulated read error for confirmation');
255
+ vi.spyOn(fsService, 'readTextFile').mockImplementationOnce(() => Promise.reject(readError));
256
+ const invocation = tool.build(params);
257
+ const confirmation = await invocation.shouldConfirmExecute(abortSignal);
258
+ expect(confirmation).toBe(false);
259
+ fs.chmodSync(filePath, 0o600);
260
+ });
261
+ it('should request confirmation with diff for a new file (with corrected content)', async () => {
262
+ const filePath = path.join(rootDir, 'confirm_new_file.txt');
263
+ const proposedContent = 'Proposed new content for confirmation.';
264
+ const correctedContent = 'Corrected new content for confirmation.';
265
+ mockEnsureCorrectFileContent.mockResolvedValue(correctedContent); // Ensure this mock is active
266
+ const params = { file_path: filePath, content: proposedContent };
267
+ const invocation = tool.build(params);
268
+ const confirmation = (await invocation.shouldConfirmExecute(abortSignal));
269
+ expect(mockEnsureCorrectFileContent).toHaveBeenCalledWith(proposedContent, mockBaseLlmClientInstance, abortSignal);
270
+ expect(confirmation).toEqual(expect.objectContaining({
271
+ title: `Confirm Write: ${path.basename(filePath)}`,
272
+ fileName: 'confirm_new_file.txt',
273
+ fileDiff: expect.stringContaining(correctedContent),
274
+ }));
275
+ expect(confirmation.fileDiff).toMatch(/--- confirm_new_file.txt\tCurrent/);
276
+ expect(confirmation.fileDiff).toMatch(/\+\+\+ confirm_new_file.txt\tProposed/);
277
+ });
278
+ it('should request confirmation with diff for an existing file (with corrected content)', async () => {
279
+ const filePath = path.join(rootDir, 'confirm_existing_file.txt');
280
+ const originalContent = 'Original content for confirmation.';
281
+ const proposedContent = 'Proposed replacement for confirmation.';
282
+ const correctedProposedContent = 'Corrected replacement for confirmation.';
283
+ fs.writeFileSync(filePath, originalContent, 'utf8');
284
+ mockEnsureCorrectEdit.mockResolvedValue({
285
+ params: {
286
+ file_path: filePath,
287
+ old_string: originalContent,
288
+ new_string: correctedProposedContent,
289
+ },
290
+ occurrences: 1,
291
+ });
292
+ const params = { file_path: filePath, content: proposedContent };
293
+ const invocation = tool.build(params);
294
+ const confirmation = (await invocation.shouldConfirmExecute(abortSignal));
295
+ expect(mockEnsureCorrectEdit).toHaveBeenCalledWith(filePath, originalContent, {
296
+ old_string: originalContent,
297
+ new_string: proposedContent,
298
+ file_path: filePath,
299
+ }, mockGeminiClientInstance, mockBaseLlmClientInstance, abortSignal);
300
+ expect(confirmation).toEqual(expect.objectContaining({
301
+ title: `Confirm Write: ${path.basename(filePath)}`,
302
+ fileName: 'confirm_existing_file.txt',
303
+ fileDiff: expect.stringContaining(correctedProposedContent),
304
+ }));
305
+ expect(confirmation.fileDiff).toMatch(originalContent.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&'));
306
+ });
307
+ describe('with IDE integration', () => {
308
+ beforeEach(() => {
309
+ // Enable IDE mode and set connection status for these tests
310
+ mockConfigInternal.getIdeMode.mockReturnValue(true);
311
+ mockIdeClient.isDiffingEnabled.mockReturnValue(true);
312
+ mockIdeClient.openDiff.mockResolvedValue({
313
+ status: 'accepted',
314
+ content: 'ide-modified-content',
315
+ });
316
+ });
317
+ it('should call openDiff and await it when in IDE mode and connected', async () => {
318
+ const filePath = path.join(rootDir, 'ide_confirm_file.txt');
319
+ const params = { file_path: filePath, content: 'test' };
320
+ const invocation = tool.build(params);
321
+ const confirmation = (await invocation.shouldConfirmExecute(abortSignal));
322
+ expect(mockIdeClient.openDiff).toHaveBeenCalledWith(filePath, 'test');
323
+ // Ensure the promise is awaited by checking the result
324
+ expect(confirmation.ideConfirmation).toBeDefined();
325
+ await confirmation.ideConfirmation; // Should resolve
326
+ });
327
+ it('should not call openDiff if not in IDE mode', async () => {
328
+ mockConfigInternal.getIdeMode.mockReturnValue(false);
329
+ const filePath = path.join(rootDir, 'ide_disabled_file.txt');
330
+ const params = { file_path: filePath, content: 'test' };
331
+ const invocation = tool.build(params);
332
+ await invocation.shouldConfirmExecute(abortSignal);
333
+ expect(mockIdeClient.openDiff).not.toHaveBeenCalled();
334
+ });
335
+ it('should not call openDiff if IDE is not connected', async () => {
336
+ mockIdeClient.isDiffingEnabled.mockReturnValue(false);
337
+ const filePath = path.join(rootDir, 'ide_disconnected_file.txt');
338
+ const params = { file_path: filePath, content: 'test' };
339
+ const invocation = tool.build(params);
340
+ await invocation.shouldConfirmExecute(abortSignal);
341
+ expect(mockIdeClient.openDiff).not.toHaveBeenCalled();
342
+ });
343
+ it('should update params.content with IDE content when onConfirm is called', async () => {
344
+ const filePath = path.join(rootDir, 'ide_onconfirm_file.txt');
345
+ const params = { file_path: filePath, content: 'original-content' };
346
+ const invocation = tool.build(params);
347
+ // This is the key part: get the confirmation details
348
+ const confirmation = (await invocation.shouldConfirmExecute(abortSignal));
349
+ // The `onConfirm` function should exist on the details object
350
+ expect(confirmation.onConfirm).toBeDefined();
351
+ // Call `onConfirm` to trigger the logic that updates the content
352
+ await confirmation.onConfirm(ToolConfirmationOutcome.ProceedOnce);
353
+ // Now, check if the original `params` object (captured by the invocation) was modified
354
+ expect(invocation.params.content).toBe('ide-modified-content');
355
+ });
356
+ it('should not await ideConfirmation promise', async () => {
357
+ const filePath = path.join(rootDir, 'ide_no_await_file.txt');
358
+ const params = { file_path: filePath, content: 'test' };
359
+ const invocation = tool.build(params);
360
+ let diffPromiseResolved = false;
361
+ const diffPromise = new Promise((resolve) => {
362
+ setTimeout(() => {
363
+ diffPromiseResolved = true;
364
+ resolve({ status: 'accepted', content: 'ide-modified-content' });
365
+ }, 50); // A small delay to ensure the check happens before resolution
366
+ });
367
+ mockIdeClient.openDiff.mockReturnValue(diffPromise);
368
+ const confirmation = (await invocation.shouldConfirmExecute(abortSignal));
369
+ // This is the key check: the confirmation details should be returned
370
+ // *before* the diffPromise is resolved.
371
+ expect(diffPromiseResolved).toBe(false);
372
+ expect(confirmation).toBeDefined();
373
+ expect(confirmation.ideConfirmation).toBe(diffPromise);
374
+ // Now, we can await the promise to let the test finish cleanly.
375
+ await diffPromise;
376
+ expect(diffPromiseResolved).toBe(true);
377
+ });
378
+ });
379
+ });
380
+ describe('execute', () => {
381
+ const abortSignal = new AbortController().signal;
382
+ it('should return error if _getCorrectedFileContent returns an error during execute', async () => {
383
+ const filePath = path.join(rootDir, 'execute_error_file.txt');
384
+ const params = { file_path: filePath, content: 'test content' };
385
+ fs.writeFileSync(filePath, 'original', { mode: 0o000 });
386
+ vi.spyOn(fsService, 'readTextFile').mockImplementationOnce(() => {
387
+ const readError = new Error('Simulated read error for execute');
388
+ return Promise.reject(readError);
389
+ });
390
+ const invocation = tool.build(params);
391
+ const result = await invocation.execute(abortSignal);
392
+ expect(result.llmContent).toContain('Error checking existing file');
393
+ expect(result.returnDisplay).toMatch(/Error checking existing file: Simulated read error for execute/);
394
+ expect(result.error).toEqual({
395
+ message: 'Error checking existing file: Simulated read error for execute',
396
+ type: ToolErrorType.FILE_WRITE_FAILURE,
397
+ });
398
+ fs.chmodSync(filePath, 0o600);
399
+ });
400
+ it('should write a new file with corrected content and return diff', async () => {
401
+ const filePath = path.join(rootDir, 'execute_new_corrected_file.txt');
402
+ const proposedContent = 'Proposed new content for execute.';
403
+ const correctedContent = 'Corrected new content for execute.';
404
+ mockEnsureCorrectFileContent.mockResolvedValue(correctedContent);
405
+ const params = { file_path: filePath, content: proposedContent };
406
+ const invocation = tool.build(params);
407
+ const confirmDetails = await invocation.shouldConfirmExecute(abortSignal);
408
+ if (typeof confirmDetails === 'object' &&
409
+ 'onConfirm' in confirmDetails &&
410
+ confirmDetails.onConfirm) {
411
+ await confirmDetails.onConfirm(ToolConfirmationOutcome.ProceedOnce);
412
+ }
413
+ const result = await invocation.execute(abortSignal);
414
+ expect(mockEnsureCorrectFileContent).toHaveBeenCalledWith(proposedContent, mockBaseLlmClientInstance, abortSignal);
415
+ expect(result.llmContent).toMatch(/Successfully created and wrote to new file/);
416
+ expect(fs.existsSync(filePath)).toBe(true);
417
+ const writtenContent = await fsService.readTextFile(filePath);
418
+ expect(writtenContent).toBe(correctedContent);
419
+ const display = result.returnDisplay;
420
+ expect(display.fileName).toBe('execute_new_corrected_file.txt');
421
+ expect(display.fileDiff).toMatch(/--- execute_new_corrected_file.txt\tOriginal/);
422
+ expect(display.fileDiff).toMatch(/\+\+\+ execute_new_corrected_file.txt\tWritten/);
423
+ expect(display.fileDiff).toMatch(correctedContent.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&'));
424
+ });
425
+ it('should overwrite an existing file with corrected content and return diff', async () => {
426
+ const filePath = path.join(rootDir, 'execute_existing_corrected_file.txt');
427
+ const initialContent = 'Initial content for execute.';
428
+ const proposedContent = 'Proposed overwrite for execute.';
429
+ const correctedProposedContent = 'Corrected overwrite for execute.';
430
+ fs.writeFileSync(filePath, initialContent, 'utf8');
431
+ mockEnsureCorrectEdit.mockResolvedValue({
432
+ params: {
433
+ file_path: filePath,
434
+ old_string: initialContent,
435
+ new_string: correctedProposedContent,
436
+ },
437
+ occurrences: 1,
438
+ });
439
+ const params = { file_path: filePath, content: proposedContent };
440
+ const invocation = tool.build(params);
441
+ const confirmDetails = await invocation.shouldConfirmExecute(abortSignal);
442
+ if (typeof confirmDetails === 'object' &&
443
+ 'onConfirm' in confirmDetails &&
444
+ confirmDetails.onConfirm) {
445
+ await confirmDetails.onConfirm(ToolConfirmationOutcome.ProceedOnce);
446
+ }
447
+ const result = await invocation.execute(abortSignal);
448
+ expect(mockEnsureCorrectEdit).toHaveBeenCalledWith(filePath, initialContent, {
449
+ old_string: initialContent,
450
+ new_string: proposedContent,
451
+ file_path: filePath,
452
+ }, mockGeminiClientInstance, mockBaseLlmClientInstance, abortSignal);
453
+ expect(result.llmContent).toMatch(/Successfully overwrote file/);
454
+ const writtenContent = await fsService.readTextFile(filePath);
455
+ expect(writtenContent).toBe(correctedProposedContent);
456
+ const display = result.returnDisplay;
457
+ expect(display.fileName).toBe('execute_existing_corrected_file.txt');
458
+ expect(display.fileDiff).toMatch(initialContent.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&'));
459
+ expect(display.fileDiff).toMatch(correctedProposedContent.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&'));
460
+ });
461
+ it('should create directory if it does not exist', async () => {
462
+ const dirPath = path.join(rootDir, 'new_dir_for_write');
463
+ const filePath = path.join(dirPath, 'file_in_new_dir.txt');
464
+ const content = 'Content in new directory';
465
+ mockEnsureCorrectFileContent.mockResolvedValue(content); // Ensure this mock is active
466
+ const params = { file_path: filePath, content };
467
+ const invocation = tool.build(params);
468
+ // Simulate confirmation if your logic requires it before execute, or remove if not needed for this path
469
+ const confirmDetails = await invocation.shouldConfirmExecute(abortSignal);
470
+ if (typeof confirmDetails === 'object' &&
471
+ 'onConfirm' in confirmDetails &&
472
+ confirmDetails.onConfirm) {
473
+ await confirmDetails.onConfirm(ToolConfirmationOutcome.ProceedOnce);
474
+ }
475
+ await invocation.execute(abortSignal);
476
+ expect(fs.existsSync(dirPath)).toBe(true);
477
+ expect(fs.statSync(dirPath).isDirectory()).toBe(true);
478
+ expect(fs.existsSync(filePath)).toBe(true);
479
+ expect(fs.readFileSync(filePath, 'utf8')).toBe(content);
480
+ });
481
+ it('should include modification message when proposed content is modified', async () => {
482
+ const filePath = path.join(rootDir, 'new_file_modified.txt');
483
+ const content = 'New file content modified by user';
484
+ mockEnsureCorrectFileContent.mockResolvedValue(content);
485
+ const params = {
486
+ file_path: filePath,
487
+ content,
488
+ modified_by_user: true,
489
+ };
490
+ const invocation = tool.build(params);
491
+ const result = await invocation.execute(abortSignal);
492
+ expect(result.llmContent).toMatch(/User modified the `content`/);
493
+ });
494
+ it('should not include modification message when proposed content is not modified', async () => {
495
+ const filePath = path.join(rootDir, 'new_file_unmodified.txt');
496
+ const content = 'New file content not modified';
497
+ mockEnsureCorrectFileContent.mockResolvedValue(content);
498
+ const params = {
499
+ file_path: filePath,
500
+ content,
501
+ modified_by_user: false,
502
+ };
503
+ const invocation = tool.build(params);
504
+ const result = await invocation.execute(abortSignal);
505
+ expect(result.llmContent).not.toMatch(/User modified the `content`/);
506
+ });
507
+ it('should not include modification message when modified_by_user is not provided', async () => {
508
+ const filePath = path.join(rootDir, 'new_file_unmodified.txt');
509
+ const content = 'New file content not modified';
510
+ mockEnsureCorrectFileContent.mockResolvedValue(content);
511
+ const params = {
512
+ file_path: filePath,
513
+ content,
514
+ };
515
+ const invocation = tool.build(params);
516
+ const result = await invocation.execute(abortSignal);
517
+ expect(result.llmContent).not.toMatch(/User modified the `content`/);
518
+ });
519
+ });
520
+ describe('workspace boundary validation', () => {
521
+ it('should validate paths are within workspace root', () => {
522
+ const params = {
523
+ file_path: path.join(rootDir, 'file.txt'),
524
+ content: 'test content',
525
+ };
526
+ expect(() => tool.build(params)).not.toThrow();
527
+ });
528
+ it('should reject paths outside workspace root', () => {
529
+ const params = {
530
+ file_path: '/etc/passwd',
531
+ content: 'malicious',
532
+ };
533
+ expect(() => tool.build(params)).toThrow(/File path must be within one of the workspace directories/);
534
+ });
535
+ });
536
+ describe('specific error types for write failures', () => {
537
+ const abortSignal = new AbortController().signal;
538
+ it('should return PERMISSION_DENIED error when write fails with EACCES', async () => {
539
+ const filePath = path.join(rootDir, 'permission_denied_file.txt');
540
+ const content = 'test content';
541
+ // Mock FileSystemService writeTextFile to throw EACCES error
542
+ vi.spyOn(fsService, 'writeTextFile').mockImplementationOnce(() => {
543
+ const error = new Error('Permission denied');
544
+ error.code = 'EACCES';
545
+ return Promise.reject(error);
546
+ });
547
+ const params = { file_path: filePath, content };
548
+ const invocation = tool.build(params);
549
+ const result = await invocation.execute(abortSignal);
550
+ expect(result.error?.type).toBe(ToolErrorType.PERMISSION_DENIED);
551
+ expect(result.llmContent).toContain(`Permission denied writing to file: ${filePath} (EACCES)`);
552
+ expect(result.returnDisplay).toContain(`Permission denied writing to file: ${filePath} (EACCES)`);
553
+ });
554
+ it('should return NO_SPACE_LEFT error when write fails with ENOSPC', async () => {
555
+ const filePath = path.join(rootDir, 'no_space_file.txt');
556
+ const content = 'test content';
557
+ // Mock FileSystemService writeTextFile to throw ENOSPC error
558
+ vi.spyOn(fsService, 'writeTextFile').mockImplementationOnce(() => {
559
+ const error = new Error('No space left on device');
560
+ error.code = 'ENOSPC';
561
+ return Promise.reject(error);
562
+ });
563
+ const params = { file_path: filePath, content };
564
+ const invocation = tool.build(params);
565
+ const result = await invocation.execute(abortSignal);
566
+ expect(result.error?.type).toBe(ToolErrorType.NO_SPACE_LEFT);
567
+ expect(result.llmContent).toContain(`No space left on device: ${filePath} (ENOSPC)`);
568
+ expect(result.returnDisplay).toContain(`No space left on device: ${filePath} (ENOSPC)`);
569
+ });
570
+ it('should return TARGET_IS_DIRECTORY error when write fails with EISDIR', async () => {
571
+ const dirPath = path.join(rootDir, 'test_directory');
572
+ const content = 'test content';
573
+ // Mock fs.existsSync to return false to bypass validation
574
+ const originalExistsSync = fs.existsSync;
575
+ vi.spyOn(fs, 'existsSync').mockImplementation((path) => {
576
+ if (path === dirPath) {
577
+ return false; // Pretend directory doesn't exist to bypass validation
578
+ }
579
+ return originalExistsSync(path);
580
+ });
581
+ // Mock FileSystemService writeTextFile to throw EISDIR error
582
+ vi.spyOn(fsService, 'writeTextFile').mockImplementationOnce(() => {
583
+ const error = new Error('Is a directory');
584
+ error.code = 'EISDIR';
585
+ return Promise.reject(error);
586
+ });
587
+ const params = { file_path: dirPath, content };
588
+ const invocation = tool.build(params);
589
+ const result = await invocation.execute(abortSignal);
590
+ expect(result.error?.type).toBe(ToolErrorType.TARGET_IS_DIRECTORY);
591
+ expect(result.llmContent).toContain(`Target is a directory, not a file: ${dirPath} (EISDIR)`);
592
+ expect(result.returnDisplay).toContain(`Target is a directory, not a file: ${dirPath} (EISDIR)`);
593
+ vi.spyOn(fs, 'existsSync').mockImplementation(originalExistsSync);
594
+ });
595
+ it('should return FILE_WRITE_FAILURE for generic write errors', async () => {
596
+ const filePath = path.join(rootDir, 'generic_error_file.txt');
597
+ const content = 'test content';
598
+ // Ensure fs.existsSync is not mocked for this test
599
+ vi.restoreAllMocks();
600
+ // Mock FileSystemService writeTextFile to throw generic error
601
+ vi.spyOn(fsService, 'writeTextFile').mockImplementationOnce(() => Promise.reject(new Error('Generic write error')));
602
+ const params = { file_path: filePath, content };
603
+ const invocation = tool.build(params);
604
+ const result = await invocation.execute(abortSignal);
605
+ expect(result.error?.type).toBe(ToolErrorType.FILE_WRITE_FAILURE);
606
+ expect(result.llmContent).toContain('Error writing to file: Generic write error');
607
+ expect(result.returnDisplay).toContain('Error writing to file: Generic write error');
608
+ });
609
+ });
610
+ });
611
+ //# sourceMappingURL=write-file.test.js.map