fix(core): reject file glob roots (#38890)
This commit is contained in:
parent
1e35d33ecb
commit
f753103e82
2 changed files with 28 additions and 1 deletions
|
|
@ -83,13 +83,17 @@ export const Plugin = {
|
||||||
agent: context.agent,
|
agent: context.agent,
|
||||||
source,
|
source,
|
||||||
})
|
})
|
||||||
yield* fs
|
const info = yield* fs
|
||||||
.stat(target.canonical)
|
.stat(target.canonical)
|
||||||
.pipe(
|
.pipe(
|
||||||
Effect.catchReason("PlatformError", "NotFound", () =>
|
Effect.catchReason("PlatformError", "NotFound", () =>
|
||||||
Effect.fail(new ToolFailure({ message: `Search path does not exist: ${input.path ?? "."}` })),
|
Effect.fail(new ToolFailure({ message: `Search path does not exist: ${input.path ?? "."}` })),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
if (info.type !== "Directory")
|
||||||
|
return yield* Effect.fail(
|
||||||
|
new ToolFailure({ message: `Search path is not a directory: ${input.path ?? "."}` }),
|
||||||
|
)
|
||||||
const root = path.resolve(location.directory, input.path ?? ".")
|
const root = path.resolve(location.directory, input.path ?? ".")
|
||||||
const limit = input.limit ?? FileSystem.DEFAULT_SEARCH_LIMIT
|
const limit = input.limit ?? FileSystem.DEFAULT_SEARCH_LIMIT
|
||||||
const entries = yield* ripgrep
|
const entries = yield* ripgrep
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,29 @@ describe("search tools", () => {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
it.live("reports a file used as the glob search path", () =>
|
||||||
|
Effect.acquireUseRelease(
|
||||||
|
Effect.promise(() => tmpdir()),
|
||||||
|
(tmp) =>
|
||||||
|
Effect.promise(() => fs.writeFile(path.join(tmp.path, "file.txt"), "content\n")).pipe(
|
||||||
|
Effect.andThen(
|
||||||
|
withTools(tmp.path, (registry) =>
|
||||||
|
executeTool(registry, call("glob", { path: "file.txt", pattern: "*" })),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Effect.tap((result) =>
|
||||||
|
Effect.sync(() => {
|
||||||
|
expect(result).toEqual({
|
||||||
|
status: "error",
|
||||||
|
error: { type: "tool.execution", message: "Search path is not a directory: file.txt" },
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
it.live("requires external_directory approval for an explicit external glob path", () =>
|
it.live("requires external_directory approval for an explicit external glob path", () =>
|
||||||
Effect.acquireUseRelease(
|
Effect.acquireUseRelease(
|
||||||
Effect.promise(() => Promise.all([tmpdir(), tmpdir()])),
|
Effect.promise(() => Promise.all([tmpdir(), tmpdir()])),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue