27 lines
956 B
TypeScript
27 lines
956 B
TypeScript
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)))
|
|
}),
|
|
),
|
|
)
|