@zooique/memora 2.0.0 → 3.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 (588) hide show
  1. package/CHANGELOG.md +1028 -0
  2. package/README.en.md +305 -0
  3. package/README.md +303 -148
  4. package/config.example.json +43 -0
  5. package/dist/agent/agent.d.ts +438 -295
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +1368 -836
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +117 -39
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +574 -71
  12. package/dist/agent/assembler.js.map +1 -1
  13. package/dist/agent/budget.d.ts +131 -0
  14. package/dist/agent/budget.d.ts.map +1 -0
  15. package/dist/agent/budget.js +128 -0
  16. package/dist/agent/budget.js.map +1 -0
  17. package/dist/agent/builtinToolHandlers.d.ts +229 -17
  18. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  19. package/dist/agent/builtinToolHandlers.js +758 -70
  20. package/dist/agent/builtinToolHandlers.js.map +1 -1
  21. package/dist/agent/builtinTools.d.ts +198 -7
  22. package/dist/agent/builtinTools.d.ts.map +1 -1
  23. package/dist/agent/builtinTools.js +646 -14
  24. package/dist/agent/builtinTools.js.map +1 -1
  25. package/dist/agent/compaction.d.ts +93 -0
  26. package/dist/agent/compaction.d.ts.map +1 -0
  27. package/dist/agent/compaction.js +192 -0
  28. package/dist/agent/compaction.js.map +1 -0
  29. package/dist/agent/constants.d.ts +139 -18
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +154 -18
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +126 -76
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +197 -135
  36. package/dist/agent/contextManager.js.map +1 -1
  37. package/dist/agent/contextPreparer.d.ts +78 -0
  38. package/dist/agent/contextPreparer.d.ts.map +1 -0
  39. package/dist/agent/contextPreparer.js +128 -0
  40. package/dist/agent/contextPreparer.js.map +1 -0
  41. package/dist/agent/duplicateInterceptor.d.ts +67 -0
  42. package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
  43. package/dist/agent/duplicateInterceptor.js +82 -0
  44. package/dist/agent/duplicateInterceptor.js.map +1 -0
  45. package/dist/agent/guardRail.d.ts +166 -0
  46. package/dist/agent/guardRail.d.ts.map +1 -0
  47. package/dist/agent/guardRail.js +333 -0
  48. package/dist/agent/guardRail.js.map +1 -0
  49. package/dist/agent/loop.d.ts +718 -253
  50. package/dist/agent/loop.d.ts.map +1 -1
  51. package/dist/agent/loop.js +2215 -648
  52. package/dist/agent/loop.js.map +1 -1
  53. package/dist/agent/managers/archiveCoordinator.d.ts +21 -74
  54. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  55. package/dist/agent/managers/archiveCoordinator.js +32 -105
  56. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  57. package/dist/agent/managers/chatLockManager.d.ts +20 -88
  58. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  59. package/dist/agent/managers/chatLockManager.js +31 -103
  60. package/dist/agent/managers/chatLockManager.js.map +1 -1
  61. package/dist/agent/managers/dedupManager.d.ts +85 -0
  62. package/dist/agent/managers/dedupManager.d.ts.map +1 -0
  63. package/dist/agent/managers/dedupManager.js +248 -0
  64. package/dist/agent/managers/dedupManager.js.map +1 -0
  65. package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
  66. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
  67. package/dist/agent/managers/goalConsistencyChecker.js +178 -0
  68. package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
  69. package/dist/agent/managers/llmCaller.d.ts +124 -0
  70. package/dist/agent/managers/llmCaller.d.ts.map +1 -0
  71. package/dist/agent/managers/llmCaller.js +417 -0
  72. package/dist/agent/managers/llmCaller.js.map +1 -0
  73. package/dist/agent/managers/llmJudgeHelper.d.ts +21 -0
  74. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
  75. package/dist/agent/managers/llmJudgeHelper.js +32 -0
  76. package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
  77. package/dist/agent/managers/loopMetrics.d.ts +58 -0
  78. package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
  79. package/dist/agent/managers/loopMetrics.js +68 -0
  80. package/dist/agent/managers/loopMetrics.js.map +1 -0
  81. package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
  82. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  83. package/dist/agent/managers/memoryAdvisor.js +56 -192
  84. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  85. package/dist/agent/managers/memoryGovernance.d.ts +24 -0
  86. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
  87. package/dist/agent/managers/memoryGovernance.js +46 -0
  88. package/dist/agent/managers/memoryGovernance.js.map +1 -0
  89. package/dist/agent/managers/memoryInspector.d.ts +59 -393
  90. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  91. package/dist/agent/managers/memoryInspector.js +92 -736
  92. package/dist/agent/managers/memoryInspector.js.map +1 -1
  93. package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
  94. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
  95. package/dist/agent/managers/roundSummaryGenerator.js +201 -0
  96. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
  97. package/dist/agent/managers/sessionArchiver.d.ts +19 -63
  98. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  99. package/dist/agent/managers/sessionArchiver.js +83 -157
  100. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  101. package/dist/agent/managers/sessionManager.d.ts +286 -57
  102. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  103. package/dist/agent/managers/sessionManager.js +846 -85
  104. package/dist/agent/managers/sessionManager.js.map +1 -1
  105. package/dist/agent/managers/sessionNamer.d.ts +35 -0
  106. package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
  107. package/dist/agent/managers/sessionNamer.js +104 -0
  108. package/dist/agent/managers/sessionNamer.js.map +1 -0
  109. package/dist/agent/managers/streamAccumulator.d.ts +20 -0
  110. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
  111. package/dist/agent/managers/streamAccumulator.js +15 -0
  112. package/dist/agent/managers/streamAccumulator.js.map +1 -0
  113. package/dist/agent/managers/textPolishManager.d.ts +8 -44
  114. package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
  115. package/dist/agent/managers/textPolishManager.js +12 -47
  116. package/dist/agent/managers/textPolishManager.js.map +1 -1
  117. package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
  118. package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
  119. package/dist/agent/managers/toolCallHelpers.js +161 -0
  120. package/dist/agent/managers/toolCallHelpers.js.map +1 -0
  121. package/dist/agent/managers/workProjection.d.ts +57 -87
  122. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  123. package/dist/agent/managers/workProjection.js +166 -246
  124. package/dist/agent/managers/workProjection.js.map +1 -1
  125. package/dist/agent/messageHistory.d.ts +134 -84
  126. package/dist/agent/messageHistory.d.ts.map +1 -1
  127. package/dist/agent/messageHistory.js +419 -133
  128. package/dist/agent/messageHistory.js.map +1 -1
  129. package/dist/agent/needsPlanning.d.ts +28 -0
  130. package/dist/agent/needsPlanning.d.ts.map +1 -0
  131. package/dist/agent/needsPlanning.js +68 -0
  132. package/dist/agent/needsPlanning.js.map +1 -0
  133. package/dist/agent/seed/index.d.ts +11 -0
  134. package/dist/agent/seed/index.d.ts.map +1 -0
  135. package/dist/agent/seed/index.js +10 -0
  136. package/dist/agent/seed/index.js.map +1 -0
  137. package/dist/agent/seed/orchestrator.d.ts +83 -0
  138. package/dist/agent/seed/orchestrator.d.ts.map +1 -0
  139. package/dist/agent/seed/orchestrator.js +260 -0
  140. package/dist/agent/seed/orchestrator.js.map +1 -0
  141. package/dist/agent/seed/prepare.d.ts +49 -0
  142. package/dist/agent/seed/prepare.d.ts.map +1 -0
  143. package/dist/agent/seed/prepare.js +107 -0
  144. package/dist/agent/seed/prepare.js.map +1 -0
  145. package/dist/agent/seed/types.d.ts +115 -0
  146. package/dist/agent/seed/types.d.ts.map +1 -0
  147. package/dist/agent/seed/types.js +15 -0
  148. package/dist/agent/seed/types.js.map +1 -0
  149. package/dist/agent/sessionStateMachine.d.ts +78 -0
  150. package/dist/agent/sessionStateMachine.d.ts.map +1 -0
  151. package/dist/agent/sessionStateMachine.js +182 -0
  152. package/dist/agent/sessionStateMachine.js.map +1 -0
  153. package/dist/agent/taskTableRenderer.d.ts +51 -0
  154. package/dist/agent/taskTableRenderer.d.ts.map +1 -0
  155. package/dist/agent/taskTableRenderer.js +115 -0
  156. package/dist/agent/taskTableRenderer.js.map +1 -0
  157. package/dist/agent/toolExecutor.d.ts +255 -9
  158. package/dist/agent/toolExecutor.d.ts.map +1 -1
  159. package/dist/agent/toolExecutor.js +956 -20
  160. package/dist/agent/toolExecutor.js.map +1 -1
  161. package/dist/agent/toolLedger.d.ts +120 -0
  162. package/dist/agent/toolLedger.d.ts.map +1 -0
  163. package/dist/agent/toolLedger.js +149 -0
  164. package/dist/agent/toolLedger.js.map +1 -0
  165. package/dist/agent/toolResultCache.d.ts +134 -0
  166. package/dist/agent/toolResultCache.d.ts.map +1 -0
  167. package/dist/agent/toolResultCache.js +243 -0
  168. package/dist/agent/toolResultCache.js.map +1 -0
  169. package/dist/agent/toolResultOffload.d.ts +59 -0
  170. package/dist/agent/toolResultOffload.d.ts.map +1 -0
  171. package/dist/agent/toolResultOffload.js +70 -0
  172. package/dist/agent/toolResultOffload.js.map +1 -0
  173. package/dist/agent/toolRunner.d.ts +59 -0
  174. package/dist/agent/toolRunner.d.ts.map +1 -0
  175. package/dist/agent/toolRunner.js +147 -0
  176. package/dist/agent/toolRunner.js.map +1 -0
  177. package/dist/agent/tracer.d.ts +99 -107
  178. package/dist/agent/tracer.d.ts.map +1 -1
  179. package/dist/agent/tracer.js +24 -69
  180. package/dist/agent/tracer.js.map +1 -1
  181. package/dist/agent/types.d.ts +512 -162
  182. package/dist/agent/types.d.ts.map +1 -1
  183. package/dist/agent/types.js +2 -51
  184. package/dist/agent/types.js.map +1 -1
  185. package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
  186. package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
  187. package/dist/code-exec/codeExecutionProvider.js +57 -0
  188. package/dist/code-exec/codeExecutionProvider.js.map +1 -0
  189. package/dist/code-exec/types.d.ts +37 -0
  190. package/dist/code-exec/types.d.ts.map +1 -0
  191. package/dist/code-exec/types.js +12 -0
  192. package/dist/code-exec/types.js.map +1 -0
  193. package/dist/config/expandEnvVars.d.ts +22 -0
  194. package/dist/config/expandEnvVars.d.ts.map +1 -0
  195. package/dist/config/expandEnvVars.js +38 -0
  196. package/dist/config/expandEnvVars.js.map +1 -0
  197. package/dist/config/loader.d.ts +59 -242
  198. package/dist/config/loader.d.ts.map +1 -1
  199. package/dist/config/loader.js +237 -194
  200. package/dist/config/loader.js.map +1 -1
  201. package/dist/index.d.ts +69 -74
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +93 -63
  204. package/dist/index.js.map +1 -1
  205. package/dist/llm/abortSignal.d.ts +2 -3
  206. package/dist/llm/abortSignal.d.ts.map +1 -1
  207. package/dist/llm/abortSignal.js +2 -3
  208. package/dist/llm/abortSignal.js.map +1 -1
  209. package/dist/llm/factory.d.ts +29 -25
  210. package/dist/llm/factory.d.ts.map +1 -1
  211. package/dist/llm/factory.js +34 -69
  212. package/dist/llm/factory.js.map +1 -1
  213. package/dist/llm/openaiCompatible.d.ts +25 -40
  214. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  215. package/dist/llm/openaiCompatible.js +181 -129
  216. package/dist/llm/openaiCompatible.js.map +1 -1
  217. package/dist/llm/provider.d.ts +29 -42
  218. package/dist/llm/provider.d.ts.map +1 -1
  219. package/dist/llm/provider.js +11 -10
  220. package/dist/llm/provider.js.map +1 -1
  221. package/dist/llm/types.d.ts +54 -11
  222. package/dist/llm/types.d.ts.map +1 -1
  223. package/dist/llm/types.js +0 -5
  224. package/dist/llm/types.js.map +1 -1
  225. package/dist/logging/logger.d.ts +8 -29
  226. package/dist/logging/logger.d.ts.map +1 -1
  227. package/dist/logging/logger.js +43 -233
  228. package/dist/logging/logger.js.map +1 -1
  229. package/dist/logging/loggerInterface.d.ts +9 -8
  230. package/dist/logging/loggerInterface.d.ts.map +1 -1
  231. package/dist/memory/gcService.d.ts +164 -0
  232. package/dist/memory/gcService.d.ts.map +1 -0
  233. package/dist/memory/gcService.js +215 -0
  234. package/dist/memory/gcService.js.map +1 -0
  235. package/dist/memory/governance.d.ts +17 -0
  236. package/dist/memory/governance.d.ts.map +1 -0
  237. package/dist/memory/governance.js +17 -0
  238. package/dist/memory/governance.js.map +1 -0
  239. package/dist/memory/inMemoryRoundStore.d.ts +124 -0
  240. package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
  241. package/dist/memory/inMemoryRoundStore.js +216 -0
  242. package/dist/memory/inMemoryRoundStore.js.map +1 -0
  243. package/dist/memory/inMemorySessionStore.d.ts +92 -0
  244. package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
  245. package/dist/memory/inMemorySessionStore.js +219 -0
  246. package/dist/memory/inMemorySessionStore.js.map +1 -0
  247. package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
  248. package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
  249. package/dist/memory/inMemorySessionViewLoader.js +183 -0
  250. package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
  251. package/dist/memory/inMemoryStorage.d.ts +26 -141
  252. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  253. package/dist/memory/inMemoryStorage.js +48 -187
  254. package/dist/memory/inMemoryStorage.js.map +1 -1
  255. package/dist/memory/keywordsTouch.d.ts +20 -0
  256. package/dist/memory/keywordsTouch.d.ts.map +1 -0
  257. package/dist/memory/keywordsTouch.js +25 -0
  258. package/dist/memory/keywordsTouch.js.map +1 -0
  259. package/dist/memory/lockManager.d.ts +7 -2
  260. package/dist/memory/lockManager.d.ts.map +1 -1
  261. package/dist/memory/lockManager.js +35 -11
  262. package/dist/memory/lockManager.js.map +1 -1
  263. package/dist/memory/projectManager.d.ts +30 -128
  264. package/dist/memory/projectManager.d.ts.map +1 -1
  265. package/dist/memory/projectManager.js +39 -171
  266. package/dist/memory/projectManager.js.map +1 -1
  267. package/dist/memory/projectRegistry.d.ts +22 -37
  268. package/dist/memory/projectRegistry.d.ts.map +1 -1
  269. package/dist/memory/projectRegistry.js +78 -85
  270. package/dist/memory/projectRegistry.js.map +1 -1
  271. package/dist/memory/roundStore.d.ts +629 -0
  272. package/dist/memory/roundStore.d.ts.map +1 -0
  273. package/dist/memory/roundStore.js +116 -0
  274. package/dist/memory/roundStore.js.map +1 -0
  275. package/dist/memory/sessionStore.d.ts +70 -61
  276. package/dist/memory/sessionStore.d.ts.map +1 -1
  277. package/dist/memory/sessionStore.js +23 -1
  278. package/dist/memory/sessionStore.js.map +1 -1
  279. package/dist/memory/sessionViewLoader.d.ts +141 -0
  280. package/dist/memory/sessionViewLoader.d.ts.map +1 -0
  281. package/dist/memory/sessionViewLoader.js +65 -0
  282. package/dist/memory/sessionViewLoader.js.map +1 -0
  283. package/dist/memory/sourceValidation.d.ts +18 -9
  284. package/dist/memory/sourceValidation.d.ts.map +1 -1
  285. package/dist/memory/sourceValidation.js +35 -29
  286. package/dist/memory/sourceValidation.js.map +1 -1
  287. package/dist/memory/storageInterface.d.ts +45 -126
  288. package/dist/memory/storageInterface.d.ts.map +1 -1
  289. package/dist/memory/types.d.ts +82 -168
  290. package/dist/memory/types.d.ts.map +1 -1
  291. package/dist/memory/types.js +116 -79
  292. package/dist/memory/types.js.map +1 -1
  293. package/dist/project-search/projectSearchProvider.d.ts +29 -0
  294. package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
  295. package/dist/project-search/projectSearchProvider.js +57 -0
  296. package/dist/project-search/projectSearchProvider.js.map +1 -0
  297. package/dist/project-search/terms.d.ts +14 -0
  298. package/dist/project-search/terms.d.ts.map +1 -0
  299. package/dist/project-search/terms.js +68 -0
  300. package/dist/project-search/terms.js.map +1 -0
  301. package/dist/project-search/types.d.ts +139 -0
  302. package/dist/project-search/types.d.ts.map +1 -0
  303. package/dist/project-search/types.js +8 -0
  304. package/dist/project-search/types.js.map +1 -0
  305. package/dist/role-pack/capabilityMap.d.ts +28 -0
  306. package/dist/role-pack/capabilityMap.d.ts.map +1 -0
  307. package/dist/role-pack/capabilityMap.js +56 -0
  308. package/dist/role-pack/capabilityMap.js.map +1 -0
  309. package/dist/role-pack/constants.d.ts +21 -0
  310. package/dist/role-pack/constants.d.ts.map +1 -0
  311. package/dist/role-pack/constants.js +21 -0
  312. package/dist/role-pack/constants.js.map +1 -0
  313. package/dist/role-pack/rolePackManager.d.ts +269 -0
  314. package/dist/role-pack/rolePackManager.d.ts.map +1 -0
  315. package/dist/role-pack/rolePackManager.js +1082 -0
  316. package/dist/role-pack/rolePackManager.js.map +1 -0
  317. package/dist/role-pack/strategyKeys.d.ts +100 -0
  318. package/dist/role-pack/strategyKeys.d.ts.map +1 -0
  319. package/dist/role-pack/strategyKeys.js +184 -0
  320. package/dist/role-pack/strategyKeys.js.map +1 -0
  321. package/dist/role-pack/strategyResolver.d.ts +109 -0
  322. package/dist/role-pack/strategyResolver.d.ts.map +1 -0
  323. package/dist/role-pack/strategyResolver.js +304 -0
  324. package/dist/role-pack/strategyResolver.js.map +1 -0
  325. package/dist/role-pack/types.d.ts +237 -0
  326. package/dist/role-pack/types.d.ts.map +1 -0
  327. package/dist/role-pack/types.js +8 -0
  328. package/dist/role-pack/types.js.map +1 -0
  329. package/dist/role-pack/validator.d.ts +38 -0
  330. package/dist/role-pack/validator.d.ts.map +1 -0
  331. package/dist/role-pack/validator.js +436 -0
  332. package/dist/role-pack/validator.js.map +1 -0
  333. package/dist/security/pathGuard.d.ts +69 -72
  334. package/dist/security/pathGuard.d.ts.map +1 -1
  335. package/dist/security/pathGuard.js +151 -131
  336. package/dist/security/pathGuard.js.map +1 -1
  337. package/dist/skill/skillLayer3.d.ts +91 -0
  338. package/dist/skill/skillLayer3.d.ts.map +1 -0
  339. package/dist/skill/skillLayer3.js +104 -0
  340. package/dist/skill/skillLayer3.js.map +1 -0
  341. package/dist/skill/skillManager.d.ts +127 -56
  342. package/dist/skill/skillManager.d.ts.map +1 -1
  343. package/dist/skill/skillManager.js +318 -163
  344. package/dist/skill/skillManager.js.map +1 -1
  345. package/dist/skill/skillScriptRunner.d.ts +97 -0
  346. package/dist/skill/skillScriptRunner.d.ts.map +1 -0
  347. package/dist/skill/skillScriptRunner.js +271 -0
  348. package/dist/skill/skillScriptRunner.js.map +1 -0
  349. package/dist/skill/types.d.ts +73 -17
  350. package/dist/skill/types.d.ts.map +1 -1
  351. package/dist/skill/types.js +5 -1
  352. package/dist/skill/types.js.map +1 -1
  353. package/dist/utils/array.d.ts +5 -6
  354. package/dist/utils/array.d.ts.map +1 -1
  355. package/dist/utils/array.js +6 -6
  356. package/dist/utils/array.js.map +1 -1
  357. package/dist/utils/atomicWrite.d.ts +8 -0
  358. package/dist/utils/atomicWrite.d.ts.map +1 -0
  359. package/dist/utils/atomicWrite.js +31 -0
  360. package/dist/utils/atomicWrite.js.map +1 -0
  361. package/dist/utils/backgroundTask.d.ts +38 -0
  362. package/dist/utils/backgroundTask.d.ts.map +1 -0
  363. package/dist/utils/backgroundTask.js +117 -0
  364. package/dist/utils/backgroundTask.js.map +1 -0
  365. package/dist/utils/configResourceManager.d.ts +79 -0
  366. package/dist/utils/configResourceManager.d.ts.map +1 -0
  367. package/dist/utils/configResourceManager.js +150 -0
  368. package/dist/utils/configResourceManager.js.map +1 -0
  369. package/dist/utils/errors.d.ts +48 -56
  370. package/dist/utils/errors.d.ts.map +1 -1
  371. package/dist/utils/errors.js +60 -58
  372. package/dist/utils/errors.js.map +1 -1
  373. package/dist/utils/eventEmitter.d.ts +141 -63
  374. package/dist/utils/eventEmitter.d.ts.map +1 -1
  375. package/dist/utils/eventEmitter.js +50 -35
  376. package/dist/utils/eventEmitter.js.map +1 -1
  377. package/dist/utils/fileSafe.d.ts +20 -0
  378. package/dist/utils/fileSafe.d.ts.map +1 -0
  379. package/dist/utils/fileSafe.js +56 -0
  380. package/dist/utils/fileSafe.js.map +1 -0
  381. package/dist/utils/frontmatter.d.ts +2 -3
  382. package/dist/utils/frontmatter.d.ts.map +1 -1
  383. package/dist/utils/frontmatter.js +6 -5
  384. package/dist/utils/frontmatter.js.map +1 -1
  385. package/dist/utils/hash.d.ts +12 -0
  386. package/dist/utils/hash.d.ts.map +1 -0
  387. package/dist/utils/hash.js +27 -0
  388. package/dist/utils/hash.js.map +1 -0
  389. package/dist/utils/http.d.ts +17 -0
  390. package/dist/utils/http.d.ts.map +1 -0
  391. package/dist/utils/http.js +29 -0
  392. package/dist/utils/http.js.map +1 -0
  393. package/dist/utils/json.d.ts +1 -1
  394. package/dist/utils/json.js +1 -1
  395. package/dist/utils/math.d.ts +34 -1
  396. package/dist/utils/math.d.ts.map +1 -1
  397. package/dist/utils/math.js +47 -14
  398. package/dist/utils/math.js.map +1 -1
  399. package/dist/utils/objects.d.ts +2 -3
  400. package/dist/utils/objects.d.ts.map +1 -1
  401. package/dist/utils/objects.js +2 -3
  402. package/dist/utils/objects.js.map +1 -1
  403. package/dist/utils/recallDefaults.d.ts +16 -0
  404. package/dist/utils/recallDefaults.d.ts.map +1 -0
  405. package/dist/utils/recallDefaults.js +16 -0
  406. package/dist/utils/recallDefaults.js.map +1 -0
  407. package/dist/utils/safeTimer.d.ts +8 -36
  408. package/dist/utils/safeTimer.d.ts.map +1 -1
  409. package/dist/utils/safeTimer.js +9 -37
  410. package/dist/utils/safeTimer.js.map +1 -1
  411. package/dist/utils/scanner.d.ts +97 -17
  412. package/dist/utils/scanner.d.ts.map +1 -1
  413. package/dist/utils/scanner.js +269 -47
  414. package/dist/utils/scanner.js.map +1 -1
  415. package/dist/utils/segmenter.d.ts +20 -29
  416. package/dist/utils/segmenter.d.ts.map +1 -1
  417. package/dist/utils/segmenter.js +230 -88
  418. package/dist/utils/segmenter.js.map +1 -1
  419. package/dist/utils/strings.d.ts +15 -32
  420. package/dist/utils/strings.d.ts.map +1 -1
  421. package/dist/utils/strings.js +25 -44
  422. package/dist/utils/strings.js.map +1 -1
  423. package/dist/utils/time.d.ts +37 -0
  424. package/dist/utils/time.d.ts.map +1 -1
  425. package/dist/utils/time.js +56 -0
  426. package/dist/utils/time.js.map +1 -1
  427. package/dist/utils/toError.d.ts +13 -1
  428. package/dist/utils/toError.d.ts.map +1 -1
  429. package/dist/utils/toError.js +18 -1
  430. package/dist/utils/toError.js.map +1 -1
  431. package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
  432. package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
  433. package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
  434. package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
  435. package/dist/web-fetch/types.d.ts +30 -0
  436. package/dist/web-fetch/types.d.ts.map +1 -0
  437. package/dist/web-fetch/types.js +7 -0
  438. package/dist/web-fetch/types.js.map +1 -0
  439. package/dist/web-fetch/webFetchProvider.d.ts +10 -0
  440. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
  441. package/dist/web-fetch/webFetchProvider.js +28 -0
  442. package/dist/web-fetch/webFetchProvider.js.map +1 -0
  443. package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
  444. package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
  445. package/dist/web-search/fetchWebSearchProvider.js +199 -0
  446. package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
  447. package/dist/web-search/types.d.ts +46 -0
  448. package/dist/web-search/types.d.ts.map +1 -0
  449. package/dist/web-search/types.js +2 -0
  450. package/dist/{persona → web-search}/types.js.map +1 -1
  451. package/dist/web-search/webSearchProvider.d.ts +10 -0
  452. package/dist/web-search/webSearchProvider.d.ts.map +1 -0
  453. package/dist/web-search/webSearchProvider.js +30 -0
  454. package/dist/web-search/webSearchProvider.js.map +1 -0
  455. package/docs/architecture/role-pack-authoring-guide.md +243 -0
  456. package/docs/architecture/role-pack-spec.md +767 -0
  457. package/docs/memora-api-reference.md +1175 -0
  458. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +843 -0
  459. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
  460. package/package.json +105 -83
  461. package/role-packs/README.md +41 -0
  462. package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
  463. package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
  464. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
  465. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
  466. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
  467. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
  468. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
  469. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
  470. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
  471. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
  472. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
  473. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
  474. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
  475. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
  476. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
  477. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
  478. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
  479. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
  480. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
  481. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
  482. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
  483. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
  484. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
  485. 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 +441 -0
  486. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
  487. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
  488. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
  489. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
  490. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
  491. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
  492. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
  493. 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 +48 -0
  494. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
  495. 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 +19 -0
  496. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
  497. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
  498. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
  499. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
  500. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
  501. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
  502. package/dist/agent/guardrail.d.ts +0 -47
  503. package/dist/agent/guardrail.d.ts.map +0 -1
  504. package/dist/agent/guardrail.js +0 -51
  505. package/dist/agent/guardrail.js.map +0 -1
  506. package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
  507. package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
  508. package/dist/agent/managers/autoConfigRefiner.js +0 -150
  509. package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
  510. package/dist/agent/managers/configManager.d.ts +0 -125
  511. package/dist/agent/managers/configManager.d.ts.map +0 -1
  512. package/dist/agent/managers/configManager.js +0 -194
  513. package/dist/agent/managers/configManager.js.map +0 -1
  514. package/dist/agent/managers/insightExtractor.d.ts +0 -139
  515. package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
  516. package/dist/agent/managers/insightExtractor.js +0 -401
  517. package/dist/agent/managers/insightExtractor.js.map +0 -1
  518. package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -198
  519. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
  520. package/dist/agent/managers/memoryDecayScheduler.js +0 -349
  521. package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
  522. package/dist/agent/managers/relationBuilder.d.ts +0 -131
  523. package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
  524. package/dist/agent/managers/relationBuilder.js +0 -192
  525. package/dist/agent/managers/relationBuilder.js.map +0 -1
  526. package/dist/agent/personaMatcher.d.ts +0 -29
  527. package/dist/agent/personaMatcher.d.ts.map +0 -1
  528. package/dist/agent/personaMatcher.js +0 -60
  529. package/dist/agent/personaMatcher.js.map +0 -1
  530. package/dist/agent/userFactExtractor.d.ts +0 -25
  531. package/dist/agent/userFactExtractor.d.ts.map +0 -1
  532. package/dist/agent/userFactExtractor.js +0 -81
  533. package/dist/agent/userFactExtractor.js.map +0 -1
  534. package/dist/eval/evalRunner.d.ts +0 -94
  535. package/dist/eval/evalRunner.d.ts.map +0 -1
  536. package/dist/eval/evalRunner.js +0 -141
  537. package/dist/eval/evalRunner.js.map +0 -1
  538. package/dist/eval/evalTypes.d.ts +0 -148
  539. package/dist/eval/evalTypes.d.ts.map +0 -1
  540. package/dist/eval/evalTypes.js +0 -118
  541. package/dist/eval/evalTypes.js.map +0 -1
  542. package/dist/eval/scenarios.d.ts +0 -33
  543. package/dist/eval/scenarios.d.ts.map +0 -1
  544. package/dist/eval/scenarios.js +0 -109
  545. package/dist/eval/scenarios.js.map +0 -1
  546. package/dist/llm/embedding.d.ts +0 -67
  547. package/dist/llm/embedding.d.ts.map +0 -1
  548. package/dist/llm/embedding.js +0 -184
  549. package/dist/llm/embedding.js.map +0 -1
  550. package/dist/memory/hybridMerge.d.ts +0 -54
  551. package/dist/memory/hybridMerge.d.ts.map +0 -1
  552. package/dist/memory/hybridMerge.js +0 -36
  553. package/dist/memory/hybridMerge.js.map +0 -1
  554. package/dist/memory/inMemoryRelationStore.d.ts +0 -51
  555. package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
  556. package/dist/memory/inMemoryRelationStore.js +0 -65
  557. package/dist/memory/inMemoryRelationStore.js.map +0 -1
  558. package/dist/memory/loader.d.ts +0 -49
  559. package/dist/memory/loader.d.ts.map +0 -1
  560. package/dist/memory/loader.js +0 -93
  561. package/dist/memory/loader.js.map +0 -1
  562. package/dist/memory/recall.d.ts +0 -66
  563. package/dist/memory/recall.d.ts.map +0 -1
  564. package/dist/memory/recall.js +0 -142
  565. package/dist/memory/recall.js.map +0 -1
  566. package/dist/memory/relationStore.d.ts +0 -78
  567. package/dist/memory/relationStore.d.ts.map +0 -1
  568. package/dist/memory/relationStore.js +0 -2
  569. package/dist/memory/relationStore.js.map +0 -1
  570. package/dist/memory/store.d.ts +0 -50
  571. package/dist/memory/store.d.ts.map +0 -1
  572. package/dist/memory/store.js +0 -161
  573. package/dist/memory/store.js.map +0 -1
  574. package/dist/memory/userProfile.d.ts +0 -156
  575. package/dist/memory/userProfile.d.ts.map +0 -1
  576. package/dist/memory/userProfile.js +0 -320
  577. package/dist/memory/userProfile.js.map +0 -1
  578. package/dist/memory/vectorStore.d.ts +0 -185
  579. package/dist/memory/vectorStore.d.ts.map +0 -1
  580. package/dist/memory/vectorStore.js +0 -257
  581. package/dist/memory/vectorStore.js.map +0 -1
  582. package/dist/persona/personaManager.d.ts +0 -160
  583. package/dist/persona/personaManager.d.ts.map +0 -1
  584. package/dist/persona/personaManager.js +0 -414
  585. package/dist/persona/personaManager.js.map +0 -1
  586. package/dist/persona/types.d.ts +0 -32
  587. package/dist/persona/types.d.ts.map +0 -1
  588. package/dist/persona/types.js +0 -5
