import path from "node:path"; import { fileURLToPath } from "node:url"; import { resolveOpenClawPackageRoot } from "../infra/openclaw-root.js"; import { pathExists } from "../utils.js"; const FALLBACK_TEMPLATE_DIR = path.resolve( path.dirname(fileURLToPath(import.meta.url)), "../../docs/reference/templates", ); let cachedTemplateDir: string | undefined; let resolvingTemplateDir: Promise | undefined; export async function resolveWorkspaceTemplateDir(opts?: { cwd?: string; argv1?: string; moduleUrl?: string; }): Promise { if (cachedTemplateDir) { return cachedTemplateDir; } if (resolvingTemplateDir) { return resolvingTemplateDir; } resolvingTemplateDir = (async () => { const moduleUrl = opts?.moduleUrl ?? import.meta.url; const argv1 = opts?.argv1 ?? process.argv[1]; const cwd = opts?.cwd ?? process.cwd(); const packageRoot = await resolveOpenClawPackageRoot({ moduleUrl, argv1, cwd }); const candidates = [ packageRoot ? path.join(packageRoot, "docs", "reference", "templates") : null, cwd ? path.resolve(cwd, "docs", "reference", "templates") : null, FALLBACK_TEMPLATE_DIR, ].filter(Boolean) as string[]; for (const candidate of candidates) { if (await pathExists(candidate)) { cachedTemplateDir = candidate; return candidate; } } cachedTemplateDir = candidates[0] ?? FALLBACK_TEMPLATE_DIR; return cachedTemplateDir; })(); try { return await resolvingTemplateDir; } finally { resolvingTemplateDir = undefined; } } export function resetWorkspaceTemplateDirCache() { cachedTemplateDir = undefined; resolvingTemplateDir = undefined; }