diff --git a/packages/opencode/src/reference.ts b/packages/opencode/src/reference.ts index e602e25b36b..cb9df487ea2 100644 --- a/packages/opencode/src/reference.ts +++ b/packages/opencode/src/reference.ts @@ -9,7 +9,7 @@ import { ProjectReference } from "@opencode-ai/core/project-reference" import { ConfigReference } from "@opencode-ai/core/config/reference" import { RepositoryCache } from "@opencode-ai/core/repository-cache" import { AbsolutePath } from "@opencode-ai/core/schema" -import { Context, Effect, Layer, Schema } from "effect" +import { Context, Effect, Layer, Schema, Scope } from "effect" export type Resolved = ProjectReference.Resolved @@ -51,6 +51,7 @@ export const layer = Layer.effect( Service, Effect.gen(function* () { const config = yield* Config.Service + const scope = yield* Scope.Scope const state = yield* InstanceState.make( Effect.fn("Reference.state")(function* (ctx) { const { Config: ConfigV2 } = yield* Effect.promise(() => import("@opencode-ai/core/config")) @@ -93,6 +94,8 @@ export const layer = Layer.effect( return Service.of({ init: Effect.fn("Reference.init")(function* () { yield* InstanceState.get(state) + // Own the cached warmup from the long-lived legacy scope before the core layer's scheduled fork can claim it. + yield* ensure().pipe(Effect.forkIn(scope, { startImmediately: true }), Effect.asVoid) }), list: Effect.fn("Reference.list")(function* () { return yield* InstanceState.useEffect(state, (service) => service.list()) diff --git a/packages/opencode/test/reference/reference.test.ts b/packages/opencode/test/reference/reference.test.ts index 4cc5eb4506e..907d7d1a3f8 100644 --- a/packages/opencode/test/reference/reference.test.ts +++ b/packages/opencode/test/reference/reference.test.ts @@ -1,5 +1,6 @@ import { afterEach, describe, expect } from "bun:test" import path from "path" +import { pathToFileURL } from "url" import { Effect, Layer } from "effect" import { FSUtil } from "@opencode-ai/core/fs-util" import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner" @@ -202,7 +203,9 @@ describe("reference", () => { const resolved = yield* reference.get("docs") expect(resolved?.kind).toBe("git") if (resolved?.kind === "git") { - expect(resolved.reference.remote).toBe(`file://${remoteRoot}/opencode-reference-init/repo.git`) + expect(resolved.reference.remote).toBe( + new URL("opencode-reference-init/repo.git", pathToFileURL(remoteRoot + path.sep)).href, + ) } }), {