dotdo 0.0.2 → 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 (313) hide show
  1. package/cli/README.md +238 -0
  2. package/cli/agent.ts +72 -0
  3. package/cli/bin.js +44 -0
  4. package/cli/bin.ts +38 -0
  5. package/cli/build.ts +157 -0
  6. package/cli/commands/auth/login.ts +14 -0
  7. package/cli/commands/auth/logout.ts +6 -0
  8. package/cli/commands/auth/whoami.ts +16 -0
  9. package/cli/commands/deploy-multi.ts +245 -0
  10. package/cli/commands/dev/deploy.ts +100 -0
  11. package/cli/commands/dev/dev.ts +95 -0
  12. package/cli/commands/dev/logs.ts +91 -0
  13. package/cli/commands/dev-local.ts +88 -0
  14. package/cli/commands/do-ops.ts +314 -0
  15. package/cli/commands/index.ts +100 -0
  16. package/cli/commands/init.ts +247 -0
  17. package/cli/commands/introspect/emitter.ts +315 -0
  18. package/cli/commands/introspect/index.ts +193 -0
  19. package/cli/commands/link.ts +598 -0
  20. package/cli/commands/snippets.ts +415 -0
  21. package/cli/commands/tunnel.ts +239 -0
  22. package/cli/device-auth.ts +289 -0
  23. package/cli/fallback.ts +12 -0
  24. package/cli/index.ts +121 -0
  25. package/cli/main.ts +246 -0
  26. package/cli/mcp-stdio.ts +790 -0
  27. package/cli/package.json +62 -0
  28. package/cli/runtime/do-registry.ts +193 -0
  29. package/cli/runtime/embedded-db.ts +344 -0
  30. package/cli/runtime/index.ts +9 -0
  31. package/cli/runtime/miniflare-adapter.ts +162 -0
  32. package/cli/sandbox.ts +82 -0
  33. package/cli/src/args.ts +174 -0
  34. package/cli/src/auth.ts +55 -0
  35. package/cli/src/commands/call.ts +84 -0
  36. package/cli/src/commands/charge.ts +96 -0
  37. package/cli/src/commands/config.ts +115 -0
  38. package/cli/src/commands/email.ts +112 -0
  39. package/cli/src/commands/llm.ts +115 -0
  40. package/cli/src/commands/queue.ts +134 -0
  41. package/cli/src/commands/text.ts +86 -0
  42. package/cli/src/config.ts +185 -0
  43. package/cli/src/output.ts +246 -0
  44. package/cli/src/rpc.ts +192 -0
  45. package/cli/utils/config.ts +282 -0
  46. package/cli/utils/detect.ts +73 -0
  47. package/cli/utils/index.ts +15 -0
  48. package/cli/utils/logger.ts +232 -0
  49. package/dist/ai/template-literals.js +2 -2
  50. package/dist/ai/template-literals.js.map +1 -1
  51. package/dist/api/middleware/auth.js +3 -2
  52. package/dist/api/middleware/auth.js.map +1 -1
  53. package/dist/db/iceberg/inverted-index.js +1 -1
  54. package/dist/db/iceberg/inverted-index.js.map +1 -1
  55. package/dist/db/iceberg/puffin.js.map +1 -1
  56. package/dist/db/json-indexes.js.map +1 -1
  57. package/dist/db/objects.js.map +1 -1
  58. package/dist/db/primitives/dag-scheduler/index.js +1 -1
  59. package/dist/db/primitives/dag-scheduler/index.js.map +1 -1
  60. package/dist/db/primitives/observability.js.map +1 -1
  61. package/dist/db/primitives/schema-evolution.js.map +1 -1
  62. package/dist/db/primitives/temporal-store.js.map +1 -1
  63. package/dist/db/primitives/typed-column-store.js.map +1 -1
  64. package/dist/db/primitives/utils/duration.js.map +1 -1
  65. package/dist/db/primitives/utils/murmur3.js +12 -14
  66. package/dist/db/primitives/utils/murmur3.js.map +1 -1
  67. package/dist/db/primitives/window-manager.js.map +1 -1
  68. package/dist/db/stores.js.map +1 -1
  69. package/dist/db/things.js.map +1 -1
  70. package/dist/lib/DODispatcher.js +2 -2
  71. package/dist/lib/DODispatcher.js.map +1 -1
  72. package/dist/lib/auto-wiring.js.map +1 -1
  73. package/dist/lib/channels/email.js +1 -1
  74. package/dist/lib/channels/email.js.map +1 -1
  75. package/dist/lib/channels/slack-blockkit.js.map +1 -1
  76. package/dist/lib/cloudflare/ai.js +1 -1
  77. package/dist/lib/cloudflare/ai.js.map +1 -1
  78. package/dist/lib/cloudflare/kv.js +1 -1
  79. package/dist/lib/cloudflare/kv.js.map +1 -1
  80. package/dist/lib/cloudflare/r2.js +3 -3
  81. package/dist/lib/cloudflare/r2.js.map +1 -1
  82. package/dist/lib/cloudflare/vectorize.js.map +1 -1
  83. package/dist/lib/cloudflare/workflows.js.map +1 -1
  84. package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -1
  85. package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -1
  86. package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -1
  87. package/dist/lib/executors/HumanFunctionExecutor.js +1 -1
  88. package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -1
  89. package/dist/lib/executors/ParallelStepExecutor.js.map +1 -1
  90. package/dist/lib/experiments.js.map +1 -1
  91. package/dist/lib/flags/store.js.map +1 -1
  92. package/dist/lib/functions/FunctionComposition.js.map +1 -1
  93. package/dist/lib/functions/FunctionMiddleware.js.map +1 -1
  94. package/dist/lib/functions/FunctionRegistry.js.map +1 -1
  95. package/dist/lib/humans/templates.js.map +1 -1
  96. package/dist/lib/identity.js +2 -2
  97. package/dist/lib/identity.js.map +1 -1
  98. package/dist/lib/logging/index.js.map +1 -1
  99. package/dist/lib/mixins/bash.js +1 -73
  100. package/dist/lib/mixins/bash.js.map +1 -1
  101. package/dist/lib/mixins/git.js +0 -5
  102. package/dist/lib/mixins/git.js.map +1 -1
  103. package/dist/lib/mixins/npm.js.map +1 -1
  104. package/dist/lib/noun-id.js.map +1 -1
  105. package/dist/lib/rate-limit/sliding-window.js.map +1 -1
  106. package/dist/lib/rpc/bindings.js.map +1 -1
  107. package/dist/lib/safe-stringify.js.map +1 -1
  108. package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -1
  109. package/dist/lib/sqids.js.map +1 -1
  110. package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -1
  111. package/dist/lib/sql/adapters/pgsql-parser.js +19 -18
  112. package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -1
  113. package/dist/metrics/hunch.js.map +1 -1
  114. package/dist/objects/API.js +1 -1
  115. package/dist/objects/API.js.map +1 -1
  116. package/dist/objects/Agent.js.map +1 -1
  117. package/dist/objects/Browser.js.map +1 -1
  118. package/dist/objects/CLI.js.map +1 -1
  119. package/dist/objects/DOBase.js.map +1 -1
  120. package/dist/objects/DOCache.js +153 -0
  121. package/dist/objects/DOCache.js.map +1 -0
  122. package/dist/objects/DOFull.js.map +1 -1
  123. package/dist/objects/Entity.js.map +1 -1
  124. package/dist/objects/Human.js.map +1 -1
  125. package/dist/objects/IcebergMetadataDO.js.map +1 -1
  126. package/dist/objects/IntegrationsDO.js.map +1 -1
  127. package/dist/objects/ObservabilityBroadcaster.js.map +1 -1
  128. package/dist/objects/Package.js.map +1 -1
  129. package/dist/objects/Product.js +1 -1
  130. package/dist/objects/Product.js.map +1 -1
  131. package/dist/objects/SaaS.js.map +1 -1
  132. package/dist/objects/SandboxDO.js.map +1 -1
  133. package/dist/objects/Service.js.map +1 -1
  134. package/dist/objects/VectorShardDO.js +9 -7
  135. package/dist/objects/VectorShardDO.js.map +1 -1
  136. package/dist/objects/Workflow.js.map +1 -1
  137. package/dist/objects/WorkflowFactory.js.map +1 -1
  138. package/dist/objects/WorkflowRuntime.js.map +1 -1
  139. package/dist/objects/lifecycle/Branch.js.map +1 -1
  140. package/dist/objects/lifecycle/Clone.js +1 -1
  141. package/dist/objects/lifecycle/Clone.js.map +1 -1
  142. package/dist/objects/lifecycle/Compact.js.map +1 -1
  143. package/dist/objects/lifecycle/Shard.js.map +1 -1
  144. package/dist/objects/persistence/checkpoint-manager.js.map +1 -1
  145. package/dist/objects/persistence/migration-runner.js.map +1 -1
  146. package/dist/objects/persistence/replication-manager.js +2 -2
  147. package/dist/objects/persistence/replication-manager.js.map +1 -1
  148. package/dist/objects/persistence/tiered-storage-manager.js.map +1 -1
  149. package/dist/objects/persistence/wal-manager.js.map +1 -1
  150. package/dist/objects/transport/auth-layer.js.map +1 -1
  151. package/dist/objects/transport/chain.js.map +1 -1
  152. package/dist/objects/transport/mcp-server.js +7 -6
  153. package/dist/objects/transport/mcp-server.js.map +1 -1
  154. package/dist/objects/transport/rest-autowire.js +3 -2
  155. package/dist/objects/transport/rest-autowire.js.map +1 -1
  156. package/dist/objects/transport/rest-router.js.map +1 -1
  157. package/dist/objects/transport/rpc-server.js +18 -15
  158. package/dist/objects/transport/rpc-server.js.map +1 -1
  159. package/dist/objects/transport/shared.js +2 -1
  160. package/dist/objects/transport/shared.js.map +1 -1
  161. package/dist/snippets/artifacts-ingest.js.map +1 -1
  162. package/dist/snippets/artifacts-serve.js.map +1 -1
  163. package/dist/snippets/search.js.map +1 -1
  164. package/dist/workflows/ScheduleManager.js.map +1 -1
  165. package/dist/workflows/StepResultStorage.js.map +1 -1
  166. package/dist/workflows/WaitForEventManager.js.map +1 -1
  167. package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -1
  168. package/dist/workflows/compat/inngest/index.js.map +1 -1
  169. package/dist/workflows/compat/qstash/index.js.map +1 -1
  170. package/dist/workflows/compat/temporal/client.js.map +1 -1
  171. package/dist/workflows/compat/temporal/index.js.map +1 -1
  172. package/dist/workflows/compat/trigger/index.js.map +1 -1
  173. package/dist/workflows/compat/utils/index.js.map +1 -1
  174. package/dist/workflows/context/correlation.js +2 -2
  175. package/dist/workflows/context/correlation.js.map +1 -1
  176. package/dist/workflows/context/experiment.js +1 -1
  177. package/dist/workflows/context/experiment.js.map +1 -1
  178. package/dist/workflows/context/flag.js +1 -1
  179. package/dist/workflows/context/flag.js.map +1 -1
  180. package/dist/workflows/context/measure.js +1 -1
  181. package/dist/workflows/context/measure.js.map +1 -1
  182. package/dist/workflows/context/rate-limit.js.map +1 -1
  183. package/dist/workflows/data/entity-events/entity-events.js.map +1 -1
  184. package/dist/workflows/data/experiment/index.js.map +1 -1
  185. package/dist/workflows/data/goal/context.js +1 -1
  186. package/dist/workflows/data/goal/context.js.map +1 -1
  187. package/dist/workflows/data/measure/index.js +1 -1
  188. package/dist/workflows/data/measure/index.js.map +1 -1
  189. package/dist/workflows/data/stream/index.js +10 -76
  190. package/dist/workflows/data/stream/index.js.map +1 -1
  191. package/dist/workflows/data/track/context.js.map +1 -1
  192. package/dist/workflows/data/view/context.js.map +1 -1
  193. package/dist/workflows/domain.js.map +1 -1
  194. package/dist/workflows/flags.js +1 -1
  195. package/dist/workflows/flags.js.map +1 -1
  196. package/dist/workflows/hash.js.map +1 -1
  197. package/dist/workflows/on.js +1 -1
  198. package/dist/workflows/on.js.map +1 -1
  199. package/dist/workflows/schedule-builder.js.map +1 -1
  200. package/dist/workflows/visibility/index.js +0 -2
  201. package/dist/workflows/visibility/index.js.map +1 -1
  202. package/dist/workflows/visibility/query-parser.js.map +1 -1
  203. package/package.json +18 -3
  204. package/dist/api/analytics/router.js +0 -601
  205. package/dist/api/analytics/router.js.map +0 -1
  206. package/dist/api/index.js +0 -158
  207. package/dist/api/index.js.map +0 -1
  208. package/dist/api/middleware/error-handling.js +0 -176
  209. package/dist/api/middleware/error-handling.js.map +0 -1
  210. package/dist/api/middleware/request-id.js +0 -21
  211. package/dist/api/middleware/request-id.js.map +0 -1
  212. package/dist/api/pages.js +0 -1180
  213. package/dist/api/pages.js.map +0 -1
  214. package/dist/api/routes/api.js +0 -612
  215. package/dist/api/routes/api.js.map +0 -1
  216. package/dist/api/routes/browsers.js +0 -471
  217. package/dist/api/routes/browsers.js.map +0 -1
  218. package/dist/api/routes/do.js +0 -188
  219. package/dist/api/routes/do.js.map +0 -1
  220. package/dist/api/routes/mcp.js +0 -459
  221. package/dist/api/routes/mcp.js.map +0 -1
  222. package/dist/api/routes/obs.js +0 -445
  223. package/dist/api/routes/obs.js.map +0 -1
  224. package/dist/api/routes/openapi.js +0 -794
  225. package/dist/api/routes/openapi.js.map +0 -1
  226. package/dist/api/routes/rpc.js +0 -1103
  227. package/dist/api/routes/rpc.js.map +0 -1
  228. package/dist/api/routes/sandboxes.js +0 -389
  229. package/dist/api/routes/sandboxes.js.map +0 -1
  230. package/dist/api/test-do.js +0 -38
  231. package/dist/api/test-do.js.map +0 -1
  232. package/dist/api/types.js +0 -11
  233. package/dist/api/types.js.map +0 -1
  234. package/dist/cli/bin.js +0 -2
  235. package/dist/cli/main.js +0 -52342
  236. package/dist/do/bash.js +0 -35
  237. package/dist/do/bash.js.map +0 -1
  238. package/dist/do/fs.js +0 -25
  239. package/dist/do/fs.js.map +0 -1
  240. package/dist/do/full.js +0 -61
  241. package/dist/do/full.js.map +0 -1
  242. package/dist/do/git.js +0 -28
  243. package/dist/do/git.js.map +0 -1
  244. package/dist/do/index.js +0 -52
  245. package/dist/do/index.js.map +0 -1
  246. package/dist/lib/agent/tools/bash.js +0 -336
  247. package/dist/lib/agent/tools/bash.js.map +0 -1
  248. package/dist/lib/agent/tools/edit.js +0 -157
  249. package/dist/lib/agent/tools/edit.js.map +0 -1
  250. package/dist/lib/agent/tools/glob.js +0 -137
  251. package/dist/lib/agent/tools/glob.js.map +0 -1
  252. package/dist/lib/agent/tools/grep.js +0 -315
  253. package/dist/lib/agent/tools/grep.js.map +0 -1
  254. package/dist/lib/agent/tools/index.js +0 -71
  255. package/dist/lib/agent/tools/index.js.map +0 -1
  256. package/dist/lib/agent/tools/read.js +0 -212
  257. package/dist/lib/agent/tools/read.js.map +0 -1
  258. package/dist/lib/agent/tools/types.js +0 -197
  259. package/dist/lib/agent/tools/types.js.map +0 -1
  260. package/dist/lib/agent/tools/write.js +0 -159
  261. package/dist/lib/agent/tools/write.js.map +0 -1
  262. package/dist/lib/mixins/index.js +0 -29
  263. package/dist/lib/mixins/index.js.map +0 -1
  264. package/dist/primitives/bashx/src/ast/analyze.js +0 -1472
  265. package/dist/primitives/bashx/src/ast/analyze.js.map +0 -1
  266. package/dist/primitives/bashx/src/ast/parser.js +0 -1488
  267. package/dist/primitives/bashx/src/ast/parser.js.map +0 -1
  268. package/dist/primitives/bashx/src/do/commands/crypto.js +0 -1954
  269. package/dist/primitives/bashx/src/do/commands/crypto.js.map +0 -1
  270. package/dist/primitives/bashx/src/do/commands/data-processing.js +0 -1812
  271. package/dist/primitives/bashx/src/do/commands/data-processing.js.map +0 -1
  272. package/dist/primitives/bashx/src/do/commands/extended-utils.js +0 -804
  273. package/dist/primitives/bashx/src/do/commands/extended-utils.js.map +0 -1
  274. package/dist/primitives/bashx/src/do/commands/math-control.js +0 -1122
  275. package/dist/primitives/bashx/src/do/commands/math-control.js.map +0 -1
  276. package/dist/primitives/bashx/src/do/commands/posix-utils.js +0 -1015
  277. package/dist/primitives/bashx/src/do/commands/posix-utils.js.map +0 -1
  278. package/dist/primitives/bashx/src/do/commands/system-utils.js +0 -687
  279. package/dist/primitives/bashx/src/do/commands/system-utils.js.map +0 -1
  280. package/dist/primitives/bashx/src/do/commands/test-command.js +0 -523
  281. package/dist/primitives/bashx/src/do/commands/test-command.js.map +0 -1
  282. package/dist/primitives/bashx/src/do/commands/text-processing.js +0 -1550
  283. package/dist/primitives/bashx/src/do/commands/text-processing.js.map +0 -1
  284. package/dist/primitives/bashx/src/do/container-executor.js +0 -429
  285. package/dist/primitives/bashx/src/do/container-executor.js.map +0 -1
  286. package/dist/primitives/bashx/src/do/index.js +0 -668
  287. package/dist/primitives/bashx/src/do/index.js.map +0 -1
  288. package/dist/primitives/bashx/src/do/tiered-executor.js +0 -2647
  289. package/dist/primitives/bashx/src/do/tiered-executor.js.map +0 -1
  290. package/dist/primitives/bashx/src/do/worker.js +0 -352
  291. package/dist/primitives/bashx/src/do/worker.js.map +0 -1
  292. package/dist/primitives/bashx/src/types.js +0 -10
  293. package/dist/primitives/bashx/src/types.js.map +0 -1
  294. package/dist/primitives/fsx/core/backend.js +0 -480
  295. package/dist/primitives/fsx/core/backend.js.map +0 -1
  296. package/dist/primitives/fsx/core/constants.js +0 -140
  297. package/dist/primitives/fsx/core/constants.js.map +0 -1
  298. package/dist/primitives/fsx/core/fsx.js +0 -1184
  299. package/dist/primitives/fsx/core/fsx.js.map +0 -1
  300. package/dist/primitives/fsx/core/glob/glob.js +0 -438
  301. package/dist/primitives/fsx/core/glob/glob.js.map +0 -1
  302. package/dist/primitives/fsx/core/glob/index.js +0 -8
  303. package/dist/primitives/fsx/core/glob/index.js.map +0 -1
  304. package/dist/primitives/fsx/core/glob/match.js +0 -392
  305. package/dist/primitives/fsx/core/glob/match.js.map +0 -1
  306. package/dist/primitives/fsx/core/types.js +0 -307
  307. package/dist/primitives/fsx/core/types.js.map +0 -1
  308. package/dist/sdk/capnweb-compat.js +0 -42
  309. package/dist/sdk/capnweb-compat.js.map +0 -1
  310. package/dist/sdk/client.js +0 -20
  311. package/dist/sdk/client.js.map +0 -1
  312. package/dist/sdk/index.js +0 -17
  313. package/dist/sdk/index.js.map +0 -1
