@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,417 @@
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 { NOOP_TRACER, TRACE_SPANS } from '../../agent/tracer.js';
19
+ import { LOOP_CONSTANTS } from '../../agent/constants.js';
20
+ import { filterCallableToolCalls, auditToolCallPairing } from '../../agent/managers/toolCallHelpers.js';
21
+ import { isAbortError } from '../../utils/errors.js';
22
+ import { toError } from '../../utils/toError.js';
23
+ import { sha256Fingerprint } from '../../utils/hash.js';
24
+ import { safeSetTimeout } from '../../utils/safeTimer.js';
25
+ import { logger } from '../../logging/logger.js';
26
+ /**
27
+ * 截断型空响应的换策略纠正提示(一次性注入消息尾):模型面向的协议级指令,
28
+ * 与 degrade 降级文案同为内联中文常量——非 UI 文案,不进 UIMessages(宿主可覆盖面不膨胀)。
29
+ */
30
+ const TRUNCATION_RECOVERY_HINT = '上一次回复因思考耗尽输出预算被截断,请直接给出结论或工具调用';
31
+ /**
32
+ * 确定当前回合任务类型(多模型路由):含代码块→code;长文本(>500字符)→reasoning;其余→simple
33
+ *
34
+ * 纯函数(零 state 触点),独立导出便于单测与复用。
35
+ */
36
+ export function determineTaskType(messages) {
37
+ // 从后向前取最近 N 条 user 消息作为检测窗口(多轮对话中真正含代码的请求可能不在最后一条)
38
+ const recentUserContents = [];
39
+ for (let i = messages.length - 1; i >= 0 && recentUserContents.length < LOOP_CONSTANTS.TASK_TYPE_WINDOW; i--) {
40
+ if (messages[i]?.role === 'user') {
41
+ recentUserContents.push(messages[i].content ?? '');
42
+ }
43
+ }
44
+ // 代码相关关键词检测:窗口内任一条含代码块标记 → code(避免含代码请求被后续追问稀释误判)
45
+ if (recentUserContents.some((c) => /```(?:ts|js|py|go|rust|java|css|html|sql)\b/i.test(c))) {
46
+ return 'code';
47
+ }
48
+ // 长文本复杂推理判定(以最近一条 user 消息反映当前轮意图;阈值归入 LOOP_CONSTANTS)
49
+ const lastContent = recentUserContents[0] ?? '';
50
+ if (lastContent.length > LOOP_CONSTANTS.REASONING_INPUT_CHARS) {
51
+ return 'reasoning';
52
+ }
53
+ return 'simple';
54
+ }
55
+ /** LLM 调用执行器:多模型路由 + 指数退避重试 + 流式文本通道分类 */
56
+ export class LlmCaller {
57
+ deps;
58
+ constructor(deps) {
59
+ this.deps = deps;
60
+ }
61
+ /**
62
+ * 多模型路由:按任务类型选 Provider;单轮内缓存同一 taskType 结果,避免重复路由计算。
63
+ * 三分支收敛:strategy='fixed' → 默认 Provider;有 providerRouter → 路由 + 缓存;否则 fallback 默认。
64
+ */
65
+ resolveProvider(safeMessages) {
66
+ if (this.deps.getStrategy().providerRouting === 'fixed') {
67
+ return this.deps.getProvider();
68
+ }
69
+ const router = this.deps.getProviderRouter();
70
+ if (router) {
71
+ const taskType = determineTaskType(safeMessages);
72
+ const cached = this.deps.getCachedProvider(taskType);
73
+ if (cached)
74
+ return cached;
75
+ const routed = router(taskType);
76
+ this.deps.setCachedProvider(taskType, routed);
77
+ return routed;
78
+ }
79
+ return this.deps.getProvider();
80
+ }
81
+ /**
82
+ * 调用 LLM(带指数退避重试,仅在流式输出前失败时重试;流式已开始则直接上抛,因用户已看到部分结果)。
83
+ * 经 providerRouter 按任务类型路由到对应 Provider。
84
+ */
85
+ async *callWithRetry(safeMessages, chatOpts, signal, iteration,
86
+ /** 流式文本阶段标识(默认正常交付 'answer';自审查应答由调用方传 'self_review') */
87
+ stage = 'answer') {
88
+ const { metrics, contextManager, tracer } = this.deps;
89
+ let fullContent = '';
90
+ let toolCalls = undefined;
91
+ let streamStarted = false;
92
+ let lastError = null;
93
+ let aborted = false;
94
+ // 文本通道剥离:是否已进入「工具调用轮」(收到 toolCalls 信号后后续 text 均属叙述)
95
+ let isToolCallTurn = false;
96
+ // 叙述累积:工具轮 text(同条 content + 信号后的后续 content),route 时作为 narrate 发射
97
+ let pendingNarrate = '';
98
+ /** 本轮是否曾逐字流式 yield 过正文(纯文本闭环逐字;工具闭环延迟分类则全程 false) */
99
+ let textStreamed = false;
100
+ /** 回抽:已流式 yield 进正文的原文(供工具轮撤回;见 LlmCallResult.streamedText) */
101
+ let streamedText = '';
102
+ /** 末次 chat 尝试的 finish_reason(诊断分型证据:'length' = 输出预算截断) */
103
+ let finishReason = undefined;
104
+ /** 末次 chat 尝试的 thinking 字符数(诊断证据:截断型常伴随思考吃满输出预算) */
105
+ let thinkingChars = 0;
106
+ /** 实际进行过的 chat 尝试计数(attempt 为 for 作用域变量、出循环不可见;此计数器全程可读) */
107
+ let attemptsMade = 0;
108
+ /** 截断型换策略标记(粘性):空响应且 finish_reason='length' 后置真,后续尝试全程降推理深度 + 携带纠正提示 */
109
+ let truncatedRetry = false;
110
+ // 消息级延迟分类:本闭环已执行过工具(toolExecutedThisTurn)后,
111
+ // 后续 LLM 消息的文本整段缓冲到消息结束再分类——工具轮 → narrate(含信号前全文),
112
+ // 纯文本 → 由路由补发 text。单轮问答/首轮(无工具史)保持逐字流式,不受影响。
113
+ const deferTextToMessageEnd = this.deps.hasToolExecutedThisTurn();
114
+ // 将 AbortSignal 与超时传入 provider,确保 fetch 与 SSE 流读取能被及时中断(用户取消/超时)
115
+ const effectiveOpts = {
116
+ ...chatOpts,
117
+ signal,
118
+ timeoutMs: LOOP_CONSTANTS.LLM_TIMEOUT_MS,
119
+ };
120
+ // multiStepReasoning='manual' → 强制低推理深度(若 Provider 支持)
121
+ if (this.deps.getStrategy().multiStepReasoning === 'manual') {
122
+ effectiveOpts.reasoning_effort = 'low';
123
+ }
124
+ // 多模型路由:按任务类型选 Provider(resolveProvider,含缓存)
125
+ const effectiveProvider = this.resolveProvider(safeMessages);
126
+ // LLM 调用 Span(涵盖重试循环)
127
+ const llmSpan = tracer.startSpan(TRACE_SPANS.LLM_CALL, {
128
+ model: effectiveProvider.name,
129
+ messageCount: safeMessages.length,
130
+ iteration,
131
+ });
132
+ llmSpan.setAttribute('inputTokens', contextManager.estimateTokens(safeMessages));
133
+ // 记录"模型看到了什么"的系统提示指纹(只记 hash 不记内容,可观测性职责;仅真实 Tracer 时计算避免热路径开销)
134
+ if (tracer !== NOOP_TRACER) {
135
+ const systemPrompt = safeMessages
136
+ .filter((m) => m.role === 'system')
137
+ .map((m) => m.content)
138
+ .join('\n');
139
+ llmSpan.setAttribute('systemPromptHash', sha256Fingerprint(systemPrompt));
140
+ }
141
+ // ─── 发送边界守卫 ───
142
+ // 坏批次(assistant.tool_calls 未成形)绝不上线路:在发往前拦截、fail-fast。
143
+ // 健康态散点已按构造保证成形,故此处**健康态恒零命中**;
144
+ // 命中 = 某散点回归(内核 bug 信号),须响亮暴露而非静默吞/重试(坏批次重试无益且掩盖根因),
145
+ // 故抛**非临时错误**,经 loop(processUserInput rethrow)外显到宿主出错面,止损本轮 token。
146
+ const pairingViolations = auditToolCallPairing(safeMessages);
147
+ if (pairingViolations.length > 0) {
148
+ metrics.llmPairingGuardFires++;
149
+ const cause = pairingViolations.map((v) => `${v.kind}:${v.toolCallId}`).join(', ');
150
+ logger.error({ violations: pairingViolations, messageCount: safeMessages.length }, `发送边界守卫拒绝:tool_call 批次成形违规(${cause}),将不发送本请求(= 构造期散点回归)`);
151
+ llmSpan.recordException(new Error(`发送边界守卫拒绝:${cause}`));
152
+ llmSpan.end();
153
+ throw new Error(`发送边界守卫拒绝:tool_call 批次成形违规(${cause})`);
154
+ }
155
+ for (let attempt = 0; attempt <= LOOP_CONSTANTS.MAX_LLM_RETRIES; attempt++) {
156
+ // 每次重试前检查是否已被取消(用户点击停止)
157
+ if (signal?.aborted) {
158
+ aborted = true;
159
+ break;
160
+ }
161
+ if (attempt > 0) {
162
+ yield* this.waitForRetryWithAbort(attempt, lastError, signal);
163
+ // 重试后重置流式状态,避免沿用上次的累积输出
164
+ fullContent = '';
165
+ toolCalls = undefined;
166
+ pendingNarrate = '';
167
+ streamedText = '';
168
+ isToolCallTurn = false;
169
+ // 诊断证据同口径重置:finishReason/thinkingChars 取末次尝试值(与结果路由读到的收场同源)
170
+ finishReason = undefined;
171
+ thinkingChars = 0;
172
+ if (signal?.aborted) {
173
+ aborted = true;
174
+ break;
175
+ }
176
+ }
177
+ try {
178
+ attemptsMade++;
179
+ metrics.llmCallCount++;
180
+ metrics.totalInputTokens += contextManager.estimateTokens(safeMessages);
181
+ // 截断型换策略(双轨,方案 T2):①降推理深度已在下方 empty 分支随 truncatedRetry 置入
182
+ // effectiveOpts.reasoning_effort='low'(复用 multiStepReasoning='manual' 既有转达通道,
183
+ // provider 支持才生效);②纠正提示注入消息尾(提示保底——reasoning_effort 被中转无视
184
+ // 也不劣化,模型仍收到「直接给结论或工具调用」的指令)。**每请求恰一条**:requestMessages
185
+ // 每次从 safeMessages 重建、提示不进历史,多轮重试恒 1 条(一次性 = 不堆叠,非只注首次)。
186
+ const requestMessages = [...safeMessages]; // 浅拷贝为可变数组,避免类型断言(readonly → 可变)
187
+ if (truncatedRetry) {
188
+ requestMessages.push({ role: 'system', content: TRUNCATION_RECOVERY_HINT });
189
+ }
190
+ for await (const chunk of effectiveProvider.chat(requestMessages, effectiveOpts)) {
191
+ streamStarted = true;
192
+ if (signal?.aborted) {
193
+ aborted = true;
194
+ break;
195
+ }
196
+ // 捕获实际 API token 用量(Provider 支持 usage 时)
197
+ if (chunk.usage) {
198
+ metrics.actualInputTokens += chunk.usage.inputTokens;
199
+ metrics.actualOutputTokens += chunk.usage.outputTokens;
200
+ llmSpan.setAttribute('actualInputTokens', chunk.usage.inputTokens);
201
+ llmSpan.setAttribute('actualOutputTokens', chunk.usage.outputTokens);
202
+ }
203
+ // 诊断证据采集(末次口径):finish_reason 随尾 chunk 回传(末条覆盖为准),
204
+ // thinking 字符数按增量累计——空响应分型(截断/瞬态)的裁决依据
205
+ if (chunk.finishReason)
206
+ finishReason = chunk.finishReason;
207
+ if (chunk.thought)
208
+ thinkingChars += chunk.thought.length;
209
+ if (chunk.content) {
210
+ fullContent += chunk.content;
211
+ // 文本通道剥离:① 工具闭环内消息整段缓冲(deferTextToMessageEnd);
212
+ // ② 工具轮(已见 toolCalls 信号或同条携带)的文本归叙述缓冲,不进回答正文。
213
+ // ③ 纯文本闭环保持流式实时 yield(stage 供宿主自审查分段)。
214
+ if (deferTextToMessageEnd || isToolCallTurn || chunk.toolCalls?.length) {
215
+ pendingNarrate += chunk.content;
216
+ }
217
+ else {
218
+ textStreamed = true;
219
+ streamedText += chunk.content;
220
+ yield { type: 'text', content: chunk.content, stage };
221
+ }
222
+ }
223
+ // 模型思考内容(thought):实时透传展示,**永不拼入 fullContent**(CoT 防护,双轨隔离——
224
+ // 正文轨与记忆轨不碰 thought,仅展示轨消费)。增量片段,宿主自行累积。命名用 thought
225
+ // 避开多模型路由任务 TaskType='reasoning' 与 ProcessEvent 既有相位 'thinking'。
226
+ if (chunk.thought) {
227
+ yield { type: 'thought', content: chunk.thought };
228
+ }
229
+ // 工具意图预告:tool_call name 成形即透传,宿主提前渲染「准备中」工具行。
230
+ // 瞬态展示轨:不落 ProcessEvent(宿主侧据此不 emitEvent);id 可能为空串(provider 未发)
231
+ if (chunk.partialToolCall) {
232
+ yield {
233
+ type: 'tool_pending',
234
+ toolCallId: chunk.partialToolCall.id || undefined,
235
+ name: chunk.partialToolCall.name,
236
+ };
237
+ }
238
+ if (chunk.toolCalls) {
239
+ // 只收可发出的调用:模型偶发的「只有 id、无 function 载荷」条目若写入历史,下一次
240
+ // 请求必被服务端以 400 拒绝。丢弃在**写入历史之前**,故 assistant.tool_calls 与随后
241
+ // 逐项回填的 tool 消息仍同源同长(配对不变量不破);整批皆非法时 toolCalls 保持
242
+ // undefined,自然落回既有纯文本路径(无需新分支)。
243
+ const callable = filterCallableToolCalls(chunk.toolCalls);
244
+ if (callable.length > 0) {
245
+ toolCalls = [...(toolCalls ?? []), ...callable];
246
+ }
247
+ // 文本分流按**原始** chunk 置位:叙述归类不因丢弃而改变
248
+ isToolCallTurn = true;
249
+ }
250
+ }
251
+ // 成功时累计输出 token
252
+ metrics.totalOutputTokens += contextManager.estimateTokens([
253
+ { role: 'assistant', content: fullContent },
254
+ ]);
255
+ // 空响应重试(真机空响应一次定生死,不入重试):
256
+ // 若 for await 正常结束后无论内容是否空都 `break` 跳出,空响应(200 但 0 token 的
257
+ // provider 瞬态抽风)直接落到 loop 的英文兜底文案,用户被迫重发——与「网络错误会重试」
258
+ // 不对称。此处在未耗尽重试次数时把「全空结果」视为一次失败,`continue` 走既有 retry
259
+ // 退避(attempt++ → waitForRetryWithAbort + 重置流式状态),给瞬态一次纠偏机会。
260
+ // 耗尽仍空则照常 break,交 loop 兜底。不把「模型拒绝/静默空」错当合法产出反复重试。
261
+ const isEmptyResponse = !aborted &&
262
+ !fullContent &&
263
+ !pendingNarrate &&
264
+ !streamedText &&
265
+ (!toolCalls || toolCalls.length === 0);
266
+ if (isEmptyResponse && attempt < LOOP_CONSTANTS.MAX_LLM_RETRIES) {
267
+ lastError = new Error('LLM 返回空响应');
268
+ // 截断型判定(末次 finish_reason):'length' = 思考/生成吃满输出预算——同参重试必再炸
269
+ // (真机 3 连空实证),换策略重试(双轨见上方 requestMessages 注释),粘性至收场;
270
+ // 无 finishReason(中转不回传)= 瞬态型 → 维持同参重试(降级不劣化)
271
+ if (finishReason === 'length') {
272
+ truncatedRetry = true;
273
+ effectiveOpts.reasoning_effort = 'low';
274
+ }
275
+ continue;
276
+ }
277
+ // 截断救回计数(诚实信号族,镜像 emptyResponseCount):曾判截断换策略、本次收场非空
278
+ // = 双轨救回成功——救回轮正文是真实产出(不影响成功收尾),但「曾发生截断」只在此留痕
279
+ // (empty_response 证据只在最终仍空时落)。每 call 恒 ≤1(粘性标记单调,成功即收场)。
280
+ // 早退路径(degrade 降级文案 / 抛错 / aborted)不经此点,不计入——降级文本非模型产出。
281
+ // aborted 显式排除(真机修正):`isEmptyResponse` 判据以 `!aborted` 为前提,用户中止时
282
+ // 它恒为 false ⇒ 「truncatedRetry && !isEmptyResponse」会把**用户放弃**误记为救回成功
283
+ //(真机 round-1790686368607:全程无正文/无工具产出却 recov=1)。救回 = 模型的真实产出,
284
+ // 中止 = 未有产出,两者分类互斥,故此处补 `!aborted` 兑现注释声明的纪律。
285
+ if (truncatedRetry && !aborted && !isEmptyResponse) {
286
+ metrics.truncationRecoveryCount++;
287
+ }
288
+ break;
289
+ }
290
+ catch (err) {
291
+ const e = toError(err);
292
+ lastError = e;
293
+ // AbortError 语义分裂(假中断守卫):
294
+ // - signal(宿主 / 插话控制器合并信号)已被 abort → 真实用户取消/插话,不重试直接退出
295
+ // - signal 未被 abort 却捕获 AbortError → provider/网络层内部中断(连接被抽断/代理异常),
296
+ // 并非用户取消;抛出以示「连接中断」,避免内核谎报为「用户取消了对话」。
297
+ if (isAbortError(err)) {
298
+ if (signal?.aborted) {
299
+ aborted = true;
300
+ break;
301
+ }
302
+ logger.warn({ err: e }, 'LLM 请求被非用户消原因 AbortError 中断(host signal 未 abort),判为连接中断');
303
+ llmSpan.recordException(e);
304
+ llmSpan.end();
305
+ throw e;
306
+ }
307
+ // errorHandling='stop' → 立即抛出,不重试(热切换安全:每处重读 getter)
308
+ if (this.deps.getStrategy().errorHandling === 'stop') {
309
+ llmSpan.recordException(e);
310
+ llmSpan.end();
311
+ throw lastError;
312
+ }
313
+ if (streamStarted) {
314
+ // 流式已开始输出,不能重试(用户已看到部分结果);'degrade' 降级为已生成文本
315
+ if (this.deps.getStrategy().errorHandling === 'degrade') {
316
+ logger.warn({ err: e }, 'LLM 流式中途失败,降级为已生成的文本内容');
317
+ llmSpan.end();
318
+ return {
319
+ fullContent,
320
+ pendingNarrate,
321
+ streamedText,
322
+ toolCalls: undefined,
323
+ aborted: false,
324
+ textStreamed,
325
+ finishReason,
326
+ thinkingChars,
327
+ attempts: attemptsMade,
328
+ };
329
+ }
330
+ llmSpan.recordException(e);
331
+ llmSpan.end();
332
+ throw lastError;
333
+ }
334
+ if (attempt >= LOOP_CONSTANTS.MAX_LLM_RETRIES) {
335
+ // 重试次数耗尽;'degrade' 降级为纯文本回复
336
+ if (this.deps.getStrategy().errorHandling === 'degrade') {
337
+ const degradedMsg = '抱歉,AI 服务暂时不可用,请稍后重试。';
338
+ logger.warn({ err: e }, 'LLM 重试耗尽,降级回复');
339
+ llmSpan.end();
340
+ return {
341
+ fullContent: degradedMsg,
342
+ pendingNarrate,
343
+ streamedText,
344
+ toolCalls: undefined,
345
+ aborted: false,
346
+ textStreamed,
347
+ finishReason,
348
+ thinkingChars,
349
+ attempts: attemptsMade,
350
+ };
351
+ }
352
+ llmSpan.recordException(e);
353
+ llmSpan.end();
354
+ throw lastError;
355
+ }
356
+ // 流式开始前失败可继续重试(超时/网络错误)
357
+ }
358
+ }
359
+ if (aborted) {
360
+ llmSpan.end();
361
+ return {
362
+ fullContent,
363
+ pendingNarrate,
364
+ streamedText,
365
+ toolCalls,
366
+ aborted: true,
367
+ textStreamed,
368
+ finishReason,
369
+ thinkingChars,
370
+ attempts: attemptsMade,
371
+ };
372
+ }
373
+ llmSpan.end();
374
+ return {
375
+ fullContent,
376
+ pendingNarrate,
377
+ streamedText,
378
+ toolCalls,
379
+ aborted: false,
380
+ textStreamed,
381
+ finishReason,
382
+ thinkingChars,
383
+ attempts: attemptsMade,
384
+ };
385
+ }
386
+ /**
387
+ * 重试延迟 + abort 支持:发射 retry chunk,等待指数退避延迟(支持中途 abort);
388
+ * 调用方在延迟后自行检查 signal.aborted 决定是否退出重试循环
389
+ */
390
+ async *waitForRetryWithAbort(attempt, lastError, signal) {
391
+ const delay = LOOP_CONSTANTS.RETRY_BASE_DELAY_MS * Math.pow(2, attempt - 1);
392
+ logger.warn({ attempt, delay, error: lastError?.message }, 'LLM 调用失败,重试中');
393
+ yield {
394
+ type: 'retry',
395
+ attempt,
396
+ maxRetries: LOOP_CONSTANTS.MAX_LLM_RETRIES,
397
+ delayMs: delay,
398
+ error: lastError?.message ?? 'unknown error',
399
+ };
400
+ await new Promise((resolve) => {
401
+ if (signal?.aborted) {
402
+ resolve();
403
+ return;
404
+ }
405
+ const timeoutId = safeSetTimeout(() => {
406
+ signal?.removeEventListener('abort', onAbort);
407
+ resolve();
408
+ }, delay);
409
+ const onAbort = () => {
410
+ clearTimeout(timeoutId);
411
+ resolve();
412
+ };
413
+ signal?.addEventListener('abort', onAbort, { once: true });
414
+ });
415
+ }
416
+ }
417
+ //# sourceMappingURL=llmCaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmCaller.js","sourceRoot":"","sources":["../../../src/agent/managers/llmCaller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * LLM Judge 高阶辅助函数:封装"流式累积 → parseLlmJson → 判 null → 抛 configError"三件套。
3
+ * 由 memoryInspector / memoryAdvisor 复用,消除重复。
4
+ * 统一异常:解析失败抛 configError(MemoraError 体系);类型参数化,调用方指定返回类型 T。
5
+ */
6
+ import type { LlmProvider, Message } from '../../llm/provider.js';
7
+ /** LLM Judge 调用选项(流式 + 超时 + 取消信号) */
8
+ export interface LlmJudgeOptions {
9
+ /** 流式响应最大 token 数(控制单次调用成本) */
10
+ maxTokens: number;
11
+ /** LLM 调用超时(ms),超时中止请求 */
12
+ timeoutMs: number;
13
+ /** 可选取消信号(与 timeoutMs 独立,任一触发即中止) */
14
+ signal?: AbortSignal;
15
+ }
16
+ /**
17
+ * 调用 LLM 流式累积响应并解析为 JSON 对象 T。
18
+ * 流式累积 → parseLlmJson(容错剥离代码块/修复错误/正则兜底)→ 解析失败抛 configError。
19
+ */
20
+ export declare function judgeWithLlm<T extends object>(provider: LlmProvider, messages: Message[], options: LlmJudgeOptions, errorTitle: string): Promise<T>;
21
+ //# sourceMappingURL=llmJudgeHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmJudgeHelper.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/llmJudgeHelper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK9D,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EACjD,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * LLM Judge 高阶辅助函数:封装"流式累积 → parseLlmJson → 判 null → 抛 configError"三件套。
3
+ * 由 memoryInspector / memoryAdvisor 复用,消除重复。
4
+ * 统一异常:解析失败抛 configError(MemoraError 体系);类型参数化,调用方指定返回类型 T。
5
+ */
6
+ import { parseLlmJson } from '../../utils/json.js';
7
+ import { configError } from '../../utils/errors.js';
8
+ import { accumulateStream } from '../../agent/managers/streamAccumulator.js';
9
+ /**
10
+ * 调用 LLM 流式累积响应并解析为 JSON 对象 T。
11
+ * 流式累积 → parseLlmJson(容错剥离代码块/修复错误/正则兜底)→ 解析失败抛 configError。
12
+ */
13
+ export async function judgeWithLlm(provider, messages, options, errorTitle) {
14
+ // 流式累积 LLM 响应(复用 accumulateStream,消除重复)
15
+ const llmResponse = await accumulateStream(provider, messages, {
16
+ maxTokens: options.maxTokens,
17
+ temperature: 0,
18
+ timeoutMs: options.timeoutMs,
19
+ signal: options.signal,
20
+ });
21
+ // 解析 JSON,失败抛 configError(统一 MemoraError 体系)
22
+ const parsed = parseLlmJson(llmResponse.trim());
23
+ if (!parsed) {
24
+ throw configError(errorTitle, 'LLM 返回内容不是有效的 JSON(parseLlmJson 解析失败)', [
25
+ '检查 backgroundProvider 是否注入并可用',
26
+ '检查 LLM 模型是否输出预期的 JSON 结构',
27
+ '若问题持续,可降低候选数量或调整 prompt',
28
+ ]);
29
+ }
30
+ return parsed;
31
+ }
32
+ //# sourceMappingURL=llmJudgeHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmJudgeHelper.js","sourceRoot":"","sources":["../../../src/agent/managers/llmJudgeHelper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAYzE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAqB,EACrB,QAAmB,EACnB,OAAwB,EACxB,UAAkB;IAElB,wCAAwC;IACxC,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE;QAC7D,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,WAAW,CAAC,UAAU,EAAE,uCAAuC,EAAE;YACrE,+BAA+B;YAC/B,0BAA0B;YAC1B,yBAAyB;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * AgentLoop 运行时指标纯状态容器
3
+ *
4
+ * 零 AgentLoop 依赖的自包含值对象:9 个计数字段 + 3 个派生 getter。
5
+ * 置入 `managers/` 而非 loop.ts 的理由:度量「定义」与度量「消费」应分离——
6
+ * loop 只负责 `this.metrics.xxx++`,指标结构本身不属于编排逻辑。
7
+ *
8
+ * 注:不设召回计数指标——记忆检索唯一入口 = search_memories 工具,耗时可看 TOOL_EXEC span。
9
+ */
10
+ export declare class LoopMetrics {
11
+ llmCallCount: number;
12
+ totalInputTokens: number;
13
+ totalOutputTokens: number;
14
+ actualInputTokens: number;
15
+ actualOutputTokens: number;
16
+ toolCallCount: number;
17
+ toolFailureCount: number;
18
+ /** 空响应兜底次数(LLM 200 但 0 token)。为真说明用户看到英文兜底文案、
19
+ * 任务零产出却被 success 盖章——宿主据此识别「瞬态抽风」vs「模型拒绝」,不再被静默掩盖 */
20
+ emptyResponseCount: number;
21
+ /** 截断救回次数(截断型空响应换策略重试后成功产出)。与 emptyResponseCount 互补:
22
+ * 后者 = 最终仍空(救回失败),本计数 = 曾截断但被 T2 双轨救回(正文是真实模型产出,
23
+ * 不影响成功收尾)。「救回成功」的轮落盘无其它痕迹,无本计数则换策略重试的真机效力不可验。 */
24
+ truncationRecoveryCount: number;
25
+ /**
26
+ * 疑似工具调用但无原生 toolCalls 的文本意图数。
27
+ * 文本出口不再宣告可调用通道后,模型仍可能吐出 <tool_call>/<function=> 骨架——
28
+ * 本计数让「想干活却一步没干成」不再被静默盖章「完成」(宿主据此不显示 success)。
29
+ */
30
+ unparsedToolIntentCount: number;
31
+ /** 任务总执行次数(每次 processUserInput 算一次) */
32
+ taskTotalCount: number;
33
+ /** 任务成功次数 */
34
+ taskSuccessCount: number;
35
+ /** 任务失败次数(abort/超时/迭代耗尽) */
36
+ taskFailureCount: number;
37
+ /** 任务累计耗时(毫秒,用于计算平均耗时) */
38
+ taskTotalDurationMs: number;
39
+ /** 任务成功率(0-1) */
40
+ get taskSuccessRate(): number;
41
+ /** 平均任务耗时(毫秒) */
42
+ get taskAvgDurationMs(): number;
43
+ /** 累计调用 task_table_write 次数(= 任务表建表/重建次数) */
44
+ planTaskTableWriteCount: number;
45
+ /** 累计产出 plan_item_boundary 次数(= 思考折叠分块的边界数) */
46
+ planItemBoundaryCount: number;
47
+ /** 发送边界守卫命中次数(tool_call 批次成形违规被拒发)。健康态应恒 0——
48
+ * 命中 = 构造期散点回归(内核 bug 信号),见 toolCallHelpers.auditToolCallPairing */
49
+ llmPairingGuardFires: number;
50
+ /** read_file 覆盖度台账回显(分支② formatLedgerStub 命中)累计次数。
51
+ * 仅作观测基线:与「规避行为红旗」交叉判定防重是否过度顶替合法重读(见 AgentMetrics 该字段 JSDoc)。 */
52
+ ledgerStubEchoCount: number;
53
+ /** read_dedup 护栏硬拦命中(同主体重复获取且结果仍在上下文)累计次数。
54
+ * 与 ledgerStubEchoCount 互补:本计数 = L2 精确判重(模型乒乓信号,撞墙升级文案的量化基线),
55
+ * 后者 = L3 变体顶替;健康态应接近 0,持续增长 = 模型在同主体上反复重读。 */
56
+ readDedupBlockCount: number;
57
+ }
58
+ //# sourceMappingURL=loopMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopMetrics.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/loopMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,YAAY,SAAK;IACjB,gBAAgB,SAAK;IACrB,iBAAiB,SAAK;IACtB,iBAAiB,SAAK;IACtB,kBAAkB,SAAK;IACvB,aAAa,SAAK;IAClB,gBAAgB,SAAK;IAErB;2DACuD;IACvD,kBAAkB,SAAK;IAEvB;;uDAEmD;IACnD,uBAAuB,SAAK;IAG5B;;;;OAIG;IACH,uBAAuB,SAAK;IAG5B,uCAAuC;IACvC,cAAc,SAAK;IACnB,aAAa;IACb,gBAAgB,SAAK;IACrB,4BAA4B;IAC5B,gBAAgB,SAAK;IACrB,0BAA0B;IAC1B,mBAAmB,SAAK;IAExB,iBAAiB;IACjB,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,iBAAiB;IACjB,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAGD,6CAA6C;IAC7C,uBAAuB,SAAK;IAC5B,+CAA+C;IAC/C,qBAAqB,SAAK;IAG1B;yEACqE;IACrE,oBAAoB,SAAK;IAGzB;sEACkE;IAClE,mBAAmB,SAAK;IAGxB;;oDAEgD;IAChD,mBAAmB,SAAK;CACzB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * AgentLoop 运行时指标纯状态容器
3
+ *
4
+ * 零 AgentLoop 依赖的自包含值对象:9 个计数字段 + 3 个派生 getter。
5
+ * 置入 `managers/` 而非 loop.ts 的理由:度量「定义」与度量「消费」应分离——
6
+ * loop 只负责 `this.metrics.xxx++`,指标结构本身不属于编排逻辑。
7
+ *
8
+ * 注:不设召回计数指标——记忆检索唯一入口 = search_memories 工具,耗时可看 TOOL_EXEC span。
9
+ */
10
+ export class LoopMetrics {
11
+ llmCallCount = 0;
12
+ totalInputTokens = 0;
13
+ totalOutputTokens = 0;
14
+ actualInputTokens = 0;
15
+ actualOutputTokens = 0;
16
+ toolCallCount = 0;
17
+ toolFailureCount = 0;
18
+ /** 空响应兜底次数(LLM 200 但 0 token)。为真说明用户看到英文兜底文案、
19
+ * 任务零产出却被 success 盖章——宿主据此识别「瞬态抽风」vs「模型拒绝」,不再被静默掩盖 */
20
+ emptyResponseCount = 0;
21
+ /** 截断救回次数(截断型空响应换策略重试后成功产出)。与 emptyResponseCount 互补:
22
+ * 后者 = 最终仍空(救回失败),本计数 = 曾截断但被 T2 双轨救回(正文是真实模型产出,
23
+ * 不影响成功收尾)。「救回成功」的轮落盘无其它痕迹,无本计数则换策略重试的真机效力不可验。 */
24
+ truncationRecoveryCount = 0;
25
+ // ─── 未解析工具意图 ──────────────────────
26
+ /**
27
+ * 疑似工具调用但无原生 toolCalls 的文本意图数。
28
+ * 文本出口不再宣告可调用通道后,模型仍可能吐出 <tool_call>/<function=> 骨架——
29
+ * 本计数让「想干活却一步没干成」不再被静默盖章「完成」(宿主据此不显示 success)。
30
+ */
31
+ unparsedToolIntentCount = 0;
32
+ // ─── 任务级 SLO 度量 ──────────────────────
33
+ /** 任务总执行次数(每次 processUserInput 算一次) */
34
+ taskTotalCount = 0;
35
+ /** 任务成功次数 */
36
+ taskSuccessCount = 0;
37
+ /** 任务失败次数(abort/超时/迭代耗尽) */
38
+ taskFailureCount = 0;
39
+ /** 任务累计耗时(毫秒,用于计算平均耗时) */
40
+ taskTotalDurationMs = 0;
41
+ /** 任务成功率(0-1) */
42
+ get taskSuccessRate() {
43
+ return this.taskTotalCount > 0 ? this.taskSuccessCount / this.taskTotalCount : 0;
44
+ }
45
+ /** 平均任务耗时(毫秒) */
46
+ get taskAvgDurationMs() {
47
+ return this.taskTotalCount > 0 ? Math.round(this.taskTotalDurationMs / this.taskTotalCount) : 0;
48
+ }
49
+ // ─── 任务表触发观测量(先实证触发率,再决定修复是否起效)──
50
+ /** 累计调用 task_table_write 次数(= 任务表建表/重建次数) */
51
+ planTaskTableWriteCount = 0;
52
+ /** 累计产出 plan_item_boundary 次数(= 思考折叠分块的边界数) */
53
+ planItemBoundaryCount = 0;
54
+ // ─── 发送边界守卫 ───────────────────
55
+ /** 发送边界守卫命中次数(tool_call 批次成形违规被拒发)。健康态应恒 0——
56
+ * 命中 = 构造期散点回归(内核 bug 信号),见 toolCallHelpers.auditToolCallPairing */
57
+ llmPairingGuardFires = 0;
58
+ // ─── 读取防重的台账替身回显观测(观测防重是否过度拦截合法重读)──
59
+ /** read_file 覆盖度台账回显(分支② formatLedgerStub 命中)累计次数。
60
+ * 仅作观测基线:与「规避行为红旗」交叉判定防重是否过度顶替合法重读(见 AgentMetrics 该字段 JSDoc)。 */
61
+ ledgerStubEchoCount = 0;
62
+ // ─── 读取防重的 L2 硬拦观测 ──
63
+ /** read_dedup 护栏硬拦命中(同主体重复获取且结果仍在上下文)累计次数。
64
+ * 与 ledgerStubEchoCount 互补:本计数 = L2 精确判重(模型乒乓信号,撞墙升级文案的量化基线),
65
+ * 后者 = L3 变体顶替;健康态应接近 0,持续增长 = 模型在同主体上反复重读。 */
66
+ readDedupBlockCount = 0;
67
+ }
68
+ //# sourceMappingURL=loopMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopMetrics.js","sourceRoot":"","sources":["../../../src/agent/managers/loopMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAW;IACtB,YAAY,GAAG,CAAC,CAAC;IACjB,gBAAgB,GAAG,CAAC,CAAC;IACrB,iBAAiB,GAAG,CAAC,CAAC;IACtB,iBAAiB,GAAG,CAAC,CAAC;IACtB,kBAAkB,GAAG,CAAC,CAAC;IACvB,aAAa,GAAG,CAAC,CAAC;IAClB,gBAAgB,GAAG,CAAC,CAAC;IAErB;2DACuD;IACvD,kBAAkB,GAAG,CAAC,CAAC;IAEvB;;uDAEmD;IACnD,uBAAuB,GAAG,CAAC,CAAC;IAE5B,qCAAqC;IACrC;;;;OAIG;IACH,uBAAuB,GAAG,CAAC,CAAC;IAE5B,wCAAwC;IACxC,uCAAuC;IACvC,cAAc,GAAG,CAAC,CAAC;IACnB,aAAa;IACb,gBAAgB,GAAG,CAAC,CAAC;IACrB,4BAA4B;IAC5B,gBAAgB,GAAG,CAAC,CAAC;IACrB,0BAA0B;IAC1B,mBAAmB,GAAG,CAAC,CAAC;IAExB,iBAAiB;IACjB,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,iBAAiB;IACjB,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,mCAAmC;IACnC,6CAA6C;IAC7C,uBAAuB,GAAG,CAAC,CAAC;IAC5B,+CAA+C;IAC/C,qBAAqB,GAAG,CAAC,CAAC;IAE1B,iCAAiC;IACjC;yEACqE;IACrE,oBAAoB,GAAG,CAAC,CAAC;IAEzB,sCAAsC;IACtC;sEACkE;IAClE,mBAAmB,GAAG,CAAC,CAAC;IAExB,uBAAuB;IACvB;;oDAEgD;IAChD,mBAAmB,GAAG,CAAC,CAAC;CACzB"}