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.
Files changed (126) hide show
  1. package/README.md +118 -0
  2. package/dist/index.d.ts +14 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +183 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/knowpro/answerContextSchema.d.ts +20 -0
  7. package/dist/knowpro/answerContextSchema.d.ts.map +1 -0
  8. package/dist/knowpro/answerContextSchema.js +4 -0
  9. package/dist/knowpro/answerContextSchema.js.map +1 -0
  10. package/dist/knowpro/answerResponseSchema.d.ts +7 -0
  11. package/dist/knowpro/answerResponseSchema.d.ts.map +1 -0
  12. package/dist/knowpro/answerResponseSchema.js +4 -0
  13. package/dist/knowpro/answerResponseSchema.js.map +1 -0
  14. package/dist/knowpro/answerTranslator.d.ts +5 -0
  15. package/dist/knowpro/answerTranslator.d.ts.map +1 -0
  16. package/dist/knowpro/answerTranslator.js +10 -0
  17. package/dist/knowpro/answerTranslator.js.map +1 -0
  18. package/dist/knowpro/collections.d.ts +14 -0
  19. package/dist/knowpro/collections.d.ts.map +1 -0
  20. package/dist/knowpro/collections.js +52 -0
  21. package/dist/knowpro/collections.js.map +1 -0
  22. package/dist/knowpro/conversation.d.ts +63 -0
  23. package/dist/knowpro/conversation.d.ts.map +1 -0
  24. package/dist/knowpro/conversation.js +247 -0
  25. package/dist/knowpro/conversation.js.map +1 -0
  26. package/dist/knowpro/dateTimeSchema.d.ts +19 -0
  27. package/dist/knowpro/dateTimeSchema.d.ts.map +1 -0
  28. package/dist/knowpro/dateTimeSchema.js +4 -0
  29. package/dist/knowpro/dateTimeSchema.js.map +1 -0
  30. package/dist/knowpro/entities.d.ts +9 -0
  31. package/dist/knowpro/entities.d.ts.map +1 -0
  32. package/dist/knowpro/entities.js +63 -0
  33. package/dist/knowpro/entities.js.map +1 -0
  34. package/dist/knowpro/interfaces.d.ts +637 -0
  35. package/dist/knowpro/interfaces.d.ts.map +1 -0
  36. package/dist/knowpro/interfaces.js +4 -0
  37. package/dist/knowpro/interfaces.js.map +1 -0
  38. package/dist/knowpro/knowledge.d.ts +19 -0
  39. package/dist/knowpro/knowledge.d.ts.map +1 -0
  40. package/dist/knowpro/knowledge.js +97 -0
  41. package/dist/knowpro/knowledge.js.map +1 -0
  42. package/dist/knowpro/knowledgeSchema.d.ts +39 -0
  43. package/dist/knowpro/knowledgeSchema.d.ts.map +1 -0
  44. package/dist/knowpro/knowledgeSchema.js +2 -0
  45. package/dist/knowpro/knowledgeSchema.js.map +1 -0
  46. package/dist/knowpro/llmProvider.d.ts +17 -0
  47. package/dist/knowpro/llmProvider.d.ts.map +1 -0
  48. package/dist/knowpro/llmProvider.js +105 -0
  49. package/dist/knowpro/llmProvider.js.map +1 -0
  50. package/dist/knowpro/relatedTermsSchema.d.ts +24 -0
  51. package/dist/knowpro/relatedTermsSchema.d.ts.map +1 -0
  52. package/dist/knowpro/relatedTermsSchema.js +6 -0
  53. package/dist/knowpro/relatedTermsSchema.js.map +1 -0
  54. package/dist/knowpro/schema.d.ts +24 -0
  55. package/dist/knowpro/schema.d.ts.map +1 -0
  56. package/dist/knowpro/schema.js +55 -0
  57. package/dist/knowpro/schema.js.map +1 -0
  58. package/dist/knowpro/search.d.ts +8 -0
  59. package/dist/knowpro/search.d.ts.map +1 -0
  60. package/dist/knowpro/search.js +448 -0
  61. package/dist/knowpro/search.js.map +1 -0
  62. package/dist/knowpro/searchQuerySchema.d.ts +40 -0
  63. package/dist/knowpro/searchQuerySchema.d.ts.map +1 -0
  64. package/dist/knowpro/searchQuerySchema.js +4 -0
  65. package/dist/knowpro/searchQuerySchema.js.map +1 -0
  66. package/dist/knowpro/searchQueryTranslator.d.ts +33 -0
  67. package/dist/knowpro/searchQueryTranslator.d.ts.map +1 -0
  68. package/dist/knowpro/searchQueryTranslator.js +47 -0
  69. package/dist/knowpro/searchQueryTranslator.js.map +1 -0
  70. package/dist/knowpro/semanticRef.d.ts +4 -0
  71. package/dist/knowpro/semanticRef.d.ts.map +1 -0
  72. package/dist/knowpro/semanticRef.js +62 -0
  73. package/dist/knowpro/semanticRef.js.map +1 -0
  74. package/dist/knowpro/semanticRefIndex.d.ts +48 -0
  75. package/dist/knowpro/semanticRefIndex.d.ts.map +1 -0
  76. package/dist/knowpro/semanticRefIndex.js +388 -0
  77. package/dist/knowpro/semanticRefIndex.js.map +1 -0
  78. package/dist/knowpro/storageProvider.d.ts +7 -0
  79. package/dist/knowpro/storageProvider.d.ts.map +1 -0
  80. package/dist/knowpro/storageProvider.js +61 -0
  81. package/dist/knowpro/storageProvider.js.map +1 -0
  82. package/dist/knowpro/timestampIndex.d.ts +43 -0
  83. package/dist/knowpro/timestampIndex.d.ts.map +1 -0
  84. package/dist/knowpro/timestampIndex.js +324 -0
  85. package/dist/knowpro/timestampIndex.js.map +1 -0
  86. package/dist/rag/chunking.d.ts +6 -0
  87. package/dist/rag/chunking.d.ts.map +1 -0
  88. package/dist/rag/chunking.js +83 -0
  89. package/dist/rag/chunking.js.map +1 -0
  90. package/dist/rag/embeddingProvider.d.ts +34 -0
  91. package/dist/rag/embeddingProvider.d.ts.map +1 -0
  92. package/dist/rag/embeddingProvider.js +95 -0
  93. package/dist/rag/embeddingProvider.js.map +1 -0
  94. package/dist/rag/index.d.ts +8 -0
  95. package/dist/rag/index.d.ts.map +1 -0
  96. package/dist/rag/index.js +7 -0
  97. package/dist/rag/index.js.map +1 -0
  98. package/dist/rag/knowproAdapter.d.ts +44 -0
  99. package/dist/rag/knowproAdapter.d.ts.map +1 -0
  100. package/dist/rag/knowproAdapter.js +66 -0
  101. package/dist/rag/knowproAdapter.js.map +1 -0
  102. package/dist/rag/ragIndex.d.ts +101 -0
  103. package/dist/rag/ragIndex.d.ts.map +1 -0
  104. package/dist/rag/ragIndex.js +305 -0
  105. package/dist/rag/ragIndex.js.map +1 -0
  106. package/dist/rag/similarity.d.ts +15 -0
  107. package/dist/rag/similarity.d.ts.map +1 -0
  108. package/dist/rag/similarity.js +47 -0
  109. package/dist/rag/similarity.js.map +1 -0
  110. package/dist/rag/types.d.ts +61 -0
  111. package/dist/rag/types.d.ts.map +1 -0
  112. package/dist/rag/types.js +2 -0
  113. package/dist/rag/types.js.map +1 -0
  114. package/dist/rag/vectorIndex.d.ts +102 -0
  115. package/dist/rag/vectorIndex.d.ts.map +1 -0
  116. package/dist/rag/vectorIndex.js +236 -0
  117. package/dist/rag/vectorIndex.js.map +1 -0
  118. package/dist/utils/async.d.ts +25 -0
  119. package/dist/utils/async.d.ts.map +1 -0
  120. package/dist/utils/async.js +55 -0
  121. package/dist/utils/async.js.map +1 -0
  122. package/dist/utils/string.d.ts +3 -0
  123. package/dist/utils/string.d.ts.map +1 -0
  124. package/dist/utils/string.js +15 -0
  125. package/dist/utils/string.js.map +1 -0
  126. 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"}