@google/gemini-cli-core 0.1.0-development.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 (365) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +156 -0
  3. package/dist/.last_build +0 -0
  4. package/dist/index.d.ts +7 -0
  5. package/dist/index.js +8 -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 +8 -0
  11. package/dist/src/code_assist/codeAssist.js +19 -0
  12. package/dist/src/code_assist/codeAssist.js.map +1 -0
  13. package/dist/src/code_assist/converter.d.ts +68 -0
  14. package/dist/src/code_assist/converter.js +125 -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 +229 -0
  18. package/dist/src/code_assist/converter.test.js.map +1 -0
  19. package/dist/src/code_assist/oauth2.d.ts +26 -0
  20. package/dist/src/code_assist/oauth2.js +277 -0
  21. package/dist/src/code_assist/oauth2.js.map +1 -0
  22. package/dist/src/code_assist/oauth2.test.d.ts +6 -0
  23. package/dist/src/code_assist/oauth2.test.js +195 -0
  24. package/dist/src/code_assist/oauth2.test.js.map +1 -0
  25. package/dist/src/code_assist/server.d.ts +35 -0
  26. package/dist/src/code_assist/server.js +123 -0
  27. package/dist/src/code_assist/server.js.map +1 -0
  28. package/dist/src/code_assist/server.test.d.ts +6 -0
  29. package/dist/src/code_assist/server.test.js +123 -0
  30. package/dist/src/code_assist/server.test.js.map +1 -0
  31. package/dist/src/code_assist/setup.d.ts +15 -0
  32. package/dist/src/code_assist/setup.js +67 -0
  33. package/dist/src/code_assist/setup.js.map +1 -0
  34. package/dist/src/code_assist/types.d.ts +148 -0
  35. package/dist/src/code_assist/types.js +46 -0
  36. package/dist/src/code_assist/types.js.map +1 -0
  37. package/dist/src/config/config.d.ts +175 -0
  38. package/dist/src/config/config.js +385 -0
  39. package/dist/src/config/config.js.map +1 -0
  40. package/dist/src/config/config.test.d.ts +6 -0
  41. package/dist/src/config/config.test.js +263 -0
  42. package/dist/src/config/config.test.js.map +1 -0
  43. package/dist/src/config/flashFallback.test.d.ts +6 -0
  44. package/dist/src/config/flashFallback.test.js +115 -0
  45. package/dist/src/config/flashFallback.test.js.map +1 -0
  46. package/dist/src/config/models.d.ts +8 -0
  47. package/dist/src/config/models.js +9 -0
  48. package/dist/src/config/models.js.map +1 -0
  49. package/dist/src/core/client.d.ts +39 -0
  50. package/dist/src/core/client.js +386 -0
  51. package/dist/src/core/client.js.map +1 -0
  52. package/dist/src/core/client.test.d.ts +6 -0
  53. package/dist/src/core/client.test.js +630 -0
  54. package/dist/src/core/client.test.js.map +1 -0
  55. package/dist/src/core/contentGenerator.d.ts +29 -0
  56. package/dist/src/core/contentGenerator.js +71 -0
  57. package/dist/src/core/contentGenerator.js.map +1 -0
  58. package/dist/src/core/contentGenerator.test.d.ts +6 -0
  59. package/dist/src/core/contentGenerator.test.js +45 -0
  60. package/dist/src/core/contentGenerator.test.js.map +1 -0
  61. package/dist/src/core/coreToolScheduler.d.ts +104 -0
  62. package/dist/src/core/coreToolScheduler.js +397 -0
  63. package/dist/src/core/coreToolScheduler.js.map +1 -0
  64. package/dist/src/core/coreToolScheduler.test.d.ts +6 -0
  65. package/dist/src/core/coreToolScheduler.test.js +318 -0
  66. package/dist/src/core/coreToolScheduler.test.js.map +1 -0
  67. package/dist/src/core/geminiChat.d.ts +116 -0
  68. package/dist/src/core/geminiChat.js +491 -0
  69. package/dist/src/core/geminiChat.js.map +1 -0
  70. package/dist/src/core/geminiChat.test.d.ts +6 -0
  71. package/dist/src/core/geminiChat.test.js +422 -0
  72. package/dist/src/core/geminiChat.test.js.map +1 -0
  73. package/dist/src/core/geminiRequest.d.ts +13 -0
  74. package/dist/src/core/geminiRequest.js +45 -0
  75. package/dist/src/core/geminiRequest.js.map +1 -0
  76. package/dist/src/core/geminiRequest.test.d.ts +6 -0
  77. package/dist/src/core/geminiRequest.test.js +72 -0
  78. package/dist/src/core/geminiRequest.test.js.map +1 -0
  79. package/dist/src/core/logger.d.ts +35 -0
  80. package/dist/src/core/logger.js +235 -0
  81. package/dist/src/core/logger.js.map +1 -0
  82. package/dist/src/core/logger.test.d.ts +6 -0
  83. package/dist/src/core/logger.test.js +387 -0
  84. package/dist/src/core/logger.test.js.map +1 -0
  85. package/dist/src/core/modelCheck.d.ts +14 -0
  86. package/dist/src/core/modelCheck.js +55 -0
  87. package/dist/src/core/modelCheck.js.map +1 -0
  88. package/dist/src/core/nonInteractiveToolExecutor.d.ts +12 -0
  89. package/dist/src/core/nonInteractiveToolExecutor.js +92 -0
  90. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
  91. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
  92. package/dist/src/core/nonInteractiveToolExecutor.test.js +181 -0
  93. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
  94. package/dist/src/core/prompts.d.ts +12 -0
  95. package/dist/src/core/prompts.js +334 -0
  96. package/dist/src/core/prompts.js.map +1 -0
  97. package/dist/src/core/prompts.test.d.ts +6 -0
  98. package/dist/src/core/prompts.test.js +97 -0
  99. package/dist/src/core/prompts.test.js.map +1 -0
  100. package/dist/src/core/tokenLimits.d.ts +10 -0
  101. package/dist/src/core/tokenLimits.js +27 -0
  102. package/dist/src/core/tokenLimits.js.map +1 -0
  103. package/dist/src/core/turn.d.ts +96 -0
  104. package/dist/src/core/turn.js +125 -0
  105. package/dist/src/core/turn.js.map +1 -0
  106. package/dist/src/core/turn.test.d.ts +6 -0
  107. package/dist/src/core/turn.test.js +236 -0
  108. package/dist/src/core/turn.test.js.map +1 -0
  109. package/dist/src/index.d.ts +46 -0
  110. package/dist/src/index.js +54 -0
  111. package/dist/src/index.js.map +1 -0
  112. package/dist/src/index.test.d.ts +6 -0
  113. package/dist/src/index.test.js +12 -0
  114. package/dist/src/index.test.js.map +1 -0
  115. package/dist/src/services/fileDiscoveryService.d.ts +35 -0
  116. package/dist/src/services/fileDiscoveryService.js +91 -0
  117. package/dist/src/services/fileDiscoveryService.js.map +1 -0
  118. package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
  119. package/dist/src/services/fileDiscoveryService.test.js +102 -0
  120. package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
  121. package/dist/src/services/gitService.d.ts +21 -0
  122. package/dist/src/services/gitService.js +105 -0
  123. package/dist/src/services/gitService.js.map +1 -0
  124. package/dist/src/services/gitService.test.d.ts +6 -0
  125. package/dist/src/services/gitService.test.js +233 -0
  126. package/dist/src/services/gitService.test.js.map +1 -0
  127. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +33 -0
  128. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +364 -0
  129. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
  130. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +43 -0
  131. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +109 -0
  132. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
  133. package/dist/src/telemetry/constants.d.ts +19 -0
  134. package/dist/src/telemetry/constants.js +20 -0
  135. package/dist/src/telemetry/constants.js.map +1 -0
  136. package/dist/src/telemetry/index.d.ts +18 -0
  137. package/dist/src/telemetry/index.js +20 -0
  138. package/dist/src/telemetry/index.js.map +1 -0
  139. package/dist/src/telemetry/loggers.d.ts +13 -0
  140. package/dist/src/telemetry/loggers.js +187 -0
  141. package/dist/src/telemetry/loggers.js.map +1 -0
  142. package/dist/src/telemetry/loggers.test.d.ts +6 -0
  143. package/dist/src/telemetry/loggers.test.js +525 -0
  144. package/dist/src/telemetry/loggers.test.js.map +1 -0
  145. package/dist/src/telemetry/metrics.d.ts +19 -0
  146. package/dist/src/telemetry/metrics.js +144 -0
  147. package/dist/src/telemetry/metrics.js.map +1 -0
  148. package/dist/src/telemetry/metrics.test.d.ts +6 -0
  149. package/dist/src/telemetry/metrics.test.js +162 -0
  150. package/dist/src/telemetry/metrics.test.js.map +1 -0
  151. package/dist/src/telemetry/sdk.d.ts +9 -0
  152. package/dist/src/telemetry/sdk.js +116 -0
  153. package/dist/src/telemetry/sdk.js.map +1 -0
  154. package/dist/src/telemetry/telemetry.test.d.ts +6 -0
  155. package/dist/src/telemetry/telemetry.test.js +50 -0
  156. package/dist/src/telemetry/telemetry.test.js.map +1 -0
  157. package/dist/src/telemetry/types.d.ts +91 -0
  158. package/dist/src/telemetry/types.js +176 -0
  159. package/dist/src/telemetry/types.js.map +1 -0
  160. package/dist/src/telemetry/uiTelemetry.d.ts +67 -0
  161. package/dist/src/telemetry/uiTelemetry.js +131 -0
  162. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  163. package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  164. package/dist/src/telemetry/uiTelemetry.test.js +411 -0
  165. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  166. package/dist/src/tools/diffOptions.d.ts +7 -0
  167. package/dist/src/tools/diffOptions.js +10 -0
  168. package/dist/src/tools/diffOptions.js.map +1 -0
  169. package/dist/src/tools/edit.d.ts +84 -0
  170. package/dist/src/tools/edit.js +359 -0
  171. package/dist/src/tools/edit.js.map +1 -0
  172. package/dist/src/tools/edit.test.d.ts +6 -0
  173. package/dist/src/tools/edit.test.js +500 -0
  174. package/dist/src/tools/edit.test.js.map +1 -0
  175. package/dist/src/tools/glob.d.ts +71 -0
  176. package/dist/src/tools/glob.js +215 -0
  177. package/dist/src/tools/glob.js.map +1 -0
  178. package/dist/src/tools/glob.test.d.ts +6 -0
  179. package/dist/src/tools/glob.test.js +293 -0
  180. package/dist/src/tools/glob.test.js.map +1 -0
  181. package/dist/src/tools/grep.d.ts +81 -0
  182. package/dist/src/tools/grep.js +427 -0
  183. package/dist/src/tools/grep.js.map +1 -0
  184. package/dist/src/tools/grep.test.d.ts +6 -0
  185. package/dist/src/tools/grep.test.js +185 -0
  186. package/dist/src/tools/grep.test.js.map +1 -0
  187. package/dist/src/tools/ls.d.ts +94 -0
  188. package/dist/src/tools/ls.js +215 -0
  189. package/dist/src/tools/ls.js.map +1 -0
  190. package/dist/src/tools/mcp-client.d.ts +56 -0
  191. package/dist/src/tools/mcp-client.js +302 -0
  192. package/dist/src/tools/mcp-client.js.map +1 -0
  193. package/dist/src/tools/mcp-client.test.d.ts +6 -0
  194. package/dist/src/tools/mcp-client.test.js +608 -0
  195. package/dist/src/tools/mcp-client.test.js.map +1 -0
  196. package/dist/src/tools/mcp-tool.d.ts +23 -0
  197. package/dist/src/tools/mcp-tool.js +119 -0
  198. package/dist/src/tools/mcp-tool.js.map +1 -0
  199. package/dist/src/tools/mcp-tool.test.d.ts +6 -0
  200. package/dist/src/tools/mcp-tool.test.js +173 -0
  201. package/dist/src/tools/mcp-tool.test.js.map +1 -0
  202. package/dist/src/tools/memoryTool.d.ts +28 -0
  203. package/dist/src/tools/memoryTool.js +171 -0
  204. package/dist/src/tools/memoryTool.js.map +1 -0
  205. package/dist/src/tools/memoryTool.test.d.ts +6 -0
  206. package/dist/src/tools/memoryTool.test.js +181 -0
  207. package/dist/src/tools/memoryTool.test.js.map +1 -0
  208. package/dist/src/tools/modifiable-tool.d.ts +29 -0
  209. package/dist/src/tools/modifiable-tool.js +85 -0
  210. package/dist/src/tools/modifiable-tool.js.map +1 -0
  211. package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
  212. package/dist/src/tools/modifiable-tool.test.js +204 -0
  213. package/dist/src/tools/modifiable-tool.test.js.map +1 -0
  214. package/dist/src/tools/read-file.d.ts +36 -0
  215. package/dist/src/tools/read-file.js +103 -0
  216. package/dist/src/tools/read-file.js.map +1 -0
  217. package/dist/src/tools/read-file.test.d.ts +6 -0
  218. package/dist/src/tools/read-file.test.js +180 -0
  219. package/dist/src/tools/read-file.test.js.map +1 -0
  220. package/dist/src/tools/read-many-files.d.ts +65 -0
  221. package/dist/src/tools/read-many-files.js +344 -0
  222. package/dist/src/tools/read-many-files.js.map +1 -0
  223. package/dist/src/tools/read-many-files.test.d.ts +6 -0
  224. package/dist/src/tools/read-many-files.test.js +300 -0
  225. package/dist/src/tools/read-many-files.test.js.map +1 -0
  226. package/dist/src/tools/shell.d.ts +43 -0
  227. package/dist/src/tools/shell.js +421 -0
  228. package/dist/src/tools/shell.js.map +1 -0
  229. package/dist/src/tools/shell.test.d.ts +6 -0
  230. package/dist/src/tools/shell.test.js +321 -0
  231. package/dist/src/tools/shell.test.js.map +1 -0
  232. package/dist/src/tools/tool-registry.d.ts +67 -0
  233. package/dist/src/tools/tool-registry.js +326 -0
  234. package/dist/src/tools/tool-registry.js.map +1 -0
  235. package/dist/src/tools/tool-registry.test.d.ts +6 -0
  236. package/dist/src/tools/tool-registry.test.js +353 -0
  237. package/dist/src/tools/tool-registry.test.js.map +1 -0
  238. package/dist/src/tools/tools.d.ts +179 -0
  239. package/dist/src/tools/tools.js +88 -0
  240. package/dist/src/tools/tools.js.map +1 -0
  241. package/dist/src/tools/web-fetch.d.ts +29 -0
  242. package/dist/src/tools/web-fetch.js +240 -0
  243. package/dist/src/tools/web-fetch.js.map +1 -0
  244. package/dist/src/tools/web-fetch.test.d.ts +6 -0
  245. package/dist/src/tools/web-fetch.test.js +70 -0
  246. package/dist/src/tools/web-fetch.test.js.map +1 -0
  247. package/dist/src/tools/web-search.d.ts +49 -0
  248. package/dist/src/tools/web-search.js +119 -0
  249. package/dist/src/tools/web-search.js.map +1 -0
  250. package/dist/src/tools/write-file.d.ts +50 -0
  251. package/dist/src/tools/write-file.js +261 -0
  252. package/dist/src/tools/write-file.js.map +1 -0
  253. package/dist/src/tools/write-file.test.d.ts +6 -0
  254. package/dist/src/tools/write-file.test.js +413 -0
  255. package/dist/src/tools/write-file.test.js.map +1 -0
  256. package/dist/src/utils/LruCache.d.ts +13 -0
  257. package/dist/src/utils/LruCache.js +38 -0
  258. package/dist/src/utils/LruCache.js.map +1 -0
  259. package/dist/src/utils/bfsFileSearch.d.ts +22 -0
  260. package/dist/src/utils/bfsFileSearch.js +62 -0
  261. package/dist/src/utils/bfsFileSearch.js.map +1 -0
  262. package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
  263. package/dist/src/utils/bfsFileSearch.test.js +129 -0
  264. package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
  265. package/dist/src/utils/editCorrector.d.ts +53 -0
  266. package/dist/src/utils/editCorrector.js +546 -0
  267. package/dist/src/utils/editCorrector.js.map +1 -0
  268. package/dist/src/utils/editCorrector.test.d.ts +6 -0
  269. package/dist/src/utils/editCorrector.test.js +560 -0
  270. package/dist/src/utils/editCorrector.test.js.map +1 -0
  271. package/dist/src/utils/editor.d.ts +28 -0
  272. package/dist/src/utils/editor.js +163 -0
  273. package/dist/src/utils/editor.js.map +1 -0
  274. package/dist/src/utils/editor.test.d.ts +6 -0
  275. package/dist/src/utils/editor.test.js +293 -0
  276. package/dist/src/utils/editor.test.js.map +1 -0
  277. package/dist/src/utils/errorReporting.d.ts +14 -0
  278. package/dist/src/utils/errorReporting.js +88 -0
  279. package/dist/src/utils/errorReporting.js.map +1 -0
  280. package/dist/src/utils/errorReporting.test.d.ts +6 -0
  281. package/dist/src/utils/errorReporting.test.js +124 -0
  282. package/dist/src/utils/errorReporting.test.js.map +1 -0
  283. package/dist/src/utils/errors.d.ts +14 -0
  284. package/dist/src/utils/errors.js +54 -0
  285. package/dist/src/utils/errors.js.map +1 -0
  286. package/dist/src/utils/fetch.d.ts +11 -0
  287. package/dist/src/utils/fetch.js +51 -0
  288. package/dist/src/utils/fetch.js.map +1 -0
  289. package/dist/src/utils/fileUtils.d.ts +49 -0
  290. package/dist/src/utils/fileUtils.js +284 -0
  291. package/dist/src/utils/fileUtils.js.map +1 -0
  292. package/dist/src/utils/fileUtils.test.d.ts +6 -0
  293. package/dist/src/utils/fileUtils.test.js +321 -0
  294. package/dist/src/utils/fileUtils.test.js.map +1 -0
  295. package/dist/src/utils/flashFallback.integration.test.d.ts +6 -0
  296. package/dist/src/utils/flashFallback.integration.test.js +112 -0
  297. package/dist/src/utils/flashFallback.integration.test.js.map +1 -0
  298. package/dist/src/utils/generateContentResponseUtilities.d.ts +14 -0
  299. package/dist/src/utils/generateContentResponseUtilities.js +92 -0
  300. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
  301. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
  302. package/dist/src/utils/generateContentResponseUtilities.test.js +273 -0
  303. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
  304. package/dist/src/utils/getFolderStructure.d.ts +30 -0
  305. package/dist/src/utils/getFolderStructure.js +247 -0
  306. package/dist/src/utils/getFolderStructure.js.map +1 -0
  307. package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
  308. package/dist/src/utils/getFolderStructure.test.js +300 -0
  309. package/dist/src/utils/getFolderStructure.test.js.map +1 -0
  310. package/dist/src/utils/gitIgnoreParser.d.ts +20 -0
  311. package/dist/src/utils/gitIgnoreParser.js +64 -0
  312. package/dist/src/utils/gitIgnoreParser.js.map +1 -0
  313. package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
  314. package/dist/src/utils/gitIgnoreParser.test.js +145 -0
  315. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
  316. package/dist/src/utils/gitUtils.d.ts +17 -0
  317. package/dist/src/utils/gitUtils.js +61 -0
  318. package/dist/src/utils/gitUtils.js.map +1 -0
  319. package/dist/src/utils/memoryDiscovery.d.ts +14 -0
  320. package/dist/src/utils/memoryDiscovery.js +219 -0
  321. package/dist/src/utils/memoryDiscovery.js.map +1 -0
  322. package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
  323. package/dist/src/utils/memoryDiscovery.test.js +432 -0
  324. package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
  325. package/dist/src/utils/memoryImportProcessor.d.ts +35 -0
  326. package/dist/src/utils/memoryImportProcessor.js +141 -0
  327. package/dist/src/utils/memoryImportProcessor.js.map +1 -0
  328. package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  329. package/dist/src/utils/memoryImportProcessor.test.js +170 -0
  330. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  331. package/dist/src/utils/messageInspectors.d.ts +8 -0
  332. package/dist/src/utils/messageInspectors.js +16 -0
  333. package/dist/src/utils/messageInspectors.js.map +1 -0
  334. package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
  335. package/dist/src/utils/nextSpeakerChecker.js +111 -0
  336. package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
  337. package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
  338. package/dist/src/utils/nextSpeakerChecker.test.js +152 -0
  339. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
  340. package/dist/src/utils/paths.d.ts +47 -0
  341. package/dist/src/utils/paths.js +136 -0
  342. package/dist/src/utils/paths.js.map +1 -0
  343. package/dist/src/utils/retry.d.ts +21 -0
  344. package/dist/src/utils/retry.js +220 -0
  345. package/dist/src/utils/retry.js.map +1 -0
  346. package/dist/src/utils/retry.test.d.ts +6 -0
  347. package/dist/src/utils/retry.test.js +322 -0
  348. package/dist/src/utils/retry.test.js.map +1 -0
  349. package/dist/src/utils/schemaValidator.d.ts +17 -0
  350. package/dist/src/utils/schemaValidator.js +50 -0
  351. package/dist/src/utils/schemaValidator.js.map +1 -0
  352. package/dist/src/utils/session.d.ts +6 -0
  353. package/dist/src/utils/session.js +8 -0
  354. package/dist/src/utils/session.js.map +1 -0
  355. package/dist/src/utils/testUtils.d.ts +29 -0
  356. package/dist/src/utils/testUtils.js +70 -0
  357. package/dist/src/utils/testUtils.js.map +1 -0
  358. package/dist/src/utils/user_id.d.ts +17 -0
  359. package/dist/src/utils/user_id.js +70 -0
  360. package/dist/src/utils/user_id.js.map +1 -0
  361. package/dist/src/utils/user_id.test.d.ts +6 -0
  362. package/dist/src/utils/user_id.test.js +42 -0
  363. package/dist/src/utils/user_id.test.js.map +1 -0
  364. package/dist/tsconfig.tsbuildinfo +1 -0
  365. package/package.json +60 -0
