@cdoing/core 0.1.0

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 (378) hide show
  1. package/dist/agents/coordinator.d.ts +114 -0
  2. package/dist/agents/coordinator.d.ts.map +1 -0
  3. package/dist/agents/coordinator.js +158 -0
  4. package/dist/agents/coordinator.js.map +1 -0
  5. package/dist/context-providers/clipboard.d.ts +13 -0
  6. package/dist/context-providers/clipboard.d.ts.map +1 -0
  7. package/dist/context-providers/clipboard.js +53 -0
  8. package/dist/context-providers/clipboard.js.map +1 -0
  9. package/dist/context-providers/codebase.d.ts +46 -0
  10. package/dist/context-providers/codebase.d.ts.map +1 -0
  11. package/dist/context-providers/codebase.js +273 -0
  12. package/dist/context-providers/codebase.js.map +1 -0
  13. package/dist/context-providers/diff.d.ts +18 -0
  14. package/dist/context-providers/diff.d.ts.map +1 -0
  15. package/dist/context-providers/diff.js +63 -0
  16. package/dist/context-providers/diff.js.map +1 -0
  17. package/dist/context-providers/docs.d.ts +21 -0
  18. package/dist/context-providers/docs.d.ts.map +1 -0
  19. package/dist/context-providers/docs.js +180 -0
  20. package/dist/context-providers/docs.js.map +1 -0
  21. package/dist/context-providers/file-include.d.ts +13 -0
  22. package/dist/context-providers/file-include.d.ts.map +1 -0
  23. package/dist/context-providers/file-include.js +82 -0
  24. package/dist/context-providers/file-include.js.map +1 -0
  25. package/dist/context-providers/folder.d.ts +19 -0
  26. package/dist/context-providers/folder.d.ts.map +1 -0
  27. package/dist/context-providers/folder.js +130 -0
  28. package/dist/context-providers/folder.js.map +1 -0
  29. package/dist/context-providers/git.d.ts +19 -0
  30. package/dist/context-providers/git.d.ts.map +1 -0
  31. package/dist/context-providers/git.js +74 -0
  32. package/dist/context-providers/git.js.map +1 -0
  33. package/dist/context-providers/index.d.ts +26 -0
  34. package/dist/context-providers/index.d.ts.map +1 -0
  35. package/dist/context-providers/index.js +37 -0
  36. package/dist/context-providers/index.js.map +1 -0
  37. package/dist/context-providers/open-files.d.ts +25 -0
  38. package/dist/context-providers/open-files.d.ts.map +1 -0
  39. package/dist/context-providers/open-files.js +134 -0
  40. package/dist/context-providers/open-files.js.map +1 -0
  41. package/dist/context-providers/problems.d.ts +24 -0
  42. package/dist/context-providers/problems.d.ts.map +1 -0
  43. package/dist/context-providers/problems.js +97 -0
  44. package/dist/context-providers/problems.js.map +1 -0
  45. package/dist/context-providers/registry.d.ts +61 -0
  46. package/dist/context-providers/registry.d.ts.map +1 -0
  47. package/dist/context-providers/registry.js +92 -0
  48. package/dist/context-providers/registry.js.map +1 -0
  49. package/dist/context-providers/terminal.d.ts +25 -0
  50. package/dist/context-providers/terminal.d.ts.map +1 -0
  51. package/dist/context-providers/terminal.js +55 -0
  52. package/dist/context-providers/terminal.js.map +1 -0
  53. package/dist/context-providers/tree.d.ts +29 -0
  54. package/dist/context-providers/tree.d.ts.map +1 -0
  55. package/dist/context-providers/tree.js +172 -0
  56. package/dist/context-providers/tree.js.map +1 -0
  57. package/dist/context-providers/types.d.ts +72 -0
  58. package/dist/context-providers/types.d.ts.map +1 -0
  59. package/dist/context-providers/types.js +10 -0
  60. package/dist/context-providers/types.js.map +1 -0
  61. package/dist/context-providers/url.d.ts +27 -0
  62. package/dist/context-providers/url.d.ts.map +1 -0
  63. package/dist/context-providers/url.js +131 -0
  64. package/dist/context-providers/url.js.map +1 -0
  65. package/dist/effort/index.d.ts +78 -0
  66. package/dist/effort/index.d.ts.map +1 -0
  67. package/dist/effort/index.js +146 -0
  68. package/dist/effort/index.js.map +1 -0
  69. package/dist/hooks/index.d.ts +47 -0
  70. package/dist/hooks/index.d.ts.map +1 -0
  71. package/dist/hooks/index.js +151 -0
  72. package/dist/hooks/index.js.map +1 -0
  73. package/dist/index.d.ts +75 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +152 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/indexing/chunker.d.ts +25 -0
  78. package/dist/indexing/chunker.d.ts.map +1 -0
  79. package/dist/indexing/chunker.js +217 -0
  80. package/dist/indexing/chunker.js.map +1 -0
  81. package/dist/indexing/database.d.ts +49 -0
  82. package/dist/indexing/database.d.ts.map +1 -0
  83. package/dist/indexing/database.js +287 -0
  84. package/dist/indexing/database.js.map +1 -0
  85. package/dist/indexing/index.d.ts +9 -0
  86. package/dist/indexing/index.d.ts.map +1 -0
  87. package/dist/indexing/index.js +13 -0
  88. package/dist/indexing/index.js.map +1 -0
  89. package/dist/indexing/indexer.d.ts +63 -0
  90. package/dist/indexing/indexer.d.ts.map +1 -0
  91. package/dist/indexing/indexer.js +352 -0
  92. package/dist/indexing/indexer.js.map +1 -0
  93. package/dist/indexing/recent-edits-cache.d.ts +77 -0
  94. package/dist/indexing/recent-edits-cache.d.ts.map +1 -0
  95. package/dist/indexing/recent-edits-cache.js +123 -0
  96. package/dist/indexing/recent-edits-cache.js.map +1 -0
  97. package/dist/indexing/types.d.ts +39 -0
  98. package/dist/indexing/types.d.ts.map +1 -0
  99. package/dist/indexing/types.js +6 -0
  100. package/dist/indexing/types.js.map +1 -0
  101. package/dist/mcp/index.d.ts +33 -0
  102. package/dist/mcp/index.d.ts.map +1 -0
  103. package/dist/mcp/index.js +37 -0
  104. package/dist/mcp/index.js.map +1 -0
  105. package/dist/mcp/manager.d.ts +123 -0
  106. package/dist/mcp/manager.d.ts.map +1 -0
  107. package/dist/mcp/manager.js +331 -0
  108. package/dist/mcp/manager.js.map +1 -0
  109. package/dist/oauth.d.ts +33 -0
  110. package/dist/oauth.d.ts.map +1 -0
  111. package/dist/oauth.js +312 -0
  112. package/dist/oauth.js.map +1 -0
  113. package/dist/permissions/index.d.ts +216 -0
  114. package/dist/permissions/index.d.ts.map +1 -0
  115. package/dist/permissions/index.js +938 -0
  116. package/dist/permissions/index.js.map +1 -0
  117. package/dist/plan/index.d.ts +20 -0
  118. package/dist/plan/index.d.ts.map +1 -0
  119. package/dist/plan/index.js +24 -0
  120. package/dist/plan/index.js.map +1 -0
  121. package/dist/plan/manager.d.ts +101 -0
  122. package/dist/plan/manager.d.ts.map +1 -0
  123. package/dist/plan/manager.js +170 -0
  124. package/dist/plan/manager.js.map +1 -0
  125. package/dist/rules/index.d.ts +28 -0
  126. package/dist/rules/index.d.ts.map +1 -0
  127. package/dist/rules/index.js +31 -0
  128. package/dist/rules/index.js.map +1 -0
  129. package/dist/rules/manager.d.ts +77 -0
  130. package/dist/rules/manager.d.ts.map +1 -0
  131. package/dist/rules/manager.js +279 -0
  132. package/dist/rules/manager.js.map +1 -0
  133. package/dist/rules/types.d.ts +34 -0
  134. package/dist/rules/types.d.ts.map +1 -0
  135. package/dist/rules/types.js +9 -0
  136. package/dist/rules/types.js.map +1 -0
  137. package/dist/sandbox/filesystem.d.ts +20 -0
  138. package/dist/sandbox/filesystem.d.ts.map +1 -0
  139. package/dist/sandbox/filesystem.js +141 -0
  140. package/dist/sandbox/filesystem.js.map +1 -0
  141. package/dist/sandbox/index.d.ts +4 -0
  142. package/dist/sandbox/index.d.ts.map +1 -0
  143. package/dist/sandbox/index.js +8 -0
  144. package/dist/sandbox/index.js.map +1 -0
  145. package/dist/sandbox/manager.d.ts +47 -0
  146. package/dist/sandbox/manager.d.ts.map +1 -0
  147. package/dist/sandbox/manager.js +220 -0
  148. package/dist/sandbox/manager.js.map +1 -0
  149. package/dist/sandbox/network.d.ts +14 -0
  150. package/dist/sandbox/network.d.ts.map +1 -0
  151. package/dist/sandbox/network.js +87 -0
  152. package/dist/sandbox/network.js.map +1 -0
  153. package/dist/sandbox/types.d.ts +42 -0
  154. package/dist/sandbox/types.d.ts.map +1 -0
  155. package/dist/sandbox/types.js +25 -0
  156. package/dist/sandbox/types.js.map +1 -0
  157. package/dist/tools/ast-edit.d.ts +57 -0
  158. package/dist/tools/ast-edit.d.ts.map +1 -0
  159. package/dist/tools/ast-edit.js +443 -0
  160. package/dist/tools/ast-edit.js.map +1 -0
  161. package/dist/tools/code-verify.d.ts +8 -0
  162. package/dist/tools/code-verify.d.ts.map +1 -0
  163. package/dist/tools/code-verify.js +159 -0
  164. package/dist/tools/code-verify.js.map +1 -0
  165. package/dist/tools/codebase-search.d.ts +17 -0
  166. package/dist/tools/codebase-search.d.ts.map +1 -0
  167. package/dist/tools/codebase-search.js +104 -0
  168. package/dist/tools/codebase-search.js.map +1 -0
  169. package/dist/tools/file-delete.d.ts +26 -0
  170. package/dist/tools/file-delete.d.ts.map +1 -0
  171. package/dist/tools/file-delete.js +179 -0
  172. package/dist/tools/file-delete.js.map +1 -0
  173. package/dist/tools/file-edit.d.ts +10 -0
  174. package/dist/tools/file-edit.d.ts.map +1 -0
  175. package/dist/tools/file-edit.js +138 -0
  176. package/dist/tools/file-edit.js.map +1 -0
  177. package/dist/tools/file-read.d.ts +12 -0
  178. package/dist/tools/file-read.d.ts.map +1 -0
  179. package/dist/tools/file-read.js +211 -0
  180. package/dist/tools/file-read.js.map +1 -0
  181. package/dist/tools/file-run.d.ts +10 -0
  182. package/dist/tools/file-run.d.ts.map +1 -0
  183. package/dist/tools/file-run.js +179 -0
  184. package/dist/tools/file-run.js.map +1 -0
  185. package/dist/tools/file-write.d.ts +10 -0
  186. package/dist/tools/file-write.d.ts.map +1 -0
  187. package/dist/tools/file-write.js +134 -0
  188. package/dist/tools/file-write.js.map +1 -0
  189. package/dist/tools/glob-search.d.ts +8 -0
  190. package/dist/tools/glob-search.d.ts.map +1 -0
  191. package/dist/tools/glob-search.js +108 -0
  192. package/dist/tools/glob-search.js.map +1 -0
  193. package/dist/tools/grep-search.d.ts +8 -0
  194. package/dist/tools/grep-search.d.ts.map +1 -0
  195. package/dist/tools/grep-search.js +139 -0
  196. package/dist/tools/grep-search.js.map +1 -0
  197. package/dist/tools/list-dir.d.ts +16 -0
  198. package/dist/tools/list-dir.d.ts.map +1 -0
  199. package/dist/tools/list-dir.js +183 -0
  200. package/dist/tools/list-dir.js.map +1 -0
  201. package/dist/tools/multi-edit.d.ts +16 -0
  202. package/dist/tools/multi-edit.d.ts.map +1 -0
  203. package/dist/tools/multi-edit.js +163 -0
  204. package/dist/tools/multi-edit.js.map +1 -0
  205. package/dist/tools/notebook-edit.d.ts +31 -0
  206. package/dist/tools/notebook-edit.d.ts.map +1 -0
  207. package/dist/tools/notebook-edit.js +321 -0
  208. package/dist/tools/notebook-edit.js.map +1 -0
  209. package/dist/tools/registry.d.ts +16 -0
  210. package/dist/tools/registry.d.ts.map +1 -0
  211. package/dist/tools/registry.js +41 -0
  212. package/dist/tools/registry.js.map +1 -0
  213. package/dist/tools/shell-exec.d.ts +12 -0
  214. package/dist/tools/shell-exec.d.ts.map +1 -0
  215. package/dist/tools/shell-exec.js +261 -0
  216. package/dist/tools/shell-exec.js.map +1 -0
  217. package/dist/tools/sub-agent-manager.d.ts +57 -0
  218. package/dist/tools/sub-agent-manager.d.ts.map +1 -0
  219. package/dist/tools/sub-agent-manager.js +153 -0
  220. package/dist/tools/sub-agent-manager.js.map +1 -0
  221. package/dist/tools/sub-agent-status.d.ts +12 -0
  222. package/dist/tools/sub-agent-status.d.ts.map +1 -0
  223. package/dist/tools/sub-agent-status.js +59 -0
  224. package/dist/tools/sub-agent-status.js.map +1 -0
  225. package/dist/tools/sub-agent-terminate.d.ts +12 -0
  226. package/dist/tools/sub-agent-terminate.d.ts.map +1 -0
  227. package/dist/tools/sub-agent-terminate.js +55 -0
  228. package/dist/tools/sub-agent-terminate.js.map +1 -0
  229. package/dist/tools/sub-agent.d.ts +34 -0
  230. package/dist/tools/sub-agent.d.ts.map +1 -0
  231. package/dist/tools/sub-agent.js +140 -0
  232. package/dist/tools/sub-agent.js.map +1 -0
  233. package/dist/tools/system-info.d.ts +24 -0
  234. package/dist/tools/system-info.d.ts.map +1 -0
  235. package/dist/tools/system-info.js +220 -0
  236. package/dist/tools/system-info.js.map +1 -0
  237. package/dist/tools/todo.d.ts +16 -0
  238. package/dist/tools/todo.d.ts.map +1 -0
  239. package/dist/tools/todo.js +144 -0
  240. package/dist/tools/todo.js.map +1 -0
  241. package/dist/tools/types.d.ts +20 -0
  242. package/dist/tools/types.d.ts.map +1 -0
  243. package/dist/tools/types.js +3 -0
  244. package/dist/tools/types.js.map +1 -0
  245. package/dist/tools/view-diff.d.ts +11 -0
  246. package/dist/tools/view-diff.d.ts.map +1 -0
  247. package/dist/tools/view-diff.js +88 -0
  248. package/dist/tools/view-diff.js.map +1 -0
  249. package/dist/tools/view-repo-map.d.ts +18 -0
  250. package/dist/tools/view-repo-map.d.ts.map +1 -0
  251. package/dist/tools/view-repo-map.js +245 -0
  252. package/dist/tools/view-repo-map.js.map +1 -0
  253. package/dist/tools/web-fetch.d.ts +13 -0
  254. package/dist/tools/web-fetch.d.ts.map +1 -0
  255. package/dist/tools/web-fetch.js +106 -0
  256. package/dist/tools/web-fetch.js.map +1 -0
  257. package/dist/tools/web-search.d.ts +10 -0
  258. package/dist/tools/web-search.d.ts.map +1 -0
  259. package/dist/tools/web-search.js +106 -0
  260. package/dist/tools/web-search.js.map +1 -0
  261. package/dist/utils/gitignore.d.ts +10 -0
  262. package/dist/utils/gitignore.d.ts.map +1 -0
  263. package/dist/utils/gitignore.js +104 -0
  264. package/dist/utils/gitignore.js.map +1 -0
  265. package/dist/utils/lazy-apply.d.ts +45 -0
  266. package/dist/utils/lazy-apply.d.ts.map +1 -0
  267. package/dist/utils/lazy-apply.js +164 -0
  268. package/dist/utils/lazy-apply.js.map +1 -0
  269. package/dist/utils/memory.d.ts +36 -0
  270. package/dist/utils/memory.d.ts.map +1 -0
  271. package/dist/utils/memory.js +136 -0
  272. package/dist/utils/memory.js.map +1 -0
  273. package/dist/utils/path-matching.d.ts +24 -0
  274. package/dist/utils/path-matching.d.ts.map +1 -0
  275. package/dist/utils/path-matching.js +116 -0
  276. package/dist/utils/path-matching.js.map +1 -0
  277. package/dist/utils/path-safety.d.ts +13 -0
  278. package/dist/utils/path-safety.d.ts.map +1 -0
  279. package/dist/utils/path-safety.js +54 -0
  280. package/dist/utils/path-safety.js.map +1 -0
  281. package/dist/utils/project-config.d.ts +18 -0
  282. package/dist/utils/project-config.d.ts.map +1 -0
  283. package/dist/utils/project-config.js +76 -0
  284. package/dist/utils/project-config.js.map +1 -0
  285. package/dist/utils/search-match.d.ts +63 -0
  286. package/dist/utils/search-match.d.ts.map +1 -0
  287. package/dist/utils/search-match.js +426 -0
  288. package/dist/utils/search-match.js.map +1 -0
  289. package/dist/utils/shell-paths.d.ts +17 -0
  290. package/dist/utils/shell-paths.d.ts.map +1 -0
  291. package/dist/utils/shell-paths.js +107 -0
  292. package/dist/utils/shell-paths.js.map +1 -0
  293. package/dist/utils/streaming-diff.d.ts +45 -0
  294. package/dist/utils/streaming-diff.d.ts.map +1 -0
  295. package/dist/utils/streaming-diff.js +230 -0
  296. package/dist/utils/streaming-diff.js.map +1 -0
  297. package/dist/utils/todo.d.ts +47 -0
  298. package/dist/utils/todo.d.ts.map +1 -0
  299. package/dist/utils/todo.js +102 -0
  300. package/dist/utils/todo.js.map +1 -0
  301. package/package.json +23 -0
  302. package/src/agents/coordinator.ts +240 -0
  303. package/src/context-providers/clipboard.ts +48 -0
  304. package/src/context-providers/codebase.ts +274 -0
  305. package/src/context-providers/diff.ts +66 -0
  306. package/src/context-providers/docs.ts +160 -0
  307. package/src/context-providers/file-include.ts +54 -0
  308. package/src/context-providers/folder.ts +106 -0
  309. package/src/context-providers/git.ts +72 -0
  310. package/src/context-providers/index.ts +26 -0
  311. package/src/context-providers/open-files.ts +113 -0
  312. package/src/context-providers/problems.ts +100 -0
  313. package/src/context-providers/registry.ts +99 -0
  314. package/src/context-providers/terminal.ts +58 -0
  315. package/src/context-providers/tree.ts +161 -0
  316. package/src/context-providers/types.ts +84 -0
  317. package/src/context-providers/url.ts +138 -0
  318. package/src/effort/index.ts +177 -0
  319. package/src/hooks/index.ts +148 -0
  320. package/src/index.ts +114 -0
  321. package/src/indexing/README.md +267 -0
  322. package/src/indexing/chunker.ts +206 -0
  323. package/src/indexing/database.ts +299 -0
  324. package/src/indexing/index.ts +15 -0
  325. package/src/indexing/indexer.ts +383 -0
  326. package/src/indexing/recent-edits-cache.ts +150 -0
  327. package/src/indexing/types.ts +44 -0
  328. package/src/mcp/index.ts +33 -0
  329. package/src/mcp/manager.ts +385 -0
  330. package/src/oauth.ts +330 -0
  331. package/src/permissions/index.ts +1011 -0
  332. package/src/plan/index.ts +20 -0
  333. package/src/plan/manager.ts +233 -0
  334. package/src/rules/index.ts +28 -0
  335. package/src/rules/manager.ts +276 -0
  336. package/src/rules/types.ts +40 -0
  337. package/src/sandbox/filesystem.ts +135 -0
  338. package/src/sandbox/index.ts +9 -0
  339. package/src/sandbox/manager.ts +213 -0
  340. package/src/sandbox/network.ts +101 -0
  341. package/src/sandbox/types.ts +63 -0
  342. package/src/tools/ast-edit.ts +493 -0
  343. package/src/tools/code-verify.ts +143 -0
  344. package/src/tools/codebase-search.ts +117 -0
  345. package/src/tools/file-delete.ts +155 -0
  346. package/src/tools/file-edit.ts +115 -0
  347. package/src/tools/file-read.ts +195 -0
  348. package/src/tools/file-run.ts +158 -0
  349. package/src/tools/file-write.ts +104 -0
  350. package/src/tools/glob-search.ts +80 -0
  351. package/src/tools/grep-search.ts +120 -0
  352. package/src/tools/list-dir.ts +172 -0
  353. package/src/tools/multi-edit.ts +138 -0
  354. package/src/tools/notebook-edit.ts +342 -0
  355. package/src/tools/registry.ts +43 -0
  356. package/src/tools/shell-exec.ts +251 -0
  357. package/src/tools/sub-agent-manager.ts +183 -0
  358. package/src/tools/sub-agent-status.ts +67 -0
  359. package/src/tools/sub-agent-terminate.ts +62 -0
  360. package/src/tools/sub-agent.ts +162 -0
  361. package/src/tools/system-info.ts +248 -0
  362. package/src/tools/todo.ts +149 -0
  363. package/src/tools/types.ts +21 -0
  364. package/src/tools/view-diff.ts +99 -0
  365. package/src/tools/view-repo-map.ts +249 -0
  366. package/src/tools/web-fetch.ts +118 -0
  367. package/src/tools/web-search.ts +129 -0
  368. package/src/utils/gitignore.ts +73 -0
  369. package/src/utils/lazy-apply.ts +189 -0
  370. package/src/utils/memory.ts +124 -0
  371. package/src/utils/path-matching.ts +84 -0
  372. package/src/utils/path-safety.ts +19 -0
  373. package/src/utils/project-config.ts +41 -0
  374. package/src/utils/search-match.ts +495 -0
  375. package/src/utils/shell-paths.ts +79 -0
  376. package/src/utils/streaming-diff.ts +260 -0
  377. package/src/utils/todo.ts +115 -0
  378. package/tsconfig.json +18 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebase-search.d.ts","sourceRoot":"","sources":["../../src/tools/codebase-search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGpE,qBAAa,kBAAmB,YAAW,QAAQ;IACjD,UAAU,EAAE,cAAc,CA+BxB;IAEF,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAA8B;gBAEtC,UAAU,EAAE,MAAM;IAIxB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;YA0CpD,WAAW;CAsB1B"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * Codebase Search Tool — semantic + full-text search across the indexed codebase.
