@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
@@ -6,6 +6,7 @@
6
6
  * 2. 衰减指标统计(执行次数 / 累计衰减记忆数 / 上次衰减时间)
7
7
  * 3. 衰减可观测性(Tracer Span 埋点)
8
8
  * 4. 衰减完成事件发射(decayCompleted)
9
+ * 5. L2 时效性评估(可选,backgroundProvider + index 注入后启用)
9
10
  *
10
11
  * 设计理由:
11
12
  * agent.ts 原承担 15+ 职责,记忆衰减是独立的生命周期职责,
@@ -17,6 +18,12 @@
17
18
  * - work-projection(作品投影)
18
19
  * 不衰减 persona/rule/skill(配置型记忆不应衰减)
19
20
  *
21
+ * L2 时效性评估(可选增强):
22
+ * - 衰减后扫描低分记忆(score < TIMELINESS_LOW_SCORE_THRESHOLD)
23
+ * - 调用 LLM 判断是否"已过时"(如过时的技术栈、已变更的偏好)
24
+ * - 过时则进一步降级(score → TIMELINESS_OUTDATED_SCORE)
25
+ * - backgroundProvider / index 未注入时静默跳过(向后兼容)
26
+ *
20
27
  * 自然生长原则:
21
28
  * - 不持有 storage 引用(start 时注入,stop 时释放)
22
29
  * - 通过回调发射事件(不继承 TypedEventEmitter,避免与 Agent 事件系统耦合)
@@ -26,8 +33,24 @@ import { safeSetInterval, clearSafeInterval } from '../../utils/safeTimer.js';
26
33
  import { logger } from '../../logging/logger.js';
27
34
  import { toError } from '../../utils/errors.js';
28
35
  import { nowIso } from '../../utils/time.js';
29
- import { SOURCE_LABELS } from '../../memory/types.js';
30
36
  import { NOOP_TRACER, TRACE_SPANS } from '../../agent/tracer.js';
37
+ // LLM judge 三件套高阶函数(流式累积 + parseLlmJson + configError 异常封装)
38
+ import { judgeWithLlm } from '../../agent/managers/llmJudgeHelper.js';
39
+ import { truncate } from '../../utils/strings.js';
40
+ // LLM 治理源列表(v2 REPEAT-1 闭环,消除 5 处独立维护的 [INSIGHT, PROFILE, WORK_PROJECTION] 列表)
41
+ import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
42
+ // ─── L2 时效性评估常量 ────────────────────────────────────
43
+ // 注:TIMELINESS_SOURCES 已统一为 GOVERNANCE_SOURCES(governance.ts),消除 5 处独立维护
44
+ /** 低分记忆阈值(score 低于此值的记忆进入 LLM 时效性评估) */
45
+ const TIMELINESS_LOW_SCORE_THRESHOLD = 0.3;
46
+ /** 单次时效性评估的记忆条数上限(控制 LLM 调用量) */
47
+ const TIMELINESS_EVALUATE_LIMIT = 20;
48
+ /** LLM 时效性判断超时(ms) */
49
+ const TIMELINESS_TIMEOUT_MS = 15_000;
50
+ /** 被判定为过时的记忆降级到此 score(接近物理删除阈值,但保留可恢复性) */
51
+ const TIMELINESS_OUTDATED_SCORE = 0.05;
52
+ /** 候选记忆内容预览长度(截断后送入 LLM) */
53
+ const TIMELINESS_CONTENT_PREVIEW_LEN = 200;
31
54
  /**
32
55
  * 记忆衰减调度器
33
56
  *
@@ -43,10 +66,29 @@ export class MemoryDecayScheduler {
43
66
  tracer;
44
67
  /** 衰减完成事件发射回调 */
45
68
  onDecayCompleted;
69
+ /** 后台 LLM Provider(可选,用于 L2 时效性评估,未注入时跳过) */
70
+ backgroundProvider;
71
+ /** 完整记忆存储(可选,用于 L2 读取低分记忆和降级,未注入时跳过) */
72
+ index;
46
73
  /** 衰减定时器(null 表示未启动) */
