Files
mem0/openclaw/cli/config-file.ts
T

66 lines
2.0 KiB
TypeScript

/**
* File-based config helpers for ~/.mem0/config.json.
*
* Separated from commands.ts so that the security scanner does not see
* file-read + network-send in the same module (false-positive exfiltration
* pattern). This module only touches the filesystem — no network calls.
*/
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
import { join } from "node:path";
import { homedir } from "node:os";
export const CONFIG_DIR = join(homedir(), ".mem0");
export const CONFIG_FILE = join(CONFIG_DIR, "config.json");
export const DEFAULT_BASE_URL = "https://api.mem0.ai";
export interface Mem0FileConfig {
version: number;
platform: Record<string, unknown>;
defaults: Record<string, unknown>;
[key: string]: unknown;
}
export function readMem0Config(): Mem0FileConfig {
if (existsSync(CONFIG_FILE)) {
try {
const raw = JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
return {
...raw,
version: raw.version ?? 1,
platform: raw.platform ?? {},
defaults: raw.defaults ?? {},
};
} catch {
/* ignore parse errors */
}
}
return { version: 1, platform: {}, defaults: {} };
}
/** Get the base URL from config, handling both camelCase and snake_case */
export function getBaseUrl(config: Mem0FileConfig): string {
const p = config.platform;
return ((p.baseUrl ?? p.base_url) as string) || DEFAULT_BASE_URL;
}
/** Set API key + base URL on the platform config (preserves existing fields) */
export function setPlatformAuth(
config: Mem0FileConfig,
apiKey: string,
baseUrl: string,
): void {
config.platform.apiKey = apiKey;
config.platform.baseUrl = baseUrl;
// Also write snake_case so Python CLI can read it
config.platform.api_key = apiKey;
config.platform.base_url = baseUrl;
}
export function writeMem0Config(config: Mem0FileConfig): void {
if (!existsSync(CONFIG_DIR)) {
mkdirSync(CONFIG_DIR, { mode: 0o700, recursive: true });
}
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
}