 d7ad321176
			
		
	
	d7ad321176
	
	
	
		
			
			This comprehensive implementation includes: - FastAPI backend with MCP server integration - React/TypeScript frontend with Vite - PostgreSQL database with Redis caching - Grafana/Prometheus monitoring stack - Docker Compose orchestration - Full MCP protocol support for Claude Code integration Features: - Agent discovery and management across network - Visual workflow editor and execution engine - Real-time task coordination and monitoring - Multi-model support with specialized agents - Distributed development task allocation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			230 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import platform from "../platform/index.js";
 | |
| import utils from "../utils.js";
 | |
| import AxiosError from "../core/AxiosError.js";
 | |
| import composeSignals from "../helpers/composeSignals.js";
 | |
| import {trackStream} from "../helpers/trackStream.js";
 | |
| import AxiosHeaders from "../core/AxiosHeaders.js";
 | |
| import {progressEventReducer, progressEventDecorator, asyncDecorator} from "../helpers/progressEventReducer.js";
 | |
| import resolveConfig from "../helpers/resolveConfig.js";
 | |
| import settle from "../core/settle.js";
 | |
| 
 | |
| const isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';
 | |
| const isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';
 | |
| 
 | |
| // used only inside the fetch adapter
 | |
| const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?
 | |
|     ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :
 | |
|     async (str) => new Uint8Array(await new Response(str).arrayBuffer())
 | |
| );
 | |
| 
 | |
| const test = (fn, ...args) => {
 | |
|   try {
 | |
|     return !!fn(...args);
 | |
|   } catch (e) {
 | |
|     return false
 | |
|   }
 | |
| }
 | |
| 
 | |
| const supportsRequestStream = isReadableStreamSupported && test(() => {
 | |
|   let duplexAccessed = false;
 | |
| 
 | |
|   const hasContentType = new Request(platform.origin, {
 | |
|     body: new ReadableStream(),
 | |
|     method: 'POST',
 | |
|     get duplex() {
 | |
|       duplexAccessed = true;
 | |
|       return 'half';
 | |
|     },
 | |
|   }).headers.has('Content-Type');
 | |
| 
 | |
|   return duplexAccessed && !hasContentType;
 | |
| });
 | |
| 
 | |
| const DEFAULT_CHUNK_SIZE = 64 * 1024;
 | |
| 
 | |
| const supportsResponseStream = isReadableStreamSupported &&
 | |
|   test(() => utils.isReadableStream(new Response('').body));
 | |
| 
 | |
| 
 | |
| const resolvers = {
 | |
|   stream: supportsResponseStream && ((res) => res.body)
 | |
| };
 | |
| 
 | |
| isFetchSupported && (((res) => {
 | |
|   ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {
 | |
|     !resolvers[type] && (resolvers[type] = utils.isFunction(res[type]) ? (res) => res[type]() :
 | |
|       (_, config) => {
 | |
|         throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);
 | |
|       })
 | |
|   });
 | |
| })(new Response));
 | |
| 
 | |
