@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.
Files changed (87) hide show
  1. package/README.md +1565 -0
  2. package/bin/ruv-swarm-clean.js +1872 -0
  3. package/bin/ruv-swarm-memory.js +119 -0
  4. package/bin/ruv-swarm-secure-heartbeat.js +1549 -0
  5. package/bin/ruv-swarm-secure.js +1689 -0
  6. package/package.json +221 -0
  7. package/src/agent.ts +342 -0
  8. package/src/benchmark.js +267 -0
  9. package/src/claude-flow-enhanced.js +839 -0
  10. package/src/claude-integration/advanced-commands.js +561 -0
  11. package/src/claude-integration/core.js +112 -0
  12. package/src/claude-integration/docs.js +1548 -0
  13. package/src/claude-integration/env-template.js +39 -0
  14. package/src/claude-integration/index.js +209 -0
  15. package/src/claude-integration/remote.js +408 -0
  16. package/src/cli-diagnostics.js +364 -0
  17. package/src/cognitive-pattern-evolution.js +1317 -0
  18. package/src/daa-cognition.js +977 -0
  19. package/src/daa-service.d.ts +298 -0
  20. package/src/daa-service.js +1116 -0
  21. package/src/diagnostics.js +533 -0
  22. package/src/errors.js +528 -0
  23. package/src/github-coordinator/README.md +193 -0
  24. package/src/github-coordinator/claude-hooks.js +162 -0
  25. package/src/github-coordinator/gh-cli-coordinator.js +260 -0
  26. package/src/hooks/cli.js +82 -0
  27. package/src/hooks/index.js +1900 -0
  28. package/src/index-enhanced.d.ts +371 -0
  29. package/src/index-enhanced.js +734 -0
  30. package/src/index.d.ts +287 -0
  31. package/src/index.js +405 -0
  32. package/src/index.ts +457 -0
  33. package/src/logger.js +182 -0
  34. package/src/logging-config.js +179 -0
  35. package/src/mcp-daa-tools.js +735 -0
  36. package/src/mcp-tools-benchmarks.js +328 -0
  37. package/src/mcp-tools-enhanced.js +2863 -0
  38. package/src/memory-config.js +42 -0
  39. package/src/meta-learning-framework.js +1359 -0
  40. package/src/neural-agent.js +830 -0
  41. package/src/neural-coordination-protocol.js +1363 -0
  42. package/src/neural-models/README.md +118 -0
  43. package/src/neural-models/autoencoder.js +543 -0
  44. package/src/neural-models/base.js +269 -0
  45. package/src/neural-models/cnn.js +497 -0
  46. package/src/neural-models/gnn.js +447 -0
  47. package/src/neural-models/gru.js +536 -0
  48. package/src/neural-models/index.js +273 -0
  49. package/src/neural-models/lstm.js +551 -0
  50. package/src/neural-models/neural-presets-complete.js +1306 -0
  51. package/src/neural-models/presets/graph.js +392 -0
  52. package/src/neural-models/presets/index.js +279 -0
  53. package/src/neural-models/presets/nlp.js +328 -0
  54. package/src/neural-models/presets/timeseries.js +368 -0
  55. package/src/neural-models/presets/vision.js +387 -0
  56. package/src/neural-models/resnet.js +534 -0
  57. package/src/neural-models/transformer.js +515 -0
  58. package/src/neural-models/vae.js +489 -0
  59. package/src/neural-network-manager.js +1938 -0
  60. package/src/neural-network.ts +296 -0
  61. package/src/neural.js +574 -0
  62. package/src/performance-benchmarks.js +898 -0
  63. package/src/performance.js +458 -0
  64. package/src/persistence-pooled.js +695 -0
  65. package/src/persistence.js +480 -0
  66. package/src/schemas.js +864 -0
  67. package/src/security.js +218 -0
  68. package/src/singleton-container.js +183 -0
  69. package/src/sqlite-pool.js +587 -0
  70. package/src/sqlite-worker.js +141 -0
  71. package/src/types.ts +164 -0
  72. package/src/utils.ts +286 -0
  73. package/src/wasm-loader.js +601 -0
  74. package/src/wasm-loader2.js +404 -0
  75. package/src/wasm-memory-optimizer.js +783 -0
  76. package/src/wasm-types.d.ts +63 -0
  77. package/wasm/README.md +347 -0
  78. package/wasm/neuro-divergent.wasm +0 -0
  79. package/wasm/package.json +18 -0
  80. package/wasm/ruv-fann.wasm +0 -0
  81. package/wasm/ruv_swarm_simd.wasm +0 -0
  82. package/wasm/ruv_swarm_wasm.d.ts +391 -0
  83. package/wasm/ruv_swarm_wasm.js +2164 -0
  84. package/wasm/ruv_swarm_wasm_bg.wasm +0 -0
  85. package/wasm/ruv_swarm_wasm_bg.wasm.d.ts +123 -0
  86. package/wasm/wasm-bindings-loader.mjs +435 -0
  87. package/wasm/wasm-updates.md +684 -0
