summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-06-11 23:59:51 -0400
committerDax Raad <[email protected]>2025-06-11 23:59:51 -0400
commitf6ed59bf459defd4db62135d262fc222e909e0b3 (patch)
treedee4e823279901a994fcc0726b863477abd9dcfa
parent83991bee8830400946fe046fa41dfd3901fac0d0 (diff)
downloadopencode-f6ed59bf459defd4db62135d262fc222e909e0b3.tar.gz
opencode-f6ed59bf459defd4db62135d262fc222e909e0b3.zip
Refactor external tools organization and add file search API endpoint
🤖 Generated with [OpenCode](https://opencode.ai) Co-Authored-By: OpenCode <[email protected]>
-rw-r--r--packages/opencode/src/external/ripgrep.ts (renamed from packages/opencode/src/ripgrep/index.ts)7
-rw-r--r--packages/opencode/src/file/index.ts2
-rw-r--r--packages/opencode/src/index.ts2
-rw-r--r--packages/opencode/src/server/server.ts29
-rw-r--r--packages/opencode/src/tool/grep.ts2
-rw-r--r--packages/opencode/src/util/lazy.ts11
6 files changed, 48 insertions, 5 deletions
diff --git a/packages/opencode/src/ripgrep/index.ts b/packages/opencode/src/external/ripgrep.ts
index d98e9f139..876078700 100644
--- a/packages/opencode/src/ripgrep/index.ts
+++ b/packages/opencode/src/external/ripgrep.ts
@@ -4,6 +4,7 @@ import { Global } from "../global"
import fs from "fs/promises"
import { z } from "zod"
import { NamedError } from "../util/error"
+import { lazy } from "../util/lazy"
export namespace Ripgrep {
const PLATFORM = {
@@ -35,8 +36,10 @@ export namespace Ripgrep {
}),
)
- const state = App.state("ripgrep", async () => {
- const filepath = path.join(
+ const state = lazy(async () => {
+ let filepath = Bun.which("rg")
+ if (filepath) return { filepath }
+ filepath = path.join(
Global.Path.bin,
"rg" + (process.platform === "win32" ? ".exe" : ""),
)
diff --git a/packages/opencode/src/file/index.ts b/packages/opencode/src/file/index.ts
index cece788dd..b26a890ce 100644
--- a/packages/opencode/src/file/index.ts
+++ b/packages/opencode/src/file/index.ts
@@ -1,6 +1,6 @@
export namespace File {
const glob = new Bun.Glob("**/*")
- export async function search(path: string) {
+ export async function search(path: string, query: string) {
for await (const entry of glob.scan({
cwd: path,
onlyFiles: true,
diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts
index a17b9e7fb..84dcf9246 100644
--- a/packages/opencode/src/index.ts
+++ b/packages/opencode/src/index.ts
@@ -26,7 +26,7 @@ const cli = yargs(hideBin(process.argv))
describe: "Print logs to stderr",
type: "boolean",
})
- .middleware(async (args) => {
+ .middleware(async () => {
await Log.init({ print: process.argv.includes("--print-logs") })
Log.Default.info("opencode", {
version: VERSION,
diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts
index 1ba5afdef..acb2905c4 100644
--- a/packages/opencode/src/server/server.ts
+++ b/packages/opencode/src/server/server.ts
@@ -12,6 +12,7 @@ import { App } from "../app/app"
import { Global } from "../global"
import { mapValues } from "remeda"
import { NamedError } from "../util/error"
+import { Fzf } from "../external/fzf"
const ERRORS = {
400: {
@@ -427,6 +428,34 @@ export namespace Server {
})
},
)
+ .post(
+ "/file_search",
+ describeRoute({
+ description: "Search for files",
+ responses: {
+ 200: {
+ description: "Search for files",
+ content: {
+ "application/json": {
+ schema: resolver(z.string().array()),
+ },
+ },
+ },
+ },
+ }),
+ zValidator(
+ "json",
+ z.object({
+ query: z.string(),
+ }),
+ ),
+ async (c) => {
+ const body = c.req.valid("json")
+ const app = App.info()
+ const result = await Fzf.search(app.path.cwd, body.query)
+ return c.json(result)
+ },
+ )
return result
}
diff --git a/packages/opencode/src/tool/grep.ts b/packages/opencode/src/tool/grep.ts
index 62a32756c..20199a5c6 100644
--- a/packages/opencode/src/tool/grep.ts
+++ b/packages/opencode/src/tool/grep.ts
@@ -1,7 +1,7 @@
import { z } from "zod"
import { Tool } from "./tool"
import { App } from "../app/app"
-import { Ripgrep } from "../ripgrep"
+import { Ripgrep } from "../external/ripgrep"
import DESCRIPTION from "./grep.txt"
diff --git a/packages/opencode/src/util/lazy.ts b/packages/opencode/src/util/lazy.ts
new file mode 100644
index 000000000..8b7ded89f
--- /dev/null
+++ b/packages/opencode/src/util/lazy.ts
@@ -0,0 +1,11 @@
+export function lazy<T>(fn: () => T) {
+ let value: T | undefined
+ let loaded = false
+
+ return (): T => {
+ if (loaded) return value as T
+ value = fn()
+ return value as T
+ }
+}
+