@sellable/install
Version:
One-command installer for Sellable MCP in Claude Code, Codex, and Hermes
79 lines (71 loc) • 2.61 kB
JavaScript
import { resolve } from "node:path";
import { fileURLToPath } from "node:url";
import {
CAPABILITIES_REQUEST_MAX_BYTES,
FlyCapabilitiesBridgeError,
executeExternalCapabilitiesBridgeOperation,
} from "./fly-capabilities-bridge.mjs";
export const FLY_CAPABILITIES_EXEC_ARGUMENT_MAX_BYTES = 96 * 1024;
export const FLY_CAPABILITIES_EXEC_ARGUMENT_MAX_COUNT = 2;
const BASE64URL_CHUNK = /^[A-Za-z0-9_-]+$/;
const ENCODED_MAX_BYTES = Math.ceil(CAPABILITIES_REQUEST_MAX_BYTES / 3) * 4;
export function decodeFlyCapabilitiesExecArguments(args) {
if (!Array.isArray(args) || args.length === 0)
throw new FlyCapabilitiesBridgeError("capabilities_request_rejected");
if (args.length > FLY_CAPABILITIES_EXEC_ARGUMENT_MAX_COUNT)
throw new FlyCapabilitiesBridgeError("capabilities_request_too_large");
let encoded = "";
for (const chunk of args) {
if (typeof chunk !== "string" || !BASE64URL_CHUNK.test(chunk))
throw new FlyCapabilitiesBridgeError("capabilities_request_rejected");
if (
Buffer.byteLength(chunk, "utf8") >
FLY_CAPABILITIES_EXEC_ARGUMENT_MAX_BYTES
)
throw new FlyCapabilitiesBridgeError("capabilities_request_too_large");
encoded += chunk;
if (encoded.length > ENCODED_MAX_BYTES)
throw new FlyCapabilitiesBridgeError("capabilities_request_too_large");
}
let bytes;
try {
bytes = Buffer.from(encoded, "base64url");
} catch {
throw new FlyCapabilitiesBridgeError("capabilities_request_rejected");
}
if (
bytes.toString("base64url") !== encoded ||
bytes.byteLength > CAPABILITIES_REQUEST_MAX_BYTES
)
throw new FlyCapabilitiesBridgeError("capabilities_request_rejected");
try {
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
} catch {
throw new FlyCapabilitiesBridgeError("capabilities_request_rejected");
}
}
export async function runFlyCapabilitiesBridgeExecCli() {
try {
const request = decodeFlyCapabilitiesExecArguments(process.argv.slice(2));
const result = executeExternalCapabilitiesBridgeOperation(request);
process.stdout.write(`${JSON.stringify(result)}\n`);
process.exitCode = result.ok ? 0 : 2;
} catch (error) {
process.stdout.write(
`${JSON.stringify({
ok: false,
code:
error instanceof FlyCapabilitiesBridgeError
? error.code
: "capabilities_bridge_failed",
})}\n`
);
process.exitCode = 2;
}
}
if (
resolve(process.argv[1] ?? "") === resolve(fileURLToPath(import.meta.url))
) {
await runFlyCapabilitiesBridgeExecCli();
}