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>
		
			
				
	
	
		
			68 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.parse = parse;
 | |
| // imported from https://github.com/galkn/parseuri
 | |
| /**
 | |
|  * Parses a URI
 | |
|  *
 | |
|  * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.
 | |
|  *
 | |
|  * See:
 | |
|  * - https://developer.mozilla.org/en-US/docs/Web/API/URL
 | |
|  * - https://caniuse.com/url
 | |
|  * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B
 | |
|  *
 | |
|  * History of the parse() method:
 | |
|  * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c
 | |
|  * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3
 | |
|  * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242
 | |
|  *
 | |
|  * @author Steven Levithan <stevenlevithan.com> (MIT license)
 | |
|  * @api private
 | |
|  */
 | |
| const re = /^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;
 | |
| const parts = [
 | |
|     'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'
 | |
| ];
 | |
| function parse(str) {
 | |
|     if (str.length > 8000) {
 | |
|         throw "URI too long";
 | |
|     }
 | |
|     const src = str, b = str.indexOf('['), e = str.indexOf(']');
 | |
|     if (b != -1 && e != -1) {
 | |
|         str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);
 | |
|     }
 | |
|     let m = re.exec(str || ''), uri = {}, i = 14;
 | |
|     while (i--) {
 | |
|         uri[parts[i]] = m[i] || '';
 | |
|     }
 | |
|     if (b != -1 && e != -1) {
 | |
|         uri.source = src;
 | |
|         uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');
 | |
|         uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');
 | |
|         uri.ipv6uri = true;
 | |
|     }
 | |
|     uri.pathNames = pathNames(uri, uri['path']);
 | |
|     uri.queryKey = queryKey(uri, uri['query']);
 | |
|     return uri;
 | |
| }
 | |
| function pathNames(obj, path) {
 | |
|     const regx = /\/{2,9}/g, names = path.replace(regx, "/").split("/");
 | |
|     if (path.slice(0, 1) == '/' || path.length === 0) {
 | |
|         names.splice(0, 1);
 | |
|     }
 | |
|     if (path.slice(-1) == '/') {
 | |
|         names.splice(names.length - 1, 1);
 | |
|     }
 | |
|     return names;
 | |
| }
 | |
| function queryKey(uri, query) {
 | |
|     const data = {};
 | |
|     query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {
 | |
|         if ($1) {
 | |
|             data[$1] = $2;
 | |
|         }
 | |
|     });
 | |
|     return data;
 | |
| }
 |