@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.
- package/.agentic-flow/intelligence.json +16 -0
- package/README.md +249 -0
- package/__tests__/coverage/base.css +224 -0
- package/__tests__/coverage/block-navigation.js +87 -0
- package/__tests__/coverage/coverage-final.json +19 -0
- package/__tests__/coverage/favicon.png +0 -0
- package/__tests__/coverage/index.html +206 -0
- package/__tests__/coverage/lcov-report/base.css +224 -0
- package/__tests__/coverage/lcov-report/block-navigation.js +87 -0
- package/__tests__/coverage/lcov-report/favicon.png +0 -0
- package/__tests__/coverage/lcov-report/index.html +206 -0
- package/__tests__/coverage/lcov-report/prettify.css +1 -0
- package/__tests__/coverage/lcov-report/prettify.js +2 -0
- package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/lcov-report/sorter.js +210 -0
- package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +2737 -0
- package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +3130 -0
- package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +601 -0
- package/__tests__/coverage/lcov-report/src/application/commands/index.html +131 -0
- package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +394 -0
- package/__tests__/coverage/lcov-report/src/application/queries/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +796 -0
- package/__tests__/coverage/lcov-report/src/application/services/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +793 -0
- package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +1633 -0
- package/__tests__/coverage/lcov-report/src/database-provider.ts.html +1618 -0
- package/__tests__/coverage/lcov-report/src/domain/entities/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +952 -0
- package/__tests__/coverage/lcov-report/src/domain/services/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +1294 -0
- package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +3124 -0
- package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +2167 -0
- package/__tests__/coverage/lcov-report/src/index.html +266 -0
- package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +1633 -0
- package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/migration.ts.html +2092 -0
- package/__tests__/coverage/lcov-report/src/query-builder.ts.html +1711 -0
- package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +2281 -0
- package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +2374 -0
- package/__tests__/coverage/lcov-report/src/types.ts.html +2266 -0
- package/__tests__/coverage/lcov.info +10238 -0
- package/__tests__/coverage/prettify.css +1 -0
- package/__tests__/coverage/prettify.js +2 -0
- package/__tests__/coverage/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/sorter.js +210 -0
- package/__tests__/coverage/src/agentdb-adapter.ts.html +2737 -0
- package/__tests__/coverage/src/agentdb-backend.ts.html +3130 -0
- package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +601 -0
- package/__tests__/coverage/src/application/commands/index.html +131 -0
- package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +394 -0
- package/__tests__/coverage/src/application/queries/index.html +116 -0
- package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +796 -0
- package/__tests__/coverage/src/application/services/index.html +116 -0
- package/__tests__/coverage/src/application/services/memory-application-service.ts.html +793 -0
- package/__tests__/coverage/src/cache-manager.ts.html +1633 -0
- package/__tests__/coverage/src/database-provider.ts.html +1618 -0
- package/__tests__/coverage/src/domain/entities/index.html +116 -0
- package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +952 -0
- package/__tests__/coverage/src/domain/services/index.html +116 -0
- package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +1294 -0
- package/__tests__/coverage/src/hnsw-index.ts.html +3124 -0
- package/__tests__/coverage/src/hybrid-backend.ts.html +2167 -0
- package/__tests__/coverage/src/index.html +266 -0
- package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +1633 -0
- package/__tests__/coverage/src/infrastructure/repositories/index.html +116 -0
- package/__tests__/coverage/src/migration.ts.html +2092 -0
- package/__tests__/coverage/src/query-builder.ts.html +1711 -0
- package/__tests__/coverage/src/sqlite-backend.ts.html +2281 -0
- package/__tests__/coverage/src/sqljs-backend.ts.html +2374 -0
- package/__tests__/coverage/src/types.ts.html +2266 -0
- package/benchmarks/cache-hit-rate.bench.ts +535 -0
- package/benchmarks/hnsw-indexing.bench.ts +552 -0
- package/benchmarks/memory-write.bench.ts +469 -0
- package/benchmarks/vector-search.bench.ts +449 -0
- package/dist/agentdb-adapter.d.ts +146 -0
- package/dist/agentdb-adapter.d.ts.map +1 -0
- package/dist/agentdb-adapter.js +679 -0
- package/dist/agentdb-adapter.js.map +1 -0
- package/dist/agentdb-backend.d.ts +214 -0
- package/dist/agentdb-backend.d.ts.map +1 -0
- package/dist/agentdb-backend.js +827 -0
- package/dist/agentdb-backend.js.map +1 -0
- package/dist/agentdb-backend.test.d.ts +7 -0
- package/dist/agentdb-backend.test.d.ts.map +1 -0
- package/dist/agentdb-backend.test.js +258 -0
- package/dist/agentdb-backend.test.js.map +1 -0
- package/dist/application/commands/delete-memory.command.d.ts +65 -0
- package/dist/application/commands/delete-memory.command.d.ts.map +1 -0
- package/dist/application/commands/delete-memory.command.js +129 -0
- package/dist/application/commands/delete-memory.command.js.map +1 -0
- package/dist/application/commands/store-memory.command.d.ts +48 -0
- package/dist/application/commands/store-memory.command.d.ts.map +1 -0
- package/dist/application/commands/store-memory.command.js +72 -0
- package/dist/application/commands/store-memory.command.js.map +1 -0
- package/dist/application/index.d.ts +12 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +15 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/queries/search-memory.query.d.ts +72 -0
- package/dist/application/queries/search-memory.query.d.ts.map +1 -0
- package/dist/application/queries/search-memory.query.js +143 -0
- package/dist/application/queries/search-memory.query.js.map +1 -0
- package/dist/application/services/memory-application-service.d.ts +121 -0
- package/dist/application/services/memory-application-service.d.ts.map +1 -0
- package/dist/application/services/memory-application-service.js +190 -0
- package/dist/application/services/memory-application-service.js.map +1 -0
- package/dist/cache-manager.d.ts +134 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +407 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/database-provider.d.ts +86 -0
- package/dist/database-provider.d.ts.map +1 -0
- package/dist/database-provider.js +385 -0
- package/dist/database-provider.js.map +1 -0
- package/dist/database-provider.test.d.ts +7 -0
- package/dist/database-provider.test.d.ts.map +1 -0
- package/dist/database-provider.test.js +285 -0
- package/dist/database-provider.test.js.map +1 -0
- package/dist/domain/entities/memory-entry.d.ts +143 -0
- package/dist/domain/entities/memory-entry.d.ts.map +1 -0
- package/dist/domain/entities/memory-entry.js +226 -0
- package/dist/domain/entities/memory-entry.js.map +1 -0
- package/dist/domain/index.d.ts +11 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +12 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
- package/dist/domain/repositories/memory-repository.interface.d.ts.map +1 -0
- package/dist/domain/repositories/memory-repository.interface.js +11 -0
- package/dist/domain/repositories/memory-repository.interface.js.map +1 -0
- package/dist/domain/services/memory-domain-service.d.ts +105 -0
- package/dist/domain/services/memory-domain-service.d.ts.map +1 -0
- package/dist/domain/services/memory-domain-service.js +297 -0
- package/dist/domain/services/memory-domain-service.js.map +1 -0
- package/dist/hnsw-index.d.ts +111 -0
- package/dist/hnsw-index.d.ts.map +1 -0
- package/dist/hnsw-index.js +781 -0
- package/dist/hnsw-index.js.map +1 -0
- package/dist/hybrid-backend.d.ts +217 -0
- package/dist/hybrid-backend.d.ts.map +1 -0
- package/dist/hybrid-backend.js +491 -0
- package/dist/hybrid-backend.js.map +1 -0
- package/dist/hybrid-backend.test.d.ts +8 -0
- package/dist/hybrid-backend.test.d.ts.map +1 -0
- package/dist/hybrid-backend.test.js +320 -0
- package/dist/hybrid-backend.test.js.map +1 -0
- package/dist/index.d.ts +188 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +345 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +17 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +16 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
- package/dist/infrastructure/repositories/hybrid-memory-repository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
- package/dist/infrastructure/repositories/hybrid-memory-repository.js.map +1 -0
- package/dist/migration.d.ts +68 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +513 -0
- package/dist/migration.js.map +1 -0
- package/dist/query-builder.d.ts +211 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +438 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/sqlite-backend.d.ts +121 -0
- package/dist/sqlite-backend.d.ts.map +1 -0
- package/dist/sqlite-backend.js +564 -0
- package/dist/sqlite-backend.js.map +1 -0
- package/dist/sqljs-backend.d.ts +128 -0
- package/dist/sqljs-backend.d.ts.map +1 -0
- package/dist/sqljs-backend.js +598 -0
- package/dist/sqljs-backend.js.map +1 -0
- package/dist/types.d.ts +481 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +58 -0
- package/dist/types.js.map +1 -0
- package/docs/AGENTDB-INTEGRATION.md +388 -0
- package/docs/CROSS_PLATFORM.md +505 -0
- package/docs/WINDOWS_SUPPORT.md +422 -0
- package/examples/agentdb-example.ts +345 -0
- package/examples/cross-platform-usage.ts +326 -0
- package/framework/benchmark.ts +112 -0
- package/package.json +31 -0
- package/src/agentdb-adapter.ts +884 -0
- package/src/agentdb-backend.test.ts +339 -0
- package/src/agentdb-backend.ts +1016 -0
- package/src/application/commands/delete-memory.command.ts +172 -0
- package/src/application/commands/store-memory.command.ts +103 -0
- package/src/application/index.ts +36 -0
- package/src/application/queries/search-memory.query.ts +237 -0
- package/src/application/services/memory-application-service.ts +236 -0
- package/src/cache-manager.ts +516 -0
- package/src/database-provider.test.ts +364 -0
- package/src/database-provider.ts +511 -0
- package/src/domain/entities/memory-entry.ts +289 -0
- package/src/domain/index.ts +35 -0
- package/src/domain/repositories/memory-repository.interface.ts +120 -0
- package/src/domain/services/memory-domain-service.ts +403 -0
- package/src/hnsw-index.ts +1013 -0
- package/src/hybrid-backend.test.ts +399 -0
- package/src/hybrid-backend.ts +694 -0
- package/src/index.ts +515 -0
- package/src/infrastructure/index.ts +23 -0
- package/src/infrastructure/repositories/hybrid-memory-repository.ts +516 -0
- package/src/migration.ts +669 -0
- package/src/query-builder.ts +542 -0
- package/src/sqlite-backend.ts +732 -0
- package/src/sqljs-backend.ts +763 -0
- package/src/types.ts +727 -0
- package/tsconfig.json +9 -0
- package/tsconfig.tsbuildinfo +1 -0
- 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
|
+
};
|