UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

75 lines • 2.44 kB
/** * @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