 85bf1341f3
			
		
	
	85bf1341f3
	
	
	
		
			
			Frontend Enhancements: - Complete React TypeScript frontend with modern UI components - Distributed workflows management interface with real-time updates - Socket.IO integration for live agent status monitoring - Agent management dashboard with cluster visualization - Project management interface with metrics and task tracking - Responsive design with proper error handling and loading states Backend Infrastructure: - Distributed coordinator for multi-agent workflow orchestration - Cluster management API with comprehensive agent operations - Enhanced database models for agents and projects - Project service for filesystem-based project discovery - Performance monitoring and metrics collection - Comprehensive API documentation and error handling Documentation: - Complete distributed development guide (README_DISTRIBUTED.md) - Comprehensive development report with architecture insights - System configuration templates and deployment guides The platform now provides a complete web interface for managing the distributed AI cluster with real-time monitoring, workflow orchestration, and agent coordination capabilities. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import stripAnsi from 'strip-ansi';
 | |
| import eastAsianWidth from 'eastasianwidth';
 | |
| import emojiRegex from 'emoji-regex';
 | |
| 
 | |
| export default function stringWidth(string, options = {}) {
 | |
| 	if (typeof string !== 'string' || string.length === 0) {
 | |
| 		return 0;
 | |
| 	}
 | |
| 
 | |
| 	options = {
 | |
| 		ambiguousIsNarrow: true,
 | |
| 		...options
 | |
| 	};
 | |
| 
 | |
| 	string = stripAnsi(string);
 | |
| 
 | |
| 	if (string.length === 0) {
 | |
| 		return 0;
 | |
| 	}
 | |
| 
 | |
| 	string = string.replace(emojiRegex(), '  ');
 | |
| 
 | |
| 	const ambiguousCharacterWidth = options.ambiguousIsNarrow ? 1 : 2;
 | |
| 	let width = 0;
 | |
| 
 | |
| 	for (const character of string) {
 | |
| 		const codePoint = character.codePointAt(0);
 | |
| 
 | |
| 		// Ignore control characters
 | |
| 		if (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {
 | |
| 			continue;
 | |
| 		}
 | |
| 
 | |
| 		// Ignore combining characters
 | |
| 		if (codePoint >= 0x300 && codePoint <= 0x36F) {
 | |
| 			continue;
 | |
| 		}
 | |
| 
 | |
| 		const code = eastAsianWidth.eastAsianWidth(character);
 | |
| 		switch (code) {
 | |
| 			case 'F':
 | |
| 			case 'W':
 | |
| 				width += 2;
 | |
| 				break;
 | |
| 			case 'A':
 | |
| 				width += ambiguousCharacterWidth;
 | |
| 				break;
 | |
| 			default:
 | |
| 				width += 1;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return width;
 | |
| }
 |