openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
75 lines • 2.44 kB
JavaScript
/**
* @license
* Copyright 2026 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import child_process from 'node:child_process';
import fs from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import process from 'node:process';
import { semver } from '../third_party/index.js';
import { VERSION } from '../version.js';
/**
* Notifies the user if an update is available.
* @param message The message to display in the update notification.
*/
let isChecking = false;
/** @internal Reset flag for tests only. */
export function resetUpdateCheckFlagForTesting() {
isChecking = false;
}
export async function checkForUpdates(message) {
if (isChecking || process.env['CHROME_DEVTOOLS_MCP_NO_UPDATE_CHECKS']) {
return;
}
isChecking = true;
const cachePath = path.join(os.homedir(), '.cache', 'chrome-devtools-mcp', 'latest.json');
let cachedVersion;
let stats;
try {
stats = await fs.stat(cachePath);
const data = await fs.readFile(cachePath, 'utf8');
cachedVersion = JSON.parse(data).version;
}
catch {
// Ignore errors reading cache.
}
if (cachedVersion && semver.lt(VERSION, cachedVersion)) {
console.warn(`\nUpdate available: ${VERSION} -> ${cachedVersion}\n${message}\n`);
}
const now = Date.now();
if (stats && now - stats.mtimeMs < 24 * 60 * 60 * 1000) {
return;
}
// Update mtime immediately to prevent multiple subprocesses.
try {
const parentDir = path.dirname(cachePath);
await fs.mkdir(parentDir, { recursive: true });
const nowTime = new Date();
if (stats) {
await fs.utimes(cachePath, nowTime, nowTime);
}
else {
await fs.writeFile(cachePath, JSON.stringify({ version: VERSION }));
}
}
catch {
// Ignore errors.
}
// In a separate process, check the latest available version number
// and update the local snapshot accordingly.
const scriptPath = path.join(import.meta.dirname, '..', 'bin', 'check-latest-version.js');
try {
const child = child_process.spawn(process.execPath, [scriptPath, cachePath], {
detached: true,
stdio: 'ignore',
windowsHide: true,
});
child.unref();
}
catch {
// Fail silently in case of any errors.
}
}
//# sourceMappingURL=check-for-updates.js.map