@zooique/memora 4.0.0 → 5.1.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.
Files changed (245) hide show
  1. package/CHANGELOG.md +235 -1743
  2. package/README.en.md +43 -36
  3. package/README.md +308 -303
  4. package/dist/agent/agent.d.ts +46 -82
  5. package/dist/agent/agent.d.ts.map +1 -1
  6. package/dist/agent/agent.js +153 -220
  7. package/dist/agent/agent.js.map +1 -1
  8. package/dist/agent/assembler.d.ts +3 -16
  9. package/dist/agent/assembler.d.ts.map +1 -1
  10. package/dist/agent/assembler.js +76 -47
  11. package/dist/agent/assembler.js.map +1 -1
  12. package/dist/agent/backgroundTasks.d.ts +8 -1
  13. package/dist/agent/backgroundTasks.d.ts.map +1 -1
  14. package/dist/agent/backgroundTasks.js +8 -1
  15. package/dist/agent/backgroundTasks.js.map +1 -1
  16. package/dist/agent/budget.d.ts +23 -5
  17. package/dist/agent/budget.d.ts.map +1 -1
  18. package/dist/agent/budget.js +8 -2
  19. package/dist/agent/budget.js.map +1 -1
  20. package/dist/agent/builtinToolHandlers.d.ts +50 -10
  21. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  22. package/dist/agent/builtinToolHandlers.js +67 -20
  23. package/dist/agent/builtinToolHandlers.js.map +1 -1
  24. package/dist/agent/builtinTools.d.ts +16 -0
  25. package/dist/agent/builtinTools.d.ts.map +1 -1
  26. package/dist/agent/builtinTools.js +15 -4
  27. package/dist/agent/builtinTools.js.map +1 -1
  28. package/dist/agent/constants.d.ts +0 -6
  29. package/dist/agent/constants.d.ts.map +1 -1
  30. package/dist/agent/constants.js +7 -8
  31. package/dist/agent/constants.js.map +1 -1
  32. package/dist/agent/contextManager.d.ts +8 -0
  33. package/dist/agent/contextManager.d.ts.map +1 -1
  34. package/dist/agent/contextManager.js +45 -3
  35. package/dist/agent/contextManager.js.map +1 -1
  36. package/dist/agent/contextPreparer.d.ts +1 -1
  37. package/dist/agent/contextPreparer.d.ts.map +1 -1
  38. package/dist/agent/contextPreparer.js +15 -10
  39. package/dist/agent/contextPreparer.js.map +1 -1
  40. package/dist/agent/guardRail.d.ts +25 -10
  41. package/dist/agent/guardRail.d.ts.map +1 -1
  42. package/dist/agent/guardRail.js +154 -46
  43. package/dist/agent/guardRail.js.map +1 -1
  44. package/dist/agent/loop.d.ts +46 -13
  45. package/dist/agent/loop.d.ts.map +1 -1
  46. package/dist/agent/loop.js +145 -32
  47. package/dist/agent/loop.js.map +1 -1
  48. package/dist/agent/managers/archiveCoordinator.d.ts +15 -3
  49. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  50. package/dist/agent/managers/archiveCoordinator.js +13 -7
  51. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  52. package/dist/agent/managers/chatLockManager.d.ts +3 -9
  53. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  54. package/dist/agent/managers/chatLockManager.js +7 -25
  55. package/dist/agent/managers/chatLockManager.js.map +1 -1
  56. package/dist/agent/managers/llmCaller.d.ts.map +1 -1
  57. package/dist/agent/managers/llmCaller.js +27 -1
  58. package/dist/agent/managers/llmCaller.js.map +1 -1
  59. package/dist/agent/managers/memoryInspector.d.ts +12 -7
  60. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  61. package/dist/agent/managers/memoryInspector.js +32 -19
  62. package/dist/agent/managers/memoryInspector.js.map +1 -1
  63. package/dist/agent/managers/roundSummaryGenerator.d.ts +3 -1
  64. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -1
  65. package/dist/agent/managers/roundSummaryGenerator.js +14 -4
  66. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -1
  67. package/dist/agent/managers/sessionArchiver.d.ts +20 -6
  68. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  69. package/dist/agent/managers/sessionArchiver.js +19 -5
  70. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  71. package/dist/agent/managers/sessionManager.d.ts +21 -88
  72. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  73. package/dist/agent/managers/sessionManager.js +77 -278
  74. package/dist/agent/managers/sessionManager.js.map +1 -1
  75. package/dist/agent/seed/orchestrator.d.ts.map +1 -1
  76. package/dist/agent/seed/orchestrator.js +3 -3
  77. package/dist/agent/seed/orchestrator.js.map +1 -1
  78. package/dist/agent/seed/prepare.d.ts.map +1 -1
  79. package/dist/agent/seed/prepare.js +9 -4
  80. package/dist/agent/seed/prepare.js.map +1 -1
  81. package/dist/agent/seed/types.d.ts +11 -4
  82. package/dist/agent/seed/types.d.ts.map +1 -1
  83. package/dist/agent/seed/types.js +2 -2
  84. package/dist/agent/toolExecutor.d.ts +69 -18
  85. package/dist/agent/toolExecutor.d.ts.map +1 -1
  86. package/dist/agent/toolExecutor.js +188 -28
  87. package/dist/agent/toolExecutor.js.map +1 -1
  88. package/dist/agent/toolResultCache.js +1 -1
  89. package/dist/agent/toolRunner.d.ts +4 -2
  90. package/dist/agent/toolRunner.d.ts.map +1 -1
  91. package/dist/agent/toolRunner.js +7 -4
  92. package/dist/agent/toolRunner.js.map +1 -1
  93. package/dist/agent/types.d.ts +8 -25
  94. package/dist/agent/types.d.ts.map +1 -1
  95. package/dist/index.d.ts +9 -20
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +35 -32
  98. package/dist/index.js.map +1 -1
  99. package/dist/logging/logger.d.ts +4 -1
  100. package/dist/logging/logger.d.ts.map +1 -1
  101. package/dist/logging/logger.js +5 -2
  102. package/dist/logging/logger.js.map +1 -1
  103. package/dist/memory/gcService.d.ts.map +1 -1
  104. package/dist/memory/gcService.js +3 -5
  105. package/dist/memory/gcService.js.map +1 -1
  106. package/dist/memory/inMemorySessionStore.d.ts +2 -2
  107. package/dist/memory/inMemorySessionStore.js +2 -2
  108. package/dist/memory/inMemoryStorage.d.ts +4 -3
  109. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  110. package/dist/memory/inMemoryStorage.js +2 -2
  111. package/dist/memory/inMemoryStorage.js.map +1 -1
  112. package/dist/memory/nodeSqliteStorage.d.ts +17 -0
  113. package/dist/memory/nodeSqliteStorage.d.ts.map +1 -0
  114. package/dist/memory/nodeSqliteStorage.js +393 -0
  115. package/dist/memory/nodeSqliteStorage.js.map +1 -0
  116. package/dist/memory/projectManager.d.ts +10 -20
  117. package/dist/memory/projectManager.d.ts.map +1 -1
  118. package/dist/memory/projectManager.js +27 -41
  119. package/dist/memory/projectManager.js.map +1 -1
  120. package/dist/memory/roundStore.d.ts +76 -1
  121. package/dist/memory/roundStore.d.ts.map +1 -1
  122. package/dist/memory/roundStore.js.map +1 -1
  123. package/dist/memory/roundSummaryLookup.d.ts +26 -0
  124. package/dist/memory/roundSummaryLookup.d.ts.map +1 -0
  125. package/dist/memory/roundSummaryLookup.js +19 -0
  126. package/dist/memory/roundSummaryLookup.js.map +1 -0
  127. package/dist/memory/sessionStore.d.ts +19 -2
  128. package/dist/memory/sessionStore.d.ts.map +1 -1
  129. package/dist/memory/sessionStore.js.map +1 -1
  130. package/dist/memory/sourceValidation.d.ts +2 -13
  131. package/dist/memory/sourceValidation.d.ts.map +1 -1
  132. package/dist/memory/sourceValidation.js +5 -16
  133. package/dist/memory/sourceValidation.js.map +1 -1
  134. package/dist/memory/storageInterface.d.ts +26 -16
  135. package/dist/memory/storageInterface.d.ts.map +1 -1
  136. package/dist/memory/supersedeResolve.d.ts +39 -0
  137. package/dist/memory/supersedeResolve.d.ts.map +1 -0
  138. package/dist/memory/supersedeResolve.js +16 -0
  139. package/dist/memory/supersedeResolve.js.map +1 -0
  140. package/dist/memory/types.d.ts +3 -2
  141. package/dist/memory/types.d.ts.map +1 -1
  142. package/dist/memory/types.js +2 -1
  143. package/dist/memory/types.js.map +1 -1
  144. package/dist/role-pack/rolePackManager.d.ts +33 -24
  145. package/dist/role-pack/rolePackManager.d.ts.map +1 -1
  146. package/dist/role-pack/rolePackManager.js +48 -42
  147. package/dist/role-pack/rolePackManager.js.map +1 -1
  148. package/dist/role-pack/strategyKeys.d.ts +8 -0
  149. package/dist/role-pack/strategyKeys.d.ts.map +1 -1
  150. package/dist/role-pack/strategyKeys.js +10 -0
  151. package/dist/role-pack/strategyKeys.js.map +1 -1
  152. package/dist/role-pack/strategyResolver.d.ts +6 -1
  153. package/dist/role-pack/strategyResolver.d.ts.map +1 -1
  154. package/dist/role-pack/strategyResolver.js +20 -2
  155. package/dist/role-pack/strategyResolver.js.map +1 -1
  156. package/dist/role-pack/types.d.ts +5 -1
  157. package/dist/role-pack/types.d.ts.map +1 -1
  158. package/dist/security/confirmEntries.d.ts +21 -6
  159. package/dist/security/confirmEntries.d.ts.map +1 -1
  160. package/dist/security/confirmEntries.js +21 -6
  161. package/dist/security/confirmEntries.js.map +1 -1
  162. package/dist/security/pathGuard.d.ts +44 -10
  163. package/dist/security/pathGuard.d.ts.map +1 -1
  164. package/dist/security/pathGuard.js +70 -10
  165. package/dist/security/pathGuard.js.map +1 -1
  166. package/dist/utils/backgroundTask.d.ts +56 -34
  167. package/dist/utils/backgroundTask.d.ts.map +1 -1
  168. package/dist/utils/backgroundTask.js +130 -99
  169. package/dist/utils/backgroundTask.js.map +1 -1
  170. package/dist/utils/errors.d.ts +3 -2
  171. package/dist/utils/errors.d.ts.map +1 -1
  172. package/dist/utils/errors.js +3 -2
  173. package/dist/utils/errors.js.map +1 -1
  174. package/dist/utils/eventEmitter.d.ts +20 -22
  175. package/dist/utils/eventEmitter.d.ts.map +1 -1
  176. package/dist/utils/eventEmitter.js +0 -3
  177. package/dist/utils/eventEmitter.js.map +1 -1
  178. package/dist/utils/time.d.ts +3 -3
  179. package/dist/utils/time.d.ts.map +1 -1
  180. package/dist/utils/time.js +3 -3
  181. package/dist/utils/time.js.map +1 -1
  182. package/dist/utils/toError.d.ts +1 -1
  183. package/dist/utils/toError.js +1 -1
  184. package/dist/web-fetch/loginWall.d.ts +39 -0
  185. package/dist/web-fetch/loginWall.d.ts.map +1 -0
  186. package/dist/web-fetch/loginWall.js +78 -0
  187. package/dist/web-fetch/loginWall.js.map +1 -0
  188. package/dist/web-fetch/types.d.ts +8 -0
  189. package/dist/web-fetch/types.d.ts.map +1 -1
  190. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -1
  191. package/dist/web-fetch/webFetchProvider.js +3 -1
  192. package/dist/web-fetch/webFetchProvider.js.map +1 -1
  193. package/dist/web-search/fetchWebSearchProvider.js +28 -23
  194. package/dist/web-search/fetchWebSearchProvider.js.map +1 -1
  195. package/docs/architecture/role-pack-authoring-guide.md +7 -1
  196. package/docs/architecture/role-pack-spec.md +11 -6
  197. package/docs/memora-api-reference.md +1354 -1276
  198. package/docs/memora-/345/215/207/347/272/247/346/214/207/345/215/227-4.x-/345/210/260-5.0.0.md +385 -0
  199. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +89 -49
  200. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -148
  201. package/package.json +13 -4
  202. package/role-packs/README.md +41 -40
  203. package/role-packs/memora/345/212/251/346/211/213/rules.md +5 -4
  204. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +1 -0
  205. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -46
  206. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +17 -16
  207. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -46
  208. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -29
  209. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +73 -48
  210. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +445 -441
  211. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +62 -62
  212. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +1 -0
  213. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +2 -1
  214. package/dist/agent/managers/dedupManager.d.ts +0 -85
  215. package/dist/agent/managers/dedupManager.d.ts.map +0 -1
  216. package/dist/agent/managers/dedupManager.js +0 -248
  217. package/dist/agent/managers/dedupManager.js.map +0 -1
  218. package/dist/agent/managers/goalConsistencyChecker.d.ts +0 -42
  219. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +0 -1
  220. package/dist/agent/managers/goalConsistencyChecker.js +0 -178
  221. package/dist/agent/managers/goalConsistencyChecker.js.map +0 -1
  222. package/dist/agent/managers/llmJudgeHelper.d.ts +0 -21
  223. package/dist/agent/managers/llmJudgeHelper.d.ts.map +0 -1
  224. package/dist/agent/managers/llmJudgeHelper.js +0 -32
  225. package/dist/agent/managers/llmJudgeHelper.js.map +0 -1
  226. package/dist/agent/managers/memoryAdvisor.d.ts +0 -105
  227. package/dist/agent/managers/memoryAdvisor.d.ts.map +0 -1
  228. package/dist/agent/managers/memoryAdvisor.js +0 -322
  229. package/dist/agent/managers/memoryAdvisor.js.map +0 -1
  230. package/dist/agent/managers/memoryGovernance.d.ts +0 -24
  231. package/dist/agent/managers/memoryGovernance.d.ts.map +0 -1
  232. package/dist/agent/managers/memoryGovernance.js +0 -46
  233. package/dist/agent/managers/memoryGovernance.js.map +0 -1
  234. package/dist/memory/governance.d.ts +0 -17
  235. package/dist/memory/governance.d.ts.map +0 -1
  236. package/dist/memory/governance.js +0 -17
  237. package/dist/memory/governance.js.map +0 -1
  238. package/dist/memory/projectRegistry.d.ts +0 -47
  239. package/dist/memory/projectRegistry.d.ts.map +0 -1
  240. package/dist/memory/projectRegistry.js +0 -151
  241. package/dist/memory/projectRegistry.js.map +0 -1
  242. package/dist/utils/recallDefaults.d.ts +0 -16
  243. package/dist/utils/recallDefaults.d.ts.map +0 -1
  244. package/dist/utils/recallDefaults.js +0 -16
  245. package/dist/utils/recallDefaults.js.map +0 -1
