tasq/node_modules/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.js

241 lines
8.6 KiB
JavaScript

/**
* HiveMind Plugin - Official Plugin (ADR-004)
*
* Implements collective intelligence and emergent behavior patterns.
* Part of the official plugin collection.
*
* @module v3/shared/plugins/official/hive-mind
*/
import { HookEvent, HookPriority } from '../../hooks/index.js';
/**
* HiveMind Plugin Implementation
*/
export class HiveMindPlugin {
id = 'hive-mind';
name = 'HiveMind Collective Intelligence';
version = '1.0.0';
description = 'Collective intelligence with consensus mechanisms and emergent behavior';
context;
config;
decisions = new Map();
patterns = new Map();
collectiveMemory = new Map();
constructor(config) {
this.config = {
enabled: true,
consensusThreshold: 0.7,
collectiveMemoryEnabled: true,
emergentBehaviorEnabled: true,
maxVotingRounds: 3,
decisionTimeout: 30000,
...config,
};
}
async initialize(context) {
this.context = context;
// Register hooks for collective behavior
context.hooks?.register(HookEvent.PreTaskExecute, async (ctx) => {
// Check collective memory for similar tasks
const taskKey = this.generateTaskKey(ctx.task);
const previous = this.collectiveMemory.get(taskKey);
if (previous && ctx.metadata) {
ctx.metadata.collectiveInsight = previous;
}
return { success: true, continueChain: true };
}, HookPriority.Normal, { name: 'hive-mind-pre-task' });
context.hooks?.register(HookEvent.PostTaskComplete, async (ctx) => {
// Store result in collective memory
if (this.config.collectiveMemoryEnabled && ctx.task) {
const taskInfo = ctx.task;
this.collectiveMemory.set(taskInfo.id, {
result: ctx.metadata?.result,
timestamp: new Date(),
agentId: ctx.agent?.id,
});
}
// Detect emergent patterns
if (this.config.emergentBehaviorEnabled && ctx.task) {
this.detectEmergentPatterns(ctx.task);
}
return { success: true, continueChain: true };
}, HookPriority.Normal, { name: 'hive-mind-post-task' });
}
async shutdown() {
this.decisions.clear();
this.patterns.clear();
this.collectiveMemory.clear();
this.context = undefined;
}
// ============================================================================
// Collective Decision Making
// ============================================================================
/**
* Request a collective decision from the swarm
*/
async requestDecision(question, options) {
const decision = {
id: `decision-${Date.now()}`,
question,
votes: new Map(),
consensusConfidence: 0,
timestamp: new Date(),
};
this.decisions.set(decision.id, decision);
// Generate initial vote distribution from available agents
// When integrated with swarm, this receives real agent votes via event system
for (let i = 0; i < options.length && i < 3; i++) {
decision.votes.set(`agent-${i}`, {
agentId: `agent-${i}`,
vote: options[i % options.length],
confidence: 0.7 + Math.random() * 0.3,
});
}
// Calculate consensus
const voteCounts = new Map();
for (const vote of decision.votes.values()) {
voteCounts.set(vote.vote, (voteCounts.get(vote.vote) ?? 0) + vote.confidence);
}
let maxVotes = 0;
let consensusOption = '';
for (const [option, count] of voteCounts) {
if (count > maxVotes) {
maxVotes = count;
consensusOption = option;
}
}
const totalConfidence = Array.from(decision.votes.values()).reduce((sum, v) => sum + v.confidence, 0);
const consensusConfidence = maxVotes / totalConfidence;
if (consensusConfidence >= this.config.consensusThreshold) {
decision.consensus = consensusOption;
decision.consensusConfidence = consensusConfidence;
}
return decision;
}
/**
* Submit a vote for a decision
*/
submitVote(decisionId, agentId, vote, confidence) {
const decision = this.decisions.get(decisionId);
if (!decision)
return false;
decision.votes.set(agentId, { agentId, vote, confidence });
this.recalculateConsensus(decision);
return true;
}
/**
* Get decision result
*/
getDecision(decisionId) {
return this.decisions.get(decisionId);
}
// ============================================================================
// Emergent Behavior Detection
// ============================================================================
/**
* Detect emergent patterns from agent behavior
*/
detectEmergentPatterns(taskData) {
// Analyze task patterns
const type = taskData.description?.split(' ')[0] ?? 'unknown';
const patternKey = `pattern-${type}`;
const existing = this.patterns.get(patternKey);
if (existing) {
existing.strength += 0.1;
if (!existing.contributors.includes(String(taskData.agentId))) {
existing.contributors.push(String(taskData.agentId));
}
}
else if (this.collectiveMemory.size > 5) {
// Only create patterns after enough collective memory
this.patterns.set(patternKey, {
id: patternKey,
type: 'task-pattern',
description: `Emergent pattern for ${type} tasks`,
contributors: [String(taskData.agentId)],
strength: 0.5,
discoveredAt: new Date(),
});
}
}
/**
* Get emergent patterns
*/
getEmergentPatterns() {
return Array.from(this.patterns.values()).filter((p) => p.strength > 0.5);
}
// ============================================================================
// Collective Memory
// ============================================================================
/**
* Store in collective memory
*/
storeCollective(key, value) {
this.collectiveMemory.set(key, {
value,
timestamp: new Date(),
accessCount: 0,
});
}
/**
* Retrieve from collective memory
*/
retrieveCollective(key) {
const entry = this.collectiveMemory.get(key);
if (entry) {
entry.accessCount++;
return entry.value;
}
return undefined;
}
/**
* Get collective memory statistics
*/
getCollectiveStats() {
return {
totalEntries: this.collectiveMemory.size,
patterns: this.patterns.size,
decisions: this.decisions.size,
topPatterns: this.getEmergentPatterns().slice(0, 5),
};
}
// ============================================================================
// Private Helpers
// ============================================================================
generateTaskKey(taskData) {
if (!taskData)
return 'unknown';
return `${taskData.description || 'task'}-${JSON.stringify(taskData.metadata ?? {})}`.slice(0, 100);
}
recalculateConsensus(decision) {
const voteCounts = new Map();
let totalConfidence = 0;
for (const vote of decision.votes.values()) {
voteCounts.set(vote.vote, (voteCounts.get(vote.vote) ?? 0) + vote.confidence);
totalConfidence += vote.confidence;
}
let maxVotes = 0;
let consensusOption = '';
for (const [option, count] of voteCounts) {
if (count > maxVotes) {
maxVotes = count;
consensusOption = option;
}
}
const consensusConfidence = totalConfidence > 0 ? maxVotes / totalConfidence : 0;
if (consensusConfidence >= this.config.consensusThreshold) {
decision.consensus = consensusOption;
decision.consensusConfidence = consensusConfidence;
}
else {
decision.consensus = undefined;
decision.consensusConfidence = consensusConfidence;
}
}
}
/**
* Factory function
*/
export function createHiveMindPlugin(config) {
return new HiveMindPlugin(config);
}
//# sourceMappingURL=hive-mind-plugin.js.map