@@ -1,43 +1,23 @@
1
1
  /**
2
- * 记忆顾问 — 健康诊断 + 关联推荐 + 冲突检测
3
- *
4
- * 从 MemoryInspector 提取 sourceHealth() + suggest() 为独立模块。
5
- * 两者均为纯只读分析计算,仅依赖 IMemoryStorage,不修改任何状态。
6
- *
7
- * 设计原则(延续 MemoryInspector):
8
- * - 纯只读——只读 IMemoryStorage,不修改任何状态
9
- * - 同步返回——不调 LLM、不调 SQLite 写入
10
- * - 无状态——所有数据从 IMemoryStorage 实时读取
11
- *
12
- * L3 冲突检测(可选增强):
13
- * - detectConflicts() 是异步方法,调用 LLM 判断记忆间语义冲突
14
- * - backgroundProvider 未注入时静默跳过(向后兼容)
15
- * - 仅检测不修复——冲突需要用户决策(降级哪条由用户选择)
2
+ * 记忆顾问 — sourceHealth()(源健康诊断)+ suggest()(关联推荐)+ detectConflicts()(L3 冲突检测)。
3
+ * 纯只读分析计算,仅依赖 IMemoryStorage 不修改状态;同步返回不调 LLM。
4
+ * L3 冲突检测:异步调 LLM 判断记忆间语义冲突,仅检测不修复(降级哪条由用户决策)。
16
5
  */
