Răsfoiți Sursa

fix(core): bound search tool execution (#39238)

Co-authored-by: Aiden Cline <rekram1-node@users.noreply.github.com>
opencode-agent[bot] 2 săptămâni în urmă
părinte
comite
3bda0ce123

+ 1 - 0
packages/core/src/filesystem.ts

@@ -32,6 +32,7 @@ export type ListInput = typeof ListInput.Type
 export { FindInput }
 
 export const DEFAULT_SEARCH_LIMIT = 100
+export const DEFAULT_SEARCH_TIMEOUT_MS = 30_000
 
 export class GlobInput extends Schema.Class<GlobInput>("FileSystem.GlobInput")({
   pattern: Schema.String,

+ 9 - 0
packages/core/src/tool/plugin/glob.ts

@@ -104,6 +104,15 @@ export const Plugin = {
                     limit: limit + 1,
                   })
                   .pipe(
+                    Effect.timeoutOrElse({
+                      duration: FileSystem.DEFAULT_SEARCH_TIMEOUT_MS,
+                      orElse: () =>
+                        Effect.fail(
+                          new ToolFailure({
+                            message: `Search timed out after ${FileSystem.DEFAULT_SEARCH_TIMEOUT_MS / 1_000} seconds. Consider using a more specific path or pattern.`,
+                          }),
+                        ),
+                    }),
                     Effect.map((result) =>
                       result.map((entry) =>
                         FileSystem.Entry.make({

+ 9 - 0
packages/core/src/tool/plugin/grep.ts

@@ -118,6 +118,15 @@ export const Plugin = {
                     limit: limit + 1,
                   })
                   .pipe(
+                    Effect.timeoutOrElse({
+                      duration: FileSystem.DEFAULT_SEARCH_TIMEOUT_MS,
+                      orElse: () =>
+                        Effect.fail(
+                          new ToolFailure({
+                            message: `Search timed out after ${FileSystem.DEFAULT_SEARCH_TIMEOUT_MS / 1_000} seconds. Consider using a more specific path or pattern.`,
+                          }),
+                        ),
+                    }),
                     Effect.map((result) =>
                       result.map((match) =>
                         FileSystem.Match.make({