codeflash-internal/js/VSC-Extension/ARCHITECTURE.md
mohammed ahmed 549b42b6f1
[VSC] React sidebar & reduce bundle size (#1761)
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>
2025-09-04 18:58:54 +05:30

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

  1. Use Chunked Processing: Process data in small chunks with yielding
  2. Implement Progress Callbacks: Provide real-time feedback
  3. Add Background Queuing: Queue non-critical operations
  4. Include Error Recovery: Categorize errors and provide actions

2. Error Handling Best Practices

  1. Categorize Errors: Group by type for better user guidance
  2. Provide Actions: Always offer recovery options
  3. Log Details: Comprehensive logging for debugging
  4. Graceful Degradation: Never crash, always provide partial functionality

3. Performance Considerations

  1. Cache Strategically: Cache expensive operations with smart invalidation
  2. Profile Regularly: Monitor memory and CPU usage
  3. Optimize Hot Paths: Focus on frequently called code
  4. 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.