memshell-party-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/api/client.ts","../src/core/config.ts","../src/cli-context.ts","../src/commands/config.ts","../src/commands/gen.ts","../src/core/output.ts","../src/core/request-builder.ts","../src/core/jdk.ts","../src/wizard/memshell-wizard.ts","../src/mcp/server.ts","../src/version.ts","../src/commands/mcp.ts","../src/commands/parse-classname.ts","../src/commands/probe.ts","../src/wizard/probe-wizard.ts","../src/commands/version.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { ApiError } from \"./api/client.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerGenCommand } from \"./commands/gen.js\";\nimport { registerMcpCommand } from \"./commands/mcp.js\";\nimport { registerParseClassNameCommand } from \"./commands/parse-classname.js\";\nimport { registerProbeCommand } from \"./commands/probe.js\";\nimport { registerVersionCommand } from \"./commands/version.js\";\nimport { DEFAULT_API_URL, ENV_VAR } from \"./core/config.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\nfunction buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"memparty\")\n .description(\"CLI + MCP client for MemShellParty (party.mem.mk)\")\n .version(CLI_VERSION, \"-v, --version\", \"output the CLI version\")\n .option(\n \"--api <url>\",\n `MemShellParty backend URL (env ${ENV_VAR}, default ${DEFAULT_API_URL})`,\n )\n .option(\"--timeout <ms>\", \"request timeout in milliseconds\", \"30000\");\n\n registerGenCommand(program);\n registerProbeCommand(program);\n registerConfigCommand(program);\n registerParseClassNameCommand(program);\n registerVersionCommand(program);\n registerMcpCommand(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n const program = buildProgram();\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n // Set exitCode rather than calling process.exit(): an abrupt exit while\n // undici's (global fetch) keep-alive socket is still open trips a libuv\n // assertion on Windows. Letting the event loop drain avoids the crash.\n if (err instanceof ApiError) {\n process.stderr.write(`API error (${err.status || \"network\"}): ${err.message}\\n`);\n process.exitCode = 1;\n } else if (err instanceof Error) {\n // Inquirer throws this when the user aborts with Ctrl-C.\n if (err.name === \"ExitPromptError\") {\n process.stderr.write(\"\\nAborted.\\n\");\n process.exitCode = 130;\n } else {\n process.stderr.write(`Error: ${err.message}\\n`);\n process.exitCode = 1;\n }\n } else {\n process.stderr.write(`Error: ${String(err)}\\n`);\n process.exitCode = 1;\n }\n }\n}\n\nvoid main();\n","import type {\n ApiErrorResponse,\n CommandConfigVO,\n MainConfig,\n MemShellGenerateRequest,\n MemShellGenerateResponse,\n PackerTree,\n ProbeShellGenerateRequest,\n ProbeShellGenerateResponse,\n ServerConfig,\n VersionInfo,\n} from \"./types.js\";\n\nexport type FetchLike = typeof fetch;\n\n/** Error thrown when the API responds with a non-2xx status. */\nexport class ApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly url: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport interface MemPartyClientOptions {\n /** Base URL of the MemShellParty backend, e.g. https://party.mem.mk */\n baseUrl: string;\n /** Injectable fetch implementation (defaults to global fetch). Useful for testing. */\n fetch?: FetchLike;\n /** Per-request timeout in milliseconds. Default 30000. */\n timeoutMs?: number;\n}\n\n/**\n * Typed client for the MemShellParty HTTP API.\n * Knows nothing about the CLI or MCP — it is a pure transport layer so every\n * entrypoint (flags, wizard, MCP) can share it.\n */\nexport class MemPartyClient {\n private readonly baseUrl: string;\n private readonly fetchImpl: FetchLike;\n private readonly timeoutMs: number;\n\n constructor(options: MemPartyClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n if (typeof this.fetchImpl !== \"function\") {\n throw new Error(\n \"No fetch implementation available. Use Node.js >= 18 or pass a custom fetch.\",\n );\n }\n }\n\n // ---------- config ----------\n\n getServers(): Promise<ServerConfig> {\n return this.request<ServerConfig>(\"GET\", \"/api/config/servers\");\n }\n\n getConfig(): Promise<MainConfig> {\n return this.request<MainConfig>(\"GET\", \"/api/config\");\n }\n\n getPackerTree(): Promise<PackerTree> {\n return this.request<PackerTree>(\"GET\", \"/api/config/packers/tree\");\n }\n\n getPackers(): Promise<string[]> {\n return this.request<string[]>(\"GET\", \"/api/config/packers\");\n }\n\n getCommandConfigs(): Promise<CommandConfigVO> {\n return this.request<CommandConfigVO>(\"GET\", \"/api/config/command/configs\");\n }\n\n getVersion(): Promise<VersionInfo> {\n return this.request<VersionInfo>(\"GET\", \"/api/version\");\n }\n\n // ---------- generation ----------\n\n generateMemShell(req: MemShellGenerateRequest): Promise<MemShellGenerateResponse> {\n return this.request<MemShellGenerateResponse>(\"POST\", \"/api/memshell/generate\", {\n json: req,\n });\n }\n\n generateProbe(req: ProbeShellGenerateRequest): Promise<ProbeShellGenerateResponse> {\n return this.request<ProbeShellGenerateResponse>(\"POST\", \"/api/probe/generate\", {\n json: req,\n });\n }\n\n /** Parse a fully-qualified class name from a base64-encoded .class file. */\n parseClassName(classBase64: string): Promise<string> {\n return this.request<string>(\"POST\", \"/api/className\", {\n text: classBase64,\n raw: true,\n });\n }\n\n // ---------- transport ----------\n\n private async request<T>(\n method: string,\n path: string,\n opts: { json?: unknown; text?: string; raw?: boolean } = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {};\n let body: string | undefined;\n\n if (opts.json !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(opts.json);\n } else if (opts.text !== undefined) {\n headers[\"Content-Type\"] = \"text/plain\";\n body = opts.text;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new ApiError(`Request timed out after ${this.timeoutMs}ms`, 0, url);\n }\n throw new ApiError(\n `Failed to reach ${url}: ${(err as Error).message}`,\n 0,\n url,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const rawText = await response.text();\n\n if (!response.ok) {\n let message = rawText || response.statusText;\n try {\n const parsed = JSON.parse(rawText) as ApiErrorResponse;\n if (parsed?.error) message = parsed.error;\n } catch {\n // body was not JSON — keep raw text\n }\n throw new ApiError(message, response.status, url);\n }\n\n if (opts.raw) {\n return rawText as unknown as T;\n }\n if (rawText === \"\") {\n return undefined as unknown as T;\n }\n return JSON.parse(rawText) as T;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const DEFAULT_API_URL = \"https://party.mem.mk\";\nexport const ENV_VAR = \"MEMPARTY_API_URL\";\n\nexport interface ResolveApiUrlInput {\n /** Value from the --api flag (highest priority). */\n flag?: string;\n /** Environment map (defaults to process.env). */\n env?: NodeJS.ProcessEnv;\n /** Home directory (defaults to os.homedir()). Injectable for tests. */\n home?: string;\n}\n\ninterface RcFile {\n apiUrl?: string;\n}\n\nfunction readRcFile(home: string): RcFile | undefined {\n const path = join(home, \".mempartyrc\");\n try {\n const raw = readFileSync(path, \"utf8\");\n return JSON.parse(raw) as RcFile;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve the API base URL by priority:\n * 1. --api flag\n * 2. MEMPARTY_API_URL env var\n * 3. ~/.mempartyrc { \"apiUrl\": \"...\" }\n * 4. default public site (https://party.mem.mk)\n */\nexport function resolveApiUrl(input: ResolveApiUrlInput = {}): string {\n const env = input.env ?? process.env;\n const home = input.home ?? homedir();\n\n const fromFlag = input.flag?.trim();\n if (fromFlag) return fromFlag;\n\n const fromEnv = env[ENV_VAR]?.trim();\n if (fromEnv) return fromEnv;\n\n const fromFile = readRcFile(home)?.apiUrl?.trim();\n if (fromFile) return fromFile;\n\n return DEFAULT_API_URL;\n}\n","import { MemPartyClient } from \"./api/client.js\";\nimport { resolveApiUrl } from \"./core/config.js\";\n\n/** Global options attached to every command via commander. */\nexport interface GlobalOptions {\n api?: string;\n timeout?: string;\n}\n\nexport function createClient(opts: GlobalOptions): MemPartyClient {\n const baseUrl = resolveApiUrl({ flag: opts.api });\n const timeoutMs = opts.timeout ? Number(opts.timeout) : undefined;\n return new MemPartyClient({ baseUrl, timeoutMs });\n}\n\n/** Write a message to stderr. */\nexport function logError(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\n/** Write an informational message to stderr (keeps stdout clean for payloads). */\nexport function logInfo(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ConfigCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nfunction printJsonOrLines(data: unknown, json: boolean | undefined, renderLines: () => string[]): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderLines().join(\"\\n\")}\\n`);\n }\n}\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Query supported servers, shell tools, shell types, and packers\");\n\n config\n .command(\"servers\")\n .description(\"List supported servers and their shell types\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const servers = await client.getServers();\n printJsonOrLines(servers, opts.json, () =>\n Object.entries(servers).map(([name, types]) => `${name}\\n ${types.join(\", \")}`),\n );\n });\n\n config\n .command(\"tools\")\n .description(\"List shell tools (and their shell types) per server\")\n .argument(\"[server]\", \"filter by a single server name\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (server: string | undefined, opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const config = await client.getConfig();\n const filtered = server ? { [server]: config[server] ?? {} } : config;\n printJsonOrLines(filtered, opts.json, () =>\n Object.entries(filtered).flatMap(([name, tools]) => [\n name,\n ...Object.entries(tools).map(([tool, types]) => ` ${tool}: ${types.join(\", \")}`),\n ]),\n );\n });\n\n config\n .command(\"packers\")\n .description(\"List packers (parent / child tree)\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const tree = await client.getPackerTree();\n printJsonOrLines(tree, opts.json, () =>\n tree.map((p) => (p.children.length ? `${p.name}\\n ${p.children.join(\", \")}` : p.name)),\n );\n });\n\n config\n .command(\"command\")\n .description(\"List Command-tool encryptors and implementation classes\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const cc = await client.getCommandConfigs();\n printJsonOrLines(cc, opts.json, () => [\n `encryptors: ${cc.encryptors.join(\", \")}`,\n `implementationClasses: ${cc.implementationClasses.join(\", \")}`,\n ]);\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { emitPayload } from \"../core/output.js\";\nimport { buildMemShellRequest, type MemShellOptions } from \"../core/request-builder.js\";\nimport { runMemShellWizard } from \"../wizard/memshell-wizard.js\";\n\ninterface GenCmdOptions extends GlobalOptions {\n server?: string;\n serverVersion?: string;\n tool?: string;\n type?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n shellClassName?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n behinderPass?: string;\n antswordPass?: string;\n commandParamName?: string;\n commandTemplate?: string;\n encryptor?: string;\n implementationClass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n shellClassFile?: string;\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"server\", \"tool\", \"type\", \"packer\"] as const;\n\nfunction toOptions(o: GenCmdOptions): MemShellOptions {\n let shellClassBase64 = o.shellClassBase64;\n if (o.shellClassFile) {\n shellClassBase64 = readFileSync(o.shellClassFile).toString(\"base64\");\n }\n return {\n server: o.server!,\n serverVersion: o.serverVersion,\n shellTool: o.tool!,\n shellType: o.type!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n probe: o.probe,\n shellClassName: o.shellClassName,\n godzillaPass: o.godzillaPass,\n godzillaKey: o.godzillaKey,\n behinderPass: o.behinderPass,\n antSwordPass: o.antswordPass,\n commandParamName: o.commandParamName,\n commandTemplate: o.commandTemplate,\n encryptor: o.encryptor,\n implementationClass: o.implementationClass,\n headerName: o.headerName,\n headerValue: o.headerValue,\n shellClassBase64,\n urlPattern: o.urlPattern,\n injectorClassName: o.injectorClassName,\n staticInitialize: o.staticInitialize,\n };\n}\n\nexport function registerGenCommand(program: Command): void {\n program\n .command(\"gen\")\n .alias(\"generate\")\n .description(\"Generate a memory shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-s, --server <server>\", \"target server, e.g. Tomcat\")\n .option(\"--server-version <v>\", \"target server version\")\n .option(\"-t, --tool <tool>\", \"shell tool, e.g. Godzilla, Behinder, Command\")\n .option(\"-y, --type <type>\", \"shell type, e.g. Listener, Filter, Servlet\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, Jar, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21, or a class-file major version\")\n .option(\"--debug\", \"enable debug output in the payload\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--probe\", \"use echo/probe mode\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name (random if omitted)\")\n .option(\"--godzilla-pass <pass>\", \"Godzilla password\")\n .option(\"--godzilla-key <key>\", \"Godzilla key\")\n .option(\"--behinder-pass <pass>\", \"Behinder password\")\n .option(\"--antsword-pass <pass>\", \"AntSword password\")\n .option(\"--command-param-name <name>\", \"Command tool parameter name\")\n .option(\"--command-template <tpl>\", \"Command template ({command} placeholder)\")\n .option(\"--encryptor <name>\", \"Command encryptor\")\n .option(\"--implementation-class <name>\", \"Command implementation class\")\n .option(\"--header-name <name>\", \"auth header name\")\n .option(\"--header-value <value>\", \"auth header value\")\n .option(\"--shell-class-base64 <b64>\", \"custom shell class (base64) for the Custom tool\")\n .option(\"--shell-class-file <path>\", \"custom shell .class file for the Custom tool\")\n .option(\"--url-pattern <pattern>\", \"injector URL pattern\")\n .option(\"--injector-class-name <name>\", \"explicit injector class name\")\n .option(\"--no-static-initialize\", \"disable injector static initialization (enabled by default)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .action(async (opts: GenCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let memOpts: MemShellOptions;\n if (wantWizard) {\n memOpts = await runMemShellWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n memOpts = toOptions(opts);\n }\n\n const request = buildMemShellRequest(memOpts);\n const response = await client.generateMemShell(request);\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(response, null, 2)}\\n`);\n return;\n }\n\n const r = response.memShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n logInfo(`injector class: ${r.injectorClassName} (${r.injectorSize} bytes)`);\n\n if (response.allPackResults && Object.keys(response.allPackResults).length > 0) {\n for (const [name, value] of Object.entries(response.allPackResults)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n if (response.packResult === undefined) {\n throw new Error(\"Server returned no packResult.\");\n }\n\n const result = emitPayload(response.packResult, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { writeFileSync } from \"node:fs\";\n\n/** File extensions whose payload is base64-encoded bytes and should be decoded. */\nconst BINARY_EXTENSIONS = [\".class\", \".jar\", \".zip\", \".ser\", \".bin\"];\n\nexport interface OutputOptions {\n /** Destination file path. When omitted, content goes to stdout. */\n outFile?: string;\n /** Force base64 decoding before writing (binary payload). */\n decode?: boolean;\n}\n\nexport interface OutputResult {\n /** Where the payload went: a file path, or \"stdout\". */\n destination: string;\n /** Number of bytes written (file) or characters printed (stdout). */\n size: number;\n /** Whether the payload was base64-decoded. */\n decoded: boolean;\n}\n\nfunction hasBinaryExtension(path: string): boolean {\n const lower = path.toLowerCase();\n return BINARY_EXTENSIONS.some((ext) => lower.endsWith(ext));\n}\n\n/**\n * Decide whether a payload should be base64-decoded before writing.\n * Explicit `decode` wins; otherwise infer from the output file extension.\n */\nexport function shouldDecode(opts: OutputOptions): boolean {\n if (opts.decode !== undefined) return opts.decode;\n if (opts.outFile) return hasBinaryExtension(opts.outFile);\n return false;\n}\n\n/**\n * Emit a payload string either to a file or to stdout.\n * Uses injectable sinks so it can be unit-tested without touching the real fs/stdout.\n */\nexport function emitPayload(\n payload: string,\n opts: OutputOptions,\n sinks: {\n writeFile?: (path: string, data: Buffer | string) => void;\n writeStdout?: (data: string) => void;\n } = {},\n): OutputResult {\n const writeFile = sinks.writeFile ?? ((p, d) => writeFileSync(p, d));\n const writeStdout = sinks.writeStdout ?? ((d) => process.stdout.write(d));\n const decoded = shouldDecode(opts);\n\n if (opts.outFile) {\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeFile(opts.outFile, buf);\n return { destination: opts.outFile, size: buf.length, decoded: true };\n }\n writeFile(opts.outFile, payload);\n return { destination: opts.outFile, size: Buffer.byteLength(payload), decoded: false };\n }\n\n // stdout\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeStdout(buf.toString(\"binary\"));\n return { destination: \"stdout\", size: buf.length, decoded: true };\n }\n writeStdout(payload.endsWith(\"\\n\") ? payload : `${payload}\\n`);\n return { destination: \"stdout\", size: payload.length, decoded: false };\n}\n","import { randomInt } from \"node:crypto\";\n\nimport type {\n MemShellGenerateRequest,\n ProbeShellGenerateRequest,\n} from \"../api/types.js\";\nimport { resolveJreVersion } from \"./jdk.js\";\n\n/**\n * Packers that require a randomised Spring expression injector class name.\n * Ported from web/app/utils/transformer.ts.\n */\nconst SPRING_GZIP_JDK17_RELATED_PACKERS = new Set([\n \"SpEL\",\n \"SpELSpringGzipJDK17\",\n \"OGNL\",\n \"OGNLSpringGzipJDK17\",\n \"JXPath\",\n \"JXPathSpringGzipJDK17\",\n]);\n\nconst UPPERCASE_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst CLASS_NAME_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfunction randomChar(chars: string): string {\n return chars[randomInt(chars.length)];\n}\n\nfunction generateSpringExpressionInjectorClassName(): string {\n const randomName = Array.from({ length: 5 }, () => randomChar(CLASS_NAME_LETTERS)).join(\"\");\n return `org.springframework.expression.${randomChar(UPPERCASE_LETTERS)}${randomName}Util`;\n}\n\n/** Flat option set for building a memshell request (from flags or the wizard). */\nexport interface MemShellOptions {\n server: string;\n serverVersion?: string;\n shellTool: string;\n shellType: string;\n packer: string;\n\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n\n shellClassName?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n commandParamName?: string;\n commandTemplate?: string;\n behinderPass?: string;\n antSwordPass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n encryptor?: string;\n implementationClass?: string;\n\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n}\n\nexport function buildMemShellRequest(opts: MemShellOptions): MemShellGenerateRequest {\n const injectorClassName = SPRING_GZIP_JDK17_RELATED_PACKERS.has(opts.packer)\n ? generateSpringExpressionInjectorClassName()\n : opts.injectorClassName;\n\n return {\n shellConfig: {\n server: opts.server,\n serverVersion: opts.serverVersion,\n shellTool: opts.shellTool,\n shellType: opts.shellType,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n lambdaSuffix: opts.lambdaSuffix,\n probe: opts.probe,\n },\n shellToolConfig: {\n shellClassName: opts.shellClassName,\n godzillaPass: opts.godzillaPass,\n godzillaKey: opts.godzillaKey,\n commandParamName: opts.commandParamName,\n commandTemplate: opts.commandTemplate,\n behinderPass: opts.behinderPass,\n antSwordPass: opts.antSwordPass,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n shellClassBase64: opts.shellClassBase64,\n encryptor: opts.encryptor,\n implementationClass: opts.implementationClass,\n },\n injectorConfig: {\n injectorClassName,\n urlPattern: opts.urlPattern,\n staticInitialize: opts.staticInitialize,\n },\n packer: opts.packer,\n };\n}\n\n/** Flat option set for building a probe request. */\nexport interface ProbeOptions {\n probeMethod: string;\n probeContent: string;\n packer: string;\n\n shellClassName?: string;\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n staticInitialize?: boolean;\n lambdaSuffix?: boolean;\n\n host?: string;\n seconds?: number;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n}\n\nexport function buildProbeRequest(opts: ProbeOptions): ProbeShellGenerateRequest {\n return {\n probeConfig: {\n probeMethod: opts.probeMethod,\n probeContent: opts.probeContent,\n shellClassName: opts.shellClassName,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n staticInitialize: opts.staticInitialize,\n lambdaSuffix: opts.lambdaSuffix,\n },\n probeContentConfig: {\n host: opts.host,\n seconds: opts.seconds,\n sleepServer: opts.sleepServer,\n server: opts.server,\n reqParamName: opts.reqParamName,\n commandTemplate: opts.commandTemplate,\n },\n packer: opts.packer,\n };\n}\n","/** Maps friendly JDK names to Java class-file major versions. */\nexport const JDK_VERSIONS: Record<string, number> = {\n java6: 50,\n java8: 52,\n java9: 53,\n java11: 55,\n java17: 61,\n java21: 65,\n};\n\n/**\n * Resolve a user-supplied JDK value into a class-file major version number.\n * Accepts friendly names (\"java8\", \"8\"), or a raw major version (\"52\").\n */\nexport function resolveJreVersion(input: string | number | undefined): number | undefined {\n if (input === undefined || input === \"\") return undefined;\n\n if (typeof input === \"number\") return input;\n\n const normalized = input.trim().toLowerCase();\n\n // Friendly name, e.g. \"java8\"\n if (normalized in JDK_VERSIONS) return JDK_VERSIONS[normalized];\n\n // Bare java number, e.g. \"8\" -> java8\n const withPrefix = `java${normalized}`;\n if (withPrefix in JDK_VERSIONS) return JDK_VERSIONS[withPrefix];\n\n // Raw class-file major version, e.g. \"52\"\n const num = Number(normalized);\n if (Number.isInteger(num) && num > 0) return num;\n\n throw new Error(\n `Invalid JDK version \"${input}\". Use one of: ${Object.keys(JDK_VERSIONS).join(\", \")}, or a class-file major version like 52.`,\n );\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { checkbox, confirm, input, select, Separator } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { MemShellOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({\n name: `${name} (${major})`,\n value: name,\n })),\n];\n\nfunction packerChoices(tree: { name: string; children: string[] }[]) {\n const choices: (Separator | { name: string; value: string })[] = [];\n for (const parent of tree) {\n choices.push(new Separator(`── ${parent.name} ──`));\n choices.push({ name: parent.name, value: parent.name });\n for (const child of parent.children) {\n choices.push({ name: ` ${child}`, value: child });\n }\n }\n return choices;\n}\n\n/** Drive an interactive prompt flow, returning options for buildMemShellRequest. */\nexport async function runMemShellWizard(client: MemPartyClient): Promise<MemShellOptions> {\n const [config, packerTree] = await Promise.all([client.getConfig(), client.getPackerTree()]);\n\n const server = await select({\n message: \"Target server\",\n choices: Object.keys(config).map((s) => ({ name: s, value: s })),\n });\n\n const tools = Object.keys(config[server]);\n const shellTool = await select({\n message: \"Shell tool\",\n choices: tools.map((t) => ({ name: t, value: t })),\n });\n\n const shellType = await select({\n message: \"Shell type\",\n choices: config[server][shellTool].map((t) => ({ name: t, value: t })),\n });\n\n const packer = await select({\n message: \"Packer\",\n choices: packerChoices(packerTree),\n });\n\n const opts: MemShellOptions = { server, shellTool, shellType, packer };\n\n // Tool-specific configuration.\n switch (shellTool) {\n case \"Godzilla\":\n opts.godzillaPass = await input({ message: \"Godzilla pass\", default: \"pass\" });\n opts.godzillaKey = await input({ message: \"Godzilla key\", default: \"key\" });\n break;\n case \"Behinder\":\n opts.behinderPass = await input({ message: \"Behinder pass\", default: \"rebeyond\" });\n break;\n case \"AntSword\":\n opts.antSwordPass = await input({ message: \"AntSword pass\", default: \"ant\" });\n break;\n case \"Command\": {\n opts.commandParamName = await input({ message: \"Command param name\", default: \"cmd\" });\n const cc = await client.getCommandConfigs();\n opts.encryptor = await select({\n message: \"Encryptor\",\n choices: cc.encryptors.map((e) => ({ name: e, value: e })),\n });\n opts.implementationClass = await select({\n message: \"Implementation class\",\n choices: cc.implementationClasses.map((e) => ({ name: e, value: e })),\n });\n const template = await input({ message: \"Command template (optional, {command} placeholder)\", default: \"\" });\n if (template) opts.commandTemplate = template;\n break;\n }\n case \"Custom\": {\n const file = await input({ message: \"Path to custom .class file\" });\n opts.shellClassBase64 = readFileSync(file).toString(\"base64\");\n break;\n }\n default:\n break;\n }\n\n // Common header config (used by several tools).\n opts.headerName = await input({ message: \"Header name\", default: \"User-Agent\" });\n const headerValue = await input({ message: \"Header value (optional)\", default: \"\" });\n if (headerValue) opts.headerValue = headerValue;\n\n const shellClassName = await input({ message: \"Shell class name (optional, random if empty)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n opts.urlPattern = await input({ message: \"URL pattern\", default: \"/*\" });\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n\n const confirmed = await confirm({ message: `Generate ${shellTool} ${shellType} for ${server} (${packer})?` });\n if (!confirmed) {\n throw new Error(\"Cancelled by user.\");\n }\n\n return opts;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\n\nimport { MemPartyClient } from \"../api/client.js\";\nimport { buildMemShellRequest } from \"../core/request-builder.js\";\nimport { buildProbeRequest } from \"../core/request-builder.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nfunction jsonContent(data: unknown) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction errorContent(err: unknown) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }],\n };\n}\n\nconst memShellInput = {\n server: z.string().describe(\"Target server, e.g. Tomcat\"),\n serverVersion: z.string().optional(),\n shellTool: z.string().describe(\"Shell tool, e.g. Godzilla, Behinder, Command\"),\n shellType: z.string().describe(\"Shell type, e.g. Listener, Filter, Servlet\"),\n packer: z.string().describe(\"Packer, e.g. Base64, Jar, JSP\"),\n jdk: z.string().optional().describe(\"java6/8/9/11/17/21 or class-file major version\"),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n probe: z.boolean().optional(),\n shellClassName: z.string().optional(),\n godzillaPass: z.string().optional(),\n godzillaKey: z.string().optional(),\n behinderPass: z.string().optional(),\n antSwordPass: z.string().optional(),\n commandParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n encryptor: z.string().optional(),\n implementationClass: z.string().optional(),\n headerName: z.string().optional(),\n headerValue: z.string().optional(),\n shellClassBase64: z.string().optional(),\n urlPattern: z.string().optional(),\n injectorClassName: z.string().optional(),\n staticInitialize: z.boolean().optional(),\n};\n\nconst probeInput = {\n probeMethod: z.enum([\"ResponseBody\", \"DNSLog\", \"Sleep\"]),\n probeContent: z.string().describe(\"BasicInfo, Server, OS, JDK, Bytecode, Command\"),\n packer: z.string(),\n jdk: z.string().optional(),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n staticInitialize: z.boolean().optional(),\n shellClassName: z.string().optional(),\n host: z.string().optional(),\n seconds: z.number().optional(),\n sleepServer: z.string().optional(),\n server: z.string().optional(),\n reqParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n};\n\nexport function createMcpServer(client: MemPartyClient): McpServer {\n const server = new McpServer({ name: \"memshell-party\", version: CLI_VERSION });\n\n server.registerTool(\n \"list_servers\",\n { title: \"List servers\", description: \"List supported servers and their shell types\" },\n async () => {\n try {\n return jsonContent(await client.getServers());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_config\",\n {\n title: \"List full config\",\n description: \"List every server's shell tools and their supported shell types\",\n },\n async () => {\n try {\n return jsonContent(await client.getConfig());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_packers\",\n { title: \"List packers\", description: \"List packers as a parent/child tree\" },\n async () => {\n try {\n return jsonContent(await client.getPackerTree());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_command_configs\",\n {\n title: \"List command configs\",\n description: \"List Command-tool encryptors and implementation classes\",\n },\n async () => {\n try {\n return jsonContent(await client.getCommandConfigs());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_memshell\",\n { title: \"Generate memory shell\", description: \"Generate a Java memory shell payload\", inputSchema: memShellInput },\n async (args) => {\n try {\n const response = await client.generateMemShell(buildMemShellRequest(args));\n return jsonContent(response);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_probe\",\n { title: \"Generate probe shell\", description: \"Generate a probe/detection shell payload\", inputSchema: probeInput },\n async (args) => {\n try {\n const response = await client.generateProbe(buildProbeRequest(args));\n return jsonContent(response);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"parse_classname\",\n {\n title: \"Parse class name\",\n description: \"Parse the fully-qualified class name from base64-encoded .class bytes\",\n inputSchema: { classBase64: z.string().describe(\"base64-encoded .class file bytes\") },\n },\n async ({ classBase64 }) => {\n try {\n return jsonContent({ className: await client.parseClassName(classBase64) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"server_version\",\n { title: \"Server version\", description: \"Get the backend server version info\" },\n async () => {\n try {\n return jsonContent(await client.getVersion());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n return server;\n}\n\n/** Start the MCP server over stdio. */\nexport async function startMcpStdio(client: MemPartyClient): Promise<void> {\n const server = createMcpServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ninterface PkgJson {\n version: string;\n}\n\n// package.json sits one level above the built dist/ file and above src/ in dev.\nlet version = \"0.0.0\";\ntry {\n version = (require(\"../package.json\") as PkgJson).version;\n} catch {\n try {\n version = (require(\"./package.json\") as PkgJson).version;\n } catch {\n // fall back to placeholder\n }\n}\n\nexport const CLI_VERSION = version;\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { startMcpStdio } from \"../mcp/server.js\";\nimport { resolveApiUrl } from \"../core/config.js\";\n\nexport function registerMcpCommand(program: Command): void {\n program\n .command(\"mcp\")\n .description(\"Run as an MCP server over stdio (exposes generation + config tools)\")\n .action(async (_opts: GlobalOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals();\n const client = createClient(globals);\n logInfo(`memshell-party MCP server starting (api: ${resolveApiUrl({ flag: globals.api })})`);\n await startMcpStdio(client);\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ParseCmdOptions extends GlobalOptions {\n file?: string;\n}\n\nexport function registerParseClassNameCommand(program: Command): void {\n program\n .command(\"parse-classname\")\n .description(\"Parse the fully-qualified class name from a .class file\")\n .argument(\"[base64]\", \"base64-encoded .class bytes (omit when using --file)\")\n .option(\"-f, --file <path>\", \"read a .class file from disk instead of passing base64\")\n .action(async (base64: string | undefined, opts: ParseCmdOptions, cmd: Command) => {\n let classBase64: string;\n if (opts.file) {\n classBase64 = readFileSync(opts.file).toString(\"base64\");\n } else if (base64) {\n classBase64 = base64.trim();\n } else {\n throw new Error(\"Provide base64 bytes as an argument or use --file <path>.\");\n }\n\n const client = createClient(cmd.optsWithGlobals());\n const name = await client.parseClassName(classBase64);\n process.stdout.write(`${name}\\n`);\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { emitPayload } from \"../core/output.js\";\nimport { buildProbeRequest, type ProbeOptions } from \"../core/request-builder.js\";\nimport { runProbeWizard } from \"../wizard/probe-wizard.js\";\n\ninterface ProbeCmdOptions extends GlobalOptions {\n method?: string;\n content?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n staticInitialize?: boolean;\n shellClassName?: string;\n host?: string;\n seconds?: string;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"method\", \"content\", \"packer\"] as const;\n\nfunction toOptions(o: ProbeCmdOptions): ProbeOptions {\n return {\n probeMethod: o.method!,\n probeContent: o.content!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n staticInitialize: o.staticInitialize,\n shellClassName: o.shellClassName,\n host: o.host,\n seconds: o.seconds !== undefined ? Number(o.seconds) : undefined,\n sleepServer: o.sleepServer,\n server: o.server,\n reqParamName: o.reqParamName,\n commandTemplate: o.commandTemplate,\n };\n}\n\nexport function registerProbeCommand(program: Command): void {\n program\n .command(\"probe\")\n .description(\"Generate a probe/detection shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-m, --method <method>\", \"probe method: ResponseBody, DNSLog, Sleep\")\n .option(\"-c, --content <content>\", \"probe content: BasicInfo, Server, OS, JDK, Bytecode, Command\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21, or a class-file major version\")\n .option(\"--debug\", \"enable debug output\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--no-static-initialize\", \"disable static initialization (enabled by default)\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name\")\n .option(\"--host <host>\", \"DNSLog host (DNSLog method)\")\n .option(\"--seconds <n>\", \"sleep seconds (Sleep method)\")\n .option(\"--sleep-server <server>\", \"server to fingerprint (Sleep method)\")\n .option(\"--server <server>\", \"server (ResponseBody method)\")\n .option(\"--req-param-name <name>\", \"request param name (ResponseBody method)\")\n .option(\"--command-template <tpl>\", \"command template ({command} placeholder)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .action(async (opts: ProbeCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let probeOpts: ProbeOptions;\n if (wantWizard) {\n probeOpts = await runProbeWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n probeOpts = toOptions(opts);\n }\n\n const request = buildProbeRequest(probeOpts);\n const response = await client.generateProbe(request);\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(response, null, 2)}\\n`);\n return;\n }\n\n const r = response.probeShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n\n if (response.allPackResults && Object.keys(response.allPackResults).length > 0) {\n for (const [name, value] of Object.entries(response.allPackResults)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n if (response.packResult === undefined) {\n throw new Error(\"Server returned no packResult.\");\n }\n\n const result = emitPayload(response.packResult, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { checkbox, confirm, input, select } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { ProbeOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({ name: `${name} (${major})`, value: name })),\n];\n\nconst PROBE_METHODS = [\"ResponseBody\", \"DNSLog\", \"Sleep\"];\nconst PROBE_CONTENTS = [\"BasicInfo\", \"Server\", \"OS\", \"JDK\", \"Bytecode\", \"Command\"];\n\nexport async function runProbeWizard(client: MemPartyClient): Promise<ProbeOptions> {\n const [config, packerTree] = await Promise.all([client.getConfig(), client.getPackerTree()]);\n const servers = Object.keys(config);\n\n const probeMethod = await select({\n message: \"Probe method\",\n choices: PROBE_METHODS.map((m) => ({ name: m, value: m })),\n });\n\n const probeContent = await select({\n message: \"Probe content\",\n choices: PROBE_CONTENTS.map((c) => ({ name: c, value: c })),\n });\n\n const packer = await select({\n message: \"Packer\",\n choices: packerTree.flatMap((p) => [\n { name: p.name, value: p.name },\n ...p.children.map((c) => ({ name: ` ${c}`, value: c })),\n ]),\n });\n\n const opts: ProbeOptions = { probeMethod, probeContent, packer };\n\n switch (probeMethod) {\n case \"DNSLog\":\n opts.host = await input({ message: \"DNSLog host\" });\n break;\n case \"Sleep\":\n opts.sleepServer = await select({\n message: \"Sleep server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.seconds = Number(await input({ message: \"Seconds\", default: \"5\" }));\n break;\n case \"ResponseBody\":\n opts.server = await select({\n message: \"Server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.reqParamName = await input({ message: \"Request param name\", default: \"cmd\" });\n opts.commandTemplate = await input({\n message: \"Command template (optional, {command} placeholder)\",\n default: \"\",\n });\n break;\n default:\n break;\n }\n\n const shellClassName = await input({ message: \"Shell class name (optional)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n\n const confirmed = await confirm({ message: `Generate ${probeMethod} probe (${packer})?` });\n if (!confirmed) throw new Error(\"Cancelled by user.\");\n\n return opts;\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\ninterface VersionCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport function registerVersionCommand(program: Command): void {\n program\n .command(\"version\")\n .description(\"Show CLI version and the backend server version\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: VersionCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n let server: Awaited<ReturnType<typeof client.getVersion>> | { error: string };\n try {\n server = await client.getVersion();\n } catch (err) {\n server = { error: (err as Error).message };\n }\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ cli: CLI_VERSION, server }, null, 2)}\\n`);\n return;\n }\n\n const lines = [`CLI: ${CLI_VERSION}`];\n if (\"error\" in server) {\n lines.push(`Server: (unavailable) ${server.error}`);\n } else {\n lines.push(`Server: ${server.currentVersion}`);\n if (server.hasUpdate) {\n lines.push(`Update: ${server.latestVersion} available`);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n });\n}\n"],"mappings":"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","names":["Command","input","config","readFileSync","input","readFileSync","readFileSync","readFileSync","require","readFileSync","readFileSync","Option","checkbox","confirm","input","select","JDK_CHOICES","select","input","checkbox","confirm","REQUIRED","toOptions","Option","Command"]}
@@ -0,0 +1,272 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+
3
+ /**
4
+ * Type definitions mirroring the MemShellParty backend DTOs.
5
+ * Source of truth: boot/src/main/java/com/reajason/javaweb/boot/{dto,vo,controller}
6
+ */
7
+ interface ShellConfig {
8
+ server: string;
9
+ serverVersion?: string;
10
+ shellTool: string;
11
+ shellType: string;
12
+ /** Java class-file major version, e.g. 50 (Java6), 52 (Java8), 61 (Java17). */
13
+ targetJreVersion?: number;
14
+ debug?: boolean;
15
+ byPassJavaModule?: boolean;
16
+ shrink?: boolean;
17
+ lambdaSuffix?: boolean;
18
+ probe?: boolean;
19
+ }
20
+ interface ShellToolConfig {
21
+ shellClassName?: string;
22
+ godzillaPass?: string;
23
+ godzillaKey?: string;
24
+ commandParamName?: string;
25
+ commandTemplate?: string;
26
+ behinderPass?: string;
27
+ antSwordPass?: string;
28
+ headerName?: string;
29
+ headerValue?: string;
30
+ shellClassBase64?: string;
31
+ encryptor?: string;
32
+ implementationClass?: string;
33
+ }
34
+ interface InjectorConfig {
35
+ injectorClassName?: string;
36
+ urlPattern?: string;
37
+ staticInitialize?: boolean;
38
+ }
39
+ interface MemShellGenerateRequest {
40
+ shellConfig: ShellConfig;
41
+ shellToolConfig: ShellToolConfig;
42
+ injectorConfig: InjectorConfig;
43
+ /** Packer name, e.g. "Base64", "Jar", "JSP". */
44
+ packer: string;
45
+ }
46
+ interface MemShellResult {
47
+ shellClassName: string;
48
+ shellSize: number;
49
+ shellBytesBase64Str: string;
50
+ injectorClassName: string;
51
+ injectorSize: number;
52
+ injectorBytesBase64Str: string;
53
+ shellConfig: ShellConfig;
54
+ shellToolConfig: ShellToolConfig;
55
+ injectorConfig: InjectorConfig;
56
+ }
57
+ interface MemShellGenerateResponse {
58
+ memShellResult: MemShellResult;
59
+ packResult?: string;
60
+ allPackResults?: Record<string, string>;
61
+ }
62
+ type ProbeMethod = "ResponseBody" | "DNSLog" | "Sleep";
63
+ type ProbeContent = "BasicInfo" | "Server" | "OS" | "JDK" | "Bytecode" | "Command";
64
+ interface ProbeConfig {
65
+ probeMethod: string;
66
+ probeContent: string;
67
+ shellClassName?: string;
68
+ targetJreVersion?: number;
69
+ debug?: boolean;
70
+ byPassJavaModule?: boolean;
71
+ shrink?: boolean;
72
+ staticInitialize?: boolean;
73
+ lambdaSuffix?: boolean;
74
+ }
75
+ interface ProbeContentConfig {
76
+ host?: string;
77
+ seconds?: number;
78
+ sleepServer?: string;
79
+ server?: string;
80
+ reqParamName?: string;
81
+ commandTemplate?: string;
82
+ }
83
+ interface ProbeShellGenerateRequest {
84
+ probeConfig: ProbeConfig;
85
+ probeContentConfig: ProbeContentConfig;
86
+ packer: string;
87
+ }
88
+ interface ProbeShellResult {
89
+ shellClassName: string;
90
+ shellSize: number;
91
+ shellBytesBase64Str: string;
92
+ probeConfig: ProbeConfig;
93
+ probeContentConfig: ProbeContentConfig;
94
+ }
95
+ interface ProbeShellGenerateResponse {
96
+ probeShellResult: ProbeShellResult;
97
+ packResult?: string;
98
+ allPackResults?: Record<string, string>;
99
+ }
100
+ /** server name -> supported shell types */
101
+ type ServerConfig = Record<string, string[]>;
102
+ /** server name -> { shell tool -> supported shell types } */
103
+ type MainConfig = Record<string, Record<string, string[]>>;
104
+ interface PackerOption {
105
+ name: string;
106
+ children: string[];
107
+ }
108
+ type PackerTree = PackerOption[];
109
+ interface CommandConfigVO {
110
+ encryptors: string[];
111
+ implementationClasses: string[];
112
+ }
113
+ interface VersionInfo {
114
+ currentVersion: string;
115
+ latestVersion: string;
116
+ hasUpdate?: boolean;
117
+ }
118
+ interface ApiErrorResponse {
119
+ error: string;
120
+ }
121
+
122
+ type FetchLike = typeof fetch;
123
+ /** Error thrown when the API responds with a non-2xx status. */
124
+ declare class ApiError extends Error {
125
+ readonly status: number;
126
+ readonly url: string;
127
+ constructor(message: string, status: number, url: string);
128
+ }
129
+ interface MemPartyClientOptions {
130
+ /** Base URL of the MemShellParty backend, e.g. https://party.mem.mk */
131
+ baseUrl: string;
132
+ /** Injectable fetch implementation (defaults to global fetch). Useful for testing. */
133
+ fetch?: FetchLike;
134
+ /** Per-request timeout in milliseconds. Default 30000. */
135
+ timeoutMs?: number;
136
+ }
137
+ /**
138
+ * Typed client for the MemShellParty HTTP API.
139
+ * Knows nothing about the CLI or MCP — it is a pure transport layer so every
140
+ * entrypoint (flags, wizard, MCP) can share it.
141
+ */
142
+ declare class MemPartyClient {
143
+ private readonly baseUrl;
144
+ private readonly fetchImpl;
145
+ private readonly timeoutMs;
146
+ constructor(options: MemPartyClientOptions);
147
+ getServers(): Promise<ServerConfig>;
148
+ getConfig(): Promise<MainConfig>;
149
+ getPackerTree(): Promise<PackerTree>;
150
+ getPackers(): Promise<string[]>;
151
+ getCommandConfigs(): Promise<CommandConfigVO>;
152
+ getVersion(): Promise<VersionInfo>;
153
+ generateMemShell(req: MemShellGenerateRequest): Promise<MemShellGenerateResponse>;
154
+ generateProbe(req: ProbeShellGenerateRequest): Promise<ProbeShellGenerateResponse>;
155
+ /** Parse a fully-qualified class name from a base64-encoded .class file. */
156
+ parseClassName(classBase64: string): Promise<string>;
157
+ private request;
158
+ }
159
+
160
+ /** Flat option set for building a memshell request (from flags or the wizard). */
161
+ interface MemShellOptions {
162
+ server: string;
163
+ serverVersion?: string;
164
+ shellTool: string;
165
+ shellType: string;
166
+ packer: string;
167
+ jdk?: string | number;
168
+ debug?: boolean;
169
+ byPassJavaModule?: boolean;
170
+ shrink?: boolean;
171
+ lambdaSuffix?: boolean;
172
+ probe?: boolean;
173
+ shellClassName?: string;
174
+ godzillaPass?: string;
175
+ godzillaKey?: string;
176
+ commandParamName?: string;
177
+ commandTemplate?: string;
178
+ behinderPass?: string;
179
+ antSwordPass?: string;
180
+ headerName?: string;
181
+ headerValue?: string;
182
+ shellClassBase64?: string;
183
+ encryptor?: string;
184
+ implementationClass?: string;
185
+ urlPattern?: string;
186
+ injectorClassName?: string;
187
+ staticInitialize?: boolean;
188
+ }
189
+ declare function buildMemShellRequest(opts: MemShellOptions): MemShellGenerateRequest;
190
+ /** Flat option set for building a probe request. */
191
+ interface ProbeOptions {
192
+ probeMethod: string;
193
+ probeContent: string;
194
+ packer: string;
195
+ shellClassName?: string;
196
+ jdk?: string | number;
197
+ debug?: boolean;
198
+ byPassJavaModule?: boolean;
199
+ shrink?: boolean;
200
+ staticInitialize?: boolean;
201
+ lambdaSuffix?: boolean;
202
+ host?: string;
203
+ seconds?: number;
204
+ sleepServer?: string;
205
+ server?: string;
206
+ reqParamName?: string;
207
+ commandTemplate?: string;
208
+ }
209
+ declare function buildProbeRequest(opts: ProbeOptions): ProbeShellGenerateRequest;
210
+
211
+ interface OutputOptions {
212
+ /** Destination file path. When omitted, content goes to stdout. */
213
+ outFile?: string;
214
+ /** Force base64 decoding before writing (binary payload). */
215
+ decode?: boolean;
216
+ }
217
+ interface OutputResult {
218
+ /** Where the payload went: a file path, or "stdout". */
219
+ destination: string;
220
+ /** Number of bytes written (file) or characters printed (stdout). */
221
+ size: number;
222
+ /** Whether the payload was base64-decoded. */
223
+ decoded: boolean;
224
+ }
225
+ /**
226
+ * Decide whether a payload should be base64-decoded before writing.
227
+ * Explicit `decode` wins; otherwise infer from the output file extension.
228
+ */
229
+ declare function shouldDecode(opts: OutputOptions): boolean;
230
+ /**
231
+ * Emit a payload string either to a file or to stdout.
232
+ * Uses injectable sinks so it can be unit-tested without touching the real fs/stdout.
233
+ */
234
+ declare function emitPayload(payload: string, opts: OutputOptions, sinks?: {
235
+ writeFile?: (path: string, data: Buffer | string) => void;
236
+ writeStdout?: (data: string) => void;
237
+ }): OutputResult;
238
+
239
+ declare const DEFAULT_API_URL = "https://party.mem.mk";
240
+ declare const ENV_VAR = "MEMPARTY_API_URL";
241
+ interface ResolveApiUrlInput {
242
+ /** Value from the --api flag (highest priority). */
243
+ flag?: string;
244
+ /** Environment map (defaults to process.env). */
245
+ env?: NodeJS.ProcessEnv;
246
+ /** Home directory (defaults to os.homedir()). Injectable for tests. */
247
+ home?: string;
248
+ }
249
+ /**
250
+ * Resolve the API base URL by priority:
251
+ * 1. --api flag
252
+ * 2. MEMPARTY_API_URL env var
253
+ * 3. ~/.mempartyrc { "apiUrl": "..." }
254
+ * 4. default public site (https://party.mem.mk)
255
+ */
256
+ declare function resolveApiUrl(input?: ResolveApiUrlInput): string;
257
+
258
+ /** Maps friendly JDK names to Java class-file major versions. */
259
+ declare const JDK_VERSIONS: Record<string, number>;
260
+ /**
261
+ * Resolve a user-supplied JDK value into a class-file major version number.
262
+ * Accepts friendly names ("java8", "8"), or a raw major version ("52").
263
+ */
264
+ declare function resolveJreVersion(input: string | number | undefined): number | undefined;
265
+
266
+ declare function createMcpServer(client: MemPartyClient): McpServer;
267
+ /** Start the MCP server over stdio. */
268
+ declare function startMcpStdio(client: MemPartyClient): Promise<void>;
269
+
270
+ declare const CLI_VERSION: string;
271
+
272
+ export { ApiError, type ApiErrorResponse, CLI_VERSION, type CommandConfigVO, DEFAULT_API_URL, ENV_VAR, type FetchLike, type InjectorConfig, JDK_VERSIONS, type MainConfig, MemPartyClient, type MemPartyClientOptions, type MemShellGenerateRequest, type MemShellGenerateResponse, type MemShellOptions, type MemShellResult, type OutputOptions, type OutputResult, type PackerOption, type PackerTree, type ProbeConfig, type ProbeContent, type ProbeContentConfig, type ProbeMethod, type ProbeOptions, type ProbeShellGenerateRequest, type ProbeShellGenerateResponse, type ProbeShellResult, type ServerConfig, type ShellConfig, type ShellToolConfig, type VersionInfo, buildMemShellRequest, buildProbeRequest, createMcpServer, emitPayload, resolveApiUrl, resolveJreVersion, shouldDecode, startMcpStdio };