 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>
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| let browserslist = require('browserslist')
 | |
| let { agents } = require('caniuse-lite/dist/unpacker/agents')
 | |
| 
 | |
| let utils = require('./utils')
 | |
| 
 | |
| class Browsers {
 | |
|   constructor(data, requirements, options, browserslistOpts) {
 | |
|     this.data = data
 | |
|     this.options = options || {}
 | |
|     this.browserslistOpts = browserslistOpts || {}
 | |
|     this.selected = this.parse(requirements)
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Return all prefixes for default browser data
 | |
|    */
 | |
|   static prefixes() {
 | |
|     if (this.prefixesCache) {
 | |
|       return this.prefixesCache
 | |
|     }
 | |
| 
 | |
|     this.prefixesCache = []
 | |
|     for (let name in agents) {
 | |
|       this.prefixesCache.push(`-${agents[name].prefix}-`)
 | |
|     }
 | |
| 
 | |
|     this.prefixesCache = utils
 | |
|       .uniq(this.prefixesCache)
 | |
|       .sort((a, b) => b.length - a.length)
 | |
| 
 | |
|     return this.prefixesCache
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Check is value contain any possible prefix
 | |
|    */
 | |
|   static withPrefix(value) {
 | |
|     if (!this.prefixesRegexp) {
 | |
|       this.prefixesRegexp = new RegExp(this.prefixes().join('|'))
 | |
|     }
 | |
| 
 | |
|     return this.prefixesRegexp.test(value)
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Is browser is selected by requirements
 | |
|    */
 | |
|   isSelected(browser) {
 | |
|     return this.selected.includes(browser)
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Return browsers selected by requirements
 | |
|    */
 | |
|   parse(requirements) {
 | |
|     let opts = {}
 | |
|     for (let i in this.browserslistOpts) {
 | |
|       opts[i] = this.browserslistOpts[i]
 | |
|     }
 | |
|     opts.path = this.options.from
 | |
|     return browserslist(requirements, opts)
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Return prefix for selected browser
 | |
|    */
 | |
|   prefix(browser) {
 | |
|     let [name, version] = browser.split(' ')
 | |
|     let data = this.data[name]
 | |
| 
 | |
|     let prefix = data.prefix_exceptions && data.prefix_exceptions[version]
 | |
|     if (!prefix) {
 | |
|       prefix = data.prefix
 | |
|     }
 | |
|     return `-${prefix}-`
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = Browsers
 |