@loom-node/memory 0.1.0

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 (38) hide show
  1. package/LICENSE +21 -0
  2. package/dist/estimator-tokenizer.d.ts +8 -0
  3. package/dist/estimator-tokenizer.d.ts.map +1 -0
  4. package/dist/estimator-tokenizer.js +15 -0
  5. package/dist/estimator-tokenizer.js.map +1 -0
  6. package/dist/in-memory-store.d.ts +8 -0
  7. package/dist/in-memory-store.d.ts.map +1 -0
  8. package/dist/in-memory-store.js +24 -0
  9. package/dist/in-memory-store.js.map +1 -0
  10. package/dist/index.d.ts +12 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +9 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/layers/persistent.d.ts +13 -0
  15. package/dist/layers/persistent.d.ts.map +1 -0
  16. package/dist/layers/persistent.js +24 -0
  17. package/dist/layers/persistent.js.map +1 -0
  18. package/dist/layers/sliding-window.d.ts +24 -0
  19. package/dist/layers/sliding-window.d.ts.map +1 -0
  20. package/dist/layers/sliding-window.js +53 -0
  21. package/dist/layers/sliding-window.js.map +1 -0
  22. package/dist/layers/working-memory.d.ts +27 -0
  23. package/dist/layers/working-memory.d.ts.map +1 -0
  24. package/dist/layers/working-memory.js +67 -0
  25. package/dist/layers/working-memory.js.map +1 -0
  26. package/dist/llm-summarizer.d.ts +8 -0
  27. package/dist/llm-summarizer.d.ts.map +1 -0
  28. package/dist/llm-summarizer.js +31 -0
  29. package/dist/llm-summarizer.js.map +1 -0
  30. package/dist/memory-manager.d.ts +19 -0
  31. package/dist/memory-manager.d.ts.map +1 -0
  32. package/dist/memory-manager.js +81 -0
  33. package/dist/memory-manager.js.map +1 -0
  34. package/dist/memory-provider.d.ts +10 -0
  35. package/dist/memory-provider.d.ts.map +1 -0
  36. package/dist/memory-provider.js +30 -0
  37. package/dist/memory-provider.js.map +1 -0
  38. package/package.json +31 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Loom Node Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,8 @@
