@easynet/agent-memory 0.0.2

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 (167) hide show
  1. package/README.md +260 -0
  2. package/bin/chat +11 -0
  3. package/dist/adapters/index.d.ts +8 -0
  4. package/dist/adapters/index.d.ts.map +1 -0
  5. package/dist/adapters/index.js +29 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/adapters/mem0/mem0-store.d.ts +29 -0
  8. package/dist/adapters/mem0/mem0-store.d.ts.map +1 -0
  9. package/dist/adapters/mem0/mem0-store.js +174 -0
  10. package/dist/adapters/mem0/mem0-store.js.map +1 -0
  11. package/dist/adapters/rag-http/rag-http-retriever.d.ts +18 -0
  12. package/dist/adapters/rag-http/rag-http-retriever.d.ts.map +1 -0
  13. package/dist/adapters/rag-http/rag-http-retriever.js +71 -0
  14. package/dist/adapters/rag-http/rag-http-retriever.js.map +1 -0
  15. package/dist/adapters/types.d.ts +25 -0
  16. package/dist/adapters/types.d.ts.map +1 -0
  17. package/dist/adapters/types.js +6 -0
  18. package/dist/adapters/types.js.map +1 -0
  19. package/dist/boot/boot-rebuilder.d.ts +26 -0
  20. package/dist/boot/boot-rebuilder.d.ts.map +1 -0
  21. package/dist/boot/boot-rebuilder.js +112 -0
  22. package/dist/boot/boot-rebuilder.js.map +1 -0
  23. package/dist/boot/index.d.ts +3 -0
  24. package/dist/boot/index.d.ts.map +1 -0
  25. package/dist/boot/index.js +6 -0
  26. package/dist/boot/index.js.map +1 -0
  27. package/dist/cli/chat-split.d.ts +22 -0
  28. package/dist/cli/chat-split.d.ts.map +1 -0
  29. package/dist/cli/chat-split.js +187 -0
  30. package/dist/cli/chat-split.js.map +1 -0
  31. package/dist/cli/chat.d.ts +19 -0
  32. package/dist/cli/chat.d.ts.map +1 -0
  33. package/dist/cli/chat.js +266 -0
  34. package/dist/cli/chat.js.map +1 -0
  35. package/dist/cli/commands/command-handler.d.ts +32 -0
  36. package/dist/cli/commands/command-handler.d.ts.map +1 -0
  37. package/dist/cli/commands/command-handler.js +143 -0
  38. package/dist/cli/commands/command-handler.js.map +1 -0
  39. package/dist/cli/index.d.ts +3 -0
  40. package/dist/cli/index.d.ts.map +1 -0
  41. package/dist/cli/index.js +8 -0
  42. package/dist/cli/index.js.map +1 -0
  43. package/dist/cli/ui/display-manager.d.ts +18 -0
  44. package/dist/cli/ui/display-manager.d.ts.map +1 -0
  45. package/dist/cli/ui/display-manager.js +69 -0
  46. package/dist/cli/ui/display-manager.js.map +1 -0
  47. package/dist/cli/ui/screen-layout.d.ts +12 -0
  48. package/dist/cli/ui/screen-layout.d.ts.map +1 -0
  49. package/dist/cli/ui/screen-layout.js +125 -0
  50. package/dist/cli/ui/screen-layout.js.map +1 -0
  51. package/dist/config/index.d.ts +2 -0
  52. package/dist/config/index.d.ts.map +1 -0
  53. package/dist/config/index.js +6 -0
  54. package/dist/config/index.js.map +1 -0
  55. package/dist/config/loader.d.ts +9 -0
  56. package/dist/config/loader.d.ts.map +1 -0
  57. package/dist/config/loader.js +107 -0
  58. package/dist/config/loader.js.map +1 -0
  59. package/dist/context/context-builder.d.ts +18 -0
  60. package/dist/context/context-builder.d.ts.map +1 -0
  61. package/dist/context/context-builder.js +91 -0
  62. package/dist/context/context-builder.js.map +1 -0
  63. package/dist/core/agent-memory.d.ts +50 -0
  64. package/dist/core/agent-memory.d.ts.map +1 -0
  65. package/dist/core/agent-memory.js +297 -0
  66. package/dist/core/agent-memory.js.map +1 -0
  67. package/dist/embedding/embedder.d.ts +49 -0
  68. package/dist/embedding/embedder.d.ts.map +1 -0
  69. package/dist/embedding/embedder.js +146 -0
  70. package/dist/embedding/embedder.js.map +1 -0
  71. package/dist/embedding/index.d.ts +3 -0
  72. package/dist/embedding/index.d.ts.map +1 -0
  73. package/dist/embedding/index.js +8 -0
  74. package/dist/embedding/index.js.map +1 -0
  75. package/dist/gate/deduplicator.d.ts +22 -0
  76. package/dist/gate/deduplicator.d.ts.map +1 -0
  77. package/dist/gate/deduplicator.js +74 -0
  78. package/dist/gate/deduplicator.js.map +1 -0
  79. package/dist/gate/extractor.d.ts +33 -0
  80. package/dist/gate/extractor.d.ts.map +1 -0
  81. package/dist/gate/extractor.js +122 -0
  82. package/dist/gate/extractor.js.map +1 -0
  83. package/dist/gate/index.d.ts +3 -0
  84. package/dist/gate/index.d.ts.map +1 -0
  85. package/dist/gate/index.js +6 -0
  86. package/dist/gate/index.js.map +1 -0
  87. package/dist/gate/memory-gate.d.ts +27 -0
  88. package/dist/gate/memory-gate.d.ts.map +1 -0
  89. package/dist/gate/memory-gate.js +86 -0
  90. package/dist/gate/memory-gate.js.map +1 -0
  91. package/dist/gate/redactor.d.ts +14 -0
  92. package/dist/gate/redactor.d.ts.map +1 -0
  93. package/dist/gate/redactor.js +24 -0
  94. package/dist/gate/redactor.js.map +1 -0
  95. package/dist/index.d.ts +6 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +24 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/indexing/in-memory-index.d.ts +67 -0
  100. package/dist/indexing/in-memory-index.d.ts.map +1 -0
  101. package/dist/indexing/in-memory-index.js +135 -0
  102. package/dist/indexing/in-memory-index.js.map +1 -0
  103. package/dist/indexing/index.d.ts +3 -0
  104. package/dist/indexing/index.d.ts.map +1 -0
  105. package/dist/indexing/index.js +6 -0
  106. package/dist/indexing/index.js.map +1 -0
  107. package/dist/persistence/database/schema.d.ts +6 -0
  108. package/dist/persistence/database/schema.d.ts.map +1 -0
  109. package/dist/persistence/database/schema.js +75 -0
  110. package/dist/persistence/database/schema.js.map +1 -0
  111. package/dist/persistence/index.d.ts +3 -0
  112. package/dist/persistence/index.d.ts.map +1 -0
  113. package/dist/persistence/index.js +6 -0
  114. package/dist/persistence/index.js.map +1 -0
  115. package/dist/persistence/repository/embedding-operations.d.ts +17 -0
  116. package/dist/persistence/repository/embedding-operations.d.ts.map +1 -0
  117. package/dist/persistence/repository/embedding-operations.js +58 -0
  118. package/dist/persistence/repository/embedding-operations.js.map +1 -0
  119. package/dist/persistence/repository/memory-operations.d.ts +28 -0
  120. package/dist/persistence/repository/memory-operations.d.ts.map +1 -0
  121. package/dist/persistence/repository/memory-operations.js +87 -0
  122. package/dist/persistence/repository/memory-operations.js.map +1 -0
  123. package/dist/persistence/repository/meta-operations.d.ts +15 -0
  124. package/dist/persistence/repository/meta-operations.d.ts.map +1 -0
  125. package/dist/persistence/repository/meta-operations.js +20 -0
  126. package/dist/persistence/repository/meta-operations.js.map +1 -0
  127. package/dist/persistence/sqlite-repo.d.ts +58 -0
  128. package/dist/persistence/sqlite-repo.d.ts.map +1 -0
  129. package/dist/persistence/sqlite-repo.js +81 -0
  130. package/dist/persistence/sqlite-repo.js.map +1 -0
  131. package/dist/persistence/utils/hash.d.ts +8 -0
  132. package/dist/persistence/utils/hash.d.ts.map +1 -0
  133. package/dist/persistence/utils/hash.js +48 -0
  134. package/dist/persistence/utils/hash.js.map +1 -0
  135. package/dist/persistence/utils/serialization.d.ts +33 -0
  136. package/dist/persistence/utils/serialization.d.ts.map +1 -0
  137. package/dist/persistence/utils/serialization.js +85 -0
  138. package/dist/persistence/utils/serialization.js.map +1 -0
  139. package/dist/processing/document/document-processor.d.ts +30 -0
  140. package/dist/processing/document/document-processor.d.ts.map +1 -0
  141. package/dist/processing/document/document-processor.js +158 -0
  142. package/dist/processing/document/document-processor.js.map +1 -0
  143. package/dist/processing/document/index.d.ts +3 -0
  144. package/dist/processing/document/index.d.ts.map +1 -0
  145. package/dist/processing/document/index.js +6 -0
  146. package/dist/processing/document/index.js.map +1 -0
  147. package/dist/ranker/ranker.d.ts +26 -0
  148. package/dist/ranker/ranker.d.ts.map +1 -0
  149. package/dist/ranker/ranker.js +40 -0
  150. package/dist/ranker/ranker.js.map +1 -0
  151. package/dist/recall/recall-engine.d.ts +19 -0
  152. package/dist/recall/recall-engine.d.ts.map +1 -0
  153. package/dist/recall/recall-engine.js +79 -0
  154. package/dist/recall/recall-engine.js.map +1 -0
  155. package/dist/types/config.d.ts +821 -0
  156. package/dist/types/config.d.ts.map +1 -0
  157. package/dist/types/config.js +128 -0
  158. package/dist/types/config.js.map +1 -0
  159. package/dist/types/document.d.ts +37 -0
  160. package/dist/types/document.d.ts.map +1 -0
  161. package/dist/types/document.js +6 -0
  162. package/dist/types/document.js.map +1 -0
  163. package/dist/types/index.d.ts +86 -0
  164. package/dist/types/index.d.ts.map +1 -0
  165. package/dist/types/index.js +6 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/package.json +53 -0
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ /**
3
+ * AgentMemory - Main class for agent memory management
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AgentMemory = void 0;
7
+ const config_1 = require("../config");
8
+ const adapters_1 = require("../adapters");
9
+ const gate_1 = require("../gate");
10
+ const recall_engine_1 = require("../recall/recall-engine");
11
+ const context_builder_1 = require("../context/context-builder");
12
+ const document_processor_1 = require("../processing/document/document-processor");
13
+ const persistence_1 = require("../persistence");
14
+ const indexing_1 = require("../indexing");
15
+ const embedding_1 = require("../embedding");
16
+ const boot_1 = require("../boot");
17
+ class AgentMemory {
18
+ constructor(config) {
19
+ this.store = null;
20
+ this.retriever = null;
21
+ this.recallEngine = null;
22
+ // Route A (in-memory) components
23
+ this.repo = null;
24
+ this.index = null;
25
+ this.embedder = null;
26
+ this.rebuilder = null;
27
+ this.isInMemoryMode = false;
28
+ this.config = config;
29
+ this.gate = new gate_1.MemoryGate(config);
30
+ this.documentProcessor = new document_processor_1.DocumentProcessor();
31
+ const mem0Mode = config.store.mem0.mode || "platform";
32
+ this.isInMemoryMode = mem0Mode === "in_memory";
33
+ if (this.isInMemoryMode) {
34
+ // Route A: Initialize SQLite + InMemoryIndex
35
+ this.initInMemoryMode();
36
+ }
37
+ else {
38
+ // Original: Platform API mode
39
+ this.store = (0, adapters_1.createMemoryStore)(config);
40
+ this.retriever = (0, adapters_1.createDocRetriever)(config);
41
+ this.recallEngine = new recall_engine_1.RecallEngine(this.store, this.retriever, config);
42
+ }
43
+ }
44
+ initInMemoryMode() {
45
+ if (!this.config.persistence?.sqlite) {
46
+ throw new Error("persistence.sqlite is required for in_memory mode");
47
+ }
48
+ if (!this.config.embedding) {
49
+ throw new Error("embedding configuration is required for in_memory mode");
50
+ }
51
+ // Initialize SQLite repository
52
+ this.repo = new persistence_1.SqliteMemoryRepo({
53
+ path: this.config.persistence.sqlite.path,
54
+ wal: this.config.persistence.sqlite.wal !== false,
55
+ });
56
+ // Initialize in-memory index
57
+ this.index = new indexing_1.InMemoryIndex();
58
+ // Initialize embedder
59
+ this.embedder = (0, embedding_1.createEmbedder)(this.config.embedding);
60
+ // Initialize boot rebuilder
61
+ if (this.config.boot?.rebuild?.enabled !== false) {
62
+ this.rebuilder = new boot_1.BootRebuilder(this.repo, this.index, this.embedder, {
63
+ batchSize: this.config.boot?.rebuild?.batch_size,
64
+ onModelMismatch: this.config.boot?.rebuild?.on_model_mismatch,
65
+ });
66
+ }
67
+ }
68
+ /**
69
+ * Create AgentMemory instance from YAML configuration file
70
+ */
71
+ static async fromYaml(configPath) {
72
+ const config = await (0, config_1.loadConfig)(configPath);
73
+ const instance = new AgentMemory(config);
74
+ // If in-memory mode, rebuild index on startup
75
+ if (instance.isInMemoryMode && instance.rebuilder) {
76
+ await instance.rebuilder.rebuild();
77
+ }
78
+ return instance;
79
+ }
80
+ /**
81
+ * Remember - Store memories from messages or text
82
+ */
83
+ async remember(options) {
84
+ // Process through MemoryGate
85
+ const items = await this.gate.process({
86
+ messages: options.messages,
87
+ text: options.text,
88
+ actor: options.actor,
89
+ scope: options.scope,
90
+ hint: options.hint,
91
+ });
92
+ if (items.length === 0) {
93
+ return;
94
+ }
95
+ if (this.isInMemoryMode) {
96
+ // Route A: Write to SQLite first, then index
97
+ await this.rememberInMemory(items, options);
98
+ }
99
+ else {
100
+ // Original: Write to platform API
101
+ if (!this.store) {
102
+ throw new Error("Store not initialized");
103
+ }
104
+ await this.store.add(items, {
105
+ actor: options.actor,
106
+ scope: options.scope,
107
+ });
108
+ }
109
+ }
110
+ async rememberInMemory(items, options) {
111
+ if (!this.repo || !this.index || !this.embedder) {
112
+ throw new Error("In-memory components not initialized");
113
+ }
114
+ // 1. Write to SQLite (source of truth)
115
+ const toIndex = [];
116
+ for (const item of items) {
117
+ const { inserted } = await this.repo.upsertMemory(item);
118
+ if (inserted) {
119
+ toIndex.push(item);
120
+ }
121
+ }
122
+ if (toIndex.length === 0) {
123
+ return; // All items were duplicates
124
+ }
125
+ // 2. Compute embeddings asynchronously (don't block)
126
+ this.persistEmbeddingsAsync(toIndex).catch((error) => {
127
+ console.error("Failed to persist embeddings:", error);
128
+ });
129
+ // 3. Add to in-memory index (for immediate recall)
130
+ await this.index.add(toIndex);
131
+ }
132
+ async persistEmbeddingsAsync(items) {
133
+ if (!this.repo || !this.index || !this.embedder || items.length === 0) {
134
+ return;
135
+ }
136
+ try {
137
+ const texts = items.map((item) => item.content);
138
+ const embeddings = await this.embedder.embed(texts);
139
+ for (let i = 0; i < items.length; i++) {
140
+ const item = items[i];
141
+ const embedding = embeddings[i];
142
+ // Save to SQLite
143
+ await this.repo.saveEmbedding(item.id, this.embedder.model, this.embedder.dim, embedding);
144
+ // Add to index
145
+ await this.index.addEmbedding(item.id, embedding);
146
+ }
147
+ }
148
+ catch (error) {
149
+ console.error("Failed to persist embeddings:", error);
150
+ // Mark as failed in SQLite (optional)
151
+ }
152
+ }
153
+ /**
154
+ * Recall - Retrieve memories and documents
155
+ */
156
+ async recall(options) {
157
+ if (this.isInMemoryMode) {
158
+ return this.recallInMemory(options);
159
+ }
160
+ else {
161
+ if (!this.recallEngine) {
162
+ throw new Error("Recall engine not initialized");
163
+ }
164
+ return this.recallEngine.recall(options);
165
+ }
166
+ }
167
+ async recallInMemory(options) {
168
+ if (!this.repo || !this.index || !this.embedder) {
169
+ throw new Error("In-memory components not initialized");
170
+ }
171
+ const topK = options.topK || 10;
172
+ // 1. Embed query
173
+ const queryEmbedding = (await this.embedder.embed([options.query]))[0];
174
+ // 2. Search in-memory index
175
+ const { ids } = await this.index.search(queryEmbedding, topK, {
176
+ actor: options.actor,
177
+ scope: options.scope,
178
+ });
179
+ // 3. Load full items from SQLite (source of truth)
180
+ const memory = await this.repo.loadByIds(ids);
181
+ // 4. Build context
182
+ const contextBuilder = new context_builder_1.ContextBuilder(this.config.recall?.context || {
183
+ enabled: true,
184
+ template: "default",
185
+ max_tokens: 1400,
186
+ });
187
+ // Get docs if enabled
188
+ let docs = [];
189
+ if (options.includeDocs !== false && this.retriever) {
190
+ try {
191
+ docs = await this.retriever.search(options.query, {
192
+ scope: options.scope,
193
+ topK,
194
+ });
195
+ }
196
+ catch (error) {
197
+ console.error("Failed to retrieve documents:", error);
198
+ }
199
+ }
200
+ const context = contextBuilder.build(memory, docs);
201
+ return {
202
+ memory,
203
+ docs,
204
+ context,
205
+ traceId: this.generateTraceId(),
206
+ };
207
+ }
208
+ generateTraceId() {
209
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
210
+ const r = (Math.random() * 16) | 0;
211
+ const v = c === "x" ? r : (r & 0x3) | 0x8;
212
+ return v.toString(16);
213
+ });
214
+ }
215
+ /**
216
+ * Remember documents - Store document content as memories
217
+ * Supports multi-modal documents (text, PDF, images, etc.)
218
+ */
219
+ async rememberDocument(options) {
220
+ const { document, actor, scope, autoChunk = true, chunkSize, chunkOverlap, extractMetadata = false, tags = [], } = options;
221
+ // Process documents into chunks
222
+ const chunks = autoChunk
223
+ ? this.documentProcessor.processDocument(document, {
224
+ chunkSize,
225
+ chunkOverlap,
226
+ })
227
+ : Array.isArray(document)
228
+ ? document
229
+ : [document];
230
+ // Convert chunks to memory items
231
+ const memoryItems = [];
232
+ for (const chunk of chunks) {
233
+ // Convert chunk to memory items
234
+ const items = this.documentProcessor.chunksToMemoryItems([chunk], actor, scope, tags);
235
+ memoryItems.push(...items);
236
+ // Extract metadata if requested
237
+ if (extractMetadata) {
238
+ const metaItems = this.documentProcessor.extractMetadataAsMemories(chunk, actor, scope);
239
+ memoryItems.push(...metaItems);
240
+ }
241
+ }
242
+ if (memoryItems.length === 0) {
243
+ return;
244
+ }
245
+ // Process through MemoryGate for redaction and deduplication
246
+ // Documents already have structure, so we apply light processing
247
+ // Use gate's internal components for redaction and deduplication only
248
+ const gateInternal = this.gate;
249
+ const redactor = gateInternal.redactor;
250
+ const deduplicator = gateInternal.deduplicator;
251
+ // Apply redaction to content
252
+ const redactedItems = memoryItems.map((item) => ({
253
+ ...item,
254
+ content: redactor.redact(item.content),
255
+ }));
256
+ // Filter out items with too little content after redaction
257
+ const validItems = redactedItems.filter((item) => item.content.trim().length >= 10);
258
+ // Apply deduplication
259
+ const finalItems = deduplicator.dedupe(validItems);
260
+ if (finalItems.length === 0) {
261
+ return;
262
+ }
263
+ // Store memories
264
+ if (this.isInMemoryMode) {
265
+ await this.rememberInMemory(finalItems, {
266
+ actor,
267
+ scope,
268
+ });
269
+ }
270
+ else {
271
+ if (!this.store) {
272
+ throw new Error("Store not initialized");
273
+ }
274
+ await this.store.add(finalItems, {
275
+ actor,
276
+ scope,
277
+ });
278
+ }
279
+ }
280
+ /**
281
+ * Feedback - Provide feedback for memory utility learning (reserved for v0.2+)
282
+ */
283
+ async feedback(options) {
284
+ // Placeholder for future implementation
285
+ console.warn("feedback() is not yet implemented in v0.1");
286
+ }
287
+ /**
288
+ * Close resources (SQLite connection, etc.)
289
+ */
290
+ close() {
291
+ if (this.repo) {
292
+ this.repo.close();
293
+ }
294
+ }
295
+ }
296
+ exports.AgentMemory = AgentMemory;
297
+ //# sourceMappingURL=agent-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-memory.js","sourceRoot":"","sources":["../../src/core/agent-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Embedding provider interface and implementations
3
+ */
4
+ export interface Embedder {
5
+ model: string;
6
+ dim: number;
7
+ embed(texts: string[]): Promise<Float32Array[]>;
8
+ }
9
+ export interface EmbedderConfig {
10
+ provider: "ollama" | "openai";
11
+ model: string;
12
+ dim: number;
13
+ base_url?: string;
14
+ api_key?: string;
15
+ concurrency?: number;
16
+ }
17
+ /**
18
+ * Ollama Embedder
19
+ */
20
+ export declare class OllamaEmbedder implements Embedder {
21
+ readonly model: string;
22
+ readonly dim: number;
23
+ private baseUrl;
24
+ private concurrency;
25
+ private queue;
26
+ private running;
27
+ constructor(config: EmbedderConfig);
28
+ embed(texts: string[]): Promise<Float32Array[]>;
29
+ private embedOne;
30
+ }
31
+ /**
32
+ * OpenAI Embedder
33
+ */
34
+ export declare class OpenAIEmbedder implements Embedder {
35
+ readonly model: string;
36
+ readonly dim: number;
37
+ private apiKey;
38
+ private baseUrl;
39
+ private concurrency;
40
+ private running;
41
+ constructor(config: EmbedderConfig);
42
+ embed(texts: string[]): Promise<Float32Array[]>;
43
+ private embedBatch;
44
+ }
45
+ /**
46
+ * Create embedder from config
47
+ */
48
+ export declare function createEmbedder(config: EmbedderConfig): Embedder;
49
+ //# sourceMappingURL=embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/embedding/embedder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAC7C,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,OAAO,CAAK;gBAER,MAAM,EAAE,cAAc;IAO5B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAevC,QAAQ;CAoCvB;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAC7C,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAK;gBAER,MAAM,EAAE,cAAc;IAW5B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YA4BvC,UAAU;CA6BzB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAS/D"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * Embedding provider interface and implementations
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAIEmbedder = exports.OllamaEmbedder = void 0;
7
+ exports.createEmbedder = createEmbedder;
8
+ /**
9
+ * Ollama Embedder
10
+ */
11
+ class OllamaEmbedder {
12
+ constructor(config) {
13
+ this.queue = [];
14
+ this.running = 0;
15
+ this.model = config.model;
16
+ this.dim = config.dim;
17
+ this.baseUrl = config.base_url || "http://localhost:11434";
18
+ this.concurrency = config.concurrency || 4;
19
+ }
20
+ async embed(texts) {
21
+ const results = [];
22
+ const promises = [];
23
+ for (const text of texts) {
24
+ const promise = this.embedOne(text).then((vector) => {
25
+ results.push(vector);
26
+ });
27
+ promises.push(promise);
28
+ }
29
+ await Promise.all(promises);
30
+ return results;
31
+ }
32
+ async embedOne(text) {
33
+ // Wait for available slot
34
+ while (this.running >= this.concurrency) {
35
+ await new Promise((resolve) => setTimeout(resolve, 10));
36
+ }
37
+ this.running++;
38
+ try {
39
+ const response = await fetch(`${this.baseUrl}/api/embeddings`, {
40
+ method: "POST",
41
+ headers: {
42
+ "Content-Type": "application/json",
43
+ },
44
+ body: JSON.stringify({
45
+ model: this.model,
46
+ prompt: text,
47
+ }),
48
+ });
49
+ if (!response.ok) {
50
+ const error = await response.text();
51
+ throw new Error(`Ollama embedding error: ${response.status} ${error}`);
52
+ }
53
+ const result = await response.json();
54
+ const embedding = result.embedding || result.embedding || [];
55
+ if (!Array.isArray(embedding) || embedding.length !== this.dim) {
56
+ throw new Error(`Invalid embedding dimension: expected ${this.dim}, got ${embedding.length}`);
57
+ }
58
+ return new Float32Array(embedding);
59
+ }
60
+ finally {
61
+ this.running--;
62
+ }
63
+ }
64
+ }
65
+ exports.OllamaEmbedder = OllamaEmbedder;
66
+ /**
67
+ * OpenAI Embedder
68
+ */
69
+ class OpenAIEmbedder {
70
+ constructor(config) {
71
+ this.running = 0;
72
+ if (!config.api_key) {
73
+ throw new Error("OpenAI API key is required");
74
+ }
75
+ this.model = config.model;
76
+ this.dim = config.dim;
77
+ this.apiKey = config.api_key;
78
+ this.baseUrl = config.base_url || "https://api.openai.com/v1";
79
+ this.concurrency = config.concurrency || 4;
80
+ }
81
+ async embed(texts) {
82
+ const results = [];
83
+ const batches = [];
84
+ const batchSize = 100; // OpenAI allows up to 2048 inputs per request
85
+ // Batch texts
86
+ for (let i = 0; i < texts.length; i += batchSize) {
87
+ batches.push(texts.slice(i, i + batchSize));
88
+ }
89
+ // Process batches with concurrency control
90
+ for (const batch of batches) {
91
+ while (this.running >= this.concurrency) {
92
+ await new Promise((resolve) => setTimeout(resolve, 10));
93
+ }
94
+ this.running++;
95
+ try {
96
+ const vectors = await this.embedBatch(batch);
97
+ results.push(...vectors);
98
+ }
99
+ finally {
100
+ this.running--;
101
+ }
102
+ }
103
+ return results;
104
+ }
105
+ async embedBatch(texts) {
106
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
107
+ method: "POST",
108
+ headers: {
109
+ "Content-Type": "application/json",
110
+ Authorization: `Bearer ${this.apiKey}`,
111
+ },
112
+ body: JSON.stringify({
113
+ model: this.model,
114
+ input: texts,
115
+ }),
116
+ });
117
+ if (!response.ok) {
118
+ const error = await response.text();
119
+ throw new Error(`OpenAI embedding error: ${response.status} ${error}`);
120
+ }
121
+ const result = await response.json();
122
+ const embeddings = result.data || [];
123
+ return embeddings.map((item) => {
124
+ const embedding = item.embedding || [];
125
+ if (!Array.isArray(embedding) || embedding.length !== this.dim) {
126
+ throw new Error(`Invalid embedding dimension: expected ${this.dim}, got ${embedding.length}`);
127
+ }
128
+ return new Float32Array(embedding);
129
+ });
130
+ }
131
+ }
132
+ exports.OpenAIEmbedder = OpenAIEmbedder;
133
+ /**
134
+ * Create embedder from config
135
+ */
136
+ function createEmbedder(config) {
137
+ switch (config.provider) {
138
+ case "ollama":
139
+ return new OllamaEmbedder(config);
140
+ case "openai":
141
+ return new OpenAIEmbedder(config);
142
+ default:
143
+ throw new Error(`Unsupported embedding provider: ${config.provider}`);
144
+ }
145
+ }
146
+ //# sourceMappingURL=embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/embedding/embedder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { Embedder, OllamaEmbedder, OpenAIEmbedder, createEmbedder } from "./embedder";
2
+ export type { EmbedderConfig } from "./embedder";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embedding/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtF,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEmbedder = exports.OpenAIEmbedder = exports.OllamaEmbedder = void 0;
4
+ var embedder_1 = require("./embedder");
5
+ Object.defineProperty(exports, "OllamaEmbedder", { enumerable: true, get: function () { return embedder_1.OllamaEmbedder; } });
6
+ Object.defineProperty(exports, "OpenAIEmbedder", { enumerable: true, get: function () { return embedder_1.OpenAIEmbedder; } });
7
+ Object.defineProperty(exports, "createEmbedder", { enumerable: true, get: function () { return embedder_1.createEmbedder; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embedding/index.ts"],"names":[],"mappings":";;;AAAA,uCAAsF;AAAnE,0GAAA,cAAc,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,0GAAA,cAAc,OAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Deduplication - Remove similar/duplicate memories
3
+ */
4
+ import { MemoryItem } from "../types";
5
+ export interface DeduplicationConfig {
6
+ enabled: boolean;
7
+ similarity_threshold: number;
8
+ }
9
+ export declare class Deduplicator {
10
+ private config;
11
+ constructor(config: DeduplicationConfig);
12
+ /**
13
+ * Simple text similarity using Jaccard similarity on words
14
+ * For production, consider using embeddings
15
+ */
16
+ private similarity;
17
+ /**
18
+ * Remove duplicates from a list of memory items
19
+ */
20
+ dedupe(items: MemoryItem[]): MemoryItem[];
21
+ }
22
+ //# sourceMappingURL=deduplicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deduplicator.d.ts","sourceRoot":"","sources":["../../src/gate/deduplicator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIvC;;;OAGG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE;CAuD1C"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * Deduplication - Remove similar/duplicate memories
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Deduplicator = void 0;
7
+ class Deduplicator {
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ /**
12
+ * Simple text similarity using Jaccard similarity on words
13
+ * For production, consider using embeddings
14
+ */
15
+ similarity(text1, text2) {
16
+ const words1 = new Set(text1.toLowerCase().split(/\s+/));
17
+ const words2 = new Set(text2.toLowerCase().split(/\s+/));
18
+ const intersection = new Set([...words1].filter(x => words2.has(x)));
19
+ const union = new Set([...words1, ...words2]);
20
+ return intersection.size / union.size;
21
+ }
22
+ /**
23
+ * Remove duplicates from a list of memory items
24
+ */
25
+ dedupe(items) {
26
+ if (!this.config.enabled || items.length <= 1) {
27
+ return items;
28
+ }
29
+ const result = [];
30
+ const seen = new Set();
31
+ for (let i = 0; i < items.length; i++) {
32
+ if (seen.has(i)) {
33
+ continue;
34
+ }
35
+ const item = items[i];
36
+ const duplicates = [];
37
+ // Find similar items
38
+ for (let j = i + 1; j < items.length; j++) {
39
+ if (seen.has(j)) {
40
+ continue;
41
+ }
42
+ const other = items[j];
43
+ // Only dedupe items of the same type
44
+ if (item.type === other.type) {
45
+ const sim = this.similarity(item.content, other.content);
46
+ if (sim >= this.config.similarity_threshold) {
47
+ duplicates.push(j);
48
+ }
49
+ }
50
+ }
51
+ // Keep the item with higher confidence, or the first one
52
+ if (duplicates.length > 0) {
53
+ const allSimilar = [i, ...duplicates];
54
+ allSimilar.sort((a, b) => {
55
+ const confA = items[a].confidence || 0;
56
+ const confB = items[b].confidence || 0;
57
+ return confB - confA;
58
+ });
59
+ // Keep the best one
60
+ result.push(items[allSimilar[0]]);
61
+ // Mark others as seen
62
+ for (let idx of allSimilar.slice(1)) {
63
+ seen.add(idx);
64
+ }
65
+ }
66
+ else {
67
+ result.push(item);
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ }
73
+ exports.Deduplicator = Deduplicator;
74
+ //# sourceMappingURL=deduplicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deduplicator.js","sourceRoot":"","sources":["../../src/gate/deduplicator.ts"],"names":[],"mappings":"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"}