1import { mkdtemp, rm, chmod } from "node:fs/promises";
2import { tmpdir } from "node:os";
3import { join } from "node:path";
4import { WorkspaceError } from "../util/errors.js";
5
6export interface Workspace {
7 path: string;
8 cleanup: () => Promise<void>;
9}
10
11export interface WorkspaceOptions {
12 cleanup: boolean;
13}
14
15export async function createWorkspace(options: WorkspaceOptions): Promise<Workspace> {
16 try {
17 const root = await mkdtemp(join(tmpdir(), "rumilo-"));
18 await chmod(root, 0o700);
19
20 const cleanup = async () => {
21 if (!options.cleanup) return;
22 await rm(root, { recursive: true, force: true });
23 };
24
25 return { path: root, cleanup };
26 } catch (error) {
27 throw new WorkspaceError(`Failed to create workspace: ${String(error)}`);
28 }
29}