| |
| |
| |
| |
| |
| import type { ArgumentsCamelCase, CommandModule } from 'yargs'; |
| import { |
| coreEvents, |
| ExitCodes, |
| getAdminErrorMessage, |
| } 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<void>; |
| 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) { |
| coreEvents.emitFeedback( |
| 'error', |
| getAdminErrorMessage('MCP', undefined ), |
| ); |
| await runExitCleanup(); |
| process.exit(ExitCodes.FATAL_CONFIG_ERROR); |
| } |
|
|
| if ( |
| commandName === 'extensions' && |
| adminSettings?.extensions?.enabled === false |
| ) { |
| coreEvents.emitFeedback( |
| 'error', |
| getAdminErrorMessage('Extensions', undefined ), |
| ); |
| await runExitCleanup(); |
| process.exit(ExitCodes.FATAL_CONFIG_ERROR); |
| } |
|
|
| if (commandName === 'skills' && adminSettings?.skills?.enabled === false) { |
| coreEvents.emitFeedback( |
| 'error', |
| getAdminErrorMessage('Agent skills', undefined ), |
| ); |
| await runExitCleanup(); |
| process.exit(ExitCodes.FATAL_CONFIG_ERROR); |
| } |
|
|
| |
| const argvWithSettings = { |
| ...deferredCommand.argv, |
| settings, |
| }; |
|
|
| await deferredCommand.handler(argvWithSettings); |
| await runExitCleanup(); |
| process.exit(ExitCodes.SUCCESS); |
| } |
|
|
| |
| |
| |
| |
| export function defer<T = object, U = object>( |
| commandModule: CommandModule<T, U>, |
| parentCommandName?: string, |
| ): CommandModule<T, U> { |
| return { |
| ...commandModule, |
| handler: (argv: ArgumentsCamelCase<U>) => { |
| setDeferredCommand({ |
| |
| handler: commandModule.handler as ( |
| argv: ArgumentsCamelCase, |
| ) => void | Promise<void>, |
| |
| argv: argv as unknown as ArgumentsCamelCase, |
| commandName: parentCommandName || 'unknown', |
| }); |
| }, |
| }; |
| } |
|
|