| const getBodyLength = async (body) => {
 | |
|   if (body == null) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   if(utils.isBlob(body)) {
 | |
|     return body.size;
 | |
|   }
 | |
| 
 | |
|   if(utils.isSpecCompliantForm(body)) {
 | |
|     const _request = new Request(platform.origin, {
 | |
|       method: 'POST',
 | |
|       body,
 | |
|     });
 | |
|     return (await _request.arrayBuffer()).byteLength;
 | |
|   }
 | |
| 
 | |
|   if(utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {
 | |
|     return body.byteLength;
 | |
|   }
 | |
| 
 | |
|   if(utils.isURLSearchParams(body)) {
 | |
|     body = body + '';
 | |
|   }
 | |
| 
 | |
|   if(utils.isString(body)) {
 | |
|     return (await encodeText(body)).byteLength;
 | |
|   }
 | |
| }
 | |
| 
 | |
| const resolveBodyLength = async (headers, body) => {
 | |
|   const length = utils.toFiniteNumber(headers.getContentLength());
 | |
| 
 | |
|   return length == null ? getBodyLength(body) : length;
 | |
| }
 | |
| 
 | |
| export default isFetchSupported && (async (config) => {
 | |
|   let {
 | |
|     url,
 | |
|     method,
 | |
|     data,
 | |
|     signal,
 | |
|     cancelToken,
 | |
|     timeout,
 | |
|     onDownloadProgress,
 | |
|     onUploadProgress,
 | |
|     responseType,
 | |
|     headers,
 | |
|     withCredentials = 'same-origin',
 | |
|     fetchOptions
 | |
|   } = resolveConfig(config);
 | |
| 
 | |
|   responseType = responseType ? (responseType + '').toLowerCase() : 'text';
 | |
| 
 | |
|   let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);
 | |
| 
 | |
|   let request;
 | |
| 
 | |
|   const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {
 | |
|       composedSignal.unsubscribe();
 | |
|   });
 | |
| 
 | |
|   let requestContentLength;
 | |
| 
 | |
|   try {
 | |
|     if (
 | |
|       onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&
 | |
|       (requestContentLength = await resolveBodyLength(headers, data)) !== 0
 | |
|     ) {
 | |
|       let _request = new Request(url, {
 | |
|         method: 'POST',
 | |
|         body: data,
 | |
|         duplex: "half"
 | |
|       });
 | |
| 
 | |
|       let contentTypeHeader;
 | |
| 
 | |
|       if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {
 | |
|         headers.setContentType(contentTypeHeader)
 | |
|       }
 | |
| 
 | |
|       if (_request.body) {
 | |
|         const [onProgress, flush] = progressEventDecorator(
 | |
|           requestContentLength,
 | |
|           progressEventReducer(asyncDecorator(onUploadProgress))
 | |
|         );
 | |
| 
 | |
|         data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (!utils.isString(withCredentials)) {
 | |
|       withCredentials = withCredentials ? 'include' : 'omit';
 | |
|     }
 | |
| 
 | |
|     // Cloudflare Workers throws when credentials are defined
 | |
|     // see https://github.com/cloudflare/workerd/issues/902
 | |
|     const isCredentialsSupported = "credentials" in Request.prototype;
 | |
|     request = new Request(url, {
 | |
|       ...fetchOptions,
 | |
|       signal: composedSignal,
 | |
|       method: method.toUpperCase(),
 | |
|       headers: headers.normalize().toJSON(),
 | |
|       body: data,
 | |
|       duplex: "half",
 | |
|       credentials: isCredentialsSupported ? withCredentials : undefined
 | |
|     });
 | |
| 
 | |
|     let response = await fetch(request, fetchOptions);
 | |
| 
 | |
|     const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');
 | |
| 
 | |
|     if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
 | |
|       const options = {};
 | |
| 
 | |
|       ['status', 'statusText', 'headers'].forEach(prop => {
 | |
|         options[prop] = response[prop];
 | |
|       });
 | |
| 
 | |
|       const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));
 | |
| 
 | |
|       const [onProgress, flush] = onDownloadProgress && progressEventDecorator(
 | |
|         responseContentLength,
 | |
|         progressEventReducer(asyncDecorator(onDownloadProgress), true)
 | |
|       ) || [];
 | |
| 
 | |
|       response = new Response(
 | |
|         trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
 | |
|           flush && flush();
 | |
|           unsubscribe && unsubscribe();
 | |
|         }),
 | |
|         options
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     responseType = responseType || 'text';
 | |
| 
 | |
|     let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);
 | |
| 
 | |
|     !isStreamResponse && unsubscribe && unsubscribe();
 | |
| 
 | |
|     return await new Promise((resolve, reject) => {
 | |
|       settle(resolve, reject, {
 | |
|         data: responseData,
 | |
|         headers: AxiosHeaders.from(response.headers),
 | |
|         status: response.status,
 | |
|         statusText: response.statusText,
 | |
|         config,
 | |
|         request
 | |
|       })
 | |
|     })
 | |
|   } catch (err) {
 | |
|     unsubscribe && unsubscribe();
 | |
| 
 | |
|     if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {
 | |
|       throw Object.assign(
 | |
|         new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),
 | |
|         {
 | |
|           cause: err.cause || err
 | |
|         }
 | |
|       )
 | |
|     }
 | |
| 
 | |
|     throw AxiosError.from(err, err && err.code, config, request);
 | |
|   }
 | |
| });
 | |
| 
 | |
| 
 |