From 7119ab1d98d77a874ced4a9e260c595b8845cf51 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 13 Mar 2026 21:00:13 +0000 Subject: [PATCH] refactor: dedupe home relative path resolution --- src/config/paths.ts | 16 ++-------------- src/infra/home-dir.ts | 22 ++++++++++++++++++++++ src/utils.ts | 16 ++-------------- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/config/paths.ts b/src/config/paths.ts index 5f9afc85a46..84c27749bcf 100644 --- a/src/config/paths.ts +++ b/src/config/paths.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { expandHomePrefix, resolveRequiredHomeDir } from "../infra/home-dir.js"; +import { resolveHomeRelativePath, resolveRequiredHomeDir } from "../infra/home-dir.js"; import type { OpenClawConfig } from "./types.js"; /** @@ -93,19 +93,7 @@ function resolveUserPath( env: NodeJS.ProcessEnv = process.env, homedir: () => string = envHomedir(env), ): string { - const trimmed = input.trim(); - if (!trimmed) { - return trimmed; - } - if (trimmed.startsWith("~")) { - const expanded = expandHomePrefix(trimmed, { - home: resolveRequiredHomeDir(env, homedir), - env, - homedir, - }); - return path.resolve(expanded); - } - return path.resolve(trimmed); + return resolveHomeRelativePath(input, { env, homedir }); } export const STATE_DIR = resolveStateDir(); diff --git a/src/infra/home-dir.ts b/src/infra/home-dir.ts index 7dd2bbdd1ec..650cf0cadac 100644 --- a/src/infra/home-dir.ts +++ b/src/infra/home-dir.ts @@ -75,3 +75,25 @@ export function expandHomePrefix( } return input.replace(/^~(?=$|[\\/])/, home); } + +export function resolveHomeRelativePath( + input: string, + opts?: { + env?: NodeJS.ProcessEnv; + homedir?: () => string; + }, +): string { + const trimmed = input.trim(); + if (!trimmed) { + return trimmed; + } + if (trimmed.startsWith("~")) { + const expanded = expandHomePrefix(trimmed, { + home: resolveRequiredHomeDir(opts?.env ?? process.env, opts?.homedir ?? os.homedir), + env: opts?.env, + homedir: opts?.homedir, + }); + return path.resolve(expanded); + } + return path.resolve(trimmed); +} diff --git a/src/utils.ts b/src/utils.ts index 38c26605b19..caf5edb1969 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -4,8 +4,8 @@ import path from "node:path"; import { resolveOAuthDir } from "./config/paths.js"; import { logVerbose, shouldLogVerbose } from "./globals.js"; import { - expandHomePrefix, resolveEffectiveHomeDir, + resolveHomeRelativePath, resolveRequiredHomeDir, } from "./infra/home-dir.js"; import { isPlainObject } from "./infra/plain-object.js"; @@ -279,19 +279,7 @@ export function resolveUserPath( if (!input) { return ""; } - const trimmed = input.trim(); - if (!trimmed) { - return trimmed; - } - if (trimmed.startsWith("~")) { - const expanded = expandHomePrefix(trimmed, { - home: resolveRequiredHomeDir(env, homedir), - env, - homedir, - }); - return path.resolve(expanded); - } - return path.resolve(trimmed); + return resolveHomeRelativePath(input, { env, homedir }); } export function resolveConfigDir(