consortium
Version:
Remote control and session sharing CLI for AI coding agents
94 lines (91 loc) • 2.9 kB
JavaScript
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 };