 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>
		
			
				
	
	
		
			175 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @fileoverview Enforce newlines between operands of ternary expressions
 | |
|  * @author Kai Cataldo
 | |
|  * @deprecated in ESLint v8.53.0
 | |
|  */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const astUtils = require("./utils/ast-utils");
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Rule Definition
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /** @type {import('../shared/types').Rule} */
 | |
| module.exports = {
 | |
|     meta: {
 | |
|         deprecated: true,
 | |
|         replacedBy: [],
 | |
|         type: "layout",
 | |
| 
 | |
|         docs: {
 | |
|             description: "Enforce newlines between operands of ternary expressions",
 | |
|             recommended: false,
 | |
|             url: "https://eslint.org/docs/latest/rules/multiline-ternary"
 | |
|         },
 | |
| 
 | |
|         schema: [
 | |
|             {
 | |
|                 enum: ["always", "always-multiline", "never"]
 | |
|             }
 | |
|         ],
 | |
| 
 | |
|         messages: {
 | |
|             expectedTestCons: "Expected newline between test and consequent of ternary expression.",
 | |
|             expectedConsAlt: "Expected newline between consequent and alternate of ternary expression.",
 | |
|             unexpectedTestCons: "Unexpected newline between test and consequent of ternary expression.",
 | |
|             unexpectedConsAlt: "Unexpected newline between consequent and alternate of ternary expression."
 | |
|         },
 | |
| 
 | |
|         fixable: "whitespace"
 | |
|     },
 | |
| 
 | |
|     create(context) {
 | |
|         const sourceCode = context.sourceCode;
 | |
|         const option = context.options[0];
 | |
|         const multiline = option !== "never";
 | |
|         const allowSingleLine = option === "always-multiline";
 | |
| 
 | |
|         //--------------------------------------------------------------------------
 | |
|         // Public
 | |
|         //--------------------------------------------------------------------------
 | |
| 
 | |
|         return {
 | |
|             ConditionalExpression(node) {
 | |
|                 const questionToken = sourceCode.getTokenAfter(node.test, astUtils.isNotClosingParenToken);
 | |
|                 const colonToken = sourceCode.getTokenAfter(node.consequent, astUtils.isNotClosingParenToken);
 | |
| 
 | |
|                 const firstTokenOfTest = sourceCode.getFirstToken(node);
 | |
|                 const lastTokenOfTest = sourceCode.getTokenBefore(questionToken);
 | |
|                 const firstTokenOfConsequent = sourceCode.getTokenAfter(questionToken);
 | |
|                 const lastTokenOfConsequent = sourceCode.getTokenBefore(colonToken);
 | |
|                 const firstTokenOfAlternate = sourceCode.getTokenAfter(colonToken);
 | |
| 
 | |
|                 const areTestAndConsequentOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfTest, firstTokenOfConsequent);
 | |
|                 const areConsequentAndAlternateOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfConsequent, firstTokenOfAlternate);
 | |
| 
 | |
|                 const hasComments = !!sourceCode.getCommentsInside(node).length;
 | |
| 
 | |
|                 if (!multiline) {
 | |
|                     if (!areTestAndConsequentOnSameLine) {
 | |
|                         context.report({
 | |
|                             node: node.test,
 | |
|                             loc: {
 | |
|                                 start: firstTokenOfTest.loc.start,
 | |
|                                 end: lastTokenOfTest.loc.end
 | |
|                             },
 | |
|                             messageId: "unexpectedTestCons",
 | |
|                             fix(fixer) {
 | |
|                                 if (hasComments) {
 | |
|                                     return null;
 | |
|                                 }
 | |
|                                 const fixers = [];
 | |
|                                 const areTestAndQuestionOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfTest, questionToken);
 | |
|                                 const areQuestionAndConsOnSameLine = astUtils.isTokenOnSameLine(questionToken, firstTokenOfConsequent);
 | |
| 
 | |
|                                 if (!areTestAndQuestionOnSameLine) {
 | |
|                                     fixers.push(fixer.removeRange([lastTokenOfTest.range[1], questionToken.range[0]]));
 | |
|                                 }
 | |
|                                 if (!areQuestionAndConsOnSameLine) {
 | |
|                                     fixers.push(fixer.removeRange([questionToken.range[1], firstTokenOfConsequent.range[0]]));
 | |
|                                 }
 | |
| 
 | |
|                                 return fixers;
 | |
|                             }
 | |
|                         });
 | |
|                     }
 | |
| 
 | |
|                     if (!areConsequentAndAlternateOnSameLine) {
 | |
|                         context.report({
 | |
|                             node: node.consequent,
 | |
|                             loc: {
 | |
|                                 start: firstTokenOfConsequent.loc.start,
 | |
|                                 end: lastTokenOfConsequent.loc.end
 | |
|                             },
 | |
|                             messageId: "unexpectedConsAlt",
 | |
|                             fix(fixer) {
 | |
|                                 if (hasComments) {
 | |
|                                     return null;
 | |
|                                 }
 | |
|                                 const fixers = [];
 | |
|                                 const areConsAndColonOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfConsequent, colonToken);
 | |
|                                 const areColonAndAltOnSameLine = astUtils.isTokenOnSameLine(colonToken, firstTokenOfAlternate);
 | |
| 
 | |
|                                 if (!areConsAndColonOnSameLine) {
 | |
|                                     fixers.push(fixer.removeRange([lastTokenOfConsequent.range[1], colonToken.range[0]]));
 | |
|                                 }
 | |
|                                 if (!areColonAndAltOnSameLine) {
 | |
|                                     fixers.push(fixer.removeRange([colonToken.range[1], firstTokenOfAlternate.range[0]]));
 | |
|                                 }
 | |
| 
 | |
|                                 return fixers;
 | |
|                             }
 | |
|                         });
 | |
|                     }
 | |
|                 } else {
 | |
|                     if (allowSingleLine && node.loc.start.line === node.loc.end.line) {
 | |
|                         return;
 | |
|                     }
 | |
| 
 | |
|                     if (areTestAndConsequentOnSameLine) {
 | |
|                         context.report({
 | |
|                             node: node.test,
 | |
|                             loc: {
 | |
|                                 start: firstTokenOfTest.loc.start,
 | |
|                                 end: lastTokenOfTest.loc.end
 | |
|                             },
 | |
|                             messageId: "expectedTestCons",
 | |
|                             fix: fixer => (hasComments ? null : (
 | |
|                                 fixer.replaceTextRange(
 | |
|                                     [
 | |
|                                         lastTokenOfTest.range[1],
 | |
|                                         questionToken.range[0]
 | |
|                                     ],
 | |
|                                     "\n"
 | |
|                                 )
 | |
|                             ))
 | |
|                         });
 | |
|                     }
 | |
| 
 | |
|                     if (areConsequentAndAlternateOnSameLine) {
 | |
|                         context.report({
 | |
|                             node: node.consequent,
 | |
|                             loc: {
 | |
|                                 start: firstTokenOfConsequent.loc.start,
 | |
|                                 end: lastTokenOfConsequent.loc.end
 | |
|                             },
 | |
|                             messageId: "expectedConsAlt",
 | |
|                             fix: (fixer => (hasComments ? null : (
 | |
|                                 fixer.replaceTextRange(
 | |
|                                     [
 | |
|                                         lastTokenOfConsequent.range[1],
 | |
|                                         colonToken.range[0]
 | |
|                                     ],
 | |
|                                     "\n"
 | |
|                                 )
 | |
|                             )))
 | |
|                         });
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         };
 | |
|     }
 | |
| };
 |