 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>
		
			
				
	
	
		
			160 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import {flowParseAssignableListItemTypes} from "../plugins/flow";
 | |
| import {tsParseAssignableListItemTypes, tsParseModifiers} from "../plugins/typescript";
 | |
| import {
 | |
|   eat,
 | |
|   IdentifierRole,
 | |
|   match,
 | |
|   next,
 | |
|   popTypeContext,
 | |
|   pushTypeContext,
 | |
| } from "../tokenizer/index";
 | |
| import {ContextualKeyword} from "../tokenizer/keywords";
 | |
| import {TokenType, TokenType as tt} from "../tokenizer/types";
 | |
| import {isFlowEnabled, isTypeScriptEnabled, state} from "./base";
 | |
| import {parseIdentifier, parseMaybeAssign, parseObj} from "./expression";
 | |
| import {expect, unexpected} from "./util";
 | |
| 
 | |
| export function parseSpread() {
 | |
|   next();
 | |
|   parseMaybeAssign(false);
 | |
| }
 | |
| 
 | |
| export function parseRest(isBlockScope) {
 | |
|   next();
 | |
|   parseBindingAtom(isBlockScope);
 | |
| }
 | |
| 
 | |
| export function parseBindingIdentifier(isBlockScope) {
 | |
|   parseIdentifier();
 | |
|   markPriorBindingIdentifier(isBlockScope);
 | |
| }
 | |
| 
 | |
| export function parseImportedIdentifier() {
 | |
|   parseIdentifier();
 | |
|   state.tokens[state.tokens.length - 1].identifierRole = IdentifierRole.ImportDeclaration;
 | |
| }
 | |
| 
 | |
| export function markPriorBindingIdentifier(isBlockScope) {
 | |
|   let identifierRole;
 | |
|   if (state.scopeDepth === 0) {
 | |
|     identifierRole = IdentifierRole.TopLevelDeclaration;
 | |
|   } else if (isBlockScope) {
 | |
|     identifierRole = IdentifierRole.BlockScopedDeclaration;
 | |
|   } else {
 | |
|     identifierRole = IdentifierRole.FunctionScopedDeclaration;
 | |
|   }
 | |
|   state.tokens[state.tokens.length - 1].identifierRole = identifierRole;
 | |
| }
 | |
| 
 | |
| // Parses lvalue (assignable) atom.
 | |
| export function parseBindingAtom(isBlockScope) {
 | |
|   switch (state.type) {
 | |
|     case tt._this: {
 | |
|       // In TypeScript, "this" may be the name of a parameter, so allow it.
 | |
|       const oldIsType = pushTypeContext(0);
 | |
|       next();
 | |
|       popTypeContext(oldIsType);
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     case tt._yield:
 | |
|     case tt.name: {
 | |
|       state.type = tt.name;
 | |
|       parseBindingIdentifier(isBlockScope);
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     case tt.bracketL: {
 | |
|       next();
 | |
|       parseBindingList(tt.bracketR, isBlockScope, true /* allowEmpty */);
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     case tt.braceL:
 | |
|       parseObj(true, isBlockScope);
 | |
|       return;
 | |
| 
 | |
|     default:
 | |
|       unexpected();
 | |
|   }
 | |
| }
 | |
| 
 | |
| export function parseBindingList(
 | |
|   close,
 | |
|   isBlockScope,
 | |
|   allowEmpty = false,
 | |
|   allowModifiers = false,
 | |
|   contextId = 0,
 | |
| ) {
 | |
|   let first = true;
 | |
| 
 | |
|   let hasRemovedComma = false;
 | |
|   const firstItemTokenIndex = state.tokens.length;
 | |
| 
 | |
|   while (!eat(close) && !state.error) {
 | |
|     if (first) {
 | |
|       first = false;
 | |
|     } else {
 | |
|       expect(tt.comma);
 | |
|       state.tokens[state.tokens.length - 1].contextId = contextId;
 | |
|       // After a "this" type in TypeScript, we need to set the following comma (if any) to also be
 | |
|       // a type token so that it will be removed.
 | |
|       if (!hasRemovedComma && state.tokens[firstItemTokenIndex].isType) {
 | |
|         state.tokens[state.tokens.length - 1].isType = true;
 | |
|         hasRemovedComma = true;
 | |
|       }
 | |
|     }
 | |
|     if (allowEmpty && match(tt.comma)) {
 | |
|       // Empty item; nothing further to parse for this item.
 | |
|     } else if (eat(close)) {
 | |
|       break;
 | |
|     } else if (match(tt.ellipsis)) {
 | |
|       parseRest(isBlockScope);
 | |
|       parseAssignableListItemTypes();
 | |
|       // Support rest element trailing commas allowed by TypeScript <2.9.
 | |
|       eat(TokenType.comma);
 | |
|       expect(close);
 | |
|       break;
 | |
|     } else {
 | |
|       parseAssignableListItem(allowModifiers, isBlockScope);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function parseAssignableListItem(allowModifiers, isBlockScope) {
 | |
|   if (allowModifiers) {
 | |
|     tsParseModifiers([
 | |
|       ContextualKeyword._public,
 | |
|       ContextualKeyword._protected,
 | |
|       ContextualKeyword._private,
 | |
|       ContextualKeyword._readonly,
 | |
|       ContextualKeyword._override,
 | |
|     ]);
 | |
|   }
 | |
| 
 | |
|   parseMaybeDefault(isBlockScope);
 | |
|   parseAssignableListItemTypes();
 | |
|   parseMaybeDefault(isBlockScope, true /* leftAlreadyParsed */);
 | |
| }
 | |
| 
 | |
| function parseAssignableListItemTypes() {
 | |
|   if (isFlowEnabled) {
 | |
|     flowParseAssignableListItemTypes();
 | |
|   } else if (isTypeScriptEnabled) {
 | |
|     tsParseAssignableListItemTypes();
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Parses assignment pattern around given atom if possible.
 | |
| export function parseMaybeDefault(isBlockScope, leftAlreadyParsed = false) {
 | |
|   if (!leftAlreadyParsed) {
 | |
|     parseBindingAtom(isBlockScope);
 | |
|   }
 | |
|   if (!eat(tt.eq)) {
 | |
|     return;
 | |
|   }
 | |
|   const eqIndex = state.tokens.length - 1;
 | |
|   parseMaybeAssign();
 | |
|   state.tokens[eqIndex].rhsEndIndex = state.tokens.length;
 | |
| }
 |