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,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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,3 @@
1
+ export declare function stringCompare(x: string | undefined, y: string | undefined, caseSensitive: boolean): number;
2
+ export declare function stringEquals(x: string | undefined, y: string | undefined, caseSensitive: boolean): boolean;
3
+ //# sourceMappingURL=string.d.ts.map
@@ -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
+ }