@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,115 +1,47 @@
1
1
  /**
2
- * ChatLockManager — chat() 并发锁管理器
2
+ * ChatLockManager — chat() 并发锁管理器:并发锁 + token 校验 + 超时保护 + 外部 signal 合并。
3
3
  *
4
- * 职责:
5
- * - chat() 并发锁(防止多轮 chat 同时执行)
6
- * - token 校验(防止 race condition:超时释放后新调用获取锁,旧 finally 误清新调用者资源)
7
- * - 超时保护(LLM 卡死时中断 generator + 释放锁)
8
- * - 外部 signal 合并(外部 abort 时触发内部 abort)
9
- *
10
- * 从 agent.ts 提取(AUDIT-1-1,ADR-017 架构层先行原则首次实践)
11
- *
12
- * race condition 防护设计:
13
- * 原锁是简单布尔值 `_chatBusy`,无 owner 校验。超时回调与 finally 块无差别清理,
14
- * 导致 race condition:T=0 A 获取锁 → T=180s 超时释放 → T=181s B 获取锁
15
- * → T=182s A 的 finally 误清 B 的锁/计时器/controller。
16
- *
17
- * 防护方案:
18
- * - 获取锁时 token 递增:`const myToken = ++this._chatLockToken`
19
- * - 超时回调校验 `this._chatLockToken === myToken` 后才释放
20
- * - finally 块校验 `this._chatLockToken === myToken` 后才清理
21
- * - 不匹配时跳过清理,避免误清新调用者的资源
22
- *
23
- * 选择 number 而非 Symbol:递增计数器可序列化、零依赖、足够唯一(同一 Agent 实例内)
4
+ * race condition 防护(token 机制):原锁仅布尔 _chatBusy,超时回调与 finally 块无差别清理,
5
+ * 可能误清新调用者的资源(T=0 A 获取→超时释放→B 获取→A finally 误清 B)。
6
+ * 故获取锁时递增 token,超时回调/finally 均校验 token 是否仍是当前持有者,不匹配则跳过清理。
24
7
  */
25
8
  /**
26
- * chat() 并发锁管理器
27
- *
28
- * 使用方式:
29
- * const mgr = new ChatLockManager();
30
- * const { token, internalAbort } = mgr.acquire(180_000);
31
- * const cleanup = mgr.attachExternalSignal(externalSignal, internalAbort);
32
- * try {
33
- * // ... 使用 internalAbort.signal 传递给 generator ...
34
- * } finally {
35
- * mgr.release(token);
36
- * cleanup();
37
- * }
38
- *
39
- * 强制释放(宿主兜底):
40
- * mgr.forceRelease();
41
- *
42
- * 销毁(Agent.close 时):
43
- * mgr.dispose();
9
+ * chat() 并发锁管理器。acquire 返回 token+internalAbort,finally 中 release(token)。
10
+ * forceRelease 供宿主无进展超时兜底;dispose 供 Agent.close。
44
11
  */
