From 07bb75f086e3fd08b862feb94b360ba8141b6e66 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Mon, 3 Nov 2025 11:53:38 -0500 Subject: [PATCH] core: add optional dirs parameter to file search API Allow users to exclude directories from file search results by setting dirs=false parameter in /find/file endpoint --- packages/opencode/src/file/index.ts | 21 +++++++++++++++------ packages/opencode/src/server/server.ts | 3 +++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/opencode/src/file/index.ts b/packages/opencode/src/file/index.ts index cb405c18..020b3568 100644 --- a/packages/opencode/src/file/index.ts +++ b/packages/opencode/src/file/index.ts @@ -165,7 +165,11 @@ export namespace File { const project = Instance.project if (project.vcs !== "git") return [] - const diffOutput = await $`git diff --numstat HEAD`.cwd(Instance.directory).quiet().nothrow().text() + const diffOutput = await $`git diff --numstat HEAD` + .cwd(Instance.directory) + .quiet() + .nothrow() + .text() const changedFiles: Info[] = [] @@ -257,9 +261,14 @@ export namespace File { if (project.vcs === "git") { let diff = await $`git diff ${file}`.cwd(Instance.directory).quiet().nothrow().text() - if (!diff.trim()) diff = await $`git diff --staged ${file}`.cwd(Instance.directory).quiet().nothrow().text() + if (!diff.trim()) + diff = await $`git diff --staged ${file}`.cwd(Instance.directory).quiet().nothrow().text() if (diff.trim()) { - const original = await $`git show HEAD:${file}`.cwd(Instance.directory).quiet().nothrow().text() + const original = await $`git show HEAD:${file}` + .cwd(Instance.directory) + .quiet() + .nothrow() + .text() const patch = structuredPatch(file, file, original, content, "old", "new", { context: Infinity, ignoreWhitespace: true, @@ -307,12 +316,12 @@ export namespace File { }) } - export async function search(input: { query: string; limit?: number }) { + export async function search(input: { query: string; limit?: number; dirs?: boolean }) { log.info("search", { query: input.query }) const limit = input.limit ?? 100 const result = await state().then((x) => x.files()) - if (!input.query) return result.dirs.toSorted().slice(0, limit) - const items = [...result.files, ...result.dirs] + if (!input.query) return input.dirs !== false ? result.dirs.toSorted().slice(0, limit) : [] + const items = input.dirs !== false ? [...result.files, ...result.dirs] : result.files const sorted = fuzzysort.go(input.query, items, { limit: limit }).map((r) => r.target) log.info("search", { query: input.query, results: sorted.length }) return sorted diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 2a070ec2..2df2b71f 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -1106,13 +1106,16 @@ export namespace Server { "query", z.object({ query: z.string(), + dirs: z.boolean().optional(), }), ), async (c) => { const query = c.req.valid("query").query + const dirs = c.req.valid("query").dirs const results = await File.search({ query, limit: 10, + dirs, }) return c.json(results) },