@zooique/memora 3.0.1 → 5.0.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 (282) hide show
  1. package/CHANGELOG.md +161 -1033
  2. package/README.en.md +46 -39
  3. package/README.md +40 -35
  4. package/config.example.json +1 -8
  5. package/dist/agent/agent.d.ts +88 -80
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +272 -221
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +22 -21
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +120 -46
  12. package/dist/agent/assembler.js.map +1 -1
  13. package/dist/agent/backgroundTasks.d.ts +194 -0
  14. package/dist/agent/backgroundTasks.d.ts.map +1 -0
  15. package/dist/agent/backgroundTasks.js +314 -0
  16. package/dist/agent/backgroundTasks.js.map +1 -0
  17. package/dist/agent/budget.d.ts +23 -5
  18. package/dist/agent/budget.d.ts.map +1 -1
  19. package/dist/agent/budget.js +8 -2
  20. package/dist/agent/budget.js.map +1 -1
  21. package/dist/agent/builtinToolHandlers.d.ts +29 -9
  22. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  23. package/dist/agent/builtinToolHandlers.js +53 -13
  24. package/dist/agent/builtinToolHandlers.js.map +1 -1
  25. package/dist/agent/builtinTools.d.ts +15 -1
  26. package/dist/agent/builtinTools.d.ts.map +1 -1
  27. package/dist/agent/builtinTools.js +111 -30
  28. package/dist/agent/builtinTools.js.map +1 -1
  29. package/dist/agent/constants.d.ts +31 -6
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +38 -8
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +8 -0
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +45 -3
  36. package/dist/agent/contextManager.js.map +1 -1
  37. package/dist/agent/contextPreparer.d.ts +1 -1
  38. package/dist/agent/contextPreparer.d.ts.map +1 -1
  39. package/dist/agent/contextPreparer.js +15 -10
  40. package/dist/agent/contextPreparer.js.map +1 -1
  41. package/dist/agent/guardRail.d.ts +12 -1
  42. package/dist/agent/guardRail.d.ts.map +1 -1
  43. package/dist/agent/guardRail.js +37 -2
  44. package/dist/agent/guardRail.js.map +1 -1
  45. package/dist/agent/loop.d.ts +319 -34
  46. package/dist/agent/loop.d.ts.map +1 -1
  47. package/dist/agent/loop.js +713 -110
  48. package/dist/agent/loop.js.map +1 -1
  49. package/dist/agent/managers/archiveCoordinator.d.ts +19 -4
  50. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  51. package/dist/agent/managers/archiveCoordinator.js +25 -4
  52. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  53. package/dist/agent/managers/chatLockManager.d.ts +3 -9
  54. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  55. package/dist/agent/managers/chatLockManager.js +7 -25
  56. package/dist/agent/managers/chatLockManager.js.map +1 -1
  57. package/dist/agent/managers/llmCaller.d.ts.map +1 -1
  58. package/dist/agent/managers/llmCaller.js +27 -1
  59. package/dist/agent/managers/llmCaller.js.map +1 -1
  60. package/dist/agent/managers/loopMetrics.d.ts +14 -0
  61. package/dist/agent/managers/loopMetrics.d.ts.map +1 -1
  62. package/dist/agent/managers/loopMetrics.js +15 -0
  63. package/dist/agent/managers/loopMetrics.js.map +1 -1
  64. package/dist/agent/managers/memoryInspector.d.ts +13 -15
  65. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  66. package/dist/agent/managers/memoryInspector.js +38 -49
  67. package/dist/agent/managers/memoryInspector.js.map +1 -1
  68. package/dist/agent/managers/roundSummaryGenerator.d.ts +31 -1
  69. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -1
  70. package/dist/agent/managers/roundSummaryGenerator.js +81 -6
  71. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -1
  72. package/dist/agent/managers/sessionArchiver.d.ts +35 -3
  73. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  74. package/dist/agent/managers/sessionArchiver.js +34 -3
  75. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  76. package/dist/agent/managers/sessionManager.d.ts +21 -88
  77. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  78. package/dist/agent/managers/sessionManager.js +94 -278
  79. package/dist/agent/managers/sessionManager.js.map +1 -1
  80. package/dist/agent/managers/toolCallHelpers.d.ts +109 -28
  81. package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -1
  82. package/dist/agent/managers/toolCallHelpers.js +93 -37
  83. package/dist/agent/managers/toolCallHelpers.js.map +1 -1
  84. package/dist/agent/messageHistory.d.ts.map +1 -1
  85. package/dist/agent/messageHistory.js +9 -5
  86. package/dist/agent/messageHistory.js.map +1 -1
  87. package/dist/agent/seed/orchestrator.d.ts +12 -1
  88. package/dist/agent/seed/orchestrator.d.ts.map +1 -1
  89. package/dist/agent/seed/orchestrator.js +15 -4
  90. package/dist/agent/seed/orchestrator.js.map +1 -1
  91. package/dist/agent/seed/prepare.d.ts.map +1 -1
  92. package/dist/agent/seed/prepare.js +9 -4
  93. package/dist/agent/seed/prepare.js.map +1 -1
  94. package/dist/agent/seed/types.d.ts +11 -4
  95. package/dist/agent/seed/types.d.ts.map +1 -1
  96. package/dist/agent/seed/types.js +2 -2
  97. package/dist/agent/textSanitize.d.ts +36 -0
  98. package/dist/agent/textSanitize.d.ts.map +1 -0
  99. package/dist/agent/textSanitize.js +55 -0
  100. package/dist/agent/textSanitize.js.map +1 -0
  101. package/dist/agent/toolExecutor.d.ts +97 -26
  102. package/dist/agent/toolExecutor.d.ts.map +1 -1
  103. package/dist/agent/toolExecutor.js +444 -78
  104. package/dist/agent/toolExecutor.js.map +1 -1
  105. package/dist/agent/toolLedger.d.ts +93 -41
  106. package/dist/agent/toolLedger.d.ts.map +1 -1
  107. package/dist/agent/toolLedger.js +114 -42
  108. package/dist/agent/toolLedger.js.map +1 -1
  109. package/dist/agent/toolResultCache.js +1 -1
  110. package/dist/agent/toolResultOffload.d.ts +8 -0
  111. package/dist/agent/toolResultOffload.d.ts.map +1 -1
  112. package/dist/agent/toolResultOffload.js +10 -3
  113. package/dist/agent/toolResultOffload.js.map +1 -1
  114. package/dist/agent/toolRunner.d.ts +16 -7
  115. package/dist/agent/toolRunner.d.ts.map +1 -1
  116. package/dist/agent/toolRunner.js +74 -29
  117. package/dist/agent/toolRunner.js.map +1 -1
  118. package/dist/agent/tracer.d.ts +13 -1
  119. package/dist/agent/tracer.d.ts.map +1 -1
  120. package/dist/agent/types.d.ts +74 -30
  121. package/dist/agent/types.d.ts.map +1 -1
  122. package/dist/code-exec/types.d.ts +9 -0
  123. package/dist/code-exec/types.d.ts.map +1 -1
  124. package/dist/index.d.ts +28 -41
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +65 -54
  127. package/dist/index.js.map +1 -1
  128. package/dist/logging/logger.d.ts +4 -1
  129. package/dist/logging/logger.d.ts.map +1 -1
  130. package/dist/logging/logger.js +5 -2
  131. package/dist/logging/logger.js.map +1 -1
  132. package/dist/memory/gcService.d.ts.map +1 -1
  133. package/dist/memory/gcService.js +3 -5
  134. package/dist/memory/gcService.js.map +1 -1
  135. package/dist/memory/inMemorySessionStore.d.ts +2 -2
  136. package/dist/memory/inMemorySessionStore.js +2 -2
  137. package/dist/memory/inMemoryStorage.d.ts +4 -3
  138. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  139. package/dist/memory/inMemoryStorage.js +2 -2
  140. package/dist/memory/inMemoryStorage.js.map +1 -1
  141. package/dist/memory/nodeSqliteStorage.d.ts +17 -0
  142. package/dist/memory/nodeSqliteStorage.d.ts.map +1 -0
  143. package/dist/memory/nodeSqliteStorage.js +393 -0
  144. package/dist/memory/nodeSqliteStorage.js.map +1 -0
  145. package/dist/memory/projectManager.d.ts +10 -20
  146. package/dist/memory/projectManager.d.ts.map +1 -1
  147. package/dist/memory/projectManager.js +27 -41
  148. package/dist/memory/projectManager.js.map +1 -1
  149. package/dist/memory/roundStore.d.ts +143 -82
  150. package/dist/memory/roundStore.d.ts.map +1 -1
  151. package/dist/memory/roundStore.js +4 -15
  152. package/dist/memory/roundStore.js.map +1 -1
  153. package/dist/memory/roundSummaryLookup.d.ts +26 -0
  154. package/dist/memory/roundSummaryLookup.d.ts.map +1 -0
  155. package/dist/memory/roundSummaryLookup.js +19 -0
  156. package/dist/memory/roundSummaryLookup.js.map +1 -0
  157. package/dist/memory/sessionStore.d.ts +19 -2
  158. package/dist/memory/sessionStore.d.ts.map +1 -1
  159. package/dist/memory/sessionStore.js.map +1 -1
  160. package/dist/memory/sourceValidation.d.ts +2 -13
  161. package/dist/memory/sourceValidation.d.ts.map +1 -1
  162. package/dist/memory/sourceValidation.js +5 -16
  163. package/dist/memory/sourceValidation.js.map +1 -1
  164. package/dist/memory/storageInterface.d.ts +26 -16
  165. package/dist/memory/storageInterface.d.ts.map +1 -1
  166. package/dist/memory/supersedeResolve.d.ts +39 -0
  167. package/dist/memory/supersedeResolve.d.ts.map +1 -0
  168. package/dist/memory/supersedeResolve.js +16 -0
  169. package/dist/memory/supersedeResolve.js.map +1 -0
  170. package/dist/memory/types.d.ts +10 -2
  171. package/dist/memory/types.d.ts.map +1 -1
  172. package/dist/memory/types.js +6 -1
  173. package/dist/memory/types.js.map +1 -1
  174. package/dist/role-pack/rolePackManager.d.ts +74 -33
  175. package/dist/role-pack/rolePackManager.d.ts.map +1 -1
  176. package/dist/role-pack/rolePackManager.js +112 -53
  177. package/dist/role-pack/rolePackManager.js.map +1 -1
  178. package/dist/role-pack/strategyKeys.d.ts +44 -0
  179. package/dist/role-pack/strategyKeys.d.ts.map +1 -1
  180. package/dist/role-pack/strategyKeys.js +55 -0
  181. package/dist/role-pack/strategyKeys.js.map +1 -1
  182. package/dist/role-pack/strategyResolver.d.ts +6 -1
  183. package/dist/role-pack/strategyResolver.d.ts.map +1 -1
  184. package/dist/role-pack/strategyResolver.js +20 -2
  185. package/dist/role-pack/strategyResolver.js.map +1 -1
  186. package/dist/role-pack/types.d.ts +5 -1
  187. package/dist/role-pack/types.d.ts.map +1 -1
  188. package/dist/security/confirmEntries.d.ts +44 -0
  189. package/dist/security/confirmEntries.d.ts.map +1 -0
  190. package/dist/security/confirmEntries.js +59 -0
  191. package/dist/security/confirmEntries.js.map +1 -0
  192. package/dist/security/pathGuard.d.ts +42 -6
  193. package/dist/security/pathGuard.d.ts.map +1 -1
  194. package/dist/security/pathGuard.js +126 -5
  195. package/dist/security/pathGuard.js.map +1 -1
  196. package/dist/skill/skillScriptRunner.d.ts +147 -15
  197. package/dist/skill/skillScriptRunner.d.ts.map +1 -1
  198. package/dist/skill/skillScriptRunner.js +479 -68
  199. package/dist/skill/skillScriptRunner.js.map +1 -1
  200. package/dist/utils/backgroundTask.d.ts +56 -34
  201. package/dist/utils/backgroundTask.d.ts.map +1 -1
  202. package/dist/utils/backgroundTask.js +130 -99
  203. package/dist/utils/backgroundTask.js.map +1 -1
  204. package/dist/utils/configResourceManager.d.ts +6 -2
  205. package/dist/utils/configResourceManager.d.ts.map +1 -1
  206. package/dist/utils/configResourceManager.js +8 -2
  207. package/dist/utils/configResourceManager.js.map +1 -1
  208. package/dist/utils/errors.d.ts +12 -2
  209. package/dist/utils/errors.d.ts.map +1 -1
  210. package/dist/utils/errors.js +12 -2
  211. package/dist/utils/errors.js.map +1 -1
  212. package/dist/utils/eventEmitter.d.ts +76 -23
  213. package/dist/utils/eventEmitter.d.ts.map +1 -1
  214. package/dist/utils/eventEmitter.js +23 -3
  215. package/dist/utils/eventEmitter.js.map +1 -1
  216. package/dist/utils/time.d.ts +8 -5
  217. package/dist/utils/time.d.ts.map +1 -1
  218. package/dist/utils/time.js +8 -5
  219. package/dist/utils/time.js.map +1 -1
  220. package/dist/utils/toError.d.ts +1 -1
  221. package/dist/utils/toError.js +1 -1
  222. package/dist/web-fetch/loginWall.d.ts +39 -0
  223. package/dist/web-fetch/loginWall.d.ts.map +1 -0
  224. package/dist/web-fetch/loginWall.js +78 -0
  225. package/dist/web-fetch/loginWall.js.map +1 -0
  226. package/dist/web-fetch/types.d.ts +8 -0
  227. package/dist/web-fetch/types.d.ts.map +1 -1
  228. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -1
  229. package/dist/web-fetch/webFetchProvider.js +3 -1
  230. package/dist/web-fetch/webFetchProvider.js.map +1 -1
  231. package/dist/web-search/fetchWebSearchProvider.js +28 -23
  232. package/dist/web-search/fetchWebSearchProvider.js.map +1 -1
  233. package/docs/architecture/role-pack-authoring-guide.md +3 -1
  234. package/docs/architecture/role-pack-spec.md +2 -1
  235. package/docs/memora-api-reference.md +1349 -1175
  236. 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
  237. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +91 -52
  238. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -148
  239. package/package.json +9 -4
  240. package/role-packs/README.md +41 -40
  241. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -4
  242. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +1 -0
  243. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +1 -1
  244. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +1 -0
  245. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +1 -1
  246. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +1 -1
  247. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +32 -5
  248. 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 +10 -6
  249. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +3 -1
  250. 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
  251. package/dist/agent/managers/dedupManager.d.ts +0 -85
  252. package/dist/agent/managers/dedupManager.d.ts.map +0 -1
  253. package/dist/agent/managers/dedupManager.js +0 -248
  254. package/dist/agent/managers/dedupManager.js.map +0 -1
  255. package/dist/agent/managers/goalConsistencyChecker.d.ts +0 -42
  256. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +0 -1
  257. package/dist/agent/managers/goalConsistencyChecker.js +0 -178
  258. package/dist/agent/managers/goalConsistencyChecker.js.map +0 -1
  259. package/dist/agent/managers/llmJudgeHelper.d.ts +0 -21
  260. package/dist/agent/managers/llmJudgeHelper.d.ts.map +0 -1
  261. package/dist/agent/managers/llmJudgeHelper.js +0 -32
  262. package/dist/agent/managers/llmJudgeHelper.js.map +0 -1
  263. package/dist/agent/managers/memoryAdvisor.d.ts +0 -105
  264. package/dist/agent/managers/memoryAdvisor.d.ts.map +0 -1
  265. package/dist/agent/managers/memoryAdvisor.js +0 -322
  266. package/dist/agent/managers/memoryAdvisor.js.map +0 -1
  267. package/dist/agent/managers/memoryGovernance.d.ts +0 -24
  268. package/dist/agent/managers/memoryGovernance.d.ts.map +0 -1
  269. package/dist/agent/managers/memoryGovernance.js +0 -46
  270. package/dist/agent/managers/memoryGovernance.js.map +0 -1
  271. package/dist/memory/governance.d.ts +0 -17
  272. package/dist/memory/governance.d.ts.map +0 -1
  273. package/dist/memory/governance.js +0 -17
  274. package/dist/memory/governance.js.map +0 -1
  275. package/dist/memory/projectRegistry.d.ts +0 -47
  276. package/dist/memory/projectRegistry.d.ts.map +0 -1
  277. package/dist/memory/projectRegistry.js +0 -151
  278. package/dist/memory/projectRegistry.js.map +0 -1
  279. package/dist/utils/recallDefaults.d.ts +0 -16
  280. package/dist/utils/recallDefaults.d.ts.map +0 -1
  281. package/dist/utils/recallDefaults.js +0 -16
  282. package/dist/utils/recallDefaults.js.map +0 -1
