@clduab11/gemini-flow
Version:
Revolutionary AI agent swarm coordination platform with Google Services integration, multimedia processing, and production-ready monitoring. Features 8 Google AI services, quantum computing capabilities, and enterprise-grade security.
690 lines (557 loc) • 19.4 kB
Markdown
# GeminiIntegrationService API Reference
## Overview
The `GeminiIntegrationService` is the core component responsible for managing Gemini CLI integration and context loading in gemini-flow v1.0.4. It provides a singleton interface for detecting Gemini CLI installations, loading GEMINI.md context files, and configuring the enhanced AI coordination environment.
## Class Definition
```typescript
export class GeminiIntegrationService {
private static instance: GeminiIntegrationService;
private logger: Logger;
private cachedContext: GeminiContext | null = null;
private detectionResult: GeminiDetectionResult | null = null;
// Singleton pattern - use getInstance() to access
public static getInstance(): GeminiIntegrationService;
// Core functionality methods
public async detectGeminiCLI(): Promise<GeminiDetectionResult>;
public async loadGeminiContext(projectRoot?: string): Promise<GeminiContext>;
public setupEnvironment(): void;
public async getIntegrationStatus(): Promise<GeminiIntegrationStatus>;
public async initialize(projectRoot?: string): Promise<GeminiInitializationResult>;
public clearCache(): void;
}
```
## Interfaces and Types
### GeminiContext
```typescript
interface GeminiContext {
content: string; // Full GEMINI.md content
loaded: boolean; // Whether loading was successful
timestamp: Date; // When context was loaded
source: 'GEMINI.md' | 'fallback'; // Source of the context
}
```
### GeminiDetectionResult
```typescript
interface GeminiDetectionResult {
isInstalled: boolean; // Whether Gemini CLI is installed
version?: string; // Detected CLI version
path?: string; // Installation path
error?: string; // Error message if detection failed
}
```
### GeminiIntegrationStatus
```typescript
interface GeminiIntegrationStatus {
cliDetected: boolean; // CLI installation status
contextLoaded: boolean; // Context loading status
environmentConfigured: boolean; // Environment setup status
geminiVersion?: string; // CLI version if detected
contextSource?: string; // Source of loaded context
}
```
### GeminiInitializationResult
```typescript
interface GeminiInitializationResult {
detection: GeminiDetectionResult;
context: GeminiContext;
environmentConfigured: boolean;
}
```
## Methods
### getInstance()
```typescript
public static getInstance(): GeminiIntegrationService
```
**Description**: Returns the singleton instance of GeminiIntegrationService.
**Returns**: `GeminiIntegrationService` - Singleton instance
**Example**:
```typescript
const service = GeminiIntegrationService.getInstance();
```
**Thread Safety**: Yes, uses lazy initialization pattern
**Caching**: Instance is cached after first creation
---
### detectGeminiCLI()
```typescript
public async detectGeminiCLI(): Promise<GeminiDetectionResult>
```
**Description**: Detects if the official Gemini CLI is installed on the system by attempting to execute `which gemini` and `gemini --version` commands.
**Returns**: `Promise<GeminiDetectionResult>` - Detection results
**Behavior**:
- Uses system `which` command to locate Gemini CLI
- Attempts to get version information
- Caches results to avoid repeated system calls
- Falls back gracefully if CLI is not found
**Example**:
```typescript
const service = GeminiIntegrationService.getInstance();
const result = await service.detectGeminiCLI();
if (result.isInstalled) {
console.log(`Gemini CLI found at ${result.path}, version ${result.version}`);
} else {
console.log(`Gemini CLI not found: ${result.error}`);
}
```
**Performance**:
- **Execution Time**: 5-50ms (varies by system)
- **Timeout**: 5 seconds
- **Caching**: Results cached until service restart
**Error Handling**:
```typescript
// Detection failure scenarios
interface DetectionErrors {
'CLI_NOT_FOUND': 'Gemini CLI not in PATH';
'VERSION_TIMEOUT': 'Version command timed out';
'PERMISSION_DENIED': 'Insufficient permissions';
'SYSTEM_ERROR': 'System command execution failed';
}
```
---
### loadGeminiContext()
```typescript
public async loadGeminiContext(projectRoot?: string): Promise<GeminiContext>
```
**Description**: Loads GEMINI.md context file from the project root directory for enhanced AI coordination. Falls back to default context if file is not found.
**Parameters**:
- `projectRoot` (optional): Custom project root path. Defaults to `process.cwd()`
**Returns**: `Promise<GeminiContext>` - Loaded context information
**Behavior**:
- Searches for GEMINI.md in project root
- Reads and parses file content
- Validates content format and structure
- Caches result for 5 minutes
- Falls back to default context if file not found
**Example**:
```typescript
const service = GeminiIntegrationService.getInstance();
// Load from current directory
const context = await service.loadGeminiContext();
// Load from custom path
const customContext = await service.loadGeminiContext('/path/to/project');
console.log(`Loaded ${context.content.length} characters from ${context.source}`);
```
**Cache Behavior**:
```typescript
interface CachePolicy {
duration: 5 * 60 * 1000; // 5 minutes
invalidation: 'time-based' | 'manual';
storage: 'memory';
}
```
**Fallback Context**:
When GEMINI.md is not found, the service provides a minimal fallback context containing:
- Basic command reference
- Available agent types
- Integration mode information
- Common troubleshooting tips
**Performance**:
- **File Read Time**: 1-5ms for typical GEMINI.md files
- **Parsing Time**: <1ms
- **Cache Hit**: <0.1ms
- **Memory Usage**: ~50KB per cached context
---
### setupEnvironment()
```typescript
public setupEnvironment(): void
```
**Description**: Configures environment variables required for enhanced Gemini integration mode.
**Environment Variables Set**:
```typescript
const environmentConfig = {
GEMINI_FLOW_CONTEXT_LOADED: 'true',
GEMINI_FLOW_MODE: 'enhanced',
GEMINI_MODEL: 'gemini-1.5-flash'
};
```
**Behavior**:
- Only sets variables if they don't already exist
- Logs configuration changes at debug level
- Immediately available to child processes
- Idempotent - safe to call multiple times
**Example**:
```typescript
const service = GeminiIntegrationService.getInstance();
service.setupEnvironment();
// Environment variables are now available
console.log(process.env.GEMINI_FLOW_CONTEXT_LOADED); // 'true'
console.log(process.env.GEMINI_FLOW_MODE); // 'enhanced'
```
**Advanced Configuration**:
```typescript
// Additional environment variables that may be set
interface ExtendedEnvironment {
GEMINI_FLOW_CONTEXT_SIZE?: string; // Context file size
GEMINI_FLOW_CONTEXT_SOURCE?: string; // Context source path
GEMINI_FLOW_PROJECT_ROOT?: string; // Project root directory
GEMINI_FLOW_CACHE_TTL?: string; // Cache time-to-live
}
```
---
### getIntegrationStatus()
```typescript
public async getIntegrationStatus(): Promise<GeminiIntegrationStatus>
```
**Description**: Retrieves comprehensive status information about Gemini CLI integration and context loading.
**Returns**: `Promise<GeminiIntegrationStatus>` - Complete integration status
**Status Indicators**:
- **CLI Detection**: Whether official Gemini CLI is installed
- **Context Loading**: Whether GEMINI.md was successfully loaded
- **Environment**: Whether environment variables are configured
- **Version Information**: CLI version if available
- **Context Source**: Source of loaded context (file or fallback)
**Example**:
```typescript
const service = GeminiIntegrationService.getInstance();
const status = await service.getIntegrationStatus();
console.log('Integration Status:');
console.log(`CLI Detected: ${status.cliDetected}`);
console.log(`Context Loaded: ${status.contextLoaded}`);
console.log(`Environment Configured: ${status.environmentConfigured}`);
if (status.geminiVersion) {
console.log(`Gemini Version: ${status.geminiVersion}`);
}
```
**Health Checks**:
```typescript
interface HealthChecks {
cliAvailability: boolean; // Can execute Gemini CLI commands
contextValidity: boolean; // GEMINI.md content is valid
environmentSetup: boolean; // Required env vars are set
cacheHealth: boolean; // Cache is functioning properly
}
```
**Performance Monitoring**:
```typescript
interface StatusMetrics {
detectionTime: number; // Time to detect CLI (ms)
contextLoadTime: number; // Time to load context (ms)
cacheHitRate: number; // Percentage of cache hits
errorRate: number; // Percentage of failed operations
}
```
---
### initialize()
```typescript
public async initialize(projectRoot?: string): Promise<GeminiInitializationResult>
```
**Description**: Performs complete Gemini integration initialization including CLI detection, context loading, and environment setup.
**Parameters**:
- `projectRoot` (optional): Custom project root path
**Returns**: `Promise<GeminiInitializationResult>` - Complete initialization results
**Initialization Sequence**:
1. **Parallel Detection**: CLI detection and context loading run concurrently
2. **Environment Setup**: Configure environment variables
3. **Validation**: Verify all components are properly initialized
4. **Logging**: Record initialization metrics and status
**Example**:
```typescript
const service = GeminiIntegrationService.getInstance();
const result = await service.initialize('/path/to/project');
console.log('Initialization Results:');
console.log(`CLI Detected: ${result.detection.isInstalled}`);
console.log(`Context Loaded: ${result.context.loaded}`);
console.log(`Environment Configured: ${result.environmentConfigured}`);
if (result.detection.version) {
console.log(`CLI Version: ${result.detection.version}`);
}
```
**Error Recovery**:
```typescript
// Initialization handles partial failures gracefully
interface InitializationFailures {
cliDetectionFailed: 'Continue with reduced functionality';
contextLoadingFailed: 'Use fallback context';
environmentSetupFailed: 'Manual configuration required';
}
```
**Performance Characteristics**:
```typescript
interface InitializationPerformance {
totalTime: '50-200ms typical';
parallelExecution: 'CLI detection + context loading';
cacheUtilization: 'Subsequent calls use cached results';
memoryFootprint: '4-8MB during initialization';
}
```
---
### clearCache()
```typescript
public clearCache(): void
```
**Description**: Clears all cached data including context and detection results. Useful for testing or forcing fresh data reload.
**Cleared Data**:
- Cached GEMINI.md context
- CLI detection results
- Cached environment status
- Performance metrics cache
**Example**:
```typescript
const service = GeminiIntegrationService.getInstance();
// Clear cache to force fresh reload
service.clearCache();
// Next context load will read from disk
const freshContext = await service.loadGeminiContext();
```
**Use Cases**:
- **Development**: Reload context after GEMINI.md changes
- **Testing**: Ensure clean state between tests
- **Troubleshooting**: Force refresh when data seems stale
- **Memory Management**: Reduce memory usage when context not needed
## Usage Patterns
### Basic Integration
```typescript
// Simple integration check
const service = GeminiIntegrationService.getInstance();
const status = await service.getIntegrationStatus();
if (status.cliDetected && status.contextLoaded) {
console.log('Full Gemini integration available');
} else {
console.log('Partial integration - some features may be limited');
}
```
### Complete Setup
```typescript
// Full initialization with error handling
const service = GeminiIntegrationService.getInstance();
try {
const result = await service.initialize();
if (result.environmentConfigured) {
console.log('Gemini integration ready');
// Proceed with enhanced functionality
}
} catch (error) {
console.warn('Integration setup failed:', error.message);
// Fall back to standard functionality
}
```
### Context-Aware Operations
```typescript
// Load and utilize context for enhanced operations
const service = GeminiIntegrationService.getInstance();
const context = await service.loadGeminiContext();
if (context.loaded && context.source === 'GEMINI.md') {
// Use full system context for AI operations
await enhancedAIOperation(context.content);
} else {
// Use basic functionality
await standardAIOperation();
}
```
### Development Workflow
```typescript
// Development workflow with context reloading
const service = GeminiIntegrationService.getInstance();
// During development, reload context after changes
export async function reloadContext() {
service.clearCache();
const context = await service.loadGeminiContext();
console.log(`Reloaded context: ${context.content.length} characters`);
return context;
}
```
## Error Handling
### Exception Types
```typescript
class GeminiIntegrationError extends Error {
constructor(
message: string,
public code: string,
public recoverable: boolean = true
) {
super(message);
}
}
// Common error codes
enum ErrorCodes {
CLI_NOT_FOUND = 'CLI_NOT_FOUND',
CONTEXT_READ_ERROR = 'CONTEXT_READ_ERROR',
ENVIRONMENT_SETUP_FAILED = 'ENVIRONMENT_SETUP_FAILED',
INITIALIZATION_TIMEOUT = 'INITIALIZATION_TIMEOUT',
CACHE_CORRUPTION = 'CACHE_CORRUPTION'
}
```
### Error Recovery Strategies
```typescript
async function robustIntegration() {
const service = GeminiIntegrationService.getInstance();
try {
return await service.initialize();
} catch (error) {
switch (error.code) {
case 'CLI_NOT_FOUND':
// Continue without CLI integration
console.warn('Gemini CLI not found - using basic functionality');
break;
case 'CONTEXT_READ_ERROR':
// Use fallback context
service.clearCache();
return await service.initialize();
case 'INITIALIZATION_TIMEOUT':
// Retry with longer timeout
console.warn('Initialization timeout - retrying...');
return await retry(() => service.initialize(), { attempts: 3 });
default:
throw error;
}
}
}
```
## Performance Optimization
### Caching Strategy
```typescript
interface CacheStrategy {
contextCache: {
duration: '5 minutes';
invalidation: 'time-based';
size: 'unlimited';
};
detectionCache: {
duration: 'process lifetime';
invalidation: 'manual only';
size: '1 result';
};
}
```
### Memory Management
```typescript
interface MemoryUsage {
serviceInstance: '~1KB';
cachedContext: '~50KB per project';
detectionResult: '~1KB';
total: '~52KB typical';
}
```
### Performance Monitoring
```typescript
// Built-in performance tracking
const service = GeminiIntegrationService.getInstance();
// Monitor initialization performance
const startTime = Date.now();
await service.initialize();
const duration = Date.now() - startTime;
console.log(`Initialization completed in ${duration}ms`);
```
## Integration with CLI Commands
### Automatic Integration
When the `--gemini` flag is used with any CLI command, the integration service is automatically invoked:
```typescript
// CLI command handler with --gemini flag
export async function handleCommandWithGemini(command: string, options: any) {
if (options.gemini) {
const service = GeminiIntegrationService.getInstance();
await service.initialize();
// Command execution now has enhanced context
return await executeEnhancedCommand(command, options);
}
return await executeStandardCommand(command, options);
}
```
### Context Injection
```typescript
// Context is automatically injected into AI operations
interface EnhancedAIRequest {
prompt: string;
context?: string; // Automatically populated from GEMINI.md
model?: string; // Optimized based on task complexity
options?: any;
}
```
## Testing and Validation
### Unit Testing
```typescript
describe('GeminiIntegrationService', () => {
let service: GeminiIntegrationService;
beforeEach(() => {
service = GeminiIntegrationService.getInstance();
service.clearCache(); // Ensure clean state
});
test('should detect CLI when available', async () => {
const result = await service.detectGeminiCLI();
expect(result.isInstalled).toBeDefined();
});
test('should load context from existing file', async () => {
const context = await service.loadGeminiContext('./test-fixtures');
expect(context.loaded).toBe(true);
expect(context.source).toBe('GEMINI.md');
});
});
```
### Integration Testing
```typescript
describe('Gemini Integration E2E', () => {
test('complete initialization workflow', async () => {
const service = GeminiIntegrationService.getInstance();
const result = await service.initialize();
expect(result.detection).toBeDefined();
expect(result.context).toBeDefined();
expect(result.environmentConfigured).toBe(true);
});
});
```
## Security Considerations
### File System Access
- Context loading only reads from project root and subdirectories
- No write operations performed during context loading
- File path validation prevents directory traversal attacks
### Environment Variables
- Only sets Gemini-specific environment variables
- Existing variables are never overwritten
- No sensitive information stored in environment
### CLI Execution
- Only executes known safe commands (`which`, `gemini --version`)
- Commands are executed with timeout limits
- No user input is passed to CLI commands
## Troubleshooting
### Common Issues
1. **Context Not Loading**:
```typescript
// Check if GEMINI.md exists
const fs = require('fs');
const path = require('path');
const geminiPath = path.join(process.cwd(), 'GEMINI.md');
if (!fs.existsSync(geminiPath)) {
console.log('GEMINI.md not found - using fallback context');
}
```
2. **CLI Detection Failing**:
```bash
# Check if Gemini CLI is in PATH
which gemini
# Install if missing
npm install -g @google-ai/generativelanguage
```
3. **Environment Not Configured**:
```typescript
// Manually verify environment setup
const service = GeminiIntegrationService.getInstance();
service.setupEnvironment();
console.log('Environment configured:', {
contextLoaded: process.env.GEMINI_FLOW_CONTEXT_LOADED,
mode: process.env.GEMINI_FLOW_MODE,
model: process.env.GEMINI_MODEL
});
```
4. **Cache Issues**:
```typescript
// Clear cache and reload
const service = GeminiIntegrationService.getInstance();
service.clearCache();
const freshContext = await service.loadGeminiContext();
console.log('Fresh context loaded:', freshContext.timestamp);
```
## Migration Guide
### From Previous Versions
```typescript
// v1.0.3 and earlier - manual setup
const adapter = new GeminiAdapter();
await adapter.initialize();
// v1.0.4 - automatic integration
const service = GeminiIntegrationService.getInstance();
await service.initialize(); // Handles everything automatically
```
### API Changes
- New singleton pattern for service access
- Automatic caching replaces manual cache management
- Environment setup is now automatic
- Enhanced error handling with recovery strategies
---
*The GeminiIntegrationService provides a robust, performant, and secure foundation for Gemini CLI integration in gemini-flow v1.0.4.*