@@ -1,322 +0,0 @@
1
- import { nowIso, ONE_DAY_MS } from '../../utils/time.js';
2
- import { roundTo } from '../../utils/math.js';
3
- // 召回排除默认值 SSOT 共享(设定记忆已归角色包,默认不排除)
4
- import { DEFAULT_RECALL_EXCLUDE_SOURCES } from '../../utils/recallDefaults.js';
5
- // LLM judge 高阶函数(流式累积 + parseLlmJson + configError 封装)
6
- import { judgeWithLlm } from '../../agent/managers/llmJudgeHelper.js';
7
- import { byAccessedDesc } from '../../utils/array.js';
8
- import { truncate } from '../../utils/strings.js';
9
- import { logger } from '../../logging/logger.js';
10
- // 治理源列表 SSOT(设定记忆已归角色包)
11
- import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
12
- // ─── 常量 ────────────────────────────────────────────────
13
- /** 关联推荐:每个 source 采样 top-N 条 */
14
- const SUGGEST_TOP_PER_SOURCE = 3;
15
- /** 关联推荐:时效性窗口(天),超过此天数 relevance 归零(score 退役后纯时效排序) */
16
- const SUGGEST_RECENCY_WINDOW_DAYS = 30;
17
- /** 推荐内容预览字符数 */
18
- const ADVISOR_PREVIEW_LEN = 120;
19
- // ─── L3 冲突检测常量 ────────────────────────────────────
20
- /** 单个 source 内参与配对的条数上限(控制 O(n²) 配对规模) */
21
- const CONFLICT_CANDIDATES_PER_SOURCE = 10;
22
- /** 单次 LLM 冲突判断的候选对数上限 */
23
- const CONFLICT_PAIR_LIMIT = 10;
24
- /** LLM 冲突判断超时(ms) */
25
- const CONFLICT_TIMEOUT_MS = 15_000;
26
- /** 候选内容预览长度(送入 LLM 前截断) */
27
- const CONFLICT_CONTENT_PREVIEW_LEN = 200;
28
- // ─── 类 ──────────────────────────────────────────────────
29
- /** 记忆顾问:与 MemoryInspector 分工(Inspector 直接数据查询,Advisor 分析计算:健康诊断 + 推荐排序 + 冲突检测) */
30
- export class MemoryAdvisor {
31
- index;
32
- /** 后台 LLM Provider(可选,用于 L3 冲突检测,未注入时跳过) */
33
- backgroundProvider;
34
- /** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时推荐/冲突检测空转,测试可显式注入) */
35
- sources;
36
- constructor(index, backgroundProvider = null, sources = GOVERNANCE_SOURCES) {
37
- this.index = index;
38
- this.backgroundProvider = backgroundProvider;
39
- this.sources = sources;
40
- }
41
- // ─── 源健康诊断 ─────────────────────────────────────────
42
- /**
43
- * 记忆源健康诊断:逐 source 计算记忆数量 / 最近访问天数(纯事实观测)。
44
- * 不设健康等级:记忆健康由 supersede(写时取代)/ 命中体现,
45
- * 无需榜单级 status 判定(daysSinceLastAccess 作冷记忆观测)。
46
- * 纯只读同步不调 LLM,用 getAllSources() 发现所有 source 标签(替代全量 search)。
47
- */
48
- sourceHealth() {
49
- // 获取所有有数据的 source 标签
50
- const sourceMap = this.index.getAllSources();
51
- const sourceSet = new Set();
52
- for (const [source, count] of sourceMap) {
53
- if (count > 0)
54
- sourceSet.add(source);
55
- }
56
- const entries = [];
57
- for (const source of sourceSet) {
58
- const memories = this.index.getBySource(source);
59
- const count = memories.length;
60
- // 最近访问时间(取该 source 中最新 accessedAt)
61
- const latestAccess = memories
62
- .map((m) => new Date(m.accessedAt).getTime())
63
- .filter((t) => !isNaN(t))
64
- .sort((a, b) => b - a)[0] ?? 0;
65
- const daysSinceLastAccess = latestAccess > 0 ? (Date.now() - latestAccess) / ONE_DAY_MS : Infinity;
66
- entries.push({
67
- source,
68
- count,
69
- daysSinceLastAccess: roundTo(daysSinceLastAccess, 1),
70
- });
71
- }
72
- return {
73
- // 按 source 名稳定排序(保证输出可预期;无关健康等级)
74
- sources: entries.sort((a, b) => a.source.localeCompare(b.source)),
75
- diagnosedAt: nowIso(),
76
- };
77
- }
78
- // ─── 关联推荐 ─────────────────────────────────────────
79
- /**
80
- * 关联推荐:不调 LLM 纯计算,综合 accessedAt(时效)+ source 多样性,
81
- * 返回"相关但尚未直接搜索到"的记忆。query 提供时结合搜索命中推荐,省略时基于最近使用。
82
- * relevance 为纯时效(recency)
83
- */
84
- suggest(query, options = {}) {
85
- const { limit = 5, excludeSources = [...DEFAULT_RECALL_EXCLUDE_SOURCES] } = options;
86
- const now = Date.now();
87
- // 收集候选记忆
88
- const candidates = new Map();
89
- // 有 query 时先搜直接命中(标记 searchHit)
90
- if (query && query.trim()) {
91
- const directHits = this.index.search(query, limit * 3);
92
- for (const m of directHits) {
93
- if (!excludeSources.includes(m.source)) {
94
- candidates.set(m.id, { memory: m, searchHit: true });
95
- }
96
- }
97
- }
98
- // 按 source 分组采样,确保来源多样性
99
- for (const source of this.sources) {
100
- const count = this.index.countBySource(source);
101
- if (count > 0 && !excludeSources.includes(source)) {
102
- const memories = this.index.getBySource(source);
103
- // 取最近使用的前 N 条(score 退役后按 accessedAt 降序)
104
- const top = memories.sort(byAccessedDesc).slice(0, SUGGEST_TOP_PER_SOURCE);
105
- for (const m of top) {
106
- if (!candidates.has(m.id)) {
107
- candidates.set(m.id, { memory: m, searchHit: false });
108
- }
109
- }
110
- }
111
- }
112
- if (candidates.size === 0)
113
- return [];
114
- const scored = [];
115
- for (const { memory, searchHit } of candidates.values()) {
116
- // 时效性分:窗口内线性衰减,超过窗口归零;score 退役后 relevance 即纯时效
117
- const accessedAt = new Date(memory.accessedAt);
118
- const daysSinceAccess = isNaN(accessedAt.getTime())
119
- ? SUGGEST_RECENCY_WINDOW_DAYS
120
- : (now - accessedAt.getTime()) / ONE_DAY_MS;
121
- const relevance = Math.max(0, 1 - daysSinceAccess / SUGGEST_RECENCY_WINDOW_DAYS);
122
- // 生成推荐理由
123
- let reason;
124
- if (searchHit) {
125
- reason = '与搜索相关';
126
- }
127
- else if (daysSinceAccess < 1) {
128
- reason = '最近访问';
129
- }
130
- else {
131
- reason = `${memory.source} 推荐`;
132
- }
133
- scored.push({ memory, searchHit, relevance, reason });
134
- }
135
- // 排序:搜索命中优先,然后按 relevance 降序
136
- scored.sort((a, b) => {
137
- if (a.searchHit !== b.searchHit)
138
- return a.searchHit ? -1 : 1;
139
- return b.relevance - a.relevance;
140
- });
141
- return scored.slice(0, limit).map(({ memory, relevance, reason }) => ({
142
- id: memory.id,
143
- name: memory.name,
144
- source: memory.source,
145
- relevance: roundTo(relevance, 2),
146
- contentPreview: truncate(memory.content, ADVISOR_PREVIEW_LEN),
147
- reason,
148
- }));
149
- }
150
- // ─── L3 语义冲突检测(可选,backgroundProvider 注入后启用) ───
151
- /**
152
- * 语义冲突检测:加载候选(每 source top 10)→ 同 source 两两配对(前 10 对)→ LLM 判断冲突。
153
- * 仅检测不修复(不自动降级,冲突需用户决策);LLM 失败不阻塞;provider 未注入静默跳过。
154
- */
155
- async detectConflicts(signal) {
156
- // provider 未注入时静默降级
157
- if (!this.backgroundProvider) {
158
- return {
159
- scannedCount: 0,
160
- pairCount: 0,
161
- conflictCount: 0,
162
- conflicts: [],
163
- skippedReason: 'backgroundProvider 未注入',
164
- };
165
- }
166
- const candidates = [];
167
- for (const source of this.sources) {
168
- const memories = this.index.getBySource(source);
169
- // 按 accessedAt 降序取 top N(score 退役后按最近使用采样)
170
- const top = memories.sort(byAccessedDesc).slice(0, CONFLICT_CANDIDATES_PER_SOURCE);
171
- candidates.push(...top);
172
- }
173
- if (candidates.length < 2) {
174
- return {
175
- scannedCount: candidates.length,
176
- pairCount: 0,
177
- conflictCount: 0,
178
- conflicts: [],
179
- skippedReason: '候选记忆不足(少于 2 条)',
180
- };
181
- }
182
- // 同 source 内两两配对
183
- const pairs = this.findConflictCandidates(candidates);
184
- if (pairs.length === 0) {
185
- return {
186
- scannedCount: candidates.length,
187
- pairCount: 0,
188
- conflictCount: 0,
189
- conflicts: [],
190
- skippedReason: '无同 source 候选对',
191
- };
192
- }
193
- // 逐对调用 LLM 判断冲突
194
- const conflicts = [];
195
- for (const pair of pairs) {
196
- try {
197
- const verdict = await this.judgeConflict(pair[0], pair[1], signal);
198
- if (verdict.hasConflict) {
199
- conflicts.push(verdict);
200
- logger.info({ memoryA: verdict.memoryA.id, memoryB: verdict.memoryB.id, reason: verdict.reason }, '冲突检测:发现语义冲突');
201
- }
202
- }
203
- catch (err) {
204
- // 单对 LLM 判断失败不阻塞后续检测
205
- logger.warn({ err, pairId: `${pair[0].id}↔${pair[1].id}` }, '冲突检测:LLM 判断失败,跳过此对');
206
- }
207
- }
208
- return {
209
- scannedCount: candidates.length,
210
- pairCount: pairs.length,
211
- conflictCount: conflicts.length,
212
- conflicts,
213
- };
214
- }
215
- /** 筛选同 source 内候选冲突对:按 source 分组两两配对,限制每 source 配对数避免 O(n²) 爆炸,总上限 10 对 */
216
- findConflictCandidates(candidates) {
217
- // 按 source 分组
218
- const bySource = new Map();
219
- for (const m of candidates) {
220
- const list = bySource.get(m.source) ?? [];
221
- list.push(m);
222
- bySource.set(m.source, list);
223
- }
224
- // 同 source 内两两配对,均匀分配配对数
225
- const pairs = [];
226
- const sources = [...bySource.keys()];
227
- // 每个 source 分配的配对数配额(总上限 / source 数,至少 1 对/source)
228
- const quotaPerSource = Math.max(1, Math.ceil(CONFLICT_PAIR_LIMIT / sources.length));
229
- for (const source of sources) {
230
- const list = bySource.get(source);
231
- if (!list || list.length < 2)
232
- continue;
233
- let count = 0;
234
- for (let i = 0; i < list.length && count < quotaPerSource; i++) {
235
- for (let j = i + 1; j < list.length && count < quotaPerSource; j++) {
236
- pairs.push([list[i], list[j]]);
237
- count++;
238
- }
239
- }
240
- if (pairs.length >= CONFLICT_PAIR_LIMIT)
241
- break;
242
- }
243
- return pairs.slice(0, CONFLICT_PAIR_LIMIT);
244
- }
245
- /**
246
- * 调用 LLM 判断两条记忆是否冲突:结构化 JSON 输出(hasConflict+conflictDescription+recommendation+reason)。
247
- * 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
248
- */
249
- async judgeConflict(memoryA, memoryB, signal) {
250
- const messages = buildConflictMessages(memoryA, memoryB);
251
- const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 300, timeoutMs: CONFLICT_TIMEOUT_MS, signal }, 'LLM 冲突判断返回非法 JSON');
252
- // 校验 recommendation 字段(允许 'a' / 'b' / 'both',其他值忽略)
253
- const recRaw = parsed.recommendation;
254
- const recommendation = recRaw === 'a' || recRaw === 'b' || recRaw === 'both' ? recRaw : undefined;
255
- return {
256
- memoryA,
257
- memoryB,
258
- hasConflict: parsed.hasConflict === true,
259
- conflictDescription: typeof parsed.conflictDescription === 'string' ? parsed.conflictDescription : undefined,
260
- recommendation,
261
- reason: typeof parsed.reason === 'string' ? parsed.reason : '(LLM 未提供理由)',
262
- };
263
- }
264
- }
265
- // ─── L3 冲突检测 Prompt 模板(模块级函数) ───
266
- /** 构建冲突判断的 LLM 消息:system 定义冲突规则 + user 携带两条记忆内容预览,few-shot 降误判率 */
267
- function buildConflictMessages(memoryA, memoryB) {
268
- const contentA = memoryA.content.length > CONFLICT_CONTENT_PREVIEW_LEN
269
- ? truncate(memoryA.content, CONFLICT_CONTENT_PREVIEW_LEN, '…[截断]')
270
- : memoryA.content;
271
- const contentB = memoryB.content.length > CONFLICT_CONTENT_PREVIEW_LEN
272
- ? truncate(memoryB.content, CONFLICT_CONTENT_PREVIEW_LEN, '…[截断]')
273
- : memoryB.content;
274
- return [
275
- {
276
- role: 'system',
277
- content: `你是记忆冲突检测助手。判断给定的两条记忆是否存在语义冲突(表达互相矛盾的信息)。
278
-
279
- 判断规则:
280
- - 存在冲突 = 两条记忆表达的信息互相矛盾,不能同时为真(如"喜欢 X" vs "讨厌 X")
281
- - 无冲突 = 两条记忆信息互补、独立或不相关
282
- - 不同维度不构成冲突(如"擅长后端" vs "偏好前端"是不同维度,非冲突)
283
- - 时间演化不构成冲突(如"用 React 16" vs "用 React 18"是版本升级,非冲突)
284
-
285
- 输出 JSON 格式:
286
- {
287
- "hasConflict": true/false,
288
- "conflictDescription": "冲突点描述(仅 hasConflict=true 时提供)",
289
- "recommendation": "a/b/both(建议保留哪条:a=保留A,b=保留B,both=都保留需用户裁决)",
290
- "reason": "判断理由(简短说明)"
291
- }
292
-
293
- 示例:
294
- 输入 A: "用户喜欢使用 JavaScript"
295
- 输入 B: "用户讨厌 JavaScript"
296
- 输出: {"hasConflict": true, "conflictDescription": "对 JavaScript 的态度矛盾", "recommendation": "both", "reason": "需用户裁决当前偏好"}
297
-
298
- 输入 A: "用户擅长后端开发"
299
- 输入 B: "用户偏好前端开发"
300
- 输出: {"hasConflict": false, "reason": "擅长领域与偏好领域是不同维度,非冲突"}`,
301
- },
302
- {
303
- role: 'user',
304
- content: `请判断以下两条记忆是否存在语义冲突:
305
-
306
- 记忆 A:
307
- - 名称:${memoryA.name}
308
- - 来源:${memoryA.source}
309
- - 创建时间:${memoryA.createdAt}
310
- - 内容:${contentA}
311
-
312
- 记忆 B:
313
- - 名称:${memoryB.name}
314
- - 来源:${memoryB.source}
315
- - 创建时间:${memoryB.createdAt}
316
- - 内容:${contentB}
317
-
318
- 请输出 JSON 判断结果。`,
319
- },
320
- ];
321
- }
322
- //# sourceMappingURL=memoryAdvisor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memoryAdvisor.js","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,mCAAmC;AACnC,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAE3E,uDAAuD;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,wBAAwB;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,0DAA0D;AAE1D,gCAAgC;AAChC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,uDAAuD;AACvD,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,gBAAgB;AAChB,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,qDAAqD;AACrD,0CAA0C;AAC1C,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAC1C,yBAAyB;AACzB,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,qBAAqB;AACrB,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,2BAA2B;AAC3B,MAAM,4BAA4B,GAAG,GAAG,CAAC;AA0EzC,2DAA2D;AAE3D,kFAAkF;AAClF,MAAM,OAAO,aAAa;IAOL;IANnB,4CAA4C;IAC3B,kBAAkB,CAAqB;IACxD,0DAA0D;IACzC,OAAO,CAAoB;IAE5C,YACmB,KAAqB,EACtC,qBAAyC,IAAI,EAC7C,UAA6B,kBAAkB;QAF9B,UAAK,GAAL,KAAK,CAAgB;QAItC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,sDAAsD;IAEtD;;;;;OAKG;IACH,YAAY;QACV,qBAAqB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACxC,IAAI,KAAK,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;YAE9B,mCAAmC;YACnC,MAAM,YAAY,GAChB,QAAQ;iBACL,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,mBAAmB,GACvB,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;YAEzE,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM;gBACN,KAAK;gBACL,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,iCAAiC;YACjC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjE,WAAW,EAAE,MAAM,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,qDAAqD;IAErD;;;;OAIG;IACH,OAAO,CAAC,KAAc,EAAE,UAA0B,EAAE;QAClD,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,GAAG,8BAA8B,CAAC,EAAE,GAAG,OAAO,CAAC;QAEpF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,SAAS;QACT,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkD,CAAC;QAE7E,gCAAgC;QAChC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACvD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAChD,wCAAwC;gBACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;gBAC3E,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;oBACpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC1B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,MAAM,MAAM,GACV,EAAE,CAAC;QAEL,KAAK,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACxD,+CAA+C;YAC/C,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACjD,CAAC,CAAC,2BAA2B;gBAC7B,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,GAAG,2BAA2B,CAAC,CAAC;YAEjF,SAAS;YACT,IAAI,MAAc,CAAC;YACnB,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,GAAG,OAAO,CAAC;YACnB,CAAC;iBAAM,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,GAAG,MAAM,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC;YACjC,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,6BAA6B;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACpE,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAChC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC;YAC7D,MAAM;SACP,CAAC,CAAC,CAAC;IACN,CAAC;IAED,iDAAiD;IAEjD;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,MAAoB;QACxC,oBAAoB;QACpB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,OAAO;gBACL,YAAY,EAAE,CAAC;gBACf,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,wBAAwB;aACxC,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAChD,2CAA2C;YAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,8BAA8B,CAAC,CAAC;YACnF,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,YAAY,EAAE,UAAU,CAAC,MAAM;gBAC/B,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,gBAAgB;aAChC,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,YAAY,EAAE,UAAU,CAAC,MAAM;gBAC/B,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,eAAe;aAC/B,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,MAAM,SAAS,GAAsB,EAAE,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACnE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBACxB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,CACT,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EACpF,aAAa,CACd,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAqB;gBACrB,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAC9C,oBAAoB,CACrB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,YAAY,EAAE,UAAU,CAAC,MAAM;YAC/B,SAAS,EAAE,KAAK,CAAC,MAAM;YACvB,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC;IAED,2EAA2E;IACnE,sBAAsB,CAAC,UAAoB;QACjD,cAAc;QACd,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,yBAAyB;QACzB,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,mDAAmD;QACnD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAEpF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YACvC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;oBACjC,KAAK,EAAE,CAAC;gBACV,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,IAAI,mBAAmB;gBAAE,MAAM;QACjD,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,aAAa,CACzB,OAAe,EACf,OAAe,EACf,MAAoB;QAEpB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,YAAY,CAM/B,IAAI,CAAC,kBAAmB,EACxB,QAAQ,EACR,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAC1D,mBAAmB,CACpB,CAAC;QAEF,oDAAoD;QACpD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;QACrC,MAAM,cAAc,GAClB,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7E,OAAO;YACL,OAAO;YACP,OAAO;YACP,WAAW,EAAE,MAAM,CAAC,WAAW,KAAK,IAAI;YACxC,mBAAmB,EACjB,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS;YACzF,cAAc;YACd,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa;SAC1E,CAAC;IACJ,CAAC;CACF;AAED,mCAAmC;AAEnC,mEAAmE;AACnE,SAAS,qBAAqB,CAAC,OAAe,EAAE,OAAe;IAC7D,MAAM,QAAQ,GACZ,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,4BAA4B;QACnD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,4BAA4B,EAAE,OAAO,CAAC;QAClE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACtB,MAAM,QAAQ,GACZ,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,4BAA4B;QACnD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,4BAA4B,EAAE,OAAO,CAAC;QAClE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAEtB,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;2DAuB4C;SACtD;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE;;;OAGR,OAAO,CAAC,IAAI;OACZ,OAAO,CAAC,MAAM;SACZ,OAAO,CAAC,SAAS;OACnB,QAAQ;;;OAGR,OAAO,CAAC,IAAI;OACZ,OAAO,CAAC,MAAM;SACZ,OAAO,CAAC,SAAS;OACnB,QAAQ;;eAEA;SACV;KACF,CAAC;AACJ,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * 记忆治理统一门面 — 聚合记忆治理操作(L1 去重 / L3 冲突 / 诊断)。
3
- * 治理模型 = supersede(写时取代)+ 命中刷新 accessedAt(只 touch、不做重要度加权),无衰减(见架构决策)。
4
- * 根本动机:治理方法原散落 Agent 公开 API 中职责碎片化,收束为单一门面 `agent.governance.xxx()`。
5
- * 门面仅做委托 + 空值降级不引入新逻辑(每层抽象对应一个真实故障点);
6
- * 底层 Manager 未注入时返回空报告(非抛错),符合"降级优先"。
7
- */
8
- import type { DedupManager, DedupReport } from '../../agent/managers/dedupManager.js';
9
- import type { MemoryAdvisor, ConflictReport } from '../../agent/managers/memoryAdvisor.js';
10
- import type { SourceHealthReport, SuggestOptions, SuggestHit } from '../../agent/managers/memoryAdvisor.js';
11
- export declare class MemoryGovernance {
12
- private readonly dedupManager;
13
- private readonly memoryAdvisor;
14
- constructor(dedupManager: DedupManager | null, memoryAdvisor: MemoryAdvisor | null);
15
- /** 语义去重:扫描名称相似记忆对,LLM 判断等价性,降级重复记忆 */
16
- deduplicate(signal?: AbortSignal): Promise<DedupReport>;
17
- /** 冲突检测:LLM 判断同 source 记忆是否存在语义矛盾 */
18
- detectConflicts(signal?: AbortSignal): Promise<ConflictReport>;
19
- /** 记忆源健康诊断(纯只读);advisor 未注入返回 null */
20
- sourceHealth(): SourceHealthReport | null;
21
- /** 记忆关联推荐(纯只读) */
22
- suggest(query?: string, options?: SuggestOptions): SuggestHit[];
23
- }
24
- //# sourceMappingURL=memoryGovernance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memoryGovernance.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryGovernance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,UAAU,EACX,MAAM,mCAAmC,CAAC;AAE3C,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,aAAa,EAAE,aAAa,GAAG,IAAI;IAKtD,sCAAsC;IAChC,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAe7D,qCAAqC;IAC/B,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAepE,sCAAsC;IACtC,YAAY,IAAI,kBAAkB,GAAG,IAAI;IAIzC,kBAAkB;IAClB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,UAAU,EAAE;CAGhE"}
@@ -1,46 +0,0 @@
1
- export class MemoryGovernance {
2
- dedupManager;
3
- memoryAdvisor;
4
- constructor(dedupManager, memoryAdvisor) {
5
- this.dedupManager = dedupManager;
6
- this.memoryAdvisor = memoryAdvisor;
7
- }
8
- // ── L1 语义去重 ──────────────────────────────────────
9
- /** 语义去重:扫描名称相似记忆对,LLM 判断等价性,降级重复记忆 */
10
- async deduplicate(signal) {
11
- if (!this.dedupManager) {
12
- return {
13
- scannedCount: 0,
14
- pairCount: 0,
15
- deduplicatedCount: 0,
16
- demotedIds: [],
17
- skippedReason: 'Agent 未初始化',
18
- };
19
- }
20
- return this.dedupManager.deduplicateMemories(signal);
21
- }
22
- // ── L3 冲突检测 ──────────────────────────────────────
23
- /** 冲突检测:LLM 判断同 source 记忆是否存在语义矛盾 */
24
- async detectConflicts(signal) {
25
- if (!this.memoryAdvisor) {
26
- return {
27
- scannedCount: 0,
28
- pairCount: 0,
29
- conflictCount: 0,
30
- conflicts: [],
31
- skippedReason: 'Agent 未初始化',
32
- };
33
- }
34
- return this.memoryAdvisor.detectConflicts(signal);
35
- }
36
- // ── 诊断 ─────────────────────────────────────────────
37
- /** 记忆源健康诊断(纯只读);advisor 未注入返回 null */
38
- sourceHealth() {
39
- return this.memoryAdvisor?.sourceHealth() ?? null;
40
- }
41
- /** 记忆关联推荐(纯只读) */
42
- suggest(query, options) {
43
- return this.memoryAdvisor?.suggest(query, options) ?? [];
44
- }
45
- }
46
- //# sourceMappingURL=memoryGovernance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memoryGovernance.js","sourceRoot":"","sources":["../../../src/agent/managers/memoryGovernance.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,gBAAgB;IAER;IACA;IAFnB,YACmB,YAAiC,EACjC,aAAmC;QADnC,iBAAY,GAAZ,YAAY,CAAqB;QACjC,kBAAa,GAAb,aAAa,CAAsB;IACnD,CAAC;IAEJ,oDAAoD;IAEpD,sCAAsC;IACtC,KAAK,CAAC,WAAW,CAAC,MAAoB;QACpC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO;gBACL,YAAY,EAAE,CAAC;gBACf,SAAS,EAAE,CAAC;gBACZ,iBAAiB,EAAE,CAAC;gBACpB,UAAU,EAAE,EAAE;gBACd,aAAa,EAAE,YAAY;aAC5B,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,oDAAoD;IAEpD,qCAAqC;IACrC,KAAK,CAAC,eAAe,CAAC,MAAoB;QACxC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;gBACL,YAAY,EAAE,CAAC;gBACf,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,YAAY;aAC5B,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,sDAAsD;IAEtD,sCAAsC;IACtC,YAAY;QACV,OAAO,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,IAAI,CAAC;IACpD,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,KAAc,EAAE,OAAwB;QAC9C,OAAO,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;CACF"}
@@ -1,17 +0,0 @@
1
- /**
2
- * 记忆治理共享常量 — 治理源列表。
3
- * 排序单归语义分:使用轨迹唯一事实源为 accessedAt,无 score 写位/排序/clamp 位。
4
- * 纯常量模块(零依赖,仅类型 import),被 agent/managers 多模块消费,符合 agent → memory 单向依赖。
5
- *
6
- * 治理模型:supersede(写时取代);无衰减——
7
- * 摘要是事实记录无"过时"语义,记忆有效性由 superseded 写时取代判定,
8
- * 低频记忆经相关性排序自然后移退出召回面,无"沉底/自然遗忘归档"语义。
9
- */
10
- /**
11
- * 治理源列表:实际写入记忆库的 source 才参与去重 / 冲突治理。
12
- * 当前记忆库唯一自动轨 = round-summary(摘要即记忆本体,见 memory-as-summary.md),
13
- * 其治理由 superseded 写时取代承担,不入本数组;content 历史残留 source 无生产写入路径。
14
- * 空列表时 dedup/冲突检测空转(测试可显式注入治理源)。
15
- */
16
- export declare const GOVERNANCE_SOURCES: readonly string[];
17
- //# sourceMappingURL=governance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"governance.d.ts","sourceRoot":"","sources":["../../src/memory/governance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAO,CAAC"}
@@ -1,17 +0,0 @@
1
- /**
2
- * 记忆治理共享常量 — 治理源列表。
3
- * 排序单归语义分:使用轨迹唯一事实源为 accessedAt,无 score 写位/排序/clamp 位。
4
- * 纯常量模块(零依赖,仅类型 import),被 agent/managers 多模块消费,符合 agent → memory 单向依赖。
5
- *
6
- * 治理模型:supersede(写时取代);无衰减——
7
- * 摘要是事实记录无"过时"语义,记忆有效性由 superseded 写时取代判定,
8
- * 低频记忆经相关性排序自然后移退出召回面,无"沉底/自然遗忘归档"语义。
9
- */
10
- /**
11
- * 治理源列表:实际写入记忆库的 source 才参与去重 / 冲突治理。
12
- * 当前记忆库唯一自动轨 = round-summary(摘要即记忆本体,见 memory-as-summary.md),
13
- * 其治理由 superseded 写时取代承担,不入本数组;content 历史残留 source 无生产写入路径。
14
- * 空列表时 dedup/冲突检测空转(测试可显式注入治理源)。
15
- */
16
- export const GOVERNANCE_SOURCES = [];
17
- //# sourceMappingURL=governance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"governance.js","sourceRoot":"","sources":["../../src/memory/governance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAsB,EAAE,CAAC"}
@@ -1,47 +0,0 @@
1
- import { MemoraError } from '../utils/errors.js';
2
- /** 项目注册表条目 */
3
- export interface ProjectEntry {
4
- /** 项目根目录的绝对路径 */
5
- path: string;
6
- /** 项目名称(用户自定义或目录名) */
7
- name: string;
8
- /** 最后打开时间 */
9
- lastOpened: string;
10
- }
11
- /**
12
- * 注册表损坏错误:projects.json 存在但无法解析(JSON 语法/结构不符)时抛出。
13
- * 与"文件不存在"(首次正常)区分;register/unregister 必须向上传播防空覆盖,
14
- * list getter 可捕获降级返回空数组(只读不破坏数据)。保留 registryPath 供备份/排查。
15
- */
16
- export declare class ProjectRegistryCorruptError extends MemoraError {
17
- /** 损坏文件的绝对路径,便于备份/排查 */
18
- readonly registryPath: string;
19
- constructor(registryPath: string, cause?: unknown);
20
- }
21
- /**
22
- * 项目注册表:管理 projects.json 读写与条目维护;Windows 不区分大小写,路径不同大小写视为同一项目。
23
- */
24
- export declare class ProjectRegistry {
25
- private readonly registryPath;
26
- /** @param registryPath 注册表文件绝对路径(projects.json) */
27
- constructor(registryPath: string);
28
- /**
29
- * 列出已注册项目(同步 getter 契约)。只读:损坏时降级返回空数组(不破坏数据),
30
- * 与 register/unregister 写入路径须抛错不同。
31
- */
32
- get list(): ProjectEntry[];
33
- /** 注册项目:路径大小写不敏感,视为同一项目(更新而非新增) */
34
- register(projectPath: string, name: string): void;
35
- /** 移除项目(路径大小写不敏感匹配) */
36
- unregister(projectPath: string): void;
37
- /** 从路径推断项目名称(取最后一段目录名,无法推断返回 'unnamed') */
38
- static inferProjectName(projectPath: string): string;
39
- /**
40
- * 同步读取注册表(list getter 契约)。语义:文件不存在=空数组(首次启动);
41
- * 解析失败或顶层非数组=抛 ProjectRegistryCorruptError;单条不合法仅过滤。
42
- */
43
- private read;
44
- /** 写入注册表 */
45
- private write;
46
- }
47
- //# sourceMappingURL=projectRegistry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projectRegistry.d.ts","sourceRoot":"","sources":["../../src/memory/projectRegistry.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMhD,cAAc;AACd,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,WAAW;IAC1D,wBAAwB;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAElB,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAkBlD;AA2BD;;GAEG;AACH,qBAAa,eAAe;IAEd,OAAO,CAAC,QAAQ,CAAC,YAAY;IADzC,mDAAmD;gBACtB,YAAY,EAAE,MAAM;IAEjD;;;OAGG;IACH,IAAI,IAAI,IAAI,YAAY,EAAE,CAczB;IAED,mCAAmC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAoBjD,uBAAuB;IACvB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMrC,2CAA2C;IAC3C,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAKpD;;;OAGG;IACH,OAAO,CAAC,IAAI;IAkCZ,YAAY;IACZ,OAAO,CAAC,KAAK;CAMd"}