@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,345 @@
1
+ /**
2
+ * AgentDB Backend Example
3
+ *
4
+ * Demonstrates agentdb@2.0.0-alpha.3.4 integration with V3 memory system
5
+ */
6
+
7
+ import { AgentDBBackend, HybridBackend, createDefaultEntry } from '../src/index.js';
8
+
9
+ // ===== Example 1: Basic AgentDBBackend Usage =====
10
+
11
+ async function basicExample() {
12
+ console.log('\n=== Basic AgentDBBackend Example ===\n');
13
+
14
+ // Initialize backend
15
+ const backend = new AgentDBBackend({
16
+ dbPath: ':memory:',
17
+ namespace: 'demo',
18
+ vectorDimension: 384, // Using MiniLM embeddings
19
+ hnswM: 16,
20
+ hnswEfConstruction: 200,
21
+ });
22
+
23
+ await backend.initialize();
24
+
25
+ // Check if AgentDB is available
26
+ if (backend.isAvailable()) {
27
+ console.log('✓ AgentDB available with HNSW indexing');
28
+ } else {
29
+ console.log('⚠ AgentDB not available, using fallback');
30
+ }
31
+
32
+ // Store some entries
33
+ const entries = [
34
+ createDefaultEntry({
35
+ key: 'auth-oauth',
36
+ content: 'OAuth 2.0 authentication flow with refresh tokens',
37
+ tags: ['auth', 'oauth', 'security'],
38
+ }),
39
+ createDefaultEntry({
40
+ key: 'auth-jwt',
41
+ content: 'JWT token-based authentication for REST APIs',
42
+ tags: ['auth', 'jwt', 'api'],
43
+ }),
44
+ createDefaultEntry({
45
+ key: 'auth-session',
46
+ content: 'Session-based authentication with cookies',
47
+ tags: ['auth', 'session', 'cookies'],
48
+ }),
49
+ ];
50
+
51
+ console.log('Storing entries...');
52
+ for (const entry of entries) {
53
+ await backend.store(entry);
54
+ }
55
+
56
+ // Query by exact key
57
+ console.log('\n--- Exact Key Query ---');
58
+ const oauth = await backend.getByKey('demo', 'auth-oauth');
59
+ console.log('Found:', oauth?.content);
60
+
61
+ // Query by prefix
62
+ console.log('\n--- Prefix Query ---');
63
+ const authEntries = await backend.query({
64
+ type: 'prefix',
65
+ keyPrefix: 'auth-',
66
+ limit: 10,
67
+ });
68
+ console.log(`Found ${authEntries.length} entries with prefix 'auth-'`);
69
+
70
+ // Query by tags
71
+ console.log('\n--- Tag Query ---');
72
+ const jwtEntries = await backend.query({
73
+ type: 'tag',
74
+ tags: ['jwt'],
75
+ limit: 10,
76
+ });
77
+ console.log(`Found ${jwtEntries.length} entries with tag 'jwt'`);
78
+
79
+ // Get statistics
80
+ console.log('\n--- Statistics ---');
81
+ const stats = await backend.getStats();
82
+ console.log('Total entries:', stats.totalEntries);
83
+ console.log('Avg query time:', stats.avgQueryTime.toFixed(2), 'ms');
84
+ console.log('Memory usage:', (stats.memoryUsage / 1024).toFixed(2), 'KB');
85
+
86
+ if (stats.hnswStats) {
87
+ console.log('HNSW vectors:', stats.hnswStats.vectorCount);
88
+ console.log('HNSW avg search:', stats.hnswStats.avgSearchTime.toFixed(2), 'ms');
89
+ }
90
+
91
+ // Health check
92
+ console.log('\n--- Health Check ---');
93
+ const health = await backend.healthCheck();
94
+ console.log('Status:', health.status);
95
+ console.log('Storage:', health.components.storage.status);
96
+ console.log('Index:', health.components.index.status);
97
+
98
+ await backend.shutdown();
99
+ console.log('\n✓ Backend shutdown complete');
100
+ }
101
+
102
+ // ===== Example 2: Hybrid Backend (SQLite + AgentDB) =====
103
+
104
+ async function hybridExample() {
105
+ console.log('\n=== Hybrid Backend Example ===\n');
106
+
107
+ // Simulated embedding function (normally would use real embeddings)
108
+ const mockEmbedding = async (text: string): Promise<Float32Array> => {
109
+ const hash = Array.from(text).reduce((acc, char) => acc + char.charCodeAt(0), 0);
110
+ const dim = 384;
111
+ const result = new Float32Array(dim);
112
+ for (let i = 0; i < dim; i++) {
113
+ result[i] = Math.sin((hash + i) * 0.1);
114
+ }
115
+ return result;
116
+ };
117
+
118
+ const hybrid = new HybridBackend({
119
+ sqlite: {
120
+ dbPath: ':memory:',
121
+ },
122
+ agentdb: {
123
+ dbPath: ':memory:',
124
+ vectorDimension: 384,
125
+ hnswM: 16,
126
+ },
127
+ embeddingGenerator: mockEmbedding,
128
+ dualWrite: true,
129
+ });
130
+
131
+ await hybrid.initialize();
132
+
133
+ console.log('✓ Hybrid backend initialized (SQLite + AgentDB)');
134
+
135
+ // Store entries with embeddings
136
+ console.log('\nStoring entries with embeddings...');
137
+ const techEntries = [
138
+ createDefaultEntry({
139
+ key: 'pattern-singleton',
140
+ content: 'Singleton design pattern ensures only one instance exists',
141
+ namespace: 'patterns',
142
+ tags: ['design-pattern', 'creational'],
143
+ }),
144
+ createDefaultEntry({
145
+ key: 'pattern-factory',
146
+ content: 'Factory pattern creates objects without specifying exact classes',
147
+ namespace: 'patterns',
148
+ tags: ['design-pattern', 'creational'],
149
+ }),
150
+ createDefaultEntry({
151
+ key: 'pattern-observer',
152
+ content: 'Observer pattern defines one-to-many dependency between objects',
153
+ namespace: 'patterns',
154
+ tags: ['design-pattern', 'behavioral'],
155
+ }),
156
+ ];
157
+
158
+ for (const entry of techEntries) {
159
+ await hybrid.store(entry);
160
+ }
161
+
162
+ // Structured query (goes to SQLite)
163
+ console.log('\n--- Structured Query (SQLite) ---');
164
+ const structured = await hybrid.queryStructured({
165
+ namespace: 'patterns',
166
+ type: 'episodic',
167
+ limit: 10,
168
+ });
169
+ console.log(`Found ${structured.length} entries in 'patterns' namespace`);
170
+
171
+ // Semantic query (goes to AgentDB)
172
+ console.log('\n--- Semantic Query (AgentDB HNSW) ---');
173
+ const semantic = await hybrid.querySemantic({
174
+ content: 'object creation patterns',
175
+ k: 5,
176
+ threshold: 0.5,
177
+ });
178
+ console.log(`Found ${semantic.length} semantically similar entries`);
179
+ semantic.forEach((entry, i) => {
180
+ console.log(` ${i + 1}. ${entry.key}: ${entry.content.substring(0, 60)}...`);
181
+ });
182
+
183
+ // Hybrid query (combines both)
184
+ console.log('\n--- Hybrid Query (Both Backends) ---');
185
+ const hybridResults = await hybrid.queryHybrid({
186
+ semantic: {
187
+ content: 'design patterns for object creation',
188
+ k: 10,
189
+ threshold: 0.3,
190
+ },
191
+ structured: {
192
+ namespace: 'patterns',
193
+ },
194
+ combineStrategy: 'semantic-first',
195
+ });
196
+ console.log(`Found ${hybridResults.length} entries (hybrid query)`);
197
+
198
+ // Statistics from both backends
199
+ console.log('\n--- Hybrid Statistics ---');
200
+ const hybridStats = await hybrid.getStats();
201
+ console.log('Total entries:', hybridStats.totalEntries);
202
+ console.log('Entries by namespace:', hybridStats.entriesByNamespace);
203
+ console.log('SQLite queries:', (hybrid as any).stats.sqliteQueries);
204
+ console.log('AgentDB queries:', (hybrid as any).stats.agentdbQueries);
205
+ console.log('Hybrid queries:', (hybrid as any).stats.hybridQueries);
206
+
207
+ await hybrid.shutdown();
208
+ console.log('\n✓ Hybrid backend shutdown complete');
209
+ }
210
+
211
+ // ===== Example 3: Vector Search Performance =====
212
+
213
+ async function vectorSearchExample() {
214
+ console.log('\n=== Vector Search Performance Example ===\n');
215
+
216
+ const backend = new AgentDBBackend({
217
+ dbPath: ':memory:',
218
+ vectorDimension: 128, // Smaller for demo
219
+ hnswM: 16,
220
+ hnswEfConstruction: 100,
221
+ hnswEfSearch: 50,
222
+ });
223
+
224
+ await backend.initialize();
225
+
226
+ // Generate mock embeddings
227
+ const generateEmbedding = (seed: number): Float32Array => {
228
+ const embedding = new Float32Array(128);
229
+ for (let i = 0; i < 128; i++) {
230
+ embedding[i] = Math.sin((seed + i) * 0.1) * Math.cos(seed * 0.05);
231
+ }
232
+ return embedding;
233
+ };
234
+
235
+ // Insert many vectors
236
+ console.log('Inserting 1000 vectors...');
237
+ const startInsert = performance.now();
238
+
239
+ for (let i = 0; i < 1000; i++) {
240
+ const entry = createDefaultEntry({
241
+ key: `vector-${i}`,
242
+ content: `Content for vector ${i}`,
243
+ namespace: 'vectors',
244
+ });
245
+ entry.embedding = generateEmbedding(i);
246
+ await backend.store(entry);
247
+ }
248
+
249
+ const insertTime = performance.now() - startInsert;
250
+ console.log(`Inserted 1000 vectors in ${insertTime.toFixed(2)}ms`);
251
+
252
+ // Perform searches
253
+ console.log('\nPerforming 100 searches...');
254
+ const queryEmbedding = generateEmbedding(42);
255
+
256
+ const startSearch = performance.now();
257
+
258
+ for (let i = 0; i < 100; i++) {
259
+ await backend.search(queryEmbedding, { k: 10 });
260
+ }
261
+
262
+ const searchTime = performance.now() - startSearch;
263
+ console.log(`100 searches in ${searchTime.toFixed(2)}ms`);
264
+ console.log(`Avg per search: ${(searchTime / 100).toFixed(2)}ms`);
265
+
266
+ // Get final statistics
267
+ const stats = await backend.getStats();
268
+ console.log('\n--- Final Statistics ---');
269
+ console.log('Total searches:', stats.avgSearchTime > 0 ? 'Yes' : 'No');
270
+ console.log('Memory usage:', (stats.memoryUsage / 1024 / 1024).toFixed(2), 'MB');
271
+
272
+ await backend.shutdown();
273
+ console.log('\n✓ Performance test complete');
274
+ }
275
+
276
+ // ===== Example 4: Graceful Degradation =====
277
+
278
+ async function gracefulDegradationExample() {
279
+ console.log('\n=== Graceful Degradation Example ===\n');
280
+
281
+ // Create backend that might not have agentdb
282
+ const backend = new AgentDBBackend({
283
+ dbPath: ':memory:',
284
+ });
285
+
286
+ await backend.initialize();
287
+
288
+ // Check availability
289
+ if (backend.isAvailable()) {
290
+ console.log('✓ AgentDB available - using HNSW indexing');
291
+ } else {
292
+ console.log('⚠ AgentDB not available - using fallback in-memory storage');
293
+ console.log(' (Install: npm install agentdb@2.0.0-alpha.3.4)');
294
+ }
295
+
296
+ // Store entries (works either way)
297
+ const entry = createDefaultEntry({
298
+ key: 'test',
299
+ content: 'Test content',
300
+ });
301
+ entry.embedding = new Float32Array([0.1, 0.2, 0.3, 0.4]);
302
+
303
+ await backend.store(entry);
304
+
305
+ // Search (falls back to brute-force if needed)
306
+ const results = await backend.search(new Float32Array([0.1, 0.2, 0.3, 0.4]), {
307
+ k: 5,
308
+ });
309
+
310
+ console.log(`Search found ${results.length} results`);
311
+ console.log('Fallback behavior: ', backend.isAvailable() ? 'HNSW' : 'Brute-force');
312
+
313
+ await backend.shutdown();
314
+ console.log('\n✓ Graceful degradation demonstrated');
315
+ }
316
+
317
+ // ===== Run All Examples =====
318
+
319
+ async function main() {
320
+ console.log('╔═══════════════════════════════════════════════════════════╗');
321
+ console.log('║ AgentDB Integration Examples ║');
322
+ console.log('║ V3 Memory Module with agentdb@2.0.0-alpha.3.4 ║');
323
+ console.log('╚═══════════════════════════════════════════════════════════╝');
324
+
325
+ try {
326
+ await basicExample();
327
+ await hybridExample();
328
+ await vectorSearchExample();
329
+ await gracefulDegradationExample();
330
+
331
+ console.log('\n╔═══════════════════════════════════════════════════════════╗');
332
+ console.log('║ All examples completed successfully! ║');
333
+ console.log('╚═══════════════════════════════════════════════════════════╝\n');
334
+ } catch (error) {
335
+ console.error('\n❌ Error running examples:', error);
336
+ process.exit(1);
337
+ }
338
+ }
339
+
340
+ // Run if called directly
341
+ if (import.meta.url === `file://${process.argv[1]}`) {
342
+ main();
343
+ }
344
+
345
+ export { basicExample, hybridExample, vectorSearchExample, gracefulDegradationExample };
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Cross-Platform Database Usage Examples
3
+ *
4
+ * Demonstrates how to use the database provider for Windows, macOS, and Linux
5
+ */
6
+
7
+ import {
8
+ createDatabase,
9
+ getPlatformInfo,
10
+ getAvailableProviders,
11
+ createDefaultEntry,
12
+ } from '../src/index.js';
13
+
14
+ /**
15
+ * Example 1: Automatic Platform Detection
16
+ */
17
+ async function automaticProviderSelection() {
18
+ console.log('=== Automatic Provider Selection ===\n');
19
+
20
+ // Get platform information
21
+ const platformInfo = getPlatformInfo();
22
+ console.log('Platform Information:');
23
+ console.log(` OS: ${platformInfo.os}`);
24
+ console.log(` Windows: ${platformInfo.isWindows}`);
25
+ console.log(` macOS: ${platformInfo.isMacOS}`);
26
+ console.log(` Linux: ${platformInfo.isLinux}`);
27
+ console.log(` Recommended: ${platformInfo.recommendedProvider}\n`);
28
+
29
+ // Check available providers
30
+ const available = await getAvailableProviders();
31
+ console.log('Available Providers:');
32
+ console.log(` better-sqlite3: ${available.betterSqlite3 ? '✓' : '✗'}`);
33
+ console.log(` sql.js: ${available.sqlJs ? '✓' : '✗'}`);
34
+ console.log(` JSON: ${available.json ? '✓' : '✗'}\n`);
35
+
36
+ // Create database with automatic provider selection
37
+ const db = await createDatabase('./data/auto-memory.db');
38
+ console.log('✓ Database created with automatic provider selection\n');
39
+
40
+ // Store some test data
41
+ const entry = createDefaultEntry({
42
+ key: 'platform-test',
43
+ content: `Running on ${platformInfo.os}`,
44
+ namespace: 'platform',
45
+ tags: [platformInfo.os],
46
+ });
47
+
48
+ await db.store(entry);
49
+ console.log('✓ Test entry stored');
50
+
51
+ // Retrieve and verify
52
+ const retrieved = await db.get(entry.id);
53
+ console.log('✓ Entry retrieved:', retrieved?.content);
54
+
55
+ await db.shutdown();
56
+ console.log('✓ Database shutdown\n');
57
+ }
58
+
59
+ /**
60
+ * Example 2: Windows-Specific Configuration
61
+ */
62
+ async function windowsConfiguration() {
63
+ console.log('=== Windows-Specific Configuration ===\n');
64
+
65
+ // On Windows, use sql.js for maximum compatibility
66
+ const db = await createDatabase('./data/windows-memory.db', {
67
+ provider: 'sql.js',
68
+ verbose: true,
69
+ autoPersistInterval: 10000, // Persist every 10 seconds
70
+ });
71
+
72
+ console.log('✓ Windows-compatible database created\n');
73
+
74
+ // Store data
75
+ const entries = [
76
+ createDefaultEntry({
77
+ key: 'windows-app-1',
78
+ content: 'Windows application data',
79
+ namespace: 'apps',
80
+ tags: ['windows', 'production'],
81
+ }),
82
+ createDefaultEntry({
83
+ key: 'windows-app-2',
84
+ content: 'More Windows data',
85
+ namespace: 'apps',
86
+ tags: ['windows', 'staging'],
87
+ }),
88
+ ];
89
+
90
+ await db.bulkInsert(entries);
91
+ console.log('✓ Bulk inserted 2 entries');
92
+
93
+ // Query by namespace
94
+ const results = await db.query({
95
+ type: 'hybrid',
96
+ namespace: 'apps',
97
+ limit: 10,
98
+ });
99
+
100
+ console.log(`✓ Found ${results.length} entries in 'apps' namespace`);
101
+
102
+ await db.shutdown();
103
+ console.log('✓ Database shutdown (changes persisted to disk)\n');
104
+ }
105
+
106
+ /**
107
+ * Example 3: macOS/Linux Native SQLite
108
+ */
109
+ async function unixConfiguration() {
110
+ console.log('=== macOS/Linux Native SQLite ===\n');
111
+
112
+ // On Unix systems, use better-sqlite3 for best performance
113
+ const available = await getAvailableProviders();
114
+
115
+ if (!available.betterSqlite3) {
116
+ console.log('⚠ better-sqlite3 not available, falling back to sql.js\n');
117
+ }
118
+
119
+ const db = await createDatabase('./data/unix-memory.db', {
120
+ provider: available.betterSqlite3 ? 'better-sqlite3' : 'sql.js',
121
+ verbose: true,
122
+ walMode: true, // Enable WAL mode for better-sqlite3
123
+ optimize: true,
124
+ });
125
+
126
+ console.log('✓ Unix-optimized database created\n');
127
+
128
+ // Store data
129
+ const entry = createDefaultEntry({
130
+ key: 'unix-service',
131
+ content: 'Unix service configuration',
132
+ namespace: 'services',
133
+ tags: ['unix', 'production'],
134
+ });
135
+
136
+ await db.store(entry);
137
+ console.log('✓ Entry stored');
138
+
139
+ // Health check
140
+ const health = await db.healthCheck();
141
+ console.log('✓ Health check:', health.status);
142
+ console.log(' Storage:', health.components.storage.status);
143
+ console.log(' Index:', health.components.index.status);
144
+ console.log(' Cache:', health.components.cache.status);
145
+
146
+ await db.shutdown();
147
+ console.log('✓ Database shutdown\n');
148
+ }
149
+
150
+ /**
151
+ * Example 4: Fallback to JSON
152
+ */
153
+ async function jsonFallback() {
154
+ console.log('=== JSON Fallback Example ===\n');
155
+
156
+ // JSON backend works everywhere, no native dependencies
157
+ const db = await createDatabase('./data/json-memory.db', {
158
+ provider: 'json',
159
+ verbose: true,
160
+ });
161
+
162
+ console.log('✓ JSON database created (no native dependencies)\n');
163
+
164
+ // Store data
165
+ const entry = createDefaultEntry({
166
+ key: 'json-data',
167
+ content: 'This works everywhere!',
168
+ namespace: 'portable',
169
+ tags: ['cross-platform', 'json'],
170
+ });
171
+
172
+ await db.store(entry);
173
+ console.log('✓ Entry stored');
174
+
175
+ // Get statistics
176
+ const stats = await db.getStats();
177
+ console.log('✓ Statistics:', {
178
+ totalEntries: stats.totalEntries,
179
+ avgQueryTime: `${stats.avgQueryTime.toFixed(2)}ms`,
180
+ });
181
+
182
+ await db.shutdown();
183
+ console.log('✓ Database shutdown\n');
184
+ }
185
+
186
+ /**
187
+ * Example 5: Cross-Platform Application
188
+ */
189
+ async function crossPlatformApp() {
190
+ console.log('=== Cross-Platform Application Example ===\n');
191
+
192
+ const platformInfo = getPlatformInfo();
193
+
194
+ // Use different optimizations based on platform
195
+ const config = platformInfo.isWindows
196
+ ? {
197
+ // Windows: sql.js with frequent persistence
198
+ provider: 'sql.js' as const,
199
+ autoPersistInterval: 5000,
200
+ }
201
+ : {
202
+ // Unix: better-sqlite3 with WAL mode
203
+ provider: 'better-sqlite3' as const,
204
+ walMode: true,
205
+ };
206
+
207
+ console.log(`Creating database for ${platformInfo.os}...`);
208
+ const db = await createDatabase('./data/cross-platform.db', config);
209
+ console.log('✓ Platform-optimized database created\n');
210
+
211
+ // Store platform-specific configuration
212
+ const configEntry = createDefaultEntry({
213
+ key: 'app-config',
214
+ content: JSON.stringify({
215
+ platform: platformInfo.os,
216
+ optimizations: config,
217
+ timestamp: Date.now(),
218
+ }),
219
+ namespace: 'config',
220
+ tags: ['platform', platformInfo.os],
221
+ });
222
+
223
+ await db.store(configEntry);
224
+ console.log('✓ Platform configuration stored');
225
+
226
+ // Retrieve and display
227
+ const retrieved = await db.getByKey('config', 'app-config');
228
+ if (retrieved) {
229
+ const data = JSON.parse(retrieved.content);
230
+ console.log('✓ Configuration:', JSON.stringify(data, null, 2));
231
+ }
232
+
233
+ await db.shutdown();
234
+ console.log('✓ Database shutdown\n');
235
+ }
236
+
237
+ /**
238
+ * Example 6: Migration Between Providers
239
+ */
240
+ async function providerMigration() {
241
+ console.log('=== Provider Migration Example ===\n');
242
+
243
+ // Create source database (JSON)
244
+ console.log('Creating source database (JSON)...');
245
+ const sourceDb = await createDatabase('./data/source.db', {
246
+ provider: 'json',
247
+ });
248
+
249
+ // Add test data
250
+ const testData = Array.from({ length: 5 }, (_, i) =>
251
+ createDefaultEntry({
252
+ key: `migrate-${i}`,
253
+ content: `Migration test data ${i}`,
254
+ namespace: 'migration',
255
+ tags: ['test', 'migration'],
256
+ })
257
+ );
258
+
259
+ await sourceDb.bulkInsert(testData);
260
+ console.log('✓ Source database populated with 5 entries');
261
+
262
+ // Get all entries from source
263
+ const sourceEntries = await sourceDb.query({
264
+ type: 'hybrid',
265
+ namespace: 'migration',
266
+ limit: 100,
267
+ });
268
+
269
+ await sourceDb.shutdown();
270
+ console.log('✓ Source database shutdown\n');
271
+
272
+ // Create destination database (best available provider)
273
+ console.log('Creating destination database (auto provider)...');
274
+ const destDb = await createDatabase('./data/destination.db');
275
+
276
+ // Migrate data
277
+ await destDb.bulkInsert(sourceEntries);
278
+ console.log(`✓ Migrated ${sourceEntries.length} entries to destination`);
279
+
280
+ // Verify migration
281
+ const count = await destDb.count('migration');
282
+ console.log(`✓ Verified: ${count} entries in destination database`);
283
+
284
+ await destDb.shutdown();
285
+ console.log('✓ Destination database shutdown\n');
286
+ }
287
+
288
+ /**
289
+ * Main execution
290
+ */
291
+ async function main() {
292
+ console.log('\n╔════════════════════════════════════════╗');
293
+ console.log('║ Cross-Platform Database Examples ║');
294
+ console.log('╚════════════════════════════════════════╝\n');
295
+
296
+ try {
297
+ // Run all examples
298
+ await automaticProviderSelection();
299
+ await windowsConfiguration();
300
+ await unixConfiguration();
301
+ await jsonFallback();
302
+ await crossPlatformApp();
303
+ await providerMigration();
304
+
305
+ console.log('╔════════════════════════════════════════╗');
306
+ console.log('║ All examples completed successfully! ║');
307
+ console.log('╚════════════════════════════════════════╝\n');
308
+ } catch (error) {
309
+ console.error('Error:', error);
310
+ process.exit(1);
311
+ }
312
+ }
313
+
314
+ // Run examples if executed directly
315
+ if (import.meta.url === `file://${process.argv[1]}`) {
316
+ main().catch(console.error);
317
+ }
318
+
319
+ export {
320
+ automaticProviderSelection,
321
+ windowsConfiguration,
322
+ unixConfiguration,
323
+ jsonFallback,
324
+ crossPlatformApp,
325
+ providerMigration,
326
+ };