




















@@ -371,22 +371,120 @@ const buildMissingEntryErrorMessage = async () => {
371371const isBareRootHelpInvocation = (argv) =>
372372argv.length === 3 && (argv[2] === "--help" || argv[2] === "-h");
373373374-const resolvePrecomputedCommandHelp = (argv) => {
375-if (argv.length !== 4 || (argv[3] !== "--help" && argv[3] !== "-h")) {
376-return null;
374+const LAUNCHER_HELP_FLAGS = new Set(["-h", "--help"]);
375+const LAUNCHER_ROOT_BOOLEAN_FLAGS = new Set(["--dev", "--no-color"]);
376+const LAUNCHER_ROOT_VALUE_FLAGS = new Set(["--profile", "--log-level", "--container"]);
377+const LAUNCHER_PRECOMPUTED_COMMAND_HELP = {
378+browser: { command: "browser", metadataKey: "browserHelpText" },
379+secrets: { command: "secrets", metadataKey: "secretsHelpText" },
380+nodes: { command: "nodes", metadataKey: "nodesHelpText" },
381+};
382+const LAUNCHER_PRECOMPUTED_SUBCOMMAND_HELP = new Set([
383+"doctor",
384+"gateway",
385+"models",
386+"plugins",
387+"sessions",
388+"tasks",
389+]);
390+391+const isLauncherRootOptionValueToken = (arg) => {
392+if (!arg || arg === "--") {
393+return false;
394+}
395+if (!arg.startsWith("-")) {
396+return true;
377397}
378-if (argv[2] === "browser") {
379-return { command: "browser", metadataKey: "browserHelpText" };
398+return /^-\d+(?:\.\d+)?$/.test(arg);
399+};
400+401+const consumeLauncherRootOptionToken = (args, index) => {
402+const arg = args[index];
403+if (!arg) {
404+return 0;
405+}
406+if (LAUNCHER_ROOT_BOOLEAN_FLAGS.has(arg)) {
407+return 1;
380408}
381-if (argv[2] === "secrets") {
382-return { command: "secrets", metadataKey: "secretsHelpText" };
409+if (
410+arg.startsWith("--profile=") ||
411+arg.startsWith("--log-level=") ||
412+arg.startsWith("--container=")
413+) {
414+return 1;
383415}
384-if (argv[2] === "nodes") {
385-return { command: "nodes", metadataKey: "nodesHelpText" };
416+if (LAUNCHER_ROOT_VALUE_FLAGS.has(arg)) {
417+return isLauncherRootOptionValueToken(args[index + 1]) ? 2 : 1;
418+}
419+return 0;
420+};
421+422+const hasLauncherContainerTarget = (argv) => {
423+if (normalizeLauncherMetadataValue(process.env.OPENCLAW_CONTAINER)) {
424+return true;
425+}
426+const args = argv.slice(2);
427+for (let index = 0; index < args.length; index += 1) {
428+const arg = args[index];
429+if (!arg || arg === "--") {
430+return false;
431+}
432+if (arg === "--container" || arg.startsWith("--container=")) {
433+return true;
434+}
435+}
436+return false;
437+};
438+439+const resolvePrecomputedCommandHelpByName = (commandName) => {
440+if (Object.hasOwn(LAUNCHER_PRECOMPUTED_COMMAND_HELP, commandName)) {
441+return LAUNCHER_PRECOMPUTED_COMMAND_HELP[commandName];
442+}
443+if (LAUNCHER_PRECOMPUTED_SUBCOMMAND_HELP.has(commandName)) {
444+return {
445+command: commandName,
446+metadataKey: "subcommandHelpText",
447+subcommandKey: commandName,
448+};
386449}
387450return null;
388451};
389452453+const resolvePrecomputedCommandHelp = (argv) => {
454+const args = argv.slice(2);
455+let commandHelp = null;
456+let sawHelp = false;
457+458+for (let index = 0; index < args.length; index += 1) {
459+const arg = args[index];
460+if (!arg || arg === "--") {
461+return null;
462+}
463+if (!commandHelp) {
464+const consumed = consumeLauncherRootOptionToken(args, index);
465+if (consumed > 0) {
466+index += consumed - 1;
467+continue;
468+}
469+if (arg.startsWith("-")) {
470+return null;
471+}
472+commandHelp = resolvePrecomputedCommandHelpByName(arg);
473+if (!commandHelp) {
474+return null;
475+}
476+continue;
477+}
478+if (LAUNCHER_HELP_FLAGS.has(arg)) {
479+sawHelp = true;
480+continue;
481+}
482+return null;
483+}
484+485+return commandHelp && sawHelp ? commandHelp : null;
486+};
487+390488const isHelpFastPathDisabled = () =>
391489process.env.OPENCLAW_DISABLE_CLI_STARTUP_HELP_FAST_PATH === "1";
392490@@ -456,11 +554,11 @@ const shouldDeferRootHelpToRuntimeEntry = () => {
456554return false;
457555};
458556459-const loadPrecomputedHelpText = (key) => {
557+const loadPrecomputedHelpText = (key, subkey) => {
460558try {
461559const raw = readFileSync(new URL("./dist/cli-startup-metadata.json", import.meta.url), "utf8");
462560const parsed = JSON.parse(raw);
463-const value = parsed?.[key];
561+const value = subkey ? parsed?.[key]?.[subkey] : parsed?.[key];
464562return typeof value === "string" && value.length > 0 ? value : null;
465563} catch {
466564return null;
@@ -650,10 +748,13 @@ const tryOutputPrecomputedCommandHelp = () => {
650748if (!commandHelp) {
651749return false;
652750}
751+if (hasLauncherContainerTarget(process.argv)) {
752+return false;
753+}
653754if (commandHelp.command === "nodes" && shouldDeferRootHelpToRuntimeEntry()) {
654755return false;
655756}
656-const precomputed = loadPrecomputedHelpText(commandHelp.metadataKey);
757+const precomputed = loadPrecomputedHelpText(commandHelp.metadataKey, commandHelp.subcommandKey);
657758if (!precomputed) {
658759return false;
659760}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。