UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

121 lines (120 loc) • 4.94 kB
//#region cli-root-options.mjs /** CLI token that stops root option scanning and leaves following args positional. */ const FLAG_TERMINATOR = "--"; const ROOT_BOOLEAN_FLAGS = /* @__PURE__ */ new Set(["--dev", "--no-color"]); const ROOT_VALUE_FLAGS = /* @__PURE__ */ new Set([ "--profile", "--log-level", "--container" ]); /** Returns whether a token can be consumed as a root option value. */ function isValueToken(arg) { if (!arg || arg === "--") return false; if (!arg.startsWith("-")) return true; return /^-\d+(?:\.\d+)?$/.test(arg); } /** Count root-option tokens conservatively for route matching. */ function consumeRootOptionToken(args, index) { const arg = args[index]; if (!arg) return 0; if (ROOT_BOOLEAN_FLAGS.has(arg)) return 1; if (arg.startsWith("--profile=") || arg.startsWith("--log-level=") || arg.startsWith("--container=")) return 1; if (ROOT_VALUE_FLAGS.has(arg)) return isValueToken(args[index + 1]) ? 2 : 1; return 0; } /** Consume required root values by their Commander role before startup policy is selected. */ function consumeRootCommandOptionToken(args, index) { return consumeKnownOptionToken(args, index, ROOT_BOOLEAN_FLAGS, ROOT_VALUE_FLAGS, "command-path"); } /** Read positional command tokens while accepting root options at any pre-terminator position. */ function getRootOptionAwareCommandPath(argv, depth) { const args = argv.slice(2); const path = []; let literal = false; for (let index = 0; index < args.length; index += 1) { const arg = args[index]; if (!arg) break; if (!literal && arg === "--") { if (path.length > 0) break; literal = true; continue; } const consumed = literal ? 0 : consumeRootCommandOptionToken(args, index); if (consumed > 0) { index += consumed - 1; continue; } if (!literal && arg.startsWith("-")) continue; path.push(arg); if (path.length >= depth) break; } return path; } function consumeKnownOptionToken(args, index, booleanFlags, valueFlags, mode) { const arg = args[index]; if (!arg || arg === "--" || !arg.startsWith("-")) return 0; const equalsIndex = arg.indexOf("="); const flag = equalsIndex === -1 ? arg : arg.slice(0, equalsIndex); if (booleanFlags.has(flag)) return equalsIndex === -1 ? 1 : 0; if (!valueFlags.has(flag)) return 0; if (equalsIndex !== -1) return mode === "command-path" || arg.slice(equalsIndex + 1).trim() ? 1 : 0; if (mode === "command-path") return args[index + 1] !== void 0 ? 2 : 0; return isValueToken(args[index + 1]) ? 2 : 0; } /** Parse command positionals while consuming known root and command options. */ function getCommandPositionalsWithRootOptions(argv, options) { return parseCommandArgsWithRootOptions(argv, options, false); } /** Preserve the leaf's raw arguments after consuming its root and parent options. */ function getCommandArgsWithRootOptions(argv, options) { return parseCommandArgsWithRootOptions(argv, options, true); } function parseCommandArgsWithRootOptions(argv, options, returnTail, returnOptions = false) { const args = argv.slice(2); const booleanFlags = new Set(options.booleanFlags ?? []); const valueFlags = new Set(options.valueFlags ?? []); const positionals = []; const rootOptions = []; const commandOptions = []; let commandIndex = 0; let literal = false; for (let index = 0; index < args.length; index += 1) { const arg = args[index]; if (arg === void 0) break; if (!literal && arg === "--") { if (options.mode !== "command-path") break; literal = true; continue; } const rootConsumed = literal ? 0 : options.mode === "command-path" ? consumeRootCommandOptionToken(args, index) : consumeRootOptionToken(args, index); if (rootConsumed > 0) { (commandIndex > 0 && booleanFlags.has(arg) ? commandOptions : rootOptions).push(...args.slice(index, index + rootConsumed)); index += rootConsumed - 1; continue; } if (!literal && arg.startsWith("-")) { const optionConsumed = consumeKnownOptionToken(args, index, booleanFlags, valueFlags, options.mode); if (optionConsumed === 0 || commandIndex === 0) return null; commandOptions.push(arg); index += optionConsumed - 1; continue; } if (commandIndex < options.commandPath.length) { if (arg !== options.commandPath[commandIndex]) return null; commandIndex += 1; if (returnTail && commandIndex === options.commandPath.length) { const tail = args.slice(index + 1); return literal ? ["--", ...tail] : tail; } continue; } positionals.push(arg); if (!returnOptions && positionals.length === options.maxPositionals) return positionals; } return commandIndex < options.commandPath.length ? null : returnOptions ? { rootOptions, commandOptions } : positionals; } //#endregion export { getCommandPositionalsWithRootOptions as a, getCommandArgsWithRootOptions as i, consumeRootCommandOptionToken as n, getRootOptionAwareCommandPath as o, consumeRootOptionToken as r, isValueToken as s, FLAG_TERMINATOR as t };