@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
@@ -0,0 +1,248 @@
1
+ // LLM judge 高阶函数(流式累积 + parseLlmJson + configError 封装)
2
+ import { judgeWithLlm } from '../../agent/managers/llmJudgeHelper.js';
3
+ // LLM 治理共享常量(统一由 governance.ts 维护)
4
+ import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
5
+ import { levenshtein } from '../../memory/sourceValidation.js';
6
+ import { byAccessedDesc } from '../../utils/array.js';
7
+ import { nowIso } from '../../utils/time.js';
8
+ import { truncate } from '../../utils/strings.js';
9
+ import { logger } from '../../logging/logger.js';
10
+ // ─── L1 语义去重常量 ────────────────────────────────────
11
+ /** 单次去重扫描候选条数上限 */
12
+ const DEDUP_CANDIDATE_LIMIT = 50;
13
+ /** 单次 LLM 判断候选对数上限(每对约 200 tokens) */
14
+ const DEDUP_PAIR_LIMIT = 10;
15
+ /** 名称相似度阈值(归一化 Levenshtein 距离 ≤ 此值视为高度相似进入 LLM 判断) */
16
+ const DEDUP_NAME_SIMILARITY_THRESHOLD = 0.3;
17
+ /** LLM 去重判断超时(ms) */
18
+ const DEDUP_TIMEOUT_MS = 15_000;
19
+ /** 候选内容预览长度(送入 LLM 前截断,控制 token) */
20
+ const DEDUP_CONTENT_PREVIEW_LEN = 200;
21
+ // ─── 类 ──────────────────────────────────────────────────
22
+ /** 语义去重管理器:扫描名称高度相似的记忆对,LLM 判断语义等价性,降级低分记忆。assembler 组合根创建,由 Agent 透传调用。 */
23
+ export class DedupManager {
24
+ index;
25
+ onCompleted;
26
+ /** 后台 LLM Provider(可选,未注入时降级跳过) */
27
+ backgroundProvider;
28
+ /** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时去重空转,测试可显式注入) */
29
+ sources;
30
+ constructor(index, backgroundProvider = null,
31
+ /** 去重完成回调(宿主据此发射事件通知用户) */
32
+ onCompleted, sources = GOVERNANCE_SOURCES) {
33
+ this.index = index;
34
+ this.onCompleted = onCompleted;
35
+ this.backgroundProvider = backgroundProvider;
36
+ this.sources = sources;
37
+ }
38
+ /**
39
+ * 语义去重:加载候选(上限 50)→ 名称相似度筛选对(上限 10)→ LLM 判断语义等价 → 等价则软删重复方。
40
+ * 安全设计:不物理删除仅软删(可恢复);LLM 失败降级不阻塞;provider 未注入静默返回 skippedReason。
41
+ */
42
+ async deduplicateMemories(signal) {
43
+ // provider 未注入时静默降级
44
+ if (!this.backgroundProvider) {
45
+ return {
46
+ scannedCount: 0,
47
+ pairCount: 0,
48
+ deduplicatedCount: 0,
49
+ demotedIds: [],
50
+ skippedReason: 'backgroundProvider 未注入',
51
+ };
52
+ }
53
+ const candidates = [];
54
+ for (const source of this.sources) {
55
+ const memories = this.index.getBySource(source);
56
+ candidates.push(...memories);
57
+ }
58
+ // 按 accessedAt 降序(最近使用优先,score 退役后无分可排序)
59
+ candidates.sort(byAccessedDesc);
60
+ const limited = candidates.slice(0, DEDUP_CANDIDATE_LIMIT);
61
+ const pairs = this.findNameOverlapPairs(limited);
62
+ if (pairs.length === 0) {
63
+ return {
64
+ scannedCount: limited.length,
65
+ pairCount: 0,
66
+ deduplicatedCount: 0,
67
+ demotedIds: [],
68
+ skippedReason: '未发现名称相似的记忆对',
69
+ };
70
+ }
71
+ const demotedIds = [];
72
+ const verdicts = [];
73
+ let deduplicatedCount = 0;
74
+ for (const pair of pairs) {
75
+ try {
76
+ const verdict = await this.judgeDuplicate(pair, signal);
77
+ if (verdict.isDuplicate) {
78
+ // 先写合并内容再降级 b:合并写入失败时不破坏 b 原始状态(原子性)
79
+ if (verdict.mergedContent) {
80
+ this.keepMerged(pair.a, verdict.mergedContent);
81
+ }
82
+ // 重复方软删(score 退役后无降级语义,soft-delete 保留可恢复)
83
+ this.demoteMemory(pair.b);
84
+ demotedIds.push(pair.b.id);
85
+ // 收集审计详情(供 UI 展示"为什么降级"和"合并后保留了什么")
86
+ verdicts.push({
87
+ demotedId: pair.b.id,
88
+ reason: verdict.reason,
89
+ mergedContent: verdict.mergedContent,
90
+ });
91
+ deduplicatedCount++;
92
+ logger.info({ demotedId: pair.b.id, keptId: pair.a.id, reason: verdict.reason }, '语义去重:降级重复记忆并合并内容到保留方');
93
+ }
94
+ }
95
+ catch (err) {
96
+ // 单对失败不阻塞后续对
97
+ logger.warn({ err, pairId: `${pair.a.id}↔${pair.b.id}` }, '语义去重:LLM 判断失败,跳过此对');
98
+ }
99
+ }
100
+ this.onCompleted?.({
101
+ scannedCount: limited.length,
102
+ pairCount: pairs.length,
103
+ deduplicatedCount,
104
+ demotedIds,
105
+ });
106
+ return {
107
+ scannedCount: limited.length,
108
+ pairCount: pairs.length,
109
+ deduplicatedCount,
110
+ demotedIds,
111
+ verdicts,
112
+ };
113
+ }
114
+ /**
115
+ * 筛选名称高度相似的候选记忆对。判定:归一化 Levenshtein ≤0.3 或一方包含另一方。
116
+ * 已配对的记忆不再参与后续配对(避免三元组产生多对);按相似度升序(越相似越优先)取前 10 对。
117
+ */
118
+ findNameOverlapPairs(candidates) {
119
+ const pairs = [];
120
+ const usedIds = new Set();
121
+ // 双重循环生成所有可能对,按相似度排序后贪心选取
122
+ const allPairs = [];
123
+ for (let i = 0; i < candidates.length; i++) {
124
+ for (let j = i + 1; j < candidates.length; j++) {
125
+ const a = candidates[i]; // i 前 j 后:candidates 已按 accessedAt 降序,a 为更近使用方(保留候选)
126
+ const b = candidates[j]; // b 为较远使用方(重复候选)
127
+ const similarity = DedupManager.computeNameSimilarity(a.name, b.name);
128
+ if (similarity <= DEDUP_NAME_SIMILARITY_THRESHOLD) {
129
+ allPairs.push({ a, b, nameSimilarity: similarity });
130
+ }
131
+ }
132
+ }
133
+ // 按相似度升序,越相似越优先处理
134
+ allPairs.sort((x, y) => x.nameSimilarity - y.nameSimilarity);
135
+ // 贪心选取:已配对的记忆不再参与后续配对
136
+ for (const { a, b, nameSimilarity } of allPairs) {
137
+ if (usedIds.has(a.id) || usedIds.has(b.id))
138
+ continue;
139
+ pairs.push({ a, b, nameSimilarity });
140
+ usedIds.add(a.id);
141
+ usedIds.add(b.id);
142
+ if (pairs.length >= DEDUP_PAIR_LIMIT)
143
+ break;
144
+ }
145
+ return pairs;
146
+ }
147
+ /** 名称归一化相似度(0-1,越小越相似)。规则:包含关系=0;否则 Levenshtein 距离 / max(len)。 */
148
+ static computeNameSimilarity(nameA, nameB) {
149
+ // 空名称防御:includes("") 恒真会误判所有记忆高度相似,故空名与任何名称视为完全不同
150
+ if (!nameA || !nameB) {
151
+ return 1;
152
+ }
153
+ // 规则 2:包含关系(如"用户偏好" vs "用户偏好设置")
154
+ if (nameA.includes(nameB) || nameB.includes(nameA)) {
155
+ return 0;
156
+ }
157
+ // 规则 1:归一化 Levenshtein 距离
158
+ const maxLen = Math.max(nameA.length, nameB.length);
159
+ if (maxLen === 0)
160
+ return 0; // 两个空字符串视为完全相似(已被上面拦截,此处防御)
161
+ const distance = levenshtein(nameA, nameB);
162
+ return distance / maxLen;
163
+ }
164
+ /**
165
+ * 调用 LLM 判断单对记忆语义等价:结构化 JSON 输出(isDuplicate+mergedContent+reason)。
166
+ * 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
167
+ */
168
+ async judgeDuplicate(pair, signal) {
169
+ const messages = buildDedupMessages(pair);
170
+ const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 300, timeoutMs: DEDUP_TIMEOUT_MS, signal }, 'LLM 去重判断返回非法 JSON');
171
+ return {
172
+ isDuplicate: parsed.isDuplicate === true,
173
+ mergedContent: typeof parsed.mergedContent === 'string' ? parsed.mergedContent : undefined,
174
+ reason: typeof parsed.reason === 'string' ? parsed.reason : '(LLM 未提供理由)',
175
+ };
176
+ }
177
+ /** 软删重复记忆(不物理删除保留可恢复;合并内容由 keepMerged 单独写回 a)。重复方以 delete 进入回收站。 */
178
+ demoteMemory(memory) {
179
+ this.index.delete(memory.id);
180
+ }
181
+ /** 将合并内容写回保留方 a:保持 id/source/name/createdAt 不变,仅刷新 content + accessedAt */
182
+ keepMerged(memory, mergedContent) {
183
+ const updated = {
184
+ ...memory,
185
+ content: mergedContent,
186
+ accessedAt: nowIso(),
187
+ };
188
+ this.index.upsert(updated);
189
+ logger.info({ keptId: memory.id }, '语义去重:保留方已合并对方内容');
190
+ }
191
+ }
192
+ // ─── L1 语义去重 Prompt 模板(模块级函数) ───
193
+ /** 构建语义去重判断的 LLM 消息:system 定义语义等价规则 + user 携带候选对内容预览,few-shot 降误判率 */
194
+ function buildDedupMessages(pair) {
195
+ const contentA = pair.a.content.length > DEDUP_CONTENT_PREVIEW_LEN
196
+ ? truncate(pair.a.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
197
+ : pair.a.content;
198
+ const contentB = pair.b.content.length > DEDUP_CONTENT_PREVIEW_LEN
199
+ ? truncate(pair.b.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
200
+ : pair.b.content;
201
+ return [
202
+ {
203
+ role: 'system',
204
+ content: `你是记忆去重助手。判断给定的两条记忆是否语义等价(表达同一事实/偏好/洞察)。
205
+
206
+ 判断规则:
207
+ - 语义等价 = 核心信息相同,仅措辞/格式/细节程度不同
208
+ - 语义不等价 = 核心信息不同,或一条是另一条的补充/细化(非等价)
209
+ - 忽略时间戳、ID 等元数据差异
210
+ - 忽略措辞风格差异(如"喜欢"vs"偏爱")
211
+
212
+ 输出 JSON 格式:
213
+ {
214
+ "isDuplicate": true/false,
215
+ "mergedContent": "合并后的内容(仅 isDuplicate=true 时提供,保留两条记忆的完整信息)",
216
+ "reason": "判断理由(简短说明)"
217
+ }
218
+
219
+ 示例:
220
+ 输入 A: "用户偏好简洁的 UI 设计"
221
+ 输入 B: "用户喜欢简洁的界面风格"
222
+ 输出: {"isDuplicate": true, "mergedContent": "用户偏好简洁的 UI/界面设计风格", "reason": "核心偏好相同,仅措辞差异"}
223
+
224
+ 输入 A: "用户是 TypeScript 开发者"
225
+ 输入 B: "用户偏好使用 TypeScript 进行后端开发"
226
+ 输出: {"isDuplicate": false, "reason": "B 是 A 的细化(限定后端),非语义等价"}`,
227
+ },
228
+ {
229
+ role: 'user',
230
+ content: `请判断以下两条记忆是否语义等价:
231
+
232
+ 记忆 A(保留候选):
233
+ - 名称:${pair.a.name}
234
+ - 来源:${pair.a.source}
235
+ - 内容:${contentA}
236
+
237
+ 记忆 B(重复候选):
238
+ - 名称:${pair.b.name}
239
+ - 来源:${pair.b.source}
240
+ - 内容:${contentB}
241
+
242
+ 名称相似度:${pair.nameSimilarity.toFixed(2)}(0=完全相同,1=完全不同)
243
+
244
+ 请输出 JSON 判断结果。`,
245
+ },
246
+ ];
247
+ }
248
+ //# sourceMappingURL=dedupManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupManager.js","sourceRoot":"","sources":["../../../src/agent/managers/dedupManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 目标一致性校验器(目标版本一致性校验)。
3
+ * 两层校验:确定性层(关键约束提取 + 文本相似度)+ LLM 层(可选,仅对需确认场景生成解释)。
4
+ * 关键约束由确定性规则提取而非 LLM(防自我引用)。漂移等级:same(>0.7 无需确认)/confirm(0.4-0.7 建议确认)/drift(<0.4 需确认)。
5
+ */
6
+ /** 漂移等级:same(>0.7 自动应用)/confirm(0.4-0.7 建议确认)/drift(<0.4 需确认) */
7
+ export type DriftLevel = 'same' | 'confirm' | 'drift';
8
+ /** 一致性校验结果 */
9
+ export interface GoalConsistencyResult {
10
+ /** 漂移等级 */
11
+ level: DriftLevel;
12
+ /** 文本相似度(0-1) */
13
+ similarity: number;
14
+ /** 从 mainGoal 中提取的关键约束列表 */
15
+ constraints: string[];
16
+ /** 约束一致性(true = 所有约束均满足,false = 有约束冲突) */
17
+ constraintsConsistent: boolean;
18
+ /** 冲突的约束说明(可选,仅 constraintsConsistent 为 false 时有值) */
19
+ conflictExplanation?: string;
20
+ }
21
+ /** 目标一致性校验器:纯函数式(无状态无副作用),SessionManager / Agent 层直接可用,不依赖外部服务 */
22
+ export declare class GoalConsistencyChecker {
23
+ /** 提取关键约束:从目标描述中按确定性规则提取"必须/不能/需要/确保"等关键词句段(不依赖 LLM 防自我引用),去重返回 */
24
+ extractConstraints(goal: string): string[];
25
+ /** 计算文本相似度:长文本(>20 字符)用 Jaccard,短文本用字符级 bigram(对短文本更敏感) */
26
+ computeSimilarity(a: string, b: string): number;
27
+ /** 执行一致性校验:提取约束 → 算相似度定漂移等级(>0.7 same / >=0.4 confirm / else drift)→ 检查约束是否仍满足 */
28
+ checkConsistency(mainGoal: string, newGoal: string): GoalConsistencyResult;
29
+ /** 检查约束在新目标是否仍满足:对每条约束提取核心词,任一命中即视为满足;全不满足则标记冲突 */
30
+ private checkConstraintsConsistent;
31
+ /** 提取约束核心词:去除标记词保留核心名词短语(如"必须使用TypeScript" → "使用TypeScript"),再按分隔符切分;剥离前缀由 CONSTRAINT_KEYWORDS 生成 */
32
+ private extractKeywords;
33
+ /** Jaccard 相似度:分词后交集/并集。分词策略:中文字符逐字 + 英文单词 + 数字 */
34
+ private jaccardSimilarity;
35
+ /** 字符级 bigram 相似度:拆相邻字符对求交集/并集,适用于短文本 */
36
+ private bigramSimilarity;
37
+ /** 分词:提取中文字符(逐字,对中文更敏感)+ 英文单词(小写)+ 数字;零外部依赖 */
38
+ private tokenize;
39
+ /** 获取字符级 bigram:拆相邻字符对(如 "TypeScript" → ["Ty","yp",...]) */
40
+ private getBigrams;
41
+ }
42
+ //# sourceMappingURL=goalConsistencyChecker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goalConsistencyChecker.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/goalConsistencyChecker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAgBtD,cAAc;AACd,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,KAAK,EAAE,UAAU,CAAC;IAClB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,0CAA0C;IAC1C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,kEAAkE;AAClE,qBAAa,sBAAsB;IACjC,mEAAmE;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB1C,2DAA2D;IAC3D,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAkB/C,kFAAkF;IAClF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,qBAAqB;IA6B1E,mDAAmD;IACnD,OAAO,CAAC,0BAA0B;IA6BlC,qGAAqG;IACrG,OAAO,CAAC,eAAe;IAQvB,mDAAmD;IACnD,OAAO,CAAC,iBAAiB;IAgBzB,yCAAyC;IACzC,OAAO,CAAC,gBAAgB;IAgBxB,+CAA+C;IAC/C,OAAO,CAAC,QAAQ;IAgChB,4DAA4D;IAC5D,OAAO,CAAC,UAAU;CAOnB"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * 目标一致性校验器(目标版本一致性校验)。
3
+ * 两层校验:确定性层(关键约束提取 + 文本相似度)+ LLM 层(可选,仅对需确认场景生成解释)。
4
+ * 关键约束由确定性规则提取而非 LLM(防自我引用)。漂移等级:same(>0.7 无需确认)/confirm(0.4-0.7 建议确认)/drift(<0.4 需确认)。
5
+ */
6
+ /** 约束关键词单一真源:提取 pattern(全文匹配)与剥离前缀(checkConstraintsConsistent 用)共用,防双列表漂移 */
7
+ const CONSTRAINT_KEYWORDS = [
8
+ '必须',
9
+ '不能',
10
+ '需要',
11
+ '确保',
12
+ '禁止',
13
+ '只能',
14
+ '至少',
15
+ '不允许',
16
+ '应当',
17
+ '不得',
18
+ ];
19
+ /** 目标一致性校验器:纯函数式(无状态无副作用),SessionManager / Agent 层直接可用,不依赖外部服务 */
20
+ export class GoalConsistencyChecker {
21
+ /** 提取关键约束:从目标描述中按确定性规则提取"必须/不能/需要/确保"等关键词句段(不依赖 LLM 防自我引用),去重返回 */
22
+ extractConstraints(goal) {
23
+ if (!goal || goal.trim() === '')
24
+ return [];
25
+ const constraints = [];
26
+ // 约束关键词匹配模式——由 CONSTRAINT_KEYWORDS 单一真源生成(全文匹配)
27
+ const constraintPatterns = CONSTRAINT_KEYWORDS.map((kw) => new RegExp(`${kw}[^,。!?;\n,;.!?]*`, 'g'));
28
+ for (const pattern of constraintPatterns) {
29
+ const matches = goal.match(pattern);
30
+ if (matches) {
31
+ constraints.push(...matches.map((m) => m.trim()));
32
+ }
33
+ }
34
+ // 去重
35
+ return [...new Set(constraints)];
36
+ }
37
+ /** 计算文本相似度:长文本(>20 字符)用 Jaccard,短文本用字符级 bigram(对短文本更敏感) */
38
+ computeSimilarity(a, b) {
39
+ if (!a && !b)
40
+ return 1;
41
+ if (!a || !b)
42
+ return 0;
43
+ const aTrim = a.trim();
44
+ const bTrim = b.trim();
45
+ if (aTrim === bTrim)
46
+ return 1;
47
+ // 短文本:字符级 bigram(对短文本更敏感)
48
+ if (aTrim.length <= 20 || bTrim.length <= 20) {
49
+ return this.bigramSimilarity(aTrim, bTrim);
50
+ }
51
+ // 长文本:Jaccard
52
+ return this.jaccardSimilarity(aTrim, bTrim);
53
+ }
54
+ /** 执行一致性校验:提取约束 → 算相似度定漂移等级(>0.7 same / >=0.4 confirm / else drift)→ 检查约束是否仍满足 */
55
+ checkConsistency(mainGoal, newGoal) {
56
+ const constraints = this.extractConstraints(mainGoal);
57
+ const similarity = this.computeSimilarity(mainGoal, newGoal);
58
+ // 确定漂移等级
59
+ let level;
60
+ if (similarity > 0.7) {
61
+ level = 'same';
62
+ }
63
+ else if (similarity >= 0.4) {
64
+ level = 'confirm';
65
+ }
66
+ else {
67
+ level = 'drift';
68
+ }
69
+ // 检查约束一致性
70
+ const { constraintsConsistent, conflictExplanation } = this.checkConstraintsConsistent(constraints, newGoal);
71
+ return {
72
+ level,
73
+ similarity,
74
+ constraints,
75
+ constraintsConsistent,
76
+ conflictExplanation,
77
+ };
78
+ }
79
+ /** 检查约束在新目标是否仍满足:对每条约束提取核心词,任一命中即视为满足;全不满足则标记冲突 */
80
+ checkConstraintsConsistent(constraints, newGoal) {
81
+ if (constraints.length === 0) {
82
+ return { constraintsConsistent: true };
83
+ }
84
+ const conflictConstraints = [];
85
+ for (const constraint of constraints) {
86
+ // 提取约束核心词并检查新目标是否包含
87
+ const keywords = this.extractKeywords(constraint);
88
+ const satisfied = keywords.some((k) => newGoal.includes(k));
89
+ if (!satisfied) {
90
+ conflictConstraints.push(constraint);
91
+ }
92
+ }
93
+ if (conflictConstraints.length > 0) {
94
+ return {
95
+ constraintsConsistent: false,
96
+ conflictExplanation: `以下约束在新目标中未体现:${conflictConstraints.join(';')}`,
97
+ };
98
+ }
99
+ return { constraintsConsistent: true };
100
+ }
101
+ /** 提取约束核心词:去除标记词保留核心名词短语(如"必须使用TypeScript" → "使用TypeScript"),再按分隔符切分;剥离前缀由 CONSTRAINT_KEYWORDS 生成 */
102
+ extractKeywords(constraint) {
103
+ const cleaned = constraint
104
+ .replace(new RegExp(`^(${CONSTRAINT_KEYWORDS.join('|')})`), '')
105
+ .trim();
106
+ const parts = cleaned.split(/[,,、\s]+/).filter(Boolean);
107
+ return parts.length > 0 ? parts : [cleaned];
108
+ }
109
+ /** Jaccard 相似度:分词后交集/并集。分词策略:中文字符逐字 + 英文单词 + 数字 */
110
+ jaccardSimilarity(a, b) {
111
+ const tokensA = this.tokenize(a);
112
+ const tokensB = this.tokenize(b);
113
+ if (tokensA.size === 0 && tokensB.size === 0)
114
+ return 1;
115
+ if (tokensA.size === 0 || tokensB.size === 0)
116
+ return 0;
117
+ let intersection = 0;
118
+ for (const token of tokensA) {
119
+ if (tokensB.has(token))
120
+ intersection++;
121
+ }
122
+ const union = tokensA.size + tokensB.size - intersection;
123
+ return union > 0 ? intersection / union : 0;
124
+ }
125
+ /** 字符级 bigram 相似度:拆相邻字符对求交集/并集,适用于短文本 */
126
+ bigramSimilarity(a, b) {
127
+ const bigramsA = this.getBigrams(a);
128
+ const bigramsB = this.getBigrams(b);
129
+ if (bigramsA.size === 0 && bigramsB.size === 0)
130
+ return 1;
131
+ if (bigramsA.size === 0 || bigramsB.size === 0)
132
+ return 0;
133
+ let intersection = 0;
134
+ for (const bigram of bigramsA) {
135
+ if (bigramsB.has(bigram))
136
+ intersection++;
137
+ }
138
+ const union = bigramsA.size + bigramsB.size - intersection;
139
+ return union > 0 ? intersection / union : 0;
140
+ }
141
+ /** 分词:提取中文字符(逐字,对中文更敏感)+ 英文单词(小写)+ 数字;零外部依赖 */
142
+ tokenize(text) {
143
+ const tokens = new Set();
144
+ // 中文字符序列(逐字作为 token)
145
+ const chineseChars = text.match(/[\u4e00-\u9fff\u3400-\u4dbf]+/g);
146
+ if (chineseChars) {
147
+ for (const seq of chineseChars) {
148
+ for (const char of seq) {
149
+ tokens.add(char);
150
+ }
151
+ }
152
+ }
153
+ // 英文单词(小写归一化,大小写不敏感)
154
+ const englishWords = text.match(/[a-zA-Z_][a-zA-Z0-9_]*/g);
155
+ if (englishWords) {
156
+ for (const word of englishWords) {
157
+ tokens.add(word.toLowerCase());
158
+ }
159
+ }
160
+ // 数字
161
+ const numbers = text.match(/\d+/g);
162
+ if (numbers) {
163
+ for (const num of numbers) {
164
+ tokens.add(num);
165
+ }
166
+ }
167
+ return tokens;
168
+ }
169
+ /** 获取字符级 bigram:拆相邻字符对(如 "TypeScript" → ["Ty","yp",...]) */
170
+ getBigrams(text) {
171
+ const bigrams = new Set();
172
+ for (let i = 0; i < text.length - 1; i++) {
173
+ bigrams.add(text.slice(i, i + 2));
174
+ }
175
+ return bigrams;
176
+ }
177
+ }
178
+ //# sourceMappingURL=goalConsistencyChecker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goalConsistencyChecker.js","sourceRoot":"","sources":["../../../src/agent/managers/goalConsistencyChecker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * LLM 调用族 — 模型触碰面(重试 / 任务类型路由 / 流式分类)
3
+ *
4
+ * 本族的 loop 私有 state 触点**全是「可注入的协作者」**(metrics / strategy / contextManager /
5
+ * tracer / opts),没有一个是「loop 自己的可变状态」,故经构造注入取值器(getter)取用即可,
6
+ * 属「换位置仍自治」;而工具编排本体(`executeToolCalls`,多处写 loop 状态)不在此族。
7
+ *
8
+ * ## 两条不可回退的纪律
9
+ *
10
+ * 1. **必须传 getter 而非快照**:`strategy` / `provider` 均为运行时可热切换
11
+ * (`setStrategy` 浅合并新对象、`setProvider` 改 `opts.provider`),且
12
+ * `strategy.errorHandling` 在**重试循环体内**被读 3 次——传快照会在重试中途读到旧值。
13
+ * 2. **`routeCache` 由 loop 持有并跨族共享**:它在**每轮 turn 入口**(`processUserInput`)
14
+ * 被 `clear()`,而 turn 内单轮问答查表即中——若改为本类实例字段且调用方逐次新建实例,
15
+ * **每轮都重算路由**(跨轮缓存失效),而缓存的语义是「单轮内复用,跨轮重置」。故 Map 归
16
+ * loop,本类只经读写回调操作它。
17
+ */
18
+ import type { LlmProvider, Message, ChatOptions } from '../../llm/provider.js';
19
+ import type { ProviderRouter, TaskType, LlmChunk } from '../../llm/types.js';
20
+ import type { AgentChunk, TextChunkStage } from '../../agent/types.js';
21
+ import type { ITracer } from '../../agent/tracer.js';
22
+ import type { LoopMetrics } from '../../agent/managers/loopMetrics.js';
23
+ /** 上下文估算能力窄面(`ContextManager.estimateTokens`) */
24
+ export interface TokenEstimator {
25
+ estimateTokens(messages: readonly Message[]): number;
26
+ }
27
+ /**
28
+ * 多模型路由所需的 loop 侧能力子集。
29
+ * 全部为**取值器 / 回调**而非值快照——保证热切换(`setProvider` / `setStrategy`)即时生效。
30
+ */
31
+ export interface LlmCallerDeps {
32
+ /** 运行时指标容器(loop 持有,引用共享;搬走不影响计数正确性) */
33
+ readonly metrics: LoopMetrics;
34
+ /** 当前 L2 策略。**必须是 getter**:`errorHandling` 在重试循环内被读 3 次 */
35
+ readonly getStrategy: () => LlmCallerStrategyView;
36
+ /** 当前 Provider。**必须是 getter**:`setProvider` 为热切换 */
37
+ readonly getProvider: () => LlmProvider;
38
+ /** 任务类型路由回调;未注入时走固定 Provider */
39
+ readonly getProviderRouter: () => ProviderRouter | undefined;
40
+ /** 路由缓存读(Map 归 loop 持有,见文件头纪律 2) */
41
+ readonly getCachedProvider: (taskType: TaskType) => LlmProvider | undefined;
42
+ /** 路由缓存写 */
43
+ readonly setCachedProvider: (taskType: TaskType, provider: LlmProvider) => void;
44
+ /** 上下文管理器(token 估算) */
45
+ readonly contextManager: TokenEstimator;
46
+ /** 追踪器 */
47
+ readonly tracer: ITracer;
48
+ /** 本闭环是否已执行过工具。**必须是 getter**:同一 turn 内会被 set true */
49
+ readonly hasToolExecutedThisTurn: () => boolean;
50
+ }
51
+ /** `LlmCaller` 实际读取的策略字段(避免整体依赖 `L2RuntimeStrategy` 造成接口面膨胀) */
52
+ export interface LlmCallerStrategyView {
53
+ /** 出错处理:'stop' 立即抛出 / 'degrade' 降级为已生成文本 / 其余走重试 */
54
+ readonly errorHandling: string;
55
+ /** 'manual' → 强制低推理深度(provider 支持时) */
56
+ readonly multiStepReasoning: string;
57
+ /** 'fixed' → 跳过路由,固定用默认 Provider */
58
+ readonly providerRouting: string;
59
+ }
60
+ /** LLM 调用结果(loop 侧消费者:`_callAndRoute` / `handleToolCalls` / `handleAskUser` /
61
+ * `handleTextResponse`,均在本族之外,故为导出类型) */
62
+ export interface LlmCallResult {
63
+ fullContent: string;
64
+ toolCalls: Message['toolCalls'];
65
+ aborted: boolean;
66
+ /**
67
+ * 文本通道剥离缓冲:工具轮叙述文本(本闭环已执行过工具后的整条消息文本,
68
+ * 或收到 toolCalls 信号后后续/同条的 content)累积于此。结果路由据此发射
69
+ * narrate 事件,不进回答正文;纯文本闭环(无工具史)正文保持按流式实时 yield。
70
+ */
71
+ pendingNarrate: string;
72
+ /**
73
+ * 本轮正文是否曾逐字流式 yield(工具闭环内延迟分类的消息未 yield → false)。
74
+ * 结果路由据此在纯文本/中断路径补发整段 text,避免缓冲文本对 UI 不可见。
75
+ */
76
+ textStreamed: boolean;
77
+ /**
78
+ * 回抽:本闭环内逐字流式 yield 进正文区的**原文**(stage='answer')。
79
+ *
80
+ * 首轮(无工具史)消息级分类前无法预判工具轮 → 文本已实时流式进正文;一旦收到 toolCalls,
81
+ * 结果路由据此发 `narrate.withdrawn` 告知消费者「该段其实属过程叙述,先撤回再渲染」。
82
+ * 纯文本闭环(正文即最终交付)与工具闭环内延迟分类路径(未 yield)恒为空串。
83
+ */
84
+ streamedText: string;
85
+ /**
86
+ * 末次 chat 尝试回传的 finish_reason(诊断分型证据)。
87
+ * `'length'` = 输出预算截断(思考/生成吃满上限),loop 据此把空响应判「截断型」;
88
+ * 中转不回传则 undefined = 按「瞬态型」降级(降级不劣化,维持现状文案)。
89
+ */
90
+ finishReason?: LlmChunk['finishReason'];
91
+ /** 末次 chat 尝试的 thinking 字符数(reasoning_content 增量累计;无思考模型恒 0。重试重置,取末次口径) */
92
+ thinkingChars: number;
93
+ /** 收场前的 chat 尝试总数(1 = 首试即收场;空响应重试累加。重试属同一步内的多次尝试,非多个 step) */
94
+ attempts: number;
95
+ }
96
+ /**
97
+ * 确定当前回合任务类型(多模型路由):含代码块→code;长文本(>500字符)→reasoning;其余→simple
98
+ *
99
+ * 纯函数(零 state 触点),独立导出便于单测与复用。
100
+ */
101
+ export declare function determineTaskType(messages: readonly Message[]): TaskType;
102
+ /** LLM 调用执行器:多模型路由 + 指数退避重试 + 流式文本通道分类 */
103
+ export declare class LlmCaller {
104
+ private readonly deps;
105
+ constructor(deps: LlmCallerDeps);
106
+ /**
107
+ * 多模型路由:按任务类型选 Provider;单轮内缓存同一 taskType 结果,避免重复路由计算。
108
+ * 三分支收敛:strategy='fixed' → 默认 Provider;有 providerRouter → 路由 + 缓存;否则 fallback 默认。
109
+ */
110
+ resolveProvider(safeMessages: readonly Message[]): LlmProvider;
111
+ /**
112
+ * 调用 LLM(带指数退避重试,仅在流式输出前失败时重试;流式已开始则直接上抛,因用户已看到部分结果)。
113
+ * 经 providerRouter 按任务类型路由到对应 Provider。
114
+ */
115
+ callWithRetry(safeMessages: readonly Message[], chatOpts: ChatOptions, signal: AbortSignal | undefined, iteration: number,
116
+ /** 流式文本阶段标识(默认正常交付 'answer';自审查应答由调用方传 'self_review') */
117
+ stage?: TextChunkStage): AsyncGenerator<AgentChunk, LlmCallResult, unknown>;
118
+ /**
119
+ * 重试延迟 + abort 支持:发射 retry chunk,等待指数退避延迟(支持中途 abort);
120
+ * 调用方在延迟后自行检查 signal.aborted 决定是否退出重试循环
121
+ */
122
+ waitForRetryWithAbort(attempt: number, lastError: Error | null, signal: AbortSignal | undefined): AsyncGenerator<AgentChunk, void, unknown>;
123
+ }
124
+ //# sourceMappingURL=llmCaller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmCaller.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/llmCaller.ts"],"names":[],"mappings":"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"}