mirror of
https://github.com/codeflash-ai/codeflash-internal.git
synced 2026-05-04 18:25:18 +00:00
depends on https://github.com/codeflash-ai/codeflash/pull/688, https://github.com/codeflash-ai/codeflash-internal/pull/1767 --------- Signed-off-by: ali <mohammed18200118@gmail.com> Co-authored-by: Sarthak Agarwal <sarthak.saga@gmail.com>
12 KiB
12 KiB
Codeflash Architecture Documentation
📐 System Overview
Codeflash is a VS Code extension that provides intelligent Python code optimization through a Language Server Protocol (LSP) implementation with advanced async processing and user experience enhancements.
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ VS Code UI │ │ Extension Host │ │ Language Server │
│ │ │ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ CodeLens │◄┼────┼►│ Providers │◄┼────┼►│ Python LSP │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ Sidebar │◄┼────┼►│ Services │◄┼────┼►│ Optimization│ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ │
│ │ Webview UI │◄┼────┼►│ Utils │ │ │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
🏗️ Core Components
1. Extension Host (src/extension.ts)
Primary entry point with enhanced error handling and lifecycle management
Key Responsibilities:
- Multi-step Activation: Validates Python environment, initializes LSP, registers providers
- Error Categorization: Python Environment, Language Server, Startup Timeout errors
- Service Orchestration: Manages lifecycle of all services and providers
- User Guidance: Provides actionable error messages and troubleshooting steps
Enhanced Features:
// Robust activation with timeout handling
export async function activate(
context: vscode.ExtensionContext,
): Promise<void> {
// Step 1: Validate Python environment
// Step 2: Initialize LSP Service
// Step 3: Start LSP Client with timeout (30s)
// Step 4: Initialize services
// Step 5: Register providers
// Enhanced error handling with user guidance
}
2. CodeLens Provider (src/providers/CodeLensProvider.ts)
Intelligent inline suggestions with async processing
Architecture Improvements:
class CodeflashCodeLensProvider {
// Async processing with progress callbacks
private async generateOptimizationSuggestions(
lines: string[],
functionNames: string[],
onProgress?: ProgressCallback,
): Promise<OptimizationSuggestion[]>;
// Background processing queue
private _backgroundRefreshQueue = new Set<string>();
private _isBackgroundRefreshing = false;
// Smart caching with automatic invalidation
private _cachedSuggestions = new Map<string, OptimizationSuggestion[]>();
}
Key Features:
- Chunked Processing: Prevents UI blocking on large files (3 functions per chunk)
- Concurrent Analysis: Parallel issue detection and improvement suggestions
- Background Refresh: Queue-based continuous improvement
- Smart Caching: Efficient analysis with automatic cache invalidation
- Error Recovery: Categorized error handling with user actions
3. Sidebar Provider (src/providers/SidebarProvider.ts)
Enhanced UX with detailed progress tracking
Progress Tracking System:
// Step-by-step optimization tracking
private async optimizeWithProgressTracking(functionName: string, uri: vscode.Uri) {
// Step 1: Discovery phase
this.sendOptimizationStepUpdate(functionName, 0, 'in_progress');
// Step 2: Generation phase
this.sendOptimizationStepUpdate(functionName, 1, 'in_progress');
// Real-time UI updates with specific metrics
}
Features:
- Real-time Progress: Step completion with live counts (e.g., "Discovered 5 tests")
- Error Recovery: Detailed failure reporting with specific step information
- State Management: Robust LSP connection state handling
4. Services Layer
LSP Service (src/services/lspService.ts)
class LspService {
async startClient(pythonPath: string): Promise<LanguageClient> {
// Enhanced startup with timeout and retry logic
// Connection state monitoring
// Detailed error reporting
}
}
Optimization Service (src/services/optimizationService.ts)
class OptimizationService {
// Exposed async methods for progress tracking
async executeStep1(
functionName: string,
uriString: string,
): Promise<OptimizationResponse>;
async executeStep2(functionName: string): Promise<OptimizationResponse>;
async extractFunctionCode(
uri: vscode.Uri,
functionName: string,
): Promise<string>;
extractOptimizedCode(response: OptimizationResponse): string;
}
🔄 Async Processing Architecture
1. Chunked Analysis
// Process functions in chunks to prevent UI blocking
const chunkSize = 3;
for (let i = 0; i < functionNames.length; i += chunkSize) {
const chunk = functionNames.slice(i, i + chunkSize);
// Process chunk concurrently
const chunkSuggestions = await Promise.all(
chunk.map(async (functionName, index) => {
// Progress callback for real-time updates
onProgress?.(i + index + 1, functionNames.length, functionName);
// Yield control periodically
if (i + index > 0 && (i + index) % chunkSize === 0) {
await new Promise((resolve) => setTimeout(resolve, 10));
}
return this.analyzeFunction(lines, functionName);
}),
);
}
2. Background Processing Queue
class CodeflashCodeLensProvider {
private async processBackgroundQueue(): Promise<void> {
if (
this._isBackgroundRefreshing ||
this._backgroundRefreshQueue.size === 0
) {
return;
}
this._isBackgroundRefreshing = true;
try {
for (const uri of this._backgroundRefreshQueue) {
await this.refreshSuggestionsForUri(uri);
// Yield control between operations
await new Promise((resolve) => setTimeout(resolve, 50));
}
} finally {
this._isBackgroundRefreshing = false;
}
}
}
3. Progress Callbacks
// Real-time progress updates during analysis
const suggestions = await this.generateOptimizationSuggestions(
lines,
result.functions,
(current, total, functionName) => {
this._logger.debug(
`Analyzing function ${current}/${total}: ${functionName}`,
);
// Could send to UI for progress bar updates
},
);
🛡️ Error Handling Strategy
1. Categorized Error Handling
// Extension activation errors
if (errorMessage.includes("Python") || errorMessage.includes("interpreter")) {
category = "Python Environment";
troubleshootingHint = "Ensure Python 3.8+ is installed and in your PATH";
} else if (
errorMessage.includes("LSP") ||
errorMessage.includes("Language Server")
) {
category = "Language Server";
troubleshootingHint = "The Codeflash LSP server failed to start";
} else if (errorMessage.includes("timeout")) {
category = "Startup Timeout";
troubleshootingHint = "Startup took too long. Check system performance";
}
2. User-Centric Error Recovery
// Actionable error messages with recovery options
const action = await vscode.window.showErrorMessage(
`Codeflash failed to activate (${category}): ${errorMessage}`,
"Show Details",
"Open Logs",
"Disable Extension",
"Report Issue",
);
// Specific actions for each error type
if (action === "Show Details") {
// Detailed troubleshooting information
} else if (action === "Open Logs") {
vscode.commands.executeCommand("workbench.action.openWindowLog");
}
3. Graceful Degradation
// CodeLens provider graceful degradation
if (this._lspClient.state !== LanguageClientState.Running) {
this._logger.warn(`CodeLens requested but LSP client not running`);
if (this._lspClient.state === LanguageClientState.Stopped) {
// User-friendly message with recovery action
vscode.window.showWarningMessage(
"Codeflash Language Server is not running",
"Restart Extension",
);
}
return []; // Graceful failure - no suggestions but no crash
}
📊 Performance Optimizations
1. Smart Caching
interface CachedSuggestion {
suggestions: OptimizationSuggestion[];
timestamp: number;
documentVersion: number;
}
// Cache with automatic invalidation
private shouldRefresh(uri: string, document: vscode.TextDocument): boolean {
const cached = this._cache.get(uri);
return !cached ||
cached.documentVersion !== document.version ||
Date.now() - cached.timestamp > 5 * 60 * 1000; // 5 min cache
}
2. Memory Management
// Proper cleanup in dispose methods
public dispose(): void {
this._cachedSuggestions.clear();
this._backgroundRefreshQueue.clear();
this._isBackgroundRefreshing = false;
vscode.Disposable.from(...this._disposables).dispose();
}
3. Concurrent Operations
// Parallel analysis of issues and improvements
const [issues, improvements] = await Promise.all([
this.analyzeCodeIssuesAsync(lines, position, functionName),
this.suggestImprovementsAsync(lines, position, functionName),
]);
🎯 Future Architecture Considerations
1. Scalability Improvements
- Worker Threads: Move heavy analysis to background workers
- Incremental Analysis: Only analyze changed functions
- Cloud Processing: Offload complex analysis to cloud services
2. AI Integration Points
- ML Models: Integrate with code analysis AI models
- Pattern Learning: Learn from user optimization patterns
- Predictive Analysis: Suggest optimizations before issues occur
3. Multi-Language Support
- Language Abstraction: Generic analysis interfaces
- Provider Registration: Dynamic language provider system
- Shared Infrastructure: Common async processing and UI components
4. Enterprise Features
- Team Analytics: Shared optimization metrics
- Policy Enforcement: Organizational coding standards
- Audit Logging: Detailed optimization history
🔧 Development Guidelines
1. Adding New Async Features
- Use Chunked Processing: Process data in small chunks with yielding
- Implement Progress Callbacks: Provide real-time feedback
- Add Background Queuing: Queue non-critical operations
- Include Error Recovery: Categorize errors and provide actions
2. Error Handling Best Practices
- Categorize Errors: Group by type for better user guidance
- Provide Actions: Always offer recovery options
- Log Details: Comprehensive logging for debugging
- Graceful Degradation: Never crash, always provide partial functionality
3. Performance Considerations
- Cache Strategically: Cache expensive operations with smart invalidation
- Profile Regularly: Monitor memory and CPU usage
- Optimize Hot Paths: Focus on frequently called code
- Test Edge Cases: Large files, slow systems, network issues
This architecture provides a robust, scalable foundation for Codeflash's continued evolution while maintaining excellent user experience and reliability.