@sochdb/sochdb 0.4.0 → 0.4.2
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/README.md +416 -34
- package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
- package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
- package/bin/sochdb-bulk.js +1 -1
- package/bin/sochdb-grpc-server.js +1 -1
- package/bin/sochdb-server.js +1 -1
- package/dist/cjs/context-builder.js +280 -0
- package/dist/cjs/database.js +2 -2
- package/dist/cjs/embedded/database.js +2 -2
- package/dist/cjs/embedded/ffi/hnsw-bindings.js +295 -0
- package/dist/cjs/embedded/ffi/library-finder.js +10 -3
- package/dist/cjs/embedded/index.js +5 -2
- package/dist/cjs/errors.js +99 -7
- package/dist/cjs/index.js +46 -6
- package/dist/cjs/ipc-client.js +2 -2
- package/dist/cjs/memory/consolidation.js +202 -0
- package/dist/cjs/memory/extraction.js +181 -0
- package/dist/cjs/memory/index.js +26 -0
- package/dist/cjs/memory/retrieval.js +232 -0
- package/dist/cjs/memory/types.js +69 -0
- package/dist/cjs/namespace.js +255 -0
- package/dist/cjs/queue.js +289 -0
- package/dist/cjs/semantic-cache.js +220 -0
- package/dist/esm/context-builder.js +280 -0
- package/dist/esm/database.js +2 -2
- package/dist/esm/embedded/database.js +2 -2
- package/dist/esm/embedded/ffi/hnsw-bindings.js +316 -0
- package/dist/esm/embedded/ffi/library-finder.js +10 -3
- package/dist/esm/embedded/index.js +5 -2
- package/dist/esm/errors.js +107 -7
- package/dist/esm/index.js +46 -6
- package/dist/esm/ipc-client.js +2 -2
- package/dist/esm/memory/consolidation.js +206 -0
- package/dist/esm/memory/extraction.js +185 -0
- package/dist/esm/memory/index.js +26 -0
- package/dist/esm/memory/retrieval.js +243 -0
- package/dist/esm/memory/types.js +72 -0
- package/dist/esm/namespace.js +262 -0
- package/dist/esm/queue.js +291 -0
- package/dist/esm/semantic-cache.js +223 -0
- package/dist/types/context-builder.d.ts +97 -0
- package/dist/types/context-builder.d.ts.map +1 -0
- package/dist/types/database.d.ts +1 -1
- package/dist/types/embedded/database.d.ts +1 -1
- package/dist/types/embedded/ffi/hnsw-bindings.d.ts +90 -0
- package/dist/types/embedded/ffi/hnsw-bindings.d.ts.map +1 -0
- package/dist/types/embedded/ffi/library-finder.d.ts.map +1 -1
- package/dist/types/embedded/index.d.ts +1 -0
- package/dist/types/embedded/index.d.ts.map +1 -1
- package/dist/types/errors.d.ts +57 -1
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +15 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/ipc-client.d.ts +1 -1
- package/dist/types/memory/consolidation.d.ts +66 -0
- package/dist/types/memory/consolidation.d.ts.map +1 -0
- package/dist/types/memory/extraction.d.ts +82 -0
- package/dist/types/memory/extraction.d.ts.map +1 -0
- package/dist/types/memory/index.d.ts +10 -0
- package/dist/types/memory/index.d.ts.map +1 -0
- package/dist/types/memory/retrieval.d.ts +46 -0
- package/dist/types/memory/retrieval.d.ts.map +1 -0
- package/dist/types/memory/types.d.ts +147 -0
- package/dist/types/memory/types.d.ts.map +1 -0
- package/dist/types/namespace.d.ts +129 -0
- package/dist/types/namespace.d.ts.map +1 -0
- package/dist/types/queue.d.ts +120 -0
- package/dist/types/queue.d.ts.map +1 -0
- package/dist/types/semantic-cache.d.ts +84 -0
- package/dist/types/semantic-cache.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Semantic Cache for LLM responses
|
|
4
|
+
*
|
|
5
|
+
* Cache LLM responses with similarity-based retrieval for cost savings.
|
|
6
|
+
* Uses database prefix scanning to store and retrieve cached responses.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SemanticCache = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Calculate cosine similarity between two vectors
|
|
12
|
+
*/
|
|
13
|
+
function cosineSimilarity(a, b) {
|
|
14
|
+
if (a.length !== b.length) {
|
|
15
|
+
throw new Error('Vectors must have same length');
|
|
16
|
+
}
|
|
17
|
+
let dotProduct = 0;
|
|
18
|
+
let normA = 0;
|
|
19
|
+
let normB = 0;
|
|
20
|
+
for (let i = 0; i < a.length; i++) {
|
|
21
|
+
dotProduct += a[i] * b[i];
|
|
22
|
+
normA += a[i] * a[i];
|
|
23
|
+
normB += b[i] * b[i];
|
|
24
|
+
}
|
|
25
|
+
if (normA === 0 || normB === 0) {
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Semantic Cache with vector similarity matching
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const cache = new SemanticCache(db, 'llm_responses');
|
|
36
|
+
*
|
|
37
|
+
* // Store response
|
|
38
|
+
* await cache.put(
|
|
39
|
+
* 'What is Python?',
|
|
40
|
+
* 'Python is a high-level programming language...',
|
|
41
|
+
* embedding,
|
|
42
|
+
* 3600 // TTL in seconds
|
|
43
|
+
* );
|
|
44
|
+
*
|
|
45
|
+
* // Check cache
|
|
46
|
+
* const hit = await cache.get(queryEmbedding, 0.85);
|
|
47
|
+
* if (hit) {
|
|
48
|
+
* console.log(`Cache HIT: ${hit.value} (similarity: ${hit.score})`);
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
class SemanticCache {
|
|
53
|
+
db;
|
|
54
|
+
cacheName;
|
|
55
|
+
prefix;
|
|
56
|
+
hits = 0;
|
|
57
|
+
misses = 0;
|
|
58
|
+
constructor(db, cacheName) {
|
|
59
|
+
this.db = db;
|
|
60
|
+
this.cacheName = cacheName;
|
|
61
|
+
this.prefix = Buffer.from(`cache:${cacheName}:`);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Store a cached response
|
|
65
|
+
*/
|
|
66
|
+
async put(key, value, embedding, ttlSeconds = 0, metadata) {
|
|
67
|
+
const entry = {
|
|
68
|
+
key,
|
|
69
|
+
value,
|
|
70
|
+
embedding,
|
|
71
|
+
timestamp: Date.now(),
|
|
72
|
+
ttl: ttlSeconds > 0 ? ttlSeconds : undefined,
|
|
73
|
+
metadata,
|
|
74
|
+
};
|
|
75
|
+
const entryKey = Buffer.concat([
|
|
76
|
+
this.prefix,
|
|
77
|
+
Buffer.from(key),
|
|
78
|
+
]);
|
|
79
|
+
await this.db.put(entryKey, Buffer.from(JSON.stringify(entry)));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Retrieve cached response by similarity
|
|
83
|
+
*
|
|
84
|
+
* @param queryEmbedding - Query embedding vector
|
|
85
|
+
* @param threshold - Minimum cosine similarity (0-1)
|
|
86
|
+
* @returns Best matching cache entry or null
|
|
87
|
+
*/
|
|
88
|
+
async get(queryEmbedding, threshold = 0.85) {
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
let bestMatch = null;
|
|
91
|
+
let bestScore = threshold;
|
|
92
|
+
// Scan all cache entries with this prefix
|
|
93
|
+
try {
|
|
94
|
+
for await (const [_, valueBuffer] of this.db.scanPrefix(this.prefix)) {
|
|
95
|
+
const entry = JSON.parse(valueBuffer.toString());
|
|
96
|
+
// Check TTL expiration
|
|
97
|
+
if (entry.ttl && entry.timestamp) {
|
|
98
|
+
const expiresAt = entry.timestamp + entry.ttl * 1000;
|
|
99
|
+
if (now > expiresAt) {
|
|
100
|
+
continue; // Skip expired entries
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Calculate similarity
|
|
104
|
+
const score = cosineSimilarity(queryEmbedding, entry.embedding);
|
|
105
|
+
// Update best match
|
|
106
|
+
if (score > bestScore) {
|
|
107
|
+
bestScore = score;
|
|
108
|
+
bestMatch = { ...entry, score };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
// If scan fails, return null
|
|
114
|
+
this.misses++;
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (bestMatch) {
|
|
118
|
+
this.hits++;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.misses++;
|
|
122
|
+
}
|
|
123
|
+
return bestMatch;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Delete a specific cache entry
|
|
127
|
+
*/
|
|
128
|
+
async delete(key) {
|
|
129
|
+
const entryKey = Buffer.concat([
|
|
130
|
+
this.prefix,
|
|
131
|
+
Buffer.from(key),
|
|
132
|
+
]);
|
|
133
|
+
await this.db.delete(entryKey);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clear all entries in this cache
|
|
137
|
+
*/
|
|
138
|
+
async clear() {
|
|
139
|
+
let deleted = 0;
|
|
140
|
+
try {
|
|
141
|
+
const toDelete = [];
|
|
142
|
+
for await (const [key] of this.db.scanPrefix(this.prefix)) {
|
|
143
|
+
toDelete.push(key);
|
|
144
|
+
}
|
|
145
|
+
for (const key of toDelete) {
|
|
146
|
+
await this.db.delete(key);
|
|
147
|
+
deleted++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// If operation fails, return count so far
|
|
152
|
+
return deleted;
|
|
153
|
+
}
|
|
154
|
+
// Reset stats
|
|
155
|
+
this.hits = 0;
|
|
156
|
+
this.misses = 0;
|
|
157
|
+
return deleted;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get cache statistics
|
|
161
|
+
*/
|
|
162
|
+
async stats() {
|
|
163
|
+
const now = Date.now();
|
|
164
|
+
let count = 0;
|
|
165
|
+
let memoryUsage = 0;
|
|
166
|
+
try {
|
|
167
|
+
for await (const [key, value] of this.db.scanPrefix(this.prefix)) {
|
|
168
|
+
const entry = JSON.parse(value.toString());
|
|
169
|
+
// Skip expired entries
|
|
170
|
+
if (entry.ttl && entry.timestamp) {
|
|
171
|
+
const expiresAt = entry.timestamp + entry.ttl * 1000;
|
|
172
|
+
if (now > expiresAt) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
count++;
|
|
177
|
+
memoryUsage += key.length + value.length;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
// Return partial stats if operation fails
|
|
182
|
+
}
|
|
183
|
+
const total = this.hits + this.misses;
|
|
184
|
+
const hitRate = total > 0 ? this.hits / total : 0;
|
|
185
|
+
return {
|
|
186
|
+
count,
|
|
187
|
+
hits: this.hits,
|
|
188
|
+
misses: this.misses,
|
|
189
|
+
hitRate,
|
|
190
|
+
memoryUsage,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Purge expired entries
|
|
195
|
+
*/
|
|
196
|
+
async purgeExpired() {
|
|
197
|
+
const now = Date.now();
|
|
198
|
+
let purged = 0;
|
|
199
|
+
try {
|
|
200
|
+
const toDelete = [];
|
|
201
|
+
for await (const [key, value] of this.db.scanPrefix(this.prefix)) {
|
|
202
|
+
const entry = JSON.parse(value.toString());
|
|
203
|
+
if (entry.ttl && entry.timestamp) {
|
|
204
|
+
const expiresAt = entry.timestamp + entry.ttl * 1000;
|
|
205
|
+
if (now > expiresAt) {
|
|
206
|
+
toDelete.push(key);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
for (const key of toDelete) {
|
|
211
|
+
await this.db.delete(key);
|
|
212
|
+
purged++;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
// Return count so far
|
|
217
|
+
return purged;
|
|
218
|
+
}
|
|
219
|
+
return purged;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.SemanticCache = SemanticCache;
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VtYW50aWMtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFJSDs7R0FFRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDaEQsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELE9BQU8sVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQXVCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUExTUQsc0NBME1DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZW1hbnRpYyBDYWNoZSBmb3IgTExNIHJlc3BvbnNlc1xuICogXG4gKiBDYWNoZSBMTE0gcmVzcG9uc2VzIHdpdGggc2ltaWxhcml0eS1iYXNlZCByZXRyaWV2YWwgZm9yIGNvc3Qgc2F2aW5ncy5cbiAqIFVzZXMgZGF0YWJhc2UgcHJlZml4IHNjYW5uaW5nIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBjYWNoZWQgcmVzcG9uc2VzLlxuICovXG5cbmltcG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UgfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLyoqXG4gKiBDYWxjdWxhdGUgY29zaW5lIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gdmVjdG9yc1xuICovXG5mdW5jdGlvbiBjb3NpbmVTaW1pbGFyaXR5KGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlciB7XG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlY3RvcnMgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoJyk7XG4gIH1cblxuICBsZXQgZG90UHJvZHVjdCA9IDA7XG4gIGxldCBub3JtQSA9IDA7XG4gIGxldCBub3JtQiA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgZG90UHJvZHVjdCArPSBhW2ldICogYltpXTtcbiAgICBub3JtQSArPSBhW2ldICogYVtpXTtcbiAgICBub3JtQiArPSBiW2ldICogYltpXTtcbiAgfVxuXG4gIGlmIChub3JtQSA9PT0gMCB8fCBub3JtQiA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIGRvdFByb2R1Y3QgLyAoTWF0aC5zcXJ0KG5vcm1BKSAqIE1hdGguc3FydChub3JtQikpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRW50cnkge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgZW1iZWRkaW5nOiBudW1iZXJbXTtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIHR0bD86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlSGl0IGV4dGVuZHMgQ2FjaGVFbnRyeSB7XG4gIHNjb3JlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdGF0cyB7XG4gIGNvdW50OiBudW1iZXI7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG4gIGhpdFJhdGU6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTZW1hbnRpYyBDYWNoZSB3aXRoIHZlY3RvciBzaW1pbGFyaXR5IG1hdGNoaW5nXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjYWNoZSA9IG5ldyBTZW1hbnRpY0NhY2hlKGRiLCAnbGxtX3Jlc3BvbnNlcycpO1xuICogXG4gKiAvLyBTdG9yZSByZXNwb25zZVxuICogYXdhaXQgY2FjaGUucHV0KFxuICogICAnV2hhdCBpcyBQeXRob24/JyxcbiAqICAgJ1B5dGhvbiBpcyBhIGhpZ2gtbGV2ZWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuLi4nLFxuICogICBlbWJlZGRpbmcsXG4gKiAgIDM2MDAgIC8vIFRUTCBpbiBzZWNvbmRzXG4gKiApO1xuICogXG4gKiAvLyBDaGVjayBjYWNoZVxuICogY29uc3QgaGl0ID0gYXdhaXQgY2FjaGUuZ2V0KHF1ZXJ5RW1iZWRkaW5nLCAwLjg1KTtcbiAqIGlmIChoaXQpIHtcbiAqICAgY29uc29sZS5sb2coYENhY2hlIEhJVDogJHtoaXQudmFsdWV9IChzaW1pbGFyaXR5OiAke2hpdC5zY29yZX0pYCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbWFudGljQ2FjaGUge1xuICBwcml2YXRlIGRiOiBFbWJlZGRlZERhdGFiYXNlO1xuICBwcml2YXRlIGNhY2hlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHByZWZpeDogQnVmZmVyO1xuICBwcml2YXRlIGhpdHMgPSAwO1xuICBwcml2YXRlIG1pc3NlcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoZGI6IEVtYmVkZGVkRGF0YWJhc2UsIGNhY2hlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5kYiA9IGRiO1xuICAgIHRoaXMuY2FjaGVOYW1lID0gY2FjaGVOYW1lO1xuICAgIHRoaXMucHJlZml4ID0gQnVmZmVyLmZyb20oYGNhY2hlOiR7Y2FjaGVOYW1lfTpgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBhIGNhY2hlZCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgcHV0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZW1iZWRkaW5nOiBudW1iZXJbXSxcbiAgICB0dGxTZWNvbmRzID0gMCxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50cnk6IENhY2hlRW50cnkgPSB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIGVtYmVkZGluZyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHR0bDogdHRsU2Vjb25kcyA+IDAgPyB0dGxTZWNvbmRzIDogdW5kZWZpbmVkLFxuICAgICAgbWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGNvbnN0IGVudHJ5S2V5ID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICB0aGlzLnByZWZpeCxcbiAgICAgIEJ1ZmZlci5mcm9tKGtleSksXG4gICAgXSk7XG5cbiAgICBhd2FpdCB0aGlzLmRiLnB1dChlbnRyeUtleSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoZW50cnkpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgY2FjaGVkIHJlc3BvbnNlIGJ5IHNpbWlsYXJpdHlcbiAgICogXG4gICAqIEBwYXJhbSBxdWVyeUVtYmVkZGluZyAtIFF1ZXJ5IGVtYmVkZGluZyB2ZWN0b3JcbiAgICogQHBhcmFtIHRocmVzaG9sZCAtIE1pbmltdW0gY29zaW5lIHNpbWlsYXJpdHkgKDAtMSlcbiAgICogQHJldHVybnMgQmVzdCBtYXRjaGluZyBjYWNoZSBlbnRyeSBvciBudWxsXG4gICAqL1xuICBhc3luYyBnZXQoXG4gICAgcXVlcnlFbWJlZGRpbmc6IG51bWJlcltdLFxuICAgIHRocmVzaG9sZCA9IDAuODVcbiAgKTogUHJvbWlzZTxDYWNoZUhpdCB8IG51bGw+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBiZXN0TWF0Y2g6IENhY2hlSGl0IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGJlc3RTY29yZSA9IHRocmVzaG9sZDtcblxuICAgIC8vIFNjYW4gYWxsIGNhY2hlIGVudHJpZXMgd2l0aCB0aGlzIHByZWZpeFxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IFtfLCB2YWx1ZUJ1ZmZlcl0gb2YgdGhpcy5kYi5zY2FuUHJlZml4KHRoaXMucHJlZml4KSkge1xuICAgICAgICBjb25zdCBlbnRyeTogQ2FjaGVFbnRyeSA9IEpTT04ucGFyc2UodmFsdWVCdWZmZXIudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgVFRMIGV4cGlyYXRpb25cbiAgICAgICAgaWYgKGVudHJ5LnR0bCAmJiBlbnRyeS50aW1lc3RhbXApIHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBlbnRyeS50aW1lc3RhbXAgKyBlbnRyeS50dGwgKiAxMDAwO1xuICAgICAgICAgIGlmIChub3cgPiBleHBpcmVzQXQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGV4cGlyZWQgZW50cmllc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzaW1pbGFyaXR5XG4gICAgICAgIGNvbnN0IHNjb3JlID0gY29zaW5lU2ltaWxhcml0eShxdWVyeUVtYmVkZGluZywgZW50cnkuZW1iZWRkaW5nKTtcblxuICAgICAgICAvLyBVcGRhdGUgYmVzdCBtYXRjaFxuICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHtcbiAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTtcbiAgICAgICAgICBiZXN0TWF0Y2ggPSB7IC4uLmVudHJ5LCBzY29yZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHNjYW4gZmFpbHMsIHJldHVybiBudWxsXG4gICAgICB0aGlzLm1pc3NlcysrO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGJlc3RNYXRjaCkge1xuICAgICAgdGhpcy5oaXRzKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWlzc2VzKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBzcGVjaWZpYyBjYWNoZSBlbnRyeVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50cnlLZXkgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIHRoaXMucHJlZml4LFxuICAgICAgQnVmZmVyLmZyb20oa2V5KSxcbiAgICBdKTtcbiAgICBhd2FpdCB0aGlzLmRiLmRlbGV0ZShlbnRyeUtleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGVudHJpZXMgaW4gdGhpcyBjYWNoZVxuICAgKi9cbiAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgZGVsZXRlZCA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9EZWxldGU6IEJ1ZmZlcltdID0gW107XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IFtrZXldIG9mIHRoaXMuZGIuc2NhblByZWZpeCh0aGlzLnByZWZpeCkpIHtcbiAgICAgICAgdG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiB0b0RlbGV0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmRiLmRlbGV0ZShrZXkpO1xuICAgICAgICBkZWxldGVkKys7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIG9wZXJhdGlvbiBmYWlscywgcmV0dXJuIGNvdW50IHNvIGZhclxuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RhdHNcbiAgICB0aGlzLmhpdHMgPSAwO1xuICAgIHRoaXMubWlzc2VzID0gMDtcblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBzdGF0aXN0aWNzXG4gICAqL1xuICBhc3luYyBzdGF0cygpOiBQcm9taXNlPENhY2hlU3RhdHM+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgbGV0IG1lbW9yeVVzYWdlID0gMDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5OiBDYWNoZUVudHJ5ID0gSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNraXAgZXhwaXJlZCBlbnRyaWVzXG4gICAgICAgIGlmIChlbnRyeS50dGwgJiYgZW50cnkudGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gZW50cnkudGltZXN0YW1wICsgZW50cnkudHRsICogMTAwMDtcbiAgICAgICAgICBpZiAobm93ID4gZXhwaXJlc0F0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb3VudCsrO1xuICAgICAgICBtZW1vcnlVc2FnZSArPSBrZXkubGVuZ3RoICsgdmFsdWUubGVuZ3RoO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZXR1cm4gcGFydGlhbCBzdGF0cyBpZiBvcGVyYXRpb24gZmFpbHNcbiAgICB9XG5cbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuaGl0cyArIHRoaXMubWlzc2VzO1xuICAgIGNvbnN0IGhpdFJhdGUgPSB0b3RhbCA+IDAgPyB0aGlzLmhpdHMgLyB0b3RhbCA6IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY291bnQsXG4gICAgICBoaXRzOiB0aGlzLmhpdHMsXG4gICAgICBtaXNzZXM6IHRoaXMubWlzc2VzLFxuICAgICAgaGl0UmF0ZSxcbiAgICAgIG1lbW9yeVVzYWdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUHVyZ2UgZXhwaXJlZCBlbnRyaWVzXG4gICAqL1xuICBhc3luYyBwdXJnZUV4cGlyZWQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwdXJnZWQgPSAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRvRGVsZXRlOiBCdWZmZXJbXSA9IFtdO1xuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5OiBDYWNoZUVudHJ5ID0gSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbnRyeS50dGwgJiYgZW50cnkudGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gZW50cnkudGltZXN0YW1wICsgZW50cnkudHRsICogMTAwMDtcbiAgICAgICAgICBpZiAobm93ID4gZXhwaXJlc0F0KSB7XG4gICAgICAgICAgICB0b0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRvRGVsZXRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGIuZGVsZXRlKGtleSk7XG4gICAgICAgIHB1cmdlZCsrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZXR1cm4gY291bnQgc28gZmFyXG4gICAgICByZXR1cm4gcHVyZ2VkO1xuICAgIH1cblxuICAgIHJldHVybiBwdXJnZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Query Builder for LLM Context Assembly
|
|
3
|
+
*
|
|
4
|
+
* Token-aware context assembly with priority-based truncation.
|
|
5
|
+
*/
|
|
6
|
+
export declare enum ContextOutputFormat {
|
|
7
|
+
TOON = "toon",
|
|
8
|
+
JSON = "json",
|
|
9
|
+
MARKDOWN = "markdown"
|
|
10
|
+
}
|
|
11
|
+
export declare enum TruncationStrategy {
|
|
12
|
+
TAIL_DROP = "tail_drop",// Drop from end
|
|
13
|
+
HEAD_DROP = "head_drop",// Drop from beginning
|
|
14
|
+
PROPORTIONAL = "proportional"
|
|
15
|
+
}
|
|
16
|
+
export interface ContextResult {
|
|
17
|
+
text: string;
|
|
18
|
+
tokenCount: number;
|
|
19
|
+
sections: Array<{
|
|
20
|
+
name: string;
|
|
21
|
+
tokenCount: number;
|
|
22
|
+
truncated: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Context Query Builder for assembling LLM context
|
|
27
|
+
*/
|
|
28
|
+
export declare class ContextQueryBuilder {
|
|
29
|
+
private sessionId?;
|
|
30
|
+
private tokenBudget;
|
|
31
|
+
private format;
|
|
32
|
+
private truncation;
|
|
33
|
+
private sections;
|
|
34
|
+
private currentSection?;
|
|
35
|
+
/**
|
|
36
|
+
* Set session ID for context
|
|
37
|
+
*/
|
|
38
|
+
forSession(sessionId: string): this;
|
|
39
|
+
/**
|
|
40
|
+
* Set token budget
|
|
41
|
+
*/
|
|
42
|
+
withBudget(tokens: number): this;
|
|
43
|
+
/**
|
|
44
|
+
* Set output format
|
|
45
|
+
*/
|
|
46
|
+
setFormat(format: ContextOutputFormat): this;
|
|
47
|
+
/**
|
|
48
|
+
* Set truncation strategy
|
|
49
|
+
*/
|
|
50
|
+
setTruncation(strategy: TruncationStrategy): this;
|
|
51
|
+
/**
|
|
52
|
+
* Add literal text section
|
|
53
|
+
*/
|
|
54
|
+
literal(name: string, priority: number, text: string): this;
|
|
55
|
+
/**
|
|
56
|
+
* Start a new section
|
|
57
|
+
*/
|
|
58
|
+
section(name: string, priority: number): this;
|
|
59
|
+
/**
|
|
60
|
+
* Add content to current section
|
|
61
|
+
*/
|
|
62
|
+
get(path: string): this;
|
|
63
|
+
/**
|
|
64
|
+
* Add last N records query
|
|
65
|
+
*/
|
|
66
|
+
last(n: number, table: string): this;
|
|
67
|
+
/**
|
|
68
|
+
* Add where equals condition
|
|
69
|
+
*/
|
|
70
|
+
whereEq(field: string, value: any): this;
|
|
71
|
+
/**
|
|
72
|
+
* Add vector search
|
|
73
|
+
*/
|
|
74
|
+
search(collection: string, embedding: string, k: number): this;
|
|
75
|
+
/**
|
|
76
|
+
* Add SQL query
|
|
77
|
+
*/
|
|
78
|
+
sql(query: string): this;
|
|
79
|
+
/**
|
|
80
|
+
* Finish current section
|
|
81
|
+
*/
|
|
82
|
+
done(): this;
|
|
83
|
+
/**
|
|
84
|
+
* Execute and build context
|
|
85
|
+
*/
|
|
86
|
+
execute(): ContextResult;
|
|
87
|
+
private estimateTokens;
|
|
88
|
+
private truncateText;
|
|
89
|
+
private buildToonFormat;
|
|
90
|
+
private buildJsonFormat;
|
|
91
|
+
private buildMarkdownFormat;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a context query builder
|
|
95
|
+
*/
|
|
96
|
+
export declare function createContextBuilder(): ContextQueryBuilder;
|
|
97
|
+
//# sourceMappingURL=context-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/context-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,IAAI,SAAS;IACb,QAAQ,aAAa;CACtB;AAED,oBAAY,kBAAkB;IAC5B,SAAS,cAAc,CAAQ,gBAAgB;IAC/C,SAAS,cAAc,CAAQ,sBAAsB;IACrD,YAAY,iBAAiB;CAC9B;AASD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC3E;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAAiD;IAC/D,OAAO,CAAC,UAAU,CAAoD;IACtE,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,cAAc,CAAC,CAAU;IAEjC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKhC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAK5C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAKjD;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAW3D;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAU7C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQvB;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQpC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAQxC;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ9D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQxB;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACH,OAAO,IAAI,aAAa;IA2FxB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;CAY5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,mBAAmB,CAE1D"}
|
package/dist/types/database.d.ts
CHANGED
|
@@ -99,7 +99,7 @@ export declare class Transaction {
|
|
|
99
99
|
*
|
|
100
100
|
* @example
|
|
101
101
|
* ```typescript
|
|
102
|
-
* import { Database } from '@
|
|
102
|
+
* import { Database } from '@sochdb/sochdb';
|
|
103
103
|
*
|
|
104
104
|
* // Open a database
|
|
105
105
|
* const db = await Database.open('./my_database');
|
|
@@ -18,7 +18,7 @@ export interface EmbeddedDatabaseConfig {
|
|
|
18
18
|
*
|
|
19
19
|
* @example
|
|
20
20
|
* ```typescript
|
|
21
|
-
* import { EmbeddedDatabase } from '@
|
|
21
|
+
* import { EmbeddedDatabase } from '@sochdb/sochdb';
|
|
22
22
|
*
|
|
23
23
|
* const db = await EmbeddedDatabase.open('./mydb');
|
|
24
24
|
* await db.put(Buffer.from('key'), Buffer.from('value'));
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HNSW Vector Index FFI Bindings
|
|
3
|
+
*
|
|
4
|
+
* Native vector search using HNSW (Hierarchical Navigable Small World) algorithm.
|
|
5
|
+
*
|
|
6
|
+
* @see sochdb-index/src/ffi.rs
|
|
7
|
+
*/
|
|
8
|
+
export interface SearchResult {
|
|
9
|
+
id: string;
|
|
10
|
+
distance: number;
|
|
11
|
+
}
|
|
12
|
+
export interface HnswConfig {
|
|
13
|
+
dimension: number;
|
|
14
|
+
maxConnections?: number;
|
|
15
|
+
efConstruction?: number;
|
|
16
|
+
efSearch?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class HnswBindings {
|
|
19
|
+
private static instance;
|
|
20
|
+
private lib;
|
|
21
|
+
hnsw_new: any;
|
|
22
|
+
hnsw_free: any;
|
|
23
|
+
hnsw_insert: any;
|
|
24
|
+
hnsw_insert_batch: any;
|
|
25
|
+
hnsw_insert_flat: any;
|
|
26
|
+
hnsw_insert_batch_flat: any;
|
|
27
|
+
hnsw_search: any;
|
|
28
|
+
hnsw_search_fast: any;
|
|
29
|
+
hnsw_search_ultra: any;
|
|
30
|
+
hnsw_len: any;
|
|
31
|
+
hnsw_dimension: any;
|
|
32
|
+
hnsw_set_ef_search: any;
|
|
33
|
+
hnsw_get_ef_search: any;
|
|
34
|
+
hnsw_build_flat_cache: any;
|
|
35
|
+
private constructor();
|
|
36
|
+
static getInstance(): HnswBindings;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* High-level HNSW Index wrapper
|
|
40
|
+
*/
|
|
41
|
+
export declare class HnswIndex {
|
|
42
|
+
private ptr;
|
|
43
|
+
private bindings;
|
|
44
|
+
private _dimension;
|
|
45
|
+
private _efSearch;
|
|
46
|
+
constructor(config: HnswConfig);
|
|
47
|
+
/**
|
|
48
|
+
* Insert a single vector
|
|
49
|
+
*/
|
|
50
|
+
insert(id: string, vector: number[]): void;
|
|
51
|
+
/**
|
|
52
|
+
* Insert multiple vectors in batch (faster)
|
|
53
|
+
*/
|
|
54
|
+
insertBatch(ids: string[], vectors: number[][]): void;
|
|
55
|
+
/**
|
|
56
|
+
* Search for k nearest neighbors
|
|
57
|
+
*/
|
|
58
|
+
search(queryVector: number[], k: number, fast?: boolean): SearchResult[];
|
|
59
|
+
/**
|
|
60
|
+
* Ultra-fast search with minimal ef_search
|
|
61
|
+
*/
|
|
62
|
+
searchUltra(queryVector: number[], k: number): SearchResult[];
|
|
63
|
+
/**
|
|
64
|
+
* Get number of vectors in index
|
|
65
|
+
*/
|
|
66
|
+
get length(): number;
|
|
67
|
+
/**
|
|
68
|
+
* Get vector dimension
|
|
69
|
+
*/
|
|
70
|
+
get dimension(): number;
|
|
71
|
+
/**
|
|
72
|
+
* Set ef_search parameter (controls search quality vs speed)
|
|
73
|
+
*/
|
|
74
|
+
set efSearch(value: number);
|
|
75
|
+
/**
|
|
76
|
+
* Get ef_search parameter
|
|
77
|
+
*/
|
|
78
|
+
get efSearch(): number;
|
|
79
|
+
/**
|
|
80
|
+
* Build flat cache for faster searches
|
|
81
|
+
*/
|
|
82
|
+
buildFlatCache(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Free native resources
|
|
85
|
+
*/
|
|
86
|
+
close(): void;
|
|
87
|
+
private stringToId;
|
|
88
|
+
private idToString;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=hnsw-bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hnsw-bindings.d.ts","sourceRoot":"","sources":["../../../../src/embedded/ffi/hnsw-bindings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,GAAG,CAAM;IAGV,QAAQ,EAAE,GAAG,CAAC;IACd,SAAS,EAAE,GAAG,CAAC;IACf,WAAW,EAAE,GAAG,CAAC;IACjB,iBAAiB,EAAE,GAAG,CAAC;IACvB,gBAAgB,EAAE,GAAG,CAAC;IACtB,sBAAsB,EAAE,GAAG,CAAC;IAC5B,WAAW,EAAE,GAAG,CAAC;IACjB,gBAAgB,EAAE,GAAG,CAAC;IACtB,iBAAiB,EAAE,GAAG,CAAC;IACvB,QAAQ,EAAE,GAAG,CAAC;IACd,cAAc,EAAE,GAAG,CAAC;IACpB,kBAAkB,EAAE,GAAG,CAAC;IACxB,kBAAkB,EAAE,GAAG,CAAC;IACxB,qBAAqB,EAAE,GAAG,CAAC;IAElC,OAAO;WAuFO,WAAW,IAAI,YAAY;CAM5C;AAED;;GAEG;AACH,qBAAa,SAAS;IAClB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,UAAU;IAmB9B;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAgB1C;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;IAmCrD;;OAEG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,OAAe,GAAG,YAAY,EAAE;IAgC/E;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IA6B7D;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAGzB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,cAAc,IAAI,IAAI;IAOtB;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,UAAU;CAIrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library-finder.d.ts","sourceRoot":"","sources":["../../../../src/embedded/ffi/library-finder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyCH;;;;;;;;GAQG;AACH,wBAAgB,WAAW,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"library-finder.d.ts","sourceRoot":"","sources":["../../../../src/embedded/ffi/library-finder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyCH;;;;;;;;GAQG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAiEpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/embedded/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/embedded/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/types/errors.d.ts
CHANGED
|
@@ -3,11 +3,31 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @packageDocumentation
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* Error codes matching Rust error codes.
|
|
8
|
+
*/
|
|
9
|
+
export declare enum ErrorCode {
|
|
10
|
+
CONNECTION_FAILED = 1001,
|
|
11
|
+
CONNECTION_TIMEOUT = 1002,
|
|
12
|
+
CONNECTION_CLOSED = 1003,
|
|
13
|
+
PROTOCOL_ERROR = 1004,
|
|
14
|
+
TRANSACTION_ABORTED = 2001,
|
|
15
|
+
TRANSACTION_CONFLICT = 2002,
|
|
16
|
+
INTERNAL_ERROR = 9001,
|
|
17
|
+
STORAGE_ERROR = 9003,
|
|
18
|
+
DATABASE_LOCKED = 10001,
|
|
19
|
+
LOCK_TIMEOUT = 10002,
|
|
20
|
+
EPOCH_MISMATCH = 10003,
|
|
21
|
+
SPLIT_BRAIN = 10004,
|
|
22
|
+
STALE_LOCK = 10005
|
|
23
|
+
}
|
|
6
24
|
/**
|
|
7
25
|
* Base error class for all SochDB errors.
|
|
8
26
|
*/
|
|
9
27
|
export declare class SochDBError extends Error {
|
|
10
|
-
|
|
28
|
+
readonly code: ErrorCode;
|
|
29
|
+
readonly remediation?: string;
|
|
30
|
+
constructor(message: string, code?: ErrorCode, remediation?: string);
|
|
11
31
|
}
|
|
12
32
|
/**
|
|
13
33
|
* Error thrown when connection to the database fails.
|
|
@@ -33,4 +53,40 @@ export declare class ProtocolError extends SochDBError {
|
|
|
33
53
|
export declare class DatabaseError extends SochDBError {
|
|
34
54
|
constructor(message: string);
|
|
35
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Base class for lock-related errors.
|
|
58
|
+
*/
|
|
59
|
+
export declare class LockError extends SochDBError {
|
|
60
|
+
constructor(message: string, code?: ErrorCode, remediation?: string);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Error thrown when database is locked by another process.
|
|
64
|
+
*/
|
|
65
|
+
export declare class DatabaseLockedError extends LockError {
|
|
66
|
+
readonly path: string;
|
|
67
|
+
readonly holderPid?: number;
|
|
68
|
+
constructor(path: string, holderPid?: number);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Error thrown when timed out waiting for database lock.
|
|
72
|
+
*/
|
|
73
|
+
export declare class LockTimeoutError extends LockError {
|
|
74
|
+
readonly path: string;
|
|
75
|
+
readonly timeoutSecs: number;
|
|
76
|
+
constructor(path: string, timeoutSecs: number);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Error thrown when WAL epoch mismatch detected (stale writer).
|
|
80
|
+
*/
|
|
81
|
+
export declare class EpochMismatchError extends LockError {
|
|
82
|
+
readonly expected: number;
|
|
83
|
+
readonly actual: number;
|
|
84
|
+
constructor(expected: number, actual: number);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Error thrown when split-brain condition detected (multiple writers).
|
|
88
|
+
*/
|
|
89
|
+
export declare class SplitBrainError extends LockError {
|
|
90
|
+
constructor(message?: string);
|
|
91
|
+
}
|
|
36
92
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH;;GAEG;AACH,oBAAY,SAAS;IAEnB,iBAAiB,OAAO;IACxB,kBAAkB,OAAO;IACzB,iBAAiB,OAAO;IACxB,cAAc,OAAO;IAGrB,mBAAmB,OAAO;IAC1B,oBAAoB,OAAO;IAG3B,cAAc,OAAO;IACrB,aAAa,OAAO;IAGpB,eAAe,QAAQ;IACvB,YAAY,QAAQ;IACpB,cAAc,QAAQ;IACtB,WAAW,QAAQ;IACnB,UAAU,QAAQ;CACnB;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,WAAW,CAAC,EAAE,MAAM,CAAC;gBAEzB,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,SAAoC,EAAE,WAAW,CAAC,EAAE,MAAM;CAO9F;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;gBAClC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;gBACnC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,WAAW;gBAChC,OAAO,EAAE,MAAM;CAK5B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,WAAW;gBAChC,OAAO,EAAE,MAAM;CAK5B;AAMD;;GAEG;AACH,qBAAa,SAAU,SAAQ,WAAW;gBAC5B,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,SAAqC,EAAE,WAAW,CAAC,EAAE,MAAM;CAK/F;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IAChD,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEvB,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAU7C;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAW9C;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEnB,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAW7C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,GAAE,MAAwD;CAS9E"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SochDB Node.js SDK v0.4.
|
|
2
|
+
* SochDB Node.js SDK v0.4.2
|
|
3
3
|
*
|
|
4
4
|
* Dual-mode architecture: Embedded (FFI) + Server (gRPC/IPC)
|
|
5
5
|
*
|
|
@@ -35,16 +35,28 @@
|
|
|
35
35
|
* await client.putKv('key', Buffer.from('value'));
|
|
36
36
|
* ```
|
|
37
37
|
*/
|
|
38
|
-
export declare const VERSION = "0.4.
|
|
38
|
+
export declare const VERSION = "0.4.2";
|
|
39
39
|
export { EmbeddedDatabase, EmbeddedDatabaseConfig } from './embedded';
|
|
40
40
|
export { EmbeddedTransaction } from './embedded';
|
|
41
|
+
export { HnswIndex, HnswConfig, HnswBindings } from './embedded';
|
|
42
|
+
export { SearchResult as HnswSearchResult } from './embedded';
|
|
41
43
|
export { EmbeddedDatabase as Database } from './embedded';
|
|
44
|
+
export { Namespace, Collection, DistanceMetric, NamespaceNotFoundError, NamespaceExistsError, CollectionNotFoundError, CollectionExistsError, } from './namespace';
|
|
45
|
+
export type { NamespaceConfig, CollectionConfig, SearchRequest, SearchResult as NamespaceSearchResult, } from './namespace';
|
|
46
|
+
export { PriorityQueue, TaskState, createQueue, } from './queue';
|
|
47
|
+
export type { QueueConfig, QueueKey, Task, QueueStats, } from './queue';
|
|
48
|
+
export { SemanticCache, } from './semantic-cache';
|
|
49
|
+
export type { CacheEntry, CacheHit, CacheStats, } from './semantic-cache';
|
|
50
|
+
export { ContextQueryBuilder, ContextOutputFormat, TruncationStrategy, createContextBuilder, } from './context-builder';
|
|
51
|
+
export type { ContextResult, } from './context-builder';
|
|
52
|
+
export { ExtractionPipeline, Consolidator, HybridRetriever, AllowedSet, NamespacePolicy, } from './memory';
|
|
53
|
+
export type { Entity, Relation, Assertion, RawAssertion, CanonicalFact, ExtractionResult, ExtractionSchema, ConsolidationConfig, RetrievalConfig, RetrievalResult, RetrievalResponse, NamespaceGrant, } from './memory';
|
|
42
54
|
export { SochDBClient } from './grpc-client';
|
|
43
55
|
export type { SearchResult, Document, GraphNode, GraphEdge, } from './grpc-client';
|
|
44
56
|
export { IpcClient } from './ipc-client';
|
|
45
57
|
export { WireFormat, ContextFormat, CanonicalFormat, FormatCapabilities, FormatConversionError, } from './format';
|
|
46
58
|
export { Query } from './query';
|
|
47
59
|
export type { QueryResult } from './query';
|
|
48
|
-
export { SochDBError, ConnectionError, TransactionError, ProtocolError, DatabaseError, } from './errors';
|
|
60
|
+
export { SochDBError, ConnectionError, TransactionError, ProtocolError, DatabaseError, ErrorCode, LockError, DatabaseLockedError, LockTimeoutError, EpochMismatchError, SplitBrainError, } from './errors';
|
|
49
61
|
export { SochDBClient as GrpcClient } from './grpc-client';
|
|
50
62
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,EAAE,gBAAgB,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EACL,SAAS,EACT,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,IAAI,qBAAqB,GACtC,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,MAAM,EACN,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,SAAS,GACV,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EAEb,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC"}
|