- Implemented concurrent operations test to validate CLI and Web UI functionality simultaneously. - Developed error handling test to assess recovery mechanisms and error responses for various failure scenarios. - Created output streaming test to evaluate real-time output and ANSI color conversion. - Established performance test to measure latency, resource usage, and throughput. - Designed WebSocket test to ensure real-time command execution and message handling. - Added UI process ID tracking for better management of the UI component.
29 KiB
Console-Style Web UI: Complete Technical Specifications
Executive Summary
This document provides comprehensive technical specifications for implementing a console-style web UI for Claude Code that maintains backward compatibility while delivering real-time CLI output streaming and seamless user input handling. The architecture is designed with separation of concerns, security-first principles, and performance optimization.
System Overview
Architecture Philosophy
The console-style web UI architecture follows these core principles:
- Non-Intrusive Design: Minimal changes to existing CLI codebase
- Real-Time Performance: Sub-50ms latency for output streaming
- Security First: Comprehensive input validation and access control
- Backward Compatibility: Existing CLI functionality unchanged
- Scalable Architecture: Support for multiple concurrent sessions
- Console Fidelity: Authentic terminal experience in the browser
High-Level System Architecture
┌─────────────────────────────────────────────────────────────────┐
│ Browser Client Layer │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Terminal │ │ Input │ │ File │ │ Status │ │
│ │ Display │ │ Handler │ │ Manager │ │ Panel │ │
│ │ │ │ │ │ │ │ │ │
│ │ • ANSI │ │ • Command │ │ • Upload │ │ • Agents │ │
│ │ • History │ │ • Autocmpl │ │ • Preview │ │ • Tasks │ │
│ │ • Search │ │ • Shortcuts │ │ • Validate │ │ • Memory │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ WebSocket Connection
▼
┌─────────────────────────────────────────────────────────────────┐
│ Web Server Layer │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ WebSocket │ │ HTTP │ │ Session │ │ Security │ │
│ │ Server │ │ Server │ │ Manager │ │ Manager │ │
│ │ │ │ │ │ │ │ │ │
│ │ • Real-time │ │ • Static │ │ • State │ │ • Auth │ │
│ │ • Protocol │ │ • Upload │ │ • Persist │ │ • Validate │ │
│ │ • Broadcast │ │ • API │ │ • Sync │ │ • Filter │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ IPC/File System
▼
┌─────────────────────────────────────────────────────────────────┐
│ CLI Integration Layer │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Process │ │ Output │ │ Stream │ │ State │ │
│ │ Launcher │ │ Interceptor │ │ Manager │ │ Sync │ │
│ │ │ │ │ │ │ │ │ │
│ │ • Spawn │ │ • Capture │ │ • Multiplex │ │ • Monitor │ │
│ │ • Monitor │ │ • Filter │ │ • Buffer │ │ • Export │ │
│ │ • Control │ │ • Buffer │ │ • Distribute│ │ • Import │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ Environment Variables
▼
┌─────────────────────────────────────────────────────────────────┐
│ Existing Claude-Flow CLI │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │Orchestrator │ │ Terminal │ │ Memory │ │ Config │ │
│ │ │ │ Manager │ │ System │ │ Manager │ │
│ │ • Agents │ │ • Sessions │ │ • Banks │ │ • Settings │ │
│ │ • Tasks │ │ • Commands │ │ • Data │ │ • Profiles │ │
│ │ • Workflow │ │ • Lifecycle │ │ • Sync │ │ • Env │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Detailed Component Specifications
1. Browser Client Layer
Terminal Display Component
Purpose: Render CLI output with full terminal fidelity including ANSI colors, cursor positioning, and scrollback history.
Technical Specifications:
interface TerminalDisplayConfig {
// Display settings
rows: number; // Default: 24
cols: number; // Default: 80
scrollback: number; // Default: 1000 lines
// Rendering options
ansiSupport: boolean; // Default: true
cursorBlink: boolean; // Default: true
fontFamily: string; // Default: 'Monaco, Consolas, monospace'
fontSize: number; // Default: 14
lineHeight: number; // Default: 1.2
// Performance settings
renderThrottle: number; // Default: 16ms (60fps)
bufferSize: number; // Default: 64KB
lazyRender: boolean; // Default: true
}
interface TerminalDisplay {
// Core rendering
renderLine(line: string, ansiCodes: AnsiCode[]): void;
renderCursor(position: CursorPosition): void;
// Scrolling and navigation
scrollToBottom(): void;
scrollToTop(): void;
scrollToLine(lineNumber: number): void;
// Search functionality
search(query: string, options: SearchOptions): SearchResult[];
highlightText(text: string, className: string): void;
// Selection and copying
selectText(start: Position, end: Position): void;
copySelection(): string;
// Events
onScroll(callback: (position: number) => void): void;
onResize(callback: (size: TerminalSize) => void): void;
}
Implementation Details:
- Uses Canvas API for high-performance text rendering
- Implements virtual scrolling for large output buffers
- Supports full ANSI escape sequence parsing
- Provides smooth scrolling with momentum
- Includes text selection and copying capabilities
Input Handler Component
Purpose: Process user input with command history, autocomplete, and shortcut support.
Technical Specifications:
interface InputHandlerConfig {
// History settings
historySize: number; // Default: 1000
historyPersist: boolean; // Default: true
// Autocomplete settings
autocomplete: boolean; // Default: true
autocompleteMinChars: number; // Default: 2
autocompleteSources: string[]; // Commands, files, history
// Keyboard shortcuts
shortcuts: Map<string, ShortcutAction>;
// Input validation
maxLength: number; // Default: 4096
allowedChars: RegExp; // Default: /[\x20-\x7E\n\r\t]/
}
interface InputHandler {
// Input processing
processInput(input: string): Promise<ProcessedInput>;
handleKeyboard(event: KeyboardEvent): boolean;
// History management
addToHistory(command: string): void;
navigateHistory(direction: 'up' | 'down'): string;
searchHistory(query: string): string[];
// Autocomplete
getCompletions(partial: string): Promise<Completion[]>;
selectCompletion(completion: Completion): void;
// Shortcuts
registerShortcut(key: string, action: ShortcutAction): void;
executeShortcut(key: string): Promise<void>;
}
File Manager Component
Purpose: Handle file uploads, previews, and attachments for CLI commands.
Technical Specifications:
interface FileManagerConfig {
// Upload settings
maxFileSize: number; // Default: 100MB
allowedTypes: string[]; // MIME types
maxConcurrentUploads: number; // Default: 5
// Preview settings
previewTypes: string[]; // Text, image, JSON, etc.
previewMaxSize: number; // Default: 1MB
// Security settings
virusScanning: boolean; // Default: true
quarantineUploads: boolean; // Default: true
}
interface FileManager {
// Upload handling
handleDrop(files: FileList): Promise<UploadResult[]>;
uploadFile(file: File): Promise<AttachedFile>;
validateFile(file: File): ValidationResult;
// Preview generation
generatePreview(file: AttachedFile): Promise<FilePreview>;
// File operations
attachToCommand(fileId: string, command: string): void;
removeAttachment(fileId: string): void;
// Events
onUploadProgress(callback: (progress: UploadProgress) => void): void;
onUploadComplete(callback: (file: AttachedFile) => void): void;
}
2. Web Server Layer
WebSocket Server
Purpose: Provide real-time bidirectional communication between browser and CLI.
Technical Specifications:
interface WebSocketServerConfig {
// Connection settings
port: number; // Default: 3001
host: string; // Default: 'localhost'
maxConnections: number; // Default: 100
// Message settings
maxMessageSize: number; // Default: 1MB
compression: boolean; // Default: true
heartbeatInterval: number; // Default: 30s
// Security settings
cors: CorsConfig;
rateLimit: RateLimitConfig;
authentication: AuthConfig;
}
interface WebSocketServer {
// Connection management
start(): Promise<void>;
stop(): Promise<void>;
handleConnection(socket: WebSocket): void;
// Message handling
broadcast(message: WebSocketMessage): void;
sendToClient(clientId: string, message: WebSocketMessage): void;
sendToSession(sessionId: string, message: WebSocketMessage): void;
// Protocol handling
processMessage(socket: WebSocket, message: string): Promise<void>;
sendResponse(socket: WebSocket, response: WebSocketResponse): void;
// Events
onConnection(callback: (socket: WebSocket) => void): void;
onDisconnection(callback: (socket: WebSocket) => void): void;
onMessage(callback: (socket: WebSocket, message: any) => void): void;
}
HTTP Server
Purpose: Serve static assets, handle file uploads, and provide REST API endpoints.
Technical Specifications:
interface HTTPServerConfig {
// Server settings
port: number; // Default: 3000
host: string; // Default: 'localhost'
staticPath: string; // Default: './public'
// Upload settings
uploadPath: string; // Default: './uploads'
uploadTempPath: string; // Default: './tmp'
cleanupInterval: number; // Default: 1 hour
// Security settings
helmet: HelmetConfig;
cors: CorsConfig;
rateLimit: RateLimitConfig;
}
interface HTTPServer {
// Server lifecycle
start(): Promise<void>;
stop(): Promise<void>;
// Route handling
serveStatic(path: string): express.Handler;
handleUpload(req: Request, res: Response): Promise<void>;
handleAPI(req: Request, res: Response): Promise<void>;
// Middleware
setupSecurity(): void;
setupLogging(): void;
setupErrorHandling(): void;
}
3. CLI Integration Layer
Process Launcher
Purpose: Launch and manage CLI processes with output capture capabilities.
Technical Specifications:
interface ProcessLauncherConfig {
// Process settings
defaultTimeout: number; // Default: 300s
maxProcesses: number; // Default: 10
processCleanup: boolean; // Default: true
// Capture settings
captureOutput: boolean; // Default: true
bufferSize: number; // Default: 1MB
streamThrottle: number; // Default: 10ms
// Environment settings
inheritEnv: boolean; // Default: true
customEnv: Record<string, string>;
}
interface ProcessLauncher {
// Process management
launch(command: string[], options: LaunchOptions): Promise<ManagedProcess>;
terminate(processId: string, signal?: string): Promise<void>;
restart(processId: string): Promise<ManagedProcess>;
// Process monitoring
getStatus(processId: string): ProcessStatus;
listProcesses(): ProcessInfo[];
// Output handling
captureOutput(process: ManagedProcess): OutputCapture;
streamOutput(processId: string): AsyncIterable<OutputChunk>;
// Events
onProcessStart(callback: (process: ManagedProcess) => void): void;
onProcessExit(callback: (processId: string, code: number) => void): void;
onProcessError(callback: (processId: string, error: Error) => void): void;
}
Output Interceptor
Purpose: Capture and process CLI output streams with filtering and buffering.
Technical Specifications:
interface OutputInterceptorConfig {
// Buffer settings
bufferSize: number; // Default: 10MB
rotateSize: number; // Default: 1MB
maxBuffers: number; // Default: 10
// Filter settings
filterRules: FilterRule[];
enableFiltering: boolean; // Default: true
// Performance settings
batchSize: number; // Default: 4KB
flushInterval: number; // Default: 100ms
}
interface OutputInterceptor {
// Stream capture
interceptStream(stream: NodeJS.ReadableStream, type: StreamType): InterceptedStream;
// Filtering
applyFilters(data: Buffer): Buffer;
addFilter(rule: FilterRule): void;
removeFilter(ruleId: string): void;
// Buffering
bufferOutput(processId: string, data: Buffer, type: StreamType): void;
getBufferedOutput(processId: string, fromTime?: Date): BufferedOutput;
clearBuffer(processId: string): void;
// Events
onData(callback: (processId: string, data: Buffer, type: StreamType) => void): void;
onBuffer(callback: (processId: string, size: number) => void): void;
}
Data Flow Diagrams
1. Command Execution Flow
User Input (Web/CLI) → Input Router → Security Validator → Command Parser
↓
CLI Process ← Process Launcher ← Session Manager ← Command Executor
↓
Output Interceptor → Stream Manager → WebSocket Server → Browser
↓
Buffer Manager → Session State → Persistence Layer
2. File Upload Flow
File Drop/Select → File Validator → Virus Scanner → Temporary Storage
↓
File Metadata → Session Manager → CLI Access Path → Command Attachment
↓
Progress Updates → WebSocket → Browser Notification
3. Real-Time Streaming Flow
CLI Output → Output Interceptor → Filter Pipeline → Buffer Manager
↓
Stream Multiplexer → Client Manager → WebSocket Connections
↓
Multiple Browser Clients ← Message Queue ← Rate Limiter
4. Session Synchronization Flow
CLI State Change → State Export → File System/IPC → State Monitor
↓
Session Manager → State Merger → WebSocket Broadcast → Web Clients
↓
Persistence Layer → Database/File → Recovery System
API Specifications
WebSocket Protocol
Message Types
// Client to Server Messages
interface ClientMessage {
type: 'command' | 'file' | 'ping' | 'interrupt' | 'subscribe';
id: string;
timestamp: number;
payload: CommandPayload | FilePayload | SubscriptionPayload;
}
// Server to Client Messages
interface ServerMessage {
type: 'output' | 'error' | 'status' | 'pong' | 'notification';
id?: string;
timestamp: number;
payload: OutputPayload | StatusPayload | NotificationPayload;
}
Command Protocol
interface CommandPayload {
command: string;
sessionId: string;
workingDirectory?: string;
environment?: Record<string, string>;
attachments?: string[]; // File IDs
}
interface OutputPayload {
processId: string;
streamType: 'stdout' | 'stderr';
data: string;
sequence: number;
encoding: 'utf8' | 'base64';
}
interface StatusPayload {
sessionId: string;
status: SessionStatus;
agents: AgentStatus[];
tasks: TaskStatus[];
memory: MemoryStatus;
}
REST API Endpoints
interface APIEndpoints {
// Session management
'POST /api/sessions': {
body: CreateSessionRequest;
response: Session;
};
'GET /api/sessions/:id': {
response: Session;
};
'DELETE /api/sessions/:id': {
response: { success: boolean };
};
// File operations
'POST /api/files/upload': {
body: FormData;
response: AttachedFile;
};
'GET /api/files/:id': {
response: FileContent;
};
'DELETE /api/files/:id': {
response: { success: boolean };
};
// System status
'GET /api/status': {
response: SystemStatus;
};
'GET /api/health': {
response: HealthCheck;
};
// Configuration
'GET /api/config': {
response: SystemConfig;
};
'PUT /api/config': {
body: Partial<SystemConfig>;
response: SystemConfig;
};
}
Security Architecture
Authentication and Authorization
interface SecurityConfig {
// Authentication
authentication: {
required: boolean;
methods: ('token' | 'session' | 'basic')[];
tokenExpiry: number;
};
// Authorization
authorization: {
roleBasedAccess: boolean;
commandWhitelist: string[];
commandBlacklist: string[];
fileUploadPermissions: FilePermissions;
};
// Input validation
inputValidation: {
maxCommandLength: number;
allowedCharacters: RegExp;
injectionPrevention: boolean;
pathTraversalPrevention: boolean;
};
// Output filtering
outputFiltering: {
enableFiltering: boolean;
filterRules: FilterRule[];
sensitiveDataPatterns: RegExp[];
};
}
Input Sanitization
interface InputSanitizer {
// Command sanitization
sanitizeCommand(command: string): SanitizedCommand;
// File validation
validateFile(file: File): FileValidationResult;
// Path validation
validatePath(path: string): PathValidationResult;
// Environment validation
validateEnvironment(env: Record<string, string>): EnvValidationResult;
}
interface SanitizedCommand {
original: string;
sanitized: string;
warnings: string[];
blocked: boolean;
reason?: string;
}
Performance Specifications
Latency Requirements
| Operation | Target Latency | Max Acceptable |
|---|---|---|
| Command input processing | < 50ms | 100ms |
| Output streaming | < 25ms | 50ms |
| File upload (< 1MB) | < 500ms | 1s |
| Session creation | < 200ms | 500ms |
| WebSocket connection | < 100ms | 300ms |
Throughput Requirements
| Metric | Target | Peak |
|---|---|---|
| Concurrent sessions | 50 | 100 |
| Messages per second | 1,000 | 5,000 |
| Output lines per second | 10,000 | 50,000 |
| File uploads per minute | 100 | 500 |
| WebSocket connections | 200 | 1,000 |
Resource Limits
interface ResourceLimits {
// Memory
maxMemoryPerSession: number; // Default: 50MB
maxTotalMemory: number; // Default: 1GB
// CPU
maxCpuPerSession: number; // Default: 25%
maxTotalCpu: number; // Default: 80%
// Network
maxBandwidthPerSession: number; // Default: 10MB/s
maxTotalBandwidth: number; // Default: 100MB/s
// Storage
maxDiskPerSession: number; // Default: 100MB
maxTotalDisk: number; // Default: 10GB
}
Error Handling and Recovery
Error Classification
type ErrorClass =
| 'user_error' // Invalid input, permissions
| 'system_error' // Process crashes, network issues
| 'security_error' // Injection attempts, unauthorized access
| 'resource_error' // Memory, disk, CPU limits
| 'network_error' // Connection drops, timeouts
| 'cli_error'; // CLI process errors
interface ErrorHandler {
// Error processing
handleError(error: Error, context: ErrorContext): Promise<ErrorResponse>;
// Recovery strategies
attemptRecovery(error: Error, context: ErrorContext): Promise<RecoveryResult>;
// Error reporting
reportError(error: Error, context: ErrorContext): Promise<void>;
// Error metrics
getErrorMetrics(): ErrorMetrics;
}
Recovery Strategies
interface RecoveryStrategy {
// Process recovery
restartProcess(processId: string): Promise<boolean>;
// Session recovery
recoverSession(sessionId: string): Promise<boolean>;
// Connection recovery
reconnectClient(clientId: string): Promise<boolean>;
// State recovery
restoreState(sessionId: string, checkpoint?: string): Promise<boolean>;
}
Testing Strategy
Test Categories
- Unit Tests: Individual component testing
- Integration Tests: Component interaction testing
- End-to-End Tests: Full workflow testing
- Performance Tests: Load and stress testing
- Security Tests: Penetration and vulnerability testing
Test Coverage Requirements
| Component | Unit Tests | Integration Tests | E2E Tests |
|---|---|---|---|
| Input Router | 95% | 90% | 80% |
| Output Interceptor | 95% | 90% | 85% |
| WebSocket Server | 90% | 95% | 90% |
| Security Validator | 98% | 95% | 90% |
| File Handler | 90% | 85% | 80% |
Performance Test Scenarios
interface PerformanceTestSuite {
// Load tests
concurrentSessions: LoadTest;
highThroughputOutput: LoadTest;
bulkFileUploads: LoadTest;
// Stress tests
memoryStress: StressTest;
cpuStress: StressTest;
networkStress: StressTest;
// Endurance tests
longRunningSession: EnduranceTest;
memoryLeakDetection: EnduranceTest;
connectionStability: EnduranceTest;
}
Implementation Roadmap
Phase 1: Core Infrastructure (4 weeks)
- Output capture system implementation
- WebSocket server setup
- Basic web UI shell
- Process launcher development
- Security foundation
Phase 2: Input Processing (3 weeks)
- Command parser implementation
- Input router development
- Security validator
- Session manager
- Basic file handling
Phase 3: Advanced Features (4 weeks)
- Real-time streaming optimization
- Multi-client support
- File upload system
- Advanced UI features
- Performance optimization
Phase 4: Integration and Testing (3 weeks)
- CLI integration completion
- Comprehensive testing
- Security hardening
- Performance tuning
- Documentation completion
Phase 5: Deployment and Monitoring (2 weeks)
- Production deployment setup
- Monitoring and logging
- Error tracking
- Performance monitoring
- User acceptance testing
Configuration Management
Environment Configuration
interface EnvironmentConfig {
// Environment type
NODE_ENV: 'development' | 'staging' | 'production';
// Server settings
WEB_SERVER_PORT: number;
WEB_SERVER_HOST: string;
WEBSOCKET_PORT: number;
// CLI integration
CLAUDE_FLOW_PATH: string;
CLI_OUTPUT_PATH: string;
CLI_STATE_PATH: string;
// Security
AUTH_SECRET: string;
CORS_ORIGINS: string[];
RATE_LIMIT_MAX: number;
// Performance
MAX_CONCURRENT_SESSIONS: number;
OUTPUT_BUFFER_SIZE: number;
FILE_UPLOAD_MAX_SIZE: number;
// Logging
LOG_LEVEL: 'debug' | 'info' | 'warn' | 'error';
LOG_FILE_PATH: string;
}
Feature Flags
interface FeatureFlags {
// Core features
webUiEnabled: boolean;
realTimeStreaming: boolean;
fileUploadEnabled: boolean;
// Advanced features
multiClientSupport: boolean;
sessionPersistence: boolean;
outputFiltering: boolean;
// Experimental features
aiAssistance: boolean;
collaborativeEditing: boolean;
advancedTerminal: boolean;
// Security features
authenticationRequired: boolean;
virusScanningEnabled: boolean;
rateLimitingEnabled: boolean;
}
Monitoring and Observability
Metrics Collection
interface SystemMetrics {
// Performance metrics
responseTime: HistogramMetric;
throughput: CounterMetric;
errorRate: GaugeMetric;
// Resource metrics
memoryUsage: GaugeMetric;
cpuUsage: GaugeMetric;
diskUsage: GaugeMetric;
// Business metrics
activeSessions: GaugeMetric;
commandsExecuted: CounterMetric;
filesUploaded: CounterMetric;
// System health
processStatus: GaugeMetric;
connectionStatus: GaugeMetric;
serviceStatus: GaugeMetric;
}
Logging Strategy
interface LoggingConfig {
// Log levels
levels: ('debug' | 'info' | 'warn' | 'error' | 'fatal')[];
// Log targets
targets: LogTarget[];
// Log format
format: 'json' | 'text' | 'structured';
// Log rotation
rotation: {
enabled: boolean;
maxSize: string;
maxFiles: number;
interval: string;
};
// Sensitive data handling
sanitization: {
enabled: boolean;
patterns: RegExp[];
replacement: string;
};
}
Summary
This comprehensive technical specification provides:
- Complete Architecture: Detailed system design with clear separation of concerns
- Security First: Comprehensive security measures throughout the system
- Performance Optimized: Sub-50ms latency targets with scalable architecture
- Backward Compatible: Full compatibility with existing CLI operations
- Production Ready: Monitoring, logging, and error handling specifications
- Maintainable: Clear interfaces and modular design
- Testable: Comprehensive testing strategy and coverage requirements
The architecture ensures that the console-style web UI provides an authentic terminal experience while maintaining the full functionality and reliability of the existing claude-flow CLI system. The design supports real-time collaboration, file handling, and multi-session management while preserving security and performance standards.