47
74
  decayTimer = null;
48
75
  /** 衰减目标存储(start 时注入,stop 时释放) */
49
76
  storage = null;
77
+ /**
78
+ * L2 时效性评估的 AbortController
79
+ *
80
+ * FIX-P0-1:stop() 时 abort,让正在进行的 evaluateTimeliness 尽快结束,
81
+ * 防止 close 后 LLM 回调 upsert 已关闭的 storage。
82
+ * 每次 evaluateTimeliness 启动时重置为新的 controller。
83
+ */
84
+ evaluateAbortController = null;
85
+ /**
86
+ * 当前正在进行的 evaluateTimeliness Promise(null 表示无)
87
+ *
88
+ * FIX-P0-1:close() 通过 awaitInflight() 等待此 Promise 完成,
89
+ * 确保关闭时所有 L2 评估的 upsert 都落在 storage 关闭前。
90
+ */
91
+ inflightEvaluate = null;
50
92
  // ─── 衰减指标统计字段 ──────────────────────────────────
51
93
  /** 衰减执行次数(每次 runOnce 实际执行 +1) */
52
94
  metricDecayRunCount = 0;
@@ -57,6 +99,9 @@ export class MemoryDecayScheduler {
57
99
  constructor(opts) {
58
100
  this.tracer = opts.tracer ?? NOOP_TRACER;
59
101
  this.onDecayCompleted = opts.onDecayCompleted;
102
+ // L2 可选依赖:未注入时 evaluateTimeliness 静默跳过
103
+ this.backgroundProvider = opts.backgroundProvider ?? null;
104
+ this.index = opts.index ?? null;
60
105
  }
61
106
  /**
62
107
  * 启动定期衰减
@@ -74,15 +119,44 @@ export class MemoryDecayScheduler {
74
119
  /**
75
120
  * 停止定期衰减,释放资源
76
121
  *
77
- * 清理定时器和 storage 引用,防止 close 后回调触发。
122
+ * FIX-P0-1:清理定时器 + abort 正在进行的 L2 时效性评估 + 释放 storage 引用,
123
+ * 防止 close 后回调触发 upsert 已关闭的 storage。
124
+ *
125
+ * 注意:stop() 不等待 inflightEvaluate 完成(避免阻塞 close 流程),
126
+ * 调用方如需等待应使用 awaitInflight()。abort 后 LLM 调用会快速失败,
127
+ * evaluateTimeliness 内部的 try/catch 会捕获并降级返回。
78
128
  */
79
129
  stop() {
80
130
  if (this.decayTimer) {
81
131
  clearSafeInterval(this.decayTimer);
82
132
  this.decayTimer = null;
83
133
  }
134
+ // FIX-P0-1:abort 正在进行的 L2 评估,让 LLM 调用快速失败
135
+ if (this.evaluateAbortController) {
136
+ this.evaluateAbortController.abort();
137
+ this.evaluateAbortController = null;
138
+ }
84
139
  this.storage = null;
85
140
  }
141
+ /**
142
+ * 等待正在进行的 L2 时效性评估完成
143
+ *
144
+ * FIX-P0-1:Agent.close() 在 stop() 后调用此方法,确保所有 inflight 的
145
+ * evaluateTimeliness Promise 完成(要么正常返回,要么因 abort 快速 reject),
146
+ * 防止 close 后 LLM 回调 upsert 已关闭的 storage。
147
+ *
148
+ * @returns 完成 Promise,无 inflight 时立即 resolve
149
+ */
150
+ async awaitInflight() {
151
+ if (this.inflightEvaluate) {
152
+ try {
153
+ await this.inflightEvaluate;
154
+ }
155
+ catch {
156
+ // abort 导致的 reject 是预期行为,吞掉即可
157
+ }
158
+ }
159
+ }
86
160
  /**
87
161
  * 执行一次记忆衰减
88
162
  *
@@ -99,8 +173,8 @@ export class MemoryDecayScheduler {
99
173
  // 衰减 Span:记录衰减执行过程,补全衰减可观测性缺口
100
174
  const decaySpan = this.tracer.startSpan(TRACE_SPANS.DECAY);
101
175
  try {
102
- const sources = [SOURCE_LABELS.INSIGHT, SOURCE_LABELS.PROFILE, SOURCE_LABELS.WORK_PROJECTION];
103
- const decayedCount = this.storage.decayScores(sources, new Date());
176
+ // 治理源列表统一来自 governance.ts(v2 REPEAT-1 闭环)
177
+ const decayedCount = this.storage.decayScores([...GOVERNANCE_SOURCES], new Date());
104
178
  logger.debug({ decayedCount }, '记忆衰减完成');
105
179
  // 衰减指标统计:累计执行次数和衰减记忆数
106
180
  this.metricDecayRunCount++;
@@ -130,5 +204,210 @@ export class MemoryDecayScheduler {
130
204
  lastRunAt: this.metricLastDecayAt,
131
205
  };
132
206
  }
207
+ // ─── L2 时效性评估(可选,backgroundProvider + index 注入后启用) ───
208
+ /**
209
+ * 时效性评估:扫描低分记忆,调用 LLM 判断是否已过时
210
+ *
211
+ * 流程:
212
+ * 1. 从 insight/profile/work-projection 加载低分记忆(score < 0.3)
213
+ * 2. 对每条低分记忆(上限 20 条),调用 LLM 判断是否"已过时"
214
+ * 3. 过时则进一步降级(score → 0.05,接近物理删除阈值但保留可恢复性)
215
+ * 4. 返回评估报告
216
+ *
217
+ * 使用场景:
218
+ * - 衰减后调用(onDecayCompleted 回调中),对低分记忆做 LLM 二次评估
219
+ * - 宿主定时任务定期调用(如每天一次)
220
+ * - 用户手动触发(记忆管理面板的"清理过时记忆"按钮)
221
+ *
222
+ * 安全设计:
223
+ * - 不物理删除——仅降级 score,保留可恢复性
224
+ * - LLM 失败降级——返回已处理的报告,不阻塞调用方
225
+ * - 单条 LLM 失败不阻塞后续评估
226
+ * - backgroundProvider / index 未注入时静默跳过(向后兼容)
227
+ *
228
+ * FIX-P0-1:每次启动评估创建新的 AbortController,注册到 inflightEvaluate。
229
+ * stop() 时 abort 让 LLM 调用快速失败,awaitInflight() 等待 Promise 完成。
230
+ * 外部 signal 仍可与内部 abort 信号同时使用(任一触发即取消)。
231
+ *
232
+ * @param signal 可选的外部 AbortSignal(与内部 abort 信号叠加,任一触发即取消)
233
+ * @returns 评估报告
234
+ */
235
+ async evaluateTimeliness(signal) {
236
+ // 可选依赖未注入时静默降级(向后兼容)
237
+ if (!this.backgroundProvider || !this.index) {
238
+ return {
239
+ scannedCount: 0,
240
+ outdatedCount: 0,
241
+ demotedIds: [],
242
+ skippedReason: 'backgroundProvider 或 index 未注入',
243
+ };
244
+ }
245
+ // FIX-P0-1:每次评估创建新的 AbortController,stop() 可主动 abort
246
+ this.evaluateAbortController = new AbortController();
247
+ const internalSignal = this.evaluateAbortController.signal;
248
+ // 外部 signal 与内部 signal 叠加:任一 abort 即触发
249
+ // 使用 AbortSignal.any 需 Node 18+,兼容方案是手动转发
250
+ const combinedSignal = signal
251
+ ? AbortSignal.any([internalSignal, signal])
252
+ : internalSignal;
253
+ // 注册到 inflightEvaluate,让 awaitInflight() 可等待
254
+ const promise = this.doEvaluateTimeliness(combinedSignal);
255
+ this.inflightEvaluate = promise;
256
+ try {
257
+ return await promise;
258
+ }
259
+ finally {
260
+ // 评估完成(成功/失败/abort)后清理引用
261
+ if (this.inflightEvaluate === promise) {
262
+ this.inflightEvaluate = null;
263
+ }
264
+ if (this.evaluateAbortController?.signal === internalSignal) {
265
+ this.evaluateAbortController = null;
266
+ }
267
+ }
268
+ }
269
+ /**
270
+ * 实际执行 L2 时效性评估的核心逻辑
271
+ *
272
+ * 从 evaluateTimeliness 拆出,便于 inflightEvaluate Promise 注册和清理。
273
+ *
274
+ * @param combinedSignal 已叠加内部 + 外部的 AbortSignal
275
+ */
276
+ async doEvaluateTimeliness(signal) {
277
+ // ── 步骤 1:加载低分记忆 ──
278
+ const lowScoreMemories = [];
279
+ for (const source of GOVERNANCE_SOURCES) {
280
+ const memories = this.index.getBySource(source);
281
+ // 筛选低分记忆(score 低于阈值)
282
+ lowScoreMemories.push(...memories.filter((m) => m.score < TIMELINESS_LOW_SCORE_THRESHOLD));
283
+ }
284
+ if (lowScoreMemories.length === 0) {
285
+ return {
286
+ scannedCount: 0,
287
+ outdatedCount: 0,
288
+ demotedIds: [],
289
+ skippedReason: '无低分记忆需评估',
290
+ };
291
+ }
292
+ // 按 score 升序排列(最低分优先评估),取前 20 条
293
+ lowScoreMemories.sort((a, b) => a.score - b.score);
294
+ const limited = lowScoreMemories.slice(0, TIMELINESS_EVALUATE_LIMIT);
295
+ // ── 步骤 2:逐条调用 LLM 判断时效性 ──
296
+ const demotedIds = [];
297
+ let outdatedCount = 0;
298
+ for (const memory of limited) {
299
+ // abort 后提前退出循环,避免无谓的 LLM 调用
300
+ if (signal.aborted)
301
+ break;
302
+ try {
303
+ const verdict = await this.judgeTimeliness(memory, signal);
304
+ if (verdict.isOutdated) {
305
+ this.demoteOutdatedMemory(memory);
306
+ demotedIds.push(memory.id);
307
+ outdatedCount++;
308
+ logger.info({ memoryId: memory.id, reason: verdict.reason }, '时效性评估:降级过时记忆');
309
+ }
310
+ }
311
+ catch (err) {
312
+ // 单条 LLM 判断失败不阻塞后续评估(abort 导致的失败也走此分支)
313
+ logger.warn({ err, memoryId: memory.id }, '时效性评估:LLM 判断失败,跳过此条');
314
+ }
315
+ }
316
+ return {
317
+ scannedCount: limited.length,
318
+ outdatedCount,
319
+ demotedIds,
320
+ };
321
+ }
322
+ /**
323
+ * 调用 LLM 判断单条记忆的时效性
324
+ *
325
+ * 使用结构化 JSON 输出(isOutdated + reason),
326
+ * 流式累积 + parseLlmJson + 异常封装委托给 llmJudgeHelper.judgeWithLlm。
327
+ *
328
+ * LLM 失败时抛出 MemoraError(由 evaluateTimeliness 捕获并降级跳过此条)。
329
+ *
330
+ * @param memory 待评估的记忆
331
+ * @param signal 可选的 AbortSignal
332
+ * @returns LLM 判断结果
333
+ */
334
+ async judgeTimeliness(memory, signal) {
335
+ const messages = buildTimelinessMessages(memory);
336
+ const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 200, timeoutMs: TIMELINESS_TIMEOUT_MS, signal }, 'LLM 时效性判断返回非法 JSON');
337
+ return {
338
+ memoryId: memory.id,
339
+ isOutdated: parsed.isOutdated === true,
340
+ reason: typeof parsed.reason === 'string' ? parsed.reason : '(LLM 未提供理由)',
341
+ };
342
+ }
343
+ /**
344
+ * 降级过时记忆(score → TIMELINESS_OUTDATED_SCORE)
345
+ *
346
+ * 安全设计:
347
+ * - 不物理删除,仅降低 score,保留可恢复性
348
+ * - 更新 accessedAt,标记最近被处理过
349
+ *
350
+ * @param memory 待降级的过时记忆
351
+ */
352
+ demoteOutdatedMemory(memory) {
353
+ // MIND2-L3:改用 setScore 原子操作,消除 spread 旧快照覆盖其他字段
354
+ // 原模式 spread 旧快照后整条 upsert,会覆盖期间被 boost/decay 改的 content 等字段
355
+ this.index.setScore(memory.id, TIMELINESS_OUTDATED_SCORE, nowIso());
356
+ }
357
+ }
358
+ // ─── L2 时效性评估 Prompt 模板(模块级函数,与 buildDedupMessages 同模式) ───
359
+ /**
360
+ * 构建时效性判断的 LLM 消息
361
+ *
362
+ * 设计要点:
363
+ * - system 消息定义判断规则(过时 = 信息已失效/不再适用)
364
+ * - user 消息携带记忆内容和元数据(source/score/createdAt)
365
+ * - 要求输出结构化 JSON(isOutdated + reason)
366
+ * - few-shot 示例降低 LLM 误判率
367
+ *
368
+ * @param memory 待评估的记忆
369
+ * @returns system + user 消息数组
370
+ */
371
+ function buildTimelinessMessages(memory) {
372
+ const content = memory.content.length > TIMELINESS_CONTENT_PREVIEW_LEN
373
+ ? truncate(memory.content, TIMELINESS_CONTENT_PREVIEW_LEN, '…[截断]')
374
+ : memory.content;
375
+ return [
376
+ {
377
+ role: 'system',
378
+ content: `你是记忆时效性评估助手。判断给定的记忆是否已过时(信息已失效或不再适用)。
379
+
380
+ 判断规则:
381
+ - 已过时 = 信息明确失效(如旧版本号、已废弃的 API、已变更的偏好)
382
+ - 未过时 = 信息仍然有效(如通用编程原则、长期偏好、历史事件记录)
383
+ - 不确定时倾向"未过时"(避免误删有效记忆)
384
+
385
+ 输出 JSON 格式:
386
+ {
387
+ "isOutdated": true/false,
388
+ "reason": "判断理由(简短说明)"
389
+ }
390
+
391
+ 示例:
392
+ 输入: "用户使用 React 16 进行开发"(createdAt: 2020-01-01)
393
+ 输出: {"isOutdated": true, "reason": "React 16 已是旧版本,当前普遍使用 React 18+"}
394
+
395
+ 输入: "用户偏好函数式编程风格"
396
+ 输出: {"isOutdated": false, "reason": "编程风格偏好通常是长期的"}`,
397
+ },
398
+ {
399
+ role: 'user',
400
+ content: `请判断以下记忆是否已过时:
401
+
402
+ 记忆详情:
403
+ - 名称:${memory.name}
404
+ - 来源:${memory.source}
405
+ - 当前 score:${memory.score}(低分,可能因长期未访问而衰减)
406
+ - 创建时间:${memory.createdAt}
407
+ - 内容:${content}
408
+
409
+ 请输出 JSON 判断结果。`,
410
+ },
411
+ ];
133
412
  }
