@zooique/memora 1.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/README.en.md +272 -0
  2. package/README.md +150 -38
  3. package/dist/agent/agent.d.ts +257 -115
  4. package/dist/agent/agent.d.ts.map +1 -1
  5. package/dist/agent/agent.js +747 -400
  6. package/dist/agent/agent.js.map +1 -1
  7. package/dist/agent/assembler.d.ts +32 -16
  8. package/dist/agent/assembler.d.ts.map +1 -1
  9. package/dist/agent/assembler.js +83 -47
  10. package/dist/agent/assembler.js.map +1 -1
  11. package/dist/agent/builtinToolHandlers.d.ts +27 -2
  12. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  13. package/dist/agent/builtinToolHandlers.js +78 -5
  14. package/dist/agent/builtinToolHandlers.js.map +1 -1
  15. package/dist/agent/constants.d.ts +4 -0
  16. package/dist/agent/constants.d.ts.map +1 -1
  17. package/dist/agent/constants.js +4 -0
  18. package/dist/agent/constants.js.map +1 -1
  19. package/dist/agent/contextManager.d.ts +8 -0
  20. package/dist/agent/contextManager.d.ts.map +1 -1
  21. package/dist/agent/contextManager.js +7 -2
  22. package/dist/agent/contextManager.js.map +1 -1
  23. package/dist/agent/guardrail.d.ts +4 -2
  24. package/dist/agent/guardrail.d.ts.map +1 -1
  25. package/dist/agent/guardrail.js +13 -5
  26. package/dist/agent/guardrail.js.map +1 -1
  27. package/dist/agent/loop.d.ts +137 -15
  28. package/dist/agent/loop.d.ts.map +1 -1
  29. package/dist/agent/loop.js +449 -270
  30. package/dist/agent/loop.js.map +1 -1
  31. package/dist/agent/managers/archiveCoordinator.d.ts +126 -22
  32. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  33. package/dist/agent/managers/archiveCoordinator.js +239 -44
  34. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  35. package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
  36. package/dist/agent/managers/autoConfigRefiner.js +4 -8
  37. package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
  38. package/dist/agent/managers/chatLockManager.d.ts +116 -0
  39. package/dist/agent/managers/chatLockManager.d.ts.map +1 -0
  40. package/dist/agent/managers/chatLockManager.js +191 -0
  41. package/dist/agent/managers/chatLockManager.js.map +1 -0
  42. package/dist/agent/managers/configManager.d.ts +87 -3
  43. package/dist/agent/managers/configManager.d.ts.map +1 -1
  44. package/dist/agent/managers/configManager.js +139 -2
  45. package/dist/agent/managers/configManager.js.map +1 -1
  46. package/dist/agent/managers/dedupManager.d.ts +169 -0
  47. package/dist/agent/managers/dedupManager.d.ts.map +1 -0
  48. package/dist/agent/managers/dedupManager.js +336 -0
  49. package/dist/agent/managers/dedupManager.js.map +1 -0
  50. package/dist/agent/managers/insightExtractor.d.ts +31 -3
  51. package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
  52. package/dist/agent/managers/insightExtractor.js +130 -59
  53. package/dist/agent/managers/insightExtractor.js.map +1 -1
  54. package/dist/agent/managers/llmJudgeHelper.d.ts +38 -0
  55. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
  56. package/dist/agent/managers/llmJudgeHelper.js +49 -0
  57. package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
  58. package/dist/agent/managers/memoryAdvisor.d.ts +102 -2
  59. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  60. package/dist/agent/managers/memoryAdvisor.js +254 -10
  61. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  62. package/dist/agent/managers/memoryDecayScheduler.d.ts +127 -1
  63. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
  64. package/dist/agent/managers/memoryDecayScheduler.js +283 -4
  65. package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
  66. package/dist/agent/managers/memoryGovernance.d.ts +56 -0
  67. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
  68. package/dist/agent/managers/memoryGovernance.js +63 -0
  69. package/dist/agent/managers/memoryGovernance.js.map +1 -0
  70. package/dist/agent/managers/memoryInspector.d.ts +113 -30
  71. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  72. package/dist/agent/managers/memoryInspector.js +165 -32
  73. package/dist/agent/managers/memoryInspector.js.map +1 -1
  74. package/dist/agent/managers/relationBuilder.d.ts +4 -4
  75. package/dist/agent/managers/relationBuilder.d.ts.map +1 -1
  76. package/dist/agent/managers/relationBuilder.js +5 -4
  77. package/dist/agent/managers/relationBuilder.js.map +1 -1
  78. package/dist/agent/managers/sessionArchiver.d.ts +12 -1
  79. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  80. package/dist/agent/managers/sessionArchiver.js +87 -30
  81. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  82. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  83. package/dist/agent/managers/sessionManager.js +9 -17
  84. package/dist/agent/managers/sessionManager.js.map +1 -1
  85. package/dist/agent/managers/streamAccumulator.d.ts +45 -0
  86. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
  87. package/dist/agent/managers/streamAccumulator.js +40 -0
  88. package/dist/agent/managers/streamAccumulator.js.map +1 -0
  89. package/dist/agent/managers/textPolishManager.d.ts +62 -0
  90. package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
  91. package/dist/agent/managers/textPolishManager.js +96 -0
  92. package/dist/agent/managers/textPolishManager.js.map +1 -0
  93. package/dist/agent/managers/workProjection.d.ts +16 -1
  94. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  95. package/dist/agent/managers/workProjection.js +48 -24
  96. package/dist/agent/managers/workProjection.js.map +1 -1
  97. package/dist/agent/personaMatcher.d.ts +29 -0
  98. package/dist/agent/personaMatcher.d.ts.map +1 -0
  99. package/dist/agent/personaMatcher.js +60 -0
  100. package/dist/agent/personaMatcher.js.map +1 -0
  101. package/dist/agent/toolExecutor.d.ts +24 -4
  102. package/dist/agent/toolExecutor.d.ts.map +1 -1
  103. package/dist/agent/toolExecutor.js +30 -4
  104. package/dist/agent/toolExecutor.js.map +1 -1
  105. package/dist/agent/tracer.d.ts +31 -0
  106. package/dist/agent/tracer.d.ts.map +1 -1
  107. package/dist/agent/tracer.js +31 -0
  108. package/dist/agent/tracer.js.map +1 -1
  109. package/dist/agent/types.d.ts +133 -0
  110. package/dist/agent/types.d.ts.map +1 -1
  111. package/dist/agent/types.js +38 -0
  112. package/dist/agent/types.js.map +1 -1
  113. package/dist/agent/userFactExtractor.d.ts.map +1 -1
  114. package/dist/agent/userFactExtractor.js +7 -0
  115. package/dist/agent/userFactExtractor.js.map +1 -1
  116. package/dist/config/loader.d.ts +124 -236
  117. package/dist/config/loader.d.ts.map +1 -1
  118. package/dist/config/loader.js +296 -118
  119. package/dist/config/loader.js.map +1 -1
  120. package/dist/eval/evalRunner.d.ts +94 -0
  121. package/dist/eval/evalRunner.d.ts.map +1 -0
  122. package/dist/eval/evalRunner.js +141 -0
  123. package/dist/eval/evalRunner.js.map +1 -0
  124. package/dist/eval/evalTypes.d.ts +21 -0
  125. package/dist/eval/evalTypes.d.ts.map +1 -1
  126. package/dist/eval/evalTypes.js +15 -0
  127. package/dist/eval/evalTypes.js.map +1 -1
  128. package/dist/eval/scenarios.d.ts +33 -0
  129. package/dist/eval/scenarios.d.ts.map +1 -0
  130. package/dist/eval/scenarios.js +109 -0
  131. package/dist/eval/scenarios.js.map +1 -0
  132. package/dist/index.d.ts +45 -6
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +45 -5
  135. package/dist/index.js.map +1 -1
  136. package/dist/llm/abortSignal.d.ts +27 -0
  137. package/dist/llm/abortSignal.d.ts.map +1 -0
  138. package/dist/llm/abortSignal.js +44 -0
  139. package/dist/llm/abortSignal.js.map +1 -0
  140. package/dist/llm/embedding.d.ts +13 -12
  141. package/dist/llm/embedding.d.ts.map +1 -1
  142. package/dist/llm/embedding.js +5 -17
  143. package/dist/llm/embedding.js.map +1 -1
  144. package/dist/llm/factory.d.ts +19 -5
  145. package/dist/llm/factory.d.ts.map +1 -1
  146. package/dist/llm/factory.js +19 -37
  147. package/dist/llm/factory.js.map +1 -1
  148. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  149. package/dist/llm/openaiCompatible.js +17 -34
  150. package/dist/llm/openaiCompatible.js.map +1 -1
  151. package/dist/logging/logger.d.ts +3 -1
  152. package/dist/logging/logger.d.ts.map +1 -1
  153. package/dist/logging/logger.js +47 -50
  154. package/dist/logging/logger.js.map +1 -1
  155. package/dist/memory/governance.d.ts +50 -0
  156. package/dist/memory/governance.d.ts.map +1 -0
  157. package/dist/memory/governance.js +70 -0
  158. package/dist/memory/governance.js.map +1 -0
  159. package/dist/memory/hybridMerge.d.ts +0 -4
  160. package/dist/memory/hybridMerge.d.ts.map +1 -1
  161. package/dist/memory/hybridMerge.js +19 -4
  162. package/dist/memory/hybridMerge.js.map +1 -1
  163. package/dist/memory/inMemoryRelationStore.d.ts +7 -0
  164. package/dist/memory/inMemoryRelationStore.d.ts.map +1 -1
  165. package/dist/memory/inMemoryRelationStore.js +15 -0
  166. package/dist/memory/inMemoryRelationStore.js.map +1 -1
  167. package/dist/memory/inMemoryStorage.d.ts +36 -1
  168. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  169. package/dist/memory/inMemoryStorage.js +70 -19
  170. package/dist/memory/inMemoryStorage.js.map +1 -1
  171. package/dist/memory/loader.d.ts +2 -0
  172. package/dist/memory/loader.d.ts.map +1 -1
  173. package/dist/memory/loader.js +8 -1
  174. package/dist/memory/loader.js.map +1 -1
  175. package/dist/memory/lockManager.d.ts +7 -2
  176. package/dist/memory/lockManager.d.ts.map +1 -1
  177. package/dist/memory/lockManager.js +35 -17
  178. package/dist/memory/lockManager.js.map +1 -1
  179. package/dist/memory/projectManager.d.ts +8 -7
  180. package/dist/memory/projectManager.d.ts.map +1 -1
  181. package/dist/memory/projectManager.js +33 -15
  182. package/dist/memory/projectManager.js.map +1 -1
  183. package/dist/memory/projectRegistry.d.ts +34 -1
  184. package/dist/memory/projectRegistry.d.ts.map +1 -1
  185. package/dist/memory/projectRegistry.js +100 -31
  186. package/dist/memory/projectRegistry.js.map +1 -1
  187. package/dist/memory/recall.d.ts +16 -0
  188. package/dist/memory/recall.d.ts.map +1 -1
  189. package/dist/memory/recall.js +35 -20
  190. package/dist/memory/recall.js.map +1 -1
  191. package/dist/memory/relationStore.d.ts +20 -3
  192. package/dist/memory/relationStore.d.ts.map +1 -1
  193. package/dist/memory/sourceValidation.d.ts +17 -0
  194. package/dist/memory/sourceValidation.d.ts.map +1 -1
  195. package/dist/memory/sourceValidation.js +27 -3
  196. package/dist/memory/sourceValidation.js.map +1 -1
  197. package/dist/memory/storageInterface.d.ts +26 -1
  198. package/dist/memory/storageInterface.d.ts.map +1 -1
  199. package/dist/memory/store.d.ts +22 -1
  200. package/dist/memory/store.d.ts.map +1 -1
  201. package/dist/memory/store.js +58 -20
  202. package/dist/memory/store.js.map +1 -1
  203. package/dist/memory/types.d.ts +44 -31
  204. package/dist/memory/types.d.ts.map +1 -1
  205. package/dist/memory/types.js +63 -24
  206. package/dist/memory/types.js.map +1 -1
  207. package/dist/memory/userProfile.d.ts +32 -8
  208. package/dist/memory/userProfile.d.ts.map +1 -1
  209. package/dist/memory/userProfile.js +105 -44
  210. package/dist/memory/userProfile.js.map +1 -1
  211. package/dist/memory/vectorStore.d.ts +16 -8
  212. package/dist/memory/vectorStore.d.ts.map +1 -1
  213. package/dist/memory/vectorStore.js +49 -22
  214. package/dist/memory/vectorStore.js.map +1 -1
  215. package/dist/persona/personaManager.d.ts +38 -63
  216. package/dist/persona/personaManager.d.ts.map +1 -1
  217. package/dist/persona/personaManager.js +136 -202
  218. package/dist/persona/personaManager.js.map +1 -1
  219. package/dist/skill/skillManager.d.ts +11 -57
  220. package/dist/skill/skillManager.d.ts.map +1 -1
  221. package/dist/skill/skillManager.js +46 -141
  222. package/dist/skill/skillManager.js.map +1 -1
  223. package/dist/skill/types.d.ts +2 -3
  224. package/dist/skill/types.d.ts.map +1 -1
  225. package/dist/utils/array.d.ts +24 -0
  226. package/dist/utils/array.d.ts.map +1 -0
  227. package/dist/utils/array.js +24 -0
  228. package/dist/utils/array.js.map +1 -0
  229. package/dist/utils/configResourceManager.d.ts +111 -0
  230. package/dist/utils/configResourceManager.d.ts.map +1 -0
  231. package/dist/utils/configResourceManager.js +148 -0
  232. package/dist/utils/configResourceManager.js.map +1 -0
  233. package/dist/utils/errors.d.ts +27 -8
  234. package/dist/utils/errors.d.ts.map +1 -1
  235. package/dist/utils/errors.js +31 -9
  236. package/dist/utils/errors.js.map +1 -1
  237. package/dist/utils/eventEmitter.d.ts +88 -4
  238. package/dist/utils/eventEmitter.d.ts.map +1 -1
  239. package/dist/utils/eventEmitter.js +23 -0
  240. package/dist/utils/eventEmitter.js.map +1 -1
  241. package/dist/utils/frontmatter.d.ts.map +1 -1
  242. package/dist/utils/frontmatter.js +4 -2
  243. package/dist/utils/frontmatter.js.map +1 -1
  244. package/dist/utils/math.d.ts +11 -0
  245. package/dist/utils/math.d.ts.map +1 -1
  246. package/dist/utils/math.js +17 -0
  247. package/dist/utils/math.js.map +1 -1
  248. package/dist/utils/objects.d.ts +17 -0
  249. package/dist/utils/objects.d.ts.map +1 -0
  250. package/dist/utils/objects.js +19 -0
  251. package/dist/utils/objects.js.map +1 -0
  252. package/dist/utils/segmenter.d.ts +11 -10
  253. package/dist/utils/segmenter.d.ts.map +1 -1
  254. package/dist/utils/segmenter.js +23 -1
  255. package/dist/utils/segmenter.js.map +1 -1
  256. package/dist/utils/strings.d.ts +22 -1
  257. package/dist/utils/strings.d.ts.map +1 -1
  258. package/dist/utils/strings.js +29 -1
  259. package/dist/utils/strings.js.map +1 -1
  260. package/dist/utils/time.d.ts +18 -3
  261. package/dist/utils/time.d.ts.map +1 -1
  262. package/dist/utils/time.js +24 -8
  263. package/dist/utils/time.js.map +1 -1
  264. package/dist/utils/toError.d.ts +8 -4
  265. package/dist/utils/toError.d.ts.map +1 -1
  266. package/dist/utils/toError.js +25 -5
  267. package/dist/utils/toError.js.map +1 -1
  268. package/docs/memora-api-reference.md +1235 -0
  269. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +808 -0
  270. package/package.json +49 -22
  271. package/dist/agent/managers/memoryMutator.d.ts +0 -92
  272. package/dist/agent/managers/memoryMutator.d.ts.map +0 -1
  273. package/dist/agent/managers/memoryMutator.js +0 -94
  274. package/dist/agent/managers/memoryMutator.js.map +0 -1
