claude-gemini-multimodal-bridge
Version:
Enterprise-grade AI integration bridge connecting Claude Code, Gemini CLI, and Google AI Studio with intelligent routing and advanced multimodal processing capabilities
441 lines (418 loc) ⢠20.3 kB
JavaScript
import { logger } from '../utils/logger.js';
import { safeExecute } from '../utils/errorHandler.js';
import { OAuthManager } from './OAuthManager.js';
import { AuthVerifier } from './AuthVerifier.js';
import { AuthStateManager } from './AuthStateManager.js';
export class InteractiveSetup {
oauthManager;
authVerifier;
authStateManager;
constructor() {
this.oauthManager = new OAuthManager();
this.authVerifier = new AuthVerifier();
this.authStateManager = new AuthStateManager();
}
async runAuthSetupWizard() {
return safeExecute(async () => {
logger.info('Starting CGMB Authentication Setup Wizard...');
console.log('\nš Welcome to CGMB Authentication Setup\n');
console.log('This wizard will help you set up authentication for all required services.\n');
const servicesConfigured = [];
const errors = [];
try {
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
console.log('STEP 1: Gemini CLI Authentication');
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
const geminiResult = await this.setupGeminiAuth();
if (geminiResult.success) {
servicesConfigured.push('gemini');
console.log('ā
Gemini authentication configured successfully!\n');
}
else {
errors.push(`Gemini: ${geminiResult.error}`);
console.log(`ā Gemini authentication failed: ${geminiResult.error}\n`);
}
}
catch (error) {
const errorMsg = `Gemini setup failed: ${error.message}`;
errors.push(errorMsg);
console.log(`ā ${errorMsg}\n`);
}
try {
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
console.log('STEP 2: Google AI Studio API Key');
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
const aiStudioResult = await this.setupAIStudioAuth();
if (aiStudioResult.success) {
servicesConfigured.push('aistudio');
console.log('ā
AI Studio authentication configured successfully!\n');
}
else {
errors.push(`AI Studio: ${aiStudioResult.error}`);
console.log(`ā AI Studio authentication failed: ${aiStudioResult.error}\n`);
}
}
catch (error) {
const errorMsg = `AI Studio setup failed: ${error.message}`;
errors.push(errorMsg);
console.log(`ā ${errorMsg}\n`);
}
try {
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
console.log('STEP 3: Claude Code CLI');
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
const claudeResult = await this.setupClaudeCodeAuth();
if (claudeResult.success) {
servicesConfigured.push('claude');
console.log('ā
Claude Code authentication configured successfully!\n');
}
else {
errors.push(`Claude Code: ${claudeResult.error}`);
console.log(`ā Claude Code authentication failed: ${claudeResult.error}\n`);
}
}
catch (error) {
const errorMsg = `Claude Code setup failed: ${error.message}`;
errors.push(errorMsg);
console.log(`ā ${errorMsg}\n`);
}
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
console.log('STEP 4: Final Verification');
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
const _verificationResult = await this.verifyAllSetup();
const nextSteps = [];
if (errors.length > 0) {
nextSteps.push('Review and fix authentication issues listed above');
nextSteps.push('Run "cgmb auth-status --verbose" to check current status');
nextSteps.push('Use "cgmb setup-guide" for detailed setup instructions');
}
else {
nextSteps.push('All services configured! You can now use CGMB features');
nextSteps.push('Try "cgmb verify" to confirm everything is working');
nextSteps.push('Run "claude --help" to see enhanced capabilities');
}
const success = errors.length === 0;
console.log('\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
console.log('SETUP COMPLETE');
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
console.log(`ā
Services configured: ${servicesConfigured.length}`);
console.log(`ā Errors encountered: ${errors.length}`);
console.log(`š Overall status: ${success ? 'SUCCESS' : 'PARTIAL'}\n`);
if (nextSteps.length > 0) {
console.log('š Next Steps:');
nextSteps.forEach((step, index) => {
console.log(` ${index + 1}. ${step}`);
});
console.log('');
}
logger.info('Authentication setup wizard completed', {
success,
servicesConfigured: servicesConfigured.length,
errors: errors.length,
});
return {
success,
servicesConfigured,
errors,
nextSteps,
};
}, {
operationName: 'run-auth-setup-wizard',
layer: 'claude',
timeout: 300000,
});
}
async setupGeminiAuth() {
console.log('Setting up Gemini CLI authentication...\n');
const currentStatus = await this.authVerifier.verifyGeminiAuth();
if (currentStatus.success) {
console.log('ā¹ļø Gemini is already authenticated!');
return currentStatus;
}
console.log('Gemini authentication methods:');
console.log('1. OAuth (RECOMMENDED) - Free, secure, no API key needed');
console.log('2. API Key (Alternative) - Requires Google AI Studio API key\n');
console.log('š Trying OAuth authentication (recommended)...');
try {
const authSuccess = await this.oauthManager.promptGeminiLogin();
if (authSuccess) {
const result = await this.authVerifier.verifyGeminiAuth();
return result;
}
}
catch (error) {
console.log(`ā ļø OAuth authentication not available: ${error.message}`);
console.log('\nš To set up OAuth authentication:');
console.log(' 1. Install Gemini CLI: npm install -g @google/gemini-cli');
console.log(' 2. Run: gemini auth');
console.log(' 3. Follow browser authentication flow');
console.log(' 4. Grant permissions when prompted\n');
}
const apiKey = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;
if (apiKey) {
console.log('š Trying API key authentication (fallback)...');
console.log(' Validating API key...');
if (this.oauthManager.validateApiKey(apiKey)) {
console.log('ā
API key format is valid');
const result = await this.authVerifier.verifyGeminiAuth();
if (result.success) {
return result;
}
}
else {
console.log('ā API key format is invalid');
console.log(' Please check your API key from https://aistudio.google.com/');
}
}
else {
console.log('\nš Alternative: API key authentication');
console.log(' š Detailed Setup Guide: https://ai.google.dev/gemini-api/docs/api-key');
console.log(' š API Key Creation: https://aistudio.google.com/app/apikey');
console.log(' 1. Visit: https://aistudio.google.com/app/apikey');
console.log(' 2. Sign in with Google account');
console.log(' 3. Click "Create API Key"');
console.log(' 4. Copy the generated key');
console.log(' 5. Set environment: GEMINI_API_KEY=your_key_here');
console.log(' 6. Restart terminal and test: gemini "hello"\n');
}
return {
success: false,
status: {
isAuthenticated: false,
method: 'oauth',
userInfo: undefined,
},
error: 'Authentication setup incomplete',
requiresAction: true,
actionInstructions: 'Complete either API key or OAuth setup as described above',
};
}
async setupAIStudioAuth() {
console.log('Setting up Google AI Studio authentication...\n');
const currentStatus = await this.authVerifier.verifyAIStudioAuth();
if (currentStatus.success) {
console.log('ā¹ļø AI Studio is already authenticated!');
return currentStatus;
}
console.log('ā¹ļø AI Studio authentication:');
console.log(' - If Gemini OAuth is working: AI Studio will work automatically');
console.log(' - Otherwise: Uses the same API key as Gemini CLI\n');
const geminiStatus = await this.authVerifier.verifyGeminiAuth();
if (geminiStatus.success && geminiStatus.status.method === 'oauth') {
console.log('ā
Using shared authentication from Gemini OAuth');
return {
success: true,
status: {
isAuthenticated: true,
method: 'oauth',
userInfo: geminiStatus.status.userInfo,
},
requiresAction: false,
};
}
const apiKey = process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_STUDIO_API_KEY;
if (!apiKey) {
console.log('ā ļø No API key found - AI Studio requires API key if OAuth not available');
console.log('\nš To set up AI Studio API key:');
console.log(' š API Key Creation: https://aistudio.google.com/app/apikey');
console.log(' 1. Visit: https://aistudio.google.com/app/apikey');
console.log(' 2. Sign in with Google account');
console.log(' 3. Click "Create API Key"');
console.log(' 4. Copy the generated key');
console.log(' 5. Set: GEMINI_API_KEY=your_key_here');
console.log(' 6. Note: Same key works for both Gemini CLI and AI Studio\n');
return {
success: false,
status: {
isAuthenticated: false,
method: 'api_key',
userInfo: undefined,
},
error: 'API key not configured',
requiresAction: true,
actionInstructions: 'Set GEMINI_API_KEY environment variable',
};
}
console.log(`ā
API key found: ${this.oauthManager.maskApiKey(apiKey)}`);
if (!this.oauthManager.validateApiKey(apiKey)) {
console.log('ā API key format appears invalid');
console.log(' Please verify your API key from https://aistudio.google.com/');
return {
success: false,
status: {
isAuthenticated: false,
method: 'api_key',
userInfo: undefined,
},
error: 'Invalid API key format',
requiresAction: true,
actionInstructions: 'Verify and update your GEMINI_API_KEY',
};
}
console.log('š Checking AI Studio MCP server availability...');
const result = await this.authVerifier.verifyAIStudioAuth();
if (!result.success && result.error?.includes('MCP server')) {
console.log('ā¹ļø AI Studio MCP server not found');
console.log('\nš To install AI Studio MCP server:');
console.log(' 1. Run: npm install -g aistudio-mcp-server');
console.log(' 2. Verify installation: npx aistudio-mcp-server --version\n');
}
return result;
}
async setupClaudeCodeAuth() {
console.log('Setting up Claude Code CLI authentication...\n');
const currentStatus = await this.authVerifier.verifyClaudeCodeAuth();
if (currentStatus.success) {
console.log('ā¹ļø Claude Code is already authenticated!');
return currentStatus;
}
console.log('š Checking Claude Code installation...');
const result = await this.authVerifier.verifyClaudeCodeAuth();
if (!result.success) {
if (result.error?.includes('not installed')) {
console.log('ā Claude Code not found');
console.log('\nš To install Claude Code:');
console.log(' 1. Run: npm install -g @anthropic-ai/claude-code');
console.log(' 2. Verify installation: claude --version');
console.log(' 3. If authentication is required: claude auth');
console.log(' 4. Follow authentication instructions\n');
}
else if (result.error?.includes('authentication')) {
console.log('ā Claude Code authentication required');
console.log('\nš To authenticate Claude Code:');
console.log(' 1. Run: claude auth');
console.log(' 2. Follow authentication instructions');
console.log(' 3. Complete any required setup steps\n');
}
else {
console.log(`ā Claude Code issue: ${result.error}`);
console.log('\nš To resolve Claude Code issues:');
console.log(' 1. Ensure Claude Code is properly installed');
console.log(' 2. Check that it\'s in your PATH');
console.log(' 3. Run authentication if needed: claude auth\n');
}
}
return result;
}
async verifyAllSetup() {
console.log('š Verifying all authentication setups...\n');
const verificationResult = await this.authVerifier.verifyAllAuthentications();
console.log('š Verification Results:');
Object.entries(verificationResult.services).forEach(([service, result]) => {
const icon = result.success ? 'ā
' : 'ā';
const status = result.success ? 'Authenticated' : 'Not Authenticated';
console.log(` ${icon} ${service}: ${status}`);
if (!result.success && result.actionInstructions) {
console.log(` ā ${result.actionInstructions}`);
}
});
console.log(`\nš Overall: ${verificationResult.overall ? 'SUCCESS' : 'NEEDS ATTENTION'}`);
if (verificationResult.recommendations.length > 0) {
console.log('\nš” Recommendations:');
verificationResult.recommendations.forEach(rec => {
console.log(` ⢠${rec}`);
});
}
return verificationResult.overall;
}
async setupServiceAuth(service) {
switch (service) {
case 'gemini':
return this.setupGeminiAuth();
case 'aistudio':
return this.setupAIStudioAuth();
case 'claude':
return this.setupClaudeCodeAuth();
default:
throw new Error(`Unknown service: ${service}`);
}
}
async getServicesNeedingSetup() {
const result = await this.authVerifier.verifyAllAuthentications();
return Object.entries(result.services)
.filter(([_, serviceResult]) => !serviceResult.success)
.map(([service, _]) => service);
}
displaySetupGuide() {
console.log(`
š CGMB Enhanced Setup Guide
šÆ NEW: Automatic Installation Available!
=========================================
⨠One-command setup: npm install -g claude-gemini-multimodal-bridge
š§ Postinstall script automatically handles dependencies and MCP setup
ā” Much simpler than manual installation!
ā ļø QUICK START: Complete these steps IN ORDER
š§ FOR USERS COMING FROM ERROR.MD FIXES:
========================================
ā
Problem 1: Gemini CLI incorrect usage ā Fixed with proper -p flag
ā
Problem 2: AI Studio auth failures ā Fixed with AI_STUDIO_API_KEY
ā
Problem 3: Manual MCP setup ā Now automated with postinstall script
STEP 1: Simple Installation (RECOMMENDED)
==========================================
š One-command installation with automatic dependency resolution:
npm install -g claude-gemini-multimodal-bridge
This will automatically:
- Install Gemini CLI (@google/gemini-cli)
- Install AI Studio MCP Server (aistudio-mcp-server)
- Setup Claude Code MCP integration
- Create .env template file
- Verify system requirements
STEP 2: Authentication Setup
=============================
After installation, run the interactive setup:
cgmb auth --interactive
This will guide you through:
- Gemini CLI OAuth authentication
- AI Studio API key setup
- Claude Code verification
STEP 3: Manual Installation (If Needed)
=======================================
If automatic installation fails, follow these steps:
3a. Install Claude Code:
npm install -g @anthropic-ai/claude-code
3b. Install Gemini CLI:
npm install -g @google/gemini-cli
3c. Install AI Studio MCP:
npm install -g aistudio-mcp-server
3d. Setup authentication:
cgmb auth --interactive
STEP 4: API Key Configuration
=============================
š Get API Key: https://aistudio.google.com/app/apikey
š Use the new dedicated environment variable:
1. Visit: https://aistudio.google.com/app/apikey
2. Create API key
3. Add to .env: AI_STUDIO_API_KEY=your_key_here
ā ļø OLD: GEMINI_API_KEY (deprecated)
ā
NEW: AI_STUDIO_API_KEY (clear purpose)
STEP 5: MCP Integration Setup
============================
cgmb setup-mcp # Automatic Claude Code MCP configuration
STEP 6: Verification & Testing
==============================
cgmb verify # Complete system check
cgmb auth-status --verbose # Authentication status
Test enhanced capabilities:
claude "What's the latest in AI?" # Uses Gemini search
claude "Analyze image.png" # Uses AI Studio vision
š WHAT'S NEW IN THIS VERSION:
===============================
š§ Automatic dependency installation via postinstall script
šÆ Intelligent MCP configuration management
ā” Enhanced error handling and user guidance
š Better diagnostic and verification tools
š”ļø Robust authentication state management
š§ TROUBLESHOOTING:
==================
- Installation issues: Check Node.js version (>=18.0.0)
- Authentication problems: cgmb auth --interactive
- MCP not working: cgmb setup-mcp --force
- Missing dependencies: npm install -g <package-name>
š” FOR DEVELOPERS:
==================
- Development mode: git clone && npm install && npm run build
- Link globally: npm link
- Debug mode: DEBUG=true cgmb <command>
`);
}
}