Skip to content

Commit d684086

Browse files
authored
refactor(ripgrep): use embedded wasm backend (#21703)
1 parent 9b2648d commit d684086

15 files changed

Lines changed: 851 additions & 560 deletions

File tree

bun.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/opencode/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@
153153
"opentui-spinner": "0.0.6",
154154
"partial-json": "0.1.7",
155155
"remeda": "catalog:",
156+
"ripgrep": "0.3.1",
156157
"semver": "^7.6.3",
157158
"solid-js": "catalog:",
158159
"strip-ansi": "7.1.2",

packages/opencode/src/cli/cmd/debug/ripgrep.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const FilesCommand = cmd({
4646
async handler(args) {
4747
await bootstrap(process.cwd(), async () => {
4848
const files: string[] = []
49-
for await (const file of Ripgrep.files({
49+
for await (const file of await Ripgrep.files({
5050
cwd: Instance.directory,
5151
glob: args.glob ? [args.glob] : undefined,
5252
})) {

packages/opencode/src/file/index.ts

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { BusEvent } from "@/bus/bus-event"
22
import { InstanceState } from "@/effect/instance-state"
3+
import { makeRuntime } from "@/effect/run-service"
34
import { AppFileSystem } from "@/filesystem"
45
import { Git } from "@/git"
56
import { Effect, Layer, Context } from "effect"
7+
import * as Stream from "effect/Stream"
68
import { formatPatch, structuredPatch } from "diff"
79
import fuzzysort from "fuzzysort"
810
import ignore from "ignore"
@@ -342,6 +344,7 @@ export namespace File {
342344
Service,
343345
Effect.gen(function* () {
344346
const appFs = yield* AppFileSystem.Service
347+
const rg = yield* Ripgrep.Service
345348
const git = yield* Git.Service
346349

347350
const state = yield* InstanceState.make<State>(
@@ -381,7 +384,10 @@ export namespace File {
381384

382385
next.dirs = Array.from(dirs).toSorted()
383386
} else {
384-
const files = yield* Effect.promise(() => Array.fromAsync(Ripgrep.files({ cwd: Instance.directory })))
387+
const files = yield* rg.files({ cwd: Instance.directory }).pipe(
388+
Stream.runCollect,
389+
Effect.map((chunk) => [...chunk]),
390+
)
385391
const seen = new Set<string>()
386392
for (const file of files) {
387393
next.files.push(file)
@@ -642,5 +648,31 @@ export namespace File {
642648
}),
643649
)
644650

645-
export const defaultLayer = layer.pipe(Layer.provide(AppFileSystem.defaultLayer), Layer.provide(Git.defaultLayer))
651+
export const defaultLayer = layer.pipe(
652+
Layer.provide(Ripgrep.defaultLayer),
653+
Layer.provide(AppFileSystem.defaultLayer),
654+
Layer.provide(Git.defaultLayer),
655+
)
656+
657+
const { runPromise } = makeRuntime(Service, defaultLayer)
658+
659+
export function init() {
660+
return runPromise((svc) => svc.init())
661+
}
662+
663+
export async function status() {
664+
return runPromise((svc) => svc.status())
665+
}
666+
667+
export async function read(file: string): Promise<Content> {
668+
return runPromise((svc) => svc.read(file))
669+
}
670+
671+
export async function list(dir?: string) {
672+
return runPromise((svc) => svc.list(dir))
673+
}
674+
675+
export async function search(input: { query: string; limit?: number; dirs?: boolean; type?: "file" | "directory" }) {
676+
return runPromise((svc) => svc.search(input))
677+
}
646678
}

0 commit comments

Comments
 (0)