 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>
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| let postcss = require('postcss')
 | |
| 
 | |
| let IMPORTANT = /\s*!important\s*$/i
 | |
| 
 | |
| let UNITLESS = {
 | |
|   'box-flex': true,
 | |
|   'box-flex-group': true,
 | |
|   'column-count': true,
 | |
|   'flex': true,
 | |
|   'flex-grow': true,
 | |
|   'flex-positive': true,
 | |
|   'flex-shrink': true,
 | |
|   'flex-negative': true,
 | |
|   'font-weight': true,
 | |
|   'line-clamp': true,
 | |
|   'line-height': true,
 | |
|   'opacity': true,
 | |
|   'order': true,
 | |
|   'orphans': true,
 | |
|   'tab-size': true,
 | |
|   'widows': true,
 | |
|   'z-index': true,
 | |
|   'zoom': true,
 | |
|   'fill-opacity': true,
 | |
|   'stroke-dashoffset': true,
 | |
|   'stroke-opacity': true,
 | |
|   'stroke-width': true
 | |
| }
 | |
| 
 | |
| function dashify(str) {
 | |
|   return str
 | |
|     .replace(/([A-Z])/g, '-$1')
 | |
|     .replace(/^ms-/, '-ms-')
 | |
|     .toLowerCase()
 | |
| }
 | |
| 
 | |
| function decl(parent, name, value) {
 | |
|   if (value === false || value === null) return
 | |
| 
 | |
|   if (!name.startsWith('--')) {
 | |
|     name = dashify(name)
 | |
|   }
 | |
| 
 | |
|   if (typeof value === 'number') {
 | |
|     if (value === 0 || UNITLESS[name]) {
 | |
|       value = value.toString()
 | |
|     } else {
 | |
|       value += 'px'
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (name === 'css-float') name = 'float'
 | |
| 
 | |
|   if (IMPORTANT.test(value)) {
 | |
|     value = value.replace(IMPORTANT, '')
 | |
|     parent.push(postcss.decl({ prop: name, value, important: true }))
 | |
|   } else {
 | |
|     parent.push(postcss.decl({ prop: name, value }))
 | |
|   }
 | |
| }
 | |
| 
 | |
| function atRule(parent, parts, value) {
 | |
|   let node = postcss.atRule({ name: parts[1], params: parts[3] || '' })
 | |
|   if (typeof value === 'object') {
 | |
|     node.nodes = []
 | |
|     parse(value, node)
 | |
|   }
 | |
|   parent.push(node)
 | |
| }
 | |
| 
 | |
| function parse(obj, parent) {
 | |
|   let name, value, node
 | |
|   for (name in obj) {
 | |
|     value = obj[name]
 | |
|     if (value === null || typeof value === 'undefined') {
 | |
|       continue
 | |
|     } else if (name[0] === '@') {
 | |
|       let parts = name.match(/@(\S+)(\s+([\W\w]*)\s*)?/)
 | |
|       if (Array.isArray(value)) {
 | |
|         for (let i of value) {
 | |
|           atRule(parent, parts, i)
 | |
|         }
 | |
|       } else {
 | |
|         atRule(parent, parts, value)
 | |
|       }
 | |
|     } else if (Array.isArray(value)) {
 | |
|       for (let i of value) {
 | |
|         decl(parent, name, i)
 | |
|       }
 | |
|     } else if (typeof value === 'object') {
 | |
|       node = postcss.rule({ selector: name })
 | |
|       parse(value, node)
 | |
|       parent.push(node)
 | |
|     } else {
 | |
|       decl(parent, name, value)
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = function (obj) {
 | |
|   let root = postcss.root()
 | |
|   parse(obj, root)
 | |
|   return root
 | |
| }
 |