@sochdb/sochdb 0.4.0 → 0.4.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/README.md +220 -33
- 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/errors.js +99 -7
- package/dist/cjs/index.js +40 -3
- 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/errors.js +107 -7
- package/dist/esm/index.js +40 -3
- 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/errors.d.ts +57 -1
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +12 -2
- 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'));
|
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
|
@@ -35,16 +35,26 @@
|
|
|
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.1";
|
|
39
39
|
export { EmbeddedDatabase, EmbeddedDatabaseConfig } from './embedded';
|
|
40
40
|
export { EmbeddedTransaction } from './embedded';
|
|
41
41
|
export { EmbeddedDatabase as Database } from './embedded';
|
|
42
|
+
export { Namespace, Collection, DistanceMetric, NamespaceNotFoundError, NamespaceExistsError, CollectionNotFoundError, CollectionExistsError, } from './namespace';
|
|
43
|
+
export type { NamespaceConfig, CollectionConfig, SearchRequest, SearchResult as NamespaceSearchResult, } from './namespace';
|
|
44
|
+
export { PriorityQueue, TaskState, createQueue, } from './queue';
|
|
45
|
+
export type { QueueConfig, QueueKey, Task, QueueStats, } from './queue';
|
|
46
|
+
export { SemanticCache, } from './semantic-cache';
|
|
47
|
+
export type { CacheEntry, CacheHit, CacheStats, } from './semantic-cache';
|
|
48
|
+
export { ContextQueryBuilder, ContextOutputFormat, TruncationStrategy, createContextBuilder, } from './context-builder';
|
|
49
|
+
export type { ContextResult, } from './context-builder';
|
|
50
|
+
export { ExtractionPipeline, Consolidator, HybridRetriever, AllowedSet, NamespacePolicy, } from './memory';
|
|
51
|
+
export type { Entity, Relation, Assertion, RawAssertion, CanonicalFact, ExtractionResult, ExtractionSchema, ConsolidationConfig, RetrievalConfig, RetrievalResult, RetrievalResponse, NamespaceGrant, } from './memory';
|
|
42
52
|
export { SochDBClient } from './grpc-client';
|
|
43
53
|
export type { SearchResult, Document, GraphNode, GraphEdge, } from './grpc-client';
|
|
44
54
|
export { IpcClient } from './ipc-client';
|
|
45
55
|
export { WireFormat, ContextFormat, CanonicalFormat, FormatCapabilities, FormatConversionError, } from './format';
|
|
46
56
|
export { Query } from './query';
|
|
47
57
|
export type { QueryResult } from './query';
|
|
48
|
-
export { SochDBError, ConnectionError, TransactionError, ProtocolError, DatabaseError, } from './errors';
|
|
58
|
+
export { SochDBError, ConnectionError, TransactionError, ProtocolError, DatabaseError, ErrorCode, LockError, DatabaseLockedError, LockTimeoutError, EpochMismatchError, SplitBrainError, } from './errors';
|
|
49
59
|
export { SochDBClient as GrpcClient } from './grpc-client';
|
|
50
60
|
//# 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;AAGjD,OAAO,EAAE,gBAAgB,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG1D,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,
|
|
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;AAGjD,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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consolidator for Memory System
|
|
3
|
+
*
|
|
4
|
+
* Event-sourced consolidation with append-only events and derived canonical facts.
|
|
5
|
+
*/
|
|
6
|
+
import { EmbeddedDatabase } from '../embedded';
|
|
7
|
+
import { RawAssertion, CanonicalFact, ConsolidationConfig } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Consolidator for managing facts
|
|
10
|
+
*/
|
|
11
|
+
export declare class Consolidator {
|
|
12
|
+
private db;
|
|
13
|
+
private namespace;
|
|
14
|
+
private config;
|
|
15
|
+
private prefix;
|
|
16
|
+
constructor(db: EmbeddedDatabase, namespace: string, config?: ConsolidationConfig);
|
|
17
|
+
/**
|
|
18
|
+
* Create consolidator from database
|
|
19
|
+
*/
|
|
20
|
+
static fromDatabase(db: EmbeddedDatabase, namespace: string, config?: ConsolidationConfig): Consolidator;
|
|
21
|
+
/**
|
|
22
|
+
* Add a raw assertion (immutable event)
|
|
23
|
+
*/
|
|
24
|
+
add(assertion: RawAssertion): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* Add assertion with contradiction handling
|
|
27
|
+
*/
|
|
28
|
+
addWithContradiction(newAssertion: RawAssertion, contradicts: string[]): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Run consolidation to update canonical view
|
|
31
|
+
*/
|
|
32
|
+
consolidate(): Promise<number>;
|
|
33
|
+
/**
|
|
34
|
+
* Get canonical facts
|
|
35
|
+
*/
|
|
36
|
+
getCanonicalFacts(): Promise<CanonicalFact[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Explain provenance of a fact
|
|
39
|
+
*/
|
|
40
|
+
explain(factId: string): Promise<{
|
|
41
|
+
evidenceCount: number;
|
|
42
|
+
sources: string[];
|
|
43
|
+
confidence: number;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Get all raw assertions
|
|
47
|
+
*/
|
|
48
|
+
private getAllAssertions;
|
|
49
|
+
/**
|
|
50
|
+
* Get all contradictions
|
|
51
|
+
*/
|
|
52
|
+
private getContradictions;
|
|
53
|
+
/**
|
|
54
|
+
* Merge confidence from multiple assertions
|
|
55
|
+
*/
|
|
56
|
+
private mergeConfidence;
|
|
57
|
+
/**
|
|
58
|
+
* Generate deterministic assertion ID
|
|
59
|
+
*/
|
|
60
|
+
private generateAssertionId;
|
|
61
|
+
/**
|
|
62
|
+
* Generate deterministic canonical fact ID
|
|
63
|
+
*/
|
|
64
|
+
private generateCanonicalId;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=consolidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../../../src/memory/consolidation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAGjB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAS;gBAEX,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAWjF;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,YAAY;IAIxG;;OAEG;IACG,GAAG,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBnD;;OAEG;IACG,oBAAoB,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB9F;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IA0DpC;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAWnD;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBxG;;OAEG;YACW,gBAAgB;IAW9B;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extraction Pipeline for Memory System
|
|
3
|
+
*
|
|
4
|
+
* Compiles LLM outputs into typed, validated facts (Entity, Relation, Assertion).
|
|
5
|
+
*/
|
|
6
|
+
import { EmbeddedDatabase } from '../embedded';
|
|
7
|
+
import { Entity, Relation, Assertion, ExtractionResult, ExtractionSchema } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Extractor function type - user provides this to call their LLM
|
|
10
|
+
*/
|
|
11
|
+
export type ExtractorFunction = (text: string) => Promise<{
|
|
12
|
+
entities?: Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
entity_type: string;
|
|
15
|
+
properties?: Record<string, any>;
|
|
16
|
+
confidence?: number;
|
|
17
|
+
}>;
|
|
18
|
+
relations?: Array<{
|
|
19
|
+
from_entity: string;
|
|
20
|
+
relation_type: string;
|
|
21
|
+
to_entity: string;
|
|
22
|
+
properties?: Record<string, any>;
|
|
23
|
+
confidence?: number;
|
|
24
|
+
}>;
|
|
25
|
+
assertions?: Array<{
|
|
26
|
+
subject: string;
|
|
27
|
+
predicate: string;
|
|
28
|
+
object: string;
|
|
29
|
+
confidence?: number;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Extraction Pipeline
|
|
34
|
+
*/
|
|
35
|
+
export declare class ExtractionPipeline {
|
|
36
|
+
private db;
|
|
37
|
+
private namespace;
|
|
38
|
+
private schema?;
|
|
39
|
+
private prefix;
|
|
40
|
+
constructor(db: EmbeddedDatabase, namespace: string, schema?: ExtractionSchema);
|
|
41
|
+
/**
|
|
42
|
+
* Create pipeline from database
|
|
43
|
+
*/
|
|
44
|
+
static fromDatabase(db: EmbeddedDatabase, namespace: string, schema?: ExtractionSchema): ExtractionPipeline;
|
|
45
|
+
/**
|
|
46
|
+
* Extract entities and relations from text
|
|
47
|
+
*/
|
|
48
|
+
extract(text: string, extractor: ExtractorFunction): Promise<ExtractionResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Extract and immediately commit to database
|
|
51
|
+
*/
|
|
52
|
+
extractAndCommit(text: string, extractor: ExtractorFunction): Promise<ExtractionResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Commit extraction result to database
|
|
55
|
+
*/
|
|
56
|
+
commit(result: ExtractionResult): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Get all entities
|
|
59
|
+
*/
|
|
60
|
+
getEntities(): Promise<Entity[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Get all relations
|
|
63
|
+
*/
|
|
64
|
+
getRelations(): Promise<Relation[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Get all assertions
|
|
67
|
+
*/
|
|
68
|
+
getAssertions(): Promise<Assertion[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Generate deterministic entity ID
|
|
71
|
+
*/
|
|
72
|
+
private generateEntityId;
|
|
73
|
+
/**
|
|
74
|
+
* Generate deterministic relation ID
|
|
75
|
+
*/
|
|
76
|
+
private generateRelationId;
|
|
77
|
+
/**
|
|
78
|
+
* Generate deterministic assertion ID
|
|
79
|
+
*/
|
|
80
|
+
private generateAssertionId;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=extraction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction.d.ts","sourceRoot":"","sources":["../../../src/memory/extraction.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,MAAM,EACN,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAGjB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACxD,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/G,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5I,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjG,CAAC,CAAC;AAEH;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAS;gBAEX,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB;IAO9E;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,kBAAkB;IAI3G;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwEpF;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAM7F;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAWtC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAWzC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAW3C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}
|