1
+ import type { Tokenizer } from '@loom-node/core';
2
+ export declare class EstimatorTokenizer implements Tokenizer {
3
+ private readonly ratio;
4
+ constructor(charsPerToken?: number);
5
+ count(text: string): number;
6
+ truncate(text: string, maxTokens: number): string;
7
+ }
8
+ //# sourceMappingURL=estimator-tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimator-tokenizer.d.ts","sourceRoot":"","sources":["../src/estimator-tokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,aAAa,SAAkB;IAI3C,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;CAIlD"}
@@ -0,0 +1,15 @@
1
+ const CHARS_PER_TOKEN = 4;
2
+ export class EstimatorTokenizer {
3
+ ratio;
4
+ constructor(charsPerToken = CHARS_PER_TOKEN) {
5
+ this.ratio = charsPerToken;
6
+ }
7
+ count(text) {
8
+ return Math.ceil(text.length / this.ratio);
9
+ }
10
+ truncate(text, maxTokens) {
11
+ const maxChars = maxTokens * this.ratio;
12
+ return text.length <= maxChars ? text : text.slice(0, maxChars);
13
+ }
14
+ }
15
+ //# sourceMappingURL=estimator-tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimator-tokenizer.js","sourceRoot":"","sources":["../src/estimator-tokenizer.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,OAAO,kBAAkB;IACZ,KAAK,CAAS;IAE/B,YAAY,aAAa,GAAG,eAAe;QACzC,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,SAAiB;QACtC,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QACxC,OAAO,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { PersistentStore, MemoryEntry, SearchOptions } from '@loom-node/core';
2
+ export declare class InMemoryPersistentStore implements PersistentStore {
3
+ private entries;
4
+ save(entry: MemoryEntry): Promise<void>;
5
+ search(query: string, opts: SearchOptions): Promise<MemoryEntry[]>;
6
+ delete(id: string): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=in-memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-store.d.ts","sourceRoot":"","sources":["../src/in-memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEnF,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,OAAO,CAAkC;IAE3C,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBlE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
@@ -0,0 +1,24 @@
1
+ export class InMemoryPersistentStore {
2
+ entries = new Map();
3
+ async save(entry) {
4
+ this.entries.set(entry.id, entry);
5
+ }
6
+ async search(query, opts) {
7
+ const terms = query.toLowerCase().split(/\s+/);
8
+ const scored = [];
9
+ for (const entry of this.entries.values()) {
10
+ const text = entry.content.toLowerCase();
11
+ const hits = terms.filter((t) => text.includes(t)).length;
12
+ if (hits > 0)
13
+ scored.push({ entry, score: hits / terms.length });
14
+ }
15
+ return scored
16
+ .sort((a, b) => b.score - a.score)
17
+ .slice(0, opts.limit)
18
+ .map((s) => s.entry);
19
+ }
20
+ async delete(id) {
21
+ this.entries.delete(id);
22
+ }
23
+ }
24
+ //# sourceMappingURL=in-memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-store.js","sourceRoot":"","sources":["../src/in-memory-store.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAuB;IAC1B,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEjD,KAAK,CAAC,IAAI,CAAC,KAAkB;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAAmB;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,MAAM,GAA4C,EAAE,CAAC;QAE3D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1D,IAAI,IAAI,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,MAAM;aACV,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ export { SlidingWindowLayer } from './layers/sliding-window.js';
2
+ export type { SlidingWindowOpts } from './layers/sliding-window.js';
3
+ export { WorkingMemoryLayer } from './layers/working-memory.js';
4
+ export type { WorkingMemoryOpts } from './layers/working-memory.js';
5
+ export { PersistentLayer } from './layers/persistent.js';
6
+ export { LayeredMemoryManager } from './memory-manager.js';
7
+ export type { LayeredMemoryConfig } from './memory-manager.js';
8
+ export { EstimatorTokenizer } from './estimator-tokenizer.js';
9
+ export { InMemoryPersistentStore } from './in-memory-store.js';
10
+ export { MemoryProvider } from './memory-provider.js';
11
+ export { LLMSummarizer } from './llm-summarizer.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { SlidingWindowLayer } from './layers/sliding-window.js';
2
+ export { WorkingMemoryLayer } from './layers/working-memory.js';
3
+ export { PersistentLayer } from './layers/persistent.js';
4
+ export { LayeredMemoryManager } from './memory-manager.js';
5
+ export { EstimatorTokenizer } from './estimator-tokenizer.js';
6
+ export { InMemoryPersistentStore } from './in-memory-store.js';
7
+ export { MemoryProvider } from './memory-provider.js';
8
+ export { LLMSummarizer } from './llm-summarizer.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { MemoryLayer, MemoryEntry, PersistentStore } from '@loom-node/core';
2
+ export declare class PersistentLayer implements MemoryLayer {
3
+ readonly name = "L3-persistent";
4
+ readonly tokenBudget: number;
5
+ private _currentTokens;
6
+ private readonly _store;
7
+ constructor(tokenBudget: number, store: PersistentStore);
8
+ get currentTokens(): number;
9
+ store(entry: MemoryEntry): Promise<void>;
10
+ retrieve(query: string, limit: number): Promise<MemoryEntry[]>;
11
+ evict(): Promise<MemoryEntry[]>;
12
+ }
13
+ //# sourceMappingURL=persistent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent.d.ts","sourceRoot":"","sources":["../../src/layers/persistent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEjF,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe;IAKvD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI9D,KAAK,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAGtC"}
@@ -0,0 +1,24 @@
1
+ export class PersistentLayer {
2
+ name = 'L3-persistent';
3
+ tokenBudget;
4
+ _currentTokens = 0;
5
+ _store;
6
+ constructor(tokenBudget, store) {
7
+ this.tokenBudget = tokenBudget;
8
+ this._store = store;
9
+ }
10
+ get currentTokens() {
11
+ return this._currentTokens;
12
+ }
13
+ async store(entry) {
14
+ await this._store.save(entry);
15
+ this._currentTokens += entry.tokens;
16
+ }
17
+ async retrieve(query, limit) {
18
+ return this._store.search(query, { limit, mode: 'hybrid' });
19
+ }
20
+ async evict() {
21
+ return [];
22
+ }
23
+ }
24
+ //# sourceMappingURL=persistent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent.js","sourceRoot":"","sources":["../../src/layers/persistent.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,eAAe,CAAC;IACvB,WAAW,CAAS;IACrB,cAAc,GAAG,CAAC,CAAC;IACV,MAAM,CAAkB;IAEzC,YAAY,WAAmB,EAAE,KAAsB;QACrD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAkB;QAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,KAAa;QACzC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { MemoryLayer, MemoryEntry, MemoryCompressor, Tokenizer } from '@loom-node/core';
2
+ export interface SlidingWindowOpts {
3
+ compressor?: MemoryCompressor;
4
+ sink?: MemoryLayer;
5
+ compressBatch?: number;
6
+ }
7
+ export declare class SlidingWindowLayer implements MemoryLayer {
8
+ readonly name = "L1-sliding-window";
9
+ readonly tokenBudget: number;
10
+ private entries;
11
+ private _currentTokens;
12
+ private readonly tokenizer;
13
+ private readonly compressor?;
14
+ private readonly sink?;
15
+ private readonly compressBatch;
16
+ private evictBuffer;
17
+ constructor(tokenBudget: number, tokenizer: Tokenizer, opts?: SlidingWindowOpts);
18
+ get currentTokens(): number;
19
+ store(entry: MemoryEntry): Promise<void>;
20
+ retrieve(_query: string, limit: number): Promise<MemoryEntry[]>;
21
+ evict(): Promise<MemoryEntry[]>;
22
+ flushBuffer(): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=sliding-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sliding-window.d.ts","sourceRoot":"","sources":["../../src/layers/sliding-window.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7F,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACpD,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,WAAW,CAAqB;gBAE5B,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,iBAAiB;IAQ/E,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI/D,KAAK,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAc/B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAMnC"}
@@ -0,0 +1,53 @@
1
+ export class SlidingWindowLayer {
2
+ name = 'L1-sliding-window';
3
+ tokenBudget;
4
+ entries = [];
5
+ _currentTokens = 0;
6
+ tokenizer;
7
+ compressor;
8
+ sink;
9
+ compressBatch;
10
+ evictBuffer = [];
11
+ constructor(tokenBudget, tokenizer, opts) {
12
+ this.tokenBudget = tokenBudget;
13
+ this.tokenizer = tokenizer;
14
+ this.compressor = opts?.compressor;
15
+ this.sink = opts?.sink;
16
+ this.compressBatch = opts?.compressBatch ?? 4;
17
+ }
18
+ get currentTokens() {
19
+ return this._currentTokens;
20
+ }
21
+ async store(entry) {
22
+ entry.tokens = this.tokenizer.count(entry.content);
23
+ this.entries.push(entry);
24
+ this._currentTokens += entry.tokens;
25
+ while (this._currentTokens > this.tokenBudget && this.entries.length > 1) {
26
+ await this.evict();
27
+ }
28
+ }
29
+ async retrieve(_query, limit) {
30
+ return this.entries.slice(-limit);
31
+ }
32
+ async evict() {
33
+ const removed = this.entries.shift();
34
+ if (!removed)
35
+ return [];
36
+ this._currentTokens -= removed.tokens;
37
+ if (this.compressor && this.sink) {
38
+ this.evictBuffer.push(removed);
39
+ if (this.evictBuffer.length >= this.compressBatch) {
40
+ await this.flushBuffer();
41
+ }
42
+ }
43
+ return [removed];
44
+ }
45
+ async flushBuffer() {
46
+ if (!this.compressor || !this.sink || this.evictBuffer.length === 0)
47
+ return;
48
+ const batch = this.evictBuffer.splice(0);
49
+ const compressed = await this.compressor.compress(batch);
50
+ await this.sink.store(compressed);
51
+ }
52
+ }
53
+ //# sourceMappingURL=sliding-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sliding-window.js","sourceRoot":"","sources":["../../src/layers/sliding-window.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,mBAAmB,CAAC;IAC3B,WAAW,CAAS;IACrB,OAAO,GAAkB,EAAE,CAAC;IAC5B,cAAc,GAAG,CAAC,CAAC;IACV,SAAS,CAAY;IACrB,UAAU,CAAoB;IAC9B,IAAI,CAAe;IACnB,aAAa,CAAS;IAC/B,WAAW,GAAkB,EAAE,CAAC;IAExC,YAAY,WAAmB,EAAE,SAAoB,EAAE,IAAwB;QAC7E,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAkB;QAC5B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;QACpC,OAAO,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,KAAa;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;QAEtC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBAClD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { MemoryLayer, MemoryEntry, MemoryCompressor, ImportanceScorer, Tokenizer } from '@loom-node/core';
2
+ import type { Message } from '@loom-node/core';
3
+ export interface WorkingMemoryOpts {
4
+ compressor?: MemoryCompressor;
5
+ sink?: MemoryLayer;
6
+ compressBatch?: number;
7
+ }
8
+ export declare class WorkingMemoryLayer implements MemoryLayer {
9
+ readonly name = "L2-working-memory";
10
+ readonly tokenBudget: number;
11
+ private entries;
12
+ private _currentTokens;
13
+ private readonly tokenizer;
14
+ private readonly scorer;
15
+ private readonly compressor?;
16
+ private readonly sink?;
17
+ private readonly compressBatch;
18
+ private evictBuffer;
19
+ constructor(tokenBudget: number, tokenizer: Tokenizer, scorer: ImportanceScorer, opts?: WorkingMemoryOpts);
20
+ get currentTokens(): number;
21
+ store(entry: MemoryEntry): Promise<void>;
22
+ retrieve(_query: string, limit: number): Promise<MemoryEntry[]>;
23
+ evict(): Promise<MemoryEntry[]>;
24
+ flushBuffer(): Promise<void>;
25
+ rescore(context: Message[]): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=working-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../src/layers/working-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC/G,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACpD,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,WAAW,CAAqB;gBAE5B,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,iBAAiB;IASzG,IAAI,aAAa,IAAI,MAAM,CAE1B;IAEK,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAM/D,KAAK,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAkB/B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjD"}
@@ -0,0 +1,67 @@
1
+ export class WorkingMemoryLayer {
2
+ name = 'L2-working-memory';
3
+ tokenBudget;
4
+ entries = [];
5
+ _currentTokens = 0;
6
+ tokenizer;
7
+ scorer;
8
+ compressor;
9
+ sink;
10
+ compressBatch;
11
+ evictBuffer = [];
12
+ constructor(tokenBudget, tokenizer, scorer, opts) {
13
+ this.tokenBudget = tokenBudget;
14
+ this.tokenizer = tokenizer;
15
+ this.scorer = scorer;
16
+ this.compressor = opts?.compressor;
17
+ this.sink = opts?.sink;
18
+ this.compressBatch = opts?.compressBatch ?? 4;
19
+ }
20
+ get currentTokens() {
21
+ return this._currentTokens;
22
+ }
23
+ async store(entry) {
24
+ entry.tokens = this.tokenizer.count(entry.content);
25
+ this.entries.push(entry);
26
+ this._currentTokens += entry.tokens;
27
+ while (this._currentTokens > this.tokenBudget && this.entries.length > 0) {
28
+ await this.evict();
29
+ }
30
+ }
31
+ async retrieve(_query, limit) {
32
+ return [...this.entries]
33
+ .sort((a, b) => b.importance - a.importance)
34
+ .slice(0, limit);
35
+ }
36
+ async evict() {
37
+ if (this.entries.length === 0)
38
+ return [];
39
+ let minIdx = 0;
40
+ for (let i = 1; i < this.entries.length; i++) {
41
+ if (this.entries[i].importance < this.entries[minIdx].importance)
42
+ minIdx = i;
43
+ }
44
+ const [removed] = this.entries.splice(minIdx, 1);
45
+ this._currentTokens -= removed.tokens;
46
+ if (this.compressor && this.sink) {
47
+ this.evictBuffer.push(removed);
48
+ if (this.evictBuffer.length >= this.compressBatch) {
49
+ await this.flushBuffer();
50
+ }
51
+ }
52
+ return [removed];
53
+ }
54
+ async flushBuffer() {
55
+ if (!this.compressor || !this.sink || this.evictBuffer.length === 0)
56
+ return;
57
+ const batch = this.evictBuffer.splice(0);
58
+ const compressed = await this.compressor.compress(batch);
59
+ await this.sink.store(compressed);
60
+ }
61
+ async rescore(context) {
62
+ for (const entry of this.entries) {
63
+ entry.importance = await this.scorer.score(entry, context);
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=working-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory.js","sourceRoot":"","sources":["../../src/layers/working-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MemoryCompressor, MemoryEntry, LLMProvider, Tokenizer } from '@loom-node/core';
2
+ export declare class LLMSummarizer implements MemoryCompressor {
3
+ private readonly llm;
4
+ private readonly tokenizer;
5
+ constructor(llm: LLMProvider, tokenizer: Tokenizer);
6
+ compress(entries: MemoryEntry[]): Promise<MemoryEntry>;
7
+ }
8
+ //# sourceMappingURL=llm-summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-summarizer.d.ts","sourceRoot":"","sources":["../src/llm-summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO7F,qBAAa,aAAc,YAAW,gBAAgB;IAElD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,SAAS;IAGjC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAoB7D"}
@@ -0,0 +1,31 @@
1
+ const COMPRESS_PROMPT = `Summarize the following conversation fragments into a concise summary. Preserve key facts, decisions, and context. Be brief.
2
+
3
+ Fragments:
4
+ `;
5
+ export class LLMSummarizer {
6
+ llm;
7
+ tokenizer;
8
+ constructor(llm, tokenizer) {
9
+ this.llm = llm;
10
+ this.tokenizer = tokenizer;
11
+ }
12
+ async compress(entries) {
13
+ const body = entries.map((e, i) => `[${i + 1}] ${e.content}`).join('\n');
14
+ const result = await this.llm.complete({
15
+ messages: [{ role: 'user', content: COMPRESS_PROMPT + body }],
16
+ temperature: 0,
17
+ maxTokens: 256,
18
+ });
19
+ const content = result.content;
20
+ const maxImportance = Math.max(...entries.map(e => e.importance));
21
+ return {
22
+ id: crypto.randomUUID(),
23
+ content,
24
+ tokens: this.tokenizer.count(content),
25
+ importance: Math.min(1, maxImportance + 0.1),
26
+ metadata: { compressed: true, sourceCount: entries.length },
27
+ createdAt: Date.now(),
28
+ };
29
+ }
30
+ }
31
+ //# sourceMappingURL=llm-summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-summarizer.js","sourceRoot":"","sources":["../src/llm-summarizer.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG;;;CAGvB,CAAC;AAEF,MAAM,OAAO,aAAa;IAEL;IACA;IAFnB,YACmB,GAAgB,EAChB,SAAoB;QADpB,QAAG,GAAH,GAAG,CAAa;QAChB,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,OAAsB;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YACrC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,EAAE,CAAC;YAC7D,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAElE,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;YACvB,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;YACrC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC;YAC5C,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE;YAC3D,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { MemoryManager, MemoryLayer, MemoryEntry, Message, Tokenizer } from '@loom-node/core';
2
+ export interface LayeredMemoryConfig {
3
+ layers: MemoryLayer[];
4
+ tokenizer: Tokenizer;
5
+ systemPrompt?: string;
6
+ }
7
+ export declare class LayeredMemoryManager implements MemoryManager {
8
+ private readonly layers;
9
+ private readonly tokenizer;
10
+ private readonly systemPrompt?;
11
+ constructor(config: LayeredMemoryConfig);
12
+ buildContext(input: string): Promise<Message[]>;
13
+ persist(messages: Message[]): Promise<void>;
14
+ /** Extract high-importance memories for a child agent (mitosis) */
15
+ extractFor(query: string, budget: number): Promise<MemoryEntry[]>;
16
+ /** Absorb learnings from a child agent back into parent (post-mitosis) */
17
+ absorb(entries: MemoryEntry[], importanceBoost?: number): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=memory-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-manager.d.ts","sourceRoot":"","sources":["../src/memory-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEnG,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;gBAE3B,MAAM,EAAE,mBAAmB;IAMjC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAgB/C,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjD,mEAAmE;IAC7D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAkBvE,0EAA0E;IACpE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,eAAe,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa3E"}
@@ -0,0 +1,81 @@
1
+ export class LayeredMemoryManager {
2
+ layers;
3
+ tokenizer;
4
+ systemPrompt;
5
+ constructor(config) {
6
+ this.layers = config.layers;
7
+ this.tokenizer = config.tokenizer;
8
+ this.systemPrompt = config.systemPrompt;
9
+ }
10
+ async buildContext(input) {
11
+ const msgs = [];
12
+ if (this.systemPrompt) {
13
+ msgs.push({ role: 'system', content: this.systemPrompt });
14
+ }
15
+ // Retrieve from each layer and merge
16
+ for (const layer of this.layers) {
17
+ const entries = await layer.retrieve(input, 10);
18
+ for (const e of entries) {
19
+ msgs.push({ role: 'user', content: e.content });
20
+ }
21
+ }
22
+ msgs.push({ role: 'user', content: input });
23
+ return msgs;
24
+ }
25
+ async persist(messages) {
26
+ for (const msg of messages) {
27
+ const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);
28
+ const entry = {
29
+ id: crypto.randomUUID(),
30
+ content,
31
+ tokens: this.tokenizer.count(content),
32
+ importance: 0.5,
33
+ metadata: { role: msg.role },
34
+ createdAt: Date.now(),
35
+ };
36
+ for (const layer of this.layers) {
37
+ await layer.store(entry);
38
+ }
39
+ }
40
+ // Rescore layers that support it (e.g. WorkingMemory importance re-evaluation)
41
+ for (const layer of this.layers) {
42
+ if (layer.rescore)
43
+ await layer.rescore(messages);
44
+ }
45
+ }
46
+ /** Extract high-importance memories for a child agent (mitosis) */
47
+ async extractFor(query, budget) {
48
+ const all = [];
49
+ for (const layer of this.layers) {
50
+ const entries = await layer.retrieve(query, 20);
51
+ all.push(...entries);
52
+ }
53
+ // Sort by importance, pick within budget
54
+ all.sort((a, b) => b.importance - a.importance);
55
+ const selected = [];
56
+ let used = 0;
57
+ for (const e of all) {
58
+ if (used + e.tokens > budget)
59
+ continue;
60
+ selected.push(e);
61
+ used += e.tokens;
62
+ }
63
+ return selected;
64
+ }
65
+ /** Absorb learnings from a child agent back into parent (post-mitosis) */
66
+ async absorb(entries, importanceBoost = 0.1) {
67
+ const l2 = this.layers.find(l => l.name.includes('working'));
68
+ const target = l2 ?? this.layers[0];
69
+ if (!target)
70
+ return;
71
+ for (const e of entries) {
72
+ await target.store({
73
+ ...e,
74
+ id: crypto.randomUUID(),
75
+ importance: Math.min(1, e.importance + importanceBoost),
76
+ metadata: { ...e.metadata, absorbed: true },
77
+ });
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=memory-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-manager.js","sourceRoot":"","sources":["../src/memory-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ContextProvider, ContextFragment, Tokenizer } from '@loom-node/core';
2
+ import type { LayeredMemoryManager } from './memory-manager.js';
3
+ export declare class MemoryProvider implements ContextProvider {
4
+ private manager;
5
+ private tokenizer;
6
+ readonly source: "memory";
7
+ constructor(manager: LayeredMemoryManager, tokenizer: Tokenizer);
8
+ provide(query: string, budget: number): Promise<ContextFragment[]>;
9
+ }
10
+ //# sourceMappingURL=memory-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-provider.d.ts","sourceRoot":"","sources":["../src/memory-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,qBAAa,cAAe,YAAW,eAAe;IAIlD,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,SAAS;IAJnB,QAAQ,CAAC,MAAM,EAAG,QAAQ,CAAU;gBAG1B,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,SAAS;IAGxB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAoBzE"}
@@ -0,0 +1,30 @@
1
+ export class MemoryProvider {
2
+ manager;
3
+ tokenizer;
4
+ source = 'memory';
5
+ constructor(manager, tokenizer) {
6
+ this.manager = manager;
7
+ this.tokenizer = tokenizer;
8
+ }
9
+ async provide(query, budget) {
10
+ const messages = await this.manager.buildContext(query);
11
+ const fragments = [];
12
+ let used = 0;
13
+ for (const msg of messages) {
14
+ const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);
15
+ const tokens = this.tokenizer.count(content);
16
+ if (used + tokens > budget)
17
+ break;
18
+ fragments.push({
19
+ source: 'memory',
20
+ content,
21
+ tokens,
22
+ relevance: 0.8,
23
+ metadata: { role: msg.role },
24
+ });
25
+ used += tokens;
26
+ }
27
+ return fragments;
28
+ }
29
+ }
30
+ //# sourceMappingURL=memory-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-provider.js","sourceRoot":"","sources":["../src/memory-provider.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,cAAc;IAIf;IACA;IAJD,MAAM,GAAG,QAAiB,CAAC;IAEpC,YACU,OAA6B,EAC7B,SAAoB;QADpB,YAAO,GAAP,OAAO,CAAsB;QAC7B,cAAS,GAAT,SAAS,CAAW;IAC3B,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,MAAc;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,SAAS,GAAsB,EAAE,CAAC;QACxC,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,IAAI,GAAG,MAAM,GAAG,MAAM;gBAAE,MAAM;YAClC,SAAS,CAAC,IAAI,CAAC;gBACb,MAAM,EAAE,QAAQ;gBAChB,OAAO;gBACP,MAAM;gBACN,SAAS,EAAE,GAAG;gBACd,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE;aAC7B,CAAC,CAAC;YACH,IAAI,IAAI,MAAM,CAAC;QACjB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@loom-node/memory",
3
+ "version": "0.1.0",
4
+ "description": "Three-layer memory system for Loom-Node - sliding window, working memory, persistent",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "license": "MIT",
21
+ "dependencies": {
22
+ "@loom-node/core": "0.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.5.0"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -b",
29
+ "clean": "rm -rf dist .tsbuildinfo"
30
+ }
31
+ }