53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
|
|
import { resolveUserPath } from "../../utils.js";
|
|
import {
|
|
DEFAULT_AGENTS_FILENAME,
|
|
DEFAULT_BOOTSTRAP_FILENAME,
|
|
DEFAULT_HEARTBEAT_FILENAME,
|
|
DEFAULT_IDENTITY_FILENAME,
|
|
DEFAULT_SOUL_FILENAME,
|
|
DEFAULT_TOOLS_FILENAME,
|
|
DEFAULT_USER_FILENAME,
|
|
ensureAgentWorkspace,
|
|
} from "../workspace.js";
|
|
|
|
export async function ensureSandboxWorkspace(
|
|
workspaceDir: string,
|
|
seedFrom?: string,
|
|
skipBootstrap?: boolean,
|
|
) {
|
|
await fs.mkdir(workspaceDir, { recursive: true });
|
|
if (seedFrom) {
|
|
const seed = resolveUserPath(seedFrom);
|
|
const files = [
|
|
DEFAULT_AGENTS_FILENAME,
|
|
DEFAULT_SOUL_FILENAME,
|
|
DEFAULT_TOOLS_FILENAME,
|
|
DEFAULT_IDENTITY_FILENAME,
|
|
DEFAULT_USER_FILENAME,
|
|
DEFAULT_BOOTSTRAP_FILENAME,
|
|
DEFAULT_HEARTBEAT_FILENAME,
|
|
];
|
|
for (const name of files) {
|
|
const src = path.join(seed, name);
|
|
const dest = path.join(workspaceDir, name);
|
|
try {
|
|
await fs.access(dest);
|
|
} catch {
|
|
try {
|
|
const content = await fs.readFile(src, "utf-8");
|
|
await fs.writeFile(dest, content, { encoding: "utf-8", flag: "wx" });
|
|
} catch {
|
|
// ignore missing seed file
|
|
}
|
|
}
|
|
}
|
|
}
|
|
await ensureAgentWorkspace({
|
|
dir: workspaceDir,
|
|
ensureBootstrapFiles: !skipBootstrap,
|
|
});
|
|
}
|