From 31ad6e85ba62ff6d7ad375a584f5ea8a3b66aef3 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Thu, 26 Mar 2026 00:56:34 +0000 Subject: [PATCH] chore: generate --- packages/opencode/specs/effect-migration.md | 37 ++++++++++++--------- packages/opencode/src/file/index.ts | 8 ++--- packages/opencode/src/plugin/index.ts | 22 ++++++------ packages/opencode/src/project/vcs.ts | 30 ++++++++--------- packages/opencode/test/project/vcs.test.ts | 5 +-- 5 files changed, 49 insertions(+), 53 deletions(-) diff --git a/packages/opencode/specs/effect-migration.md b/packages/opencode/specs/effect-migration.md index c95d131dc5..43b3194858 100644 --- a/packages/opencode/specs/effect-migration.md +++ b/packages/opencode/specs/effect-migration.md @@ -82,31 +82,38 @@ The `InstanceState.make` init callback receives a `Scope`, so you can use `Effec - **Subscriptions**: Yield `Bus.Service` at the layer level, then use `Stream` + `forkScoped` inside the init closure. The fiber is automatically interrupted when the instance scope closes: ```ts -const bus = yield* Bus.Service +const bus = yield * Bus.Service -const cache = yield* InstanceState.make( - Effect.fn("Foo.state")(function* (ctx) { - // ... load state ... +const cache = + yield * + InstanceState.make( + Effect.fn("Foo.state")(function* (ctx) { + // ... load state ... - yield* bus - .subscribeAll() - .pipe( - Stream.runForEach((event) => Effect.sync(() => { /* handle */ })), + yield* bus.subscribeAll().pipe( + Stream.runForEach((event) => + Effect.sync(() => { + /* handle */ + }), + ), Effect.forkScoped, ) - return { /* state */ } - }), -) + return { + /* state */ + } + }), + ) ``` - **Resource cleanup**: Use `Effect.acquireRelease` or `Effect.addFinalizer` for resources that need teardown (native watchers, process handles, etc.): ```ts -yield* Effect.acquireRelease( - Effect.sync(() => nativeAddon.watch(dir)), - (watcher) => Effect.sync(() => watcher.close()), -) +yield * + Effect.acquireRelease( + Effect.sync(() => nativeAddon.watch(dir)), + (watcher) => Effect.sync(() => watcher.close()), + ) ``` - **Background fibers**: Use `Effect.forkScoped` — the fiber is interrupted on disposal. diff --git a/packages/opencode/src/file/index.ts b/packages/opencode/src/file/index.ts index 61f1af89d3..efc3fa7c9a 100644 --- a/packages/opencode/src/file/index.ts +++ b/packages/opencode/src/file/index.ts @@ -404,15 +404,11 @@ export namespace File { s.cache = next }) - let cachedScan = yield* Effect.cached( - scan().pipe(Effect.catchCause(() => Effect.void)), - ) + let cachedScan = yield* Effect.cached(scan().pipe(Effect.catchCause(() => Effect.void))) const ensure = Effect.fn("File.ensure")(function* () { yield* cachedScan - cachedScan = yield* Effect.cached( - scan().pipe(Effect.catchCause(() => Effect.void)), - ) + cachedScan = yield* Effect.cached(scan().pipe(Effect.catchCause(() => Effect.void))) }) const init = Effect.fn("File.init")(function* () { diff --git a/packages/opencode/src/plugin/index.ts b/packages/opencode/src/plugin/index.ts index cd4b917992..9804169a46 100644 --- a/packages/opencode/src/plugin/index.ts +++ b/packages/opencode/src/plugin/index.ts @@ -149,18 +149,16 @@ export namespace Plugin { }) // Subscribe to bus events, fiber interrupted when scope closes - yield* bus - .subscribeAll() - .pipe( - Stream.runForEach((input) => - Effect.sync(() => { - for (const hook of hooks) { - hook["event"]?.({ event: input as any }) - } - }), - ), - Effect.forkScoped, - ) + yield* bus.subscribeAll().pipe( + Stream.runForEach((input) => + Effect.sync(() => { + for (const hook of hooks) { + hook["event"]?.({ event: input as any }) + } + }), + ), + Effect.forkScoped, + ) return { hooks } }), diff --git a/packages/opencode/src/project/vcs.ts b/packages/opencode/src/project/vcs.ts index 7df9dfb6f1..daca1c75c0 100644 --- a/packages/opencode/src/project/vcs.ts +++ b/packages/opencode/src/project/vcs.ts @@ -159,22 +159,20 @@ export namespace Vcs { const value = { current, root } log.info("initialized", { branch: value.current, default_branch: value.root?.name }) - yield* bus - .subscribe(FileWatcher.Event.Updated) - .pipe( - Stream.filter((evt) => evt.properties.file.endsWith("HEAD")), - Stream.runForEach((_evt) => - Effect.gen(function* () { - const next = yield* Effect.promise(() => get()) - if (next !== value.current) { - log.info("branch changed", { from: value.current, to: next }) - value.current = next - yield* bus.publish(Event.BranchUpdated, { branch: next }) - } - }), - ), - Effect.forkScoped, - ) + yield* bus.subscribe(FileWatcher.Event.Updated).pipe( + Stream.filter((evt) => evt.properties.file.endsWith("HEAD")), + Stream.runForEach((_evt) => + Effect.gen(function* () { + const next = yield* Effect.promise(() => get()) + if (next !== value.current) { + log.info("branch changed", { from: value.current, to: next }) + value.current = next + yield* bus.publish(Event.BranchUpdated, { branch: next }) + } + }), + ), + Effect.forkScoped, + ) return value }), diff --git a/packages/opencode/test/project/vcs.test.ts b/packages/opencode/test/project/vcs.test.ts index 50282b5f6c..a327f65fab 100644 --- a/packages/opencode/test/project/vcs.test.ts +++ b/packages/opencode/test/project/vcs.test.ts @@ -162,10 +162,7 @@ describe("Vcs diff", () => { await $`git worktree add -b feature/test ${dir} HEAD`.cwd(tmp.path).quiet() await withVcsOnly(dir, async () => { - const [branch, base] = await Promise.all([ - Vcs.branch(), - Vcs.defaultBranch(), - ]) + const [branch, base] = await Promise.all([Vcs.branch(), Vcs.defaultBranch()]) expect(branch).toBe("feature/test") expect(base).toBe("main") })