@@ -0,0 +1,480 @@
1
+ /**
2
+ * SQLite Persistence Layer for @sparkleideas/ruv-swarm MCP
3
+ */
4
+
5
+ import Database from 'better-sqlite3';
6
+ import path from 'path';
7
+ import fs from 'fs';
8
+
9
+ class SwarmPersistence {
10
+ constructor(dbPath = path.join(new URL('.', import.meta.url).pathname, '..', 'data', '@sparkleideas/ruv-swarm.db')) {
11
+ // Ensure data directory exists
12
+ const dataDir = path.dirname(dbPath);
13
+ if (!fs.existsSync(dataDir)) {
14
+ fs.mkdirSync(dataDir, { recursive: true });
15
+ }
16
+
17
+ this.db = new Database(dbPath);
18
+ this.initDatabase();
19
+ }
20
+
21
+ initDatabase() {
22
+ // Enable foreign keys
23
+ this.db.exec('PRAGMA foreign_keys = ON');
24
+
25
+ // Create tables
26
+ this.db.exec(`
27
+ CREATE TABLE IF NOT EXISTS swarms (
28
+ id TEXT PRIMARY KEY,
29
+ name TEXT NOT NULL,
30
+ topology TEXT NOT NULL,
31
+ max_agents INTEGER NOT NULL,
32
+ strategy TEXT,
33
+ status TEXT DEFAULT 'active',
34
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
35
+ metadata TEXT
36
+ );
37
+
38
+ CREATE TABLE IF NOT EXISTS agents (
39
+ id TEXT PRIMARY KEY,
40
+ swarm_id TEXT,
41
+ name TEXT NOT NULL,
42
+ type TEXT NOT NULL,
43
+ status TEXT DEFAULT 'idle',
44
+ capabilities TEXT,
45
+ neural_config TEXT,
46
+ metrics TEXT,
47
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
48
+ FOREIGN KEY (swarm_id) REFERENCES swarms(id)
49
+ );
50
+
51
+ CREATE TABLE IF NOT EXISTS tasks (
52
+ id TEXT PRIMARY KEY,
53
+ swarm_id TEXT,
54
+ description TEXT,
55
+ priority TEXT DEFAULT 'medium',
56
+ status TEXT DEFAULT 'pending',
57
+ assigned_agents TEXT,
58
+ result TEXT,
59
+ error TEXT,
60
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
61
+ completed_at DATETIME,
62
+ execution_time_ms INTEGER,
63
+ FOREIGN KEY (swarm_id) REFERENCES swarms(id)
64
+ );
65
+
66
+ CREATE TABLE IF NOT EXISTS task_results (
67
+ id TEXT PRIMARY KEY,
68
+ task_id TEXT NOT NULL,
69
+ agent_id TEXT NOT NULL,
70
+ output TEXT,
71
+ metrics TEXT,
72
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
73
+ FOREIGN KEY (task_id) REFERENCES tasks(id),
74
+ FOREIGN KEY (agent_id) REFERENCES agents(id)
75
+ );
76
+
77
+ CREATE TABLE IF NOT EXISTS agent_memory (
78
+ id TEXT PRIMARY KEY,
79
+ agent_id TEXT NOT NULL,
80
+ key TEXT NOT NULL,
81
+ value TEXT,
82
+ ttl_secs INTEGER,
83
+ expires_at DATETIME,
84
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
85
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
86
+ FOREIGN KEY (agent_id) REFERENCES agents(id),
87
+ UNIQUE(agent_id, key)
88
+ );
89
+
90
+ CREATE TABLE IF NOT EXISTS metrics (
91
+ id TEXT PRIMARY KEY,
92
+ entity_type TEXT NOT NULL,
93
+ entity_id TEXT NOT NULL,
94
+ metric_name TEXT NOT NULL,
95
+ metric_value REAL,
96
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
97
+ );
98
+
99
+ CREATE TABLE IF NOT EXISTS neural_networks (
100
+ id TEXT PRIMARY KEY,
101
+ agent_id TEXT NOT NULL,
102
+ architecture TEXT NOT NULL,
103
+ weights TEXT,
104
+ training_data TEXT,
105
+ performance_metrics TEXT,
106
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
107
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
108
+ FOREIGN KEY (agent_id) REFERENCES agents(id)
109
+ );
110
+
111
+ CREATE TABLE IF NOT EXISTS events (
112
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
113
+ swarm_id TEXT,
114
+ event_type TEXT NOT NULL,
115
+ event_data TEXT,
116
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
117
+ );
118
+
119
+ -- Create indexes
120
+ CREATE INDEX IF NOT EXISTS idx_agents_swarm ON agents(swarm_id);
121
+ CREATE INDEX IF NOT EXISTS idx_tasks_swarm ON tasks(swarm_id);
122
+ CREATE INDEX IF NOT EXISTS idx_task_results_task ON task_results(task_id);
123
+ CREATE INDEX IF NOT EXISTS idx_task_results_agent ON task_results(agent_id);
124
+ CREATE INDEX IF NOT EXISTS idx_agent_memory_agent ON agent_memory(agent_id);
125
+ CREATE INDEX IF NOT EXISTS idx_metrics_entity ON metrics(entity_type, entity_id);
126
+ CREATE INDEX IF NOT EXISTS idx_events_swarm ON events(swarm_id);
127
+ CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
128
+ `);
129
+ }
130
+
131
+ // Swarm operations
132
+ createSwarm(swarm) {
133
+ const stmt = this.db.prepare(`
134
+ INSERT INTO swarms (id, name, topology, max_agents, strategy, metadata)
135
+ VALUES (?, ?, ?, ?, ?, ?)
136
+ `);
137
+ return stmt.run(
138
+ swarm.id,
139
+ swarm.name,
140
+ swarm.topology,
141
+ swarm.maxAgents,
142
+ swarm.strategy,
143
+ JSON.stringify(swarm.metadata || {}),
144
+ );
145
+ }
146
+
147
+ getActiveSwarms() {
148
+ const stmt = this.db.prepare('SELECT * FROM swarms WHERE status = ?');
149
+ const swarms = stmt.all('active');
150
+ return swarms.map(s => {
151
+ s.metadata = JSON.parse(s.metadata || '{}');
152
+ return s;
153
+ });
154
+ }
155
+
156
+ // Agent operations
157
+ createAgent(agent) {
158
+ const stmt = this.db.prepare(`
159
+ INSERT INTO agents (id, swarm_id, name, type, capabilities, neural_config, metrics)
160
+ VALUES (?, ?, ?, ?, ?, ?, ?)
161
+ `);
162
+ return stmt.run(
163
+ agent.id,
164
+ agent.swarmId,
165
+ agent.name,
166
+ agent.type,
167
+ JSON.stringify(agent.capabilities || []),
168
+ JSON.stringify(agent.neuralConfig || {}),
169
+ JSON.stringify(agent.metrics || {}),
170
+ );
171
+ }
172
+
173
+ updateAgentStatus(agentId, status) {
174
+ const stmt = this.db.prepare('UPDATE agents SET status = ? WHERE id = ?');
175
+ return stmt.run(status, agentId);
176
+ }
177
+
178
+ getAgent(id) {
179
+ const stmt = this.db.prepare('SELECT * FROM agents WHERE id = ?');
180
+ const agent = stmt.get(id);
181
+ if (agent) {
182
+ agent.capabilities = JSON.parse(agent.capabilities || '[]');
183
+ agent.neural_config = JSON.parse(agent.neural_config || '{}');
184
+ agent.metrics = JSON.parse(agent.metrics || '{}');
185
+ }
186
+ return agent;
187
+ }
188
+
189
+ getSwarmAgents(swarmId, filter = 'all') {
190
+ let query = 'SELECT * FROM agents WHERE swarm_id = ?';
191
+ const params = [swarmId];
192
+
193
+ if (filter !== 'all') {
194
+ query += ' AND status = ?';
195
+ params.push(filter);
196
+ }
197
+
198
+ const stmt = this.db.prepare(query);
199
+ const agents = stmt.all(...params);
200
+
201
+ return agents.map(a => {
202
+ a.capabilities = JSON.parse(a.capabilities || '[]');
203
+ a.neural_config = JSON.parse(a.neural_config || '{}');
204
+ a.metrics = JSON.parse(a.metrics || '{}');
205
+ return a;
206
+ });
207
+ }
208
+
209
+ // Task operations
210
+ createTask(task) {
211
+ const stmt = this.db.prepare(`
212
+ INSERT INTO tasks (id, swarm_id, description, priority, status, assigned_agents)
213
+ VALUES (?, ?, ?, ?, ?, ?)
214
+ `);
215
+ return stmt.run(
216
+ task.id,
217
+ task.swarmId,
218
+ task.description,
219
+ task.priority || 'medium',
220
+ task.status || 'pending',
221
+ JSON.stringify(task.assignedAgents || []),
222
+ );
223
+ }
224
+
225
+ updateTask(taskId, updates) {
226
+ const fields = [];
227
+ const values = [];
228
+
229
+ Object.entries(updates).forEach(([key, value]) => {
230
+ if (key === 'assignedAgents' || key === 'result') {
231
+ fields.push(`${key} = ?`);
232
+ values.push(JSON.stringify(value));
233
+ } else {
234
+ fields.push(`${key} = ?`);
235
+ values.push(value);
236
+ }
237
+ });
238
+
239
+ values.push(taskId);
240
+ const stmt = this.db.prepare(`UPDATE tasks SET ${fields.join(', ')} WHERE id = ?`);
241
+ return stmt.run(...values);
242
+ }
243
+
244
+ getTask(id) {
245
+ const stmt = this.db.prepare('SELECT * FROM tasks WHERE id = ?');
246
+ const task = stmt.get(id);
247
+ if (task) {
248
+ task.assigned_agents = JSON.parse(task.assigned_agents || '[]');
249
+ task.result = task.result ? JSON.parse(task.result) : null;
250
+ }
251
+ return task;
252
+ }
253
+
254
+ getSwarmTasks(swarmId, status = null) {
255
+ let query = 'SELECT * FROM tasks WHERE swarm_id = ?';
256
+ const params = [swarmId];
257
+
258
+ if (status) {
259
+ query += ' AND status = ?';
260
+ params.push(status);
261
+ }
262
+
263
+ const stmt = this.db.prepare(query);
264
+ const tasks = stmt.all(...params);
265
+
266
+ return tasks.map(t => {
267
+ t.assigned_agents = JSON.parse(t.assigned_agents || '[]');
268
+ t.result = t.result ? JSON.parse(t.result) : null;
269
+ return t;
270
+ });
271
+ }
272
+
273
+ // Memory operations
274
+ storeAgentMemory(agentId, key, value) {
275
+ const stmt = this.db.prepare(`
276
+ INSERT INTO agent_memory (id, agent_id, key, value)
277
+ VALUES (?, ?, ?, ?)
278
+ ON CONFLICT(agent_id, key) DO UPDATE SET
279
+ value = excluded.value,
280
+ updated_at = CURRENT_TIMESTAMP
281
+ `);
282
+ const id = `mem_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
283
+ return stmt.run(id, agentId, key, JSON.stringify(value));
284
+ }
285
+
286
+ getAgentMemory(agentId, key = null) {
287
+ if (key) {
288
+ const stmt = this.db.prepare('SELECT * FROM agent_memory WHERE agent_id = ? AND key = ?');
289
+ const memory = stmt.get(agentId, key);
290
+ if (memory) {
291
+ memory.value = JSON.parse(memory.value);
292
+ }
293
+ return memory;
294
+ }
295
+ const stmt = this.db.prepare('SELECT * FROM agent_memory WHERE agent_id = ?');
296
+ const memories = stmt.all(agentId);
297
+ return memories.map(m => {
298
+ m.value = JSON.parse(m.value);
299
+ return m;
300
+ });
301
+
302
+ }
303
+
304
+ // Neural network operations
305
+ storeNeuralNetwork(network) {
306
+ const stmt = this.db.prepare(`
307
+ INSERT INTO neural_networks (id, agent_id, architecture, weights, training_data, performance_metrics)
308
+ VALUES (?, ?, ?, ?, ?, ?)
309
+ `);
310
+ const id = `nn_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
311
+ return stmt.run(
312
+ id,
313
+ network.agentId,
314
+ JSON.stringify(network.architecture),
315
+ JSON.stringify(network.weights),
316
+ JSON.stringify(network.trainingData || {}),
317
+ JSON.stringify(network.performanceMetrics || {}),
318
+ );
319
+ }
320
+
321
+ updateNeuralNetwork(id, updates) {
322
+ const fields = [];
323
+ const values = [];
324
+
325
+ Object.entries(updates).forEach(([key, value]) => {
326
+ fields.push(`${key} = ?`);
327
+ values.push(JSON.stringify(value));
328
+ });
329
+
330
+ fields.push('updated_at = CURRENT_TIMESTAMP');
331
+ values.push(id);
332
+
333
+ const stmt = this.db.prepare(`UPDATE neural_networks SET ${fields.join(', ')} WHERE id = ?`);
334
+ return stmt.run(...values);
335
+ }
336
+
337
+ getAgentNeuralNetworks(agentId) {
338
+ const stmt = this.db.prepare('SELECT * FROM neural_networks WHERE agent_id = ?');
339
+ const networks = stmt.all(agentId);
340
+
341
+ return networks.map(n => {
342
+ n.architecture = JSON.parse(n.architecture);
343
+ n.weights = JSON.parse(n.weights);
344
+ n.training_data = JSON.parse(n.training_data || '{}');
345
+ n.performance_metrics = JSON.parse(n.performance_metrics || '{}');
346
+ return n;
347
+ });
348
+ }
349
+
350
+ // Metrics operations
351
+ recordMetric(entityType, entityId, metricName, metricValue) {
352
+ const stmt = this.db.prepare(`
353
+ INSERT INTO metrics (id, entity_type, entity_id, metric_name, metric_value)
354
+ VALUES (?, ?, ?, ?, ?)
355
+ `);
356
+ const id = `metric_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
357
+ return stmt.run(id, entityType, entityId, metricName, metricValue);
358
+ }
359
+
360
+ getMetrics(entityType, entityId, metricName = null) {
361
+ let query = 'SELECT * FROM metrics WHERE entity_type = ? AND entity_id = ?';
362
+ const params = [entityType, entityId];
363
+
364
+ if (metricName) {
365
+ query += ' AND metric_name = ?';
366
+ params.push(metricName);
367
+ }
368
+
369
+ query += ' ORDER BY timestamp DESC LIMIT 100';
370
+
371
+ const stmt = this.db.prepare(query);
372
+ return stmt.all(...params);
373
+ }
374
+
375
+ // Event logging
376
+ logEvent(swarmId, eventType, eventData) {
377
+ const stmt = this.db.prepare(`
378
+ INSERT INTO events (swarm_id, event_type, event_data)
379
+ VALUES (?, ?, ?)
380
+ `);
381
+ return stmt.run(swarmId, eventType, JSON.stringify(eventData));
382
+ }
383
+
384
+ getSwarmEvents(swarmId, limit = 100) {
385
+ const stmt = this.db.prepare(`
386
+ SELECT * FROM events
387
+ WHERE swarm_id = ?
388
+ ORDER BY timestamp DESC
389
+ LIMIT ?
390
+ `);
391
+ const events = stmt.all(swarmId, limit);
392
+
393
+ return events.map(e => {
394
+ e.event_data = JSON.parse(e.event_data || '{}');
395
+ return e;
396
+ });
397
+ }
398
+
399
+ // Memory operations
400
+ storeMemory(agentId, key, value, ttlSecs = null) {
401
+ const expiresAt = ttlSecs ? new Date(Date.now() + ttlSecs * 1000).toISOString() : null;
402
+
403
+ const stmt = this.db.prepare(`
404
+ INSERT OR REPLACE INTO agent_memory (id, agent_id, key, value, ttl_secs, expires_at, updated_at)
405
+ VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
406
+ `);
407
+
408
+ const id = `mem_${agentId}_${Date.now()}`;
409
+ return stmt.run(id, agentId, key, JSON.stringify(value), ttlSecs, expiresAt);
410
+ }
411
+
412
+ getMemory(agentId, key) {
413
+ // First cleanup expired entries
414
+ this.cleanupExpiredMemory();
415
+
416
+ const stmt = this.db.prepare(`
417
+ SELECT * FROM agent_memory
418
+ WHERE agent_id = ? AND key = ?
419
+ AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
420
+ `);
421
+
422
+ const memory = stmt.get(agentId, key);
423
+ return memory ? {
424
+ ...memory,
425
+ value: JSON.parse(memory.value),
426
+ } : null;
427
+ }
428
+
429
+ getAllMemory(agentId) {
430
+ // First cleanup expired entries
431
+ this.cleanupExpiredMemory();
432
+
433
+ const stmt = this.db.prepare(`
434
+ SELECT * FROM agent_memory
435
+ WHERE agent_id = ?
436
+ AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
437
+ ORDER BY updated_at DESC
438
+ `);
439
+
440
+ const memories = stmt.all(agentId);
441
+ return memories.map(m => ({
442
+ ...m,
443
+ value: JSON.parse(m.value),
444
+ }));
445
+ }
446
+
447
+ deleteMemory(agentId, key) {
448
+ const stmt = this.db.prepare('DELETE FROM agent_memory WHERE agent_id = ? AND key = ?');
449
+ return stmt.run(agentId, key);
450
+ }
451
+
452
+ cleanupExpiredMemory() {
453
+ const stmt = this.db.prepare('DELETE FROM agent_memory WHERE expires_at IS NOT NULL AND expires_at <= CURRENT_TIMESTAMP');
454
+ return stmt.run();
455
+ }
456
+
457
+ // Cleanup operations
458
+ cleanup() {
459
+ // Delete expired memories
460
+ this.cleanupExpiredMemory();
461
+
462
+ // Delete old events (older than 7 days)
463
+ const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
464
+ this.db.prepare('DELETE FROM events WHERE timestamp < ?').run(sevenDaysAgo);
465
+
466
+ // Delete old metrics (older than 30 days)
467
+ const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString();
468
+ this.db.prepare('DELETE FROM metrics WHERE timestamp < ?').run(thirtyDaysAgo);
469
+
470
+ // Vacuum to reclaim space
471
+ this.db.exec('VACUUM');
472
+ }
473
+
474
+ // Close database connection
475
+ close() {
476
+ this.db.close();
477
+ }
478
+ }
479
+
480
+ export { SwarmPersistence };