@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,243 @@
1
+ /**
2
+ * 工具结果防重缓存(闭环内有效)
3
+ *
4
+ * 设计意图:LLM 在问答闭环中反复调用 read_file/list_dir/web_search 等信息获取型工具,
5
+ * 同一参数重复调用既浪费 token 又无增量价值(文件未变 / 同 query 网络结果近似)。
6
+ * 本缓存以「闭环内去重」为粒度——闭环结束即清空,跨闭环不复用。
7
+ *
8
+ * 拦截语义与 loop 已有的 web_search MAX_WEB_SEARCH_CALLS / ask_user askLimit 同级:
9
+ * 检测到重复 → blocked=true(不算工具失败)→ 返回 [ALREADY_READ] 拒绝文案。
10
+ *
11
+ * **去重主体是结构化的**(`DedupSubject`),不是预先拼好的字符串 key:
12
+ * 写入(set)/ 命中(check)/ 失效(invalidateFile)三处必须对**同一份主体**判定。
13
+ * 任何一处自行拼 key 都会让三者静默失配——历史缺陷即此形态:key 里加上读取区间后,
14
+ * `invalidateFile` 的 `read_file:${path}` 前缀永远匹配不上 → 文件被改后旧缓存不失效 → 误拦重读。
15
+ *
16
+ * 防重维度:闭环内 + 同 toolName + 同主体语义(路径 + 读取区间 / query)。
17
+ * 不防重:write_file / run_code / run_skill_script 等副作用型工具。
18
+ *
19
+ * 补充导出 `WRITE_PATH_EXTRACTORS`(非防重):写工具**不防重**,但同一 step 内打在同一路径上的
20
+ * 两次写**必须串行**(并行会因读旧快照而互相覆盖)。二者是同一批「副作用型工具」的两面。
21
+ */
22
+ import path from 'node:path';
23
+ // PATH_WRITE_TOOL_NAMES:写工具名集真源(builtinTools 各定义行 `diskWrite:'path'` 声明派生)——
24
+ // 本模块只借其键集组装提取器表,不自存工具名清单。
25
+ import { PATH_WRITE_TOOL_NAMES } from '../agent/builtinTools.js';
26
+ // 正整数解析单一真源(read_file 去重主体 offset/limit 与 builtinToolHandlers 分段预算同规)
27
+ import { positiveInt } from '../utils/math.js';
28
+ /**
29
+ * 路径去重规范化(纯字符串,不触磁盘):统一分隔符 → 消除 `./`、`a//b`、`a/../b` → 去尾部 `/`。
30
+ *
31
+ * 只做「同一写法的等价归并」,**不解析绝对路径**(loop 不认文件系统,项目根属宿主)。
32
+ * 因此 `a.md` 与 `/abs/a.md` 仍是不同主体 —— 这是**保守语义**:
33
+ * 无法确定二者是同一文件时就不该判为重复,判错方向的代价是死锁(见 loop 的拦截前提)。
34
+ */
35
+ export function normalizePathKey(raw) {
36
+ const unified = raw.trim().replace(/\\/g, '/');
37
+ const normalized = path.posix.normalize(unified);
38
+ return normalized.length > 1 ? normalized.replace(/\/+$/, '') : normalized;
39
+ }
40
+ /** 安全解析 args JSON(非法 / 非对象 → undefined) */
41
+ function parseArgs(argsJson) {
42
+ try {
43
+ const parsed = JSON.parse(argsJson);
44
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
45
+ return undefined;
46
+ return parsed;
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ }
52
+ /** 取非空字符串字段(非字符串 / 空串 → undefined) */
53
+ function nonEmptyString(v) {
54
+ return typeof v === 'string' && v.trim() !== '' ? v : undefined;
55
+ }
56
+ /** 内置去重主体生成器集合(SSOT:loop 注册防重拦截时引用) */
57
+ export const DEDUP_SUBJECT_EXTRACTORS = {
58
+ /** read_file 主体 = 规范化路径 + 读取区间(区间语义与 handler 一致) */
59
+ read_file: (argsJson) => {
60
+ const a = parseArgs(argsJson);
61
+ const rawPath = a ? nonEmptyString(a.path) : undefined;
62
+ if (!rawPath)
63
+ return undefined;
64
+ return {
65
+ path: normalizePathKey(rawPath),
66
+ offset: positiveInt(a?.offset) ?? 1,
67
+ limit: positiveInt(a?.limit),
68
+ };
69
+ },
70
+ /** list_dir 主体 = 规范化路径 */
71
+ list_dir: (argsJson) => {
72
+ const a = parseArgs(argsJson);
73
+ const rawPath = a ? nonEmptyString(a.path) : undefined;
74
+ return rawPath ? { path: normalizePathKey(rawPath) } : undefined;
75
+ },
76
+ /** web_search 主体 = query(短时间内同 query 结果近似) */
77
+ web_search: (argsJson) => {
78
+ const a = parseArgs(argsJson);
79
+ const query = a ? nonEmptyString(a.query) : undefined;
80
+ return query ? { query } : undefined;
81
+ },
82
+ /** web_fetch 主体 = 规范化 URL(搜索→抓取闭环第二段;同 URL 抓取两次正文无增量) */
83
+ web_fetch: (argsJson) => {
84
+ const a = parseArgs(argsJson);
85
+ const url = a ? nonEmptyString(a.url) : undefined;
86
+ // URL 只做 trim 归一并滤空 —— 不做路径 normalize(避免 `..`/尾部斜杠误并不同 target)
87
+ return url ? { query: url.trim() } : undefined;
88
+ },
89
+ /** trace_summary 主体 = sessionId(主定位,query 槽)+ roundId(可选子定位,item 槽)—— 同会话不同轮仍是合法增量读取 */
90
+ trace_summary: (argsJson) => {
91
+ const a = parseArgs(argsJson);
92
+ const sessionId = a ? nonEmptyString(a.sessionId) : undefined;
93
+ if (!sessionId)
94
+ return undefined;
95
+ const roundId = a ? nonEmptyString(a.roundId) : undefined;
96
+ return { query: sessionId.trim(), item: roundId?.trim() };
97
+ },
98
+ /** search_memories 主体 = query(与 web_search 同构:只按检索词判重;追更多候选应换 query 或改用 trace_summary 精取) */
99
+ search_memories: (argsJson) => {
100
+ const a = parseArgs(argsJson);
101
+ const query = a ? nonEmptyString(a.query) : undefined;
102
+ return query ? { query } : undefined;
103
+ },
104
+ };
105
+ /** 取「写路径」原始值(写工具的定位参数固定叫 `path`,与 read_file / list_dir 同名字段) */
106
+ function rawPathOf(argsJson) {
107
+ const a = parseArgs(argsJson);
108
+ return a ? nonEmptyString(a.path) : undefined;
109
+ }
110
+ /**
111
+ * 写路径提取器:**仅**覆盖「按 `args.path` 定位、会改盘」的工具。
112
+ *
113
+ * 用途单一:loop 判定「同一 step 内两次写是否打在同一文件上」,从而只对**同路径**串行。
114
+ * 为何必须串行——`write_file` 是「读盘 → 改 → 写盘」,同 step 内并行发起时两次都基于同一份
115
+ * 旧快照,后落地者覆盖先落地者 ⇒ **静默丢内容**(真机实证:`insert` + `append` 同 step 并行,
116
+ * 插入的行被 append 覆盖)。
117
+ *
118
+ * 为何**单独**一份、不并入 `DEDUP_SUBJECT_EXTRACTORS`:那份是**防重**判据(命中即拦截),
119
+ * 而写工具正是被防重**刻意排除**的对象(见文件头「不防重:write_file …」)——并入会让
120
+ * 「同一文件分次追加」被误判为重复调用而拦掉,属语义反转。
121
+ *
122
+ * 键集 = **派生自** `builtinTools` 各定义行的 `diskWrite: 'path'` 声明(构造级单源,禁再
123
+ * 独立枚举工具名);值 = 共用的 `args.path` 提取语义('path' 模式的定义即「目标 = args.path」)。
124
+ * 路径规范化与去重同源(`normalizePathKey`):路径等价语义只有这一套,不另造。
125
+ */
126
+ export const WRITE_PATH_EXTRACTORS = Object.fromEntries(PATH_WRITE_TOOL_NAMES.map((name) => [name, extractArgsPathTarget]));
127
+ /** `'path'` 模式写工具的目标提取:`args.path` → 规范化路径(提取失败返回 undefined,调用方降级屏障) */
128
+ function extractArgsPathTarget(argsJson) {
129
+ const raw = rawPathOf(argsJson);
130
+ return raw ? normalizePathKey(raw) : undefined;
131
+ }
132
+ /** 主体 → 缓存 key(本模块唯一的 key 构造点;用不可打印分隔符,避免与路径 / query / item 内容冲突) */
133
+ function keyOf(toolName, subject) {
134
+ return [
135
+ toolName,
136
+ subject.path ?? '',
137
+ subject.query ?? '',
138
+ subject.item ?? '',
139
+ subject.offset ?? '',
140
+ subject.limit ?? '',
141
+ ].join('\u0001');
142
+ }
143
+ /**
144
+ * 主体 → 人类可读描述(拦截文案出口)。
145
+ *
146
+ * 文案面向 LLM,**不暴露内部 key 格式**:它需要知道的是「哪个文件的哪一段已经在你手上」。
147
+ */
148
+ export function formatDedupSubject(toolName, subject) {
149
+ // 查询/会话类主体(web_search / web_fetch / trace_summary):主定位 + 可选子定位(session·round)
150
+ if (subject.query !== undefined) {
151
+ return subject.item !== undefined ? `${subject.query} · ${subject.item}` : subject.query;
152
+ }
153
+ // 文件类主体(read_file 渲染区间;list_dir 仅路径)
154
+ if (subject.path !== undefined) {
155
+ if (toolName !== 'read_file')
156
+ return subject.path;
157
+ const range = subject.limit !== undefined
158
+ ? `第 ${subject.offset} 行起的 ${subject.limit} 行`
159
+ : `第 ${subject.offset} 行起`;
160
+ return `${subject.path} · ${range}`;
161
+ }
162
+ return '';
163
+ }
164
+ /**
165
+ * 同主体聚合键(工具名 + 规范化 path/query/item),粒度 = 同参。
166
+ *
167
+ * **两个消费语境共用本函数**(SSOT):① `read_failed` 的连续失败计数;
168
+ * ② `read_dedup` 的撞墙升级计数。二者要的都是「工具 + 请求主体」这一个标识,
169
+ * 故共用同一口径——各自另拼 key 会让两套计数对「同一主体」的理解悄悄分叉。
170
+ *
171
+ * 原子分隔符 `\u0002`:不可打印,避免与 path/query/item 的合法内容(文件路径、URL、会话 id)冲突。
172
+ *
173
+ * @param toolName 工具名
174
+ * @param subject 请求主体(由 `DEDUP_SUBJECT_EXTRACTORS` 产出)
175
+ */
176
+ export function failureSubjectKey(toolName, subject) {
177
+ // item 纳入:trace_summary 同 sessionId 不同 roundId 计为不同主体,不把「任一 round 失败」误并到整个会话
178
+ return `${toolName}\u0002${subject.path ?? ''}\u0002${subject.query ?? ''}\u0002${subject.item ?? ''}`;
179
+ }
180
+ /**
181
+ * 闭环内工具结果防重缓存
182
+ *
183
+ * 只负责「同 tool + 同主体」的重复检测。mtime 放行不需要——
184
+ * 文件被 write_file 修改后,loop 结果处理循环会主动 invalidate 同 path 的 read_file 缓存。
185
+ * 比 statSync 更准确(同一 cwd/path 解析链路)、不依赖 projectPath 传递。
186
+ */
187
+ export class ToolResultCache {
188
+ /** Map<key, CacheEntry> */
189
+ cache = new Map();
190
+ /**
191
+ * 检查指定工具调用是否重复
192
+ *
193
+ * @param toolName 工具名(如 'read_file')
194
+ * @param subject 请求主体(由 `DEDUP_SUBJECT_EXTRACTORS` 产出)
195
+ * @returns 已重复则返回首次缓存的条目;否则 undefined
196
+ */
197
+ check(toolName, subject) {
198
+ return this.cache.get(keyOf(toolName, subject));
199
+ }
200
+ /**
201
+ * 失效指定 path 关联的 read_file 缓存(副作用型工具成功后调用,放行后续合法重读)
202
+ *
203
+ * 按 `subject.path` 匹配 —— **该文件所有读取区间一起失效**(文件内容变了,任何区间的旧结果都作废)。
204
+ * `list_dir` 不失效:文件修改不改目录结构。
205
+ *
206
+ * @param rawPath 被修改 / 删除的文件路径
207
+ */
208
+ invalidateFile(rawPath) {
209
+ const target = normalizePathKey(rawPath);
210
+ for (const [k, entry] of this.cache) {
211
+ if (entry.toolName === 'read_file' && entry.subject.path === target) {
212
+ this.cache.delete(k);
213
+ }
214
+ }
215
+ }
216
+ /**
217
+ * 记录一次已执行的工具调用
218
+ *
219
+ * @param toolName 工具名
220
+ * @param subject 请求主体
221
+ * @param iteration 当前迭代序号(用于日志 / 提示文案)
222
+ * @param meta 可选元信息(mtime / toolCallId / 内容指纹)
223
+ */
224
+ set(toolName, subject, iteration, meta) {
225
+ this.cache.set(keyOf(toolName, subject), {
226
+ toolName,
227
+ subject,
228
+ cachedAtIteration: iteration,
229
+ ...(meta?.fileMtime !== undefined ? { fileMtime: meta.fileMtime } : {}),
230
+ ...(meta?.toolCallId !== undefined ? { toolCallId: meta.toolCallId } : {}),
231
+ ...(meta?.fingerprint !== undefined ? { fingerprint: meta.fingerprint } : {}),
232
+ });
233
+ }
234
+ /** 闭环结束清空(跨闭环不复用) */
235
+ clear() {
236
+ this.cache.clear();
237
+ }
238
+ /** 当前缓存条目数(调试 / 监控用) */
239
+ get size() {
240
+ return this.cache.size;
241
+ }
242
+ }
243
+ //# sourceMappingURL=toolResultCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolResultCache.js","sourceRoot":"","sources":["../../src/agent/toolResultCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * 工具结果卸载原语(大文本统一通道 · 入口关)
3
+ *
4
+ * 「带问题取件 → 一次一份 → 提炼 → 原文落盘 → 只积攒情报 + 留引用」
5
+ * (大文本统一通道 §6.2)的**门前换鞋**动作:单条 tool 消息超阈时把原文写入磁盘,
6
+ * 上下文只留「路径 + 预览 + 续读提示」。
7
+ *
8
+ * **单一原语 + 单一收口**:本函数是唯一的落盘实现;唯一调用点是 `AgentLoop.appendToolMessage`
9
+ * (loop 唯一 tool 写点,一处覆盖五个调用点:工具结果 / `[ASK_ANSWER]` / `[ASK_ABORTED]` /
10
+ * `[ASK_SUSPENDED]` / `[TOOL_ABORTED]`)。
11
+ * 上下文中 tool 消息只可能由该写点产生,入口关覆盖后无需事后压缩扫描
12
+ *(「读者先亡、写者后死」;实证见 §6.2 结论二)。
13
+ *
14
+ * **同步实现(有意为之,勿改异步)**:`AgentLoop.answerQuestion()` 是**同步公开 API**(宿主调用后
15
+ * 立即 `continueAfterPause()`),异步落盘会沿 `appendToolMessage → answerQuestion` 传染成内核公开
16
+ * API 破坏性变更。落盘是罕见路径(仅超阈时)、单次 ≤ 数百 KB,同步写阻塞可忽略;内核已有同步 fs
17
+ * 生产先例(`security/pathGuard.ts: realpathSync`、`logging/logger.ts: mkdirSync`)。同步还使
18
+ * **写失败可当场降级**(返回原文入上下文 + warn),不引入「悬空引用」这一新失败模式。
19
+ *
20
+ * **落盘内容 = 传入内容原样**(即 wrapped 后的那条消息全文):不做 unwrap —— 剥离包裹需要一份与
21
+ * `wrapToolResult` 模板对称的解析实现(模板一改即失配),而「路径指向的内容与原本将入上下文的内容
22
+ * 完全一致」是更简单也更自洽的语义。
23
+ */
24
+ /** 卸载结果:进入上下文的内容 + 是否真的落盘 + 产物路径 */
25
+ export interface ToolResultOffloadOutcome {
26
+ /** 进入上下文的内容:落盘成功 = 「路径 + 预览 + 续读提示」;未超阈 / 写失败 = 原文 */
27
+ content: string;
28
+ /** 是否真的落盘(false = 未超阈,或写失败已降级) */
29
+ offloaded: boolean;
30
+ /** 产物绝对路径(仅 offloaded=true 时存在) */
31
+ filePath?: string;
32
+ }
33
+ /** 卸载参数 */
34
+ export interface ToolResultOffloadOptions {
35
+ /**
36
+ * 落盘目录(**必传**):由装配注入项目 `memoraDir` 下的 outputs 子目录。
37
+ * 内核不派生落点 —— 信任根外的路径 `read_file` 读不回,等于假引用(OFFLOAD-1 教训)。
38
+ */
39
+ offloadDir: string;
40
+ /**
41
+ * 落盘阈值(token,**含包裹判据口径**)。
42
+ * 默认 `LOOP_CONSTANTS.SINGLE_TOOL_RESULT_MAX_TOKENS` —— 与 `read_file` 分段上限同键同源。
43
+ */
44
+ thresholdTokens?: number;
45
+ /** 预览字符数(默认 1,000) */
46
+ previewChars?: number;
47
+ }
48
+ /**
49
+ * 单条工具结果超阈 → 落盘 + 生成替换文本;否则原样返回。
50
+ *
51
+ * 判据 `estimateTokensText(content) > 阈值`(严格大于):`read_file` 产出(含包裹)恒 ≤ 阈值,
52
+ * 故**结构性不落盘**,回取产物不会再次落盘 → 无限嵌套不可能。
53
+ *
54
+ * @param content 即将进入上下文的 tool 消息内容(已 wrapped)
55
+ * @param opts 落盘目录(必传)与可覆盖的阈值 / 预览长度
56
+ * @returns 替换后内容 + 落盘事实(写失败时 `offloaded=false` 且内容原样)
57
+ */
58
+ export declare function offloadLargeToolResult(content: string, opts: ToolResultOffloadOptions): ToolResultOffloadOutcome;
59
+ //# sourceMappingURL=toolResultOffload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolResultOffload.d.ts","sourceRoot":"","sources":["../../src/agent/toolResultOffload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAYH,oCAAoC;AACpC,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,WAAW;AACX,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,wBAAwB,GAC7B,wBAAwB,CA+B1B"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * 工具结果卸载原语(大文本统一通道 · 入口关)
3
+ *
4
+ * 「带问题取件 → 一次一份 → 提炼 → 原文落盘 → 只积攒情报 + 留引用」
5
+ * (大文本统一通道 §6.2)的**门前换鞋**动作:单条 tool 消息超阈时把原文写入磁盘,
6
+ * 上下文只留「路径 + 预览 + 续读提示」。
7
+ *
8
+ * **单一原语 + 单一收口**:本函数是唯一的落盘实现;唯一调用点是 `AgentLoop.appendToolMessage`
9
+ * (loop 唯一 tool 写点,一处覆盖五个调用点:工具结果 / `[ASK_ANSWER]` / `[ASK_ABORTED]` /
10
+ * `[ASK_SUSPENDED]` / `[TOOL_ABORTED]`)。
11
+ * 上下文中 tool 消息只可能由该写点产生,入口关覆盖后无需事后压缩扫描
12
+ *(「读者先亡、写者后死」;实证见 §6.2 结论二)。
13
+ *
14
+ * **同步实现(有意为之,勿改异步)**:`AgentLoop.answerQuestion()` 是**同步公开 API**(宿主调用后
15
+ * 立即 `continueAfterPause()`),异步落盘会沿 `appendToolMessage → answerQuestion` 传染成内核公开
16
+ * API 破坏性变更。落盘是罕见路径(仅超阈时)、单次 ≤ 数百 KB,同步写阻塞可忽略;内核已有同步 fs
17
+ * 生产先例(`security/pathGuard.ts: realpathSync`、`logging/logger.ts: mkdirSync`)。同步还使
18
+ * **写失败可当场降级**(返回原文入上下文 + warn),不引入「悬空引用」这一新失败模式。
19
+ *
20
+ * **落盘内容 = 传入内容原样**(即 wrapped 后的那条消息全文):不做 unwrap —— 剥离包裹需要一份与
21
+ * `wrapToolResult` 模板对称的解析实现(模板一改即失配),而「路径指向的内容与原本将入上下文的内容
22
+ * 完全一致」是更简单也更自洽的语义。
23
+ */
24
+ import { mkdirSync, writeFileSync } from 'node:fs';
25
+ import path from 'node:path';
26
+ import { randomBytes } from 'node:crypto';
27
+ import { logger } from '../logging/logger.js';
28
+ import { LOOP_CONSTANTS } from '../agent/constants.js';
29
+ import { estimateTokensText } from '../agent/contextManager.js';
30
+ /** 预览字符数默认值(替换文本自身远小于单条上限,故不会二次触发落盘) */
31
+ const DEFAULT_PREVIEW_CHARS = 1_000;
32
+ /**
33
+ * 单条工具结果超阈 → 落盘 + 生成替换文本;否则原样返回。
34
+ *
35
+ * 判据 `estimateTokensText(content) > 阈值`(严格大于):`read_file` 产出(含包裹)恒 ≤ 阈值,
36
+ * 故**结构性不落盘**,回取产物不会再次落盘 → 无限嵌套不可能。
37
+ *
38
+ * @param content 即将进入上下文的 tool 消息内容(已 wrapped)
39
+ * @param opts 落盘目录(必传)与可覆盖的阈值 / 预览长度
40
+ * @returns 替换后内容 + 落盘事实(写失败时 `offloaded=false` 且内容原样)
41
+ */
42
+ export function offloadLargeToolResult(content, opts) {
43
+ const threshold = opts.thresholdTokens ?? LOOP_CONSTANTS.SINGLE_TOOL_RESULT_MAX_TOKENS;
44
+ const tokens = estimateTokensText(content);
45
+ if (tokens <= threshold) {
46
+ return { content, offloaded: false };
47
+ }
48
+ const previewChars = opts.previewChars ?? DEFAULT_PREVIEW_CHARS;
49
+ const fileName = `${Date.now()}_${randomBytes(4).toString('hex')}.txt`;
50
+ const filePath = path.join(opts.offloadDir, fileName);
51
+ try {
52
+ mkdirSync(opts.offloadDir, { recursive: true });
53
+ writeFileSync(filePath, content, 'utf-8');
54
+ }
55
+ catch (err) {
56
+ // 写失败 → 原样入上下文(不截断、不造假引用);空间回收交由截断线兜底
57
+ logger.warn({ err, filePath, tokens }, '工具结果卸载失败,已降级为原文入上下文(未产生引用)');
58
+ return { content, offloaded: false };
59
+ }
60
+ const preview = content.slice(0, previewChars);
61
+ const omitted = Math.max(0, content.length - previewChars);
62
+ return {
63
+ content: `[工具结果已卸载至磁盘] 原文 ${content.length} 字符(≈${tokens} tokens)写入:${filePath}\n` +
64
+ `[预览(前 ${previewChars} 字符)]\n${preview}…\n` +
65
+ `[省略 ${omitted} 字符。需要完整内容请用 read_file 读取上述路径,大文件可配合 offset/limit 分段读取]`,
66
+ offloaded: true,
67
+ filePath,
68
+ };
69
+ }
70
+ //# sourceMappingURL=toolResultOffload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolResultOffload.js","sourceRoot":"","sources":["../../src/agent/toolResultOffload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,wCAAwC;AACxC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AA4BpC;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,IAA8B;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,IAAI,cAAc,CAAC,6BAA6B,CAAC;IACvF,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,qBAAqB,CAAC;IAChE,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sCAAsC;QACtC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAC;QACrE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;IAE3D,OAAO;QACL,OAAO,EACL,mBAAmB,OAAO,CAAC,MAAM,QAAQ,MAAM,cAAc,QAAQ,IAAI;YACzE,SAAS,YAAY,UAAU,OAAO,KAAK;YAC3C,OAAO,OAAO,yDAAyD;QACzE,SAAS,EAAE,IAAI;QACf,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * 工具执行器(ToolRunner)— 从 AgentLoop 抽出的「单工具执行」独立单元
3
+ *
4
+ * 承载一个工具的完整生命周期:执行前检查(三重闸门)→ 并发/中断竞争执行 → 异常转结构化错误串。
5
+ * 状态独立(不触碰 loop 工作记忆 / 指标 / 自主步标志),输入工具调用元素、输出结果串并触发
6
+ * onToolExecuted,故可独立单测。loop 的 executeToolCalls 只做批量编排,逐工具委托本执行器。
7
+ *
8
+ * 依赖经 deps 注入(execute / preExecutionCheck / onToolExecuted / getStrategy / tracer),
9
+ * 其中 getStrategy 每次执行读最新策略——setStrategy 的动态更新在此依然生效。
10
+ */
11
+ import type { PreExecutionResult } from '../agent/types.js';
12
+ import type { ToolDefinition } from '../agent/toolExecutor.js';
13
+ import type { L2RuntimeStrategy } from '../role-pack/types.js';
14
+ import type { ITracer } from '../agent/tracer.js';
15
+ /** 工具调用元素契约(OpenAI 协议结构)——单一真源 llm/types.ToolCall(Message.toolCalls 同源) */
16
+ import type { ToolCall } from '../llm/types.js';
17
+ /** 一次工具调用(LLM 输出的工具调用元素)——SSOT:形状真源在 llm/types.ToolCall(协议契约单一实现;re-export 保留本文件测试判据点) */
18
+ export type { ToolCall };
19
+ /** ToolRunner 依赖注入(loop 稳定的窄面;策略动态经 getStrategy 读取) */
20
+ export interface ToolRunnerDeps {
21
+ /** 执行单个工具(loop 的 opts.toolExecutor) */
22
+ execute: (name: string, args: string) => Promise<string>;
23
+ /** 内置工具定义(只读闸查 readonly 标记) */
24
+ builtinTools?: ToolDefinition[];
25
+ /** 宿主执行前检查(拒绝 / 跳过 / 改写参数) */
26
+ preExecutionCheck?: (name: string, args: string) => PreExecutionResult;
27
+ /** 工具执行完成回调(outbox 幂等记录是否已执行) */
28
+ onToolExecuted?: (name: string, args: string, result: string, ok: boolean) => void;
29
+ /** 读最新 L2 策略(toolReadonly 随 setStrategy 动态生效) */
30
+ getStrategy: () => L2RuntimeStrategy;
31
+ /** 可观测性 Tracer */
32
+ tracer: ITracer;
33
+ }
34
+ /**
35
+ * 工具执行器:单工具执行单元(异常捕获转结构化错误串回传 LLM,不中断对话)。
36
+ */
37
+ export declare class ToolRunner {
38
+ private readonly deps;
39
+ constructor(deps: ToolRunnerDeps);
40
+ /**
41
+ * 执行单个工具(并行独立执行单元,无共享状态,可安全并发)。
42
+ * @param tc 工具调用元素
43
+ * @param signal 中止信号(与工具执行 race,signal 先 abort 返回 ABORTED 错误串)
44
+ * @returns 执行结果串(成功文本或 [ERR:TOOL:code] 错误串)
45
+ */
46
+ runOne(tc: ToolCall, signal?: AbortSignal): Promise<string>;
47
+ /**
48
+ * 执行前检查:按顺序叠加两层闸门——只读 → 宿主 preExecutionCheck,任一命中提前返回。
49
+ * (内核不提供"审批"闸门:无"需审批"标签与回调,审批决策统一归宿主 preExecutionCheck。)
50
+ */
51
+ private applyPrechecks;
52
+ /**
53
+ * 工具执行与 signal abort 竞争包裹。toolExecutor 签名不接受 signal,无法真正中断;
54
+ * 用 Promise.race 竞争,signal 先 abort 则返回 [ERR:TOOL:ABORTED](而非抛 AbortError,
55
+ * 避免破坏"工具失败回传 LLM"契约;ABORTED 不入错误码体系,不触发 Reflection)
56
+ */
57
+ private raceToolWithSignal;
58
+ }
59
+ //# sourceMappingURL=toolRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRunner.d.ts","sourceRoot":"","sources":["../../src/agent/toolRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAMjD,2EAA2E;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,0FAA0F;AAC1F,YAAY,EAAE,QAAQ,EAAE,CAAC;AAQzB,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,+BAA+B;IAC/B,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAChC,8BAA8B;IAC9B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,kBAAkB,CAAC;IACvE,iCAAiC;IACjC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IACnF,iDAAiD;IACjD,WAAW,EAAE,MAAM,iBAAiB,CAAC;IACrC,kBAAkB;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,cAAc;IAEjD;;;;;OAKG;IACG,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA6DjE;;;OAGG;IACH,OAAO,CAAC,cAAc;IAuCtB;;;;OAIG;YACW,kBAAkB;CA4BjC"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * 工具执行器(ToolRunner)— 从 AgentLoop 抽出的「单工具执行」独立单元
3
+ *
4
+ * 承载一个工具的完整生命周期:执行前检查(三重闸门)→ 并发/中断竞争执行 → 异常转结构化错误串。
5
+ * 状态独立(不触碰 loop 工作记忆 / 指标 / 自主步标志),输入工具调用元素、输出结果串并触发
6
+ * onToolExecuted,故可独立单测。loop 的 executeToolCalls 只做批量编排,逐工具委托本执行器。
7
+ *
8
+ * 依赖经 deps 注入(execute / preExecutionCheck / onToolExecuted / getStrategy / tracer),
9
+ * 其中 getStrategy 每次执行读最新策略——setStrategy 的动态更新在此依然生效。
10
+ */
11
+ import { TRACE_SPANS } from '../agent/tracer.js';
12
+ import { MemoraError } from '../utils/errors.js';
13
+ import { toError } from '../utils/toError.js';
14
+ import { logger } from '../logging/logger.js';
15
+ /**
16
+ * 工具执行器:单工具执行单元(异常捕获转结构化错误串回传 LLM,不中断对话)。
17
+ */
18
+ export class ToolRunner {
19
+ deps;
20
+ constructor(deps) {
21
+ this.deps = deps;
22
+ }
23
+ /**
24
+ * 执行单个工具(并行独立执行单元,无共享状态,可安全并发)。
25
+ * @param tc 工具调用元素
26
+ * @param signal 中止信号(与工具执行 race,signal 先 abort 返回 ABORTED 错误串)
27
+ * @returns 执行结果串(成功文本或 [ERR:TOOL:code] 错误串)
28
+ */
29
+ async runOne(tc, signal) {
30
+ // 工具执行 Span(并发时多个 span 时间重叠,tracer 可观测并发度)
31
+ const span = this.deps.tracer.startSpan(TRACE_SPANS.TOOL_EXEC, {
32
+ toolName: tc.function.name,
33
+ });
34
+ try {
35
+ // 记录工具调用参数到 Span(可观测性增强:宿主可通过 span 详情看到每次工具调用的完整参数)
36
+ span.setAttribute('args', tc.function.arguments);
37
+ // 执行前检查:三重闸门输出三态决策(allow / skip / deny)
38
+ const decision = this.applyPrechecks(tc);
39
+ if (decision.kind === 'denied') {
40
+ span.setAttribute('denied', true);
41
+ return decision.result;
42
+ }
43
+ if (decision.kind === 'skip') {
44
+ span.setAttribute('skipped', true);
45
+ return decision.result;
46
+ }
47
+ // raceToolWithSignal 兼容 signal 中断(每个调用独立 race,监听器无并发副作用)
48
+ const result = await this.raceToolWithSignal(tc.function.name, decision.args, signal);
49
+ // 通知上层工具执行完成(供 outbox 幂等模式记录是否已执行)
50
+ const ok = !result.startsWith('[ERR');
51
+ this.deps.onToolExecuted?.(tc.function.name, decision.args, result, ok);
52
+ // 记录工具执行结果摘要到 Span(可观测性增强:宿主可追踪每次工具调用的结果)
53
+ span.setAttribute('result', result.slice(0, 200));
54
+ span.setAttribute('ok', ok);
55
+ return result;
56
+ }
57
+ catch (err) {
58
+ // 捕获异常转为结构化错误串回传 LLM 自行调整策略,避免传播中断对话
59
+ const e = toError(err);
60
+ span.recordException(e);
61
+ if (err instanceof MemoraError) {
62
+ const code = err.errorCode ?? 'UNKNOWN';
63
+ // 失败串末尾附带 suggestions(人读的「下一步」也要进 LLM 上下文):
64
+ // 若建议只在 `error.format()` 给宿主 UI、LLM 只收 title+detail——首击失败后
65
+ // LLM 收不到「使用 list_dir 查看目录结构」这类确切指令,只能凭证据自己悟(多绕一次)。
66
+ // 证据(siblingDirHint 清单)在 detail 内,本拼接补上命令式建议,双管齐下。
67
+ const result = `[ERR:TOOL:${code}] 错误:${err.title}${err.detail ? ` — ${err.detail}` : ''}` +
68
+ (err.suggestions.length > 0 ? ` 建议:${err.suggestions.join(';')}` : '');
69
+ logger.warn({ tool: tc.function.name, errorCode: code, title: err.title }, '工具执行失败,错误已回传给 LLM');
70
+ this.deps.onToolExecuted?.(tc.function.name, tc.function.arguments, result, false);
71
+ return result;
72
+ }
73
+ else {
74
+ const result = `[ERR:TOOL:UNKNOWN] 错误:工具执行异常 — ${e.message}`;
75
+ logger.error({ tool: tc.function.name, err }, '工具执行异常');
76
+ this.deps.onToolExecuted?.(tc.function.name, tc.function.arguments, result, false);
77
+ return result;
78
+ }
79
+ }
80
+ finally {
81
+ span.end();
82
+ }
83
+ }
84
+ /**
85
+ * 执行前检查:按顺序叠加两层闸门——只读 → 宿主 preExecutionCheck,任一命中提前返回。
86
+ * (内核不提供"审批"闸门:无"需审批"标签与回调,审批决策统一归宿主 preExecutionCheck。)
87
+ */
88
+ applyPrechecks(tc) {
89
+ const name = tc.function.name;
90
+ const args = tc.function.arguments;
91
+ const strategy = this.deps.getStrategy();
92
+ // ① 只读闸:toolReadonly='readonly' 阻止非只读工具
93
+ if (strategy.toolReadonly === 'readonly') {
94
+ const toolDef = this.deps.builtinTools?.find((t) => t.name === name);
95
+ if (toolDef && !toolDef.readonly) {
96
+ logger.warn({ tool: name }, '工具只读模式:阻止写入工具执行');
97
+ return {
98
+ kind: 'denied',
99
+ result: `[ERR:TOOL:READONLY_DENIED] 工具 "${name}" 是写入操作,在只读模式下不可用`,
100
+ };
101
+ }
102
+ }
103
+ // ② 宿主 preExecutionCheck:拒绝 / 跳过 / 放行(可改写参数)
104
+ const preCheck = this.deps.preExecutionCheck?.(name, args);
105
+ if (preCheck?.denied) {
106
+ const reason = preCheck.reason ?? '工具调用被拒绝';
107
+ logger.warn({ tool: name, reason }, '工具调用被拒绝(执行前检查)');
108
+ // PERMISSION_DENIED 不可重试,LLM 见后会调整策略而非重试
109
+ return { kind: 'denied', result: `[ERR:TOOL:PERMISSION_DENIED] ${reason}` };
110
+ }
111
+ if (preCheck?.skip) {
112
+ const result = preCheck.previousResult ?? '[SKIP:TOOL:IDEMPOTENT] 工具已执行(outbox 模式跳过)';
113
+ logger.debug({ tool: name, argsSignature: args.slice(0, 80) }, '工具已执行,跳过(仅一次语义)');
114
+ return { kind: 'skip', result };
115
+ }
116
+ // 放行:有改写参数则用改写后的执行(审计/参数改写)
117
+ return { kind: 'execute', args: preCheck?.overrideArgs ?? args };
118
+ }
119
+ /**
120
+ * 工具执行与 signal abort 竞争包裹。toolExecutor 签名不接受 signal,无法真正中断;
121
+ * 用 Promise.race 竞争,signal 先 abort 则返回 [ERR:TOOL:ABORTED](而非抛 AbortError,
122
+ * 避免破坏"工具失败回传 LLM"契约;ABORTED 不入错误码体系,不触发 Reflection)
123
+ */
124
+ async raceToolWithSignal(name, args, signal) {
125
+ const { execute } = this.deps;
126
+ // 无 signal 时直接执行工具(保持原行为,测试场景常用)
127
+ if (!signal) {
128
+ return execute(name, args);
129
+ }
130
+ // signal 已 abort:直接返回中断错误,不发起工具调用
131
+ if (signal.aborted) {
132
+ return '[ERR:TOOL:ABORTED] 错误:工具执行被中断';
133
+ }
134
+ // abort 监听 Promise(signal abort 时 resolve 错误串);onAbort 提外层便于 race 后清理
135
+ let onAbort = null;
136
+ const abortPromise = new Promise((resolve) => {
137
+ onAbort = () => resolve('[ERR:TOOL:ABORTED] 错误:工具执行被中断');
138
+ signal.addEventListener('abort', onAbort, { once: true });
139
+ });
140
+ // race 结束清理监听器,避免并发工具调用累积残留监听器({ once: true } 不保证未触发时被移除)
141
+ return Promise.race([execute(name, args), abortPromise]).finally(() => {
142
+ if (onAbort)
143
+ signal.removeEventListener('abort', onAbort);
144
+ });
145
+ }
146
+ }
147
+ //# sourceMappingURL=toolRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRunner.js","sourceRoot":"","sources":["../../src/agent/toolRunner.ts"],"names":[],"mappings":"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"}