45
12
  export declare class ChatLockManager {
46
- /** chat() 是否正在执行(并发锁) */
13
+ /** 并发锁标志 */
47
14
  private _chatBusy;
48
- /**
49
- * chat() 锁持有者 token(race condition 防护)
50
- *
51
- * 获取锁时递增,超时回调和 finally 块据此判断是否仍是当前持有者。
52
- * 不匹配时跳过清理,避免误清新调用者的资源。
53
- */
15
+ /** 锁持有者 token(race condition 防护,校验当前持有者避免误清新调用者资源) */
54
16
  private _chatLockToken;
55
- /** 聊天锁超时计时器(防止 LLM 卡死时锁永久持有) */
17
+ /** 锁超时计时器(防 LLM 卡死时锁永久持有) */
56
18
  private chatLockTimer;
57
- /** chat() 内部 AbortController(超时时中断 generator,防止并发) */
19
+ /** 内部 AbortController(超时时中断 generator) */
58
20
  private chatAbortController;
59
21
  /** 当前是否持有锁 */
60
22
  get isBusy(): boolean;
61
23
  /**
62
- * 获取锁,返回 token + 内部 AbortController
63
- *
64
- * @param timeoutMs 锁超时时间(LLM 卡死保护)
65
- * @param onTimeout 超时回调(用于日志记录等)
66
- * @returns token(用于 finally 校验)+ internalAbort(用于传递给 loop.processUserInput)
24
+ * 获取锁,返回 token(finally 校验)+ internalAbort(传给 loop.processUserInput)。
25
+ * 超时保护:锁超时后自动释放锁(允许新对话进入),但不中断生成流——
26
+ * LLM 无进展由 provider 层请求级/事件停滞超时兜底,锁不对整次对话时长设硬上限。
67
27
  */
68
28
  acquire(timeoutMs: number, onTimeout?: () => void): {
69
29
  token: number;
70
30
  internalAbort: AbortController;
71
31
  };
72
- /**
73
- * 合并外部 signal:外部 abort 时触发内部 abort
74
- *
75
- * addEventListener 对已 aborted 的 signal 不触发回调,
76
- * 需手动检查并触发 internalAbort,否则外部已取消的请求仍会进入主流程。
77
- *
78
- * @returns 清理函数(finally 块中调用 removeEventListener)
79
- */
32
+ /** 合并外部 signal:外部 abort 时触发内部 abort;返回 cleanup。addEventListener 对已 aborted 的 signal 不触发,需手动检查。 */
80
33
  attachExternalSignal(externalSignal: AbortSignal | undefined, internalAbort: AbortController): () => void;
81
- /**
82
- * finally 块清理(token 校验后)
83
- *
84
- * 仅当本调用仍是当前锁持有者时才清理资源。
85
- * 若 token 已变(超时释放后被新调用者获取),跳过清理避免误清新调用者的状态。
86
- */
34
+ /** finally 清理(token 校验):仅当前持有者清理,token 已变则跳过避免误清新调用者状态 */
87
35
  release(token: number): void;
88
36
  /**
89
- * 强制释放对话锁(宿主无进展超时兜底)
90
- *
91
- * 场景:宿主主进程"无进展超时"兜底后,generator 可能仍卡在不可中断的 await 点
92
- * (executeToolCalls 和 generateContextSummary 已覆盖 signal 响应,但其他
93
- * 第三方库或未来新增的 await 点仍可能不响应 signal)。
94
- * 此时 _chatBusy 锁未释放,用户再发消息会被 chat() 的竞态保护拒绝,
95
- * 表现为"UI 能操作但发不出消息",需等到 3 分钟锁超时才能恢复。
96
- *
97
- * 安全机制:
98
- * - 递增 _chatLockToken,让原 chat() 的 finally 块检测到 token 不匹配后
99
- * 跳过资源清理(避免误清新调用者的 _chatBusy/chatAbortController)
100
- * - abort chatAbortController,让响应 signal 的 await 点(如 fetch)退出
101
- * - 原 generator 仍可能在后台运行(无法真正中断不响应 signal 的 await),
102
- * 但其 finally 块的 token 校验会阻止它影响新调用
103
- *
104
- * 幂等性:_chatBusy 已 false 时 no-op(多次调用安全)
37
+ * 强制释放对话锁(宿主无进展超时兜底)。幂等:_chatBusy 已 false 时 no-op。
38
+ * generator 可能卡在不可响应的 await 点,递增 token 让原 finally 跳过清理;
39
+ * abort controller 让响应 signal 的 await 点退出。原 generator 后台残留也无法影响新调用。
105
40
  */
106
41
  forceRelease(): void;
107
42
  /**
108
- * 销毁管理器(Agent.close 时调用)
109
- *
110
- * 与 forceRelease() 的区别:不记录 warn 日志(close 是正常生命周期,非异常场景)。
111
- * 递增 token 使任何进行中的 chat() generator 的 finally 块检测到 token 变化后
112
- * 跳过资源清理(close 已接管清理职责)。
43
+ * 销毁管理器(Agent.close 时调用)。与 forceRelease 同行为但不记 warn 日志
44
+ * (close 为正常生命周期)。递增 token 使进行中 generator 的 finally 跳过清理。
113
45
  */
114
46
  dispose(): void;
115
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"chatLockManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/chatLockManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe;IAC1B,yBAAyB;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAa;IACnC,gCAAgC;IAChC,OAAO,CAAC,aAAa,CAA8C;IACnE,sDAAsD;IACtD,OAAO,CAAC,mBAAmB,CAAgC;IAE3D,cAAc;IACd,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;;;;;OAMG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,eAAe,CAAA;KAAE;IA8BpD;;;;;;;OAOG;IACH,oBAAoB,CAClB,cAAc,EAAE,WAAW,GAAG,SAAS,EACvC,aAAa,EAAE,eAAe,GAC7B,MAAM,IAAI;IAYb;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAY5B;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,IAAI,IAAI;IAkBpB;;;;;;OAMG;IACH,OAAO,IAAI,IAAI;CAchB"}
1
+ {"version":3,"file":"chatLockManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/chatLockManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;;GAGG;AACH,qBAAa,eAAe;IAC1B,YAAY;IACZ,OAAO,CAAC,SAAS,CAAS;IAC1B,sDAAsD;IACtD,OAAO,CAAC,cAAc,CAAa;IACnC,6BAA6B;IAC7B,OAAO,CAAC,aAAa,CAA8C;IACnE,0CAA0C;IAC1C,OAAO,CAAC,mBAAmB,CAAgC;IAE3D,cAAc;IACd,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;;;OAIG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,eAAe,CAAA;KAAE;IA2BpD,kGAAkG;IAClG,oBAAoB,CAClB,cAAc,EAAE,WAAW,GAAG,SAAS,EACvC,aAAa,EAAE,eAAe,GAC7B,MAAM,IAAI;IAWb,0DAA0D;IAC1D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAY5B;;;;OAIG;IACH,YAAY,IAAI,IAAI;IAgBpB;;;OAGG;IACH,OAAO,IAAI,IAAI;CAahB"}
@@ -1,91 +1,51 @@
1
1
  /**
2
- * ChatLockManager — chat() 并发锁管理器
2
+ * ChatLockManager — chat() 并发锁管理器:并发锁 + token 校验 + 超时保护 + 外部 signal 合并。
3
3
  *
4
- * 职责:
5
- * - chat() 并发锁(防止多轮 chat 同时执行)
6
- * - token 校验(防止 race condition:超时释放后新调用获取锁,旧 finally 误清新调用者资源)
7
- * - 超时保护(LLM 卡死时中断 generator + 释放锁)
8
- * - 外部 signal 合并(外部 abort 时触发内部 abort)
9
- *
10
- * 从 agent.ts 提取(AUDIT-1-1,ADR-017 架构层先行原则首次实践)
11
- *
12
- * race condition 防护设计:
13
- * 原锁是简单布尔值 `_chatBusy`,无 owner 校验。超时回调与 finally 块无差别清理,
14
- * 导致 race condition:T=0 A 获取锁 → T=180s 超时释放 → T=181s B 获取锁
15
- * → T=182s A 的 finally 误清 B 的锁/计时器/controller。
16
- *
17
- * 防护方案:
18
- * - 获取锁时 token 递增:`const myToken = ++this._chatLockToken`
19
- * - 超时回调校验 `this._chatLockToken === myToken` 后才释放
20
- * - finally 块校验 `this._chatLockToken === myToken` 后才清理
21
- * - 不匹配时跳过清理,避免误清新调用者的资源
22
- *
23
- * 选择 number 而非 Symbol:递增计数器可序列化、零依赖、足够唯一(同一 Agent 实例内)
4
+ * race condition 防护(token 机制):原锁仅布尔 _chatBusy,超时回调与 finally 块无差别清理,
5
+ * 可能误清新调用者的资源(T=0 A 获取→超时释放→B 获取→A finally 误清 B)。
6
+ * 故获取锁时递增 token,超时回调/finally 均校验 token 是否仍是当前持有者,不匹配则跳过清理。
24
7
  */
