location.ts 997 B

123456789101112131415161718192021222324252627
  1. import { Location } from "@opencode-ai/core/location"
  2. import { Project } from "@opencode-ai/core/project"
  3. import { AbsolutePath } from "@opencode-ai/core/schema"
  4. import { Effect, Layer } from "effect"
  5. import { tmpdir } from "./tmpdir"
  6. export function location(ref: Location.Ref, input: { projectDirectory?: AbsolutePath; vcs?: Project.Vcs } = {}) {
  7. const directory = input.projectDirectory ?? ref.directory
  8. return {
  9. directory: ref.directory,
  10. workspaceID: ref.workspaceID,
  11. project: { id: Project.ID.global, directory, canonical: directory },
  12. vcs: input.vcs,
  13. } satisfies Location.Interface
  14. }
  15. export const tempLocationLayer = Layer.unwrap(
  16. Effect.acquireRelease(
  17. Effect.promise(() => tmpdir()),
  18. (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()),
  19. ).pipe(
  20. Effect.map((tmp) => {
  21. const ref = Location.Ref.make({ directory: AbsolutePath.make(tmp.path) })
  22. return Layer.succeed(Location.Service, Location.Service.of(location(ref)))
  23. }),
  24. ),
  25. )