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 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../plugin/entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ConfigSchema, type Config } from './schema.js';
2
+ /**
3
+ * Load config from file or return defaults.
4
+ * Searches: provided path → ./config/graph.config.json → defaults
5
+ */
6
+ export declare function loadConfig(configPath?: string): Config;
7
+ export { ConfigSchema, type Config };
8
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/config/defaults.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAIxD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBtD;AAED,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { ConfigSchema } from './schema.js';
4
+ const CONFIG_FILENAME = 'graph.config.json';
5
+ /**
6
+ * Load config from file or return defaults.
7
+ * Searches: provided path → ./config/graph.config.json → defaults
8
+ */
9
+ export function loadConfig(configPath) {
10
+ const paths = configPath
11
+ ? [configPath]
12
+ : [
13
+ resolve(process.cwd(), 'config', CONFIG_FILENAME),
14
+ resolve(process.cwd(), CONFIG_FILENAME),
15
+ ];
16
+ for (const p of paths) {
17
+ if (existsSync(p)) {
18
+ try {
19
+ const raw = JSON.parse(readFileSync(p, 'utf-8'));
20
+ return ConfigSchema.parse(raw);
21
+ }
22
+ catch (err) {
23
+ console.warn(`[agent-memory-graph] Invalid config at ${p}, using defaults.`);
24
+ }
25
+ }
26
+ }
27
+ // Return defaults (zero-config)
28
+ return ConfigSchema.parse({});
29
+ }
30
+ export { ConfigSchema };
31
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AAExD,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,KAAK,GAAG,UAAU;QACtB,CAAC,CAAC,CAAC,UAAU,CAAC;QACd,CAAC,CAAC;YACE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC;YACjD,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC;SACxC,CAAC;IAEN,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjD,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,mBAAmB,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,OAAO,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,OAAO,EAAE,YAAY,EAAe,CAAC"}
@@ -0,0 +1,162 @@
1
+ import { z } from 'zod';
2
+ /** Domain hint for improving extraction accuracy */
3
+ declare const DomainSchema: z.ZodObject<{
4
+ name: z.ZodString;
5
+ entityHints: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
6
+ relationHints: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ name: string;
9
+ entityHints: string[];
10
+ relationHints: string[];
11
+ }, {
12
+ name: string;
13
+ entityHints?: string[] | undefined;
14
+ relationHints?: string[] | undefined;
15
+ }>;
16
+ /** Full config schema */
17
+ export declare const ConfigSchema: z.ZodObject<{
18
+ storage: z.ZodDefault<z.ZodObject<{
19
+ path: z.ZodDefault<z.ZodString>;
20
+ maxSizeMb: z.ZodDefault<z.ZodNumber>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ path: string;
23
+ maxSizeMb: number;
24
+ }, {
25
+ path?: string | undefined;
26
+ maxSizeMb?: number | undefined;
27
+ }>>;
28
+ extraction: z.ZodDefault<z.ZodObject<{
29
+ provider: z.ZodDefault<z.ZodEnum<["auto", "openai", "anthropic", "ollama"]>>;
30
+ model: z.ZodDefault<z.ZodString>;
31
+ autoExtract: z.ZodDefault<z.ZodBoolean>;
32
+ minConfidence: z.ZodDefault<z.ZodNumber>;
33
+ batchSize: z.ZodDefault<z.ZodNumber>;
34
+ }, "strip", z.ZodTypeAny, {
35
+ provider: "auto" | "openai" | "anthropic" | "ollama";
36
+ model: string;
37
+ autoExtract: boolean;
38
+ minConfidence: number;
39
+ batchSize: number;
40
+ }, {
41
+ provider?: "auto" | "openai" | "anthropic" | "ollama" | undefined;
42
+ model?: string | undefined;
43
+ autoExtract?: boolean | undefined;
44
+ minConfidence?: number | undefined;
45
+ batchSize?: number | undefined;
46
+ }>>;
47
+ domains: z.ZodDefault<z.ZodArray<z.ZodObject<{
48
+ name: z.ZodString;
49
+ entityHints: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
50
+ relationHints: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
51
+ }, "strip", z.ZodTypeAny, {
52
+ name: string;
53
+ entityHints: string[];
54
+ relationHints: string[];
55
+ }, {
56
+ name: string;
57
+ entityHints?: string[] | undefined;
58
+ relationHints?: string[] | undefined;
59
+ }>, "many">>;
60
+ deduplication: z.ZodDefault<z.ZodObject<{
61
+ enabled: z.ZodDefault<z.ZodBoolean>;
62
+ similarityThreshold: z.ZodDefault<z.ZodNumber>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ enabled: boolean;
65
+ similarityThreshold: number;
66
+ }, {
67
+ enabled?: boolean | undefined;
68
+ similarityThreshold?: number | undefined;
69
+ }>>;
70
+ sync: z.ZodDefault<z.ZodObject<{
71
+ memoryMd: z.ZodDefault<z.ZodNullable<z.ZodString>>;
72
+ neuralMemory: z.ZodDefault<z.ZodNullable<z.ZodString>>;
73
+ importOnStart: z.ZodDefault<z.ZodBoolean>;
74
+ }, "strip", z.ZodTypeAny, {
75
+ memoryMd: string | null;
76
+ neuralMemory: string | null;
77
+ importOnStart: boolean;
78
+ }, {
79
+ memoryMd?: string | null | undefined;
80
+ neuralMemory?: string | null | undefined;
81
+ importOnStart?: boolean | undefined;
82
+ }>>;
83
+ query: z.ZodDefault<z.ZodObject<{
84
+ maxHops: z.ZodDefault<z.ZodNumber>;
85
+ maxResults: z.ZodDefault<z.ZodNumber>;
86
+ includeConfidence: z.ZodDefault<z.ZodBoolean>;
87
+ }, "strip", z.ZodTypeAny, {
88
+ maxHops: number;
89
+ maxResults: number;
90
+ includeConfidence: boolean;
91
+ }, {
92
+ maxHops?: number | undefined;
93
+ maxResults?: number | undefined;
94
+ includeConfidence?: boolean | undefined;
95
+ }>>;
96
+ }, "strip", z.ZodTypeAny, {
97
+ storage: {
98
+ path: string;
99
+ maxSizeMb: number;
100
+ };
101
+ extraction: {
102
+ provider: "auto" | "openai" | "anthropic" | "ollama";
103
+ model: string;
104
+ autoExtract: boolean;
105
+ minConfidence: number;
106
+ batchSize: number;
107
+ };
108
+ domains: {
109
+ name: string;
110
+ entityHints: string[];
111
+ relationHints: string[];
112
+ }[];
113
+ deduplication: {
114
+ enabled: boolean;
115
+ similarityThreshold: number;
116
+ };
117
+ sync: {
118
+ memoryMd: string | null;
119
+ neuralMemory: string | null;
120
+ importOnStart: boolean;
121
+ };
122
+ query: {
123
+ maxHops: number;
124
+ maxResults: number;
125
+ includeConfidence: boolean;
126
+ };
127
+ }, {
128
+ storage?: {
129
+ path?: string | undefined;
130
+ maxSizeMb?: number | undefined;
131
+ } | undefined;
132
+ extraction?: {
133
+ provider?: "auto" | "openai" | "anthropic" | "ollama" | undefined;
134
+ model?: string | undefined;
135
+ autoExtract?: boolean | undefined;
136
+ minConfidence?: number | undefined;
137
+ batchSize?: number | undefined;
138
+ } | undefined;
139
+ domains?: {
140
+ name: string;
141
+ entityHints?: string[] | undefined;
142
+ relationHints?: string[] | undefined;
143
+ }[] | undefined;
144
+ deduplication?: {
145
+ enabled?: boolean | undefined;
146
+ similarityThreshold?: number | undefined;
147
+ } | undefined;
148
+ sync?: {
149
+ memoryMd?: string | null | undefined;
150
+ neuralMemory?: string | null | undefined;
151
+ importOnStart?: boolean | undefined;
152
+ } | undefined;
153
+ query?: {
154
+ maxHops?: number | undefined;
155
+ maxResults?: number | undefined;
156
+ includeConfidence?: boolean | undefined;
157
+ } | undefined;
158
+ }>;
159
+ export type Config = z.infer<typeof ConfigSchema>;
160
+ export type Domain = z.infer<typeof DomainSchema>;
161
+ export {};
162
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oDAAoD;AACpD,QAAA,MAAM,YAAY;;;;;;;;;;;;EAIhB,CAAC;AASH,yBAAyB;AACzB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAClD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ /** Domain hint for improving extraction accuracy */
3
+ const DomainSchema = z.object({
4
+ name: z.string(),
5
+ entityHints: z.array(z.string()).default([]),
6
+ relationHints: z.array(z.string()).default([]),
7
+ });
8
+ /** Sync configuration */
9
+ const SyncSchema = z.object({
10
+ memoryMd: z.string().nullable().default(null),
11
+ neuralMemory: z.string().nullable().default(null),
12
+ importOnStart: z.boolean().default(false),
13
+ });
14
+ /** Full config schema */
15
+ export const ConfigSchema = z.object({
16
+ storage: z.object({
17
+ path: z.string().default('./memory-graph.db'),
18
+ maxSizeMb: z.number().default(500),
19
+ }).default({}),
20
+ extraction: z.object({
21
+ provider: z.enum(['auto', 'openai', 'anthropic', 'ollama']).default('auto'),
22
+ model: z.string().default('auto'),
23
+ autoExtract: z.boolean().default(true),
24
+ minConfidence: z.number().min(0).max(1).default(0.7),
25
+ batchSize: z.number().default(5),
26
+ }).default({}),
27
+ domains: z.array(DomainSchema).default([]),
28
+ deduplication: z.object({
29
+ enabled: z.boolean().default(true),
30
+ similarityThreshold: z.number().min(0).max(1).default(0.85),
31
+ }).default({}),
32
+ sync: SyncSchema.default({}),
33
+ query: z.object({
34
+ maxHops: z.number().default(5),
35
+ maxResults: z.number().default(50),
36
+ includeConfidence: z.boolean().default(true),
37
+ }).default({}),
38
+ });
39
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oDAAoD;AACpD,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC/C,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAC1C,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC7C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;KACnC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAEd,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACtC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QACpD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;KACjC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAEd,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAE1C,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC;QACtB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAClC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;KAC5D,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAEd,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAE5B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KAC7C,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACf,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { GraphEngine, type Entity } from '../graph/engine.js';
2
+ /**
3
+ * Find potential duplicate entities based on name similarity.
4
+ */
5
+ export declare function findDuplicates(engine: GraphEngine, threshold?: number): Array<{
6
+ entity: Entity;
7
+ duplicateOf: Entity;
8
+ similarity: number;
9
+ }>;
10
+ /**
11
+ * Merge duplicate entity into target (moves all relationships).
12
+ */
13
+ export declare function mergeEntities(engine: GraphEngine, keepId: string, mergeId: string): boolean;
14
+ //# sourceMappingURL=dedup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../../../src/extract/dedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,SAAS,SAAO,GACf,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAcT"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Find potential duplicate entities based on name similarity.
3
+ */
4
+ export function findDuplicates(engine, threshold = 0.85) {
5
+ const entities = engine.listEntities({ limit: 10000 });
6
+ const duplicates = [];
7
+ const processed = new Set();
8
+ for (let i = 0; i < entities.length; i++) {
9
+ if (processed.has(entities[i].id))
10
+ continue;
11
+ for (let j = i + 1; j < entities.length; j++) {
12
+ if (processed.has(entities[j].id))
13
+ continue;
14
+ // Same type check
15
+ if (entities[i].type.toLowerCase() !== entities[j].type.toLowerCase())
16
+ continue;
17
+ const sim = nameSimilarity(entities[i].name, entities[j].name);
18
+ if (sim >= threshold) {
19
+ duplicates.push({
20
+ entity: entities[j],
21
+ duplicateOf: entities[i],
22
+ similarity: sim,
23
+ });
24
+ processed.add(entities[j].id);
25
+ }
26
+ }
27
+ }
28
+ return duplicates;
29
+ }
30
+ /**
31
+ * Merge duplicate entity into target (moves all relationships).
32
+ */
33
+ export function mergeEntities(engine, keepId, mergeId) {
34
+ const keep = engine.getEntity(keepId);
35
+ const merge = engine.getEntity(mergeId);
36
+ if (!keep || !merge)
37
+ return false;
38
+ // Merge properties
39
+ const mergedProps = { ...merge.properties, ...keep.properties };
40
+ engine.updateEntity(keepId, { properties: mergedProps });
41
+ // This requires direct DB access — we'll handle via the engine's internal db
42
+ // For now, delete the duplicate (relationships cascade)
43
+ engine.deleteEntity(mergeId);
44
+ return true;
45
+ }
46
+ /**
47
+ * Simple name similarity using normalized Levenshtein distance.
48
+ */
49
+ function nameSimilarity(a, b) {
50
+ const na = a.toLowerCase().trim();
51
+ const nb = b.toLowerCase().trim();
52
+ if (na === nb)
53
+ return 1.0;
54
+ // Check if one contains the other
55
+ if (na.includes(nb) || nb.includes(na))
56
+ return 0.9;
57
+ // Levenshtein distance
58
+ const dist = levenshtein(na, nb);
59
+ const maxLen = Math.max(na.length, nb.length);
60
+ return maxLen === 0 ? 1.0 : 1.0 - dist / maxLen;
61
+ }
62
+ function levenshtein(a, b) {
63
+ const m = a.length;
64
+ const n = b.length;
65
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
66
+ for (let i = 0; i <= m; i++)
67
+ dp[i][0] = i;
68
+ for (let j = 0; j <= n; j++)
69
+ dp[0][j] = j;
70
+ for (let i = 1; i <= m; i++) {
71
+ for (let j = 1; j <= n; j++) {
72
+ dp[i][j] = a[i - 1] === b[j - 1]
73
+ ? dp[i - 1][j - 1]
74
+ : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
75
+ }
76
+ }
77
+ return dp[m][n];
78
+ }
79
+ //# sourceMappingURL=dedup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../../../src/extract/dedup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Config } from '../config/schema.js';
2
+ export interface ExtractedEntity {
3
+ name: string;
4
+ type: string;
5
+ properties?: Record<string, unknown>;
6
+ confidence: number;
7
+ }
8
+ export interface ExtractedRelation {
9
+ from: string;
10
+ relation: string;
11
+ to: string;
12
+ fromType?: string;
13
+ toType?: string;
14
+ confidence: number;
15
+ }
16
+ export interface ExtractionResult {
17
+ entities: ExtractedEntity[];
18
+ relationships: ExtractedRelation[];
19
+ }
20
+ /**
21
+ * Extract entities and relationships from text using configured LLM.
22
+ */
23
+ export declare function extractFromText(text: string, config: Config): Promise<ExtractionResult>;
24
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../src/extract/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,aAAa,EAAE,iBAAiB,EAAE,CAAC;CACpC;AAyHD;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4D7F"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Build the extraction prompt based on config and optional domain hints.
3
+ */
4
+ function buildPrompt(text, domains) {
5
+ const domainContext = domains.length > 0
6
+ ? `\nDomain hints (use these to improve accuracy):\n${domains.map(d => `- ${d.name}: entities=[${d.entityHints.join(', ')}], relations=[${d.relationHints.join(', ')}]`).join('\n')}\n`
7
+ : '';
8
+ return `You are an entity and relationship extractor. Given text, extract all meaningful entities and their relationships.
9
+
10
+ Rules:
11
+ 1. Extract entities with their most specific type (Person, Project, Tool, Company, Location, Concept, etc.)
12
+ 2. Extract directional relationships between entities (FROM -[RELATION]-> TO)
13
+ 3. Be domain-agnostic — work with any topic
14
+ 4. Assign confidence scores (0.0 to 1.0) based on how explicit the mention is
15
+ 5. Resolve pronouns to their referents when clearly determinable
16
+ 6. Do NOT hallucinate entities not mentioned or strongly implied in the text
17
+ 7. Normalize entity names (capitalize properly, use full names when available)
18
+ 8. Use UPPER_SNAKE_CASE for relationship types (WORKS_ON, USES, OWNS, etc.)
19
+ ${domainContext}
20
+ Return ONLY valid JSON (no markdown, no explanation):
21
+ {
22
+ "entities": [
23
+ {"name": "Entity Name", "type": "Type", "properties": {}, "confidence": 0.9}
24
+ ],
25
+ "relationships": [
26
+ {"from": "Entity A", "relation": "RELATION_TYPE", "to": "Entity B", "fromType": "TypeA", "toType": "TypeB", "confidence": 0.85}
27
+ ]
28
+ }
29
+
30
+ If the text contains no meaningful entities or relationships, return:
31
+ {"entities": [], "relationships": []}
32
+
33
+ Text to extract from:
34
+ """
35
+ ${text}
36
+ """`;
37
+ }
38
+ /**
39
+ * Detect which LLM provider is available.
40
+ */
41
+ function detectProvider(config) {
42
+ if (config.extraction.provider !== 'auto') {
43
+ return config.extraction.provider;
44
+ }
45
+ // Auto-detect based on available env vars
46
+ if (process.env.OPENAI_API_KEY)
47
+ return 'openai';
48
+ if (process.env.ANTHROPIC_API_KEY)
49
+ return 'anthropic';
50
+ if (process.env.OLLAMA_HOST || process.env.OLLAMA_URL)
51
+ return 'ollama';
52
+ return null;
53
+ }
54
+ /**
55
+ * Call OpenAI-compatible API for extraction.
56
+ */
57
+ async function callOpenAI(prompt, model) {
58
+ const { default: OpenAI } = await import('openai');
59
+ const client = new OpenAI({
60
+ apiKey: process.env.OPENAI_API_KEY || 'sk-local',
61
+ baseURL: process.env.OPENAI_BASE_URL || 'http://127.0.0.1:20128/v1',
62
+ });
63
+ const response = await client.chat.completions.create({
64
+ model: model === 'auto' ? 'gpt-4o-mini' : model,
65
+ messages: [{ role: 'user', content: prompt }],
66
+ temperature: 0.1,
67
+ response_format: { type: 'json_object' },
68
+ });
69
+ return response.choices[0]?.message?.content ?? '{"entities":[],"relationships":[]}';
70
+ }
71
+ /**
72
+ * Call Anthropic API for extraction.
73
+ */
74
+ async function callAnthropic(prompt, model) {
75
+ // @ts-ignore — optional peer dependency
76
+ const { default: Anthropic } = await import('@anthropic-ai/sdk');
77
+ const client = new Anthropic();
78
+ const response = await client.messages.create({
79
+ model: model === 'auto' ? 'claude-3-5-haiku-20241022' : model,
80
+ max_tokens: 4096,
81
+ messages: [{ role: 'user', content: prompt }],
82
+ });
83
+ const block = response.content[0];
84
+ return block.type === 'text' ? block.text : '{"entities":[],"relationships":[]}';
85
+ }
86
+ /**
87
+ * Call Ollama for extraction (local LLM).
88
+ */
89
+ async function callOllama(prompt, model) {
90
+ const host = process.env.OLLAMA_HOST || process.env.OLLAMA_URL || 'http://localhost:11434';
91
+ const response = await fetch(`${host}/api/generate`, {
92
+ method: 'POST',
93
+ headers: { 'Content-Type': 'application/json' },
94
+ body: JSON.stringify({
95
+ model: model === 'auto' ? 'llama3.1' : model,
96
+ prompt,
97
+ stream: false,
98
+ format: 'json',
99
+ }),
100
+ });
101
+ if (!response.ok) {
102
+ throw new Error(`Ollama error: ${response.status} ${response.statusText}`);
103
+ }
104
+ const data = await response.json();
105
+ return data.response;
106
+ }
107
+ /**
108
+ * Extract entities and relationships from text using configured LLM.
109
+ */
110
+ export async function extractFromText(text, config) {
111
+ const provider = detectProvider(config);
112
+ if (!provider) {
113
+ throw new Error('No LLM provider available. Set OPENAI_API_KEY, ANTHROPIC_API_KEY, or OLLAMA_HOST.');
114
+ }
115
+ const prompt = buildPrompt(text, config.domains);
116
+ const model = config.extraction.model;
117
+ let rawResponse;
118
+ switch (provider) {
119
+ case 'openai':
120
+ rawResponse = await callOpenAI(prompt, model);
121
+ break;
122
+ case 'anthropic':
123
+ rawResponse = await callAnthropic(prompt, model);
124
+ break;
125
+ case 'ollama':
126
+ rawResponse = await callOllama(prompt, model);
127
+ break;
128
+ }
129
+ // Parse response
130
+ try {
131
+ // Extract JSON from response (handle markdown code blocks)
132
+ const jsonMatch = rawResponse.match(/\{[\s\S]*\}/);
133
+ if (!jsonMatch) {
134
+ return { entities: [], relationships: [] };
135
+ }
136
+ const parsed = JSON.parse(jsonMatch[0]);
137
+ const entities = (parsed.entities || [])
138
+ .filter((e) => e.name && e.type && (e.confidence ?? 1) >= config.extraction.minConfidence)
139
+ .map((e) => ({
140
+ name: String(e.name).trim(),
141
+ type: String(e.type).trim(),
142
+ properties: e.properties ?? {},
143
+ confidence: Math.min(1, Math.max(0, Number(e.confidence) || 0.8)),
144
+ }));
145
+ const relationships = (parsed.relationships || [])
146
+ .filter((r) => r.from && r.relation && r.to && (r.confidence ?? 1) >= config.extraction.minConfidence)
147
+ .map((r) => ({
148
+ from: String(r.from).trim(),
149
+ relation: String(r.relation).trim().toUpperCase().replace(/\s+/g, '_'),
150
+ to: String(r.to).trim(),
151
+ fromType: r.fromType?.trim(),
152
+ toType: r.toType?.trim(),
153
+ confidence: Math.min(1, Math.max(0, Number(r.confidence) || 0.8)),
154
+ }));
155
+ return { entities, relationships };
156
+ }
157
+ catch (err) {
158
+ console.warn('[agent-memory-graph] Failed to parse extraction response:', err);
159
+ return { entities: [], relationships: [] };
160
+ }
161
+ }
162
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../../src/extract/extractor.ts"],"names":[],"mappings":"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"}