@agnt5/sdk 0.2.1

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 (126) hide show
  1. package/README.md +183 -0
  2. package/dist/__tests__/integration/helpers.d.ts +41 -0
  3. package/dist/__tests__/integration/helpers.d.ts.map +1 -0
  4. package/dist/__tests__/integration/helpers.js +78 -0
  5. package/dist/__tests__/integration/helpers.js.map +1 -0
  6. package/dist/agent.d.ts +260 -0
  7. package/dist/agent.d.ts.map +1 -0
  8. package/dist/agent.js +493 -0
  9. package/dist/agent.js.map +1 -0
  10. package/dist/async-context.d.ts +57 -0
  11. package/dist/async-context.d.ts.map +1 -0
  12. package/dist/async-context.js +52 -0
  13. package/dist/async-context.js.map +1 -0
  14. package/dist/batch.d.ts +116 -0
  15. package/dist/batch.d.ts.map +1 -0
  16. package/dist/batch.js +98 -0
  17. package/dist/batch.js.map +1 -0
  18. package/dist/chat.d.ts +137 -0
  19. package/dist/chat.d.ts.map +1 -0
  20. package/dist/chat.js +278 -0
  21. package/dist/chat.js.map +1 -0
  22. package/dist/client.d.ts +394 -0
  23. package/dist/client.d.ts.map +1 -0
  24. package/dist/client.js +757 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/context.d.ts +47 -0
  27. package/dist/context.d.ts.map +1 -0
  28. package/dist/context.js +244 -0
  29. package/dist/context.js.map +1 -0
  30. package/dist/errors.d.ts +148 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +201 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/eval.d.ts +242 -0
  35. package/dist/eval.d.ts.map +1 -0
  36. package/dist/eval.js +452 -0
  37. package/dist/eval.js.map +1 -0
  38. package/dist/event-emitter.d.ts +28 -0
  39. package/dist/event-emitter.d.ts.map +1 -0
  40. package/dist/event-emitter.js +79 -0
  41. package/dist/event-emitter.js.map +1 -0
  42. package/dist/events.d.ts +285 -0
  43. package/dist/events.d.ts.map +1 -0
  44. package/dist/events.js +256 -0
  45. package/dist/events.js.map +1 -0
  46. package/dist/function.d.ts +61 -0
  47. package/dist/function.d.ts.map +1 -0
  48. package/dist/function.js +78 -0
  49. package/dist/function.js.map +1 -0
  50. package/dist/index.d.ts +67 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +80 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/lm.d.ts +301 -0
  55. package/dist/lm.d.ts.map +1 -0
  56. package/dist/lm.js +283 -0
  57. package/dist/lm.js.map +1 -0
  58. package/dist/logging.d.ts +68 -0
  59. package/dist/logging.d.ts.map +1 -0
  60. package/dist/logging.js +165 -0
  61. package/dist/logging.js.map +1 -0
  62. package/dist/mcp-server.d.ts +98 -0
  63. package/dist/mcp-server.d.ts.map +1 -0
  64. package/dist/mcp-server.js +307 -0
  65. package/dist/mcp-server.js.map +1 -0
  66. package/dist/mcp.d.ts +73 -0
  67. package/dist/mcp.d.ts.map +1 -0
  68. package/dist/mcp.js +224 -0
  69. package/dist/mcp.js.map +1 -0
  70. package/dist/memory.d.ts +234 -0
  71. package/dist/memory.d.ts.map +1 -0
  72. package/dist/memory.js +609 -0
  73. package/dist/memory.js.map +1 -0
  74. package/dist/platform-adapters.d.ts +121 -0
  75. package/dist/platform-adapters.d.ts.map +1 -0
  76. package/dist/platform-adapters.js +174 -0
  77. package/dist/platform-adapters.js.map +1 -0
  78. package/dist/platform-context.d.ts +55 -0
  79. package/dist/platform-context.d.ts.map +1 -0
  80. package/dist/platform-context.js +196 -0
  81. package/dist/platform-context.js.map +1 -0
  82. package/dist/retry-utils.d.ts +169 -0
  83. package/dist/retry-utils.d.ts.map +1 -0
  84. package/dist/retry-utils.js +304 -0
  85. package/dist/retry-utils.js.map +1 -0
  86. package/dist/sandbox.d.ts +103 -0
  87. package/dist/sandbox.d.ts.map +1 -0
  88. package/dist/sandbox.js +168 -0
  89. package/dist/sandbox.js.map +1 -0
  90. package/dist/schema-utils.d.ts +250 -0
  91. package/dist/schema-utils.d.ts.map +1 -0
  92. package/dist/schema-utils.js +444 -0
  93. package/dist/schema-utils.js.map +1 -0
  94. package/dist/scorer.d.ts +130 -0
  95. package/dist/scorer.d.ts.map +1 -0
  96. package/dist/scorer.js +211 -0
  97. package/dist/scorer.js.map +1 -0
  98. package/dist/state.d.ts +92 -0
  99. package/dist/state.d.ts.map +1 -0
  100. package/dist/state.js +151 -0
  101. package/dist/state.js.map +1 -0
  102. package/dist/tool.d.ts +120 -0
  103. package/dist/tool.d.ts.map +1 -0
  104. package/dist/tool.js +215 -0
  105. package/dist/tool.js.map +1 -0
  106. package/dist/tracing.d.ts +82 -0
  107. package/dist/tracing.d.ts.map +1 -0
  108. package/dist/tracing.js +206 -0
  109. package/dist/tracing.js.map +1 -0
  110. package/dist/types.d.ts +139 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +2 -0
  113. package/dist/types.js.map +1 -0
  114. package/dist/worker.d.ts +111 -0
  115. package/dist/worker.d.ts.map +1 -0
  116. package/dist/worker.js +944 -0
  117. package/dist/worker.js.map +1 -0
  118. package/dist/workflow-utils.d.ts +257 -0
  119. package/dist/workflow-utils.d.ts.map +1 -0
  120. package/dist/workflow-utils.js +370 -0
  121. package/dist/workflow-utils.js.map +1 -0
  122. package/dist/workflow.d.ts +78 -0
  123. package/dist/workflow.d.ts.map +1 -0
  124. package/dist/workflow.js +138 -0
  125. package/dist/workflow.js.map +1 -0
  126. package/package.json +86 -0
