 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>
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { globalThisShim as globalThis } from "./globals.node.js";
 | |
| export function pick(obj, ...attr) {
 | |
|     return attr.reduce((acc, k) => {
 | |
|         if (obj.hasOwnProperty(k)) {
 | |
|             acc[k] = obj[k];
 | |
|         }
 | |
|         return acc;
 | |
|     }, {});
 | |
| }
 | |
| // Keep a reference to the real timeout functions so they can be used when overridden
 | |
| const NATIVE_SET_TIMEOUT = globalThis.setTimeout;
 | |
| const NATIVE_CLEAR_TIMEOUT = globalThis.clearTimeout;
 | |
| export function installTimerFunctions(obj, opts) {
 | |
|     if (opts.useNativeTimers) {
 | |
|         obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);
 | |
|         obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);
 | |
|     }
 | |
|     else {
 | |
|         obj.setTimeoutFn = globalThis.setTimeout.bind(globalThis);
 | |
|         obj.clearTimeoutFn = globalThis.clearTimeout.bind(globalThis);
 | |
|     }
 | |
| }
 | |
| // base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)
 | |
| const BASE64_OVERHEAD = 1.33;
 | |
| // we could also have used `new Blob([obj]).size`, but it isn't supported in IE9
 | |
| export function byteLength(obj) {
 | |
|     if (typeof obj === "string") {
 | |
|         return utf8Length(obj);
 | |
|     }
 | |
|     // arraybuffer or blob
 | |
|     return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);
 | |
| }
 | |
| function utf8Length(str) {
 | |
|     let c = 0, length = 0;
 | |
|     for (let i = 0, l = str.length; i < l; i++) {
 | |
|         c = str.charCodeAt(i);
 | |
|         if (c < 0x80) {
 | |
|             length += 1;
 | |
|         }
 | |
|         else if (c < 0x800) {
 | |
|             length += 2;
 | |
|         }
 | |
|         else if (c < 0xd800 || c >= 0xe000) {
 | |
|             length += 3;
 | |
|         }
 | |
|         else {
 | |
|             i++;
 | |
|             length += 4;
 | |
|         }
 | |
|     }
 | |
|     return length;
 | |
| }
 | |
| /**
 | |
|  * Generates a random 8-characters string.
 | |
|  */
 | |
| export function randomString() {
 | |
|     return (Date.now().toString(36).substring(3) +
 | |
|         Math.random().toString(36).substring(2, 5));
 | |
| }
 |