134
413
  //# sourceMappingURL=memoryDecayScheduler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memoryDecayScheduler.js","sourceRoot":"","sources":["../../../src/agent/managers/memoryDecayScheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memoryDecayScheduler.js","sourceRoot":"","sources":["../../../src/agent/managers/memoryDecayScheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 记忆治理统一门面 — 聚合 L0–L3 记忆治理操作
3
+ *
4
+ * 职责:
5
+ * - L0 衰减:手动触发 score 自然衰减
6
+ * - L1 去重:语义重复检测与合并
7
+ * - L2 时效性:LLM 驱动的时效性评估
8
+ * - L3 冲突:LLM 驱动的语义冲突检测
9
+ * - 诊断:source 健康度 + 记忆推荐
10
+ *
11
+ * 设计原则(§2.2 借力生长):
12
+ * - 6 个治理方法原散落在 Agent 的 45 个公开 API 中,职责碎片化
13
+ * - 收束为单一门面,Agent 只暴露 `agent.governance.xxx()`,减少 6 个直接 API 入口
14
+ * - 门面仅做委托和空值降级,不引入新逻辑——每一层抽象对应一个真实故障点
15
+ *
16
+ * 空值降级策略:
17
+ * - 底层 Manager 未注入时返回空报告(非抛错),符合"降级优先"原则
18
+ * - 与 L1/L2/L3 层的 skippedReason 语义一致
19
+ */
20
+ import type { DedupManager, DedupReport } from '../../agent/managers/dedupManager.js';
21
+ import type { MemoryDecayScheduler, TimelinessReport } from '../../agent/managers/memoryDecayScheduler.js';
22
+ import type { MemoryAdvisor, ConflictReport } from '../../agent/managers/memoryAdvisor.js';
23
+ import type { SourceHealthReport, SuggestOptions, SuggestHit } from '../../agent/managers/memoryAdvisor.js';
24
+ export declare class MemoryGovernance {
25
+ private readonly dedupManager;
26
+ private readonly decayScheduler;
27
+ private readonly memoryAdvisor;
28
+ constructor(dedupManager: DedupManager | null, decayScheduler: MemoryDecayScheduler | null, memoryAdvisor: MemoryAdvisor | null);
29
+ /**
30
+ * 手动触发一次记忆衰减(纯 score 递减,无 LLM 调用)
31
+ */
32
+ decay(): void;
33
+ /**
34
+ * 语义去重:扫描名称相似记忆对,LLM 判断等价性,降级重复记忆
35
+ */
36
+ deduplicate(signal?: AbortSignal): Promise<DedupReport>;
37
+ /**
38
+ * 时效性评估:LLM 判断低分记忆是否过时,降级过时记忆
39
+ */
40
+ evaluateTimeliness(signal?: AbortSignal): Promise<TimelinessReport>;
41
+ /**
42
+ * 冲突检测:LLM 判断同 source 记忆是否存在语义矛盾
43
+ */
44
+ detectConflicts(signal?: AbortSignal): Promise<ConflictReport>;
45
+ /**
46
+ * 记忆源健康诊断(纯只读,不修改状态)
47
+ *
48
+ * @returns 健康报告;advisor 未注入时返回 null
49
+ */
50
+ sourceHealth(): SourceHealthReport | null;
51
+ /**
52
+ * 记忆关联推荐(纯只读,不修改状态)
53
+ */
54
+ suggest(query?: string, options?: SuggestOptions): SuggestHit[];
55
+ }
56
+ //# sourceMappingURL=memoryGovernance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryGovernance.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryGovernance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACvG,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAExG,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,cAAc,EAAE,oBAAoB,GAAG,IAAI,EAC3C,aAAa,EAAE,aAAa,GAAG,IAAI;IAKtD;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACG,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAS7D;;OAEG;IACG,kBAAkB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IASzE;;OAEG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IASpE;;;;OAIG;IACH,YAAY,IAAI,kBAAkB,GAAG,IAAI;IAIzC;;OAEG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE;CAGhE"}
@@ -0,0 +1,63 @@
1
+ export class MemoryGovernance {
2
+ dedupManager;
3
+ decayScheduler;
4
+ memoryAdvisor;
5
+ constructor(dedupManager, decayScheduler, memoryAdvisor) {
6
+ this.dedupManager = dedupManager;
7
+ this.decayScheduler = decayScheduler;
8
+ this.memoryAdvisor = memoryAdvisor;
9
+ }
10
+ // ── L0 衰减 ──────────────────────────────────────────
11
+ /**
12
+ * 手动触发一次记忆衰减(纯 score 递减,无 LLM 调用)
13
+ */
14
+ decay() {
15
+ this.decayScheduler?.runOnce();
16
+ }
17
+ // ── L1 语义去重 ──────────────────────────────────────
18
+ /**
19
+ * 语义去重:扫描名称相似记忆对,LLM 判断等价性,降级重复记忆
20
+ */
21
+ async deduplicate(signal) {
22
+ if (!this.dedupManager) {
23
+ return { scannedCount: 0, pairCount: 0, deduplicatedCount: 0, demotedIds: [], skippedReason: 'Agent 未初始化' };
24
+ }
25
+ return this.dedupManager.deduplicateMemories(signal);
26
+ }
27
+ // ── L2 时效性评估 ────────────────────────────────────
28
+ /**
29
+ * 时效性评估:LLM 判断低分记忆是否过时,降级过时记忆
30
+ */
31
+ async evaluateTimeliness(signal) {
32
+ if (!this.decayScheduler) {
33
+ return { scannedCount: 0, outdatedCount: 0, demotedIds: [], skippedReason: 'Agent 未初始化' };
34
+ }
35
+ return this.decayScheduler.evaluateTimeliness(signal);
36
+ }
37
+ // ── L3 冲突检测 ──────────────────────────────────────
38
+ /**
39
+ * 冲突检测:LLM 判断同 source 记忆是否存在语义矛盾
40
+ */
41
+ async detectConflicts(signal) {
42
+ if (!this.memoryAdvisor) {
43
+ return { scannedCount: 0, pairCount: 0, conflictCount: 0, conflicts: [], skippedReason: 'Agent 未初始化' };
44
+ }
45
+ return this.memoryAdvisor.detectConflicts(signal);
46
+ }
47
+ // ── 诊断 ─────────────────────────────────────────────
48
+ /**
49
+ * 记忆源健康诊断(纯只读,不修改状态)
50
+ *
51
+ * @returns 健康报告;advisor 未注入时返回 null
52
+ */
53
+ sourceHealth() {
54
+ return this.memoryAdvisor?.sourceHealth() ?? null;
55
+ }
56
+ /**
57
+ * 记忆关联推荐(纯只读,不修改状态)
58
+ */
59
+ suggest(query, options) {
60
+ return this.memoryAdvisor?.suggest(query, options) ?? [];
61
+ }
62
+ }
63
+ //# sourceMappingURL=memoryGovernance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryGovernance.js","sourceRoot":"","sources":["../../../src/agent/managers/memoryGovernance.ts"],"names":[],"mappings":"AA2BA,MAAM,OAAO,gBAAgB;IAER;IACA;IACA;IAHnB,YACmB,YAAiC,EACjC,cAA2C,EAC3C,aAAmC;QAFnC,iBAAY,GAAZ,YAAY,CAAqB;QACjC,mBAAc,GAAd,cAAc,CAA6B;QAC3C,kBAAa,GAAb,aAAa,CAAsB;IACnD,CAAC;IAEJ,sDAAsD;IAEtD;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,oDAAoD;IAEpD;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAoB;QACpC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;QAC9G,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,mDAAmD;IAEnD;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,MAAoB;QAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;QAC5F,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,oDAAoD;IAEpD;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,MAAoB;QACxC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;QACzG,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,sDAAsD;IAEtD;;;;OAIG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,IAAI,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAc,EAAE,OAAwB;QAC9C,OAAO,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;CACF"}