memory-forge 0.3.13 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto/index.d.ts +5 -3
- package/dist/auto/index.js +93 -54
- package/dist/auto/index.js.map +1 -1
- package/dist/embedding.js +13 -1
- package/dist/embedding.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +333 -64
- 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 +211 -25
- 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/shelby.d.ts +21 -2
- package/dist/storage/shelby.js +103 -8
- package/dist/storage/shelby.js.map +1 -1
- package/dist/store.d.ts +11 -1
- package/dist/store.js +80 -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,30 +1,70 @@
|
|
|
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
|
-
// Recompute vector for merged content
|
|
28
68
|
const vec = await embed(existing.content);
|
|
29
69
|
if (vec)
|
|
30
70
|
existing.vector = Array.from(vec);
|
|
@@ -62,50 +102,52 @@ export function autoDecay(memory) {
|
|
|
62
102
|
return 0.2;
|
|
63
103
|
return 0; // archive
|
|
64
104
|
}
|
|
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 注入 */
|
|
105
|
+
/** 生成上下文摘要给 Agent 注入。
|
|
106
|
+
* Recency 主导排序(最近使用的优先),分类衰减作 tiebreaker,priority=10 常青保护。 */
|
|
79
107
|
export function generateContextSummary(store, limit = 5) {
|
|
80
|
-
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"general": 1.0,
|
|
108
|
+
// Category half-life (days) — YourMemory-style decay rates.
|
|
109
|
+
// Strategic decisions decay slowly, casual notes decay fast.
|
|
110
|
+
const CATEGORY_HALFLIFE = {
|
|
111
|
+
"decision-log": 38,
|
|
112
|
+
"project-context": 30,
|
|
113
|
+
"user-preference": 24,
|
|
114
|
+
"code-pattern": 20,
|
|
115
|
+
"session-transcript": 0, // excluded from context injection
|
|
116
|
+
"general": 14,
|
|
90
117
|
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
118
|
+
const now = Date.now();
|
|
119
|
+
// Widen pool (3× limit) so recency reordering has room
|
|
120
|
+
const pool = store.list({ limit: Math.max(limit * 3, 50), offset: 0 });
|
|
121
|
+
// Filter out excluded categories
|
|
122
|
+
const eligible = pool.filter((m) => {
|
|
123
|
+
const hl = CATEGORY_HALFLIFE[m.category];
|
|
124
|
+
return hl === undefined || hl > 0;
|
|
125
|
+
});
|
|
126
|
+
// Split: evergreen (priority=10, force-include) vs normal
|
|
127
|
+
const evergreen = eligible.filter((m) => m.priority >= 10);
|
|
128
|
+
const normal = eligible.filter((m) => m.priority < 10);
|
|
129
|
+
// Sort normal: recency first (last_accessed > created_at), decay as tiebreaker
|
|
130
|
+
normal.sort((a, b) => {
|
|
98
131
|
const aTime = a.last_accessed ? new Date(a.last_accessed).getTime() : new Date(a.created_at).getTime();
|
|
99
132
|
const bTime = b.last_accessed ? new Date(b.last_accessed).getTime() : new Date(b.created_at).getTime();
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
133
|
+
// Recency primary: newer first
|
|
134
|
+
if (bTime !== aTime)
|
|
135
|
+
return bTime - aTime;
|
|
136
|
+
// Same recency → category decay × priority decider
|
|
137
|
+
const aDays = (now - aTime) / 86400000;
|
|
138
|
+
const bDays = (now - bTime) / 86400000;
|
|
139
|
+
const aHalf = CATEGORY_HALFLIFE[a.category] ?? 14;
|
|
140
|
+
const bHalf = CATEGORY_HALFLIFE[b.category] ?? 14;
|
|
141
|
+
const aDecay = Math.pow(0.5, aDays / aHalf);
|
|
142
|
+
const bDecay = Math.pow(0.5, bDays / bHalf);
|
|
143
|
+
const aScore = aDecay * (a.priority || 5);
|
|
144
|
+
const bScore = bDecay * (b.priority || 5);
|
|
145
|
+
return bScore - aScore;
|
|
107
146
|
});
|
|
108
|
-
//
|
|
147
|
+
// Merge: evergreen first (priority desc), then recency-sorted normal
|
|
148
|
+
evergreen.sort((a, b) => (b.priority || 10) - (a.priority || 10));
|
|
149
|
+
const ranked = [...evergreen, ...normal];
|
|
150
|
+
// Dedup: skip entries too similar to ones already selected
|
|
109
151
|
const top = [];
|
|
110
152
|
for (const m of ranked) {
|
|
111
153
|
if (top.some((t) => contentOverlap(t.content, m.content) > 0.6))
|
|
@@ -134,10 +176,7 @@ export function generateContextSummary(store, limit = 5) {
|
|
|
134
176
|
lines.push(`- [${m.name}] ${dateStr} | ${m.category}\n ${preview}`);
|
|
135
177
|
}
|
|
136
178
|
// 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;
|
|
179
|
+
const eligibleTotal = eligible.length + evergreen.length;
|
|
141
180
|
if (eligibleTotal > limit) {
|
|
142
181
|
lines.push("", `[MemoryForge] Showing top ${limit} of ${eligibleTotal} eligible memories. ` +
|
|
143
182
|
`Use memory_search or memory_recall to find more.`);
|
|
@@ -181,7 +220,7 @@ function smartPreview(content, maxLen) {
|
|
|
181
220
|
if (meaningful.length === 0) {
|
|
182
221
|
// No meaningful paragraphs found — raw truncation
|
|
183
222
|
return content.length > maxLen
|
|
184
|
-
? content
|
|
223
|
+
? safeTruncate(content, maxLen).replace(/\n/g, " ").trim() + "…"
|
|
185
224
|
: content;
|
|
186
225
|
}
|
|
187
226
|
// Build preview from first meaningful paragraph(s)
|
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.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);
|
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":"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"}
|
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 {};
|