25
8
  import { clearSafeTimeout, safeSetTimeout } from '../../utils/safeTimer.js';
26
9
  import { logger } from '../../logging/logger.js';
27
10
  /**
28
- * chat() 并发锁管理器
29
- *
30
- * 使用方式:
31
- * const mgr = new ChatLockManager();
32
- * const { token, internalAbort } = mgr.acquire(180_000);
33
- * const cleanup = mgr.attachExternalSignal(externalSignal, internalAbort);
34
- * try {
35
- * // ... 使用 internalAbort.signal 传递给 generator ...
36
- * } finally {
37
- * mgr.release(token);
38
- * cleanup();
39
- * }
40
- *
41
- * 强制释放(宿主兜底):
42
- * mgr.forceRelease();
43
- *
44
- * 销毁(Agent.close 时):
45
- * mgr.dispose();
11
+ * chat() 并发锁管理器。acquire 返回 token+internalAbort,finally 中 release(token)。
12
+ * forceRelease 供宿主无进展超时兜底;dispose 供 Agent.close。
46
13
  */
47
14
  export class ChatLockManager {
48
- /** chat() 是否正在执行(并发锁) */
15
+ /** 并发锁标志 */
49
16
  _chatBusy = false;
50
- /**
51
- * chat() 锁持有者 token(race condition 防护)
52
- *
53
- * 获取锁时递增,超时回调和 finally 块据此判断是否仍是当前持有者。
54
- * 不匹配时跳过清理,避免误清新调用者的资源。
55
- */
17
+ /** 锁持有者 token(race condition 防护,校验当前持有者避免误清新调用者资源) */
56
18
  _chatLockToken = 0;
57
- /** 聊天锁超时计时器(防止 LLM 卡死时锁永久持有) */
19
+ /** 锁超时计时器(防 LLM 卡死时锁永久持有) */
58
20
  chatLockTimer = null;
59
- /** chat() 内部 AbortController(超时时中断 generator,防止并发) */
21
+ /** 内部 AbortController(超时时中断 generator) */
60
22
  chatAbortController = null;
61
23
  /** 当前是否持有锁 */
62
24
  get isBusy() {
63
25
  return this._chatBusy;
64
26
  }
65
27
  /**
66
- * 获取锁,返回 token + 内部 AbortController
67
- *
68
- * @param timeoutMs 锁超时时间(LLM 卡死保护)
69
- * @param onTimeout 超时回调(用于日志记录等)
70
- * @returns token(用于 finally 校验)+ internalAbort(用于传递给 loop.processUserInput)
28
+ * 获取锁,返回 token(finally 校验)+ internalAbort(传给 loop.processUserInput)。
29
+ * 超时保护:锁超时后自动释放锁(允许新对话进入),但不中断生成流——
30
+ * LLM 无进展由 provider 层请求级/事件停滞超时兜底,锁不对整次对话时长设硬上限。
71
31
  */
72
32
  acquire(timeoutMs, onTimeout) {
73
33
  this._chatBusy = true;
74
- // 分配本调用的 token,超时回调和 finally 块据此判断是否仍是当前持有者
75
- // 避免 race condition:超时释放后新调用获取锁,旧 finally 误清新调用者的资源
34
+ // 分配本调用 token,超时/finally 据此判断是否仍是持有者,避免误清新调用资源
76
35
  const token = ++this._chatLockToken;
77
- // 内部 AbortController,超时时中断 generator 而非仅释放锁
36
+ // 中断信号(用户 stop / 插话 / 宿主 forceRelease 会 abort 它;锁自身超时不 abort)
78
37
  const internalAbort = new AbortController();
79
38
  this.chatAbortController = internalAbort;
80
- // 超时保护:LLM 卡死时中断 generator + 释放锁,防止并发
81
- // 超时回调校验 token 后才清理,避免误清新调用者的资源
82
39
  this.chatLockTimer = safeSetTimeout(() => {
83
- // 令牌不匹配:锁已被新调用者获取(或本调用已正常退出),跳过清理
40
+ // token 不匹配:锁已被新调用者获取(或本调用已正常退出),跳过清理
84
41
  if (this._chatLockToken !== token) {
85
42
  return;
86
43
  }
87
- logger.warn({ timeoutMs }, 'chat() 锁超时,中断 generator 并释放锁');
88
- internalAbort.abort();
44
+ logger.warn({ timeoutMs }, 'chat() 锁超时,自动释放锁(不中断生成流)');
45
+ // 仅释放锁(自增 token 令旧 generator 的 finally release 跳过清理,避免误清新调用),
46
+ // 不 abort 生成流——LLM 无进展/停滞由 provider 层超时兜底(请求级 120s + SSE 事件停滞 120s),
47
+ // 锁不再对「整次对话时长」设硬上限,慢但正常的长时间对话不被误杀。
48
+ this._chatLockToken++;
89
49
  this._chatBusy = false;
90
50
  this.chatLockTimer = null;
91
51
  this.chatAbortController = null;
@@ -93,32 +53,19 @@ export class ChatLockManager {
93
53
  }, timeoutMs);
94
54
  return { token, internalAbort };
95
55
  }
96
- /**
97
- * 合并外部 signal:外部 abort 时触发内部 abort
98
- *
99
- * addEventListener 对已 aborted 的 signal 不触发回调,
100
- * 需手动检查并触发 internalAbort,否则外部已取消的请求仍会进入主流程。
101
- *
102
- * @returns 清理函数(finally 块中调用 removeEventListener)
103
- */
56
+ /** 合并外部 signal:外部 abort 时触发内部 abort;返回 cleanup。addEventListener 对已 aborted 的 signal 不触发,需手动检查。 */
104
57
  attachExternalSignal(externalSignal, internalAbort) {
105
58
  if (!externalSignal)
106
59
  return () => { };
107
60
  const onExternalAbort = () => internalAbort.abort();
108
61
  externalSignal.addEventListener('abort', onExternalAbort, { once: true });
109
- // addEventListener 对已 aborted 的 signal 不触发回调
110
- // 需手动检查并触发 internalAbort,否则外部已取消的请求仍会进入主流程
62
+ // 外部 signal 已 aborted 时不触发回调,手动触发一次,避免外部已取消请求仍进入主流程
111
63
  if (externalSignal.aborted) {
112
64
  internalAbort.abort();
113
65
  }
114
66
  return () => externalSignal.removeEventListener('abort', onExternalAbort);
115
67
  }
116
- /**
117
- * finally 块清理(token 校验后)
118
- *
119
- * 仅当本调用仍是当前锁持有者时才清理资源。
120
- * 若 token 已变(超时释放后被新调用者获取),跳过清理避免误清新调用者的状态。
121
- */
68
+ /** finally 清理(token 校验):仅当前持有者清理,token 已变则跳过避免误清新调用者状态 */
122
69
  release(token) {
123
70
  if (this._chatLockToken !== token) {
124
71
  return;
@@ -131,34 +78,19 @@ export class ChatLockManager {
131
78
  }
132
79
  }
133
80
  /**
134
- * 强制释放对话锁(宿主无进展超时兜底)
135
- *
136
- * 场景:宿主主进程"无进展超时"兜底后,generator 可能仍卡在不可中断的 await 点
137
- * (executeToolCalls 和 generateContextSummary 已覆盖 signal 响应,但其他
138
- * 第三方库或未来新增的 await 点仍可能不响应 signal)。
139
- * 此时 _chatBusy 锁未释放,用户再发消息会被 chat() 的竞态保护拒绝,
140
- * 表现为"UI 能操作但发不出消息",需等到 3 分钟锁超时才能恢复。
141
- *
142
- * 安全机制:
143
- * - 递增 _chatLockToken,让原 chat() 的 finally 块检测到 token 不匹配后
144
- * 跳过资源清理(避免误清新调用者的 _chatBusy/chatAbortController)
145
- * - abort chatAbortController,让响应 signal 的 await 点(如 fetch)退出
146
- * - 原 generator 仍可能在后台运行(无法真正中断不响应 signal 的 await),
147
- * 但其 finally 块的 token 校验会阻止它影响新调用
148
- *
149
- * 幂等性:_chatBusy 已 false 时 no-op(多次调用安全)
81
+ * 强制释放对话锁(宿主无进展超时兜底)。幂等:_chatBusy 已 false 时 no-op。
82
+ * generator 可能卡在不可响应的 await 点,递增 token 让原 finally 跳过清理;
83
+ * abort controller 让响应 signal 的 await 点退出。原 generator 后台残留也无法影响新调用。
150
84
  */
151
85
  forceRelease() {
152
86
  if (!this._chatBusy)
153
87
  return;
154
- // 递增 token 让原 chat() 的 finally 块跳过清理(避免误清新调用者的资源)
88
+ // 递增 token 让原 chat() finally 跳过清理(避免误清新调用者资源)
155
89
  this._chatLockToken++;
156
- // abort 当前 generator(响应 signal 的 await 点会 throw AbortError 退出)
157
90
  if (this.chatAbortController) {
158
91
  this.chatAbortController.abort();
159
92
  this.chatAbortController = null;
160
93
  }
161
- // 清理锁超时定时器(避免后续触发重复清理)
162
94
  if (this.chatLockTimer) {
163
95
  clearSafeTimeout(this.chatLockTimer);
164
96
  this.chatLockTimer = null;
@@ -167,15 +99,11 @@ export class ChatLockManager {
167
99
  logger.warn('对话锁被强制释放(宿主无进展超时兜底)');
168
100
  }
169
101
  /**
170
- * 销毁管理器(Agent.close 时调用)
171
- *
172
- * 与 forceRelease() 的区别:不记录 warn 日志(close 是正常生命周期,非异常场景)。
173
- * 递增 token 使任何进行中的 chat() generator 的 finally 块检测到 token 变化后
174
- * 跳过资源清理(close 已接管清理职责)。
102
+ * 销毁管理器(Agent.close 时调用)。与 forceRelease 同行为但不记 warn 日志
103
+ * (close 为正常生命周期)。递增 token 使进行中 generator 的 finally 跳过清理。
175
104
  */
176
105
  dispose() {
177
- // 递增 token,使任何进行中的 chat() generator 的 finally 块
178
- // 检测到 token 变化后跳过资源清理(close 已接管清理职责)
106
+ // 递增 token,让进行中 chat() finally 跳过资源清理(close 已接管清理职责)
179
107
  this._chatLockToken++;
180
108
  if (this.chatAbortController) {
181
109
  this.chatAbortController.abort();
@@ -1 +1 @@
1
- {"version":3,"file":"chatLockManager.js","sourceRoot":"","sources":["../../../src/agent/managers/chatLockManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,eAAe;IAC1B,yBAAyB;IACjB,SAAS,GAAG,KAAK,CAAC;IAC1B;;;;;OAKG;IACK,cAAc,GAAW,CAAC,CAAC;IACnC,gCAAgC;IACxB,aAAa,GAAyC,IAAI,CAAC;IACnE,sDAAsD;IAC9C,mBAAmB,GAA2B,IAAI,CAAC;IAE3D,cAAc;IACd,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CACL,SAAiB,EACjB,SAAsB;QAEtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,4CAA4C;QAC5C,oDAAoD;QACpD,MAAM,KAAK,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC;QACpC,4CAA4C;QAC5C,MAAM,aAAa,GAAG,IAAI,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC,mBAAmB,GAAG,aAAa,CAAC;QAEzC,sCAAsC;QACtC,gCAAgC;QAChC,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,GAAG,EAAE;YACvC,kCAAkC;YAClC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,EACb,8BAA8B,CAC/B,CAAC;YACF,aAAa,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,SAAS,EAAE,EAAE,CAAC;QAChB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;;OAOG;IACH,oBAAoB,CAClB,cAAuC,EACvC,aAA8B;QAE9B,IAAI,CAAC,cAAc;YAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QACrC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACpD,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,6CAA6C;QAC7C,2CAA2C;QAC3C,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,aAAa,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,KAAa;QACnB,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,kDAAkD;QAClD,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,+DAA+D;QAC/D,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAClC,CAAC;QACD,uBAAuB;QACvB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACH,OAAO;QACL,gDAAgD;QAChD,qCAAqC;QACrC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAClC,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"chatLockManager.js","sourceRoot":"","sources":["../../../src/agent/managers/chatLockManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * 记忆治理管理者(从 MemoryInspector 拆分,专责异步 LLM 语义去重)。
3
+ * 职责分离:MemoryInspector 纯存储读写,DedupManager 异步 LLM 治理。
4
+ * 设计原则:未注入 provider 时静默降级返回报告不抛错;不物理删除仅软删重复方保留可恢复性;不阻塞主对话热路径。
5
+ */
6
+ import type { Memory } from '../../memory/types.js';
7
+ import type { IMemoryStorage } from '../../memory/storageInterface.js';
8
+ import type { LlmProvider } from '../../llm/provider.js';
9
+ /** 名称高度相似的候选记忆对(待 LLM 判断语义等价性) */
10
+ export interface DedupPair {
11
+ /** 记忆 A(保留候选) */
12
+ a: Memory;
13
+ /** 记忆 B(重复方,软删候选) */
14
+ b: Memory;
15
+ /** 名称归一化相似度(0-1,越小越相似) */
16
+ nameSimilarity: number;
17
+ }
18
+ /** LLM 对单对记忆的语义等价判断结果 */
19
+ export interface DedupVerdict {
20
+ /** 是否语义等价(true → 软删重复方) */
21
+ isDuplicate: boolean;
22
+ /** 合并后的内容(isDuplicate=true 时提供,保留更完整信息) */
23
+ mergedContent?: string;
24
+ /** LLM 判断理由(便于审计调试) */
25
+ reason: string;
26
+ }
27
+ /** 降级记忆审计详情(供 UI 展示"为什么降级" + 合并后内容) */
28
+ export interface DedupVerdictSummary {
29
+ /** 被降级记忆 ID(与 demotedIds 一一对应) */
30
+ demotedId: string;
31
+ /** LLM 判断理由(便于审计降级是否合理) */
32
+ reason: string;
33
+ /** 合并后完整内容(便于验证合并质量;缺失时渲染器负责截断展示) */
34
+ mergedContent?: string;
35
+ }
36
+ /** 语义去重报告(deduplicateMemories 返回值) */
37
+ export interface DedupReport {
38
+ /** 扫描的候选记忆总数 */
39
+ scannedCount: number;
40
+ /** 发现的名称相似对数 */
41
+ pairCount: number;
42
+ /** LLM 判定为语义等价并执行降级的对数 */
43
+ deduplicatedCount: number;
44
+ /** 被降级记忆 ID 列表(未物理删除) */
45
+ demotedIds: string[];
46
+ /** 降级审计详情(与 demotedIds 一一对应) */
47
+ verdicts?: DedupVerdictSummary[];
48
+ /** 跳过原因(LLM 不可用 / 无候选对) */
49
+ skippedReason?: string;
50
+ }
51
+ /** 语义去重管理器:扫描名称高度相似的记忆对,LLM 判断语义等价性,降级低分记忆。assembler 组合根创建,由 Agent 透传调用。 */
52
+ export declare class DedupManager {
53
+ private readonly index;
54
+ /** 去重完成回调(宿主据此发射事件通知用户) */
55
+ private readonly onCompleted?;
56
+ /** 后台 LLM Provider(可选,未注入时降级跳过) */
57
+ private readonly backgroundProvider;
58
+ /** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时去重空转,测试可显式注入) */
59
+ private readonly sources;
60
+ constructor(index: IMemoryStorage, backgroundProvider?: LlmProvider | null,
61
+ /** 去重完成回调(宿主据此发射事件通知用户) */
62
+ onCompleted?: ((report: DedupReport) => void) | undefined, sources?: readonly string[]);
63
+ /**
64
+ * 语义去重:加载候选(上限 50)→ 名称相似度筛选对(上限 10)→ LLM 判断语义等价 → 等价则软删重复方。
65
+ * 安全设计:不物理删除仅软删(可恢复);LLM 失败降级不阻塞;provider 未注入静默返回 skippedReason。
66
+ */
67
+ deduplicateMemories(signal?: AbortSignal): Promise<DedupReport>;
68
+ /**
69
+ * 筛选名称高度相似的候选记忆对。判定:归一化 Levenshtein ≤0.3 或一方包含另一方。
70
+ * 已配对的记忆不再参与后续配对(避免三元组产生多对);按相似度升序(越相似越优先)取前 10 对。
71
+ */
72
+ private findNameOverlapPairs;
73
+ /** 名称归一化相似度(0-1,越小越相似)。规则:包含关系=0;否则 Levenshtein 距离 / max(len)。 */
74
+ private static computeNameSimilarity;
75
+ /**
76
+ * 调用 LLM 判断单对记忆语义等价:结构化 JSON 输出(isDuplicate+mergedContent+reason)。
77
+ * 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
78
+ */
79
+ private judgeDuplicate;
80
+ /** 软删重复记忆(不物理删除保留可恢复;合并内容由 keepMerged 单独写回 a)。重复方以 delete 进入回收站。 */
81
+ private demoteMemory;
82
+ /** 将合并内容写回保留方 a:保持 id/source/name/createdAt 不变,仅刷新 content + accessedAt */
83
+ private keepMerged;
84
+ }
85
+ //# sourceMappingURL=dedupManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/dedupManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAyB9D,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,qBAAqB;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uCAAuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,gBAAgB;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,4EAA4E;AAC5E,qBAAa,YAAY;IAOrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAEtB,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAT/B,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;gBAGzB,KAAK,EAAE,cAAc,EACtC,kBAAkB,GAAE,WAAW,GAAG,IAAW;IAC7C,2BAA2B;IACV,WAAW,CAAC,GAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,aAAA,EAC5D,OAAO,GAAE,SAAS,MAAM,EAAuB;IAMjD;;;OAGG;IACG,mBAAmB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAmFrE;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAgC5B,kEAAkE;IAClE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAkBpC;;;OAGG;YACW,cAAc;IAoB5B,oEAAoE;IACpE,OAAO,CAAC,YAAY;IAIpB,2EAA2E;IAC3E,OAAO,CAAC,UAAU;CASnB"}