 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>
		
			
				
	
	
		
			75 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { useContext, useRef, useInsertionEffect, useEffect } from 'react';
 | |
| import { PresenceContext } from '../../context/PresenceContext.mjs';
 | |
| import { MotionContext } from '../../context/MotionContext/index.mjs';
 | |
| import { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';
 | |
| import { LazyContext } from '../../context/LazyContext.mjs';
 | |
| import { MotionConfigContext } from '../../context/MotionConfigContext.mjs';
 | |
| import { optimizedAppearDataAttribute } from '../../animation/optimized-appear/data-id.mjs';
 | |
| 
 | |
| function useVisualElement(Component, visualState, props, createVisualElement) {
 | |
|     const { visualElement: parent } = useContext(MotionContext);
 | |
|     const lazyContext = useContext(LazyContext);
 | |
|     const presenceContext = useContext(PresenceContext);
 | |
|     const reducedMotionConfig = useContext(MotionConfigContext).reducedMotion;
 | |
|     const visualElementRef = useRef();
 | |
|     /**
 | |
|      * If we haven't preloaded a renderer, check to see if we have one lazy-loaded
 | |
|      */
 | |
|     createVisualElement = createVisualElement || lazyContext.renderer;
 | |
|     if (!visualElementRef.current && createVisualElement) {
 | |
|         visualElementRef.current = createVisualElement(Component, {
 | |
|             visualState,
 | |
|             parent,
 | |
|             props,
 | |
|             presenceContext,
 | |
|             blockInitialAnimation: presenceContext
 | |
|                 ? presenceContext.initial === false
 | |
|                 : false,
 | |
|             reducedMotionConfig,
 | |
|         });
 | |
|     }
 | |
|     const visualElement = visualElementRef.current;
 | |
|     useInsertionEffect(() => {
 | |
|         visualElement && visualElement.update(props, presenceContext);
 | |
|     });
 | |
|     /**
 | |
|      * Cache this value as we want to know whether HandoffAppearAnimations
 | |
|      * was present on initial render - it will be deleted after this.
 | |
|      */
 | |
|     const wantsHandoff = useRef(Boolean(props[optimizedAppearDataAttribute] && !window.HandoffComplete));
 | |
|     useIsomorphicLayoutEffect(() => {
 | |
|         if (!visualElement)
 | |
|             return;
 | |
|         visualElement.render();
 | |
|         /**
 | |
|          * Ideally this function would always run in a useEffect.
 | |
|          *
 | |
|          * However, if we have optimised appear animations to handoff from,
 | |
|          * it needs to happen synchronously to ensure there's no flash of
 | |
|          * incorrect styles in the event of a hydration error.
 | |
|          *
 | |
|          * So if we detect a situtation where optimised appear animations
 | |
|          * are running, we use useLayoutEffect to trigger animations.
 | |
|          */
 | |
|         if (wantsHandoff.current && visualElement.animationState) {
 | |
|             visualElement.animationState.animateChanges();
 | |
|         }
 | |
|     });
 | |
|     useEffect(() => {
 | |
|         if (!visualElement)
 | |
|             return;
 | |
|         visualElement.updateFeatures();
 | |
|         if (!wantsHandoff.current && visualElement.animationState) {
 | |
|             visualElement.animationState.animateChanges();
 | |
|         }
 | |
|         if (wantsHandoff.current) {
 | |
|             wantsHandoff.current = false;
 | |
|             // This ensures all future calls to animateChanges() will run in useEffect
 | |
|             window.HandoffComplete = true;
 | |
|         }
 | |
|     });
 | |
|     return visualElement;
 | |
| }
 | |
| 
 | |
| export { useVisualElement };
 |