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,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector embedding representation
|
|
3
|
+
*/
|
|
4
|
+
export type Embedding = number[];
|
|
5
|
+
/**
|
|
6
|
+
* A text chunk with its associated metadata
|
|
7
|
+
*/
|
|
8
|
+
export interface TextChunk {
|
|
9
|
+
/**
|
|
10
|
+
* The text content of the chunk
|
|
11
|
+
*/
|
|
12
|
+
text: string;
|
|
13
|
+
/**
|
|
14
|
+
* Unique identifier for the chunk
|
|
15
|
+
*/
|
|
16
|
+
id: string;
|
|
17
|
+
/**
|
|
18
|
+
* Optional metadata associated with the chunk
|
|
19
|
+
*/
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A chunk with its vector embedding
|
|
24
|
+
*/
|
|
25
|
+
export interface EmbeddedChunk extends TextChunk {
|
|
26
|
+
/**
|
|
27
|
+
* The vector embedding for this chunk
|
|
28
|
+
*/
|
|
29
|
+
embedding: Embedding;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Result of a similarity search
|
|
33
|
+
*/
|
|
34
|
+
export interface SimilaritySearchResult {
|
|
35
|
+
/**
|
|
36
|
+
* The matched chunk
|
|
37
|
+
*/
|
|
38
|
+
chunk: EmbeddedChunk;
|
|
39
|
+
/**
|
|
40
|
+
* Similarity score (0-1, where 1 is most similar)
|
|
41
|
+
*/
|
|
42
|
+
score: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Configuration for text chunking
|
|
46
|
+
*/
|
|
47
|
+
export interface ChunkingConfig {
|
|
48
|
+
/**
|
|
49
|
+
* Maximum size of each chunk in characters
|
|
50
|
+
*/
|
|
51
|
+
maxChunkSize: number;
|
|
52
|
+
/**
|
|
53
|
+
* Number of characters to overlap between chunks
|
|
54
|
+
*/
|
|
55
|
+
overlap?: number;
|
|
56
|
+
/**
|
|
57
|
+
* Whether to split on sentence boundaries
|
|
58
|
+
*/
|
|
59
|
+
splitOnSentences?: boolean;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rag/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC5C;;OAEG;IACH,SAAS,EAAE,SAAS,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IACrB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rag/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { Embedding } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Abstract interface for vector index backends
|
|
4
|
+
*/
|
|
5
|
+
export interface VectorIndex {
|
|
6
|
+
/**
|
|
7
|
+
* Add embeddings to the index
|
|
8
|
+
*/
|
|
9
|
+
add(embeddings: Embedding[]): void | Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Search for nearest neighbors
|
|
12
|
+
*/
|
|
13
|
+
search(queryEmbedding: Embedding, k: number): {
|
|
14
|
+
indices: number[];
|
|
15
|
+
distances: number[];
|
|
16
|
+
} | Promise<{
|
|
17
|
+
indices: number[];
|
|
18
|
+
distances: number[];
|
|
19
|
+
}>;
|
|
20
|
+
/**
|
|
21
|
+
* Get the number of vectors in the index
|
|
22
|
+
*/
|
|
23
|
+
size(): number;
|
|
24
|
+
/**
|
|
25
|
+
* Remove vectors by indices
|
|
26
|
+
*/
|
|
27
|
+
remove(indices: number[]): void;
|
|
28
|
+
/**
|
|
29
|
+
* Clear all vectors from the index
|
|
30
|
+
*/
|
|
31
|
+
clear(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Save index to file (if supported)
|
|
34
|
+
*/
|
|
35
|
+
write?(path: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Load index from file (if supported)
|
|
38
|
+
*/
|
|
39
|
+
read?(path: string): void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Brute-force vector index using cosine similarity
|
|
43
|
+
*/
|
|
44
|
+
export declare class BruteForceIndex implements VectorIndex {
|
|
45
|
+
private embeddings;
|
|
46
|
+
add(embeddings: Embedding[]): void;
|
|
47
|
+
search(queryEmbedding: Embedding, k: number): {
|
|
48
|
+
indices: number[];
|
|
49
|
+
distances: number[];
|
|
50
|
+
};
|
|
51
|
+
size(): number;
|
|
52
|
+
remove(indices: number[]): void;
|
|
53
|
+
clear(): void;
|
|
54
|
+
private cosineSimilarity;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* FAISS-based vector index for fast approximate nearest neighbor search
|
|
58
|
+
*/
|
|
59
|
+
export declare class FAISSIndex implements VectorIndex {
|
|
60
|
+
private index;
|
|
61
|
+
private dimension;
|
|
62
|
+
private indexType;
|
|
63
|
+
constructor(dimension: number, indexType?: 'L2' | 'IP');
|
|
64
|
+
private initializeIndex;
|
|
65
|
+
add(embeddings: Embedding[]): void;
|
|
66
|
+
search(queryEmbedding: Embedding, k: number): {
|
|
67
|
+
indices: number[];
|
|
68
|
+
distances: number[];
|
|
69
|
+
};
|
|
70
|
+
size(): number;
|
|
71
|
+
remove(): void;
|
|
72
|
+
clear(): void;
|
|
73
|
+
write(path: string): void;
|
|
74
|
+
read(path: string): void;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* HNSW-based vector index using pure TypeScript (works on all platforms)
|
|
78
|
+
*/
|
|
79
|
+
export declare class HNSWIndex implements VectorIndex {
|
|
80
|
+
private index;
|
|
81
|
+
private vectors;
|
|
82
|
+
private dimension;
|
|
83
|
+
private m;
|
|
84
|
+
private efConstruction;
|
|
85
|
+
private initPromise?;
|
|
86
|
+
constructor(dimension: number, m?: number, efConstruction?: number);
|
|
87
|
+
private ensureInitialized;
|
|
88
|
+
private initializeIndex;
|
|
89
|
+
add(embeddings: Embedding[]): Promise<void>;
|
|
90
|
+
search(queryEmbedding: Embedding, k: number): Promise<{
|
|
91
|
+
indices: number[];
|
|
92
|
+
distances: number[];
|
|
93
|
+
}>;
|
|
94
|
+
size(): number;
|
|
95
|
+
remove(): void;
|
|
96
|
+
clear(): void;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Factory function to create a vector index
|
|
100
|
+
*/
|
|
101
|
+
export declare function createVectorIndex(dimension: number, backend?: 'bruteforce' | 'faiss' | 'hnsw', indexType?: 'L2' | 'IP'): VectorIndex;
|
|
102
|
+
//# sourceMappingURL=vectorIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorIndex.d.ts","sourceRoot":"","sources":["../../src/rag/vectorIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brute-force vector index using cosine similarity
|
|
3
|
+
*/
|
|
4
|
+
export class BruteForceIndex {
|
|
5
|
+
embeddings = [];
|
|
6
|
+
add(embeddings) {
|
|
7
|
+
this.embeddings.push(...embeddings);
|
|
8
|
+
}
|
|
9
|
+
search(queryEmbedding, k) {
|
|
10
|
+
const scores = this.embeddings.map((embedding, index) => ({
|
|
11
|
+
index,
|
|
12
|
+
distance: 1 - this.cosineSimilarity(queryEmbedding, embedding) // Convert similarity to distance
|
|
13
|
+
}));
|
|
14
|
+
// Sort by distance (ascending - lower is better)
|
|
15
|
+
scores.sort((a, b) => a.distance - b.distance);
|
|
16
|
+
const topK = scores.slice(0, Math.min(k, scores.length));
|
|
17
|
+
return {
|
|
18
|
+
indices: topK.map(s => s.index),
|
|
19
|
+
distances: topK.map(s => s.distance)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
size() {
|
|
23
|
+
return this.embeddings.length;
|
|
24
|
+
}
|
|
25
|
+
remove(indices) {
|
|
26
|
+
const indexSet = new Set(indices);
|
|
27
|
+
this.embeddings = this.embeddings.filter((_, index) => !indexSet.has(index));
|
|
28
|
+
}
|
|
29
|
+
clear() {
|
|
30
|
+
this.embeddings = [];
|
|
31
|
+
}
|
|
32
|
+
cosineSimilarity(a, b) {
|
|
33
|
+
let dotProduct = 0;
|
|
34
|
+
let normA = 0;
|
|
35
|
+
let normB = 0;
|
|
36
|
+
for (let i = 0; i < a.length; i++) {
|
|
37
|
+
dotProduct += a[i] * b[i];
|
|
38
|
+
normA += a[i] * a[i];
|
|
39
|
+
normB += b[i] * b[i];
|
|
40
|
+
}
|
|
41
|
+
if (normA === 0 || normB === 0) {
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* FAISS-based vector index for fast approximate nearest neighbor search
|
|
49
|
+
*/
|
|
50
|
+
export class FAISSIndex {
|
|
51
|
+
index;
|
|
52
|
+
dimension;
|
|
53
|
+
indexType;
|
|
54
|
+
constructor(dimension, indexType = 'L2') {
|
|
55
|
+
this.dimension = dimension;
|
|
56
|
+
this.indexType = indexType;
|
|
57
|
+
this.initializeIndex();
|
|
58
|
+
}
|
|
59
|
+
initializeIndex() {
|
|
60
|
+
try {
|
|
61
|
+
// Dynamic import to make faiss-node optional
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
63
|
+
const faiss = require('faiss-node');
|
|
64
|
+
if (this.indexType === 'IP') {
|
|
65
|
+
this.index = new faiss.IndexFlatIP(this.dimension);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.index = new faiss.IndexFlatL2(this.dimension);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new Error('faiss-node is not installed. Install it with: pnpm add faiss-node');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
add(embeddings) {
|
|
76
|
+
if (embeddings.length === 0) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// FAISS expects a flat array of numbers
|
|
80
|
+
for (const embedding of embeddings) {
|
|
81
|
+
if (embedding.length !== this.dimension) {
|
|
82
|
+
throw new Error(`Embedding dimension mismatch: expected ${this.dimension}, got ${embedding.length}`);
|
|
83
|
+
}
|
|
84
|
+
this.index.add(embedding);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
search(queryEmbedding, k) {
|
|
88
|
+
if (queryEmbedding.length !== this.dimension) {
|
|
89
|
+
throw new Error(`Query embedding dimension mismatch: expected ${this.dimension}, got ${queryEmbedding.length}`);
|
|
90
|
+
}
|
|
91
|
+
if (this.size() === 0) {
|
|
92
|
+
return { indices: [], distances: [] };
|
|
93
|
+
}
|
|
94
|
+
const actualK = Math.min(k, this.size());
|
|
95
|
+
const results = this.index.search(queryEmbedding, actualK);
|
|
96
|
+
return {
|
|
97
|
+
indices: results.labels,
|
|
98
|
+
distances: results.distances
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
size() {
|
|
102
|
+
return this.index.ntotal();
|
|
103
|
+
}
|
|
104
|
+
remove() {
|
|
105
|
+
// FAISS doesn't support efficient deletion
|
|
106
|
+
// We would need to rebuild the index without those vectors
|
|
107
|
+
// For now, throw an error - we'll implement this if needed
|
|
108
|
+
throw new Error('Remove operation not supported by FAISS index. Use removeChunks on RAGIndex instead.');
|
|
109
|
+
}
|
|
110
|
+
clear() {
|
|
111
|
+
// Reinitialize the index
|
|
112
|
+
this.initializeIndex();
|
|
113
|
+
}
|
|
114
|
+
write(path) {
|
|
115
|
+
this.index.write(path);
|
|
116
|
+
}
|
|
117
|
+
read(path) {
|
|
118
|
+
try {
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
120
|
+
const faiss = require('faiss-node');
|
|
121
|
+
if (this.indexType === 'IP') {
|
|
122
|
+
this.index = faiss.IndexFlatIP.read(path);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.index = faiss.IndexFlatL2.read(path);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw new Error(`Failed to read FAISS index from ${path}: ${error}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* HNSW-based vector index using pure TypeScript (works on all platforms)
|
|
135
|
+
*/
|
|
136
|
+
export class HNSWIndex {
|
|
137
|
+
index;
|
|
138
|
+
vectors = []; // Track vectors since HNSW doesn't expose them
|
|
139
|
+
dimension;
|
|
140
|
+
m; // Number of connections per node
|
|
141
|
+
efConstruction; // Size of dynamic candidate list
|
|
142
|
+
initPromise;
|
|
143
|
+
constructor(dimension, m = 16, efConstruction = 200) {
|
|
144
|
+
this.dimension = dimension;
|
|
145
|
+
this.m = m;
|
|
146
|
+
this.efConstruction = efConstruction;
|
|
147
|
+
// Lazy initialization - will be called on first use
|
|
148
|
+
}
|
|
149
|
+
async ensureInitialized() {
|
|
150
|
+
if (this.index) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!this.initPromise) {
|
|
154
|
+
this.initPromise = this.initializeIndex();
|
|
155
|
+
}
|
|
156
|
+
await this.initPromise;
|
|
157
|
+
}
|
|
158
|
+
async initializeIndex() {
|
|
159
|
+
try {
|
|
160
|
+
// Dynamic import works in both CJS and ESM
|
|
161
|
+
const { HNSW } = await import('hnsw');
|
|
162
|
+
// HNSW(M, efConstruction, dimensions, metric)
|
|
163
|
+
this.index = new HNSW(this.m, this.efConstruction, this.dimension, 'cosine');
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
throw new Error(`hnsw package is not installed or cannot be loaded. Install it with: pnpm add hnsw`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async add(embeddings) {
|
|
170
|
+
if (embeddings.length === 0) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
for (const embedding of embeddings) {
|
|
174
|
+
if (embedding.length !== this.dimension) {
|
|
175
|
+
throw new Error(`Embedding dimension mismatch: expected ${this.dimension}, got ${embedding.length}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Ensure index is initialized
|
|
179
|
+
await this.ensureInitialized();
|
|
180
|
+
// Add to our vector list
|
|
181
|
+
this.vectors.push(...embeddings);
|
|
182
|
+
// Rebuild index with all vectors (HNSW requires full rebuild)
|
|
183
|
+
// Convert vectors to format HNSW expects: { id, vector }
|
|
184
|
+
const data = this.vectors.map((vector, id) => ({ id, vector }));
|
|
185
|
+
await this.index.buildIndex(data);
|
|
186
|
+
}
|
|
187
|
+
async search(queryEmbedding, k) {
|
|
188
|
+
if (queryEmbedding.length !== this.dimension) {
|
|
189
|
+
throw new Error(`Query embedding dimension mismatch: expected ${this.dimension}, got ${queryEmbedding.length}`);
|
|
190
|
+
}
|
|
191
|
+
if (this.size() === 0) {
|
|
192
|
+
return { indices: [], distances: [] };
|
|
193
|
+
}
|
|
194
|
+
// Ensure index is initialized
|
|
195
|
+
await this.ensureInitialized();
|
|
196
|
+
const actualK = Math.min(k, this.size());
|
|
197
|
+
// searchKNN returns array of {id, score} objects
|
|
198
|
+
const results = this.index.searchKNN(queryEmbedding, actualK);
|
|
199
|
+
const indices = [];
|
|
200
|
+
const distances = [];
|
|
201
|
+
for (const result of results) {
|
|
202
|
+
indices.push(result.id);
|
|
203
|
+
// HNSW returns score (higher is better for similarity)
|
|
204
|
+
// For consistency with our API, we return distance (lower is better)
|
|
205
|
+
// So we convert: distance = 1 - score
|
|
206
|
+
distances.push(1 - result.score);
|
|
207
|
+
}
|
|
208
|
+
return { indices, distances };
|
|
209
|
+
}
|
|
210
|
+
size() {
|
|
211
|
+
return this.vectors.length;
|
|
212
|
+
}
|
|
213
|
+
remove() {
|
|
214
|
+
throw new Error('Remove operation not supported by HNSW index.');
|
|
215
|
+
}
|
|
216
|
+
clear() {
|
|
217
|
+
this.vectors = [];
|
|
218
|
+
// Reset the index and initialization promise
|
|
219
|
+
this.index = undefined;
|
|
220
|
+
this.initPromise = undefined;
|
|
221
|
+
// Will be lazy loaded on next use
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Factory function to create a vector index
|
|
226
|
+
*/
|
|
227
|
+
export function createVectorIndex(dimension, backend = 'bruteforce', indexType) {
|
|
228
|
+
if (backend === 'faiss') {
|
|
229
|
+
return new FAISSIndex(dimension, indexType || 'L2');
|
|
230
|
+
}
|
|
231
|
+
if (backend === 'hnsw') {
|
|
232
|
+
return new HNSWIndex(dimension);
|
|
233
|
+
}
|
|
234
|
+
return new BruteForceIndex();
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=vectorIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorIndex.js","sourceRoot":"","sources":["../../src/rag/vectorIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Result } from "typechat";
|
|
2
|
+
/**
|
|
3
|
+
* Call an async function with automatic retry in the case of exceptions
|
|
4
|
+
* @param asyncFn Use closures to pass parameters
|
|
5
|
+
* @param retryMaxAttempts maximum retry attempts. Default is 2
|
|
6
|
+
* @param retryPauseMs Pause between attempts. Default is 1000 ms. Uses exponential backoff
|
|
7
|
+
* @param shouldAbort (Optional) Inspect the error and abort
|
|
8
|
+
* @returns Result<T>
|
|
9
|
+
*/
|
|
10
|
+
export declare function callWithRetry<T = unknown>(asyncFn: () => Promise<T>, retryMaxAttempts?: number, retryPauseMs?: number, shouldAbort?: (error: unknown) => boolean | undefined): Promise<T>;
|
|
11
|
+
/**
|
|
12
|
+
* Get a result by calling a function with automatic retry
|
|
13
|
+
* @param asyncFn
|
|
14
|
+
* @param retryMaxAttempts
|
|
15
|
+
* @param retryPauseMs
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
export declare function getResultWithRetry<T = unknown>(asyncFn: () => Promise<Result<T>>, retryMaxAttempts?: number, retryPauseMs?: number): Promise<Result<T>>;
|
|
19
|
+
/**
|
|
20
|
+
* Pause for given # of ms before resuming async execution
|
|
21
|
+
* @param ms
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
export declare function pause(ms: number): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=async.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/utils/async.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAC3C,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,gBAAgB,GAAE,MAAU,EAC5B,YAAY,GAAE,MAAa,EAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,SAAS,GACtD,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAChD,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EACjC,gBAAgB,GAAE,MAAU,EAC5B,YAAY,GAAE,MAAa,GAC5B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAWpB;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
/**
|
|
4
|
+
* Call an async function with automatic retry in the case of exceptions
|
|
5
|
+
* @param asyncFn Use closures to pass parameters
|
|
6
|
+
* @param retryMaxAttempts maximum retry attempts. Default is 2
|
|
7
|
+
* @param retryPauseMs Pause between attempts. Default is 1000 ms. Uses exponential backoff
|
|
8
|
+
* @param shouldAbort (Optional) Inspect the error and abort
|
|
9
|
+
* @returns Result<T>
|
|
10
|
+
*/
|
|
11
|
+
export async function callWithRetry(asyncFn, retryMaxAttempts = 2, retryPauseMs = 1000, shouldAbort) {
|
|
12
|
+
let retryCount = 0;
|
|
13
|
+
while (true) {
|
|
14
|
+
try {
|
|
15
|
+
return await asyncFn();
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
if (retryCount >= retryMaxAttempts ||
|
|
19
|
+
(shouldAbort && shouldAbort(e))) {
|
|
20
|
+
throw e;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
await pause(retryPauseMs);
|
|
24
|
+
retryCount++;
|
|
25
|
+
retryPauseMs *= 2; // Use exponential backoff for retries
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get a result by calling a function with automatic retry
|
|
30
|
+
* @param asyncFn
|
|
31
|
+
* @param retryMaxAttempts
|
|
32
|
+
* @param retryPauseMs
|
|
33
|
+
* @returns
|
|
34
|
+
*/
|
|
35
|
+
export async function getResultWithRetry(asyncFn, retryMaxAttempts = 2, retryPauseMs = 1000) {
|
|
36
|
+
let retryCount = 0;
|
|
37
|
+
while (true) {
|
|
38
|
+
const result = await asyncFn();
|
|
39
|
+
if (result.success || retryCount >= retryMaxAttempts) {
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
await pause(retryPauseMs);
|
|
43
|
+
retryCount++;
|
|
44
|
+
retryPauseMs *= 2; // Use exponential backoff for retries
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Pause for given # of ms before resuming async execution
|
|
49
|
+
* @param ms
|
|
50
|
+
* @returns
|
|
51
|
+
*/
|
|
52
|
+
export function pause(ms) {
|
|
53
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/utils/async.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,OAAyB,EACzB,mBAA2B,CAAC,EAC5B,eAAuB,IAAI,EAC3B,WAAqD;IAErD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,EAAE,CAAC;QACV,IAAI,CAAC;YACD,OAAO,MAAM,OAAO,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,IACI,UAAU,IAAI,gBAAgB;gBAC9B,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,EACjC,CAAC;gBACC,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;QACD,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1B,UAAU,EAAE,CAAC;QACb,YAAY,IAAI,CAAC,CAAC,CAAC,sCAAsC;IAC7D,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,OAAiC,EACjC,mBAA2B,CAAC,EAC5B,eAAuB,IAAI;IAE3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,OAAO,IAAI,UAAU,IAAI,gBAAgB,EAAE,CAAC;YACnD,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1B,UAAU,EAAE,CAAC;QACb,YAAY,IAAI,CAAC,CAAC,CAAC,sCAAsC;IAC7D,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,EAAE,OAAO,GAAG,MAAM,CAQ1G;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO,CAE1G"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// TODO: Ask why Umesh did all this
|
|
2
|
+
const caseInsensitiveOptions = { sensitivity: 'base' };
|
|
3
|
+
export function stringCompare(x, y, caseSensitive) {
|
|
4
|
+
if (x === undefined) {
|
|
5
|
+
return y === undefined ? 0 : -1;
|
|
6
|
+
}
|
|
7
|
+
if (y === undefined) {
|
|
8
|
+
return 1;
|
|
9
|
+
}
|
|
10
|
+
return caseSensitive ? x.localeCompare(y) : x.localeCompare(y, undefined, caseInsensitiveOptions);
|
|
11
|
+
}
|
|
12
|
+
export function stringEquals(x, y, caseSensitive) {
|
|
13
|
+
return caseSensitive ? x === y : stringCompare(x, y, caseSensitive) === 0;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,MAAM,sBAAsB,GAAyB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAE7E,MAAM,UAAU,aAAa,CAAC,CAAqB,EAAE,CAAqB,EAAE,aAAsB;IAC9F,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAqB,EAAE,CAAqB,EAAE,aAAsB;IAC7F,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fawn-memory",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc -p tsconfig.build.json",
|
|
14
|
+
"dev": "tsx src/index.ts",
|
|
15
|
+
"lint": "eslint .",
|
|
16
|
+
"clean": "rimraf dist",
|
|
17
|
+
"prepublishOnly": "pnpm run clean && pnpm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [],
|
|
20
|
+
"author": "hlucco",
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18"
|
|
23
|
+
},
|
|
24
|
+
"packageManager": "pnpm@10.24.0+sha512.01ff8ae71b4419903b65c60fb2dc9d34cf8bb6e06d03bde112ef38f7a34d6904c424ba66bea5cdcf12890230bf39f9580473140ed9c946fef328b6e5238a345a",
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@eslint/js": "^9.39.2",
|
|
27
|
+
"@types/node": "^25.0.2",
|
|
28
|
+
"@typescript-eslint/eslint-plugin": "^8.50.0",
|
|
29
|
+
"@typescript-eslint/parser": "^8.50.0",
|
|
30
|
+
"eslint": "^9.39.2",
|
|
31
|
+
"rimraf": "^6.1.2",
|
|
32
|
+
"tsx": "^4.21.0",
|
|
33
|
+
"typescript": "^5.9.3",
|
|
34
|
+
"typescript-eslint": "^8.50.0"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
38
|
+
"dotenv": "^17.2.3",
|
|
39
|
+
"natural": "^8.1.0",
|
|
40
|
+
"typechat": "^0.1.1",
|
|
41
|
+
"wink-lemmatizer": "^3.0.4",
|
|
42
|
+
"wordnet-db": "^3.1.14"
|
|
43
|
+
},
|
|
44
|
+
"optionalDependencies": {
|
|
45
|
+
"faiss-node": "^0.5.1",
|
|
46
|
+
"hnsw": "^1.0.3"
|
|
47
|
+
}
|
|
48
|
+
}
|