@easynet/agent-memory 0.0.2

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 (167) hide show
  1. package/README.md +260 -0
  2. package/bin/chat +11 -0
  3. package/dist/adapters/index.d.ts +8 -0
  4. package/dist/adapters/index.d.ts.map +1 -0
  5. package/dist/adapters/index.js +29 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/adapters/mem0/mem0-store.d.ts +29 -0
  8. package/dist/adapters/mem0/mem0-store.d.ts.map +1 -0
  9. package/dist/adapters/mem0/mem0-store.js +174 -0
  10. package/dist/adapters/mem0/mem0-store.js.map +1 -0
  11. package/dist/adapters/rag-http/rag-http-retriever.d.ts +18 -0
  12. package/dist/adapters/rag-http/rag-http-retriever.d.ts.map +1 -0
  13. package/dist/adapters/rag-http/rag-http-retriever.js +71 -0
  14. package/dist/adapters/rag-http/rag-http-retriever.js.map +1 -0
  15. package/dist/adapters/types.d.ts +25 -0
  16. package/dist/adapters/types.d.ts.map +1 -0
  17. package/dist/adapters/types.js +6 -0
  18. package/dist/adapters/types.js.map +1 -0
  19. package/dist/boot/boot-rebuilder.d.ts +26 -0
  20. package/dist/boot/boot-rebuilder.d.ts.map +1 -0
  21. package/dist/boot/boot-rebuilder.js +112 -0
  22. package/dist/boot/boot-rebuilder.js.map +1 -0
  23. package/dist/boot/index.d.ts +3 -0
  24. package/dist/boot/index.d.ts.map +1 -0
  25. package/dist/boot/index.js +6 -0
  26. package/dist/boot/index.js.map +1 -0
  27. package/dist/cli/chat-split.d.ts +22 -0
  28. package/dist/cli/chat-split.d.ts.map +1 -0
  29. package/dist/cli/chat-split.js +187 -0
  30. package/dist/cli/chat-split.js.map +1 -0
  31. package/dist/cli/chat.d.ts +19 -0
  32. package/dist/cli/chat.d.ts.map +1 -0
  33. package/dist/cli/chat.js +266 -0
  34. package/dist/cli/chat.js.map +1 -0
  35. package/dist/cli/commands/command-handler.d.ts +32 -0
  36. package/dist/cli/commands/command-handler.d.ts.map +1 -0
  37. package/dist/cli/commands/command-handler.js +143 -0
  38. package/dist/cli/commands/command-handler.js.map +1 -0
  39. package/dist/cli/index.d.ts +3 -0
  40. package/dist/cli/index.d.ts.map +1 -0
  41. package/dist/cli/index.js +8 -0
  42. package/dist/cli/index.js.map +1 -0
  43. package/dist/cli/ui/display-manager.d.ts +18 -0
  44. package/dist/cli/ui/display-manager.d.ts.map +1 -0
  45. package/dist/cli/ui/display-manager.js +69 -0
  46. package/dist/cli/ui/display-manager.js.map +1 -0
  47. package/dist/cli/ui/screen-layout.d.ts +12 -0
  48. package/dist/cli/ui/screen-layout.d.ts.map +1 -0
  49. package/dist/cli/ui/screen-layout.js +125 -0
  50. package/dist/cli/ui/screen-layout.js.map +1 -0
  51. package/dist/config/index.d.ts +2 -0
  52. package/dist/config/index.d.ts.map +1 -0
  53. package/dist/config/index.js +6 -0
  54. package/dist/config/index.js.map +1 -0
  55. package/dist/config/loader.d.ts +9 -0
  56. package/dist/config/loader.d.ts.map +1 -0
  57. package/dist/config/loader.js +107 -0
  58. package/dist/config/loader.js.map +1 -0
  59. package/dist/context/context-builder.d.ts +18 -0
  60. package/dist/context/context-builder.d.ts.map +1 -0
  61. package/dist/context/context-builder.js +91 -0
  62. package/dist/context/context-builder.js.map +1 -0
  63. package/dist/core/agent-memory.d.ts +50 -0
  64. package/dist/core/agent-memory.d.ts.map +1 -0
  65. package/dist/core/agent-memory.js +297 -0
  66. package/dist/core/agent-memory.js.map +1 -0
  67. package/dist/embedding/embedder.d.ts +49 -0
  68. package/dist/embedding/embedder.d.ts.map +1 -0
  69. package/dist/embedding/embedder.js +146 -0
  70. package/dist/embedding/embedder.js.map +1 -0
  71. package/dist/embedding/index.d.ts +3 -0
  72. package/dist/embedding/index.d.ts.map +1 -0
  73. package/dist/embedding/index.js +8 -0
  74. package/dist/embedding/index.js.map +1 -0
  75. package/dist/gate/deduplicator.d.ts +22 -0
  76. package/dist/gate/deduplicator.d.ts.map +1 -0
  77. package/dist/gate/deduplicator.js +74 -0
  78. package/dist/gate/deduplicator.js.map +1 -0
  79. package/dist/gate/extractor.d.ts +33 -0
  80. package/dist/gate/extractor.d.ts.map +1 -0
  81. package/dist/gate/extractor.js +122 -0
  82. package/dist/gate/extractor.js.map +1 -0
  83. package/dist/gate/index.d.ts +3 -0
  84. package/dist/gate/index.d.ts.map +1 -0
  85. package/dist/gate/index.js +6 -0
  86. package/dist/gate/index.js.map +1 -0
  87. package/dist/gate/memory-gate.d.ts +27 -0
  88. package/dist/gate/memory-gate.d.ts.map +1 -0
  89. package/dist/gate/memory-gate.js +86 -0
  90. package/dist/gate/memory-gate.js.map +1 -0
  91. package/dist/gate/redactor.d.ts +14 -0
  92. package/dist/gate/redactor.d.ts.map +1 -0
  93. package/dist/gate/redactor.js +24 -0
  94. package/dist/gate/redactor.js.map +1 -0
  95. package/dist/index.d.ts +6 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +24 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/indexing/in-memory-index.d.ts +67 -0
  100. package/dist/indexing/in-memory-index.d.ts.map +1 -0
  101. package/dist/indexing/in-memory-index.js +135 -0
  102. package/dist/indexing/in-memory-index.js.map +1 -0
  103. package/dist/indexing/index.d.ts +3 -0
  104. package/dist/indexing/index.d.ts.map +1 -0
  105. package/dist/indexing/index.js +6 -0
  106. package/dist/indexing/index.js.map +1 -0
  107. package/dist/persistence/database/schema.d.ts +6 -0
  108. package/dist/persistence/database/schema.d.ts.map +1 -0
  109. package/dist/persistence/database/schema.js +75 -0
  110. package/dist/persistence/database/schema.js.map +1 -0
  111. package/dist/persistence/index.d.ts +3 -0
  112. package/dist/persistence/index.d.ts.map +1 -0
  113. package/dist/persistence/index.js +6 -0
  114. package/dist/persistence/index.js.map +1 -0
  115. package/dist/persistence/repository/embedding-operations.d.ts +17 -0
  116. package/dist/persistence/repository/embedding-operations.d.ts.map +1 -0
  117. package/dist/persistence/repository/embedding-operations.js +58 -0
  118. package/dist/persistence/repository/embedding-operations.js.map +1 -0
  119. package/dist/persistence/repository/memory-operations.d.ts +28 -0
  120. package/dist/persistence/repository/memory-operations.d.ts.map +1 -0
  121. package/dist/persistence/repository/memory-operations.js +87 -0
  122. package/dist/persistence/repository/memory-operations.js.map +1 -0
  123. package/dist/persistence/repository/meta-operations.d.ts +15 -0
  124. package/dist/persistence/repository/meta-operations.d.ts.map +1 -0
  125. package/dist/persistence/repository/meta-operations.js +20 -0
  126. package/dist/persistence/repository/meta-operations.js.map +1 -0
  127. package/dist/persistence/sqlite-repo.d.ts +58 -0
  128. package/dist/persistence/sqlite-repo.d.ts.map +1 -0
  129. package/dist/persistence/sqlite-repo.js +81 -0
  130. package/dist/persistence/sqlite-repo.js.map +1 -0
  131. package/dist/persistence/utils/hash.d.ts +8 -0
  132. package/dist/persistence/utils/hash.d.ts.map +1 -0
  133. package/dist/persistence/utils/hash.js +48 -0
  134. package/dist/persistence/utils/hash.js.map +1 -0
  135. package/dist/persistence/utils/serialization.d.ts +33 -0
  136. package/dist/persistence/utils/serialization.d.ts.map +1 -0
  137. package/dist/persistence/utils/serialization.js +85 -0
  138. package/dist/persistence/utils/serialization.js.map +1 -0
  139. package/dist/processing/document/document-processor.d.ts +30 -0
  140. package/dist/processing/document/document-processor.d.ts.map +1 -0
  141. package/dist/processing/document/document-processor.js +158 -0
  142. package/dist/processing/document/document-processor.js.map +1 -0
  143. package/dist/processing/document/index.d.ts +3 -0
  144. package/dist/processing/document/index.d.ts.map +1 -0
  145. package/dist/processing/document/index.js +6 -0
  146. package/dist/processing/document/index.js.map +1 -0
  147. package/dist/ranker/ranker.d.ts +26 -0
  148. package/dist/ranker/ranker.d.ts.map +1 -0
  149. package/dist/ranker/ranker.js +40 -0
  150. package/dist/ranker/ranker.js.map +1 -0
  151. package/dist/recall/recall-engine.d.ts +19 -0
  152. package/dist/recall/recall-engine.d.ts.map +1 -0
  153. package/dist/recall/recall-engine.js +79 -0
  154. package/dist/recall/recall-engine.js.map +1 -0
  155. package/dist/types/config.d.ts +821 -0
  156. package/dist/types/config.d.ts.map +1 -0
  157. package/dist/types/config.js +128 -0
  158. package/dist/types/config.js.map +1 -0
  159. package/dist/types/document.d.ts +37 -0
  160. package/dist/types/document.d.ts.map +1 -0
  161. package/dist/types/document.js +6 -0
  162. package/dist/types/document.js.map +1 -0
  163. package/dist/types/index.d.ts +86 -0
  164. package/dist/types/index.d.ts.map +1 -0
  165. package/dist/types/index.js +6 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/package.json +53 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Memory extraction from text/messages