4
+ *
5
+ * Uses the indexing system (SQLite FTS5 + optional embeddings) for fast,
6
+ * ranked code retrieval. Falls back to runtime grep if index not available.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CodebaseSearchTool = void 0;
10
+ const indexing_1 = require("../indexing");
11
+ class CodebaseSearchTool {
12
+ definition = {
13
+ name: "codebase_search",
14
+ description: `Search the entire codebase using natural language or keywords. Uses indexed full-text search (BM25) and optional semantic search (embeddings) for fast, ranked results.
15
+
16
+ The codebase is automatically indexed on first use. Results include file paths, line numbers, and matching code snippets ranked by relevance.
17
+
18
+ Use this for:
19
+ - Finding where a concept is implemented ("authentication middleware")
20
+ - Locating function/class definitions ("UserService class")
21
+ - Understanding how something works ("how errors are handled")
22
+ - Finding usage patterns ("all places that call sendEmail")`,
23
+ inputSchema: {
24
+ type: "object",
25
+ properties: {
26
+ query: {
27
+ type: "string",
28
+ description: "Natural language query or keywords to search for",
29
+ },
30
+ directory: {
31
+ type: "string",
32
+ description: "Optional: limit search to a subdirectory (e.g. 'src/api')",
33
+ },
34
+ limit: {
35
+ type: "number",
36
+ description: "Max results to return. Default: 20.",
37
+ },
38
+ },
39
+ required: ["query"],
40
+ },
41
+ requiresPermission: false,
42
+ };
43
+ indexer = null;
44
+ workingDir;
45
+ indexPromise = null;
46
+ constructor(workingDir) {
47
+ this.workingDir = workingDir;
48
+ }
49
+ async execute(input) {
50
+ const query = input.query;
51
+ const directory = input.directory;
52
+ const limit = input.limit || 20;
53
+ if (!query.trim()) {
54
+ return { success: false, output: "", error: "Query cannot be empty" };
55
+ }
56
+ // Ensure index exists (lazy initialization)
57
+ try {
58
+ await this.ensureIndex();
59
+ }
60
+ catch (err) {
61
+ return { success: false, output: "", error: `Indexing failed: ${err.message}` };
62
+ }
63
+ if (!this.indexer) {
64
+ return { success: false, output: "", error: "Indexer not available" };
65
+ }
66
+ // Search
67
+ const results = await this.indexer.search(query, limit, directory);
68
+ if (results.length === 0) {
69
+ return { success: true, output: `No results found for: "${query}"` };
70
+ }
71
+ // Format results
72
+ const formatted = results.map((r, i) => {
73
+ const header = `### ${i + 1}. ${r.path}:${r.startLine}-${r.endLine} (${r.source}, score: ${r.score.toFixed(3)})`;
74
+ const content = r.content.length > 500
75
+ ? r.content.substring(0, 500) + "\n... [truncated]"
76
+ : r.content;
77
+ return `${header}\n\`\`\`\n${content}\n\`\`\``;
78
+ });
79
+ const stats = this.indexer.getStats();
80
+ const header = `Found ${results.length} results for "${query}" (searched ${stats.totalChunks} chunks across ${stats.totalFiles} files)`;
81
+ return { success: true, output: `${header}\n\n${formatted.join("\n\n")}` };
82
+ }
83
+ async ensureIndex() {
84
+ if (this.indexer)
85
+ return;
86
+ // Prevent concurrent indexing
87
+ if (this.indexPromise) {
88
+ await this.indexPromise;
89
+ return;
90
+ }
91
+ this.indexPromise = (async () => {
92
+ this.indexer = new indexing_1.CodebaseIndexer(this.workingDir);
93
+ const stats = this.indexer.getStats();
94
+ // If index is empty or stale (>1 hour), re-index
95
+ const oneHour = 60 * 60 * 1000;
96
+ if (stats.totalFiles === 0 || Date.now() - stats.lastIndexed > oneHour) {
97
+ await this.indexer.index();
98
+ }
99
+ })();
100
+ await this.indexPromise;
101
+ }
102
+ }
103
+ exports.CodebaseSearchTool = CodebaseSearchTool;
104
+ //# sourceMappingURL=codebase-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebase-search.js","sourceRoot":"","sources":["../../src/tools/codebase-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * File Delete Tool — permission-controlled file/directory deletion.
3
+ *
4
+ * Unlike raw `rm` via shell_exec, this tool:
5
+ * - Goes through the permission system (Delete category — can be allow/deny/ask via settings)
6
+ * - Checks sandbox write rules before deletion
7
+ * - Reports what will be deleted (file count for directories)
8
+ * - Requires explicit recursive flag for directories
9
+ * - Requires force flag for large directories (>50 items)
10
+ *
11
+ * Users can control deletion via settings rules:
12
+ * - Delete → allow/deny all file deletions
13
+ * - Delete(path) → allow/deny deletion of specific paths
14
+ * - Delete(*.log) → allow/deny deletion by pattern
15
+ */
16
+ import type { BaseTool, ToolDefinition, ToolResult } from "./types";
17
+ import type { SandboxManager } from "../sandbox";
18
+ export declare class FileDeleteTool implements BaseTool {
19
+ definition: ToolDefinition;
20
+ private workingDir;
21
+ private sandboxManager?;
22
+ constructor(workingDir: string, sandboxManager?: SandboxManager);
23
+ execute(input: Record<string, unknown>): Promise<ToolResult>;
24
+ private countItems;
25
+ }
26
+ //# sourceMappingURL=file-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-delete.d.ts","sourceRoot":"","sources":["../../src/tools/file-delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,qBAAa,cAAe,YAAW,QAAQ;IAC7C,UAAU,EAAE,cAAc,CA2BxB;IAEF,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc;IAKzD,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IA2ElE,OAAO,CAAC,UAAU;CAiBnB"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * File Delete Tool — permission-controlled file/directory deletion.
4
+ *
5
+ * Unlike raw `rm` via shell_exec, this tool:
6
+ * - Goes through the permission system (Delete category — can be allow/deny/ask via settings)
7
+ * - Checks sandbox write rules before deletion
8
+ * - Reports what will be deleted (file count for directories)
9
+ * - Requires explicit recursive flag for directories
10
+ * - Requires force flag for large directories (>50 items)
11
+ *
12
+ * Users can control deletion via settings rules:
13
+ * - Delete → allow/deny all file deletions
14
+ * - Delete(path) → allow/deny deletion of specific paths
15
+ * - Delete(*.log) → allow/deny deletion by pattern
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.FileDeleteTool = void 0;
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const path_safety_1 = require("../utils/path-safety");
55
+ const MAX_DIR_FILES = 50;
56
+ class FileDeleteTool {
57
+ definition = {
58
+ name: "file_delete",
59
+ description: `Delete a file or directory. You can also use shell_exec with rm/del for simple deletions if preferred.`,
60
+ inputSchema: {
61
+ type: "object",
62
+ properties: {
63
+ file_path: {
64
+ type: "string",
65
+ description: "Path to the file or directory to delete",
66
+ },
67
+ recursive: {
68
+ type: "boolean",
69
+ description: "Required for directory deletion. Deletes all contents. Default: false.",
70
+ },
71
+ force: {
72
+ type: "boolean",
73
+ description: "Required for directories with more than 50 items. Default: false.",
74
+ },
75
+ },
76
+ required: ["file_path"],
77
+ },
78
+ requiresPermission: true,
79
+ permissionMessage: (input) => {
80
+ const recursive = input.recursive ? " (recursive)" : "";
81
+ return `Delete${recursive}: ${input.file_path}`;
82
+ },
83
+ };
84
+ workingDir;
85
+ sandboxManager;
86
+ constructor(workingDir, sandboxManager) {
87
+ this.workingDir = workingDir;
88
+ this.sandboxManager = sandboxManager;
89
+ }
90
+ async execute(input) {
91
+ let filePath;
92
+ try {
93
+ filePath = (0, path_safety_1.safePath)(input.file_path, this.workingDir);
94
+ }
95
+ catch (err) {
96
+ return { success: false, output: "", error: err.message };
97
+ }
98
+ const recursive = input.recursive || false;
99
+ const force = input.force || false;
100
+ // Sandbox write check (deletion requires write access to parent)
101
+ if (this.sandboxManager) {
102
+ const check = this.sandboxManager.checkFileWrite(filePath);
103
+ if (!check.allowed) {
104
+ return { success: false, output: "", error: check.reason || "Sandbox: delete access denied" };
105
+ }
106
+ }
107
+ // Existence check
108
+ if (!fs.existsSync(filePath)) {
109
+ return { success: false, output: "", error: `Path not found: ${filePath}` };
110
+ }
111
+ const stat = fs.statSync(filePath);
112
+ // ── File deletion ─────────────────────────────────────────────────────────
113
+ if (stat.isFile() || stat.isSymbolicLink()) {
114
+ try {
115
+ fs.unlinkSync(filePath);
116
+ return { success: true, output: `Deleted file: ${filePath}` };
117
+ }
118
+ catch (err) {
119
+ return { success: false, output: "", error: `Failed to delete: ${err.message}` };
120
+ }
121
+ }
122
+ // ── Directory deletion ────────────────────────────────────────────────────
123
+ if (!stat.isDirectory()) {
124
+ return { success: false, output: "", error: `Unsupported file type at: ${filePath}` };
125
+ }
126
+ if (!recursive) {
127
+ // Show what's inside so the user can make an informed decision
128
+ const entries = fs.readdirSync(filePath);
129
+ const preview = entries.slice(0, 10).join(", ");
130
+ const more = entries.length > 10 ? ` ... and ${entries.length - 10} more` : "";
131
+ return {
132
+ success: false,
133
+ output: "",
134
+ error: `"${filePath}" is a directory with ${entries.length} items (${preview}${more}). Set recursive=true to delete it and all its contents.`,
135
+ };
136
+ }
137
+ // Count files before deleting
138
+ const fileCount = this.countItems(filePath);
139
+ if (fileCount > MAX_DIR_FILES && !force) {
140
+ return {
141
+ success: false,
142
+ output: "",
143
+ error: `Directory contains ${fileCount} items. Set force=true to confirm bulk deletion of "${filePath}".`,
144
+ };
145
+ }
146
+ try {
147
+ fs.rmSync(filePath, { recursive: true, force: true });
148
+ return {
149
+ success: true,
150
+ output: `Deleted directory: ${filePath} (${fileCount} items removed)`,
151
+ };
152
+ }
153
+ catch (err) {
154
+ return { success: false, output: "", error: `Failed to delete directory: ${err.message}` };
155
+ }
156
+ }
157
+ countItems(dirPath, limit = 10000) {
158
+ let count = 0;
159
+ try {
160
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
161
+ for (const entry of entries) {
162
+ count++;
163
+ if (count >= limit)
164
+ return count;
165
+ if (entry.isDirectory()) {
166
+ count += this.countItems(path.join(dirPath, entry.name), limit - count);
167
+ if (count >= limit)
168
+ return count;
169
+ }
170
+ }
171
+ }
172
+ catch {
173
+ // Permission denied — count what we can
174
+ }
175
+ return count;
176
+ }
177
+ }
178
+ exports.FileDeleteTool = FileDeleteTool;
179
+ //# sourceMappingURL=file-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-delete.js","sourceRoot":"","sources":["../../src/tools/file-delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { BaseTool, ToolDefinition, ToolResult } from "./types";
2
+ import type { SandboxManager } from "../sandbox";
3
+ export declare class FileEditTool implements BaseTool {
4
+ definition: ToolDefinition;
5
+ private workingDir;
6
+ private sandboxManager?;
7
+ constructor(workingDir: string, sandboxManager?: SandboxManager);
8
+ execute(input: Record<string, unknown>): Promise<ToolResult>;
9
+ }
10
+ //# sourceMappingURL=file-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-edit.d.ts","sourceRoot":"","sources":["../../src/tools/file-edit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,YAAa,YAAW,QAAQ;IAC3C,UAAU,EAAE,cAAc,CAyBxB;IAEF,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc;IAKzD,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAsDnE"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FileEditTool = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path_safety_1 = require("../utils/path-safety");
39
+ const search_match_1 = require("../utils/search-match");
40
+ const lazy_apply_1 = require("../utils/lazy-apply");
41
+ class FileEditTool {
42
+ definition = {
43
+ name: "file_edit",
44
+ description: `Performs string replacement in a file using multi-strategy matching (exact → trimmed → case-insensitive → whitespace-ignored). Also supports unified diff patches. Requires user permission. Access controlled by sandbox/permission rules.
45
+
46
+ IMPORTANT:
47
+ - Always read the file first before editing to see its current contents.
48
+ - old_string should match the file content — the system tolerates minor whitespace/case differences.
49
+ - old_string and new_string MUST be different.
50
+ - When not using replace_all, old_string must be unique in the file. Add more surrounding context if ambiguous.
51
+ - Use replace_all for renaming variables or strings across the file.
52
+ - You can pass a unified diff (with @@ hunk headers) as old_string and leave new_string empty to apply the diff patch directly.
53
+ - This tool CANNOT be called in parallel with itself on the SAME file.`,
54
+ inputSchema: {
55
+ type: "object",
56
+ properties: {
57
+ file_path: { type: "string", description: "Path to the file to edit" },
58
+ old_string: { type: "string", description: "The text to replace — must match file content (exact match preferred, but tolerates whitespace/case differences)" },
59
+ new_string: { type: "string", description: "The replacement text (MUST be different from old_string)" },
60
+ replace_all: { type: "boolean", description: "Replace all occurrences (default: false)" },
61
+ },
62
+ required: ["file_path", "old_string", "new_string"],
63
+ },
64
+ requiresPermission: true,
65
+ permissionMessage: (input) => `Edit file: ${input.file_path}`,
66
+ };
67
+ workingDir;
68
+ sandboxManager;
69
+ constructor(workingDir, sandboxManager) {
70
+ this.workingDir = workingDir;
71
+ this.sandboxManager = sandboxManager;
72
+ }
73
+ async execute(input) {
74
+ let filePath;
75
+ try {
76
+ filePath = (0, path_safety_1.safePath)(input.file_path, this.workingDir);
77
+ }
78
+ catch (err) {
79
+ return { success: false, output: "", error: err.message };
80
+ }
81
+ // Sandbox write check
82
+ if (this.sandboxManager) {
83
+ const check = this.sandboxManager.checkFileWrite(filePath);
84
+ if (!check.allowed) {
85
+ return { success: false, output: "", error: check.reason || "Sandbox: write access denied" };
86
+ }
87
+ }
88
+ const oldStr = input.old_string;
89
+ const newStr = input.new_string;
90
+ const replaceAll = input.replace_all || false;
91
+ if (!fs.existsSync(filePath))
92
+ return { success: false, output: "", error: `File not found: ${filePath}` };
93
+ const content = fs.readFileSync(filePath, "utf-8");
94
+ try {
95
+ // Unified diff mode: detect @@ hunk headers in old_string
96
+ if ((0, search_match_1.isUnifiedDiff)(oldStr)) {
97
+ const result = (0, search_match_1.applyUnifiedDiff)(content, oldStr);
98
+ fs.writeFileSync(filePath, result, "utf-8");
99
+ return { success: true, output: `Applied unified diff patch to ${filePath}\n\n${oldStr}` };
100
+ }
101
+ // Lazy apply: expand placeholder markers in new_string before replacing
102
+ let expandedNewStr = newStr;
103
+ let lazyNote = "";
104
+ if ((0, lazy_apply_1.hasPlaceholders)(newStr)) {
105
+ const { content: expanded, placeholdersExpanded, strategy: lazyStrategy } = (0, lazy_apply_1.expandPlaceholders)(content, newStr);
106
+ if (placeholdersExpanded > 0) {
107
+ expandedNewStr = expanded;
108
+ lazyNote = ` (lazy apply: ${placeholdersExpanded} placeholder(s) expanded via ${lazyStrategy})`;
109
+ }
110
+ }
111
+ const { result, count, strategy } = (0, search_match_1.executeFindAndReplace)(content, oldStr, expandedNewStr, replaceAll);
112
+ fs.writeFileSync(filePath, result, "utf-8");
113
+ const diff = generateDiff(filePath, oldStr, expandedNewStr, count);
114
+ const strategyNote = strategy !== "exact" ? ` (matched via ${strategy} strategy)` : "";
115
+ return { success: true, output: `Edited ${filePath}: replaced ${count} occurrence(s)${strategyNote}${lazyNote}\n\n${diff}` };
116
+ }
117
+ catch (err) {
118
+ return { success: false, output: "", error: err.message };
119
+ }
120
+ }
121
+ }
122
+ exports.FileEditTool = FileEditTool;
123
+ /** Generate a unified-style diff showing what changed */
124
+ function generateDiff(filePath, oldStr, newStr, count) {
125
+ const oldLines = oldStr.split("\n");
126
+ const newLines = newStr.split("\n");
127
+ const parts = [
128
+ `--- a/${filePath}`,
129
+ `+++ b/${filePath}`,
130
+ `@@ -1,${oldLines.length} +1,${newLines.length} @@ (${count} replacement${count > 1 ? "s" : ""})`,
131
+ ];
132
+ for (const line of oldLines)
133
+ parts.push(`- ${line}`);
134
+ for (const line of newLines)
135
+ parts.push(`+ ${line}`);
136
+ return parts.join("\n");
137
+ }
138
+ //# sourceMappingURL=file-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-edit.js","sourceRoot":"","sources":["../../src/tools/file-edit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AAEzB,sDAAgD;AAChD,wDAA+F;AAC/F,oDAA0E;AAG1E,MAAa,YAAY;IACvB,UAAU,GAAmB;QAC3B,IAAI,EAAE,WAAW;QACjB,WAAW,EACT;;;;;;;;;uEASiE;QACnE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE;gBACtE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kHAAkH,EAAE;gBAC/J,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;gBACvG,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0CAA0C,EAAE;aAC1F;YACD,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;SACpD;QACD,kBAAkB,EAAE,IAAI;QACxB,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,KAAK,CAAC,SAAS,EAAE;KAC9D,CAAC;IAEM,UAAU,CAAS;IACnB,cAAc,CAAkB;IAExC,YAAY,UAAkB,EAAE,cAA+B;QAC7D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAA8B;QAC1C,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAA,sBAAQ,EAAC,KAAK,CAAC,SAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;QACvE,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,8BAA8B,EAAE,CAAC;YAC/F,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,UAAoB,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,UAAoB,CAAC;QAC1C,MAAM,UAAU,GAAI,KAAK,CAAC,WAAuB,IAAI,KAAK,CAAC;QAE3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,QAAQ,EAAE,EAAE,CAAC;QAE9E,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnD,IAAI,CAAC;YACH,0DAA0D;YAC1D,IAAI,IAAA,4BAAa,EAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,IAAA,+BAAgB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,iCAAiC,QAAQ,OAAO,MAAM,EAAE,EAAE,CAAC;YAC7F,CAAC;YAED,wEAAwE;YACxE,IAAI,cAAc,GAAG,MAAM,CAAC;YAC5B,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,IAAA,4BAAe,EAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAA,+BAAkB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAChH,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;oBAC7B,cAAc,GAAG,QAAQ,CAAC;oBAC1B,QAAQ,GAAG,iBAAiB,oBAAoB,gCAAgC,YAAY,GAAG,CAAC;gBAClG,CAAC;YACH,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAA,oCAAqB,EAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YACvG,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAE5C,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,QAAQ,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,QAAQ,cAAc,KAAK,iBAAiB,YAAY,GAAG,QAAQ,OAAO,IAAI,EAAE,EAAE,CAAC;QAC/H,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;QACvE,CAAC;IACH,CAAC;CACF;AA1FD,oCA0FC;AAED,yDAAyD;AACzD,SAAS,YAAY,CAAC,QAAgB,EAAE,MAAc,EAAE,MAAc,EAAE,KAAa;IACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,KAAK,GAAa;QACtB,SAAS,QAAQ,EAAE;QACnB,SAAS,QAAQ,EAAE;QACnB,SAAS,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,MAAM,QAAQ,KAAK,eAAe,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;KAClG,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAErD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { BaseTool, ToolDefinition, ToolResult } from "./types";
2
+ import type { SandboxManager } from "../sandbox";
3
+ export declare class FileReadTool implements BaseTool {
4
+ definition: ToolDefinition;
5
+ private workingDir;
6
+ private sandboxManager?;
7
+ constructor(workingDir: string, sandboxManager?: SandboxManager);
8
+ execute(input: Record<string, unknown>): Promise<ToolResult>;
9
+ private readImage;
10
+ private readPdf;
11
+ }
12
+ //# sourceMappingURL=file-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-read.d.ts","sourceRoot":"","sources":["../../src/tools/file-read.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,qBAAa,YAAa,YAAW,QAAQ;IAC3C,UAAU,EAAE,cAAc,CAuBxB;IAEF,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc;IAKzD,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IA8DlE,OAAO,CAAC,SAAS;IAsBjB,OAAO,CAAC,OAAO;CA6BhB"}