17
6
  import type { Memory } from '../../memory/types.js';
18
7
  import type { IMemoryStorage } from '../../memory/storageInterface.js';
19
8
  import type { LlmProvider } from '../../llm/provider.js';
20
- /** 记忆源健康状态 */
21
- export type SourceHealthStatus = 'healthy' | 'warning' | 'critical';
22
- /** 单个 source 的健康指标 */
9
+ /** 单个 source 的事实观测指标(纯事实,不做健康等级判定) */
23
10
  export interface SourceHealthEntry {
24
- /** 来源标签 */
25
11
  source: string;
26
12
  /** 记忆数量 */
27
13
  count: number;
28
- /** 平均 score(0-1) */
29
- avgScore: number;
30
- /** 距上次访问的天数(取该 source 中最近访问的记忆) */
14
+ /** 距上次访问的天数(取该 source 中最近访问的记忆,冷记忆观测) */
31
15
  daysSinceLastAccess: number;
32
- /** 健康状态:healthy(score≥0.5 且 7 天内有访问)/ warning(score<0.5 或 7-30 天未访问)/ critical(score<0.2 或 30 天以上未访问) */
33
- status: SourceHealthStatus;
34
16
  }
35
- /** 记忆源健康诊断报告 */
17
+ /** 记忆源诊断报告(纯事实观测,不设健康等级——记忆健康由 supersede/命中体现) */
36
18
  export interface SourceHealthReport {
37
- /** 各 source 健康指标 */
19
+ /** 各 source 事实观测 */
38
20
  sources: SourceHealthEntry[];
39
- /** 整体健康状态(取最差 source 的状态) */
40
- overallStatus: SourceHealthStatus;
41
21
  /** 诊断时间(ISO 8601) */
42
22
  diagnosedAt: string;
43
23
  }
