claude-flow-novice 2.0.3 → 2.0.4
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/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -3,788 +3,661 @@
|
|
|
3
3
|
* Supports both .swarm/ and .hive-mind/ directories with SQLite backend
|
|
4
4
|
*
|
|
5
5
|
* @module shared-memory
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import { EventEmitter } from 'events';
|
|
12
|
-
import { performance } from 'perf_hooks';
|
|
13
|
-
|
|
6
|
+
*/ import Database from "better-sqlite3";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import fs from "node:fs/promises";
|
|
9
|
+
import { EventEmitter } from "events";
|
|
10
|
+
import { performance } from "perf_hooks";
|
|
14
11
|
/**
|
|
15
12
|
* Migration definitions for schema evolution
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
CREATE INDEX IF NOT EXISTS
|
|
57
|
-
CREATE INDEX IF NOT EXISTS
|
|
58
|
-
CREATE INDEX IF NOT EXISTS
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
('
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
];
|
|
82
|
-
|
|
13
|
+
*/ const MIGRATIONS = [
|
|
14
|
+
{
|
|
15
|
+
version: 1,
|
|
16
|
+
description: 'Initial schema',
|
|
17
|
+
sql: `
|
|
18
|
+
-- Memory store table
|
|
19
|
+
CREATE TABLE IF NOT EXISTS memory_store (
|
|
20
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
21
|
+
key TEXT NOT NULL,
|
|
22
|
+
namespace TEXT NOT NULL DEFAULT 'default',
|
|
23
|
+
value TEXT NOT NULL,
|
|
24
|
+
type TEXT NOT NULL DEFAULT 'json',
|
|
25
|
+
metadata TEXT,
|
|
26
|
+
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
27
|
+
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
28
|
+
accessed_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
29
|
+
access_count INTEGER NOT NULL DEFAULT 0,
|
|
30
|
+
ttl INTEGER,
|
|
31
|
+
expires_at INTEGER,
|
|
32
|
+
compressed INTEGER DEFAULT 0,
|
|
33
|
+
size INTEGER NOT NULL DEFAULT 0,
|
|
34
|
+
UNIQUE(key, namespace)
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
-- Metadata table for system information
|
|
38
|
+
CREATE TABLE IF NOT EXISTS metadata (
|
|
39
|
+
key TEXT PRIMARY KEY,
|
|
40
|
+
value TEXT NOT NULL,
|
|
41
|
+
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
-- Migrations tracking table
|
|
45
|
+
CREATE TABLE IF NOT EXISTS migrations (
|
|
46
|
+
version INTEGER PRIMARY KEY,
|
|
47
|
+
description TEXT,
|
|
48
|
+
applied_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
-- Performance indexes
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_memory_namespace ON memory_store(namespace);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_memory_expires ON memory_store(expires_at) WHERE expires_at IS NOT NULL;
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_memory_accessed ON memory_store(accessed_at);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_memory_key_namespace ON memory_store(key, namespace);
|
|
56
|
+
|
|
57
|
+
-- Insert initial metadata
|
|
58
|
+
INSERT OR IGNORE INTO metadata (key, value) VALUES
|
|
59
|
+
('version', '1.0.0'),
|
|
60
|
+
('created_at', strftime('%s', 'now'));
|
|
61
|
+
`
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
version: 2,
|
|
65
|
+
description: 'Add tags and search capabilities',
|
|
66
|
+
sql: `
|
|
67
|
+
-- Add tags column
|
|
68
|
+
ALTER TABLE memory_store ADD COLUMN tags TEXT;
|
|
69
|
+
|
|
70
|
+
-- Create tags index for faster searching
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_memory_tags ON memory_store(tags) WHERE tags IS NOT NULL;
|
|
72
|
+
|
|
73
|
+
-- Update version
|
|
74
|
+
UPDATE metadata SET value = '1.1.0', updated_at = strftime('%s', 'now') WHERE key = 'version';
|
|
75
|
+
`
|
|
76
|
+
}
|
|
77
|
+
];
|
|
83
78
|
/**
|
|
84
79
|
* High-performance LRU cache implementation
|
|
85
|
-
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
const entry = this.cache.get(firstKey);
|
|
171
|
-
this.cache.delete(firstKey);
|
|
172
|
-
this.currentMemory -= entry.size;
|
|
173
|
-
this.evictions++;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
80
|
+
*/ let LRUCache = class LRUCache {
|
|
81
|
+
get(key) {
|
|
82
|
+
if (this.cache.has(key)) {
|
|
83
|
+
const value = this.cache.get(key);
|
|
84
|
+
// Move to end (most recently used)
|
|
85
|
+
this.cache.delete(key);
|
|
86
|
+
this.cache.set(key, value);
|
|
87
|
+
this.hits++;
|
|
88
|
+
return value.data;
|
|
89
|
+
}
|
|
90
|
+
this.misses++;
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
set(key, data, size = 0) {
|
|
94
|
+
// Estimate size if not provided
|
|
95
|
+
if (!size) {
|
|
96
|
+
size = this._estimateSize(data);
|
|
97
|
+
}
|
|
98
|
+
// Handle memory pressure
|
|
99
|
+
while(this.currentMemory + size > this.maxMemory && this.cache.size > 0){
|
|
100
|
+
this._evictLRU();
|
|
101
|
+
}
|
|
102
|
+
// Handle size limit
|
|
103
|
+
while(this.cache.size >= this.maxSize){
|
|
104
|
+
this._evictLRU();
|
|
105
|
+
}
|
|
106
|
+
this.cache.set(key, {
|
|
107
|
+
data,
|
|
108
|
+
size,
|
|
109
|
+
timestamp: Date.now()
|
|
110
|
+
});
|
|
111
|
+
this.currentMemory += size;
|
|
112
|
+
}
|
|
113
|
+
delete(key) {
|
|
114
|
+
const entry = this.cache.get(key);
|
|
115
|
+
if (entry) {
|
|
116
|
+
this.currentMemory -= entry.size;
|
|
117
|
+
return this.cache.delete(key);
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
clear() {
|
|
122
|
+
this.cache.clear();
|
|
123
|
+
this.currentMemory = 0;
|
|
124
|
+
this.hits = 0;
|
|
125
|
+
this.misses = 0;
|
|
126
|
+
this.evictions = 0;
|
|
127
|
+
}
|
|
128
|
+
getStats() {
|
|
129
|
+
const total = this.hits + this.misses;
|
|
130
|
+
return {
|
|
131
|
+
size: this.cache.size,
|
|
132
|
+
memoryUsage: this.currentMemory,
|
|
133
|
+
memoryUsageMB: this.currentMemory / (1024 * 1024),
|
|
134
|
+
hitRate: total > 0 ? this.hits / total * 100 : 0,
|
|
135
|
+
evictions: this.evictions,
|
|
136
|
+
utilizationPercent: this.currentMemory / this.maxMemory * 100
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
_estimateSize(data) {
|
|
140
|
+
try {
|
|
141
|
+
return JSON.stringify(data).length * 2; // UTF-16 estimate
|
|
142
|
+
} catch {
|
|
143
|
+
return 1000; // Default for non-serializable
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
_evictLRU() {
|
|
147
|
+
const firstKey = this.cache.keys().next().value;
|
|
148
|
+
if (firstKey !== undefined) {
|
|
149
|
+
const entry = this.cache.get(firstKey);
|
|
150
|
+
this.cache.delete(firstKey);
|
|
151
|
+
this.currentMemory -= entry.size;
|
|
152
|
+
this.evictions++;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
constructor(maxSize = 1000, maxMemoryMB = 50){
|
|
156
|
+
this.maxSize = maxSize;
|
|
157
|
+
this.maxMemory = maxMemoryMB * 1024 * 1024;
|
|
158
|
+
this.cache = new Map();
|
|
159
|
+
this.currentMemory = 0;
|
|
160
|
+
this.hits = 0;
|
|
161
|
+
this.misses = 0;
|
|
162
|
+
this.evictions = 0;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
178
165
|
/**
|
|
179
166
|
* SharedMemory class - Core implementation
|
|
180
|
-
*/
|
|
181
|
-
|
|
182
|
-
constructor(options = {}) {
|
|
183
|
-
super();
|
|
184
|
-
|
|
185
|
-
this.options = {
|
|
186
|
-
directory: options.directory || '.hive-mind',
|
|
187
|
-
filename: options.filename || 'memory.db',
|
|
188
|
-
cacheSize: options.cacheSize || 1000,
|
|
189
|
-
cacheMemoryMB: options.cacheMemoryMB || 50,
|
|
190
|
-
compressionThreshold: options.compressionThreshold || 10240, // 10KB
|
|
191
|
-
gcInterval: options.gcInterval || 300000, // 5 minutes
|
|
192
|
-
enableWAL: options.enableWAL !== false,
|
|
193
|
-
enableVacuum: options.enableVacuum !== false,
|
|
194
|
-
...options,
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
this.db = null;
|
|
198
|
-
this.cache = new LRUCache(this.options.cacheSize, this.options.cacheMemoryMB);
|
|
199
|
-
this.statements = new Map();
|
|
200
|
-
this.gcTimer = null;
|
|
201
|
-
this.isInitialized = false;
|
|
202
|
-
|
|
203
|
-
// Performance tracking
|
|
204
|
-
this.metrics = {
|
|
205
|
-
operations: new Map(),
|
|
206
|
-
lastGC: Date.now(),
|
|
207
|
-
totalOperations: 0,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
167
|
+
*/ export class SharedMemory extends EventEmitter {
|
|
168
|
+
/**
|
|
212
169
|
* Initialize the database and run migrations
|
|
213
|
-
*/
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
} catch (error) {
|
|
246
|
-
this.emit('error', error);
|
|
247
|
-
throw new Error(`Failed to initialize SharedMemory: ${error.message}`);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
170
|
+
*/ async initialize() {
|
|
171
|
+
if (this.isInitialized) return;
|
|
172
|
+
const startTime = performance.now();
|
|
173
|
+
try {
|
|
174
|
+
// Ensure directory exists
|
|
175
|
+
await fs.mkdir(path.join(process.cwd(), this.options.directory), {
|
|
176
|
+
recursive: true
|
|
177
|
+
});
|
|
178
|
+
// Open database
|
|
179
|
+
const dbPath = path.join(process.cwd(), this.options.directory, this.options.filename);
|
|
180
|
+
this.db = new Database(dbPath);
|
|
181
|
+
// Configure for performance
|
|
182
|
+
this._configureDatabase();
|
|
183
|
+
// Run migrations
|
|
184
|
+
await this._runMigrations();
|
|
185
|
+
// Prepare statements
|
|
186
|
+
this._prepareStatements();
|
|
187
|
+
// Start garbage collection
|
|
188
|
+
this._startGarbageCollection();
|
|
189
|
+
this.isInitialized = true;
|
|
190
|
+
const duration = performance.now() - startTime;
|
|
191
|
+
this._recordMetric('initialize', duration);
|
|
192
|
+
this.emit('initialized', {
|
|
193
|
+
dbPath,
|
|
194
|
+
duration
|
|
195
|
+
});
|
|
196
|
+
} catch (error) {
|
|
197
|
+
this.emit('error', error);
|
|
198
|
+
throw new Error(`Failed to initialize SharedMemory: ${error.message}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
252
202
|
* Store a value in memory
|
|
253
|
-
*/
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
this.emit('error', error);
|
|
303
|
-
throw error;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
/**
|
|
203
|
+
*/ async store(key, value, options = {}) {
|
|
204
|
+
this._ensureInitialized();
|
|
205
|
+
const startTime = performance.now();
|
|
206
|
+
try {
|
|
207
|
+
const namespace = options.namespace || 'default';
|
|
208
|
+
const ttl = options.ttl;
|
|
209
|
+
const tags = options.tags ? JSON.stringify(options.tags) : null;
|
|
210
|
+
const metadata = options.metadata ? JSON.stringify(options.metadata) : null;
|
|
211
|
+
// Serialize value
|
|
212
|
+
let serialized = value;
|
|
213
|
+
let type = 'string';
|
|
214
|
+
let compressed = 0;
|
|
215
|
+
if (typeof value !== 'string') {
|
|
216
|
+
serialized = JSON.stringify(value);
|
|
217
|
+
type = 'json';
|
|
218
|
+
}
|
|
219
|
+
const size = Buffer.byteLength(serialized);
|
|
220
|
+
// Compress if needed
|
|
221
|
+
if (size > this.options.compressionThreshold) {
|
|
222
|
+
// In production, use proper compression
|
|
223
|
+
compressed = 1;
|
|
224
|
+
}
|
|
225
|
+
// Calculate expiry
|
|
226
|
+
const expiresAt = ttl ? Math.floor(Date.now() / 1000) + ttl : null;
|
|
227
|
+
// Store in database
|
|
228
|
+
this.statements.get('upsert').run(key, namespace, serialized, type, metadata, tags, ttl, expiresAt, compressed, size);
|
|
229
|
+
// Update cache
|
|
230
|
+
const cacheKey = this._getCacheKey(key, namespace);
|
|
231
|
+
this.cache.set(cacheKey, value, size);
|
|
232
|
+
const duration = performance.now() - startTime;
|
|
233
|
+
this._recordMetric('store', duration);
|
|
234
|
+
this.emit('stored', {
|
|
235
|
+
key,
|
|
236
|
+
namespace,
|
|
237
|
+
size,
|
|
238
|
+
compressed: !!compressed
|
|
239
|
+
});
|
|
240
|
+
return {
|
|
241
|
+
success: true,
|
|
242
|
+
key,
|
|
243
|
+
namespace,
|
|
244
|
+
size
|
|
245
|
+
};
|
|
246
|
+
} catch (error) {
|
|
247
|
+
this.emit('error', error);
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
308
252
|
* Retrieve a value from memory
|
|
309
|
-
*/
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
this.cache.set(cacheKey, value, row.size);
|
|
352
|
-
|
|
353
|
-
const duration = performance.now() - startTime;
|
|
354
|
-
this._recordMetric('retrieve_db', duration);
|
|
355
|
-
|
|
356
|
-
return value;
|
|
357
|
-
} catch (error) {
|
|
358
|
-
this.emit('error', error);
|
|
359
|
-
throw error;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
/**
|
|
253
|
+
*/ async retrieve(key, namespace = 'default') {
|
|
254
|
+
this._ensureInitialized();
|
|
255
|
+
const startTime = performance.now();
|
|
256
|
+
try {
|
|
257
|
+
// Check cache first
|
|
258
|
+
const cacheKey = this._getCacheKey(key, namespace);
|
|
259
|
+
const cached = this.cache.get(cacheKey);
|
|
260
|
+
if (cached !== null) {
|
|
261
|
+
this._recordMetric('retrieve_cache', performance.now() - startTime);
|
|
262
|
+
return cached;
|
|
263
|
+
}
|
|
264
|
+
// Get from database
|
|
265
|
+
const row = this.statements.get('select').get(key, namespace);
|
|
266
|
+
if (!row) {
|
|
267
|
+
this._recordMetric('retrieve_miss', performance.now() - startTime);
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
// Check expiry
|
|
271
|
+
if (row.expires_at && row.expires_at < Math.floor(Date.now() / 1000)) {
|
|
272
|
+
// Delete expired entry
|
|
273
|
+
this.statements.get('delete').run(key, namespace);
|
|
274
|
+
this._recordMetric('retrieve_expired', performance.now() - startTime);
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
// Update access stats
|
|
278
|
+
this.statements.get('updateAccess').run(key, namespace);
|
|
279
|
+
// Deserialize value
|
|
280
|
+
let value = row.value;
|
|
281
|
+
if (row.type === 'json') {
|
|
282
|
+
value = JSON.parse(value);
|
|
283
|
+
}
|
|
284
|
+
// Update cache
|
|
285
|
+
this.cache.set(cacheKey, value, row.size);
|
|
286
|
+
const duration = performance.now() - startTime;
|
|
287
|
+
this._recordMetric('retrieve_db', duration);
|
|
288
|
+
return value;
|
|
289
|
+
} catch (error) {
|
|
290
|
+
this.emit('error', error);
|
|
291
|
+
throw error;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
364
295
|
* List entries in a namespace
|
|
365
|
-
*/
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
throw error;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/**
|
|
296
|
+
*/ async list(namespace = 'default', options = {}) {
|
|
297
|
+
this._ensureInitialized();
|
|
298
|
+
const limit = options.limit || 100;
|
|
299
|
+
const offset = options.offset || 0;
|
|
300
|
+
try {
|
|
301
|
+
const rows = this.statements.get('list').all(namespace, limit, offset);
|
|
302
|
+
return rows.map((row)=>({
|
|
303
|
+
key: row.key,
|
|
304
|
+
namespace: row.namespace,
|
|
305
|
+
type: row.type,
|
|
306
|
+
size: row.size,
|
|
307
|
+
compressed: !!row.compressed,
|
|
308
|
+
tags: row.tags ? JSON.parse(row.tags) : [],
|
|
309
|
+
createdAt: new Date(row.created_at * 1000),
|
|
310
|
+
updatedAt: new Date(row.updated_at * 1000),
|
|
311
|
+
accessedAt: new Date(row.accessed_at * 1000),
|
|
312
|
+
accessCount: row.access_count,
|
|
313
|
+
expiresAt: row.expires_at ? new Date(row.expires_at * 1000) : null
|
|
314
|
+
}));
|
|
315
|
+
} catch (error) {
|
|
316
|
+
this.emit('error', error);
|
|
317
|
+
throw error;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
395
321
|
* Delete an entry
|
|
396
|
-
*/
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
/**
|
|
322
|
+
*/ async delete(key, namespace = 'default') {
|
|
323
|
+
this._ensureInitialized();
|
|
324
|
+
try {
|
|
325
|
+
// Remove from cache
|
|
326
|
+
const cacheKey = this._getCacheKey(key, namespace);
|
|
327
|
+
this.cache.delete(cacheKey);
|
|
328
|
+
// Remove from database
|
|
329
|
+
const result = this.statements.get('delete').run(key, namespace);
|
|
330
|
+
if (result.changes > 0) {
|
|
331
|
+
this.emit('deleted', {
|
|
332
|
+
key,
|
|
333
|
+
namespace
|
|
334
|
+
});
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
return false;
|
|
338
|
+
} catch (error) {
|
|
339
|
+
this.emit('error', error);
|
|
340
|
+
throw error;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
421
344
|
* Clear all entries in a namespace
|
|
422
|
-
*/
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
/**
|
|
345
|
+
*/ async clear(namespace = 'default') {
|
|
346
|
+
this._ensureInitialized();
|
|
347
|
+
try {
|
|
348
|
+
// Clear cache entries for namespace
|
|
349
|
+
for (const [key] of this.cache.cache){
|
|
350
|
+
if (key.startsWith(`${namespace}:`)) {
|
|
351
|
+
this.cache.delete(key);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Clear database entries
|
|
355
|
+
const result = this.statements.get('clearNamespace').run(namespace);
|
|
356
|
+
this.emit('cleared', {
|
|
357
|
+
namespace,
|
|
358
|
+
count: result.changes
|
|
359
|
+
});
|
|
360
|
+
return {
|
|
361
|
+
cleared: result.changes
|
|
362
|
+
};
|
|
363
|
+
} catch (error) {
|
|
364
|
+
this.emit('error', error);
|
|
365
|
+
throw error;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
447
369
|
* Get statistics
|
|
448
|
-
*/
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
throw error;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
/**
|
|
370
|
+
*/ async getStats() {
|
|
371
|
+
this._ensureInitialized();
|
|
372
|
+
try {
|
|
373
|
+
const dbStats = this.statements.get('stats').all();
|
|
374
|
+
const cacheStats = this.cache.getStats();
|
|
375
|
+
// Transform database stats
|
|
376
|
+
const namespaceStats = {};
|
|
377
|
+
for (const row of dbStats){
|
|
378
|
+
namespaceStats[row.namespace] = {
|
|
379
|
+
count: row.count,
|
|
380
|
+
totalSize: row.total_size,
|
|
381
|
+
avgSize: row.avg_size,
|
|
382
|
+
compressed: row.compressed_count
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
namespaces: namespaceStats,
|
|
387
|
+
cache: cacheStats,
|
|
388
|
+
metrics: this._getMetricsSummary(),
|
|
389
|
+
database: {
|
|
390
|
+
totalEntries: Object.values(namespaceStats).reduce((sum, ns)=>sum + ns.count, 0),
|
|
391
|
+
totalSize: Object.values(namespaceStats).reduce((sum, ns)=>sum + ns.totalSize, 0)
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
} catch (error) {
|
|
395
|
+
this.emit('error', error);
|
|
396
|
+
throw error;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
483
400
|
* Search entries by pattern or tags
|
|
484
|
-
*/
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
metadata: row.metadata ? JSON.parse(row.metadata) : null,
|
|
520
|
-
tags: row.tags ? JSON.parse(row.tags) : [],
|
|
521
|
-
}));
|
|
522
|
-
} catch (error) {
|
|
523
|
-
this.emit('error', error);
|
|
524
|
-
throw error;
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
/**
|
|
401
|
+
*/ async search(options = {}) {
|
|
402
|
+
this._ensureInitialized();
|
|
403
|
+
const { pattern, namespace, tags, limit = 50, offset = 0 } = options;
|
|
404
|
+
try {
|
|
405
|
+
let query = 'SELECT * FROM memory_store WHERE 1=1';
|
|
406
|
+
const params = [];
|
|
407
|
+
if (namespace) {
|
|
408
|
+
query += ' AND namespace = ?';
|
|
409
|
+
params.push(namespace);
|
|
410
|
+
}
|
|
411
|
+
if (pattern) {
|
|
412
|
+
query += ' AND key LIKE ?';
|
|
413
|
+
params.push(`%${pattern}%`);
|
|
414
|
+
}
|
|
415
|
+
if (tags && tags.length > 0) {
|
|
416
|
+
// Simple tag search - in production, use JSON functions
|
|
417
|
+
query += ' AND tags IS NOT NULL';
|
|
418
|
+
}
|
|
419
|
+
query += ' ORDER BY accessed_at DESC LIMIT ? OFFSET ?';
|
|
420
|
+
params.push(limit, offset);
|
|
421
|
+
const stmt = this.db.prepare(query);
|
|
422
|
+
const rows = stmt.all(...params);
|
|
423
|
+
return rows.map((row)=>({
|
|
424
|
+
key: row.key,
|
|
425
|
+
namespace: row.namespace,
|
|
426
|
+
value: row.type === 'json' ? JSON.parse(row.value) : row.value,
|
|
427
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : null,
|
|
428
|
+
tags: row.tags ? JSON.parse(row.tags) : []
|
|
429
|
+
}));
|
|
430
|
+
} catch (error) {
|
|
431
|
+
this.emit('error', error);
|
|
432
|
+
throw error;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
529
436
|
* Backup the database
|
|
530
|
-
*/
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
437
|
+
*/ async backup(filepath) {
|
|
438
|
+
this._ensureInitialized();
|
|
439
|
+
try {
|
|
440
|
+
await this.db.backup(filepath);
|
|
441
|
+
this.emit('backup', {
|
|
442
|
+
filepath
|
|
443
|
+
});
|
|
444
|
+
return {
|
|
445
|
+
success: true,
|
|
446
|
+
filepath
|
|
447
|
+
};
|
|
448
|
+
} catch (error) {
|
|
449
|
+
this.emit('error', error);
|
|
450
|
+
throw error;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
545
454
|
* Close the database connection
|
|
546
|
-
*/
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
this.emit('closed');
|
|
578
|
-
} catch (error) {
|
|
579
|
-
this.emit('error', error);
|
|
580
|
-
throw error;
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
/**
|
|
455
|
+
*/ async close() {
|
|
456
|
+
if (!this.isInitialized) return;
|
|
457
|
+
try {
|
|
458
|
+
// Stop garbage collection
|
|
459
|
+
if (this.gcTimer) {
|
|
460
|
+
clearInterval(this.gcTimer);
|
|
461
|
+
this.gcTimer = null;
|
|
462
|
+
}
|
|
463
|
+
// Final optimization
|
|
464
|
+
if (this.options.enableVacuum) {
|
|
465
|
+
this.db.pragma('optimize');
|
|
466
|
+
}
|
|
467
|
+
// Close statements
|
|
468
|
+
for (const stmt of this.statements.values()){
|
|
469
|
+
stmt.finalize();
|
|
470
|
+
}
|
|
471
|
+
this.statements.clear();
|
|
472
|
+
// Close database
|
|
473
|
+
this.db.close();
|
|
474
|
+
this.db = null;
|
|
475
|
+
// Clear cache
|
|
476
|
+
this.cache.clear();
|
|
477
|
+
this.isInitialized = false;
|
|
478
|
+
this.emit('closed');
|
|
479
|
+
} catch (error) {
|
|
480
|
+
this.emit('error', error);
|
|
481
|
+
throw error;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
585
485
|
* Private helper methods
|
|
586
|
-
*/
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
this.metrics.totalOperations++;
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
_getMetricsSummary() {
|
|
769
|
-
const summary = {};
|
|
770
|
-
|
|
771
|
-
for (const [operation, durations] of this.metrics.operations) {
|
|
772
|
-
if (durations.length > 0) {
|
|
773
|
-
summary[operation] = {
|
|
774
|
-
count: durations.length,
|
|
775
|
-
avg: durations.reduce((a, b) => a + b, 0) / durations.length,
|
|
776
|
-
min: Math.min(...durations),
|
|
777
|
-
max: Math.max(...durations),
|
|
778
|
-
};
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
summary.totalOperations = this.metrics.totalOperations;
|
|
783
|
-
summary.lastGC = new Date(this.metrics.lastGC).toISOString();
|
|
784
|
-
|
|
785
|
-
return summary;
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
|
|
789
|
-
// Export for backwards compatibility
|
|
790
|
-
export default SharedMemory;
|
|
486
|
+
*/ _ensureInitialized() {
|
|
487
|
+
if (!this.isInitialized) {
|
|
488
|
+
throw new Error('SharedMemory not initialized. Call initialize() first.');
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
_configureDatabase() {
|
|
492
|
+
// Performance optimizations
|
|
493
|
+
if (this.options.enableWAL) {
|
|
494
|
+
this.db.pragma('journal_mode = WAL');
|
|
495
|
+
}
|
|
496
|
+
this.db.pragma('synchronous = NORMAL');
|
|
497
|
+
this.db.pragma('cache_size = -64000'); // 64MB
|
|
498
|
+
this.db.pragma('temp_store = MEMORY');
|
|
499
|
+
this.db.pragma('mmap_size = 268435456'); // 256MB
|
|
500
|
+
}
|
|
501
|
+
_runMigrations() {
|
|
502
|
+
// Create migrations table if needed
|
|
503
|
+
this.db.exec(`
|
|
504
|
+
CREATE TABLE IF NOT EXISTS migrations (
|
|
505
|
+
version INTEGER PRIMARY KEY,
|
|
506
|
+
description TEXT,
|
|
507
|
+
applied_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
|
|
508
|
+
)
|
|
509
|
+
`);
|
|
510
|
+
// Get current version
|
|
511
|
+
const currentVersion = this.db.prepare('SELECT MAX(version) as version FROM migrations').get().version || 0;
|
|
512
|
+
// Run pending migrations
|
|
513
|
+
const pending = MIGRATIONS.filter((m)=>m.version > currentVersion);
|
|
514
|
+
if (pending.length > 0) {
|
|
515
|
+
const transaction = this.db.transaction((migrations)=>{
|
|
516
|
+
for (const migration of migrations){
|
|
517
|
+
this.db.exec(migration.sql);
|
|
518
|
+
this.db.prepare('INSERT INTO migrations (version, description) VALUES (?, ?)').run(migration.version, migration.description);
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
transaction(pending);
|
|
522
|
+
this.emit('migrated', {
|
|
523
|
+
from: currentVersion,
|
|
524
|
+
to: pending[pending.length - 1].version
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
_prepareStatements() {
|
|
529
|
+
// Upsert statement
|
|
530
|
+
this.statements.set('upsert', this.db.prepare(`
|
|
531
|
+
INSERT INTO memory_store (key, namespace, value, type, metadata, tags, ttl, expires_at, compressed, size)
|
|
532
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
533
|
+
ON CONFLICT(key, namespace) DO UPDATE SET
|
|
534
|
+
value = excluded.value,
|
|
535
|
+
type = excluded.type,
|
|
536
|
+
metadata = excluded.metadata,
|
|
537
|
+
tags = excluded.tags,
|
|
538
|
+
ttl = excluded.ttl,
|
|
539
|
+
expires_at = excluded.expires_at,
|
|
540
|
+
compressed = excluded.compressed,
|
|
541
|
+
size = excluded.size,
|
|
542
|
+
updated_at = strftime('%s', 'now'),
|
|
543
|
+
access_count = memory_store.access_count + 1
|
|
544
|
+
`));
|
|
545
|
+
// Select statement
|
|
546
|
+
this.statements.set('select', this.db.prepare(`
|
|
547
|
+
SELECT * FROM memory_store WHERE key = ? AND namespace = ?
|
|
548
|
+
`));
|
|
549
|
+
// Update access statement
|
|
550
|
+
this.statements.set('updateAccess', this.db.prepare(`
|
|
551
|
+
UPDATE memory_store
|
|
552
|
+
SET accessed_at = strftime('%s', 'now'), access_count = access_count + 1
|
|
553
|
+
WHERE key = ? AND namespace = ?
|
|
554
|
+
`));
|
|
555
|
+
// Delete statement
|
|
556
|
+
this.statements.set('delete', this.db.prepare(`
|
|
557
|
+
DELETE FROM memory_store WHERE key = ? AND namespace = ?
|
|
558
|
+
`));
|
|
559
|
+
// List statement
|
|
560
|
+
this.statements.set('list', this.db.prepare(`
|
|
561
|
+
SELECT * FROM memory_store
|
|
562
|
+
WHERE namespace = ?
|
|
563
|
+
ORDER BY accessed_at DESC
|
|
564
|
+
LIMIT ? OFFSET ?
|
|
565
|
+
`));
|
|
566
|
+
// Clear namespace statement
|
|
567
|
+
this.statements.set('clearNamespace', this.db.prepare(`
|
|
568
|
+
DELETE FROM memory_store WHERE namespace = ?
|
|
569
|
+
`));
|
|
570
|
+
// Stats statement
|
|
571
|
+
this.statements.set('stats', this.db.prepare(`
|
|
572
|
+
SELECT
|
|
573
|
+
namespace,
|
|
574
|
+
COUNT(*) as count,
|
|
575
|
+
SUM(size) as total_size,
|
|
576
|
+
AVG(size) as avg_size,
|
|
577
|
+
SUM(compressed) as compressed_count
|
|
578
|
+
FROM memory_store
|
|
579
|
+
GROUP BY namespace
|
|
580
|
+
`));
|
|
581
|
+
// Garbage collection statement
|
|
582
|
+
this.statements.set('gc', this.db.prepare(`
|
|
583
|
+
DELETE FROM memory_store
|
|
584
|
+
WHERE expires_at IS NOT NULL AND expires_at < strftime('%s', 'now')
|
|
585
|
+
`));
|
|
586
|
+
}
|
|
587
|
+
_startGarbageCollection() {
|
|
588
|
+
this.gcTimer = setInterval(()=>{
|
|
589
|
+
this._runGarbageCollection();
|
|
590
|
+
}, this.options.gcInterval);
|
|
591
|
+
}
|
|
592
|
+
_runGarbageCollection() {
|
|
593
|
+
try {
|
|
594
|
+
const result = this.statements.get('gc').run();
|
|
595
|
+
if (result.changes > 0) {
|
|
596
|
+
this.emit('gc', {
|
|
597
|
+
expired: result.changes
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
this.metrics.lastGC = Date.now();
|
|
601
|
+
} catch (error) {
|
|
602
|
+
this.emit('error', error);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
_getCacheKey(key, namespace) {
|
|
606
|
+
return `${namespace}:${key}`;
|
|
607
|
+
}
|
|
608
|
+
_recordMetric(operation, duration) {
|
|
609
|
+
if (!this.metrics.operations.has(operation)) {
|
|
610
|
+
this.metrics.operations.set(operation, []);
|
|
611
|
+
}
|
|
612
|
+
const metrics = this.metrics.operations.get(operation);
|
|
613
|
+
metrics.push(duration);
|
|
614
|
+
// Keep only last 100 measurements
|
|
615
|
+
if (metrics.length > 100) {
|
|
616
|
+
metrics.shift();
|
|
617
|
+
}
|
|
618
|
+
this.metrics.totalOperations++;
|
|
619
|
+
}
|
|
620
|
+
_getMetricsSummary() {
|
|
621
|
+
const summary = {};
|
|
622
|
+
for (const [operation, durations] of this.metrics.operations){
|
|
623
|
+
if (durations.length > 0) {
|
|
624
|
+
summary[operation] = {
|
|
625
|
+
count: durations.length,
|
|
626
|
+
avg: durations.reduce((a, b)=>a + b, 0) / durations.length,
|
|
627
|
+
min: Math.min(...durations),
|
|
628
|
+
max: Math.max(...durations)
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
summary.totalOperations = this.metrics.totalOperations;
|
|
633
|
+
summary.lastGC = new Date(this.metrics.lastGC).toISOString();
|
|
634
|
+
return summary;
|
|
635
|
+
}
|
|
636
|
+
constructor(options = {}){
|
|
637
|
+
super();
|
|
638
|
+
this.options = {
|
|
639
|
+
directory: options.directory || '.hive-mind',
|
|
640
|
+
filename: options.filename || 'memory.db',
|
|
641
|
+
cacheSize: options.cacheSize || 1000,
|
|
642
|
+
cacheMemoryMB: options.cacheMemoryMB || 50,
|
|
643
|
+
compressionThreshold: options.compressionThreshold || 10240,
|
|
644
|
+
gcInterval: options.gcInterval || 300000,
|
|
645
|
+
enableWAL: options.enableWAL !== false,
|
|
646
|
+
enableVacuum: options.enableVacuum !== false,
|
|
647
|
+
...options
|
|
648
|
+
};
|
|
649
|
+
this.db = null;
|
|
650
|
+
this.cache = new LRUCache(this.options.cacheSize, this.options.cacheMemoryMB);
|
|
651
|
+
this.statements = new Map();
|
|
652
|
+
this.gcTimer = null;
|
|
653
|
+
this.isInitialized = false;
|
|
654
|
+
// Performance tracking
|
|
655
|
+
this.metrics = {
|
|
656
|
+
operations: new Map(),
|
|
657
|
+
lastGC: Date.now(),
|
|
658
|
+
totalOperations: 0
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
// Export for backwards compatibility
|
|
663
|
+
export default SharedMemory;
|