-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathconfigResolution.ts
More file actions
111 lines (93 loc) · 3.71 KB
/
Copy pathconfigResolution.ts
File metadata and controls
111 lines (93 loc) · 3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import path from 'path';
type EnvMap = Record<string, string | undefined>;
export interface ResolveOpenClawConfigInput {
env: EnvMap;
platform: NodeJS.Platform;
homedir: string;
existsSync: (filePath: string) => boolean;
}
export interface ResolveOpenClawConfigResult {
path: string;
source:
| 'OPENCLAW_CONFIG_PATH'
| 'OPENCLAW_STATE_DIR'
| 'OPENCLAW_HOME'
| 'HOME-default'
| 'USERPROFILE-default'
| 'homedir-default'
| 'auto-discovered';
}
function normalizeNonEmpty(value: string | undefined): string | null {
if (!value) return null;
const trimmed = value.trim();
return trimmed.length > 0 ? trimmed : null;
}
function getPathLib(platform: NodeJS.Platform): typeof path.posix | typeof path.win32 {
return platform === 'win32' ? path.win32 : path.posix;
}
function expandTilde(value: string, env: EnvMap, pathLib: typeof path.posix | typeof path.win32): string {
if (!value.startsWith('~')) return value;
const home = normalizeNonEmpty(env.HOME) ?? normalizeNonEmpty(env.USERPROFILE);
if (!home) return value;
return pathLib.join(home, value.slice(1));
}
function normalizeCandidate(value: string, env: EnvMap, pathLib: typeof path.posix | typeof path.win32): string {
return pathLib.normalize(expandTilde(value, env, pathLib));
}
export function resolveOpenClawConfigPath(input: ResolveOpenClawConfigInput): ResolveOpenClawConfigResult {
const { env, homedir, existsSync, platform } = input;
const pathLib = getPathLib(platform);
const explicitConfigPath = normalizeNonEmpty(env.OPENCLAW_CONFIG_PATH);
if (explicitConfigPath) {
return {
path: normalizeCandidate(explicitConfigPath, env, pathLib),
source: 'OPENCLAW_CONFIG_PATH',
};
}
const explicitStateDir = normalizeNonEmpty(env.OPENCLAW_STATE_DIR);
if (explicitStateDir) {
return {
path: pathLib.join(normalizeCandidate(explicitStateDir, env, pathLib), 'openclaw.json'),
source: 'OPENCLAW_STATE_DIR',
};
}
const explicitHome = normalizeNonEmpty(env.OPENCLAW_HOME);
if (explicitHome) {
return {
path: pathLib.join(normalizeCandidate(explicitHome, env, pathLib), '.openclaw', 'openclaw.json'),
source: 'OPENCLAW_HOME',
};
}
const homeEnv = normalizeNonEmpty(env.HOME);
const userProfile = normalizeNonEmpty(env.USERPROFILE);
let defaultPath: string;
let defaultSource: ResolveOpenClawConfigResult['source'];
if (homeEnv) {
defaultPath = pathLib.join(normalizeCandidate(homeEnv, env, pathLib), '.openclaw', 'openclaw.json');
defaultSource = 'HOME-default';
} else if (userProfile) {
defaultPath = pathLib.join(normalizeCandidate(userProfile, env, pathLib), '.openclaw', 'openclaw.json');
defaultSource = 'USERPROFILE-default';
} else {
defaultPath = pathLib.join(pathLib.normalize(homedir), '.openclaw', 'openclaw.json');
defaultSource = 'homedir-default';
}
const candidates = [
defaultPath,
pathLib.join(pathLib.normalize(homedir), '.openclaw', 'openclaw.json'),
path.posix.join('/home/node', '.openclaw', 'openclaw.json'),
path.posix.join('/home/ubuntu', '.openclaw', 'openclaw.json'),
path.posix.join('/root', '.openclaw', 'openclaw.json'),
pathLib.join(pathLib.normalize(process.cwd()), '.openclaw', 'openclaw.json'),
pathLib.join(pathLib.normalize(process.cwd()), 'openclaw.json'),
].map((candidate) => pathLib.normalize(candidate));
const uniqueCandidates = [...new Set(candidates)];
const discovered = uniqueCandidates.find((candidate) => existsSync(candidate));
if (discovered) {
if (discovered === defaultPath) {
return { path: discovered, source: defaultSource };
}
return { path: discovered, source: 'auto-discovered' };
}
return { path: defaultPath, source: defaultSource };
}