agent-memory-graph 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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/config/default.json +28 -0
  4. package/config/graph.config.json +28 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +303 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/plugin/entry.d.ts +3 -0
  10. package/dist/plugin/entry.d.ts.map +1 -0
  11. package/dist/plugin/entry.js +1652 -0
  12. package/dist/plugin/entry.js.map +1 -0
  13. package/dist/src/config/defaults.d.ts +8 -0
  14. package/dist/src/config/defaults.d.ts.map +1 -0
  15. package/dist/src/config/defaults.js +31 -0
  16. package/dist/src/config/defaults.js.map +1 -0
  17. package/dist/src/config/schema.d.ts +162 -0
  18. package/dist/src/config/schema.d.ts.map +1 -0
  19. package/dist/src/config/schema.js +39 -0
  20. package/dist/src/config/schema.js.map +1 -0
  21. package/dist/src/extract/dedup.d.ts +14 -0
  22. package/dist/src/extract/dedup.d.ts.map +1 -0
  23. package/dist/src/extract/dedup.js +79 -0
  24. package/dist/src/extract/dedup.js.map +1 -0
  25. package/dist/src/extract/extractor.d.ts +24 -0
  26. package/dist/src/extract/extractor.d.ts.map +1 -0
  27. package/dist/src/extract/extractor.js +162 -0
  28. package/dist/src/extract/extractor.js.map +1 -0
  29. package/dist/src/graph/engine.d.ts +90 -0
  30. package/dist/src/graph/engine.d.ts.map +1 -0
  31. package/dist/src/graph/engine.js +307 -0
  32. package/dist/src/graph/engine.js.map +1 -0
  33. package/dist/src/graph/schema.d.ts +12 -0
  34. package/dist/src/graph/schema.d.ts.map +1 -0
  35. package/dist/src/graph/schema.js +115 -0
  36. package/dist/src/graph/schema.js.map +1 -0
  37. package/dist/src/index.d.ts +129 -0
  38. package/dist/src/index.d.ts.map +1 -0
  39. package/dist/src/index.js +174 -0
  40. package/dist/src/index.js.map +1 -0
  41. package/dist/src/search/hybrid.d.ts +22 -0
  42. package/dist/src/search/hybrid.d.ts.map +1 -0
  43. package/dist/src/search/hybrid.js +38 -0
  44. package/dist/src/search/hybrid.js.map +1 -0
  45. package/dist/src/search/natural-language.d.ts +20 -0
  46. package/dist/src/search/natural-language.d.ts.map +1 -0
  47. package/dist/src/search/natural-language.js +429 -0
  48. package/dist/src/search/natural-language.js.map +1 -0
  49. package/dist/src/sync/export.d.ts +12 -0
  50. package/dist/src/sync/export.d.ts.map +1 -0
  51. package/dist/src/sync/export.js +117 -0
  52. package/dist/src/sync/export.js.map +1 -0
  53. package/dist/src/sync/memory-md.d.ts +19 -0
  54. package/dist/src/sync/memory-md.d.ts.map +1 -0
  55. package/dist/src/sync/memory-md.js +78 -0
  56. package/dist/src/sync/memory-md.js.map +1 -0
  57. package/openclaw.plugin.json +55 -0
  58. package/package.json +90 -0
