consortium
Version:
Remote control and session sharing CLI for AI coding agents
97 lines (93 loc) • 3.07 kB
JavaScript
;
var node_child_process = require('node:child_process');
var persistence = require('./types-B_i6lpTn.cjs');
var constants = require('./constants-E1WsKKcj.cjs');
require('axios');
require('chalk');
require('fs');
require('node:fs');
require('node:os');
require('node:path');
require('node:events');
require('socket.io-client');
require('zod');
require('node:crypto');
require('tweetnacl');
require('child_process');
require('util');
require('fs/promises');
require('crypto');
require('path');
require('url');
require('os');
require('node:fs/promises');
require('node:module');
require('node:util');
require('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 = node_child_process.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 = constants.PI_BINARY) {
const result = await spawnVersion(binary);
if (result.spawnError) {
persistence.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 >= ${constants.MIN_PI_VERSION}.`
};
}
const version = match[1];
const ok = compareVersions(version, constants.MIN_PI_VERSION) >= 0;
return {
installed: true,
version,
ok,
message: ok ? `pi ${version} OK (>= ${constants.MIN_PI_VERSION})` : `pi ${version} is too old. Upgrade to >= ${constants.MIN_PI_VERSION}:
npm install -g --ignore-scripts @earendil-works/pi-coding-agent`
};
}
exports.checkPiVersion = checkPiVersion;
exports.compareVersions = compareVersions;