@zooique/memora 0.1.0 → 0.2.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/agent/agent.d.ts +155 -23
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +386 -124
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +8 -2
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +17 -6
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +1 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +5 -3
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +1 -1
- package/dist/agent/builtinTools.js +2 -2
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/constants.d.ts +27 -6
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +27 -6
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +35 -9
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +138 -25
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/loop.d.ts +41 -11
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +143 -61
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +100 -0
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -0
- package/dist/agent/managers/archiveCoordinator.js +127 -0
- package/dist/agent/managers/archiveCoordinator.js.map +1 -0
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.js +1 -1
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
- package/dist/agent/managers/configManager.d.ts +13 -2
- package/dist/agent/managers/configManager.d.ts.map +1 -1
- package/dist/agent/managers/configManager.js +13 -5
- package/dist/agent/managers/configManager.js.map +1 -1
- package/dist/agent/managers/insightExtractor.d.ts +36 -3
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +48 -11
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/memoryAdvisor.d.ts +4 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +6 -4
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +113 -0
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -0
- package/dist/agent/managers/memoryDecayScheduler.js +134 -0
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +70 -10
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +97 -23
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +77 -0
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -0
- package/dist/agent/managers/sessionArchiver.js +175 -0
- package/dist/agent/managers/sessionArchiver.js.map +1 -0
- package/dist/agent/managers/sessionManager.d.ts +10 -0
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +26 -5
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/workProjection.d.ts +1 -1
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +13 -10
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +1 -22
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +3 -19
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/toolExecutor.d.ts +5 -18
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +7 -7
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +8 -1
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +8 -1
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +29 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/{managers/userFactExtractor.d.ts → userFactExtractor.d.ts} +2 -2
- package/dist/agent/userFactExtractor.d.ts.map +1 -0
- package/dist/agent/userFactExtractor.js.map +1 -0
- package/dist/config/loader.d.ts +4 -4
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +11 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalTypes.js +1 -1
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +8 -6
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +2 -1
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +9 -0
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +77 -33
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +17 -3
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +6 -2
- package/dist/llm/provider.js.map +1 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +25 -9
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/hybridMerge.d.ts +54 -0
- package/dist/memory/hybridMerge.d.ts.map +1 -0
- package/dist/memory/hybridMerge.js +36 -0
- package/dist/memory/hybridMerge.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +90 -15
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +179 -28
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/loader.js +1 -1
- package/dist/memory/loader.js.map +1 -1
- package/dist/memory/projectManager.d.ts +34 -5
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +98 -62
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/recall.d.ts +7 -18
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +14 -19
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +81 -14
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/store.js +1 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +7 -1
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +5 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/userProfile.d.ts +6 -6
- package/dist/memory/userProfile.d.ts.map +1 -1
- package/dist/memory/userProfile.js +20 -15
- package/dist/memory/userProfile.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +35 -0
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +111 -2
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +17 -4
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +44 -12
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/security/pathGuard.d.ts +29 -7
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +148 -81
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillManager.d.ts +15 -0
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +25 -3
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/types.d.ts +7 -1
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/utils/errors.d.ts +26 -7
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +10 -18
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +9 -2
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +1 -1
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +8 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +14 -3
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/path.d.ts +5 -1
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +5 -1
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/safeTimer.d.ts +19 -0
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +27 -0
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/segmenter.d.ts +0 -12
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +8 -3
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +1 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +4 -2
- package/dist/utils/strings.js.map +1 -1
- package/package.json +1 -1
- package/dist/agent/managers/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/managers/userFactExtractor.js.map +0 -1
- /package/dist/agent/{managers/userFactExtractor.js → userFactExtractor.js} +0 -0
package/dist/memory/types.d.ts
CHANGED
|
@@ -8,7 +8,9 @@ import { z } from 'zod';
|
|
|
8
8
|
/**
|
|
9
9
|
* 记忆基元 schema
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* 8 个核心字段(v2.1 软删除扩展),无封闭枚举
|
|
12
|
+
* - 7 个基础字段:id/content/source/name/createdAt/accessedAt/score
|
|
13
|
+
* - 1 个可选字段:deletedAt(软删除时间,undefined 表示活跃记忆)
|
|
12
14
|
*/
|
|
13
15
|
export declare const MemorySchema: z.ZodObject<{
|
|
14
16
|
/** 唯一标识(source:name,如 'rule:core'、'insight:1718083200000') */
|
|
@@ -25,6 +27,8 @@ export declare const MemorySchema: z.ZodObject<{
|
|
|
25
27
|
accessedAt: z.ZodString;
|
|
26
28
|
/** 权重(0-1,召回时用于排序) */
|
|
27
29
|
score: z.ZodDefault<z.ZodNumber>;
|
|
30
|
+
/** 软删除时间(ISO 8601,可选;非 undefined 表示已软删除,回收站保留 30 天后自动物理清理) */
|
|
31
|
+
deletedAt: z.ZodOptional<z.ZodString>;
|
|
28
32
|
}, "strip", z.ZodTypeAny, {
|
|
29
33
|
id: string;
|
|
30
34
|
content: string;
|
|
@@ -33,6 +37,7 @@ export declare const MemorySchema: z.ZodObject<{
|
|
|
33
37
|
createdAt: string;
|
|
34
38
|
accessedAt: string;
|
|
35
39
|
score: number;
|
|
40
|
+
deletedAt?: string | undefined;
|
|
36
41
|
}, {
|
|
37
42
|
id: string;
|
|
38
43
|
content: string;
|
|
@@ -41,6 +46,7 @@ export declare const MemorySchema: z.ZodObject<{
|
|
|
41
46
|
createdAt: string;
|
|
42
47
|
accessedAt: string;
|
|
43
48
|
score?: number | undefined;
|
|
49
|
+
deletedAt?: string | undefined;
|
|
44
50
|
}>;
|
|
45
51
|
export type Memory = z.infer<typeof MemorySchema>;
|
|
46
52
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;IACvB,8DAA8D;;IAE9D,wBAAwB;;IAExB,sBAAsB;;IAEtB,qBAAqB;;IAErB,qBAAqB;;IAErB,sBAAsB;;IAEtB,sBAAsB;;IAEtB,8DAA8D;;;;;;;;;;;;;;;;;;;;EAE9D,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD;;;;;GAKG;AACH,eAAO,MAAM,aAAa;IACxB,uCAAuC;;IAEvC,yDAAyD;;IAEzD,qCAAqC;;IAErC,2BAA2B;;IAE3B,2BAA2B;;IAE3B,+BAA+B;;IAE/B,iDAAiD;;CAEzC,CAAC;AAIX;;;GAGG;AACH,eAAO,MAAM,SAAS,aAOpB,CAAC;AAIH;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAWhF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAYD;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,MAAM,CAAC;AAExD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAC9C,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAgDA;AAoCD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAEjE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;IAC3B,wBAAwB;;IAExB,oBAAoB;;IAEpB,8BAA8B;;IAE9B,oBAAoB;;IAEpB,sBAAsB;;CAEd,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,cAAc;IACzB,eAAe;;IAEf,aAAa;;IAEb,eAAe;;IAEf,gBAAgB;;IAEhB,aAAa;;IAEb,gBAAgB;;CAER,CAAC"}
|
package/dist/memory/types.js
CHANGED
|
@@ -9,7 +9,9 @@ import { z } from 'zod';
|
|
|
9
9
|
/**
|
|
10
10
|
* 记忆基元 schema
|
|
11
11
|
*
|
|
12
|
-
*
|
|
12
|
+
* 8 个核心字段(v2.1 软删除扩展),无封闭枚举
|
|
13
|
+
* - 7 个基础字段:id/content/source/name/createdAt/accessedAt/score
|
|
14
|
+
* - 1 个可选字段:deletedAt(软删除时间,undefined 表示活跃记忆)
|
|
13
15
|
*/
|
|
14
16
|
export const MemorySchema = z.object({
|
|
15
17
|
/** 唯一标识(source:name,如 'rule:core'、'insight:1718083200000') */
|
|
@@ -26,6 +28,8 @@ export const MemorySchema = z.object({
|
|
|
26
28
|
accessedAt: z.string().datetime(),
|
|
27
29
|
/** 权重(0-1,召回时用于排序) */
|
|
28
30
|
score: z.number().min(0).max(1).default(0.5),
|
|
31
|
+
/** 软删除时间(ISO 8601,可选;非 undefined 表示已软删除,回收站保留 30 天后自动物理清理) */
|
|
32
|
+
deletedAt: z.string().datetime().optional(),
|
|
29
33
|
});
|
|
30
34
|
// ─── source 标签约定(非枚举,仅为泊文当前使用的约定) ──────
|
|
31
35
|
/**
|
package/dist/memory/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,yDAAyD;AAEzD
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,7 +56,7 @@ export declare class UserProfile {
|
|
|
56
56
|
* 存储中只保存已确认的条目(confirmed = true),
|
|
57
57
|
* 待确认条目仅存内存缓存,不写入存储。
|
|
58
58
|
*
|
|
59
|
-
*
|
|
59
|
+
* content 字段使用 JSON 编码存储 category + value 元数据,
|
|
60
60
|
* 兼容旧格式(name 字段 "${category}: ${value}")作为降级路径。
|
|
61
61
|
*/
|
|
62
62
|
load(): Promise<UserProfileEntry[]>;
|
|
@@ -69,7 +69,7 @@ export declare class UserProfile {
|
|
|
69
69
|
*
|
|
70
70
|
* @param facts 由 extractUserFacts() 提取的事实列表
|
|
71
71
|
*/
|
|
72
|
-
archiveFacts(facts: ExtractedFact[]): Promise<
|
|
72
|
+
archiveFacts(facts: ExtractedFact[]): Promise<UserProfileEntry[]>;
|
|
73
73
|
/**
|
|
74
74
|
* 获取所有已确认的画像条目(system prompt 注入用)
|
|
75
75
|
*/
|
|
@@ -123,8 +123,8 @@ export declare class UserProfile {
|
|
|
123
123
|
* 当用户说"我叫李四"替换之前的"我叫张三"时,移除旧的 identity 条目。
|
|
124
124
|
* 策略:同分类(category)下,新值替换旧值。判断标准是旧条目的 value 前缀。
|
|
125
125
|
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
126
|
+
* 从 content JSON 解码 category,替代 name 字段隐式解析。
|
|
127
|
+
* 构建 contentPrefix → entry 的 Map 索引,冲突检测从 O(n*m) 降为 O(m)。
|
|
128
128
|
*
|
|
129
129
|
* @param fact 当前提取到的新事实
|
|
130
130
|
*/
|
|
@@ -132,7 +132,7 @@ export declare class UserProfile {
|
|
|
132
132
|
/**
|
|
133
133
|
* 将 UserProfileEntry 转为 Memory(用于写入 SQLite)
|
|
134
134
|
*
|
|
135
|
-
*
|
|
135
|
+
* content 字段使用 JSON 编码存储 category + value 元数据,
|
|
136
136
|
* name 字段为固定可读标签,category 通过 content 的 JSON 元数据显式编码。
|
|
137
137
|
* 确认状态:仅已确认条目调用此方法(待确认条目不写入存储)
|
|
138
138
|
*/
|
|
@@ -140,7 +140,7 @@ export declare class UserProfile {
|
|
|
140
140
|
/**
|
|
141
141
|
* 从 content 字段解析 category 和 value
|
|
142
142
|
*
|
|
143
|
-
*
|
|
143
|
+
* 优先从 content JSON 解码元数据,降级到旧格式 name 字段解析,
|
|
144
144
|
* 确保已有 SQLite 数据(旧格式 name="${category}: ${value}")兼容加载。
|
|
145
145
|
*
|
|
146
146
|
* @param content Memory 的 content 字段(新格式为 JSON,旧格式为纯 value)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userProfile.d.ts","sourceRoot":"","sources":["../../src/memory/userProfile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"userProfile.d.ts","sourceRoot":"","sources":["../../src/memory/userProfile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAOnE,cAAc;AACd,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAE5F,aAAa;AACb,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,UAAU;IACV,QAAQ,EAAE,eAAe,CAAC;IAC1B,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+BAA+B;AAC/B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,4BAA4B;IAC5B,OAAO,CAAC,KAAK,CAA4C;gBAE5B,KAAK,EAAE,cAAc;IAElD;;;;;;;;OAQG;IACG,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgCzC;;;;;;;;OAQG;IACG,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAYvE;;OAEG;IACH,YAAY,IAAI,gBAAgB,EAAE;IAIlC;;;;;OAKG;IACH,UAAU,IAAI,gBAAgB,EAAE;IAIhC;;;;;;;;;OASG;IACH,iBAAiB,IAAI,MAAM;IA0B3B;;;;;;OAMG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxC;;;;OAIG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavC;;;;;;;;;OASG;YACW,UAAU;IA2CxB;;;;;;;;;;OAUG;YACW,wBAAwB;IA+CtC;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;IAahB;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACH,OAAO,CAAC,aAAa;CAUtB"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SOURCE_LABELS } from '../memory/types.js';
|
|
2
2
|
import { logger } from '../logging/logger.js';
|
|
3
3
|
import { slugify } from '../utils/strings.js';
|
|
4
|
-
import { toError } from '../utils/
|
|
4
|
+
import { toError } from '../utils/toError.js';
|
|
5
|
+
import { nowIso } from '../utils/time.js';
|
|
5
6
|
/**
|
|
6
7
|
* 用户画像管理器
|
|
7
8
|
*/
|
|
@@ -18,14 +19,14 @@ export class UserProfile {
|
|
|
18
19
|
* 存储中只保存已确认的条目(confirmed = true),
|
|
19
20
|
* 待确认条目仅存内存缓存,不写入存储。
|
|
20
21
|
*
|
|
21
|
-
*
|
|
22
|
+
* content 字段使用 JSON 编码存储 category + value 元数据,
|
|
22
23
|
* 兼容旧格式(name 字段 "${category}: ${value}")作为降级路径。
|
|
23
24
|
*/
|
|
24
25
|
async load() {
|
|
25
26
|
const memories = this.index.getBySource(SOURCE_LABELS.PROFILE);
|
|
26
27
|
const entries = [];
|
|
27
28
|
for (const m of memories) {
|
|
28
|
-
//
|
|
29
|
+
// 优先从 content JSON 解码,降级到旧格式 name 解析
|
|
29
30
|
const parsed = this.parseContentField(m.content, m.name);
|
|
30
31
|
const entry = {
|
|
31
32
|
id: m.id,
|
|
@@ -56,15 +57,16 @@ export class UserProfile {
|
|
|
56
57
|
* @param facts 由 extractUserFacts() 提取的事实列表
|
|
57
58
|
*/
|
|
58
59
|
async archiveFacts(facts) {
|
|
60
|
+
// 返回写入的条目列表(供 Agent 发射 memoryAdded 事件)
|
|
59
61
|
if (facts.length === 0)
|
|
60
|
-
return
|
|
61
|
-
|
|
62
|
+
return [];
|
|
63
|
+
const written = [];
|
|
62
64
|
for (const fact of facts) {
|
|
63
65
|
const entry = await this.upsertFact(fact);
|
|
64
66
|
if (entry)
|
|
65
|
-
|
|
67
|
+
written.push(entry);
|
|
66
68
|
}
|
|
67
|
-
return
|
|
69
|
+
return written;
|
|
68
70
|
}
|
|
69
71
|
/**
|
|
70
72
|
* 获取所有已确认的画像条目(system prompt 注入用)
|
|
@@ -167,7 +169,7 @@ export class UserProfile {
|
|
|
167
169
|
source: fact.sourceTurn,
|
|
168
170
|
weight: 1.0,
|
|
169
171
|
confirmed: fact.confidence >= 0.8, // 高置信度直接确认
|
|
170
|
-
updatedAt:
|
|
172
|
+
updatedAt: nowIso(),
|
|
171
173
|
};
|
|
172
174
|
try {
|
|
173
175
|
// 仅已确认条目写入存储(待确认条目仅存内存缓存)
|
|
@@ -195,8 +197,8 @@ export class UserProfile {
|
|
|
195
197
|
* 当用户说"我叫李四"替换之前的"我叫张三"时,移除旧的 identity 条目。
|
|
196
198
|
* 策略:同分类(category)下,新值替换旧值。判断标准是旧条目的 value 前缀。
|
|
197
199
|
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
+
* 从 content JSON 解码 category,替代 name 字段隐式解析。
|
|
201
|
+
* 构建 contentPrefix → entry 的 Map 索引,冲突检测从 O(n*m) 降为 O(m)。
|
|
200
202
|
*
|
|
201
203
|
* @param fact 当前提取到的新事实
|
|
202
204
|
*/
|
|
@@ -205,10 +207,10 @@ export class UserProfile {
|
|
|
205
207
|
const existing = this.index.getBySource(SOURCE_LABELS.PROFILE);
|
|
206
208
|
// 提取新事实的核心模式(如 "姓名: 李四" → 前缀 "姓名")
|
|
207
209
|
const newPrefix = (fact.value.split(':')[0] ?? '').trim();
|
|
208
|
-
//
|
|
210
|
+
// 构建 contentPrefix → Memory 的 Map 索引,冲突检测降为 O(m)
|
|
209
211
|
const prefixIndex = new Map();
|
|
210
212
|
for (const m of existing) {
|
|
211
|
-
//
|
|
213
|
+
// 从 content JSON 解码 category,替代 parseNameField
|
|
212
214
|
const parsed = this.parseContentField(m.content, m.name);
|
|
213
215
|
if (parsed.category !== fact.category)
|
|
214
216
|
continue;
|
|
@@ -232,6 +234,9 @@ export class UserProfile {
|
|
|
232
234
|
const parsed = this.parseContentField(m.content, m.name);
|
|
233
235
|
if (parsed.value !== fact.value) {
|
|
234
236
|
this.index.delete(m.id);
|
|
237
|
+
// BUGFIX: 同步删除内存缓存中的旧条目,避免"只删 storage 不删 cache"
|
|
238
|
+
// 导致 getConfirmed() 仍返回已被替换的旧值(如"我叫张三"→"我叫李四"后张三仍在)
|
|
239
|
+
this.cache.delete(m.id);
|
|
235
240
|
logger.info({ oldId: m.id, oldValue: parsed.value, newValue: fact.value }, '用户画像冲突已解决');
|
|
236
241
|
}
|
|
237
242
|
}
|
|
@@ -245,12 +250,12 @@ export class UserProfile {
|
|
|
245
250
|
/**
|
|
246
251
|
* 将 UserProfileEntry 转为 Memory(用于写入 SQLite)
|
|
247
252
|
*
|
|
248
|
-
*
|
|
253
|
+
* content 字段使用 JSON 编码存储 category + value 元数据,
|
|
249
254
|
* name 字段为固定可读标签,category 通过 content 的 JSON 元数据显式编码。
|
|
250
255
|
* 确认状态:仅已确认条目调用此方法(待确认条目不写入存储)
|
|
251
256
|
*/
|
|
252
257
|
toMemory(entry) {
|
|
253
|
-
const now =
|
|
258
|
+
const now = nowIso();
|
|
254
259
|
return {
|
|
255
260
|
id: entry.id,
|
|
256
261
|
content: JSON.stringify({ category: entry.category, value: entry.value }),
|
|
@@ -264,7 +269,7 @@ export class UserProfile {
|
|
|
264
269
|
/**
|
|
265
270
|
* 从 content 字段解析 category 和 value
|
|
266
271
|
*
|
|
267
|
-
*
|
|
272
|
+
* 优先从 content JSON 解码元数据,降级到旧格式 name 字段解析,
|
|
268
273
|
* 确保已有 SQLite 数据(旧格式 name="${category}: ${value}")兼容加载。
|
|
269
274
|
*
|
|
270
275
|
* @param content Memory 的 content 字段(新格式为 JSON,旧格式为纯 value)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userProfile.js","sourceRoot":"","sources":["../../src/memory/userProfile.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"userProfile.js","sourceRoot":"","sources":["../../src/memory/userProfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,24 +29,53 @@ export declare class VectorStore {
|
|
|
29
29
|
private dimension;
|
|
30
30
|
/** 是否有未持久化的变更 */
|
|
31
31
|
private dirty;
|
|
32
|
+
/**
|
|
33
|
+
* 串行化 save 调用的 Promise 链
|
|
34
|
+
*
|
|
35
|
+
* 防止并发 save 互相覆盖:每个 save 等待前一个完成后再执行。
|
|
36
|
+
* 无并发时为 null,有并发时为正在执行的 Promise。
|
|
37
|
+
*/
|
|
38
|
+
private savePromise;
|
|
32
39
|
constructor(storePath: string, embeddingProvider: EmbeddingService);
|
|
33
40
|
/**
|
|
34
41
|
* 从 JSON 文件加载向量索引(冷启动)
|
|
42
|
+
*
|
|
43
|
+
* 加固:增加 schema 校验,损坏文件视为"从空开始"
|
|
44
|
+
* 防止部分写入 / 手动编辑错误 / 版本不匹配的文件污染内存索引
|
|
35
45
|
*/
|
|
36
46
|
load(): Promise<void>;
|
|
37
47
|
/**
|
|
38
48
|
* 持久化向量索引到 JSON 文件
|
|
49
|
+
*
|
|
50
|
+
* 加固:串行化并发 save,防止互相覆盖丢失数据。
|
|
51
|
+
* 调用方可在并发场景下安全地多次调用 save,每次都会等待前一次完成。
|
|
52
|
+
*
|
|
53
|
+
* @returns 等待所有挂起 save 完成的 Promise
|
|
39
54
|
*/
|
|
40
55
|
save(): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* 实际执行持久化的内部方法
|
|
58
|
+
*
|
|
59
|
+
* 由 save() 串行化调度,外部不应直接调用
|
|
60
|
+
*/
|
|
61
|
+
private doSave;
|
|
41
62
|
/**
|
|
42
63
|
* 为文本生成向量并存储
|
|
64
|
+
*
|
|
65
|
+
* 加固:维度一致性校验,防止维度错位导致 cosineSimilarity 计算崩溃
|
|
66
|
+
*
|
|
43
67
|
* @param id 记忆 ID
|
|
44
68
|
* @param text 待嵌入的文本
|
|
69
|
+
* @throws {MemoraError} 当 embedding 返回的向量维度与已存维度不一致时抛出 configError
|
|
45
70
|
*/
|
|
46
71
|
upsert(id: string, text: string): Promise<void>;
|
|
47
72
|
/**
|
|
48
73
|
* 批量嵌入并存储
|
|
74
|
+
*
|
|
75
|
+
* 加固:维度一致性校验,与 upsert 同契约
|
|
76
|
+
*
|
|
49
77
|
* @param items ID + 文本对
|
|
78
|
+
* @throws {MemoraError} 当 embedding 返回的向量维度与已存维度不一致时抛出 configError
|
|
50
79
|
*/
|
|
51
80
|
batchUpsert(items: Array<{
|
|
52
81
|
id: string;
|
|
@@ -54,6 +83,12 @@ export declare class VectorStore {
|
|
|
54
83
|
}>): Promise<void>;
|
|
55
84
|
/**
|
|
56
85
|
* 删除向量
|
|
86
|
+
*
|
|
87
|
+
* 注意:此方法仅标记 dirty=true,不会自动调用 save。
|
|
88
|
+
* 调用方需在合适的时机显式调用 save() 持久化删除操作,
|
|
89
|
+
* 否则下次冷启动会重新加载已删除的向量。
|
|
90
|
+
*
|
|
91
|
+
* @param id 待删除的记忆 ID
|
|
57
92
|
*/
|
|
58
93
|
delete(id: string): void;
|
|
59
94
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectorStore.d.ts","sourceRoot":"","sources":["../../src/memory/vectorStore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vectorStore.d.ts","sourceRoot":"","sources":["../../src/memory/vectorStore.ts"],"names":[],"mappings":"AA4BA;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC9B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC,CAAC;CAClF;AAuDD;;;;;;;GAOG;AACH,qBAAa,WAAW;IAmBpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAnBpC,eAAe;IACf,OAAO,CAAC,OAAO,CAA+B;IAE9C,wBAAwB;IACxB,OAAO,CAAC,SAAS,CAAK;IAEtB,iBAAiB;IACjB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;;OAKG;IACH,OAAO,CAAC,WAAW,CAA8B;gBAG9B,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,gBAAgB;IAGtD;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3B;;;;;;;OAOG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B;;;;OAIG;YACW,MAAM;IAepB;;;;;;;;OAQG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBrD;;;;;;;OAOG;IACG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5E;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKxB;;;;;;OAMG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,SAAI,EACR,aAAa,SAAM,GAClB,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAgBrD;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 向量存储 — 纯 JS 实现,内存 + JSON 持久化
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 语义检索的向量索引层:
|
|
5
5
|
* - 存储记忆 ID → 向量的映射
|
|
6
6
|
* - 支持余弦相似度搜索(topK)
|
|
7
7
|
* - 持久化到 JSON 文件(冷启动时加载)
|
|
@@ -11,13 +11,60 @@
|
|
|
11
11
|
* - 单用户本地场景,5k 条记录内纯 JS 余弦相似度 < 10ms
|
|
12
12
|
* - 向量维度由 embedding 模型决定,存储层不关心
|
|
13
13
|
*
|
|
14
|
+
* 加固点:
|
|
15
|
+
* - load() 增加 schema 校验(防止损坏文件污染内存索引)
|
|
16
|
+
* - upsert/batchUpsert 增加维度一致性校验(防止维度错位导致相似度计算崩溃)
|
|
17
|
+
* - save() 串行化(防止并发 save 互相覆盖丢失数据)
|
|
18
|
+
* - delete() JSDoc 明确"需显式 save"约定
|
|
19
|
+
*
|
|
14
20
|
* 详见 ADR-002 · 存储层抽象(向量检索备选方案)
|
|
15
21
|
* 详见 ADR-013 · 记忆归档三步价值过滤
|
|
16
22
|
*/
|
|
17
23
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
18
24
|
import { dirname } from 'node:path';
|
|
19
25
|
import { logger } from '../logging/logger.js';
|
|
26
|
+
import { configError } from '../utils/errors.js';
|
|
20
27
|
import { cosineSimilarity } from '../utils/math.js';
|
|
28
|
+
/**
|
|
29
|
+
* 校验持久化文件是否符合 VectorStoreFile schema
|
|
30
|
+
*
|
|
31
|
+
* 防止损坏文件 / 旧版格式 / 手动编辑错误污染内存索引。
|
|
32
|
+
* 校验项:
|
|
33
|
+
* - 顶层为对象
|
|
34
|
+
* - version === 1(未来版本需迁移逻辑)
|
|
35
|
+
* - dimension 为非负整数
|
|
36
|
+
* - entries 为数组,每个条目含字符串 id 和数字数组 vector
|
|
37
|
+
* - 所有 vector 长度等于 dimension
|
|
38
|
+
*
|
|
39
|
+
* @param data 已 JSON.parse 的对象
|
|
40
|
+
* @returns true 表示通过校验
|
|
41
|
+
*/
|
|
42
|
+
function isValidVectorStoreFile(data) {
|
|
43
|
+
if (typeof data !== 'object' || data === null)
|
|
44
|
+
return false;
|
|
45
|
+
const obj = data;
|
|
46
|
+
if (obj.version !== 1)
|
|
47
|
+
return false;
|
|
48
|
+
if (typeof obj.dimension !== 'number' || !Number.isInteger(obj.dimension) || obj.dimension < 0) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
if (!Array.isArray(obj.entries))
|
|
52
|
+
return false;
|
|
53
|
+
for (const entry of obj.entries) {
|
|
54
|
+
if (typeof entry !== 'object' || entry === null)
|
|
55
|
+
return false;
|
|
56
|
+
const e = entry;
|
|
57
|
+
if (typeof e.id !== 'string' || e.id.length === 0)
|
|
58
|
+
return false;
|
|
59
|
+
if (!Array.isArray(e.vector))
|
|
60
|
+
return false;
|
|
61
|
+
if (!e.vector.every((v) => typeof v === 'number' && Number.isFinite(v)))
|
|
62
|
+
return false;
|
|
63
|
+
if (e.vector.length !== obj.dimension)
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
21
68
|
/**
|
|
22
69
|
* 向量存储
|
|
23
70
|
*
|
|
@@ -35,17 +82,32 @@ export class VectorStore {
|
|
|
35
82
|
dimension = 0;
|
|
36
83
|
/** 是否有未持久化的变更 */
|
|
37
84
|
dirty = false;
|
|
85
|
+
/**
|
|
86
|
+
* 串行化 save 调用的 Promise 链
|
|
87
|
+
*
|
|
88
|
+
* 防止并发 save 互相覆盖:每个 save 等待前一个完成后再执行。
|
|
89
|
+
* 无并发时为 null,有并发时为正在执行的 Promise。
|
|
90
|
+
*/
|
|
91
|
+
savePromise = null;
|
|
38
92
|
constructor(storePath, embeddingProvider) {
|
|
39
93
|
this.storePath = storePath;
|
|
40
94
|
this.embeddingProvider = embeddingProvider;
|
|
41
95
|
}
|
|
42
96
|
/**
|
|
43
97
|
* 从 JSON 文件加载向量索引(冷启动)
|
|
98
|
+
*
|
|
99
|
+
* 加固:增加 schema 校验,损坏文件视为"从空开始"
|
|
100
|
+
* 防止部分写入 / 手动编辑错误 / 版本不匹配的文件污染内存索引
|
|
44
101
|
*/
|
|
45
102
|
async load() {
|
|
46
103
|
try {
|
|
47
104
|
const content = await readFile(this.storePath, 'utf-8');
|
|
48
105
|
const data = JSON.parse(content);
|
|
106
|
+
// schema 校验:损坏 / 格式错误的文件视为"从空开始",避免污染内存索引
|
|
107
|
+
if (!isValidVectorStoreFile(data)) {
|
|
108
|
+
logger.warn({ path: this.storePath }, '向量索引文件格式无效,从空开始');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
49
111
|
this.dimension = data.dimension;
|
|
50
112
|
this.entries.clear();
|
|
51
113
|
for (const entry of data.entries) {
|
|
@@ -55,14 +117,36 @@ export class VectorStore {
|
|
|
55
117
|
logger.info({ count: this.entries.size, dimension: this.dimension }, '向量索引加载完成');
|
|
56
118
|
}
|
|
57
119
|
catch {
|
|
58
|
-
//
|
|
120
|
+
// 文件不存在或 JSON 解析失败,从空开始
|
|
59
121
|
logger.info({ path: this.storePath }, '向量索引文件不存在,从空开始');
|
|
60
122
|
}
|
|
61
123
|
}
|
|
62
124
|
/**
|
|
63
125
|
* 持久化向量索引到 JSON 文件
|
|
126
|
+
*
|
|
127
|
+
* 加固:串行化并发 save,防止互相覆盖丢失数据。
|
|
128
|
+
* 调用方可在并发场景下安全地多次调用 save,每次都会等待前一次完成。
|
|
129
|
+
*
|
|
130
|
+
* @returns 等待所有挂起 save 完成的 Promise
|
|
64
131
|
*/
|
|
65
132
|
async save() {
|
|
133
|
+
// 串行化:若已有 save 在执行,将本次调用追加到链尾
|
|
134
|
+
if (this.savePromise !== null) {
|
|
135
|
+
this.savePromise = this.savePromise.then(() => this.doSave());
|
|
136
|
+
return this.savePromise;
|
|
137
|
+
}
|
|
138
|
+
this.savePromise = this.doSave().finally(() => {
|
|
139
|
+
// 当前链路完成,清空引用以允许下次独立 save
|
|
140
|
+
this.savePromise = null;
|
|
141
|
+
});
|
|
142
|
+
return this.savePromise;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 实际执行持久化的内部方法
|
|
146
|
+
*
|
|
147
|
+
* 由 save() 串行化调度,外部不应直接调用
|
|
148
|
+
*/
|
|
149
|
+
async doSave() {
|
|
66
150
|
if (!this.dirty)
|
|
67
151
|
return;
|
|
68
152
|
const data = {
|
|
@@ -77,20 +161,34 @@ export class VectorStore {
|
|
|
77
161
|
}
|
|
78
162
|
/**
|
|
79
163
|
* 为文本生成向量并存储
|
|
164
|
+
*
|
|
165
|
+
* 加固:维度一致性校验,防止维度错位导致 cosineSimilarity 计算崩溃
|
|
166
|
+
*
|
|
80
167
|
* @param id 记忆 ID
|
|
81
168
|
* @param text 待嵌入的文本
|
|
169
|
+
* @throws {MemoraError} 当 embedding 返回的向量维度与已存维度不一致时抛出 configError
|
|
82
170
|
*/
|
|
83
171
|
async upsert(id, text) {
|
|
84
172
|
const vector = await this.embeddingProvider.embed(text);
|
|
85
173
|
if (this.dimension === 0) {
|
|
86
174
|
this.dimension = vector.length;
|
|
87
175
|
}
|
|
176
|
+
else if (vector.length !== this.dimension) {
|
|
177
|
+
// 维度不一致会破坏 cosineSimilarity 计算(长度不匹配返回 0)
|
|
178
|
+
// 此处主动报错,让调用方感知模型切换或配置错误
|
|
179
|
+
// G-1:统一 MemoraError 体系,提供中文标题 + 排查建议
|
|
180
|
+
throw configError('向量维度不一致', `期望 ${this.dimension},实际 ${vector.length}(id=${id})。可能是 embedding 模型切换导致。`, ['清空 vectors.json 后重试', '检查 embedding 模型是否切换']);
|
|
181
|
+
}
|
|
88
182
|
this.entries.set(id, vector);
|
|
89
183
|
this.dirty = true;
|
|
90
184
|
}
|
|
91
185
|
/**
|
|
92
186
|
* 批量嵌入并存储
|
|
187
|
+
*
|
|
188
|
+
* 加固:维度一致性校验,与 upsert 同契约
|
|
189
|
+
*
|
|
93
190
|
* @param items ID + 文本对
|
|
191
|
+
* @throws {MemoraError} 当 embedding 返回的向量维度与已存维度不一致时抛出 configError
|
|
94
192
|
*/
|
|
95
193
|
async batchUpsert(items) {
|
|
96
194
|
const texts = items.map((item) => item.text);
|
|
@@ -103,12 +201,23 @@ export class VectorStore {
|
|
|
103
201
|
if (this.dimension === 0) {
|
|
104
202
|
this.dimension = result.vector.length;
|
|
105
203
|
}
|
|
204
|
+
else if (result.vector.length !== this.dimension) {
|
|
205
|
+
// 维度不一致会破坏 cosineSimilarity 计算
|
|
206
|
+
// G-1:统一 MemoraError 体系,提供中文标题 + 排查建议
|
|
207
|
+
throw configError('批量插入向量维度不一致', `期望 ${this.dimension},实际 ${result.vector.length}(id=${item.id})`, ['清空 vectors.json 后重试', '检查 embedding 模型是否切换']);
|
|
208
|
+
}
|
|
106
209
|
this.entries.set(item.id, result.vector);
|
|
107
210
|
}
|
|
108
211
|
this.dirty = true;
|
|
109
212
|
}
|
|
110
213
|
/**
|
|
111
214
|
* 删除向量
|
|
215
|
+
*
|
|
216
|
+
* 注意:此方法仅标记 dirty=true,不会自动调用 save。
|
|
217
|
+
* 调用方需在合适的时机显式调用 save() 持久化删除操作,
|
|
218
|
+
* 否则下次冷启动会重新加载已删除的向量。
|
|
219
|
+
*
|
|
220
|
+
* @param id 待删除的记忆 ID
|
|
112
221
|
*/
|
|
113
222
|
delete(id) {
|
|
114
223
|
this.entries.delete(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectorStore.js","sourceRoot":"","sources":["../../src/memory/vectorStore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vectorStore.js","sourceRoot":"","sources":["../../src/memory/vectorStore.ts"],"names":[],"mappings":"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"}
|