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.
Files changed (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +742 -0
  3. package/dist/cli/arg-parser.d.ts +9 -0
  4. package/dist/cli/arg-parser.d.ts.map +1 -0
  5. package/dist/cli/arg-parser.js +68 -0
  6. package/dist/cli/arg-parser.js.map +1 -0
  7. package/dist/cli/help-generator.d.ts +8 -0
  8. package/dist/cli/help-generator.d.ts.map +1 -0
  9. package/dist/cli/help-generator.js +89 -0
  10. package/dist/cli/help-generator.js.map +1 -0
  11. package/dist/cli/index.d.ts +27 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +56 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/query-builder.d.ts +8 -0
  16. package/dist/cli/query-builder.d.ts.map +1 -0
  17. package/dist/cli/query-builder.js +63 -0
  18. package/dist/cli/query-builder.js.map +1 -0
  19. package/dist/cli/shortcuts-config.d.ts +26 -0
  20. package/dist/cli/shortcuts-config.d.ts.map +1 -0
  21. package/dist/cli/shortcuts-config.js +94 -0
  22. package/dist/cli/shortcuts-config.js.map +1 -0
  23. package/dist/graphql/resolvers.d.ts +101 -0
  24. package/dist/graphql/resolvers.d.ts.map +1 -0
  25. package/dist/graphql/resolvers.js +98 -0
  26. package/dist/graphql/resolvers.js.map +1 -0
  27. package/dist/graphql/schema.d.ts +13 -0
  28. package/dist/graphql/schema.d.ts.map +1 -0
  29. package/dist/graphql/schema.js +314 -0
  30. package/dist/graphql/schema.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +573 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/services/backup-service.d.ts +57 -0
  36. package/dist/services/backup-service.d.ts.map +1 -0
  37. package/dist/services/backup-service.js +191 -0
  38. package/dist/services/backup-service.js.map +1 -0
  39. package/dist/services/database-optimizer.d.ts +15 -0
  40. package/dist/services/database-optimizer.d.ts.map +1 -0
  41. package/dist/services/database-optimizer.js +45 -0
  42. package/dist/services/database-optimizer.js.map +1 -0
  43. package/dist/services/memory-service.d.ts +126 -0
  44. package/dist/services/memory-service.d.ts.map +1 -0
  45. package/dist/services/memory-service.js +862 -0
  46. package/dist/services/memory-service.js.map +1 -0
  47. package/dist/services/migrations.d.ts +17 -0
  48. package/dist/services/migrations.d.ts.map +1 -0
  49. package/dist/services/migrations.js +273 -0
  50. package/dist/services/migrations.js.map +1 -0
  51. package/dist/tests/backup-export-test.d.ts +2 -0
  52. package/dist/tests/backup-export-test.d.ts.map +1 -0
  53. package/dist/tests/backup-export-test.js +162 -0
  54. package/dist/tests/backup-export-test.js.map +1 -0
  55. package/dist/tests/backup-test.d.ts +14 -0
  56. package/dist/tests/backup-test.d.ts.map +1 -0
  57. package/dist/tests/backup-test.js +209 -0
  58. package/dist/tests/backup-test.js.map +1 -0
  59. package/dist/tests/export-import-test.d.ts +15 -0
  60. package/dist/tests/export-import-test.d.ts.map +1 -0
  61. package/dist/tests/export-import-test.js +227 -0
  62. package/dist/tests/export-import-test.js.map +1 -0
  63. package/dist/tests/graphql-comprehensive-test.d.ts +6 -0
  64. package/dist/tests/graphql-comprehensive-test.d.ts.map +1 -0
  65. package/dist/tests/graphql-comprehensive-test.js +342 -0
  66. package/dist/tests/graphql-comprehensive-test.js.map +1 -0
  67. package/dist/tests/graphql-performance-test.d.ts +6 -0
  68. package/dist/tests/graphql-performance-test.d.ts.map +1 -0
  69. package/dist/tests/graphql-performance-test.js +141 -0
  70. package/dist/tests/graphql-performance-test.js.map +1 -0
  71. package/dist/tests/graphql-test.d.ts +5 -0
  72. package/dist/tests/graphql-test.d.ts.map +1 -0
  73. package/dist/tests/graphql-test.js +47 -0
  74. package/dist/tests/graphql-test.js.map +1 -0
  75. package/dist/tests/memory-server-tests.d.ts +7 -0
  76. package/dist/tests/memory-server-tests.d.ts.map +1 -0
  77. package/dist/tests/memory-server-tests.js +466 -0
  78. package/dist/tests/memory-server-tests.js.map +1 -0
  79. package/dist/tests/migration-test.d.ts +2 -0
  80. package/dist/tests/migration-test.d.ts.map +1 -0
  81. package/dist/tests/migration-test.js +270 -0
  82. package/dist/tests/migration-test.js.map +1 -0
  83. package/dist/tests/performance-benchmark.d.ts +7 -0
  84. package/dist/tests/performance-benchmark.d.ts.map +1 -0
  85. package/dist/tests/performance-benchmark.js +234 -0
  86. package/dist/tests/performance-benchmark.js.map +1 -0
  87. package/dist/tests/performance-test.d.ts +3 -0
  88. package/dist/tests/performance-test.d.ts.map +1 -0
  89. package/dist/tests/performance-test.js +61 -0
  90. package/dist/tests/performance-test.js.map +1 -0
  91. package/dist/tests/time-range-test.d.ts +7 -0
  92. package/dist/tests/time-range-test.d.ts.map +1 -0
  93. package/dist/tests/time-range-test.js +169 -0
  94. package/dist/tests/time-range-test.js.map +1 -0
  95. package/dist/tools/delete-memory/cli-parser.d.ts +2 -0
  96. package/dist/tools/delete-memory/cli-parser.d.ts.map +1 -0
  97. package/dist/tools/delete-memory/cli-parser.js +13 -0
  98. package/dist/tools/delete-memory/cli-parser.js.map +1 -0
  99. package/dist/tools/delete-memory/executor.d.ts +13 -0
  100. package/dist/tools/delete-memory/executor.d.ts.map +1 -0
  101. package/dist/tools/delete-memory/executor.js +40 -0
  102. package/dist/tools/delete-memory/executor.js.map +1 -0
  103. package/dist/tools/delete-memory/index.d.ts +3 -0
  104. package/dist/tools/delete-memory/index.d.ts.map +1 -0
  105. package/dist/tools/delete-memory/index.js +24 -0
  106. package/dist/tools/delete-memory/index.js.map +1 -0
  107. package/dist/tools/export-memory/cli-parser.d.ts +2 -0
  108. package/dist/tools/export-memory/cli-parser.d.ts.map +1 -0
  109. package/dist/tools/export-memory/cli-parser.js +34 -0
  110. package/dist/tools/export-memory/cli-parser.js.map +1 -0
  111. package/dist/tools/export-memory/executor.d.ts +10 -0
  112. package/dist/tools/export-memory/executor.d.ts.map +1 -0
  113. package/dist/tools/export-memory/executor.js +41 -0
  114. package/dist/tools/export-memory/executor.js.map +1 -0
  115. package/dist/tools/export-memory/index.d.ts +4 -0
  116. package/dist/tools/export-memory/index.d.ts.map +1 -0
  117. package/dist/tools/export-memory/index.js +99 -0
  118. package/dist/tools/export-memory/index.js.map +1 -0
  119. package/dist/tools/import-memory/cli-parser.d.ts +2 -0
  120. package/dist/tools/import-memory/cli-parser.d.ts.map +1 -0
  121. package/dist/tools/import-memory/cli-parser.js +25 -0
  122. package/dist/tools/import-memory/cli-parser.js.map +1 -0
  123. package/dist/tools/import-memory/executor.d.ts +8 -0
  124. package/dist/tools/import-memory/executor.d.ts.map +1 -0
  125. package/dist/tools/import-memory/executor.js +31 -0
  126. package/dist/tools/import-memory/executor.js.map +1 -0
  127. package/dist/tools/import-memory/index.d.ts +4 -0
  128. package/dist/tools/import-memory/index.d.ts.map +1 -0
  129. package/dist/tools/import-memory/index.js +70 -0
  130. package/dist/tools/import-memory/index.js.map +1 -0
  131. package/dist/tools/index.d.ts +14 -0
  132. package/dist/tools/index.d.ts.map +1 -0
  133. package/dist/tools/index.js +48 -0
  134. package/dist/tools/index.js.map +1 -0
  135. package/dist/tools/memory-graphql/cli-parser.d.ts +6 -0
  136. package/dist/tools/memory-graphql/cli-parser.d.ts.map +1 -0
  137. package/dist/tools/memory-graphql/cli-parser.js +24 -0
  138. package/dist/tools/memory-graphql/cli-parser.js.map +1 -0
  139. package/dist/tools/memory-graphql/executor.d.ts +18 -0
  140. package/dist/tools/memory-graphql/executor.d.ts.map +1 -0
  141. package/dist/tools/memory-graphql/executor.js +53 -0
  142. package/dist/tools/memory-graphql/executor.js.map +1 -0
  143. package/dist/tools/memory-graphql/index.d.ts +3 -0
  144. package/dist/tools/memory-graphql/index.d.ts.map +1 -0
  145. package/dist/tools/memory-graphql/index.js +73 -0
  146. package/dist/tools/memory-graphql/index.js.map +1 -0
  147. package/dist/tools/memory-stats/cli-parser.d.ts +2 -0
  148. package/dist/tools/memory-stats/cli-parser.d.ts.map +1 -0
  149. package/dist/tools/memory-stats/cli-parser.js +8 -0
  150. package/dist/tools/memory-stats/cli-parser.js.map +1 -0
  151. package/dist/tools/memory-stats/executor.d.ts +4 -0
  152. package/dist/tools/memory-stats/executor.d.ts.map +1 -0
  153. package/dist/tools/memory-stats/executor.js +4 -0
  154. package/dist/tools/memory-stats/executor.js.map +1 -0
  155. package/dist/tools/memory-stats/index.d.ts +3 -0
  156. package/dist/tools/memory-stats/index.d.ts.map +1 -0
  157. package/dist/tools/memory-stats/index.js +15 -0
  158. package/dist/tools/memory-stats/index.js.map +1 -0
  159. package/dist/tools/search-memory/cli-parser.d.ts +2 -0
  160. package/dist/tools/search-memory/cli-parser.d.ts.map +1 -0
  161. package/dist/tools/search-memory/cli-parser.js +56 -0
  162. package/dist/tools/search-memory/cli-parser.js.map +1 -0
  163. package/dist/tools/search-memory/executor.d.ts +36 -0
  164. package/dist/tools/search-memory/executor.d.ts.map +1 -0
  165. package/dist/tools/search-memory/executor.js +83 -0
  166. package/dist/tools/search-memory/executor.js.map +1 -0
  167. package/dist/tools/search-memory/index.d.ts +3 -0
  168. package/dist/tools/search-memory/index.d.ts.map +1 -0
  169. package/dist/tools/search-memory/index.js +89 -0
  170. package/dist/tools/search-memory/index.js.map +1 -0
  171. package/dist/tools/store-memory/cli-parser.d.ts +2 -0
  172. package/dist/tools/store-memory/cli-parser.d.ts.map +1 -0
  173. package/dist/tools/store-memory/cli-parser.js +21 -0
  174. package/dist/tools/store-memory/cli-parser.js.map +1 -0
  175. package/dist/tools/store-memory/executor.d.ts +16 -0
  176. package/dist/tools/store-memory/executor.d.ts.map +1 -0
  177. package/dist/tools/store-memory/executor.js +100 -0
  178. package/dist/tools/store-memory/executor.js.map +1 -0
  179. package/dist/tools/store-memory/index.d.ts +3 -0
  180. package/dist/tools/store-memory/index.d.ts.map +1 -0
  181. package/dist/tools/store-memory/index.js +68 -0
  182. package/dist/tools/store-memory/index.js.map +1 -0
  183. package/dist/tools/sync-memory/cli-parser.d.ts +1 -0
  184. package/dist/tools/sync-memory/cli-parser.d.ts.map +1 -0
  185. package/dist/tools/sync-memory/cli-parser.js +2 -0
  186. package/dist/tools/sync-memory/cli-parser.js.map +1 -0
  187. package/dist/tools/sync-memory/executor.d.ts +1 -0
  188. package/dist/tools/sync-memory/executor.d.ts.map +1 -0
  189. package/dist/tools/sync-memory/executor.js +2 -0
  190. package/dist/tools/sync-memory/executor.js.map +1 -0
  191. package/dist/tools/sync-memory/index.d.ts +1 -0
  192. package/dist/tools/sync-memory/index.d.ts.map +1 -0
  193. package/dist/tools/sync-memory/index.js +2 -0
  194. package/dist/tools/sync-memory/index.js.map +1 -0
  195. package/dist/tools/update-memory/cli-parser.d.ts +2 -0
  196. package/dist/tools/update-memory/cli-parser.d.ts.map +1 -0
  197. package/dist/tools/update-memory/cli-parser.js +17 -0
  198. package/dist/tools/update-memory/cli-parser.js.map +1 -0
  199. package/dist/tools/update-memory/executor.d.ts +16 -0
  200. package/dist/tools/update-memory/executor.d.ts.map +1 -0
  201. package/dist/tools/update-memory/executor.js +59 -0
  202. package/dist/tools/update-memory/executor.js.map +1 -0
  203. package/dist/tools/update-memory/index.d.ts +3 -0
  204. package/dist/tools/update-memory/index.d.ts.map +1 -0
  205. package/dist/tools/update-memory/index.js +30 -0
  206. package/dist/tools/update-memory/index.js.map +1 -0
  207. package/dist/transports/streamable-http.d.ts +38 -0
  208. package/dist/transports/streamable-http.d.ts.map +1 -0
  209. package/dist/transports/streamable-http.js +209 -0
  210. package/dist/transports/streamable-http.js.map +1 -0
  211. package/dist/types/tools.d.ts +79 -0
  212. package/dist/types/tools.d.ts.map +1 -0
  213. package/dist/types/tools.js +3 -0
  214. package/dist/types/tools.js.map +1 -0
  215. package/dist/utils/cli-parser.d.ts +12 -0
  216. package/dist/utils/cli-parser.d.ts.map +1 -0
  217. package/dist/utils/cli-parser.js +43 -0
  218. package/dist/utils/cli-parser.js.map +1 -0
  219. package/dist/utils/config.d.ts +95 -0
  220. package/dist/utils/config.d.ts.map +1 -0
  221. package/dist/utils/config.js +176 -0
  222. package/dist/utils/config.js.map +1 -0
  223. package/dist/utils/db-integrity-check.d.ts +22 -0
  224. package/dist/utils/db-integrity-check.d.ts.map +1 -0
  225. package/dist/utils/db-integrity-check.js +69 -0
  226. package/dist/utils/db-integrity-check.js.map +1 -0
  227. package/dist/utils/debug.d.ts +25 -0
  228. package/dist/utils/debug.d.ts.map +1 -0
  229. package/dist/utils/debug.js +67 -0
  230. package/dist/utils/debug.js.map +1 -0
  231. package/dist/utils/help-generator.d.ts +18 -0
  232. package/dist/utils/help-generator.d.ts.map +1 -0
  233. package/dist/utils/help-generator.js +81 -0
  234. package/dist/utils/help-generator.js.map +1 -0
  235. package/dist/utils/json-parser.d.ts +12 -0
  236. package/dist/utils/json-parser.d.ts.map +1 -0
  237. package/dist/utils/json-parser.js +52 -0
  238. package/dist/utils/json-parser.js.map +1 -0
  239. package/dist/utils/mcp-config.d.ts +12 -0
  240. package/dist/utils/mcp-config.d.ts.map +1 -0
  241. package/dist/utils/mcp-config.js +64 -0
  242. package/dist/utils/mcp-config.js.map +1 -0
  243. package/dist/web-server.d.ts +3 -0
  244. package/dist/web-server.d.ts.map +1 -0
  245. package/dist/web-server.js +265 -0
  246. package/dist/web-server.js.map +1 -0
  247. 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,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Performance Benchmark Suite
4
+ * Comprehensive benchmarks to measure and validate optimization gains
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=performance-benchmark.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=performance-test.d.ts.map
@@ -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,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Time Range Search Test
4
+ * Tests the time range filtering functionality
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=time-range-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-range-test.d.ts","sourceRoot":"","sources":["../../src/tests/time-range-test.ts"],"names":[],"mappings":";AAEA;;;GAGG"}