family-ai-agent 1.0.6 → 1.0.8
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/.letta/settings.local.json +3 -0
- package/dist/cli/index.js +1 -1
- package/dist/database/adapters/base-adapter.d.ts +81 -0
- package/dist/database/adapters/base-adapter.d.ts.map +1 -0
- package/dist/database/adapters/base-adapter.js +105 -0
- package/dist/database/adapters/base-adapter.js.map +1 -0
- package/dist/database/adapters/index.d.ts +49 -0
- package/dist/database/adapters/index.d.ts.map +1 -0
- package/dist/database/adapters/index.js +200 -0
- package/dist/database/adapters/index.js.map +1 -0
- package/dist/database/adapters/postgres-adapter.d.ts +75 -0
- package/dist/database/adapters/postgres-adapter.d.ts.map +1 -0
- package/dist/database/adapters/postgres-adapter.js +225 -0
- package/dist/database/adapters/postgres-adapter.js.map +1 -0
- package/dist/database/adapters/sqlite-adapter.d.ts +72 -0
- package/dist/database/adapters/sqlite-adapter.d.ts.map +1 -0
- package/dist/database/adapters/sqlite-adapter.js +368 -0
- package/dist/database/adapters/sqlite-adapter.js.map +1 -0
- package/dist/database/cache/cache-keys.d.ts +180 -0
- package/dist/database/cache/cache-keys.d.ts.map +1 -0
- package/dist/database/cache/cache-keys.js +107 -0
- package/dist/database/cache/cache-keys.js.map +1 -0
- package/dist/database/cache/index.d.ts +24 -0
- package/dist/database/cache/index.d.ts.map +1 -0
- package/dist/database/cache/index.js +34 -0
- package/dist/database/cache/index.js.map +1 -0
- package/dist/database/cache/query-cache.d.ts +67 -0
- package/dist/database/cache/query-cache.d.ts.map +1 -0
- package/dist/database/cache/query-cache.js +177 -0
- package/dist/database/cache/query-cache.js.map +1 -0
- package/dist/database/client.d.ts +63 -4
- package/dist/database/client.d.ts.map +1 -1
- package/dist/database/client.js +147 -59
- package/dist/database/client.js.map +1 -1
- package/dist/database/db-config.d.ts +104 -0
- package/dist/database/db-config.d.ts.map +1 -0
- package/dist/database/db-config.js +167 -0
- package/dist/database/db-config.js.map +1 -0
- package/dist/database/drizzle/index.d.ts +42 -0
- package/dist/database/drizzle/index.d.ts.map +1 -0
- package/dist/database/drizzle/index.js +48 -0
- package/dist/database/drizzle/index.js.map +1 -0
- package/dist/database/drizzle/schema/audit.d.ts +533 -0
- package/dist/database/drizzle/schema/audit.d.ts.map +1 -0
- package/dist/database/drizzle/schema/audit.js +71 -0
- package/dist/database/drizzle/schema/audit.js.map +1 -0
- package/dist/database/drizzle/schema/checkpoints.d.ts +665 -0
- package/dist/database/drizzle/schema/checkpoints.d.ts.map +1 -0
- package/dist/database/drizzle/schema/checkpoints.js +110 -0
- package/dist/database/drizzle/schema/checkpoints.js.map +1 -0
- package/dist/database/drizzle/schema/conversations.d.ts +449 -0
- package/dist/database/drizzle/schema/conversations.d.ts.map +1 -0
- package/dist/database/drizzle/schema/conversations.js +91 -0
- package/dist/database/drizzle/schema/conversations.js.map +1 -0
- package/dist/database/drizzle/schema/documents.d.ts +600 -0
- package/dist/database/drizzle/schema/documents.d.ts.map +1 -0
- package/dist/database/drizzle/schema/documents.js +100 -0
- package/dist/database/drizzle/schema/documents.js.map +1 -0
- package/dist/database/drizzle/schema/index.d.ts +3084 -0
- package/dist/database/drizzle/schema/index.d.ts.map +1 -0
- package/dist/database/drizzle/schema/index.js +46 -0
- package/dist/database/drizzle/schema/index.js.map +1 -0
- package/dist/database/drizzle/schema/memories.d.ts +435 -0
- package/dist/database/drizzle/schema/memories.d.ts.map +1 -0
- package/dist/database/drizzle/schema/memories.js +73 -0
- package/dist/database/drizzle/schema/memories.js.map +1 -0
- package/dist/database/drizzle/schema/tasks.d.ts +565 -0
- package/dist/database/drizzle/schema/tasks.d.ts.map +1 -0
- package/dist/database/drizzle/schema/tasks.js +84 -0
- package/dist/database/drizzle/schema/tasks.js.map +1 -0
- package/dist/database/health/circuit-breaker.d.ts +81 -0
- package/dist/database/health/circuit-breaker.d.ts.map +1 -0
- package/dist/database/health/circuit-breaker.js +184 -0
- package/dist/database/health/circuit-breaker.js.map +1 -0
- package/dist/database/health/health-monitor.d.ts +69 -0
- package/dist/database/health/health-monitor.d.ts.map +1 -0
- package/dist/database/health/health-monitor.js +174 -0
- package/dist/database/health/health-monitor.js.map +1 -0
- package/dist/database/health/index.d.ts +27 -0
- package/dist/database/health/index.d.ts.map +1 -0
- package/dist/database/health/index.js +23 -0
- package/dist/database/health/index.js.map +1 -0
- package/dist/database/index.d.ts +16 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +41 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/migrations/index.d.ts +34 -0
- package/dist/database/migrations/index.d.ts.map +1 -0
- package/dist/database/migrations/index.js +45 -0
- package/dist/database/migrations/index.js.map +1 -0
- package/dist/database/migrations/migrator.d.ts +77 -0
- package/dist/database/migrations/migrator.d.ts.map +1 -0
- package/dist/database/migrations/migrator.js +258 -0
- package/dist/database/migrations/migrator.js.map +1 -0
- package/dist/database/migrations/versions/001_initial.d.ts +9 -0
- package/dist/database/migrations/versions/001_initial.d.ts.map +1 -0
- package/dist/database/migrations/versions/001_initial.js +183 -0
- package/dist/database/migrations/versions/001_initial.js.map +1 -0
- package/dist/database/types.d.ts +255 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +8 -0
- package/dist/database/types.js.map +1 -0
- package/dist/database/vector/embedding-cache.d.ts +92 -0
- package/dist/database/vector/embedding-cache.d.ts.map +1 -0
- package/dist/database/vector/embedding-cache.js +185 -0
- package/dist/database/vector/embedding-cache.js.map +1 -0
- package/dist/database/vector/hnsw-index.d.ts +111 -0
- package/dist/database/vector/hnsw-index.d.ts.map +1 -0
- package/dist/database/vector/hnsw-index.js +337 -0
- package/dist/database/vector/hnsw-index.js.map +1 -0
- package/dist/database/vector/index.d.ts +75 -0
- package/dist/database/vector/index.d.ts.map +1 -0
- package/dist/database/vector/index.js +213 -0
- package/dist/database/vector/index.js.map +1 -0
- package/dist/database/vector/similarity.d.ts +67 -0
- package/dist/database/vector/similarity.d.ts.map +1 -0
- package/dist/database/vector/similarity.js +176 -0
- package/dist/database/vector/similarity.js.map +1 -0
- package/package.json +6 -3
- package/src/cli/index.ts +1 -1
- package/src/database/adapters/base-adapter.ts +171 -0
- package/src/database/adapters/index.ts +224 -0
- package/src/database/adapters/postgres-adapter.ts +285 -0
- package/src/database/adapters/sqlite-adapter.ts +420 -0
- package/src/database/cache/cache-keys.ts +150 -0
- package/src/database/cache/index.ts +44 -0
- package/src/database/cache/query-cache.ts +213 -0
- package/src/database/client.ts +166 -64
- package/src/database/db-config.ts +194 -0
- package/src/database/drizzle/index.ts +66 -0
- package/src/database/drizzle/schema/audit.ts +127 -0
- package/src/database/drizzle/schema/checkpoints.ts +164 -0
- package/src/database/drizzle/schema/conversations.ts +138 -0
- package/src/database/drizzle/schema/documents.ts +157 -0
- package/src/database/drizzle/schema/index.ts +139 -0
- package/src/database/drizzle/schema/memories.ts +127 -0
- package/src/database/drizzle/schema/tasks.ts +129 -0
- package/src/database/health/circuit-breaker.ts +214 -0
- package/src/database/health/health-monitor.ts +224 -0
- package/src/database/health/index.ts +41 -0
- package/src/database/index.ts +157 -0
- package/src/database/migrations/index.ts +52 -0
- package/src/database/migrations/migrator.ts +325 -0
- package/src/database/migrations/versions/001_initial.ts +198 -0
- package/src/database/types.ts +324 -0
- package/src/database/vector/embedding-cache.ts +234 -0
- package/src/database/vector/hnsw-index.ts +452 -0
- package/src/database/vector/index.ts +292 -0
- package/src/database/vector/similarity.ts +198 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Layer Types
|
|
3
|
+
*
|
|
4
|
+
* Shared TypeScript types for the database abstraction layer.
|
|
5
|
+
* Supports both PostgreSQL and SQLite backends.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Supported database types
|
|
9
|
+
*/
|
|
10
|
+
export type DatabaseType = 'postgresql' | 'sqlite';
|
|
11
|
+
/**
|
|
12
|
+
* Database detection modes
|
|
13
|
+
*/
|
|
14
|
+
export type DatabaseDetectionMode = 'auto' | 'postgresql' | 'sqlite';
|
|
15
|
+
/**
|
|
16
|
+
* Query result row constraint (compatible with pg.QueryResultRow)
|
|
17
|
+
*/
|
|
18
|
+
export type QueryResultRow = Record<string, any>;
|
|
19
|
+
/**
|
|
20
|
+
* Query result interface (compatible with pg.QueryResult)
|
|
21
|
+
*/
|
|
22
|
+
export interface QueryResult<T extends QueryResultRow = Record<string, any>> {
|
|
23
|
+
rows: T[];
|
|
24
|
+
rowCount: number | null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Transaction client interface
|
|
28
|
+
*/
|
|
29
|
+
export interface TransactionClient {
|
|
30
|
+
query<T extends QueryResultRow = Record<string, any>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Connection pool statistics
|
|
34
|
+
*/
|
|
35
|
+
export interface PoolStats {
|
|
36
|
+
total: number;
|
|
37
|
+
idle: number;
|
|
38
|
+
waiting: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Database health status
|
|
42
|
+
*/
|
|
43
|
+
export interface DatabaseHealth {
|
|
44
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
45
|
+
type: DatabaseType;
|
|
46
|
+
latencyMs: number;
|
|
47
|
+
poolStats?: PoolStats;
|
|
48
|
+
circuitState: CircuitBreakerState;
|
|
49
|
+
lastCheck: Date;
|
|
50
|
+
errors: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Circuit breaker states
|
|
54
|
+
*/
|
|
55
|
+
export type CircuitBreakerState = 'closed' | 'open' | 'half-open';
|
|
56
|
+
/**
|
|
57
|
+
* Migration result
|
|
58
|
+
*/
|
|
59
|
+
export interface MigrationResult {
|
|
60
|
+
version: number;
|
|
61
|
+
name: string;
|
|
62
|
+
success: boolean;
|
|
63
|
+
error?: string;
|
|
64
|
+
durationMs: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Cache statistics
|
|
68
|
+
*/
|
|
69
|
+
export interface CacheStats {
|
|
70
|
+
size: number;
|
|
71
|
+
maxSize: number;
|
|
72
|
+
hitCount: number;
|
|
73
|
+
missCount: number;
|
|
74
|
+
hitRate: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Vector search options
|
|
78
|
+
*/
|
|
79
|
+
export interface VectorSearchOptions {
|
|
80
|
+
userId?: string;
|
|
81
|
+
memoryType?: string;
|
|
82
|
+
limit?: number;
|
|
83
|
+
minSimilarity?: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Vector search result
|
|
87
|
+
*/
|
|
88
|
+
export interface VectorSearchResult {
|
|
89
|
+
id: string;
|
|
90
|
+
content: string;
|
|
91
|
+
similarity: number;
|
|
92
|
+
memoryType: string;
|
|
93
|
+
metadata: Record<string, unknown>;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Embedding entry for vector index
|
|
97
|
+
*/
|
|
98
|
+
export interface EmbeddingEntry {
|
|
99
|
+
id: string;
|
|
100
|
+
vector: number[];
|
|
101
|
+
metadata?: Record<string, unknown>;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Database adapter interface
|
|
105
|
+
*/
|
|
106
|
+
export interface DatabaseAdapter {
|
|
107
|
+
/** Database type */
|
|
108
|
+
readonly type: DatabaseType;
|
|
109
|
+
/** Whether the adapter is initialized */
|
|
110
|
+
readonly isInitialized: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Initialize the database connection
|
|
113
|
+
*/
|
|
114
|
+
initialize(): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Execute a raw SQL query
|
|
117
|
+
*/
|
|
118
|
+
query<T extends QueryResultRow = Record<string, any>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
119
|
+
/**
|
|
120
|
+
* Execute a transaction
|
|
121
|
+
*/
|
|
122
|
+
transaction<T>(callback: (client: TransactionClient) => Promise<T>): Promise<T>;
|
|
123
|
+
/**
|
|
124
|
+
* Check database health
|
|
125
|
+
*/
|
|
126
|
+
healthCheck(): Promise<boolean>;
|
|
127
|
+
/**
|
|
128
|
+
* Get connection pool statistics (PostgreSQL only)
|
|
129
|
+
*/
|
|
130
|
+
getPoolStats?(): PoolStats;
|
|
131
|
+
/**
|
|
132
|
+
* Close all connections
|
|
133
|
+
*/
|
|
134
|
+
close(): Promise<void>;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Vector search engine interface
|
|
138
|
+
*/
|
|
139
|
+
export interface VectorSearchEngine {
|
|
140
|
+
/**
|
|
141
|
+
* Initialize the vector index
|
|
142
|
+
*/
|
|
143
|
+
initialize(): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Store an embedding
|
|
146
|
+
*/
|
|
147
|
+
store(id: string, embedding: number[], metadata?: Record<string, unknown>): Promise<void>;
|
|
148
|
+
/**
|
|
149
|
+
* Search for similar embeddings
|
|
150
|
+
*/
|
|
151
|
+
search(queryEmbedding: number[], options?: VectorSearchOptions): Promise<VectorSearchResult[]>;
|
|
152
|
+
/**
|
|
153
|
+
* Remove an embedding
|
|
154
|
+
*/
|
|
155
|
+
remove(id: string): Promise<void>;
|
|
156
|
+
/**
|
|
157
|
+
* Rebuild the vector index
|
|
158
|
+
*/
|
|
159
|
+
rebuildIndex(): Promise<void>;
|
|
160
|
+
/**
|
|
161
|
+
* Get index statistics
|
|
162
|
+
*/
|
|
163
|
+
getStats(): {
|
|
164
|
+
size: number;
|
|
165
|
+
dimension: number;
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Database detection result
|
|
170
|
+
*/
|
|
171
|
+
export interface DetectionResult {
|
|
172
|
+
type: DatabaseType;
|
|
173
|
+
connectionString?: string;
|
|
174
|
+
sqlitePath?: string;
|
|
175
|
+
reason: string;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Migration definition
|
|
179
|
+
*/
|
|
180
|
+
export interface Migration {
|
|
181
|
+
version: number;
|
|
182
|
+
name: string;
|
|
183
|
+
up: (adapter: DatabaseAdapter) => Promise<void>;
|
|
184
|
+
down: (adapter: DatabaseAdapter) => Promise<void>;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Cache entry
|
|
188
|
+
*/
|
|
189
|
+
export interface CacheEntry<T> {
|
|
190
|
+
value: T;
|
|
191
|
+
expiresAt: number;
|
|
192
|
+
hits: number;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Query cache options
|
|
196
|
+
*/
|
|
197
|
+
export interface QueryCacheOptions {
|
|
198
|
+
maxSize: number;
|
|
199
|
+
defaultTtlMs: number;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Circuit breaker options
|
|
203
|
+
*/
|
|
204
|
+
export interface CircuitBreakerOptions {
|
|
205
|
+
failureThreshold: number;
|
|
206
|
+
resetTimeoutMs: number;
|
|
207
|
+
halfOpenMaxAttempts: number;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Health monitor options
|
|
211
|
+
*/
|
|
212
|
+
export interface HealthMonitorOptions {
|
|
213
|
+
checkIntervalMs: number;
|
|
214
|
+
errorThreshold: number;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Database configuration
|
|
218
|
+
*/
|
|
219
|
+
export interface DatabaseConfig {
|
|
220
|
+
type: DatabaseDetectionMode;
|
|
221
|
+
postgresUrl?: string;
|
|
222
|
+
postgresHost: string;
|
|
223
|
+
postgresPort: number;
|
|
224
|
+
postgresUser: string;
|
|
225
|
+
postgresPassword: string;
|
|
226
|
+
postgresDatabase: string;
|
|
227
|
+
postgresPoolMax: number;
|
|
228
|
+
postgresIdleTimeoutMs: number;
|
|
229
|
+
postgresConnectionTimeoutMs: number;
|
|
230
|
+
sqlitePath?: string;
|
|
231
|
+
healthCheckIntervalMs: number;
|
|
232
|
+
circuitBreakerThreshold: number;
|
|
233
|
+
circuitBreakerTimeoutMs: number;
|
|
234
|
+
cacheMaxSize: number;
|
|
235
|
+
cacheTtlMs: number;
|
|
236
|
+
vectorDimension: number;
|
|
237
|
+
vectorMinSimilarity: number;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Memory types for vector storage
|
|
241
|
+
*/
|
|
242
|
+
export type MemoryType = 'semantic' | 'episodic' | 'procedural';
|
|
243
|
+
/**
|
|
244
|
+
* Message roles
|
|
245
|
+
*/
|
|
246
|
+
export type MessageRole = 'user' | 'assistant' | 'system';
|
|
247
|
+
/**
|
|
248
|
+
* Task status
|
|
249
|
+
*/
|
|
250
|
+
export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
251
|
+
/**
|
|
252
|
+
* Audit log action types
|
|
253
|
+
*/
|
|
254
|
+
export type AuditActionType = 'chat_message' | 'memory_store' | 'memory_search' | 'document_upload' | 'agent_invocation' | 'tool_execution' | 'safety_block';
|
|
255
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/database/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/database/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Cache
|
|
3
|
+
*
|
|
4
|
+
* LRU cache for embeddings to avoid redundant database queries.
|
|
5
|
+
* Improves performance for frequently accessed vectors.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Cache statistics
|
|
9
|
+
*/
|
|
10
|
+
export interface EmbeddingCacheStats {
|
|
11
|
+
size: number;
|
|
12
|
+
maxSize: number;
|
|
13
|
+
hitCount: number;
|
|
14
|
+
missCount: number;
|
|
15
|
+
hitRate: number;
|
|
16
|
+
memoryUsageBytes: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* LRU cache for embeddings
|
|
20
|
+
*/
|
|
21
|
+
export declare class EmbeddingCache {
|
|
22
|
+
private cache;
|
|
23
|
+
private maxSize;
|
|
24
|
+
private hitCount;
|
|
25
|
+
private missCount;
|
|
26
|
+
private dimension;
|
|
27
|
+
constructor(options?: {
|
|
28
|
+
maxSize?: number;
|
|
29
|
+
dimension?: number;
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Get embedding from cache
|
|
33
|
+
*/
|
|
34
|
+
get(id: string): number[] | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Set embedding in cache
|
|
37
|
+
*/
|
|
38
|
+
set(id: string, embedding: number[], metadata?: Record<string, unknown>): void;
|
|
39
|
+
/**
|
|
40
|
+
* Check if ID is in cache
|
|
41
|
+
*/
|
|
42
|
+
has(id: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Remove embedding from cache
|
|
45
|
+
*/
|
|
46
|
+
delete(id: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Clear the cache
|
|
49
|
+
*/
|
|
50
|
+
clear(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Evict least recently used entry
|
|
53
|
+
*/
|
|
54
|
+
private evictLRU;
|
|
55
|
+
/**
|
|
56
|
+
* Evict entries matching a pattern
|
|
57
|
+
*/
|
|
58
|
+
evictPattern(pattern: (id: string) => boolean): number;
|
|
59
|
+
/**
|
|
60
|
+
* Get multiple embeddings (batch)
|
|
61
|
+
*/
|
|
62
|
+
getMany(ids: string[]): Map<string, number[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Set multiple embeddings (batch)
|
|
65
|
+
*/
|
|
66
|
+
setMany(entries: Array<{
|
|
67
|
+
id: string;
|
|
68
|
+
embedding: number[];
|
|
69
|
+
metadata?: Record<string, unknown>;
|
|
70
|
+
}>): void;
|
|
71
|
+
/**
|
|
72
|
+
* Get cache statistics
|
|
73
|
+
*/
|
|
74
|
+
getStats(): EmbeddingCacheStats;
|
|
75
|
+
/**
|
|
76
|
+
* Get cache size
|
|
77
|
+
*/
|
|
78
|
+
get size(): number;
|
|
79
|
+
/**
|
|
80
|
+
* Preload embeddings from database records
|
|
81
|
+
*/
|
|
82
|
+
preload(records: Array<{
|
|
83
|
+
id: string;
|
|
84
|
+
embedding: number[] | string;
|
|
85
|
+
}>): void;
|
|
86
|
+
/**
|
|
87
|
+
* Trim cache to a smaller size
|
|
88
|
+
*/
|
|
89
|
+
trim(newMaxSize: number): void;
|
|
90
|
+
}
|
|
91
|
+
export default EmbeddingCache;
|
|
92
|
+
//# sourceMappingURL=embedding-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-cache.d.ts","sourceRoot":"","sources":["../../../src/database/vector/embedding-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAKlE;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAoBrC;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAmB9E;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM;IAWtD;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAW7C;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI;IAMtG;;OAEG;IACH,QAAQ,IAAI,mBAAmB;IAc/B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAoB3E;;OAEG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAe/B;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Cache
|
|
3
|
+
*
|
|
4
|
+
* LRU cache for embeddings to avoid redundant database queries.
|
|
5
|
+
* Improves performance for frequently accessed vectors.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '../../utils/logger.js';
|
|
8
|
+
const logger = createLogger('EmbeddingCache');
|
|
9
|
+
/**
|
|
10
|
+
* LRU cache for embeddings
|
|
11
|
+
*/
|
|
12
|
+
export class EmbeddingCache {
|
|
13
|
+
cache = new Map();
|
|
14
|
+
maxSize;
|
|
15
|
+
hitCount = 0;
|
|
16
|
+
missCount = 0;
|
|
17
|
+
dimension;
|
|
18
|
+
constructor(options = {}) {
|
|
19
|
+
this.maxSize = options.maxSize ?? 10000;
|
|
20
|
+
this.dimension = options.dimension ?? 1536;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get embedding from cache
|
|
24
|
+
*/
|
|
25
|
+
get(id) {
|
|
26
|
+
const entry = this.cache.get(id);
|
|
27
|
+
if (!entry) {
|
|
28
|
+
this.missCount++;
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
// Update access metadata
|
|
32
|
+
entry.accessCount++;
|
|
33
|
+
entry.lastAccessed = Date.now();
|
|
34
|
+
// Move to end for LRU
|
|
35
|
+
this.cache.delete(id);
|
|
36
|
+
this.cache.set(id, entry);
|
|
37
|
+
this.hitCount++;
|
|
38
|
+
return entry.embedding;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Set embedding in cache
|
|
42
|
+
*/
|
|
43
|
+
set(id, embedding, metadata) {
|
|
44
|
+
// Evict if at capacity
|
|
45
|
+
if (this.cache.size >= this.maxSize && !this.cache.has(id)) {
|
|
46
|
+
this.evictLRU();
|
|
47
|
+
}
|
|
48
|
+
const entry = {
|
|
49
|
+
embedding,
|
|
50
|
+
metadata,
|
|
51
|
+
accessCount: 1,
|
|
52
|
+
lastAccessed: Date.now(),
|
|
53
|
+
addedAt: Date.now(),
|
|
54
|
+
};
|
|
55
|
+
// Delete first to ensure it's at the end
|
|
56
|
+
this.cache.delete(id);
|
|
57
|
+
this.cache.set(id, entry);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if ID is in cache
|
|
61
|
+
*/
|
|
62
|
+
has(id) {
|
|
63
|
+
return this.cache.has(id);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Remove embedding from cache
|
|
67
|
+
*/
|
|
68
|
+
delete(id) {
|
|
69
|
+
return this.cache.delete(id);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Clear the cache
|
|
73
|
+
*/
|
|
74
|
+
clear() {
|
|
75
|
+
this.cache.clear();
|
|
76
|
+
this.hitCount = 0;
|
|
77
|
+
this.missCount = 0;
|
|
78
|
+
logger.debug('Embedding cache cleared');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Evict least recently used entry
|
|
82
|
+
*/
|
|
83
|
+
evictLRU() {
|
|
84
|
+
// First entry is LRU due to Map ordering
|
|
85
|
+
const firstKey = this.cache.keys().next().value;
|
|
86
|
+
if (firstKey) {
|
|
87
|
+
this.cache.delete(firstKey);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Evict entries matching a pattern
|
|
92
|
+
*/
|
|
93
|
+
evictPattern(pattern) {
|
|
94
|
+
let count = 0;
|
|
95
|
+
for (const id of this.cache.keys()) {
|
|
96
|
+
if (pattern(id)) {
|
|
97
|
+
this.cache.delete(id);
|
|
98
|
+
count++;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return count;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get multiple embeddings (batch)
|
|
105
|
+
*/
|
|
106
|
+
getMany(ids) {
|
|
107
|
+
const result = new Map();
|
|
108
|
+
for (const id of ids) {
|
|
109
|
+
const embedding = this.get(id);
|
|
110
|
+
if (embedding) {
|
|
111
|
+
result.set(id, embedding);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Set multiple embeddings (batch)
|
|
118
|
+
*/
|
|
119
|
+
setMany(entries) {
|
|
120
|
+
for (const { id, embedding, metadata } of entries) {
|
|
121
|
+
this.set(id, embedding, metadata);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get cache statistics
|
|
126
|
+
*/
|
|
127
|
+
getStats() {
|
|
128
|
+
const totalRequests = this.hitCount + this.missCount;
|
|
129
|
+
const memoryUsageBytes = this.cache.size * this.dimension * 4; // 4 bytes per float32
|
|
130
|
+
return {
|
|
131
|
+
size: this.cache.size,
|
|
132
|
+
maxSize: this.maxSize,
|
|
133
|
+
hitCount: this.hitCount,
|
|
134
|
+
missCount: this.missCount,
|
|
135
|
+
hitRate: totalRequests > 0 ? this.hitCount / totalRequests : 0,
|
|
136
|
+
memoryUsageBytes,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get cache size
|
|
141
|
+
*/
|
|
142
|
+
get size() {
|
|
143
|
+
return this.cache.size;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Preload embeddings from database records
|
|
147
|
+
*/
|
|
148
|
+
preload(records) {
|
|
149
|
+
for (const record of records) {
|
|
150
|
+
let embedding;
|
|
151
|
+
if (typeof record.embedding === 'string') {
|
|
152
|
+
try {
|
|
153
|
+
embedding = JSON.parse(record.embedding);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
embedding = record.embedding;
|
|
161
|
+
}
|
|
162
|
+
this.set(record.id, embedding);
|
|
163
|
+
}
|
|
164
|
+
logger.debug('Embeddings preloaded', { count: records.length });
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Trim cache to a smaller size
|
|
168
|
+
*/
|
|
169
|
+
trim(newMaxSize) {
|
|
170
|
+
if (newMaxSize >= this.cache.size)
|
|
171
|
+
return;
|
|
172
|
+
const toRemove = this.cache.size - newMaxSize;
|
|
173
|
+
let removed = 0;
|
|
174
|
+
for (const id of this.cache.keys()) {
|
|
175
|
+
if (removed >= toRemove)
|
|
176
|
+
break;
|
|
177
|
+
this.cache.delete(id);
|
|
178
|
+
removed++;
|
|
179
|
+
}
|
|
180
|
+
this.maxSize = newMaxSize;
|
|
181
|
+
logger.debug('Cache trimmed', { removed, newSize: this.cache.size });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export default EmbeddingCache;
|
|
185
|
+
//# sourceMappingURL=embedding-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-cache.js","sourceRoot":"","sources":["../../../src/database/vector/embedding-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HNSW (Hierarchical Navigable Small World) Index
|
|
3
|
+
*
|
|
4
|
+
* In-memory approximate nearest neighbor search for SQLite mode.
|
|
5
|
+
* Provides fast vector similarity search without pgvector.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Search result with similarity score
|
|
9
|
+
*/
|
|
10
|
+
export interface SearchResult {
|
|
11
|
+
id: string;
|
|
12
|
+
similarity: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* HNSW index configuration
|
|
16
|
+
*/
|
|
17
|
+
export interface HNSWConfig {
|
|
18
|
+
/** Vector dimension */
|
|
19
|
+
dimension: number;
|
|
20
|
+
/** Similarity metric: 'cosine' or 'euclidean' */
|
|
21
|
+
similarity: 'cosine' | 'euclidean';
|
|
22
|
+
/** Maximum connections per layer */
|
|
23
|
+
M: number;
|
|
24
|
+
/** Maximum connections for layer 0 */
|
|
25
|
+
M0: number;
|
|
26
|
+
/** Size of dynamic candidate list during construction */
|
|
27
|
+
efConstruction: number;
|
|
28
|
+
/** Level generation factor (1/ln(M)) */
|
|
29
|
+
mL: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* HNSW Index for fast approximate nearest neighbor search
|
|
33
|
+
*/
|
|
34
|
+
export declare class HNSWIndex {
|
|
35
|
+
private nodes;
|
|
36
|
+
private entryPoint;
|
|
37
|
+
private maxLevel;
|
|
38
|
+
private config;
|
|
39
|
+
constructor(config?: Partial<HNSWConfig>);
|
|
40
|
+
/**
|
|
41
|
+
* Get similarity function based on config
|
|
42
|
+
*/
|
|
43
|
+
private getSimilarity;
|
|
44
|
+
/**
|
|
45
|
+
* Generate random level for new node
|
|
46
|
+
*/
|
|
47
|
+
private randomLevel;
|
|
48
|
+
/**
|
|
49
|
+
* Get maximum connections for a level
|
|
50
|
+
*/
|
|
51
|
+
private getMaxConnections;
|
|
52
|
+
/**
|
|
53
|
+
* Add a vector to the index
|
|
54
|
+
*/
|
|
55
|
+
add(id: string, vector: number[]): void;
|
|
56
|
+
/**
|
|
57
|
+
* Search for k nearest neighbors
|
|
58
|
+
*/
|
|
59
|
+
search(query: number[], k: number, ef?: number): SearchResult[];
|
|
60
|
+
/**
|
|
61
|
+
* Search within a layer
|
|
62
|
+
*/
|
|
63
|
+
private searchLayer;
|
|
64
|
+
/**
|
|
65
|
+
* Select best neighbors from candidates
|
|
66
|
+
*/
|
|
67
|
+
private selectNeighbors;
|
|
68
|
+
/**
|
|
69
|
+
* Prune connections to maintain max connections
|
|
70
|
+
*/
|
|
71
|
+
private pruneConnections;
|
|
72
|
+
/**
|
|
73
|
+
* Remove a vector from the index
|
|
74
|
+
*/
|
|
75
|
+
remove(id: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Check if an ID exists in the index
|
|
78
|
+
*/
|
|
79
|
+
has(id: string): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Get vector by ID
|
|
82
|
+
*/
|
|
83
|
+
get(id: string): number[] | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Get index size
|
|
86
|
+
*/
|
|
87
|
+
get size(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Get index statistics
|
|
90
|
+
*/
|
|
91
|
+
getStats(): {
|
|
92
|
+
size: number;
|
|
93
|
+
dimension: number;
|
|
94
|
+
maxLevel: number;
|
|
95
|
+
avgConnections: number;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Clear the index
|
|
99
|
+
*/
|
|
100
|
+
clear(): void;
|
|
101
|
+
/**
|
|
102
|
+
* Get all IDs in the index
|
|
103
|
+
*/
|
|
104
|
+
getAllIds(): string[];
|
|
105
|
+
/**
|
|
106
|
+
* Rebuild index from scratch (for optimization)
|
|
107
|
+
*/
|
|
108
|
+
rebuild(): void;
|
|
109
|
+
}
|
|
110
|
+
export default HNSWIndex;
|
|
111
|
+
//# sourceMappingURL=hnsw-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnsw-index.d.ts","sourceRoot":"","sources":["../../../src/database/vector/hnsw-index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC;IACnC,oCAAoC;IACpC,CAAC,EAAE,MAAM,CAAC;IACV,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;CACZ;AAcD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM;IAI5C;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAoFvC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAyB/D;;OAEG;IACH,OAAO,CAAC,WAAW;IA8DnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAoC3B;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIrC;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,QAAQ,IAAI;QACV,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;KACxB;IAmBD;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACH,OAAO,IAAI,IAAI;CAchB;AAED,eAAe,SAAS,CAAC"}
|