UNPKG

@sellable/install

Version:

One-command installer for Sellable MCP in Claude Code, Codex, and Hermes

38 lines (35 loc) • 1.63 kB
#!/usr/bin/env node 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; } }