@@ -45,20 +25,17 @@ export interface SourceHealthReport {
45
25
  export interface SuggestOptions {
46
26
  /** 返回数量上限(默认 5) */
47
27
  limit?: number;
48
- /** 排除的 source 标签(默认排除 persona、rule、skill) */
28
+ /** 排除的 source 标签(默认空数组——设定记忆已归角色包,不再参与召回排除) */
49
29
  excludeSources?: string[];
50
- /** 时效性权重(0-1,默认 0.3):越高越偏好最近访问的记忆 */
51
- recencyWeight?: number;
52
30
  }
53
31
  /** 关联推荐结果 */
54
32
  export interface SuggestHit {
55
33
  /** 记忆唯一标识(source:name 格式) */
56
34
  id: string;
57
- /** 记忆名称 */
58
35
  name: string;
59
36
  /** 来源标签 */
60
37
  source: string;
61
- /** 推荐分数(0-1,由 score + recency 综合计算) */
38
+ /** 推荐分数(0-1,score 退役后为纯时效 recency) */
62
39
  relevance: number;
63
40
  /** 内容预览(截断到 120 字符) */
64
41
  contentPreview: string;
@@ -67,13 +44,11 @@ export interface SuggestHit {
67
44
  }
68
45
  /** 单对记忆的冲突判断结果 */
69
46
  export interface ConflictVerdict {
70
- /** 记忆 A */
71
47
  memoryA: Memory;
72
- /** 记忆 B */
73
48
  memoryB: Memory;
74
49
  /** 是否存在语义冲突(true → 需用户决策降级哪条) */
75
50
  hasConflict: boolean;
76
- /** 冲突描述(hasConflict=true 时提供,说明冲突点) */
51
+ /** 冲突描述(hasConflict=true 时提供冲突点) */
77
52
  conflictDescription?: string;
78
53
  /** LLM 建议保留的记忆('a' / 'b' / 'both',仅供参考) */
79
54
  recommendation?: 'a' | 'b' | 'both';
@@ -90,108 +65,40 @@ export interface ConflictReport {
90
65
  conflictCount: number;
91
66
  /** 冲突详情列表(供宿主 UI 展示和用户决策) */
92
67
  conflicts: ConflictVerdict[];
93
- /** 跳过原因(LLM 不可用 / 无候选对 / LLM 失败降级) */
68
+ /** 跳过原因(LLM 不可用 / 无候选对) */
94
69
  skippedReason?: string;
95
70
  }
96
- /**
97
- * 记忆顾问
98
- *
99
- * 从 MemoryInspector 拆分,负责基于记忆数据的分析计算:
100
- * - sourceHealth():记忆源健康诊断(数量、score、新鲜度)
101
- * - suggest():关联推荐(基于 score + 时效性 + 多样性)
102
- * - detectConflicts():语义冲突检测(L3,可选,backgroundProvider 注入后启用)
103
- *
104
- * 与 MemoryInspector 的分工:
105
- * - MemoryInspector:直接数据查询(snapshot/search/stats/relations + 写操作代理)
106
- * - MemoryAdvisor:分析计算(健康诊断 + 推荐排序 + 冲突检测)
107
- */
71
+ /** 记忆顾问:与 MemoryInspector 分工(Inspector 直接数据查询,Advisor 分析计算:健康诊断 + 推荐排序 + 冲突检测) */
108
72
  export declare class MemoryAdvisor {
109
73
  private readonly index;
110
74
  /** 后台 LLM Provider(可选,用于 L3 冲突检测,未注入时跳过) */
111
75
  private readonly backgroundProvider;
76
+ /** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时推荐/冲突检测空转,测试可显式注入) */
77
+ private readonly sources;
78
+ constructor(index: IMemoryStorage, backgroundProvider?: LlmProvider | null, sources?: readonly string[]);
112
79
  /**
113
- * @param index - 记忆存储(只读访问,用于健康诊断和推荐计算)
114
- * @param backgroundProvider - 后台 LLM Provider(可选,用于 L3 冲突检测,未注入时跳过)
115
- */
116
- constructor(index: IMemoryStorage, backgroundProvider?: LlmProvider | null);
117
- /**
118
- * 记忆源健康诊断
119
- *
120
- * 为每个 source 计算健康指标(数量、平均 score、新鲜度、状态),
121
- * 帮助宿主项目判断是否需要触发衰减、清理或补充。
122
- *
123
- * 健康状态判定:
124
- * - healthy:avgScore ≥ 0.5 且 7 天内有访问
125
- * - warning:avgScore < 0.5 或 7-30 天未访问
126
- * - critical:avgScore < 0.2 或 30 天以上未访问
127
- *
128
- * 纯只读、同步、不调 LLM,与 stats() 互补(stats 只有数量,本方法有质量指标)。
129
- * 使用 getAllSources() 发现所有 source 标签,替代全量 search。
80
+ * 记忆源健康诊断:逐 source 计算记忆数量 / 最近访问天数(纯事实观测)。
81
+ * 不设健康等级:记忆健康由 supersede(写时取代)/ 命中体现,
82
+ * 无需榜单级 status 判定(daysSinceLastAccess 作冷记忆观测)。
83
+ * 纯只读同步不调 LLM,用 getAllSources() 发现所有 source 标签(替代全量 search)。
130
84
  */
131
85
  sourceHealth(): SourceHealthReport;
132
86
  /**
133
- * 关联推荐:基于已有记忆数据,推荐你可能感兴趣的记忆
134
- *
135
- * 不调 LLM,纯计算。综合 score(权重)+ accessedAt(时效性)+ source 多样性,
136
- * 返回"与你当前关注点相关但尚未直接搜索到"的记忆。
137
- *
138
- * 适用场景:
139
- * - 用户搜索后,展示"你可能还想看"
140
- * - 对话开始时,展示"最近你可能关心的记忆"
141
- * - 宿主程序构建个性化推荐面板
142
- *
143
- * @param query - 可选的搜索关键词(提供时结合搜索结果推荐,省略时基于全局热度推荐)
144
- * @param options - 推荐选项
87
+ * 关联推荐:不调 LLM 纯计算,综合 accessedAt(时效)+ source 多样性,
88
+ * 返回"相关但尚未直接搜索到"的记忆。query 提供时结合搜索命中推荐,省略时基于最近使用。
89
+ * relevance 为纯时效(recency)
145
90
  */
146
91
  suggest(query?: string, options?: SuggestOptions): SuggestHit[];
147
92
  /**
148
- * 语义冲突检测:扫描同 source 的记忆对,调用 LLM 判断是否存在语义冲突
149
- *
150
- * 流程:
151
- * 1. 从 insight/profile/work-projection 加载候选记忆(每个 source 取 top 10 条)
152
- * 2. 同 source 内两两配对,取前 10 对
153
- * 3. 对每对调用 LLM 判断是否存在语义冲突
154
- * 4. 返回冲突报告(仅检测,不修复——冲突需要用户决策)
155
- *
156
- * 安全设计:
157
- * - 仅检测不修复——不自动降级任何记忆,返回冲突详情供用户决策
158
- * - LLM 失败降级——返回已处理的报告,不阻塞调用方
159
- * - 单对 LLM 失败不阻塞后续检测
160
- * - backgroundProvider 未注入时静默跳过(向后兼容)
161
- *
162
- * 使用场景:
163
- * - 宿主定时任务定期检测(如每天一次)
164
- * - 用户手动触发(记忆管理面板的"检测冲突"按钮)
165
- * - 健康诊断报告的补充(sourceHealth 显示数量,本方法显示质量冲突)
166
- *
167
- * @param signal 可选的 AbortSignal(取消正在进行的 LLM 判断)
168
- * @returns 冲突检测报告
93
+ * 语义冲突检测:加载候选(每 source top 10)→ 同 source 两两配对(前 10 对)→ LLM 判断冲突。
94
+ * 仅检测不修复(不自动降级,冲突需用户决策);LLM 失败不阻塞;provider 未注入静默跳过。
169
95
  */
170
96
  detectConflicts(signal?: AbortSignal): Promise<ConflictReport>;
171
- /**
172
- * 筛选同 source 内的候选冲突对
173
- *
174
- * 策略:
175
- * - 按 source 分组,同 source 内两两配对
176
- * - 限制每个 source 的配对数,避免 O(n²) 爆炸
177
- * - 总候选对数上限 10 对
178
- *
179
- * @param candidates 候选记忆列表(已按 source 分组混合)
180
- * @returns 同 source 候选对列表
181
- */
97
+ /** 筛选同 source 内候选冲突对:按 source 分组两两配对,限制每 source 配对数避免 O(n²) 爆炸,总上限 10 对 */
182
98
  private findConflictCandidates;
183
99
  /**
184
- * 调用 LLM 判断单对记忆是否存在语义冲突
185
- *
186
- * 使用结构化 JSON 输出(hasConflict + conflictDescription + recommendation + reason),
187
- * 参照 SessionArchiver.generateSummary 的 parseLlmJson 模式。
188
- *
189
- * LLM 失败时抛出异常(由 detectConflicts 捕获并降级跳过此对)。
190
- *
191
- * @param memoryA 记忆 A
192
- * @param memoryB 记忆 B
193
- * @param signal 可选的 AbortSignal
194
- * @returns LLM 判断结果
100
+ * 调用 LLM 判断两条记忆是否冲突:结构化 JSON 输出(hasConflict+conflictDescription+recommendation+reason)。
101
+ * 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
195
102
  */
196
103
  private judgeConflict;
197
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"memoryAdvisor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAyC9D,cAAc;AACd,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpE,sBAAsB;AACtB,MAAM,WAAW,iBAAiB;IAChC,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yGAAyG;IACzG,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,gBAAgB;AAChB,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,6BAA6B;IAC7B,aAAa,EAAE,kBAAkB,CAAC;IAClC,qBAAqB;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,aAAa;AACb,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,kBAAkB;AAClB,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2CAA2C;IAC3C,cAAc,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC;IACpC,eAAe;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;IAStB,OAAO,CAAC,QAAQ,CAAC,KAAK;IARxB,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAExD;;;OAGG;gBAEgB,KAAK,EAAE,cAAc,EACtC,kBAAkB,GAAE,WAAW,GAAG,IAAW;IAO/C;;;;;;;;;;;;;OAaG;IACH,YAAY,IAAI,kBAAkB;IAiElC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,UAAU,EAAE;IAuFnE;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAyEpE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IA+B9B;;;;;;;;;;;;OAYG;YACW,aAAa;CAuC5B"}
1
+ {"version":3,"file":"memoryAdvisor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAKnE,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AA6B9D,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,qBAAqB;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,aAAa;AACb,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,kBAAkB;AAClB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2CAA2C;IAC3C,cAAc,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC;IACpC,eAAe;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,kFAAkF;AAClF,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;gBAGzB,KAAK,EAAE,cAAc,EACtC,kBAAkB,GAAE,WAAW,GAAG,IAAW,EAC7C,OAAO,GAAE,SAAS,MAAM,EAAuB;IAQjD;;;;;OAKG;IACH,YAAY,IAAI,kBAAkB;IAsClC;;;;OAIG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,UAAU,EAAE;IA6EnE;;;OAGG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAwEpE,2EAA2E;IAC3E,OAAO,CAAC,sBAAsB;IA+B9B;;;OAGG;YACW,aAAa;CAiC5B"}
@@ -1,156 +1,92 @@
1
- import { SOURCE_LABELS } from '../../memory/types.js';
2
- import { ONE_DAY_MS } from '../../memory/recall.js';
3
- import { nowIso } from '../../utils/time.js';
4
- // parseLlmJson 用于解析 LLM 冲突判断结果
5
- import { byScoreDesc } from '../../utils/array.js';
6
- import { parseLlmJson } from '../../utils/json.js';
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';
7
8
  import { truncate } from '../../utils/strings.js';
8
9
  import { logger } from '../../logging/logger.js';
10
+ // 治理源列表 SSOT(设定记忆已归角色包)
11
+ import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
9
12
  // ─── 常量 ────────────────────────────────────────────────
10
13
  /** 关联推荐:每个 source 采样 top-N 条 */
11
14
  const SUGGEST_TOP_PER_SOURCE = 3;
12
- /** 关联推荐:时效性衰减窗口(天),超过此天数归零 */
15
+ /** 关联推荐:时效性窗口(天),超过此天数 relevance 归零(score 退役后纯时效排序) */
13
16
  const SUGGEST_RECENCY_WINDOW_DAYS = 30;
14
- /** 推荐结果内容预览字符数(与 MemoryInspector.SEARCH_PREVIEW_LEN 一致,独立维护以便各模块独立演进) */
17
+ /** 推荐内容预览字符数 */
15
18
  const ADVISOR_PREVIEW_LEN = 120;
16
- /** source 健康度阈值(低于此值或超期触发 critical/warning) */
17
- const SOURCE_HEALTH_THRESHOLDS = {
18
- /** 平均 score 低于此值 → critical */
19
- CRITICAL_SCORE: 0.2,
20
- /** 平均 score 低于此值 → warning */
21
- WARNING_SCORE: 0.5,
22
- /** 超过此天数未访问 → critical */
23
- CRITICAL_DAYS: 30,
24
- /** 超过此天数未访问 → warning */
25
- WARNING_DAYS: 7,
26
- };
27
19
  // ─── L3 冲突检测常量 ────────────────────────────────────
28
- /** 参与冲突检测的 source 标签 */
29
- const CONFLICT_SOURCES = [SOURCE_LABELS.INSIGHT, SOURCE_LABELS.PROFILE, SOURCE_LABELS.WORK_PROJECTION];
30
- /** 单个 source 内参与配对的记忆条数上限(控制 O(n²) 配对规模) */
20
+ /** 单个 source 内参与配对的条数上限(控制 O(n²) 配对规模) */
31
21
  const CONFLICT_CANDIDATES_PER_SOURCE = 10;
32
22
  /** 单次 LLM 冲突判断的候选对数上限 */
33
23
  const CONFLICT_PAIR_LIMIT = 10;
34
24
  /** LLM 冲突判断超时(ms) */
35
25
  const CONFLICT_TIMEOUT_MS = 15_000;
36
- /** 候选记忆内容预览长度(截断后送入 LLM) */
26
+ /** 候选内容预览长度(送入 LLM 前截断) */
37
27
  const CONFLICT_CONTENT_PREVIEW_LEN = 200;
38
28
  // ─── 类 ──────────────────────────────────────────────────
39
- /**
40
- * 记忆顾问
41
- *
42
- * 从 MemoryInspector 拆分,负责基于记忆数据的分析计算:
43
- * - sourceHealth():记忆源健康诊断(数量、score、新鲜度)
44
- * - suggest():关联推荐(基于 score + 时效性 + 多样性)
45
- * - detectConflicts():语义冲突检测(L3,可选,backgroundProvider 注入后启用)
46
- *
47
- * 与 MemoryInspector 的分工:
48
- * - MemoryInspector:直接数据查询(snapshot/search/stats/relations + 写操作代理)
49
- * - MemoryAdvisor:分析计算(健康诊断 + 推荐排序 + 冲突检测)
50
- */
29
+ /** 记忆顾问:与 MemoryInspector 分工(Inspector 直接数据查询,Advisor 分析计算:健康诊断 + 推荐排序 + 冲突检测) */
51
30
  export class MemoryAdvisor {
52
31
  index;
53
32
  /** 后台 LLM Provider(可选,用于 L3 冲突检测,未注入时跳过) */
54
33
  backgroundProvider;
55
- /**
56
- * @param index - 记忆存储(只读访问,用于健康诊断和推荐计算)
57
- * @param backgroundProvider - 后台 LLM Provider(可选,用于 L3 冲突检测,未注入时跳过)
58
- */
59
- constructor(index, backgroundProvider = null) {
34
+ /** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时推荐/冲突检测空转,测试可显式注入) */
35
+ sources;
36
+ constructor(index, backgroundProvider = null, sources = GOVERNANCE_SOURCES) {
60
37
  this.index = index;
61
38
  this.backgroundProvider = backgroundProvider;
39
+ this.sources = sources;
62
40
  }
63
41
  // ─── 源健康诊断 ─────────────────────────────────────────
64
42
  /**
65
- * 记忆源健康诊断
66
- *
67
- * 为每个 source 计算健康指标(数量、平均 score、新鲜度、状态),
68
- * 帮助宿主项目判断是否需要触发衰减、清理或补充。
69
- *
70
- * 健康状态判定:
71
- * - healthy:avgScore ≥ 0.5 且 7 天内有访问
72
- * - warning:avgScore < 0.5 或 7-30 天未访问
73
- * - critical:avgScore < 0.2 或 30 天以上未访问
74
- *
75
- * 纯只读、同步、不调 LLM,与 stats() 互补(stats 只有数量,本方法有质量指标)。
76
- * 使用 getAllSources() 发现所有 source 标签,替代全量 search。
43
+ * 记忆源健康诊断:逐 source 计算记忆数量 / 最近访问天数(纯事实观测)。
44
+ * 不设健康等级:记忆健康由 supersede(写时取代)/ 命中体现,
45
+ * 无需榜单级 status 判定(daysSinceLastAccess 作冷记忆观测)。
46
+ * 纯只读同步不调 LLM,用 getAllSources() 发现所有 source 标签(替代全量 search)。
77
47
  */
78
48
  sourceHealth() {
79
- const now = Date.now();
80
- // 使用 getAllSources() 获取所有有数据的 source 标签
49
+ // 获取所有有数据的 source 标签
81
50
  const sourceMap = this.index.getAllSources();
82
51
  const sourceSet = new Set();
83
52
  for (const [source, count] of sourceMap) {
84
53
  if (count > 0)
85
54
  sourceSet.add(source);
86
55
  }
87
- // 逐 source 计算健康指标
88
56
  const entries = [];
89
57
  for (const source of sourceSet) {
90
58
  const memories = this.index.getBySource(source);
91
59
  const count = memories.length;
92
- // 平均 score
93
- const avgScore = count > 0
94
- ? memories.reduce((sum, m) => sum + m.score, 0) / count
95
- : 0;
96
- // 最近访问时间(取该 source 中最新的 accessedAt)
60
+ // 最近访问时间(取该 source 中最新 accessedAt)
97
61
  const latestAccess = memories
98
62
  .map((m) => new Date(m.accessedAt).getTime())
99
63
  .filter((t) => !isNaN(t))
100
64
  .sort((a, b) => b - a)[0] ?? 0;
101
- const daysSinceLastAccess = latestAccess > 0
102
- ? (now - latestAccess) / ONE_DAY_MS
103
- : Infinity;
104
- // 健康状态判定
105
- let status;
106
- if (avgScore < SOURCE_HEALTH_THRESHOLDS.CRITICAL_SCORE || daysSinceLastAccess > SOURCE_HEALTH_THRESHOLDS.CRITICAL_DAYS) {
107
- status = 'critical';
108
- }
109
- else if (avgScore < SOURCE_HEALTH_THRESHOLDS.WARNING_SCORE || daysSinceLastAccess > SOURCE_HEALTH_THRESHOLDS.WARNING_DAYS) {
110
- status = 'warning';
111
- }
112
- else {
113
- status = 'healthy';
114
- }
65
+ const daysSinceLastAccess = latestAccess > 0 ? (Date.now() - latestAccess) / ONE_DAY_MS : Infinity;
115
66
  entries.push({
116
67
  source,
117
68
  count,
118
- avgScore: Math.round(avgScore * 1000) / 1000,
119
- daysSinceLastAccess: Math.round(daysSinceLastAccess * 10) / 10,
120
- status,
69
+ daysSinceLastAccess: roundTo(daysSinceLastAccess, 1),
121
70
  });
122
71
  }
123
- // 整体状态取最差 source
124
- const statusPriority = { healthy: 0, warning: 1, critical: 2 };
125
- const overallStatus = entries.reduce((worst, e) => statusPriority[e.status] > statusPriority[worst] ? e.status : worst, 'healthy');
126
72
  return {
127
- sources: entries.sort((a, b) => statusPriority[b.status] - statusPriority[a.status]),
128
- overallStatus,
73
+ // 按 source 名稳定排序(保证输出可预期;无关健康等级)
74
+ sources: entries.sort((a, b) => a.source.localeCompare(b.source)),
129
75
  diagnosedAt: nowIso(),
130
76
  };
131
77
  }
132
78
  // ─── 关联推荐 ─────────────────────────────────────────
133
79
  /**
134
- * 关联推荐:基于已有记忆数据,推荐你可能感兴趣的记忆
135
- *
136
- * 不调 LLM,纯计算。综合 score(权重)+ accessedAt(时效性)+ source 多样性,
137
- * 返回"与你当前关注点相关但尚未直接搜索到"的记忆。
138
- *
139
- * 适用场景:
140
- * - 用户搜索后,展示"你可能还想看"
141
- * - 对话开始时,展示"最近你可能关心的记忆"
142
- * - 宿主程序构建个性化推荐面板
143
- *
144
- * @param query - 可选的搜索关键词(提供时结合搜索结果推荐,省略时基于全局热度推荐)
145
- * @param options - 推荐选项
80
+ * 关联推荐:不调 LLM 纯计算,综合 accessedAt(时效)+ source 多样性,
81
+ * 返回"相关但尚未直接搜索到"的记忆。query 提供时结合搜索命中推荐,省略时基于最近使用。
82
+ * relevance 为纯时效(recency)
146
83
  */
147
84
  suggest(query, options = {}) {
148
- const { limit = 5, excludeSources = [SOURCE_LABELS.PERSONA, SOURCE_LABELS.RULE, SOURCE_LABELS.SKILL], recencyWeight = 0.3, } = options;
149
- const scoreWeight = 1 - recencyWeight;
85
+ const { limit = 5, excludeSources = [...DEFAULT_RECALL_EXCLUDE_SOURCES] } = options;
150
86
  const now = Date.now();
151
87
  // 收集候选记忆
152
88
  const candidates = new Map();
153
- // 如果有 query,先搜索直接匹配的记忆(标记为 searchHit)
89
+ // 有 query 时先搜直接命中(标记 searchHit)
154
90
  if (query && query.trim()) {
155
91
  const directHits = this.index.search(query, limit * 3);
156
92
  for (const m of directHits) {
@@ -159,14 +95,13 @@ export class MemoryAdvisor {
159
95
  }
160
96
  }
161
97
  }
162
- // 补充:按 source 分组采样,确保来源多样性
163
- const knownSources = [SOURCE_LABELS.INSIGHT, SOURCE_LABELS.PROFILE, SOURCE_LABELS.WORK_PROJECTION];
164
- for (const source of knownSources) {
98
+ // 按 source 分组采样,确保来源多样性
99
+ for (const source of this.sources) {
165
100
  const count = this.index.countBySource(source);
166
101
  if (count > 0 && !excludeSources.includes(source)) {
167
102
  const memories = this.index.getBySource(source);
168
- // 取 score 最高的前 N 条
169
- const top = memories.sort(byScoreDesc).slice(0, SUGGEST_TOP_PER_SOURCE);
103
+ // 取最近使用的前 N 条(score 退役后按 accessedAt 降序)
104
+ const top = memories.sort(byAccessedDesc).slice(0, SUGGEST_TOP_PER_SOURCE);
170
105
  for (const m of top) {
171
106
  if (!candidates.has(m.id)) {
172
107
  candidates.set(m.id, { memory: m, searchHit: false });
@@ -176,16 +111,14 @@ export class MemoryAdvisor {
176
111
  }
177
112
  if (candidates.size === 0)
178
113
  return [];
179
- // 计算综合推荐分数
180
114
  const scored = [];
181
115
  for (const { memory, searchHit } of candidates.values()) {
182
- // 时效性分:窗口内线性衰减,超过窗口归零
116
+ // 时效性分:窗口内线性衰减,超过窗口归零;score 退役后 relevance 即纯时效
183
117
  const accessedAt = new Date(memory.accessedAt);
184
118
  const daysSinceAccess = isNaN(accessedAt.getTime())
185
119
  ? SUGGEST_RECENCY_WINDOW_DAYS
186
120
  : (now - accessedAt.getTime()) / ONE_DAY_MS;
187
- const recency = Math.max(0, 1 - daysSinceAccess / SUGGEST_RECENCY_WINDOW_DAYS);
188
- const relevance = memory.score * scoreWeight + recency * recencyWeight;
121
+ const relevance = Math.max(0, 1 - daysSinceAccess / SUGGEST_RECENCY_WINDOW_DAYS);
189
122
  // 生成推荐理由
190
123
  let reason;
191
124
  if (searchHit) {
@@ -194,9 +127,6 @@ export class MemoryAdvisor {
194
127
  else if (daysSinceAccess < 1) {
195
128
  reason = '最近访问';
196
129
  }
197
- else if (memory.score >= 0.8) {
198
- reason = '高频记忆';
199
- }
200
130
  else {
201
131
  reason = `${memory.source} 推荐`;
202
132
  }
@@ -212,37 +142,18 @@ export class MemoryAdvisor {
212
142
  id: memory.id,
213
143
  name: memory.name,
214
144
  source: memory.source,
215
- relevance: Math.round(relevance * 100) / 100,
145
+ relevance: roundTo(relevance, 2),
216
146
  contentPreview: truncate(memory.content, ADVISOR_PREVIEW_LEN),
217
147
  reason,
218
148
  }));
219
149
  }
220
150
  // ─── L3 语义冲突检测(可选,backgroundProvider 注入后启用) ───
221
151
  /**
222
- * 语义冲突检测:扫描同 source 的记忆对,调用 LLM 判断是否存在语义冲突
223
- *
224
- * 流程:
225
- * 1. 从 insight/profile/work-projection 加载候选记忆(每个 source 取 top 10 条)
226
- * 2. 同 source 内两两配对,取前 10 对
227
- * 3. 对每对调用 LLM 判断是否存在语义冲突
228
- * 4. 返回冲突报告(仅检测,不修复——冲突需要用户决策)
229
- *
230
- * 安全设计:
231
- * - 仅检测不修复——不自动降级任何记忆,返回冲突详情供用户决策
232
- * - LLM 失败降级——返回已处理的报告,不阻塞调用方
233
- * - 单对 LLM 失败不阻塞后续检测
234
- * - backgroundProvider 未注入时静默跳过(向后兼容)
235
- *
236
- * 使用场景:
237
- * - 宿主定时任务定期检测(如每天一次)
238
- * - 用户手动触发(记忆管理面板的"检测冲突"按钮)
239
- * - 健康诊断报告的补充(sourceHealth 显示数量,本方法显示质量冲突)
240
- *
241
- * @param signal 可选的 AbortSignal(取消正在进行的 LLM 判断)
242
- * @returns 冲突检测报告
152
+ * 语义冲突检测:加载候选(每 source top 10)→ 同 source 两两配对(前 10 对)→ LLM 判断冲突。
153
+ * 仅检测不修复(不自动降级,冲突需用户决策);LLM 失败不阻塞;provider 未注入静默跳过。
243
154
  */
244
155
  async detectConflicts(signal) {
245
- // backgroundProvider 未注入时静默降级(向后兼容)
156
+ // provider 未注入时静默降级
246
157
  if (!this.backgroundProvider) {
247
158
  return {
248
159
  scannedCount: 0,
@@ -252,12 +163,11 @@ export class MemoryAdvisor {
252
163
  skippedReason: 'backgroundProvider 未注入',
253
164
  };
254
165
  }
255
- // ── 步骤 1:加载候选记忆(每个 source 取 top 10 条,按 score 降序) ──
256
166
  const candidates = [];
257
- for (const source of CONFLICT_SOURCES) {
167
+ for (const source of this.sources) {
258
168
  const memories = this.index.getBySource(source);
259
- // 按 score 降序取 top N
260
- const top = memories.sort(byScoreDesc).slice(0, CONFLICT_CANDIDATES_PER_SOURCE);
169
+ // 按 accessedAt 降序取 top N(score 退役后按最近使用采样)
170
+ const top = memories.sort(byAccessedDesc).slice(0, CONFLICT_CANDIDATES_PER_SOURCE);
261
171
  candidates.push(...top);
262
172
  }
263
173
  if (candidates.length < 2) {
@@ -269,7 +179,7 @@ export class MemoryAdvisor {
269
179
  skippedReason: '候选记忆不足(少于 2 条)',
270
180
  };
271
181
  }
272
- // ── 步骤 2:同 source 内两两配对,取前 10 对 ──
182
+ // 同 source 内两两配对
273
183
  const pairs = this.findConflictCandidates(candidates);
274
184
  if (pairs.length === 0) {
275
185
  return {
@@ -280,7 +190,7 @@ export class MemoryAdvisor {
280
190
  skippedReason: '无同 source 候选对',
281
191
  };
282
192
  }
283
- // ── 步骤 3:逐对调用 LLM 判断冲突 ──
193
+ // 逐对调用 LLM 判断冲突
284
194
  const conflicts = [];
285
195
  for (const pair of pairs) {
286
196
  try {
@@ -302,17 +212,7 @@ export class MemoryAdvisor {
302
212
  conflicts,
303
213
  };
304
214
  }
305
- /**
306
- * 筛选同 source 内的候选冲突对
307
- *
308
- * 策略:
309
- * - 按 source 分组,同 source 内两两配对
310
- * - 限制每个 source 的配对数,避免 O(n²) 爆炸
311
- * - 总候选对数上限 10 对
312
- *
313
- * @param candidates 候选记忆列表(已按 source 分组混合)
314
- * @returns 同 source 候选对列表
315
- */
215
+ /** 筛选同 source 内候选冲突对:按 source 分组两两配对,限制每 source 配对数避免 O(n²) 爆炸,总上限 10 对 */
316
216
  findConflictCandidates(candidates) {
317
217
  // 按 source 分组
318
218
  const bySource = new Map();
@@ -343,36 +243,12 @@ export class MemoryAdvisor {
343
243
  return pairs.slice(0, CONFLICT_PAIR_LIMIT);
344
244
  }
345
245
  /**
346
- * 调用 LLM 判断单对记忆是否存在语义冲突
347
- *
348
- * 使用结构化 JSON 输出(hasConflict + conflictDescription + recommendation + reason),
349
- * 参照 SessionArchiver.generateSummary 的 parseLlmJson 模式。
350
- *
351
- * LLM 失败时抛出异常(由 detectConflicts 捕获并降级跳过此对)。
352
- *
353
- * @param memoryA 记忆 A
354
- * @param memoryB 记忆 B
355
- * @param signal 可选的 AbortSignal
356
- * @returns LLM 判断结果
246
+ * 调用 LLM 判断两条记忆是否冲突:结构化 JSON 输出(hasConflict+conflictDescription+recommendation+reason)。
247
+ * 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
357
248
  */
358
249
  async judgeConflict(memoryA, memoryB, signal) {
359
250
  const messages = buildConflictMessages(memoryA, memoryB);
360
- let llmResponse = '';
361
- // 流式累积模式(与 TextPolishManager / SessionArchiver 一致)
362
- for await (const chunk of this.backgroundProvider.chat(messages, {
363
- maxTokens: 300,
364
- temperature: 0,
365
- timeoutMs: CONFLICT_TIMEOUT_MS,
366
- signal,
367
- })) {
368
- if (chunk.content)
369
- llmResponse += chunk.content;
370
- }
371
- // 解析 LLM 响应(JSON 格式)
372
- const parsed = parseLlmJson(llmResponse.trim());
373
- if (!parsed) {
374
- throw new Error('LLM 冲突判断返回非法 JSON');
375
- }
251
+ const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 300, timeoutMs: CONFLICT_TIMEOUT_MS, signal }, 'LLM 冲突判断返回非法 JSON');
376
252
  // 校验 recommendation 字段(允许 'a' / 'b' / 'both',其他值忽略)
377
253
  const recRaw = parsed.recommendation;
378
254
  const recommendation = recRaw === 'a' || recRaw === 'b' || recRaw === 'both' ? recRaw : undefined;
@@ -386,20 +262,8 @@ export class MemoryAdvisor {
386
262
  };
387
263
  }
388
264
  }
389
- // ─── L3 冲突检测 Prompt 模板(模块级函数,与 buildDedupMessages 同模式) ───
390
- /**
391
- * 构建冲突判断的 LLM 消息
392
- *
393
- * 设计要点:
394
- * - system 消息定义判断规则(冲突 = 两条记忆表达互相矛盾的信息)
395
- * - user 消息携带两条记忆的内容预览(截断到 200 字符)
396
- * - 要求输出结构化 JSON(hasConflict + conflictDescription + recommendation + reason)
397
- * - few-shot 示例降低 LLM 误判率
398
- *
399
- * @param memoryA 记忆 A
400
- * @param memoryB 记忆 B
401
- * @returns system + user 消息数组
402
- */
265
+ // ─── L3 冲突检测 Prompt 模板(模块级函数) ───
266
+ /** 构建冲突判断的 LLM 消息:system 定义冲突规则 + user 携带两条记忆内容预览,few-shot 降误判率 */
403
267
  function buildConflictMessages(memoryA, memoryB) {
404
268
  const contentA = memoryA.content.length > CONFLICT_CONTENT_PREVIEW_LEN
405
269
  ? truncate(memoryA.content, CONFLICT_CONTENT_PREVIEW_LEN, '…[截断]')
@@ -439,13 +303,13 @@ function buildConflictMessages(memoryA, memoryB) {
439
303
  role: 'user',
440
304
  content: `请判断以下两条记忆是否存在语义冲突:
441
305
 
442
- 记忆 A(score: ${memoryA.score}):
306
+ 记忆 A:
443
307
  - 名称:${memoryA.name}
444
308
  - 来源:${memoryA.source}
445
309
  - 创建时间:${memoryA.createdAt}
446
310
  - 内容:${contentA}
447
311
 
448
- 记忆 B(score: ${memoryB.score}):
312
+ 记忆 B:
449
313
  - 名称:${memoryB.name}
450
314
  - 来源:${memoryB.source}
451
315
  - 创建时间:${memoryB.createdAt}