memory-forge 0.3.13 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto/index.d.ts +5 -3
- package/dist/auto/index.js +98 -57
- package/dist/auto/index.js.map +1 -1
- package/dist/embedding.d.ts +0 -2
- package/dist/embedding.js +13 -12
- package/dist/embedding.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +343 -69
- package/dist/index.js.map +1 -1
- package/dist/migrate/import.js +1 -14
- package/dist/migrate/import.js.map +1 -1
- package/dist/pro.d.ts +32 -0
- package/dist/pro.js +243 -28
- package/dist/pro.js.map +1 -1
- package/dist/scenario-test.d.ts +1 -0
- package/dist/scenario-test.js +177 -0
- package/dist/scenario-test.js.map +1 -0
- package/dist/setup.js +10 -4
- package/dist/setup.js.map +1 -1
- package/dist/storage/local.js +30 -4
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/shelby.d.ts +23 -2
- package/dist/storage/shelby.js +123 -12
- package/dist/storage/shelby.js.map +1 -1
- package/dist/store.d.ts +11 -1
- package/dist/store.js +82 -9
- package/dist/store.js.map +1 -1
- package/dist/transcript.js +3 -1
- package/dist/transcript.js.map +1 -1
- package/package.json +1 -1
package/dist/auto/index.d.ts
CHANGED
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
* 后台自动化引擎: 全部用户无感知。
|
|
3
3
|
*/
|
|
4
4
|
import type { MemoryStore, Memory } from "../store.js";
|
|
5
|
-
/** 自动命名:
|
|
5
|
+
/** 自动命名: 首句提取 + 词边界截断。不切词,不停半截。
|
|
6
|
+
* 用户可通过 memory_store({ name: "..." }) 覆盖。 */
|
|
6
7
|
export declare function autoName(content: string): string;
|
|
7
|
-
/** 自动合并:
|
|
8
|
+
/** 自动合并: 向量预筛 top-10 候选 + Jaccard 确认,避免全扫描。 */
|
|
8
9
|
export declare function autoMerge(store: MemoryStore, newMemory: Memory): Promise<Memory | null>;
|
|
9
10
|
/** 自动优先级: 基于访问频率 */
|
|
10
11
|
export declare function autoPriority(memory: Memory): number;
|
|
11
12
|
/** 自动衰减: Ebbinghaus 遗忘曲线 */
|
|
12
13
|
export declare function autoDecay(memory: Memory): number;
|
|
13
|
-
/** 生成上下文摘要给 Agent
|
|
14
|
+
/** 生成上下文摘要给 Agent 注入。
|
|
15
|
+
* Recency 主导排序(最近使用的优先),分类衰减作 tiebreaker,priority=10 常青保护。 */
|
|
14
16
|
export declare function generateContextSummary(store: MemoryStore, limit?: number): string;
|
package/dist/auto/index.js
CHANGED
|
@@ -1,34 +1,76 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 后台自动化引擎: 全部用户无感知。
|
|
3
3
|
*/
|
|
4
|
+
import { contentOverlap, safeTruncate } from "../store.js";
|
|
4
5
|
import { saveMemory } from "../storage/local.js";
|
|
5
6
|
import { embed } from "../embedding.js";
|
|
6
|
-
/** 自动命名:
|
|
7
|
+
/** 自动命名: 首句提取 + 词边界截断。不切词,不停半截。
|
|
8
|
+
* 用户可通过 memory_store({ name: "..." }) 覆盖。 */
|
|
7
9
|
export function autoName(content) {
|
|
8
|
-
// Strip code blocks
|
|
9
|
-
const clean = content
|
|
10
|
-
|
|
10
|
+
// Strip code blocks and inline code
|
|
11
|
+
const clean = content
|
|
12
|
+
.replace(/```[\s\S]*?```/g, "")
|
|
13
|
+
.replace(/`/g, "")
|
|
14
|
+
.replace(/\n/g, ". ") // newlines as sentence boundaries
|
|
15
|
+
.replace(/\s+/g, " ")
|
|
16
|
+
.trim();
|
|
17
|
+
if (!clean)
|
|
18
|
+
return "memory";
|
|
19
|
+
// Find first natural sentence boundary
|
|
20
|
+
const endMarkers = [". ", "? ", "! ", ".\" ", ".\n"];
|
|
21
|
+
let end = -1;
|
|
22
|
+
for (const marker of endMarkers) {
|
|
23
|
+
const idx = clean.indexOf(marker);
|
|
24
|
+
if (idx > 0 && (end < 0 || idx < end))
|
|
25
|
+
end = idx + 1; // include the marker
|
|
26
|
+
}
|
|
27
|
+
// Take up to first boundary, capped at 60 chars
|
|
28
|
+
const maxLen = 60;
|
|
29
|
+
let name;
|
|
30
|
+
if (end > 0 && end <= maxLen) {
|
|
31
|
+
name = clean.slice(0, end).trim();
|
|
32
|
+
}
|
|
33
|
+
else if (clean.length <= maxLen) {
|
|
34
|
+
name = clean;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Truncate at last space before maxLen (word boundary)
|
|
38
|
+
const truncated = clean.slice(0, maxLen);
|
|
39
|
+
const lastSpace = truncated.lastIndexOf(" ");
|
|
40
|
+
name = lastSpace > maxLen * 0.5 ? truncated.slice(0, lastSpace) : truncated;
|
|
41
|
+
}
|
|
11
42
|
return name || "memory";
|
|
12
43
|
}
|
|
13
|
-
/** 自动合并:
|
|
44
|
+
/** 自动合并: 向量预筛 top-10 候选 + Jaccard 确认,避免全扫描。 */
|
|
14
45
|
export async function autoMerge(store, newMemory) {
|
|
15
|
-
|
|
16
|
-
|
|
46
|
+
// Vector pre-filter: find top-10 semantically similar candidates
|
|
47
|
+
let candidates;
|
|
48
|
+
if (newMemory.vector.length > 0) {
|
|
49
|
+
candidates = store.search("", {
|
|
50
|
+
limit: 10, minSimilarity: 0.7,
|
|
51
|
+
queryVec: new Float32Array(newMemory.vector),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// No vector yet — fall back to most recent 20
|
|
56
|
+
candidates = store.list({ limit: 20, offset: 0 });
|
|
57
|
+
}
|
|
58
|
+
if (candidates.length === 0)
|
|
17
59
|
return null;
|
|
18
|
-
for (const existing of
|
|
60
|
+
for (const existing of candidates) {
|
|
19
61
|
if (existing.id === newMemory.id)
|
|
20
62
|
continue;
|
|
21
63
|
const similarity = contentOverlap(existing.content, newMemory.content);
|
|
22
64
|
if (similarity > 0.8) {
|
|
23
|
-
// Merge: update existing with new content + fresh vector
|
|
24
65
|
existing.content = newMemory.content;
|
|
25
66
|
existing.access_count++;
|
|
26
67
|
existing.last_accessed = new Date().toISOString();
|
|
27
|
-
//
|
|
68
|
+
saveMemory(existing); // persist before embed (survives embed failure)
|
|
28
69
|
const vec = await embed(existing.content);
|
|
29
|
-
if (vec)
|
|
70
|
+
if (vec) {
|
|
30
71
|
existing.vector = Array.from(vec);
|
|
31
|
-
|
|
72
|
+
saveMemory(existing); // re-save with fresh vector
|
|
73
|
+
}
|
|
32
74
|
store.remove(existing.id);
|
|
33
75
|
store.add(existing);
|
|
34
76
|
return existing;
|
|
@@ -62,50 +104,52 @@ export function autoDecay(memory) {
|
|
|
62
104
|
return 0.2;
|
|
63
105
|
return 0; // archive
|
|
64
106
|
}
|
|
65
|
-
/**
|
|
66
|
-
|
|
67
|
-
const setA = new Set(a.toLowerCase().split(/\s+/).filter((w) => w.length > 2));
|
|
68
|
-
const setB = new Set(b.toLowerCase().split(/\s+/).filter((w) => w.length > 2));
|
|
69
|
-
if (setA.size === 0 || setB.size === 0)
|
|
70
|
-
return 0;
|
|
71
|
-
let intersection = 0;
|
|
72
|
-
for (const w of setA) {
|
|
73
|
-
if (setB.has(w))
|
|
74
|
-
intersection++;
|
|
75
|
-
}
|
|
76
|
-
return intersection / Math.min(setA.size, setB.size);
|
|
77
|
-
}
|
|
78
|
-
/** 生成上下文摘要给 Agent 注入 */
|
|
107
|
+
/** 生成上下文摘要给 Agent 注入。
|
|
108
|
+
* Recency 主导排序(最近使用的优先),分类衰减作 tiebreaker,priority=10 常青保护。 */
|
|
79
109
|
export function generateContextSummary(store, limit = 5) {
|
|
80
|
-
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"general": 1.0,
|
|
110
|
+
// Category half-life (days) — YourMemory-style decay rates.
|
|
111
|
+
// Strategic decisions decay slowly, casual notes decay fast.
|
|
112
|
+
const CATEGORY_HALFLIFE = {
|
|
113
|
+
"decision-log": 38,
|
|
114
|
+
"project-context": 30,
|
|
115
|
+
"user-preference": 24,
|
|
116
|
+
"code-pattern": 20,
|
|
117
|
+
"session-transcript": 0, // excluded from context injection
|
|
118
|
+
"general": 14,
|
|
90
119
|
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
120
|
+
const now = Date.now();
|
|
121
|
+
// Widen pool (3× limit) so recency reordering has room
|
|
122
|
+
const pool = store.list({ limit: Math.max(limit * 3, 50), offset: 0 });
|
|
123
|
+
// Filter out excluded categories
|
|
124
|
+
const eligible = pool.filter((m) => {
|
|
125
|
+
const hl = CATEGORY_HALFLIFE[m.category];
|
|
126
|
+
return hl === undefined || hl > 0;
|
|
127
|
+
});
|
|
128
|
+
// Split: evergreen (priority=10, force-include) vs normal
|
|
129
|
+
const evergreen = eligible.filter((m) => m.priority >= 10);
|
|
130
|
+
const normal = eligible.filter((m) => m.priority < 10);
|
|
131
|
+
// Sort normal: recency first (last_accessed > created_at), decay as tiebreaker
|
|
132
|
+
normal.sort((a, b) => {
|
|
98
133
|
const aTime = a.last_accessed ? new Date(a.last_accessed).getTime() : new Date(a.created_at).getTime();
|
|
99
134
|
const bTime = b.last_accessed ? new Date(b.last_accessed).getTime() : new Date(b.created_at).getTime();
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
135
|
+
// Recency primary: newer first
|
|
136
|
+
if (bTime !== aTime)
|
|
137
|
+
return bTime - aTime;
|
|
138
|
+
// Same recency → category decay × priority decider
|
|
139
|
+
const aDays = (now - aTime) / 86400000;
|
|
140
|
+
const bDays = (now - bTime) / 86400000;
|
|
141
|
+
const aHalf = CATEGORY_HALFLIFE[a.category] ?? 14;
|
|
142
|
+
const bHalf = CATEGORY_HALFLIFE[b.category] ?? 14;
|
|
143
|
+
const aDecay = Math.pow(0.5, aDays / aHalf);
|
|
144
|
+
const bDecay = Math.pow(0.5, bDays / bHalf);
|
|
145
|
+
const aScore = aDecay * (a.priority || 5);
|
|
146
|
+
const bScore = bDecay * (b.priority || 5);
|
|
147
|
+
return bScore - aScore;
|
|
107
148
|
});
|
|
108
|
-
//
|
|
149
|
+
// Merge: evergreen first (priority desc), then recency-sorted normal
|
|
150
|
+
evergreen.sort((a, b) => (b.priority || 10) - (a.priority || 10));
|
|
151
|
+
const ranked = [...evergreen, ...normal];
|
|
152
|
+
// Dedup: skip entries too similar to ones already selected
|
|
109
153
|
const top = [];
|
|
110
154
|
for (const m of ranked) {
|
|
111
155
|
if (top.some((t) => contentOverlap(t.content, m.content) > 0.6))
|
|
@@ -134,10 +178,7 @@ export function generateContextSummary(store, limit = 5) {
|
|
|
134
178
|
lines.push(`- [${m.name}] ${dateStr} | ${m.category}\n ${preview}`);
|
|
135
179
|
}
|
|
136
180
|
// Token budget note: tell agent if context is truncated
|
|
137
|
-
const eligibleTotal =
|
|
138
|
-
const boost = CATEGORY_BOOST[m.category];
|
|
139
|
-
return boost !== undefined ? boost > 0 : true;
|
|
140
|
-
}).length;
|
|
181
|
+
const eligibleTotal = eligible.length;
|
|
141
182
|
if (eligibleTotal > limit) {
|
|
142
183
|
lines.push("", `[MemoryForge] Showing top ${limit} of ${eligibleTotal} eligible memories. ` +
|
|
143
184
|
`Use memory_search or memory_recall to find more.`);
|
|
@@ -181,7 +222,7 @@ function smartPreview(content, maxLen) {
|
|
|
181
222
|
if (meaningful.length === 0) {
|
|
182
223
|
// No meaningful paragraphs found — raw truncation
|
|
183
224
|
return content.length > maxLen
|
|
184
|
-
? content
|
|
225
|
+
? safeTruncate(content, maxLen).replace(/\n/g, " ").trim() + "…"
|
|
185
226
|
: content;
|
|
186
227
|
}
|
|
187
228
|
// Build preview from first meaningful paragraph(s)
|
|
@@ -195,7 +236,7 @@ function smartPreview(content, maxLen) {
|
|
|
195
236
|
// First paragraph is too long — truncate at sentence boundary
|
|
196
237
|
const cutoff = meaningful[i].slice(0, maxLen);
|
|
197
238
|
const m = cutoff.match(/[.!?。!?]/g);
|
|
198
|
-
const lastPunct = m ?
|
|
239
|
+
const lastPunct = m ? Math.max(...m.map((p) => cutoff.lastIndexOf(p))) + 1 : 0;
|
|
199
240
|
return (lastPunct > maxLen * 0.5 ? cutoff.slice(0, lastPunct) : cutoff.slice(0, maxLen)).trim() + "…";
|
|
200
241
|
}
|
|
201
242
|
else {
|
package/dist/auto/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auto/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auto/index.ts"],"names":[],"mappings":"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"}
|
package/dist/embedding.d.ts
CHANGED
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
* 延迟加载: 首次调用时加载模型,后续毫秒级。
|
|
4
4
|
* 降级: 加载失败 → 返回 null,memory_search 自动回退到关键词匹配。
|
|
5
5
|
*/
|
|
6
|
-
/** 重试模型加载(后台调用,不阻塞) */
|
|
7
|
-
export declare function retryEmbedder(): void;
|
|
8
6
|
export declare function embed(text: string): Promise<Float32Array | null>;
|
|
9
7
|
/** 预加载模型(后台运行,不阻塞) */
|
|
10
8
|
export declare function preload(): void;
|
package/dist/embedding.js
CHANGED
|
@@ -20,8 +20,20 @@ async function getEmbedder() {
|
|
|
20
20
|
return loading;
|
|
21
21
|
loading = (async () => {
|
|
22
22
|
try {
|
|
23
|
+
console.error("[MemoryForge] Loading embedding model (~23MB, one-time download)…");
|
|
23
24
|
const { pipeline } = await import("@huggingface/transformers");
|
|
24
|
-
const engine = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2"
|
|
25
|
+
const engine = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2", {
|
|
26
|
+
progress_callback: (progress) => {
|
|
27
|
+
if (progress?.status === "downloading") {
|
|
28
|
+
const pct = progress?.progress ? Math.round(progress.progress) : 0;
|
|
29
|
+
const file = progress?.file ?? "";
|
|
30
|
+
if (pct > 0)
|
|
31
|
+
process.stderr.write(`\r[MemoryForge] Downloading model… ${pct}%`);
|
|
32
|
+
if (pct === 100)
|
|
33
|
+
process.stderr.write("\n");
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
});
|
|
25
37
|
embedFn = async (text) => {
|
|
26
38
|
const result = await engine(text, { pooling: "mean", normalize: true });
|
|
27
39
|
return new Float32Array(result.data);
|
|
@@ -39,17 +51,6 @@ async function getEmbedder() {
|
|
|
39
51
|
})();
|
|
40
52
|
return loading;
|
|
41
53
|
}
|
|
42
|
-
/** 重试模型加载(后台调用,不阻塞) */
|
|
43
|
-
export function retryEmbedder() {
|
|
44
|
-
if (!embedFn || lastAttempt === 0)
|
|
45
|
-
return;
|
|
46
|
-
if (Date.now() - lastAttempt < RETRY_MS)
|
|
47
|
-
return;
|
|
48
|
-
console.error("[MemoryForge] Retrying embedding model download...");
|
|
49
|
-
embedFn = null;
|
|
50
|
-
loading = null;
|
|
51
|
-
getEmbedder();
|
|
52
|
-
}
|
|
53
54
|
export async function embed(text) {
|
|
54
55
|
const fn = await getEmbedder();
|
|
55
56
|
try {
|
package/dist/embedding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../src/embedding.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,IAAI,OAAO,GAAmB,IAAI,CAAC;AACnC,IAAI,OAAO,GAA4B,IAAI,CAAC;AAC5C,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,mCAAmC;AAE7D,KAAK,UAAU,WAAW;IACxB,2EAA2E;IAC3E,IAAI,OAAO,IAAI,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,IAAI,QAAQ,EAAE,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,GAAG,IAAI,CAAC;QACf,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../src/embedding.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,IAAI,OAAO,GAAmB,IAAI,CAAC;AACnC,IAAI,OAAO,GAA4B,IAAI,CAAC;AAC5C,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,mCAAmC;AAE7D,KAAK,UAAU,WAAW;IACxB,2EAA2E;IAC3E,IAAI,OAAO,IAAI,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,IAAI,QAAQ,EAAE,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,GAAG,IAAI,CAAC;QACf,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;QACpB,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACnF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,yBAAyB,EAAE;gBAC7E,iBAAiB,EAAE,CAAC,QAAa,EAAE,EAAE;oBACnC,IAAI,QAAQ,EAAE,MAAM,KAAK,aAAa,EAAE,CAAC;wBACvC,MAAM,GAAG,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnE,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;wBAClC,IAAI,GAAG,GAAG,CAAC;4BAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,GAAG,GAAG,CAAC,CAAC;wBAChF,IAAI,GAAG,KAAK,GAAG;4BAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;YACH,OAAO,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;gBAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxE,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC,CAAC;YACF,WAAW,GAAG,CAAC,CAAC;YAChB,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YACvF,OAAO,CAAC,KAAK,CAAC,4DAA4D,QAAQ,GAAG,IAAI,KAAK,CAAC,CAAC;YAChG,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY;IACtC,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,sBAAsB;AACtB,MAAM,UAAU,OAAO;IACrB,WAAW,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* MemoryForge — AI Agent 持久记忆引擎 (MVP)
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* 9 MCP tools + 5 auto-engines + Pro Shelby cloud sync.
|
|
6
|
+
* Embedding: Transformers.js (23MB, in-process).
|
|
7
|
+
* Storage: Free = local Markdown; Pro = Shelby cloud.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* Quick start:
|
|
10
|
+
* npx memory-forge setup
|
|
11
11
|
*/
|
|
12
12
|
export {};
|