@travisennis/acai 0.0.5 → 0.0.6

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 (311) hide show
  1. package/README.md +4 -2
  2. package/dist/agent/index.d.ts +119 -0
  3. package/dist/agent/index.d.ts.map +1 -0
  4. package/dist/agent/index.js +406 -0
  5. package/dist/agent/manual-loop.d.ts +41 -0
  6. package/dist/agent/manual-loop.d.ts.map +1 -0
  7. package/dist/agent/manual-loop.js +278 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +27 -33
  11. package/dist/commands/add-directory-command.d.ts +3 -0
  12. package/dist/commands/add-directory-command.d.ts.map +1 -0
  13. package/dist/commands/add-directory-command.js +85 -0
  14. package/dist/commands/application-log-command.d.ts.map +1 -1
  15. package/dist/commands/application-log-command.js +34 -0
  16. package/dist/commands/clear-command.d.ts.map +1 -1
  17. package/dist/commands/clear-command.js +8 -0
  18. package/dist/commands/compact-command.d.ts.map +1 -1
  19. package/dist/commands/compact-command.js +15 -2
  20. package/dist/commands/context-command.d.ts +3 -0
  21. package/dist/commands/context-command.d.ts.map +1 -0
  22. package/dist/commands/context-command.js +183 -0
  23. package/dist/commands/copy-command.d.ts.map +1 -1
  24. package/dist/commands/copy-command.js +28 -0
  25. package/dist/commands/edit-command.d.ts.map +1 -1
  26. package/dist/commands/edit-command.js +33 -0
  27. package/dist/commands/edit-prompt-command.d.ts.map +1 -1
  28. package/dist/commands/edit-prompt-command.js +28 -0
  29. package/dist/commands/exit-command.d.ts.map +1 -1
  30. package/dist/commands/exit-command.js +20 -0
  31. package/dist/commands/files-command.d.ts.map +1 -1
  32. package/dist/commands/files-command.js +57 -0
  33. package/dist/commands/generate-rules-command.d.ts.map +1 -1
  34. package/dist/commands/generate-rules-command.js +311 -1
  35. package/dist/commands/handoff-command.d.ts +3 -0
  36. package/dist/commands/handoff-command.d.ts.map +1 -0
  37. package/dist/commands/handoff-command.js +202 -0
  38. package/dist/commands/health-command.d.ts.map +1 -1
  39. package/dist/commands/health-command.js +119 -2
  40. package/dist/commands/help-command.d.ts.map +1 -1
  41. package/dist/commands/help-command.js +28 -0
  42. package/dist/commands/history-command.d.ts +3 -0
  43. package/dist/commands/history-command.d.ts.map +1 -0
  44. package/dist/commands/history-command.js +534 -0
  45. package/dist/commands/init-command.d.ts +1 -1
  46. package/dist/commands/init-command.d.ts.map +1 -1
  47. package/dist/commands/init-command.js +55 -18
  48. package/dist/commands/last-log-command.d.ts.map +1 -1
  49. package/dist/commands/last-log-command.js +27 -0
  50. package/dist/commands/list-directories-command.d.ts +3 -0
  51. package/dist/commands/list-directories-command.d.ts.map +1 -0
  52. package/dist/commands/list-directories-command.js +48 -0
  53. package/dist/commands/list-tools-command.d.ts.map +1 -1
  54. package/dist/commands/list-tools-command.js +66 -3
  55. package/dist/commands/manager.d.ts +15 -3
  56. package/dist/commands/manager.d.ts.map +1 -1
  57. package/dist/commands/manager.js +86 -26
  58. package/dist/commands/model-command.d.ts +22 -0
  59. package/dist/commands/model-command.d.ts.map +1 -1
  60. package/dist/commands/model-command.js +256 -0
  61. package/dist/commands/paste-command.d.ts.map +1 -1
  62. package/dist/commands/paste-command.js +92 -0
  63. package/dist/commands/pickup-command.d.ts +3 -0
  64. package/dist/commands/pickup-command.d.ts.map +1 -0
  65. package/dist/commands/pickup-command.js +161 -0
  66. package/dist/commands/prompt-command.d.ts +1 -1
  67. package/dist/commands/prompt-command.d.ts.map +1 -1
  68. package/dist/commands/prompt-command.js +117 -2
  69. package/dist/commands/remove-directory-command.d.ts +3 -0
  70. package/dist/commands/remove-directory-command.d.ts.map +1 -0
  71. package/dist/commands/remove-directory-command.js +87 -0
  72. package/dist/commands/reset-command.d.ts +1 -1
  73. package/dist/commands/reset-command.d.ts.map +1 -1
  74. package/dist/commands/reset-command.js +13 -2
  75. package/dist/commands/rules-command.d.ts.map +1 -1
  76. package/dist/commands/rules-command.js +65 -0
  77. package/dist/commands/save-command.d.ts.map +1 -1
  78. package/dist/commands/save-command.js +12 -0
  79. package/dist/commands/shell-command.d.ts.map +1 -1
  80. package/dist/commands/shell-command.js +68 -0
  81. package/dist/commands/types.d.ts +9 -4
  82. package/dist/commands/types.d.ts.map +1 -1
  83. package/dist/commands/usage-command.d.ts.map +1 -1
  84. package/dist/commands/usage-command.js +22 -0
  85. package/dist/config.d.ts +6 -7
  86. package/dist/config.d.ts.map +1 -1
  87. package/dist/config.js +23 -29
  88. package/dist/formatting.d.ts +108 -0
  89. package/dist/formatting.d.ts.map +1 -1
  90. package/dist/formatting.js +147 -0
  91. package/dist/index.d.ts +7 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +140 -38
  94. package/dist/logger.d.ts.map +1 -1
  95. package/dist/logger.js +47 -18
  96. package/dist/mentions.d.ts +2 -1
  97. package/dist/mentions.d.ts.map +1 -1
  98. package/dist/mentions.js +16 -1
  99. package/dist/messages.d.ts +8 -0
  100. package/dist/messages.d.ts.map +1 -1
  101. package/dist/messages.js +56 -19
  102. package/dist/middleware/cache.d.ts +3 -0
  103. package/dist/middleware/cache.d.ts.map +1 -0
  104. package/dist/middleware/cache.js +53 -0
  105. package/dist/middleware/index.d.ts +1 -0
  106. package/dist/middleware/index.d.ts.map +1 -1
  107. package/dist/middleware/index.js +1 -0
  108. package/dist/models/ai-config.d.ts +4 -2
  109. package/dist/models/ai-config.d.ts.map +1 -1
  110. package/dist/models/ai-config.js +12 -2
  111. package/dist/models/anthropic-provider.d.ts.map +1 -1
  112. package/dist/models/anthropic-provider.js +3 -60
  113. package/dist/models/manager.d.ts +2 -1
  114. package/dist/models/manager.d.ts.map +1 -1
  115. package/dist/models/manager.js +26 -2
  116. package/dist/models/openrouter-provider.d.ts +7 -14
  117. package/dist/models/openrouter-provider.d.ts.map +1 -1
  118. package/dist/models/openrouter-provider.js +114 -169
  119. package/dist/models/providers.d.ts +1 -1
  120. package/dist/models/providers.d.ts.map +1 -1
  121. package/dist/prompts.d.ts +1 -0
  122. package/dist/prompts.d.ts.map +1 -1
  123. package/dist/prompts.js +53 -4
  124. package/dist/repl/display-tool-messages.d.ts +1 -1
  125. package/dist/repl/display-tool-messages.d.ts.map +1 -1
  126. package/dist/repl/display-tool-messages.js +47 -44
  127. package/dist/repl/get-prompt-header.d.ts.map +1 -1
  128. package/dist/repl/get-prompt-header.js +1 -30
  129. package/dist/repl/project-status-line.d.ts +2 -0
  130. package/dist/repl/project-status-line.d.ts.map +1 -0
  131. package/dist/repl/project-status-line.js +31 -0
  132. package/dist/repl/prompt.d.ts +21 -0
  133. package/dist/repl/prompt.d.ts.map +1 -0
  134. package/dist/{repl-prompt.js → repl/prompt.js} +119 -22
  135. package/dist/repl/tool-call-repair.d.ts.map +1 -1
  136. package/dist/repl/tool-call-repair.js +8 -4
  137. package/dist/repl-new.d.ts +53 -0
  138. package/dist/repl-new.d.ts.map +1 -0
  139. package/dist/repl-new.js +374 -0
  140. package/dist/repl.d.ts +3 -5
  141. package/dist/repl.d.ts.map +1 -1
  142. package/dist/repl.js +74 -166
  143. package/dist/terminal/checkbox-prompt.d.ts.map +1 -1
  144. package/dist/terminal/checkbox-prompt.js +10 -4
  145. package/dist/terminal/index.d.ts +7 -0
  146. package/dist/terminal/index.d.ts.map +1 -1
  147. package/dist/terminal/index.js +94 -0
  148. package/dist/terminal/input-prompt.d.ts +2 -1
  149. package/dist/terminal/input-prompt.d.ts.map +1 -1
  150. package/dist/terminal/markdown.js +3 -0
  151. package/dist/terminal/search-prompt.d.ts.map +1 -1
  152. package/dist/terminal/search-prompt.js +11 -10
  153. package/dist/terminal/select-prompt.d.ts +2 -2
  154. package/dist/terminal/select-prompt.d.ts.map +1 -1
  155. package/dist/terminal/select-prompt.js +47 -39
  156. package/dist/tokens/threshold.d.ts +35 -0
  157. package/dist/tokens/threshold.d.ts.map +1 -0
  158. package/dist/tokens/threshold.js +85 -0
  159. package/dist/tools/advanced-edit-file.d.ts +69 -0
  160. package/dist/tools/advanced-edit-file.d.ts.map +1 -0
  161. package/dist/tools/advanced-edit-file.js +281 -0
  162. package/dist/tools/agent.d.ts +16 -5
  163. package/dist/tools/agent.d.ts.map +1 -1
  164. package/dist/tools/agent.js +71 -58
  165. package/dist/tools/bash-utils.d.ts +1 -1
  166. package/dist/tools/bash-utils.d.ts.map +1 -1
  167. package/dist/tools/bash-utils.js +14 -6
  168. package/dist/tools/bash.d.ts +21 -12
  169. package/dist/tools/bash.d.ts.map +1 -1
  170. package/dist/tools/bash.js +88 -135
  171. package/dist/tools/code-interpreter.d.ts +21 -9
  172. package/dist/tools/code-interpreter.d.ts.map +1 -1
  173. package/dist/tools/code-interpreter.js +138 -137
  174. package/dist/tools/delete-file.d.ts +17 -10
  175. package/dist/tools/delete-file.d.ts.map +1 -1
  176. package/dist/tools/delete-file.js +51 -95
  177. package/dist/tools/directory-tree.d.ts +17 -6
  178. package/dist/tools/directory-tree.d.ts.map +1 -1
  179. package/dist/tools/directory-tree.js +47 -49
  180. package/dist/tools/dynamic-tool-loader.d.ts +18 -8
  181. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  182. package/dist/tools/dynamic-tool-loader.js +121 -129
  183. package/dist/tools/dynamic-tool-parser.d.ts +1 -0
  184. package/dist/tools/dynamic-tool-parser.d.ts.map +1 -1
  185. package/dist/tools/dynamic-tool-parser.js +1 -0
  186. package/dist/tools/edit-file.d.ts +35 -15
  187. package/dist/tools/edit-file.d.ts.map +1 -1
  188. package/dist/tools/edit-file.js +112 -112
  189. package/dist/tools/filesystem-utils.d.ts +2 -1
  190. package/dist/tools/filesystem-utils.d.ts.map +1 -1
  191. package/dist/tools/filesystem-utils.js +31 -17
  192. package/dist/tools/glob.d.ts +36 -0
  193. package/dist/tools/glob.d.ts.map +1 -0
  194. package/dist/tools/glob.js +143 -0
  195. package/dist/tools/grep.d.ts +73 -12
  196. package/dist/tools/grep.d.ts.map +1 -1
  197. package/dist/tools/grep.js +413 -168
  198. package/dist/tools/index.d.ts +204 -124
  199. package/dist/tools/index.d.ts.map +1 -1
  200. package/dist/tools/index.js +242 -135
  201. package/dist/tools/llm-edit-fixer.d.ts +25 -0
  202. package/dist/tools/llm-edit-fixer.d.ts.map +1 -0
  203. package/dist/tools/llm-edit-fixer.js +150 -0
  204. package/dist/tools/move-file.d.ts +19 -7
  205. package/dist/tools/move-file.d.ts.map +1 -1
  206. package/dist/tools/move-file.js +40 -33
  207. package/dist/tools/read-file.d.ts +47 -9
  208. package/dist/tools/read-file.d.ts.map +1 -1
  209. package/dist/tools/read-file.js +74 -69
  210. package/dist/tools/read-multiple-files.d.ts +17 -6
  211. package/dist/tools/read-multiple-files.d.ts.map +1 -1
  212. package/dist/tools/read-multiple-files.js +76 -73
  213. package/dist/tools/save-file.d.ts +45 -12
  214. package/dist/tools/save-file.d.ts.map +1 -1
  215. package/dist/tools/save-file.js +58 -101
  216. package/dist/tools/think.d.ts +15 -7
  217. package/dist/tools/think.d.ts.map +1 -1
  218. package/dist/tools/think.js +30 -22
  219. package/dist/tools/types.d.ts +4 -10
  220. package/dist/tools/types.d.ts.map +1 -1
  221. package/dist/tools/types.js +9 -0
  222. package/dist/tools/utils.d.ts +14 -0
  223. package/dist/tools/utils.d.ts.map +1 -0
  224. package/dist/tools/utils.js +16 -0
  225. package/dist/tools/web-fetch.d.ts +11 -4
  226. package/dist/tools/web-fetch.d.ts.map +1 -1
  227. package/dist/tools/web-fetch.js +39 -38
  228. package/dist/tools/web-search.d.ts +15 -6
  229. package/dist/tools/web-search.d.ts.map +1 -1
  230. package/dist/tools/web-search.js +50 -32
  231. package/dist/tui/autocomplete.d.ts +44 -0
  232. package/dist/tui/autocomplete.d.ts.map +1 -0
  233. package/dist/tui/autocomplete.js +466 -0
  234. package/dist/tui/components/assistant-message.d.ts +18 -0
  235. package/dist/tui/components/assistant-message.d.ts.map +1 -0
  236. package/dist/tui/components/assistant-message.js +29 -0
  237. package/dist/tui/components/editor.d.ts +51 -0
  238. package/dist/tui/components/editor.d.ts.map +1 -0
  239. package/dist/tui/components/editor.js +758 -0
  240. package/dist/tui/components/footer.d.ts +24 -0
  241. package/dist/tui/components/footer.d.ts.map +1 -0
  242. package/dist/tui/components/footer.js +197 -0
  243. package/dist/tui/components/input.d.ts +14 -0
  244. package/dist/tui/components/input.d.ts.map +1 -0
  245. package/dist/tui/components/input.js +122 -0
  246. package/dist/tui/components/loader.d.ts +19 -0
  247. package/dist/tui/components/loader.d.ts.map +1 -0
  248. package/dist/tui/components/loader.js +45 -0
  249. package/dist/tui/components/markdown.d.ts +103 -0
  250. package/dist/tui/components/markdown.d.ts.map +1 -0
  251. package/dist/tui/components/markdown.js +533 -0
  252. package/dist/tui/components/modal.d.ts +40 -0
  253. package/dist/tui/components/modal.d.ts.map +1 -0
  254. package/dist/tui/components/modal.js +292 -0
  255. package/dist/tui/components/prompt-status.d.ts +16 -0
  256. package/dist/tui/components/prompt-status.d.ts.map +1 -0
  257. package/dist/tui/components/prompt-status.js +21 -0
  258. package/dist/tui/components/select-list.d.ts +22 -0
  259. package/dist/tui/components/select-list.d.ts.map +1 -0
  260. package/dist/tui/components/select-list.js +143 -0
  261. package/dist/tui/components/spacer.d.ts +16 -0
  262. package/dist/tui/components/spacer.d.ts.map +1 -0
  263. package/dist/tui/components/spacer.js +27 -0
  264. package/dist/tui/components/text.d.ts +26 -0
  265. package/dist/tui/components/text.d.ts.map +1 -0
  266. package/dist/tui/components/text.js +143 -0
  267. package/dist/tui/components/thinking-block.d.ts +14 -0
  268. package/dist/tui/components/thinking-block.d.ts.map +1 -0
  269. package/dist/tui/components/thinking-block.js +30 -0
  270. package/dist/tui/components/tool-execution.d.ts +17 -0
  271. package/dist/tui/components/tool-execution.d.ts.map +1 -0
  272. package/dist/tui/components/tool-execution.js +153 -0
  273. package/dist/tui/components/user-message.d.ts +9 -0
  274. package/dist/tui/components/user-message.d.ts.map +1 -0
  275. package/dist/tui/components/user-message.js +21 -0
  276. package/dist/tui/components/welcome.d.ts +6 -0
  277. package/dist/tui/components/welcome.d.ts.map +1 -0
  278. package/dist/tui/components/welcome.js +30 -0
  279. package/dist/tui/index.d.ts +14 -0
  280. package/dist/tui/index.d.ts.map +1 -0
  281. package/dist/tui/index.js +18 -0
  282. package/dist/tui/terminal.d.ts +37 -0
  283. package/dist/tui/terminal.d.ts.map +1 -0
  284. package/dist/tui/terminal.js +104 -0
  285. package/dist/tui/tui.d.ts +67 -0
  286. package/dist/tui/tui.d.ts.map +1 -0
  287. package/dist/tui/tui.js +184 -0
  288. package/dist/tui/utils.d.ts +19 -0
  289. package/dist/tui/utils.d.ts.map +1 -0
  290. package/dist/tui/utils.js +31 -0
  291. package/dist/utils/generators.d.ts +3 -0
  292. package/dist/utils/generators.d.ts.map +1 -0
  293. package/dist/utils/generators.js +25 -0
  294. package/dist/utils/iterables.d.ts +2 -0
  295. package/dist/utils/iterables.d.ts.map +1 -0
  296. package/dist/utils/iterables.js +6 -0
  297. package/package.json +16 -16
  298. package/dist/conversation-analyzer.d.ts +0 -11
  299. package/dist/conversation-analyzer.d.ts.map +0 -1
  300. package/dist/conversation-analyzer.js +0 -88
  301. package/dist/repl-prompt.d.ts +0 -15
  302. package/dist/repl-prompt.d.ts.map +0 -1
  303. package/dist/tokens/manage-output.d.ts +0 -34
  304. package/dist/tokens/manage-output.d.ts.map +0 -1
  305. package/dist/tokens/manage-output.js +0 -44
  306. package/dist/tool-executor.d.ts +0 -28
  307. package/dist/tool-executor.d.ts.map +0 -1
  308. package/dist/tool-executor.js +0 -74
  309. package/dist/tools/file-editing-utils.d.ts +0 -2
  310. package/dist/tools/file-editing-utils.d.ts.map +0 -1
  311. package/dist/tools/file-editing-utils.js +0 -135
