Ctrl K
ComunidadGuías…

bin/update-notice.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { existsSync } from "node:fs";
import { spawn } from "node:child_process";
import { fileURLToPath } from "node:url";
import { checkForUpdate, newerUpdate, readUpdateCheck, readUpdateRecovery, readUpdateSettings, UPDATE_DAY_MS, UPDATE_HOUR_MS } from "@cotal-ai/workspace";

/** The detached worker holds no terminal and has a bounded registry read. */
export async function updateCheckWorker(): Promise<void> {
  try { await checkForUpdate(); } catch { /* Optional checks never change command success. */ }
}

export function installUpdateNotice(argv: readonly string[], current: string): void {
  if (process.env.COTAL_NO_UPDATE_CHECK === "1" || process.env.CI || process.env.CONTINUOUS_INTEGRATION || process.env.BUILD_NUMBER || !process.stdout.isTTY || !process.stderr.isTTY || argv.some(arg => ["--json", "-j", "--plain"].includes(arg))) return;
  const word = argv.find(arg => !arg.startsWith("-"));
  if (word === "update" || word === "daemon" || word?.startsWith("__") || ["supervise", "deliver", "agent-bearer"].includes(word ?? "")) return;
  try {
    if (!readUpdateSettings().notify) return;
    const cached = readUpdateCheck();
    if (!cached || Date.now() - (cached.checkedAt ?? 0) >= UPDATE_DAY_MS && Date.now() - cached.attemptedAt >= UPDATE_HOUR_MS) {
      const child = spawn(process.execPath, [fileURLToPath(new URL("./cotal.js", import.meta.url)), "__update-check"], { detached: true, stdio: "ignore", env: process.env, windowsHide: true });
      child.on("error", () => {});
      child.unref();
    }
    const recovery = readUpdateRecovery();
    const remedy = existsSync(fileURLToPath(new URL("../desktop-runtime.json", import.meta.url))) ? "Update the desktop app with its signed platform installer." : "Run `cotal update --self`.";
    const message = recovery ? `Cotal update needs repair (installed ${recovery.installed}, previous ${recovery.previous}); automatic updates paused. ${remedy}` : cached?.latest && newerUpdate(cached.latest, current) ? `Cotal update available: ${current} -> ${cached.latest}. ${remedy}` : undefined;
    if (message) process.once("exit", () => process.stderr.write(`${message}\n`));
  } catch { /* Optional notice state cannot make a working command fail. */ }
}