openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
66 lines (65 loc) • 2.72 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js";
import { t as isTruthyEnvValue } from "./env-Di49gJwo.js";
import { t as formatCliCommand } from "./command-format-CKGmlpAQ.js";
import { r as runCommandWithTimeout } from "./exec-DubsSJS2.js";
import { t as note } from "./note-BRSJp0UF.js";
import { n as runGatewayUpdate } from "./update-runner-Ymfzz29s.js";
import path from "node:path";
import fs from "node:fs/promises";
//#region src/commands/doctor-update.ts
/** Optional pre-doctor update prompt for source checkouts and package installs. */
async function resolveComparablePath(target) {
return await fs.realpath(target).catch(() => path.resolve(target));
}
async function detectOpenClawGitCheckout(root) {
const res = await runCommandWithTimeout([
"git",
"-C",
root,
"rev-parse",
"--show-toplevel"
], { timeoutMs: 5e3 }).catch(() => null);
if (!res) return "unknown";
if (res.code !== 0) {
if (normalizeLowercaseStringOrEmpty(res.stderr).includes("not a git repository")) return "not-git";
return "unknown";
}
return await resolveComparablePath(res.stdout.trim()) === await resolveComparablePath(root) ? "git" : "not-git";
}
/** Offers to update OpenClaw before doctor when running interactively from an updatable install. */
async function maybeOfferUpdateBeforeDoctor(params) {
if (!(!isTruthyEnvValue(process.env.OPENCLAW_UPDATE_IN_PROGRESS) && params.options.nonInteractive !== true && params.options.yes !== true && params.options.repair !== true && process.stdin.isTTY) || !params.root) return { updated: false };
const git = await detectOpenClawGitCheckout(params.root);
if (git === "git") {
if (!await params.confirm({
message: "Update OpenClaw from git before running doctor?",
initialValue: true
})) return { updated: false };
note("Running update (fetch/rebase/build/ui:build/doctor)…", "Update");
const result = await runGatewayUpdate({
cwd: params.root,
argv1: process.argv[1]
});
note([
`Status: ${result.status}`,
`Mode: ${result.mode}`,
result.root ? `Root: ${result.root}` : null,
result.reason ? `Reason: ${result.reason}` : null
].filter(Boolean).join("\n"), "Update result");
if (result.status === "ok") {
params.outro("Update completed (doctor already ran as part of the update).");
return {
updated: true,
handled: true
};
}
return {
updated: true,
handled: false
};
}
if (git === "not-git") note(["This install is not a git checkout.", `Run \`${formatCliCommand("openclaw update")}\` to update via your package manager (npm/pnpm), then rerun doctor.`].join("\n"), "Update");
return { updated: false };
}
//#endregion
export { maybeOfferUpdateBeforeDoctor };