@claude-flow/memory 3.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/.agentic-flow/intelligence.json +16 -0
  2. package/README.md +249 -0
  3. package/__tests__/coverage/base.css +224 -0
  4. package/__tests__/coverage/block-navigation.js +87 -0
  5. package/__tests__/coverage/coverage-final.json +19 -0
  6. package/__tests__/coverage/favicon.png +0 -0
  7. package/__tests__/coverage/index.html +206 -0
  8. package/__tests__/coverage/lcov-report/base.css +224 -0
  9. package/__tests__/coverage/lcov-report/block-navigation.js +87 -0
  10. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  11. package/__tests__/coverage/lcov-report/index.html +206 -0
  12. package/__tests__/coverage/lcov-report/prettify.css +1 -0
  13. package/__tests__/coverage/lcov-report/prettify.js +2 -0
  14. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  15. package/__tests__/coverage/lcov-report/sorter.js +210 -0
  16. package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +2737 -0
  17. package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +3130 -0
  18. package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +601 -0
  19. package/__tests__/coverage/lcov-report/src/application/commands/index.html +131 -0
  20. package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +394 -0
  21. package/__tests__/coverage/lcov-report/src/application/queries/index.html +116 -0
  22. package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +796 -0
  23. package/__tests__/coverage/lcov-report/src/application/services/index.html +116 -0
  24. package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +793 -0
  25. package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +1633 -0
  26. package/__tests__/coverage/lcov-report/src/database-provider.ts.html +1618 -0
  27. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +116 -0
  28. package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +952 -0
  29. package/__tests__/coverage/lcov-report/src/domain/services/index.html +116 -0
  30. package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +1294 -0
  31. package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +3124 -0
  32. package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +2167 -0
  33. package/__tests__/coverage/lcov-report/src/index.html +266 -0
  34. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +1633 -0
  35. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +116 -0
  36. package/__tests__/coverage/lcov-report/src/migration.ts.html +2092 -0
  37. package/__tests__/coverage/lcov-report/src/query-builder.ts.html +1711 -0
  38. package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +2281 -0
  39. package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +2374 -0
  40. package/__tests__/coverage/lcov-report/src/types.ts.html +2266 -0
  41. package/__tests__/coverage/lcov.info +10238 -0
  42. package/__tests__/coverage/prettify.css +1 -0
  43. package/__tests__/coverage/prettify.js +2 -0
  44. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  45. package/__tests__/coverage/sorter.js +210 -0
  46. package/__tests__/coverage/src/agentdb-adapter.ts.html +2737 -0
  47. package/__tests__/coverage/src/agentdb-backend.ts.html +3130 -0
  48. package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +601 -0
  49. package/__tests__/coverage/src/application/commands/index.html +131 -0
  50. package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +394 -0
  51. package/__tests__/coverage/src/application/queries/index.html +116 -0
  52. package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +796 -0
  53. package/__tests__/coverage/src/application/services/index.html +116 -0
  54. package/__tests__/coverage/src/application/services/memory-application-service.ts.html +793 -0
  55. package/__tests__/coverage/src/cache-manager.ts.html +1633 -0
  56. package/__tests__/coverage/src/database-provider.ts.html +1618 -0
  57. package/__tests__/coverage/src/domain/entities/index.html +116 -0
  58. package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +952 -0
  59. package/__tests__/coverage/src/domain/services/index.html +116 -0
  60. package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +1294 -0
  61. package/__tests__/coverage/src/hnsw-index.ts.html +3124 -0
  62. package/__tests__/coverage/src/hybrid-backend.ts.html +2167 -0
  63. package/__tests__/coverage/src/index.html +266 -0
  64. package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +1633 -0
  65. package/__tests__/coverage/src/infrastructure/repositories/index.html +116 -0
  66. package/__tests__/coverage/src/migration.ts.html +2092 -0
  67. package/__tests__/coverage/src/query-builder.ts.html +1711 -0
  68. package/__tests__/coverage/src/sqlite-backend.ts.html +2281 -0
  69. package/__tests__/coverage/src/sqljs-backend.ts.html +2374 -0
  70. package/__tests__/coverage/src/types.ts.html +2266 -0
  71. package/benchmarks/cache-hit-rate.bench.ts +535 -0
  72. package/benchmarks/hnsw-indexing.bench.ts +552 -0
  73. package/benchmarks/memory-write.bench.ts +469 -0
  74. package/benchmarks/vector-search.bench.ts +449 -0
  75. package/dist/agentdb-adapter.d.ts +146 -0
  76. package/dist/agentdb-adapter.d.ts.map +1 -0
  77. package/dist/agentdb-adapter.js +679 -0
  78. package/dist/agentdb-adapter.js.map +1 -0
  79. package/dist/agentdb-backend.d.ts +214 -0
  80. package/dist/agentdb-backend.d.ts.map +1 -0
  81. package/dist/agentdb-backend.js +827 -0
  82. package/dist/agentdb-backend.js.map +1 -0
  83. package/dist/agentdb-backend.test.d.ts +7 -0
  84. package/dist/agentdb-backend.test.d.ts.map +1 -0
  85. package/dist/agentdb-backend.test.js +258 -0
  86. package/dist/agentdb-backend.test.js.map +1 -0
  87. package/dist/application/commands/delete-memory.command.d.ts +65 -0
  88. package/dist/application/commands/delete-memory.command.d.ts.map +1 -0
  89. package/dist/application/commands/delete-memory.command.js +129 -0
  90. package/dist/application/commands/delete-memory.command.js.map +1 -0
  91. package/dist/application/commands/store-memory.command.d.ts +48 -0
  92. package/dist/application/commands/store-memory.command.d.ts.map +1 -0
  93. package/dist/application/commands/store-memory.command.js +72 -0
  94. package/dist/application/commands/store-memory.command.js.map +1 -0
  95. package/dist/application/index.d.ts +12 -0
  96. package/dist/application/index.d.ts.map +1 -0
  97. package/dist/application/index.js +15 -0
  98. package/dist/application/index.js.map +1 -0
  99. package/dist/application/queries/search-memory.query.d.ts +72 -0
  100. package/dist/application/queries/search-memory.query.d.ts.map +1 -0
  101. package/dist/application/queries/search-memory.query.js +143 -0
  102. package/dist/application/queries/search-memory.query.js.map +1 -0
  103. package/dist/application/services/memory-application-service.d.ts +121 -0
  104. package/dist/application/services/memory-application-service.d.ts.map +1 -0
  105. package/dist/application/services/memory-application-service.js +190 -0
  106. package/dist/application/services/memory-application-service.js.map +1 -0
  107. package/dist/cache-manager.d.ts +134 -0
  108. package/dist/cache-manager.d.ts.map +1 -0
  109. package/dist/cache-manager.js +407 -0
  110. package/dist/cache-manager.js.map +1 -0
  111. package/dist/database-provider.d.ts +86 -0
  112. package/dist/database-provider.d.ts.map +1 -0
  113. package/dist/database-provider.js +385 -0
  114. package/dist/database-provider.js.map +1 -0
  115. package/dist/database-provider.test.d.ts +7 -0
  116. package/dist/database-provider.test.d.ts.map +1 -0
  117. package/dist/database-provider.test.js +285 -0
  118. package/dist/database-provider.test.js.map +1 -0
  119. package/dist/domain/entities/memory-entry.d.ts +143 -0
  120. package/dist/domain/entities/memory-entry.d.ts.map +1 -0
  121. package/dist/domain/entities/memory-entry.js +226 -0
  122. package/dist/domain/entities/memory-entry.js.map +1 -0
  123. package/dist/domain/index.d.ts +11 -0
  124. package/dist/domain/index.d.ts.map +1 -0
  125. package/dist/domain/index.js +12 -0
  126. package/dist/domain/index.js.map +1 -0
  127. package/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
  128. package/dist/domain/repositories/memory-repository.interface.d.ts.map +1 -0
  129. package/dist/domain/repositories/memory-repository.interface.js +11 -0
  130. package/dist/domain/repositories/memory-repository.interface.js.map +1 -0
  131. package/dist/domain/services/memory-domain-service.d.ts +105 -0
  132. package/dist/domain/services/memory-domain-service.d.ts.map +1 -0
  133. package/dist/domain/services/memory-domain-service.js +297 -0
  134. package/dist/domain/services/memory-domain-service.js.map +1 -0
  135. package/dist/hnsw-index.d.ts +111 -0
  136. package/dist/hnsw-index.d.ts.map +1 -0
  137. package/dist/hnsw-index.js +781 -0
  138. package/dist/hnsw-index.js.map +1 -0
  139. package/dist/hybrid-backend.d.ts +217 -0
  140. package/dist/hybrid-backend.d.ts.map +1 -0
  141. package/dist/hybrid-backend.js +491 -0
  142. package/dist/hybrid-backend.js.map +1 -0
  143. package/dist/hybrid-backend.test.d.ts +8 -0
  144. package/dist/hybrid-backend.test.d.ts.map +1 -0
  145. package/dist/hybrid-backend.test.js +320 -0
  146. package/dist/hybrid-backend.test.js.map +1 -0
  147. package/dist/index.d.ts +188 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +345 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/infrastructure/index.d.ts +17 -0
  152. package/dist/infrastructure/index.d.ts.map +1 -0
  153. package/dist/infrastructure/index.js +16 -0
  154. package/dist/infrastructure/index.js.map +1 -0
  155. package/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
  156. package/dist/infrastructure/repositories/hybrid-memory-repository.d.ts.map +1 -0
  157. package/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
  158. package/dist/infrastructure/repositories/hybrid-memory-repository.js.map +1 -0
  159. package/dist/migration.d.ts +68 -0
  160. package/dist/migration.d.ts.map +1 -0
  161. package/dist/migration.js +513 -0
  162. package/dist/migration.js.map +1 -0
  163. package/dist/query-builder.d.ts +211 -0
  164. package/dist/query-builder.d.ts.map +1 -0
  165. package/dist/query-builder.js +438 -0
  166. package/dist/query-builder.js.map +1 -0
  167. package/dist/sqlite-backend.d.ts +121 -0
  168. package/dist/sqlite-backend.d.ts.map +1 -0
  169. package/dist/sqlite-backend.js +564 -0
  170. package/dist/sqlite-backend.js.map +1 -0
  171. package/dist/sqljs-backend.d.ts +128 -0
  172. package/dist/sqljs-backend.d.ts.map +1 -0
  173. package/dist/sqljs-backend.js +598 -0
  174. package/dist/sqljs-backend.js.map +1 -0
  175. package/dist/types.d.ts +481 -0
  176. package/dist/types.d.ts.map +1 -0
  177. package/dist/types.js +58 -0
  178. package/dist/types.js.map +1 -0
  179. package/docs/AGENTDB-INTEGRATION.md +388 -0
  180. package/docs/CROSS_PLATFORM.md +505 -0
  181. package/docs/WINDOWS_SUPPORT.md +422 -0
  182. package/examples/agentdb-example.ts +345 -0
  183. package/examples/cross-platform-usage.ts +326 -0
  184. package/framework/benchmark.ts +112 -0
  185. package/package.json +31 -0
  186. package/src/agentdb-adapter.ts +884 -0
  187. package/src/agentdb-backend.test.ts +339 -0
  188. package/src/agentdb-backend.ts +1016 -0
  189. package/src/application/commands/delete-memory.command.ts +172 -0
  190. package/src/application/commands/store-memory.command.ts +103 -0
  191. package/src/application/index.ts +36 -0
  192. package/src/application/queries/search-memory.query.ts +237 -0
  193. package/src/application/services/memory-application-service.ts +236 -0
  194. package/src/cache-manager.ts +516 -0
  195. package/src/database-provider.test.ts +364 -0
  196. package/src/database-provider.ts +511 -0
  197. package/src/domain/entities/memory-entry.ts +289 -0
  198. package/src/domain/index.ts +35 -0
  199. package/src/domain/repositories/memory-repository.interface.ts +120 -0
  200. package/src/domain/services/memory-domain-service.ts +403 -0
  201. package/src/hnsw-index.ts +1013 -0
  202. package/src/hybrid-backend.test.ts +399 -0
  203. package/src/hybrid-backend.ts +694 -0
  204. package/src/index.ts +515 -0
  205. package/src/infrastructure/index.ts +23 -0
  206. package/src/infrastructure/repositories/hybrid-memory-repository.ts +516 -0
  207. package/src/migration.ts +669 -0
  208. package/src/query-builder.ts +542 -0
  209. package/src/sqlite-backend.ts +732 -0
  210. package/src/sqljs-backend.ts +763 -0
  211. package/src/types.ts +727 -0
  212. package/tsconfig.json +9 -0
  213. package/tsconfig.tsbuildinfo +1 -0
  214. package/verify-cross-platform.ts +170 -0
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Database Provider Tests - Cross-Platform Compatibility
3
+ *
4
+ * Tests for platform-aware database selection and fallback mechanisms
5
+ */
6
+ import { describe, it, expect, afterEach } from 'vitest';
7
+ import { createDatabase, getPlatformInfo, getAvailableProviders } from './database-provider.js';
8
+ import { createDefaultEntry } from './types.js';
9
+ import { unlinkSync, existsSync } from 'node:fs';
10
+ describe('DatabaseProvider', () => {
11
+ const testDbPath = './test-database-provider.db';
12
+ afterEach(() => {
13
+ // Cleanup test database
14
+ if (existsSync(testDbPath)) {
15
+ try {
16
+ unlinkSync(testDbPath);
17
+ }
18
+ catch (error) {
19
+ // Ignore cleanup errors
20
+ }
21
+ }
22
+ });
23
+ describe('Platform Detection', () => {
24
+ it('should detect platform information', () => {
25
+ const info = getPlatformInfo();
26
+ expect(info).toHaveProperty('os');
27
+ expect(info).toHaveProperty('isWindows');
28
+ expect(info).toHaveProperty('isMacOS');
29
+ expect(info).toHaveProperty('isLinux');
30
+ expect(info).toHaveProperty('recommendedProvider');
31
+ // Should recommend sql.js on Windows, better-sqlite3 on Unix
32
+ if (info.isWindows) {
33
+ expect(info.recommendedProvider).toBe('sql.js');
34
+ }
35
+ else {
36
+ expect(info.recommendedProvider).toBe('better-sqlite3');
37
+ }
38
+ });
39
+ });
40
+ describe('Provider Availability', () => {
41
+ it('should check available providers', async () => {
42
+ const available = await getAvailableProviders();
43
+ expect(available).toHaveProperty('betterSqlite3');
44
+ expect(available).toHaveProperty('sqlJs');
45
+ expect(available).toHaveProperty('json');
46
+ // JSON backend should always be available
47
+ expect(available.json).toBe(true);
48
+ });
49
+ });
50
+ describe('Automatic Provider Selection', () => {
51
+ it('should create database with auto provider selection', async () => {
52
+ const db = await createDatabase(':memory:');
53
+ expect(db).toBeDefined();
54
+ await expect(db.count()).resolves.toBe(0);
55
+ await db.shutdown();
56
+ });
57
+ it('should create persistent database with auto provider', async () => {
58
+ const db = await createDatabase(testDbPath);
59
+ expect(db).toBeDefined();
60
+ // Store test entry
61
+ const entry = createDefaultEntry({
62
+ key: 'test-key',
63
+ content: 'test content',
64
+ namespace: 'test',
65
+ });
66
+ await db.store(entry);
67
+ await expect(db.count()).resolves.toBe(1);
68
+ await db.shutdown();
69
+ });
70
+ });
71
+ describe('Explicit Provider Selection', () => {
72
+ it('should create database with sql.js provider', async () => {
73
+ const available = await getAvailableProviders();
74
+ if (!available.sqlJs) {
75
+ console.log('sql.js not available, skipping test');
76
+ return;
77
+ }
78
+ const db = await createDatabase(':memory:', {
79
+ provider: 'sql.js',
80
+ verbose: false,
81
+ });
82
+ expect(db).toBeDefined();
83
+ // Test basic operations
84
+ const entry = createDefaultEntry({
85
+ key: 'sqljs-test',
86
+ content: 'testing sql.js backend',
87
+ namespace: 'test',
88
+ });
89
+ await db.store(entry);
90
+ await expect(db.count()).resolves.toBe(1);
91
+ const retrieved = await db.get(entry.id);
92
+ expect(retrieved).toBeDefined();
93
+ expect(retrieved?.key).toBe('sqljs-test');
94
+ await db.shutdown();
95
+ });
96
+ it('should create database with better-sqlite3 provider', async () => {
97
+ const available = await getAvailableProviders();
98
+ if (!available.betterSqlite3) {
99
+ console.log('better-sqlite3 not available, skipping test');
100
+ return;
101
+ }
102
+ const db = await createDatabase(':memory:', {
103
+ provider: 'better-sqlite3',
104
+ verbose: false,
105
+ });
106
+ expect(db).toBeDefined();
107
+ // Test basic operations
108
+ const entry = createDefaultEntry({
109
+ key: 'sqlite-test',
110
+ content: 'testing better-sqlite3 backend',
111
+ namespace: 'test',
112
+ });
113
+ await db.store(entry);
114
+ await expect(db.count()).resolves.toBe(1);
115
+ const retrieved = await db.get(entry.id);
116
+ expect(retrieved).toBeDefined();
117
+ expect(retrieved?.key).toBe('sqlite-test');
118
+ await db.shutdown();
119
+ });
120
+ it('should create database with JSON provider', async () => {
121
+ const db = await createDatabase(testDbPath, {
122
+ provider: 'json',
123
+ verbose: false,
124
+ });
125
+ expect(db).toBeDefined();
126
+ // Test basic operations
127
+ const entry = createDefaultEntry({
128
+ key: 'json-test',
129
+ content: 'testing JSON backend',
130
+ namespace: 'test',
131
+ });
132
+ await db.store(entry);
133
+ await expect(db.count()).resolves.toBe(1);
134
+ const retrieved = await db.get(entry.id);
135
+ expect(retrieved).toBeDefined();
136
+ expect(retrieved?.key).toBe('json-test');
137
+ await db.shutdown();
138
+ });
139
+ });
140
+ describe('Cross-Platform Functionality', () => {
141
+ it('should handle CRUD operations consistently across providers', async () => {
142
+ const available = await getAvailableProviders();
143
+ const providers = [];
144
+ if (available.betterSqlite3)
145
+ providers.push('better-sqlite3');
146
+ if (available.sqlJs)
147
+ providers.push('sql.js');
148
+ providers.push('json'); // Always available
149
+ for (const provider of providers) {
150
+ const db = await createDatabase(':memory:', { provider });
151
+ // Create
152
+ const entry = createDefaultEntry({
153
+ key: `test-${provider}`,
154
+ content: `testing ${provider}`,
155
+ namespace: 'cross-platform',
156
+ tags: ['test', provider],
157
+ });
158
+ await db.store(entry);
159
+ // Read
160
+ const retrieved = await db.get(entry.id);
161
+ expect(retrieved).toBeDefined();
162
+ expect(retrieved?.key).toBe(`test-${provider}`);
163
+ expect(retrieved?.tags).toContain(provider);
164
+ // Update
165
+ const updated = await db.update(entry.id, {
166
+ content: `updated ${provider}`,
167
+ });
168
+ expect(updated).toBeDefined();
169
+ expect(updated?.content).toBe(`updated ${provider}`);
170
+ // Query
171
+ const results = await db.query({
172
+ type: 'hybrid',
173
+ namespace: 'cross-platform',
174
+ limit: 10,
175
+ });
176
+ expect(results.length).toBe(1);
177
+ expect(results[0].key).toBe(`test-${provider}`);
178
+ // Delete
179
+ const deleted = await db.delete(entry.id);
180
+ expect(deleted).toBe(true);
181
+ await expect(db.count()).resolves.toBe(0);
182
+ await db.shutdown();
183
+ }
184
+ });
185
+ it('should handle namespace operations across providers', async () => {
186
+ const db = await createDatabase(':memory:');
187
+ // Create entries in different namespaces
188
+ const entries = [
189
+ createDefaultEntry({ key: 'entry1', content: 'content1', namespace: 'ns1' }),
190
+ createDefaultEntry({ key: 'entry2', content: 'content2', namespace: 'ns1' }),
191
+ createDefaultEntry({ key: 'entry3', content: 'content3', namespace: 'ns2' }),
192
+ ];
193
+ for (const entry of entries) {
194
+ await db.store(entry);
195
+ }
196
+ // List namespaces
197
+ const namespaces = await db.listNamespaces();
198
+ expect(namespaces).toContain('ns1');
199
+ expect(namespaces).toContain('ns2');
200
+ // Count by namespace
201
+ await expect(db.count('ns1')).resolves.toBe(2);
202
+ await expect(db.count('ns2')).resolves.toBe(1);
203
+ // Clear namespace
204
+ const cleared = await db.clearNamespace('ns1');
205
+ expect(cleared).toBe(2);
206
+ await expect(db.count('ns1')).resolves.toBe(0);
207
+ await expect(db.count('ns2')).resolves.toBe(1);
208
+ await db.shutdown();
209
+ });
210
+ it('should handle bulk operations across providers', async () => {
211
+ const db = await createDatabase(':memory:');
212
+ // Bulk insert
213
+ const entries = Array.from({ length: 10 }, (_, i) => createDefaultEntry({
214
+ key: `bulk-${i}`,
215
+ content: `content ${i}`,
216
+ namespace: 'bulk-test',
217
+ }));
218
+ await db.bulkInsert(entries);
219
+ await expect(db.count('bulk-test')).resolves.toBe(10);
220
+ // Bulk delete
221
+ const idsToDelete = entries.slice(0, 5).map((e) => e.id);
222
+ const deletedCount = await db.bulkDelete(idsToDelete);
223
+ expect(deletedCount).toBe(5);
224
+ await expect(db.count('bulk-test')).resolves.toBe(5);
225
+ await db.shutdown();
226
+ });
227
+ });
228
+ describe('Health Check', () => {
229
+ it('should perform health check', async () => {
230
+ const db = await createDatabase(':memory:');
231
+ const health = await db.healthCheck();
232
+ expect(health).toHaveProperty('status');
233
+ expect(health).toHaveProperty('components');
234
+ expect(health).toHaveProperty('timestamp');
235
+ expect(health).toHaveProperty('issues');
236
+ expect(health).toHaveProperty('recommendations');
237
+ expect(health.components).toHaveProperty('storage');
238
+ expect(health.components).toHaveProperty('index');
239
+ expect(health.components).toHaveProperty('cache');
240
+ await db.shutdown();
241
+ });
242
+ });
243
+ describe('Statistics', () => {
244
+ it('should provide backend statistics', async () => {
245
+ const db = await createDatabase(':memory:');
246
+ // Add some test data
247
+ const entries = [
248
+ createDefaultEntry({ key: 'stat1', content: 'content1', namespace: 'stats', type: 'semantic' }),
249
+ createDefaultEntry({ key: 'stat2', content: 'content2', namespace: 'stats', type: 'episodic' }),
250
+ createDefaultEntry({ key: 'stat3', content: 'content3', namespace: 'stats', type: 'semantic' }),
251
+ ];
252
+ for (const entry of entries) {
253
+ await db.store(entry);
254
+ }
255
+ const stats = await db.getStats();
256
+ expect(stats).toHaveProperty('totalEntries');
257
+ expect(stats).toHaveProperty('entriesByNamespace');
258
+ expect(stats).toHaveProperty('entriesByType');
259
+ expect(stats).toHaveProperty('memoryUsage');
260
+ expect(stats).toHaveProperty('avgQueryTime');
261
+ expect(stats.totalEntries).toBe(3);
262
+ await db.shutdown();
263
+ });
264
+ });
265
+ describe('Error Handling', () => {
266
+ it('should handle missing entries gracefully', async () => {
267
+ const db = await createDatabase(':memory:');
268
+ const entry = await db.get('non-existent-id');
269
+ expect(entry).toBeNull();
270
+ const byKey = await db.getByKey('non-existent-ns', 'non-existent-key');
271
+ expect(byKey).toBeNull();
272
+ await db.shutdown();
273
+ });
274
+ it('should handle empty queries', async () => {
275
+ const db = await createDatabase(':memory:');
276
+ const results = await db.query({
277
+ type: 'hybrid',
278
+ limit: 10,
279
+ });
280
+ expect(results).toEqual([]);
281
+ await db.shutdown();
282
+ });
283
+ });
284
+ });
285
+ //# sourceMappingURL=database-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-provider.test.js","sourceRoot":"","sources":["../src/database-provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Memory Entry Entity - Domain Layer
3
+ *
4
+ * Core domain entity representing a stored memory item.
5
+ * Implements DDD principles with encapsulated business logic.
6
+ *
7
+ * @module v3/memory/domain/entities
8
+ */
9
+ /**
10
+ * Memory entry types
11
+ */
12
+ export type MemoryType = 'semantic' | 'episodic' | 'procedural' | 'working';
13
+ /**
14
+ * Memory entry status
15
+ */
16
+ export type MemoryStatus = 'active' | 'archived' | 'deleted';
17
+ /**
18
+ * Memory entry properties
19
+ */
20
+ export interface MemoryEntryProps {
21
+ id?: string;
22
+ namespace: string;
23
+ key: string;
24
+ value: unknown;
25
+ type: MemoryType;
26
+ vector?: Float32Array;
27
+ metadata?: Record<string, unknown>;
28
+ accessCount?: number;
29
+ lastAccessedAt?: Date;
30
+ createdAt?: Date;
31
+ updatedAt?: Date;
32
+ status?: MemoryStatus;
33
+ ttl?: number;
34
+ }
35
+ /**
36
+ * Memory Entry - Aggregate Root
37
+ *
38
+ * Represents a single memory entry with business logic
39
+ * for access tracking, expiration, and state management.
40
+ */
41
+ export declare class MemoryEntry {
42
+ private _id;
43
+ private _namespace;
44
+ private _key;
45
+ private _value;
46
+ private _type;
47
+ private _vector?;
48
+ private _metadata;
49
+ private _accessCount;
50
+ private _lastAccessedAt;
51
+ private _createdAt;
52
+ private _updatedAt;
53
+ private _status;
54
+ private _ttl?;
55
+ private constructor();
56
+ /**
57
+ * Factory method - Create new memory entry
58
+ */
59
+ static create(props: MemoryEntryProps): MemoryEntry;
60
+ /**
61
+ * Factory method - Reconstruct from persistence
62
+ */
63
+ static fromPersistence(props: MemoryEntryProps): MemoryEntry;
64
+ get id(): string;
65
+ get namespace(): string;
66
+ get key(): string;
67
+ get value(): unknown;
68
+ get type(): MemoryType;
69
+ get vector(): Float32Array | undefined;
70
+ get metadata(): Record<string, unknown>;
71
+ get accessCount(): number;
72
+ get lastAccessedAt(): Date;
73
+ get createdAt(): Date;
74
+ get updatedAt(): Date;
75
+ get status(): MemoryStatus;
76
+ get ttl(): number | undefined;
77
+ get compositeKey(): string;
78
+ /**
79
+ * Record an access to this memory entry
80
+ */
81
+ recordAccess(): void;
82
+ /**
83
+ * Update the value of this memory entry
84
+ */
85
+ updateValue(value: unknown): void;
86
+ /**
87
+ * Update the vector embedding
88
+ */
89
+ updateVector(vector: Float32Array): void;
90
+ /**
91
+ * Add or update metadata
92
+ */
93
+ setMetadata(key: string, value: unknown): void;
94
+ /**
95
+ * Remove metadata key
96
+ */
97
+ removeMetadata(key: string): void;
98
+ /**
99
+ * Archive this memory entry
100
+ */
101
+ archive(): void;
102
+ /**
103
+ * Restore archived memory entry
104
+ */
105
+ restore(): void;
106
+ /**
107
+ * Mark as deleted (soft delete)
108
+ */
109
+ delete(): void;
110
+ /**
111
+ * Check if memory has expired based on TTL
112
+ */
113
+ isExpired(): boolean;
114
+ /**
115
+ * Check if memory is accessible (active and not expired)
116
+ */
117
+ isAccessible(): boolean;
118
+ /**
119
+ * Calculate age in milliseconds
120
+ */
121
+ getAge(): number;
122
+ /**
123
+ * Calculate time since last access in milliseconds
124
+ */
125
+ getTimeSinceLastAccess(): number;
126
+ /**
127
+ * Check if memory is considered "hot" (frequently accessed)
128
+ */
129
+ isHot(threshold?: number): boolean;
130
+ /**
131
+ * Check if memory is considered "cold" (not accessed recently)
132
+ */
133
+ isCold(milliseconds?: number): boolean;
134
+ /**
135
+ * Convert to plain object for persistence
136
+ */
137
+ toPersistence(): Record<string, unknown>;
138
+ /**
139
+ * Convert to JSON-serializable object
140
+ */
141
+ toJSON(): Record<string, unknown>;
142
+ }
143
+ //# sourceMappingURL=memory-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-entry.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/memory-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAAO;IAC9B,OAAO,CAAC,UAAU,CAAO;IACzB,OAAO,CAAC,UAAU,CAAO;IACzB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAS;IAEtB,OAAO;IAiBP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW;IAInD;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW;IAK5D,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,IAAI,IAAI,UAAU,CAErB;IAED,IAAI,MAAM,IAAI,YAAY,GAAG,SAAS,CAErC;IAED,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEtC;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,cAAc,IAAI,IAAI,CAEzB;IAED,IAAI,SAAS,IAAI,IAAI,CAEpB;IAED,IAAI,SAAS,IAAI,IAAI,CAEpB;IAED,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAID;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAKjC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAKxC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK9C;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjC;;OAEG;IACH,OAAO,IAAI,IAAI;IAKf;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACH,SAAS,IAAI,OAAO;IAMpB;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACH,sBAAsB,IAAI,MAAM;IAIhC;;OAEG;IACH,KAAK,CAAC,SAAS,GAAE,MAAW,GAAG,OAAO;IAItC;;OAEG;IACH,MAAM,CAAC,YAAY,GAAE,MAAgB,GAAG,OAAO;IAI/C;;OAEG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAkBxC;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAGlC"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Memory Entry Entity - Domain Layer
3
+ *
4
+ * Core domain entity representing a stored memory item.
5
+ * Implements DDD principles with encapsulated business logic.
6
+ *
7
+ * @module v3/memory/domain/entities
8
+ */
9
+ import { randomUUID } from 'crypto';
10
+ /**
11
+ * Memory Entry - Aggregate Root
12
+ *
13
+ * Represents a single memory entry with business logic
14
+ * for access tracking, expiration, and state management.
15
+ */
16
+ export class MemoryEntry {
17
+ _id;
18
+ _namespace;
19
+ _key;
20
+ _value;
21
+ _type;
22
+ _vector;
23
+ _metadata;
24
+ _accessCount;
25
+ _lastAccessedAt;
26
+ _createdAt;
27
+ _updatedAt;
28
+ _status;
29
+ _ttl;
30
+ constructor(props) {
31
+ const now = new Date();
32
+ this._id = props.id ?? randomUUID();
33
+ this._namespace = props.namespace;
34
+ this._key = props.key;
35
+ this._value = props.value;
36
+ this._type = props.type;
37
+ this._vector = props.vector;
38
+ this._metadata = props.metadata ?? {};
39
+ this._accessCount = props.accessCount ?? 0;
40
+ this._lastAccessedAt = props.lastAccessedAt ?? now;
41
+ this._createdAt = props.createdAt ?? now;
42
+ this._updatedAt = props.updatedAt ?? now;
43
+ this._status = props.status ?? 'active';
44
+ this._ttl = props.ttl;
45
+ }
46
+ /**
47
+ * Factory method - Create new memory entry
48
+ */
49
+ static create(props) {
50
+ return new MemoryEntry(props);
51
+ }
52
+ /**
53
+ * Factory method - Reconstruct from persistence
54
+ */
55
+ static fromPersistence(props) {
56
+ return new MemoryEntry(props);
57
+ }
58
+ // Getters
59
+ get id() {
60
+ return this._id;
61
+ }
62
+ get namespace() {
63
+ return this._namespace;
64
+ }
65
+ get key() {
66
+ return this._key;
67
+ }
68
+ get value() {
69
+ return this._value;
70
+ }
71
+ get type() {
72
+ return this._type;
73
+ }
74
+ get vector() {
75
+ return this._vector;
76
+ }
77
+ get metadata() {
78
+ return { ...this._metadata };
79
+ }
80
+ get accessCount() {
81
+ return this._accessCount;
82
+ }
83
+ get lastAccessedAt() {
84
+ return new Date(this._lastAccessedAt);
85
+ }
86
+ get createdAt() {
87
+ return new Date(this._createdAt);
88
+ }
89
+ get updatedAt() {
90
+ return new Date(this._updatedAt);
91
+ }
92
+ get status() {
93
+ return this._status;
94
+ }
95
+ get ttl() {
96
+ return this._ttl;
97
+ }
98
+ get compositeKey() {
99
+ return `${this._namespace}:${this._key}`;
100
+ }
101
+ // Business Logic Methods
102
+ /**
103
+ * Record an access to this memory entry
104
+ */
105
+ recordAccess() {
106
+ this._accessCount++;
107
+ this._lastAccessedAt = new Date();
108
+ }
109
+ /**
110
+ * Update the value of this memory entry
111
+ */
112
+ updateValue(value) {
113
+ this._value = value;
114
+ this._updatedAt = new Date();
115
+ }
116
+ /**
117
+ * Update the vector embedding
118
+ */
119
+ updateVector(vector) {
120
+ this._vector = vector;
121
+ this._updatedAt = new Date();
122
+ }
123
+ /**
124
+ * Add or update metadata
125
+ */
126
+ setMetadata(key, value) {
127
+ this._metadata[key] = value;
128
+ this._updatedAt = new Date();
129
+ }
130
+ /**
131
+ * Remove metadata key
132
+ */
133
+ removeMetadata(key) {
134
+ delete this._metadata[key];
135
+ this._updatedAt = new Date();
136
+ }
137
+ /**
138
+ * Archive this memory entry
139
+ */
140
+ archive() {
141
+ this._status = 'archived';
142
+ this._updatedAt = new Date();
143
+ }
144
+ /**
145
+ * Restore archived memory entry
146
+ */
147
+ restore() {
148
+ if (this._status === 'archived') {
149
+ this._status = 'active';
150
+ this._updatedAt = new Date();
151
+ }
152
+ }
153
+ /**
154
+ * Mark as deleted (soft delete)
155
+ */
156
+ delete() {
157
+ this._status = 'deleted';
158
+ this._updatedAt = new Date();
159
+ }
160
+ /**
161
+ * Check if memory has expired based on TTL
162
+ */
163
+ isExpired() {
164
+ if (!this._ttl)
165
+ return false;
166
+ const expiresAt = this._createdAt.getTime() + this._ttl;
167
+ return Date.now() > expiresAt;
168
+ }
169
+ /**
170
+ * Check if memory is accessible (active and not expired)
171
+ */
172
+ isAccessible() {
173
+ return this._status === 'active' && !this.isExpired();
174
+ }
175
+ /**
176
+ * Calculate age in milliseconds
177
+ */
178
+ getAge() {
179
+ return Date.now() - this._createdAt.getTime();
180
+ }
181
+ /**
182
+ * Calculate time since last access in milliseconds
183
+ */
184
+ getTimeSinceLastAccess() {
185
+ return Date.now() - this._lastAccessedAt.getTime();
186
+ }
187
+ /**
188
+ * Check if memory is considered "hot" (frequently accessed)
189
+ */
190
+ isHot(threshold = 10) {
191
+ return this._accessCount >= threshold;
192
+ }
193
+ /**
194
+ * Check if memory is considered "cold" (not accessed recently)
195
+ */
196
+ isCold(milliseconds = 3600000) {
197
+ return this.getTimeSinceLastAccess() > milliseconds;
198
+ }
199
+ /**
200
+ * Convert to plain object for persistence
201
+ */
202
+ toPersistence() {
203
+ return {
204
+ id: this._id,
205
+ namespace: this._namespace,
206
+ key: this._key,
207
+ value: this._value,
208
+ type: this._type,
209
+ vector: this._vector ? Array.from(this._vector) : undefined,
210
+ metadata: this._metadata,
211
+ accessCount: this._accessCount,
212
+ lastAccessedAt: this._lastAccessedAt.toISOString(),
213
+ createdAt: this._createdAt.toISOString(),
214
+ updatedAt: this._updatedAt.toISOString(),
215
+ status: this._status,
216
+ ttl: this._ttl,
217
+ };
218
+ }
219
+ /**
220
+ * Convert to JSON-serializable object
221
+ */
222
+ toJSON() {
223
+ return this.toPersistence();
224
+ }
225
+ }
226
+ //# sourceMappingURL=memory-entry.js.map