import type { Command } from "commander"; import type { CaptureQueryPreset } from "../proxy-capture/types.js"; type ProxyCliRuntime = typeof import("./proxy-cli.runtime.js"); let proxyCliRuntimePromise: Promise | undefined; async function loadProxyCliRuntime(): Promise { proxyCliRuntimePromise ??= import("./proxy-cli.runtime.js"); return await proxyCliRuntimePromise; } function parseOptionalNumber(value: string | undefined): number | undefined { if (!value) { return undefined; } const parsed = Number(value); return Number.isFinite(parsed) ? parsed : undefined; } export function registerProxyCli(program: Command) { const proxy = program .command("proxy") .description("Run the OpenClaw debug proxy and inspect captured traffic"); proxy .command("start") .description("Start the local explicit debug proxy") .option("--host ", "Bind host", "127.0.0.1") .option("--port ", "Bind port", parseOptionalNumber) .action(async (opts: { host?: string; port?: number }) => { const runtime = await loadProxyCliRuntime(); await runtime.runDebugProxyStartCommand(opts); }); proxy .command("run") .description("Run a child command with OpenClaw debug proxy capture enabled") .allowUnknownOption(true) .allowExcessArguments(true) .option("--host ", "Bind host", "127.0.0.1") .option("--port ", "Bind port", parseOptionalNumber) .argument("[cmd...]", "Command to run after --") .action(async (cmd: string[], opts: { host?: string; port?: number }) => { const runtime = await loadProxyCliRuntime(); await runtime.runDebugProxyRunCommand({ host: opts.host, port: opts.port, commandArgs: cmd, }); }); proxy .command("coverage") .description("Report current debug proxy transport coverage and remaining gaps") .action(async () => { const runtime = await loadProxyCliRuntime(); await runtime.runDebugProxyCoverageCommand(); }); proxy .command("sessions") .description("List recent capture sessions") .option("--limit ", "Maximum sessions to show", parseOptionalNumber) .action(async (opts: { limit?: number }) => { const runtime = await loadProxyCliRuntime(); await runtime.runDebugProxySessionsCommand(opts); }); proxy .command("query") .description("Run a built-in query preset against captured traffic") .requiredOption( "--preset ", "Query preset: double-sends, retry-storms, cache-busting, ws-duplicate-frames, missing-ack, error-bursts", ) .option("--session ", "Restrict to a capture session id") .action(async (opts: { preset: CaptureQueryPreset; session?: string }) => { const runtime = await loadProxyCliRuntime(); await runtime.runDebugProxyQueryCommand({ preset: opts.preset, sessionId: opts.session, }); }); proxy .command("blob") .description("Read a captured payload blob by id") .requiredOption("--id ", "Blob id") .action(async (opts: { id: string }) => { const runtime = await loadProxyCliRuntime(); await runtime.readDebugProxyBlobCommand({ blobId: opts.id }); }); proxy .command("purge") .description("Delete all captured traffic metadata and blobs") .action(async () => { const runtime = await loadProxyCliRuntime(); await runtime.runDebugProxyPurgeCommand(); }); }