import fs from "node:fs/promises"; import path from "node:path"; import { withTempHome as withTempHomeBase } from "../../test/helpers/temp-home.js"; export async function withTempHome(fn: (home: string) => Promise): Promise { return withTempHomeBase(fn, { prefix: "openclaw-config-" }); } export async function writeOpenClawConfig(home: string, config: unknown): Promise { const configPath = path.join(home, ".openclaw", "openclaw.json"); await fs.mkdir(path.dirname(configPath), { recursive: true }); await fs.writeFile(configPath, JSON.stringify(config, null, 2), "utf-8"); return configPath; } export async function withTempHomeConfig( config: unknown, fn: (params: { home: string; configPath: string }) => Promise, ): Promise { return withTempHome(async (home) => { const configPath = await writeOpenClawConfig(home, config); return fn({ home, configPath }); }); } /** * Helper to test env var overrides. Saves/restores env vars for a callback. */ export async function withEnvOverride( overrides: Record, fn: () => Promise, ): Promise { const saved: Record = {}; for (const key of Object.keys(overrides)) { saved[key] = process.env[key]; if (overrides[key] === undefined) { delete process.env[key]; } else { process.env[key] = overrides[key]; } } try { return await fn(); } finally { for (const key of Object.keys(saved)) { if (saved[key] === undefined) { delete process.env[key]; } else { process.env[key] = saved[key]; } } } } export function buildWebSearchProviderConfig(params: { provider: string; enabled?: boolean; providerConfig?: Record; }): Record { const search: Record = { provider: params.provider }; if (params.enabled !== undefined) { search.enabled = params.enabled; } if (params.providerConfig) { search[params.provider] = params.providerConfig; } return { tools: { web: { search, }, }, }; }