@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.
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Voyage AI embedding backend.
3
+ * Uses the Voyage API for high-quality neural embeddings.
4
+ *
5
+ * Models:
6
+ * - voyage-3-lite (default): 512 dimensions, fast, cheap
7
+ * - voyage-3: 1024 dimensions, higher quality
8
+ * - voyage-3-large: 1024 dimensions, best quality
9
+ * - voyage-code-3: optimized for code
10
+ *
11
+ * API docs: https://docs.voyageai.com/reference/embeddings-api
12
+ */
13
+ export class VoyageEmbedding {
14
+ name = "voyage";
15
+ dimension;
16
+ apiKey;
17
+ model;
18
+ baseUrl;
19
+ constructor(apiKey, model = "voyage-3-lite", baseUrl) {
20
+ if (!apiKey) {
21
+ throw new Error("Voyage API key is required. Get one at https://dash.voyageai.com/");
22
+ }
23
+ this.apiKey = apiKey;
24
+ this.model = model;
25
+ this.baseUrl = baseUrl ?? "https://api.voyageai.com/v1";
26
+ // Set dimension based on model
27
+ switch (model) {
28
+ case "voyage-3-lite":
29
+ this.dimension = 512;
30
+ break;
31
+ case "voyage-3":
32
+ case "voyage-3-large":
33
+ case "voyage-code-3":
34
+ this.dimension = 1024;
35
+ break;
36
+ default:
37
+ this.dimension = 1024;
38
+ }
39
+ }
40
+ async embed(text) {
41
+ const results = await this.callApi([text]);
42
+ return results[0];
43
+ }
44
+ async embedBatch(texts) {
45
+ // Voyage supports up to 128 texts per batch
46
+ const batchSize = 128;
47
+ const allResults = [];
48
+ for (let i = 0; i < texts.length; i += batchSize) {
49
+ const batch = texts.slice(i, i + batchSize);
50
+ const results = await this.callApi(batch);
51
+ allResults.push(...results);
52
+ }
53
+ return allResults;
54
+ }
55
+ async callApi(input) {
56
+ const res = await fetch(`${this.baseUrl}/embeddings`, {
57
+ method: "POST",
58
+ headers: {
59
+ "Content-Type": "application/json",
60
+ "Authorization": `Bearer ${this.apiKey}`,
61
+ },
62
+ body: JSON.stringify({
63
+ model: this.model,
64
+ input,
65
+ }),
66
+ });
67
+ if (!res.ok) {
68
+ const errText = await res.text();
69
+ throw new Error(`Voyage API error (${res.status}): ${errText}`);
70
+ }
71
+ const data = await res.json();
72
+ // Sort by index to maintain order
73
+ return data.data
74
+ .sort((a, b) => a.index - b.index)
75
+ .map((d) => d.embedding);
76
+ }
77
+ }
78
+ //# sourceMappingURL=voyage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voyage.js","sourceRoot":"","sources":["../../src/embeddings/voyage.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,QAAQ,CAAC;IAChB,SAAS,CAAS;IACnB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,OAAO,CAAS;IAExB,YAAY,MAAc,EAAE,QAAgB,eAAe,EAAE,OAAgB;QAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,6BAA6B,CAAC;QAExD,+BAA+B;QAC/B,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,eAAe;gBAClB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACrB,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,KAAK,gBAAgB,CAAC;YACtB,KAAK,eAAe;gBAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR;gBACE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,4CAA4C;QAC5C,MAAM,SAAS,GAAG,GAAG,CAAC;QACtB,MAAM,UAAU,GAAe,EAAE,CAAC;QAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,KAAe;QACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACzC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK;aACN,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAG1B,CAAC;QAEF,kCAAkC;QAClC,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ import type { MemoryNode, MemoryNodeType, MemoryEdge, MemoryRelation, SearchResult, SearchOptions, EmbeddingBackend } from "./types.js";
2
+ /**
3
+ * In-memory graph structure for agent memory.
4
+ * Supports node/edge CRUD, graph traversal, and hybrid search (keyword + vector + recency).
5
+ */
6
+ export declare class Graph {
7
+ private nodes;
8
+ private edges;
9
+ /** Adjacency list: nodeId -> Set of edgeIds */
10
+ private adjacency;
11
+ private embedding;
12
+ constructor(embedding?: EmbeddingBackend);
13
+ setEmbeddingBackend(backend: EmbeddingBackend): void;
14
+ addNode(content: string, type: MemoryNodeType, importance?: number, metadata?: Record<string, unknown>): Promise<MemoryNode>;
15
+ getNode(id: string): MemoryNode | undefined;
16
+ removeNode(id: string): boolean;
17
+ /** Reinforce a node — increases access count and updates lastAccessed */
18
+ reinforceNode(id: string, importanceBoost?: number): void;
19
+ /** Apply decay to all nodes based on time since last access */
20
+ applyDecay(decayRate: number, minImportance: number): string[];
21
+ getAllNodes(): MemoryNode[];
22
+ getNodeCount(): number;
23
+ addEdge(sourceId: string, targetId: string, relation: MemoryRelation, weight?: number, metadata?: Record<string, unknown>): MemoryEdge | null;
24
+ findEdge(sourceId: string, targetId: string, relation?: MemoryRelation): MemoryEdge | undefined;
25
+ /** Get all neighbors of a node */
26
+ getNeighbors(nodeId: string, relation?: MemoryRelation): MemoryNode[];
27
+ /** Get edges connected to a node */
28
+ getEdgesForNode(nodeId: string): MemoryEdge[];
29
+ getAllEdges(): MemoryEdge[];
30
+ getEdgeCount(): number;
31
+ /** BFS traversal from a starting node, up to maxDepth */
32
+ traverse(startId: string, maxDepth?: number): MemoryNode[];
33
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
34
+ private vectorSearch;
35
+ private keywordSearch;
36
+ getState(): {
37
+ nodes: MemoryNode[];
38
+ edges: MemoryEdge[];
39
+ };
40
+ loadState(nodes: MemoryNode[], edges: MemoryEdge[]): void;
41
+ }
42
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,cAAc,EAEd,YAAY,EACZ,aAAa,EACb,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,KAAK,CAAsC;IACnD,+CAA+C;IAC/C,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,SAAS,CAAiC;gBAEtC,SAAS,CAAC,EAAE,gBAAgB;IAIxC,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAM9C,OAAO,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,cAAc,EACpB,UAAU,GAAE,MAAY,EACxB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,UAAU,CAAC;IA6BtB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAsB/B,yEAAyE;IACzE,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,GAAE,MAAa,GAAG,IAAI;IAQ/D,+DAA+D;IAC/D,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE;IAkB9D,WAAW,IAAI,UAAU,EAAE;IAI3B,YAAY,IAAI,MAAM;IAMtB,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,EACxB,MAAM,GAAE,MAAY,EACpB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,UAAU,GAAG,IAAI;IA2BpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS;IAiB/F,kCAAkC;IAClC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE;IAiBrE,oCAAoC;IACpC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAQ7C,WAAW,IAAI,UAAU,EAAE;IAI3B,YAAY,IAAI,MAAM;IAMtB,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,UAAU,EAAE;IA6BvD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAmEnE,YAAY;IAoB1B,OAAO,CAAC,aAAa;IAmBrB,QAAQ,IAAI;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE;IAOxD,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI;CAgB1D"}
package/dist/graph.js ADDED
@@ -0,0 +1,322 @@
1
+ import { randomUUID } from "node:crypto";
2
+ /**
3
+ * In-memory graph structure for agent memory.
4
+ * Supports node/edge CRUD, graph traversal, and hybrid search (keyword + vector + recency).
5
+ */
6
+ export class Graph {
7
+ nodes = new Map();
8
+ edges = new Map();
9
+ /** Adjacency list: nodeId -> Set of edgeIds */
10
+ adjacency = new Map();
11
+ embedding = null;
12
+ constructor(embedding) {
13
+ this.embedding = embedding ?? null;
14
+ }
15
+ setEmbeddingBackend(backend) {
16
+ this.embedding = backend;
17
+ }
18
+ // ── Node Operations ─────────────────────────────────
19
+ async addNode(content, type, importance = 0.5, metadata = {}) {
20
+ const now = new Date().toISOString();
21
+ let embedding;
22
+ if (this.embedding) {
23
+ try {
24
+ embedding = await this.embedding.embed(content);
25
+ }
26
+ catch {
27
+ // Embedding failure is non-fatal
28
+ }
29
+ }
30
+ const node = {
31
+ id: randomUUID(),
32
+ content,
33
+ type,
34
+ embedding,
35
+ importance: Math.max(0, Math.min(1, importance)),
36
+ accessCount: 0,
37
+ lastAccessed: now,
38
+ createdAt: now,
39
+ metadata,
40
+ };
41
+ this.nodes.set(node.id, node);
42
+ this.adjacency.set(node.id, new Set());
43
+ return node;
44
+ }
45
+ getNode(id) {
46
+ return this.nodes.get(id);
47
+ }
48
+ removeNode(id) {
49
+ if (!this.nodes.has(id))
50
+ return false;
51
+ // Remove all edges connected to this node
52
+ const edgeIds = this.adjacency.get(id);
53
+ if (edgeIds) {
54
+ for (const edgeId of edgeIds) {
55
+ const edge = this.edges.get(edgeId);
56
+ if (edge) {
57
+ // Remove from the other node's adjacency
58
+ const otherId = edge.source === id ? edge.target : edge.source;
59
+ this.adjacency.get(otherId)?.delete(edgeId);
60
+ this.edges.delete(edgeId);
61
+ }
62
+ }
63
+ }
64
+ this.adjacency.delete(id);
65
+ this.nodes.delete(id);
66
+ return true;
67
+ }
68
+ /** Reinforce a node — increases access count and updates lastAccessed */
69
+ reinforceNode(id, importanceBoost = 0.05) {
70
+ const node = this.nodes.get(id);
71
+ if (!node)
72
+ return;
73
+ node.accessCount++;
74
+ node.lastAccessed = new Date().toISOString();
75
+ node.importance = Math.min(1, node.importance + importanceBoost);
76
+ }
77
+ /** Apply decay to all nodes based on time since last access */
78
+ applyDecay(decayRate, minImportance) {
79
+ const now = Date.now();
80
+ const removed = [];
81
+ for (const [id, node] of this.nodes) {
82
+ const hoursSinceAccess = (now - new Date(node.lastAccessed).getTime()) / (1000 * 60 * 60);
83
+ const decay = decayRate * hoursSinceAccess;
84
+ node.importance = Math.max(0, node.importance - decay);
85
+ if (node.importance < minImportance && node.accessCount < 3) {
86
+ this.removeNode(id);
87
+ removed.push(id);
88
+ }
89
+ }
90
+ return removed;
91
+ }
92
+ getAllNodes() {
93
+ return Array.from(this.nodes.values());
94
+ }
95
+ getNodeCount() {
96
+ return this.nodes.size;
97
+ }
98
+ // ── Edge Operations ─────────────────────────────────
99
+ addEdge(sourceId, targetId, relation, weight = 0.5, metadata = {}) {
100
+ if (!this.nodes.has(sourceId) || !this.nodes.has(targetId))
101
+ return null;
102
+ // Check for duplicate edge
103
+ const existing = this.findEdge(sourceId, targetId, relation);
104
+ if (existing) {
105
+ // Reinforce existing edge
106
+ existing.weight = Math.min(1, existing.weight + 0.1);
107
+ return existing;
108
+ }
109
+ const edge = {
110
+ id: randomUUID(),
111
+ source: sourceId,
112
+ target: targetId,
113
+ relation,
114
+ weight: Math.max(0, Math.min(1, weight)),
115
+ createdAt: new Date().toISOString(),
116
+ metadata,
117
+ };
118
+ this.edges.set(edge.id, edge);
119
+ this.adjacency.get(sourceId)?.add(edge.id);
120
+ this.adjacency.get(targetId)?.add(edge.id);
121
+ return edge;
122
+ }
123
+ findEdge(sourceId, targetId, relation) {
124
+ const edgeIds = this.adjacency.get(sourceId);
125
+ if (!edgeIds)
126
+ return undefined;
127
+ for (const edgeId of edgeIds) {
128
+ const edge = this.edges.get(edgeId);
129
+ if (!edge)
130
+ continue;
131
+ if ((edge.source === sourceId && edge.target === targetId) ||
132
+ (edge.source === targetId && edge.target === sourceId)) {
133
+ if (!relation || edge.relation === relation)
134
+ return edge;
135
+ }
136
+ }
137
+ return undefined;
138
+ }
139
+ /** Get all neighbors of a node */
140
+ getNeighbors(nodeId, relation) {
141
+ const edgeIds = this.adjacency.get(nodeId);
142
+ if (!edgeIds)
143
+ return [];
144
+ const neighbors = [];
145
+ for (const edgeId of edgeIds) {
146
+ const edge = this.edges.get(edgeId);
147
+ if (!edge)
148
+ continue;
149
+ if (relation && edge.relation !== relation)
150
+ continue;
151
+ const neighborId = edge.source === nodeId ? edge.target : edge.source;
152
+ const neighbor = this.nodes.get(neighborId);
153
+ if (neighbor)
154
+ neighbors.push(neighbor);
155
+ }
156
+ return neighbors;
157
+ }
158
+ /** Get edges connected to a node */
159
+ getEdgesForNode(nodeId) {
160
+ const edgeIds = this.adjacency.get(nodeId);
161
+ if (!edgeIds)
162
+ return [];
163
+ return Array.from(edgeIds)
164
+ .map((id) => this.edges.get(id))
165
+ .filter((e) => e !== undefined);
166
+ }
167
+ getAllEdges() {
168
+ return Array.from(this.edges.values());
169
+ }
170
+ getEdgeCount() {
171
+ return this.edges.size;
172
+ }
173
+ // ── Graph Traversal ─────────────────────────────────
174
+ /** BFS traversal from a starting node, up to maxDepth */
175
+ traverse(startId, maxDepth = 2) {
176
+ const visited = new Set();
177
+ const result = [];
178
+ const queue = [{ id: startId, depth: 0 }];
179
+ while (queue.length > 0) {
180
+ const { id, depth } = queue.shift();
181
+ if (visited.has(id) || depth > maxDepth)
182
+ continue;
183
+ visited.add(id);
184
+ const node = this.nodes.get(id);
185
+ if (node) {
186
+ result.push(node);
187
+ if (depth < maxDepth) {
188
+ const neighbors = this.getNeighbors(id);
189
+ for (const n of neighbors) {
190
+ if (!visited.has(n.id)) {
191
+ queue.push({ id: n.id, depth: depth + 1 });
192
+ }
193
+ }
194
+ }
195
+ }
196
+ }
197
+ return result;
198
+ }
199
+ // ── Search ──────────────────────────────────────────
200
+ async search(query, options = {}) {
201
+ const { limit = 5, types, minScore = 0.0, includeRelated = false, traversalDepth = 1, method = "hybrid", } = options;
202
+ let results = [];
203
+ // Filter nodes by type if specified
204
+ let candidates = Array.from(this.nodes.values());
205
+ if (types && types.length > 0) {
206
+ candidates = candidates.filter((n) => types.includes(n.type));
207
+ }
208
+ if (method === "vector" || method === "hybrid") {
209
+ const vectorResults = await this.vectorSearch(query, candidates);
210
+ results.push(...vectorResults);
211
+ }
212
+ if (method === "keyword" || method === "hybrid") {
213
+ const keywordResults = this.keywordSearch(query, candidates);
214
+ results.push(...keywordResults);
215
+ }
216
+ // Add recency bonus
217
+ const now = Date.now();
218
+ for (const r of results) {
219
+ const hoursSince = (now - new Date(r.node.lastAccessed).getTime()) / (1000 * 60 * 60);
220
+ const recencyBonus = Math.max(0, 0.2 - hoursSince * 0.01);
221
+ r.score += recencyBonus;
222
+ // Importance bonus
223
+ r.score += r.node.importance * 0.15;
224
+ }
225
+ // Deduplicate by node ID, keeping highest score
226
+ const deduped = new Map();
227
+ for (const r of results) {
228
+ const existing = deduped.get(r.node.id);
229
+ if (!existing || r.score > existing.score) {
230
+ deduped.set(r.node.id, r);
231
+ }
232
+ }
233
+ let sorted = Array.from(deduped.values())
234
+ .filter((r) => r.score >= minScore)
235
+ .sort((a, b) => b.score - a.score)
236
+ .slice(0, limit);
237
+ // Attach related nodes via graph traversal
238
+ if (includeRelated) {
239
+ for (const r of sorted) {
240
+ r.related = this.traverse(r.node.id, traversalDepth).filter((n) => n.id !== r.node.id);
241
+ }
242
+ }
243
+ // Reinforce accessed nodes
244
+ for (const r of sorted) {
245
+ this.reinforceNode(r.node.id, 0.02);
246
+ }
247
+ return sorted;
248
+ }
249
+ async vectorSearch(query, candidates) {
250
+ if (!this.embedding)
251
+ return [];
252
+ const withEmbeddings = candidates.filter((n) => n.embedding && n.embedding.length > 0);
253
+ if (withEmbeddings.length === 0)
254
+ return [];
255
+ let queryEmbedding;
256
+ try {
257
+ queryEmbedding = await this.embedding.embed(query);
258
+ }
259
+ catch {
260
+ return [];
261
+ }
262
+ return withEmbeddings.map((node) => ({
263
+ node,
264
+ score: cosineSimilarity(queryEmbedding, node.embedding),
265
+ method: "vector",
266
+ }));
267
+ }
268
+ keywordSearch(query, candidates) {
269
+ const queryWords = query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
270
+ if (queryWords.length === 0)
271
+ return [];
272
+ return candidates
273
+ .map((node) => {
274
+ const text = node.content.toLowerCase();
275
+ let matches = 0;
276
+ for (const word of queryWords) {
277
+ if (text.includes(word))
278
+ matches++;
279
+ }
280
+ const score = queryWords.length > 0 ? matches / queryWords.length : 0;
281
+ return { node, score: score * 0.8, method: "keyword" };
282
+ })
283
+ .filter((r) => r.score > 0);
284
+ }
285
+ // ── Serialization ───────────────────────────────────
286
+ getState() {
287
+ return {
288
+ nodes: Array.from(this.nodes.values()),
289
+ edges: Array.from(this.edges.values()),
290
+ };
291
+ }
292
+ loadState(nodes, edges) {
293
+ this.nodes.clear();
294
+ this.edges.clear();
295
+ this.adjacency.clear();
296
+ for (const node of nodes) {
297
+ this.nodes.set(node.id, node);
298
+ this.adjacency.set(node.id, new Set());
299
+ }
300
+ for (const edge of edges) {
301
+ this.edges.set(edge.id, edge);
302
+ this.adjacency.get(edge.source)?.add(edge.id);
303
+ this.adjacency.get(edge.target)?.add(edge.id);
304
+ }
305
+ }
306
+ }
307
+ // ── Utilities ───────────────────────────────────────────
308
+ function cosineSimilarity(a, b) {
309
+ if (a.length !== b.length)
310
+ return 0;
311
+ let dot = 0;
312
+ let normA = 0;
313
+ let normB = 0;
314
+ for (let i = 0; i < a.length; i++) {
315
+ dot += a[i] * b[i];
316
+ normA += a[i] * a[i];
317
+ normB += b[i] * b[i];
318
+ }
319
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
320
+ return denom === 0 ? 0 : dot / denom;
321
+ }
322
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { AgenticMemory } from "./manager.js";
2
+ export { ShortTermMemory } from "./stm.js";
3
+ export { LongTermMemory } from "./ltm.js";
4
+ export { Graph } from "./graph.js";
5
+ export { LocalEmbedding } from "./embeddings/local.js";
6
+ export { VoyageEmbedding } from "./embeddings/voyage.js";
7
+ export { LocalStorage } from "./storage/local.js";
8
+ export type { AgenticMemoryConfig, STMConfig, LTMConfig, MemoryNode, MemoryNodeType, MemoryEdge, MemoryRelation, MemoryGraph, STMEntry, SearchResult, SearchOptions, EmbeddingBackend, StorageBackend, SerializedGraph, SerializedNode, SerializedEdge, } from "./types.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,EAEV,mBAAmB,EACnB,SAAS,EACT,SAAS,EAET,UAAU,EACV,cAAc,EACd,UAAU,EACV,cAAc,EACd,WAAW,EAEX,QAAQ,EAER,YAAY,EACZ,aAAa,EAEb,gBAAgB,EAChB,cAAc,EAEd,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ // ── Core ────────────────────────────────────────────────
2
+ export { AgenticMemory } from "./manager.js";
3
+ // ── Components ──────────────────────────────────────────
4
+ export { ShortTermMemory } from "./stm.js";
5
+ export { LongTermMemory } from "./ltm.js";
6
+ export { Graph } from "./graph.js";
7
+ // ── Embedding Backends ──────────────────────────────────
8
+ export { LocalEmbedding } from "./embeddings/local.js";
9
+ export { VoyageEmbedding } from "./embeddings/voyage.js";
10
+ // ── Storage Backends ────────────────────────────────────
11
+ export { LocalStorage } from "./storage/local.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,2DAA2D;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,2DAA2D;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,2DAA2D;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/ltm.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ import type { LTMConfig, MemoryNode, MemoryNodeType, MemoryRelation, MemoryEdge, SearchResult, SearchOptions, EmbeddingBackend } from "./types.js";
2
+ /**
3
+ * Long-Term Memory (LTM) — persistent graph-based memory.
4
+ *
5
+ * Stores memories as nodes in a graph with typed relationships.
6
+ * Supports decay (forgetting), reinforcement (remembering), and
7
+ * hybrid search (vector + keyword + graph traversal).
8
+ */
9
+ export declare class LongTermMemory {
10
+ private graph;
11
+ private config;
12
+ constructor(config?: Partial<LTMConfig>, embedding?: EmbeddingBackend);
13
+ setEmbeddingBackend(backend: EmbeddingBackend): void;
14
+ /** Add a memory to LTM */
15
+ add(content: string, type: MemoryNodeType, importance?: number, metadata?: Record<string, unknown>): Promise<MemoryNode>;
16
+ /** Create a relationship between two memories */
17
+ link(sourceId: string, targetId: string, relation: MemoryRelation, weight?: number): MemoryEdge | null;
18
+ /** Store a fact — semantic memory with entity extraction */
19
+ addFact(content: string, entities?: string[], importance?: number): Promise<{
20
+ node: MemoryNode;
21
+ entityNodes: MemoryNode[];
22
+ }>;
23
+ /** Store an episode — episodic memory from a conversation turn */
24
+ addEpisode(content: string, importance?: number, previousEpisodeId?: string): Promise<MemoryNode>;
25
+ /** Store an observation */
26
+ addObservation(content: string, importance?: number): Promise<MemoryNode>;
27
+ /** Store a goal */
28
+ addGoal(content: string, importance?: number): Promise<MemoryNode>;
29
+ /** Search LTM with hybrid search */
30
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
31
+ /** Get a specific memory by ID */
32
+ get(id: string): MemoryNode | undefined;
33
+ /** Get all memories of a specific type */
34
+ getByType(type: MemoryNodeType): MemoryNode[];
35
+ /** Get related memories via graph traversal */
36
+ getRelated(nodeId: string, depth?: number): MemoryNode[];
37
+ /** Get neighbors of a node with a specific relation */
38
+ getNeighbors(nodeId: string, relation?: MemoryRelation): MemoryNode[];
39
+ /** Find an entity node by name (case-insensitive) */
40
+ findEntity(name: string): MemoryNode | undefined;
41
+ /** Apply decay to all memories */
42
+ decay(): string[];
43
+ /** Reinforce a memory (accessed/recalled) */
44
+ reinforce(id: string, boost?: number): void;
45
+ /** Remove a memory */
46
+ remove(id: string): boolean;
47
+ /** Get graph statistics */
48
+ stats(): {
49
+ nodes: number;
50
+ edges: number;
51
+ byType: Record<string, number>;
52
+ };
53
+ getState(): {
54
+ nodes: MemoryNode[];
55
+ edges: MemoryEdge[];
56
+ };
57
+ loadState(nodes: MemoryNode[], edges: MemoryEdge[]): void;
58
+ private pruneWeakest;
59
+ }
60
+ //# sourceMappingURL=ltm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ltm.d.ts","sourceRoot":"","sources":["../src/ltm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAQpB;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,gBAAgB;IAKrE,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAMpD,0BAA0B;IACpB,GAAG,CACP,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,cAAc,EACpB,UAAU,GAAE,MAAY,EACxB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,UAAU,CAAC;IAStB,iDAAiD;IACjD,IAAI,CACF,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,EACxB,MAAM,GAAE,MAAY,GACnB,UAAU,GAAG,IAAI;IAIpB,4DAA4D;IACtD,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;IAqB3D,kEAAkE;IAC5D,UAAU,CACd,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAY,EACxB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,UAAU,CAAC;IAUtB,2BAA2B;IACrB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAIpF,mBAAmB;IACb,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAM7E,oCAAoC;IAC9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI7E,kCAAkC;IAClC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,0CAA0C;IAC1C,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,EAAE;IAI7C,+CAA+C;IAC/C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,UAAU,EAAE;IAI3D,uDAAuD;IACvD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE;IAIrE,qDAAqD;IACrD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAShD,kCAAkC;IAClC,KAAK,IAAI,MAAM,EAAE;IAIjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,IAAI;IAIjD,sBAAsB;IACtB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI3B,2BAA2B;IAC3B,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAezE,QAAQ,IAAI;QAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE;IAIxD,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI;IAMzD,OAAO,CAAC,YAAY;CASrB"}