@opensaas/stack-rag 0.1.6
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/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +10 -0
- package/CLAUDE.md +565 -0
- package/LICENSE +21 -0
- package/README.md +406 -0
- package/dist/config/index.d.ts +63 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +94 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/plugin.d.ts +38 -0
- package/dist/config/plugin.d.ts.map +1 -0
- package/dist/config/plugin.js +215 -0
- package/dist/config/plugin.js.map +1 -0
- package/dist/config/plugin.test.d.ts +2 -0
- package/dist/config/plugin.test.d.ts.map +1 -0
- package/dist/config/plugin.test.js +554 -0
- package/dist/config/plugin.test.js.map +1 -0
- package/dist/config/types.d.ts +249 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/fields/embedding.d.ts +85 -0
- package/dist/fields/embedding.d.ts.map +1 -0
- package/dist/fields/embedding.js +81 -0
- package/dist/fields/embedding.js.map +1 -0
- package/dist/fields/embedding.test.d.ts +2 -0
- package/dist/fields/embedding.test.d.ts.map +1 -0
- package/dist/fields/embedding.test.js +323 -0
- package/dist/fields/embedding.test.js.map +1 -0
- package/dist/fields/index.d.ts +6 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.js +5 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +19 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +18 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/providers/index.d.ts +38 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +68 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +49 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +151 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +41 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +126 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/providers.test.d.ts +2 -0
- package/dist/providers/providers.test.d.ts.map +1 -0
- package/dist/providers/providers.test.js +224 -0
- package/dist/providers/providers.test.js.map +1 -0
- package/dist/providers/types.d.ts +88 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/runtime/batch.d.ts +183 -0
- package/dist/runtime/batch.d.ts.map +1 -0
- package/dist/runtime/batch.js +240 -0
- package/dist/runtime/batch.js.map +1 -0
- package/dist/runtime/batch.test.d.ts +2 -0
- package/dist/runtime/batch.test.d.ts.map +1 -0
- package/dist/runtime/batch.test.js +251 -0
- package/dist/runtime/batch.test.js.map +1 -0
- package/dist/runtime/chunking.d.ts +42 -0
- package/dist/runtime/chunking.d.ts.map +1 -0
- package/dist/runtime/chunking.js +264 -0
- package/dist/runtime/chunking.js.map +1 -0
- package/dist/runtime/chunking.test.d.ts +2 -0
- package/dist/runtime/chunking.test.d.ts.map +1 -0
- package/dist/runtime/chunking.test.js +212 -0
- package/dist/runtime/chunking.test.js.map +1 -0
- package/dist/runtime/embeddings.d.ts +147 -0
- package/dist/runtime/embeddings.d.ts.map +1 -0
- package/dist/runtime/embeddings.js +201 -0
- package/dist/runtime/embeddings.js.map +1 -0
- package/dist/runtime/embeddings.test.d.ts +2 -0
- package/dist/runtime/embeddings.test.d.ts.map +1 -0
- package/dist/runtime/embeddings.test.js +366 -0
- package/dist/runtime/embeddings.test.js.map +1 -0
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +18 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/search.d.ts +135 -0
- package/dist/runtime/search.d.ts.map +1 -0
- package/dist/runtime/search.js +101 -0
- package/dist/runtime/search.js.map +1 -0
- package/dist/storage/index.d.ts +41 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +73 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/json.d.ts +34 -0
- package/dist/storage/json.d.ts.map +1 -0
- package/dist/storage/json.js +82 -0
- package/dist/storage/json.js.map +1 -0
- package/dist/storage/pgvector.d.ts +53 -0
- package/dist/storage/pgvector.d.ts.map +1 -0
- package/dist/storage/pgvector.js +168 -0
- package/dist/storage/pgvector.js.map +1 -0
- package/dist/storage/sqlite-vss.d.ts +49 -0
- package/dist/storage/sqlite-vss.d.ts.map +1 -0
- package/dist/storage/sqlite-vss.js +148 -0
- package/dist/storage/sqlite-vss.js.map +1 -0
- package/dist/storage/storage.test.d.ts +2 -0
- package/dist/storage/storage.test.d.ts.map +1 -0
- package/dist/storage/storage.test.js +440 -0
- package/dist/storage/storage.test.js.map +1 -0
- package/dist/storage/types.d.ts +79 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +49 -0
- package/dist/storage/types.js.map +1 -0
- package/package.json +82 -0
- package/src/config/index.ts +116 -0
- package/src/config/plugin.test.ts +664 -0
- package/src/config/plugin.ts +257 -0
- package/src/config/types.ts +283 -0
- package/src/fields/embedding.test.ts +408 -0
- package/src/fields/embedding.ts +150 -0
- package/src/fields/index.ts +6 -0
- package/src/index.ts +33 -0
- package/src/mcp/index.ts +21 -0
- package/src/providers/index.ts +81 -0
- package/src/providers/ollama.ts +186 -0
- package/src/providers/openai.ts +161 -0
- package/src/providers/providers.test.ts +275 -0
- package/src/providers/types.ts +100 -0
- package/src/runtime/batch.test.ts +332 -0
- package/src/runtime/batch.ts +424 -0
- package/src/runtime/chunking.test.ts +258 -0
- package/src/runtime/chunking.ts +334 -0
- package/src/runtime/embeddings.test.ts +441 -0
- package/src/runtime/embeddings.ts +380 -0
- package/src/runtime/index.ts +51 -0
- package/src/runtime/search.ts +243 -0
- package/src/storage/index.ts +86 -0
- package/src/storage/json.ts +106 -0
- package/src/storage/pgvector.ts +206 -0
- package/src/storage/sqlite-vss.ts +193 -0
- package/src/storage/storage.test.ts +521 -0
- package/src/storage/types.ts +126 -0
- package/tsconfig.json +13 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vitest.config.ts +18 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { generateEmbedding, generateEmbeddings, shouldRegenerateEmbedding, hashText, validateEmbeddingDimensions, mergeEmbeddings, } from './embeddings.js';
|
|
3
|
+
// Mock embedding provider
|
|
4
|
+
function createMockProvider() {
|
|
5
|
+
return {
|
|
6
|
+
type: 'mock',
|
|
7
|
+
model: 'mock-model',
|
|
8
|
+
dimensions: 3,
|
|
9
|
+
embed: vi.fn(async (text) => {
|
|
10
|
+
// Return simple mock vector based on text length
|
|
11
|
+
return [text.length / 10, text.length / 20, text.length / 30];
|
|
12
|
+
}),
|
|
13
|
+
embedBatch: vi.fn(async (texts) => {
|
|
14
|
+
return texts.map((text) => [text.length / 10, text.length / 20, text.length / 30]);
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
describe('generateEmbedding', () => {
|
|
19
|
+
it('should generate single embedding without chunking', async () => {
|
|
20
|
+
const provider = createMockProvider();
|
|
21
|
+
const embedding = await generateEmbedding({
|
|
22
|
+
provider,
|
|
23
|
+
text: 'Hello world',
|
|
24
|
+
enableChunking: false,
|
|
25
|
+
});
|
|
26
|
+
expect(embedding).toHaveProperty('vector');
|
|
27
|
+
expect(embedding).toHaveProperty('metadata');
|
|
28
|
+
expect(embedding.vector).toHaveLength(3);
|
|
29
|
+
expect(embedding.metadata.model).toBe('mock-model');
|
|
30
|
+
expect(embedding.metadata.provider).toBe('mock');
|
|
31
|
+
expect(embedding.metadata.dimensions).toBe(3);
|
|
32
|
+
expect(embedding.metadata.sourceHash).toBeDefined();
|
|
33
|
+
});
|
|
34
|
+
it('should generate chunked embeddings with chunking enabled', async () => {
|
|
35
|
+
const provider = createMockProvider();
|
|
36
|
+
const longText = 'A'.repeat(1000);
|
|
37
|
+
const chunkedEmbeddings = await generateEmbedding({
|
|
38
|
+
provider,
|
|
39
|
+
text: longText,
|
|
40
|
+
enableChunking: true,
|
|
41
|
+
chunking: { chunkSize: 200, chunkOverlap: 0 },
|
|
42
|
+
});
|
|
43
|
+
expect(Array.isArray(chunkedEmbeddings)).toBe(true);
|
|
44
|
+
expect(chunkedEmbeddings.length).toBeGreaterThan(1);
|
|
45
|
+
for (const chunked of chunkedEmbeddings) {
|
|
46
|
+
expect(chunked).toHaveProperty('chunk');
|
|
47
|
+
expect(chunked).toHaveProperty('embedding');
|
|
48
|
+
expect(chunked.embedding.vector).toHaveLength(3);
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
|
+
expect(chunked.embedding.metadata.chunkIndex).toBeDefined();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
it('should include source hash when enabled', async () => {
|
|
54
|
+
const provider = createMockProvider();
|
|
55
|
+
const text = 'Test text';
|
|
56
|
+
const embedding = await generateEmbedding({
|
|
57
|
+
provider,
|
|
58
|
+
text,
|
|
59
|
+
includeSourceHash: true,
|
|
60
|
+
});
|
|
61
|
+
expect(embedding.metadata.sourceHash).toBeDefined();
|
|
62
|
+
expect(typeof embedding.metadata.sourceHash).toBe('string');
|
|
63
|
+
expect(embedding.metadata.sourceHash).toHaveLength(64); // SHA-256 hex
|
|
64
|
+
});
|
|
65
|
+
it('should exclude source hash when disabled', async () => {
|
|
66
|
+
const provider = createMockProvider();
|
|
67
|
+
const text = 'Test text';
|
|
68
|
+
const embedding = await generateEmbedding({
|
|
69
|
+
provider,
|
|
70
|
+
text,
|
|
71
|
+
includeSourceHash: false,
|
|
72
|
+
});
|
|
73
|
+
expect(embedding.metadata.sourceHash).toBeUndefined();
|
|
74
|
+
});
|
|
75
|
+
it('should include additional metadata', async () => {
|
|
76
|
+
const provider = createMockProvider();
|
|
77
|
+
const embedding = await generateEmbedding({
|
|
78
|
+
provider,
|
|
79
|
+
text: 'Test',
|
|
80
|
+
metadata: { customField: 'customValue' },
|
|
81
|
+
});
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
|
+
expect(embedding.metadata.customField).toBe('customValue');
|
|
84
|
+
});
|
|
85
|
+
it('should call provider.embed for single embedding', async () => {
|
|
86
|
+
const provider = createMockProvider();
|
|
87
|
+
await generateEmbedding({
|
|
88
|
+
provider,
|
|
89
|
+
text: 'Test',
|
|
90
|
+
enableChunking: false,
|
|
91
|
+
});
|
|
92
|
+
expect(provider.embed).toHaveBeenCalledWith('Test');
|
|
93
|
+
});
|
|
94
|
+
it('should call provider.embedBatch for chunked embedding', async () => {
|
|
95
|
+
const provider = createMockProvider();
|
|
96
|
+
await generateEmbedding({
|
|
97
|
+
provider,
|
|
98
|
+
text: 'A'.repeat(1000),
|
|
99
|
+
enableChunking: true,
|
|
100
|
+
chunking: { chunkSize: 200, chunkOverlap: 50 },
|
|
101
|
+
});
|
|
102
|
+
expect(provider.embedBatch).toHaveBeenCalled();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe('generateEmbeddings', () => {
|
|
106
|
+
it('should generate embeddings for multiple texts', async () => {
|
|
107
|
+
const provider = createMockProvider();
|
|
108
|
+
const texts = ['Text 1', 'Text 2', 'Text 3'];
|
|
109
|
+
const embeddings = await generateEmbeddings({
|
|
110
|
+
provider,
|
|
111
|
+
texts,
|
|
112
|
+
});
|
|
113
|
+
expect(embeddings).toHaveLength(3);
|
|
114
|
+
for (const embedding of embeddings) {
|
|
115
|
+
expect(embedding.vector).toHaveLength(3);
|
|
116
|
+
expect(embedding.metadata.model).toBe('mock-model');
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
it('should process texts in batches', async () => {
|
|
120
|
+
const provider = createMockProvider();
|
|
121
|
+
const texts = Array(25).fill('Test');
|
|
122
|
+
await generateEmbeddings({
|
|
123
|
+
provider,
|
|
124
|
+
texts,
|
|
125
|
+
batchSize: 10,
|
|
126
|
+
});
|
|
127
|
+
// Should be called 3 times (10 + 10 + 5)
|
|
128
|
+
expect(provider.embedBatch).toHaveBeenCalledTimes(3);
|
|
129
|
+
});
|
|
130
|
+
it('should include source hashes for all embeddings', async () => {
|
|
131
|
+
const provider = createMockProvider();
|
|
132
|
+
const texts = ['Text 1', 'Text 2', 'Text 3'];
|
|
133
|
+
const embeddings = await generateEmbeddings({
|
|
134
|
+
provider,
|
|
135
|
+
texts,
|
|
136
|
+
includeSourceHash: true,
|
|
137
|
+
});
|
|
138
|
+
for (const embedding of embeddings) {
|
|
139
|
+
expect(embedding.metadata.sourceHash).toBeDefined();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
it('should handle empty text array', async () => {
|
|
143
|
+
const provider = createMockProvider();
|
|
144
|
+
const embeddings = await generateEmbeddings({
|
|
145
|
+
provider,
|
|
146
|
+
texts: [],
|
|
147
|
+
});
|
|
148
|
+
expect(embeddings).toHaveLength(0);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('shouldRegenerateEmbedding', () => {
|
|
152
|
+
it('should return true when no existing embedding', () => {
|
|
153
|
+
const result = shouldRegenerateEmbedding('New text', null);
|
|
154
|
+
expect(result).toBe(true);
|
|
155
|
+
});
|
|
156
|
+
it('should return true when source text changed', () => {
|
|
157
|
+
const embedding = {
|
|
158
|
+
vector: [1, 2, 3],
|
|
159
|
+
metadata: {
|
|
160
|
+
model: 'test',
|
|
161
|
+
provider: 'test',
|
|
162
|
+
dimensions: 3,
|
|
163
|
+
generatedAt: new Date().toISOString(),
|
|
164
|
+
sourceHash: hashText('Old text'),
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
const result = shouldRegenerateEmbedding('New text', embedding);
|
|
168
|
+
expect(result).toBe(true);
|
|
169
|
+
});
|
|
170
|
+
it('should return false when source text unchanged', () => {
|
|
171
|
+
const text = 'Same text';
|
|
172
|
+
const embedding = {
|
|
173
|
+
vector: [1, 2, 3],
|
|
174
|
+
metadata: {
|
|
175
|
+
model: 'test',
|
|
176
|
+
provider: 'test',
|
|
177
|
+
dimensions: 3,
|
|
178
|
+
generatedAt: new Date().toISOString(),
|
|
179
|
+
sourceHash: hashText(text),
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
const result = shouldRegenerateEmbedding(text, embedding);
|
|
183
|
+
expect(result).toBe(false);
|
|
184
|
+
});
|
|
185
|
+
it('should return false when no source hash in metadata', () => {
|
|
186
|
+
const embedding = {
|
|
187
|
+
vector: [1, 2, 3],
|
|
188
|
+
metadata: {
|
|
189
|
+
model: 'test',
|
|
190
|
+
provider: 'test',
|
|
191
|
+
dimensions: 3,
|
|
192
|
+
generatedAt: new Date().toISOString(),
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
const result = shouldRegenerateEmbedding('Any text', embedding);
|
|
196
|
+
expect(result).toBe(false); // Conservative: don't regenerate if we can't tell
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe('hashText', () => {
|
|
200
|
+
it('should generate consistent hash for same text', () => {
|
|
201
|
+
const text = 'Test text';
|
|
202
|
+
const hash1 = hashText(text);
|
|
203
|
+
const hash2 = hashText(text);
|
|
204
|
+
expect(hash1).toBe(hash2);
|
|
205
|
+
});
|
|
206
|
+
it('should generate different hashes for different text', () => {
|
|
207
|
+
const hash1 = hashText('Text 1');
|
|
208
|
+
const hash2 = hashText('Text 2');
|
|
209
|
+
expect(hash1).not.toBe(hash2);
|
|
210
|
+
});
|
|
211
|
+
it('should generate SHA-256 hex string', () => {
|
|
212
|
+
const hash = hashText('Test');
|
|
213
|
+
expect(hash).toMatch(/^[0-9a-f]{64}$/);
|
|
214
|
+
});
|
|
215
|
+
it('should be case-sensitive', () => {
|
|
216
|
+
const hash1 = hashText('Test');
|
|
217
|
+
const hash2 = hashText('test');
|
|
218
|
+
expect(hash1).not.toBe(hash2);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
describe('validateEmbeddingDimensions', () => {
|
|
222
|
+
it('should pass validation for correct dimensions', () => {
|
|
223
|
+
const embedding = {
|
|
224
|
+
vector: [1, 2, 3],
|
|
225
|
+
metadata: {
|
|
226
|
+
model: 'test',
|
|
227
|
+
provider: 'test',
|
|
228
|
+
dimensions: 3,
|
|
229
|
+
generatedAt: new Date().toISOString(),
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
expect(() => {
|
|
233
|
+
validateEmbeddingDimensions(embedding, 3);
|
|
234
|
+
}).not.toThrow();
|
|
235
|
+
});
|
|
236
|
+
it('should throw error for dimension mismatch', () => {
|
|
237
|
+
const embedding = {
|
|
238
|
+
vector: [1, 2, 3],
|
|
239
|
+
metadata: {
|
|
240
|
+
model: 'test',
|
|
241
|
+
provider: 'test',
|
|
242
|
+
dimensions: 3,
|
|
243
|
+
generatedAt: new Date().toISOString(),
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
expect(() => {
|
|
247
|
+
validateEmbeddingDimensions(embedding, 5);
|
|
248
|
+
}).toThrow('Embedding dimension mismatch: expected 5, got 3');
|
|
249
|
+
});
|
|
250
|
+
it('should throw error for metadata dimension mismatch', () => {
|
|
251
|
+
const embedding = {
|
|
252
|
+
vector: [1, 2, 3],
|
|
253
|
+
metadata: {
|
|
254
|
+
model: 'test',
|
|
255
|
+
provider: 'test',
|
|
256
|
+
dimensions: 5, // Wrong metadata
|
|
257
|
+
generatedAt: new Date().toISOString(),
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
expect(() => {
|
|
261
|
+
validateEmbeddingDimensions(embedding, 3);
|
|
262
|
+
}).toThrow('Embedding metadata dimension mismatch');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('mergeEmbeddings', () => {
|
|
266
|
+
it('should merge embeddings using average pooling', () => {
|
|
267
|
+
const embeddings = [
|
|
268
|
+
{
|
|
269
|
+
vector: [1, 2, 3],
|
|
270
|
+
metadata: {
|
|
271
|
+
model: 'test',
|
|
272
|
+
provider: 'test',
|
|
273
|
+
dimensions: 3,
|
|
274
|
+
generatedAt: new Date().toISOString(),
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
vector: [3, 4, 5],
|
|
279
|
+
metadata: {
|
|
280
|
+
model: 'test',
|
|
281
|
+
provider: 'test',
|
|
282
|
+
dimensions: 3,
|
|
283
|
+
generatedAt: new Date().toISOString(),
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
];
|
|
287
|
+
const merged = mergeEmbeddings(embeddings, 'average');
|
|
288
|
+
expect(merged.vector).toEqual([2, 3, 4]); // Average of [1,2,3] and [3,4,5]
|
|
289
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
290
|
+
expect(merged.metadata.mergedFrom).toBe(2);
|
|
291
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
292
|
+
expect(merged.metadata.mergeMethod).toBe('average');
|
|
293
|
+
});
|
|
294
|
+
it('should merge embeddings using max pooling', () => {
|
|
295
|
+
const embeddings = [
|
|
296
|
+
{
|
|
297
|
+
vector: [1, 5, 3],
|
|
298
|
+
metadata: {
|
|
299
|
+
model: 'test',
|
|
300
|
+
provider: 'test',
|
|
301
|
+
dimensions: 3,
|
|
302
|
+
generatedAt: new Date().toISOString(),
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
vector: [4, 2, 6],
|
|
307
|
+
metadata: {
|
|
308
|
+
model: 'test',
|
|
309
|
+
provider: 'test',
|
|
310
|
+
dimensions: 3,
|
|
311
|
+
generatedAt: new Date().toISOString(),
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
];
|
|
315
|
+
const merged = mergeEmbeddings(embeddings, 'max');
|
|
316
|
+
expect(merged.vector).toEqual([4, 5, 6]); // Max of each dimension
|
|
317
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
318
|
+
expect(merged.metadata.mergeMethod).toBe('max');
|
|
319
|
+
});
|
|
320
|
+
it('should return single embedding if array has one item', () => {
|
|
321
|
+
const embeddings = [
|
|
322
|
+
{
|
|
323
|
+
vector: [1, 2, 3],
|
|
324
|
+
metadata: {
|
|
325
|
+
model: 'test',
|
|
326
|
+
provider: 'test',
|
|
327
|
+
dimensions: 3,
|
|
328
|
+
generatedAt: new Date().toISOString(),
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
];
|
|
332
|
+
const merged = mergeEmbeddings(embeddings);
|
|
333
|
+
expect(merged).toBe(embeddings[0]);
|
|
334
|
+
});
|
|
335
|
+
it('should throw error for empty array', () => {
|
|
336
|
+
expect(() => {
|
|
337
|
+
mergeEmbeddings([]);
|
|
338
|
+
}).toThrow('Cannot merge empty array of embeddings');
|
|
339
|
+
});
|
|
340
|
+
it('should throw error for dimension mismatch', () => {
|
|
341
|
+
const embeddings = [
|
|
342
|
+
{
|
|
343
|
+
vector: [1, 2, 3],
|
|
344
|
+
metadata: {
|
|
345
|
+
model: 'test',
|
|
346
|
+
provider: 'test',
|
|
347
|
+
dimensions: 3,
|
|
348
|
+
generatedAt: new Date().toISOString(),
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
vector: [1, 2], // Different dimensions
|
|
353
|
+
metadata: {
|
|
354
|
+
model: 'test',
|
|
355
|
+
provider: 'test',
|
|
356
|
+
dimensions: 2,
|
|
357
|
+
generatedAt: new Date().toISOString(),
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
];
|
|
361
|
+
expect(() => {
|
|
362
|
+
mergeEmbeddings(embeddings);
|
|
363
|
+
}).toThrow('Cannot merge embeddings with different dimensions');
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
//# sourceMappingURL=embeddings.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.test.js","sourceRoot":"","sources":["../../src/runtime/embeddings.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime utilities for RAG operations
|
|
3
|
+
*
|
|
4
|
+
* This module provides high-level APIs for:
|
|
5
|
+
* - Text chunking
|
|
6
|
+
* - Embedding generation
|
|
7
|
+
* - Semantic search
|
|
8
|
+
* - Batch processing with rate limiting
|
|
9
|
+
*/
|
|
10
|
+
export { chunkText, estimateTokenCount, mergeSmallChunks, type ChunkingStrategy, type ChunkingOptions, type TextChunk, } from './chunking.js';
|
|
11
|
+
export { generateEmbedding, generateEmbeddings, shouldRegenerateEmbedding, hashText, validateEmbeddingDimensions, mergeEmbeddings, type GenerateEmbeddingOptions, type GenerateEmbeddingsOptions, type ChunkedEmbedding, } from './embeddings.js';
|
|
12
|
+
export { semanticSearch, findSimilar, type SemanticSearchOptions, type FindSimilarOptions, } from './search.js';
|
|
13
|
+
export { batchProcess, RateLimiter, ProcessingQueue, type BatchProcessOptions, type BatchProgress, type BatchError, type BatchProcessResult, } from './batch.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,SAAS,GACf,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,QAAQ,EACR,2BAA2B,EAC3B,eAAe,EACf,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,cAAc,EACd,WAAW,EACX,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime utilities for RAG operations
|
|
3
|
+
*
|
|
4
|
+
* This module provides high-level APIs for:
|
|
5
|
+
* - Text chunking
|
|
6
|
+
* - Embedding generation
|
|
7
|
+
* - Semantic search
|
|
8
|
+
* - Batch processing with rate limiting
|
|
9
|
+
*/
|
|
10
|
+
// Text chunking
|
|
11
|
+
export { chunkText, estimateTokenCount, mergeSmallChunks, } from './chunking.js';
|
|
12
|
+
// Embedding generation
|
|
13
|
+
export { generateEmbedding, generateEmbeddings, shouldRegenerateEmbedding, hashText, validateEmbeddingDimensions, mergeEmbeddings, } from './embeddings.js';
|
|
14
|
+
// Semantic search
|
|
15
|
+
export { semanticSearch, findSimilar, } from './search.js';
|
|
16
|
+
// Batch processing
|
|
17
|
+
export { batchProcess, RateLimiter, ProcessingQueue, } from './batch.js';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,gBAAgB;AAChB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,gBAAgB,GAIjB,MAAM,eAAe,CAAA;AAEtB,uBAAuB;AACvB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,QAAQ,EACR,2BAA2B,EAC3B,eAAe,GAIhB,MAAM,iBAAiB,CAAA;AAExB,kBAAkB;AAClB,OAAO,EACL,cAAc,EACd,WAAW,GAGZ,MAAM,aAAa,CAAA;AAEpB,mBAAmB;AACnB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,GAKhB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level semantic search APIs
|
|
3
|
+
*/
|
|
4
|
+
import type { AccessContext } from '@opensaas/stack-core';
|
|
5
|
+
import type { SearchResult } from '../config/types.js';
|
|
6
|
+
import type { EmbeddingProvider } from '../providers/types.js';
|
|
7
|
+
import type { VectorStorage } from '../storage/types.js';
|
|
8
|
+
export interface SemanticSearchOptions {
|
|
9
|
+
/**
|
|
10
|
+
* List key to search (e.g., 'Article', 'Post')
|
|
11
|
+
*/
|
|
12
|
+
listKey: string;
|
|
13
|
+
/**
|
|
14
|
+
* Field name containing embeddings
|
|
15
|
+
*/
|
|
16
|
+
fieldName: string;
|
|
17
|
+
/**
|
|
18
|
+
* Natural language query text
|
|
19
|
+
*/
|
|
20
|
+
query: string;
|
|
21
|
+
/**
|
|
22
|
+
* Embedding provider to use for query embedding
|
|
23
|
+
*/
|
|
24
|
+
provider: EmbeddingProvider;
|
|
25
|
+
/**
|
|
26
|
+
* Vector storage backend to use for search
|
|
27
|
+
*/
|
|
28
|
+
storage: VectorStorage;
|
|
29
|
+
/**
|
|
30
|
+
* Access context for enforcing access control
|
|
31
|
+
*/
|
|
32
|
+
context: AccessContext;
|
|
33
|
+
/**
|
|
34
|
+
* Maximum number of results to return
|
|
35
|
+
* @default 10
|
|
36
|
+
*/
|
|
37
|
+
limit?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Minimum similarity score (0-1)
|
|
40
|
+
* @default 0.0
|
|
41
|
+
*/
|
|
42
|
+
minScore?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Additional Prisma where clause to filter results
|
|
45
|
+
*/
|
|
46
|
+
where?: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Perform semantic search using natural language query
|
|
50
|
+
*
|
|
51
|
+
* This is a high-level API that:
|
|
52
|
+
* 1. Generates embedding for the query text
|
|
53
|
+
* 2. Searches for similar vectors in the database
|
|
54
|
+
* 3. Enforces access control
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* const results = await semanticSearch({
|
|
59
|
+
* listKey: 'Article',
|
|
60
|
+
* fieldName: 'contentEmbedding',
|
|
61
|
+
* query: 'articles about machine learning',
|
|
62
|
+
* provider: createEmbeddingProvider({ type: 'openai', apiKey: '...' }),
|
|
63
|
+
* storage: createVectorStorage({ type: 'pgvector' }),
|
|
64
|
+
* context: await getContext(),
|
|
65
|
+
* limit: 10,
|
|
66
|
+
* minScore: 0.7,
|
|
67
|
+
* })
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function semanticSearch<T = unknown>(options: SemanticSearchOptions): Promise<SearchResult<T>[]>;
|
|
71
|
+
export interface FindSimilarOptions {
|
|
72
|
+
/**
|
|
73
|
+
* List key to search (e.g., 'Article', 'Post')
|
|
74
|
+
*/
|
|
75
|
+
listKey: string;
|
|
76
|
+
/**
|
|
77
|
+
* Field name containing embeddings
|
|
78
|
+
*/
|
|
79
|
+
fieldName: string;
|
|
80
|
+
/**
|
|
81
|
+
* ID of the item to find similar items for
|
|
82
|
+
*/
|
|
83
|
+
itemId: string;
|
|
84
|
+
/**
|
|
85
|
+
* Vector storage backend to use for search
|
|
86
|
+
*/
|
|
87
|
+
storage: VectorStorage;
|
|
88
|
+
/**
|
|
89
|
+
* Access context for enforcing access control
|
|
90
|
+
*/
|
|
91
|
+
context: AccessContext;
|
|
92
|
+
/**
|
|
93
|
+
* Maximum number of results to return
|
|
94
|
+
* @default 10
|
|
95
|
+
*/
|
|
96
|
+
limit?: number;
|
|
97
|
+
/**
|
|
98
|
+
* Minimum similarity score (0-1)
|
|
99
|
+
* @default 0.0
|
|
100
|
+
*/
|
|
101
|
+
minScore?: number;
|
|
102
|
+
/**
|
|
103
|
+
* Whether to exclude the source item from results
|
|
104
|
+
* @default true
|
|
105
|
+
*/
|
|
106
|
+
excludeSelf?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Additional Prisma where clause to filter results
|
|
109
|
+
*/
|
|
110
|
+
where?: Record<string, unknown>;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Find items similar to a given item by ID
|
|
114
|
+
*
|
|
115
|
+
* This is a high-level API that:
|
|
116
|
+
* 1. Fetches the embedding of the source item
|
|
117
|
+
* 2. Searches for similar vectors in the database
|
|
118
|
+
* 3. Enforces access control
|
|
119
|
+
* 4. Optionally excludes the source item from results
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const similar = await findSimilar({
|
|
124
|
+
* listKey: 'Article',
|
|
125
|
+
* fieldName: 'contentEmbedding',
|
|
126
|
+
* itemId: 'article-123',
|
|
127
|
+
* storage: createVectorStorage({ type: 'pgvector' }),
|
|
128
|
+
* context: await getContext(),
|
|
129
|
+
* limit: 5,
|
|
130
|
+
* excludeSelf: true,
|
|
131
|
+
* })
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export declare function findSimilar<T = unknown>(options: FindSimilarOptions): Promise<SearchResult<T>[]>;
|
|
135
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/runtime/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAA;IAE3B;;OAEG;IACH,OAAO,EAAE,aAAa,CAAA;IAEtB;;OAEG;IACH,OAAO,EAAE,aAAa,CAAA;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAyB5B;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,OAAO,EAAE,aAAa,CAAA;IAEtB;;OAEG;IACH,OAAO,EAAE,aAAa,CAAA;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAmD5B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level semantic search APIs
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Perform semantic search using natural language query
|
|
6
|
+
*
|
|
7
|
+
* This is a high-level API that:
|
|
8
|
+
* 1. Generates embedding for the query text
|
|
9
|
+
* 2. Searches for similar vectors in the database
|
|
10
|
+
* 3. Enforces access control
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const results = await semanticSearch({
|
|
15
|
+
* listKey: 'Article',
|
|
16
|
+
* fieldName: 'contentEmbedding',
|
|
17
|
+
* query: 'articles about machine learning',
|
|
18
|
+
* provider: createEmbeddingProvider({ type: 'openai', apiKey: '...' }),
|
|
19
|
+
* storage: createVectorStorage({ type: 'pgvector' }),
|
|
20
|
+
* context: await getContext(),
|
|
21
|
+
* limit: 10,
|
|
22
|
+
* minScore: 0.7,
|
|
23
|
+
* })
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export async function semanticSearch(options) {
|
|
27
|
+
const { listKey, fieldName, query, provider, storage, context, limit = 10, minScore = 0.0, where, } = options;
|
|
28
|
+
// Generate embedding for query
|
|
29
|
+
const queryVector = await provider.embed(query);
|
|
30
|
+
// Search for similar vectors
|
|
31
|
+
const results = await storage.search(listKey, fieldName, queryVector, {
|
|
32
|
+
limit,
|
|
33
|
+
minScore,
|
|
34
|
+
context,
|
|
35
|
+
where,
|
|
36
|
+
});
|
|
37
|
+
return results;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Find items similar to a given item by ID
|
|
41
|
+
*
|
|
42
|
+
* This is a high-level API that:
|
|
43
|
+
* 1. Fetches the embedding of the source item
|
|
44
|
+
* 2. Searches for similar vectors in the database
|
|
45
|
+
* 3. Enforces access control
|
|
46
|
+
* 4. Optionally excludes the source item from results
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const similar = await findSimilar({
|
|
51
|
+
* listKey: 'Article',
|
|
52
|
+
* fieldName: 'contentEmbedding',
|
|
53
|
+
* itemId: 'article-123',
|
|
54
|
+
* storage: createVectorStorage({ type: 'pgvector' }),
|
|
55
|
+
* context: await getContext(),
|
|
56
|
+
* limit: 5,
|
|
57
|
+
* excludeSelf: true,
|
|
58
|
+
* })
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export async function findSimilar(options) {
|
|
62
|
+
const { listKey, fieldName, itemId, storage, context, limit = 10, minScore = 0.0, excludeSelf = true, where = {}, } = options;
|
|
63
|
+
// Fetch the source item's embedding
|
|
64
|
+
// We need to access the database through the context
|
|
65
|
+
const dbKey = getDbKey(listKey);
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
const model = context.db[dbKey];
|
|
68
|
+
if (!model) {
|
|
69
|
+
throw new Error(`List "${listKey}" not found in database`);
|
|
70
|
+
}
|
|
71
|
+
const item = await model.findUnique({
|
|
72
|
+
where: { id: itemId },
|
|
73
|
+
select: { [fieldName]: true },
|
|
74
|
+
});
|
|
75
|
+
if (!item) {
|
|
76
|
+
throw new Error(`Item with id "${itemId}" not found in list "${listKey}"`);
|
|
77
|
+
}
|
|
78
|
+
const embedding = item[fieldName];
|
|
79
|
+
if (!embedding || !embedding.vector) {
|
|
80
|
+
throw new Error(`Item "${itemId}" does not have an embedding in field "${fieldName}"`);
|
|
81
|
+
}
|
|
82
|
+
const queryVector = embedding.vector;
|
|
83
|
+
// Build where clause
|
|
84
|
+
const searchWhere = excludeSelf ? { ...where, id: { not: itemId } } : where;
|
|
85
|
+
// Search for similar vectors
|
|
86
|
+
const results = await storage.search(listKey, fieldName, queryVector, {
|
|
87
|
+
limit,
|
|
88
|
+
minScore,
|
|
89
|
+
context,
|
|
90
|
+
where: searchWhere,
|
|
91
|
+
});
|
|
92
|
+
return results;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Convert list key (PascalCase) to database key (camelCase)
|
|
96
|
+
* Same logic as in core package
|
|
97
|
+
*/
|
|
98
|
+
function getDbKey(listKey) {
|
|
99
|
+
return listKey.charAt(0).toLowerCase() + listKey.slice(1);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/runtime/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwDH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8B;IAE9B,MAAM,EACJ,OAAO,EACP,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,OAAO,EACP,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,GAAG,EACd,KAAK,GACN,GAAG,OAAO,CAAA;IAEX,+BAA+B;IAC/B,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAE/C,6BAA6B;IAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAI,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE;QACvE,KAAK;QACL,QAAQ;QACR,OAAO;QACP,KAAK;KACN,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC;AAoDD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B;IAE3B,MAAM,EACJ,OAAO,EACP,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,GAAG,EACd,WAAW,GAAG,IAAI,EAClB,KAAK,GAAG,EAAE,GACX,GAAG,OAAO,CAAA;IAEX,oCAAoC;IACpC,qDAAqD;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/B,8DAA8D;IAC9D,MAAM,KAAK,GAAI,OAAO,CAAC,EAAU,CAAC,KAAK,CAAC,CAAA;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,yBAAyB,CAAC,CAAA;IAC5D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;QAClC,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;QACrB,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE;KAC9B,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,wBAAwB,OAAO,GAAG,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;IACjC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,0CAA0C,SAAS,GAAG,CAAC,CAAA;IACxF,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAA;IAEpC,qBAAqB;IACrB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAE3E,6BAA6B;IAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAI,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE;QACvE,KAAK;QACL,QAAQ;QACR,OAAO;QACP,KAAK,EAAE,WAAW;KACnB,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC"}
|