@@ -1 +1 @@
1
- {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../source/tools/grep.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,QAAQ;;CAEpB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS;IACtC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,YAAY,EAAE,YAAY,CAAC;CAC5B;;;;;;;;;;;CA0KA,CAAC;AAEF,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1B;AAoDD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,MAAM,CAmDR"}
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../source/tools/grep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,QAAQ;;CAEpB,CAAC;AAEF,QAAA,MAAM,WAAW;;;;;;;;;;iBA2Cf,CAAC;AAEH,KAAK,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEnD,eAAO,MAAM,cAAc,GAAI,SAAS;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE;;;;;;;;;;;;;;;sHAmB7D,eAAe,+BACW,eAAe,GAC3C,cAAc,CAAC,UAAU,CAAC;CAuIhC,CAAC;AAEF,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAQD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAiI9D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,MAAM,CAmDR;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CA4EjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACpC;IAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CA6BpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWxD;AAED,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,MAAM,CAGR;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,UAAU,CAqDZ"}
@@ -1,159 +1,172 @@
1
1
  import { execSync } from "node:child_process";
2
2
  import { inspect } from "node:util";
3
- import { tool } from "ai";
4
3
  import { z } from "zod";
5
4
  import { config } from "../config.js";
6
5
  import style from "../terminal/style.js";
7
- import { manageOutput } from "../tokens/manage-output.js";
6
+ import { manageTokenLimit } from "../tokens/threshold.js";
8
7
  export const GrepTool = {
9
8
  name: "grepFiles",
10
9
  };
10
+ const inputSchema = z.object({
11
+ pattern: z
12
+ .string()
13
+ .describe("The search pattern (regex by default, or fixed-string if literal=true or auto-detected as unbalanced)"),
14
+ path: z.string().describe("The path to search in"),
15
+ recursive: z.coerce
16
+ .boolean()
17
+ .nullable()
18
+ .describe("Search recursively. (default: true))"),
19
+ ignoreCase: z.coerce
20
+ .boolean()
21
+ .nullable()
22
+ .describe("Use case-sensitive search. (default: false)"),
23
+ filePattern: z.coerce
24
+ .string()
25
+ .nullable()
26
+ .describe("Glob pattern to filter files (e.g., '*.ts', '**/*.test.js'). (Default: no filtering)"),
27
+ contextLines: z.coerce
28
+ .number()
29
+ .nullable()
30
+ .describe("The number of context lines needed in search results. (Default: 0)"),
31
+ searchIgnored: z.coerce
32
+ .boolean()
33
+ .nullable()
34
+ .describe("Search ignored files. (Default: false)"),
35
+ literal: z.coerce
36
+ .boolean()
37
+ .nullable()
38
+ .describe("Pass true for fixed-string search (-F), false for regex, (Default: auto-detects unbalanced patterns like mismatched parentheses/brackets.)"),
39
+ maxResults: z.coerce
40
+ .number()
41
+ .nullable()
42
+ .describe("Maximum number of matches to return. Set to 0 for no limit. (Default: configured value)"),
43
+ });
11
44
  export const createGrepTool = (options) => {
12
- const { sendData, tokenCounter } = options;
45
+ const { tokenCounter } = options;
13
46
  return {
14
- [GrepTool.name]: tool({
15
- description: `Search files for patterns using ripgrep (rg). Uses glob patterns for file filtering (e.g., "*.ts", "**/*.test.ts"). Auto-detects unbalanced regex patterns and falls back to fixed-string search for safety.`,
16
- inputSchema: z.object({
17
- pattern: z
18
- .string()
19
- .describe("The search pattern (regex by default, or fixed-string if literal=true or auto-detected as unbalanced)"),
20
- path: z.string().describe("The path to search in"),
21
- recursive: z.coerce
22
- .boolean()
23
- .nullable()
24
- .describe("Search recursively. (default: true))"),
25
- ignoreCase: z.coerce
26
- .boolean()
27
- .nullable()
28
- .describe("Use case-sensitive search. (default: false)"),
29
- filePattern: z
30
- .string()
31
- .nullable()
32
- .describe("Glob pattern to filter files (e.g., '*.ts', '**/*.test.js'). (Default: no filtering)"),
33
- contextLines: z.coerce
34
- .number()
35
- .nullable()
36
- .describe("The number of context lines needed in search results. (Default: 0)"),
37
- searchIgnored: z.coerce
38
- .boolean()
39
- .nullable()
40
- .describe("Search ignored files. (Default: false)"),
41
- literal: z.coerce
42
- .boolean()
43
- .nullable()
44
- .describe("Pass true for fixed-string search (-F), false for regex, (Default: auto-detects unbalanced patterns like mismatched parentheses/brackets.)"),
45
- }),
46
- execute: async ({ pattern, path, recursive, ignoreCase, filePattern, contextLines, searchIgnored, literal, }, { toolCallId, abortSignal }) => {
47
- // Check if execution has been aborted
48
- if (abortSignal?.aborted) {
49
- throw new Error("Grep search aborted");
47
+ toolDef: {
48
+ description: `Search files for patterns using ripgrep (rg). Uses glob patterns for file filtering (e.g., "*.ts", "**/*.test.ts"). Auto-detects unbalanced regex patterns and falls back to fixed-string search for safety. Results are limited to prevent overwhelming output; configure via maxResults parameter.`,
49
+ inputSchema,
50
+ },
51
+ async *execute({ pattern, path, recursive, ignoreCase, filePattern, contextLines, searchIgnored, literal, maxResults, }, { toolCallId, abortSignal }) {
52
+ // Check if execution has been aborted
53
+ if (abortSignal?.aborted) {
54
+ throw new Error("Grep search aborted");
55
+ }
56
+ try {
57
+ // grok doesn't follow my instructions
58
+ const safeFilePattern = filePattern === "null" || filePattern === "undefined"
59
+ ? null
60
+ : filePattern;
61
+ // Enhanced tool-init with detailed search parameters
62
+ let initMessage = `${style.cyan(inspect(pattern))} in ${style.cyan(path)}`;
63
+ if (safeFilePattern) {
64
+ initMessage += ` ${style.dim(`(filter: ${safeFilePattern})`)}`;
50
65
  }
51
- try {
52
- // grok doesn't follow my instructions
53
- const safeFilePattern = filePattern === "null" ? null : filePattern;
54
- sendData?.({
55
- event: "tool-init",
56
- id: toolCallId,
57
- data: `Searching codebase for ${style.cyan(inspect(pattern))}${safeFilePattern ? ` with file pattern ${style.cyan(safeFilePattern)}` : ""} in ${style.cyan(path)}`,
58
- });
59
- // Normalize literal option: if null => auto-detect using heuristic
60
- let effectiveLiteral = null;
61
- if (literal === true) {
62
- effectiveLiteral = true;
63
- }
64
- else if (literal === false) {
65
- effectiveLiteral = false;
66
- }
67
- else {
68
- // auto-detect
69
- try {
70
- if (likelyUnbalancedRegex(pattern)) {
71
- effectiveLiteral = true;
72
- sendData?.({
73
- event: "tool-update",
74
- id: toolCallId,
75
- data: {
76
- primary: "Pattern appears to contain unbalanced regex metacharacters; using fixed-string mode (-F).",
77
- },
78
- });
79
- }
80
- else {
81
- effectiveLiteral = false;
82
- }
66
+ if (recursive === false) {
67
+ initMessage += ` ${style.dim("(non-recursive)")}`;
68
+ }
69
+ if (ignoreCase) {
70
+ initMessage += ` ${style.dim("(case-insensitive)")}`;
71
+ }
72
+ if (contextLines && contextLines > 0) {
73
+ initMessage += ` ${style.dim(`(with ${contextLines} context line${contextLines === 1 ? "" : "s"})`)}`;
74
+ }
75
+ yield {
76
+ name: GrepTool.name,
77
+ event: "tool-init",
78
+ id: toolCallId,
79
+ data: initMessage,
80
+ };
81
+ // Normalize literal option: if null => auto-detect using heuristic
82
+ let effectiveLiteral = null;
83
+ if (literal === true) {
84
+ effectiveLiteral = true;
85
+ }
86
+ else if (literal === false) {
87
+ effectiveLiteral = false;
88
+ }
89
+ else {
90
+ // auto-detect
91
+ try {
92
+ if (likelyUnbalancedRegex(pattern)) {
93
+ effectiveLiteral = true;
83
94
  }
84
- catch (_err) {
95
+ else {
85
96
  effectiveLiteral = false;
86
97
  }
87
98
  }
88
- const rawResult = grepFiles(pattern, path, {
89
- recursive,
90
- ignoreCase,
91
- filePattern: safeFilePattern,
92
- contextLines,
93
- searchIgnored,
94
- literal: effectiveLiteral,
95
- });
96
- const maxTokens = (await config.readProjectConfig()).tools.maxTokens;
97
- const managed = manageOutput(rawResult, {
98
- tokenCounter,
99
- threshold: maxTokens,
100
- });
101
- if (managed.truncated) {
102
- sendData?.({
103
- event: "tool-update",
104
- id: toolCallId,
105
- data: { primary: managed.warning },
106
- });
99
+ catch (_err) {
100
+ effectiveLiteral = false;
107
101
  }
108
- // Extract and filter matches from the content
109
- const extractMatches = (content) => {
110
- if (content === "No matches found.") {
111
- return [];
112
- }
113
- return content
114
- .trim()
115
- .split("\n")
116
- .filter((line) => {
117
- if (line === "--") {
118
- return false;
119
- }
120
- return /^(.+?):(\d+):(.*)$/.test(line);
121
- });
122
- };
123
- const matches = extractMatches(managed.content);
124
- const matchCount = matches.length;
125
- // Show the last 10 matches as a preview
126
- if (matchCount > 0) {
127
- const previewMatches = matches.slice(-10); // Get last 10 matches
128
- sendData?.({
129
- event: "tool-update",
130
- id: toolCallId,
131
- data: {
132
- primary: `Last ${previewMatches.length} matches:`,
133
- secondary: previewMatches,
134
- },
135
- });
102
+ }
103
+ const projectConfig = await config.readProjectConfig();
104
+ const configMaxResults = projectConfig.tools.maxResults;
105
+ const effectiveMaxResults = maxResults ?? configMaxResults;
106
+ const grepResult = grepFilesStructured(pattern, path, {
107
+ recursive,
108
+ ignoreCase,
109
+ filePattern: safeFilePattern,
110
+ contextLines,
111
+ searchIgnored,
112
+ literal: effectiveLiteral,
113
+ maxResults: effectiveMaxResults,
114
+ });
115
+ const result = await manageTokenLimit(grepResult.rawOutput, tokenCounter, "Grep", "Use maxResults parameter, more specific patterns, or contextLines=0 to reduce output");
116
+ const matchCount = grepResult.matchCount;
117
+ // Build completion message with preview information
118
+ let completionMessage = `Found ${style.cyan(matchCount)} match${matchCount === 1 ? "" : "es"}`;
119
+ if (matchCount === 0) {
120
+ completionMessage = "Search completed - no matches found";
121
+ }
122
+ // Calculate unique files with matches
123
+ const filesWithMatches = new Set(grepResult.parsedMatches
124
+ .filter((match) => match.isMatch && !match.isContext && match.file)
125
+ .map((match) => match.file)).size;
126
+ if (filesWithMatches > 0) {
127
+ completionMessage += ` across ${style.cyan(filesWithMatches)} file${filesWithMatches === 1 ? "" : "s"}`;
128
+ }
129
+ if (grepResult.contextCount > 0) {
130
+ completionMessage += ` with ${style.cyan(grepResult.contextCount)} context line${grepResult.contextCount === 1 ? "" : "s"}`;
131
+ }
132
+ completionMessage += ` (${result.tokenCount} tokens)`;
133
+ yield {
134
+ name: GrepTool.name,
135
+ event: "tool-completion",
136
+ id: toolCallId,
137
+ data: completionMessage,
138
+ };
139
+ yield result.content;
140
+ }
141
+ catch (error) {
142
+ const errorMessage = error.message;
143
+ let userFriendlyError = `Error searching for "${pattern}" in ${path}: ${errorMessage}`;
144
+ // Provide more helpful error messages for common cases
145
+ if (errorMessage.includes("No such file or directory")) {
146
+ userFriendlyError = `Path not found: "${path}"`;
147
+ if (filePattern) {
148
+ userFriendlyError += ` with file pattern "${filePattern}"`;
136
149
  }
137
- sendData?.({
138
- event: "tool-completion",
139
- id: toolCallId,
140
- data: `Found ${style.cyan(matchCount)} matches. (${managed.tokenCount} tokens)`,
141
- });
142
- return Promise.resolve(managed.content);
150
+ userFriendlyError += " - check if the path exists and is accessible";
143
151
  }
144
- catch (error) {
145
- sendData?.({
146
- event: "tool-error",
147
- id: toolCallId,
148
- data: `Error searching for "${pattern}" in ${path}`,
149
- });
150
- return Promise.resolve(error.message);
152
+ else if (errorMessage.includes("permission denied")) {
153
+ userFriendlyError = `Permission denied accessing "${path}"`;
151
154
  }
152
- },
153
- }),
155
+ else if (errorMessage.includes("Regex parse error")) {
156
+ userFriendlyError = `Invalid search pattern "${pattern}" - try using literal=true for fixed-string search`;
157
+ }
158
+ yield {
159
+ name: GrepTool.name,
160
+ event: "tool-error",
161
+ id: toolCallId,
162
+ data: userFriendlyError,
163
+ };
164
+ yield errorMessage;
165
+ }
166
+ },
154
167
  };
155
168
  };
156
- function likelyUnbalancedRegex(pattern) {
169
+ export function likelyUnbalancedRegex(pattern) {
157
170
  const counts = {
158
171
  openParen: 0,
159
172
  closeParen: 0,
@@ -163,6 +176,7 @@ function likelyUnbalancedRegex(pattern) {
163
176
  closeBrace: 0,
164
177
  };
165
178
  let escaped = false;
179
+ let inCharacterClass = false;
166
180
  for (let i = 0; i < pattern.length; i++) {
167
181
  const ch = pattern[i];
168
182
  if (escaped) {
@@ -173,32 +187,105 @@ function likelyUnbalancedRegex(pattern) {
173
187
  escaped = true;
174
188
  continue;
175
189
  }
176
- switch (ch) {
177
- case "(":
178
- counts.openParen++;
179
- break;
180
- case ")":
181
- counts.closeParen++;
182
- break;
183
- case "[":
184
- counts.openBracket++;
185
- break;
186
- case "]":
187
- counts.closeBracket++;
188
- break;
189
- case "{":
190
- counts.openBrace++;
191
- break;
192
- case "}":
193
- counts.closeBrace++;
194
- break;
195
- default:
196
- break;
190
+ // Track character class boundaries
191
+ if (ch === "[" && !inCharacterClass) {
192
+ inCharacterClass = true;
193
+ counts.openBracket++;
194
+ continue;
195
+ }
196
+ if (ch === "]" && inCharacterClass) {
197
+ inCharacterClass = false;
198
+ counts.closeBracket++;
199
+ continue;
200
+ }
201
+ // Only count brackets/parens/braces outside of character classes
202
+ if (!inCharacterClass) {
203
+ switch (ch) {
204
+ case "(":
205
+ counts.openParen++;
206
+ break;
207
+ case ")":
208
+ counts.closeParen++;
209
+ break;
210
+ case "{":
211
+ counts.openBrace++;
212
+ break;
213
+ case "}":
214
+ counts.closeBrace++;
215
+ break;
216
+ default:
217
+ break;
218
+ }
197
219
  }
198
220
  }
199
- return (counts.openParen !== counts.closeParen ||
200
- counts.openBracket !== counts.closeBracket ||
201
- counts.openBrace !== counts.closeBrace);
221
+ // Check for unbalanced brackets, parentheses, and braces
222
+ const hasUnbalancedBrackets = counts.openBracket !== counts.closeBracket;
223
+ const hasUnbalancedParens = counts.openParen !== counts.closeParen;
224
+ const hasUnbalancedBraces = counts.openBrace !== counts.closeBrace;
225
+ // Also check for invalid repetition operators (e.g., {n}, {n,}, {n,m}) outside of character classes
226
+ let hasInvalidRepetition = false;
227
+ {
228
+ let escaped2 = false;
229
+ let inClass2 = false;
230
+ for (let i = 0; i < pattern.length; i++) {
231
+ const ch = pattern[i];
232
+ if (escaped2) {
233
+ escaped2 = false;
234
+ continue;
235
+ }
236
+ if (ch === "\\") {
237
+ escaped2 = true;
238
+ continue;
239
+ }
240
+ if (ch === "[" && !inClass2) {
241
+ inClass2 = true;
242
+ continue;
243
+ }
244
+ if (ch === "]" && inClass2) {
245
+ inClass2 = false;
246
+ continue;
247
+ }
248
+ if (inClass2) {
249
+ continue;
250
+ }
251
+ if (ch === "{") {
252
+ let j = i + 1;
253
+ let hasDigits = false;
254
+ let hasComma = false;
255
+ while (j < pattern.length && pattern[j] !== "}") {
256
+ const c = pattern[j];
257
+ if (c >= "0" && c <= "9") {
258
+ hasDigits = true;
259
+ }
260
+ else if (c === "," && !hasComma) {
261
+ hasComma = true;
262
+ }
263
+ else {
264
+ break;
265
+ }
266
+ j++;
267
+ }
268
+ if (j >= pattern.length || pattern[j] !== "}") {
269
+ hasInvalidRepetition = true;
270
+ break;
271
+ }
272
+ // At this point we have a closing brace at j
273
+ if (!hasDigits) {
274
+ // Heuristic: treat empty {} as non-quantifier when it doesn't follow a likely atom
275
+ const prev = i > 0 ? pattern[i - 1] : undefined;
276
+ if (prev !== undefined && /\S/.test(prev)) {
277
+ hasInvalidRepetition = true;
278
+ break;
279
+ }
280
+ // else ignore as literal braces
281
+ }
282
+ }
283
+ }
284
+ }
285
+ return (hasUnbalancedBrackets ||
286
+ hasUnbalancedParens ||
287
+ hasUnbalancedBraces ||
288
+ hasInvalidRepetition);
202
289
  }
203
290
  /**
204
291
  * Search files for patterns using ripgrep
@@ -246,21 +333,179 @@ export function buildGrepCommand(pattern, path, options = {}) {
246
333
  command += " -F";
247
334
  }
248
335
  command += ` ${JSON.stringify(pattern)}`;
249
- command += ` ${path}`;
336
+ command += ` ${JSON.stringify(path)}`;
250
337
  return command;
251
338
  }
252
- function grepFiles(pattern, path, options = {}) {
339
+ /**
340
+ * Parse ripgrep output and extract structured match information
341
+ */
342
+ export function parseRipgrepOutput(content) {
343
+ if (content === "No matches found.") {
344
+ return [];
345
+ }
346
+ const lines = content.trim().split("\n");
347
+ const parsed = [];
348
+ for (const line of lines) {
349
+ if (line === "--") {
350
+ // Separator between file groups - skip
351
+ continue;
352
+ }
353
+ if (line.trim() === "") {
354
+ // Empty line - skip
355
+ continue;
356
+ }
357
+ // Try multi-file format: file:line:content
358
+ const multiFileMatch = line.match(/^([^:]+):(\d+):(.+)$/);
359
+ if (multiFileMatch) {
360
+ parsed.push({
361
+ file: multiFileMatch[1],
362
+ line: Number.parseInt(multiFileMatch[2], 10),
363
+ content: multiFileMatch[3],
364
+ isMatch: true,
365
+ });
366
+ continue;
367
+ }
368
+ // Try single-file format: line:content
369
+ const singleFileMatch = line.match(/^(\d+):(.+)$/);
370
+ if (singleFileMatch) {
371
+ parsed.push({
372
+ line: Number.parseInt(singleFileMatch[1], 10),
373
+ content: singleFileMatch[2],
374
+ isMatch: true,
375
+ });
376
+ continue;
377
+ }
378
+ // Try context line format: file-line-context
379
+ const contextMatch = line.match(/^([^:]+)-(\d+)-(.+)$/);
380
+ if (contextMatch) {
381
+ parsed.push({
382
+ file: contextMatch[1],
383
+ line: Number.parseInt(contextMatch[2], 10),
384
+ content: contextMatch[3],
385
+ isMatch: false,
386
+ isContext: true,
387
+ });
388
+ continue;
389
+ }
390
+ // Try context line format without file: line-context
391
+ const contextNoFileMatch = line.match(/^(\d+)-(.+)$/);
392
+ if (contextNoFileMatch) {
393
+ parsed.push({
394
+ line: Number.parseInt(contextNoFileMatch[1], 10),
395
+ content: contextNoFileMatch[2],
396
+ isMatch: false,
397
+ isContext: true,
398
+ });
399
+ continue;
400
+ }
401
+ // If we get here, it's an unrecognized format - treat as match for backwards compatibility
402
+ parsed.push({
403
+ content: line,
404
+ line: 0,
405
+ isMatch: true,
406
+ });
407
+ }
408
+ return parsed;
409
+ }
410
+ /**
411
+ * Count actual matches (excluding context lines)
412
+ */
413
+ export function countActualMatches(parsed) {
414
+ return parsed.filter((match) => match.isMatch && !match.isContext).length;
415
+ }
416
+ /**
417
+ * Count context lines
418
+ */
419
+ export function countContextLines(parsed) {
420
+ return parsed.filter((match) => match.isContext).length;
421
+ }
422
+ /**
423
+ * Truncate matches to a maximum number of results
424
+ */
425
+ export function truncateMatches(matches, maxResults) {
426
+ if (!maxResults || maxResults <= 0) {
427
+ return { truncated: matches, isTruncated: false };
428
+ }
429
+ const actualMatches = matches.filter((m) => m.isMatch && !m.isContext);
430
+ if (actualMatches.length <= maxResults) {
431
+ return { truncated: matches, isTruncated: false };
432
+ }
433
+ const truncated = [];
434
+ let matchesKept = 0;
435
+ for (const match of matches) {
436
+ if (match.isMatch && !match.isContext) {
437
+ if (matchesKept < maxResults) {
438
+ truncated.push(match);
439
+ matchesKept++;
440
+ }
441
+ else {
442
+ break;
443
+ }
444
+ }
445
+ }
446
+ return {
447
+ truncated,
448
+ isTruncated: true,
449
+ };
450
+ }
451
+ /**
452
+ * Extract matches from content (backwards compatibility wrapper)
453
+ */
454
+ export function extractMatches(content) {
455
+ const parsed = parseRipgrepOutput(content);
456
+ const matches = parsed.filter((match) => match.isMatch && !match.isContext);
457
+ // Convert back to original string format for backwards compatibility
458
+ return matches.map((match) => {
459
+ if (match.file) {
460
+ return `${match.file}:${match.line}:${match.content}`;
461
+ }
462
+ return `${match.line}:${match.content}`;
463
+ });
464
+ }
465
+ export function grepFiles(pattern, path, options = {}) {
466
+ const result = grepFilesStructured(pattern, path, options);
467
+ return result.rawOutput;
468
+ }
469
+ export function grepFilesStructured(pattern, path, options = {}) {
253
470
  try {
254
471
  const command = buildGrepCommand(pattern, path, options);
255
- const result = execSync(command, { encoding: "utf-8" });
256
- return result;
472
+ const rawOutput = execSync(command, {
473
+ encoding: "utf-8",
474
+ stdio: ["pipe", "pipe", "pipe"],
475
+ });
476
+ const parsedMatches = parseRipgrepOutput(rawOutput);
477
+ const matchCount = countActualMatches(parsedMatches);
478
+ const { truncated, isTruncated } = truncateMatches(parsedMatches, options.maxResults);
479
+ const displayedCount = countActualMatches(truncated);
480
+ const displayedContextCount = countContextLines(truncated);
481
+ return {
482
+ rawOutput,
483
+ parsedMatches: truncated,
484
+ matchCount,
485
+ displayedCount,
486
+ contextCount: displayedContextCount,
487
+ hasMatches: matchCount > 0,
488
+ isTruncated,
489
+ };
257
490
  }
258
491
  catch (error) {
259
- if (error instanceof Error &&
260
- "status" in error &&
261
- error.status === 1) {
262
- return "No matches found.";
492
+ const execError = error;
493
+ const exitCode = execError?.status;
494
+ if (exitCode === 1) {
495
+ return {
496
+ rawOutput: "No matches found.",
497
+ parsedMatches: [],
498
+ matchCount: 0,
499
+ contextCount: 0,
500
+ hasMatches: false,
501
+ };
502
+ }
503
+ if (exitCode === 2) {
504
+ const stderrStr = typeof execError.stderr === "string"
505
+ ? execError.stderr
506
+ : (execError.stderr?.toString("utf-8") ?? execError.message);
507
+ throw new Error(`Regex parse error in pattern "${pattern}": ${stderrStr}`);
263
508
  }
264
- throw new Error(`Error executing ripgrep: ${error.message}`);
509
+ throw new Error(`Error executing ripgrep: ${execError.message}`);
265
510
  }
266
511
  }