 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>
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { invariant } from '../../utils/errors.mjs';
 | |
| import { setValues } from '../../render/utils/setters.mjs';
 | |
| import { animateVisualElement } from '../interfaces/visual-element.mjs';
 | |
| 
 | |
| function stopAnimation(visualElement) {
 | |
|     visualElement.values.forEach((value) => value.stop());
 | |
| }
 | |
| /**
 | |
|  * @public
 | |
|  */
 | |
| function animationControls() {
 | |
|     /**
 | |
|      * Track whether the host component has mounted.
 | |
|      */
 | |
|     let hasMounted = false;
 | |
|     /**
 | |
|      * A collection of linked component animation controls.
 | |
|      */
 | |
|     const subscribers = new Set();
 | |
|     const controls = {
 | |
|         subscribe(visualElement) {
 | |
|             subscribers.add(visualElement);
 | |
|             return () => void subscribers.delete(visualElement);
 | |
|         },
 | |
|         start(definition, transitionOverride) {
 | |
|             invariant(hasMounted, "controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.");
 | |
|             const animations = [];
 | |
|             subscribers.forEach((visualElement) => {
 | |
|                 animations.push(animateVisualElement(visualElement, definition, {
 | |
|                     transitionOverride,
 | |
|                 }));
 | |
|             });
 | |
|             return Promise.all(animations);
 | |
|         },
 | |
|         set(definition) {
 | |
|             invariant(hasMounted, "controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.");
 | |
|             return subscribers.forEach((visualElement) => {
 | |
|                 setValues(visualElement, definition);
 | |
|             });
 | |
|         },
 | |
|         stop() {
 | |
|             subscribers.forEach((visualElement) => {
 | |
|                 stopAnimation(visualElement);
 | |
|             });
 | |
|         },
 | |
|         mount() {
 | |
|             hasMounted = true;
 | |
|             return () => {
 | |
|                 hasMounted = false;
 | |
|                 controls.stop();
 | |
|             };
 | |
|         },
 | |
|     };
 | |
|     return controls;
 | |
| }
 | |
| 
 | |
| export { animationControls };
 |