import fs from "node:fs/promises"; import path from "node:path"; import { withTempHome as withTempHomeBase } from "../../test/helpers/temp-home.js"; import type { OpenClawConfig } from "./config.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: NonNullable< NonNullable["web"]>["search"]>["provider"] >; enabled?: boolean; providerConfig?: Record; }): Record { const search: Record = { provider: params.provider }; if (params.enabled !== undefined) { search.enabled = params.enabled; } const pluginId = params.provider === "gemini" ? "google" : params.provider === "grok" ? "xai" : params.provider === "kimi" ? "moonshot" : params.provider; return { tools: { web: { search, }, }, ...(params.providerConfig ? { plugins: { entries: { [pluginId]: { config: { webSearch: params.providerConfig, }, }, }, }, } : {}), }; }