{"version":3,"file":"internal-cli.mjs","names":[],"sources":["../../src/lib/internal-cli.ts"],"sourcesContent":[" \nimport {\n  ArgvParser,\n  EnvOptionConfig,\n  LocalizationDictionary,\n  LocalizationFunction,\n  OptionConfig,\n  ParsedArgs,\n  ValidationFailedError,\n  fromCamelOrDashedCaseToConstCase,\n  hideBin,\n  type ConfigurationFiles,\n} from '@cli-forge/parser';\nimport { readOptionGroupsForCLI } from './cli-option-groups';\nimport { contextStorage, ForgeContextData } from './async-context';\nimport { getCommandContext } from './context';\nimport type { CommandContext, ProvidersFromChain } from './context';\nimport { formatHelp } from './format-help';\n// Lazy-imported to avoid pulling Node-only modules (readline, child_process)\n// into the module graph when bundled for the browser.\ntype InteractiveShellModule = typeof import('./interactive-shell.js');\nlet _shellModule: InteractiveShellModule | null = null;\nasync function getInteractiveShellModule(): Promise<InteractiveShellModule> {\n  if (!_shellModule) {\n    _shellModule = await import('./interactive-shell.js');\n  }\n  return _shellModule;\n}\nimport {\n  AnyCLI,\n  CLI,\n  CLICommandOptions,\n  CLIHandlerContext,\n  Command,\n  ErrorHandler,\n  SDKCommand,\n} from './public-api';\nimport type {\n  CompletionCallback,\n  OptionCompletionCallback,\n} from './completion-types';\nimport type { PromptProvider, PromptOptionConfig } from './prompt-types';\nimport { resolvePrompts } from './resolve-prompts';\nimport { getCallingFile, getParentPackageJson } from './utils';\n\n/** Type alias for an InternalCLI instance with any type parameters. */\nexport type AnyInternalCLI = InternalCLI<any, any, any, any, any>;\n\ntype ProviderRegistration =\n  | { type: 'eager'; value: unknown }\n  | { type: 'factory'; factory: Function; lifetime: 'global' | 'executionScope' };\n\n/**\n * Monotonic counter used to stamp every `InternalCLI` instance with a\n * process-unique `commandId` at construction time. Used by\n * {@link getCommandContext} to verify at runtime that a CLI instance passed\n * as a type witness actually belongs to the currently-executing command\n * chain — which catches the class of bug where the user passes the wrong\n * CLI (a sibling, an unrelated app) as the type witness and silently gets\n * incorrect `inject()` types.\n */\nlet _internalCliIdCounter = 0;\n\n/**\n * The base class for a CLI application. This class is used to define the structure of the CLI.\n *\n * {@link cli} is provided as a small helper function to create a new CLI instance.\n *\n * @example\n * ```ts\n * import { cli } from 'cli-forge';\n *\n * cli('basic-cli').command('hello', {\n *   builder: (args) =>\n *    args.option('name', {\n *      type: 'string',\n *    }),\n *   handler: (args) => {\n *     console.log(`Hello, ${args.name}!`);\n *   }).forge();\n * ```\n */\n/**\n * Cross-realm brand symbol used to identify InternalCLI instances across\n * different copies of the cli-forge package (e.g. when pnpm resolves\n * multiple copies due to differing peer dependencies). `Symbol.for()`\n * returns the same symbol globally, so the brand check works even when\n * `instanceof` would fail.\n */\nconst CLI_FORGE_BRAND = Symbol.for('cli-forge:InternalCLI');\n\nexport class InternalCLI<\n  TArgs extends ParsedArgs = ParsedArgs,\n  THandlerReturn = void,\n\n  TChildren = {},\n  TParent = undefined,\n  TProviders = {}\n> implements CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>\n{\n  /**\n   * Cross-realm brand for identifying InternalCLI instances across\n   * different package copies. See {@link CLI_FORGE_BRAND}.\n   */\n  readonly [CLI_FORGE_BRAND] = true;\n\n  /**\n   * Check whether `obj` is an InternalCLI instance, even when it was\n   * created by a different copy of the cli-forge package.\n   */\n  static isInternalCLI(\n    obj: unknown\n  ): obj is AnyInternalCLI {\n    return (\n      obj != null &&\n      typeof obj === 'object' &&\n      CLI_FORGE_BRAND in obj\n    );\n  }\n\n  /**\n   * For internal use only. Stick to properties available on {@link CLI}.\n   */\n  registeredCommands: Record<string, AnyInternalCLI> = {};\n\n  /**\n   * Process-unique identifier stamped at construction time. Used to\n   * validate at runtime that a CLI instance passed to `getCommandContext`\n   * actually belongs to the active command chain. Never mutated once set —\n   * builders, handlers, and middleware see the same value for the lifetime\n   * of the instance, even across clones.\n   *\n   * For internal use only.\n   */\n  readonly commandId: string;\n\n  /**\n   * Registered DI providers keyed by name.\n   * For internal use only.\n   */\n  registeredProviders: Map<string, ProviderRegistration> = new Map();\n\n  /**\n   * For internal use only. Stick to properties available on {@link CLI}.\n   */\n  commandChain: string[] = [];\n\n  /**\n   * Reference to the parent CLI instance, if this command was registered as a subcommand.\n   * For internal use only. Use `getParent()` instead.\n   */\n  private _parent?: AnyInternalCLI;\n\n  private requiresCommand: 'IMPLICIT' | 'EXPLICIT' | false = 'IMPLICIT';\n\n  private _configuration?: CLICommandOptions<any, any>;\n\n  private _versionOverride?: string;\n\n  private registeredErrorHandlers: Array<ErrorHandler> = [\n    (e: unknown, actions) => {\n      if (e instanceof ValidationFailedError) {\n        this.printHelp();\n        console.log();\n        console.log(e.message);\n        console.log(e.errors.map((e) => `  - ${e.message}`).join('\\n'));\n        actions.exit(1);\n      }\n    },\n  ];\n\n  private registeredMiddleware = new Set<\n    (args: TArgs) => void | unknown | Promise<void> | Promise<unknown>\n  >();\n\n  private registeredInitHooks: Array<\n    (cli: any, args: TArgs) => Promise<void> | void\n  > = [];\n\n  registeredPromptProviders: PromptProvider[] = [];\n\n  /**\n   * Stores prompt config for each option, keyed by option name.\n   * Set when .option() is called with a `prompt` property.\n   */\n  promptConfigs: Map<string, PromptOptionConfig<any>> = new Map();\n\n  /**\n   * Custom completion callback for this command level.\n   * Set when .completion() is called with a callback argument.\n   */\n  completionCallback?: CompletionCallback<any>;\n\n  /**\n   * Per-option completion callbacks, keyed by option name.\n   * Set when .option() is called with a `completion` property.\n   */\n  completionConfigs: Map<string, OptionCompletionCallback<any>> = new Map();\n\n  /**\n   * Whether .completion() has been called on this CLI instance.\n   */\n  private _completionEnabled = false;\n\n  /**\n   * Set when a `$0` alias replaces the root builder via `.command()`.\n   * The $0 builder should only run if no explicit subcommand is given,\n   * so `forge()` defers it until the discovery loop confirms no match.\n   */\n  private builderIsFrom$0Alias = false;\n\n  /**\n   * A list of option groups that have been registered with the CLI. Grouped Options are displayed together in the help text.\n   *\n   * For internal use only. Stick to properties available on {@link CLI}.\n   */\n  registeredOptionGroups: Array<{\n    label: string;\n    sortOrder: number;\n    keys: Array<keyof TArgs>;\n  }> = [];\n\n  getGroupedOptions() {\n    return readOptionGroupsForCLI(this);\n  }\n\n  get configuration() {\n    return this._configuration;\n  }\n\n  private set configuration(value: CLICommandOptions<any, any> | undefined) {\n    this._configuration = value;\n  }\n\n  /**\n   * The parser used to parse the arguments for the current command.\n   *\n   * Meant for internal use only. Stick to properties available on {@link CLI}.\n   *\n   * If you need this kind of info, please open an issue on the GitHub repo with\n   * your use case.\n   */\n  parser = new ArgvParser<TArgs>({\n    unmatchedParser: (arg) => {\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      let currentCommand: AnyInternalCLI = this;\n      for (const command of this.commandChain) {\n        currentCommand = currentCommand.registeredCommands[command];\n      }\n      const command = currentCommand.registeredCommands[arg];\n      if (command && command.configuration) {\n        command.parser = this.parser;\n        command.configuration.builder?.(command as any);\n        this.commandChain.push(arg);\n        return true;\n      }\n      return false;\n    },\n  })\n    .option('help', {\n      type: 'boolean',\n      alias: ['h'],\n      description: 'Show help for the current command',\n    })\n    .option('version', {\n      type: 'boolean',\n      description: 'Show the version number for the CLI',\n    });\n\n  /**\n   * @param name What should the name of the cli command be?\n   * @param configuration Configuration for the current CLI command.\n   */\n  constructor(\n    public name: string,\n    rootCommandConfiguration?: CLICommandOptions<\n      TArgs,\n      any,\n      THandlerReturn,\n      TChildren\n    >\n  ) {\n    // Stamp a stable, immutable identifier so `getCommandContext(cli)` can\n    // verify at runtime that this instance is part of the active command\n    // chain. The format is `${name}#${counter}` for debuggability — the\n    // counter guarantees uniqueness even when two commands share a name.\n    this.commandId = `${name}#${++_internalCliIdCounter}`;\n    if (rootCommandConfiguration) {\n      this.withRootCommandConfiguration(rootCommandConfiguration as any);\n    } else {\n      this.requiresCommand = 'IMPLICIT';\n    }\n  }\n\n  withRootCommandConfiguration<TRootCommandArgs extends TArgs>(\n    configuration: CLICommandOptions<TArgs, TRootCommandArgs>\n  ): InternalCLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.configuration = configuration;\n    this.requiresCommand = configuration.handler ? false : 'IMPLICIT';\n    return this;\n  }\n\n  command<\n    TCommand extends Command<TArgs, any, any, any>\n  >(\n    cmd: TCommand\n  ): CLI<\n    TArgs,\n    THandlerReturn,\n    TChildren & import('./public-api').CommandToChildEntry<\n      TCommand,\n      CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>\n    >,\n    TParent,\n    TProviders\n  >;\n  command<\n    TCommandArgs extends TArgs,\n    TChildHandlerReturn = void,\n    TCommandName extends string = string,\n    TChildChildren = {},\n    TChildProviders = {}\n  >(\n    key: TCommandName,\n    options: CLICommandOptions<\n      TArgs,\n      TCommandArgs,\n      TChildHandlerReturn,\n      TChildren,\n      CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>,\n      TChildChildren,\n      TChildProviders\n    >\n  ): CLI<\n    TArgs,\n    THandlerReturn,\n    TChildren & {\n      [key in TCommandName]: CLI<\n        TCommandArgs,\n        TChildHandlerReturn,\n        TChildChildren,\n        CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>,\n        TChildProviders\n      >;\n    },\n    TParent,\n    TProviders\n  >;\n  command(\n    keyOrCommand: string | Command<any, any, any, any>,\n    options?: CLICommandOptions<any, any, any, any, any, any, any>\n  ): any {\n    if (typeof keyOrCommand === 'string') {\n      const key = keyOrCommand;\n      if (!options) {\n        throw new Error(\n          'options must be provided when calling `command` with a string'\n        );\n      }\n      if (key === '$0' || options.alias?.includes('$0')) {\n        this.withRootCommandConfiguration({\n          ...this._configuration,\n          builder: options.builder as any,\n          handler: options.handler as any,\n          description: options.description,\n        });\n        // Only defer the builder when it came from an alias (e.g.,\n        // command('search', { alias: ['$0'] })). When key === '$0',\n        // the command IS the root and its builder should run normally.\n        if (key !== '$0' && options.alias?.includes('$0')) {\n          this.builderIsFrom$0Alias = true;\n        }\n      }\n      const cmd = new InternalCLI<TArgs, TChildHandlerReturn>(\n        key\n      ).withRootCommandConfiguration(options as any);\n      cmd._parent = this;\n\n      // Get localized command name\n      const localizedKey = this.getLocalizedCommandName(key);\n\n      // Register under the default key\n      this.registeredCommands[key] = cmd;\n\n      // If localized name is different, also register under localized name as an alias\n      if (localizedKey !== key) {\n        this.registeredCommands[localizedKey] = cmd;\n      }\n\n      if (options.alias) {\n        for (const alias of options.alias) {\n          this.registeredCommands[alias] = cmd;\n        }\n      }\n    } else if (InternalCLI.isInternalCLI(keyOrCommand)) {\n      const cmd = keyOrCommand as AnyInternalCLI;\n      if (cmd.name === '$0') {\n        this.withRootCommandConfiguration(cmd.configuration as any);\n        // Copy any commands registered on the $0 instance (e.g. subcommands\n        // added via `.commands()` after the $0 CLI was created).\n        for (const [key, subcmd] of Object.entries(cmd.registeredCommands)) {\n          subcmd._parent = this;\n          this.registeredCommands[key] = subcmd;\n        }\n        return this as any;\n      }\n      cmd._parent = this;\n      this.registeredCommands[cmd.name] = cmd;\n      if (cmd.configuration?.alias) {\n        for (const alias of cmd.configuration.alias) {\n          this.registeredCommands[alias] = cmd;\n        }\n      }\n    } else {\n      const { name, ...configuration } = keyOrCommand as {\n        name: string;\n      } & CLICommandOptions<TArgs, TCommandArgs>;\n      this.command<TCommandArgs>(name, configuration);\n    }\n    return this as any;\n  }\n\n  commands(...a0: Command[] | Command[][]): any {\n    const commands = a0.flat();\n    for (const val of commands) {\n      this.command(val);\n    }\n    return this;\n  }\n\n  option<\n    TOption extends string,\n    const TOptionConfig extends OptionConfig<any, any, any>\n  >(\n    name: TOption,\n    config: TOptionConfig & {\n      prompt?: PromptOptionConfig<TArgs>;\n      completion?: OptionCompletionCallback<TArgs>;\n    }\n  ) {\n    const { prompt, completion: completionCb, ...parserConfig } = config;\n    if (prompt !== undefined) {\n      this.promptConfigs.set(name, prompt);\n    }\n    if (completionCb !== undefined) {\n      this.completionConfigs.set(name, completionCb);\n    }\n    this.parser.option(name, parserConfig as TOptionConfig);\n    // Interface modifies the return type to reflect new params, cast is necessay.... I think 🤔\n    return this as any;\n  }\n\n  positional<\n    TOption extends string,\n    const TOptionConfig extends OptionConfig<any, any, any>\n  >(\n    name: TOption,\n    config: TOptionConfig & {\n      prompt?: PromptOptionConfig<TArgs>;\n      completion?: OptionCompletionCallback<TArgs>;\n    }\n  ) {\n    const { prompt, completion: completionCb, ...parserConfig } = config;\n    if (prompt !== undefined) {\n      this.promptConfigs.set(name, prompt);\n    }\n    if (completionCb !== undefined) {\n      this.completionConfigs.set(name, completionCb);\n    }\n    this.parser.positional(name, parserConfig as TOptionConfig);\n    // Interface modifies the return type to reflect new params, cast is necessay.... I think 🤔\n    return this as any;\n  }\n\n  conflicts(\n    ...args: [string, string, ...string[]]\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.parser.conflicts(...args);\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  implies(\n    option: string,\n    ...impliedOptions: string[]\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.parser.implies(option, ...impliedOptions);\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  env(\n    a0: string | EnvOptionConfig | undefined = fromCamelOrDashedCaseToConstCase(\n      this.name\n    )\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    if (typeof a0 === 'string') {\n      this.parser.env(a0);\n    } else {\n      a0.prefix ??= fromCamelOrDashedCaseToConstCase(this.name);\n      this.parser.env(a0);\n    }\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  localize(\n    dictionaryOrFn: LocalizationDictionary | LocalizationFunction,\n    locale?: string\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    if (typeof dictionaryOrFn === 'function') {\n      this.parser.localize(dictionaryOrFn);\n    } else {\n      this.parser.localize(dictionaryOrFn, locale);\n    }\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  /**\n   * Gets the localized display name for a command key.\n   * @param key The command key\n   * @returns The localized command name, or the original key if not localized\n   */\n  getLocalizedCommandName(key: string): string {\n    return this.parser.getDisplayKey(key);\n  }\n\n  demandCommand(): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.requiresCommand = 'EXPLICIT';\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  strict(enable = true): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.parser.options.strict = enable;\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  usage(usageText: string): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.configuration ??= {};\n    this.configuration.usage = usageText;\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  hidden(hidden = true): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.configuration ??= {};\n    this.configuration.hidden = hidden;\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  examples(\n    ...examples: string[]\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.configuration ??= {};\n    this.configuration.examples ??= [];\n    this.configuration.examples.push(...examples);\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  version(version?: string): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this._versionOverride = version;\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  /**\n   * Gets help text for the current command as a string.\n   * @returns Help text for the current command.\n   */\n  formatHelp() {\n    return formatHelp(this);\n  }\n\n  /**\n   * Prints help text for the current command to the console.\n   */\n  printHelp() {\n    console.log(this.formatHelp());\n  }\n\n  middleware<TArgs2>(\n    callback: (args: TArgs) => TArgs2 | Promise<TArgs2> | void | Promise<void>\n  ): CLI<\n    TArgs2 extends void ? TArgs : TArgs & TArgs2,\n    THandlerReturn,\n    TChildren,\n    TParent,\n    TProviders\n  > {\n    this.registeredMiddleware.add(callback);\n    // If middleware returns void, TArgs doesn't change...\n    // If it returns something, we need to merge it into TArgs...\n    // that's not here though, its where we apply the middleware results.\n    return this as any;\n  }\n\n  handler<R>(\n    fn: (args: TArgs, context: any) => R\n  ): CLI<TArgs, R, TChildren, TParent, TProviders> {\n    if (!this._configuration) {\n      this._configuration = {};\n    }\n    this._configuration.handler = fn as any;\n    this.requiresCommand = false;\n    return this as any;\n  }\n\n  provide(key: string, valueOrConfig: unknown): any {\n    if (this.registeredProviders.has(key)) {\n      throw new Error(`Provider '${key}' is already registered on this command.`);\n    }\n    if (\n      valueOrConfig !== null &&\n      typeof valueOrConfig === 'object' &&\n      'factory' in valueOrConfig &&\n      typeof (valueOrConfig as any).factory === 'function'\n    ) {\n      const config = valueOrConfig as { factory: Function; lifetime?: string };\n      this.registeredProviders.set(key, {\n        type: 'factory',\n        factory: config.factory,\n        lifetime: (config.lifetime as 'global' | 'executionScope') ?? 'executionScope',\n      });\n    } else {\n      this.registeredProviders.set(key, { type: 'eager', value: valueOrConfig });\n    }\n    return this;\n  }\n\n  init(\n    callback: (\n      cli: CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>,\n      args: TArgs\n    ) => Promise<void> | void\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.registeredInitHooks.push(callback);\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  completion(\n    callback?: CompletionCallback<any>\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this._completionEnabled = true;\n    if (callback) {\n      this.completionCallback = callback;\n    }\n\n    // Only register completion infrastructure at root level (no parent)\n    if (!this._parent) {\n      this.parser.option('getCompletions', {\n        type: 'boolean',\n        hidden: true,\n        description: 'Output shell completion suggestions',\n      } as any);\n\n      this.command('completion', {\n        description: 'Install shell completion scripts',\n        handler: async () => {\n          const { installCompletionScripts } = await import(\n            './completion-scripts.js'\n          );\n          await installCompletionScripts(this.name);\n        },\n      });\n    }\n\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  /**\n   * Runs the current command.\n   * @param cmd The command to run.\n   * @param args The arguments to pass to the command.\n   */\n  async runCommand<T extends ParsedArgs>(\n    args: T,\n    originalArgV: string[],\n    executedMiddleware?: Set<(args: any) => void>\n  ): Promise<T> {\n    const middlewares = new Set<(args: any) => void>(this.registeredMiddleware);\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    let cmd: AnyInternalCLI = this;\n    for (const command of this.commandChain) {\n      cmd = cmd.registeredCommands[command];\n      for (const mw of cmd.registeredMiddleware) {\n        middlewares.add(mw);\n      }\n    }\n    try {\n      if (cmd.requiresCommand) {\n        throw new Error(\n          `${[this.name, ...this.commandChain].join(' ')} requires a command`\n        );\n      }\n      if (cmd.configuration?.handler) {\n        for (const middleware of middlewares) {\n          if (executedMiddleware?.has(middleware)) continue;\n          const middlewareResult = await middleware(args as any);\n          if (\n            middlewareResult !== void 0 &&\n            typeof middlewareResult === 'object'\n          ) {\n            args = middlewareResult as T;\n          }\n        }\n        // Keep ALS context args in sync after middleware transformations\n        const store = contextStorage.getStore();\n        if (store) {\n          store.args = args as Record<string, unknown>;\n        }\n        await cmd.configuration.handler(args, {\n          command: cmd as any,\n        });\n        return args;\n      } else {\n        // We can treat a command as a subshell if it has subcommands\n        if (Object.keys(cmd.registeredCommands).length > 0) {\n          if (typeof process === 'undefined' || !process.stdout?.isTTY) {\n            // If we're not in a TTY (or in a browser), we can't run an interactive shell...\n            // Maybe we should warn here?\n          } else if (args.unmatched.length > 0) {\n            // If there are unmatched args, we don't run an interactive shell...\n            // this could represent a user misspelling a subcommand so it gets rather confusing.\n            console.warn(\n              `Warning: Unrecognized command or arguments: ${args.unmatched.join(\n                ' '\n              )}`\n            );\n            cmd.printHelp();\n          } else {\n            const shellMod = await getInteractiveShellModule();\n            if (!shellMod.INTERACTIVE_SHELL) {\n              const tui = new shellMod.InteractiveShell(\n                this as unknown as AnyInternalCLI,\n                {\n                  prependArgs: originalArgV,\n                }\n              );\n              await new Promise<void>((res) => {\n                ['SIGINT', 'SIGTERM', 'SIGQUIT'].forEach((s) =>\n                  process?.on(s, () => {\n                    tui.close();\n                    res();\n                  })\n                );\n              });\n            }\n          }\n        }\n        // No subcommands so subshell doesn't make sense\n        // No handler, so nothing to run\n        else {\n          throw new Error(\n            `${[this.name, ...this.commandChain].join(' ')} is not implemented.`\n          );\n        }\n      }\n    } catch (e) {\n      if (typeof process !== 'undefined') process.exitCode = 1;\n      console.error(e);\n      this.printHelp();\n    }\n    return args;\n  }\n\n  getChildren(): TChildren {\n    // Return a copy of registered commands, excluding aliases (same command registered under different keys)\n    const children: Record<string, AnyInternalCLI> = {};\n    const seen = new Set<AnyInternalCLI>();\n    for (const [key, cmd] of Object.entries(this.registeredCommands)) {\n      if (!seen.has(cmd)) {\n        seen.add(cmd);\n        children[key] = cmd;\n      }\n    }\n    return children as TChildren;\n  }\n\n  getParent(): TParent {\n    return this._parent as TParent;\n  }\n\n  getContext(): CommandContext<\n    TArgs,\n    ProvidersFromChain<TProviders, TParent>,\n    TChildren\n  > {\n    // Delegate to getCommandContext(this) so the runtime chain validation\n    // and error messaging stay in a single place.\n    return getCommandContext(\n      this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>\n    ) as CommandContext<\n      TArgs,\n      ProvidersFromChain<TProviders, TParent>,\n      TChildren\n    >;\n  }\n\n  getBuilder():\n    | (<\n        TInit extends ParsedArgs,\n        TInitHandlerReturn,\n        TInitChildren,\n        TInitParent,\n        TInitProviders\n      >(\n        parser: CLI<TInit, TInitHandlerReturn, TInitChildren, TInitParent, TInitProviders>\n      ) => CLI<\n        TInit & TArgs,\n        TInitHandlerReturn,\n        TInitChildren & TChildren,\n        TInitParent,\n        TInitProviders\n      >)\n    | undefined {\n    const builder = this.configuration?.builder;\n    if (!builder) return undefined;\n    // Return a composable builder that preserves input types\n    return ((parser: AnyCLI) => builder(parser)) as any;\n  }\n\n  getHandler():\n    | ((args: Omit<TArgs, keyof ParsedArgs>) => THandlerReturn)\n    | undefined {\n    const context: CLIHandlerContext<TChildren, TParent> = {\n      command: this as unknown as CLI<any, any, TChildren, TParent, any>,\n    };\n    const handler = this._configuration?.handler;\n    if (!handler) {\n      return undefined;\n    }\n    return (args: Omit<TArgs, keyof ParsedArgs>) =>\n      handler(\n        args as TArgs,\n        context as CLIHandlerContext<any, any>\n      ) as THandlerReturn;\n  }\n\n  sdk(): SDKCommand<TArgs, THandlerReturn, TChildren> {\n    return this.buildSDKProxy(this) as SDKCommand<\n      TArgs,\n      THandlerReturn,\n      TChildren\n    >;\n  }\n\n  private buildSDKProxy(targetCmd: AnyInternalCLI): unknown {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n\n    const invoke = async (\n      argsOrArgv?: Record<string, unknown> | string[]\n    ): Promise<THandlerReturn & { $args?: TArgs }> => {\n      // Clone the target command to avoid mutating the original\n      const cmd = targetCmd.clone();\n\n      const handler = cmd._configuration?.handler;\n      if (!handler) {\n        throw new Error(`Command '${cmd.name}' has no handler`);\n      }\n\n      let parsedArgs: any;\n\n      if (Array.isArray(argsOrArgv)) {\n        // String array: full pipeline (parse → validate → middleware)\n        // Run the builder first if present\n        if (cmd._configuration?.builder) {\n          cmd._configuration.builder(cmd as any);\n        }\n        parsedArgs = cmd.parser.parse(argsOrArgv);\n      } else {\n        // Object args: skip validation, apply defaults, run middleware\n        // Run the builder first to register options and get defaults\n        if (cmd._configuration?.builder) {\n          cmd._configuration.builder(cmd as any);\n        }\n        // Build defaults from configured options\n        const defaults: Record<string, unknown> = {};\n        for (const [key, config] of Object.entries(\n          cmd.parser.configuredOptions\n        )) {\n          if (config.default !== undefined) {\n            defaults[key] = config.default;\n          }\n        }\n        parsedArgs = {\n          ...defaults,\n          ...argsOrArgv,\n          unmatched: [],\n        };\n      }\n\n      // Collect and run middleware from the command chain\n      const middlewares = self.collectMiddlewareChain(targetCmd);\n      for (const mw of middlewares) {\n        const middlewareResult = await mw(parsedArgs);\n        if (\n          middlewareResult !== void 0 &&\n          typeof middlewareResult === 'object'\n        ) {\n          parsedArgs = middlewareResult;\n        }\n      }\n\n      // Build context data for ALS — collect providers from root down to cmd.\n      // Use targetCmd (not the clone) because clone() does not copy _parent.\n      const providerChain: AnyInternalCLI[] = [];\n      let providerWalk: AnyInternalCLI | undefined = targetCmd;\n      while (providerWalk) {\n        providerChain.unshift(providerWalk);\n        providerWalk = providerWalk._parent;\n      }\n      const sdkContextData: ForgeContextData = {\n        args: parsedArgs as Record<string, unknown>,\n        commandChain: [],\n        // providerChain walks root -> ...ancestors -> targetCmd already,\n        // so we reuse it for the id chain that getCommandContext validates.\n        commandIdChain: providerChain.map((c) => c.commandId),\n        providers: new Map(),\n        providerFactories: new Map(),\n        handlerPhase: true,\n        resolving: new Set(),\n      };\n      for (const providerNode of providerChain) {\n        for (const [key, reg] of providerNode.registeredProviders) {\n          if (reg.type === 'eager') {\n            sdkContextData.providers.set(key, reg.value);\n          } else {\n            sdkContextData.providerFactories.set(key, {\n              factory: reg.factory,\n              lifetime: reg.lifetime,\n            });\n          }\n        }\n      }\n\n      // Execute handler inside ALS context\n      const context: CLIHandlerContext<any, any> = {\n        command: cmd as unknown as AnyCLI,\n      };\n      const result = await contextStorage.run(sdkContextData, async () => {\n        return handler(parsedArgs, context);\n      });\n\n      // Try to attach $args to the result (fails silently for primitives)\n      if (result !== null && typeof result === 'object') {\n        try {\n          (result as any).$args = parsedArgs;\n        } catch {\n          // Cannot attach to frozen objects or primitives, return as-is\n        }\n      }\n\n      return result as any as THandlerReturn & { $args?: TArgs };\n    };\n\n    // Ensure builder has run to register all subcommands\n    if (targetCmd._configuration?.builder) {\n      targetCmd._configuration.builder(targetCmd as any);\n    }\n\n    // Create proxy that is both callable and has child properties\n    return new Proxy(invoke, {\n      get(_, prop: string) {\n        // Handle special properties\n        if (prop === 'then' || prop === 'catch' || prop === 'finally') {\n          // Don't intercept Promise methods - this prevents issues with await\n          return undefined;\n        }\n\n        const child = targetCmd.registeredCommands[prop];\n        if (child) {\n          return self.buildSDKProxy(child);\n        }\n        return undefined;\n      },\n    });\n  }\n\n  private collectMiddlewareChain(\n    cmd: AnyInternalCLI\n  ): Array<(args: any) => unknown | Promise<unknown>> {\n    const chain: AnyInternalCLI[] = [];\n    let current: AnyInternalCLI | undefined = cmd;\n    while (current) {\n      chain.unshift(current);\n      current = current._parent;\n    }\n    const seen = new Set<(args: any) => unknown | Promise<unknown>>();\n    for (const c of chain) {\n      for (const mw of c.registeredMiddleware) {\n        seen.add(mw);\n      }\n    }\n    return [...seen];\n  }\n\n  enableInteractiveShell(): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    if (this.requiresCommand === 'EXPLICIT') {\n      throw new Error(\n        'Interactive shell is not supported for commands that require a command.'\n      );\n    } else if (typeof process !== 'undefined' && process.stdout?.isTTY) {\n      this.requiresCommand = false;\n    }\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  private versionHandler() {\n    if (this._versionOverride) {\n      console.log(this._versionOverride);\n      return;\n    }\n    let mainFile = typeof require !== 'undefined' ? require?.main?.filename : undefined;\n    mainFile ??= getCallingFile();\n    if (!mainFile) {\n      console.log('unknown');\n      return;\n    }\n    try {\n      const packageJson = getParentPackageJson(mainFile);\n      console.log(packageJson.version ?? 'unknown');\n    } catch {\n      console.log('unknown');\n    }\n  }\n\n  private async withErrorHandlers<T>(cb: () => T): Promise<Awaited<T>> {\n    try {\n      return await cb();\n    } catch (e) {\n      for (const handler of this.registeredErrorHandlers) {\n        try {\n          handler(e, {\n            exit: (c) => {\n              if (typeof process !== 'undefined') process.exit(c);\n            },\n          });\n          // Error was handled, no need to continue\n          break;\n        } catch {\n          // Error was not handled, continue to the next handler\n        }\n      }\n      throw e;\n    }\n  }\n\n  errorHandler(\n    handler: ErrorHandler\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.registeredErrorHandlers.unshift(handler);\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  withPromptProvider(\n    provider: PromptProvider\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    if (!provider.prompt && !provider.promptBatch) {\n      throw new Error(\n        \"Prompt provider must implement at least one of 'prompt' or 'promptBatch'\"\n      );\n    }\n    this.registeredPromptProviders.push(provider);\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  group(\n    labelOrConfigObject:\n      | string\n      | { label: string; keys: (keyof TArgs)[]; sortOrder?: number },\n    keys?: (keyof TArgs)[]\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    const config =\n      typeof labelOrConfigObject === 'object'\n        ? labelOrConfigObject\n        : {\n            label: labelOrConfigObject,\n            keys: keys as (keyof TArgs)[],\n          };\n\n    if (!config.keys) {\n      throw new Error('keys must be provided when calling `group`.');\n    }\n\n    this.registeredOptionGroups.push({\n      ...config,\n      sortOrder:\n        config.sortOrder ?? Object.keys(this.registeredOptionGroups).length,\n    });\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  config(\n    provider: ConfigurationFiles.AnyConfigProvider<TArgs>\n  ): CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders> {\n    this.parser.config(\n      provider as ConfigurationFiles.AnyConfigProvider<any>\n    );\n    return this as unknown as CLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>;\n  }\n\n  async updateConfig(values: Partial<TArgs>): Promise<void>;\n  async updateConfig(\n    updater: ConfigurationFiles.ConfigUpdater<TArgs>\n  ): Promise<void>;\n  async updateConfig(\n    valuesOrUpdater:\n      | Partial<TArgs>\n      | ConfigurationFiles.ConfigUpdater<TArgs>\n  ): Promise<void> {\n    return this.parser.updateConfig(valuesOrUpdater as any);\n  }\n\n  /**\n   * Parses argv and executes the CLI.\n   *\n   * Execution proceeds in two phases:\n   *\n   * **Discovery loop** (per command level): builder → parse (non-strict,\n   * no validation) → merge → middleware → init hooks → find next\n   * subcommand in unmatched tokens → repeat.\n   *\n   * **Final parse + execution**: parse (with validation, seeded with\n   * accumulated args) → help/version check → handler. Middleware that\n   * already ran during discovery is skipped.\n   *\n   * @param args argv. Defaults to process.argv.slice(2)\n   * @returns Promise that resolves when the handler completes.\n   */\n  forge = (args: string[] = typeof process !== 'undefined' ? hideBin(process.argv) : []) =>\n    this.withErrorHandlers(async () => {\n      let argv: TArgs & { help?: boolean; version?: boolean };\n      let validationFailedError: ValidationFailedError<TArgs> | undefined;\n\n      // Run root builder (may register options, init hooks, commands).\n      // If the builder came from a $0 alias, skip it here — we defer\n      // running it until the discovery loop confirms no explicit\n      // subcommand was given, so it doesn't double-run when the\n      // command is invoked by name.\n      if (!this.builderIsFrom$0Alias) {\n        this.configuration?.builder?.(this as any);\n      }\n\n      // Merge helper: accumulate defined values without overwriting\n      const mergeNew = (target: any, source: any) => {\n        for (const [key, value] of Object.entries(source)) {\n          if (\n            key !== 'unmatched' &&\n            value !== undefined &&\n            target[key] === undefined\n          ) {\n            target[key] = value;\n          }\n        }\n      };\n\n      // Check if this is a completion request — enable lenient parsing\n      // so incomplete argv (e.g. `--env \"\"`) doesn't throw.\n      const isCompletionRequest =\n        this._completionEnabled &&\n        args.some(\n          (a) => a === '--get-completions' || a === '--getCompletions'\n        );\n\n      // Iterative command discovery with init hooks.\n      // Each level: non-strict parse filtered args → run middleware\n      // → run init hooks → find next command in unmatched tokens\n      // → filter down. Builders stay lazy.\n      let currentArgs = [...args];\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      let currentCmd: AnyInternalCLI = this;\n      const mergedArgs: any = {};\n      const executedMiddleware = new Set<(args: any) => void>();\n\n       \n      while (true) {\n        // Non-strict parse to get current arg values for init hooks.\n        // Seeded with mergedArgs so required options parsed at earlier\n        // levels satisfy validation.\n        // The unmatchedParser intercepts subcommand tokens before\n        // positional matching can greedily consume them.\n        let discoveredCommand: string | null = null;\n        const parsed = this.parser\n          .clone({\n            ...this.parser.options,\n            unmatchedParser: (arg) => {\n              if (!discoveredCommand && !arg.startsWith('-')) {\n                const cmd = currentCmd.registeredCommands[arg];\n                if (cmd && cmd.configuration) {\n                  discoveredCommand = arg;\n                  return true;\n                }\n              }\n              return false;\n            },\n            strict: false,\n            validate: false,\n            lenient: isCompletionRequest,\n          })\n          .parse(currentArgs, mergedArgs) as any;\n\n        mergeNew(mergedArgs, parsed);\n\n        // Run middleware for this command level before init hooks,\n        // so init hooks can see middleware-transformed args.\n        for (const mw of currentCmd.registeredMiddleware) {\n          if (!executedMiddleware.has(mw)) {\n            executedMiddleware.add(mw);\n            const result = await mw(mergedArgs);\n            if (result !== void 0 && typeof result === 'object') {\n              Object.assign(mergedArgs, result);\n            }\n          }\n        }\n\n        // Run init hooks with the full accumulated args\n        for (const hook of currentCmd.registeredInitHooks) {\n          await hook(currentCmd as any, mergedArgs);\n        }\n\n        // Build the next command if one was discovered during parsing\n        // (i.e., subcommand token intercepted before positional matching)\n        let nextCmd: AnyInternalCLI | null = null;\n        if (discoveredCommand) {\n          const cmd = currentCmd.registeredCommands[discoveredCommand];\n          cmd.parser = this.parser;\n          cmd.configuration?.builder?.(cmd as any);\n          this.commandChain.push(discoveredCommand);\n          nextCmd = cmd;\n          // An explicit subcommand was found — the $0 default path\n          // won't be taken, so clear the deferred builder flag.\n          this.builderIsFrom$0Alias = false;\n        }\n\n        // Scan unmatched tokens for commands that may have been registered\n        // dynamically by init hooks (these weren't in registeredCommands\n        // during parse, so the unmatchedParser couldn't intercept them).\n        const unmatched: string[] = parsed.unmatched ?? [];\n        const remainingArgs: string[] = [];\n\n        if (!nextCmd) {\n          for (const token of unmatched) {\n            if (!nextCmd && !token.startsWith('-')) {\n              const cmd = currentCmd.registeredCommands[token];\n              if (cmd && cmd.configuration) {\n                cmd.parser = this.parser;\n                cmd.configuration.builder?.(cmd as any);\n                this.commandChain.push(token);\n                nextCmd = cmd;\n                this.builderIsFrom$0Alias = false;\n                continue;\n              }\n            }\n            remainingArgs.push(token);\n          }\n        }\n\n        if (!nextCmd) {\n          // No explicit subcommand was found. If a $0 alias replaced\n          // the root builder, run it now so its options (e.g. positionals)\n          // get registered before the final parse.\n          if (this.builderIsFrom$0Alias) {\n            this.builderIsFrom$0Alias = false; // only run once\n            this.configuration?.builder?.(this as any);\n            // Re-run the loop iteration so the newly registered options\n            // participate in parsing.\n            currentArgs = unmatched;\n            continue;\n          }\n          currentArgs = unmatched;\n          break;\n        }\n        // If command found during parse, all unmatched are remaining args.\n        // If command found in post-init scan, use filtered remaining args.\n        currentArgs = discoveredCommand ? unmatched : remainingArgs;\n        currentCmd = nextCmd;\n      }\n\n      // All builders and init hooks have run. The parser now has\n      // all options registered.\n\n      // If this is a completion request, resolve completions now\n      // (after discovery so subcommand builders have run) but before\n      // the strict final parse.\n      if (isCompletionRequest) {\n        const completionArgv = args.filter(\n          (a) => a !== '--get-completions' && a !== '--getCompletions'\n        );\n        const { resolveCompletions } = await import(\n          './resolve-completions.js'\n        );\n        const completions = await resolveCompletions({\n          rootCLI: this,\n          argv: completionArgv,\n        });\n        for (const c of completions) {\n          console.log(c);\n        }\n        return mergedArgs as TArgs;\n      }\n\n      // Parse the remaining unmatched tokens\n      // seeded with the accumulated values from the discovery loop.\n      // The alreadyParsed values ensure proper required-option\n      // validation and prevent positional re-consumption.\n\n      // Prompt for missing option values before final validation.\n      // Collect prompt providers from the full command chain.\n      const allPromptProviders: PromptProvider[] = [\n        ...this.registeredPromptProviders,\n      ];\n      const allPromptConfigs = new Map(this.promptConfigs);\n      {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        let walkCmd: AnyInternalCLI = this;\n        for (const command of this.commandChain) {\n          walkCmd = walkCmd.registeredCommands[command];\n          for (const p of walkCmd.registeredPromptProviders) {\n            allPromptProviders.push(p);\n          }\n          for (const [k, v] of walkCmd.promptConfigs) {\n            allPromptConfigs.set(k, v);\n          }\n        }\n      }\n\n      if (allPromptProviders.length > 0 || allPromptConfigs.size > 0) {\n        const promptedValues = await resolvePrompts({\n          configuredOptions: this.parser.configuredOptions as Record<\n            string,\n            any\n          >,\n          configuredImplies: this.parser.configuredImplies,\n          promptConfigs: allPromptConfigs,\n          providers: allPromptProviders,\n          currentArgs: mergedArgs,\n        });\n\n        // Inject prompted values into accumulated args\n        for (const [key, value] of Object.entries(promptedValues)) {\n          if (value !== undefined) {\n            mergedArgs[key] = value;\n          }\n        }\n      }\n\n      try {\n        argv = this.parser\n          .clone({\n            ...this.parser.options,\n            unmatchedParser: () => false,\n          })\n          .parse(currentArgs, mergedArgs) as any;\n      } catch (e) {\n        if (e instanceof ValidationFailedError) {\n          argv = e.partialArgV as any;\n          validationFailedError = e;\n        } else {\n          throw e;\n        }\n      }\n\n      if (argv.version) {\n        this.versionHandler();\n        return argv;\n      }\n\n      if (argv.help) {\n        this.printHelp();\n        return argv;\n      } else if (validationFailedError) {\n        throw validationFailedError;\n      }\n\n      // Collect all providers from the command chain (root → subcommands)\n      const allProviders = this.collectProviders();\n      const contextData: ForgeContextData = {\n        args: argv as Record<string, unknown>,\n        commandChain: [...this.commandChain],\n        commandIdChain: this.collectCommandIdChain(),\n        providers: new Map(),\n        providerFactories: new Map(),\n        handlerPhase: false,\n        resolving: new Set(),\n      };\n\n      // Register providers into context\n      for (const [key, reg] of allProviders) {\n        if (reg.type === 'eager') {\n          contextData.providers.set(key, reg.value);\n        } else {\n          contextData.providerFactories.set(key, {\n            factory: reg.factory,\n            lifetime: reg.lifetime,\n          });\n        }\n      }\n\n      const finalArgV = await contextStorage.run(contextData, async () => {\n        contextData.handlerPhase = true;\n        return this.runCommand(argv, args, executedMiddleware);\n      });\n      return finalArgV as TArgs;\n    });\n\n  getParser() {\n    return this.parser.asReadonly();\n  }\n\n  getSubcommands() {\n    return this.registeredCommands as Readonly<Record<string, AnyInternalCLI>>;\n  }\n\n  private collectProviders(): Map<string, ProviderRegistration> {\n    const result = new Map<string, ProviderRegistration>();\n    // Start from root (this) and walk down the command chain\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    let cmd: AnyInternalCLI = this;\n    for (const [key, reg] of cmd.registeredProviders) {\n      result.set(key, reg);\n    }\n    for (const name of this.commandChain) {\n      cmd = cmd.registeredCommands[name];\n      if (cmd) {\n        for (const [key, reg] of cmd.registeredProviders) {\n          result.set(key, reg); // child overrides parent\n        }\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Walks the command chain from root (this) down to the running command\n   * and collects each instance's `commandId`. Populates\n   * `ForgeContextData.commandIdChain` so `getCommandContext(cli)` can\n   * validate at runtime that the CLI passed as a type witness is any\n   * command on the active chain.\n   */\n  private collectCommandIdChain(): string[] {\n    const ids: string[] = [this.commandId];\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    let cmd: AnyInternalCLI = this;\n    for (const name of this.commandChain) {\n      const next = cmd.registeredCommands[name];\n      if (!next) break;\n      cmd = next;\n      ids.push(cmd.commandId);\n    }\n    return ids;\n  }\n\n  clone() {\n    const clone = new InternalCLI<TArgs, THandlerReturn, TChildren, TParent, TProviders>(\n      this.name\n    );\n    // Propagate the commandId so the clone still validates against any\n    // original CLI reference the user passes to `getCommandContext()`.\n    // A clone conceptually represents the same command — just a private\n    // mutable copy — so it keeps the original's identity.\n    (clone as { commandId: string }).commandId = this.commandId;\n    clone.parser = this.parser.clone(clone.parser.options) as any;\n    if (this.configuration) {\n      clone.withRootCommandConfiguration(this.configuration);\n    }\n    clone.registeredCommands = {};\n    for (const command in this.registeredCommands ?? {}) {\n      clone.command(this.registeredCommands[command].clone() as any);\n    }\n    clone.registeredProviders = new Map(this.registeredProviders);\n    clone.commandChain = [...this.commandChain];\n    clone.requiresCommand = this.requiresCommand;\n    clone.registeredPromptProviders = [...this.registeredPromptProviders];\n    clone.promptConfigs = new Map(this.promptConfigs);\n    clone.completionCallback = this.completionCallback;\n    clone.completionConfigs = new Map(this.completionConfigs);\n    clone._completionEnabled = this._completionEnabled;\n    return clone;\n  }\n}\n"],"mappings":"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"}