feat: add first-run runtime initialization

This commit is contained in:
inman
2026-04-29 17:24:37 +08:00
parent 3b252250cd
commit cddaf37016
14 changed files with 432 additions and 80 deletions

View File

@@ -303,6 +303,18 @@ function resolveOpenClawRuntime(): OpenClawRuntimeResolution {
return cachedOpenClawRuntime;
}
if (hasRequiredOpenClawContextModules(managedDir)) {
cachedOpenClawRuntime = {
dir: managedDir,
source: 'managed',
version: readOpenClawVersion(managedDir),
bundledDir,
managedDir,
};
logOpenClawRuntime('[openclaw-runtime] Using managed OpenClaw runtime', cachedOpenClawRuntime);
return cachedOpenClawRuntime;
}
const externalDir = findExternalOpenClawDir([bundledDir, managedDir]);
if (externalDir) {
cachedOpenClawRuntime = {
@@ -312,7 +324,7 @@ function resolveOpenClawRuntime(): OpenClawRuntimeResolution {
bundledDir,
managedDir,
};
logOpenClawRuntime('[openclaw-runtime] Using existing OpenClaw installation', cachedOpenClawRuntime);
logOpenClawRuntime('[openclaw-runtime] Using existing OpenClaw installation before managed runtime is installed', cachedOpenClawRuntime);
return cachedOpenClawRuntime;
}
@@ -391,6 +403,30 @@ export function getOpenClawDir(): string {
return resolveOpenClawRuntime().dir;
}
export function reinstallManagedOpenClawRuntime(): OpenClawRuntimeResolution {
cachedOpenClawRuntime = null;
const bundledDir = getBundledOpenClawDir();
const managedDir = getManagedOpenClawDir();
rmSync(fsPath(managedDir), { recursive: true, force: true });
let installedFromBundled = false;
if (isValidOpenClawPackageDir(bundledDir)) {
installedFromBundled = installBundledOpenClawToManagedRuntime(bundledDir, managedDir);
}
cachedOpenClawRuntime = {
dir: hasRequiredOpenClawContextModules(managedDir) ? managedDir : bundledDir,
source: hasRequiredOpenClawContextModules(managedDir) ? 'managed' : isValidOpenClawPackageDir(bundledDir) ? 'bundled' : 'missing',
version: readOpenClawVersion(hasRequiredOpenClawContextModules(managedDir) ? managedDir : bundledDir),
bundledDir,
managedDir,
installedFromBundled,
};
logOpenClawRuntime('[openclaw-runtime] Reinstalled managed OpenClaw runtime for first-run initialization', cachedOpenClawRuntime);
return cachedOpenClawRuntime;
}
/**
* Get OpenClaw package directory resolved to a real path.
* Useful when consumers need deterministic module resolution under pnpm symlinks.