import z from "zod" import { Worktree } from "@/worktree" import { type Adaptor, WorkspaceInfo } from "../types" const Config = WorkspaceInfo.extend({ name: WorkspaceInfo.shape.name.unwrap(), branch: WorkspaceInfo.shape.branch.unwrap(), directory: WorkspaceInfo.shape.directory.unwrap(), }) type Config = z.infer export const WorktreeAdaptor: Adaptor = { async configure(info) { const worktree = await Worktree.makeWorktreeInfo(info.name ?? undefined) return { ...info, name: worktree.name, branch: worktree.branch, directory: worktree.directory, } }, async create(info) { const config = Config.parse(info) const bootstrap = await Worktree.createFromInfo({ name: config.name, directory: config.directory, branch: config.branch, }) return bootstrap() }, async remove(info) { const config = Config.parse(info) await Worktree.remove({ directory: config.directory }) }, async fetch(info, input: RequestInfo | URL, init?: RequestInit) { const config = Config.parse(info) const { WorkspaceServer } = await import("../workspace-server/server") const url = input instanceof Request || input instanceof URL ? input : new URL(input, "http://opencode.internal") const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined)) headers.set("x-opencode-directory", config.directory) const request = new Request(url, { ...init, headers }) return WorkspaceServer.App().fetch(request) }, }