@@ -1,157 +0,0 @@
1
- /**
2
- * Edit Tool Adapter
3
- *
4
- * Maps Claude SDK Edit tool to fsx.do filesystem capabilities.
5
- * Performs exact string replacements with uniqueness checks.
6
- *
7
- * @module lib/agent/tools/edit
8
- */
9
- import { FileNotFoundError, IsDirectoryError, PathTraversalError, NotUniqueError, FileNotReadError, } from './types';
10
- /**
11
- * Validate and normalize a file path
12
- */
13
- function validatePath(path) {
14
- if (!path.startsWith('/')) {
15
- throw new PathTraversalError(path);
16
- }
17
- const parts = path.split('/').filter(Boolean);
18
- const resolved = [];
19
- for (const part of parts) {
20
- if (part === '.')
21
- continue;
22
- if (part === '..') {
23
- if (resolved.length === 0) {
24
- throw new PathTraversalError(path);
25
- }
26
- resolved.pop();
27
- }
28
- else {
29
- resolved.push(part);
30
- }
31
- }
32
- return '/' + resolved.join('/');
33
- }
34
- /**
35
- * Count occurrences of a substring in a string
36
- */
37
- function countOccurrences(text, search) {
38
- if (search === '')
39
- return 0;
40
- let count = 0;
41
- let pos = 0;
42
- while ((pos = text.indexOf(search, pos)) !== -1) {
43
- count++;
44
- pos += search.length;
45
- }
46
- return count;
47
- }
48
- /**
49
- * Replace first occurrence of a string
50
- */
51
- function replaceFirst(text, search, replacement) {
52
- const index = text.indexOf(search);
53
- if (index === -1)
54
- return text;
55
- return text.slice(0, index) + replacement + text.slice(index + search.length);
56
- }
57
- /**
58
- * Edit Tool Adapter
59
- *
60
- * Performs exact string replacements in files.
61
- * The old_string must be unique in the file unless replace_all is true.
62
- */
63
- export class EditToolAdapter {
64
- name = 'Edit';
65
- description = `Performs exact string replacements in files.
66
-
67
- Usage:
68
- - You must use your Read tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file.
69
- - When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix.
70
- - ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.
71
- - Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.
72
- - The edit will FAIL if old_string is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use replace_all to change every instance of old_string.
73
- - Use replace_all for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.`;
74
- inputSchema = {
75
- type: 'object',
76
- properties: {
77
- file_path: {
78
- type: 'string',
79
- description: 'The absolute path to the file to modify',
80
- },
81
- old_string: {
82
- type: 'string',
83
- description: 'The text to replace',
84
- },
85
- new_string: {
86
- type: 'string',
87
- description: 'The text to replace it with (must be different from old_string)',
88
- },
89
- replace_all: {
90
- type: 'boolean',
91
- description: 'Replace all occurences of old_string (default false)',
92
- default: false,
93
- },
94
- },
95
- required: ['file_path', 'old_string', 'new_string'],
96
- additionalProperties: false,
97
- };
98
- async execute(input, context) {
99
- const { file_path, old_string, new_string, replace_all = false } = input;
100
- const { fs, readFiles } = context;
101
- // Validate path
102
- const normalizedPath = validatePath(file_path);
103
- // Check that the file was previously read
104
- if (!readFiles.has(normalizedPath)) {
105
- throw new FileNotReadError(normalizedPath);
106
- }
107
- // Check if file exists
108
- const exists = await fs.exists(normalizedPath);
109
- if (!exists) {
110
- throw new FileNotFoundError(normalizedPath);
111
- }
112
- // Check if it's a directory
113
- const stats = await fs.stat(normalizedPath);
114
- if (stats.isDirectory()) {
115
- throw new IsDirectoryError(normalizedPath);
116
- }
117
- // Read current content
118
- const content = await fs.readFile(normalizedPath);
119
- // Count occurrences
120
- const occurrences = countOccurrences(content, old_string);
121
- // If old_string not found, return failure
122
- if (occurrences === 0) {
123
- return {
124
- success: false,
125
- replacements_made: 0,
126
- };
127
- }
128
- // If not replace_all and string is not unique, throw error
129
- if (!replace_all && occurrences > 1) {
130
- throw new NotUniqueError(old_string, occurrences);
131
- }
132
- // Perform the replacement
133
- let newContent;
134
- let replacementsMade;
135
- if (replace_all) {
136
- // Replace all occurrences
137
- newContent = content.split(old_string).join(new_string);
138
- replacementsMade = occurrences;
139
- }
140
- else {
141
- // Replace only first occurrence
142
- newContent = replaceFirst(content, old_string, new_string);
143
- replacementsMade = 1;
144
- }
145
- // Write back to file
146
- await fs.writeFile(normalizedPath, newContent);
147
- return {
148
- success: true,
149
- replacements_made: replacementsMade,
150
- undo: {
151
- old_string: new_string,
152
- new_string: old_string,
153
- },
154
- };
155
- }
156
- }
157
- //# sourceMappingURL=edit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../../lib/agent/tools/edit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,SAAS,CAAA;AAEhB;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,GAAG;YAAE,SAAQ;QAC1B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACpC,CAAC;YACD,QAAQ,CAAC,GAAG,EAAE,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY,EAAE,MAAc;IACpD,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,CAAC,CAAA;IAE3B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,GAAG,GAAG,CAAC,CAAA;IAEX,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAChD,KAAK,EAAE,CAAA;QACP,GAAG,IAAI,MAAM,CAAC,MAAM,CAAA;IACtB,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,WAAmB;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAE7B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,MAAM,CAAA;IAEb,WAAW,GAAG;;;;;;;;8IAQqH,CAAA;IAEnI,WAAW,GAAe;QACjC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;aACvD;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qBAAqB;aACnC;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iEAAiE;aAC/E;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,sDAAsD;gBACnE,OAAO,EAAE,KAAK;aACf;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;QACnD,oBAAoB,EAAE,KAAK;KAC5B,CAAA;IAED,KAAK,CAAC,OAAO,CAAC,KAAoB,EAAE,OAAoB;QACtD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,KAAK,CAAA;QACxE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;QAEjC,gBAAgB;QAChB,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QAE9C,0CAA0C;QAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,gBAAgB,CAAC,cAAc,CAAC,CAAA;QAC5C,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,iBAAiB,CAAC,cAAc,CAAC,CAAA;QAC7C,CAAC;QAED,4BAA4B;QAC5B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,gBAAgB,CAAC,cAAc,CAAC,CAAA;QAC5C,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAW,CAAA;QAE3D,oBAAoB;QACpB,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAEzD,0CAA0C;QAC1C,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,iBAAiB,EAAE,CAAC;aACrB,CAAA;QACH,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,WAAW,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;QACnD,CAAC;QAED,0BAA0B;QAC1B,IAAI,UAAkB,CAAA;QACtB,IAAI,gBAAwB,CAAA;QAE5B,IAAI,WAAW,EAAE,CAAC;YAChB,0BAA0B;YAC1B,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACvD,gBAAgB,GAAG,WAAW,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,gCAAgC;YAChC,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;YAC1D,gBAAgB,GAAG,CAAC,CAAA;QACtB,CAAC;QAED,qBAAqB;QACrB,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAE9C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,gBAAgB;YACnC,IAAI,EAAE;gBACJ,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,UAAU;aACvB;SACF,CAAA;IACH,CAAC;CACF"}
@@ -1,137 +0,0 @@
1
- /**
2
- * Glob Tool Adapter
3
- *
4
- * Maps Claude SDK Glob tool to fsx.do glob capabilities.
5
- * Supports glob patterns like "**\/*.ts" with results sorted by mtime.
6
- *
7
- * @module lib/agent/tools/glob
8
- */
9
- import { PathTraversalError, NotDirectoryError } from './types';
10
- import { glob as fsxGlob } from '../../../primitives/fsx/core/glob';
11
- /**
12
- * Maximum number of results to return
13
- */
14
- const MAX_RESULTS = 1000;
15
- /**
16
- * Validate and normalize a path
17
- */
18
- function validatePath(path) {
19
- if (!path.startsWith('/')) {
20
- throw new PathTraversalError(path);
21
- }
22
- const parts = path.split('/').filter(Boolean);
23
- const resolved = [];
24
- for (const part of parts) {
25
- if (part === '.')
26
- continue;
27
- if (part === '..') {
28
- if (resolved.length === 0) {
29
- throw new PathTraversalError(path);
30
- }
31
- resolved.pop();
32
- }
33
- else {
34
- resolved.push(part);
35
- }
36
- }
37
- return '/' + resolved.join('/');
38
- }
39
- /**
40
- * Get file modification times for sorting
41
- */
42
- async function getFileMtimes(fs, files) {
43
- const mtimes = new Map();
44
- // Process in batches to avoid overwhelming the filesystem
45
- const BATCH_SIZE = 50;
46
- for (let i = 0; i < files.length; i += BATCH_SIZE) {
47
- const batch = files.slice(i, i + BATCH_SIZE);
48
- const promises = batch.map(async (file) => {
49
- try {
50
- const stats = await fs.stat(file);
51
- mtimes.set(file, stats.mtime?.getTime?.() ?? stats.mtimeMs ?? 0);
52
- }
53
- catch {
54
- // If we can't stat, use 0 for mtime
55
- mtimes.set(file, 0);
56
- }
57
- });
58
- await Promise.all(promises);
59
- }
60
- return mtimes;
61
- }
62
- /**
63
- * Glob Tool Adapter
64
- *
65
- * Fast file pattern matching tool that works with any codebase size.
66
- * Returns matching file paths sorted by modification time (most recent first).
67
- */
68
- export class GlobToolAdapter {
69
- name = 'Glob';
70
- description = `Fast file pattern matching tool that works with any codebase size.
71
- - Supports glob patterns like "**/*.js" or "src/**/*.ts"
72
- - Returns matching file paths sorted by modification time
73
- - Use this tool when you need to find files by name patterns`;
74
- inputSchema = {
75
- type: 'object',
76
- properties: {
77
- pattern: {
78
- type: 'string',
79
- description: 'The glob pattern to match files against',
80
- },
81
- path: {
82
- type: 'string',
83
- description: 'The directory to search in. If not specified, the current working directory will be used.',
84
- },
85
- },
86
- required: ['pattern'],
87
- additionalProperties: false,
88
- };
89
- async execute(input, context) {
90
- const { pattern, path } = input;
91
- const { fs, cwd } = context;
92
- // Determine the base path
93
- const basePath = path ? validatePath(path) : cwd;
94
- // Check if base path exists and is a directory
95
- const exists = await fs.exists(basePath);
96
- if (!exists) {
97
- // Return empty results for non-existent paths
98
- return { files: [], truncated: false };
99
- }
100
- const stats = await fs.stat(basePath);
101
- if (!stats.isDirectory()) {
102
- throw new NotDirectoryError(basePath);
103
- }
104
- // Use fsx glob function with backend from context
105
- // Get the backend from FSx instance - it's a private property but we need it
106
- // For now, we'll use a workaround by implementing glob directly
107
- const results = await fsxGlob(pattern, {
108
- cwd: basePath,
109
- absolute: true,
110
- onlyFiles: true,
111
- // Pass the backend from the FSx instance
112
- // Note: FSx stores backend as private, so we access it through the glob function's backend option
113
- // The FSx class internally uses this backend, but we can also pass it to glob
114
- // For simplicity, we use the glob function which can work with mock FS or backend
115
- });
116
- // If no results, return early
117
- if (results.length === 0) {
118
- return { files: [], truncated: false };
119
- }
120
- // Get modification times for sorting
121
- const mtimes = await getFileMtimes(fs, results);
122
- // Sort by mtime (most recent first)
123
- const sorted = [...results].sort((a, b) => {
124
- const mtimeA = mtimes.get(a) ?? 0;
125
- const mtimeB = mtimes.get(b) ?? 0;
126
- return mtimeB - mtimeA; // Descending (newest first)
127
- });
128
- // Truncate if too many results
129
- const truncated = sorted.length > MAX_RESULTS;
130
- const files = truncated ? sorted.slice(0, MAX_RESULTS) : sorted;
131
- return {
132
- files,
133
- truncated,
134
- };
135
- }
136
- }
137
- //# sourceMappingURL=glob.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../../lib/agent/tools/glob.ts"],"names":[],"mappings":"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"}
@@ -1,315 +0,0 @@
1
- /**
2
- * Grep Tool Adapter
3
- *
4
- * Maps Claude SDK Grep tool to fsx.do search capabilities.
5
- * Supports regex patterns, context lines, and multiple output modes.
6
- *
7
- * @module lib/agent/tools/grep
8
- */
9
- import { PathTraversalError, FILE_TYPE_GLOBS } from './types';
10
- import { glob } from '../../../primitives/fsx/core/glob';
11
- /**
12
- * Maximum number of results to return
13
- */
14
- const MAX_RESULTS = 1000;
15
- /**
16
- * Default output mode
17
- */
18
- const DEFAULT_OUTPUT_MODE = 'files_with_matches';
19
- /**
20
- * Validate and normalize a path
21
- */
22
- function validatePath(path) {
23
- if (!path.startsWith('/')) {
24
- throw new PathTraversalError(path);
25
- }
26
- const parts = path.split('/').filter(Boolean);
27
- const resolved = [];
28
- for (const part of parts) {
29
- if (part === '.')
30
- continue;
31
- if (part === '..') {
32
- if (resolved.length === 0) {
33
- throw new PathTraversalError(path);
34
- }
35
- resolved.pop();
36
- }
37
- else {
38
- resolved.push(part);
39
- }
40
- }
41
- return '/' + resolved.join('/');
42
- }
43
- /**
44
- * Create a regex from pattern with flags
45
- */
46
- function createRegex(pattern, flags) {
47
- let regexFlags = 'g'; // Always global
48
- if (flags.ignoreCase)
49
- regexFlags += 'i';
50
- if (flags.multiline)
51
- regexFlags += 's'; // dotall for multiline
52
- return new RegExp(pattern, regexFlags);
53
- }
54
- /**
55
- * Get file extension globs for a type
56
- */
57
- function getTypeGlobs(type) {
58
- const normalized = type.toLowerCase();
59
- return FILE_TYPE_GLOBS[normalized] || [`*.${type}`];
60
- }
61
- /**
62
- * Get surrounding context lines
63
- */
64
- function getContextLines(lines, matchLineIndex, before, after) {
65
- const beforeLines = [];
66
- const afterLines = [];
67
- // Get lines before
68
- for (let i = Math.max(0, matchLineIndex - before); i < matchLineIndex; i++) {
69
- beforeLines.push(lines[i]);
70
- }
71
- // Get lines after
72
- for (let i = matchLineIndex + 1; i <= Math.min(lines.length - 1, matchLineIndex + after); i++) {
73
- afterLines.push(lines[i]);
74
- }
75
- return { before: beforeLines, after: afterLines };
76
- }
77
- /**
78
- * Search a single file for pattern matches
79
- */
80
- async function searchFile(fs, filePath, regex, options) {
81
- const matches = [];
82
- try {
83
- const content = await fs.readFile(filePath);
84
- const lines = content.split('\n');
85
- if (options.outputMode === 'count') {
86
- // Count total matches in file
87
- let count = 0;
88
- for (const line of lines) {
89
- // Reset regex lastIndex for each line
90
- regex.lastIndex = 0;
91
- while (regex.exec(line)) {
92
- count++;
93
- }
94
- }
95
- if (count > 0) {
96
- matches.push({ file: filePath, count });
97
- }
98
- }
99
- else if (options.outputMode === 'files_with_matches') {
100
- // Just check if file has any match
101
- for (const line of lines) {
102
- regex.lastIndex = 0;
103
- if (regex.test(line)) {
104
- matches.push({ file: filePath });
105
- break;
106
- }
107
- }
108
- }
109
- else {
110
- // Output mode is 'content' - return matching lines with context
111
- const seenLines = new Set(); // Track lines already added (for context overlap)
112
- for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
113
- const line = lines[lineIndex];
114
- regex.lastIndex = 0;
115
- if (regex.test(line)) {
116
- // Get context if not already added
117
- if (!seenLines.has(lineIndex)) {
118
- const context = getContextLines(lines, lineIndex, options.beforeContext, options.afterContext);
119
- // Mark context lines as seen
120
- for (let i = lineIndex - options.beforeContext; i <= lineIndex + options.afterContext; i++) {
121
- seenLines.add(i);
122
- }
123
- // Build content with context
124
- let contentStr = '';
125
- if (context.before.length > 0 && options.beforeContext > 0) {
126
- for (let i = 0; i < context.before.length; i++) {
127
- const ctxLineNum = lineIndex - context.before.length + i + 1;
128
- contentStr += options.showLineNumbers
129
- ? `${ctxLineNum}-${context.before[i]}\n`
130
- : `${context.before[i]}\n`;
131
- }
132
- }
133
- contentStr += options.showLineNumbers
134
- ? `${lineIndex + 1}:${line}`
135
- : line;
136
- if (context.after.length > 0 && options.afterContext > 0) {
137
- for (let i = 0; i < context.after.length; i++) {
138
- const ctxLineNum = lineIndex + 2 + i;
139
- contentStr += options.showLineNumbers
140
- ? `\n${ctxLineNum}-${context.after[i]}`
141
- : `\n${context.after[i]}`;
142
- }
143
- }
144
- matches.push({
145
- file: filePath,
146
- line: options.showLineNumbers ? lineIndex + 1 : undefined,
147
- content: contentStr,
148
- });
149
- }
150
- }
151
- }
152
- }
153
- }
154
- catch {
155
- // Skip files that can't be read (permission issues, binary files, etc.)
156
- }
157
- return matches;
158
- }
159
- /**
160
- * Grep Tool Adapter
161
- *
162
- * A powerful search tool built on ripgrep-style patterns.
163
- * Supports regex, context lines, and multiple output modes.
164
- */
165
- export class GrepToolAdapter {
166
- name = 'Grep';
167
- description = `A powerful search tool built on ripgrep.
168
-
169
- Usage:
170
- - Supports full regex syntax (e.g., "log.*Error", "function\\s+\\w+")
171
- - Filter files with glob parameter (e.g., "*.js", "**/*.tsx") or type parameter (e.g., "js", "py", "rust")
172
- - Output modes: "content" shows matching lines, "files_with_matches" shows only file paths (default), "count" shows match counts
173
- - Use -A/-B/-C for context lines around matches`;
174
- inputSchema = {
175
- type: 'object',
176
- properties: {
177
- pattern: {
178
- type: 'string',
179
- description: 'The regular expression pattern to search for in file contents',
180
- },
181
- path: {
182
- type: 'string',
183
- description: 'File or directory to search in. Defaults to current working directory.',
184
- },
185
- glob: {
186
- type: 'string',
187
- description: 'Glob pattern to filter files (e.g., "*.js", "*.{ts,tsx}")',
188
- },
189
- type: {
190
- type: 'string',
191
- description: 'File type to search (e.g., "js", "py", "rust")',
192
- },
193
- output_mode: {
194
- type: 'string',
195
- enum: ['content', 'files_with_matches', 'count'],
196
- description: 'Output mode. Defaults to "files_with_matches".',
197
- },
198
- '-i': {
199
- type: 'boolean',
200
- description: 'Case insensitive search',
201
- },
202
- '-n': {
203
- type: 'boolean',
204
- description: 'Show line numbers in output. Defaults to true.',
205
- },
206
- '-A': {
207
- type: 'number',
208
- description: 'Number of lines to show after each match',
209
- },
210
- '-B': {
211
- type: 'number',
212
- description: 'Number of lines to show before each match',
213
- },
214
- '-C': {
215
- type: 'number',
216
- description: 'Number of lines to show before and after each match',
217
- },
218
- multiline: {
219
- type: 'boolean',
220
- description: 'Enable multiline mode where patterns can span lines',
221
- },
222
- head_limit: {
223
- type: 'number',
224
- description: 'Limit output to first N entries',
225
- },
226
- offset: {
227
- type: 'number',
228
- description: 'Skip first N entries before applying head_limit',
229
- },
230
- },
231
- required: ['pattern'],
232
- additionalProperties: false,
233
- };
234
- async execute(input, context) {
235
- const { pattern, path, glob: globPattern, type, output_mode = DEFAULT_OUTPUT_MODE, '-i': ignoreCase = false, '-n': showLineNumbers = true, '-A': afterContext = 0, '-B': beforeContext = 0, '-C': aroundContext = 0, multiline = false, head_limit = 0, offset = 0, } = input;
236
- const { fs, cwd } = context;
237
- // Determine search path
238
- const searchPath = path ? validatePath(path) : cwd;
239
- // Create regex
240
- const regex = createRegex(pattern, { ignoreCase, multiline });
241
- // Determine which files to search
242
- let filesToSearch = [];
243
- // Check if searchPath is a file or directory
244
- const pathExists = await fs.exists(searchPath);
245
- if (!pathExists) {
246
- return { matches: [], truncated: false };
247
- }
248
- const stats = await fs.stat(searchPath);
249
- if (stats.isDirectory()) {
250
- // Build glob patterns
251
- let patterns = ['**/*'];
252
- if (globPattern) {
253
- patterns = [globPattern];
254
- }
255
- else if (type) {
256
- patterns = getTypeGlobs(type).map(p => `**/${p}`);
257
- }
258
- // Find files matching the pattern
259
- for (const p of patterns) {
260
- const matches = await glob(p, {
261
- cwd: searchPath,
262
- absolute: true,
263
- onlyFiles: true,
264
- ignore: ['**/node_modules/**', '**/.git/**', '**/dist/**', '**/build/**'],
265
- });
266
- filesToSearch.push(...matches);
267
- }
268
- // Remove duplicates
269
- filesToSearch = [...new Set(filesToSearch)];
270
- }
271
- else {
272
- // Search single file
273
- filesToSearch = [searchPath];
274
- }
275
- // Calculate actual context (C overrides A and B)
276
- const actualBeforeContext = aroundContext > 0 ? aroundContext : beforeContext;
277
- const actualAfterContext = aroundContext > 0 ? aroundContext : afterContext;
278
- // Search files
279
- const allMatches = [];
280
- for (const file of filesToSearch) {
281
- const fileMatches = await searchFile(fs, file, regex, {
282
- outputMode: output_mode,
283
- showLineNumbers,
284
- beforeContext: actualBeforeContext,
285
- afterContext: actualAfterContext,
286
- headLimit: head_limit,
287
- offset,
288
- });
289
- allMatches.push(...fileMatches);
290
- // Early termination if we have enough matches
291
- if (head_limit > 0 && allMatches.length >= offset + head_limit + 100) {
292
- break;
293
- }
294
- }
295
- // Apply offset and limit
296
- let results = allMatches;
297
- if (offset > 0) {
298
- results = results.slice(offset);
299
- }
300
- let truncated = false;
301
- if (head_limit > 0 && results.length > head_limit) {
302
- results = results.slice(0, head_limit);
303
- truncated = true;
304
- }
305
- else if (results.length > MAX_RESULTS) {
306
- results = results.slice(0, MAX_RESULTS);
307
- truncated = true;
308
- }
309
- return {
310
- matches: results,
311
- truncated,
312
- };
313
- }
314
- }
315
- //# sourceMappingURL=grep.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../../lib/agent/tools/grep.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,CAAA;AAExB;;GAEG;AACH,MAAM,mBAAmB,GAAG,oBAAoB,CAAA;AAEhD;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,GAAG;YAAE,SAAQ;QAC1B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACpC,CAAC;YACD,QAAQ,CAAC,GAAG,EAAE,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAAe,EAAE,KAAoD;IACxF,IAAI,UAAU,GAAG,GAAG,CAAA,CAAC,gBAAgB;IACrC,IAAI,KAAK,CAAC,UAAU;QAAE,UAAU,IAAI,GAAG,CAAA;IACvC,IAAI,KAAK,CAAC,SAAS;QAAE,UAAU,IAAI,GAAG,CAAA,CAAC,uBAAuB;IAE9D,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IACrC,OAAO,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;AACrD,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,KAAe,EACf,cAAsB,EACtB,MAAc,EACd,KAAa;IAEb,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,MAAM,UAAU,GAAa,EAAE,CAAA;IAE/B,mBAAmB;IACnB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3E,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;IAC7B,CAAC;IAED,kBAAkB;IAClB,KAAK,IAAI,CAAC,GAAG,cAAc,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9F,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;IAC5B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AACnD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,EAAqB,EACrB,QAAgB,EAChB,KAAa,EACb,OAOC;IAED,MAAM,OAAO,GAAgB,EAAE,CAAA;IAE/B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAW,CAAA;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEjC,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;YACnC,8BAA8B;YAC9B,IAAI,KAAK,GAAG,CAAC,CAAA;YACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,sCAAsC;gBACtC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAA;gBACnB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,KAAK,EAAE,CAAA;gBACT,CAAC;YACH,CAAC;YACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,KAAK,oBAAoB,EAAE,CAAC;YACvD,mCAAmC;YACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,KAAK,CAAC,SAAS,GAAG,CAAC,CAAA;gBACnB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;oBAChC,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gEAAgE;YAChE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA,CAAC,kDAAkD;YAEtF,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;gBAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAE,CAAA;gBAC9B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAA;gBAEnB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,mCAAmC;oBACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC9B,MAAM,OAAO,GAAG,eAAe,CAC7B,KAAK,EACL,SAAS,EACT,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,YAAY,CACrB,CAAA;wBAED,6BAA6B;wBAC7B,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;4BAC3F,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;wBAClB,CAAC;wBAED,6BAA6B;wBAC7B,IAAI,UAAU,GAAG,EAAE,CAAA;wBACnB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;4BAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gCAC/C,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAA;gCAC5D,UAAU,IAAI,OAAO,CAAC,eAAe;oCACnC,CAAC,CAAC,GAAG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;oCACxC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;4BAC9B,CAAC;wBACH,CAAC;wBAED,UAAU,IAAI,OAAO,CAAC,eAAe;4BACnC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,IAAI,IAAI,EAAE;4BAC5B,CAAC,CAAC,IAAI,CAAA;wBAER,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;4BACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gCAC9C,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAAA;gCACpC,UAAU,IAAI,OAAO,CAAC,eAAe;oCACnC,CAAC,CAAC,KAAK,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oCACvC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;4BAC7B,CAAC;wBACH,CAAC;wBAED,OAAO,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;4BACzD,OAAO,EAAE,UAAU;yBACpB,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;IAC1E,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,MAAM,CAAA;IAEb,WAAW,GAAG;;;;;;gDAMuB,CAAA;IAErC,WAAW,GAAe;QACjC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+DAA+D;aAC7E;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wEAAwE;aACtF;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2DAA2D;aACzE;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;aAC9D;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,SAAS,EAAE,oBAAoB,EAAE,OAAO,CAAC;gBAChD,WAAW,EAAE,gDAAgD;aAC9D;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,yBAAyB;aACvC;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gDAAgD;aAC9D;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0CAA0C;aACxD;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2CAA2C;aACzD;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qDAAqD;aACnE;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,qDAAqD;aACnE;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iDAAiD;aAC/D;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,oBAAoB,EAAE,KAAK;KAC5B,CAAA;IAED,KAAK,CAAC,OAAO,CAAC,KAAoB,EAAE,OAAoB;QACtD,MAAM,EACJ,OAAO,EACP,IAAI,EACJ,IAAI,EAAE,WAAW,EACjB,IAAI,EACJ,WAAW,GAAG,mBAAmB,EACjC,IAAI,EAAE,UAAU,GAAG,KAAK,EACxB,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,IAAI,EAAE,YAAY,GAAG,CAAC,EACtB,IAAI,EAAE,aAAa,GAAG,CAAC,EACvB,IAAI,EAAE,aAAa,GAAG,CAAC,EACvB,SAAS,GAAG,KAAK,EACjB,UAAU,GAAG,CAAC,EACd,MAAM,GAAG,CAAC,GACX,GAAG,KAAK,CAAA;QACT,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;QAE3B,wBAAwB;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QAElD,eAAe;QACf,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAA;QAE7D,kCAAkC;QAClC,IAAI,aAAa,GAAa,EAAE,CAAA;QAEhC,6CAA6C;QAC7C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;QAC1C,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAEvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,sBAAsB;YACtB,IAAI,QAAQ,GAAa,CAAC,MAAM,CAAC,CAAA;YAEjC,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAA;YAC1B,CAAC;iBAAM,IAAI,IAAI,EAAE,CAAC;gBAChB,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACnD,CAAC;YAED,kCAAkC;YAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,EAAE;oBAC5B,GAAG,EAAE,UAAU;oBACf,QAAQ,EAAE,IAAI;oBACd,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;iBAC1E,CAAC,CAAA;gBACF,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAA;YAChC,CAAC;YAED,oBAAoB;YACpB,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,aAAa,GAAG,CAAC,UAAU,CAAC,CAAA;QAC9B,CAAC;QAED,iDAAiD;QACjD,MAAM,mBAAmB,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAA;QAC7E,MAAM,kBAAkB,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAA;QAE3E,eAAe;QACf,MAAM,UAAU,GAAgB,EAAE,CAAA;QAElC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBACpD,UAAU,EAAE,WAAW;gBACvB,eAAe;gBACf,aAAa,EAAE,mBAAmB;gBAClC,YAAY,EAAE,kBAAkB;gBAChC,SAAS,EAAE,UAAU;gBACrB,MAAM;aACP,CAAC,CAAA;YACF,UAAU,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAA;YAE/B,8CAA8C;YAC9C,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,MAAM,GAAG,UAAU,GAAG,GAAG,EAAE,CAAC;gBACrE,MAAK;YACP,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,GAAG,UAAU,CAAA;QACxB,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,IAAI,UAAU,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YAClD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;YACtC,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YACxC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;YACvC,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC;QAED,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,SAAS;SACV,CAAA;IACH,CAAC;CACF"}