 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>
		
			
				
	
	
		
			143 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { decodePacket } from "engine.io-parser";
 | |
| import { Emitter } from "@socket.io/component-emitter";
 | |
| import { installTimerFunctions } from "./util.js";
 | |
| import { encode } from "./contrib/parseqs.js";
 | |
| export class TransportError extends Error {
 | |
|     constructor(reason, description, context) {
 | |
|         super(reason);
 | |
|         this.description = description;
 | |
|         this.context = context;
 | |
|         this.type = "TransportError";
 | |
|     }
 | |
| }
 | |
| export class Transport extends Emitter {
 | |
|     /**
 | |
|      * Transport abstract constructor.
 | |
|      *
 | |
|      * @param {Object} opts - options
 | |
|      * @protected
 | |
|      */
 | |
|     constructor(opts) {
 | |
|         super();
 | |
|         this.writable = false;
 | |
|         installTimerFunctions(this, opts);
 | |
|         this.opts = opts;
 | |
|         this.query = opts.query;
 | |
|         this.socket = opts.socket;
 | |
|         this.supportsBinary = !opts.forceBase64;
 | |
|     }
 | |
|     /**
 | |
|      * Emits an error.
 | |
|      *
 | |
|      * @param {String} reason
 | |
|      * @param description
 | |
|      * @param context - the error context
 | |
|      * @return {Transport} for chaining
 | |
|      * @protected
 | |
|      */
 | |
|     onError(reason, description, context) {
 | |
|         super.emitReserved("error", new TransportError(reason, description, context));
 | |
|         return this;
 | |
|     }
 | |
|     /**
 | |
|      * Opens the transport.
 | |
|      */
 | |
|     open() {
 | |
|         this.readyState = "opening";
 | |
|         this.doOpen();
 | |
|         return this;
 | |
|     }
 | |
|     /**
 | |
|      * Closes the transport.
 | |
|      */
 | |
|     close() {
 | |
|         if (this.readyState === "opening" || this.readyState === "open") {
 | |
|             this.doClose();
 | |
|             this.onClose();
 | |
|         }
 | |
|         return this;
 | |
|     }
 | |
|     /**
 | |
|      * Sends multiple packets.
 | |
|      *
 | |
|      * @param {Array} packets
 | |
|      */
 | |
|     send(packets) {
 | |
|         if (this.readyState === "open") {
 | |
|             this.write(packets);
 | |
|         }
 | |
|         else {
 | |
|             // this might happen if the transport was silently closed in the beforeunload event handler
 | |
|         }
 | |
|     }
 | |
|     /**
 | |
|      * Called upon open
 | |
|      *
 | |
|      * @protected
 | |
|      */
 | |
|     onOpen() {
 | |
|         this.readyState = "open";
 | |
|         this.writable = true;
 | |
|         super.emitReserved("open");
 | |
|     }
 | |
|     /**
 | |
|      * Called with data.
 | |
|      *
 | |
|      * @param {String} data
 | |
|      * @protected
 | |
|      */
 | |
|     onData(data) {
 | |
|         const packet = decodePacket(data, this.socket.binaryType);
 | |
|         this.onPacket(packet);
 | |
|     }
 | |
|     /**
 | |
|      * Called with a decoded packet.
 | |
|      *
 | |
|      * @protected
 | |
|      */
 | |
|     onPacket(packet) {
 | |
|         super.emitReserved("packet", packet);
 | |
|     }
 | |
|     /**
 | |
|      * Called upon close.
 | |
|      *
 | |
|      * @protected
 | |
|      */
 | |
|     onClose(details) {
 | |
|         this.readyState = "closed";
 | |
|         super.emitReserved("close", details);
 | |
|     }
 | |
|     /**
 | |
|      * Pauses the transport, in order not to lose packets during an upgrade.
 | |
|      *
 | |
|      * @param onPause
 | |
|      */
 | |
|     pause(onPause) { }
 | |
|     createUri(schema, query = {}) {
 | |
|         return (schema +
 | |
|             "://" +
 | |
|             this._hostname() +
 | |
|             this._port() +
 | |
|             this.opts.path +
 | |
|             this._query(query));
 | |
|     }
 | |
|     _hostname() {
 | |
|         const hostname = this.opts.hostname;
 | |
|         return hostname.indexOf(":") === -1 ? hostname : "[" + hostname + "]";
 | |
|     }
 | |
|     _port() {
 | |
|         if (this.opts.port &&
 | |
|             ((this.opts.secure && Number(this.opts.port !== 443)) ||
 | |
|                 (!this.opts.secure && Number(this.opts.port) !== 80))) {
 | |
|             return ":" + this.opts.port;
 | |
|         }
 | |
|         else {
 | |
|             return "";
 | |
|         }
 | |
|     }
 | |
|     _query(query) {
 | |
|         const encodedQuery = encode(query);
 | |
|         return encodedQuery.length ? "?" + encodedQuery : "";
 | |
|     }
 | |
| }
 |