import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath, pathToFileURL } from "node:url"; const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); export function getA2uiPaths(env = process.env) { const srcDir = env.OPENCLAW_A2UI_SRC_DIR ?? path.join(repoRoot, "src", "canvas-host", "a2ui"); const outDir = env.OPENCLAW_A2UI_OUT_DIR ?? path.join(repoRoot, "dist", "canvas-host", "a2ui"); return { srcDir, outDir }; } export function shouldSkipMissingA2uiAssets(env = process.env): boolean { return env.OPENCLAW_A2UI_SKIP_MISSING === "1" || Boolean(env.OPENCLAW_SPARSE_PROFILE); } export async function copyA2uiAssets({ srcDir, outDir }: { srcDir: string; outDir: string }) { const skipMissing = shouldSkipMissingA2uiAssets(process.env); try { await fs.stat(path.join(srcDir, "index.html")); await fs.stat(path.join(srcDir, "a2ui.bundle.js")); } catch (err) { const message = 'Missing A2UI bundle assets. Run "pnpm canvas:a2ui:bundle" and retry.'; if (skipMissing) { console.warn( `${message} Skipping copy because OPENCLAW_A2UI_SKIP_MISSING=1 or OPENCLAW_SPARSE_PROFILE is set.`, ); return; } throw new Error(message, { cause: err }); } await fs.mkdir(path.dirname(outDir), { recursive: true }); await fs.cp(srcDir, outDir, { recursive: true }); } async function main() { const { srcDir, outDir } = getA2uiPaths(); await copyA2uiAssets({ srcDir, outDir }); } if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) { main().catch((err) => { console.error(String(err)); process.exit(1); }); }