@@ -0,0 +1,429 @@
1
+ /**
2
+ * Translate a natural language question into graph operations and return an answer.
3
+ * Uses pattern matching for common queries, falls back to entity-name extraction.
4
+ */
5
+ export async function naturalLanguageQuery(question, engine, config) {
6
+ const q = question.toLowerCase().trim();
7
+ // ─── Pattern: "Where did [entity] work before?" / "Where did X come from?" ───
8
+ const whereDidMatch = q.match(/where (?:did|does|has) (.+?) (?:work|come from|work before|previously work|used to work)/);
9
+ if (whereDidMatch) {
10
+ return queryEntityRelations(engine, whereDidMatch[1].trim(), ['WORKED_AT', 'PREVIOUSLY_WORKED_AT', 'CAME_FROM'], config);
11
+ }
12
+ // ─── Pattern: "What is [entity]'s role?" / "What role does X have?" ───
13
+ const roleMatch = q.match(/what (?:is|are) (.+?)(?:'s|s') (?:role|position|title|job)/);
14
+ if (roleMatch) {
15
+ return queryEntityProperties(engine, roleMatch[1].trim(), ['role', 'position', 'title'], config);
16
+ }
17
+ const roleMatch2 = q.match(/what (?:role|position|title) (?:does|did|is) (.+?) (?:have|hold|play)/);
18
+ if (roleMatch2) {
19
+ return queryEntityProperties(engine, roleMatch2[1].trim(), ['role', 'position', 'title'], config);
20
+ }
21
+ // ─── Pattern: "Who works at [entity]?" / "Who is at [entity]?" ───
22
+ const whoWorksAtMatch = q.match(/who (?:works|is|are|worked) (?:at|for|in) (.+?)(?:\?|$)/);
23
+ if (whoWorksAtMatch) {
24
+ return queryWhoAtEntity(engine, whoWorksAtMatch[1].trim(), config);
25
+ }
26
+ // ─── Pattern: "Who are [entity]'s [noun]?" / "Who are David's clients?" ───
27
+ const whoPossessiveMatch = q.match(/who (?:are|is|were) (.+?)(?:'s|s') (\w+)(?:\?|$)/);
28
+ if (whoPossessiveMatch) {
29
+ return queryAboutEntity(engine, whoPossessiveMatch[1].trim(), config);
30
+ }
31
+ // ─── Pattern: "Who [verb] [entity]?" / "Who suggested pglogical?" ───
32
+ const whoVerbMatch = q.match(/who (\w+(?:ed|s|es)?) (.+?)(?:\?|$)/);
33
+ if (whoVerbMatch) {
34
+ // Try to find the entity and look at incoming relations
35
+ return queryWhoDidEntity(engine, whoVerbMatch[1], whoVerbMatch[2].trim(), config);
36
+ }
37
+ // ─── Pattern: "What am I [relation]?" ───
38
+ const workingOnMatch = q.match(/what (?:am i|do i|are we) (\w+(?:\s+\w+)*?)(?:\?|$)/);
39
+ if (workingOnMatch) {
40
+ return queryByRelationPattern(engine, workingOnMatch[1], config);
41
+ }
42
+ // ─── Pattern: "How is [A] connected to [B]?" ───
43
+ const connectionMatch = q.match(/(?:how is|connection between|relationship between|path from) (.+?) (?:connected to|and|to) (.+?)(?:\?|$)/);
44
+ if (connectionMatch) {
45
+ return queryConnection(engine, connectionMatch[1].trim(), connectionMatch[2].trim(), config);
46
+ }
47
+ // ─── Pattern: "What does [entity] [verb]?" ───
48
+ const whatDoesMatch = q.match(/what (?:does|did|is|are|has) (.+?) (?:work on|use|own|manage|maintain|know|do|build|create|handle|work|run|have|lead|suggest)/);
49
+ if (whatDoesMatch) {
50
+ return queryAboutEntity(engine, whatDoesMatch[1].trim(), config);
51
+ }
52
+ // ─── Pattern: "What [noun] does [entity] [verb]?" ───
53
+ const whatNounMatch = q.match(/what (\w+)s? (?:does|did|do|is|are|has) (.+?) (?:use|own|work on|manage|know|have|build|run|lead|need)/);
54
+ if (whatNounMatch) {
55
+ return queryAboutEntity(engine, whatNounMatch[2].trim(), config);
56
+ }
57
+ // ─── Pattern: "What [noun] is [entity] [verb]ing?" ───
58
+ const whatIsVerbingMatch = q.match(/what ([\w\s]+?) (?:is|are) (.+?) (\w+ing)(?: on| with| at| for)?(?:\?|$)/);
59
+ if (whatIsVerbingMatch) {
60
+ const entityCandidate = whatIsVerbingMatch[2].trim();
61
+ if (entityCandidate && !entityCandidate.match(/^\w+ing$/)) {
62
+ return queryAboutEntity(engine, entityCandidate, config);
63
+ }
64
+ }
65
+ // ─── Pattern: "List all [type]" / "Show me all [type]" ───
66
+ const listMatch = q.match(/(?:list|show|get|find) (?:all |my |every )?(\w+)s?(?:\?|$)/);
67
+ if (listMatch) {
68
+ return queryListType(engine, listMatch[1], config);
69
+ }
70
+ // ─── Pattern: "What [type] are mentioned?" / "What languages are mentioned?" ───
71
+ const whatTypeMentioned = q.match(/what (\w+)s? (?:are|were|is) (?:mentioned|used|listed|included|involved)/);
72
+ if (whatTypeMentioned) {
73
+ return queryListType(engine, whatTypeMentioned[1], config);
74
+ }
75
+ // ─── Pattern: "Tell me about [entity]" / "What is [entity]?" / "Who is [entity]?" ───
76
+ const aboutMatch = q.match(/(?:tell me about|what is|who is|describe|info on|about) (.+?)(?:\?|$)/);
77
+ if (aboutMatch) {
78
+ return queryAboutEntity(engine, aboutMatch[1].trim(), config);
79
+ }
80
+ // ─── Pattern: "[entity]'s [noun]?" ───
81
+ const possessiveMatch = q.match(/([\w\s]+?)(?:'s|s') ([\w\s]+?)(?:\?|$)/);
82
+ if (possessiveMatch) {
83
+ return queryAboutEntity(engine, possessiveMatch[1].trim(), config);
84
+ }
85
+ // ─── FALLBACK: Extract entity names from question and search ───
86
+ return querySmartFallback(engine, question, config);
87
+ }
88
+ // ─── New: Query entity's specific relations ──────────────────────
89
+ async function queryEntityRelations(engine, entityName, relationTypes, config) {
90
+ let entity = engine.findEntityByName(entityName);
91
+ if (!entity) {
92
+ const results = engine.searchEntities(entityName, 1);
93
+ if (results.length === 0) {
94
+ return { answer: `"${entityName}" not found in graph.`, entities: [], confidence: 0.2 };
95
+ }
96
+ entity = results[0];
97
+ }
98
+ const outgoing = engine.getRelationsFrom(entity.id);
99
+ const incoming = engine.getRelationsTo(entity.id);
100
+ // Filter by relation types (case-insensitive partial match)
101
+ const matchedOut = outgoing.filter(r => relationTypes.some(rt => r.relation.toUpperCase().includes(rt.toUpperCase())));
102
+ const matchedIn = incoming.filter(r => relationTypes.some(rt => r.relation.toUpperCase().includes(rt.toUpperCase())));
103
+ if (matchedOut.length > 0 || matchedIn.length > 0) {
104
+ const parts = [];
105
+ if (matchedOut.length > 0)
106
+ parts.push(matchedOut.map(r => `${r.relation} → ${r.to_name}`).join(', '));
107
+ if (matchedIn.length > 0)
108
+ parts.push(matchedIn.map(r => `${r.from_name} → ${r.relation}`).join(', '));
109
+ return {
110
+ answer: `${entity.name}: ${parts.join('; ')}`,
111
+ entities: [...matchedOut.map(r => ({ name: r.to_name, type: r.to_type })), ...matchedIn.map(r => ({ name: r.from_name, type: r.from_type }))],
112
+ confidence: 0.85,
113
+ };
114
+ }
115
+ // Fallback: show all relations (the info might be stored differently)
116
+ return queryAboutEntity(engine, entity.name, config);
117
+ }
118
+ // ─── New: Query entity properties ────────────────────────────────
119
+ async function queryEntityProperties(engine, entityName, propertyKeys, config) {
120
+ let entity = engine.findEntityByName(entityName);
121
+ if (!entity) {
122
+ const results = engine.searchEntities(entityName, 1);
123
+ if (results.length === 0) {
124
+ return { answer: `"${entityName}" not found in graph.`, entities: [], confidence: 0.2 };
125
+ }
126
+ entity = results[0];
127
+ }
128
+ // Check properties
129
+ const props = entity.properties || {};
130
+ const matchedProps = propertyKeys
131
+ .filter(k => props[k])
132
+ .map(k => `${k}: ${props[k]}`);
133
+ if (matchedProps.length > 0) {
134
+ return {
135
+ answer: `${entity.name}: ${matchedProps.join(', ')}`,
136
+ entities: [{ name: entity.name, type: entity.type }],
137
+ confidence: 0.9,
138
+ };
139
+ }
140
+ // Check relations that might encode role (e.g., LEADS, MANAGES)
141
+ const outgoing = engine.getRelationsFrom(entity.id);
142
+ const roleRelations = outgoing.filter(r => ['LEADS', 'MANAGES', 'HEADS', 'WORKS_AS', 'ROLE_IS'].includes(r.relation.toUpperCase()));
143
+ if (roleRelations.length > 0) {
144
+ return {
145
+ answer: `${entity.name}: ${roleRelations.map(r => `${r.relation} → ${r.to_name}`).join(', ')}`,
146
+ entities: [{ name: entity.name, type: entity.type }],
147
+ confidence: 0.85,
148
+ };
149
+ }
150
+ // Fallback to full entity info
151
+ return queryAboutEntity(engine, entity.name, config);
152
+ }
153
+ // ─── New: "Who works at [entity]?" ───────────────────────────────
154
+ async function queryWhoAtEntity(engine, entityName, config) {
155
+ let entity = engine.findEntityByName(entityName);
156
+ if (!entity) {
157
+ const results = engine.searchEntities(entityName, 1);
158
+ if (results.length === 0) {
159
+ return { answer: `"${entityName}" not found in graph.`, entities: [], confidence: 0.2 };
160
+ }
161
+ entity = results[0];
162
+ }
163
+ const incoming = engine.getRelationsTo(entity.id);
164
+ const workers = incoming
165
+ .filter(r => ['WORKS_AT', 'EMPLOYED_BY', 'MEMBER_OF', 'BELONGS_TO', 'WORKS_FOR', 'HIRED_BY'].includes(r.relation.toUpperCase()))
166
+ .map(r => ({ name: r.from_name, type: r.from_type, relation: r.relation }));
167
+ // Also check outgoing (entity EMPLOYS person)
168
+ const outgoing = engine.getRelationsFrom(entity.id);
169
+ const employed = outgoing
170
+ .filter(r => ['EMPLOYS', 'HIRED', 'HAS_MEMBER', 'HAS_EMPLOYEE'].includes(r.relation.toUpperCase()))
171
+ .map(r => ({ name: r.to_name, type: r.to_type, relation: r.relation }));
172
+ const all = [...workers, ...employed];
173
+ if (all.length > 0) {
174
+ return {
175
+ answer: `People at ${entity.name}: ${all.map(p => p.name).join(', ')}`,
176
+ entities: all.map(p => ({ name: p.name, type: p.type })),
177
+ confidence: 0.85,
178
+ };
179
+ }
180
+ // Broader: any person connected to this entity
181
+ const incomingPeople = incoming
182
+ .filter(r => r.from_type?.toLowerCase() === 'person')
183
+ .map(r => ({ name: r.from_name, type: r.from_type }));
184
+ const outgoingPeople = outgoing
185
+ .filter(r => r.to_type?.toLowerCase() === 'person')
186
+ .map(r => ({ name: r.to_name, type: r.to_type }));
187
+ const allConnected = [...incomingPeople, ...outgoingPeople];
188
+ const unique = [...new Map(allConnected.map(r => [r.name, r])).values()];
189
+ if (unique.length > 0) {
190
+ return {
191
+ answer: `People connected to ${entity.name}: ${unique.map(p => p.name).join(', ')}`,
192
+ entities: unique,
193
+ confidence: 0.75,
194
+ };
195
+ }
196
+ return { answer: `No people found at "${entityName}".`, entities: [], confidence: 0.3 };
197
+ }
198
+ // ─── New: "Who [verb]ed [entity]?" ───────────────────────────────
199
+ async function queryWhoDidEntity(engine, verb, entityName, config) {
200
+ let entity = engine.findEntityByName(entityName);
201
+ if (!entity) {
202
+ const results = engine.searchEntities(entityName, 1);
203
+ if (results.length === 0) {
204
+ // Maybe the whole phrase is the entity
205
+ return querySmartFallback(engine, `who ${verb} ${entityName}`, config);
206
+ }
207
+ entity = results[0];
208
+ }
209
+ // Normalize verb to relation: "suggested" → "SUGGEST", "created" → "CREATE"
210
+ const verbRoot = verb.replace(/ed$|s$|es$|ing$/, '').toUpperCase();
211
+ const verbVariants = [verbRoot, `${verbRoot}S`, `${verbRoot}ED`, `${verbRoot}ES`];
212
+ const incoming = engine.getRelationsTo(entity.id);
213
+ const matched = incoming.filter(r => {
214
+ const rel = r.relation.toUpperCase();
215
+ return verbVariants.some(v => rel.includes(v)) || rel.includes(verbRoot);
216
+ });
217
+ if (matched.length > 0) {
218
+ return {
219
+ answer: `${matched.map(r => `${r.from_name} ${r.relation} ${entity.name}`).join(', ')}`,
220
+ entities: matched.map(r => ({ name: r.from_name, type: r.from_type })),
221
+ confidence: 0.85,
222
+ };
223
+ }
224
+ // Fallback: show all incoming
225
+ if (incoming.length > 0) {
226
+ const people = incoming.filter(r => r.from_type?.toLowerCase() === 'person');
227
+ if (people.length > 0) {
228
+ return {
229
+ answer: `People connected to ${entity.name}: ${people.map(r => `${r.from_name} (${r.relation})`).join(', ')}`,
230
+ entities: people.map(r => ({ name: r.from_name, type: r.from_type })),
231
+ confidence: 0.7,
232
+ };
233
+ }
234
+ }
235
+ return queryAboutEntity(engine, entity.name, config);
236
+ }
237
+ // ─── Smart Fallback: find entity names in the question ───────────
238
+ async function querySmartFallback(engine, question, config) {
239
+ const allEntities = engine.listEntities({ limit: 500 });
240
+ if (allEntities.length === 0) {
241
+ return { answer: 'Graph is empty. Ingest some data first.', entities: [], confidence: 0.2 };
242
+ }
243
+ const qLower = question.toLowerCase();
244
+ // Find entities mentioned in the question (longest match first)
245
+ const mentioned = allEntities
246
+ .filter(e => qLower.includes(e.name.toLowerCase()))
247
+ .sort((a, b) => b.name.length - a.name.length);
248
+ if (mentioned.length > 0) {
249
+ return queryAboutEntity(engine, mentioned[0].name, config);
250
+ }
251
+ // Try word-by-word search (skip common words)
252
+ const stopWords = new Set(['what', 'who', 'where', 'when', 'how', 'why', 'does', 'did', 'the', 'are', 'is', 'was', 'were', 'has', 'have', 'had', 'all', 'any', 'some', 'this', 'that', 'which', 'there', 'their', 'about', 'from', 'with', 'for', 'and', 'but', 'not', 'can', 'will', 'would', 'should', 'could', 'been', 'being', 'mentioned', 'used', 'listed']);
253
+ const words = question.replace(/[?!.,;:'"]/g, '').split(/\s+/).filter(w => w.length > 2 && !stopWords.has(w.toLowerCase()));
254
+ for (const word of words) {
255
+ const results = engine.searchEntities(word, 3);
256
+ if (results.length > 0) {
257
+ return queryAboutEntity(engine, results[0].name, config);
258
+ }
259
+ }
260
+ return { answer: `No relevant entities found for: "${question}"`, entities: [], confidence: 0.2 };
261
+ }
262
+ // ─── Core Query Implementations ─────────────────────────────────
263
+ async function queryByRelationPattern(engine, relationHint, config) {
264
+ const relationMap = {
265
+ 'working on': ['WORKS_ON', 'CONTRIBUTES_TO', 'MAINTAINS'],
266
+ 'using': ['USES', 'DEPENDS_ON'],
267
+ 'own': ['OWNS', 'CREATED'],
268
+ 'managing': ['MANAGES', 'LEADS'],
269
+ 'learning': ['LEARNING', 'STUDIES'],
270
+ 'holding': ['HOLDS', 'OWNS'],
271
+ 'mining': ['MINES'],
272
+ 'building': ['BUILDS', 'CREATES'],
273
+ };
274
+ const matchedRelations = Object.entries(relationMap)
275
+ .filter(([phrase]) => relationHint.includes(phrase))
276
+ .flatMap(([, rels]) => rels);
277
+ const selfEntities = engine.searchEntities('self user me', 5)
278
+ .filter(e => e.type.toLowerCase() === 'person');
279
+ const results = [];
280
+ for (const self of selfEntities) {
281
+ const rels = engine.getRelationsFrom(self.id);
282
+ for (const rel of rels) {
283
+ if (matchedRelations.length === 0 || matchedRelations.includes(rel.relation)) {
284
+ results.push({ name: rel.to_name, type: rel.to_type });
285
+ }
286
+ }
287
+ }
288
+ const unique = [...new Map(results.map(r => [r.name, r])).values()];
289
+ return {
290
+ answer: unique.length > 0
291
+ ? `Found ${unique.length} result(s): ${unique.map(r => `${r.name} (${r.type})`).join(', ')}`
292
+ : 'No matching relationships found in the graph.',
293
+ entities: unique,
294
+ confidence: unique.length > 0 ? 0.8 : 0.3,
295
+ };
296
+ }
297
+ async function queryWhoRelation(engine, relation, entityName, config) {
298
+ const entity = engine.findEntityByName(entityName.trim());
299
+ if (!entity) {
300
+ const results = engine.searchEntities(entityName.trim(), 1);
301
+ if (results.length > 0) {
302
+ return queryWhoRelation(engine, relation, results[0].name, config);
303
+ }
304
+ return { answer: `Entity "${entityName}" not found in graph.`, entities: [], confidence: 0.2 };
305
+ }
306
+ const incoming = engine.getRelationsTo(entity.id);
307
+ const people = incoming
308
+ .filter(r => r.from_type.toLowerCase() === 'person')
309
+ .map(r => ({ name: r.from_name, type: r.from_type }));
310
+ const outgoing = engine.getRelationsFrom(entity.id);
311
+ const outPeople = outgoing
312
+ .filter(r => r.to_type.toLowerCase() === 'person')
313
+ .map(r => ({ name: r.to_name, type: r.to_type }));
314
+ const all = [...people, ...outPeople];
315
+ const unique = [...new Map(all.map(r => [r.name, r])).values()];
316
+ return {
317
+ answer: unique.length > 0
318
+ ? `${unique.map(p => p.name).join(', ')} → ${entityName}`
319
+ : `No people found connected to "${entityName}".`,
320
+ entities: unique,
321
+ confidence: unique.length > 0 ? 0.85 : 0.3,
322
+ };
323
+ }
324
+ async function queryConnection(engine, fromName, toName, config) {
325
+ const path = engine.findPath(fromName, toName, config.query.maxHops);
326
+ if (!path) {
327
+ return {
328
+ answer: `No connection found between "${fromName}" and "${toName}" within ${config.query.maxHops} hops.`,
329
+ entities: [],
330
+ confidence: 0.5,
331
+ };
332
+ }
333
+ const pathStr = path.path
334
+ .map((node, i) => i < path.relations.length ? `${node} ->[${path.relations[i]}]` : node)
335
+ .join(' ');
336
+ return {
337
+ answer: `Path: ${pathStr}`,
338
+ entities: path.path.map(name => ({ name, type: 'Unknown' })),
339
+ paths: [path],
340
+ confidence: 0.9,
341
+ };
342
+ }
343
+ async function queryListType(engine, typeName, config) {
344
+ // Normalize: "people" → "person", "languages" → "language", etc.
345
+ const typeNormMap = {
346
+ 'people': 'person',
347
+ 'persons': 'person',
348
+ 'companies': 'company',
349
+ 'organizations': 'organization',
350
+ 'organisations': 'organization',
351
+ 'tools': 'tool',
352
+ 'projects': 'project',
353
+ 'languages': 'language',
354
+ 'programming languages': 'language',
355
+ 'databases': 'database',
356
+ 'services': 'service',
357
+ 'teams': 'team',
358
+ 'technologies': 'technology',
359
+ };
360
+ const normalized = typeNormMap[typeName.toLowerCase()] || typeName;
361
+ // Try multiple case variations
362
+ const variations = [
363
+ normalized,
364
+ normalized.charAt(0).toUpperCase() + normalized.slice(1),
365
+ normalized.toUpperCase(),
366
+ normalized.toLowerCase(),
367
+ // Also try without trailing 's'
368
+ normalized.endsWith('s') ? normalized.slice(0, -1) : normalized,
369
+ normalized.endsWith('s') ? (normalized.slice(0, -1).charAt(0).toUpperCase() + normalized.slice(0, -1).slice(1)) : (normalized.charAt(0).toUpperCase() + normalized.slice(1)),
370
+ ];
371
+ for (const v of [...new Set(variations)]) {
372
+ const found = engine.listEntities({ type: v, limit: config.query.maxResults });
373
+ if (found.length > 0) {
374
+ return {
375
+ answer: `Found ${found.length} ${typeName}(s): ${found.map(e => e.name).join(', ')}`,
376
+ entities: found.map(e => ({ name: e.name, type: e.type })),
377
+ confidence: 0.85,
378
+ };
379
+ }
380
+ }
381
+ // Try FTS search as last resort
382
+ const searchResults = engine.searchEntities(typeName, config.query.maxResults);
383
+ if (searchResults.length > 0) {
384
+ return {
385
+ answer: `Found ${searchResults.length} result(s) for "${typeName}": ${searchResults.map(e => `${e.name} (${e.type})`).join(', ')}`,
386
+ entities: searchResults.map(e => ({ name: e.name, type: e.type })),
387
+ confidence: 0.7,
388
+ };
389
+ }
390
+ return {
391
+ answer: `No entities of type "${typeName}" found.`,
392
+ entities: [],
393
+ confidence: 0.3,
394
+ };
395
+ }
396
+ async function queryAboutEntity(engine, entityName, config) {
397
+ let entity = engine.findEntityByName(entityName);
398
+ if (!entity) {
399
+ const results = engine.searchEntities(entityName, 1);
400
+ if (results.length === 0) {
401
+ return { answer: `"${entityName}" not found in graph.`, entities: [], confidence: 0.2 };
402
+ }
403
+ entity = results[0];
404
+ }
405
+ const outgoing = engine.getRelationsFrom(entity.id);
406
+ const incoming = engine.getRelationsTo(entity.id);
407
+ const lines = [
408
+ `${entity.name} (${entity.type})`,
409
+ ];
410
+ if (Object.keys(entity.properties).length > 0) {
411
+ lines.push(`Properties: ${JSON.stringify(entity.properties)}`);
412
+ }
413
+ if (outgoing.length > 0) {
414
+ lines.push(`Outgoing: ${outgoing.map(r => `${r.relation} → ${r.to_name}`).join(', ')}`);
415
+ }
416
+ if (incoming.length > 0) {
417
+ lines.push(`Incoming: ${incoming.map(r => `${r.from_name} → ${r.relation}`).join(', ')}`);
418
+ }
419
+ return {
420
+ answer: lines.join('\n'),
421
+ entities: [
422
+ { name: entity.name, type: entity.type },
423
+ ...outgoing.map(r => ({ name: r.to_name, type: r.to_type })),
424
+ ...incoming.map(r => ({ name: r.from_name, type: r.from_type })),
425
+ ],
426
+ confidence: 0.9,
427
+ };
428
+ }
429
+ //# sourceMappingURL=natural-language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"natural-language.js","sourceRoot":"","sources":["../../../src/search/natural-language.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { GraphEngine } from '../graph/engine.js';
2
+ export type ExportFormat = 'json' | 'mermaid' | 'dot' | 'csv';
3
+ export interface ExportOptions {
4
+ format: ExportFormat;
5
+ includeProperties?: boolean;
6
+ maxEntities?: number;
7
+ }
8
+ /**
9
+ * Export graph to various formats.
10
+ */
11
+ export declare function exportGraph(engine: GraphEngine, options: ExportOptions): string;
12
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/sync/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkC,MAAM,oBAAoB,CAAC;AAEjF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAkB/E"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Export graph to various formats.
3
+ */
4
+ export function exportGraph(engine, options) {
5
+ const { format, includeProperties = false, maxEntities = 500 } = options;
6
+ const entities = engine.listEntities({ limit: maxEntities });
7
+ const stats = engine.stats();
8
+ switch (format) {
9
+ case 'json':
10
+ return exportJSON(engine, entities, includeProperties);
11
+ case 'mermaid':
12
+ return exportMermaid(engine, entities);
13
+ case 'dot':
14
+ return exportDOT(engine, entities);
15
+ case 'csv':
16
+ return exportCSV(engine, entities);
17
+ default:
18
+ throw new Error(`Unsupported export format: ${format}`);
19
+ }
20
+ }
21
+ function exportJSON(engine, entities, includeProperties) {
22
+ const nodes = entities.map(e => ({
23
+ id: e.id,
24
+ name: e.name,
25
+ type: e.type,
26
+ ...(includeProperties ? { properties: e.properties } : {}),
27
+ confidence: e.confidence,
28
+ created_at: e.created_at,
29
+ }));
30
+ const edges = [];
31
+ for (const entity of entities) {
32
+ const rels = engine.getRelationsFrom(entity.id);
33
+ for (const rel of rels) {
34
+ edges.push({
35
+ from: entity.name,
36
+ to: rel.to_name,
37
+ relation: rel.relation,
38
+ confidence: rel.confidence,
39
+ });
40
+ }
41
+ }
42
+ return JSON.stringify({ nodes, edges, stats: engine.stats() }, null, 2);
43
+ }
44
+ function exportMermaid(engine, entities) {
45
+ const lines = ['graph LR'];
46
+ const nodeIds = new Map();
47
+ // Assign short IDs for Mermaid
48
+ entities.forEach((e, i) => {
49
+ const shortId = `n${i}`;
50
+ nodeIds.set(e.id, shortId);
51
+ // Shape by type
52
+ const shape = getNodeShape(e.type);
53
+ lines.push(` ${shortId}${shape[0]}"${escapeMermaid(e.name)}"${shape[1]}`);
54
+ });
55
+ // Add edges
56
+ for (const entity of entities) {
57
+ const rels = engine.getRelationsFrom(entity.id);
58
+ for (const rel of rels) {
59
+ const fromId = nodeIds.get(entity.id);
60
+ const toId = nodeIds.get(rel.to_id);
61
+ if (fromId && toId) {
62
+ lines.push(` ${fromId} -->|${escapeMermaid(rel.relation)}| ${toId}`);
63
+ }
64
+ }
65
+ }
66
+ return lines.join('\n');
67
+ }
68
+ function exportDOT(engine, entities) {
69
+ const lines = [
70
+ 'digraph MemoryGraph {',
71
+ ' rankdir=LR;',
72
+ ' node [shape=box, style=rounded];',
73
+ '',
74
+ ];
75
+ // Nodes
76
+ for (const entity of entities) {
77
+ const label = `${entity.name}\\n(${entity.type})`;
78
+ lines.push(` "${entity.id}" [label="${escapeDOT(label)}"];`);
79
+ }
80
+ lines.push('');
81
+ // Edges
82
+ for (const entity of entities) {
83
+ const rels = engine.getRelationsFrom(entity.id);
84
+ for (const rel of rels) {
85
+ lines.push(` "${entity.id}" -> "${rel.to_id}" [label="${escapeDOT(rel.relation)}"];`);
86
+ }
87
+ }
88
+ lines.push('}');
89
+ return lines.join('\n');
90
+ }
91
+ function exportCSV(engine, entities) {
92
+ const lines = ['from_name,from_type,relation,to_name,to_type,confidence'];
93
+ for (const entity of entities) {
94
+ const rels = engine.getRelationsFrom(entity.id);
95
+ for (const rel of rels) {
96
+ lines.push(`"${entity.name}","${entity.type}","${rel.relation}","${rel.to_name}","${rel.to_type}",${rel.confidence}`);
97
+ }
98
+ }
99
+ return lines.join('\n');
100
+ }
101
+ // ─── Helpers ─────────────────────────────────────────────────────
102
+ function getNodeShape(type) {
103
+ switch (type.toLowerCase()) {
104
+ case 'person': return ['((', '))']; // Circle
105
+ case 'project': return ['[/', '/]']; // Parallelogram
106
+ case 'tool':
107
+ case 'technology': return ['{{', '}}']; // Hexagon
108
+ default: return ['[', ']']; // Rectangle
109
+ }
110
+ }
111
+ function escapeMermaid(text) {
112
+ return text.replace(/"/g, "'").replace(/[[\]{}()]/g, '');
113
+ }
114
+ function escapeDOT(text) {
115
+ return text.replace(/"/g, '\\"').replace(/\n/g, '\\n');
116
+ }
117
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/sync/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { GraphEngine } from '../graph/engine.js';
2
+ import type { Config } from '../config/schema.js';
3
+ /**
4
+ * Import entities and relationships from a MEMORY.md file.
5
+ * Splits the file into sections and extracts from each.
6
+ */
7
+ export declare function importFromMemoryMd(filePath: string, engine: GraphEngine, config: Config): Promise<{
8
+ entities: number;
9
+ relationships: number;
10
+ }>;
11
+ /**
12
+ * Import from a directory of markdown files.
13
+ */
14
+ export declare function importFromDirectory(dirPath: string, engine: GraphEngine, config: Config): Promise<{
15
+ entities: number;
16
+ relationships: number;
17
+ files: number;
18
+ }>;
19
+ //# sourceMappingURL=memory-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-md.d.ts","sourceRoot":"","sources":["../../../src/sync/memory-md.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CA4CtD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBrE"}