location.ts 956 B

1234567891011121314151617181920212223242526
  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. return {
  8. directory: ref.directory,
  9. workspaceID: ref.workspaceID,
  10. project: { id: Project.ID.global, directory: input.projectDirectory ?? ref.directory },
  11. vcs: input.vcs,
  12. } satisfies Location.Interface
  13. }
  14. export const tempLocationLayer = Layer.unwrap(
  15. Effect.acquireRelease(
  16. Effect.promise(() => tmpdir()),
  17. (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()),
  18. ).pipe(
  19. Effect.map((tmp) => {
  20. const ref = Location.Ref.make({ directory: AbsolutePath.make(tmp.path) })
  21. return Layer.succeed(Location.Service, Location.Service.of(location(ref)))
  22. }),
  23. ),
  24. )