3
+ */
4
+ import { MemoryType, Message } from "../types";
5
+ export interface ExtractionRule {
6
+ type: MemoryType;
7
+ min_confidence: number;
8
+ when?: string[];
9
+ }
10
+ export interface ExtractedMemory {
11
+ type: MemoryType;
12
+ content: string;
13
+ confidence: number;
14
+ tags?: string[];
15
+ }
16
+ /**
17
+ * Heuristic-based memory extractor
18
+ * This is a simple fallback when LLM extraction is not available
19
+ */
20
+ export declare class HeuristicExtractor {
21
+ private rules;
22
+ constructor(rules?: ExtractionRule[]);
23
+ /**
24
+ * Extract memories from messages or text
25
+ */
26
+ extract(input: {
27
+ messages?: Message[];
28
+ text?: string;
29
+ }): ExtractedMemory[];
30
+ private getText;
31
+ private matchRule;
32
+ }
33
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/gate/extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,UAAU,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,KAAK,GAAE,cAAc,EAAO;IAIxC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,EAAE;IAiD1E,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,SAAS;CAqDlB"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ /**
3
+ * Memory extraction from text/messages
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HeuristicExtractor = void 0;
7
+ /**
8
+ * Heuristic-based memory extractor
9
+ * This is a simple fallback when LLM extraction is not available
10
+ */
11
+ class HeuristicExtractor {
12
+ constructor(rules = []) {
13
+ this.rules = rules;
14
+ }
15
+ /**
16
+ * Extract memories from messages or text
17
+ */
18
+ extract(input) {
19
+ const text = this.getText(input);
20
+ if (!text || text.trim().length < 10) {
21
+ return [];
22
+ }
23
+ const memories = [];
24
+ // Simple keyword-based extraction
25
+ for (const rule of this.rules) {
26
+ const matches = this.matchRule(text, rule);
27
+ if (matches.length > 0) {
28
+ for (const match of matches) {
29
+ memories.push({
30
+ type: rule.type,
31
+ content: match.content,
32
+ confidence: match.confidence,
33
+ tags: match.tags,
34
+ });
35
+ }
36
+ }
37
+ }
38
+ // If no rules match, try to extract general episodic memories
39
+ if (memories.length === 0 && text.length > 20) {
40
+ // Look for patterns like "流程:", "规定:", "经验:", etc.
41
+ const episodicPatterns = [
42
+ /(?:流程|步骤|方法|经验|踩坑|问题|解决)[::]\s*([^。!?\n]{10,200})/g,
43
+ /(?:先|然后|接着|最后)[,,]\s*([^。!?\n]{10,200})/g,
44
+ ];
45
+ for (const pattern of episodicPatterns) {
46
+ const matches = [...text.matchAll(pattern)];
47
+ for (const match of matches) {
48
+ if (match[1] && match[1].trim().length > 10) {
49
+ memories.push({
50
+ type: "episodic",
51
+ content: match[1].trim(),
52
+ confidence: 0.5,
53
+ tags: ["heuristic"],
54
+ });
55
+ }
56
+ }
57
+ }
58
+ }
59
+ return memories;
60
+ }
61
+ getText(input) {
62
+ if (input.text) {
63
+ return input.text;
64
+ }
65
+ if (input.messages) {
66
+ return input.messages
67
+ .map(msg => msg.content)
68
+ .join("\n");
69
+ }
70
+ return "";
71
+ }
72
+ matchRule(text, rule) {
73
+ const matches = [];
74
+ // Type-specific patterns
75
+ const typePatterns = {
76
+ profile: [
77
+ /(?:偏好|喜欢|习惯|通常|总是)[::]\s*([^。!?\n]{10,100})/g,
78
+ /(?:我是|我的)[^。!?\n]{5,100}/g,
79
+ ],
80
+ policy: [
81
+ /(?:规定|约定|规则|流程|必须|应该|禁止)[::]\s*([^。!?\n]{10,200})/g,
82
+ /(?:先|然后|接着|最后)[,,]\s*([^。!?\n]{10,200})/g,
83
+ ],
84
+ episodic: [
85
+ /(?:经验|踩坑|问题|解决|方法|步骤)[::]\s*([^。!?\n]{10,200})/g,
86
+ /(?:当|如果|遇到)[^。!?\n]{5,100}(?:时|的时候)[,,]\s*([^。!?\n]{10,200})/g,
87
+ ],
88
+ decision: [
89
+ /(?:决定|选择|采用|使用)[::]\s*([^。!?\n]{10,200})/g,
90
+ /(?:因为|由于|考虑到)[^。!?\n]{5,100}(?:所以|因此|决定)[,,]\s*([^。!?\n]{10,200})/g,
91
+ ],
92
+ };
93
+ const patterns = typePatterns[rule.type] || [];
94
+ for (const pattern of patterns) {
95
+ const found = [...text.matchAll(pattern)];
96
+ for (const match of found) {
97
+ const content = (match[1] || match[0]).trim();
98
+ if (content.length >= 10) {
99
+ // Check if "when" keywords are present
100
+ let confidence = rule.min_confidence;
101
+ if (rule.when && rule.when.length > 0) {
102
+ const hasKeyword = rule.when.some(keyword => text.toLowerCase().includes(keyword.toLowerCase()));
103
+ if (hasKeyword) {
104
+ confidence = Math.min(0.9, confidence + 0.1);
105
+ }
106
+ else {
107
+ confidence = Math.max(0.3, confidence - 0.2);
108
+ }
109
+ }
110
+ matches.push({
111
+ content,
112
+ confidence,
113
+ tags: rule.when,
114
+ });
115
+ }
116
+ }
117
+ }
118
+ return matches;
119
+ }
120
+ }
121
+ exports.HeuristicExtractor = HeuristicExtractor;
122
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/gate/extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { MemoryGate } from "./memory-gate";
2
+ export type { RememberInput } from "./memory-gate";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryGate = void 0;
4
+ var memory_gate_1 = require("./memory-gate");
5
+ Object.defineProperty(exports, "MemoryGate", { enumerable: true, get: function () { return memory_gate_1.MemoryGate; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gate/index.ts"],"names":[],"mappings":";;;AAAA,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * MemoryGate - Controls memory writing quality
3
+ * Flow: Redaction -> Extraction -> Rules Filter -> Deduplication -> Persist
4
+ */
5
+ import { MemoryItem, Actor, Scope, Message } from "../types";
6
+ import { Config } from "../types/config";
7
+ export interface RememberInput {
8
+ messages?: Message[];
9
+ text?: string;
10
+ actor?: Actor;
11
+ scope?: Scope;
12
+ hint?: {
13
+ types?: MemoryItem["type"][];
14
+ };
15
+ }
16
+ export declare class MemoryGate {
17
+ private redactor;
18
+ private extractor;
19
+ private deduplicator;
20
+ private rules;
21
+ constructor(config: Config);
22
+ /**
23
+ * Process input through the gate pipeline
24
+ */
25
+ process(input: RememberInput): Promise<MemoryItem[]>;
26
+ }
27
+ //# sourceMappingURL=memory-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-gate.d.ts","sourceRoot":"","sources":["../../src/gate/memory-gate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAKzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAA;KAAE,CAAC;CACzC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,KAAK,CAAmB;gBAEpB,MAAM,EAAE,MAAM;IA+B1B;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAgD3D"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /**
3
+ * MemoryGate - Controls memory writing quality
4
+ * Flow: Redaction -> Extraction -> Rules Filter -> Deduplication -> Persist
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MemoryGate = void 0;
8
+ const crypto_1 = require("crypto");
9
+ const redactor_1 = require("./redactor");
10
+ const extractor_1 = require("./extractor");
11
+ const deduplicator_1 = require("./deduplicator");
12
+ class MemoryGate {
13
+ constructor(config) {
14
+ const gateConfig = config.memory?.gate || { enabled: true };
15
+ // Initialize redactor
16
+ const redactConfig = {
17
+ enabled: gateConfig.redact?.enabled ?? true,
18
+ patterns: gateConfig.redact?.patterns || [
19
+ "AKIA[0-9A-Z]{16}",
20
+ "-----BEGIN .* PRIVATE KEY-----",
21
+ "sk-[a-zA-Z0-9]{32,}",
22
+ "ghp_[a-zA-Z0-9]{36}",
23
+ ],
24
+ };
25
+ this.redactor = new redactor_1.Redactor(redactConfig);
26
+ // Initialize extractor with rules
27
+ this.rules = (gateConfig.rules || []).map(rule => ({
28
+ type: rule.type,
29
+ min_confidence: rule.min_confidence,
30
+ when: rule.when,
31
+ }));
32
+ this.extractor = new extractor_1.HeuristicExtractor(this.rules);
33
+ // Initialize deduplicator
34
+ const dedupeConfig = {
35
+ enabled: gateConfig.dedupe?.enabled ?? true,
36
+ similarity_threshold: gateConfig.dedupe?.similarity_threshold ?? 0.92,
37
+ };
38
+ this.deduplicator = new deduplicator_1.Deduplicator(dedupeConfig);
39
+ }
40
+ /**
41
+ * Process input through the gate pipeline
42
+ */
43
+ async process(input) {
44
+ // Step 1: Redaction
45
+ const text = input.messages
46
+ ? input.messages.map(m => m.content).join("\n")
47
+ : input.text || "";
48
+ const redactedText = this.redactor.redact(text);
49
+ if (redactedText.trim().length < 10) {
50
+ return [];
51
+ }
52
+ // Step 2: Extraction
53
+ const extracted = this.extractor.extract({
54
+ messages: input.messages?.map(m => ({
55
+ ...m,
56
+ content: m.role === "user" ? this.redactor.redact(m.content) : m.content,
57
+ })),
58
+ text: redactedText,
59
+ });
60
+ // Step 3: Rules Filter (already applied during extraction, but filter by hint)
61
+ let filtered = extracted;
62
+ if (input.hint?.types && input.hint.types.length > 0) {
63
+ filtered = extracted.filter(m => input.hint.types.includes(m.type));
64
+ }
65
+ // Step 4: Convert to MemoryItem (use UUID to avoid id collision across rapid remember() calls)
66
+ const now = new Date().toISOString();
67
+ let items = filtered.map((mem) => ({
68
+ id: `mem_${(0, crypto_1.randomUUID)()}`,
69
+ type: mem.type,
70
+ content: mem.content,
71
+ actor: input.actor,
72
+ scope: input.scope,
73
+ tags: mem.tags,
74
+ confidence: mem.confidence,
75
+ source: {
76
+ kind: input.messages ? "chat" : "manual",
77
+ },
78
+ createdAt: now,
79
+ }));
80
+ // Step 5: Deduplication
81
+ items = this.deduplicator.dedupe(items);
82
+ return items;
83
+ }
84
+ }
85
+ exports.MemoryGate = MemoryGate;
86
+ //# sourceMappingURL=memory-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-gate.js","sourceRoot":"","sources":["../../src/gate/memory-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Redaction - Remove sensitive information
3
+ */
4
+ export interface RedactionConfig {
5
+ enabled: boolean;
6
+ patterns: string[];
7
+ }
8
+ export declare class Redactor {
9
+ private config;
10
+ private patterns;
11
+ constructor(config: RedactionConfig);
12
+ redact(text: string): string;
13
+ }
14
+ //# sourceMappingURL=redactor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactor.d.ts","sourceRoot":"","sources":["../../src/gate/redactor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAW;gBAEf,MAAM,EAAE,eAAe;IAKnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAW7B"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Redaction - Remove sensitive information
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Redactor = void 0;
7
+ class Redactor {
8
+ constructor(config) {
9
+ this.config = config;
10
+ this.patterns = config.patterns.map(pattern => new RegExp(pattern, "gi"));
11
+ }
12
+ redact(text) {
13
+ if (!this.config.enabled) {
14
+ return text;
15
+ }
16
+ let result = text;
17
+ for (const pattern of this.patterns) {
18
+ result = result.replace(pattern, "[REDACTED]");
19
+ }
20
+ return result;
21
+ }
22
+ }
23
+ exports.Redactor = Redactor;
24
+ //# sourceMappingURL=redactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactor.js","sourceRoot":"","sources":["../../src/gate/redactor.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAOH,MAAa,QAAQ;IAInB,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AApBD,4BAoBC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * agent-memory - Main export
3
+ */
4
+ export { AgentMemory } from "./core/agent-memory";
5
+ export * from "./types";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * agent-memory - Main export
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.AgentMemory = void 0;
21
+ var agent_memory_1 = require("./core/agent-memory");
22
+ Object.defineProperty(exports, "AgentMemory", { enumerable: true, get: function () { return agent_memory_1.AgentMemory; } });
23
+ __exportStar(require("./types"), exports);
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,oDAAkD;AAAzC,2GAAA,WAAW,OAAA;AACpB,0CAAwB"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * In-Memory Vector Index for fast recall
3
+ * Simple implementation using cosine similarity
4
+ */
5
+ import { MemoryItem, Actor, Scope } from "../types";
6
+ export interface InMemoryIndexOptions {
7
+ similarityThreshold?: number;
8
+ }
9
+ export declare class InMemoryIndex {
10
+ private options;
11
+ private items;
12
+ private embeddings;
13
+ constructor(options?: InMemoryIndexOptions);
14
+ /**
15
+ * Initialize (clear existing)
16
+ */
17
+ init(): Promise<void>;
18
+ /**
19
+ * Add memory items to index
20
+ */
21
+ add(items: MemoryItem[]): Promise<void>;
22
+ /**
23
+ * Add embedding for a memory item
24
+ */
25
+ addEmbedding(memoryId: string, embedding: Float32Array): Promise<void>;
26
+ /**
27
+ * Search by query embedding
28
+ */
29
+ search(queryEmbedding: Float32Array, topK: number, filters?: {
30
+ actor?: Actor;
31
+ scope?: Scope;
32
+ }): Promise<{
33
+ ids: string[];
34
+ scores: number[];
35
+ }>;
36
+ /**
37
+ * Search by text (requires embedding first)
38
+ */
39
+ searchByText(query: string, queryEmbedding: Float32Array, topK: number, filters?: {
40
+ actor?: Actor;
41
+ scope?: Scope;
42
+ }): Promise<{
43
+ ids: string[];
44
+ scores: number[];
45
+ }>;
46
+ /**
47
+ * Compute cosine similarity between two vectors
48
+ */
49
+ private cosineSimilarity;
50
+ /**
51
+ * Clear all indexed items
52
+ */
53
+ clear(): Promise<void>;
54
+ /**
55
+ * Get item by ID
56
+ */
57
+ getItem(id: string): MemoryItem | undefined;
58
+ /**
59
+ * Remove item by ID
60
+ */
61
+ remove(id: string): Promise<void>;
62
+ /**
63
+ * Get total count
64
+ */
65
+ size(): number;
66
+ }
67
+ //# sourceMappingURL=in-memory-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-index.d.ts","sourceRoot":"","sources":["../../src/indexing/in-memory-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAQpD,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,aAAa;IAIZ,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,UAAU,CAAwC;gBAEtC,OAAO,GAAE,oBAAyB;IAEtD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACG,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5E;;OAEG;IACG,MAAM,CACV,cAAc,EAAE,YAAY,EAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,GACzC,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA2C/C;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,YAAY,EAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,GACzC,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAI/C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI3C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC;;OAEG;IACH,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ /**
3
+ * In-Memory Vector Index for fast recall
4
+ * Simple implementation using cosine similarity
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.InMemoryIndex = void 0;
8
+ class InMemoryIndex {
9
+ constructor(options = {}) {
10
+ this.options = options;
11
+ this.items = new Map();
12
+ this.embeddings = new Map();
13
+ }
14
+ /**
15
+ * Initialize (clear existing)
16
+ */
17
+ async init() {
18
+ this.clear();
19
+ }
20
+ /**
21
+ * Add memory items to index
22
+ */
23
+ async add(items) {
24
+ for (const item of items) {
25
+ this.items.set(item.id, {
26
+ id: item.id,
27
+ item,
28
+ });
29
+ }
30
+ }
31
+ /**
32
+ * Add embedding for a memory item
33
+ */
34
+ async addEmbedding(memoryId, embedding) {
35
+ this.embeddings.set(memoryId, embedding);
36
+ const indexed = this.items.get(memoryId);
37
+ if (indexed) {
38
+ indexed.embedding = embedding;
39
+ }
40
+ }
41
+ /**
42
+ * Search by query embedding
43
+ */
44
+ async search(queryEmbedding, topK, filters) {
45
+ const results = [];
46
+ for (const [id, indexed] of this.items.entries()) {
47
+ // Apply filters
48
+ if (filters) {
49
+ if (filters.actor && indexed.item.actor?.id !== filters.actor.id) {
50
+ continue;
51
+ }
52
+ if (filters.scope) {
53
+ if (filters.scope.projectId && indexed.item.scope?.projectId !== filters.scope.projectId) {
54
+ continue;
55
+ }
56
+ if (filters.scope.channelId && indexed.item.scope?.channelId !== filters.scope.channelId) {
57
+ continue;
58
+ }
59
+ if (filters.scope.threadId && indexed.item.scope?.threadId !== filters.scope.threadId) {
60
+ continue;
61
+ }
62
+ }
63
+ }
64
+ const embedding = this.embeddings.get(id);
65
+ if (!embedding) {
66
+ // No embedding, skip or use text similarity
67
+ continue;
68
+ }
69
+ const score = this.cosineSimilarity(queryEmbedding, embedding);
70
+ results.push({ id, score });
71
+ }
72
+ // Sort by score descending
73
+ results.sort((a, b) => b.score - a.score);
74
+ // Return top K
75
+ const topResults = results.slice(0, topK);
76
+ return {
77
+ ids: topResults.map((r) => r.id),
78
+ scores: topResults.map((r) => r.score),
79
+ };
80
+ }
81
+ /**
82
+ * Search by text (requires embedding first)
83
+ */
84
+ async searchByText(query, queryEmbedding, topK, filters) {
85
+ return this.search(queryEmbedding, topK, filters);
86
+ }
87
+ /**
88
+ * Compute cosine similarity between two vectors
89
+ */
90
+ cosineSimilarity(a, b) {
91
+ if (a.length !== b.length) {
92
+ throw new Error("Vectors must have same dimension");
93
+ }
94
+ let dotProduct = 0;
95
+ let normA = 0;
96
+ let normB = 0;
97
+ for (let i = 0; i < a.length; i++) {
98
+ dotProduct += a[i] * b[i];
99
+ normA += a[i] * a[i];
100
+ normB += b[i] * b[i];
101
+ }
102
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
103
+ if (denominator === 0)
104
+ return 0;
105
+ return dotProduct / denominator;
106
+ }
107
+ /**
108
+ * Clear all indexed items
109
+ */
110
+ async clear() {
111
+ this.items.clear();
112
+ this.embeddings.clear();
113
+ }
114
+ /**
115
+ * Get item by ID
116
+ */
117
+ getItem(id) {
118
+ return this.items.get(id)?.item;
119
+ }
120
+ /**
121
+ * Remove item by ID
122
+ */
123
+ async remove(id) {
124
+ this.items.delete(id);
125
+ this.embeddings.delete(id);
126
+ }
127
+ /**
128
+ * Get total count
129
+ */
130
+ size() {
131
+ return this.items.size;
132
+ }
133
+ }
134
+ exports.InMemoryIndex = InMemoryIndex;
135
+ //# sourceMappingURL=in-memory-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-index.js","sourceRoot":"","sources":["../../src/indexing/in-memory-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { InMemoryIndex } from "./in-memory-index";
2
+ export type { InMemoryIndexOptions } from "./in-memory-index";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryIndex = void 0;
4
+ var in_memory_index_1 = require("./in-memory-index");
5
+ Object.defineProperty(exports, "InMemoryIndex", { enumerable: true, get: function () { return in_memory_index_1.InMemoryIndex; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexing/index.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAAzC,gHAAA,aAAa,OAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Database schema definitions
3
+ */
4
+ export declare const SCHEMA_SQL = "\n CREATE TABLE IF NOT EXISTS memory_items (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n \n actor_id TEXT,\n actor_type TEXT,\n scope_project_id TEXT,\n scope_channel_id TEXT,\n scope_thread_id TEXT,\n scope_run_id TEXT,\n \n tags_json TEXT,\n confidence REAL,\n utility REAL DEFAULT 0,\n \n source_kind TEXT,\n source_ref TEXT,\n \n created_at TEXT NOT NULL,\n updated_at TEXT,\n deleted_at TEXT,\n \n embedding_status TEXT NOT NULL DEFAULT 'pending',\n embedding_model TEXT,\n embedding_dim INTEGER,\n embedding_updated_at TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_memory_scope\n ON memory_items(scope_project_id, scope_channel_id, scope_thread_id, actor_id);\n\n CREATE INDEX IF NOT EXISTS idx_memory_hash\n ON memory_items(content_hash);\n\n CREATE INDEX IF NOT EXISTS idx_memory_deleted\n ON memory_items(deleted_at);\n\n CREATE TABLE IF NOT EXISTS memory_embeddings (\n memory_id TEXT PRIMARY KEY,\n model TEXT NOT NULL,\n dim INTEGER NOT NULL,\n vector_blob BLOB NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY(memory_id) REFERENCES memory_items(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_embedding_model\n ON memory_embeddings(model, dim);\n\n CREATE TABLE IF NOT EXISTS kv_meta (\n k TEXT PRIMARY KEY,\n v TEXT NOT NULL\n );\n";
5
+ export declare function initializeDatabase(db: any, wal?: boolean): void;
6
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/persistence/database/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,UAAU,4kDAwDtB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,GAAE,OAAc,GAAG,IAAI,CAUrE"}