UNPKG

@sellable/install

Version:

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

79 lines (71 loc) • 2.61 kB
#!/usr/bin/env node 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(); }