@@ -0,0 +1,427 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import fs from 'fs';
7
+ import fsPromises from 'fs/promises';
8
+ import path from 'path';
9
+ import { EOL } from 'os';
10
+ import { spawn } from 'child_process';
11
+ import { globStream } from 'glob';
12
+ import { BaseTool } from './tools.js';
13
+ import { SchemaValidator } from '../utils/schemaValidator.js';
14
+ import { makeRelative, shortenPath } from '../utils/paths.js';
15
+ import { getErrorMessage, isNodeError } from '../utils/errors.js';
16
+ import { isGitRepository } from '../utils/gitUtils.js';
17
+ // --- GrepLogic Class ---
18
+ /**
19
+ * Implementation of the Grep tool logic (moved from CLI)
20
+ */
21
+ export class GrepTool extends BaseTool {
22
+ rootDirectory;
23
+ static Name = 'search_file_content'; // Keep static name
24
+ /**
25
+ * Creates a new instance of the GrepLogic
26
+ * @param rootDirectory Root directory to ground this tool in. All operations will be restricted to this directory.
27
+ */
28
+ constructor(rootDirectory) {
29
+ super(GrepTool.Name, 'SearchText', 'Searches for a regular expression pattern within the content of files in a specified directory (or current working directory). Can filter files by a glob pattern. Returns the lines containing matches, along with their file paths and line numbers.', {
30
+ properties: {
31
+ pattern: {
32
+ description: "The regular expression (regex) pattern to search for within file contents (e.g., 'function\\s+myFunction', 'import\\s+\\{.*\\}\\s+from\\s+.*').",
33
+ type: 'string',
34
+ },
35
+ path: {
36
+ description: 'Optional: The absolute path to the directory to search within. If omitted, searches the current working directory.',
37
+ type: 'string',
38
+ },
39
+ include: {
40
+ description: "Optional: A glob pattern to filter which files are searched (e.g., '*.js', '*.{ts,tsx}', 'src/**'). If omitted, searches all files (respecting potential global ignores).",
41
+ type: 'string',
42
+ },
43
+ },
44
+ required: ['pattern'],
45
+ type: 'object',
46
+ });
47
+ this.rootDirectory = rootDirectory;
48
+ // Ensure rootDirectory is absolute and normalized
49
+ this.rootDirectory = path.resolve(rootDirectory);
50
+ }
51
+ // --- Validation Methods ---
52
+ /**
53
+ * Checks if a path is within the root directory and resolves it.
54
+ * @param relativePath Path relative to the root directory (or undefined for root).
55
+ * @returns The absolute path if valid and exists.
56
+ * @throws {Error} If path is outside root, doesn't exist, or isn't a directory.
57
+ */
58
+ resolveAndValidatePath(relativePath) {
59
+ const targetPath = path.resolve(this.rootDirectory, relativePath || '.');
60
+ // Security Check: Ensure the resolved path is still within the root directory.
61
+ if (!targetPath.startsWith(this.rootDirectory) &&
62
+ targetPath !== this.rootDirectory) {
63
+ throw new Error(`Path validation failed: Attempted path "${relativePath || '.'}" resolves outside the allowed root directory "${this.rootDirectory}".`);
64
+ }
65
+ // Check existence and type after resolving
66
+ try {
67
+ const stats = fs.statSync(targetPath);
68
+ if (!stats.isDirectory()) {
69
+ throw new Error(`Path is not a directory: ${targetPath}`);
70
+ }
71
+ }
72
+ catch (error) {
73
+ if (isNodeError(error) && error.code !== 'ENOENT') {
74
+ throw new Error(`Path does not exist: ${targetPath}`);
75
+ }
76
+ throw new Error(`Failed to access path stats for ${targetPath}: ${error}`);
77
+ }
78
+ return targetPath;
79
+ }
80
+ /**
81
+ * Validates the parameters for the tool
82
+ * @param params Parameters to validate
83
+ * @returns An error message string if invalid, null otherwise
84
+ */
85
+ validateToolParams(params) {
86
+ if (this.schema.parameters &&
87
+ !SchemaValidator.validate(this.schema.parameters, params)) {
88
+ return 'Parameters failed schema validation.';
89
+ }
90
+ try {
91
+ new RegExp(params.pattern);
92
+ }
93
+ catch (error) {
94
+ return `Invalid regular expression pattern provided: ${params.pattern}. Error: ${getErrorMessage(error)}`;
95
+ }
96
+ try {
97
+ this.resolveAndValidatePath(params.path);
98
+ }
99
+ catch (error) {
100
+ return getErrorMessage(error);
101
+ }
102
+ return null; // Parameters are valid
103
+ }
104
+ // --- Core Execution ---
105
+ /**
106
+ * Executes the grep search with the given parameters
107
+ * @param params Parameters for the grep search
108
+ * @returns Result of the grep search
109
+ */
110
+ async execute(params, signal) {
111
+ const validationError = this.validateToolParams(params);
112
+ if (validationError) {
113
+ return {
114
+ llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
115
+ returnDisplay: `Model provided invalid parameters. Error: ${validationError}`,
116
+ };
117
+ }
118
+ let searchDirAbs;
119
+ try {
120
+ searchDirAbs = this.resolveAndValidatePath(params.path);
121
+ const searchDirDisplay = params.path || '.';
122
+ const matches = await this.performGrepSearch({
123
+ pattern: params.pattern,
124
+ path: searchDirAbs,
125
+ include: params.include,
126
+ signal,
127
+ });
128
+ if (matches.length === 0) {
129
+ const noMatchMsg = `No matches found for pattern "${params.pattern}" in path "${searchDirDisplay}"${params.include ? ` (filter: "${params.include}")` : ''}.`;
130
+ return { llmContent: noMatchMsg, returnDisplay: `No matches found` };
131
+ }
132
+ const matchesByFile = matches.reduce((acc, match) => {
133
+ const relativeFilePath = path.relative(searchDirAbs, path.resolve(searchDirAbs, match.filePath)) || path.basename(match.filePath);
134
+ if (!acc[relativeFilePath]) {
135
+ acc[relativeFilePath] = [];
136
+ }
137
+ acc[relativeFilePath].push(match);
138
+ acc[relativeFilePath].sort((a, b) => a.lineNumber - b.lineNumber);
139
+ return acc;
140
+ }, {});
141
+ const matchCount = matches.length;
142
+ const matchTerm = matchCount === 1 ? 'match' : 'matches';
143
+ let llmContent = `Found ${matchCount} ${matchTerm} for pattern "${params.pattern}" in path "${searchDirDisplay}"${params.include ? ` (filter: "${params.include}")` : ''}:\n---\n`;
144
+ for (const filePath in matchesByFile) {
145
+ llmContent += `File: ${filePath}\n`;
146
+ matchesByFile[filePath].forEach((match) => {
147
+ const trimmedLine = match.line.trim();
148
+ llmContent += `L${match.lineNumber}: ${trimmedLine}\n`;
149
+ });
150
+ llmContent += '---\n';
151
+ }
152
+ return {
153
+ llmContent: llmContent.trim(),
154
+ returnDisplay: `Found ${matchCount} ${matchTerm}`,
155
+ };
156
+ }
157
+ catch (error) {
158
+ console.error(`Error during GrepLogic execution: ${error}`);
159
+ const errorMessage = getErrorMessage(error);
160
+ return {
161
+ llmContent: `Error during grep search operation: ${errorMessage}`,
162
+ returnDisplay: `Error: ${errorMessage}`,
163
+ };
164
+ }
165
+ }
166
+ // --- Grep Implementation Logic ---
167
+ /**
168
+ * Checks if a command is available in the system's PATH.
169
+ * @param {string} command The command name (e.g., 'git', 'grep').
170
+ * @returns {Promise<boolean>} True if the command is available, false otherwise.
171
+ */
172
+ isCommandAvailable(command) {
173
+ return new Promise((resolve) => {
174
+ const checkCommand = process.platform === 'win32' ? 'where' : 'command';
175
+ const checkArgs = process.platform === 'win32' ? [command] : ['-v', command];
176
+ try {
177
+ const child = spawn(checkCommand, checkArgs, {
178
+ stdio: 'ignore',
179
+ shell: process.platform === 'win32',
180
+ });
181
+ child.on('close', (code) => resolve(code === 0));
182
+ child.on('error', () => resolve(false));
183
+ }
184
+ catch {
185
+ resolve(false);
186
+ }
187
+ });
188
+ }
189
+ /**
190
+ * Parses the standard output of grep-like commands (git grep, system grep).
191
+ * Expects format: filePath:lineNumber:lineContent
192
+ * Handles colons within file paths and line content correctly.
193
+ * @param {string} output The raw stdout string.
194
+ * @param {string} basePath The absolute directory the search was run from, for relative paths.
195
+ * @returns {GrepMatch[]} Array of match objects.
196
+ */
197
+ parseGrepOutput(output, basePath) {
198
+ const results = [];
199
+ if (!output)
200
+ return results;
201
+ const lines = output.split(EOL); // Use OS-specific end-of-line
202
+ for (const line of lines) {
203
+ if (!line.trim())
204
+ continue;
205
+ // Find the index of the first colon.
206
+ const firstColonIndex = line.indexOf(':');
207
+ if (firstColonIndex === -1)
208
+ continue; // Malformed
209
+ // Find the index of the second colon, searching *after* the first one.
210
+ const secondColonIndex = line.indexOf(':', firstColonIndex + 1);
211
+ if (secondColonIndex === -1)
212
+ continue; // Malformed
213
+ // Extract parts based on the found colon indices
214
+ const filePathRaw = line.substring(0, firstColonIndex);
215
+ const lineNumberStr = line.substring(firstColonIndex + 1, secondColonIndex);
216
+ const lineContent = line.substring(secondColonIndex + 1);
217
+ const lineNumber = parseInt(lineNumberStr, 10);
218
+ if (!isNaN(lineNumber)) {
219
+ const absoluteFilePath = path.resolve(basePath, filePathRaw);
220
+ const relativeFilePath = path.relative(basePath, absoluteFilePath);
221
+ results.push({
222
+ filePath: relativeFilePath || path.basename(absoluteFilePath),
223
+ lineNumber,
224
+ line: lineContent,
225
+ });
226
+ }
227
+ }
228
+ return results;
229
+ }
230
+ /**
231
+ * Gets a description of the grep operation
232
+ * @param params Parameters for the grep operation
233
+ * @returns A string describing the grep
234
+ */
235
+ getDescription(params) {
236
+ let description = `'${params.pattern}'`;
237
+ if (params.include) {
238
+ description += ` in ${params.include}`;
239
+ }
240
+ if (params.path) {
241
+ const resolvedPath = path.resolve(this.rootDirectory, params.path);
242
+ if (resolvedPath === this.rootDirectory || params.path === '.') {
243
+ description += ` within ./`;
244
+ }
245
+ else {
246
+ const relativePath = makeRelative(resolvedPath, this.rootDirectory);
247
+ description += ` within ${shortenPath(relativePath)}`;
248
+ }
249
+ }
250
+ return description;
251
+ }
252
+ /**
253
+ * Performs the actual search using the prioritized strategies.
254
+ * @param options Search options including pattern, absolute path, and include glob.
255
+ * @returns A promise resolving to an array of match objects.
256
+ */
257
+ async performGrepSearch(options) {
258
+ const { pattern, path: absolutePath, include } = options;
259
+ let strategyUsed = 'none';
260
+ try {
261
+ // --- Strategy 1: git grep ---
262
+ const isGit = isGitRepository(absolutePath);
263
+ const gitAvailable = isGit && (await this.isCommandAvailable('git'));
264
+ if (gitAvailable) {
265
+ strategyUsed = 'git grep';
266
+ const gitArgs = [
267
+ 'grep',
268
+ '--untracked',
269
+ '-n',
270
+ '-E',
271
+ '--ignore-case',
272
+ pattern,
273
+ ];
274
+ if (include) {
275
+ gitArgs.push('--', include);
276
+ }
277
+ try {
278
+ const output = await new Promise((resolve, reject) => {
279
+ const child = spawn('git', gitArgs, {
280
+ cwd: absolutePath,
281
+ windowsHide: true,
282
+ });
283
+ const stdoutChunks = [];
284
+ const stderrChunks = [];
285
+ child.stdout.on('data', (chunk) => stdoutChunks.push(chunk));
286
+ child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
287
+ child.on('error', (err) => reject(new Error(`Failed to start git grep: ${err.message}`)));
288
+ child.on('close', (code) => {
289
+ const stdoutData = Buffer.concat(stdoutChunks).toString('utf8');
290
+ const stderrData = Buffer.concat(stderrChunks).toString('utf8');
291
+ if (code === 0)
292
+ resolve(stdoutData);
293
+ else if (code === 1)
294
+ resolve(''); // No matches
295
+ else
296
+ reject(new Error(`git grep exited with code ${code}: ${stderrData}`));
297
+ });
298
+ });
299
+ return this.parseGrepOutput(output, absolutePath);
300
+ }
301
+ catch (gitError) {
302
+ console.debug(`GrepLogic: git grep failed: ${getErrorMessage(gitError)}. Falling back...`);
303
+ }
304
+ }
305
+ // --- Strategy 2: System grep ---
306
+ const grepAvailable = await this.isCommandAvailable('grep');
307
+ if (grepAvailable) {
308
+ strategyUsed = 'system grep';
309
+ const grepArgs = ['-r', '-n', '-H', '-E'];
310
+ const commonExcludes = ['.git', 'node_modules', 'bower_components'];
311
+ commonExcludes.forEach((dir) => grepArgs.push(`--exclude-dir=${dir}`));
312
+ if (include) {
313
+ grepArgs.push(`--include=${include}`);
314
+ }
315
+ grepArgs.push(pattern);
316
+ grepArgs.push('.');
317
+ try {
318
+ const output = await new Promise((resolve, reject) => {
319
+ const child = spawn('grep', grepArgs, {
320
+ cwd: absolutePath,
321
+ windowsHide: true,
322
+ });
323
+ const stdoutChunks = [];
324
+ const stderrChunks = [];
325
+ const onData = (chunk) => stdoutChunks.push(chunk);
326
+ const onStderr = (chunk) => {
327
+ const stderrStr = chunk.toString();
328
+ // Suppress common harmless stderr messages
329
+ if (!stderrStr.includes('Permission denied') &&
330
+ !/grep:.*: Is a directory/i.test(stderrStr)) {
331
+ stderrChunks.push(chunk);
332
+ }
333
+ };
334
+ const onError = (err) => {
335
+ cleanup();
336
+ reject(new Error(`Failed to start system grep: ${err.message}`));
337
+ };
338
+ const onClose = (code) => {
339
+ const stdoutData = Buffer.concat(stdoutChunks).toString('utf8');
340
+ const stderrData = Buffer.concat(stderrChunks)
341
+ .toString('utf8')
342
+ .trim();
343
+ cleanup();
344
+ if (code === 0)
345
+ resolve(stdoutData);
346
+ else if (code === 1)
347
+ resolve(''); // No matches
348
+ else {
349
+ if (stderrData)
350
+ reject(new Error(`System grep exited with code ${code}: ${stderrData}`));
351
+ else
352
+ resolve(''); // Exit code > 1 but no stderr, likely just suppressed errors
353
+ }
354
+ };
355
+ const cleanup = () => {
356
+ child.stdout.removeListener('data', onData);
357
+ child.stderr.removeListener('data', onStderr);
358
+ child.removeListener('error', onError);
359
+ child.removeListener('close', onClose);
360
+ if (child.connected) {
361
+ child.disconnect();
362
+ }
363
+ };
364
+ child.stdout.on('data', onData);
365
+ child.stderr.on('data', onStderr);
366
+ child.on('error', onError);
367
+ child.on('close', onClose);
368
+ });
369
+ return this.parseGrepOutput(output, absolutePath);
370
+ }
371
+ catch (grepError) {
372
+ console.debug(`GrepLogic: System grep failed: ${getErrorMessage(grepError)}. Falling back...`);
373
+ }
374
+ }
375
+ // --- Strategy 3: Pure JavaScript Fallback ---
376
+ console.debug('GrepLogic: Falling back to JavaScript grep implementation.');
377
+ strategyUsed = 'javascript fallback';
378
+ const globPattern = include ? include : '**/*';
379
+ const ignorePatterns = [
380
+ '.git/**',
381
+ 'node_modules/**',
382
+ 'bower_components/**',
383
+ '.svn/**',
384
+ '.hg/**',
385
+ ]; // Use glob patterns for ignores here
386
+ const filesStream = globStream(globPattern, {
387
+ cwd: absolutePath,
388
+ dot: true,
389
+ ignore: ignorePatterns,
390
+ absolute: true,
391
+ nodir: true,
392
+ signal: options.signal,
393
+ });
394
+ const regex = new RegExp(pattern, 'i');
395
+ const allMatches = [];
396
+ for await (const filePath of filesStream) {
397
+ const fileAbsolutePath = filePath;
398
+ try {
399
+ const content = await fsPromises.readFile(fileAbsolutePath, 'utf8');
400
+ const lines = content.split(/\r?\n/);
401
+ lines.forEach((line, index) => {
402
+ if (regex.test(line)) {
403
+ allMatches.push({
404
+ filePath: path.relative(absolutePath, fileAbsolutePath) ||
405
+ path.basename(fileAbsolutePath),
406
+ lineNumber: index + 1,
407
+ line,
408
+ });
409
+ }
410
+ });
411
+ }
412
+ catch (readError) {
413
+ // Ignore errors like permission denied or file gone during read
414
+ if (!isNodeError(readError) || readError.code !== 'ENOENT') {
415
+ console.debug(`GrepLogic: Could not read/process ${fileAbsolutePath}: ${getErrorMessage(readError)}`);
416
+ }
417
+ }
418
+ }
419
+ return allMatches;
420
+ }
421
+ catch (error) {
422
+ console.error(`GrepLogic: Error in performGrepSearch (Strategy: ${strategyUsed}): ${getErrorMessage(error)}`);
423
+ throw error; // Re-throw
424
+ }
425
+ }
426
+ }
427
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/tools/grep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,185 @@
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 { GrepTool } from './grep.js';
8
+ import path from 'path';
9
+ import fs from 'fs/promises';
10
+ import os from 'os';
11
+ // Mock the child_process module to control grep/git grep behavior
12
+ vi.mock('child_process', () => ({
13
+ spawn: vi.fn(() => ({
14
+ on: (event, cb) => {
15
+ if (event === 'error' || event === 'close') {
16
+ // Simulate command not found or error for git grep and system grep
17
+ // to force fallback to JS implementation.
18
+ setTimeout(() => cb(1), 0); // cb(1) for error/close
19
+ }
20
+ },
21
+ stdout: { on: vi.fn() },
22
+ stderr: { on: vi.fn() },
23
+ })),
24
+ }));
25
+ describe('GrepTool', () => {
26
+ let tempRootDir;
27
+ let grepTool;
28
+ const abortSignal = new AbortController().signal;
29
+ beforeEach(async () => {
30
+ tempRootDir = await fs.mkdtemp(path.join(os.tmpdir(), 'grep-tool-root-'));
31
+ grepTool = new GrepTool(tempRootDir);
32
+ // Create some test files and directories
33
+ await fs.writeFile(path.join(tempRootDir, 'fileA.txt'), 'hello world\nsecond line with world');
34
+ await fs.writeFile(path.join(tempRootDir, 'fileB.js'), 'const foo = "bar";\nfunction baz() { return "hello"; }');
35
+ await fs.mkdir(path.join(tempRootDir, 'sub'));
36
+ await fs.writeFile(path.join(tempRootDir, 'sub', 'fileC.txt'), 'another world in sub dir');
37
+ await fs.writeFile(path.join(tempRootDir, 'sub', 'fileD.md'), '# Markdown file\nThis is a test.');
38
+ });
39
+ afterEach(async () => {
40
+ await fs.rm(tempRootDir, { recursive: true, force: true });
41
+ });
42
+ describe('validateToolParams', () => {
43
+ it('should return null for valid params (pattern only)', () => {
44
+ const params = { pattern: 'hello' };
45
+ expect(grepTool.validateToolParams(params)).toBeNull();
46
+ });
47
+ it('should return null for valid params (pattern and path)', () => {
48
+ const params = { pattern: 'hello', path: '.' };
49
+ expect(grepTool.validateToolParams(params)).toBeNull();
50
+ });
51
+ it('should return null for valid params (pattern, path, and include)', () => {
52
+ const params = {
53
+ pattern: 'hello',
54
+ path: '.',
55
+ include: '*.txt',
56
+ };
57
+ expect(grepTool.validateToolParams(params)).toBeNull();
58
+ });
59
+ it('should return error if pattern is missing', () => {
60
+ const params = { path: '.' };
61
+ expect(grepTool.validateToolParams(params)).toContain('Parameters failed schema validation');
62
+ });
63
+ it('should return error for invalid regex pattern', () => {
64
+ const params = { pattern: '[[' };
65
+ expect(grepTool.validateToolParams(params)).toContain('Invalid regular expression pattern');
66
+ });
67
+ it('should return error if path does not exist', () => {
68
+ const params = { pattern: 'hello', path: 'nonexistent' };
69
+ // Check for the core error message, as the full path might vary
70
+ expect(grepTool.validateToolParams(params)).toContain('Failed to access path stats for');
71
+ expect(grepTool.validateToolParams(params)).toContain('nonexistent');
72
+ });
73
+ it('should return error if path is a file, not a directory', async () => {
74
+ const filePath = path.join(tempRootDir, 'fileA.txt');
75
+ const params = { pattern: 'hello', path: filePath };
76
+ expect(grepTool.validateToolParams(params)).toContain(`Path is not a directory: ${filePath}`);
77
+ });
78
+ });
79
+ describe('execute', () => {
80
+ it('should find matches for a simple pattern in all files', async () => {
81
+ const params = { pattern: 'world' };
82
+ const result = await grepTool.execute(params, abortSignal);
83
+ expect(result.llmContent).toContain('Found 3 matches for pattern "world" in path "."');
84
+ expect(result.llmContent).toContain('File: fileA.txt');
85
+ expect(result.llmContent).toContain('L1: hello world');
86
+ expect(result.llmContent).toContain('L2: second line with world');
87
+ expect(result.llmContent).toContain('File: sub/fileC.txt');
88
+ expect(result.llmContent).toContain('L1: another world in sub dir');
89
+ expect(result.returnDisplay).toBe('Found 3 matches');
90
+ });
91
+ it('should find matches in a specific path', async () => {
92
+ const params = { pattern: 'world', path: 'sub' };
93
+ const result = await grepTool.execute(params, abortSignal);
94
+ expect(result.llmContent).toContain('Found 1 match for pattern "world" in path "sub"');
95
+ expect(result.llmContent).toContain('File: fileC.txt'); // Path relative to 'sub'
96
+ expect(result.llmContent).toContain('L1: another world in sub dir');
97
+ expect(result.returnDisplay).toBe('Found 1 match');
98
+ });
99
+ it('should find matches with an include glob', async () => {
100
+ const params = { pattern: 'hello', include: '*.js' };
101
+ const result = await grepTool.execute(params, abortSignal);
102
+ expect(result.llmContent).toContain('Found 1 match for pattern "hello" in path "." (filter: "*.js")');
103
+ expect(result.llmContent).toContain('File: fileB.js');
104
+ expect(result.llmContent).toContain('L2: function baz() { return "hello"; }');
105
+ expect(result.returnDisplay).toBe('Found 1 match');
106
+ });
107
+ it('should find matches with an include glob and path', async () => {
108
+ await fs.writeFile(path.join(tempRootDir, 'sub', 'another.js'), 'const greeting = "hello";');
109
+ const params = {
110
+ pattern: 'hello',
111
+ path: 'sub',
112
+ include: '*.js',
113
+ };
114
+ const result = await grepTool.execute(params, abortSignal);
115
+ expect(result.llmContent).toContain('Found 1 match for pattern "hello" in path "sub" (filter: "*.js")');
116
+ expect(result.llmContent).toContain('File: another.js');
117
+ expect(result.llmContent).toContain('L1: const greeting = "hello";');
118
+ expect(result.returnDisplay).toBe('Found 1 match');
119
+ });
120
+ it('should return "No matches found" when pattern does not exist', async () => {
121
+ const params = { pattern: 'nonexistentpattern' };
122
+ const result = await grepTool.execute(params, abortSignal);
123
+ expect(result.llmContent).toContain('No matches found for pattern "nonexistentpattern" in path "."');
124
+ expect(result.returnDisplay).toBe('No matches found');
125
+ });
126
+ it('should handle regex special characters correctly', async () => {
127
+ const params = { pattern: 'foo.*bar' }; // Matches 'const foo = "bar";'
128
+ const result = await grepTool.execute(params, abortSignal);
129
+ expect(result.llmContent).toContain('Found 1 match for pattern "foo.*bar" in path "."');
130
+ expect(result.llmContent).toContain('File: fileB.js');
131
+ expect(result.llmContent).toContain('L1: const foo = "bar";');
132
+ });
133
+ it('should be case-insensitive by default (JS fallback)', async () => {
134
+ const params = { pattern: 'HELLO' };
135
+ const result = await grepTool.execute(params, abortSignal);
136
+ expect(result.llmContent).toContain('Found 2 matches for pattern "HELLO" in path "."');
137
+ expect(result.llmContent).toContain('File: fileA.txt');
138
+ expect(result.llmContent).toContain('L1: hello world');
139
+ expect(result.llmContent).toContain('File: fileB.js');
140
+ expect(result.llmContent).toContain('L2: function baz() { return "hello"; }');
141
+ });
142
+ it('should return an error if params are invalid', async () => {
143
+ const params = { path: '.' }; // Invalid: pattern missing
144
+ const result = await grepTool.execute(params, abortSignal);
145
+ expect(result.llmContent).toContain('Error: Invalid parameters provided. Reason: Parameters failed schema validation');
146
+ expect(result.returnDisplay).toContain('Model provided invalid parameters. Error: Parameters failed schema validation');
147
+ });
148
+ });
149
+ describe('getDescription', () => {
150
+ it('should generate correct description with pattern only', () => {
151
+ const params = { pattern: 'testPattern' };
152
+ expect(grepTool.getDescription(params)).toBe("'testPattern'");
153
+ });
154
+ it('should generate correct description with pattern and include', () => {
155
+ const params = {
156
+ pattern: 'testPattern',
157
+ include: '*.ts',
158
+ };
159
+ expect(grepTool.getDescription(params)).toBe("'testPattern' in *.ts");
160
+ });
161
+ it('should generate correct description with pattern and path', () => {
162
+ const params = {
163
+ pattern: 'testPattern',
164
+ path: 'src/app',
165
+ };
166
+ // The path will be relative to the tempRootDir, so we check for containment.
167
+ expect(grepTool.getDescription(params)).toContain("'testPattern' within");
168
+ expect(grepTool.getDescription(params)).toContain('src/app');
169
+ });
170
+ it('should generate correct description with pattern, include, and path', () => {
171
+ const params = {
172
+ pattern: 'testPattern',
173
+ include: '*.ts',
174
+ path: 'src/app',
175
+ };
176
+ expect(grepTool.getDescription(params)).toContain("'testPattern' in *.ts within");
177
+ expect(grepTool.getDescription(params)).toContain('src/app');
178
+ });
179
+ it('should use ./ for root path in description', () => {
180
+ const params = { pattern: 'testPattern', path: '.' };
181
+ expect(grepTool.getDescription(params)).toBe("'testPattern' within ./");
182
+ });
183
+ });
184
+ });
185
+ //# sourceMappingURL=grep.test.js.map