summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-11-03 11:53:38 -0500
committerDax Raad <[email protected]>2025-11-03 11:53:41 -0500
commit07bb75f086e3fd08b862feb94b360ba8141b6e66 (patch)
treeaf585dedb53a3f8a2b6902890dbd2cd83f164e8f
parent66eb846e6fca107ee80cd477d099ca4ccbb5ff8d (diff)
downloadopencode-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.ts21
-rw-r--r--packages/opencode/src/server/server.ts3
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)
},