 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>
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { isSeq, isPair, isMap } from '../../nodes/identity.js';
 | |
| import { createPair, Pair } from '../../nodes/Pair.js';
 | |
| import { Scalar } from '../../nodes/Scalar.js';
 | |
| import { YAMLSeq } from '../../nodes/YAMLSeq.js';
 | |
| 
 | |
| function resolvePairs(seq, onError) {
 | |
|     if (isSeq(seq)) {
 | |
|         for (let i = 0; i < seq.items.length; ++i) {
 | |
|             let item = seq.items[i];
 | |
|             if (isPair(item))
 | |
|                 continue;
 | |
|             else if (isMap(item)) {
 | |
|                 if (item.items.length > 1)
 | |
|                     onError('Each pair must have its own sequence indicator');
 | |
|                 const pair = item.items[0] || new Pair(new Scalar(null));
 | |
|                 if (item.commentBefore)
 | |
|                     pair.key.commentBefore = pair.key.commentBefore
 | |
|                         ? `${item.commentBefore}\n${pair.key.commentBefore}`
 | |
|                         : item.commentBefore;
 | |
|                 if (item.comment) {
 | |
|                     const cn = pair.value ?? pair.key;
 | |
|                     cn.comment = cn.comment
 | |
|                         ? `${item.comment}\n${cn.comment}`
 | |
|                         : item.comment;
 | |
|                 }
 | |
|                 item = pair;
 | |
|             }
 | |
|             seq.items[i] = isPair(item) ? item : new Pair(item);
 | |
|         }
 | |
|     }
 | |
|     else
 | |
|         onError('Expected a sequence for this tag');
 | |
|     return seq;
 | |
| }
 | |
| function createPairs(schema, iterable, ctx) {
 | |
|     const { replacer } = ctx;
 | |
|     const pairs = new YAMLSeq(schema);
 | |
|     pairs.tag = 'tag:yaml.org,2002:pairs';
 | |
|     let i = 0;
 | |
|     if (iterable && Symbol.iterator in Object(iterable))
 | |
|         for (let it of iterable) {
 | |
|             if (typeof replacer === 'function')
 | |
|                 it = replacer.call(iterable, String(i++), it);
 | |
|             let key, value;
 | |
|             if (Array.isArray(it)) {
 | |
|                 if (it.length === 2) {
 | |
|                     key = it[0];
 | |
|                     value = it[1];
 | |
|                 }
 | |
|                 else
 | |
|                     throw new TypeError(`Expected [key, value] tuple: ${it}`);
 | |
|             }
 | |
|             else if (it && it instanceof Object) {
 | |
|                 const keys = Object.keys(it);
 | |
|                 if (keys.length === 1) {
 | |
|                     key = keys[0];
 | |
|                     value = it[key];
 | |
|                 }
 | |
|                 else {
 | |
|                     throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`);
 | |
|                 }
 | |
|             }
 | |
|             else {
 | |
|                 key = it;
 | |
|             }
 | |
|             pairs.items.push(createPair(key, value, ctx));
 | |
|         }
 | |
|     return pairs;
 | |
| }
 | |
| const pairs = {
 | |
|     collection: 'seq',
 | |
|     default: false,
 | |
|     tag: 'tag:yaml.org,2002:pairs',
 | |
|     resolve: resolvePairs,
 | |
|     createNode: createPairs
 | |
| };
 | |
| 
 | |
| export { createPairs, pairs, resolvePairs };
 |