@@ -1,248 +0,0 @@
1
- // LLM judge 高阶函数(流式累积 + parseLlmJson + configError 封装)
2
- import { judgeWithLlm } from '../../agent/managers/llmJudgeHelper.js';
3
- // LLM 治理共享常量(统一由 governance.ts 维护)
4
- import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
5
- import { levenshtein } from '../../memory/sourceValidation.js';
6
- import { byAccessedDesc } from '../../utils/array.js';
7
- import { nowIso } from '../../utils/time.js';
8
- import { truncate } from '../../utils/strings.js';
9
- import { logger } from '../../logging/logger.js';
10
- // ─── L1 语义去重常量 ────────────────────────────────────
11
- /** 单次去重扫描候选条数上限 */
12
- const DEDUP_CANDIDATE_LIMIT = 50;
13
- /** 单次 LLM 判断候选对数上限(每对约 200 tokens) */
14
- const DEDUP_PAIR_LIMIT = 10;
15
- /** 名称相似度阈值(归一化 Levenshtein 距离 ≤ 此值视为高度相似进入 LLM 判断) */
16
- const DEDUP_NAME_SIMILARITY_THRESHOLD = 0.3;
17
- /** LLM 去重判断超时(ms) */
18
- const DEDUP_TIMEOUT_MS = 15_000;
19
- /** 候选内容预览长度(送入 LLM 前截断,控制 token) */
20
- const DEDUP_CONTENT_PREVIEW_LEN = 200;
21
- // ─── 类 ──────────────────────────────────────────────────
22
- /** 语义去重管理器:扫描名称高度相似的记忆对,LLM 判断语义等价性,降级低分记忆。assembler 组合根创建,由 Agent 透传调用。 */
23
- export class DedupManager {
24
- index;
25
- onCompleted;
26
- /** 后台 LLM Provider(可选,未注入时降级跳过) */
27
- backgroundProvider;
28
- /** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时去重空转,测试可显式注入) */
29
- sources;
30
- constructor(index, backgroundProvider = null,
31
- /** 去重完成回调(宿主据此发射事件通知用户) */
32
- onCompleted, sources = GOVERNANCE_SOURCES) {
33
- this.index = index;
34
- this.onCompleted = onCompleted;
35
- this.backgroundProvider = backgroundProvider;
36
- this.sources = sources;
37
- }
38
- /**
39
- * 语义去重:加载候选(上限 50)→ 名称相似度筛选对(上限 10)→ LLM 判断语义等价 → 等价则软删重复方。
40
- * 安全设计:不物理删除仅软删(可恢复);LLM 失败降级不阻塞;provider 未注入静默返回 skippedReason。
41
- */
42
- async deduplicateMemories(signal) {
43
- // provider 未注入时静默降级
44
- if (!this.backgroundProvider) {
45
- return {
46
- scannedCount: 0,
47
- pairCount: 0,
48
- deduplicatedCount: 0,
49
- demotedIds: [],
50
- skippedReason: 'backgroundProvider 未注入',
51
- };
52
- }
53
- const candidates = [];
54
- for (const source of this.sources) {
55
- const memories = this.index.getBySource(source);
56
- candidates.push(...memories);
57
- }
58
- // 按 accessedAt 降序(最近使用优先,score 退役后无分可排序)
59
- candidates.sort(byAccessedDesc);
60
- const limited = candidates.slice(0, DEDUP_CANDIDATE_LIMIT);
61
- const pairs = this.findNameOverlapPairs(limited);
62
- if (pairs.length === 0) {
63
- return {
64
- scannedCount: limited.length,
65
- pairCount: 0,
66
- deduplicatedCount: 0,
67
- demotedIds: [],
68
- skippedReason: '未发现名称相似的记忆对',
69
- };
70
- }
71
- const demotedIds = [];
72
- const verdicts = [];
73
- let deduplicatedCount = 0;
74
- for (const pair of pairs) {
75
- try {
76
- const verdict = await this.judgeDuplicate(pair, signal);
77
- if (verdict.isDuplicate) {
78
- // 先写合并内容再降级 b:合并写入失败时不破坏 b 原始状态(原子性)
79
- if (verdict.mergedContent) {
80
- this.keepMerged(pair.a, verdict.mergedContent);
81
- }
82
- // 重复方软删(score 退役后无降级语义,soft-delete 保留可恢复)
83
- this.demoteMemory(pair.b);
84
- demotedIds.push(pair.b.id);
85
- // 收集审计详情(供 UI 展示"为什么降级"和"合并后保留了什么")
86
- verdicts.push({
87
- demotedId: pair.b.id,
88
- reason: verdict.reason,
89
- mergedContent: verdict.mergedContent,
90
- });
91
- deduplicatedCount++;
92
- logger.info({ demotedId: pair.b.id, keptId: pair.a.id, reason: verdict.reason }, '语义去重:降级重复记忆并合并内容到保留方');
93
- }
94
- }
95
- catch (err) {
96
- // 单对失败不阻塞后续对
97
- logger.warn({ err, pairId: `${pair.a.id}↔${pair.b.id}` }, '语义去重:LLM 判断失败,跳过此对');
98
- }
99
- }
100
- this.onCompleted?.({
101
- scannedCount: limited.length,
102
- pairCount: pairs.length,
103
- deduplicatedCount,
104
- demotedIds,
105
- });
106
- return {
107
- scannedCount: limited.length,
108
- pairCount: pairs.length,
109
- deduplicatedCount,
110
- demotedIds,
111
- verdicts,
112
- };
113
- }
114
- /**
115
- * 筛选名称高度相似的候选记忆对。判定:归一化 Levenshtein ≤0.3 或一方包含另一方。
116
- * 已配对的记忆不再参与后续配对(避免三元组产生多对);按相似度升序(越相似越优先)取前 10 对。
117
- */
118
- findNameOverlapPairs(candidates) {
119
- const pairs = [];
120
- const usedIds = new Set();
121
- // 双重循环生成所有可能对,按相似度排序后贪心选取
122
- const allPairs = [];
123
- for (let i = 0; i < candidates.length; i++) {
124
- for (let j = i + 1; j < candidates.length; j++) {
125
- const a = candidates[i]; // i 前 j 后:candidates 已按 accessedAt 降序,a 为更近使用方(保留候选)
126
- const b = candidates[j]; // b 为较远使用方(重复候选)
127
- const similarity = DedupManager.computeNameSimilarity(a.name, b.name);
128
- if (similarity <= DEDUP_NAME_SIMILARITY_THRESHOLD) {
129
- allPairs.push({ a, b, nameSimilarity: similarity });
130
- }
131
- }
132
- }
133
- // 按相似度升序,越相似越优先处理
134
- allPairs.sort((x, y) => x.nameSimilarity - y.nameSimilarity);
135
- // 贪心选取:已配对的记忆不再参与后续配对
136
- for (const { a, b, nameSimilarity } of allPairs) {
137
- if (usedIds.has(a.id) || usedIds.has(b.id))
138
- continue;
139
- pairs.push({ a, b, nameSimilarity });
140
- usedIds.add(a.id);
141
- usedIds.add(b.id);
142
- if (pairs.length >= DEDUP_PAIR_LIMIT)
143
- break;
144
- }
145
- return pairs;
146
- }
147
- /** 名称归一化相似度(0-1,越小越相似)。规则:包含关系=0;否则 Levenshtein 距离 / max(len)。 */
148
- static computeNameSimilarity(nameA, nameB) {
149
- // 空名称防御:includes("") 恒真会误判所有记忆高度相似,故空名与任何名称视为完全不同
150
- if (!nameA || !nameB) {
151
- return 1;
152
- }
153
- // 规则 2:包含关系(如"用户偏好" vs "用户偏好设置")
154
- if (nameA.includes(nameB) || nameB.includes(nameA)) {
155
- return 0;
156
- }
157
- // 规则 1:归一化 Levenshtein 距离
158
- const maxLen = Math.max(nameA.length, nameB.length);
159
- if (maxLen === 0)
160
- return 0; // 两个空字符串视为完全相似(已被上面拦截,此处防御)
161
- const distance = levenshtein(nameA, nameB);
162
- return distance / maxLen;
163
- }
164
- /**
165
- * 调用 LLM 判断单对记忆语义等价:结构化 JSON 输出(isDuplicate+mergedContent+reason)。
166
- * 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
167
- */
168
- async judgeDuplicate(pair, signal) {
169
- const messages = buildDedupMessages(pair);
170
- const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 300, timeoutMs: DEDUP_TIMEOUT_MS, signal }, 'LLM 去重判断返回非法 JSON');
171
- return {
172
- isDuplicate: parsed.isDuplicate === true,
173
- mergedContent: typeof parsed.mergedContent === 'string' ? parsed.mergedContent : undefined,
174
- reason: typeof parsed.reason === 'string' ? parsed.reason : '(LLM 未提供理由)',
175
- };
176
- }
177
- /** 软删重复记忆(不物理删除保留可恢复;合并内容由 keepMerged 单独写回 a)。重复方以 delete 进入回收站。 */
178
- demoteMemory(memory) {
179
- this.index.delete(memory.id);
180
- }
181
- /** 将合并内容写回保留方 a:保持 id/source/name/createdAt 不变,仅刷新 content + accessedAt */
182
- keepMerged(memory, mergedContent) {
183
- const updated = {
184
- ...memory,
185
- content: mergedContent,
186
- accessedAt: nowIso(),
187
- };
188
- this.index.upsert(updated);
189
- logger.info({ keptId: memory.id }, '语义去重:保留方已合并对方内容');
190
- }
191
- }
192
- // ─── L1 语义去重 Prompt 模板(模块级函数) ───
193
- /** 构建语义去重判断的 LLM 消息:system 定义语义等价规则 + user 携带候选对内容预览,few-shot 降误判率 */
194
- function buildDedupMessages(pair) {
195
- const contentA = pair.a.content.length > DEDUP_CONTENT_PREVIEW_LEN
196
- ? truncate(pair.a.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
197
- : pair.a.content;
198
- const contentB = pair.b.content.length > DEDUP_CONTENT_PREVIEW_LEN
199
- ? truncate(pair.b.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
200
- : pair.b.content;
201
- return [
202
- {
203
- role: 'system',
204
- content: `你是记忆去重助手。判断给定的两条记忆是否语义等价(表达同一事实/偏好/洞察)。
205
-
206
- 判断规则:
207
- - 语义等价 = 核心信息相同,仅措辞/格式/细节程度不同
208
- - 语义不等价 = 核心信息不同,或一条是另一条的补充/细化(非等价)
209
- - 忽略时间戳、ID 等元数据差异
210
- - 忽略措辞风格差异(如"喜欢"vs"偏爱")
211
-
212
- 输出 JSON 格式:
213
- {
214
- "isDuplicate": true/false,
215
- "mergedContent": "合并后的内容(仅 isDuplicate=true 时提供,保留两条记忆的完整信息)",
216
- "reason": "判断理由(简短说明)"
217
- }
218
-
219
- 示例:
220
- 输入 A: "用户偏好简洁的 UI 设计"
221
- 输入 B: "用户喜欢简洁的界面风格"
222
- 输出: {"isDuplicate": true, "mergedContent": "用户偏好简洁的 UI/界面设计风格", "reason": "核心偏好相同,仅措辞差异"}
223
-
224
- 输入 A: "用户是 TypeScript 开发者"
225
- 输入 B: "用户偏好使用 TypeScript 进行后端开发"
226
- 输出: {"isDuplicate": false, "reason": "B 是 A 的细化(限定后端),非语义等价"}`,
227
- },
228
- {
229
- role: 'user',
230
- content: `请判断以下两条记忆是否语义等价:
231
-
232
- 记忆 A(保留候选):
233
- - 名称:${pair.a.name}
234
- - 来源:${pair.a.source}
235
- - 内容:${contentA}
236
-
237
- 记忆 B(重复候选):
238
- - 名称:${pair.b.name}
239
- - 来源:${pair.b.source}
240
- - 内容:${contentB}
241
-
242
- 名称相似度:${pair.nameSimilarity.toFixed(2)}(0=完全相同,1=完全不同)
243
-
244
- 请输出 JSON 判断结果。`,
245
- },
246
- ];
247
- }
248
- //# sourceMappingURL=dedupManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dedupManager.js","sourceRoot":"","sources":["../../../src/agent/managers/dedupManager.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- /**
2
- * 目标一致性校验器(目标版本一致性校验)。
3
- * 两层校验:确定性层(关键约束提取 + 文本相似度)+ LLM 层(可选,仅对需确认场景生成解释)。
4
- * 关键约束由确定性规则提取而非 LLM(防自我引用)。漂移等级:same(>0.7 无需确认)/confirm(0.4-0.7 建议确认)/drift(<0.4 需确认)。
5
- */
6
- /** 漂移等级:same(>0.7 自动应用)/confirm(0.4-0.7 建议确认)/drift(<0.4 需确认) */
7
- export type DriftLevel = 'same' | 'confirm' | 'drift';
8
- /** 一致性校验结果 */
9
- export interface GoalConsistencyResult {
10
- /** 漂移等级 */
11
- level: DriftLevel;
12
- /** 文本相似度(0-1) */
13
- similarity: number;
14
- /** 从 mainGoal 中提取的关键约束列表 */
15
- constraints: string[];
16
- /** 约束一致性(true = 所有约束均满足,false = 有约束冲突) */
17
- constraintsConsistent: boolean;
18
- /** 冲突的约束说明(可选,仅 constraintsConsistent 为 false 时有值) */
19
- conflictExplanation?: string;
20
- }
21
- /** 目标一致性校验器:纯函数式(无状态无副作用),SessionManager / Agent 层直接可用,不依赖外部服务 */
22
- export declare class GoalConsistencyChecker {
23
- /** 提取关键约束:从目标描述中按确定性规则提取"必须/不能/需要/确保"等关键词句段(不依赖 LLM 防自我引用),去重返回 */
24
- extractConstraints(goal: string): string[];
25
- /** 计算文本相似度:长文本(>20 字符)用 Jaccard,短文本用字符级 bigram(对短文本更敏感) */
26
- computeSimilarity(a: string, b: string): number;
27
- /** 执行一致性校验:提取约束 → 算相似度定漂移等级(>0.7 same / >=0.4 confirm / else drift)→ 检查约束是否仍满足 */
28
- checkConsistency(mainGoal: string, newGoal: string): GoalConsistencyResult;
29
- /** 检查约束在新目标是否仍满足:对每条约束提取核心词,任一命中即视为满足;全不满足则标记冲突 */
30
- private checkConstraintsConsistent;
31
- /** 提取约束核心词:去除标记词保留核心名词短语(如"必须使用TypeScript" → "使用TypeScript"),再按分隔符切分;剥离前缀由 CONSTRAINT_KEYWORDS 生成 */
32
- private extractKeywords;
33
- /** Jaccard 相似度:分词后交集/并集。分词策略:中文字符逐字 + 英文单词 + 数字 */
34
- private jaccardSimilarity;
35
- /** 字符级 bigram 相似度:拆相邻字符对求交集/并集,适用于短文本 */
36
- private bigramSimilarity;
37
- /** 分词:提取中文字符(逐字,对中文更敏感)+ 英文单词(小写)+ 数字;零外部依赖 */
38
- private tokenize;
39
- /** 获取字符级 bigram:拆相邻字符对(如 "TypeScript" → ["Ty","yp",...]) */
40
- private getBigrams;
41
- }
42
- //# sourceMappingURL=goalConsistencyChecker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"goalConsistencyChecker.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/goalConsistencyChecker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAgBtD,cAAc;AACd,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,KAAK,EAAE,UAAU,CAAC;IAClB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,0CAA0C;IAC1C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,kEAAkE;AAClE,qBAAa,sBAAsB;IACjC,mEAAmE;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB1C,2DAA2D;IAC3D,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAkB/C,kFAAkF;IAClF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,qBAAqB;IA6B1E,mDAAmD;IACnD,OAAO,CAAC,0BAA0B;IA6BlC,qGAAqG;IACrG,OAAO,CAAC,eAAe;IAQvB,mDAAmD;IACnD,OAAO,CAAC,iBAAiB;IAgBzB,yCAAyC;IACzC,OAAO,CAAC,gBAAgB;IAgBxB,+CAA+C;IAC/C,OAAO,CAAC,QAAQ;IAgChB,4DAA4D;IAC5D,OAAO,CAAC,UAAU;CAOnB"}
@@ -1,178 +0,0 @@
1
- /**
2
- * 目标一致性校验器(目标版本一致性校验)。
3
- * 两层校验:确定性层(关键约束提取 + 文本相似度)+ LLM 层(可选,仅对需确认场景生成解释)。
4
- * 关键约束由确定性规则提取而非 LLM(防自我引用)。漂移等级:same(>0.7 无需确认)/confirm(0.4-0.7 建议确认)/drift(<0.4 需确认)。
5
- */
6
- /** 约束关键词单一真源:提取 pattern(全文匹配)与剥离前缀(checkConstraintsConsistent 用)共用,防双列表漂移 */
7
- const CONSTRAINT_KEYWORDS = [
8
- '必须',
9
- '不能',
10
- '需要',
11
- '确保',
12
- '禁止',
13
- '只能',
14
- '至少',
15
- '不允许',
16
- '应当',
17
- '不得',
18
- ];
19
- /** 目标一致性校验器:纯函数式(无状态无副作用),SessionManager / Agent 层直接可用,不依赖外部服务 */
20
- export class GoalConsistencyChecker {
21
- /** 提取关键约束:从目标描述中按确定性规则提取"必须/不能/需要/确保"等关键词句段(不依赖 LLM 防自我引用),去重返回 */
22
- extractConstraints(goal) {
23
- if (!goal || goal.trim() === '')
24
- return [];
25
- const constraints = [];
26
- // 约束关键词匹配模式——由 CONSTRAINT_KEYWORDS 单一真源生成(全文匹配)
27
- const constraintPatterns = CONSTRAINT_KEYWORDS.map((kw) => new RegExp(`${kw}[^,。!?;\n,;.!?]*`, 'g'));
28
- for (const pattern of constraintPatterns) {
29
- const matches = goal.match(pattern);
30
- if (matches) {
31
- constraints.push(...matches.map((m) => m.trim()));
32
- }
33
- }
34
- // 去重
35
- return [...new Set(constraints)];
36
- }
37
- /** 计算文本相似度:长文本(>20 字符)用 Jaccard,短文本用字符级 bigram(对短文本更敏感) */
38
- computeSimilarity(a, b) {
39
- if (!a && !b)
40
- return 1;
41
- if (!a || !b)
42
- return 0;
43
- const aTrim = a.trim();
44
- const bTrim = b.trim();
45
- if (aTrim === bTrim)
46
- return 1;
47
- // 短文本:字符级 bigram(对短文本更敏感)
48
- if (aTrim.length <= 20 || bTrim.length <= 20) {
49
- return this.bigramSimilarity(aTrim, bTrim);
50
- }
51
- // 长文本:Jaccard
52
- return this.jaccardSimilarity(aTrim, bTrim);
53
- }
54
- /** 执行一致性校验:提取约束 → 算相似度定漂移等级(>0.7 same / >=0.4 confirm / else drift)→ 检查约束是否仍满足 */
55
- checkConsistency(mainGoal, newGoal) {
56
- const constraints = this.extractConstraints(mainGoal);
57
- const similarity = this.computeSimilarity(mainGoal, newGoal);
58
- // 确定漂移等级
59
- let level;
60
- if (similarity > 0.7) {
61
- level = 'same';
62
- }
63
- else if (similarity >= 0.4) {
64
- level = 'confirm';
65
- }
66
- else {
67
- level = 'drift';
68
- }
69
- // 检查约束一致性
70
- const { constraintsConsistent, conflictExplanation } = this.checkConstraintsConsistent(constraints, newGoal);
71
- return {
72
- level,
73
- similarity,
74
- constraints,
75
- constraintsConsistent,
76
- conflictExplanation,
77
- };
78
- }
79
- /** 检查约束在新目标是否仍满足:对每条约束提取核心词,任一命中即视为满足;全不满足则标记冲突 */
80
- checkConstraintsConsistent(constraints, newGoal) {
81
- if (constraints.length === 0) {
82
- return { constraintsConsistent: true };
83
- }
84
- const conflictConstraints = [];
85
- for (const constraint of constraints) {
86
- // 提取约束核心词并检查新目标是否包含
87
- const keywords = this.extractKeywords(constraint);
88
- const satisfied = keywords.some((k) => newGoal.includes(k));
89
- if (!satisfied) {
90
- conflictConstraints.push(constraint);
91
- }
92
- }
93
- if (conflictConstraints.length > 0) {
94
- return {
95
- constraintsConsistent: false,
96
- conflictExplanation: `以下约束在新目标中未体现:${conflictConstraints.join(';')}`,
97
- };
98
- }
99
- return { constraintsConsistent: true };
100
- }
101
- /** 提取约束核心词:去除标记词保留核心名词短语(如"必须使用TypeScript" → "使用TypeScript"),再按分隔符切分;剥离前缀由 CONSTRAINT_KEYWORDS 生成 */
102
- extractKeywords(constraint) {
103
- const cleaned = constraint
104
- .replace(new RegExp(`^(${CONSTRAINT_KEYWORDS.join('|')})`), '')
105
- .trim();
106
- const parts = cleaned.split(/[,,、\s]+/).filter(Boolean);
107
- return parts.length > 0 ? parts : [cleaned];
108
- }
109
- /** Jaccard 相似度:分词后交集/并集。分词策略:中文字符逐字 + 英文单词 + 数字 */
110
- jaccardSimilarity(a, b) {
111
- const tokensA = this.tokenize(a);
112
- const tokensB = this.tokenize(b);
113
- if (tokensA.size === 0 && tokensB.size === 0)
114
- return 1;
115
- if (tokensA.size === 0 || tokensB.size === 0)
116
- return 0;
117
- let intersection = 0;
118
- for (const token of tokensA) {
119
- if (tokensB.has(token))
120
- intersection++;
121
- }
122
- const union = tokensA.size + tokensB.size - intersection;
123
- return union > 0 ? intersection / union : 0;
124
- }
125
- /** 字符级 bigram 相似度:拆相邻字符对求交集/并集,适用于短文本 */
126
- bigramSimilarity(a, b) {
127
- const bigramsA = this.getBigrams(a);
128
- const bigramsB = this.getBigrams(b);
129
- if (bigramsA.size === 0 && bigramsB.size === 0)
130
- return 1;
131
- if (bigramsA.size === 0 || bigramsB.size === 0)
132
- return 0;
133
- let intersection = 0;
134
- for (const bigram of bigramsA) {
135
- if (bigramsB.has(bigram))
136
- intersection++;
137
- }
138
- const union = bigramsA.size + bigramsB.size - intersection;
139
- return union > 0 ? intersection / union : 0;
140
- }
141
- /** 分词:提取中文字符(逐字,对中文更敏感)+ 英文单词(小写)+ 数字;零外部依赖 */
142
- tokenize(text) {
143
- const tokens = new Set();
144
- // 中文字符序列(逐字作为 token)
145
- const chineseChars = text.match(/[\u4e00-\u9fff\u3400-\u4dbf]+/g);
146
- if (chineseChars) {
147
- for (const seq of chineseChars) {
148
- for (const char of seq) {
149
- tokens.add(char);
150
- }
151
- }
152
- }
153
- // 英文单词(小写归一化,大小写不敏感)
154
- const englishWords = text.match(/[a-zA-Z_][a-zA-Z0-9_]*/g);
155
- if (englishWords) {
156
- for (const word of englishWords) {
157
- tokens.add(word.toLowerCase());
158
- }
159
- }
160
- // 数字
161
- const numbers = text.match(/\d+/g);
162
- if (numbers) {
163
- for (const num of numbers) {
164
- tokens.add(num);
165
- }
166
- }
167
- return tokens;
168
- }
169
- /** 获取字符级 bigram:拆相邻字符对(如 "TypeScript" → ["Ty","yp",...]) */
170
- getBigrams(text) {
171
- const bigrams = new Set();
172
- for (let i = 0; i < text.length - 1; i++) {
173
- bigrams.add(text.slice(i, i + 2));
174
- }
175
- return bigrams;
176
- }
177
- }
178
- //# sourceMappingURL=goalConsistencyChecker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"goalConsistencyChecker.js","sourceRoot":"","sources":["../../../src/agent/managers/goalConsistencyChecker.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- /**
2
- * LLM Judge 高阶辅助函数:封装"流式累积 → parseLlmJson → 判 null → 抛 configError"三件套。
3
- * 由 memoryInspector / memoryAdvisor 复用,消除重复。
4
- * 统一异常:解析失败抛 configError(MemoraError 体系);类型参数化,调用方指定返回类型 T。
5
- */
6
- import type { LlmProvider, Message } from '../../llm/provider.js';
7
- /** LLM Judge 调用选项(流式 + 超时 + 取消信号) */
8
- export interface LlmJudgeOptions {
9
- /** 流式响应最大 token 数(控制单次调用成本) */
10
- maxTokens: number;
11
- /** LLM 调用超时(ms),超时中止请求 */
12
- timeoutMs: number;
13
- /** 可选取消信号(与 timeoutMs 独立,任一触发即中止) */
14
- signal?: AbortSignal;
15
- }
16
- /**
17
- * 调用 LLM 流式累积响应并解析为 JSON 对象 T。
18
- * 流式累积 → parseLlmJson(容错剥离代码块/修复错误/正则兜底)→ 解析失败抛 configError。
19
- */
20
- export declare function judgeWithLlm<T extends object>(provider: LlmProvider, messages: Message[], options: LlmJudgeOptions, errorTitle: string): Promise<T>;
21
- //# sourceMappingURL=llmJudgeHelper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llmJudgeHelper.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/llmJudgeHelper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK9D,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EACjD,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
@@ -1,32 +0,0 @@
1
- /**
2
- * LLM Judge 高阶辅助函数:封装"流式累积 → parseLlmJson → 判 null → 抛 configError"三件套。
3
- * 由 memoryInspector / memoryAdvisor 复用,消除重复。
4
- * 统一异常:解析失败抛 configError(MemoraError 体系);类型参数化,调用方指定返回类型 T。
5
- */
6
- import { parseLlmJson } from '../../utils/json.js';
7
- import { configError } from '../../utils/errors.js';
8
- import { accumulateStream } from '../../agent/managers/streamAccumulator.js';
9
- /**
10
- * 调用 LLM 流式累积响应并解析为 JSON 对象 T。
11
- * 流式累积 → parseLlmJson(容错剥离代码块/修复错误/正则兜底)→ 解析失败抛 configError。
12
- */
13
- export async function judgeWithLlm(provider, messages, options, errorTitle) {
14
- // 流式累积 LLM 响应(复用 accumulateStream,消除重复)
15
- const llmResponse = await accumulateStream(provider, messages, {
16
- maxTokens: options.maxTokens,
17
- temperature: 0,
18
- timeoutMs: options.timeoutMs,
19
- signal: options.signal,
20
- });
21
- // 解析 JSON,失败抛 configError(统一 MemoraError 体系)
22
- const parsed = parseLlmJson(llmResponse.trim());
23
- if (!parsed) {
24
- throw configError(errorTitle, 'LLM 返回内容不是有效的 JSON(parseLlmJson 解析失败)', [
25
- '检查 backgroundProvider 是否注入并可用',
26
- '检查 LLM 模型是否输出预期的 JSON 结构',
27
- '若问题持续,可降低候选数量或调整 prompt',
28
- ]);
29
- }
30
- return parsed;
31
- }
32
- //# sourceMappingURL=llmJudgeHelper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llmJudgeHelper.js","sourceRoot":"","sources":["../../../src/agent/managers/llmJudgeHelper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAYzE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAqB,EACrB,QAAmB,EACnB,OAAwB,EACxB,UAAkB;IAElB,wCAAwC;IACxC,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE;QAC7D,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,WAAW,CAAC,UAAU,EAAE,uCAAuC,EAAE;YACrE,+BAA+B;YAC/B,0BAA0B;YAC1B,yBAAyB;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}