@zooique/memora 2.0.3 → 3.0.1

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 +1037 -0
  2. package/README.en.md +305 -272
  3. package/README.md +303 -260
  4. package/config.example.json +43 -0
  5. package/dist/agent/agent.d.ts +376 -408
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +1166 -926
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +105 -43
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +543 -75
  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 +225 -38
  18. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  19. package/dist/agent/builtinToolHandlers.js +748 -132
  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 +137 -20
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +152 -20
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +119 -77
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +192 -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 +716 -295
  50. package/dist/agent/loop.d.ts.map +1 -1
  51. package/dist/agent/loop.js +2178 -664
  52. package/dist/agent/loop.js.map +1 -1
  53. package/dist/agent/managers/archiveCoordinator.d.ts +14 -171
  54. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  55. package/dist/agent/managers/archiveCoordinator.js +19 -287
  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 +31 -115
  62. package/dist/agent/managers/dedupManager.d.ts.map +1 -1
  63. package/dist/agent/managers/dedupManager.js +48 -136
  64. package/dist/agent/managers/dedupManager.js.map +1 -1
  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 +8 -25
  74. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -1
  75. package/dist/agent/managers/llmJudgeHelper.js +7 -24
  76. package/dist/agent/managers/llmJudgeHelper.js.map +1 -1
  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 +85 -207
  84. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  85. package/dist/agent/managers/memoryGovernance.d.ts +10 -42
  86. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -1
  87. package/dist/agent/managers/memoryGovernance.js +19 -36
  88. package/dist/agent/managers/memoryGovernance.js.map +1 -1
  89. package/dist/agent/managers/memoryInspector.d.ts +59 -268
  90. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  91. package/dist/agent/managers/memoryInspector.js +91 -442
  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 -68
  98. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  99. package/dist/agent/managers/sessionArchiver.js +76 -147
  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 +8 -33
  110. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -1
  111. package/dist/agent/managers/streamAccumulator.js +4 -29
  112. package/dist/agent/managers/streamAccumulator.js.map +1 -1
  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 +9 -41
  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 +55 -100
  122. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  123. package/dist/agent/managers/workProjection.js +164 -268
  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 +236 -10
  158. package/dist/agent/toolExecutor.d.ts.map +1 -1
  159. package/dist/agent/toolExecutor.js +932 -21
  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 +510 -169
  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 +27 -98
  198. package/dist/config/loader.d.ts.map +1 -1
  199. package/dist/config/loader.js +110 -223
  200. package/dist/config/loader.js.map +1 -1
  201. package/dist/index.d.ts +67 -77
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +90 -69
  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 +22 -32
  210. package/dist/llm/factory.d.ts.map +1 -1
  211. package/dist/llm/factory.js +29 -46
  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 +179 -120
  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 -31
  226. package/dist/logging/logger.d.ts.map +1 -1
  227. package/dist/logging/logger.js +28 -215
  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 +11 -44
  236. package/dist/memory/governance.d.ts.map +1 -1
  237. package/dist/memory/governance.js +11 -64
  238. package/dist/memory/governance.js.map +1 -1
  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 +25 -175
  252. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  253. package/dist/memory/inMemoryStorage.js +32 -221
  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 +2 -2
  260. package/dist/memory/lockManager.d.ts.map +1 -1
  261. package/dist/memory/lockManager.js +6 -8
  262. package/dist/memory/lockManager.js.map +1 -1
  263. package/dist/memory/projectManager.d.ts +30 -129
  264. package/dist/memory/projectManager.d.ts.map +1 -1
  265. package/dist/memory/projectManager.js +39 -189
  266. package/dist/memory/projectManager.js.map +1 -1
  267. package/dist/memory/projectRegistry.d.ts +14 -62
  268. package/dist/memory/projectRegistry.d.ts.map +1 -1
  269. package/dist/memory/projectRegistry.js +27 -111
  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 +10 -12
  284. package/dist/memory/sourceValidation.d.ts.map +1 -1
  285. package/dist/memory/sourceValidation.js +16 -32
  286. package/dist/memory/sourceValidation.js.map +1 -1
  287. package/dist/memory/storageInterface.d.ts +44 -150
  288. package/dist/memory/storageInterface.d.ts.map +1 -1
  289. package/dist/memory/types.d.ts +65 -164
  290. package/dist/memory/types.d.ts.map +1 -1
  291. package/dist/memory/types.js +81 -83
  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 +136 -19
  342. package/dist/skill/skillManager.d.ts.map +1 -1
  343. package/dist/skill/skillManager.js +312 -61
  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 -16
  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 +40 -72
  366. package/dist/utils/configResourceManager.d.ts.map +1 -1
  367. package/dist/utils/configResourceManager.js +78 -76
  368. package/dist/utils/configResourceManager.js.map +1 -1
  369. package/dist/utils/errors.d.ts +44 -69
  370. package/dist/utils/errors.d.ts.map +1 -1
  371. package/dist/utils/errors.js +54 -71
  372. package/dist/utils/errors.js.map +1 -1
  373. package/dist/utils/eventEmitter.d.ts +104 -103
  374. package/dist/utils/eventEmitter.d.ts.map +1 -1
  375. package/dist/utils/eventEmitter.js +37 -45
  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 +2 -3
  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 +25 -3
  396. package/dist/utils/math.d.ts.map +1 -1
  397. package/dist/utils/math.js +32 -16
  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 -19
  416. package/dist/utils/segmenter.d.ts.map +1 -1
  417. package/dist/utils/segmenter.js +230 -97
  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 +416 -476
  458. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +841 -806
  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 -100
  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 -49
  503. package/dist/agent/guardrail.d.ts.map +0 -1
  504. package/dist/agent/guardrail.js +0 -59
  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 -146
  509. package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
  510. package/dist/agent/managers/configManager.d.ts +0 -209
  511. package/dist/agent/managers/configManager.d.ts.map +0 -1
  512. package/dist/agent/managers/configManager.js +0 -331
  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 -239
  519. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
  520. package/dist/agent/managers/memoryDecayScheduler.js +0 -413
  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 -88
  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 -79
  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 -50
  551. package/dist/memory/hybridMerge.d.ts.map +0 -1
  552. package/dist/memory/hybridMerge.js +0 -51
  553. package/dist/memory/hybridMerge.js.map +0 -1
  554. package/dist/memory/inMemoryRelationStore.d.ts +0 -58
  555. package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
  556. package/dist/memory/inMemoryRelationStore.js +0 -80
  557. package/dist/memory/inMemoryRelationStore.js.map +0 -1
  558. package/dist/memory/loader.d.ts +0 -51
  559. package/dist/memory/loader.d.ts.map +0 -1
  560. package/dist/memory/loader.js +0 -100
  561. package/dist/memory/loader.js.map +0 -1
  562. package/dist/memory/recall.d.ts +0 -82
  563. package/dist/memory/recall.d.ts.map +0 -1
  564. package/dist/memory/recall.js +0 -157
  565. package/dist/memory/recall.js.map +0 -1
  566. package/dist/memory/relationStore.d.ts +0 -95
  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 -71
  571. package/dist/memory/store.d.ts.map +0 -1
  572. package/dist/memory/store.js +0 -199
  573. package/dist/memory/store.js.map +0 -1
  574. package/dist/memory/userProfile.d.ts +0 -180
  575. package/dist/memory/userProfile.d.ts.map +0 -1
  576. package/dist/memory/userProfile.js +0 -381
  577. package/dist/memory/userProfile.js.map +0 -1
  578. package/dist/memory/vectorStore.d.ts +0 -179
  579. package/dist/memory/vectorStore.d.ts.map +0 -1
  580. package/dist/memory/vectorStore.js +0 -284
  581. package/dist/memory/vectorStore.js.map +0 -1
  582. package/dist/persona/personaManager.d.ts +0 -109
  583. package/dist/persona/personaManager.d.ts.map +0 -1
  584. package/dist/persona/personaManager.js +0 -315
  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 @@
