UNPKG

consortium

Version:

Remote control and session sharing CLI for AI coding agents

94 lines (91 loc) 2.9 kB
import { spawn } from 'node:child_process'; import { l as logger } from './types-DETLaopx.mjs'; import { PI_BINARY, MIN_PI_VERSION } from './constants-Ca5m6O9r.mjs'; import 'axios'; import 'chalk'; import 'fs'; import 'node:fs'; import 'node:os'; import 'node:path'; import 'node:events'; import 'socket.io-client'; import 'zod'; import 'node:crypto'; import 'tweetnacl'; import 'child_process'; import 'util'; import 'fs/promises'; import 'crypto'; import 'path'; import 'url'; import 'os'; import 'node:fs/promises'; import 'node:module'; import 'node:util'; import 'expo-server-sdk'; const INSTALL_HINT = `pi is not installed. Install it with: npm install -g --ignore-scripts @earendil-works/pi-coding-agent`; function compareVersions(a, b) { const pa = a.replace(/^v/, "").split(".").map((s) => parseInt(s, 10) || 0); const pb = b.replace(/^v/, "").split(".").map((s) => parseInt(s, 10) || 0); const len = Math.max(pa.length, pb.length); for (let i = 0; i < len; i++) { const x = pa[i] ?? 0; const y = pb[i] ?? 0; if (x > y) return 1; if (x < y) return -1; } return 0; } function spawnVersion(binary) { return new Promise((resolve) => { let stdout = ""; let stderr = ""; let spawnError; const child = spawn(binary, ["--version"], { stdio: ["ignore", "pipe", "pipe"] }); child.stdout.on("data", (d) => stdout += d.toString("utf8")); child.stderr.on("data", (d) => stderr += d.toString("utf8")); child.on("error", (err) => { spawnError = err; resolve({ code: null, stdout, stderr, spawnError }); }); child.on("close", (code) => resolve({ code, stdout, stderr, spawnError })); }); } async function checkPiVersion(binary = PI_BINARY) { const result = await spawnVersion(binary); if (result.spawnError) { logger.debug("[Pi] version check spawn error:", result.spawnError); return { installed: false, version: null, ok: false, message: INSTALL_HINT }; } if (result.code !== 0) { return { installed: false, version: null, ok: false, message: `${INSTALL_HINT} (pi --version exited with code ${result.code})` }; } const combined = `${result.stdout} ${result.stderr}`; const match = combined.match(/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/); if (!match) { return { installed: true, version: null, ok: false, message: `pi is installed but its version could not be parsed (output: ${combined.trim().slice(0, 120)}). Require >= ${MIN_PI_VERSION}.` }; } const version = match[1]; const ok = compareVersions(version, MIN_PI_VERSION) >= 0; return { installed: true, version, ok, message: ok ? `pi ${version} OK (>= ${MIN_PI_VERSION})` : `pi ${version} is too old. Upgrade to >= ${MIN_PI_VERSION}: npm install -g --ignore-scripts @earendil-works/pi-coding-agent` }; } export { checkPiVersion, compareVersions };