@lupaflow/memory 0.1.0 → 0.1.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.
package/dist/index.cjs ADDED
@@ -0,0 +1,455 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ LongTermMemory: () => LongTermMemory,
24
+ MemoryStore: () => MemoryStore,
25
+ ProjectMemory: () => ProjectMemory,
26
+ SemanticMemory: () => SemanticMemory,
27
+ SessionMemory: () => SessionMemory,
28
+ ShortTermMemory: () => ShortTermMemory,
29
+ UserMemory: () => UserMemory,
30
+ VectorMemory: () => VectorMemory
31
+ });
32
+ module.exports = __toCommonJS(src_exports);
33
+
34
+ // src/short-term.ts
35
+ var import_core = require("@lupaflow/core");
36
+ var ShortTermMemory = class {
37
+ type = "short-term";
38
+ entries = [];
39
+ maxEntries;
40
+ constructor(maxEntries = 50) {
41
+ this.maxEntries = maxEntries;
42
+ }
43
+ async store(entry) {
44
+ this.entries.push({
45
+ ...entry,
46
+ id: entry.id || (0, import_core.generateId)(),
47
+ timestamp: entry.timestamp || Date.now()
48
+ });
49
+ if (this.entries.length > this.maxEntries) {
50
+ this.entries.shift();
51
+ }
52
+ }
53
+ async retrieve(query) {
54
+ let results = this.entries;
55
+ if (query.key) {
56
+ results = results.filter((e) => e.key === query.key);
57
+ }
58
+ if (query.scope) {
59
+ results = results.filter((e) => e.scope === query.scope);
60
+ }
61
+ return results.slice(-(query.limit || 20));
62
+ }
63
+ async search(_query, limit = 5) {
64
+ const q = _query.toLowerCase();
65
+ const results = this.entries.filter((e) => e.content.toLowerCase().includes(q)).slice(-limit);
66
+ return results.map((entry) => ({
67
+ entry,
68
+ score: 1
69
+ }));
70
+ }
71
+ async delete(key) {
72
+ this.entries = this.entries.filter((e) => e.key !== key);
73
+ }
74
+ async clear() {
75
+ this.entries = [];
76
+ }
77
+ };
78
+
79
+ // src/long-term.ts
80
+ var import_promises = require("fs/promises");
81
+ var import_path = require("path");
82
+ var import_core2 = require("@lupaflow/core");
83
+ var LongTermMemory = class {
84
+ type = "long-term";
85
+ entries = [];
86
+ filePath;
87
+ constructor(name = "default") {
88
+ this.filePath = (0, import_path.join)(process.cwd(), ".lupaflow", `memory-${name}.json`);
89
+ }
90
+ async init() {
91
+ try {
92
+ await (0, import_promises.access)(this.filePath);
93
+ const data = await (0, import_promises.readFile)(this.filePath, "utf-8");
94
+ this.entries = JSON.parse(data);
95
+ } catch {
96
+ this.entries = [];
97
+ }
98
+ }
99
+ async persist() {
100
+ const dir = (0, import_path.join)(process.cwd(), ".lupaflow");
101
+ try {
102
+ await (0, import_promises.access)(dir);
103
+ } catch {
104
+ await (0, import_promises.writeFile)(dir, "", { flag: "a" });
105
+ }
106
+ await (0, import_promises.writeFile)(this.filePath, JSON.stringify(this.entries, null, 2));
107
+ }
108
+ async store(entry) {
109
+ this.entries.push({
110
+ ...entry,
111
+ id: entry.id || (0, import_core2.generateId)(),
112
+ timestamp: entry.timestamp || Date.now()
113
+ });
114
+ await this.persist();
115
+ }
116
+ async retrieve(query) {
117
+ let results = this.entries;
118
+ if (query.key) results = results.filter((e) => e.key === query.key);
119
+ if (query.type) results = results.filter((e) => e.type === query.type);
120
+ if (query.scope) results = results.filter((e) => e.scope === query.scope);
121
+ return results.slice(-(query.limit || 50));
122
+ }
123
+ async search(_query, limit = 10) {
124
+ const q = _query.toLowerCase();
125
+ return this.entries.filter((e) => e.content.toLowerCase().includes(q)).slice(-limit).map((entry) => ({ entry, score: 1 }));
126
+ }
127
+ async delete(key) {
128
+ this.entries = this.entries.filter((e) => e.key !== key);
129
+ await this.persist();
130
+ }
131
+ async clear() {
132
+ this.entries = [];
133
+ await this.persist();
134
+ }
135
+ };
136
+
137
+ // src/semantic.ts
138
+ var import_core3 = require("@lupaflow/core");
139
+ function cosineSimilarity(a, b) {
140
+ let dot = 0, magA = 0, magB = 0;
141
+ for (let i = 0; i < a.length; i++) {
142
+ dot += a[i] * b[i];
143
+ magA += a[i] * a[i];
144
+ magB += b[i] * b[i];
145
+ }
146
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
147
+ return denom === 0 ? 0 : dot / denom;
148
+ }
149
+ function simpleEmbed(text) {
150
+ const dim = 128;
151
+ const vec = new Array(dim).fill(0);
152
+ for (let i = 0; i < text.length; i++) {
153
+ const idx = (text.charCodeAt(i) * 7 + i * 13) % dim;
154
+ vec[idx] += 1 + text.charCodeAt(i) % 5 * 0.1;
155
+ }
156
+ const mag = Math.sqrt(vec.reduce((s, v) => s + v * v, 0));
157
+ return mag > 0 ? vec.map((v) => v / mag) : vec;
158
+ }
159
+ var SemanticMemory = class {
160
+ type = "semantic";
161
+ entries = [];
162
+ async store(entry) {
163
+ this.entries.push({
164
+ ...entry,
165
+ id: entry.id || (0, import_core3.generateId)(),
166
+ timestamp: entry.timestamp || Date.now(),
167
+ embedding: simpleEmbed(entry.content)
168
+ });
169
+ }
170
+ async retrieve(query) {
171
+ let results = this.entries;
172
+ if (query.key) results = results.filter((e) => e.key === query.key);
173
+ if (query.scope) results = results.filter((e) => e.scope === query.scope);
174
+ return results.slice(-(query.limit || 20));
175
+ }
176
+ async search(_query, limit = 10) {
177
+ const queryEmbedding = simpleEmbed(_query);
178
+ const scored = this.entries.map((entry) => ({
179
+ entry,
180
+ score: cosineSimilarity(queryEmbedding, entry.embedding)
181
+ })).sort((a, b) => b.score - a.score).slice(0, limit);
182
+ return scored;
183
+ }
184
+ async delete(key) {
185
+ this.entries = this.entries.filter((e) => e.key !== key);
186
+ }
187
+ async clear() {
188
+ this.entries = [];
189
+ }
190
+ };
191
+
192
+ // src/session.ts
193
+ var import_core4 = require("@lupaflow/core");
194
+ var SESSION_KEY = "__session__";
195
+ var SessionMemory = class {
196
+ type = "session";
197
+ entries = [];
198
+ async store(entry) {
199
+ this.entries.push({
200
+ ...entry,
201
+ id: entry.id || (0, import_core4.generateId)(),
202
+ scope: SESSION_KEY,
203
+ timestamp: entry.timestamp || Date.now()
204
+ });
205
+ }
206
+ async retrieve(query) {
207
+ let results = this.entries.filter((e) => e.scope === SESSION_KEY);
208
+ if (query.key) results = results.filter((e) => e.key === query.key);
209
+ return results.slice(-(query.limit || 50));
210
+ }
211
+ async search(_query, limit = 10) {
212
+ const q = _query.toLowerCase();
213
+ return this.entries.filter((e) => e.scope === SESSION_KEY && e.content.toLowerCase().includes(q)).slice(-limit).map((entry) => ({ entry, score: 1 }));
214
+ }
215
+ async delete(key) {
216
+ this.entries = this.entries.filter((e) => e.key !== key && e.scope === SESSION_KEY);
217
+ }
218
+ async clear() {
219
+ this.entries = this.entries.filter((e) => e.scope !== SESSION_KEY);
220
+ }
221
+ };
222
+
223
+ // src/user.ts
224
+ var import_core5 = require("@lupaflow/core");
225
+ var UserMemory = class {
226
+ type = "user";
227
+ entries = [];
228
+ userId;
229
+ constructor(userId) {
230
+ this.userId = userId;
231
+ }
232
+ async store(entry) {
233
+ this.entries.push({
234
+ ...entry,
235
+ id: entry.id || (0, import_core5.generateId)(),
236
+ scope: `user:${this.userId}`,
237
+ timestamp: entry.timestamp || Date.now()
238
+ });
239
+ }
240
+ async retrieve(query) {
241
+ let results = this.entries.filter((e) => e.scope === `user:${this.userId}`);
242
+ if (query.key) results = results.filter((e) => e.key === query.key);
243
+ return results.slice(-(query.limit || 50));
244
+ }
245
+ async search(_query, limit = 10) {
246
+ const q = _query.toLowerCase();
247
+ return this.entries.filter((e) => e.scope === `user:${this.userId}` && e.content.toLowerCase().includes(q)).slice(-limit).map((entry) => ({ entry, score: 1 }));
248
+ }
249
+ async delete(key) {
250
+ this.entries = this.entries.filter(
251
+ (e) => !(e.key === key && e.scope === `user:${this.userId}`)
252
+ );
253
+ }
254
+ async clear() {
255
+ this.entries = this.entries.filter((e) => e.scope !== `user:${this.userId}`);
256
+ }
257
+ };
258
+
259
+ // src/project.ts
260
+ var import_core6 = require("@lupaflow/core");
261
+ var import_promises2 = require("fs/promises");
262
+ var PROJECT_MEMORY_FILE = ".lupaflow/project-memory.json";
263
+ var ProjectMemory = class {
264
+ type = "project";
265
+ entries = [];
266
+ loaded = false;
267
+ async ensureLoaded() {
268
+ if (this.loaded) return;
269
+ try {
270
+ await (0, import_promises2.access)(PROJECT_MEMORY_FILE);
271
+ const data = await (0, import_promises2.readFile)(PROJECT_MEMORY_FILE, "utf-8");
272
+ this.entries = JSON.parse(data);
273
+ } catch {
274
+ this.entries = [];
275
+ }
276
+ this.loaded = true;
277
+ }
278
+ async persist() {
279
+ await (0, import_promises2.writeFile)(PROJECT_MEMORY_FILE, JSON.stringify(this.entries, null, 2));
280
+ }
281
+ async store(entry) {
282
+ await this.ensureLoaded();
283
+ this.entries.push({
284
+ ...entry,
285
+ id: entry.id || (0, import_core6.generateId)(),
286
+ scope: "project",
287
+ timestamp: entry.timestamp || Date.now()
288
+ });
289
+ await this.persist();
290
+ }
291
+ async retrieve(query) {
292
+ await this.ensureLoaded();
293
+ let results = this.entries.filter((e) => e.scope === "project");
294
+ if (query.key) results = results.filter((e) => e.key === query.key);
295
+ return results.slice(-(query.limit || 50));
296
+ }
297
+ async search(_query, limit = 10) {
298
+ await this.ensureLoaded();
299
+ const q = _query.toLowerCase();
300
+ return this.entries.filter((e) => e.scope === "project" && e.content.toLowerCase().includes(q)).slice(-limit).map((entry) => ({ entry, score: 1 }));
301
+ }
302
+ async delete(key) {
303
+ await this.ensureLoaded();
304
+ this.entries = this.entries.filter((e) => !(e.key === key && e.scope === "project"));
305
+ await this.persist();
306
+ }
307
+ async clear() {
308
+ await this.ensureLoaded();
309
+ this.entries = this.entries.filter((e) => e.scope !== "project");
310
+ await this.persist();
311
+ }
312
+ };
313
+
314
+ // src/store.ts
315
+ var import_core7 = require("@lupaflow/core");
316
+ var import_core8 = require("@lupaflow/core");
317
+ var MemoryStore = class {
318
+ backends = /* @__PURE__ */ new Map();
319
+ constructor(config) {
320
+ if (config?.shortTerm !== false) this.backends.set("short-term", new ShortTermMemory());
321
+ if (config?.longTerm) this.backends.set("long-term", new LongTermMemory());
322
+ if (config?.semantic) this.backends.set("semantic", new SemanticMemory());
323
+ if (config?.session !== false) this.backends.set("session", new SessionMemory());
324
+ if (config?.user) this.backends.set("user", new UserMemory(config.user));
325
+ if (config?.project) this.backends.set("project", new ProjectMemory());
326
+ }
327
+ register(type, backend) {
328
+ this.backends.set(type, backend);
329
+ }
330
+ get(type) {
331
+ const backend = this.backends.get(type);
332
+ if (!backend) throw new import_core7.MemoryError(`No memory backend registered: ${type}`);
333
+ return backend;
334
+ }
335
+ async store(entry) {
336
+ if (entry.type === "short-term" || entry.type === "session") {
337
+ const backend = this.backends.get(entry.type);
338
+ if (backend) {
339
+ await backend.store(entry);
340
+ await import_core8.globalEventBus.emit("memory:update", {
341
+ type: entry.type,
342
+ key: entry.key
343
+ });
344
+ }
345
+ return;
346
+ }
347
+ for (const backend of this.backends.values()) {
348
+ await backend.store({ ...entry });
349
+ }
350
+ await import_core8.globalEventBus.emit("memory:update", { type: entry.type, key: entry.key });
351
+ }
352
+ async retrieve(query) {
353
+ if (query.type) {
354
+ const backend = this.get(query.type);
355
+ const results = await backend.retrieve(query);
356
+ await import_core8.globalEventBus.emit("memory:retrieve", {
357
+ type: query.type,
358
+ key: query.key || "all",
359
+ results: results.length
360
+ });
361
+ return results;
362
+ }
363
+ const all = [];
364
+ for (const backend of this.backends.values()) {
365
+ all.push(...await backend.retrieve(query));
366
+ }
367
+ return all;
368
+ }
369
+ async search(query, limit = 10) {
370
+ const all = [];
371
+ for (const backend of this.backends.values()) {
372
+ all.push(...await backend.search(query, limit));
373
+ }
374
+ return all.sort((a, b) => b.score - a.score).slice(0, limit);
375
+ }
376
+ async delete(key) {
377
+ for (const backend of this.backends.values()) {
378
+ await backend.delete(key);
379
+ }
380
+ }
381
+ async clear() {
382
+ for (const backend of this.backends.values()) {
383
+ await backend.clear();
384
+ }
385
+ }
386
+ };
387
+
388
+ // src/vector.ts
389
+ var import_core9 = require("@lupaflow/core");
390
+ function cosineSimilarity2(a, b) {
391
+ let dot = 0, magA = 0, magB = 0;
392
+ for (let i = 0; i < a.length; i++) {
393
+ dot += a[i] * b[i];
394
+ magA += a[i] * a[i];
395
+ magB += b[i] * b[i];
396
+ }
397
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
398
+ return denom === 0 ? 0 : dot / denom;
399
+ }
400
+ function generateEmbedding(text) {
401
+ const dim = 384;
402
+ const vec = new Array(dim).fill(0);
403
+ for (let i = 0; i < text.length; i++) {
404
+ const code = text.charCodeAt(i);
405
+ for (let j = 0; j < 5; j++) {
406
+ const idx = (code * (j + 1) + i * 17 + j * 31) % dim;
407
+ vec[idx] += 1 / (j + 1);
408
+ }
409
+ }
410
+ const mag = Math.sqrt(vec.reduce((s, v) => s + v * v, 0));
411
+ return mag > 0 ? vec.map((v) => v / mag) : vec;
412
+ }
413
+ var VectorMemory = class {
414
+ type = "vector";
415
+ entries = [];
416
+ async store(entry) {
417
+ this.entries.push({
418
+ ...entry,
419
+ id: entry.id || (0, import_core9.generateId)(),
420
+ timestamp: entry.timestamp || Date.now(),
421
+ embedding: generateEmbedding(entry.content)
422
+ });
423
+ }
424
+ async retrieve(query) {
425
+ let results = this.entries;
426
+ if (query.key) results = results.filter((e) => e.key === query.key);
427
+ if (query.scope) results = results.filter((e) => e.scope === query.scope);
428
+ return results.slice(-(query.limit || 20));
429
+ }
430
+ async search(_query, limit = 10, threshold = 0.3) {
431
+ const queryEmbedding = generateEmbedding(_query);
432
+ return this.entries.map((entry) => ({
433
+ entry,
434
+ score: cosineSimilarity2(queryEmbedding, entry.embedding)
435
+ })).filter((r) => r.score >= threshold).sort((a, b) => b.score - a.score).slice(0, limit);
436
+ }
437
+ async delete(key) {
438
+ this.entries = this.entries.filter((e) => e.key !== key);
439
+ }
440
+ async clear() {
441
+ this.entries = [];
442
+ }
443
+ };
444
+ // Annotate the CommonJS export names for ESM import in node:
445
+ 0 && (module.exports = {
446
+ LongTermMemory,
447
+ MemoryStore,
448
+ ProjectMemory,
449
+ SemanticMemory,
450
+ SessionMemory,
451
+ ShortTermMemory,
452
+ UserMemory,
453
+ VectorMemory
454
+ });
455
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/short-term.ts","../src/long-term.ts","../src/semantic.ts","../src/session.ts","../src/user.ts","../src/project.ts","../src/store.ts","../src/vector.ts"],"sourcesContent":["export { MemoryStore } from \"./store\"\nexport { ShortTermMemory } from \"./short-term\"\nexport { LongTermMemory } from \"./long-term\"\nexport { SemanticMemory } from \"./semantic\"\nexport { SessionMemory } from \"./session\"\nexport { UserMemory } from \"./user\"\nexport { ProjectMemory } from \"./project\"\nexport { VectorMemory } from \"./vector\"\nexport type { MemoryBackend } from \"./interface\"\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nexport class ShortTermMemory implements MemoryBackend {\n readonly type = \"short-term\" as const\n private entries: MemoryEntry[] = []\n private maxEntries: number\n\n constructor(maxEntries = 50) {\n this.maxEntries = maxEntries\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n timestamp: entry.timestamp || Date.now(),\n })\n if (this.entries.length > this.maxEntries) {\n this.entries.shift()\n }\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries\n if (query.key) {\n results = results.filter((e) => e.key === query.key)\n }\n if (query.scope) {\n results = results.filter((e) => e.scope === query.scope)\n }\n return results.slice(-(query.limit || 20))\n }\n\n async search(_query: string, limit = 5): Promise<MemorySearchResult[]> {\n const q = _query.toLowerCase()\n const results = this.entries\n .filter((e) => e.content.toLowerCase().includes(q))\n .slice(-limit)\n return results.map((entry) => ({\n entry,\n score: 1,\n }))\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key)\n }\n\n async clear(): Promise<void> {\n this.entries = []\n }\n}\n","import { readFile, writeFile, access } from \"fs/promises\"\nimport { join } from \"path\"\nimport type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nexport class LongTermMemory implements MemoryBackend {\n readonly type = \"long-term\" as const\n private entries: MemoryEntry[] = []\n private filePath: string\n\n constructor(name = \"default\") {\n this.filePath = join(process.cwd(), \".lupaflow\", `memory-${name}.json`)\n }\n\n async init(): Promise<void> {\n try {\n await access(this.filePath)\n const data = await readFile(this.filePath, \"utf-8\")\n this.entries = JSON.parse(data)\n } catch {\n this.entries = []\n }\n }\n\n async persist(): Promise<void> {\n const dir = join(process.cwd(), \".lupaflow\")\n try {\n await access(dir)\n } catch {\n await writeFile(dir, \"\", { flag: \"a\" })\n }\n await writeFile(this.filePath, JSON.stringify(this.entries, null, 2))\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n timestamp: entry.timestamp || Date.now(),\n })\n await this.persist()\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries\n if (query.key) results = results.filter((e) => e.key === query.key)\n if (query.type) results = results.filter((e) => e.type === query.type)\n if (query.scope) results = results.filter((e) => e.scope === query.scope)\n return results.slice(-(query.limit || 50))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n const q = _query.toLowerCase()\n return this.entries\n .filter((e) => e.content.toLowerCase().includes(q))\n .slice(-limit)\n .map((entry) => ({ entry, score: 1 }))\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key)\n await this.persist()\n }\n\n async clear(): Promise<void> {\n this.entries = []\n await this.persist()\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0, magA = 0, magB = 0\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n magA += a[i] * a[i]\n magB += b[i] * b[i]\n }\n const denom = Math.sqrt(magA) * Math.sqrt(magB)\n return denom === 0 ? 0 : dot / denom\n}\n\nfunction simpleEmbed(text: string): number[] {\n const dim = 128\n const vec = new Array(dim).fill(0)\n for (let i = 0; i < text.length; i++) {\n const idx = (text.charCodeAt(i) * 7 + i * 13) % dim\n vec[idx] += 1 + (text.charCodeAt(i) % 5) * 0.1\n }\n const mag = Math.sqrt(vec.reduce((s, v) => s + v * v, 0))\n return mag > 0 ? vec.map((v) => v / mag) : vec\n}\n\ninterface SemanticEntry extends MemoryEntry {\n embedding: number[]\n}\n\nexport class SemanticMemory implements MemoryBackend {\n readonly type = \"semantic\" as const\n private entries: SemanticEntry[] = []\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n timestamp: entry.timestamp || Date.now(),\n embedding: simpleEmbed(entry.content),\n })\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries\n if (query.key) results = results.filter((e) => e.key === query.key)\n if (query.scope) results = results.filter((e) => e.scope === query.scope)\n return results.slice(-(query.limit || 20))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n const queryEmbedding = simpleEmbed(_query)\n const scored = this.entries\n .map((entry) => ({\n entry,\n score: cosineSimilarity(queryEmbedding, entry.embedding),\n }))\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n return scored\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key)\n }\n\n async clear(): Promise<void> {\n this.entries = []\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nconst SESSION_KEY = \"__session__\"\n\nexport class SessionMemory implements MemoryBackend {\n readonly type = \"session\" as const\n private entries: MemoryEntry[] = []\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n scope: SESSION_KEY,\n timestamp: entry.timestamp || Date.now(),\n })\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries.filter((e) => e.scope === SESSION_KEY)\n if (query.key) results = results.filter((e) => e.key === query.key)\n return results.slice(-(query.limit || 50))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n const q = _query.toLowerCase()\n return this.entries\n .filter((e) => e.scope === SESSION_KEY && e.content.toLowerCase().includes(q))\n .slice(-limit)\n .map((entry) => ({ entry, score: 1 }))\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key && e.scope === SESSION_KEY)\n }\n\n async clear(): Promise<void> {\n this.entries = this.entries.filter((e) => e.scope !== SESSION_KEY)\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nexport class UserMemory implements MemoryBackend {\n readonly type = \"user\" as const\n private entries: MemoryEntry[] = []\n private userId: string\n\n constructor(userId: string) {\n this.userId = userId\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n scope: `user:${this.userId}`,\n timestamp: entry.timestamp || Date.now(),\n })\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries.filter((e) => e.scope === `user:${this.userId}`)\n if (query.key) results = results.filter((e) => e.key === query.key)\n return results.slice(-(query.limit || 50))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n const q = _query.toLowerCase()\n return this.entries\n .filter((e) => e.scope === `user:${this.userId}` && e.content.toLowerCase().includes(q))\n .slice(-limit)\n .map((entry) => ({ entry, score: 1 }))\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter(\n (e) => !(e.key === key && e.scope === `user:${this.userId}`)\n )\n }\n\n async clear(): Promise<void> {\n this.entries = this.entries.filter((e) => e.scope !== `user:${this.userId}`)\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\nimport { readFile, writeFile, access } from \"fs/promises\"\n\nconst PROJECT_MEMORY_FILE = \".lupaflow/project-memory.json\"\n\nexport class ProjectMemory implements MemoryBackend {\n readonly type = \"project\" as const\n private entries: MemoryEntry[] = []\n private loaded = false\n\n async ensureLoaded(): Promise<void> {\n if (this.loaded) return\n try {\n await access(PROJECT_MEMORY_FILE)\n const data = await readFile(PROJECT_MEMORY_FILE, \"utf-8\")\n this.entries = JSON.parse(data)\n } catch {\n this.entries = []\n }\n this.loaded = true\n }\n\n async persist(): Promise<void> {\n await writeFile(PROJECT_MEMORY_FILE, JSON.stringify(this.entries, null, 2))\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n await this.ensureLoaded()\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n scope: \"project\",\n timestamp: entry.timestamp || Date.now(),\n })\n await this.persist()\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n await this.ensureLoaded()\n let results = this.entries.filter((e) => e.scope === \"project\")\n if (query.key) results = results.filter((e) => e.key === query.key)\n return results.slice(-(query.limit || 50))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n await this.ensureLoaded()\n const q = _query.toLowerCase()\n return this.entries\n .filter((e) => e.scope === \"project\" && e.content.toLowerCase().includes(q))\n .slice(-limit)\n .map((entry) => ({ entry, score: 1 }))\n }\n\n async delete(key: string): Promise<void> {\n await this.ensureLoaded()\n this.entries = this.entries.filter((e) => !(e.key === key && e.scope === \"project\"))\n await this.persist()\n }\n\n async clear(): Promise<void> {\n await this.ensureLoaded()\n this.entries = this.entries.filter((e) => e.scope !== \"project\")\n await this.persist()\n }\n}\n","import type { MemoryBackend } from \"./interface\"\nimport type { MemoryEntry, MemoryQuery, MemorySearchResult, MemoryType } from \"@lupaflow/types\"\nimport { ShortTermMemory } from \"./short-term\"\nimport { LongTermMemory } from \"./long-term\"\nimport { SemanticMemory } from \"./semantic\"\nimport { SessionMemory } from \"./session\"\nimport { UserMemory } from \"./user\"\nimport { ProjectMemory } from \"./project\"\nimport { MemoryError } from \"@lupaflow/core\"\nimport { globalEventBus } from \"@lupaflow/core\"\n\nexport class MemoryStore {\n private backends: Map<MemoryType, MemoryBackend> = new Map()\n\n constructor(config?: { shortTerm?: boolean; longTerm?: boolean; semantic?: boolean; session?: boolean; user?: string; project?: boolean }) {\n if (config?.shortTerm !== false) this.backends.set(\"short-term\", new ShortTermMemory())\n if (config?.longTerm) this.backends.set(\"long-term\", new LongTermMemory())\n if (config?.semantic) this.backends.set(\"semantic\", new SemanticMemory())\n if (config?.session !== false) this.backends.set(\"session\", new SessionMemory())\n if (config?.user) this.backends.set(\"user\", new UserMemory(config.user))\n if (config?.project) this.backends.set(\"project\", new ProjectMemory())\n }\n\n register(type: MemoryType, backend: MemoryBackend): void {\n this.backends.set(type, backend)\n }\n\n get(type: MemoryType): MemoryBackend {\n const backend = this.backends.get(type)\n if (!backend) throw new MemoryError(`No memory backend registered: ${type}`)\n return backend\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n if (entry.type === \"short-term\" || entry.type === \"session\") {\n const backend = this.backends.get(entry.type)\n if (backend) {\n await backend.store(entry)\n await globalEventBus.emit(\"memory:update\", {\n type: entry.type,\n key: entry.key,\n } as any)\n }\n return\n }\n\n for (const backend of this.backends.values()) {\n await backend.store({ ...entry })\n }\n await globalEventBus.emit(\"memory:update\", { type: entry.type, key: entry.key } as any)\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n if (query.type) {\n const backend = this.get(query.type)\n const results = await backend.retrieve(query)\n await globalEventBus.emit(\"memory:retrieve\", {\n type: query.type,\n key: query.key || \"all\",\n results: results.length,\n } as any)\n return results\n }\n\n const all: MemoryEntry[] = []\n for (const backend of this.backends.values()) {\n all.push(...(await backend.retrieve(query)))\n }\n return all\n }\n\n async search(query: string, limit = 10): Promise<MemorySearchResult[]> {\n const all: MemorySearchResult[] = []\n for (const backend of this.backends.values()) {\n all.push(...(await backend.search(query, limit)))\n }\n return all.sort((a, b) => b.score - a.score).slice(0, limit)\n }\n\n async delete(key: string): Promise<void> {\n for (const backend of this.backends.values()) {\n await backend.delete(key)\n }\n }\n\n async clear(): Promise<void> {\n for (const backend of this.backends.values()) {\n await backend.clear()\n }\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0, magA = 0, magB = 0\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n magA += a[i] * a[i]\n magB += b[i] * b[i]\n }\n const denom = Math.sqrt(magA) * Math.sqrt(magB)\n return denom === 0 ? 0 : dot / denom\n}\n\nfunction generateEmbedding(text: string): number[] {\n const dim = 384\n const vec = new Array(dim).fill(0)\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i)\n for (let j = 0; j < 5; j++) {\n const idx = (code * (j + 1) + i * 17 + j * 31) % dim\n vec[idx] += 1.0 / (j + 1)\n }\n }\n const mag = Math.sqrt(vec.reduce((s, v) => s + v * v, 0))\n return mag > 0 ? vec.map((v) => v / mag) : vec\n}\n\ninterface VectorEntry extends MemoryEntry {\n embedding: number[]\n}\n\nexport class VectorMemory implements MemoryBackend {\n readonly type = \"vector\" as const\n private entries: VectorEntry[] = []\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n timestamp: entry.timestamp || Date.now(),\n embedding: generateEmbedding(entry.content),\n })\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results: MemoryEntry[] = this.entries\n if (query.key) results = results.filter((e) => e.key === query.key)\n if (query.scope) results = results.filter((e) => e.scope === query.scope)\n return results.slice(-(query.limit || 20))\n }\n\n async search(_query: string, limit = 10, threshold = 0.3): Promise<MemorySearchResult[]> {\n const queryEmbedding = generateEmbedding(_query)\n return this.entries\n .map((entry) => ({\n entry,\n score: cosineSimilarity(queryEmbedding, entry.embedding),\n }))\n .filter((r) => r.score >= threshold)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key)\n }\n\n async clear(): Promise<void> {\n this.entries = []\n }\n}\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core","import_core","import_promises","import_core","import_core","cosineSimilarity"]}
@@ -0,0 +1,112 @@
1
+ import { MemoryType, MemoryEntry, MemoryQuery, MemorySearchResult } from '@lupaflow/types';
2
+
3
+ interface MemoryBackend {
4
+ readonly type: MemoryType;
5
+ store(entry: MemoryEntry): Promise<void>;
6
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
7
+ search(query: string, limit?: number): Promise<MemorySearchResult[]>;
8
+ delete(key: string): Promise<void>;
9
+ clear(): Promise<void>;
10
+ }
11
+
12
+ declare class MemoryStore {
13
+ private backends;
14
+ constructor(config?: {
15
+ shortTerm?: boolean;
16
+ longTerm?: boolean;
17
+ semantic?: boolean;
18
+ session?: boolean;
19
+ user?: string;
20
+ project?: boolean;
21
+ });
22
+ register(type: MemoryType, backend: MemoryBackend): void;
23
+ get(type: MemoryType): MemoryBackend;
24
+ store(entry: MemoryEntry): Promise<void>;
25
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
26
+ search(query: string, limit?: number): Promise<MemorySearchResult[]>;
27
+ delete(key: string): Promise<void>;
28
+ clear(): Promise<void>;
29
+ }
30
+
31
+ declare class ShortTermMemory implements MemoryBackend {
32
+ readonly type: "short-term";
33
+ private entries;
34
+ private maxEntries;
35
+ constructor(maxEntries?: number);
36
+ store(entry: MemoryEntry): Promise<void>;
37
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
38
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
39
+ delete(key: string): Promise<void>;
40
+ clear(): Promise<void>;
41
+ }
42
+
43
+ declare class LongTermMemory implements MemoryBackend {
44
+ readonly type: "long-term";
45
+ private entries;
46
+ private filePath;
47
+ constructor(name?: string);
48
+ init(): Promise<void>;
49
+ persist(): Promise<void>;
50
+ store(entry: MemoryEntry): Promise<void>;
51
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
52
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
53
+ delete(key: string): Promise<void>;
54
+ clear(): Promise<void>;
55
+ }
56
+
57
+ declare class SemanticMemory implements MemoryBackend {
58
+ readonly type: "semantic";
59
+ private entries;
60
+ store(entry: MemoryEntry): Promise<void>;
61
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
62
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
63
+ delete(key: string): Promise<void>;
64
+ clear(): Promise<void>;
65
+ }
66
+
67
+ declare class SessionMemory implements MemoryBackend {
68
+ readonly type: "session";
69
+ private entries;
70
+ store(entry: MemoryEntry): Promise<void>;
71
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
72
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
73
+ delete(key: string): Promise<void>;
74
+ clear(): Promise<void>;
75
+ }
76
+
77
+ declare class UserMemory implements MemoryBackend {
78
+ readonly type: "user";
79
+ private entries;
80
+ private userId;
81
+ constructor(userId: string);
82
+ store(entry: MemoryEntry): Promise<void>;
83
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
84
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
85
+ delete(key: string): Promise<void>;
86
+ clear(): Promise<void>;
87
+ }
88
+
89
+ declare class ProjectMemory implements MemoryBackend {
90
+ readonly type: "project";
91
+ private entries;
92
+ private loaded;
93
+ ensureLoaded(): Promise<void>;
94
+ persist(): Promise<void>;
95
+ store(entry: MemoryEntry): Promise<void>;
96
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
97
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
98
+ delete(key: string): Promise<void>;
99
+ clear(): Promise<void>;
100
+ }
101
+
102
+ declare class VectorMemory implements MemoryBackend {
103
+ readonly type: "vector";
104
+ private entries;
105
+ store(entry: MemoryEntry): Promise<void>;
106
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
107
+ search(_query: string, limit?: number, threshold?: number): Promise<MemorySearchResult[]>;
108
+ delete(key: string): Promise<void>;
109
+ clear(): Promise<void>;
110
+ }
111
+
112
+ export { LongTermMemory, type MemoryBackend, MemoryStore, ProjectMemory, SemanticMemory, SessionMemory, ShortTermMemory, UserMemory, VectorMemory };
@@ -0,0 +1,112 @@
1
+ import { MemoryType, MemoryEntry, MemoryQuery, MemorySearchResult } from '@lupaflow/types';
2
+
3
+ interface MemoryBackend {
4
+ readonly type: MemoryType;
5
+ store(entry: MemoryEntry): Promise<void>;
6
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
7
+ search(query: string, limit?: number): Promise<MemorySearchResult[]>;
8
+ delete(key: string): Promise<void>;
9
+ clear(): Promise<void>;
10
+ }
11
+
12
+ declare class MemoryStore {
13
+ private backends;
14
+ constructor(config?: {
15
+ shortTerm?: boolean;
16
+ longTerm?: boolean;
17
+ semantic?: boolean;
18
+ session?: boolean;
19
+ user?: string;
20
+ project?: boolean;
21
+ });
22
+ register(type: MemoryType, backend: MemoryBackend): void;
23
+ get(type: MemoryType): MemoryBackend;
24
+ store(entry: MemoryEntry): Promise<void>;
25
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
26
+ search(query: string, limit?: number): Promise<MemorySearchResult[]>;
27
+ delete(key: string): Promise<void>;
28
+ clear(): Promise<void>;
29
+ }
30
+
31
+ declare class ShortTermMemory implements MemoryBackend {
32
+ readonly type: "short-term";
33
+ private entries;
34
+ private maxEntries;
35
+ constructor(maxEntries?: number);
36
+ store(entry: MemoryEntry): Promise<void>;
37
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
38
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
39
+ delete(key: string): Promise<void>;
40
+ clear(): Promise<void>;
41
+ }
42
+
43
+ declare class LongTermMemory implements MemoryBackend {
44
+ readonly type: "long-term";
45
+ private entries;
46
+ private filePath;
47
+ constructor(name?: string);
48
+ init(): Promise<void>;
49
+ persist(): Promise<void>;
50
+ store(entry: MemoryEntry): Promise<void>;
51
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
52
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
53
+ delete(key: string): Promise<void>;
54
+ clear(): Promise<void>;
55
+ }
56
+
57
+ declare class SemanticMemory implements MemoryBackend {
58
+ readonly type: "semantic";
59
+ private entries;
60
+ store(entry: MemoryEntry): Promise<void>;
61
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
62
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
63
+ delete(key: string): Promise<void>;
64
+ clear(): Promise<void>;
65
+ }
66
+
67
+ declare class SessionMemory implements MemoryBackend {
68
+ readonly type: "session";
69
+ private entries;
70
+ store(entry: MemoryEntry): Promise<void>;
71
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
72
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
73
+ delete(key: string): Promise<void>;
74
+ clear(): Promise<void>;
75
+ }
76
+
77
+ declare class UserMemory implements MemoryBackend {
78
+ readonly type: "user";
79
+ private entries;
80
+ private userId;
81
+ constructor(userId: string);
82
+ store(entry: MemoryEntry): Promise<void>;
83
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
84
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
85
+ delete(key: string): Promise<void>;
86
+ clear(): Promise<void>;
87
+ }
88
+
89
+ declare class ProjectMemory implements MemoryBackend {
90
+ readonly type: "project";
91
+ private entries;
92
+ private loaded;
93
+ ensureLoaded(): Promise<void>;
94
+ persist(): Promise<void>;
95
+ store(entry: MemoryEntry): Promise<void>;
96
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
97
+ search(_query: string, limit?: number): Promise<MemorySearchResult[]>;
98
+ delete(key: string): Promise<void>;
99
+ clear(): Promise<void>;
100
+ }
101
+
102
+ declare class VectorMemory implements MemoryBackend {
103
+ readonly type: "vector";
104
+ private entries;
105
+ store(entry: MemoryEntry): Promise<void>;
106
+ retrieve(query: MemoryQuery): Promise<MemoryEntry[]>;
107
+ search(_query: string, limit?: number, threshold?: number): Promise<MemorySearchResult[]>;
108
+ delete(key: string): Promise<void>;
109
+ clear(): Promise<void>;
110
+ }
111
+
112
+ export { LongTermMemory, type MemoryBackend, MemoryStore, ProjectMemory, SemanticMemory, SessionMemory, ShortTermMemory, UserMemory, VectorMemory };
package/dist/index.js ADDED
@@ -0,0 +1,421 @@
1
+ // src/short-term.ts
2
+ import { generateId } from "@lupaflow/core";
3
+ var ShortTermMemory = class {
4
+ type = "short-term";
5
+ entries = [];
6
+ maxEntries;
7
+ constructor(maxEntries = 50) {
8
+ this.maxEntries = maxEntries;
9
+ }
10
+ async store(entry) {
11
+ this.entries.push({
12
+ ...entry,
13
+ id: entry.id || generateId(),
14
+ timestamp: entry.timestamp || Date.now()
15
+ });
16
+ if (this.entries.length > this.maxEntries) {
17
+ this.entries.shift();
18
+ }
19
+ }
20
+ async retrieve(query) {
21
+ let results = this.entries;
22
+ if (query.key) {
23
+ results = results.filter((e) => e.key === query.key);
24
+ }
25
+ if (query.scope) {
26
+ results = results.filter((e) => e.scope === query.scope);
27
+ }
28
+ return results.slice(-(query.limit || 20));
29
+ }
30
+ async search(_query, limit = 5) {
31
+ const q = _query.toLowerCase();
32
+ const results = this.entries.filter((e) => e.content.toLowerCase().includes(q)).slice(-limit);
33
+ return results.map((entry) => ({
34
+ entry,
35
+ score: 1
36
+ }));
37
+ }
38
+ async delete(key) {
39
+ this.entries = this.entries.filter((e) => e.key !== key);
40
+ }
41
+ async clear() {
42
+ this.entries = [];
43
+ }
44
+ };
45
+
46
+ // src/long-term.ts
47
+ import { readFile, writeFile, access } from "fs/promises";
48
+ import { join } from "path";
49
+ import { generateId as generateId2 } from "@lupaflow/core";
50
+ var LongTermMemory = class {
51
+ type = "long-term";
52
+ entries = [];
53
+ filePath;
54
+ constructor(name = "default") {
55
+ this.filePath = join(process.cwd(), ".lupaflow", `memory-${name}.json`);
56
+ }
57
+ async init() {
58
+ try {
59
+ await access(this.filePath);
60
+ const data = await readFile(this.filePath, "utf-8");
61
+ this.entries = JSON.parse(data);
62
+ } catch {
63
+ this.entries = [];
64
+ }
65
+ }
66
+ async persist() {
67
+ const dir = join(process.cwd(), ".lupaflow");
68
+ try {
69
+ await access(dir);
70
+ } catch {
71
+ await writeFile(dir, "", { flag: "a" });
72
+ }
73
+ await writeFile(this.filePath, JSON.stringify(this.entries, null, 2));
74
+ }
75
+ async store(entry) {
76
+ this.entries.push({
77
+ ...entry,
78
+ id: entry.id || generateId2(),
79
+ timestamp: entry.timestamp || Date.now()
80
+ });
81
+ await this.persist();
82
+ }
83
+ async retrieve(query) {
84
+ let results = this.entries;
85
+ if (query.key) results = results.filter((e) => e.key === query.key);
86
+ if (query.type) results = results.filter((e) => e.type === query.type);
87
+ if (query.scope) results = results.filter((e) => e.scope === query.scope);
88
+ return results.slice(-(query.limit || 50));
89
+ }
90
+ async search(_query, limit = 10) {
91
+ const q = _query.toLowerCase();
92
+ return this.entries.filter((e) => e.content.toLowerCase().includes(q)).slice(-limit).map((entry) => ({ entry, score: 1 }));
93
+ }
94
+ async delete(key) {
95
+ this.entries = this.entries.filter((e) => e.key !== key);
96
+ await this.persist();
97
+ }
98
+ async clear() {
99
+ this.entries = [];
100
+ await this.persist();
101
+ }
102
+ };
103
+
104
+ // src/semantic.ts
105
+ import { generateId as generateId3 } from "@lupaflow/core";
106
+ function cosineSimilarity(a, b) {
107
+ let dot = 0, magA = 0, magB = 0;
108
+ for (let i = 0; i < a.length; i++) {
109
+ dot += a[i] * b[i];
110
+ magA += a[i] * a[i];
111
+ magB += b[i] * b[i];
112
+ }
113
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
114
+ return denom === 0 ? 0 : dot / denom;
115
+ }
116
+ function simpleEmbed(text) {
117
+ const dim = 128;
118
+ const vec = new Array(dim).fill(0);
119
+ for (let i = 0; i < text.length; i++) {
120
+ const idx = (text.charCodeAt(i) * 7 + i * 13) % dim;
121
+ vec[idx] += 1 + text.charCodeAt(i) % 5 * 0.1;
122
+ }
123
+ const mag = Math.sqrt(vec.reduce((s, v) => s + v * v, 0));
124
+ return mag > 0 ? vec.map((v) => v / mag) : vec;
125
+ }
126
+ var SemanticMemory = class {
127
+ type = "semantic";
128
+ entries = [];
129
+ async store(entry) {
130
+ this.entries.push({
131
+ ...entry,
132
+ id: entry.id || generateId3(),
133
+ timestamp: entry.timestamp || Date.now(),
134
+ embedding: simpleEmbed(entry.content)
135
+ });
136
+ }
137
+ async retrieve(query) {
138
+ let results = this.entries;
139
+ if (query.key) results = results.filter((e) => e.key === query.key);
140
+ if (query.scope) results = results.filter((e) => e.scope === query.scope);
141
+ return results.slice(-(query.limit || 20));
142
+ }
143
+ async search(_query, limit = 10) {
144
+ const queryEmbedding = simpleEmbed(_query);
145
+ const scored = this.entries.map((entry) => ({
146
+ entry,
147
+ score: cosineSimilarity(queryEmbedding, entry.embedding)
148
+ })).sort((a, b) => b.score - a.score).slice(0, limit);
149
+ return scored;
150
+ }
151
+ async delete(key) {
152
+ this.entries = this.entries.filter((e) => e.key !== key);
153
+ }
154
+ async clear() {
155
+ this.entries = [];
156
+ }
157
+ };
158
+
159
+ // src/session.ts
160
+ import { generateId as generateId4 } from "@lupaflow/core";
161
+ var SESSION_KEY = "__session__";
162
+ var SessionMemory = class {
163
+ type = "session";
164
+ entries = [];
165
+ async store(entry) {
166
+ this.entries.push({
167
+ ...entry,
168
+ id: entry.id || generateId4(),
169
+ scope: SESSION_KEY,
170
+ timestamp: entry.timestamp || Date.now()
171
+ });
172
+ }
173
+ async retrieve(query) {
174
+ let results = this.entries.filter((e) => e.scope === SESSION_KEY);
175
+ if (query.key) results = results.filter((e) => e.key === query.key);
176
+ return results.slice(-(query.limit || 50));
177
+ }
178
+ async search(_query, limit = 10) {
179
+ const q = _query.toLowerCase();
180
+ return this.entries.filter((e) => e.scope === SESSION_KEY && e.content.toLowerCase().includes(q)).slice(-limit).map((entry) => ({ entry, score: 1 }));
181
+ }
182
+ async delete(key) {
183
+ this.entries = this.entries.filter((e) => e.key !== key && e.scope === SESSION_KEY);
184
+ }
185
+ async clear() {
186
+ this.entries = this.entries.filter((e) => e.scope !== SESSION_KEY);
187
+ }
188
+ };
189
+
190
+ // src/user.ts
191
+ import { generateId as generateId5 } from "@lupaflow/core";
192
+ var UserMemory = class {
193
+ type = "user";
194
+ entries = [];
195
+ userId;
196
+ constructor(userId) {
197
+ this.userId = userId;
198
+ }
199
+ async store(entry) {
200
+ this.entries.push({
201
+ ...entry,
202
+ id: entry.id || generateId5(),
203
+ scope: `user:${this.userId}`,
204
+ timestamp: entry.timestamp || Date.now()
205
+ });
206
+ }
207
+ async retrieve(query) {
208
+ let results = this.entries.filter((e) => e.scope === `user:${this.userId}`);
209
+ if (query.key) results = results.filter((e) => e.key === query.key);
210
+ return results.slice(-(query.limit || 50));
211
+ }
212
+ async search(_query, limit = 10) {
213
+ const q = _query.toLowerCase();
214
+ return this.entries.filter((e) => e.scope === `user:${this.userId}` && e.content.toLowerCase().includes(q)).slice(-limit).map((entry) => ({ entry, score: 1 }));
215
+ }
216
+ async delete(key) {
217
+ this.entries = this.entries.filter(
218
+ (e) => !(e.key === key && e.scope === `user:${this.userId}`)
219
+ );
220
+ }
221
+ async clear() {
222
+ this.entries = this.entries.filter((e) => e.scope !== `user:${this.userId}`);
223
+ }
224
+ };
225
+
226
+ // src/project.ts
227
+ import { generateId as generateId6 } from "@lupaflow/core";
228
+ import { readFile as readFile2, writeFile as writeFile2, access as access2 } from "fs/promises";
229
+ var PROJECT_MEMORY_FILE = ".lupaflow/project-memory.json";
230
+ var ProjectMemory = class {
231
+ type = "project";
232
+ entries = [];
233
+ loaded = false;
234
+ async ensureLoaded() {
235
+ if (this.loaded) return;
236
+ try {
237
+ await access2(PROJECT_MEMORY_FILE);
238
+ const data = await readFile2(PROJECT_MEMORY_FILE, "utf-8");
239
+ this.entries = JSON.parse(data);
240
+ } catch {
241
+ this.entries = [];
242
+ }
243
+ this.loaded = true;
244
+ }
245
+ async persist() {
246
+ await writeFile2(PROJECT_MEMORY_FILE, JSON.stringify(this.entries, null, 2));
247
+ }
248
+ async store(entry) {
249
+ await this.ensureLoaded();
250
+ this.entries.push({
251
+ ...entry,
252
+ id: entry.id || generateId6(),
253
+ scope: "project",
254
+ timestamp: entry.timestamp || Date.now()
255
+ });
256
+ await this.persist();
257
+ }
258
+ async retrieve(query) {
259
+ await this.ensureLoaded();
260
+ let results = this.entries.filter((e) => e.scope === "project");
261
+ if (query.key) results = results.filter((e) => e.key === query.key);
262
+ return results.slice(-(query.limit || 50));
263
+ }
264
+ async search(_query, limit = 10) {
265
+ await this.ensureLoaded();
266
+ const q = _query.toLowerCase();
267
+ return this.entries.filter((e) => e.scope === "project" && e.content.toLowerCase().includes(q)).slice(-limit).map((entry) => ({ entry, score: 1 }));
268
+ }
269
+ async delete(key) {
270
+ await this.ensureLoaded();
271
+ this.entries = this.entries.filter((e) => !(e.key === key && e.scope === "project"));
272
+ await this.persist();
273
+ }
274
+ async clear() {
275
+ await this.ensureLoaded();
276
+ this.entries = this.entries.filter((e) => e.scope !== "project");
277
+ await this.persist();
278
+ }
279
+ };
280
+
281
+ // src/store.ts
282
+ import { MemoryError } from "@lupaflow/core";
283
+ import { globalEventBus } from "@lupaflow/core";
284
+ var MemoryStore = class {
285
+ backends = /* @__PURE__ */ new Map();
286
+ constructor(config) {
287
+ if (config?.shortTerm !== false) this.backends.set("short-term", new ShortTermMemory());
288
+ if (config?.longTerm) this.backends.set("long-term", new LongTermMemory());
289
+ if (config?.semantic) this.backends.set("semantic", new SemanticMemory());
290
+ if (config?.session !== false) this.backends.set("session", new SessionMemory());
291
+ if (config?.user) this.backends.set("user", new UserMemory(config.user));
292
+ if (config?.project) this.backends.set("project", new ProjectMemory());
293
+ }
294
+ register(type, backend) {
295
+ this.backends.set(type, backend);
296
+ }
297
+ get(type) {
298
+ const backend = this.backends.get(type);
299
+ if (!backend) throw new MemoryError(`No memory backend registered: ${type}`);
300
+ return backend;
301
+ }
302
+ async store(entry) {
303
+ if (entry.type === "short-term" || entry.type === "session") {
304
+ const backend = this.backends.get(entry.type);
305
+ if (backend) {
306
+ await backend.store(entry);
307
+ await globalEventBus.emit("memory:update", {
308
+ type: entry.type,
309
+ key: entry.key
310
+ });
311
+ }
312
+ return;
313
+ }
314
+ for (const backend of this.backends.values()) {
315
+ await backend.store({ ...entry });
316
+ }
317
+ await globalEventBus.emit("memory:update", { type: entry.type, key: entry.key });
318
+ }
319
+ async retrieve(query) {
320
+ if (query.type) {
321
+ const backend = this.get(query.type);
322
+ const results = await backend.retrieve(query);
323
+ await globalEventBus.emit("memory:retrieve", {
324
+ type: query.type,
325
+ key: query.key || "all",
326
+ results: results.length
327
+ });
328
+ return results;
329
+ }
330
+ const all = [];
331
+ for (const backend of this.backends.values()) {
332
+ all.push(...await backend.retrieve(query));
333
+ }
334
+ return all;
335
+ }
336
+ async search(query, limit = 10) {
337
+ const all = [];
338
+ for (const backend of this.backends.values()) {
339
+ all.push(...await backend.search(query, limit));
340
+ }
341
+ return all.sort((a, b) => b.score - a.score).slice(0, limit);
342
+ }
343
+ async delete(key) {
344
+ for (const backend of this.backends.values()) {
345
+ await backend.delete(key);
346
+ }
347
+ }
348
+ async clear() {
349
+ for (const backend of this.backends.values()) {
350
+ await backend.clear();
351
+ }
352
+ }
353
+ };
354
+
355
+ // src/vector.ts
356
+ import { generateId as generateId7 } from "@lupaflow/core";
357
+ function cosineSimilarity2(a, b) {
358
+ let dot = 0, magA = 0, magB = 0;
359
+ for (let i = 0; i < a.length; i++) {
360
+ dot += a[i] * b[i];
361
+ magA += a[i] * a[i];
362
+ magB += b[i] * b[i];
363
+ }
364
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
365
+ return denom === 0 ? 0 : dot / denom;
366
+ }
367
+ function generateEmbedding(text) {
368
+ const dim = 384;
369
+ const vec = new Array(dim).fill(0);
370
+ for (let i = 0; i < text.length; i++) {
371
+ const code = text.charCodeAt(i);
372
+ for (let j = 0; j < 5; j++) {
373
+ const idx = (code * (j + 1) + i * 17 + j * 31) % dim;
374
+ vec[idx] += 1 / (j + 1);
375
+ }
376
+ }
377
+ const mag = Math.sqrt(vec.reduce((s, v) => s + v * v, 0));
378
+ return mag > 0 ? vec.map((v) => v / mag) : vec;
379
+ }
380
+ var VectorMemory = class {
381
+ type = "vector";
382
+ entries = [];
383
+ async store(entry) {
384
+ this.entries.push({
385
+ ...entry,
386
+ id: entry.id || generateId7(),
387
+ timestamp: entry.timestamp || Date.now(),
388
+ embedding: generateEmbedding(entry.content)
389
+ });
390
+ }
391
+ async retrieve(query) {
392
+ let results = this.entries;
393
+ if (query.key) results = results.filter((e) => e.key === query.key);
394
+ if (query.scope) results = results.filter((e) => e.scope === query.scope);
395
+ return results.slice(-(query.limit || 20));
396
+ }
397
+ async search(_query, limit = 10, threshold = 0.3) {
398
+ const queryEmbedding = generateEmbedding(_query);
399
+ return this.entries.map((entry) => ({
400
+ entry,
401
+ score: cosineSimilarity2(queryEmbedding, entry.embedding)
402
+ })).filter((r) => r.score >= threshold).sort((a, b) => b.score - a.score).slice(0, limit);
403
+ }
404
+ async delete(key) {
405
+ this.entries = this.entries.filter((e) => e.key !== key);
406
+ }
407
+ async clear() {
408
+ this.entries = [];
409
+ }
410
+ };
411
+ export {
412
+ LongTermMemory,
413
+ MemoryStore,
414
+ ProjectMemory,
415
+ SemanticMemory,
416
+ SessionMemory,
417
+ ShortTermMemory,
418
+ UserMemory,
419
+ VectorMemory
420
+ };
421
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/short-term.ts","../src/long-term.ts","../src/semantic.ts","../src/session.ts","../src/user.ts","../src/project.ts","../src/store.ts","../src/vector.ts"],"sourcesContent":["import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nexport class ShortTermMemory implements MemoryBackend {\n readonly type = \"short-term\" as const\n private entries: MemoryEntry[] = []\n private maxEntries: number\n\n constructor(maxEntries = 50) {\n this.maxEntries = maxEntries\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n timestamp: entry.timestamp || Date.now(),\n })\n if (this.entries.length > this.maxEntries) {\n this.entries.shift()\n }\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries\n if (query.key) {\n results = results.filter((e) => e.key === query.key)\n }\n if (query.scope) {\n results = results.filter((e) => e.scope === query.scope)\n }\n return results.slice(-(query.limit || 20))\n }\n\n async search(_query: string, limit = 5): Promise<MemorySearchResult[]> {\n const q = _query.toLowerCase()\n const results = this.entries\n .filter((e) => e.content.toLowerCase().includes(q))\n .slice(-limit)\n return results.map((entry) => ({\n entry,\n score: 1,\n }))\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key)\n }\n\n async clear(): Promise<void> {\n this.entries = []\n }\n}\n","import { readFile, writeFile, access } from \"fs/promises\"\nimport { join } from \"path\"\nimport type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nexport class LongTermMemory implements MemoryBackend {\n readonly type = \"long-term\" as const\n private entries: MemoryEntry[] = []\n private filePath: string\n\n constructor(name = \"default\") {\n this.filePath = join(process.cwd(), \".lupaflow\", `memory-${name}.json`)\n }\n\n async init(): Promise<void> {\n try {\n await access(this.filePath)\n const data = await readFile(this.filePath, \"utf-8\")\n this.entries = JSON.parse(data)\n } catch {\n this.entries = []\n }\n }\n\n async persist(): Promise<void> {\n const dir = join(process.cwd(), \".lupaflow\")\n try {\n await access(dir)\n } catch {\n await writeFile(dir, \"\", { flag: \"a\" })\n }\n await writeFile(this.filePath, JSON.stringify(this.entries, null, 2))\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n timestamp: entry.timestamp || Date.now(),\n })\n await this.persist()\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries\n if (query.key) results = results.filter((e) => e.key === query.key)\n if (query.type) results = results.filter((e) => e.type === query.type)\n if (query.scope) results = results.filter((e) => e.scope === query.scope)\n return results.slice(-(query.limit || 50))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n const q = _query.toLowerCase()\n return this.entries\n .filter((e) => e.content.toLowerCase().includes(q))\n .slice(-limit)\n .map((entry) => ({ entry, score: 1 }))\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key)\n await this.persist()\n }\n\n async clear(): Promise<void> {\n this.entries = []\n await this.persist()\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0, magA = 0, magB = 0\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n magA += a[i] * a[i]\n magB += b[i] * b[i]\n }\n const denom = Math.sqrt(magA) * Math.sqrt(magB)\n return denom === 0 ? 0 : dot / denom\n}\n\nfunction simpleEmbed(text: string): number[] {\n const dim = 128\n const vec = new Array(dim).fill(0)\n for (let i = 0; i < text.length; i++) {\n const idx = (text.charCodeAt(i) * 7 + i * 13) % dim\n vec[idx] += 1 + (text.charCodeAt(i) % 5) * 0.1\n }\n const mag = Math.sqrt(vec.reduce((s, v) => s + v * v, 0))\n return mag > 0 ? vec.map((v) => v / mag) : vec\n}\n\ninterface SemanticEntry extends MemoryEntry {\n embedding: number[]\n}\n\nexport class SemanticMemory implements MemoryBackend {\n readonly type = \"semantic\" as const\n private entries: SemanticEntry[] = []\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n timestamp: entry.timestamp || Date.now(),\n embedding: simpleEmbed(entry.content),\n })\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries\n if (query.key) results = results.filter((e) => e.key === query.key)\n if (query.scope) results = results.filter((e) => e.scope === query.scope)\n return results.slice(-(query.limit || 20))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n const queryEmbedding = simpleEmbed(_query)\n const scored = this.entries\n .map((entry) => ({\n entry,\n score: cosineSimilarity(queryEmbedding, entry.embedding),\n }))\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n return scored\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key)\n }\n\n async clear(): Promise<void> {\n this.entries = []\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nconst SESSION_KEY = \"__session__\"\n\nexport class SessionMemory implements MemoryBackend {\n readonly type = \"session\" as const\n private entries: MemoryEntry[] = []\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n scope: SESSION_KEY,\n timestamp: entry.timestamp || Date.now(),\n })\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries.filter((e) => e.scope === SESSION_KEY)\n if (query.key) results = results.filter((e) => e.key === query.key)\n return results.slice(-(query.limit || 50))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n const q = _query.toLowerCase()\n return this.entries\n .filter((e) => e.scope === SESSION_KEY && e.content.toLowerCase().includes(q))\n .slice(-limit)\n .map((entry) => ({ entry, score: 1 }))\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key && e.scope === SESSION_KEY)\n }\n\n async clear(): Promise<void> {\n this.entries = this.entries.filter((e) => e.scope !== SESSION_KEY)\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nexport class UserMemory implements MemoryBackend {\n readonly type = \"user\" as const\n private entries: MemoryEntry[] = []\n private userId: string\n\n constructor(userId: string) {\n this.userId = userId\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n scope: `user:${this.userId}`,\n timestamp: entry.timestamp || Date.now(),\n })\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results = this.entries.filter((e) => e.scope === `user:${this.userId}`)\n if (query.key) results = results.filter((e) => e.key === query.key)\n return results.slice(-(query.limit || 50))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n const q = _query.toLowerCase()\n return this.entries\n .filter((e) => e.scope === `user:${this.userId}` && e.content.toLowerCase().includes(q))\n .slice(-limit)\n .map((entry) => ({ entry, score: 1 }))\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter(\n (e) => !(e.key === key && e.scope === `user:${this.userId}`)\n )\n }\n\n async clear(): Promise<void> {\n this.entries = this.entries.filter((e) => e.scope !== `user:${this.userId}`)\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\nimport { readFile, writeFile, access } from \"fs/promises\"\n\nconst PROJECT_MEMORY_FILE = \".lupaflow/project-memory.json\"\n\nexport class ProjectMemory implements MemoryBackend {\n readonly type = \"project\" as const\n private entries: MemoryEntry[] = []\n private loaded = false\n\n async ensureLoaded(): Promise<void> {\n if (this.loaded) return\n try {\n await access(PROJECT_MEMORY_FILE)\n const data = await readFile(PROJECT_MEMORY_FILE, \"utf-8\")\n this.entries = JSON.parse(data)\n } catch {\n this.entries = []\n }\n this.loaded = true\n }\n\n async persist(): Promise<void> {\n await writeFile(PROJECT_MEMORY_FILE, JSON.stringify(this.entries, null, 2))\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n await this.ensureLoaded()\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n scope: \"project\",\n timestamp: entry.timestamp || Date.now(),\n })\n await this.persist()\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n await this.ensureLoaded()\n let results = this.entries.filter((e) => e.scope === \"project\")\n if (query.key) results = results.filter((e) => e.key === query.key)\n return results.slice(-(query.limit || 50))\n }\n\n async search(_query: string, limit = 10): Promise<MemorySearchResult[]> {\n await this.ensureLoaded()\n const q = _query.toLowerCase()\n return this.entries\n .filter((e) => e.scope === \"project\" && e.content.toLowerCase().includes(q))\n .slice(-limit)\n .map((entry) => ({ entry, score: 1 }))\n }\n\n async delete(key: string): Promise<void> {\n await this.ensureLoaded()\n this.entries = this.entries.filter((e) => !(e.key === key && e.scope === \"project\"))\n await this.persist()\n }\n\n async clear(): Promise<void> {\n await this.ensureLoaded()\n this.entries = this.entries.filter((e) => e.scope !== \"project\")\n await this.persist()\n }\n}\n","import type { MemoryBackend } from \"./interface\"\nimport type { MemoryEntry, MemoryQuery, MemorySearchResult, MemoryType } from \"@lupaflow/types\"\nimport { ShortTermMemory } from \"./short-term\"\nimport { LongTermMemory } from \"./long-term\"\nimport { SemanticMemory } from \"./semantic\"\nimport { SessionMemory } from \"./session\"\nimport { UserMemory } from \"./user\"\nimport { ProjectMemory } from \"./project\"\nimport { MemoryError } from \"@lupaflow/core\"\nimport { globalEventBus } from \"@lupaflow/core\"\n\nexport class MemoryStore {\n private backends: Map<MemoryType, MemoryBackend> = new Map()\n\n constructor(config?: { shortTerm?: boolean; longTerm?: boolean; semantic?: boolean; session?: boolean; user?: string; project?: boolean }) {\n if (config?.shortTerm !== false) this.backends.set(\"short-term\", new ShortTermMemory())\n if (config?.longTerm) this.backends.set(\"long-term\", new LongTermMemory())\n if (config?.semantic) this.backends.set(\"semantic\", new SemanticMemory())\n if (config?.session !== false) this.backends.set(\"session\", new SessionMemory())\n if (config?.user) this.backends.set(\"user\", new UserMemory(config.user))\n if (config?.project) this.backends.set(\"project\", new ProjectMemory())\n }\n\n register(type: MemoryType, backend: MemoryBackend): void {\n this.backends.set(type, backend)\n }\n\n get(type: MemoryType): MemoryBackend {\n const backend = this.backends.get(type)\n if (!backend) throw new MemoryError(`No memory backend registered: ${type}`)\n return backend\n }\n\n async store(entry: MemoryEntry): Promise<void> {\n if (entry.type === \"short-term\" || entry.type === \"session\") {\n const backend = this.backends.get(entry.type)\n if (backend) {\n await backend.store(entry)\n await globalEventBus.emit(\"memory:update\", {\n type: entry.type,\n key: entry.key,\n } as any)\n }\n return\n }\n\n for (const backend of this.backends.values()) {\n await backend.store({ ...entry })\n }\n await globalEventBus.emit(\"memory:update\", { type: entry.type, key: entry.key } as any)\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n if (query.type) {\n const backend = this.get(query.type)\n const results = await backend.retrieve(query)\n await globalEventBus.emit(\"memory:retrieve\", {\n type: query.type,\n key: query.key || \"all\",\n results: results.length,\n } as any)\n return results\n }\n\n const all: MemoryEntry[] = []\n for (const backend of this.backends.values()) {\n all.push(...(await backend.retrieve(query)))\n }\n return all\n }\n\n async search(query: string, limit = 10): Promise<MemorySearchResult[]> {\n const all: MemorySearchResult[] = []\n for (const backend of this.backends.values()) {\n all.push(...(await backend.search(query, limit)))\n }\n return all.sort((a, b) => b.score - a.score).slice(0, limit)\n }\n\n async delete(key: string): Promise<void> {\n for (const backend of this.backends.values()) {\n await backend.delete(key)\n }\n }\n\n async clear(): Promise<void> {\n for (const backend of this.backends.values()) {\n await backend.clear()\n }\n }\n}\n","import type { MemoryEntry, MemoryQuery, MemorySearchResult } from \"@lupaflow/types\"\nimport type { MemoryBackend } from \"./interface\"\nimport { generateId } from \"@lupaflow/core\"\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0, magA = 0, magB = 0\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n magA += a[i] * a[i]\n magB += b[i] * b[i]\n }\n const denom = Math.sqrt(magA) * Math.sqrt(magB)\n return denom === 0 ? 0 : dot / denom\n}\n\nfunction generateEmbedding(text: string): number[] {\n const dim = 384\n const vec = new Array(dim).fill(0)\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i)\n for (let j = 0; j < 5; j++) {\n const idx = (code * (j + 1) + i * 17 + j * 31) % dim\n vec[idx] += 1.0 / (j + 1)\n }\n }\n const mag = Math.sqrt(vec.reduce((s, v) => s + v * v, 0))\n return mag > 0 ? vec.map((v) => v / mag) : vec\n}\n\ninterface VectorEntry extends MemoryEntry {\n embedding: number[]\n}\n\nexport class VectorMemory implements MemoryBackend {\n readonly type = \"vector\" as const\n private entries: VectorEntry[] = []\n\n async store(entry: MemoryEntry): Promise<void> {\n this.entries.push({\n ...entry,\n id: entry.id || generateId(),\n timestamp: entry.timestamp || Date.now(),\n embedding: generateEmbedding(entry.content),\n })\n }\n\n async retrieve(query: MemoryQuery): Promise<MemoryEntry[]> {\n let results: MemoryEntry[] = this.entries\n if (query.key) results = results.filter((e) => e.key === query.key)\n if (query.scope) results = results.filter((e) => e.scope === query.scope)\n return results.slice(-(query.limit || 20))\n }\n\n async search(_query: string, limit = 10, threshold = 0.3): Promise<MemorySearchResult[]> {\n const queryEmbedding = generateEmbedding(_query)\n return this.entries\n .map((entry) => ({\n entry,\n score: cosineSimilarity(queryEmbedding, entry.embedding),\n }))\n .filter((r) => r.score >= threshold)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n }\n\n async delete(key: string): Promise<void> {\n this.entries = this.entries.filter((e) => e.key !== key)\n }\n\n async clear(): Promise<void> {\n this.entries = []\n }\n}\n"],"mappings":"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","names":["generateId","generateId","generateId","generateId","generateId","readFile","writeFile","access","generateId","cosineSimilarity"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lupaflow/memory",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -16,13 +16,14 @@
16
16
  "import": "./dist/index.js"
17
17
  }
18
18
  },
19
- "scripts": {
19
+ "files": ["dist", "src", "package.json"],
20
+ "scripts": {
20
21
  "build": "tsup",
21
22
  "dev": "tsup --watch"
22
23
  },
23
24
  "dependencies": {
24
- "@lupaflow/core": "workspace:*",
25
- "@lupaflow/types": "workspace:*"
25
+ "@lupaflow/core": "^0.1.0",
26
+ "@lupaflow/types": "^0.1.0"
26
27
  },
27
28
  "devDependencies": {
28
29
  "tsup": "^8.3.0",
package/tsconfig.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "rootDir": "./src"
6
- },
7
- "include": ["src"]
8
- }
package/tsup.config.ts DELETED
@@ -1,9 +0,0 @@
1
- import { defineConfig } from "tsup"
2
- export default defineConfig({
3
- entry: { index: "src/index.ts" },
4
- format: ["cjs", "esm"],
5
- dts: true,
6
- sourcemap: true,
7
- clean: true,
8
- external: [/node_modules/],
9
- })