import { join } from "node:path"; import { homedir } from "node:os"; /** Resolve the RivonClaw home directory. Defaults to ~/.rivonclaw. */ export function resolveRivonClawHome( env: Record = process.env, ): string { return env.RIVONCLAW_HOME?.trim() || join(homedir(), ".rivonclaw"); } /** Resolve the SQLite database path. */ export function resolveDbPath( env: Record = process.env, ): string { return env.RIVONCLAW_DB_PATH?.trim() || join(resolveRivonClawHome(env), "db.sqlite"); } /** Resolve the log directory. */ export function resolveLogDir( env: Record = process.env, ): string { return env.RIVONCLAW_LOG_DIR?.trim() || join(resolveRivonClawHome(env), "logs"); } /** Resolve the secrets directory. */ export function resolveSecretsDir( env: Record = process.env, ): string { return env.RIVONCLAW_SECRETS_DIR?.trim() || join(resolveRivonClawHome(env), "secrets"); } /** Resolve the OpenClaw state directory. */ export function resolveOpenClawStateDir( env: Record = process.env, ): string { return env.OPENCLAW_STATE_DIR?.trim() || join(resolveRivonClawHome(env), "openclaw"); } /** Resolve the OpenClaw config file path. */ export function resolveOpenClawConfigPath( env: Record = process.env, ): string { return env.OPENCLAW_CONFIG_PATH?.trim() || join(resolveOpenClawStateDir(env), "openclaw.json"); } /** Resolve the media base directory (under OpenClaw state). */ export function resolveMediaDir( env: Record = process.env, ): string { return join(resolveOpenClawStateDir(env), "media"); } /** Resolve the Chrome CDP wrapper data directory. */ export function resolveCdpDataDir( env: Record = process.env, ): string { return join(resolveRivonClawHome(env), "chrome-cdp"); } /** Resolve the update-installing marker file path. */ export function resolveUpdateMarkerPath( env: Record = process.env, ): string { return join(resolveRivonClawHome(env), "update-installing"); } /** Resolve the proxy router config file path. */ export function resolveProxyRouterConfigPath( env: Record = process.env, ): string { return join(resolveOpenClawStateDir(env), "proxy-router.json"); } /** Resolve the heartbeat file path used for single-instance stale detection. */ export function resolveHeartbeatPath( env: Record = process.env, ): string { return join(resolveRivonClawHome(env), "heartbeat.json"); } /** Resolve the user-installed skills directory. */ export function resolveUserSkillsDir( env: Record = process.env, ): string { return join(resolveOpenClawStateDir(env), "skills"); } /** Resolve the credentials directory (channel pairing, mobile allow-lists). */ export function resolveCredentialsDir( env: Record = process.env, ): string { return join(resolveOpenClawStateDir(env), "credentials"); } /** Default agent ID used by the OpenClaw engine. */ export const DEFAULT_AGENT_ID = "main"; /** Resolve the main agent config directory (models.json, auth-profiles.json). */ export function resolveAgentConfigDir( env: Record = process.env, agentId: string = DEFAULT_AGENT_ID, ): string { return join(resolveOpenClawStateDir(env), "agents", agentId, "agent"); } /** Resolve the agent sessions directory (sessions.json). */ export function resolveAgentSessionsDir( env: Record = process.env, agentId: string = DEFAULT_AGENT_ID, ): string { return join(resolveOpenClawStateDir(env), "agents", agentId, "sessions"); }