| import { Location } from "@opencode-ai/core/location" | |
| import { Project } from "@opencode-ai/core/project" | |
| import { AbsolutePath } from "@opencode-ai/core/schema" | |
| import { Effect, Layer } from "effect" | |
| import { tmpdir } from "./tmpdir" | |
| export function location(ref: Location.Ref, input: { projectDirectory?: AbsolutePath; vcs?: Project.Vcs } = {}) { | |
| return { | |
| directory: ref.directory, | |
| workspaceID: ref.workspaceID, | |
| project: { id: Project.ID.global, directory: input.projectDirectory ?? ref.directory }, | |
| vcs: input.vcs, | |
| } satisfies Location.Interface | |
| } | |
| export const tempLocationLayer = Layer.unwrap( | |
| Effect.acquireRelease( | |
| Effect.promise(() => tmpdir()), | |
| (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()), | |
| ).pipe( | |
| Effect.map((tmp) => { | |
| const ref = Location.Ref.make({ directory: AbsolutePath.make(tmp.path) }) | |
| return Layer.succeed(Location.Service, Location.Service.of(location(ref))) | |
| }), | |
| ), | |
| ) | |