diff options
| author | Dax Raad <[email protected]> | 2025-11-03 11:53:38 -0500 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-11-03 11:53:41 -0500 |
| commit | 07bb75f086e3fd08b862feb94b360ba8141b6e66 (patch) | |
| tree | af585dedb53a3f8a2b6902890dbd2cd83f164e8f | |
| parent | 66eb846e6fca107ee80cd477d099ca4ccbb5ff8d (diff) | |
| download | opencode-07bb75f086e3fd08b862feb94b360ba8141b6e66.tar.gz opencode-07bb75f086e3fd08b862feb94b360ba8141b6e66.zip | |
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
| -rw-r--r-- | packages/opencode/src/file/index.ts | 21 | ||||
| -rw-r--r-- | 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 cb405c181..020b3568e 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 2a070ec23..2df2b71f3 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) }, |
