openclaw/src/agents/workspace-templates.ts
2026-02-09 18:56:58 -08:00

60 lines
1.7 KiB
TypeScript

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<string> | undefined;
export async function resolveWorkspaceTemplateDir(opts?: {
cwd?: string;
argv1?: string;
moduleUrl?: string;
}): Promise<string> {
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;
}