Loading...
Loading...
Agent skill for mesh-coordinator - invoke with $agent-mesh-coordinator
npx skill4agent add ruvnet/ruflo agent-mesh-coordinator 🌐 MESH TOPOLOGY
A ←→ B ←→ C
↕ ↕ ↕
D ←→ E ←→ F
↕ ↕ ↕
G ←→ H ←→ IPurpose: Information dissemination across the network
Process:
1. Each node periodically selects random peers
2. Exchange state information and updates
3. Propagate changes throughout network
4. Eventually consistent global state
Implementation:
- Gossip interval: 2-5 seconds
- Fanout factor: 3-5 peers per round
- Anti-entropy mechanisms for consistencyByzantine Fault Tolerance:
- Tolerates up to 33% malicious or failed nodes
- Multi-round voting with cryptographic signatures
- Quorum requirements for decision approval
Practical Byzantine Fault Tolerance (pBFT):
- Pre-prepare, prepare, commit phases
- View changes for leader failures
- Checkpoint and garbage collectionBootstrap Process:
1. Join network via known seed nodes
2. Receive peer list and network topology
3. Establish connections with neighboring peers
4. Begin participating in consensus and coordination
Dynamic Discovery:
- Periodic peer announcements
- Reputation-based peer selection
- Network partitioning detection and healingclass WorkStealingProtocol:
def __init__(self):
self.local_queue = TaskQueue()
self.peer_connections = PeerNetwork()
def steal_work(self):
if self.local_queue.is_empty():
# Find overloaded peers
candidates = self.find_busy_peers()
for peer in candidates:
stolen_task = peer.request_task()
if stolen_task:
self.local_queue.add(stolen_task)
break
def distribute_work(self, task):
if self.is_overloaded():
# Find underutilized peers
target_peer = self.find_available_peer()
if target_peer:
target_peer.assign_task(task)
return
self.local_queue.add(task)class TaskDistributionDHT:
def route_task(self, task):
# Hash task ID to determine responsible node
hash_value = consistent_hash(task.id)
responsible_node = self.find_node_by_hash(hash_value)
if responsible_node == self:
self.execute_task(task)
else:
responsible_node.forward_task(task)
def replicate_task(self, task, replication_factor=3):
# Store copies on multiple nodes for fault tolerance
successor_nodes = self.get_successors(replication_factor)
for node in successor_nodes:
node.store_task_copy(task)class TaskAuction:
def conduct_auction(self, task):
# Broadcast task to all peers
bids = self.broadcast_task_request(task)
# Evaluate bids based on:
evaluated_bids = []
for bid in bids:
score = self.evaluate_bid(bid, criteria={
'capability_match': 0.4,
'current_load': 0.3,
'past_performance': 0.2,
'resource_availability': 0.1
})
evaluated_bids.append((bid, score))
# Award to highest scorer
winner = max(evaluated_bids, key=lambda x: x[1])
return self.award_task(task, winner[0])# Initialize mesh network
mcp__claude-flow__swarm_init mesh --maxAgents=12 --strategy=distributed
# Establish peer connections
mcp__claude-flow__daa_communication --from="node-1" --to="node-2" --message="{\"type\":\"peer_connect\"}"
# Monitor network health
mcp__claude-flow__swarm_monitor --interval=3000 --metrics="connectivity,latency,throughput"# Propose network-wide decision
mcp__claude-flow__daa_consensus --agents="all" --proposal="{\"task_assignment\":\"auth-service\",\"assigned_to\":\"node-3\"}"
# Participate in voting
mcp__claude-flow__daa_consensus --agents="current" --vote="approve" --proposal_id="prop-123"
# Monitor consensus status
mcp__claude-flow__neural_patterns analyze --operation="consensus_tracking" --outcome="decision_approved"# Detect failed nodes
mcp__claude-flow__daa_fault_tolerance --agentId="node-4" --strategy="heartbeat_monitor"
# Trigger recovery procedures
mcp__claude-flow__daa_fault_tolerance --agentId="failed-node" --strategy="failover_recovery"
# Update network topology
mcp__claude-flow__topology_optimize --swarmId="${SWARM_ID}"Pre-Prepare Phase:
- Primary broadcasts proposed operation
- Includes sequence number and view number
- Signed with primary's private key
Prepare Phase:
- Backup nodes verify and broadcast prepare messages
- Must receive 2f+1 prepare messages (f = max faulty nodes)
- Ensures agreement on operation ordering
Commit Phase:
- Nodes broadcast commit messages after prepare phase
- Execute operation after receiving 2f+1 commit messages
- Reply to client with operation resultLeader Election:
- Nodes start as followers with random timeout
- Become candidate if no heartbeat from leader
- Win election with majority votes
Log Replication:
- Leader receives client requests
- Appends to local log and replicates to followers
- Commits entry when majority acknowledges
- Applies committed entries to state machineEpidemic Protocols:
- Anti-entropy: Periodic state reconciliation
- Rumor spreading: Event dissemination
- Aggregation: Computing global functions
Convergence Properties:
- Eventually consistent global state
- Probabilistic reliability guarantees
- Self-healing and partition toleranceclass HeartbeatMonitor:
def __init__(self, timeout=10, interval=3):
self.peers = {}
self.timeout = timeout
self.interval = interval
def monitor_peer(self, peer_id):
last_heartbeat = self.peers.get(peer_id, 0)
if time.time() - last_heartbeat > self.timeout:
self.trigger_failure_detection(peer_id)
def trigger_failure_detection(self, peer_id):
# Initiate failure confirmation protocol
confirmations = self.request_failure_confirmations(peer_id)
if len(confirmations) >= self.quorum_size():
self.handle_peer_failure(peer_id)class PartitionHandler:
def detect_partition(self):
reachable_peers = self.ping_all_peers()
total_peers = len(self.known_peers)
if len(reachable_peers) < total_peers * 0.5:
return self.handle_potential_partition()
def handle_potential_partition(self):
# Use quorum-based decisions
if self.has_majority_quorum():
return "continue_operations"
else:
return "enter_read_only_mode"class LoadBalancer:
def balance_load(self):
# Collect load metrics from all peers
peer_loads = self.collect_load_metrics()
# Identify overloaded and underutilized nodes
overloaded = [p for p in peer_loads if p.cpu_usage > 0.8]
underutilized = [p for p in peer_loads if p.cpu_usage < 0.3]
# Migrate tasks from hot to cold nodes
for hot_node in overloaded:
for cold_node in underutilized:
if self.can_migrate_task(hot_node, cold_node):
self.migrate_task(hot_node, cold_node)class CapabilityRouter:
def route_by_capability(self, task):
required_caps = task.required_capabilities
# Find peers with matching capabilities
capable_peers = []
for peer in self.peers:
capability_match = self.calculate_match_score(
peer.capabilities, required_caps
)
if capability_match > 0.7: # 70% match threshold
capable_peers.append((peer, capability_match))
# Route to best match with available capacity
return self.select_optimal_peer(capable_peers)