1
+ {"version":3,"file":"contextPreparer.d.ts","sourceRoot":"","sources":["../../src/agent/contextPreparer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,IAAI,EAAE,SAAS,CAAC;IAChB,uBAAuB;IACvB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,cAAc,CAAC;IAC/B,yBAAyB;IACzB,MAAM,EAAE;QACN,8BAA8B;QAC9B,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;QACvB,6BAA6B;QAC7B,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;QACjC,uIAAuI;QACvI,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,+BAA+B;IAC/B,IAAI,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACtD;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;gBAE/B,IAAI,EAAE,mBAAmB;IAIrC;;;;;;;;OAQG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzC;;;;;;;;;OASG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAuFpD"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Agent 输入增强管线 — 外部输入 → 上下文装配
3
+ *
4
+ * 职责:
5
+ * - assembleContext:上下文装配(预算派生 + 对话层注入 + 占用快照)。
6
+ * 每轮无自动记忆召回(memory-tool-recall-design §3/§4),检索由 LLM 经 search_memories 工具主动触发。
7
+ * - 角色包只能手动切换,无 autoMatch / LLM 语义兜底(无角色自动匹配)
8
+ *
9
+ * 设计原则:
10
+ * - 只依赖 Agent 注入的稳定能力(deps),不反向依赖 Agent 私有状态(与 AgentHooks 同构)
11
+ * - 管线逻辑单一真理源:对话层注入/占用快照随管线走
12
+ * - Agent 门面保留编排骨架(thinking 阶段 yield 与调用点),叶子逻辑在此唯一实现
13
+ * - 事件发射(inputTooLarge)经 emit 回调由 Agent 承接
14
+ */
15
+ import { computeContextBudget, isInputTooLarge, estimateOccupancy } from '../agent/budget.js';
16
+ import { AGENT_EVENTS } from '../utils/eventEmitter.js';
17
+ import { logger } from '../logging/logger.js';
18
+ /**
19
+ * 输入增强管线协调器
20
+ *
21
+ * 承载 chat() 回答前的输入增强:记忆召回 + 固定轮次注入。Agent.prepareChatContext
22
+ * 保留编排骨架,本类唯一实现叶子逻辑。
23
+ */
24
+ export class ContextPreparer {
25
+ /** 依赖注入集合(Agent 稳定能力窄面) */
26
+ deps;
27
+ constructor(deps) {
28
+ this.deps = deps;
29
+ }
30
+ /**
31
+ * 运行时更新上下文窗口上限(token)
32
+ *
33
+ * 模型热切换(Agent.setContextWindow)后调用:deps.config.maxContextTokens 为装配期
34
+ * 值拷贝,须显式同步——否则每轮 prepare 的预算派生(computeContextBudget)与占用快照
35
+ * (recordOccupancy 的 totalTokens / outputReserve / free)仍用旧窗口。
36
+ *
37
+ * @param tokens 新窗口 token 数
38
+ */
39
+ setMaxContextTokens(tokens) {
40
+ this.deps.config.maxContextTokens = tokens;
41
+ }
42
+ /**
43
+ * 上下文装配(纯上下文装配,无自动召回)
44
+ *
45
+ * 记忆检索由 LLM 经 search_memories 工具主动触发(builtinToolHandlers.searchMemories),
46
+ * 本方法不代模型猜测"此刻需要什么记忆",只做纯**上下文装配**:预算派生 + roundId 互斥 +
47
+ * 对话层注入 + 上下文占用快照,不返回任何自动召回的注入记忆。
48
+ * 对话层注入恒走 hybrid(最近对话摘要注入),无 fixed/query 分支。
49
+ *
50
+ * @param input 用户输入(仅作顶级锚点预算估算,不再作为召回 query)
51
+ */
52
+ async assembleContext(input) {
53
+ const { deps } = this;
54
+ // ── 上下文预算:动态预算装配(role-pack-spec §C) ──
55
+ // 容量来源:windowTokens = deps.config.maxContextTokens —— 单一数字,已由宿主在构造内核 Agent 前
56
+ // 经内核 resolveContextWindow(window) 解析(per-LLM 窗口为唯一真理源,缺失回退默认 120K)后注入;内核预算路径只消费单一数字,不认 provider/用户双层来源。
57
+ // 固定开销取 system prompt;顶级锚点 = 本轮用户输入(独立划块,永不压缩);完整对话层从最近往回塞到 ~90% 止
58
+ const loop = deps.loop;
59
+ const loopMessages = loop.getMessages();
60
+ const fixedOverheadTokens = loopMessages.length > 0 ? loop.estimateTokens([loopMessages[0]]) : 0;
61
+ const inputTokens = loop.estimateTokens([{ role: 'user', content: input }]);
62
+ const budget = computeContextBudget({
63
+ windowTokens: deps.config.maxContextTokens,
64
+ fixedOverheadTokens,
65
+ inputTokens,
66
+ });
67
+ // 预算透出(预算可视化):暂存最近一轮预算供指标快照展示"预算花到哪"
68
+ deps.loop.recordBudget?.(budget);
69
+ // ── 装配前判负(独立路径) ──
70
+ // 顶级锚点划走后剩余预算低于最小可运行阈值 → 该输入无法支撑至少一轮正文,
71
+ // 装配前确定性降级(跳过召回与完整对话层注入),并通知宿主提示放文件用 read_file 读。
72
+ // 与软上限(摘要饱和)是不同失败原因,不占用软上限统计。
73
+ if (isInputTooLarge(budget)) {
74
+ deps.emit(AGENT_EVENTS.inputTooLarge, {
75
+ inputLength: input.length,
76
+ remainingTokens: budget.remainingTokens,
77
+ hint: '内容过大,建议放进文件用 read_file 读',
78
+ });
79
+ logger.warn({ inputLength: input.length, remainingTokens: budget.remainingTokens }, '装配前判负:输入过大,跳过上下文装配与完整对话层注入');
80
+ return;
81
+ }
82
+ // 派生完整对话层轮次集合(动态轮数 + 第一条必在场,次级锚点)
83
+ const dialogue = loop.getRecentHistoryWithinBudget(budget.dialogueBudgetTokens);
84
+ // ── 完整对话层注入:恒 hybrid(无 fixed/query 分支) ──
85
+ // 对话按预算截断,注入的最近轮次摘要提供结构化视图,避免 LLM 丢失上下文连续性。
86
+ const recentHistory = dialogue.history;
87
+ if (recentHistory.length > 0) {
88
+ const msgs = deps.config.messages;
89
+ const label = msgs?.recentConversationLabel ?? '[Recent conversation]';
90
+ const userLabel = msgs?.userLabel ?? 'User';
91
+ const assistantLabel = msgs?.assistantLabel ?? 'Assistant';
92
+ const recentPrompt = `${label}\n` +
93
+ recentHistory
94
+ .map((m) => `${m.role === 'user' ? userLabel : assistantLabel}:${m.content}`)
95
+ .join('\n');
96
+ loop.injectSystemMessage(recentPrompt);
97
+ logger.debug({ turns: recentHistory.length / 2 }, '最近对话已注入');
98
+ }
99
+ // ── 上下文占用快照(预算可视化):记录各层真实用量,供输入区指示器展示 ──
100
+ // 单一真理源 = 本 prepare 已算出的实际值;宿主/webview 只渲染、不重算。
101
+ // rolePackBase = fixedOverheadTokens(system prompt:persona+rules+技能L1+工具schema)
102
+ // dialogue = 问答闭环完整对话 token(全量 user+assistant,与装配模式无关——容量诚实
103
+ // 统计问答闭环总和;loop.append 侧 refreshOccupancyDialogue 以
104
+ // 同一估算器重算覆盖,prepare 与实时刷新同源同数据,无口径漂移)
105
+ // inputAnchor = 顶级锚点(本轮用户输入,budget.anchorTokens)
106
+ // outputReserve= 窗口 × 输出预留比例(留给模型回答的容量,非已用)
107
+ // free = 总容量 − 各段,≥ 0 收敛(窗口过小/输入过大时各段归零)
108
+ // 注:记忆不占用上下文,占用模型无记忆维度。
109
+ const dialogueTokens = loop.estimateTokens(loop.getConversationMessages());
110
+ // 条数语义:以「用户输入」为计数标准——一个问答闭环(user 消息)计 1 条,
111
+ // 哪怕 assistant 回答残缺/被中止也如实记录(尊重用户保留意图);assistant 不计入条数,但计入 dialogueTokens 容量。
112
+ // 关键:dialogueCount 与 dialogueTokens 统一取 loop.messages 全量(user 计数 + 全量 token),
113
+ // 与装配模式无关——否则 hybrid 模式下 getRecentHistoryWithinBudget 按预算截取「最近 N 轮」
114
+ // 会把最新轮挤掉最旧轮、轮数守恒,导致「发一条消息后完整对话数不涨」(用户实测 bug),
115
+ // 且进窗口径与 loop 侧实时刷新(refreshOccupancyDialogue 按全量重算)产生语义漂移。
116
+ // 统一全量后 prepare 与刷新共用同一估算器、同一数据源(SSOT),杜绝口径分叉。
117
+ const dialogueCount = loop.getConversationMessages().filter((m) => m.role === 'user').length;
118
+ // 占用组装复用 estimateOccupancy(SSOT 单点:free 收敛 + 拼满 + 输出预留,宿主历史会话重算共用)
119
+ deps.loop.recordOccupancy(estimateOccupancy({
120
+ totalTokens: deps.config.maxContextTokens,
121
+ rolePackBaseTokens: fixedOverheadTokens,
122
+ dialogueTokens,
123
+ dialogueCount,
124
+ inputAnchorTokens: budget.anchorTokens,
125
+ }));
126
+ }
127
+ }
128
+ //# sourceMappingURL=contextPreparer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextPreparer.js","sourceRoot":"","sources":["../../src/agent/contextPreparer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * 重复工具调用拦截器实现
3
+ *
4
+ * 策略参数化的宿主扩展点
5
+ *
6
+ * 将"机械重复检测"从 AgentLoop 内部逻辑剥离为独立类,
7
+ * 宿主可通过注入自定义 DuplicateCallInterceptor 实现不同策略:
8
+ * - 按工具名差异化阈值(search 阈值大,delete 阈值小)
9
+ * - 按工具结果内容做语义重复判定
10
+ * - 直接 block(硬拦截)而非 warn(软提醒)
11
+ *
12
+ * 设计哲学:
13
+ * - 默认实现基于"工具名+参数哈希"的机械检测,零配置开箱即用
14
+ * - 接口极简:check() 返回 'ok'/'warn'/'block' 三态
15
+ * - 状态管理在 AgentLoop(避免拦截器实例跨会话状态泄漏)
16
+ */
17
+ import type { DuplicateCallInterceptor, DuplicateCheckContext, DuplicateCheckVerdict } from '../agent/types.js';
18
+ /**
19
+ * 默认重复调用拦截器(基于哈希的机械检测)
20
+ *
21
+ * 策略:对比当前轮与上一轮的工具调用哈希,连续 N 次相同触发 warn。
22
+ * N 由构造参数 threshold 控制(默认 3,表示累计 3 次重复后触发)。
23
+ *
24
+ * 哈希算法:
25
+ * 1. 按工具名 + 参数排序(消除顺序影响)
26
+ * 2. 参数 JSON 规范化(解析后再序列化,消除空白/键顺序差异)
27
+ * 3. 拼接为 "name(args)|name(args)" 格式
28
+ * 4. SHA256 哈希
29
+ */
30
+ export declare class DefaultDuplicateCallInterceptor implements DuplicateCallInterceptor {
31
+ readonly name = "default-hash-interceptor";
32
+ private readonly threshold;
33
+ constructor(threshold?: number);
34
+ /** 当前阈值(loop 据此 SSOT 取阈值,不硬编码) */
35
+ getThreshold(): number;
36
+ /**
37
+ * 检查工具调用是否构成重复死循环
38
+ *
39
+ * @param toolCalls 本轮有效的工具调用列表
40
+ * @param context 上下文信息(含 AgentLoop 已计算的 hash 和 count)
41
+ * @returns 判定结果
42
+ */
43
+ check(toolCalls: readonly {
44
+ id: string;
45
+ function: {
46
+ name: string;
47
+ arguments: string;
48
+ };
49
+ }[], context: DuplicateCheckContext): DuplicateCheckVerdict;
50
+ /**
51
+ * 对工具调用列表生成稳定哈希(供 AgentLoop 和外部使用)
52
+ *
53
+ * 静态方法,方便 AgentLoop 在不持有拦截器实例时也能计算哈希。
54
+ * 序列化规则唯一实现:loop 的调用哈希直接调用本方法,单一实现无镜像。
55
+ *
56
+ * @param toolCalls 工具调用列表
57
+ * @returns SHA256 哈希十六进制字符串;空数组返回空字符串
58
+ */
59
+ static hash(toolCalls: readonly {
60
+ id: string;
61
+ function: {
62
+ name: string;
63
+ arguments: string;
64
+ };
65
+ }[]): string;
66
+ }
67
+ //# sourceMappingURL=duplicateInterceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicateInterceptor.d.ts","sourceRoot":"","sources":["../../src/agent/duplicateInterceptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAG1B;;;;;;;;;;;GAWG;AACH,qBAAa,+BAAgC,YAAW,wBAAwB;IAC9E,QAAQ,CAAC,IAAI,8BAA8B;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,GAAE,MAAU;IAIjC,kCAAkC;IAClC,YAAY,IAAI,MAAM;IAItB;;;;;;OAMG;IACH,KAAK,CACH,SAAS,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,EAAE,EACnF,OAAO,EAAE,qBAAqB,GAC7B,qBAAqB;IAkBxB;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,CACT,SAAS,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,EAAE,GAClF,MAAM;CAuBV"}
@@ -0,0 +1,82 @@
1
+ import { sha256Fingerprint } from '../utils/hash.js';
2
+ /**
3
+ * 默认重复调用拦截器(基于哈希的机械检测)
4
+ *
5
+ * 策略:对比当前轮与上一轮的工具调用哈希,连续 N 次相同触发 warn。
6
+ * N 由构造参数 threshold 控制(默认 3,表示累计 3 次重复后触发)。
7
+ *
8
+ * 哈希算法:
9
+ * 1. 按工具名 + 参数排序(消除顺序影响)
10
+ * 2. 参数 JSON 规范化(解析后再序列化,消除空白/键顺序差异)
11
+ * 3. 拼接为 "name(args)|name(args)" 格式
12
+ * 4. SHA256 哈希
13
+ */
14
+ export class DefaultDuplicateCallInterceptor {
15
+ name = 'default-hash-interceptor';
16
+ threshold;
17
+ constructor(threshold = 3) {
18
+ this.threshold = threshold;
19
+ }
20
+ /** 当前阈值(loop 据此 SSOT 取阈值,不硬编码) */
21
+ getThreshold() {
22
+ return this.threshold;
23
+ }
24
+ /**
25
+ * 检查工具调用是否构成重复死循环
26
+ *
27
+ * @param toolCalls 本轮有效的工具调用列表
28
+ * @param context 上下文信息(含 AgentLoop 已计算的 hash 和 count)
29
+ * @returns 判定结果
30
+ */
31
+ check(toolCalls, context) {
32
+ // 空工具调用列表 → ok
33
+ if (toolCalls.length === 0)
34
+ return 'ok';
35
+ // 哈希不匹配 → ok(工具调用已变化)
36
+ if (context.currentHash === '' || context.currentHash !== context.lastHash) {
37
+ return 'ok';
38
+ }
39
+ // 达到阈值 → warn
40
+ if (context.duplicateCount >= this.threshold) {
41
+ return 'warn';
42
+ }
43
+ // 未达阈值 → ok(让 AgentLoop 继续累计)
44
+ return 'ok';
45
+ }
46
+ /**
47
+ * 对工具调用列表生成稳定哈希(供 AgentLoop 和外部使用)
48
+ *
49
+ * 静态方法,方便 AgentLoop 在不持有拦截器实例时也能计算哈希。
50
+ * 序列化规则唯一实现:loop 的调用哈希直接调用本方法,单一实现无镜像。
51
+ *
52
+ * @param toolCalls 工具调用列表
53
+ * @returns SHA256 哈希十六进制字符串;空数组返回空字符串
54
+ */
55
+ static hash(toolCalls) {
56
+ if (toolCalls.length === 0)
57
+ return '';
58
+ // 按工具名 + 参数排序,消除顺序影响
59
+ const sorted = [...toolCalls].sort((a, b) => {
60
+ const na = a.function.name;
61
+ const nb = b.function.name;
62
+ if (na !== nb)
63
+ return na < nb ? -1 : 1;
64
+ return a.function.arguments < b.function.arguments ? -1 : 1;
65
+ });
66
+ const signature = sorted
67
+ .map((tc) => {
68
+ // 参数 JSON 规范化:解析后再序列化,消除空白/键顺序差异
69
+ let normalizedArgs = tc.function.arguments;
70
+ try {
71
+ normalizedArgs = JSON.stringify(JSON.parse(tc.function.arguments));
72
+ }
73
+ catch {
74
+ // 非 JSON 字符串(如纯文本参数),保持原样
75
+ }
76
+ return `${tc.function.name}(${normalizedArgs})`;
77
+ })
78
+ .join('|');
79
+ return sha256Fingerprint(signature);
80
+ }
81
+ }
82
+ //# sourceMappingURL=duplicateInterceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicateInterceptor.js","sourceRoot":"","sources":["../../src/agent/duplicateInterceptor.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,+BAA+B;IACjC,IAAI,GAAG,0BAA0B,CAAC;IAC1B,SAAS,CAAS;IAEnC,YAAY,YAAoB,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,kCAAkC;IAClC,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CACH,SAAmF,EACnF,OAA8B;QAE9B,eAAe;QACf,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAExC,sBAAsB;QACtB,IAAI,OAAO,CAAC,WAAW,KAAK,EAAE,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,cAAc;QACd,IAAI,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,8BAA8B;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,CACT,SAAmF;QAEnF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,qBAAqB;QACrB,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM;aACrB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;YACV,iCAAiC;YACjC,IAAI,cAAc,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3C,IAAI,CAAC;gBACH,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;YACD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,cAAc,GAAG,CAAC;QAClD,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * 守卫抽象(GuardRail)—— loop 运行时前置拦截型护栏的统一真理源
3
+ *
4
+ * 背景:联网搜索上限 / 提问上限 / 同路径连写止损 / 读取失败硬闸 / 重复读取拦截
5
+ * 这 5 种前置拦截型护栏统一走注册式 guard,避免以「内联 if + 独立计数字段 + 各自文案 +
6
+ * 各自阈值」散落在主循环里、每加一种护栏就改一遍主循环。
7
+ *
8
+ * 本模块收敛目标:**新增一种护栏 = 注册一个 guard(matches/shouldBlock/文案/阈值/life/可选 write 钩子),
9
+ * 主循环零改动**。护栏判定逻辑、判定顺序、提示词、阈值全部收敛到本文件,消除散落重复。
10
+ *
11
+ * 防重双轨正交登记(二者粒度不同不可合并):
12
+ * - a(批级·软提示):duplicateToolCallInterceptor,作用于**整批工具调用**(跨迭代哈希),
13
+ * 语义 = 叙事级死循环提醒(默认实现只返 ok/warn,永不 block),见 loop.handleIteration;
14
+ * - b(主体级·硬拦):本文件 read_dedup 护栏,作用于**同一读取主体**(闭环内同工具+同参数),
15
+ * 语义 = 事实级去重拦截(命中后回填 `[ALREADY_READ]`),前提前 `isCachedResultStillInContext`。
16
+ * 两套去重同一时刻开启、判据/阈值/生命周期互不共享,靠本条登记维系语义边界。
17
+ *
18
+ * 收敛边界(不硬吞的异构护栏,维持各自为政):
19
+ * - duplicateToolCallInterceptor(批级·软提示,见上「防重双轨正交登记」a 轨);
20
+ * - maxIterations/stepBudget(循环终止)、self_review(后处理)——`contextLimit` 已不属此类(它只缩放有效窗口,不终止);
21
+ * - interruptQueue/pause/ask 续跑(暂停-质问-续跑设计,另有定稿文档,不动);
22
+ * - 文件覆盖度台账(fileExposure 分支②回显,见 toolLedger.ts)——形态不同,不收敛。
23
+ *
24
+ * 收敛现状:本模块已按注册序对 5 闸做**真拦截判定**(evaluateBlocked 由 loop 调用,命中回填拒绝文案),
25
+ * loop 只保留最小职责(组 GuardContext + 调 evaluateBlocked 判定 + 调 notifyExec 写侧喂数、
26
+ * reset 归零内部计数状态)。「## 行为护栏」节由 buildPromptSection 收敛注入。
27
+ */
28
+ import { ToolResultCache, type CacheEntry, type DedupSubject } from '../agent/toolResultCache.js';
29
+ /** 护栏类型 id(收敛集合,新增护栏在此扩联合) */
30
+ export type GuardRailId = 'search_limit' | 'ask_limit' | 'write_loop' | 'read_failed' | 'read_dedup';
31
+ /** 命中提示词 id(与 GuardRailPromptId 一一对应,文案收敛到 GUARD_RAIL_PROMPTS) */
32
+ export type GuardRailPromptId = 'search_limit' | 'ask_limit' | 'write_loop_stop' | 'read_failed_limit' | 'already_read' | 'already_read_escalated';
33
+ /** 护栏运行态计数(loop 注入,仅承载 search_limit / ask_limit 两枚;write_loop 连写 / read_failed 失败
34
+ * 计数内聚进各自 guard 实例闭包,经 onExec 自持更新) */
35
+ export interface GuardCounters {
36
+ /** 本闭环内 web_search 调用次数(含被拒绝的)—— search_limit 用 */
37
+ searchCallCount: number;
38
+ /** 本用户输入的提问累计数(life:'perInput')—— ask_limit 用 */
39
+ askCountThisTurn: number;
40
+ }
41
+ /** onExec 写侧喂数上下文:结果处理阶段由 loop 构造,仅承载 feeds 所需字段 + 本次执行结果 */
42
+ export interface GuardExecContext {
43
+ toolName: string;
44
+ /** 原始工具参数 JSON 串(用于 path/subject 提取) */
45
+ argsJson: string;
46
+ toolCallId: string;
47
+ /** 本次执行结果:ok=真实成功 / failed=执行失败 / blocked=被护栏或台账拦截(未真正执行) */
48
+ outcome: 'ok' | 'failed' | 'blocked';
49
+ }
50
+ /** 护栏阈值(运行时由调用方注入 GuardContext;真源分配见下) */
51
+ export interface GuardThresholds {
52
+ /** 同路径连写止损阈值(原 WRITE_LOOP_THRESHOLD = 5):第 N 次触发硬拦 —— 静态真源 GUARD_THRESHOLDS */
53
+ writeLoop: number;
54
+ /** 同主体连续失败硬闸阈值(原默认 3)—— 静态真源 GUARD_THRESHOLDS */
55
+ readFailed: number;
56
+ /** 单次用户输入提问上限(life:'perInput')—— 动态真源 role-pack strategy.askLimit(不塞静态默认) */
57
+ askLimit: number;
58
+ /** 单闭环联网搜索硬上限 —— 动态真源 LOOP_CONSTANTS.MAX_WEB_SEARCH_CALLS(不塞静态默认) */
59
+ maxWebSearch: number;
60
+ }
61
+ /** 静态阈值真源(SSOT):只承载「纯静态、无动态覆盖」的阈值。
62
+ * writeLoop / readFailed 以此为唯一真源;askLimit / maxWebSearch 属动态注入
63
+ * (角色包 strategy / LOOP_CONSTANTS,历史曾把 20/8 塞进静态默认作死值、与运行时覆盖矛盾,经审查清除)。
64
+ * 调用方构造 GuardContext.thresholds 时须以本表为基底补齐两枚动态键。 */
65
+ export declare const GUARD_THRESHOLDS: {
66
+ readonly writeLoop: 5;
67
+ readonly readFailed: 3;
68
+ };
69
+ /** read_dedup 撞墙升级阈值:同主体累计被本护栏硬拦达此值后,后续命中升级为强禁令文案
70
+ * (值 2 = 第 3 次起升级;用户裁决 2026-09-28:第 2 次即升级太激进、第 3 次合适)。
71
+ * 不入 GUARD_THRESHOLDS——它不改变「拦不拦」,只切换文案强度。 */
72
+ export declare const READ_DEDUP_ESCALATE_THRESHOLD = 2;
73
+ /** 单工具 + 本 turn 运行态的护栏判定上下文 */
74
+ export interface GuardContext {
75
+ toolName: string;
76
+ /** 原始工具参数 JSON 串(用于 subject 提取) */
77
+ argsJson: string;
78
+ toolCallId: string;
79
+ /** 工具结果防重缓存(read_dedup 分支①核查用) */
80
+ toolResultCache: ToolResultCache;
81
+ /** 分支①「结果仍是否在上下文」判定(loop 注入:读上下文内容) */
82
+ isCachedResultStillInContext: (hit: CacheEntry) => boolean;
83
+ /** 护栏阈值(loop 构造时填实际值;缺省回落 GUARD_THRESHOLDS) */
84
+ thresholds: GuardThresholds;
85
+ /** 运行态计数(loop 注入,供 search_limit/ask_limit 用;write_loop/read_failed 的计数已在 guard 闭包内) */
86
+ counters: GuardCounters;
87
+ }
88
+ /** 护栏定义(注册一条,主循环零改动) */
89
+ export interface GuardRailDef {
90
+ /** 护栏类型 id */
91
+ id: GuardRailId;
92
+ /** 适用工具判定 */
93
+ matches: (c: GuardContext) => boolean;
94
+ /** 前置拦截判定:true = 需拦截 */
95
+ shouldBlock: (c: GuardContext) => boolean;
96
+ /** true = 真拦截(回填拒绝文案)/ false = 软提示 */
97
+ blocked: boolean;
98
+ /** 命中文案 key(引用 GUARD_RAIL_PROMPTS,勿内联文案);函数形态 = 按 GuardContext 运行态选择
99
+ * (read_dedup 撞墙升级:同主体被硬拦达阈值后切换 already_read_escalated) */
100
+ promptId: GuardRailPromptId | ((c: GuardContext) => GuardRailPromptId);
101
+ /** 模板插值参数(路径 / 次数 / 阈值等);第二参 = evaluateBlocked 已裁决的命中文案 id,
102
+ * 参数按裁决结果分支(promptId 与 promptArgs 构造性一致,阈值判据不重复计算) */
103
+ promptArgs?: (c: GuardContext, chosen: GuardRailPromptId) => Record<string, unknown>;
104
+ /** 生命周期:perInput=按一次用户输入累计(含暂停-续跑链,跨 turn 保留)/ perTurn=按 turn(问答闭环)累计 */
105
+ life: 'perInput' | 'perTurn';
106
+ /** 副钩(仅 search):命中后置 searchDisabled + rebuild system message;须幂等 */
107
+ afterBlock?: (c: GuardContext) => void;
108
+ /** 写侧钩子:结果处理阶段由 loop 对每个 toolCall 调 notifyExec 分发本钩子喂计数
109
+ * (失败+1 / 成功清0 / 连写递增 / 拦截不计)。守卫自持闭包状态的统一入口。 */
110
+ onExec?: (c: GuardExecContext) => void;
111
+ /** 拦截归属钩子:本护栏**作为首个命中护栏**拦下调用时,由 loop 经 `notifyBlocked` 回喂。
112
+ * 与 onExec 的分工:onExec 只知「被某种护栏拦了」(三态喂入,无法区分拦截归属),
113
+ * 本钩子明确「被本护栏拦了」——read_dedup 撞墙升级计数以此喂数,
114
+ * 台账替身回显等非本护栏拦截不会误计。 */
115
+ onBlocked?: (toolName: string, argsJson: string) => void;
116
+ /** 归零 guard 自身内部计数状态(life 过期 / 轮边界由 GuardRail.reset 统一调用) */
117
+ reset?: () => void;
118
+ /** 注入 systemPrompt「## 行为护栏」节的通用约束声明(不强塞逐轮计数) */
119
+ promptGuideline?: string;
120
+ }
121
+ /** 命中结果:命中的护栏 + 渲染后的拒绝文案 */
122
+ export interface GuardHit {
123
+ guardId: GuardRailId;
124
+ message: string;
125
+ }
126
+ /** 提取给定工具的请求主体(无该工具的 subject 提取器 → undefined,即非 info 型工具) */
127
+ export declare function extractSubject(toolName: string, argsJson: string): DedupSubject | undefined;
128
+ export declare const GUARD_RAIL_PROMPTS: Readonly<Record<GuardRailPromptId, string>>;
129
+ /** 渲染护栏命中文案(占位符替换;未知键原样保留) */
130
+ export declare function renderPrompt(promptId: GuardRailPromptId, args?: Record<string, unknown>): string;
131
+ /**
132
+ * 守卫容器(注册表容器 + 统一判定入口)
133
+ *
134
+ * 判定纪律:`evaluateBlocked` 按注册顺序遍历,返回**首个** `matches && shouldBlock` 的硬拦命中。
135
+ * 注册顺序即判定优先级(read_failed 必须先于 read_dedup——失败先于去重判定,与 loop 既有语义一致)。
136
+ *
137
+ * 判定与状态均为真拦截/真状态:evaluateBlocked 由 loop 调用并回填拒绝文案;
138
+ * write_loop/read_failed 的计数状态内聚进 guard 实例闭包,由 notifyExec 写侧喂数、reset 归零。
139
+ */
140
+ export declare class GuardRail {
141
+ /** 有序注册表(注册序即判定序) */
142
+ private readonly registry;
143
+ /** 注册一条护栏(返回 this 便于链式) */
144
+ register(def: GuardRailDef): this;
145
+ /** 注册表(只读视图,供测试/审计盘点) */
146
+ get guards(): ReadonlyArray<GuardRailDef>;
147
+ /** 统一判定入口:按注册序返回首个硬拦命中;无命中返回 undefined */
148
+ evaluateBlocked(c: GuardContext): GuardHit | undefined;
149
+ /** 拦截归属喂数:loop 在「某护栏命中并拦截」时调用,路由到该护栏的 onBlocked
150
+ * (撞墙升级等「只认自己拦的」闭包计数以此喂数;未注册 onBlocked 的护栏为 no-op)。 */
151
+ notifyBlocked(guardId: GuardRailId, toolName: string, argsJson: string): void;
152
+ /** 写侧喂数钩子分发:结果处理阶段由 loop 对每个 toolCall 调此方法。
153
+ * matches 校验复用 GuardContext 判定(构造最小临时 ctx);命中即调 g.onExec 喂计数。 */
154
+ notifyExec(c: GuardExecContext): void;
155
+ /** 归零指定生命周期 guard 的内部计数状态(life 轮边界由 loop 调 resetTurnState 统一触发) */
156
+ reset(life: 'perInput' | 'perTurn'): void;
157
+ /** 生成「## 行为护栏」通用声明节(注入 buildSystemPrompt;只放通用约束,不暴露逐轮计数) */
158
+ buildPromptSection(): string;
159
+ }
160
+ /**
161
+ * 组装一份缺省护栏注册表:覆盖 5 种前置拦截型护栏,判定序 = read_failed 先于 read_dedup。
162
+ *
163
+ * 提供静态判定的**纯函数默认集**,loop 接入时可整表注册;阈值经 ctx.thresholds 由 loop 覆盖为实际值。
164
+ */
165
+ export declare function createDefaultGuards(): GuardRail;
166
+ //# sourceMappingURL=guardRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardRail.d.ts","sourceRoot":"","sources":["../../src/agent/guardRail.ts"],"names":[],"mappings":"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"}