Просмотр исходного кода

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
Dax Raad 3 месяцев назад
Родитель
Сommit
07bb75f086
2 измененных файлов с 18 добавлено и 6 удалено
  1. 15 6
      packages/opencode/src/file/index.ts
  2. 3 0
      packages/opencode/src/server/server.ts

+ 15 - 6
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

+ 3 - 0
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)
         },