@agents-eco/agentic-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.
package/dist/ltm.js ADDED
@@ -0,0 +1,144 @@
1
+ import { Graph } from "./graph.js";
2
+ const DEFAULT_LTM_CONFIG = {
3
+ decayRate: 0.01,
4
+ minImportance: 0.1,
5
+ maxNodes: 10000,
6
+ };
7
+ /**
8
+ * Long-Term Memory (LTM) — persistent graph-based memory.
9
+ *
10
+ * Stores memories as nodes in a graph with typed relationships.
11
+ * Supports decay (forgetting), reinforcement (remembering), and
12
+ * hybrid search (vector + keyword + graph traversal).
13
+ */
14
+ export class LongTermMemory {
15
+ graph;
16
+ config;
17
+ constructor(config, embedding) {
18
+ this.config = { ...DEFAULT_LTM_CONFIG, ...config };
19
+ this.graph = new Graph(embedding);
20
+ }
21
+ setEmbeddingBackend(backend) {
22
+ this.graph.setEmbeddingBackend(backend);
23
+ }
24
+ // ── Store ───────────────────────────────────────────
25
+ /** Add a memory to LTM */
26
+ async add(content, type, importance = 0.5, metadata = {}) {
27
+ // Enforce max nodes — remove least important if at capacity
28
+ if (this.graph.getNodeCount() >= this.config.maxNodes) {
29
+ this.pruneWeakest(Math.floor(this.config.maxNodes * 0.1));
30
+ }
31
+ return this.graph.addNode(content, type, importance, metadata);
32
+ }
33
+ /** Create a relationship between two memories */
34
+ link(sourceId, targetId, relation, weight = 0.5) {
35
+ return this.graph.addEdge(sourceId, targetId, relation, weight);
36
+ }
37
+ /** Store a fact — semantic memory with entity extraction */
38
+ async addFact(content, entities = [], importance = 0.6) {
39
+ const factNode = await this.add(content, "semantic", importance);
40
+ const entityNodes = [];
41
+ for (const entity of entities) {
42
+ // Check if entity already exists
43
+ const existing = this.findEntity(entity);
44
+ if (existing) {
45
+ this.graph.addEdge(factNode.id, existing.id, "mentioned_in");
46
+ this.graph.reinforceNode(existing.id);
47
+ entityNodes.push(existing);
48
+ }
49
+ else {
50
+ const entityNode = await this.add(entity, "entity", 0.4);
51
+ this.graph.addEdge(factNode.id, entityNode.id, "mentioned_in");
52
+ entityNodes.push(entityNode);
53
+ }
54
+ }
55
+ return { node: factNode, entityNodes };
56
+ }
57
+ /** Store an episode — episodic memory from a conversation turn */
58
+ async addEpisode(content, importance = 0.5, previousEpisodeId) {
59
+ const node = await this.add(content, "episodic", importance);
60
+ if (previousEpisodeId) {
61
+ this.graph.addEdge(previousEpisodeId, node.id, "leads_to", 0.8);
62
+ }
63
+ return node;
64
+ }
65
+ /** Store an observation */
66
+ async addObservation(content, importance = 0.5) {
67
+ return this.add(content, "observation", importance);
68
+ }
69
+ /** Store a goal */
70
+ async addGoal(content, importance = 0.8) {
71
+ return this.add(content, "goal", importance);
72
+ }
73
+ // ── Retrieve ────────────────────────────────────────
74
+ /** Search LTM with hybrid search */
75
+ async search(query, options) {
76
+ return this.graph.search(query, options);
77
+ }
78
+ /** Get a specific memory by ID */
79
+ get(id) {
80
+ return this.graph.getNode(id);
81
+ }
82
+ /** Get all memories of a specific type */
83
+ getByType(type) {
84
+ return this.graph.getAllNodes().filter((n) => n.type === type);
85
+ }
86
+ /** Get related memories via graph traversal */
87
+ getRelated(nodeId, depth = 2) {
88
+ return this.graph.traverse(nodeId, depth).filter((n) => n.id !== nodeId);
89
+ }
90
+ /** Get neighbors of a node with a specific relation */
91
+ getNeighbors(nodeId, relation) {
92
+ return this.graph.getNeighbors(nodeId, relation);
93
+ }
94
+ /** Find an entity node by name (case-insensitive) */
95
+ findEntity(name) {
96
+ const lower = name.toLowerCase();
97
+ return this.graph
98
+ .getAllNodes()
99
+ .find((n) => n.type === "entity" && n.content.toLowerCase() === lower);
100
+ }
101
+ // ── Maintenance ─────────────────────────────────────
102
+ /** Apply decay to all memories */
103
+ decay() {
104
+ return this.graph.applyDecay(this.config.decayRate, this.config.minImportance);
105
+ }
106
+ /** Reinforce a memory (accessed/recalled) */
107
+ reinforce(id, boost = 0.05) {
108
+ this.graph.reinforceNode(id, boost);
109
+ }
110
+ /** Remove a memory */
111
+ remove(id) {
112
+ return this.graph.removeNode(id);
113
+ }
114
+ /** Get graph statistics */
115
+ stats() {
116
+ const nodes = this.graph.getAllNodes();
117
+ const byType = {};
118
+ for (const n of nodes) {
119
+ byType[n.type] = (byType[n.type] ?? 0) + 1;
120
+ }
121
+ return {
122
+ nodes: this.graph.getNodeCount(),
123
+ edges: this.graph.getEdgeCount(),
124
+ byType,
125
+ };
126
+ }
127
+ // ── Serialization ───────────────────────────────────
128
+ getState() {
129
+ return this.graph.getState();
130
+ }
131
+ loadState(nodes, edges) {
132
+ this.graph.loadState(nodes, edges);
133
+ }
134
+ // ── Private ─────────────────────────────────────────
135
+ pruneWeakest(count) {
136
+ const nodes = this.graph
137
+ .getAllNodes()
138
+ .sort((a, b) => a.importance - b.importance);
139
+ for (let i = 0; i < Math.min(count, nodes.length); i++) {
140
+ this.graph.removeNode(nodes[i].id);
141
+ }
142
+ }
143
+ }
144
+ //# sourceMappingURL=ltm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ltm.js","sourceRoot":"","sources":["../src/ltm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYnC,MAAM,kBAAkB,GAAc;IACpC,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,GAAG;IAClB,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IACjB,KAAK,CAAQ;IACb,MAAM,CAAY;IAE1B,YAAY,MAA2B,EAAE,SAA4B;QACnE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,mBAAmB,CAAC,OAAyB;QAC3C,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,uDAAuD;IAEvD,0BAA0B;IAC1B,KAAK,CAAC,GAAG,CACP,OAAe,EACf,IAAoB,EACpB,aAAqB,GAAG,EACxB,WAAoC,EAAE;QAEtC,4DAA4D;QAC5D,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,iDAAiD;IACjD,IAAI,CACF,QAAgB,EAChB,QAAgB,EAChB,QAAwB,EACxB,SAAiB,GAAG;QAEpB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,OAAO,CACX,OAAe,EACf,WAAqB,EAAE,EACvB,aAAqB,GAAG;QAExB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACjE,MAAM,WAAW,GAAiB,EAAE,CAAC;QAErC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,iCAAiC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;gBAC7D,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;gBAC/D,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACzC,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,UAAU,CACd,OAAe,EACf,aAAqB,GAAG,EACxB,iBAA0B;QAE1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAE7D,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,aAAqB,GAAG;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IACtD,CAAC;IAED,mBAAmB;IACnB,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,aAAqB,GAAG;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,uDAAuD;IAEvD,oCAAoC;IACpC,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAuB;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,kCAAkC;IAClC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,0CAA0C;IAC1C,SAAS,CAAC,IAAoB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,+CAA+C;IAC/C,UAAU,CAAC,MAAc,EAAE,QAAgB,CAAC;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,uDAAuD;IACvD,YAAY,CAAC,MAAc,EAAE,QAAyB;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,qDAAqD;IACrD,UAAU,CAAC,IAAY;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK;aACd,WAAW,EAAE;aACb,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED,uDAAuD;IAEvD,kCAAkC;IAClC,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjF,CAAC;IAED,6CAA6C;IAC7C,SAAS,CAAC,EAAU,EAAE,QAAgB,IAAI;QACxC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,sBAAsB;IACtB,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,2BAA2B;IAC3B,KAAK;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YAChC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YAChC,MAAM;SACP,CAAC;IACJ,CAAC;IAED,uDAAuD;IAEvD,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,SAAS,CAAC,KAAmB,EAAE,KAAmB;QAChD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,uDAAuD;IAE/C,YAAY,CAAC,KAAa;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;aACrB,WAAW,EAAE;aACb,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,92 @@
1
+ import { ShortTermMemory } from "./stm.js";
2
+ import { LongTermMemory } from "./ltm.js";
3
+ import type { AgenticMemoryConfig, MemoryNode, MemoryNodeType, MemoryRelation, SearchResult, SearchOptions, STMEntry } from "./types.js";
4
+ /**
5
+ * AgenticMemory — unified memory manager combining STM and LTM.
6
+ *
7
+ * Handles:
8
+ * - Adding memories to STM (working context)
9
+ * - Consolidating important STM entries into LTM (graph)
10
+ * - Hybrid search across both STM and LTM
11
+ * - Automatic persistence via storage backend
12
+ * - Decay and reinforcement of LTM nodes
13
+ *
14
+ * Usage:
15
+ * ```ts
16
+ * // Local backend (no API key needed)
17
+ * const memory = new AgenticMemory({ backend: "local" });
18
+ *
19
+ * // Voyage AI backend (high-quality embeddings)
20
+ * const memory = new AgenticMemory({ backend: "voyage", voyageApiKey: "pa-..." });
21
+ *
22
+ * await memory.add("User's name is Alice", "semantic", 0.8);
23
+ * const results = await memory.search("What is the user's name?");
24
+ * ```
25
+ */
26
+ export declare class AgenticMemory {
27
+ readonly stm: ShortTermMemory;
28
+ readonly ltm: LongTermMemory;
29
+ private embedding;
30
+ private storage;
31
+ private config;
32
+ private loaded;
33
+ private lastEpisodeId;
34
+ constructor(config: AgenticMemoryConfig);
35
+ /** Load persisted graph from storage */
36
+ load(): Promise<void>;
37
+ /** Save current state to storage */
38
+ save(): Promise<void>;
39
+ /**
40
+ * Add a memory. Goes to STM first, then consolidates to LTM based on importance.
41
+ * High-importance items (>= 0.6) are immediately added to LTM as well.
42
+ */
43
+ add(content: string, type?: MemoryNodeType, importance?: number, metadata?: Record<string, unknown>): Promise<{
44
+ stmEntry: STMEntry;
45
+ ltmNode?: MemoryNode;
46
+ }>;
47
+ /** Add a conversation turn (episodic memory with temporal linking) */
48
+ addEpisode(content: string, importance?: number): Promise<{
49
+ stmEntry: STMEntry;
50
+ ltmNode: MemoryNode;
51
+ }>;
52
+ /** Add a fact with entity extraction */
53
+ addFact(content: string, entities?: string[], importance?: number): Promise<{
54
+ node: MemoryNode;
55
+ entityNodes: MemoryNode[];
56
+ }>;
57
+ /** Add an observation */
58
+ addObservation(content: string, importance?: number): Promise<MemoryNode>;
59
+ /** Add a goal */
60
+ addGoal(content: string, importance?: number): Promise<MemoryNode>;
61
+ /** Create a relationship between two LTM nodes */
62
+ link(sourceId: string, targetId: string, relation: MemoryRelation, weight?: number): import("./types.js").MemoryEdge | null;
63
+ /**
64
+ * Search across both STM and LTM.
65
+ * STM results are boosted by recency, LTM results by graph connectivity.
66
+ */
67
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
68
+ /** Get recent context from STM */
69
+ getRecentContext(n?: number): STMEntry[];
70
+ /** Build a context string suitable for injection into a system prompt */
71
+ buildContext(query?: string): Promise<string>;
72
+ /**
73
+ * Consolidate STM into LTM.
74
+ * Moves important STM entries into the LTM graph and creates relationships.
75
+ */
76
+ consolidate(minImportance?: number): Promise<number>;
77
+ /** Apply decay to LTM (call periodically) */
78
+ decay(): Promise<string[]>;
79
+ /** Get memory statistics */
80
+ stats(): {
81
+ stm: number;
82
+ ltm: {
83
+ nodes: number;
84
+ edges: number;
85
+ byType: Record<string, number>;
86
+ };
87
+ };
88
+ /** Clear all memory (STM + LTM) */
89
+ clear(): Promise<void>;
90
+ private ensureLoaded;
91
+ }
92
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,KAAK,EACV,mBAAmB,EAGnB,UAAU,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,aAAa,EACb,QAAQ,EAET,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAqB;gBAE9B,MAAM,EAAE,mBAAmB;IAyBvC,wCAAwC;IAClC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,oCAAoC;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B;;;OAGG;IACG,GAAG,CACP,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,cAA2B,EACjC,UAAU,GAAE,MAAY,EACxB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IAexD,sEAAsE;IAChE,UAAU,CACd,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAY,GACvB,OAAO,CAAC;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE,CAAC;IAUvD,wCAAwC;IAClC,OAAO,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,EAAO,EACvB,UAAU,GAAE,MAAY,GACvB,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,WAAW,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAO3D,yBAAyB;IACnB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAOpF,iBAAiB;IACX,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAO7E,kDAAkD;IAClD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM;IAMlF;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqD7E,kCAAkC;IAClC,gBAAgB,CAAC,CAAC,GAAE,MAAU,GAAG,QAAQ,EAAE;IAI3C,yEAAyE;IACnE,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgCnD;;;OAGG;IACG,WAAW,CAAC,aAAa,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IA4C/D,6CAA6C;IACvC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAShC,4BAA4B;IAC5B,KAAK,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAA;KAAE;IAO/F,mCAAmC;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASd,YAAY;CAK3B"}
@@ -0,0 +1,284 @@
1
+ import { ShortTermMemory } from "./stm.js";
2
+ import { LongTermMemory } from "./ltm.js";
3
+ import { LocalEmbedding } from "./embeddings/local.js";
4
+ import { VoyageEmbedding } from "./embeddings/voyage.js";
5
+ import { LocalStorage } from "./storage/local.js";
6
+ /**
7
+ * AgenticMemory — unified memory manager combining STM and LTM.
8
+ *
9
+ * Handles:
10
+ * - Adding memories to STM (working context)
11
+ * - Consolidating important STM entries into LTM (graph)
12
+ * - Hybrid search across both STM and LTM
13
+ * - Automatic persistence via storage backend
14
+ * - Decay and reinforcement of LTM nodes
15
+ *
16
+ * Usage:
17
+ * ```ts
18
+ * // Local backend (no API key needed)
19
+ * const memory = new AgenticMemory({ backend: "local" });
20
+ *
21
+ * // Voyage AI backend (high-quality embeddings)
22
+ * const memory = new AgenticMemory({ backend: "voyage", voyageApiKey: "pa-..." });
23
+ *
24
+ * await memory.add("User's name is Alice", "semantic", 0.8);
25
+ * const results = await memory.search("What is the user's name?");
26
+ * ```
27
+ */
28
+ export class AgenticMemory {
29
+ stm;
30
+ ltm;
31
+ embedding;
32
+ storage;
33
+ config;
34
+ loaded = false;
35
+ lastEpisodeId;
36
+ constructor(config) {
37
+ this.config = config;
38
+ // Initialize embedding backend
39
+ if (config.embedding) {
40
+ this.embedding = config.embedding;
41
+ }
42
+ else if (config.backend === "voyage") {
43
+ if (!config.voyageApiKey) {
44
+ throw new Error("voyageApiKey is required when backend is 'voyage'");
45
+ }
46
+ this.embedding = new VoyageEmbedding(config.voyageApiKey, config.voyageModel);
47
+ }
48
+ else {
49
+ this.embedding = new LocalEmbedding();
50
+ }
51
+ // Initialize storage backend
52
+ this.storage = config.storage ?? new LocalStorage(config.storageDir, config.namespace);
53
+ // Initialize STM and LTM
54
+ this.stm = new ShortTermMemory(config.stm);
55
+ this.ltm = new LongTermMemory(config.ltm, this.embedding);
56
+ }
57
+ // ── Load / Save ─────────────────────────────────────
58
+ /** Load persisted graph from storage */
59
+ async load() {
60
+ if (this.loaded)
61
+ return;
62
+ this.loaded = true;
63
+ const data = await this.storage.load();
64
+ if (data) {
65
+ this.ltm.loadState(data.nodes, data.edges);
66
+ if (data.stm) {
67
+ this.stm.load(data.stm);
68
+ }
69
+ }
70
+ }
71
+ /** Save current state to storage */
72
+ async save() {
73
+ const { nodes, edges } = this.ltm.getState();
74
+ const stm = this.stm.serialize();
75
+ const serialized = {
76
+ nodes,
77
+ edges,
78
+ stm,
79
+ metadata: {
80
+ version: "0.1.0",
81
+ savedAt: new Date().toISOString(),
82
+ nodeCount: nodes.length,
83
+ edgeCount: edges.length,
84
+ },
85
+ };
86
+ await this.storage.save(serialized);
87
+ }
88
+ // ── Add Memories ────────────────────────────────────
89
+ /**
90
+ * Add a memory. Goes to STM first, then consolidates to LTM based on importance.
91
+ * High-importance items (>= 0.6) are immediately added to LTM as well.
92
+ */
93
+ async add(content, type = "episodic", importance = 0.5, metadata = {}) {
94
+ await this.ensureLoaded();
95
+ // Always add to STM
96
+ const stmEntry = this.stm.add(content, type, importance, metadata);
97
+ // High-importance items go directly to LTM too
98
+ let ltmNode;
99
+ if (importance >= 0.6) {
100
+ ltmNode = await this.ltm.add(content, type, importance, metadata);
101
+ }
102
+ return { stmEntry, ltmNode };
103
+ }
104
+ /** Add a conversation turn (episodic memory with temporal linking) */
105
+ async addEpisode(content, importance = 0.5) {
106
+ await this.ensureLoaded();
107
+ const stmEntry = this.stm.add(content, "episodic", importance);
108
+ const ltmNode = await this.ltm.addEpisode(content, importance, this.lastEpisodeId);
109
+ this.lastEpisodeId = ltmNode.id;
110
+ return { stmEntry, ltmNode };
111
+ }
112
+ /** Add a fact with entity extraction */
113
+ async addFact(content, entities = [], importance = 0.6) {
114
+ await this.ensureLoaded();
115
+ this.stm.add(content, "semantic", importance);
116
+ return this.ltm.addFact(content, entities, importance);
117
+ }
118
+ /** Add an observation */
119
+ async addObservation(content, importance = 0.5) {
120
+ await this.ensureLoaded();
121
+ this.stm.add(content, "observation", importance);
122
+ return this.ltm.addObservation(content, importance);
123
+ }
124
+ /** Add a goal */
125
+ async addGoal(content, importance = 0.8) {
126
+ await this.ensureLoaded();
127
+ this.stm.add(content, "goal", importance);
128
+ return this.ltm.addGoal(content, importance);
129
+ }
130
+ /** Create a relationship between two LTM nodes */
131
+ link(sourceId, targetId, relation, weight) {
132
+ return this.ltm.link(sourceId, targetId, relation, weight);
133
+ }
134
+ // ── Search / Retrieve ───────────────────────────────
135
+ /**
136
+ * Search across both STM and LTM.
137
+ * STM results are boosted by recency, LTM results by graph connectivity.
138
+ */
139
+ async search(query, options) {
140
+ await this.ensureLoaded();
141
+ const limit = options?.limit ?? 5;
142
+ // Search LTM (graph-based)
143
+ const ltmResults = await this.ltm.search(query, {
144
+ ...options,
145
+ limit: limit + 5, // fetch extra for merging
146
+ });
147
+ // Search STM (keyword-based)
148
+ const stmEntries = this.stm.search(query, limit);
149
+ const stmResults = stmEntries.map((entry) => ({
150
+ node: {
151
+ id: entry.id,
152
+ content: entry.content,
153
+ type: entry.type,
154
+ importance: entry.importance,
155
+ accessCount: 0,
156
+ lastAccessed: entry.createdAt,
157
+ createdAt: entry.createdAt,
158
+ metadata: { ...entry.metadata, source: "stm" },
159
+ },
160
+ score: entry.importance + 0.3, // STM recency boost
161
+ method: "keyword",
162
+ }));
163
+ // Merge and deduplicate (prefer LTM if same content)
164
+ const seen = new Set();
165
+ const merged = [];
166
+ // Interleave: STM first (more recent), then LTM
167
+ for (const r of stmResults) {
168
+ const key = r.node.content.slice(0, 100).toLowerCase();
169
+ if (!seen.has(key)) {
170
+ seen.add(key);
171
+ merged.push(r);
172
+ }
173
+ }
174
+ for (const r of ltmResults) {
175
+ const key = r.node.content.slice(0, 100).toLowerCase();
176
+ if (!seen.has(key)) {
177
+ seen.add(key);
178
+ merged.push(r);
179
+ }
180
+ }
181
+ return merged
182
+ .sort((a, b) => b.score - a.score)
183
+ .slice(0, limit);
184
+ }
185
+ /** Get recent context from STM */
186
+ getRecentContext(n = 5) {
187
+ return this.stm.getRecent(n);
188
+ }
189
+ /** Build a context string suitable for injection into a system prompt */
190
+ async buildContext(query) {
191
+ await this.ensureLoaded();
192
+ const parts = [];
193
+ // STM context
194
+ const stmContext = this.stm.buildContext();
195
+ if (stmContext) {
196
+ parts.push(stmContext);
197
+ }
198
+ // LTM context (if query provided, search; otherwise get recent important)
199
+ if (query) {
200
+ const ltmResults = await this.ltm.search(query, { limit: 5, includeRelated: true });
201
+ if (ltmResults.length > 0) {
202
+ const lines = ltmResults.map((r) => {
203
+ let line = `- [${r.node.type}] ${r.node.content}`;
204
+ if (r.related && r.related.length > 0) {
205
+ const relatedStr = r.related.map((n) => n.content).join("; ");
206
+ line += ` (related: ${relatedStr})`;
207
+ }
208
+ return line;
209
+ });
210
+ parts.push(`Long-term memories:\n${lines.join("\n")}`);
211
+ }
212
+ }
213
+ return parts.join("\n\n");
214
+ }
215
+ // ── Consolidation ───────────────────────────────────
216
+ /**
217
+ * Consolidate STM into LTM.
218
+ * Moves important STM entries into the LTM graph and creates relationships.
219
+ */
220
+ async consolidate(minImportance = 0.4) {
221
+ await this.ensureLoaded();
222
+ const candidates = this.stm.getConsolidationCandidates(minImportance);
223
+ if (candidates.length === 0)
224
+ return 0;
225
+ let consolidated = 0;
226
+ const consolidatedIds = new Set();
227
+ let prevNodeId;
228
+ for (const entry of candidates) {
229
+ // Check if similar content already exists in LTM
230
+ const existing = await this.ltm.search(entry.content, { limit: 1, minScore: 0.85 });
231
+ if (existing.length > 0) {
232
+ // Reinforce existing memory instead of duplicating
233
+ this.ltm.reinforce(existing[0].node.id, 0.1);
234
+ consolidatedIds.add(entry.id);
235
+ continue;
236
+ }
237
+ // Add to LTM
238
+ const node = await this.ltm.add(entry.content, entry.type, entry.importance, entry.metadata);
239
+ // Link sequential entries
240
+ if (prevNodeId) {
241
+ this.ltm.link(prevNodeId, node.id, "leads_to", 0.6);
242
+ }
243
+ prevNodeId = node.id;
244
+ consolidatedIds.add(entry.id);
245
+ consolidated++;
246
+ }
247
+ // Remove consolidated entries from STM
248
+ this.stm.remove(consolidatedIds);
249
+ // Auto-save after consolidation
250
+ await this.save();
251
+ return consolidated;
252
+ }
253
+ // ── Maintenance ─────────────────────────────────────
254
+ /** Apply decay to LTM (call periodically) */
255
+ async decay() {
256
+ await this.ensureLoaded();
257
+ const removed = this.ltm.decay();
258
+ if (removed.length > 0) {
259
+ await this.save();
260
+ }
261
+ return removed;
262
+ }
263
+ /** Get memory statistics */
264
+ stats() {
265
+ return {
266
+ stm: this.stm.size(),
267
+ ltm: this.ltm.stats(),
268
+ };
269
+ }
270
+ /** Clear all memory (STM + LTM) */
271
+ async clear() {
272
+ this.stm.clear();
273
+ this.ltm.loadState([], []);
274
+ this.lastEpisodeId = undefined;
275
+ await this.save();
276
+ }
277
+ // ── Private ─────────────────────────────────────────
278
+ async ensureLoaded() {
279
+ if (!this.loaded) {
280
+ await this.load();
281
+ }
282
+ }
283
+ }
284
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
package/dist/stm.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import type { STMConfig, STMEntry, MemoryNodeType } from "./types.js";
2
+ /**
3
+ * Short-Term Memory (STM) — the agent's working context.
4
+ *
5
+ * Holds recent, high-relevance items in a bounded buffer.
6
+ * Items decay and get evicted based on TTL and capacity.
7
+ * Important items are promoted to LTM during consolidation.
8
+ */
9
+ export declare class ShortTermMemory {
10
+ private entries;
11
+ private config;
12
+ constructor(config?: Partial<STMConfig>);
13
+ /** Add an entry to STM */
14
+ add(content: string, type?: MemoryNodeType, importance?: number, metadata?: Record<string, unknown>): STMEntry;
15
+ /** Get all current STM entries */
16
+ getAll(): STMEntry[];
17
+ /** Get entries above an importance threshold */
18
+ getImportant(minImportance?: number): STMEntry[];
19
+ /** Get the most recent N entries */
20
+ getRecent(n?: number): STMEntry[];
21
+ /** Search STM by keyword */
22
+ search(query: string, limit?: number): STMEntry[];
23
+ /** Get entries ready for consolidation to LTM (important + accessed enough) */
24
+ getConsolidationCandidates(minImportance?: number): STMEntry[];
25
+ /** Remove specific entries (after consolidation to LTM) */
26
+ remove(ids: Set<string>): void;
27
+ /** Clear all STM entries */
28
+ clear(): void;
29
+ /** Get current size */
30
+ size(): number;
31
+ /** Build a context string from STM for injection into prompts */
32
+ buildContext(): string;
33
+ /** Serialize STM for persistence */
34
+ serialize(): STMEntry[];
35
+ /** Load STM from serialized data */
36
+ load(entries: STMEntry[]): void;
37
+ private pruneExpired;
38
+ private evict;
39
+ }
40
+ //# sourceMappingURL=stm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stm.d.ts","sourceRoot":"","sources":["../src/stm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOtE;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;IAIvC,0BAA0B;IAC1B,GAAG,CACD,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,cAA2B,EACjC,UAAU,GAAE,MAAY,EACxB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,QAAQ;IAoBX,kCAAkC;IAClC,MAAM,IAAI,QAAQ,EAAE;IAKpB,gDAAgD;IAChD,YAAY,CAAC,aAAa,GAAE,MAAY,GAAG,QAAQ,EAAE;IAKrD,oCAAoC;IACpC,SAAS,CAAC,CAAC,GAAE,MAAU,GAAG,QAAQ,EAAE;IAKpC,4BAA4B;IAC5B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,QAAQ,EAAE;IAoBpD,+EAA+E;IAC/E,0BAA0B,CAAC,aAAa,GAAE,MAAY,GAAG,QAAQ,EAAE;IAInE,2DAA2D;IAC3D,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;IAI9B,4BAA4B;IAC5B,KAAK,IAAI,IAAI;IAIb,uBAAuB;IACvB,IAAI,IAAI,MAAM;IAKd,iEAAiE;IACjE,YAAY,IAAI,MAAM;IAQtB,oCAAoC;IACpC,SAAS,IAAI,QAAQ,EAAE;IAIvB,oCAAoC;IACpC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI;IAO/B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,KAAK;CAYd"}