/** * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import type { ArgumentsCamelCase, CommandModule } from 'yargs'; import { debugLogger, ExitCodes } from '@google/gemini-cli-core'; import { runExitCleanup } from './utils/cleanup.js'; import type { MergedSettings } from './config/settings.js'; import process from 'node:process'; export interface DeferredCommand { handler: (argv: ArgumentsCamelCase) => void | Promise; argv: ArgumentsCamelCase; commandName: string; } let deferredCommand: DeferredCommand | undefined; export function setDeferredCommand(command: DeferredCommand) { deferredCommand = command; } export async function runDeferredCommand(settings: MergedSettings) { if (!deferredCommand) { return; } const adminSettings = settings.admin; const commandName = deferredCommand.commandName; if (commandName === 'mcp' && adminSettings?.mcp?.enabled === false) { debugLogger.error('Error: MCP is disabled by your admin.'); await runExitCleanup(); process.exit(ExitCodes.FATAL_CONFIG_ERROR); } if ( commandName === 'extensions' && adminSettings?.extensions?.enabled === false ) { debugLogger.error('Error: Extensions are disabled by your admin.'); await runExitCleanup(); process.exit(ExitCodes.FATAL_CONFIG_ERROR); } if (commandName === 'skills' && adminSettings?.skills?.enabled === false) { debugLogger.error('Error: Agent skills are disabled by your admin.'); await runExitCleanup(); process.exit(ExitCodes.FATAL_CONFIG_ERROR); } await deferredCommand.handler(deferredCommand.argv); await runExitCleanup(); process.exit(ExitCodes.SUCCESS); } /** * Wraps a command's handler to defer its execution. * It stores the handler and arguments in a singleton `deferredCommand` variable. */ export function defer( commandModule: CommandModule, parentCommandName?: string, ): CommandModule { return { ...commandModule, handler: (argv: ArgumentsCamelCase) => { setDeferredCommand({ handler: commandModule.handler as ( argv: ArgumentsCamelCase, ) => void | Promise, argv: argv as unknown as ArgumentsCamelCase, commandName: parentCommandName || 'unknown', }); }, }; }