package/dist/memory.js ADDED
@@ -0,0 +1,609 @@
1
+ /**
2
+ * Memory APIs for AGNT5 agents and workflows.
3
+ *
4
+ * Provides:
5
+ * - ConversationMemory: Message history storage (state-adapter backed)
6
+ * - SemanticMemory: Vector-backed similarity search (interface + adapter pattern)
7
+ * - GraphMemory: In-memory knowledge graph with BFS traversal
8
+ * - MemoryScope: Multi-scope isolation (user, session, agent, tenant, global)
9
+ */
10
+ import { randomUUID } from 'crypto';
11
+ import { createRequire } from 'module';
12
+ import { fileURLToPath } from 'url';
13
+ import { dirname, join } from 'path';
14
+ import { MemoryStateAdapter } from './state.js';
15
+ // ─── NAPI binding loader (shared) ────────────────────────────────────
16
+ let _napiBindings = null;
17
+ let _napiChecked = false;
18
+ function getNapiBindings() {
19
+ if (_napiChecked)
20
+ return _napiBindings;
21
+ _napiChecked = true;
22
+ try {
23
+ const __filename = fileURLToPath(import.meta.url);
24
+ const __dirname = dirname(__filename);
25
+ const require = createRequire(import.meta.url);
26
+ const paths = [
27
+ join(__dirname, '../../native/agnt5-sdk-native.darwin-arm64.node'),
28
+ join(__dirname, '../native/agnt5-sdk-native.darwin-arm64.node'),
29
+ join(__dirname, '../../native/agnt5-sdk-native.linux-x64-gnu.node'),
30
+ join(__dirname, '../native/agnt5-sdk-native.linux-x64-gnu.node'),
31
+ ];
32
+ for (const p of paths) {
33
+ try {
34
+ _napiBindings = require(p);
35
+ return _napiBindings;
36
+ }
37
+ catch {
38
+ continue;
39
+ }
40
+ }
41
+ }
42
+ catch { /* NAPI unavailable */ }
43
+ return null;
44
+ }
45
+ // ─── Scopes ──────────────────────────────────────────────────────────
46
+ /** Memory scope for isolation */
47
+ export const MemoryScope = {
48
+ USER: 'user',
49
+ TENANT: 'tenant',
50
+ AGENT: 'agent',
51
+ SESSION: 'session',
52
+ GLOBAL: 'global',
53
+ validScopes() {
54
+ return [this.USER, this.TENANT, this.AGENT, this.SESSION, this.GLOBAL];
55
+ },
56
+ isValid(scope) {
57
+ return this.validScopes().includes(scope);
58
+ },
59
+ /** Generate collection name for a scope */
60
+ collectionName(scope, scopeId) {
61
+ const sanitized = scopeId.replace(/[^a-zA-Z0-9_-]/g, '_');
62
+ return `${scope}_${sanitized}_memories`;
63
+ },
64
+ };
65
+ /**
66
+ * Conversation memory backed by a StateAdapter.
67
+ *
68
+ * Stores message history per session, suitable for multi-turn conversations.
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * const memory = new ConversationMemory('session-123');
73
+ * await memory.add('user', 'Hello!');
74
+ * await memory.add('assistant', 'Hi there!');
75
+ * const messages = await memory.getMessages();
76
+ * ```
77
+ */
78
+ export class ConversationMemory {
79
+ constructor(sessionId, adapter) {
80
+ this._sessionId = sessionId;
81
+ this._adapter = adapter || new MemoryStateAdapter();
82
+ this._storeKey = `conversation:${sessionId}`;
83
+ }
84
+ get sessionId() {
85
+ return this._sessionId;
86
+ }
87
+ /** Load the current session data */
88
+ async loadData() {
89
+ const data = await this._adapter.load('conversation', this._storeKey);
90
+ return data || { messages: [], session_id: this._sessionId, created_at: Date.now(), message_count: 0 };
91
+ }
92
+ /** Save session data */
93
+ async saveData(data) {
94
+ await this._adapter.save('conversation', this._storeKey, data);
95
+ }
96
+ /**
97
+ * Get conversation messages, most recent first.
98
+ *
99
+ * @param limit - Maximum number of messages to return (default: 50)
100
+ */
101
+ async getMessages(limit = 50) {
102
+ const data = await this.loadData();
103
+ const messages = data.messages || [];
104
+ return messages.slice(-limit);
105
+ }
106
+ /**
107
+ * Add a message to the conversation.
108
+ */
109
+ async add(role, content, metadata) {
110
+ const data = await this.loadData();
111
+ const messages = data.messages || [];
112
+ messages.push({
113
+ role,
114
+ content,
115
+ timestamp: Date.now() / 1000,
116
+ metadata: metadata || {},
117
+ });
118
+ data.messages = messages;
119
+ data.last_message_at = Date.now() / 1000;
120
+ data.message_count = messages.length;
121
+ await this.saveData(data);
122
+ }
123
+ /** Clear all messages */
124
+ async clear() {
125
+ await this.saveData({
126
+ messages: [],
127
+ session_id: this._sessionId,
128
+ created_at: Date.now(),
129
+ message_count: 0,
130
+ });
131
+ }
132
+ /**
133
+ * Get messages formatted for LM consumption.
134
+ *
135
+ * @param limit - Maximum number of messages to return
136
+ * @returns Messages as { role, content } objects
137
+ */
138
+ async getAsLmMessages(limit = 50) {
139
+ const messages = await this.getMessages(limit);
140
+ return messages.map(m => ({ role: m.role, content: m.content }));
141
+ }
142
+ }
143
+ /**
144
+ * In-memory semantic memory adapter using simple string similarity.
145
+ *
146
+ * Uses word overlap (Jaccard) as a stand-in for real embeddings.
147
+ * For production, use a real vector DB adapter.
148
+ */
149
+ export class InMemorySemanticAdapter {
150
+ constructor() {
151
+ this.collections = new Map();
152
+ }
153
+ getCollection(name) {
154
+ if (!this.collections.has(name)) {
155
+ this.collections.set(name, new Map());
156
+ }
157
+ return this.collections.get(name);
158
+ }
159
+ tokenize(text) {
160
+ return new Set(text.toLowerCase().split(/\s+/).filter(Boolean));
161
+ }
162
+ jaccard(a, b) {
163
+ if (a.size === 0 && b.size === 0)
164
+ return 1;
165
+ const intersection = new Set([...a].filter(x => b.has(x)));
166
+ const union = new Set([...a, ...b]);
167
+ return union.size > 0 ? intersection.size / union.size : 0;
168
+ }
169
+ async store(collection, content, metadata) {
170
+ const id = randomUUID();
171
+ this.getCollection(collection).set(id, {
172
+ content,
173
+ metadata: metadata || { extra: {} },
174
+ });
175
+ return id;
176
+ }
177
+ async storeBatch(collection, contents, metadata) {
178
+ return Promise.all(contents.map((c, i) => this.store(collection, c, metadata?.[i])));
179
+ }
180
+ async search(collection, query, limit, minScore) {
181
+ const coll = this.getCollection(collection);
182
+ const queryTokens = this.tokenize(query);
183
+ const results = [];
184
+ for (const [id, entry] of coll) {
185
+ const score = this.jaccard(queryTokens, this.tokenize(entry.content));
186
+ if (minScore !== undefined && score < minScore)
187
+ continue;
188
+ results.push({ id, content: entry.content, score, metadata: entry.metadata });
189
+ }
190
+ return results
191
+ .sort((a, b) => b.score - a.score)
192
+ .slice(0, limit);
193
+ }
194
+ async get(collection, memoryId) {
195
+ const entry = this.getCollection(collection).get(memoryId);
196
+ if (!entry)
197
+ return null;
198
+ return { id: memoryId, content: entry.content, score: 1.0, metadata: entry.metadata };
199
+ }
200
+ async forget(collection, memoryId) {
201
+ return this.getCollection(collection).delete(memoryId);
202
+ }
203
+ }
204
+ /**
205
+ * Semantic memory with vector-backed similarity search.
206
+ *
207
+ * @example
208
+ * ```typescript
209
+ * const memory = new SemanticMemory('user', 'user-123');
210
+ * const id = await memory.store('TypeScript is great for type safety');
211
+ * const results = await memory.search('type checking', 5);
212
+ * ```
213
+ */
214
+ export class SemanticMemory {
215
+ constructor(scope, scopeId, adapter) {
216
+ if (!MemoryScope.isValid(scope)) {
217
+ throw new Error(`Invalid memory scope: ${scope}. Valid: ${MemoryScope.validScopes().join(', ')}`);
218
+ }
219
+ this._scope = scope;
220
+ this._scopeId = scopeId;
221
+ this._adapter = adapter || new InMemorySemanticAdapter();
222
+ this._collection = MemoryScope.collectionName(scope, scopeId);
223
+ }
224
+ get scope() {
225
+ return this._scope;
226
+ }
227
+ get scopeId() {
228
+ return this._scopeId;
229
+ }
230
+ get collectionName() {
231
+ return this._collection;
232
+ }
233
+ /** Store a content string. Returns the memory ID. */
234
+ async store(content, metadata) {
235
+ return this._adapter.store(this._collection, content, metadata);
236
+ }
237
+ /** Store multiple content strings. Returns memory IDs. */
238
+ async storeBatch(contents, metadata) {
239
+ return this._adapter.storeBatch(this._collection, contents, metadata);
240
+ }
241
+ /** Search for similar content. */
242
+ async search(query, limit = 10, minScore) {
243
+ return this._adapter.search(this._collection, query, limit, minScore);
244
+ }
245
+ /** Get a specific memory by ID. */
246
+ async get(memoryId) {
247
+ return this._adapter.get(this._collection, memoryId);
248
+ }
249
+ /** Delete a memory by ID. */
250
+ async forget(memoryId) {
251
+ return this._adapter.forget(this._collection, memoryId);
252
+ }
253
+ /**
254
+ * Create a SemanticMemory backed by real embeddings + vector DB via NAPI.
255
+ *
256
+ * Auto-detects embedder and vector DB from environment variables:
257
+ * - OPENAI_API_KEY → OpenAI embeddings
258
+ * - QDRANT_URL, PINECONE_API_KEY, etc. → vector DB
259
+ *
260
+ * Falls back to InMemorySemanticAdapter if NAPI is unavailable.
261
+ */
262
+ static async fromEnv(scope, scopeId) {
263
+ const bindings = getNapiBindings();
264
+ if (bindings?.JsSemanticMemory) {
265
+ try {
266
+ const nativeMem = await bindings.JsSemanticMemory.fromEnv(scope, scopeId);
267
+ return new SemanticMemory(scope, scopeId, new NapiSemanticAdapter(nativeMem));
268
+ }
269
+ catch {
270
+ // Fall through to in-memory
271
+ }
272
+ }
273
+ return new SemanticMemory(scope, scopeId);
274
+ }
275
+ }
276
+ /**
277
+ * SemanticMemoryAdapter backed by NAPI (real embeddings + vector DB).
278
+ * Used internally by SemanticMemory.fromEnv().
279
+ */
280
+ class NapiSemanticAdapter {
281
+ constructor(nativeInstance) {
282
+ this.native = nativeInstance;
283
+ }
284
+ async store(_collection, content, metadata) {
285
+ if (metadata) {
286
+ return this.native.storeWithMetadata(content, {
287
+ source: metadata.source ?? null,
288
+ createdAt: metadata.createdAt ?? null,
289
+ extra: Object.keys(metadata.extra).length > 0 ? metadata.extra : null,
290
+ });
291
+ }
292
+ return this.native.store(content);
293
+ }
294
+ async storeBatch(_collection, contents, metadata) {
295
+ // NAPI doesn't expose storeBatch yet — fall back to sequential
296
+ const ids = [];
297
+ for (let i = 0; i < contents.length; i++) {
298
+ const id = await this.store(_collection, contents[i], metadata?.[i]);
299
+ ids.push(id);
300
+ }
301
+ return ids;
302
+ }
303
+ async search(_collection, query, limit, minScore) {
304
+ const results = minScore != null
305
+ ? await this.native.searchWithOptions(query, limit, minScore)
306
+ : await this.native.search(query, limit);
307
+ return results.map((r) => ({
308
+ id: r.id,
309
+ content: r.content,
310
+ score: r.score,
311
+ metadata: {
312
+ source: r.source ?? undefined,
313
+ createdAt: r.createdAt ?? undefined,
314
+ extra: r.extra ?? {},
315
+ },
316
+ }));
317
+ }
318
+ async get(_collection, memoryId) {
319
+ const r = await this.native.get(memoryId);
320
+ if (!r)
321
+ return null;
322
+ return {
323
+ id: r.id,
324
+ content: r.content,
325
+ score: r.score,
326
+ metadata: {
327
+ source: r.source ?? undefined,
328
+ createdAt: r.createdAt ?? undefined,
329
+ extra: r.extra ?? {},
330
+ },
331
+ };
332
+ }
333
+ async forget(_collection, memoryId) {
334
+ return this.native.forget(memoryId);
335
+ }
336
+ }
337
+ /**
338
+ * In-memory knowledge graph with BFS traversal.
339
+ *
340
+ * @example
341
+ * ```typescript
342
+ * const graph = new GraphMemory('user:alice');
343
+ * await graph.upsertNode('alice', 'User', { name: 'Alice' });
344
+ * await graph.upsertNode('python', 'Topic', { name: 'Python' });
345
+ * await graph.relate('alice', 'python', 'likes');
346
+ *
347
+ * const result = await graph.traverse('alice', 2);
348
+ * console.log(result.nodes); // alice + python
349
+ * ```
350
+ */
351
+ export class GraphMemory {
352
+ constructor(scope) {
353
+ this._nodes = new Map();
354
+ this._relationships = new Map();
355
+ // Indices for fast lookup
356
+ this._fromIndex = new Map(); // nodeId -> Set<relId>
357
+ this._toIndex = new Map(); // nodeId -> Set<relId>
358
+ // NAPI-backed graph (when available)
359
+ this._native = null;
360
+ this._scope = scope;
361
+ }
362
+ /**
363
+ * Create a GraphMemory backed by the Rust core via NAPI.
364
+ * Falls back to in-memory JS implementation if NAPI is unavailable.
365
+ */
366
+ static fromNapi(scope) {
367
+ const gm = new GraphMemory(scope);
368
+ const bindings = getNapiBindings();
369
+ if (bindings?.JsMemoryGraph) {
370
+ try {
371
+ gm._native = new bindings.JsMemoryGraph(scope);
372
+ }
373
+ catch { /* fall back to JS impl */ }
374
+ }
375
+ return gm;
376
+ }
377
+ get scope() {
378
+ return this._scope;
379
+ }
380
+ /** Create or update a node */
381
+ async upsertNode(nodeId, nodeType, properties) {
382
+ if (this._native) {
383
+ return this._native.upsertNode(nodeId, nodeType, properties ?? null);
384
+ }
385
+ const existing = this._nodes.get(nodeId);
386
+ if (existing) {
387
+ existing.nodeType = nodeType;
388
+ if (properties) {
389
+ Object.assign(existing.properties, properties);
390
+ }
391
+ }
392
+ else {
393
+ this._nodes.set(nodeId, {
394
+ id: nodeId,
395
+ nodeType,
396
+ properties: properties || {},
397
+ });
398
+ }
399
+ return nodeId;
400
+ }
401
+ /** Get a node by ID */
402
+ async getNode(nodeId) {
403
+ if (this._native) {
404
+ const n = await this._native.getNode(nodeId);
405
+ if (!n)
406
+ return null;
407
+ return { id: n.id, nodeType: n.nodeType, properties: n.properties ?? {} };
408
+ }
409
+ return this._nodes.get(nodeId) || null;
410
+ }
411
+ /** Delete a node and all its relationships */
412
+ async deleteNode(nodeId) {
413
+ if (this._native) {
414
+ return this._native.deleteNode(nodeId);
415
+ }
416
+ if (!this._nodes.has(nodeId))
417
+ return false;
418
+ // Remove all relationships involving this node
419
+ const fromRels = this._fromIndex.get(nodeId) || new Set();
420
+ const toRels = this._toIndex.get(nodeId) || new Set();
421
+ for (const relId of [...fromRels, ...toRels]) {
422
+ this._relationships.delete(relId);
423
+ }
424
+ this._fromIndex.delete(nodeId);
425
+ this._toIndex.delete(nodeId);
426
+ // Clean up reverse index entries
427
+ for (const [, rels] of this._fromIndex) {
428
+ for (const relId of [...rels]) {
429
+ if (!this._relationships.has(relId))
430
+ rels.delete(relId);
431
+ }
432
+ }
433
+ for (const [, rels] of this._toIndex) {
434
+ for (const relId of [...rels]) {
435
+ if (!this._relationships.has(relId))
436
+ rels.delete(relId);
437
+ }
438
+ }
439
+ this._nodes.delete(nodeId);
440
+ return true;
441
+ }
442
+ /** Create a relationship between two nodes */
443
+ async relate(fromNode, toNode, relationshipType, properties) {
444
+ if (this._native) {
445
+ return this._native.createRelationship(fromNode, toNode, relationshipType, properties ?? null);
446
+ }
447
+ const id = randomUUID();
448
+ const rel = {
449
+ id,
450
+ fromNode,
451
+ toNode,
452
+ relationshipType,
453
+ properties: properties || {},
454
+ createdAt: Date.now(),
455
+ };
456
+ this._relationships.set(id, rel);
457
+ // Update indices
458
+ if (!this._fromIndex.has(fromNode))
459
+ this._fromIndex.set(fromNode, new Set());
460
+ this._fromIndex.get(fromNode).add(id);
461
+ if (!this._toIndex.has(toNode))
462
+ this._toIndex.set(toNode, new Set());
463
+ this._toIndex.get(toNode).add(id);
464
+ return id;
465
+ }
466
+ /** Query relationships with optional filters */
467
+ async queryRelationships(opts) {
468
+ if (this._native) {
469
+ const rels = await this._native.queryRelationships(opts?.fromNode ?? null, opts?.toNode ?? null, opts?.relationshipType ?? null, opts?.limit ?? null);
470
+ return rels.map((r) => ({
471
+ id: r.id,
472
+ fromNode: r.fromNode,
473
+ toNode: r.toNode,
474
+ relationshipType: r.relationshipType,
475
+ properties: r.properties ?? {},
476
+ createdAt: r.createdAt,
477
+ }));
478
+ }
479
+ let results = [];
480
+ if (opts?.fromNode) {
481
+ const relIds = this._fromIndex.get(opts.fromNode) || new Set();
482
+ for (const relId of relIds) {
483
+ const rel = this._relationships.get(relId);
484
+ if (rel)
485
+ results.push(rel);
486
+ }
487
+ }
488
+ else if (opts?.toNode) {
489
+ const relIds = this._toIndex.get(opts.toNode) || new Set();
490
+ for (const relId of relIds) {
491
+ const rel = this._relationships.get(relId);
492
+ if (rel)
493
+ results.push(rel);
494
+ }
495
+ }
496
+ else {
497
+ results = Array.from(this._relationships.values());
498
+ }
499
+ // Apply filters
500
+ if (opts?.fromNode && opts?.toNode) {
501
+ results = results.filter(r => r.toNode === opts.toNode);
502
+ }
503
+ if (opts?.relationshipType) {
504
+ results = results.filter(r => r.relationshipType === opts.relationshipType);
505
+ }
506
+ const limit = opts?.limit ?? 100;
507
+ return results.slice(0, limit);
508
+ }
509
+ /** Delete a relationship by ID */
510
+ async deleteRelationship(relationshipId) {
511
+ if (this._native) {
512
+ return this._native.deleteRelationship(relationshipId);
513
+ }
514
+ const rel = this._relationships.get(relationshipId);
515
+ if (!rel)
516
+ return false;
517
+ this._relationships.delete(relationshipId);
518
+ this._fromIndex.get(rel.fromNode)?.delete(relationshipId);
519
+ this._toIndex.get(rel.toNode)?.delete(relationshipId);
520
+ return true;
521
+ }
522
+ /**
523
+ * BFS traversal from a starting node.
524
+ *
525
+ * @param startNode - Starting node ID
526
+ * @param depth - Maximum traversal depth (default: 2)
527
+ * @param relationshipTypes - Filter by relationship types
528
+ * @param nodeTypes - Filter by node types
529
+ */
530
+ async traverse(startNode, depth = 2, relationshipTypes, nodeTypes) {
531
+ if (this._native) {
532
+ const result = await this._native.traverse(startNode, depth, relationshipTypes ?? null, nodeTypes ?? null);
533
+ return {
534
+ startNode: result.startNode,
535
+ nodes: result.nodes.map((n) => ({
536
+ id: n.id, nodeType: n.nodeType, properties: n.properties ?? {},
537
+ })),
538
+ relationships: result.relationships.map((r) => ({
539
+ id: r.id, fromNode: r.fromNode, toNode: r.toNode,
540
+ relationshipType: r.relationshipType,
541
+ properties: r.properties ?? {}, createdAt: r.createdAt,
542
+ })),
543
+ depth: result.depth,
544
+ };
545
+ }
546
+ const visitedNodes = new Set();
547
+ const collectedNodes = [];
548
+ const collectedRels = [];
549
+ // BFS
550
+ let frontier = [startNode];
551
+ let currentDepth = 0;
552
+ let maxDepthReached = 0;
553
+ while (frontier.length > 0 && currentDepth <= depth) {
554
+ const nextFrontier = [];
555
+ for (const nodeId of frontier) {
556
+ if (visitedNodes.has(nodeId))
557
+ continue;
558
+ visitedNodes.add(nodeId);
559
+ const node = this._nodes.get(nodeId);
560
+ if (!node)
561
+ continue;
562
+ // Apply node type filter (always include start node)
563
+ if (nodeTypes && nodeTypes.length > 0 && nodeId !== startNode && !nodeTypes.includes(node.nodeType)) {
564
+ continue;
565
+ }
566
+ collectedNodes.push(node);
567
+ if (currentDepth > maxDepthReached)
568
+ maxDepthReached = currentDepth;
569
+ if (currentDepth < depth) {
570
+ // Explore outgoing relationships
571
+ const relIds = this._fromIndex.get(nodeId) || new Set();
572
+ for (const relId of relIds) {
573
+ const rel = this._relationships.get(relId);
574
+ if (!rel)
575
+ continue;
576
+ if (relationshipTypes && relationshipTypes.length > 0 && !relationshipTypes.includes(rel.relationshipType))
577
+ continue;
578
+ if (!visitedNodes.has(rel.toNode)) {
579
+ collectedRels.push(rel);
580
+ nextFrontier.push(rel.toNode);
581
+ }
582
+ }
583
+ // Explore incoming relationships too (undirected traversal)
584
+ const inRelIds = this._toIndex.get(nodeId) || new Set();
585
+ for (const relId of inRelIds) {
586
+ const rel = this._relationships.get(relId);
587
+ if (!rel)
588
+ continue;
589
+ if (relationshipTypes && relationshipTypes.length > 0 && !relationshipTypes.includes(rel.relationshipType))
590
+ continue;
591
+ if (!visitedNodes.has(rel.fromNode)) {
592
+ collectedRels.push(rel);
593
+ nextFrontier.push(rel.fromNode);
594
+ }
595
+ }
596
+ }
597
+ }
598
+ frontier = nextFrontier;
599
+ currentDepth++;
600
+ }
601
+ return {
602
+ startNode,
603
+ nodes: collectedNodes,
604
+ relationships: collectedRels,
605
+ depth: maxDepthReached,
606
+ };
607
+ }
608
+ }
609
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}