@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.
- package/README.md +260 -0
- package/bin/chat +11 -0
- package/dist/adapters/index.d.ts +8 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +29 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mem0/mem0-store.d.ts +29 -0
- package/dist/adapters/mem0/mem0-store.d.ts.map +1 -0
- package/dist/adapters/mem0/mem0-store.js +174 -0
- package/dist/adapters/mem0/mem0-store.js.map +1 -0
- package/dist/adapters/rag-http/rag-http-retriever.d.ts +18 -0
- package/dist/adapters/rag-http/rag-http-retriever.d.ts.map +1 -0
- package/dist/adapters/rag-http/rag-http-retriever.js +71 -0
- package/dist/adapters/rag-http/rag-http-retriever.js.map +1 -0
- package/dist/adapters/types.d.ts +25 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +6 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/boot/boot-rebuilder.d.ts +26 -0
- package/dist/boot/boot-rebuilder.d.ts.map +1 -0
- package/dist/boot/boot-rebuilder.js +112 -0
- package/dist/boot/boot-rebuilder.js.map +1 -0
- package/dist/boot/index.d.ts +3 -0
- package/dist/boot/index.d.ts.map +1 -0
- package/dist/boot/index.js +6 -0
- package/dist/boot/index.js.map +1 -0
- package/dist/cli/chat-split.d.ts +22 -0
- package/dist/cli/chat-split.d.ts.map +1 -0
- package/dist/cli/chat-split.js +187 -0
- package/dist/cli/chat-split.js.map +1 -0
- package/dist/cli/chat.d.ts +19 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +266 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/commands/command-handler.d.ts +32 -0
- package/dist/cli/commands/command-handler.d.ts.map +1 -0
- package/dist/cli/commands/command-handler.js +143 -0
- package/dist/cli/commands/command-handler.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/display-manager.d.ts +18 -0
- package/dist/cli/ui/display-manager.d.ts.map +1 -0
- package/dist/cli/ui/display-manager.js +69 -0
- package/dist/cli/ui/display-manager.js.map +1 -0
- package/dist/cli/ui/screen-layout.d.ts +12 -0
- package/dist/cli/ui/screen-layout.d.ts.map +1 -0
- package/dist/cli/ui/screen-layout.js +125 -0
- package/dist/cli/ui/screen-layout.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +9 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +107 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/context/context-builder.d.ts +18 -0
- package/dist/context/context-builder.d.ts.map +1 -0
- package/dist/context/context-builder.js +91 -0
- package/dist/context/context-builder.js.map +1 -0
- package/dist/core/agent-memory.d.ts +50 -0
- package/dist/core/agent-memory.d.ts.map +1 -0
- package/dist/core/agent-memory.js +297 -0
- package/dist/core/agent-memory.js.map +1 -0
- package/dist/embedding/embedder.d.ts +49 -0
- package/dist/embedding/embedder.d.ts.map +1 -0
- package/dist/embedding/embedder.js +146 -0
- package/dist/embedding/embedder.js.map +1 -0
- package/dist/embedding/index.d.ts +3 -0
- package/dist/embedding/index.d.ts.map +1 -0
- package/dist/embedding/index.js +8 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/gate/deduplicator.d.ts +22 -0
- package/dist/gate/deduplicator.d.ts.map +1 -0
- package/dist/gate/deduplicator.js +74 -0
- package/dist/gate/deduplicator.js.map +1 -0
- package/dist/gate/extractor.d.ts +33 -0
- package/dist/gate/extractor.d.ts.map +1 -0
- package/dist/gate/extractor.js +122 -0
- package/dist/gate/extractor.js.map +1 -0
- package/dist/gate/index.d.ts +3 -0
- package/dist/gate/index.d.ts.map +1 -0
- package/dist/gate/index.js +6 -0
- package/dist/gate/index.js.map +1 -0
- package/dist/gate/memory-gate.d.ts +27 -0
- package/dist/gate/memory-gate.d.ts.map +1 -0
- package/dist/gate/memory-gate.js +86 -0
- package/dist/gate/memory-gate.js.map +1 -0
- package/dist/gate/redactor.d.ts +14 -0
- package/dist/gate/redactor.d.ts.map +1 -0
- package/dist/gate/redactor.js +24 -0
- package/dist/gate/redactor.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/indexing/in-memory-index.d.ts +67 -0
- package/dist/indexing/in-memory-index.d.ts.map +1 -0
- package/dist/indexing/in-memory-index.js +135 -0
- package/dist/indexing/in-memory-index.js.map +1 -0
- package/dist/indexing/index.d.ts +3 -0
- package/dist/indexing/index.d.ts.map +1 -0
- package/dist/indexing/index.js +6 -0
- package/dist/indexing/index.js.map +1 -0
- package/dist/persistence/database/schema.d.ts +6 -0
- package/dist/persistence/database/schema.d.ts.map +1 -0
- package/dist/persistence/database/schema.js +75 -0
- package/dist/persistence/database/schema.js.map +1 -0
- package/dist/persistence/index.d.ts +3 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +6 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/repository/embedding-operations.d.ts +17 -0
- package/dist/persistence/repository/embedding-operations.d.ts.map +1 -0
- package/dist/persistence/repository/embedding-operations.js +58 -0
- package/dist/persistence/repository/embedding-operations.js.map +1 -0
- package/dist/persistence/repository/memory-operations.d.ts +28 -0
- package/dist/persistence/repository/memory-operations.d.ts.map +1 -0
- package/dist/persistence/repository/memory-operations.js +87 -0
- package/dist/persistence/repository/memory-operations.js.map +1 -0
- package/dist/persistence/repository/meta-operations.d.ts +15 -0
- package/dist/persistence/repository/meta-operations.d.ts.map +1 -0
- package/dist/persistence/repository/meta-operations.js +20 -0
- package/dist/persistence/repository/meta-operations.js.map +1 -0
- package/dist/persistence/sqlite-repo.d.ts +58 -0
- package/dist/persistence/sqlite-repo.d.ts.map +1 -0
- package/dist/persistence/sqlite-repo.js +81 -0
- package/dist/persistence/sqlite-repo.js.map +1 -0
- package/dist/persistence/utils/hash.d.ts +8 -0
- package/dist/persistence/utils/hash.d.ts.map +1 -0
- package/dist/persistence/utils/hash.js +48 -0
- package/dist/persistence/utils/hash.js.map +1 -0
- package/dist/persistence/utils/serialization.d.ts +33 -0
- package/dist/persistence/utils/serialization.d.ts.map +1 -0
- package/dist/persistence/utils/serialization.js +85 -0
- package/dist/persistence/utils/serialization.js.map +1 -0
- package/dist/processing/document/document-processor.d.ts +30 -0
- package/dist/processing/document/document-processor.d.ts.map +1 -0
- package/dist/processing/document/document-processor.js +158 -0
- package/dist/processing/document/document-processor.js.map +1 -0
- package/dist/processing/document/index.d.ts +3 -0
- package/dist/processing/document/index.d.ts.map +1 -0
- package/dist/processing/document/index.js +6 -0
- package/dist/processing/document/index.js.map +1 -0
- package/dist/ranker/ranker.d.ts +26 -0
- package/dist/ranker/ranker.d.ts.map +1 -0
- package/dist/ranker/ranker.js +40 -0
- package/dist/ranker/ranker.js.map +1 -0
- package/dist/recall/recall-engine.d.ts +19 -0
- package/dist/recall/recall-engine.d.ts.map +1 -0
- package/dist/recall/recall-engine.js +79 -0
- package/dist/recall/recall-engine.js.map +1 -0
- package/dist/types/config.d.ts +821 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +128 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/document.d.ts +37 -0
- package/dist/types/document.d.ts.map +1 -0
- package/dist/types/document.js +6 -0
- package/dist/types/document.js.map +1 -0
- package/dist/types/index.d.ts +86 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- 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":";AAAA;;GAEG;;;AAiBH;;;GAGG;AACH,MAAa,kBAAkB;IAG7B,YAAY,QAA0B,EAAE;QACtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAA8C;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,kCAAkC;QAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC9C,mDAAmD;YACnD,MAAM,gBAAgB,GAAG;gBACvB,oDAAoD;gBACpD,0CAA0C;aAC3C,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;wBAC5C,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI,EAAE,UAAU;4BAChB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;4BACxB,UAAU,EAAE,GAAG;4BACf,IAAI,EAAE,CAAC,WAAW,CAAC;yBACpB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,OAAO,CAAC,KAA8C;QAC5D,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC,QAAQ;iBAClB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC;iBACvB,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,SAAS,CAAC,IAAY,EAAE,IAAoB;QAClD,MAAM,OAAO,GAAoE,EAAE,CAAC;QAEpF,yBAAyB;QACzB,MAAM,YAAY,GAAiC;YACjD,OAAO,EAAE;gBACP,8CAA8C;gBAC9C,2BAA2B;aAC5B;YACD,MAAM,EAAE;gBACN,oDAAoD;gBACpD,0CAA0C;aAC3C;YACD,QAAQ,EAAE;gBACR,iDAAiD;gBACjD,+DAA+D;aAChE;YACD,QAAQ,EAAE;gBACR,2CAA2C;gBAC3C,oEAAoE;aACrE;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;oBACzB,uCAAuC;oBACvC,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;oBACrC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC1C,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CACnD,CAAC;wBACF,IAAI,UAAU,EAAE,CAAC;4BACf,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;wBAC/C,CAAC;6BAAM,CAAC;4BACN,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;wBAC/C,CAAC;oBACH,CAAC;oBAED,OAAO,CAAC,IAAI,CAAC;wBACX,OAAO;wBACP,UAAU;wBACV,IAAI,EAAE,IAAI,CAAC,IAAI;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA5HD,gDA4HC"}
|
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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":";AAAA;;;GAGG;;;AAcH,MAAa,aAAa;IAIxB,YAAoB,UAAgC,EAAE;QAAlC,YAAO,GAAP,OAAO,CAA2B;QAH9C,UAAK,GAA6B,IAAI,GAAG,EAAE,CAAC;QAC5C,eAAU,GAA8B,IAAI,GAAG,EAAE,CAAC;IAED,CAAC;IAE1D;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,KAAmB;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;gBACtB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,SAAuB;QAC1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,cAA4B,EAC5B,IAAY,EACZ,OAA0C;QAE1C,MAAM,OAAO,GAAyC,EAAE,CAAC;QAEzD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACjD,gBAAgB;YAChB,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;oBACjE,SAAS;gBACX,CAAC;gBACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;wBACzF,SAAS;oBACX,CAAC;oBACD,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;wBACzF,SAAS;oBACX,CAAC;oBACD,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACtF,SAAS;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,4CAA4C;gBAC5C,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAE1C,eAAe;QACf,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1C,OAAO;YACL,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,cAA4B,EAC5B,IAAY,EACZ,OAA0C;QAE1C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,CAAe,EAAE,CAAe;QACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,WAAW,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEhC,OAAO,UAAU,GAAG,WAAW,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAvJD,sCAuJC"}
|
|
@@ -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"}
|