 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>
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { PanSession } from './PanSession.mjs';
 | |
| import { addPointerEvent } from '../../events/add-pointer-event.mjs';
 | |
| import { Feature } from '../../motion/features/Feature.mjs';
 | |
| import { noop } from '../../utils/noop.mjs';
 | |
| import { getContextWindow } from '../../utils/get-context-window.mjs';
 | |
| import { frame } from '../../frameloop/frame.mjs';
 | |
| 
 | |
| const asyncHandler = (handler) => (event, info) => {
 | |
|     if (handler) {
 | |
|         frame.update(() => handler(event, info));
 | |
|     }
 | |
| };
 | |
| class PanGesture extends Feature {
 | |
|     constructor() {
 | |
|         super(...arguments);
 | |
|         this.removePointerDownListener = noop;
 | |
|     }
 | |
|     onPointerDown(pointerDownEvent) {
 | |
|         this.session = new PanSession(pointerDownEvent, this.createPanHandlers(), {
 | |
|             transformPagePoint: this.node.getTransformPagePoint(),
 | |
|             contextWindow: getContextWindow(this.node),
 | |
|         });
 | |
|     }
 | |
|     createPanHandlers() {
 | |
|         const { onPanSessionStart, onPanStart, onPan, onPanEnd } = this.node.getProps();
 | |
|         return {
 | |
|             onSessionStart: asyncHandler(onPanSessionStart),
 | |
|             onStart: asyncHandler(onPanStart),
 | |
|             onMove: onPan,
 | |
|             onEnd: (event, info) => {
 | |
|                 delete this.session;
 | |
|                 if (onPanEnd) {
 | |
|                     frame.update(() => onPanEnd(event, info));
 | |
|                 }
 | |
|             },
 | |
|         };
 | |
|     }
 | |
|     mount() {
 | |
|         this.removePointerDownListener = addPointerEvent(this.node.current, "pointerdown", (event) => this.onPointerDown(event));
 | |
|     }
 | |
|     update() {
 | |
|         this.session && this.session.updateHandlers(this.createPanHandlers());
 | |
|     }
 | |
|     unmount() {
 | |
|         this.removePointerDownListener();
 | |
|         this.session && this.session.end();
 | |
|     }
 | |
| }
 | |
| 
 | |
| export { PanGesture };
 |