@sparkleideas/ruv-swarm 1.0.18-patch.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1565 -0
- package/bin/ruv-swarm-clean.js +1872 -0
- package/bin/ruv-swarm-memory.js +119 -0
- package/bin/ruv-swarm-secure-heartbeat.js +1549 -0
- package/bin/ruv-swarm-secure.js +1689 -0
- package/package.json +221 -0
- package/src/agent.ts +342 -0
- package/src/benchmark.js +267 -0
- package/src/claude-flow-enhanced.js +839 -0
- package/src/claude-integration/advanced-commands.js +561 -0
- package/src/claude-integration/core.js +112 -0
- package/src/claude-integration/docs.js +1548 -0
- package/src/claude-integration/env-template.js +39 -0
- package/src/claude-integration/index.js +209 -0
- package/src/claude-integration/remote.js +408 -0
- package/src/cli-diagnostics.js +364 -0
- package/src/cognitive-pattern-evolution.js +1317 -0
- package/src/daa-cognition.js +977 -0
- package/src/daa-service.d.ts +298 -0
- package/src/daa-service.js +1116 -0
- package/src/diagnostics.js +533 -0
- package/src/errors.js +528 -0
- package/src/github-coordinator/README.md +193 -0
- package/src/github-coordinator/claude-hooks.js +162 -0
- package/src/github-coordinator/gh-cli-coordinator.js +260 -0
- package/src/hooks/cli.js +82 -0
- package/src/hooks/index.js +1900 -0
- package/src/index-enhanced.d.ts +371 -0
- package/src/index-enhanced.js +734 -0
- package/src/index.d.ts +287 -0
- package/src/index.js +405 -0
- package/src/index.ts +457 -0
- package/src/logger.js +182 -0
- package/src/logging-config.js +179 -0
- package/src/mcp-daa-tools.js +735 -0
- package/src/mcp-tools-benchmarks.js +328 -0
- package/src/mcp-tools-enhanced.js +2863 -0
- package/src/memory-config.js +42 -0
- package/src/meta-learning-framework.js +1359 -0
- package/src/neural-agent.js +830 -0
- package/src/neural-coordination-protocol.js +1363 -0
- package/src/neural-models/README.md +118 -0
- package/src/neural-models/autoencoder.js +543 -0
- package/src/neural-models/base.js +269 -0
- package/src/neural-models/cnn.js +497 -0
- package/src/neural-models/gnn.js +447 -0
- package/src/neural-models/gru.js +536 -0
- package/src/neural-models/index.js +273 -0
- package/src/neural-models/lstm.js +551 -0
- package/src/neural-models/neural-presets-complete.js +1306 -0
- package/src/neural-models/presets/graph.js +392 -0
- package/src/neural-models/presets/index.js +279 -0
- package/src/neural-models/presets/nlp.js +328 -0
- package/src/neural-models/presets/timeseries.js +368 -0
- package/src/neural-models/presets/vision.js +387 -0
- package/src/neural-models/resnet.js +534 -0
- package/src/neural-models/transformer.js +515 -0
- package/src/neural-models/vae.js +489 -0
- package/src/neural-network-manager.js +1938 -0
- package/src/neural-network.ts +296 -0
- package/src/neural.js +574 -0
- package/src/performance-benchmarks.js +898 -0
- package/src/performance.js +458 -0
- package/src/persistence-pooled.js +695 -0
- package/src/persistence.js +480 -0
- package/src/schemas.js +864 -0
- package/src/security.js +218 -0
- package/src/singleton-container.js +183 -0
- package/src/sqlite-pool.js +587 -0
- package/src/sqlite-worker.js +141 -0
- package/src/types.ts +164 -0
- package/src/utils.ts +286 -0
- package/src/wasm-loader.js +601 -0
- package/src/wasm-loader2.js +404 -0
- package/src/wasm-memory-optimizer.js +783 -0
- package/src/wasm-types.d.ts +63 -0
- package/wasm/README.md +347 -0
- package/wasm/neuro-divergent.wasm +0 -0
- package/wasm/package.json +18 -0
- package/wasm/ruv-fann.wasm +0 -0
- package/wasm/ruv_swarm_simd.wasm +0 -0
- package/wasm/ruv_swarm_wasm.d.ts +391 -0
- package/wasm/ruv_swarm_wasm.js +2164 -0
- package/wasm/ruv_swarm_wasm_bg.wasm +0 -0
- package/wasm/ruv_swarm_wasm_bg.wasm.d.ts +123 -0
- package/wasm/wasm-bindings-loader.mjs +435 -0
- package/wasm/wasm-updates.md +684 -0
|
@@ -0,0 +1,977 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAA Cognition Module
|
|
3
|
+
* Decentralized Autonomous Agent Cognitive Integration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export class DAACognition {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.cognitiveAgents = new Map();
|
|
9
|
+
this.distributedMemory = new Map();
|
|
10
|
+
this.consensusProtocol = new Map();
|
|
11
|
+
this.autonomyLevels = new Map();
|
|
12
|
+
this.emergentBehaviors = new Map();
|
|
13
|
+
|
|
14
|
+
// Initialize DAA-specific cognitive patterns
|
|
15
|
+
this.initializeDAAPatterns();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Initialize DAA-specific cognitive patterns
|
|
20
|
+
*/
|
|
21
|
+
initializeDAAPatterns() {
|
|
22
|
+
this.daaPatterns = {
|
|
23
|
+
autonomous_decision: {
|
|
24
|
+
name: 'Autonomous Decision Making',
|
|
25
|
+
description: 'Independent decision-making without central control',
|
|
26
|
+
characteristics: {
|
|
27
|
+
autonomyLevel: 0.9,
|
|
28
|
+
consensusRequirement: 0.3,
|
|
29
|
+
decisionSpeed: 0.8,
|
|
30
|
+
riskTolerance: 0.6,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
distributed_reasoning: {
|
|
34
|
+
name: 'Distributed Reasoning',
|
|
35
|
+
description: 'Collective reasoning across multiple agents',
|
|
36
|
+
characteristics: {
|
|
37
|
+
collaborationLevel: 0.9,
|
|
38
|
+
informationSharing: 0.8,
|
|
39
|
+
consensusBuilding: 0.7,
|
|
40
|
+
knowledgeAggregation: 0.8,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
emergent_intelligence: {
|
|
44
|
+
name: 'Emergent Intelligence',
|
|
45
|
+
description: 'Intelligence emerging from agent interactions',
|
|
46
|
+
characteristics: {
|
|
47
|
+
emergenceThreshold: 0.7,
|
|
48
|
+
collectiveIQ: 0.8,
|
|
49
|
+
adaptiveCapacity: 0.9,
|
|
50
|
+
selfOrganization: 0.85,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
swarm_cognition: {
|
|
54
|
+
name: 'Swarm Cognition',
|
|
55
|
+
description: 'Collective cognitive processing as a swarm',
|
|
56
|
+
characteristics: {
|
|
57
|
+
swarmCoherence: 0.8,
|
|
58
|
+
localInteractions: 0.9,
|
|
59
|
+
globalOptimization: 0.7,
|
|
60
|
+
scalability: 0.95,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
decentralized_learning: {
|
|
64
|
+
name: 'Decentralized Learning',
|
|
65
|
+
description: 'Learning without centralized coordination',
|
|
66
|
+
characteristics: {
|
|
67
|
+
peerLearning: 0.85,
|
|
68
|
+
knowledgePropagation: 0.8,
|
|
69
|
+
adaptationRate: 0.75,
|
|
70
|
+
robustness: 0.9,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Initialize DAA cognitive agent
|
|
78
|
+
* @param {string} agentId - Agent identifier
|
|
79
|
+
* @param {Object} config - Agent configuration
|
|
80
|
+
*/
|
|
81
|
+
async initializeDAAAgent(agentId, config) {
|
|
82
|
+
const daaAgent = {
|
|
83
|
+
id: agentId,
|
|
84
|
+
autonomyLevel: config.autonomyLevel || 0.7,
|
|
85
|
+
cognitivePattern: this.selectDAAPattern(config),
|
|
86
|
+
localMemory: new Map(),
|
|
87
|
+
peerConnections: new Set(),
|
|
88
|
+
consensusState: {
|
|
89
|
+
proposals: new Map(),
|
|
90
|
+
votes: new Map(),
|
|
91
|
+
decisions: [],
|
|
92
|
+
},
|
|
93
|
+
emergentTraits: new Set(),
|
|
94
|
+
learningState: {
|
|
95
|
+
localKnowledge: new Map(),
|
|
96
|
+
sharedKnowledge: new Map(),
|
|
97
|
+
propagationQueue: [],
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
this.cognitiveAgents.set(agentId, daaAgent);
|
|
102
|
+
|
|
103
|
+
// Initialize in distributed memory
|
|
104
|
+
this.initializeDistributedMemory(agentId);
|
|
105
|
+
|
|
106
|
+
console.log(`Initialized DAA cognitive agent ${agentId} with autonomy level ${daaAgent.autonomyLevel}`);
|
|
107
|
+
|
|
108
|
+
return daaAgent;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Select appropriate DAA cognitive pattern
|
|
113
|
+
* @param {Object} config - Agent configuration
|
|
114
|
+
*/
|
|
115
|
+
selectDAAPattern(config) {
|
|
116
|
+
// Select based on agent type and requirements
|
|
117
|
+
if (config.requiresAutonomy) {
|
|
118
|
+
return this.daaPatterns.autonomous_decision;
|
|
119
|
+
} else if (config.requiresCollaboration) {
|
|
120
|
+
return this.daaPatterns.distributed_reasoning;
|
|
121
|
+
} else if (config.enableEmergence) {
|
|
122
|
+
return this.daaPatterns.emergent_intelligence;
|
|
123
|
+
} else if (config.swarmMode) {
|
|
124
|
+
return this.daaPatterns.swarm_cognition;
|
|
125
|
+
}
|
|
126
|
+
return this.daaPatterns.decentralized_learning;
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Initialize distributed memory for agent
|
|
132
|
+
* @param {string} agentId - Agent identifier
|
|
133
|
+
*/
|
|
134
|
+
initializeDistributedMemory(agentId) {
|
|
135
|
+
this.distributedMemory.set(agentId, {
|
|
136
|
+
localSegment: new Map(),
|
|
137
|
+
sharedSegments: new Map(),
|
|
138
|
+
replicationFactor: 3,
|
|
139
|
+
consistencyLevel: 'eventual',
|
|
140
|
+
lastSync: Date.now(),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Enable autonomous decision making
|
|
146
|
+
* @param {string} agentId - Agent identifier
|
|
147
|
+
* @param {Object} decision - Decision context
|
|
148
|
+
*/
|
|
149
|
+
async makeAutonomousDecision(agentId, decision) {
|
|
150
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
151
|
+
if (!agent) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Evaluate decision based on local knowledge
|
|
156
|
+
const localEvaluation = this.evaluateLocally(agent, decision);
|
|
157
|
+
|
|
158
|
+
// Check if consensus is needed based on autonomy level
|
|
159
|
+
if (agent.autonomyLevel < decision.consensusThreshold) {
|
|
160
|
+
return this.seekConsensus(agentId, decision, localEvaluation);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Make autonomous decision
|
|
164
|
+
const autonomousDecision = {
|
|
165
|
+
agentId,
|
|
166
|
+
decision: localEvaluation.recommendation,
|
|
167
|
+
confidence: localEvaluation.confidence,
|
|
168
|
+
reasoning: localEvaluation.reasoning,
|
|
169
|
+
timestamp: Date.now(),
|
|
170
|
+
autonomous: true,
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// Record decision
|
|
174
|
+
agent.consensusState.decisions.push(autonomousDecision);
|
|
175
|
+
|
|
176
|
+
// Propagate decision to peers
|
|
177
|
+
await this.propagateDecision(agentId, autonomousDecision);
|
|
178
|
+
|
|
179
|
+
return autonomousDecision;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Evaluate decision locally
|
|
184
|
+
* @param {Object} agent - DAA agent
|
|
185
|
+
* @param {Object} decision - Decision context
|
|
186
|
+
*/
|
|
187
|
+
evaluateLocally(agent, decision) {
|
|
188
|
+
const evaluation = {
|
|
189
|
+
recommendation: null,
|
|
190
|
+
confidence: 0,
|
|
191
|
+
reasoning: [],
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
// Use local knowledge for evaluation
|
|
195
|
+
const _relevantKnowledge = this.retrieveRelevantKnowledge(agent, decision);
|
|
196
|
+
|
|
197
|
+
// Apply cognitive pattern
|
|
198
|
+
const pattern = agent.cognitivePattern;
|
|
199
|
+
if (pattern.characteristics.autonomyLevel > 0.5) {
|
|
200
|
+
evaluation.confidence += 0.3;
|
|
201
|
+
evaluation.reasoning.push('High autonomy pattern supports independent decision');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Analyze based on past decisions
|
|
205
|
+
const similarDecisions = this.findSimilarDecisions(agent, decision);
|
|
206
|
+
if (similarDecisions.length > 0) {
|
|
207
|
+
const avgOutcome = this.calculateAverageOutcome(similarDecisions);
|
|
208
|
+
evaluation.confidence += avgOutcome * 0.4;
|
|
209
|
+
evaluation.reasoning.push(`Historical success rate: ${(avgOutcome * 100).toFixed(1)}%`);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Make recommendation
|
|
213
|
+
evaluation.recommendation = evaluation.confidence > 0.6 ? 'approve' : 'reject';
|
|
214
|
+
|
|
215
|
+
return evaluation;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Retrieve relevant knowledge for decision
|
|
220
|
+
* @param {Object} agent - DAA agent
|
|
221
|
+
* @param {Object} decision - Decision context
|
|
222
|
+
*/
|
|
223
|
+
retrieveRelevantKnowledge(agent, decision) {
|
|
224
|
+
const relevant = [];
|
|
225
|
+
|
|
226
|
+
// Check local memory
|
|
227
|
+
for (const [key, value] of agent.localMemory) {
|
|
228
|
+
if (this.isRelevantToDecision(key, value, decision)) {
|
|
229
|
+
relevant.push({ source: 'local', key, value });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Check shared knowledge
|
|
234
|
+
for (const [key, value] of agent.learningState.sharedKnowledge) {
|
|
235
|
+
if (this.isRelevantToDecision(key, value, decision)) {
|
|
236
|
+
relevant.push({ source: 'shared', key, value });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return relevant;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Check if knowledge is relevant to decision
|
|
245
|
+
* @param {string} key - Knowledge key
|
|
246
|
+
* @param {*} value - Knowledge value
|
|
247
|
+
* @param {Object} decision - Decision context
|
|
248
|
+
*/
|
|
249
|
+
isRelevantToDecision(key, value, decision) {
|
|
250
|
+
// Simple relevance check based on keywords
|
|
251
|
+
const decisionKeywords = decision.context?.keywords || [];
|
|
252
|
+
return decisionKeywords.some(keyword =>
|
|
253
|
+
key.includes(keyword) ||
|
|
254
|
+
(typeof value === 'string' && value.includes(keyword)),
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Find similar past decisions
|
|
260
|
+
* @param {Object} agent - DAA agent
|
|
261
|
+
* @param {Object} decision - Current decision
|
|
262
|
+
*/
|
|
263
|
+
findSimilarDecisions(agent, decision) {
|
|
264
|
+
return agent.consensusState.decisions.filter(pastDecision => {
|
|
265
|
+
// Simple similarity based on decision type
|
|
266
|
+
return pastDecision.decision === decision.type;
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Calculate average outcome of decisions
|
|
272
|
+
* @param {Array} decisions - Past decisions
|
|
273
|
+
*/
|
|
274
|
+
calculateAverageOutcome(decisions) {
|
|
275
|
+
if (decisions.length === 0) {
|
|
276
|
+
return 0.5;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const successfulDecisions = decisions.filter(d => d.outcome === 'success').length;
|
|
280
|
+
return successfulDecisions / decisions.length;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Seek consensus from peer agents
|
|
285
|
+
* @param {string} agentId - Agent identifier
|
|
286
|
+
* @param {Object} decision - Decision context
|
|
287
|
+
* @param {Object} localEvaluation - Local evaluation
|
|
288
|
+
*/
|
|
289
|
+
async seekConsensus(agentId, decision, localEvaluation) {
|
|
290
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
291
|
+
if (!agent) {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Create consensus proposal
|
|
296
|
+
const proposal = {
|
|
297
|
+
id: `proposal_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
|
298
|
+
proposer: agentId,
|
|
299
|
+
decision,
|
|
300
|
+
localEvaluation,
|
|
301
|
+
timestamp: Date.now(),
|
|
302
|
+
votes: new Map(),
|
|
303
|
+
status: 'pending',
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
agent.consensusState.proposals.set(proposal.id, proposal);
|
|
307
|
+
|
|
308
|
+
// Request votes from peers
|
|
309
|
+
const votePromises = [];
|
|
310
|
+
for (const peerId of agent.peerConnections) {
|
|
311
|
+
votePromises.push(this.requestVote(peerId, proposal));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Collect votes
|
|
315
|
+
const votes = await Promise.all(votePromises);
|
|
316
|
+
|
|
317
|
+
// Tally results
|
|
318
|
+
const consensusResult = this.tallyVotes(votes, proposal);
|
|
319
|
+
|
|
320
|
+
// Update proposal status
|
|
321
|
+
proposal.status = consensusResult.approved ? 'approved' : 'rejected';
|
|
322
|
+
proposal.consensusLevel = consensusResult.consensusLevel;
|
|
323
|
+
|
|
324
|
+
// Create consensus decision
|
|
325
|
+
const consensusDecision = {
|
|
326
|
+
agentId,
|
|
327
|
+
decision: consensusResult.approved ? 'approve' : 'reject',
|
|
328
|
+
confidence: consensusResult.consensusLevel,
|
|
329
|
+
reasoning: [...localEvaluation.reasoning, `Consensus level: ${(consensusResult.consensusLevel * 100).toFixed(1)}%`],
|
|
330
|
+
timestamp: Date.now(),
|
|
331
|
+
autonomous: false,
|
|
332
|
+
proposalId: proposal.id,
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
agent.consensusState.decisions.push(consensusDecision);
|
|
336
|
+
|
|
337
|
+
return consensusDecision;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Request vote from peer agent
|
|
342
|
+
* @param {string} peerId - Peer agent ID
|
|
343
|
+
* @param {Object} proposal - Consensus proposal
|
|
344
|
+
*/
|
|
345
|
+
async requestVote(peerId, proposal) {
|
|
346
|
+
const peerAgent = this.cognitiveAgents.get(peerId);
|
|
347
|
+
if (!peerAgent) {
|
|
348
|
+
return { agentId: peerId, vote: 'abstain', reason: 'Agent not found' };
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// Peer evaluates proposal
|
|
352
|
+
const peerEvaluation = this.evaluateLocally(peerAgent, proposal.decision);
|
|
353
|
+
|
|
354
|
+
// Cast vote based on evaluation
|
|
355
|
+
const vote = {
|
|
356
|
+
agentId: peerId,
|
|
357
|
+
vote: peerEvaluation.confidence > 0.5 ? 'approve' : 'reject',
|
|
358
|
+
confidence: peerEvaluation.confidence,
|
|
359
|
+
reason: peerEvaluation.reasoning[0] || 'No specific reason',
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
return vote;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Tally votes for consensus
|
|
367
|
+
* @param {Array} votes - Vote results
|
|
368
|
+
* @param {Object} proposal - Consensus proposal
|
|
369
|
+
*/
|
|
370
|
+
tallyVotes(votes, proposal) {
|
|
371
|
+
let approveCount = 0;
|
|
372
|
+
let totalWeight = 0;
|
|
373
|
+
|
|
374
|
+
for (const vote of votes) {
|
|
375
|
+
const weight = vote.confidence || 0.5;
|
|
376
|
+
totalWeight += weight;
|
|
377
|
+
|
|
378
|
+
if (vote.vote === 'approve') {
|
|
379
|
+
approveCount += weight;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Store vote in proposal
|
|
383
|
+
proposal.votes.set(vote.agentId, vote);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const consensusLevel = totalWeight > 0 ? approveCount / totalWeight : 0;
|
|
387
|
+
const approved = consensusLevel > 0.5;
|
|
388
|
+
|
|
389
|
+
return { approved, consensusLevel, totalVotes: votes.length };
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Propagate decision to peer agents
|
|
394
|
+
* @param {string} agentId - Agent identifier
|
|
395
|
+
* @param {Object} decision - Decision to propagate
|
|
396
|
+
*/
|
|
397
|
+
async propagateDecision(agentId, decision) {
|
|
398
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
399
|
+
if (!agent) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Add to propagation queue
|
|
404
|
+
agent.learningState.propagationQueue.push({
|
|
405
|
+
type: 'decision',
|
|
406
|
+
content: decision,
|
|
407
|
+
timestamp: Date.now(),
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
// Propagate to connected peers
|
|
411
|
+
for (const peerId of agent.peerConnections) {
|
|
412
|
+
await this.sendToPeer(peerId, {
|
|
413
|
+
type: 'decision_update',
|
|
414
|
+
from: agentId,
|
|
415
|
+
decision,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Send message to peer agent
|
|
422
|
+
* @param {string} peerId - Peer agent ID
|
|
423
|
+
* @param {Object} message - Message to send
|
|
424
|
+
*/
|
|
425
|
+
async sendToPeer(peerId, message) {
|
|
426
|
+
const peerAgent = this.cognitiveAgents.get(peerId);
|
|
427
|
+
if (!peerAgent) {
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Process message based on type
|
|
432
|
+
switch (message.type) {
|
|
433
|
+
case 'decision_update':
|
|
434
|
+
this.processDecisionUpdate(peerId, message);
|
|
435
|
+
break;
|
|
436
|
+
case 'knowledge_share':
|
|
437
|
+
this.processKnowledgeShare(peerId, message);
|
|
438
|
+
break;
|
|
439
|
+
case 'emergent_behavior':
|
|
440
|
+
this.processEmergentBehavior(peerId, message);
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Process decision update from peer
|
|
447
|
+
* @param {string} agentId - Receiving agent ID
|
|
448
|
+
* @param {Object} message - Update message
|
|
449
|
+
*/
|
|
450
|
+
processDecisionUpdate(agentId, message) {
|
|
451
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
452
|
+
if (!agent) {
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Store peer decision for learning
|
|
457
|
+
const peerDecision = {
|
|
458
|
+
...message.decision,
|
|
459
|
+
receivedFrom: message.from,
|
|
460
|
+
receivedAt: Date.now(),
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
agent.learningState.sharedKnowledge.set(
|
|
464
|
+
`peer_decision_${message.decision.timestamp}`,
|
|
465
|
+
peerDecision,
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Enable distributed learning
|
|
471
|
+
* @param {string} agentId - Agent identifier
|
|
472
|
+
* @param {Object} learningData - Data to learn from
|
|
473
|
+
*/
|
|
474
|
+
async performDistributedLearning(agentId, learningData) {
|
|
475
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
476
|
+
if (!agent) {
|
|
477
|
+
return null;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// Local learning phase
|
|
481
|
+
const localLearning = await this.performLocalLearning(agent, learningData);
|
|
482
|
+
|
|
483
|
+
// Share learning with peers
|
|
484
|
+
const sharedLearning = await this.shareLearning(agentId, localLearning);
|
|
485
|
+
|
|
486
|
+
// Aggregate peer learning
|
|
487
|
+
const aggregatedLearning = await this.aggregatePeerLearning(agentId, sharedLearning);
|
|
488
|
+
|
|
489
|
+
// Update agent's knowledge
|
|
490
|
+
this.updateAgentKnowledge(agent, aggregatedLearning);
|
|
491
|
+
|
|
492
|
+
return {
|
|
493
|
+
localLearning,
|
|
494
|
+
sharedLearning,
|
|
495
|
+
aggregatedLearning,
|
|
496
|
+
knowledgeGrowth: this.calculateKnowledgeGrowth(agent),
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Perform local learning
|
|
502
|
+
* @param {Object} agent - DAA agent
|
|
503
|
+
* @param {Object} learningData - Learning data
|
|
504
|
+
*/
|
|
505
|
+
async performLocalLearning(agent, learningData) {
|
|
506
|
+
const learning = {
|
|
507
|
+
patterns: [],
|
|
508
|
+
insights: [],
|
|
509
|
+
confidence: 0,
|
|
510
|
+
};
|
|
511
|
+
|
|
512
|
+
// Extract patterns from data
|
|
513
|
+
if (learningData.samples) {
|
|
514
|
+
const patterns = this.extractPatterns(learningData.samples);
|
|
515
|
+
learning.patterns = patterns;
|
|
516
|
+
learning.confidence = patterns.length > 0 ? 0.7 : 0.3;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// Generate insights
|
|
520
|
+
if (learning.patterns.length > 0) {
|
|
521
|
+
learning.insights = this.generateInsights(learning.patterns);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Store in local memory
|
|
525
|
+
learning.patterns.forEach((pattern, idx) => {
|
|
526
|
+
agent.localMemory.set(`pattern_${Date.now()}_${idx}`, pattern);
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
return learning;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* Extract patterns from data samples
|
|
534
|
+
* @param {Array} samples - Data samples
|
|
535
|
+
*/
|
|
536
|
+
extractPatterns(samples) {
|
|
537
|
+
const patterns = [];
|
|
538
|
+
|
|
539
|
+
// Simple pattern extraction (placeholder for more sophisticated methods)
|
|
540
|
+
if (samples.length > 10) {
|
|
541
|
+
patterns.push({
|
|
542
|
+
type: 'frequency',
|
|
543
|
+
description: 'High sample frequency detected',
|
|
544
|
+
confidence: 0.8,
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// Look for sequences
|
|
549
|
+
const isSequential = samples.every((sample, idx) =>
|
|
550
|
+
idx === 0 || this.isSequentialWith(samples[idx - 1], sample),
|
|
551
|
+
);
|
|
552
|
+
|
|
553
|
+
if (isSequential) {
|
|
554
|
+
patterns.push({
|
|
555
|
+
type: 'sequential',
|
|
556
|
+
description: 'Sequential pattern detected',
|
|
557
|
+
confidence: 0.9,
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
return patterns;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Check if samples are sequential
|
|
566
|
+
* @param {*} prev - Previous sample
|
|
567
|
+
* @param {*} current - Current sample
|
|
568
|
+
*/
|
|
569
|
+
isSequentialWith(prev, current) {
|
|
570
|
+
// Simple check - can be made more sophisticated
|
|
571
|
+
if (typeof prev === 'number' && typeof current === 'number') {
|
|
572
|
+
return Math.abs(current - prev) < 10;
|
|
573
|
+
}
|
|
574
|
+
return false;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* Generate insights from patterns
|
|
579
|
+
* @param {Array} patterns - Detected patterns
|
|
580
|
+
*/
|
|
581
|
+
generateInsights(patterns) {
|
|
582
|
+
const insights = [];
|
|
583
|
+
|
|
584
|
+
// Generate insights based on pattern combinations
|
|
585
|
+
const hasSequential = patterns.some(p => p.type === 'sequential');
|
|
586
|
+
const hasFrequency = patterns.some(p => p.type === 'frequency');
|
|
587
|
+
|
|
588
|
+
if (hasSequential && hasFrequency) {
|
|
589
|
+
insights.push({
|
|
590
|
+
type: 'combined',
|
|
591
|
+
description: 'High-frequency sequential data detected',
|
|
592
|
+
actionable: 'Consider time-series optimization',
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
return insights;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Share learning with peer agents
|
|
601
|
+
* @param {string} agentId - Agent identifier
|
|
602
|
+
* @param {Object} localLearning - Local learning results
|
|
603
|
+
*/
|
|
604
|
+
async shareLearning(agentId, localLearning) {
|
|
605
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
606
|
+
if (!agent) {
|
|
607
|
+
return [];
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
const sharingResults = [];
|
|
611
|
+
|
|
612
|
+
// Share with each peer
|
|
613
|
+
for (const peerId of agent.peerConnections) {
|
|
614
|
+
const shareResult = await this.shareWithPeer(agentId, peerId, localLearning);
|
|
615
|
+
sharingResults.push(shareResult);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
return sharingResults;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Share learning with specific peer
|
|
623
|
+
* @param {string} agentId - Sharing agent ID
|
|
624
|
+
* @param {string} peerId - Peer agent ID
|
|
625
|
+
* @param {Object} learning - Learning to share
|
|
626
|
+
*/
|
|
627
|
+
async shareWithPeer(agentId, peerId, learning) {
|
|
628
|
+
await this.sendToPeer(peerId, {
|
|
629
|
+
type: 'knowledge_share',
|
|
630
|
+
from: agentId,
|
|
631
|
+
learning: {
|
|
632
|
+
patterns: learning.patterns,
|
|
633
|
+
insights: learning.insights,
|
|
634
|
+
confidence: learning.confidence,
|
|
635
|
+
timestamp: Date.now(),
|
|
636
|
+
},
|
|
637
|
+
});
|
|
638
|
+
|
|
639
|
+
return {
|
|
640
|
+
peer: peerId,
|
|
641
|
+
shared: true,
|
|
642
|
+
timestamp: Date.now(),
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Process knowledge share from peer
|
|
648
|
+
* @param {string} agentId - Receiving agent ID
|
|
649
|
+
* @param {Object} message - Knowledge share message
|
|
650
|
+
*/
|
|
651
|
+
processKnowledgeShare(agentId, message) {
|
|
652
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
653
|
+
if (!agent) {
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// Store shared knowledge
|
|
658
|
+
const sharedKnowledge = {
|
|
659
|
+
...message.learning,
|
|
660
|
+
source: message.from,
|
|
661
|
+
receivedAt: Date.now(),
|
|
662
|
+
};
|
|
663
|
+
|
|
664
|
+
agent.learningState.sharedKnowledge.set(
|
|
665
|
+
`shared_${message.from}_${message.learning.timestamp}`,
|
|
666
|
+
sharedKnowledge,
|
|
667
|
+
);
|
|
668
|
+
|
|
669
|
+
// Check for emergent patterns
|
|
670
|
+
this.checkForEmergentPatterns(agentId);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
/**
|
|
674
|
+
* Aggregate learning from peers
|
|
675
|
+
* @param {string} agentId - Agent identifier
|
|
676
|
+
* @param {Array} sharingResults - Results of sharing
|
|
677
|
+
*/
|
|
678
|
+
async aggregatePeerLearning(agentId, _sharingResults) {
|
|
679
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
680
|
+
if (!agent) {
|
|
681
|
+
return null;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
const aggregated = {
|
|
685
|
+
patterns: new Map(),
|
|
686
|
+
insights: [],
|
|
687
|
+
consensusLevel: 0,
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
// Collect all shared knowledge
|
|
691
|
+
for (const [_key, knowledge] of agent.learningState.sharedKnowledge) {
|
|
692
|
+
if (knowledge.patterns) {
|
|
693
|
+
knowledge.patterns.forEach(pattern => {
|
|
694
|
+
const patternKey = `${pattern.type}_${pattern.description}`;
|
|
695
|
+
if (!aggregated.patterns.has(patternKey)) {
|
|
696
|
+
aggregated.patterns.set(patternKey, {
|
|
697
|
+
...pattern,
|
|
698
|
+
sources: [],
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
aggregated.patterns.get(patternKey).sources.push(knowledge.source);
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
if (knowledge.insights) {
|
|
706
|
+
aggregated.insights.push(...knowledge.insights);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
// Calculate consensus level
|
|
711
|
+
const totalPeers = agent.peerConnections.size;
|
|
712
|
+
if (totalPeers > 0) {
|
|
713
|
+
aggregated.patterns.forEach(pattern => {
|
|
714
|
+
pattern.consensusLevel = pattern.sources.length / totalPeers;
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
return aggregated;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* Update agent knowledge with aggregated learning
|
|
723
|
+
* @param {Object} agent - DAA agent
|
|
724
|
+
* @param {Object} aggregatedLearning - Aggregated learning
|
|
725
|
+
*/
|
|
726
|
+
updateAgentKnowledge(agent, aggregatedLearning) {
|
|
727
|
+
if (!aggregatedLearning) {
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// Update local knowledge with high-consensus patterns
|
|
732
|
+
aggregatedLearning.patterns.forEach((pattern, key) => {
|
|
733
|
+
if (pattern.consensusLevel > 0.6) {
|
|
734
|
+
agent.localMemory.set(`consensus_${key}`, pattern);
|
|
735
|
+
}
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
// Store unique insights
|
|
739
|
+
const uniqueInsights = this.deduplicateInsights(aggregatedLearning.insights);
|
|
740
|
+
uniqueInsights.forEach((insight, idx) => {
|
|
741
|
+
agent.localMemory.set(`insight_${Date.now()}_${idx}`, insight);
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Deduplicate insights
|
|
747
|
+
* @param {Array} insights - Array of insights
|
|
748
|
+
*/
|
|
749
|
+
deduplicateInsights(insights) {
|
|
750
|
+
const seen = new Set();
|
|
751
|
+
return insights.filter(insight => {
|
|
752
|
+
const key = `${insight.type}_${insight.description}`;
|
|
753
|
+
if (seen.has(key)) {
|
|
754
|
+
return false;
|
|
755
|
+
}
|
|
756
|
+
seen.add(key);
|
|
757
|
+
return true;
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
/**
|
|
762
|
+
* Calculate knowledge growth for agent
|
|
763
|
+
* @param {Object} agent - DAA agent
|
|
764
|
+
*/
|
|
765
|
+
calculateKnowledgeGrowth(agent) {
|
|
766
|
+
const localSize = agent.localMemory.size;
|
|
767
|
+
const sharedSize = agent.learningState.sharedKnowledge.size;
|
|
768
|
+
|
|
769
|
+
return {
|
|
770
|
+
localKnowledge: localSize,
|
|
771
|
+
sharedKnowledge: sharedSize,
|
|
772
|
+
totalKnowledge: localSize + sharedSize,
|
|
773
|
+
knowledgeDensity: (localSize + sharedSize) / (agent.peerConnections.size + 1),
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* Check for emergent patterns across agents
|
|
779
|
+
* @param {string} agentId - Agent identifier
|
|
780
|
+
*/
|
|
781
|
+
checkForEmergentPatterns(agentId) {
|
|
782
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
783
|
+
if (!agent) {
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// Analyze collective patterns
|
|
788
|
+
const collectivePatterns = this.analyzeCollectivePatterns();
|
|
789
|
+
|
|
790
|
+
// Check for emergence criteria
|
|
791
|
+
collectivePatterns.forEach(pattern => {
|
|
792
|
+
if (pattern.occurrence > 0.7 && pattern.diversity > 0.5) {
|
|
793
|
+
const emergentBehavior = {
|
|
794
|
+
type: 'pattern_emergence',
|
|
795
|
+
pattern: pattern.type,
|
|
796
|
+
strength: pattern.occurrence,
|
|
797
|
+
diversity: pattern.diversity,
|
|
798
|
+
timestamp: Date.now(),
|
|
799
|
+
};
|
|
800
|
+
|
|
801
|
+
agent.emergentTraits.add(emergentBehavior.type);
|
|
802
|
+
|
|
803
|
+
// Notify peers of emergent behavior
|
|
804
|
+
this.notifyEmergentBehavior(agentId, emergentBehavior);
|
|
805
|
+
}
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/**
|
|
810
|
+
* Analyze patterns across all agents
|
|
811
|
+
*/
|
|
812
|
+
analyzeCollectivePatterns() {
|
|
813
|
+
const patternCounts = new Map();
|
|
814
|
+
const patternAgents = new Map();
|
|
815
|
+
|
|
816
|
+
// Count patterns across all agents
|
|
817
|
+
for (const [agentId, agent] of this.cognitiveAgents) {
|
|
818
|
+
for (const [key, value] of agent.localMemory) {
|
|
819
|
+
if (key.startsWith('pattern_') || key.startsWith('consensus_')) {
|
|
820
|
+
const patternType = value.type || 'unknown';
|
|
821
|
+
|
|
822
|
+
if (!patternCounts.has(patternType)) {
|
|
823
|
+
patternCounts.set(patternType, 0);
|
|
824
|
+
patternAgents.set(patternType, new Set());
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
patternCounts.set(patternType, patternCounts.get(patternType) + 1);
|
|
828
|
+
patternAgents.get(patternType).add(agentId);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
// Calculate pattern statistics
|
|
834
|
+
const totalAgents = this.cognitiveAgents.size;
|
|
835
|
+
const patterns = [];
|
|
836
|
+
|
|
837
|
+
for (const [patternType, count] of patternCounts) {
|
|
838
|
+
const agentSet = patternAgents.get(patternType);
|
|
839
|
+
patterns.push({
|
|
840
|
+
type: patternType,
|
|
841
|
+
count,
|
|
842
|
+
occurrence: agentSet.size / totalAgents,
|
|
843
|
+
diversity: agentSet.size / count, // How spread out the pattern is
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
return patterns;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
/**
|
|
851
|
+
* Notify peers of emergent behavior
|
|
852
|
+
* @param {string} agentId - Agent identifier
|
|
853
|
+
* @param {Object} emergentBehavior - Emergent behavior detected
|
|
854
|
+
*/
|
|
855
|
+
notifyEmergentBehavior(agentId, emergentBehavior) {
|
|
856
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
857
|
+
if (!agent) {
|
|
858
|
+
return;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
// Record in emergent behaviors
|
|
862
|
+
if (!this.emergentBehaviors.has(emergentBehavior.type)) {
|
|
863
|
+
this.emergentBehaviors.set(emergentBehavior.type, []);
|
|
864
|
+
}
|
|
865
|
+
this.emergentBehaviors.get(emergentBehavior.type).push({
|
|
866
|
+
...emergentBehavior,
|
|
867
|
+
discoveredBy: agentId,
|
|
868
|
+
});
|
|
869
|
+
|
|
870
|
+
// Notify all peers
|
|
871
|
+
for (const peerId of agent.peerConnections) {
|
|
872
|
+
this.sendToPeer(peerId, {
|
|
873
|
+
type: 'emergent_behavior',
|
|
874
|
+
from: agentId,
|
|
875
|
+
behavior: emergentBehavior,
|
|
876
|
+
});
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
/**
|
|
881
|
+
* Process emergent behavior notification
|
|
882
|
+
* @param {string} agentId - Receiving agent ID
|
|
883
|
+
* @param {Object} message - Emergent behavior message
|
|
884
|
+
*/
|
|
885
|
+
processEmergentBehavior(agentId, message) {
|
|
886
|
+
const agent = this.cognitiveAgents.get(agentId);
|
|
887
|
+
if (!agent) {
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
// Add to agent's emergent traits
|
|
892
|
+
agent.emergentTraits.add(message.behavior.type);
|
|
893
|
+
|
|
894
|
+
// Store in local memory for future reference
|
|
895
|
+
agent.localMemory.set(
|
|
896
|
+
`emergent_${message.behavior.type}_${Date.now()}`,
|
|
897
|
+
{
|
|
898
|
+
...message.behavior,
|
|
899
|
+
reportedBy: message.from,
|
|
900
|
+
},
|
|
901
|
+
);
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
/**
|
|
905
|
+
* Get DAA statistics
|
|
906
|
+
*/
|
|
907
|
+
getStatistics() {
|
|
908
|
+
const stats = {
|
|
909
|
+
totalAgents: this.cognitiveAgents.size,
|
|
910
|
+
autonomyLevels: {},
|
|
911
|
+
emergentBehaviors: this.emergentBehaviors.size,
|
|
912
|
+
distributedKnowledge: 0,
|
|
913
|
+
consensusDecisions: 0,
|
|
914
|
+
autonomousDecisions: 0,
|
|
915
|
+
};
|
|
916
|
+
|
|
917
|
+
// Calculate detailed statistics
|
|
918
|
+
for (const [_agentId, agent] of this.cognitiveAgents) {
|
|
919
|
+
// Autonomy distribution
|
|
920
|
+
const level = Math.floor(agent.autonomyLevel * 10) / 10;
|
|
921
|
+
stats.autonomyLevels[level] = (stats.autonomyLevels[level] || 0) + 1;
|
|
922
|
+
|
|
923
|
+
// Knowledge statistics
|
|
924
|
+
stats.distributedKnowledge += agent.localMemory.size + agent.learningState.sharedKnowledge.size;
|
|
925
|
+
|
|
926
|
+
// Decision statistics
|
|
927
|
+
agent.consensusState.decisions.forEach(decision => {
|
|
928
|
+
if (decision.autonomous) {
|
|
929
|
+
stats.autonomousDecisions++;
|
|
930
|
+
} else {
|
|
931
|
+
stats.consensusDecisions++;
|
|
932
|
+
}
|
|
933
|
+
});
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
// Average metrics
|
|
937
|
+
stats.avgKnowledgePerAgent = stats.totalAgents > 0 ?
|
|
938
|
+
stats.distributedKnowledge / stats.totalAgents : 0;
|
|
939
|
+
|
|
940
|
+
stats.autonomyRate = (stats.autonomousDecisions + stats.consensusDecisions) > 0 ?
|
|
941
|
+
stats.autonomousDecisions / (stats.autonomousDecisions + stats.consensusDecisions) : 0;
|
|
942
|
+
|
|
943
|
+
return stats;
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
/**
|
|
947
|
+
* Connect two agents as peers
|
|
948
|
+
* @param {string} agentId1 - First agent
|
|
949
|
+
* @param {string} agentId2 - Second agent
|
|
950
|
+
*/
|
|
951
|
+
connectAgents(agentId1, agentId2) {
|
|
952
|
+
const agent1 = this.cognitiveAgents.get(agentId1);
|
|
953
|
+
const agent2 = this.cognitiveAgents.get(agentId2);
|
|
954
|
+
|
|
955
|
+
if (agent1 && agent2) {
|
|
956
|
+
agent1.peerConnections.add(agentId2);
|
|
957
|
+
agent2.peerConnections.add(agentId1);
|
|
958
|
+
|
|
959
|
+
console.log(`Connected DAA agents ${agentId1} and ${agentId2}`);
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* Create mesh network of agents
|
|
965
|
+
* @param {Array} agentIds - List of agent IDs
|
|
966
|
+
*/
|
|
967
|
+
createMeshNetwork(agentIds) {
|
|
968
|
+
// Connect every agent to every other agent
|
|
969
|
+
for (let i = 0; i < agentIds.length; i++) {
|
|
970
|
+
for (let j = i + 1; j < agentIds.length; j++) {
|
|
971
|
+
this.connectAgents(agentIds[i], agentIds[j]);
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
console.log(`Created mesh network with ${agentIds.length} agents`);
|
|
976
|
+
}
|
|
977
|
+
}
|