fawn-memory 0.0.3
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 +118 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +183 -0
- package/dist/index.js.map +1 -0
- package/dist/knowpro/answerContextSchema.d.ts +20 -0
- package/dist/knowpro/answerContextSchema.d.ts.map +1 -0
- package/dist/knowpro/answerContextSchema.js +4 -0
- package/dist/knowpro/answerContextSchema.js.map +1 -0
- package/dist/knowpro/answerResponseSchema.d.ts +7 -0
- package/dist/knowpro/answerResponseSchema.d.ts.map +1 -0
- package/dist/knowpro/answerResponseSchema.js +4 -0
- package/dist/knowpro/answerResponseSchema.js.map +1 -0
- package/dist/knowpro/answerTranslator.d.ts +5 -0
- package/dist/knowpro/answerTranslator.d.ts.map +1 -0
- package/dist/knowpro/answerTranslator.js +10 -0
- package/dist/knowpro/answerTranslator.js.map +1 -0
- package/dist/knowpro/collections.d.ts +14 -0
- package/dist/knowpro/collections.d.ts.map +1 -0
- package/dist/knowpro/collections.js +52 -0
- package/dist/knowpro/collections.js.map +1 -0
- package/dist/knowpro/conversation.d.ts +63 -0
- package/dist/knowpro/conversation.d.ts.map +1 -0
- package/dist/knowpro/conversation.js +247 -0
- package/dist/knowpro/conversation.js.map +1 -0
- package/dist/knowpro/dateTimeSchema.d.ts +19 -0
- package/dist/knowpro/dateTimeSchema.d.ts.map +1 -0
- package/dist/knowpro/dateTimeSchema.js +4 -0
- package/dist/knowpro/dateTimeSchema.js.map +1 -0
- package/dist/knowpro/entities.d.ts +9 -0
- package/dist/knowpro/entities.d.ts.map +1 -0
- package/dist/knowpro/entities.js +63 -0
- package/dist/knowpro/entities.js.map +1 -0
- package/dist/knowpro/interfaces.d.ts +637 -0
- package/dist/knowpro/interfaces.d.ts.map +1 -0
- package/dist/knowpro/interfaces.js +4 -0
- package/dist/knowpro/interfaces.js.map +1 -0
- package/dist/knowpro/knowledge.d.ts +19 -0
- package/dist/knowpro/knowledge.d.ts.map +1 -0
- package/dist/knowpro/knowledge.js +97 -0
- package/dist/knowpro/knowledge.js.map +1 -0
- package/dist/knowpro/knowledgeSchema.d.ts +39 -0
- package/dist/knowpro/knowledgeSchema.d.ts.map +1 -0
- package/dist/knowpro/knowledgeSchema.js +2 -0
- package/dist/knowpro/knowledgeSchema.js.map +1 -0
- package/dist/knowpro/llmProvider.d.ts +17 -0
- package/dist/knowpro/llmProvider.d.ts.map +1 -0
- package/dist/knowpro/llmProvider.js +105 -0
- package/dist/knowpro/llmProvider.js.map +1 -0
- package/dist/knowpro/relatedTermsSchema.d.ts +24 -0
- package/dist/knowpro/relatedTermsSchema.d.ts.map +1 -0
- package/dist/knowpro/relatedTermsSchema.js +6 -0
- package/dist/knowpro/relatedTermsSchema.js.map +1 -0
- package/dist/knowpro/schema.d.ts +24 -0
- package/dist/knowpro/schema.d.ts.map +1 -0
- package/dist/knowpro/schema.js +55 -0
- package/dist/knowpro/schema.js.map +1 -0
- package/dist/knowpro/search.d.ts +8 -0
- package/dist/knowpro/search.d.ts.map +1 -0
- package/dist/knowpro/search.js +448 -0
- package/dist/knowpro/search.js.map +1 -0
- package/dist/knowpro/searchQuerySchema.d.ts +40 -0
- package/dist/knowpro/searchQuerySchema.d.ts.map +1 -0
- package/dist/knowpro/searchQuerySchema.js +4 -0
- package/dist/knowpro/searchQuerySchema.js.map +1 -0
- package/dist/knowpro/searchQueryTranslator.d.ts +33 -0
- package/dist/knowpro/searchQueryTranslator.d.ts.map +1 -0
- package/dist/knowpro/searchQueryTranslator.js +47 -0
- package/dist/knowpro/searchQueryTranslator.js.map +1 -0
- package/dist/knowpro/semanticRef.d.ts +4 -0
- package/dist/knowpro/semanticRef.d.ts.map +1 -0
- package/dist/knowpro/semanticRef.js +62 -0
- package/dist/knowpro/semanticRef.js.map +1 -0
- package/dist/knowpro/semanticRefIndex.d.ts +48 -0
- package/dist/knowpro/semanticRefIndex.d.ts.map +1 -0
- package/dist/knowpro/semanticRefIndex.js +388 -0
- package/dist/knowpro/semanticRefIndex.js.map +1 -0
- package/dist/knowpro/storageProvider.d.ts +7 -0
- package/dist/knowpro/storageProvider.d.ts.map +1 -0
- package/dist/knowpro/storageProvider.js +61 -0
- package/dist/knowpro/storageProvider.js.map +1 -0
- package/dist/knowpro/timestampIndex.d.ts +43 -0
- package/dist/knowpro/timestampIndex.d.ts.map +1 -0
- package/dist/knowpro/timestampIndex.js +324 -0
- package/dist/knowpro/timestampIndex.js.map +1 -0
- package/dist/rag/chunking.d.ts +6 -0
- package/dist/rag/chunking.d.ts.map +1 -0
- package/dist/rag/chunking.js +83 -0
- package/dist/rag/chunking.js.map +1 -0
- package/dist/rag/embeddingProvider.d.ts +34 -0
- package/dist/rag/embeddingProvider.d.ts.map +1 -0
- package/dist/rag/embeddingProvider.js +95 -0
- package/dist/rag/embeddingProvider.js.map +1 -0
- package/dist/rag/index.d.ts +8 -0
- package/dist/rag/index.d.ts.map +1 -0
- package/dist/rag/index.js +7 -0
- package/dist/rag/index.js.map +1 -0
- package/dist/rag/knowproAdapter.d.ts +44 -0
- package/dist/rag/knowproAdapter.d.ts.map +1 -0
- package/dist/rag/knowproAdapter.js +66 -0
- package/dist/rag/knowproAdapter.js.map +1 -0
- package/dist/rag/ragIndex.d.ts +101 -0
- package/dist/rag/ragIndex.d.ts.map +1 -0
- package/dist/rag/ragIndex.js +305 -0
- package/dist/rag/ragIndex.js.map +1 -0
- package/dist/rag/similarity.d.ts +15 -0
- package/dist/rag/similarity.d.ts.map +1 -0
- package/dist/rag/similarity.js +47 -0
- package/dist/rag/similarity.js.map +1 -0
- package/dist/rag/types.d.ts +61 -0
- package/dist/rag/types.d.ts.map +1 -0
- package/dist/rag/types.js +2 -0
- package/dist/rag/types.js.map +1 -0
- package/dist/rag/vectorIndex.d.ts +102 -0
- package/dist/rag/vectorIndex.d.ts.map +1 -0
- package/dist/rag/vectorIndex.js +236 -0
- package/dist/rag/vectorIndex.js.map +1 -0
- package/dist/utils/async.d.ts +25 -0
- package/dist/utils/async.d.ts.map +1 -0
- package/dist/utils/async.js +55 -0
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/string.d.ts +3 -0
- package/dist/utils/string.d.ts.map +1 -0
- package/dist/utils/string.js +15 -0
- package/dist/utils/string.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { RAGIndex } from './ragIndex.js';
|
|
2
|
+
/**
|
|
3
|
+
* Adapter for integrating knowpro data structures with RAG index
|
|
4
|
+
*/
|
|
5
|
+
export declare class KnowproRAGAdapter {
|
|
6
|
+
private readonly ragIndex;
|
|
7
|
+
private chunkCounter;
|
|
8
|
+
constructor(ragIndex: RAGIndex);
|
|
9
|
+
/**
|
|
10
|
+
* Add pre-chunked text strings to the index
|
|
11
|
+
* This is the most common use case from knowpro code
|
|
12
|
+
*/
|
|
13
|
+
addTextChunks(textChunks: string[], metadata?: Record<string, unknown>, idPrefix?: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Add a single text string that may need chunking
|
|
16
|
+
* Used when users send whole text that needs to be chunked
|
|
17
|
+
*/
|
|
18
|
+
addFullText(text: string, metadata?: Record<string, unknown>, idPrefix?: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Add a knowpro message's text chunks to the index
|
|
21
|
+
*/
|
|
22
|
+
addMessageChunks(messageChunks: string[], messageOrdinal: number, additionalMetadata?: Record<string, unknown>): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Add multiple messages incrementally
|
|
25
|
+
*/
|
|
26
|
+
addMessages(messages: Array<{
|
|
27
|
+
textChunks: string[];
|
|
28
|
+
ordinal: number;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
}>): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Convert text strings to TextChunk objects with proper IDs
|
|
33
|
+
*/
|
|
34
|
+
private createChunks;
|
|
35
|
+
/**
|
|
36
|
+
* Get the underlying RAG index for advanced operations
|
|
37
|
+
*/
|
|
38
|
+
getIndex(): RAGIndex;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Factory function to create a KnowproRAGAdapter
|
|
42
|
+
*/
|
|
43
|
+
export declare function createKnowproRAGAdapter(ragIndex: RAGIndex): KnowproRAGAdapter;
|
|
44
|
+
//# sourceMappingURL=knowproAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowproAdapter.d.ts","sourceRoot":"","sources":["../../src/rag/knowproAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,YAAY,CAAK;gBAEb,QAAQ,EAAE,QAAQ;IAI9B;;;OAGG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAKhB;;;OAGG;IACG,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAIhB;;OAEG;IACG,gBAAgB,CACpB,aAAa,EAAE,MAAM,EAAE,EACvB,cAAc,EAAE,MAAM,EACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,KAAK,CAAC;QACd,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,CAAC,GACD,OAAO,CAAC,IAAI,CAAC;IAUhB;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,QAAQ,IAAI,QAAQ;CAGrB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CAE7E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter for integrating knowpro data structures with RAG index
|
|
3
|
+
*/
|
|
4
|
+
export class KnowproRAGAdapter {
|
|
5
|
+
ragIndex;
|
|
6
|
+
chunkCounter = 0;
|
|
7
|
+
constructor(ragIndex) {
|
|
8
|
+
this.ragIndex = ragIndex;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Add pre-chunked text strings to the index
|
|
12
|
+
* This is the most common use case from knowpro code
|
|
13
|
+
*/
|
|
14
|
+
async addTextChunks(textChunks, metadata, idPrefix) {
|
|
15
|
+
const chunks = this.createChunks(textChunks, idPrefix);
|
|
16
|
+
await this.ragIndex.addChunks(chunks, metadata);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Add a single text string that may need chunking
|
|
20
|
+
* Used when users send whole text that needs to be chunked
|
|
21
|
+
*/
|
|
22
|
+
async addFullText(text, metadata, idPrefix) {
|
|
23
|
+
await this.ragIndex.addText(text, metadata, idPrefix);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Add a knowpro message's text chunks to the index
|
|
27
|
+
*/
|
|
28
|
+
async addMessageChunks(messageChunks, messageOrdinal, additionalMetadata) {
|
|
29
|
+
const metadata = {
|
|
30
|
+
messageOrdinal,
|
|
31
|
+
...additionalMetadata
|
|
32
|
+
};
|
|
33
|
+
await this.addTextChunks(messageChunks, metadata, `msg-${messageOrdinal}`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Add multiple messages incrementally
|
|
37
|
+
*/
|
|
38
|
+
async addMessages(messages) {
|
|
39
|
+
for (const message of messages) {
|
|
40
|
+
await this.addMessageChunks(message.textChunks, message.ordinal, message.metadata);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Convert text strings to TextChunk objects with proper IDs
|
|
45
|
+
*/
|
|
46
|
+
createChunks(textChunks, idPrefix) {
|
|
47
|
+
const prefix = idPrefix || `chunk-${this.chunkCounter++}`;
|
|
48
|
+
return textChunks.map((text, index) => ({
|
|
49
|
+
id: `${prefix}-${index}`,
|
|
50
|
+
text
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the underlying RAG index for advanced operations
|
|
55
|
+
*/
|
|
56
|
+
getIndex() {
|
|
57
|
+
return this.ragIndex;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Factory function to create a KnowproRAGAdapter
|
|
62
|
+
*/
|
|
63
|
+
export function createKnowproRAGAdapter(ragIndex) {
|
|
64
|
+
return new KnowproRAGAdapter(ragIndex);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=knowproAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowproAdapter.js","sourceRoot":"","sources":["../../src/rag/knowproAdapter.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACX,QAAQ,CAAW;IAC5B,YAAY,GAAG,CAAC,CAAC;IAEzB,YAAY,QAAkB;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,UAAoB,EACpB,QAAkC,EAClC,QAAiB;QAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,QAAkC,EAClC,QAAiB;QAEjB,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACpB,aAAuB,EACvB,cAAsB,EACtB,kBAA4C;QAE5C,MAAM,QAAQ,GAAG;YACf,cAAc;YACd,GAAG,kBAAkB;SACtB,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CACtB,aAAa,EACb,QAAQ,EACR,OAAO,cAAc,EAAE,CACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,QAIE;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,gBAAgB,CACzB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,QAAQ,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAClB,UAAoB,EACpB,QAAiB;QAEjB,MAAM,MAAM,GAAG,QAAQ,IAAI,SAAS,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QAC1D,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACtC,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE;YACxB,IAAI;SACL,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACxD,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { EmbeddedChunk, TextChunk, SimilaritySearchResult, ChunkingConfig } from './types.js';
|
|
2
|
+
import type { EmbeddingProvider } from './embeddingProvider.js';
|
|
3
|
+
export type VectorBackend = 'bruteforce' | 'faiss' | 'hnsw';
|
|
4
|
+
export type FAISSIndexType = 'L2' | 'IP';
|
|
5
|
+
export interface RAGIndexConfig {
|
|
6
|
+
embeddingProvider: EmbeddingProvider;
|
|
7
|
+
chunkingConfig: ChunkingConfig;
|
|
8
|
+
batchSize?: number;
|
|
9
|
+
vectorBackend?: VectorBackend;
|
|
10
|
+
faissIndexType?: FAISSIndexType;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* RAG Index for storing and querying text chunks using vector embeddings
|
|
14
|
+
*/
|
|
15
|
+
export declare class RAGIndex {
|
|
16
|
+
private chunks;
|
|
17
|
+
private config;
|
|
18
|
+
private vectorIndex;
|
|
19
|
+
constructor(config: RAGIndexConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Get the number of chunks in the index
|
|
22
|
+
*/
|
|
23
|
+
get size(): number;
|
|
24
|
+
/**
|
|
25
|
+
* Get all chunks in the index
|
|
26
|
+
*/
|
|
27
|
+
getChunks(): EmbeddedChunk[];
|
|
28
|
+
/**
|
|
29
|
+
* Add text to the index (will be chunked and embedded)
|
|
30
|
+
*/
|
|
31
|
+
addText(text: string, metadata?: Record<string, unknown>, idPrefix?: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Add multiple texts to the index
|
|
34
|
+
*/
|
|
35
|
+
addTexts(texts: string[], metadata?: Record<string, unknown>[], idPrefix?: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Add pre-chunked text to the index
|
|
38
|
+
*/
|
|
39
|
+
addChunks(textChunks: TextChunk[], metadata?: Record<string, unknown>): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Query the index for similar chunks
|
|
42
|
+
*/
|
|
43
|
+
query(queryText: string, options?: {
|
|
44
|
+
topK?: number;
|
|
45
|
+
minScore?: number;
|
|
46
|
+
filter?: (chunk: EmbeddedChunk) => boolean;
|
|
47
|
+
}): Promise<SimilaritySearchResult[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Brute force query for when filters are applied
|
|
50
|
+
*/
|
|
51
|
+
private bruteForceQuery;
|
|
52
|
+
/**
|
|
53
|
+
* Calculate cosine similarity between two vectors
|
|
54
|
+
*/
|
|
55
|
+
private cosineSimilarity;
|
|
56
|
+
/**
|
|
57
|
+
* Query with multiple query texts (uses average embedding)
|
|
58
|
+
*/
|
|
59
|
+
queryMultiple(queryTexts: string[], options?: {
|
|
60
|
+
topK?: number;
|
|
61
|
+
minScore?: number;
|
|
62
|
+
filter?: (chunk: EmbeddedChunk) => boolean;
|
|
63
|
+
}): Promise<SimilaritySearchResult[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Clear all chunks from the index
|
|
66
|
+
*/
|
|
67
|
+
clear(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Remove chunks by ID
|
|
70
|
+
*/
|
|
71
|
+
removeChunks(ids: string[]): number;
|
|
72
|
+
/**
|
|
73
|
+
* Rebuild the vector index from scratch (needed after deletions with FAISS)
|
|
74
|
+
*/
|
|
75
|
+
private rebuildVectorIndex;
|
|
76
|
+
/**
|
|
77
|
+
* Save FAISS index to file
|
|
78
|
+
*/
|
|
79
|
+
writeFAISS(path: string): void;
|
|
80
|
+
/**
|
|
81
|
+
* Load FAISS index from file
|
|
82
|
+
*/
|
|
83
|
+
readFAISS(path: string): void;
|
|
84
|
+
/**
|
|
85
|
+
* Export index to JSON
|
|
86
|
+
*/
|
|
87
|
+
toJSON(): object;
|
|
88
|
+
/**
|
|
89
|
+
* Load index from JSON (requires providing embedding provider)
|
|
90
|
+
*/
|
|
91
|
+
static fromJSON(data: {
|
|
92
|
+
chunks: EmbeddedChunk[];
|
|
93
|
+
config: {
|
|
94
|
+
chunkingConfig: ChunkingConfig;
|
|
95
|
+
batchSize?: number;
|
|
96
|
+
vectorBackend?: VectorBackend;
|
|
97
|
+
faissIndexType?: FAISSIndexType;
|
|
98
|
+
};
|
|
99
|
+
}, embeddingProvider: EmbeddingProvider): RAGIndex;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=ragIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ragIndex.d.ts","sourceRoot":"","sources":["../../src/rag/ragIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { chunkText } from './chunking.js';
|
|
2
|
+
import { createVectorIndex } from './vectorIndex.js';
|
|
3
|
+
/**
|
|
4
|
+
* RAG Index for storing and querying text chunks using vector embeddings
|
|
5
|
+
*/
|
|
6
|
+
export class RAGIndex {
|
|
7
|
+
chunks = [];
|
|
8
|
+
config;
|
|
9
|
+
vectorIndex;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
const backend = config.vectorBackend || 'bruteforce';
|
|
13
|
+
this.vectorIndex = createVectorIndex(config.embeddingProvider.dimensions, backend, config.faissIndexType);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the number of chunks in the index
|
|
17
|
+
*/
|
|
18
|
+
get size() {
|
|
19
|
+
return this.chunks.length;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get all chunks in the index
|
|
23
|
+
*/
|
|
24
|
+
getChunks() {
|
|
25
|
+
return [...this.chunks];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Add text to the index (will be chunked and embedded)
|
|
29
|
+
*/
|
|
30
|
+
async addText(text, metadata, idPrefix) {
|
|
31
|
+
const textChunks = chunkText(text, this.config.chunkingConfig, idPrefix);
|
|
32
|
+
await this.addChunks(textChunks, metadata);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Add multiple texts to the index
|
|
36
|
+
*/
|
|
37
|
+
async addTexts(texts, metadata, idPrefix) {
|
|
38
|
+
for (let i = 0; i < texts.length; i++) {
|
|
39
|
+
const text = texts[i];
|
|
40
|
+
const meta = metadata?.[i];
|
|
41
|
+
const prefix = idPrefix ? `${idPrefix}-${i}` : `text-${i}`;
|
|
42
|
+
await this.addText(text, meta, prefix);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Add pre-chunked text to the index
|
|
47
|
+
*/
|
|
48
|
+
async addChunks(textChunks, metadata) {
|
|
49
|
+
if (textChunks.length === 0) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Generate embeddings in batches
|
|
53
|
+
const batchSize = this.config.batchSize || 100;
|
|
54
|
+
const texts = textChunks.map(c => c.text);
|
|
55
|
+
for (let i = 0; i < texts.length; i += batchSize) {
|
|
56
|
+
const batch = texts.slice(i, i + batchSize);
|
|
57
|
+
const embeddings = await this.config.embeddingProvider.generateEmbeddings(batch);
|
|
58
|
+
// Add to vector index (may be async for HNSW)
|
|
59
|
+
await Promise.resolve(this.vectorIndex.add(embeddings));
|
|
60
|
+
// Store chunks with metadata
|
|
61
|
+
for (let j = 0; j < batch.length; j++) {
|
|
62
|
+
const chunkIndex = i + j;
|
|
63
|
+
const chunk = textChunks[chunkIndex];
|
|
64
|
+
this.chunks.push({
|
|
65
|
+
...chunk,
|
|
66
|
+
embedding: embeddings[j],
|
|
67
|
+
metadata: { ...chunk.metadata, ...metadata }
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Query the index for similar chunks
|
|
74
|
+
*/
|
|
75
|
+
async query(queryText, options = {}) {
|
|
76
|
+
const { topK = 5, minScore = 0, filter } = options;
|
|
77
|
+
if (this.chunks.length === 0) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
// Generate embedding for query
|
|
81
|
+
const [queryEmbedding] = await this.config.embeddingProvider.generateEmbeddings([
|
|
82
|
+
queryText
|
|
83
|
+
]);
|
|
84
|
+
// If filter is provided, fall back to brute force search
|
|
85
|
+
if (filter) {
|
|
86
|
+
return this.bruteForceQuery(queryEmbedding, topK, minScore, filter);
|
|
87
|
+
}
|
|
88
|
+
// Use vector index for fast search (may be async for HNSW)
|
|
89
|
+
const searchResults = await Promise.resolve(this.vectorIndex.search(queryEmbedding, topK * 2)); // Get more results for filtering
|
|
90
|
+
// Convert distances to similarity scores and filter
|
|
91
|
+
const results = [];
|
|
92
|
+
for (let i = 0; i < searchResults.indices.length; i++) {
|
|
93
|
+
const index = searchResults.indices[i];
|
|
94
|
+
const distance = searchResults.distances[i];
|
|
95
|
+
// Convert distance to similarity score based on backend
|
|
96
|
+
let score;
|
|
97
|
+
if (this.config.vectorBackend === 'hnsw') {
|
|
98
|
+
// HNSW with cosine returns distance [0, 2], convert to similarity [0, 1]
|
|
99
|
+
score = 1 - (distance / 2);
|
|
100
|
+
}
|
|
101
|
+
else if (this.config.faissIndexType === 'IP') {
|
|
102
|
+
// FAISS IP: distance is already similarity
|
|
103
|
+
score = distance;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// FAISS L2: similarity = 1 / (1 + distance)
|
|
107
|
+
score = 1 / (1 + distance);
|
|
108
|
+
}
|
|
109
|
+
if (score >= minScore) {
|
|
110
|
+
results.push({
|
|
111
|
+
chunk: this.chunks[index],
|
|
112
|
+
score
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Return top K after filtering
|
|
117
|
+
return results.slice(0, topK);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Brute force query for when filters are applied
|
|
121
|
+
*/
|
|
122
|
+
bruteForceQuery(queryEmbedding, topK, minScore, filter) {
|
|
123
|
+
const results = [];
|
|
124
|
+
for (const chunk of this.chunks) {
|
|
125
|
+
if (!filter(chunk)) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// Calculate cosine similarity
|
|
129
|
+
const score = this.cosineSimilarity(queryEmbedding, chunk.embedding);
|
|
130
|
+
if (score >= minScore) {
|
|
131
|
+
results.push({ chunk, score });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Sort by score descending
|
|
135
|
+
results.sort((a, b) => b.score - a.score);
|
|
136
|
+
return results.slice(0, topK);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Calculate cosine similarity between two vectors
|
|
140
|
+
*/
|
|
141
|
+
cosineSimilarity(a, b) {
|
|
142
|
+
let dotProduct = 0;
|
|
143
|
+
let normA = 0;
|
|
144
|
+
let normB = 0;
|
|
145
|
+
for (let i = 0; i < a.length; i++) {
|
|
146
|
+
dotProduct += a[i] * b[i];
|
|
147
|
+
normA += a[i] * a[i];
|
|
148
|
+
normB += b[i] * b[i];
|
|
149
|
+
}
|
|
150
|
+
if (normA === 0 || normB === 0) {
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Query with multiple query texts (uses average embedding)
|
|
157
|
+
*/
|
|
158
|
+
async queryMultiple(queryTexts, options = {}) {
|
|
159
|
+
const { topK = 5, minScore = 0, filter } = options;
|
|
160
|
+
if (this.chunks.length === 0 || queryTexts.length === 0) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
// Generate embeddings for all queries
|
|
164
|
+
const queryEmbeddings = await this.config.embeddingProvider.generateEmbeddings(queryTexts);
|
|
165
|
+
// Average the query embeddings
|
|
166
|
+
const avgEmbedding = new Array(queryEmbeddings[0].length).fill(0);
|
|
167
|
+
for (const embedding of queryEmbeddings) {
|
|
168
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
169
|
+
avgEmbedding[i] += embedding[i];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
for (let i = 0; i < avgEmbedding.length; i++) {
|
|
173
|
+
avgEmbedding[i] /= queryEmbeddings.length;
|
|
174
|
+
}
|
|
175
|
+
// If filter is provided, fall back to brute force search
|
|
176
|
+
if (filter) {
|
|
177
|
+
return this.bruteForceQuery(avgEmbedding, topK, minScore, filter);
|
|
178
|
+
}
|
|
179
|
+
// Use vector index for fast search (may be async for HNSW)
|
|
180
|
+
const searchResults = await Promise.resolve(this.vectorIndex.search(avgEmbedding, topK * 2));
|
|
181
|
+
// Convert distances to similarity scores and filter
|
|
182
|
+
const results = [];
|
|
183
|
+
for (let i = 0; i < searchResults.indices.length; i++) {
|
|
184
|
+
const index = searchResults.indices[i];
|
|
185
|
+
const distance = searchResults.distances[i];
|
|
186
|
+
// Convert distance to similarity score based on backend
|
|
187
|
+
let score;
|
|
188
|
+
if (this.config.vectorBackend === 'hnsw') {
|
|
189
|
+
score = 1 - (distance / 2);
|
|
190
|
+
}
|
|
191
|
+
else if (this.config.faissIndexType === 'IP') {
|
|
192
|
+
score = distance;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
score = 1 / (1 + distance);
|
|
196
|
+
}
|
|
197
|
+
if (score >= minScore) {
|
|
198
|
+
results.push({
|
|
199
|
+
chunk: this.chunks[index],
|
|
200
|
+
score
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return results.slice(0, topK);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Clear all chunks from the index
|
|
208
|
+
*/
|
|
209
|
+
clear() {
|
|
210
|
+
this.chunks = [];
|
|
211
|
+
this.vectorIndex.clear();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Remove chunks by ID
|
|
215
|
+
*/
|
|
216
|
+
removeChunks(ids) {
|
|
217
|
+
const idSet = new Set(ids);
|
|
218
|
+
const initialLength = this.chunks.length;
|
|
219
|
+
// Find indices to remove
|
|
220
|
+
const indicesToRemove = [];
|
|
221
|
+
for (let i = 0; i < this.chunks.length; i++) {
|
|
222
|
+
if (idSet.has(this.chunks[i].id)) {
|
|
223
|
+
indicesToRemove.push(i);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Remove from chunks array
|
|
227
|
+
this.chunks = this.chunks.filter(chunk => !idSet.has(chunk.id));
|
|
228
|
+
// For FAISS backend, we need to rebuild the index
|
|
229
|
+
if (indicesToRemove.length > 0 && this.config.vectorBackend === 'faiss') {
|
|
230
|
+
this.rebuildVectorIndex();
|
|
231
|
+
}
|
|
232
|
+
return initialLength - this.chunks.length;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Rebuild the vector index from scratch (needed after deletions with FAISS)
|
|
236
|
+
*/
|
|
237
|
+
rebuildVectorIndex() {
|
|
238
|
+
this.vectorIndex.clear();
|
|
239
|
+
const embeddings = this.chunks.map(chunk => chunk.embedding);
|
|
240
|
+
if (embeddings.length > 0) {
|
|
241
|
+
this.vectorIndex.add(embeddings);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Save FAISS index to file
|
|
246
|
+
*/
|
|
247
|
+
writeFAISS(path) {
|
|
248
|
+
if (this.config.vectorBackend !== 'faiss') {
|
|
249
|
+
throw new Error('Can only save FAISS indexes. Current backend: ' + this.config.vectorBackend);
|
|
250
|
+
}
|
|
251
|
+
if (this.vectorIndex.write) {
|
|
252
|
+
this.vectorIndex.write(path);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Load FAISS index from file
|
|
257
|
+
*/
|
|
258
|
+
readFAISS(path) {
|
|
259
|
+
if (this.config.vectorBackend !== 'faiss') {
|
|
260
|
+
throw new Error('Can only load FAISS indexes. Current backend: ' + this.config.vectorBackend);
|
|
261
|
+
}
|
|
262
|
+
if (this.vectorIndex.read) {
|
|
263
|
+
this.vectorIndex.read(path);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Export index to JSON
|
|
268
|
+
*/
|
|
269
|
+
toJSON() {
|
|
270
|
+
return {
|
|
271
|
+
chunks: this.chunks,
|
|
272
|
+
config: {
|
|
273
|
+
chunkingConfig: this.config.chunkingConfig,
|
|
274
|
+
batchSize: this.config.batchSize,
|
|
275
|
+
vectorBackend: this.config.vectorBackend,
|
|
276
|
+
faissIndexType: this.config.faissIndexType,
|
|
277
|
+
embeddingProvider: {
|
|
278
|
+
name: this.config.embeddingProvider.name,
|
|
279
|
+
model: this.config.embeddingProvider.model,
|
|
280
|
+
dimensions: this.config.embeddingProvider.dimensions
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Load index from JSON (requires providing embedding provider)
|
|
287
|
+
*/
|
|
288
|
+
static fromJSON(data, embeddingProvider) {
|
|
289
|
+
const index = new RAGIndex({
|
|
290
|
+
embeddingProvider,
|
|
291
|
+
chunkingConfig: data.config.chunkingConfig,
|
|
292
|
+
batchSize: data.config.batchSize,
|
|
293
|
+
vectorBackend: data.config.vectorBackend,
|
|
294
|
+
faissIndexType: data.config.faissIndexType
|
|
295
|
+
});
|
|
296
|
+
index.chunks = data.chunks;
|
|
297
|
+
// Rebuild vector index from embeddings
|
|
298
|
+
const embeddings = data.chunks.map(chunk => chunk.embedding);
|
|
299
|
+
if (embeddings.length > 0) {
|
|
300
|
+
index.vectorIndex.add(embeddings);
|
|
301
|
+
}
|
|
302
|
+
return index;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=ragIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ragIndex.js","sourceRoot":"","sources":["../../src/rag/ragIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Embedding } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate cosine similarity between two vectors
|
|
4
|
+
* Returns a value between -1 and 1, where 1 means identical direction
|
|
5
|
+
*/
|
|
6
|
+
export declare function cosineSimilarity(a: Embedding, b: Embedding): number;
|
|
7
|
+
/**
|
|
8
|
+
* Normalize a vector to unit length
|
|
9
|
+
*/
|
|
10
|
+
export declare function normalizeVector(vector: Embedding): Embedding;
|
|
11
|
+
/**
|
|
12
|
+
* Calculate dot product of two vectors (assumes normalized vectors)
|
|
13
|
+
*/
|
|
14
|
+
export declare function dotProduct(a: Embedding, b: Embedding): number;
|
|
15
|
+
//# sourceMappingURL=similarity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"similarity.d.ts","sourceRoot":"","sources":["../../src/rag/similarity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAuBnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAQ5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAW7D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate cosine similarity between two vectors
|
|
3
|
+
* Returns a value between -1 and 1, where 1 means identical direction
|
|
4
|
+
*/
|
|
5
|
+
export function cosineSimilarity(a, b) {
|
|
6
|
+
if (a.length !== b.length) {
|
|
7
|
+
throw new Error(`Vector dimensions must match: ${a.length} vs ${b.length}`);
|
|
8
|
+
}
|
|
9
|
+
let dotProduct = 0;
|
|
10
|
+
let magnitudeA = 0;
|
|
11
|
+
let magnitudeB = 0;
|
|
12
|
+
for (let i = 0; i < a.length; i++) {
|
|
13
|
+
dotProduct += a[i] * b[i];
|
|
14
|
+
magnitudeA += a[i] * a[i];
|
|
15
|
+
magnitudeB += b[i] * b[i];
|
|
16
|
+
}
|
|
17
|
+
magnitudeA = Math.sqrt(magnitudeA);
|
|
18
|
+
magnitudeB = Math.sqrt(magnitudeB);
|
|
19
|
+
if (magnitudeA === 0 || magnitudeB === 0) {
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
return dotProduct / (magnitudeA * magnitudeB);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Normalize a vector to unit length
|
|
26
|
+
*/
|
|
27
|
+
export function normalizeVector(vector) {
|
|
28
|
+
const magnitude = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
|
|
29
|
+
if (magnitude === 0) {
|
|
30
|
+
return vector;
|
|
31
|
+
}
|
|
32
|
+
return vector.map(val => val / magnitude);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate dot product of two vectors (assumes normalized vectors)
|
|
36
|
+
*/
|
|
37
|
+
export function dotProduct(a, b) {
|
|
38
|
+
if (a.length !== b.length) {
|
|
39
|
+
throw new Error(`Vector dimensions must match: ${a.length} vs ${b.length}`);
|
|
40
|
+
}
|
|
41
|
+
let result = 0;
|
|
42
|
+
for (let i = 0; i < a.length; i++) {
|
|
43
|
+
result += a[i] * b[i];
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=similarity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../src/rag/similarity.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAY,EAAE,CAAY;IACzD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEnC,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,UAAU,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7E,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,CAAY,EAAE,CAAY;IACnD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|