@sethdouglasford/claude-flow
Version:
Claude Code Flow - Advanced AI-powered development workflows with SPARC methodology
283 lines • 8.96 kB
TypeScript
/**
* Advanced messaging and communication layer for swarm coordination
*/
import { EventEmitter } from "node:events";
import { ILogger } from "../core/logger.js";
import { IEventBus } from "../core/event-bus.js";
import { AgentId, CommunicationStrategy } from "../swarm/types.js";
export interface MessageBusConfig {
strategy: CommunicationStrategy;
enablePersistence: boolean;
enableReliability: boolean;
enableOrdering: boolean;
enableFiltering: boolean;
maxMessageSize: number;
maxQueueSize: number;
messageRetention: number;
acknowledgmentTimeout: number;
retryAttempts: number;
backoffMultiplier: number;
compressionEnabled: boolean;
encryptionEnabled: boolean;
metricsEnabled: boolean;
debugMode: boolean;
}
export interface Message {
id: string;
type: string;
sender: AgentId;
receivers: AgentId[];
content: unknown;
metadata: MessageMetadata;
timestamp: Date;
expiresAt?: Date;
priority: MessagePriority;
reliability: ReliabilityLevel;
}
export interface MessageMetadata {
correlationId?: string;
causationId?: string;
replyTo?: string;
ttl?: number;
compressed: boolean;
encrypted: boolean;
size: number;
contentType: string;
encoding: string;
checksum?: string;
route?: string[];
deadLetterReason?: string;
deadLetterTimestamp?: Date;
}
export interface MessageChannel {
id: string;
name: string;
type: ChannelType;
participants: AgentId[];
config: ChannelConfig;
statistics: ChannelStatistics;
filters: MessageFilter[];
middleware: ChannelMiddleware[];
}
export interface ChannelConfig {
persistent: boolean;
ordered: boolean;
reliable: boolean;
maxParticipants: number;
maxMessageSize: number;
maxQueueDepth: number;
retentionPeriod: number;
accessControl: AccessControlConfig;
}
export interface AccessControlConfig {
readPermission: "public" | "participants" | "restricted";
writePermission: "public" | "participants" | "restricted";
adminPermission: "creator" | "administrators" | "system";
allowedSenders: AgentId[];
allowedReceivers: AgentId[];
bannedAgents: AgentId[];
}
export interface ChannelStatistics {
messagesTotal: number;
messagesDelivered: number;
messagesFailed: number;
bytesTransferred: number;
averageLatency: number;
throughput: number;
errorRate: number;
participantCount: number;
lastActivity: Date;
}
export interface MessageFilter {
id: string;
name: string;
enabled: boolean;
conditions: FilterCondition[];
action: "allow" | "deny" | "modify" | "route";
priority: number;
}
export interface FilterCondition {
field: string;
operator: "eq" | "ne" | "gt" | "lt" | "contains" | "matches" | "in";
value: unknown;
caseSensitive?: boolean;
}
export interface ChannelMiddleware {
id: string;
name: string;
enabled: boolean;
order: number;
process: (message: Message, context: MiddlewareContext) => Promise<Message | null>;
}
export interface MiddlewareContext {
channel: MessageChannel;
direction: "inbound" | "outbound";
agent: AgentId;
metadata: Record<string, unknown>;
}
export interface MessageQueue {
id: string;
name: string;
type: QueueType;
messages: Message[];
config: QueueConfig;
subscribers: QueueSubscriber[];
statistics: QueueStatistics;
}
export interface QueueConfig {
maxSize: number;
persistent: boolean;
ordered: boolean;
durability: "memory" | "disk" | "distributed";
deliveryMode: "at-most-once" | "at-least-once" | "exactly-once";
deadLetterQueue?: string;
retryPolicy: RetryPolicy;
}
export interface QueueSubscriber {
id: string;
agent: AgentId;
filter?: MessageFilter;
ackMode: "auto" | "manual";
prefetchCount: number;
lastActivity: Date;
}
export interface QueueStatistics {
depth: number;
enqueueRate: number;
dequeueRate: number;
throughput: number;
averageWaitTime: number;
subscriberCount: number;
deadLetterCount: number;
}
export interface RetryPolicy {
maxAttempts: number;
initialDelay: number;
maxDelay: number;
backoffMultiplier: number;
jitter: boolean;
}
export interface TopicSubscription {
id: string;
topic: string;
subscriber: AgentId;
filter?: MessageFilter;
ackRequired: boolean;
qos: QualityOfService;
createdAt: Date;
lastMessage?: Date;
}
export interface RoutingRule {
id: string;
name: string;
enabled: boolean;
priority: number;
conditions: FilterCondition[];
actions: RoutingAction[];
}
export interface RoutingAction {
type: "forward" | "duplicate" | "transform" | "aggregate" | "delay";
target?: string;
config: Record<string, any>;
}
export type MessagePriority = "low" | "normal" | "high" | "critical";
export type ReliabilityLevel = "best-effort" | "at-least-once" | "exactly-once";
export type ChannelType = "direct" | "broadcast" | "multicast" | "topic" | "queue";
export type QueueType = "fifo" | "lifo" | "priority" | "delay" | "round-robin";
export type QualityOfService = 0 | 1 | 2;
/**
* Advanced message bus with support for multiple communication patterns
*/
export declare class MessageBus extends EventEmitter {
private logger;
private eventBus;
private config;
private channels;
private queues;
private subscriptions;
private routingRules;
private messageStore;
private deliveryReceipts;
private acknowledgments;
private router;
private deliveryManager;
private retryManager;
private metrics;
private metricsInterval?;
constructor(config: Partial<MessageBusConfig>, logger: ILogger, eventBus: IEventBus);
private setupEventHandlers;
initialize(): Promise<void>;
shutdown(): Promise<void>;
sendMessage(type: string, content: any, sender: AgentId, receivers: AgentId | AgentId[], options?: {
priority?: MessagePriority;
reliability?: ReliabilityLevel;
ttl?: number;
correlationId?: string;
replyTo?: string;
channel?: string;
}): Promise<string>;
broadcastMessage(type: string, content: any, sender: AgentId, options?: {
channel?: string;
filter?: MessageFilter;
priority?: MessagePriority;
ttl?: number;
}): Promise<string>;
subscribeToTopic(topic: string, subscriber: AgentId, options?: {
filter?: MessageFilter;
qos?: QualityOfService;
ackRequired?: boolean;
}): Promise<string>;
unsubscribeFromTopic(subscriptionId: string): Promise<void>;
acknowledgeMessage(messageId: string, agentId: AgentId): Promise<void>;
createChannel(name: string, type: ChannelType, config?: Partial<ChannelConfig>): Promise<string>;
joinChannel(channelId: string, agentId: AgentId): Promise<void>;
leaveChannel(channelId: string, agentId: AgentId): Promise<void>;
createQueue(name: string, type: QueueType, config?: Partial<QueueConfig>): Promise<string>;
enqueueMessage(queueId: string, message: Message): Promise<void>;
dequeueMessage(queueId: string, subscriberId: string): Promise<Message | null>;
private routeMessage;
private deliverMessage;
private validateMessage;
private processContent;
private calculateSize;
private detectContentType;
private filterReceivers;
private canJoinChannel;
private matchesFilter;
private getFieldValue;
private evaluateCondition;
private insertMessageInQueue;
private insertByPriority;
private insertByTimestamp;
private processQueue;
private deliverMessageToSubscriber;
private checkAllAcknowledgments;
private createDefaultChannels;
private getDefaultBroadcastChannel;
private createChannelStatistics;
private createQueueStatistics;
private startMetricsCollection;
private updateMetrics;
private updateChannelStatistics;
private updateQueueStatistics;
private handleAgentConnected;
private handleAgentDisconnected;
private handleDeliverySuccess;
private handleDeliveryFailure;
private handleRetryExhausted;
private sendToDeadLetterQueue;
private compress;
private encrypt;
private persistMessages;
getChannel(channelId: string): MessageChannel | undefined;
getAllChannels(): MessageChannel[];
getQueue(queueId: string): MessageQueue | undefined;
getAllQueues(): MessageQueue[];
getSubscription(subscriptionId: string): TopicSubscription | undefined;
getAllSubscriptions(): TopicSubscription[];
getMetrics(): any;
getMessage(messageId: string): Message | undefined;
addChannelFilter(channelId: string, filter: MessageFilter): Promise<void>;
addChannelMiddleware(channelId: string, middleware: ChannelMiddleware): Promise<void>;
}
//# sourceMappingURL=message-bus.d.ts.map