claude-flow
Version:
Ruflo - Enterprise AI agent orchestration for Claude Code. Deploy 60+ specialized agents in coordinated swarms with self-learning, fault-tolerant consensus, vector memory, and MCP integration
193 lines • 10.7 kB
JavaScript
/**
* Event Store Usage Example
*
* Demonstrates how to use the Event Sourcing system in V3 Claude Flow.
*
* Usage:
* npx tsx v3/@claude-flow/shared/src/events/example-usage.ts
*/
import { EventStore } from './event-store.js';
import { AgentStateProjection, TaskHistoryProjection, MemoryIndexProjection } from './projections.js';
import { createAgentSpawnedEvent, createAgentStartedEvent, createAgentTaskAssignedEvent, createAgentTaskCompletedEvent, createTaskCreatedEvent, createTaskStartedEvent, createTaskCompletedEvent, createMemoryStoredEvent, createMemoryRetrievedEvent, createSwarmInitializedEvent, createSwarmScaledEvent, } from './domain-events.js';
async function main() {
console.log('Event Sourcing Example - V3 Claude Flow\n');
// =========================================================================
// 1. Initialize Event Store
// =========================================================================
console.log('1. Initializing Event Store...');
const eventStore = new EventStore({
databasePath: './event-store-example.db',
verbose: true,
autoPersistInterval: 0, // Manual persist for demo
});
await eventStore.initialize();
console.log(' Event Store initialized\n');
// =========================================================================
// 2. Record Swarm Initialization Events
// =========================================================================
console.log('2. Recording Swarm Events...');
await eventStore.append(createSwarmInitializedEvent('hierarchical-mesh', 15, {
security: { strict: true },
memory: { backend: 'agentdb' },
}));
await eventStore.append(createSwarmScaledEvent(0, 5, 'Initial agent spawn'));
console.log(' Swarm events recorded\n');
// =========================================================================
// 3. Record Agent Lifecycle Events
// =========================================================================
console.log('3. Recording Agent Lifecycle Events...');
// Agent 1: Queen Coordinator
await eventStore.append(createAgentSpawnedEvent('agent-1', 'queen-coordinator', 'coordination', [
'orchestration',
'task-assignment',
]));
await eventStore.append(createAgentStartedEvent('agent-1'));
// Agent 2: Security Architect
await eventStore.append(createAgentSpawnedEvent('agent-2', 'security-architect', 'security', [
'threat-modeling',
'security-design',
]));
await eventStore.append(createAgentStartedEvent('agent-2'));
// Agent 3: Core Architect
await eventStore.append(createAgentSpawnedEvent('agent-3', 'core-architect', 'core', ['ddd-design', 'architecture']));
await eventStore.append(createAgentStartedEvent('agent-3'));
console.log(' Agent events recorded\n');
// =========================================================================
// 4. Record Task Execution Events
// =========================================================================
console.log('4. Recording Task Execution Events...');
// Task 1: Security Audit
await eventStore.append(createTaskCreatedEvent('task-1', 'security-audit', 'Audit CVE-1 (Command Injection)', 'Review and fix command injection vulnerability', 'critical', []));
await eventStore.append(createTaskStartedEvent('task-1', 'agent-2'));
await eventStore.append(createAgentTaskAssignedEvent('agent-2', 'task-1', Date.now()));
// Example: Async work gap between task start and completion
await new Promise((resolve) => setTimeout(resolve, 100));
await eventStore.append(createTaskCompletedEvent('task-1', { vulnerabilitiesFixed: 3, severity: 'high' }, 5234));
await eventStore.append(createAgentTaskCompletedEvent('agent-2', 'task-1', { success: true }, Date.now(), 5234));
// Task 2: DDD Architecture Design
await eventStore.append(createTaskCreatedEvent('task-2', 'architecture-design', 'Design V3 Domain Structure', 'Implement bounded contexts for V3', 'high', []));
await eventStore.append(createTaskStartedEvent('task-2', 'agent-3'));
await eventStore.append(createAgentTaskAssignedEvent('agent-3', 'task-2', Date.now()));
console.log(' Task events recorded\n');
// =========================================================================
// 5. Record Memory Operations Events
// =========================================================================
console.log('5. Recording Memory Operations Events...');
await eventStore.append(createMemoryStoredEvent('mem-1', 'agent-context', 'agent-2-state', 'episodic', 2048));
await eventStore.append(createMemoryStoredEvent('mem-2', 'task-results', 'task-1-result', 'semantic', 1024));
await eventStore.append(createMemoryRetrievedEvent('mem-1', 'agent-context', 'agent-2-state', 1));
await eventStore.append(createMemoryRetrievedEvent('mem-1', 'agent-context', 'agent-2-state', 2));
console.log(' Memory events recorded\n');
// =========================================================================
// 6. Query Events
// =========================================================================
console.log('6. Querying Events...\n');
const allAgentEvents = await eventStore.query({ aggregateTypes: ['agent'] });
console.log(` Total agent events: ${allAgentEvents.length}`);
const allTaskEvents = await eventStore.query({ aggregateTypes: ['task'] });
console.log(` Total task events: ${allTaskEvents.length}`);
const completedTaskEvents = await eventStore.getEventsByType('task:completed');
console.log(` Completed task events: ${completedTaskEvents.length}`);
console.log();
// =========================================================================
// 7. Build Projections
// =========================================================================
console.log('7. Building Projections...\n');
// Agent State Projection
const agentProjection = new AgentStateProjection(eventStore);
await agentProjection.initialize();
console.log(' Agent State Projection:');
const allAgents = agentProjection.getAllAgents();
for (const agent of allAgents) {
console.log(` - ${agent.id}: ${agent.role} (${agent.status})`);
console.log(` Tasks completed: ${agent.completedTasks.length}`);
console.log(` Avg duration: ${agent.taskCount > 0 ? agent.totalTaskDuration / agent.taskCount : 0}ms`);
}
const activeAgents = agentProjection.getActiveAgentCount();
console.log(`\n Active agents: ${activeAgents}`);
// Task History Projection
const taskProjection = new TaskHistoryProjection(eventStore);
await taskProjection.initialize();
console.log('\n Task History Projection:');
const allTasks = taskProjection.getAllTasks();
for (const task of allTasks) {
console.log(` - ${task.id}: ${task.title} (${task.status})`);
console.log(` Assigned to: ${task.assignedAgent || 'unassigned'}`);
console.log(` Duration: ${task.duration || 'N/A'}ms`);
}
const avgTaskDuration = taskProjection.getAverageTaskDuration();
console.log(`\n Average task duration: ${avgTaskDuration.toFixed(2)}ms`);
// Memory Index Projection
const memoryProjection = new MemoryIndexProjection(eventStore);
await memoryProjection.initialize();
console.log('\n Memory Index Projection:');
const activeMemories = memoryProjection.getActiveMemories();
for (const memory of activeMemories) {
console.log(` - ${memory.id}: ${memory.namespace}/${memory.key}`);
console.log(` Size: ${memory.size} bytes, Accessed: ${memory.accessCount} times`);
}
const totalSize = activeMemories.reduce((sum, m) => sum + m.size, 0);
console.log(`\n Total memory used: ${totalSize} bytes`);
// =========================================================================
// 8. Event Replay
// =========================================================================
console.log('\n8. Event Replay Example...\n');
let replayCount = 0;
for await (const event of eventStore.replay(0)) {
replayCount++;
if (replayCount <= 3) {
console.log(` Replaying: ${event.type} (v${event.version})`);
}
}
console.log(` Total events replayed: ${replayCount}`);
// =========================================================================
// 9. Snapshots
// =========================================================================
console.log('\n9. Snapshot Example...\n');
const agent2State = agentProjection.getAgent('agent-2');
if (agent2State) {
await eventStore.saveSnapshot({
aggregateId: 'agent-2',
aggregateType: 'agent',
version: 5,
state: agent2State,
timestamp: Date.now(),
});
console.log(' Snapshot saved for agent-2');
const snapshot = await eventStore.getSnapshot('agent-2');
console.log(` Snapshot retrieved: version ${snapshot?.version}`);
}
// =========================================================================
// 10. Statistics
// =========================================================================
console.log('\n10. Event Store Statistics...\n');
const stats = await eventStore.getStats();
console.log(` Total events: ${stats.totalEvents}`);
console.log(` Events by type:`);
for (const [type, count] of Object.entries(stats.eventsByType)) {
console.log(` - ${type}: ${count}`);
}
console.log(`\n Events by aggregate:`);
const topAggregates = Object.entries(stats.eventsByAggregate)
.sort(([, a], [, b]) => b - a)
.slice(0, 5);
for (const [aggregate, count] of topAggregates) {
console.log(` - ${aggregate}: ${count}`);
}
console.log(`\n Snapshots: ${stats.snapshotCount}`);
// =========================================================================
// Cleanup
// =========================================================================
console.log('\n11. Persisting and Shutting Down...\n');
await eventStore.persist();
await eventStore.shutdown();
console.log(' Event Store shutdown complete');
console.log('\nExample completed successfully!');
console.log('Database saved to: ./event-store-example.db');
}
// Run the example
main().catch((error) => {
console.error('Error running example:', error);
process.exit(1);
});
//# sourceMappingURL=example-usage.js.map