@@ -0,0 +1,169 @@
1
+ /**
2
+ * 语义去重管理器 — L1 记忆治理子系统
3
+ *
4
+ * 从 MemoryInspector 拆分出来,专责异步 LLM 语义去重。
5
+ * 与 MemoryInspector 的分工:
6
+ * - MemoryInspector:同步读写入口(snapshot/search/stats/writeXxx/relations)
7
+ * - DedupManager:异步 LLM 治理(deduplicateMemories)
8
+ *
9
+ * 拆分理由(SPLIT-3,2026-07-21):
10
+ * - 职责分离——同步读写 vs 异步 LLM 治理是两个独立关注点
11
+ * - 依赖清晰——MemoryInspector 不再依赖 LLM Provider,纯存储读写
12
+ * - 可测试性——去重逻辑独立测试,无需 mock loop/history/advisor
13
+ * - 自包含——去重逻辑(配对 + LLM 判断 + 降级 + prompt)形成自闭合子系统
14
+ *
15
+ * 设计原则:
16
+ * - 静默降级——backgroundProvider 未注入时返回 skippedReason 报告,不抛错
17
+ * - 不物理删除——仅降级 score(→ 0.1),保留可恢复性
18
+ * - 异步执行——不阻塞主对话热路径(由宿主定时任务或用户手动触发)
19
+ *
20
+ * @module agent/managers/dedupManager
21
+ */
22
+ import type { Memory } from '../../memory/types.js';
23
+ import type { IMemoryStorage } from '../../memory/storageInterface.js';
24
+ import type { LlmProvider } from '../../llm/provider.js';
25
+ /** 名称高度相似的候选记忆对(待 LLM 判断语义等价性) */
26
+ export interface DedupPair {
27
+ /** 记忆 A(score 较高,作为保留候选) */
28
+ a: Memory;
29
+ /** 记忆 B(score 较低,作为降级候选) */
30
+ b: Memory;
31
+ /** 名称归一化相似度(0-1,越小越相似) */
32
+ nameSimilarity: number;
33
+ }
34
+ /** LLM 对单对记忆的语义等价判断结果 */
35
+ export interface DedupVerdict {
36
+ /** 是否语义等价(true → 降级低分记忆) */
37
+ isDuplicate: boolean;
38
+ /** 合并后的内容(isDuplicate=true 时提供,保留更完整的信息) */
39
+ mergedContent?: string;
40
+ /** LLM 判断理由(便于审计和调试) */
41
+ reason: string;
42
+ }
43
+ /** 降级记忆的审计详情(DedupReport.verdicts 元素,供 UI 展示"为什么降级") */
44
+ export interface DedupVerdictSummary {
45
+ /** 被降级的记忆 ID(与 demotedIds 元素一一对应) */
46
+ demotedId: string;
47
+ /** LLM 判断理由(便于用户审计降级是否合理) */
48
+ reason: string;
49
+ /** 合并后的完整内容(便于用户验证合并质量;未提供 mergedContent 时省略,渲染器负责截断展示) */
50
+ mergedContent?: string;
51
+ }
52
+ /** 语义去重报告(deduplicateMemories 返回值) */
53
+ export interface DedupReport {
54
+ /** 扫描的候选记忆总数 */
55
+ scannedCount: number;
56
+ /** 发现的名称相似对数 */
57
+ pairCount: number;
58
+ /** LLM 判定为语义等价并执行降级的对数 */
59
+ deduplicatedCount: number;
60
+ /** 被降级的记忆 ID 列表(score 降至 DEDUP_LOW_SCORE,未物理删除) */
61
+ demotedIds: string[];
62
+ /** 降级审计详情(与 demotedIds 一一对应,供 UI 展示 reason + mergedContentPreview) */
63
+ verdicts?: DedupVerdictSummary[];
64
+ /** 跳过原因(LLM 不可用 / 无候选对 / LLM 失败降级) */
65
+ skippedReason?: string;
66
+ }
67
+ /**
68
+ * 语义去重管理器
69
+ *
70
+ * 扫描名称高度相似的记忆对,调用 LLM 判断语义等价性,降级低分记忆。
71
+ *
72
+ * 装配:由 assembler.ts 在组合根创建,backgroundProvider 可选注入。
73
+ * 调用:Agent.deduplicateMemories() 透传至本类。
74
+ */
75
+ export declare class DedupManager {
76
+ private readonly index;
77
+ /** 去重完成回调(宿主可据此发射事件通知用户) */
78
+ private readonly onCompleted?;
79
+ /** 后台 LLM Provider(可选,用于语义去重等异步治理任务,未注入时降级跳过) */
80
+ private readonly backgroundProvider;
81
+ /**
82
+ * @param index - 记忆存储(用于读写候选记忆)
83
+ * @param backgroundProvider - 后台 LLM Provider(可选,用于语义去重,未注入时降级跳过)
84
+ */
85
+ constructor(index: IMemoryStorage, backgroundProvider?: LlmProvider | null,
86
+ /** 去重完成回调(宿主可据此发射事件通知用户) */
87
+ onCompleted?: ((report: DedupReport) => void) | undefined);
88
+ /**
89
+ * 语义去重:扫描名称高度相似的记忆对,调用 LLM 判断语义等价性
90
+ *
91
+ * 流程:
92
+ * 1. 从 insight/profile/work-projection 加载候选记忆(上限 50 条)
93
+ * 2. 按名称归一化 Levenshtein 距离筛选相似对(上限 10 对)
94
+ * 3. 对每对调用 LLM 判断语义等价性(结构化 JSON 输出)
95
+ * 4. 等价则降级低分记忆(score → 0.1,不物理删除,保留可恢复性)
96
+ * 5. 返回去重报告
97
+ *
98
+ * 安全设计:
99
+ * - 不物理删除——仅降级 score,用户可通过宿主 UI 手动恢复
100
+ * - LLM 失败降级——返回已处理的报告,不阻塞调用方
101
+ * - 异步执行——不阻塞主对话热路径(由宿主定时任务或用户手动触发)
102
+ * - backgroundProvider 未注入时静默跳过(返回 skippedReason)
103
+ *
104
+ * @param signal 可选的 AbortSignal(取消正在进行的 LLM 判断)
105
+ * @returns 去重报告
106
+ */
107
+ deduplicateMemories(signal?: AbortSignal): Promise<DedupReport>;
108
+ /**
109
+ * 筛选名称高度相似的候选记忆对
110
+ *
111
+ * 判定规则(满足任一即视为名称相似):
112
+ * 1. 归一化 Levenshtein 距离 ≤ 0.3(如 "用户偏好" vs "用户偏爱")
113
+ * 2. 一个名称包含另一个(如 "用户偏好" vs "用户偏好设置")
114
+ *
115
+ * 去重设计:
116
+ * - 已配对的记忆不再参与后续配对(避免 A-B-C 三元组产生 A-B + A-C + B-C 三对)
117
+ * - 候选对按相似度升序排列(越相似越优先),取前 10 对
118
+ *
119
+ * @param candidates 候选记忆列表(已按 score 降序)
120
+ * @returns 名称相似的记忆对列表(a.score ≥ b.score)
121
+ */
122
+ private findNameOverlapPairs;
123
+ /**
124
+ * 计算两个名称的归一化相似度(0-1,越小越相似)
125
+ *
126
+ * 综合两种规则取较小值:
127
+ * 1. 归一化 Levenshtein 距离 = distance / max(len_a, len_b)
128
+ * 2. 包含关系:若一个名称包含另一个,相似度 = 0(完全相似)
129
+ *
130
+ * @param nameA 名称 A
131
+ * @param nameB 名称 B
132
+ * @returns 相似度(0=完全相似,1=完全不同)
133
+ */
134
+ private static computeNameSimilarity;
135
+ /**
136
+ * 调用 LLM 判断单对记忆的语义等价性
137
+ *
138
+ * 使用结构化 JSON 输出(isDuplicate + mergedContent + reason),
139
+ * 流式累积 + parseLlmJson + 异常封装委托给 llmJudgeHelper.judgeWithLlm。
140
+ *
141
+ * LLM 失败时抛出 MemoraError(由 deduplicateMemories 捕获并降级跳过此对)。
142
+ *
143
+ * @param pair 候选记忆对
144
+ * @param signal 可选的 AbortSignal
145
+ * @returns LLM 判断结果
146
+ */
147
+ private judgeDuplicate;
148
+ /**
149
+ * 降级重复记忆(score → DEDUP_LOW_SCORE)
150
+ *
151
+ * 安全设计:
152
+ * - 不物理删除,仅降低 score,保留可恢复性
153
+ * - 合并内容由 keepMerged() 单独写回保留方 a(职责清晰:本方法只降级低分方)
154
+ *
155
+ * @param memory 待降级的记忆(低分方)
156
+ */
157
+ private demoteMemory;
158
+ /**
159
+ * 将合并内容写回保留方(高分记忆 a)
160
+ *
161
+ * 保持 a 的 id/source/name/score/createdAt 不变,仅更新 content 为合并后内容并刷新
162
+ * accessedAt,使"两条重复记忆合并为一条更完整记忆"的语义真正落库(M6 修复)。
163
+ *
164
+ * @param memory 保留方记忆(高分方)
165
+ * @param mergedContent LLM 生成的合并后完整内容
166
+ */
167
+ private keepMerged;
168
+ }
169
+ //# sourceMappingURL=dedupManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/dedupManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAgC9D,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,4BAA4B;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,gBAAgB;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID;;;;;;;GAOG;AACH,qBAAa,YAAY;IASrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAEtB,4BAA4B;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAX/B,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAExD;;;OAGG;gBAEgB,KAAK,EAAE,cAAc,EACtC,kBAAkB,GAAE,WAAW,GAAG,IAAW;IAC7C,4BAA4B;IACX,WAAW,CAAC,GAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,aAAA;IAK9D;;;;;;;;;;;;;;;;;;OAkBG;IACG,mBAAmB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAiFrE;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,oBAAoB;IAgC5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAqBpC;;;;;;;;;;;OAWG;YACW,cAAc;IAoB5B;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAMpB;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;CASnB"}
@@ -0,0 +1,336 @@
1
+ // LLM judge 三件套高阶函数(流式累积 + parseLlmJson + configError 异常封装)
2
+ import { judgeWithLlm } from '../../agent/managers/llmJudgeHelper.js';
3
+ // LLM 治理共享常量(v2 REPEAT-1/2 闭环,消除 5 处独立维护的治理源列表 + 2 处 score 常量重复)
4
+ import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
5
+ // levenshtein 用于名称相似度计算(复用 sourceValidation 中的实现,避免重复造轮子)
6
+ import { levenshtein } from '../../memory/sourceValidation.js';
7
+ // 按 score 降序排序(与 MemoryInspector 共享,避免重复造轮子)
8
+ import { byScoreDesc } from '../../utils/array.js';
9
+ // 时间戳生成(降级时更新 accessedAt)
10
+ import { nowIso } from '../../utils/time.js';
11
+ // 内容截断(送入 LLM 前控制 token 消耗)
12
+ import { truncate } from '../../utils/strings.js';
13
+ // 日志(治理审计 + 失败降级记录)
14
+ import { logger } from '../../logging/logger.js';
15
+ // ─── L1 语义去重常量 ────────────────────────────────────
16
+ /** 单次去重扫描的候选记忆条数上限(控制内存和 LLM 调用量) */
17
+ const DEDUP_CANDIDATE_LIMIT = 50;
18
+ /** 单次 LLM 判断的候选对数上限(每对约 200 tokens,10 对 ≈ 2000 tokens) */
19
+ const DEDUP_PAIR_LIMIT = 10;
20
+ /** 名称相似度阈值(归一化 Levenshtein 距离 ≤ 此值视为名称高度相似,进入 LLM 判断) */
21
+ const DEDUP_NAME_SIMILARITY_THRESHOLD = 0.3;
22
+ /** LLM 去重判断超时(ms),与 TextPolishManager 一致 */
23
+ const DEDUP_TIMEOUT_MS = 15_000;
24
+ /** 被判定为重复的记忆降级到此 score(接近 0 但保留可恢复性,不物理删除) */
25
+ const DEDUP_LOW_SCORE = 0.1;
26
+ /** 候选记忆内容预览长度(截断后送入 LLM,控制 token 消耗) */
27
+ const DEDUP_CONTENT_PREVIEW_LEN = 200;
28
+ // ─── 类 ──────────────────────────────────────────────────
29
+ /**
30
+ * 语义去重管理器
31
+ *
32
+ * 扫描名称高度相似的记忆对,调用 LLM 判断语义等价性,降级低分记忆。
33
+ *
34
+ * 装配:由 assembler.ts 在组合根创建,backgroundProvider 可选注入。
35
+ * 调用:Agent.deduplicateMemories() 透传至本类。
36
+ */
37
+ export class DedupManager {
38
+ index;
39
+ onCompleted;
40
+ /** 后台 LLM Provider(可选,用于语义去重等异步治理任务,未注入时降级跳过) */
41
+ backgroundProvider;
42
+ /**
43
+ * @param index - 记忆存储(用于读写候选记忆)
44
+ * @param backgroundProvider - 后台 LLM Provider(可选,用于语义去重,未注入时降级跳过)
45
+ */
46
+ constructor(index, backgroundProvider = null,
47
+ /** 去重完成回调(宿主可据此发射事件通知用户) */
48
+ onCompleted) {
49
+ this.index = index;
50
+ this.onCompleted = onCompleted;
51
+ this.backgroundProvider = backgroundProvider;
52
+ }
53
+ /**
54
+ * 语义去重:扫描名称高度相似的记忆对,调用 LLM 判断语义等价性
55
+ *
56
+ * 流程:
57
+ * 1. 从 insight/profile/work-projection 加载候选记忆(上限 50 条)
58
+ * 2. 按名称归一化 Levenshtein 距离筛选相似对(上限 10 对)
59
+ * 3. 对每对调用 LLM 判断语义等价性(结构化 JSON 输出)
60
+ * 4. 等价则降级低分记忆(score → 0.1,不物理删除,保留可恢复性)
61
+ * 5. 返回去重报告
62
+ *
63
+ * 安全设计:
64
+ * - 不物理删除——仅降级 score,用户可通过宿主 UI 手动恢复
65
+ * - LLM 失败降级——返回已处理的报告,不阻塞调用方
66
+ * - 异步执行——不阻塞主对话热路径(由宿主定时任务或用户手动触发)
67
+ * - backgroundProvider 未注入时静默跳过(返回 skippedReason)
68
+ *
69
+ * @param signal 可选的 AbortSignal(取消正在进行的 LLM 判断)
70
+ * @returns 去重报告
71
+ */
72
+ async deduplicateMemories(signal) {
73
+ // backgroundProvider 未注入时静默降级(向后兼容)
74
+ if (!this.backgroundProvider) {
75
+ return {
76
+ scannedCount: 0,
77
+ pairCount: 0,
78
+ deduplicatedCount: 0,
79
+ demotedIds: [],
80
+ skippedReason: 'backgroundProvider 未注入',
81
+ };
82
+ }
83
+ // ── 步骤 1:加载候选记忆(按 score 降序,取前 50 条) ──
84
+ const candidates = [];
85
+ for (const source of GOVERNANCE_SOURCES) {
86
+ const memories = this.index.getBySource(source);
87
+ candidates.push(...memories);
88
+ }
89
+ // 按 score 降序排列,优先处理高分记忆(更可能产生重复)
90
+ candidates.sort(byScoreDesc);
91
+ const limited = candidates.slice(0, DEDUP_CANDIDATE_LIMIT);
92
+ // ── 步骤 2:筛选名称高度相似的记忆对 ──
93
+ const pairs = this.findNameOverlapPairs(limited);
94
+ if (pairs.length === 0) {
95
+ return {
96
+ scannedCount: limited.length,
97
+ pairCount: 0,
98
+ deduplicatedCount: 0,
99
+ demotedIds: [],
100
+ skippedReason: '未发现名称相似的记忆对',
101
+ };
102
+ }
103
+ // ── 步骤 3:逐对调用 LLM 判断语义等价性 ──
104
+ const demotedIds = [];
105
+ const verdicts = [];
106
+ let deduplicatedCount = 0;
107
+ for (const pair of pairs) {
108
+ try {
109
+ const verdict = await this.judgeDuplicate(pair, signal);
110
+ if (verdict.isDuplicate) {
111
+ // 先写合并内容再降级 b:确保合并写入失败时不破坏 b 的原始状态(原子性)
112
+ if (verdict.mergedContent) {
113
+ this.keepMerged(pair.a, verdict.mergedContent);
114
+ }
115
+ // 降级低分记忆(b 的 score ≤ a 的 score,因 candidates 已按 score 降序)
116
+ this.demoteMemory(pair.b);
117
+ demotedIds.push(pair.b.id);
118
+ // 收集审计详情(供 UI 展示"为什么降级"和"合并后保留了什么")
119
+ verdicts.push({
120
+ demotedId: pair.b.id,
121
+ reason: verdict.reason,
122
+ mergedContent: verdict.mergedContent,
123
+ });
124
+ deduplicatedCount++;
125
+ logger.info({ demotedId: pair.b.id, keptId: pair.a.id, reason: verdict.reason }, '语义去重:降级重复记忆并合并内容到保留方');
126
+ }
127
+ }
128
+ catch (err) {
129
+ // 单对 LLM 判断失败不阻塞后续对,记录警告继续
130
+ logger.warn({ err, pairId: `${pair.a.id}↔${pair.b.id}` }, '语义去重:LLM 判断失败,跳过此对');
131
+ }
132
+ }
133
+ this.onCompleted?.({ scannedCount: limited.length, pairCount: pairs.length, deduplicatedCount, demotedIds });
134
+ return {
135
+ scannedCount: limited.length,
136
+ pairCount: pairs.length,
137
+ deduplicatedCount,
138
+ demotedIds,
139
+ verdicts,
140
+ };
141
+ }
142
+ /**
143
+ * 筛选名称高度相似的候选记忆对
144
+ *
145
+ * 判定规则(满足任一即视为名称相似):
146
+ * 1. 归一化 Levenshtein 距离 ≤ 0.3(如 "用户偏好" vs "用户偏爱")
147
+ * 2. 一个名称包含另一个(如 "用户偏好" vs "用户偏好设置")
148
+ *
149
+ * 去重设计:
150
+ * - 已配对的记忆不再参与后续配对(避免 A-B-C 三元组产生 A-B + A-C + B-C 三对)
151
+ * - 候选对按相似度升序排列(越相似越优先),取前 10 对
152
+ *
153
+ * @param candidates 候选记忆列表(已按 score 降序)
154
+ * @returns 名称相似的记忆对列表(a.score ≥ b.score)
155
+ */
156
+ findNameOverlapPairs(candidates) {
157
+ const pairs = [];
158
+ const usedIds = new Set();
159
+ // 双重循环生成所有可能的对,按相似度排序后贪心选取
160
+ const allPairs = [];
161
+ for (let i = 0; i < candidates.length; i++) {
162
+ for (let j = i + 1; j < candidates.length; j++) {
163
+ const a = candidates[i]; // i 循环内,score 较高
164
+ const b = candidates[j]; // j > i,score 较低或相等
165
+ const similarity = DedupManager.computeNameSimilarity(a.name, b.name);
166
+ if (similarity <= DEDUP_NAME_SIMILARITY_THRESHOLD) {
167
+ allPairs.push({ a, b, nameSimilarity: similarity });
168
+ }
169
+ }
170
+ }
171
+ // 按相似度升序排列(越相似越优先处理)
172
+ allPairs.sort((x, y) => x.nameSimilarity - y.nameSimilarity);
173
+ // 贪心选取:已配对的记忆不再参与后续配对
174
+ for (const { a, b, nameSimilarity } of allPairs) {
175
+ if (usedIds.has(a.id) || usedIds.has(b.id))
176
+ continue;
177
+ pairs.push({ a, b, nameSimilarity });
178
+ usedIds.add(a.id);
179
+ usedIds.add(b.id);
180
+ if (pairs.length >= DEDUP_PAIR_LIMIT)
181
+ break;
182
+ }
183
+ return pairs;
184
+ }
185
+ /**
186
+ * 计算两个名称的归一化相似度(0-1,越小越相似)
187
+ *
188
+ * 综合两种规则取较小值:
189
+ * 1. 归一化 Levenshtein 距离 = distance / max(len_a, len_b)
190
+ * 2. 包含关系:若一个名称包含另一个,相似度 = 0(完全相似)
191
+ *
192
+ * @param nameA 名称 A
193
+ * @param nameB 名称 B
194
+ * @returns 相似度(0=完全相似,1=完全不同)
195
+ */
196
+ static computeNameSimilarity(nameA, nameB) {
197
+ // 边界条件:空字符串防御
198
+ // 空名称会导致 includes("") 恒为 true 返回 0(完全相似),
199
+ // 让空名称记忆与所有记忆被判高度相似,浪费 LLM 调用并可能误降级。
200
+ // 此处前置拒绝,空名称与任何名称都视为完全不同(1.0)。
201
+ if (!nameA || !nameB) {
202
+ return 1;
203
+ }
204
+ // 规则 2:包含关系(如 "用户偏好" vs "用户偏好设置")
205
+ if (nameA.includes(nameB) || nameB.includes(nameA)) {
206
+ return 0;
207
+ }
208
+ // 规则 1:归一化 Levenshtein 距离
209
+ const maxLen = Math.max(nameA.length, nameB.length);
210
+ if (maxLen === 0)
211
+ return 0; // 两个空字符串视为完全相似(已被上面拦截,此处防御)
212
+ const distance = levenshtein(nameA, nameB);
213
+ return distance / maxLen;
214
+ }
215
+ /**
216
+ * 调用 LLM 判断单对记忆的语义等价性
217
+ *
218
+ * 使用结构化 JSON 输出(isDuplicate + mergedContent + reason),
219
+ * 流式累积 + parseLlmJson + 异常封装委托给 llmJudgeHelper.judgeWithLlm。
220
+ *
221
+ * LLM 失败时抛出 MemoraError(由 deduplicateMemories 捕获并降级跳过此对)。
222
+ *
223
+ * @param pair 候选记忆对
224
+ * @param signal 可选的 AbortSignal
225
+ * @returns LLM 判断结果
226
+ */
227
+ async judgeDuplicate(pair, signal) {
228
+ const messages = buildDedupMessages(pair);
229
+ const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 300, timeoutMs: DEDUP_TIMEOUT_MS, signal }, 'LLM 去重判断返回非法 JSON');
230
+ return {
231
+ isDuplicate: parsed.isDuplicate === true,
232
+ mergedContent: typeof parsed.mergedContent === 'string' ? parsed.mergedContent : undefined,
233
+ reason: typeof parsed.reason === 'string' ? parsed.reason : '(LLM 未提供理由)',
234
+ };
235
+ }
236
+ /**
237
+ * 降级重复记忆(score → DEDUP_LOW_SCORE)
238
+ *
239
+ * 安全设计:
240
+ * - 不物理删除,仅降低 score,保留可恢复性
241
+ * - 合并内容由 keepMerged() 单独写回保留方 a(职责清晰:本方法只降级低分方)
242
+ *
243
+ * @param memory 待降级的记忆(低分方)
244
+ */
245
+ demoteMemory(memory) {
246
+ // MIND2-L3:改用 setScore 原子操作,消除 spread 旧快照覆盖其他字段的隐性 bug
247
+ // 原模式用 candidates 旧快照 spread 后整条 upsert,会覆盖期间被 boost/decay 改的 content 等字段
248
+ this.index.setScore(memory.id, DEDUP_LOW_SCORE, nowIso());
249
+ }
250
+ /**
251
+ * 将合并内容写回保留方(高分记忆 a)
252
+ *
253
+ * 保持 a 的 id/source/name/score/createdAt 不变,仅更新 content 为合并后内容并刷新
254
+ * accessedAt,使"两条重复记忆合并为一条更完整记忆"的语义真正落库(M6 修复)。
255
+ *
256
+ * @param memory 保留方记忆(高分方)
257
+ * @param mergedContent LLM 生成的合并后完整内容
258
+ */
259
+ keepMerged(memory, mergedContent) {
260
+ const updated = {
261
+ ...memory,
262
+ content: mergedContent,
263
+ accessedAt: nowIso(),
264
+ };
265
+ this.index.upsert(updated);
266
+ logger.info({ keptId: memory.id }, '语义去重:保留方已合并对方内容');
267
+ }
268
+ }
269
+ // ─── L1 语义去重 Prompt 模板(模块级函数,与 TextPolishManager.buildPolishMessages 同模式) ───
270
+ /**
271
+ * 构建语义去重判断的 LLM 消息
272
+ *
273
+ * 设计要点:
274
+ * - system 消息定义判断规则(语义等价 = 表达同一事实/偏好/洞察)
275
+ * - user 消息携带候选对的内容预览(截断到 200 字符)
276
+ * - 要求输出结构化 JSON(isDuplicate + mergedContent + reason)
277
+ * - few-shot 示例降低 LLM 误判率
278
+ *
279
+ * @param pair 候选记忆对
280
+ * @returns system + user 消息数组
281
+ */
282
+ function buildDedupMessages(pair) {
283
+ const contentA = pair.a.content.length > DEDUP_CONTENT_PREVIEW_LEN
284
+ ? truncate(pair.a.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
285
+ : pair.a.content;
286
+ const contentB = pair.b.content.length > DEDUP_CONTENT_PREVIEW_LEN
287
+ ? truncate(pair.b.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
288
+ : pair.b.content;
289
+ return [
290
+ {
291
+ role: 'system',
292
+ content: `你是记忆去重助手。判断给定的两条记忆是否语义等价(表达同一事实/偏好/洞察)。
293
+
294
+ 判断规则:
295
+ - 语义等价 = 核心信息相同,仅措辞/格式/细节程度不同
296
+ - 语义不等价 = 核心信息不同,或一条是另一条的补充/细化(非等价)
297
+ - 忽略时间戳、ID 等元数据差异
298
+ - 忽略措辞风格差异(如"喜欢"vs"偏爱")
299
+
300
+ 输出 JSON 格式:
301
+ {
302
+ "isDuplicate": true/false,
303
+ "mergedContent": "合并后的内容(仅 isDuplicate=true 时提供,保留两条记忆的完整信息)",
304
+ "reason": "判断理由(简短说明)"
305
+ }
306
+
307
+ 示例:
308
+ 输入 A: "用户偏好简洁的 UI 设计"
309
+ 输入 B: "用户喜欢简洁的界面风格"
310
+ 输出: {"isDuplicate": true, "mergedContent": "用户偏好简洁的 UI/界面设计风格", "reason": "核心偏好相同,仅措辞差异"}
311
+
312
+ 输入 A: "用户是 TypeScript 开发者"
313
+ 输入 B: "用户偏好使用 TypeScript 进行后端开发"
314
+ 输出: {"isDuplicate": false, "reason": "B 是 A 的细化(限定后端),非语义等价"}`,
315
+ },
316
+ {
317
+ role: 'user',
318
+ content: `请判断以下两条记忆是否语义等价:
319
+
320
+ 记忆 A(score: ${pair.a.score},保留候选):
321
+ - 名称:${pair.a.name}
322
+ - 来源:${pair.a.source}
323
+ - 内容:${contentA}
324
+
325
+ 记忆 B(score: ${pair.b.score},降级候选):
326
+ - 名称:${pair.b.name}
327
+ - 来源:${pair.b.source}
328
+ - 内容:${contentB}
329
+
330
+ 名称相似度:${pair.nameSimilarity.toFixed(2)}(0=完全相同,1=完全不同)
331
+
332
+ 请输出 JSON 判断结果。`,
333
+ },
334
+ ];
335
+ }
336
+ //# sourceMappingURL=dedupManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupManager.js","sourceRoot":"","sources":["../../../src/agent/managers/dedupManager.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,17 @@
1
+ /**
2
+ * Insight 提取器 — 输入分类 + 记忆提取
3
+ *
4
+ * 从 Agent 拆分出来,负责:
5
+ * - 三层输入分类(通用规则 → 宿主关键词 → 默认提取)
6
+ * - 异步 insight 提取(LLM 判断 + 去重 + 写入 SQLite)
7
+ * - 宿主记忆关键词管理
8
+ *
9
+ * 关系构建逻辑(ADR-014)已拆分至 RelationBuilder,本类通过 relationBuilder 委托调用。
10
+ *
11
+ * 设计原则:
12
+ * - 独立于 Agent 生命周期,仅依赖 Provider/Storage/Loop
13
+ * - 提取失败不影响主对话流程(fire-and-forget)
14
+ */
1
15
  import type { LlmProvider } from '../../llm/provider.js';
2
16
  import type { Memory } from '../../memory/types.js';
3
17
  import type { IMemoryStorage } from '../../memory/storageInterface.js';
@@ -23,14 +37,14 @@ export declare class InsightExtractor {
23
37
  /** 写入扩展回调(宿主注入 diff 对比确认逻辑) */
24
38
  writeExtensions: WriteExtensions | null;
25
39
  /**
26
- * 关系构建器(P1-3 拆分,ADR-014 关系构建委托给 RelationBuilder)
40
+ * 关系构建器(ADR-014 关系构建委托给 RelationBuilder)
27
41
  * 未注入时跳过所有关系构建(保持向后兼容)
28
42
  */
29
43
  private readonly relationBuilder;
30
44
  /**
31
45
  * @param provider - LLM Provider(用于 insight 提取)
32
46
  * @param index - 记忆存储(用于去重搜索 + 写入)
33
- * @param relationBuilder - 关系构建器(可选,P1-3 拆分后替代直接 relationStore 注入)
47
+ * @param relationBuilder - 关系构建器(可选,替代直接 relationStore 注入)
34
48
  * 未注入时跳过关系构建(保持向后兼容,ADR-014 侧车模型)
35
49
  */
36
50
  constructor(provider: LlmProvider, index: IMemoryStorage, relationBuilder?: RelationBuilder | null);
@@ -44,7 +58,7 @@ export declare class InsightExtractor {
44
58
  content: string;
45
59
  }>): void;
46
60
  /**
47
- * 绑定冲突检测回调(P1-3 拆分后委托给 RelationBuilder)
61
+ * 绑定冲突检测回调(委托给 RelationBuilder)
48
62
  *
49
63
  * 由 Agent.init() 在创建 InsightExtractor 后调用(与 bindGetRecentHistory 同模式),
50
64
  * 解决 Agent 实例晚于 InsightExtractor 创建的时序循环依赖。
@@ -95,6 +109,20 @@ export declare class InsightExtractor {
95
109
  * low → 0.2(快速衰减)
96
110
  */
97
111
  private scoreByQuality;
112
+ /**
113
+ * 利用 LLM 返回的 tags 生成语义化 name
114
+ *
115
+ * name 格式:`{清洗后的tag}-{uuid前6位}`(如 "偏好-a1b2c3")
116
+ * - 取 tags 数组第一个非空 tag
117
+ * - 清洗 tag:保留中文/字母/数字,移除其他字符,取前 8 字符
118
+ * - UUID 前缀保证唯一性,tag 前缀提升 UI 可读性
119
+ * - 无 tags 或清洗后为空时,回退到 `insight-{uuid前8位}`
120
+ *
121
+ * @param tagsRaw - LLM 返回的 tags 字段(类型未知,需运行时校验)
122
+ * @param insightId - UUID,用于保证 name 唯一性
123
+ * @returns 语义化 name 字符串
124
+ */
125
+ private generateSemanticName;
98
126
  /**
99
127
  * Layer 1: 通用规则过滤
100
128
  *
@@ -1 +1 @@
1
- {"version":3,"file":"insightExtractor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/insightExtractor.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAiCzF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID,qBAAa,gBAAgB;IAoBzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IApBxB,iCAAiC;IACjC,OAAO,CAAC,YAAY,CAA+B;IAEnD,+BAA+B;IACxB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAQ;IAEtD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEzD;;;;;OAKG;gBAEgB,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,cAAc,EACtC,eAAe,GAAE,eAAe,GAAG,IAAW;IAOhD,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB,CAA6E;IAEtG;;OAEG;IACH,oBAAoB,CAClB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAC7E,IAAI;IAIP;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAM/D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAQ3C;;OAEG;IACH,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAOrD;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe3C;;;;;;;OAOG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuJ7E;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAUtB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;CAU/B"}
1
+ {"version":3,"file":"insightExtractor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/insightExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAkCzF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAsFD,qBAAa,gBAAgB;IAoBzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IApBxB,iCAAiC;IACjC,OAAO,CAAC,YAAY,CAA+B;IAEnD,+BAA+B;IACxB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAQ;IAEtD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEzD;;;;;OAKG;gBAEgB,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,cAAc,EACtC,eAAe,GAAE,eAAe,GAAG,IAAW;IAOhD,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB,CAA6E;IAEtG;;OAEG;IACH,oBAAoB,CAClB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAC7E,IAAI;IAIP;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAM/D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAQ3C;;OAEG;IACH,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAOrD;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe3C;;;;;;;OAOG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA2I7E;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAQtB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;CAU/B"}