@sellable/install
Version:
One-command installer for Sellable MCP in Claude Code, Codex, and Hermes
38 lines (35 loc) • 1.63 kB
JavaScript
import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync } from "node:fs";
import { runRuntimeHelperRequest } from "../lib/sellable-agent/runtime-helper.mjs";
const requestIndex = process.argv.indexOf("--request");
const requestPath = requestIndex >= 0 ? process.argv[requestIndex + 1] : null;
if (!requestPath || process.argv.length !== 4) {
process.stderr.write("usage: sellable-agent-runtime-helper --request /absolute/path\n");
process.exitCode = 64;
} else {
try {
const configPath = "/etc/sellable-agent/runtime-helper.json";
const before = lstatSync(configPath);
if (before.isSymbolicLink() || !before.isFile() || before.uid !== 0 || (before.mode & 0o022) !== 0) {
throw new Error("runtime helper config rejected");
}
const descriptor = openSync(configPath, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
let bytes;
try {
const after = fstatSync(descriptor);
if (!after.isFile() || after.uid !== 0 || after.dev !== before.dev || after.ino !== before.ino || (after.mode & 0o022) !== 0) {
throw new Error("runtime helper config changed during open");
}
bytes = readFileSync(descriptor, "utf8");
} finally {
closeSync(descriptor);
}
const config = JSON.parse(bytes);
const result = await runRuntimeHelperRequest({ requestPath, config });
process.stdout.write(`${JSON.stringify(result)}\n`);
if (!result.ok) process.exitCode = 1;
} catch {
process.stdout.write(`${JSON.stringify({ ok: false, code: "runtime_helper_config_rejected" })}\n`);
process.exitCode = 1;
}
}