simple-memory-mcp 1.1.3
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/LICENSE +21 -0
- package/README.md +742 -0
- package/dist/cli/arg-parser.d.ts +9 -0
- package/dist/cli/arg-parser.d.ts.map +1 -0
- package/dist/cli/arg-parser.js +68 -0
- package/dist/cli/arg-parser.js.map +1 -0
- package/dist/cli/help-generator.d.ts +8 -0
- package/dist/cli/help-generator.d.ts.map +1 -0
- package/dist/cli/help-generator.js +89 -0
- package/dist/cli/help-generator.js.map +1 -0
- package/dist/cli/index.d.ts +27 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +56 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/query-builder.d.ts +8 -0
- package/dist/cli/query-builder.d.ts.map +1 -0
- package/dist/cli/query-builder.js +63 -0
- package/dist/cli/query-builder.js.map +1 -0
- package/dist/cli/shortcuts-config.d.ts +26 -0
- package/dist/cli/shortcuts-config.d.ts.map +1 -0
- package/dist/cli/shortcuts-config.js +94 -0
- package/dist/cli/shortcuts-config.js.map +1 -0
- package/dist/graphql/resolvers.d.ts +101 -0
- package/dist/graphql/resolvers.d.ts.map +1 -0
- package/dist/graphql/resolvers.js +98 -0
- package/dist/graphql/resolvers.js.map +1 -0
- package/dist/graphql/schema.d.ts +13 -0
- package/dist/graphql/schema.d.ts.map +1 -0
- package/dist/graphql/schema.js +314 -0
- package/dist/graphql/schema.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +573 -0
- package/dist/index.js.map +1 -0
- package/dist/services/backup-service.d.ts +57 -0
- package/dist/services/backup-service.d.ts.map +1 -0
- package/dist/services/backup-service.js +191 -0
- package/dist/services/backup-service.js.map +1 -0
- package/dist/services/database-optimizer.d.ts +15 -0
- package/dist/services/database-optimizer.d.ts.map +1 -0
- package/dist/services/database-optimizer.js +45 -0
- package/dist/services/database-optimizer.js.map +1 -0
- package/dist/services/memory-service.d.ts +126 -0
- package/dist/services/memory-service.d.ts.map +1 -0
- package/dist/services/memory-service.js +862 -0
- package/dist/services/memory-service.js.map +1 -0
- package/dist/services/migrations.d.ts +17 -0
- package/dist/services/migrations.d.ts.map +1 -0
- package/dist/services/migrations.js +273 -0
- package/dist/services/migrations.js.map +1 -0
- package/dist/tests/backup-export-test.d.ts +2 -0
- package/dist/tests/backup-export-test.d.ts.map +1 -0
- package/dist/tests/backup-export-test.js +162 -0
- package/dist/tests/backup-export-test.js.map +1 -0
- package/dist/tests/backup-test.d.ts +14 -0
- package/dist/tests/backup-test.d.ts.map +1 -0
- package/dist/tests/backup-test.js +209 -0
- package/dist/tests/backup-test.js.map +1 -0
- package/dist/tests/export-import-test.d.ts +15 -0
- package/dist/tests/export-import-test.d.ts.map +1 -0
- package/dist/tests/export-import-test.js +227 -0
- package/dist/tests/export-import-test.js.map +1 -0
- package/dist/tests/graphql-comprehensive-test.d.ts +6 -0
- package/dist/tests/graphql-comprehensive-test.d.ts.map +1 -0
- package/dist/tests/graphql-comprehensive-test.js +342 -0
- package/dist/tests/graphql-comprehensive-test.js.map +1 -0
- package/dist/tests/graphql-performance-test.d.ts +6 -0
- package/dist/tests/graphql-performance-test.d.ts.map +1 -0
- package/dist/tests/graphql-performance-test.js +141 -0
- package/dist/tests/graphql-performance-test.js.map +1 -0
- package/dist/tests/graphql-test.d.ts +5 -0
- package/dist/tests/graphql-test.d.ts.map +1 -0
- package/dist/tests/graphql-test.js +47 -0
- package/dist/tests/graphql-test.js.map +1 -0
- package/dist/tests/memory-server-tests.d.ts +7 -0
- package/dist/tests/memory-server-tests.d.ts.map +1 -0
- package/dist/tests/memory-server-tests.js +466 -0
- package/dist/tests/memory-server-tests.js.map +1 -0
- package/dist/tests/migration-test.d.ts +2 -0
- package/dist/tests/migration-test.d.ts.map +1 -0
- package/dist/tests/migration-test.js +270 -0
- package/dist/tests/migration-test.js.map +1 -0
- package/dist/tests/performance-benchmark.d.ts +7 -0
- package/dist/tests/performance-benchmark.d.ts.map +1 -0
- package/dist/tests/performance-benchmark.js +234 -0
- package/dist/tests/performance-benchmark.js.map +1 -0
- package/dist/tests/performance-test.d.ts +3 -0
- package/dist/tests/performance-test.d.ts.map +1 -0
- package/dist/tests/performance-test.js +61 -0
- package/dist/tests/performance-test.js.map +1 -0
- package/dist/tests/time-range-test.d.ts +7 -0
- package/dist/tests/time-range-test.d.ts.map +1 -0
- package/dist/tests/time-range-test.js +169 -0
- package/dist/tests/time-range-test.js.map +1 -0
- package/dist/tools/delete-memory/cli-parser.d.ts +2 -0
- package/dist/tools/delete-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/delete-memory/cli-parser.js +13 -0
- package/dist/tools/delete-memory/cli-parser.js.map +1 -0
- package/dist/tools/delete-memory/executor.d.ts +13 -0
- package/dist/tools/delete-memory/executor.d.ts.map +1 -0
- package/dist/tools/delete-memory/executor.js +40 -0
- package/dist/tools/delete-memory/executor.js.map +1 -0
- package/dist/tools/delete-memory/index.d.ts +3 -0
- package/dist/tools/delete-memory/index.d.ts.map +1 -0
- package/dist/tools/delete-memory/index.js +24 -0
- package/dist/tools/delete-memory/index.js.map +1 -0
- package/dist/tools/export-memory/cli-parser.d.ts +2 -0
- package/dist/tools/export-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/export-memory/cli-parser.js +34 -0
- package/dist/tools/export-memory/cli-parser.js.map +1 -0
- package/dist/tools/export-memory/executor.d.ts +10 -0
- package/dist/tools/export-memory/executor.d.ts.map +1 -0
- package/dist/tools/export-memory/executor.js +41 -0
- package/dist/tools/export-memory/executor.js.map +1 -0
- package/dist/tools/export-memory/index.d.ts +4 -0
- package/dist/tools/export-memory/index.d.ts.map +1 -0
- package/dist/tools/export-memory/index.js +99 -0
- package/dist/tools/export-memory/index.js.map +1 -0
- package/dist/tools/import-memory/cli-parser.d.ts +2 -0
- package/dist/tools/import-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/import-memory/cli-parser.js +25 -0
- package/dist/tools/import-memory/cli-parser.js.map +1 -0
- package/dist/tools/import-memory/executor.d.ts +8 -0
- package/dist/tools/import-memory/executor.d.ts.map +1 -0
- package/dist/tools/import-memory/executor.js +31 -0
- package/dist/tools/import-memory/executor.js.map +1 -0
- package/dist/tools/import-memory/index.d.ts +4 -0
- package/dist/tools/import-memory/index.d.ts.map +1 -0
- package/dist/tools/import-memory/index.js +70 -0
- package/dist/tools/import-memory/index.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +48 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory-graphql/cli-parser.d.ts +6 -0
- package/dist/tools/memory-graphql/cli-parser.d.ts.map +1 -0
- package/dist/tools/memory-graphql/cli-parser.js +24 -0
- package/dist/tools/memory-graphql/cli-parser.js.map +1 -0
- package/dist/tools/memory-graphql/executor.d.ts +18 -0
- package/dist/tools/memory-graphql/executor.d.ts.map +1 -0
- package/dist/tools/memory-graphql/executor.js +53 -0
- package/dist/tools/memory-graphql/executor.js.map +1 -0
- package/dist/tools/memory-graphql/index.d.ts +3 -0
- package/dist/tools/memory-graphql/index.d.ts.map +1 -0
- package/dist/tools/memory-graphql/index.js +73 -0
- package/dist/tools/memory-graphql/index.js.map +1 -0
- package/dist/tools/memory-stats/cli-parser.d.ts +2 -0
- package/dist/tools/memory-stats/cli-parser.d.ts.map +1 -0
- package/dist/tools/memory-stats/cli-parser.js +8 -0
- package/dist/tools/memory-stats/cli-parser.js.map +1 -0
- package/dist/tools/memory-stats/executor.d.ts +4 -0
- package/dist/tools/memory-stats/executor.d.ts.map +1 -0
- package/dist/tools/memory-stats/executor.js +4 -0
- package/dist/tools/memory-stats/executor.js.map +1 -0
- package/dist/tools/memory-stats/index.d.ts +3 -0
- package/dist/tools/memory-stats/index.d.ts.map +1 -0
- package/dist/tools/memory-stats/index.js +15 -0
- package/dist/tools/memory-stats/index.js.map +1 -0
- package/dist/tools/search-memory/cli-parser.d.ts +2 -0
- package/dist/tools/search-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/search-memory/cli-parser.js +56 -0
- package/dist/tools/search-memory/cli-parser.js.map +1 -0
- package/dist/tools/search-memory/executor.d.ts +36 -0
- package/dist/tools/search-memory/executor.d.ts.map +1 -0
- package/dist/tools/search-memory/executor.js +83 -0
- package/dist/tools/search-memory/executor.js.map +1 -0
- package/dist/tools/search-memory/index.d.ts +3 -0
- package/dist/tools/search-memory/index.d.ts.map +1 -0
- package/dist/tools/search-memory/index.js +89 -0
- package/dist/tools/search-memory/index.js.map +1 -0
- package/dist/tools/store-memory/cli-parser.d.ts +2 -0
- package/dist/tools/store-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/store-memory/cli-parser.js +21 -0
- package/dist/tools/store-memory/cli-parser.js.map +1 -0
- package/dist/tools/store-memory/executor.d.ts +16 -0
- package/dist/tools/store-memory/executor.d.ts.map +1 -0
- package/dist/tools/store-memory/executor.js +100 -0
- package/dist/tools/store-memory/executor.js.map +1 -0
- package/dist/tools/store-memory/index.d.ts +3 -0
- package/dist/tools/store-memory/index.d.ts.map +1 -0
- package/dist/tools/store-memory/index.js +68 -0
- package/dist/tools/store-memory/index.js.map +1 -0
- package/dist/tools/sync-memory/cli-parser.d.ts +1 -0
- package/dist/tools/sync-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/sync-memory/cli-parser.js +2 -0
- package/dist/tools/sync-memory/cli-parser.js.map +1 -0
- package/dist/tools/sync-memory/executor.d.ts +1 -0
- package/dist/tools/sync-memory/executor.d.ts.map +1 -0
- package/dist/tools/sync-memory/executor.js +2 -0
- package/dist/tools/sync-memory/executor.js.map +1 -0
- package/dist/tools/sync-memory/index.d.ts +1 -0
- package/dist/tools/sync-memory/index.d.ts.map +1 -0
- package/dist/tools/sync-memory/index.js +2 -0
- package/dist/tools/sync-memory/index.js.map +1 -0
- package/dist/tools/update-memory/cli-parser.d.ts +2 -0
- package/dist/tools/update-memory/cli-parser.d.ts.map +1 -0
- package/dist/tools/update-memory/cli-parser.js +17 -0
- package/dist/tools/update-memory/cli-parser.js.map +1 -0
- package/dist/tools/update-memory/executor.d.ts +16 -0
- package/dist/tools/update-memory/executor.d.ts.map +1 -0
- package/dist/tools/update-memory/executor.js +59 -0
- package/dist/tools/update-memory/executor.js.map +1 -0
- package/dist/tools/update-memory/index.d.ts +3 -0
- package/dist/tools/update-memory/index.d.ts.map +1 -0
- package/dist/tools/update-memory/index.js +30 -0
- package/dist/tools/update-memory/index.js.map +1 -0
- package/dist/transports/streamable-http.d.ts +38 -0
- package/dist/transports/streamable-http.d.ts.map +1 -0
- package/dist/transports/streamable-http.js +209 -0
- package/dist/transports/streamable-http.js.map +1 -0
- package/dist/types/tools.d.ts +79 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +3 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/cli-parser.d.ts +12 -0
- package/dist/utils/cli-parser.d.ts.map +1 -0
- package/dist/utils/cli-parser.js +43 -0
- package/dist/utils/cli-parser.js.map +1 -0
- package/dist/utils/config.d.ts +95 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +176 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/db-integrity-check.d.ts +22 -0
- package/dist/utils/db-integrity-check.d.ts.map +1 -0
- package/dist/utils/db-integrity-check.js +69 -0
- package/dist/utils/db-integrity-check.js.map +1 -0
- package/dist/utils/debug.d.ts +25 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +67 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/help-generator.d.ts +18 -0
- package/dist/utils/help-generator.d.ts.map +1 -0
- package/dist/utils/help-generator.js +81 -0
- package/dist/utils/help-generator.js.map +1 -0
- package/dist/utils/json-parser.d.ts +12 -0
- package/dist/utils/json-parser.d.ts.map +1 -0
- package/dist/utils/json-parser.js +52 -0
- package/dist/utils/json-parser.js.map +1 -0
- package/dist/utils/mcp-config.d.ts +12 -0
- package/dist/utils/mcp-config.d.ts.map +1 -0
- package/dist/utils/mcp-config.js +64 -0
- package/dist/utils/mcp-config.js.map +1 -0
- package/dist/web-server.d.ts +3 -0
- package/dist/web-server.d.ts.map +1 -0
- package/dist/web-server.js +265 -0
- package/dist/web-server.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { MemoryService } from '../services/memory-service.js';
|
|
2
|
+
import Database from 'better-sqlite3';
|
|
3
|
+
import assert from 'assert';
|
|
4
|
+
import { unlinkSync, existsSync } from 'fs';
|
|
5
|
+
/**
|
|
6
|
+
* Migration Test Suite
|
|
7
|
+
* Tests oldānew schema migration and data integrity
|
|
8
|
+
*/
|
|
9
|
+
const TEST_DB = './migration-test.db';
|
|
10
|
+
function cleanup() {
|
|
11
|
+
const files = [TEST_DB, `${TEST_DB}-shm`, `${TEST_DB}-wal`];
|
|
12
|
+
for (const file of files) {
|
|
13
|
+
try {
|
|
14
|
+
if (existsSync(file)) {
|
|
15
|
+
unlinkSync(file);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
// Ignore cleanup errors
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function createOldSchemaDatabase() {
|
|
24
|
+
console.log('š¦ Creating old schema database...');
|
|
25
|
+
const db = new Database(TEST_DB);
|
|
26
|
+
// Create original schema without tags table
|
|
27
|
+
db.exec(`
|
|
28
|
+
CREATE TABLE memories (
|
|
29
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
30
|
+
content TEXT NOT NULL,
|
|
31
|
+
tags TEXT,
|
|
32
|
+
created_at TEXT,
|
|
33
|
+
hash TEXT UNIQUE
|
|
34
|
+
)
|
|
35
|
+
`);
|
|
36
|
+
db.exec(`
|
|
37
|
+
CREATE TABLE relationships (
|
|
38
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
39
|
+
from_memory_id INTEGER NOT NULL,
|
|
40
|
+
to_memory_id INTEGER NOT NULL,
|
|
41
|
+
relationship_type TEXT NOT NULL,
|
|
42
|
+
created_at TEXT,
|
|
43
|
+
UNIQUE(from_memory_id, to_memory_id),
|
|
44
|
+
FOREIGN KEY (from_memory_id) REFERENCES memories (id) ON DELETE CASCADE,
|
|
45
|
+
FOREIGN KEY (to_memory_id) REFERENCES memories (id) ON DELETE CASCADE
|
|
46
|
+
)
|
|
47
|
+
`);
|
|
48
|
+
// Create FTS table
|
|
49
|
+
db.exec(`
|
|
50
|
+
CREATE VIRTUAL TABLE memories_fts USING fts5(
|
|
51
|
+
content,
|
|
52
|
+
content=memories,
|
|
53
|
+
content_rowid=id
|
|
54
|
+
)
|
|
55
|
+
`);
|
|
56
|
+
// Insert test data with old-style comma-separated tags
|
|
57
|
+
const insert = db.prepare('INSERT INTO memories (content, tags, created_at, hash) VALUES (?, ?, ?, ?)');
|
|
58
|
+
const now = new Date().toISOString();
|
|
59
|
+
insert.run('Memory about TypeScript and testing', 'typescript,testing,dev', now, 'hash1');
|
|
60
|
+
insert.run('Memory about database performance', 'database,performance,optimization', now, 'hash2');
|
|
61
|
+
insert.run('Memory about TypeScript optimization', 'typescript,optimization', now, 'hash3');
|
|
62
|
+
insert.run('Memory with no tags', '', now, 'hash4');
|
|
63
|
+
insert.run('Memory about testing strategies', 'testing,strategy', now, 'hash5');
|
|
64
|
+
// Create a relationship
|
|
65
|
+
const insertRel = db.prepare('INSERT INTO relationships (from_memory_id, to_memory_id, relationship_type, created_at) VALUES (?, ?, ?, ?)');
|
|
66
|
+
insertRel.run(1, 3, 'related', now);
|
|
67
|
+
db.close();
|
|
68
|
+
console.log('ā
Old schema database created with 5 memories and 1 relationship\n');
|
|
69
|
+
}
|
|
70
|
+
function testMigration() {
|
|
71
|
+
console.log('š Running migration...');
|
|
72
|
+
const service = new MemoryService(TEST_DB);
|
|
73
|
+
service.initialize();
|
|
74
|
+
console.log('ā
Migration completed\n');
|
|
75
|
+
// Test 1: Verify all memories are accessible
|
|
76
|
+
console.log('š Test 1: Verify all memories accessible');
|
|
77
|
+
const allMemories = service.search('', [], 10);
|
|
78
|
+
assert.strictEqual(allMemories.length, 5, `Expected 5 memories, got ${allMemories.length}`);
|
|
79
|
+
console.log(`ā
All 5 memories accessible\n`);
|
|
80
|
+
// Test 2: Verify tag normalization
|
|
81
|
+
console.log('š Test 2: Verify tag normalization and indexing');
|
|
82
|
+
const typescriptResults = service.search(undefined, ['typescript'], 10);
|
|
83
|
+
assert.strictEqual(typescriptResults.length, 2, `Expected 2 memories with 'typescript' tag, got ${typescriptResults.length}`);
|
|
84
|
+
console.log(`ā
Found ${typescriptResults.length} memories with 'typescript' tag`);
|
|
85
|
+
const testingResults = service.search(undefined, ['testing'], 10);
|
|
86
|
+
assert.strictEqual(testingResults.length, 2, `Expected 2 memories with 'testing' tag, got ${testingResults.length}`);
|
|
87
|
+
console.log(`ā
Found ${testingResults.length} memories with 'testing' tag`);
|
|
88
|
+
const optimizationResults = service.search(undefined, ['optimization'], 10);
|
|
89
|
+
assert.strictEqual(optimizationResults.length, 2, `Expected 2 memories with 'optimization' tag, got ${optimizationResults.length}`);
|
|
90
|
+
console.log(`ā
Found ${optimizationResults.length} memories with 'optimization' tag\n`);
|
|
91
|
+
// Test 3: Verify memory with no tags
|
|
92
|
+
console.log('š Test 3: Verify memory with no tags');
|
|
93
|
+
const memory4 = allMemories.find(m => m.hash === 'hash4');
|
|
94
|
+
assert(memory4, 'Memory with hash4 not found');
|
|
95
|
+
assert.strictEqual(memory4.tags.length, 0, `Expected 0 tags, got ${memory4.tags.length}`);
|
|
96
|
+
console.log(`ā
Memory with no tags handled correctly\n`);
|
|
97
|
+
// Test 4: Verify tags are arrays on retrieved memories
|
|
98
|
+
console.log('š Test 4: Verify tags are arrays');
|
|
99
|
+
for (const memory of allMemories) {
|
|
100
|
+
assert(Array.isArray(memory.tags), `Tags for memory ${memory.hash} should be an array`);
|
|
101
|
+
}
|
|
102
|
+
console.log(`ā
All memories have tags as arrays\n`);
|
|
103
|
+
// Test 5: Verify tag case normalization
|
|
104
|
+
console.log('š Test 5: Verify tag case normalization');
|
|
105
|
+
const memory1 = allMemories.find(m => m.hash === 'hash1');
|
|
106
|
+
assert(memory1, 'Memory with hash1 not found');
|
|
107
|
+
assert(memory1.tags.includes('typescript'), 'Should have lowercase "typescript" tag');
|
|
108
|
+
assert(memory1.tags.includes('testing'), 'Should have lowercase "testing" tag');
|
|
109
|
+
console.log(`ā
Tags normalized to lowercase\n`);
|
|
110
|
+
// Test 6: Verify relationships preserved
|
|
111
|
+
console.log('š Test 6: Verify relationships preserved');
|
|
112
|
+
const stats = service.stats();
|
|
113
|
+
assert.strictEqual(stats.totalMemories, 5, `Expected 5 memories, got ${stats.totalMemories}`);
|
|
114
|
+
assert.strictEqual(stats.totalRelationships, 1, `Expected 1 relationship, got ${stats.totalRelationships}`);
|
|
115
|
+
console.log(`ā
Relationships preserved: ${stats.totalRelationships}\n`);
|
|
116
|
+
// Test 7: Verify FTS search still works
|
|
117
|
+
console.log('š Test 7: Verify FTS search functionality');
|
|
118
|
+
const ftsResults = service.search('TypeScript', undefined, 10);
|
|
119
|
+
assert(ftsResults.length >= 2, `Expected at least 2 FTS results, got ${ftsResults.length}`);
|
|
120
|
+
console.log(`ā
FTS search working: ${ftsResults.length} results\n`);
|
|
121
|
+
// Test 8: Verify new memories work with migrated schema
|
|
122
|
+
console.log('š Test 8: Verify new memory insertion');
|
|
123
|
+
const newHash = service.store('New memory after migration', ['migration', 'test']);
|
|
124
|
+
const newMemory = service.search(undefined, ['migration'], 10);
|
|
125
|
+
assert(newMemory.length >= 1, 'New memory should be findable by tag');
|
|
126
|
+
console.log(`ā
New memory insertion works\n`);
|
|
127
|
+
// Test 9: Verify deleteByTag works with new schema
|
|
128
|
+
console.log('š Test 9: Verify deleteByTag functionality');
|
|
129
|
+
const beforeDelete = service.stats();
|
|
130
|
+
const deletedCount = service.deleteByTag('strategy');
|
|
131
|
+
assert.strictEqual(deletedCount, 1, `Expected to delete 1 memory, deleted ${deletedCount}`);
|
|
132
|
+
const afterDelete = service.stats();
|
|
133
|
+
assert.strictEqual(afterDelete.totalMemories, beforeDelete.totalMemories - 1, 'Memory count should decrease by 1');
|
|
134
|
+
console.log(`ā
Deleted ${deletedCount} memory by tag\n`);
|
|
135
|
+
// Test 10: Verify database indexes exist
|
|
136
|
+
console.log('š Test 10: Verify database indexes created');
|
|
137
|
+
const db = service.db;
|
|
138
|
+
const indexes = db.prepare(`
|
|
139
|
+
SELECT name FROM sqlite_master
|
|
140
|
+
WHERE type='index' AND sql IS NOT NULL
|
|
141
|
+
`).all();
|
|
142
|
+
const expectedIndexes = [
|
|
143
|
+
'idx_tags_tag',
|
|
144
|
+
'idx_tags_memory_id',
|
|
145
|
+
'idx_memories_created_at',
|
|
146
|
+
'idx_memories_hash',
|
|
147
|
+
'idx_relationships_from',
|
|
148
|
+
'idx_relationships_to',
|
|
149
|
+
'idx_relationships_composite'
|
|
150
|
+
];
|
|
151
|
+
for (const expectedIndex of expectedIndexes) {
|
|
152
|
+
const found = indexes.some(idx => idx.name === expectedIndex);
|
|
153
|
+
assert(found, `Index ${expectedIndex} should exist`);
|
|
154
|
+
}
|
|
155
|
+
console.log(`ā
All ${expectedIndexes.length} performance indexes created\n`);
|
|
156
|
+
// Test 11: Verify migration tracking
|
|
157
|
+
console.log('š Test 11: Verify migration tracking table');
|
|
158
|
+
const migrations = db.prepare('SELECT * FROM schema_migrations ORDER BY version').all();
|
|
159
|
+
assert(migrations.length >= 3, `Expected at least 3 migrations, found ${migrations.length}`);
|
|
160
|
+
assert.strictEqual(migrations[0].version, 1, 'First migration should be version 1');
|
|
161
|
+
assert.strictEqual(migrations[1].version, 2, 'Second migration should be version 2');
|
|
162
|
+
assert.strictEqual(migrations[2].version, 3, 'Third migration should be version 3');
|
|
163
|
+
console.log(`ā
Migration tracking working: ${migrations.length} migrations recorded\n`);
|
|
164
|
+
service.close();
|
|
165
|
+
}
|
|
166
|
+
function testPartialMigrationRecovery() {
|
|
167
|
+
console.log('š Test 12: Verify partial migration recovery');
|
|
168
|
+
console.log('(Creating database with only migration 1 applied)');
|
|
169
|
+
cleanup();
|
|
170
|
+
const db = new Database(TEST_DB);
|
|
171
|
+
// Create base schema
|
|
172
|
+
db.exec(`
|
|
173
|
+
CREATE TABLE memories (
|
|
174
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
175
|
+
content TEXT NOT NULL,
|
|
176
|
+
tags TEXT,
|
|
177
|
+
created_at TEXT,
|
|
178
|
+
hash TEXT UNIQUE
|
|
179
|
+
)
|
|
180
|
+
`);
|
|
181
|
+
// Create migration tracking with only v1
|
|
182
|
+
db.exec(`
|
|
183
|
+
CREATE TABLE schema_migrations (
|
|
184
|
+
version INTEGER PRIMARY KEY,
|
|
185
|
+
description TEXT NOT NULL,
|
|
186
|
+
applied_at TEXT NOT NULL
|
|
187
|
+
)
|
|
188
|
+
`);
|
|
189
|
+
db.prepare('INSERT INTO schema_migrations (version, description, applied_at) VALUES (?, ?, ?)')
|
|
190
|
+
.run(1, 'Initial schema', new Date().toISOString());
|
|
191
|
+
// Add test data
|
|
192
|
+
db.prepare('INSERT INTO memories (content, tags, created_at, hash) VALUES (?, ?, ?, ?)')
|
|
193
|
+
.run('Recovery test memory', 'recovery,test', new Date().toISOString(), 'recovery1');
|
|
194
|
+
db.close();
|
|
195
|
+
// Now initialize service - should apply migrations 2 and 3
|
|
196
|
+
const service = new MemoryService(TEST_DB);
|
|
197
|
+
service.initialize();
|
|
198
|
+
// Verify migrations 2 and 3 were applied
|
|
199
|
+
const migrationsAfter = service.db.prepare('SELECT * FROM schema_migrations ORDER BY version').all();
|
|
200
|
+
assert.strictEqual(migrationsAfter.length, 3, `Expected 3 migrations, found ${migrationsAfter.length}`);
|
|
201
|
+
// Verify tags table exists and data migrated
|
|
202
|
+
const tagResults = service.search(undefined, ['recovery'], 10);
|
|
203
|
+
assert.strictEqual(tagResults.length, 1, 'Should find memory by migrated tag');
|
|
204
|
+
console.log('ā
Partial migration recovery successful\n');
|
|
205
|
+
service.close();
|
|
206
|
+
}
|
|
207
|
+
function testIdempotentMigration() {
|
|
208
|
+
console.log('š Test 13: Verify idempotent migration (running twice)');
|
|
209
|
+
cleanup();
|
|
210
|
+
createOldSchemaDatabase();
|
|
211
|
+
// Run migration first time
|
|
212
|
+
const service1 = new MemoryService(TEST_DB);
|
|
213
|
+
service1.initialize();
|
|
214
|
+
const stats1 = service1.stats();
|
|
215
|
+
service1.close();
|
|
216
|
+
// Run migration second time (should be no-op)
|
|
217
|
+
const service2 = new MemoryService(TEST_DB);
|
|
218
|
+
service2.initialize();
|
|
219
|
+
const stats2 = service2.stats();
|
|
220
|
+
assert.strictEqual(stats1.totalMemories, stats2.totalMemories, 'Memory count should be same');
|
|
221
|
+
assert.strictEqual(stats1.totalRelationships, stats2.totalRelationships, 'Relationship count should be same');
|
|
222
|
+
console.log('ā
Idempotent migration verified (no duplicate data)\n');
|
|
223
|
+
service2.close();
|
|
224
|
+
}
|
|
225
|
+
async function runMigrationTests() {
|
|
226
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
227
|
+
console.log('š§Ŗ Migration Test Suite');
|
|
228
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
229
|
+
try {
|
|
230
|
+
// Cleanup any existing test database
|
|
231
|
+
cleanup();
|
|
232
|
+
// Test 1-11: Standard migration path
|
|
233
|
+
createOldSchemaDatabase();
|
|
234
|
+
testMigration();
|
|
235
|
+
// Test 12: Partial migration recovery
|
|
236
|
+
testPartialMigrationRecovery();
|
|
237
|
+
// Test 13: Idempotent migration
|
|
238
|
+
testIdempotentMigration();
|
|
239
|
+
// Final cleanup
|
|
240
|
+
cleanup();
|
|
241
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
242
|
+
console.log('ā
All Migration Tests Passed!');
|
|
243
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
244
|
+
console.log('Summary:');
|
|
245
|
+
console.log(' ā Oldānew schema migration');
|
|
246
|
+
console.log(' ā Tag normalization and indexing');
|
|
247
|
+
console.log(' ā Data integrity preservation');
|
|
248
|
+
console.log(' ā Relationship preservation');
|
|
249
|
+
console.log(' ā FTS functionality maintained');
|
|
250
|
+
console.log(' ā New operations work post-migration');
|
|
251
|
+
console.log(' ā Delete operations work');
|
|
252
|
+
console.log(' ā Performance indexes created');
|
|
253
|
+
console.log(' ā Migration tracking functional');
|
|
254
|
+
console.log(' ā Partial migration recovery');
|
|
255
|
+
console.log(' ā Idempotent migration (safe re-run)');
|
|
256
|
+
console.log('');
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
console.error('\nā Migration Test Failed:', error.message);
|
|
260
|
+
console.error(error.stack);
|
|
261
|
+
cleanup();
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
runMigrationTests().catch(error => {
|
|
266
|
+
console.error('Fatal error:', error);
|
|
267
|
+
cleanup();
|
|
268
|
+
process.exit(1);
|
|
269
|
+
});
|
|
270
|
+
//# sourceMappingURL=migration-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-test.js","sourceRoot":"","sources":["../../src/tests/migration-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-benchmark.d.ts","sourceRoot":"","sources":["../../src/tests/performance-benchmark.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Performance Benchmark Suite
|
|
4
|
+
* Comprehensive benchmarks to measure and validate optimization gains
|
|
5
|
+
*/
|
|
6
|
+
import { MemoryService } from '../services/memory-service.js';
|
|
7
|
+
import { performance } from 'perf_hooks';
|
|
8
|
+
import { existsSync, unlinkSync } from 'fs';
|
|
9
|
+
function benchmark(name, iterations, fn) {
|
|
10
|
+
// Warm up
|
|
11
|
+
for (let i = 0; i < Math.min(10, iterations); i++) {
|
|
12
|
+
fn();
|
|
13
|
+
}
|
|
14
|
+
// Actual benchmark
|
|
15
|
+
const start = performance.now();
|
|
16
|
+
for (let i = 0; i < iterations; i++) {
|
|
17
|
+
fn();
|
|
18
|
+
}
|
|
19
|
+
const end = performance.now();
|
|
20
|
+
const totalMs = end - start;
|
|
21
|
+
const avgMs = totalMs / iterations;
|
|
22
|
+
const opsPerSecond = 1000 / avgMs;
|
|
23
|
+
return {
|
|
24
|
+
operation: name,
|
|
25
|
+
iterations,
|
|
26
|
+
totalMs: Math.round(totalMs * 100) / 100,
|
|
27
|
+
avgMs: Math.round(avgMs * 1000) / 1000,
|
|
28
|
+
opsPerSecond: Math.round(opsPerSecond)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function runBenchmarks() {
|
|
32
|
+
const testDb = './benchmark-test.db';
|
|
33
|
+
// Clean up any existing test database
|
|
34
|
+
if (existsSync(testDb)) {
|
|
35
|
+
unlinkSync(testDb);
|
|
36
|
+
}
|
|
37
|
+
if (existsSync(testDb + '-shm')) {
|
|
38
|
+
unlinkSync(testDb + '-shm');
|
|
39
|
+
}
|
|
40
|
+
if (existsSync(testDb + '-wal')) {
|
|
41
|
+
unlinkSync(testDb + '-wal');
|
|
42
|
+
}
|
|
43
|
+
const service = new MemoryService(testDb);
|
|
44
|
+
service.initialize();
|
|
45
|
+
console.log('š Performance Benchmark Suite');
|
|
46
|
+
console.log('================================\n');
|
|
47
|
+
const results = [];
|
|
48
|
+
// Benchmark 1: Store operations with various sizes
|
|
49
|
+
console.log('š Storage Operations');
|
|
50
|
+
console.log('--------------------');
|
|
51
|
+
const storeBenchmarks = [
|
|
52
|
+
{ size: '100B', content: 'x'.repeat(100), iterations: 1000 },
|
|
53
|
+
{ size: '1KB', content: 'x'.repeat(1024), iterations: 1000 },
|
|
54
|
+
{ size: '10KB', content: 'x'.repeat(10240), iterations: 500 },
|
|
55
|
+
{ size: '100KB', content: 'x'.repeat(102400), iterations: 100 }
|
|
56
|
+
];
|
|
57
|
+
for (const { size, content, iterations } of storeBenchmarks) {
|
|
58
|
+
const result = benchmark(`Store memory (${size})`, iterations, () => {
|
|
59
|
+
service.store(content, ['test', 'benchmark']);
|
|
60
|
+
});
|
|
61
|
+
results.push(result);
|
|
62
|
+
console.log(` ${size}: ${result.avgMs.toFixed(2)}ms avg (${result.opsPerSecond} ops/sec)`);
|
|
63
|
+
}
|
|
64
|
+
console.log();
|
|
65
|
+
// Benchmark 2: Tag search operations
|
|
66
|
+
console.log('š Tag Search Operations');
|
|
67
|
+
console.log('------------------------');
|
|
68
|
+
// Populate some test data for searching
|
|
69
|
+
for (let i = 0; i < 100; i++) {
|
|
70
|
+
service.store(`Test memory ${i}`, ['search', 'test', `tag${i % 10}`]);
|
|
71
|
+
}
|
|
72
|
+
const tagSearchResult = benchmark('Search by tag (indexed)', 1000, () => {
|
|
73
|
+
service.search(undefined, ['search'], 10);
|
|
74
|
+
});
|
|
75
|
+
results.push(tagSearchResult);
|
|
76
|
+
console.log(` Indexed tag query: ${tagSearchResult.avgMs.toFixed(2)}ms avg (${tagSearchResult.opsPerSecond} ops/sec)`);
|
|
77
|
+
const multiTagResult = benchmark('Search by multiple tags', 1000, () => {
|
|
78
|
+
service.search(undefined, ['test'], 10);
|
|
79
|
+
});
|
|
80
|
+
results.push(multiTagResult);
|
|
81
|
+
console.log(` Multiple results: ${multiTagResult.avgMs.toFixed(2)}ms avg (${multiTagResult.opsPerSecond} ops/sec)`);
|
|
82
|
+
console.log();
|
|
83
|
+
// Benchmark 3: FTS search operations
|
|
84
|
+
console.log('š Full-Text Search Operations');
|
|
85
|
+
console.log('-------------------------------');
|
|
86
|
+
// Add some varied content for FTS
|
|
87
|
+
const phrases = [
|
|
88
|
+
'The quick brown fox jumps over the lazy dog',
|
|
89
|
+
'Machine learning and artificial intelligence are transforming technology',
|
|
90
|
+
'Database optimization requires careful analysis and testing',
|
|
91
|
+
'Performance benchmarks help validate improvements'
|
|
92
|
+
];
|
|
93
|
+
for (let i = 0; i < 50; i++) {
|
|
94
|
+
service.store(phrases[i % phrases.length].repeat(5), ['fts', 'content']);
|
|
95
|
+
}
|
|
96
|
+
const ftsResults = [
|
|
97
|
+
benchmark('FTS: simple query', 1000, () => {
|
|
98
|
+
service.search('quick brown', undefined, 10);
|
|
99
|
+
}),
|
|
100
|
+
benchmark('FTS: complex query', 1000, () => {
|
|
101
|
+
service.search('machine learning intelligence', undefined, 10);
|
|
102
|
+
}),
|
|
103
|
+
benchmark('FTS: common word', 1000, () => {
|
|
104
|
+
service.search('performance', undefined, 10);
|
|
105
|
+
})
|
|
106
|
+
];
|
|
107
|
+
for (const result of ftsResults) {
|
|
108
|
+
results.push(result);
|
|
109
|
+
console.log(` ${result.operation.replace('FTS: ', '')}: ${result.avgMs.toFixed(2)}ms avg (${result.opsPerSecond} ops/sec)`);
|
|
110
|
+
}
|
|
111
|
+
console.log();
|
|
112
|
+
// Benchmark 4: Relationship operations
|
|
113
|
+
console.log('š Relationship Operations');
|
|
114
|
+
console.log('--------------------------');
|
|
115
|
+
// Create some memories for relationship testing
|
|
116
|
+
const memHashes = Array.from({ length: 20 }, (_, i) => service.store(`Memory for relationships ${i}`, ['rel', 'test']));
|
|
117
|
+
// Single relationship creation
|
|
118
|
+
const singleRelResult = benchmark('Create single relationship', 500, () => {
|
|
119
|
+
const from = memHashes[Math.floor(Math.random() * 10)];
|
|
120
|
+
const to = memHashes[10 + Math.floor(Math.random() * 10)];
|
|
121
|
+
try {
|
|
122
|
+
service.linkMemories(from, to, 'test');
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Ignore duplicates
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
results.push(singleRelResult);
|
|
129
|
+
console.log(` Single link: ${singleRelResult.avgMs.toFixed(2)}ms avg (${singleRelResult.opsPerSecond} ops/sec)`);
|
|
130
|
+
// Bulk relationship creation
|
|
131
|
+
const bulkRelationships = Array.from({ length: 10 }, (_, i) => ({
|
|
132
|
+
fromHash: memHashes[i],
|
|
133
|
+
toHash: memHashes[i + 10],
|
|
134
|
+
relationshipType: 'bulk-test'
|
|
135
|
+
}));
|
|
136
|
+
const bulkRelResult = benchmark('Bulk create relationships (10)', 200, () => {
|
|
137
|
+
service.linkMemoriesBulk(bulkRelationships);
|
|
138
|
+
});
|
|
139
|
+
results.push(bulkRelResult);
|
|
140
|
+
console.log(` Bulk link (10): ${bulkRelResult.avgMs.toFixed(2)}ms avg (${bulkRelResult.opsPerSecond} ops/sec)`);
|
|
141
|
+
console.log(` Speedup vs sequential: ${(singleRelResult.avgMs * 10 / bulkRelResult.avgMs).toFixed(1)}x faster`);
|
|
142
|
+
console.log();
|
|
143
|
+
// Benchmark 5: Delete operations
|
|
144
|
+
console.log('šļø Delete Operations');
|
|
145
|
+
console.log('--------------------');
|
|
146
|
+
// Create disposable memories
|
|
147
|
+
for (let i = 0; i < 100; i++) {
|
|
148
|
+
service.store(`Disposable memory ${i}`, ['delete', `batch${i % 10}`]);
|
|
149
|
+
}
|
|
150
|
+
const deleteByHashResult = benchmark('Delete by hash', 100, () => {
|
|
151
|
+
const hash = service.store(`Temp memory ${Math.random()}`, ['temp']);
|
|
152
|
+
service.delete(hash);
|
|
153
|
+
});
|
|
154
|
+
results.push(deleteByHashResult);
|
|
155
|
+
console.log(` By hash: ${deleteByHashResult.avgMs.toFixed(2)}ms avg (${deleteByHashResult.opsPerSecond} ops/sec)`);
|
|
156
|
+
const deleteByTagResult = benchmark('Delete by tag', 10, () => {
|
|
157
|
+
const tag = `batch${Math.floor(Math.random() * 10)}`;
|
|
158
|
+
service.deleteByTag(tag);
|
|
159
|
+
});
|
|
160
|
+
results.push(deleteByTagResult);
|
|
161
|
+
console.log(` By tag: ${deleteByTagResult.avgMs.toFixed(2)}ms avg (${deleteByTagResult.opsPerSecond} ops/sec)`);
|
|
162
|
+
console.log();
|
|
163
|
+
// Benchmark 6: Statistics operations
|
|
164
|
+
console.log('š Statistics Operations');
|
|
165
|
+
console.log('------------------------');
|
|
166
|
+
const statsResult = benchmark('Get database stats', 1000, () => {
|
|
167
|
+
service.stats();
|
|
168
|
+
});
|
|
169
|
+
results.push(statsResult);
|
|
170
|
+
console.log(` Stats query: ${statsResult.avgMs.toFixed(2)}ms avg (${statsResult.opsPerSecond} ops/sec)`);
|
|
171
|
+
console.log();
|
|
172
|
+
// Summary table
|
|
173
|
+
console.log('š Benchmark Summary');
|
|
174
|
+
console.log('====================\n');
|
|
175
|
+
console.table(results.map(r => ({
|
|
176
|
+
'Operation': r.operation,
|
|
177
|
+
'Iterations': r.iterations,
|
|
178
|
+
'Total (ms)': r.totalMs,
|
|
179
|
+
'Avg (ms)': r.avgMs.toFixed(3),
|
|
180
|
+
'Ops/sec': r.opsPerSecond
|
|
181
|
+
})));
|
|
182
|
+
// Database size info
|
|
183
|
+
const finalStats = service.stats();
|
|
184
|
+
console.log('\nš¦ Final Database Statistics');
|
|
185
|
+
console.log('============================');
|
|
186
|
+
console.log(`Total memories: ${finalStats.totalMemories}`);
|
|
187
|
+
console.log(`Total relationships: ${finalStats.totalRelationships}`);
|
|
188
|
+
console.log(`Database size: ${(finalStats.dbSize / 1024).toFixed(1)}KB`);
|
|
189
|
+
console.log(`Database path: ${finalStats.dbPath}`);
|
|
190
|
+
// Performance targets validation
|
|
191
|
+
console.log('\nā
Performance Targets Validation');
|
|
192
|
+
console.log('==================================');
|
|
193
|
+
const storeTarget = results.find(r => r.operation.includes('1KB'));
|
|
194
|
+
if (storeTarget && storeTarget.avgMs < 5) {
|
|
195
|
+
console.log(`ā Store 1KB: ${storeTarget.avgMs.toFixed(2)}ms < 5ms target`);
|
|
196
|
+
}
|
|
197
|
+
else if (storeTarget) {
|
|
198
|
+
console.log(`ā Store 1KB: ${storeTarget.avgMs.toFixed(2)}ms >= 5ms target`);
|
|
199
|
+
}
|
|
200
|
+
const tagTarget = results.find(r => r.operation.includes('indexed'));
|
|
201
|
+
if (tagTarget && tagTarget.avgMs < 10) {
|
|
202
|
+
console.log(`ā Tag search: ${tagTarget.avgMs.toFixed(2)}ms < 10ms target`);
|
|
203
|
+
}
|
|
204
|
+
else if (tagTarget) {
|
|
205
|
+
console.log(`ā Tag search: ${tagTarget.avgMs.toFixed(2)}ms >= 10ms target`);
|
|
206
|
+
}
|
|
207
|
+
const ftsTarget = results.find(r => r.operation.includes('simple query'));
|
|
208
|
+
if (ftsTarget && ftsTarget.avgMs < 100) {
|
|
209
|
+
console.log(`ā FTS search: ${ftsTarget.avgMs.toFixed(2)}ms < 100ms target`);
|
|
210
|
+
}
|
|
211
|
+
else if (ftsTarget) {
|
|
212
|
+
console.log(`ā FTS search: ${ftsTarget.avgMs.toFixed(2)}ms >= 100ms target`);
|
|
213
|
+
}
|
|
214
|
+
const bulkTarget = results.find(r => r.operation.includes('Bulk'));
|
|
215
|
+
if (bulkTarget && bulkTarget.avgMs < 50) {
|
|
216
|
+
console.log(`ā Bulk ops: ${bulkTarget.avgMs.toFixed(2)}ms < 50ms target`);
|
|
217
|
+
}
|
|
218
|
+
else if (bulkTarget) {
|
|
219
|
+
console.log(`ā Bulk ops: ${bulkTarget.avgMs.toFixed(2)}ms >= 50ms target`);
|
|
220
|
+
}
|
|
221
|
+
service.close();
|
|
222
|
+
// Clean up
|
|
223
|
+
try {
|
|
224
|
+
unlinkSync(testDb);
|
|
225
|
+
unlinkSync(testDb + '-shm');
|
|
226
|
+
unlinkSync(testDb + '-wal');
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Ignore cleanup errors
|
|
230
|
+
}
|
|
231
|
+
console.log('\nš Benchmarks completed successfully!\n');
|
|
232
|
+
}
|
|
233
|
+
runBenchmarks().catch(console.error);
|
|
234
|
+
//# sourceMappingURL=performance-benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-benchmark.js","sourceRoot":"","sources":["../../src/tests/performance-benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-test.d.ts","sourceRoot":"","sources":["../../src/tests/performance-test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { MemoryService } from '../services/memory-service.js';
|
|
3
|
+
import { formatHash } from '../utils/debug.js';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
async function performanceTest() {
|
|
6
|
+
console.log('š Performance Test - Large Content Storage');
|
|
7
|
+
console.log('==========================================\n');
|
|
8
|
+
const service = new MemoryService('performance-test.db', 5 * 1024 * 1024); // 5MB limit
|
|
9
|
+
await service.initialize();
|
|
10
|
+
try {
|
|
11
|
+
// Test with various content sizes
|
|
12
|
+
const testSizes = [1000, 10000, 100000, 500000, 1000000]; // 1KB to 1MB
|
|
13
|
+
for (const size of testSizes) {
|
|
14
|
+
// Generate test content
|
|
15
|
+
const content = 'A'.repeat(size) + ' - Performance test content with unique ending ' + Date.now();
|
|
16
|
+
console.log(`Testing ${(size / 1000).toFixed(0)}KB content...`);
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
const hash = service.store(content, ['performance-test']);
|
|
19
|
+
const endTime = Date.now();
|
|
20
|
+
const duration = endTime - startTime;
|
|
21
|
+
console.log(`ā Stored in ${duration}ms (hash: ${formatHash(hash)})`);
|
|
22
|
+
// Verify storage worked
|
|
23
|
+
const retrieved = service.getByHash(hash);
|
|
24
|
+
if (!retrieved || retrieved.content !== content) {
|
|
25
|
+
throw new Error('Content verification failed');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Test size limit
|
|
29
|
+
console.log('\nTesting size limit (6MB content - should exceed 5MB limit)...');
|
|
30
|
+
try {
|
|
31
|
+
const oversizedContent = 'X'.repeat(6 * 1024 * 1024);
|
|
32
|
+
service.store(oversizedContent, ['oversize-test']);
|
|
33
|
+
console.log('ā Size limit test failed - should have thrown error');
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.log(`ā Size limit enforced: ${error.message}`);
|
|
37
|
+
}
|
|
38
|
+
// Show final stats
|
|
39
|
+
console.log('\nš Final Statistics:');
|
|
40
|
+
const stats = await service.stats();
|
|
41
|
+
console.log(`Total memories: ${stats.totalMemories}`);
|
|
42
|
+
console.log(`Database size: ${(stats.dbSize / 1024).toFixed(1)}KB`);
|
|
43
|
+
console.log(`Database path: ${stats.dbPath}`);
|
|
44
|
+
console.log(`Resolved path: ${stats.resolvedPath}`);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
await service.close();
|
|
48
|
+
// Clean up test database
|
|
49
|
+
try {
|
|
50
|
+
fs.unlinkSync('performance-test.db');
|
|
51
|
+
fs.unlinkSync('performance-test.db-wal');
|
|
52
|
+
fs.unlinkSync('performance-test.db-shm');
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
// Ignore cleanup errors
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
console.log('\nš Performance test completed successfully!');
|
|
59
|
+
}
|
|
60
|
+
performanceTest().catch(console.error);
|
|
61
|
+
//# sourceMappingURL=performance-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-test.js","sourceRoot":"","sources":["../../src/tests/performance-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-range-test.d.ts","sourceRoot":"","sources":["../../src/tests/time-range-test.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|