 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>
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { isScalar, isCollection } from '../nodes/identity.js';
 | |
| import { visit } from '../visit.js';
 | |
| 
 | |
| /**
 | |
|  * Verify that the input string is a valid anchor.
 | |
|  *
 | |
|  * Will throw on errors.
 | |
|  */
 | |
| function anchorIsValid(anchor) {
 | |
|     if (/[\x00-\x19\s,[\]{}]/.test(anchor)) {
 | |
|         const sa = JSON.stringify(anchor);
 | |
|         const msg = `Anchor must not contain whitespace or control characters: ${sa}`;
 | |
|         throw new Error(msg);
 | |
|     }
 | |
|     return true;
 | |
| }
 | |
| function anchorNames(root) {
 | |
|     const anchors = new Set();
 | |
|     visit(root, {
 | |
|         Value(_key, node) {
 | |
|             if (node.anchor)
 | |
|                 anchors.add(node.anchor);
 | |
|         }
 | |
|     });
 | |
|     return anchors;
 | |
| }
 | |
| /** Find a new anchor name with the given `prefix` and a one-indexed suffix. */
 | |
| function findNewAnchor(prefix, exclude) {
 | |
|     for (let i = 1; true; ++i) {
 | |
|         const name = `${prefix}${i}`;
 | |
|         if (!exclude.has(name))
 | |
|             return name;
 | |
|     }
 | |
| }
 | |
| function createNodeAnchors(doc, prefix) {
 | |
|     const aliasObjects = [];
 | |
|     const sourceObjects = new Map();
 | |
|     let prevAnchors = null;
 | |
|     return {
 | |
|         onAnchor: (source) => {
 | |
|             aliasObjects.push(source);
 | |
|             prevAnchors ?? (prevAnchors = anchorNames(doc));
 | |
|             const anchor = findNewAnchor(prefix, prevAnchors);
 | |
|             prevAnchors.add(anchor);
 | |
|             return anchor;
 | |
|         },
 | |
|         /**
 | |
|          * With circular references, the source node is only resolved after all
 | |
|          * of its child nodes are. This is why anchors are set only after all of
 | |
|          * the nodes have been created.
 | |
|          */
 | |
|         setAnchors: () => {
 | |
|             for (const source of aliasObjects) {
 | |
|                 const ref = sourceObjects.get(source);
 | |
|                 if (typeof ref === 'object' &&
 | |
|                     ref.anchor &&
 | |
|                     (isScalar(ref.node) || isCollection(ref.node))) {
 | |
|                     ref.node.anchor = ref.anchor;
 | |
|                 }
 | |
|                 else {
 | |
|                     const error = new Error('Failed to resolve repeated object (this should not happen)');
 | |
|                     error.source = source;
 | |
|                     throw error;
 | |
|                 }
 | |
|             }
 | |
|         },
 | |
|         sourceObjects
 | |
|     };
 | |
| }
 | |
| 
 | |
| export { anchorIsValid, anchorNames, createNodeAnchors, findNewAnchor };
 |