

























@@ -62,6 +62,7 @@ const QA_RUN_PROFILE_ONLY_OPTIONS = [
6262] as const;
63636464const QA_RUN_SELF_CHECK_ONLY_OPTIONS = [{ optionName: "output", flag: "--output" }] as const;
65+const MAX_QA_CLI_TCP_PORT = 65_535;
65666667type QaSuiteCliOptions = QaScenarioRunCliOptions & {
6768channelDriver?: QaSuiteCommandOptions["channelDriver"];
@@ -105,6 +106,14 @@ function parseQaCliPositiveIntegerOption(value: string, flag: string): number {
105106return parsed;
106107}
107108109+function parseQaCliTcpPortOption(value: string, flag: string): number {
110+const parsed = parseQaCliPositiveIntegerOption(value, flag);
111+if (parsed > MAX_QA_CLI_TCP_PORT) {
112+throw invalidQaCliArgument(`${flag} must be a TCP port between 1 and 65535.`);
113+}
114+return parsed;
115+}
116+108117function parseQaEvidenceModeOption(value: string): QaProfileCommandOptions["evidenceMode"] {
109118const evidenceMode = value.trim();
110119if (evidenceMode === "full" || evidenceMode === "slim") {
@@ -867,11 +876,11 @@ export function registerQaLabCli(program: Command) {
867876.option("--repo-root <path>", "Repository root to target when running from a neutral cwd")
868877.option("--host <host>", "Bind host", "127.0.0.1")
869878.option("--port <port>", "Bind port", (value: string) =>
870-parseQaCliPositiveIntegerOption(value, "--port"),
879+parseQaCliTcpPortOption(value, "--port"),
871880)
872881.option("--advertise-host <host>", "Optional public host to advertise in bootstrap payloads")
873882.option("--advertise-port <port>", "Optional public port to advertise", (value: string) =>
874-parseQaCliPositiveIntegerOption(value, "--advertise-port"),
883+parseQaCliTcpPortOption(value, "--advertise-port"),
875884)
876885.option("--control-ui-url <url>", "Optional Control UI URL to embed beside the QA panel")
877886.option(
@@ -909,10 +918,10 @@ export function registerQaLabCli(program: Command) {
909918.option("--repo-root <path>", "Repository root to target when running from a neutral cwd")
910919.requiredOption("--output-dir <path>", "Output directory for docker-compose + state files")
911920.option("--gateway-port <port>", "Gateway host port", (value: string) =>
912-parseQaCliPositiveIntegerOption(value, "--gateway-port"),
921+parseQaCliTcpPortOption(value, "--gateway-port"),
913922)
914923.option("--qa-lab-port <port>", "QA lab host port", (value: string) =>
915-parseQaCliPositiveIntegerOption(value, "--qa-lab-port"),
924+parseQaCliTcpPortOption(value, "--qa-lab-port"),
916925)
917926.option("--provider-base-url <url>", "Provider base URL for the QA gateway")
918927.option("--image <name>", "Prebaked image name", "openclaw:qa-local-prebaked")
@@ -950,10 +959,10 @@ export function registerQaLabCli(program: Command) {
950959.option("--repo-root <path>", "Repository root to target when running from a neutral cwd")
951960.option("--output-dir <path>", "Output directory for docker-compose + state files")
952961.option("--gateway-port <port>", "Gateway host port", (value: string) =>
953-parseQaCliPositiveIntegerOption(value, "--gateway-port"),
962+parseQaCliTcpPortOption(value, "--gateway-port"),
954963)
955964.option("--qa-lab-port <port>", "QA lab host port", (value: string) =>
956-parseQaCliPositiveIntegerOption(value, "--qa-lab-port"),
965+parseQaCliTcpPortOption(value, "--qa-lab-port"),
957966)
958967.option("--provider-base-url <url>", "Provider base URL for the QA gateway")
959968.option("--image <name>", "Image tag", "openclaw:qa-local-prebaked")
@@ -985,7 +994,7 @@ export function registerQaLabCli(program: Command) {
985994.description(providerCommand.description)
986995.option("--host <host>", "Bind host", "127.0.0.1")
987996.option("--port <port>", "Bind port", (value: string) =>
988-parseQaCliPositiveIntegerOption(value, "--port"),
997+parseQaCliTcpPortOption(value, "--port"),
989998)
990999.action(async (opts: { host?: string; port?: number }) => {
9911000await runQaProviderServer(providerCommand.providerMode, opts);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。