@zooique/memora 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/CHANGELOG.md +1028 -0
  2. package/README.en.md +305 -0
  3. package/README.md +303 -148
  4. package/config.example.json +43 -0
  5. package/dist/agent/agent.d.ts +438 -295
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +1368 -836
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +117 -39
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +574 -71
  12. package/dist/agent/assembler.js.map +1 -1
  13. package/dist/agent/budget.d.ts +131 -0
  14. package/dist/agent/budget.d.ts.map +1 -0
  15. package/dist/agent/budget.js +128 -0
  16. package/dist/agent/budget.js.map +1 -0
  17. package/dist/agent/builtinToolHandlers.d.ts +229 -17
  18. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  19. package/dist/agent/builtinToolHandlers.js +758 -70
  20. package/dist/agent/builtinToolHandlers.js.map +1 -1
  21. package/dist/agent/builtinTools.d.ts +198 -7
  22. package/dist/agent/builtinTools.d.ts.map +1 -1
  23. package/dist/agent/builtinTools.js +646 -14
  24. package/dist/agent/builtinTools.js.map +1 -1
  25. package/dist/agent/compaction.d.ts +93 -0
  26. package/dist/agent/compaction.d.ts.map +1 -0
  27. package/dist/agent/compaction.js +192 -0
  28. package/dist/agent/compaction.js.map +1 -0
  29. package/dist/agent/constants.d.ts +139 -18
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +154 -18
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +126 -76
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +197 -135
  36. package/dist/agent/contextManager.js.map +1 -1
  37. package/dist/agent/contextPreparer.d.ts +78 -0
  38. package/dist/agent/contextPreparer.d.ts.map +1 -0
  39. package/dist/agent/contextPreparer.js +128 -0
  40. package/dist/agent/contextPreparer.js.map +1 -0
  41. package/dist/agent/duplicateInterceptor.d.ts +67 -0
  42. package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
  43. package/dist/agent/duplicateInterceptor.js +82 -0
  44. package/dist/agent/duplicateInterceptor.js.map +1 -0
  45. package/dist/agent/guardRail.d.ts +166 -0
  46. package/dist/agent/guardRail.d.ts.map +1 -0
  47. package/dist/agent/guardRail.js +333 -0
  48. package/dist/agent/guardRail.js.map +1 -0
  49. package/dist/agent/loop.d.ts +718 -253
  50. package/dist/agent/loop.d.ts.map +1 -1
  51. package/dist/agent/loop.js +2215 -648
  52. package/dist/agent/loop.js.map +1 -1
  53. package/dist/agent/managers/archiveCoordinator.d.ts +21 -74
  54. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  55. package/dist/agent/managers/archiveCoordinator.js +32 -105
  56. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  57. package/dist/agent/managers/chatLockManager.d.ts +20 -88
  58. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  59. package/dist/agent/managers/chatLockManager.js +31 -103
  60. package/dist/agent/managers/chatLockManager.js.map +1 -1
  61. package/dist/agent/managers/dedupManager.d.ts +85 -0
  62. package/dist/agent/managers/dedupManager.d.ts.map +1 -0
  63. package/dist/agent/managers/dedupManager.js +248 -0
  64. package/dist/agent/managers/dedupManager.js.map +1 -0
  65. package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
  66. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
  67. package/dist/agent/managers/goalConsistencyChecker.js +178 -0
  68. package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
  69. package/dist/agent/managers/llmCaller.d.ts +124 -0
  70. package/dist/agent/managers/llmCaller.d.ts.map +1 -0
  71. package/dist/agent/managers/llmCaller.js +417 -0
  72. package/dist/agent/managers/llmCaller.js.map +1 -0
  73. package/dist/agent/managers/llmJudgeHelper.d.ts +21 -0
  74. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
  75. package/dist/agent/managers/llmJudgeHelper.js +32 -0
  76. package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
  77. package/dist/agent/managers/loopMetrics.d.ts +58 -0
  78. package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
  79. package/dist/agent/managers/loopMetrics.js +68 -0
  80. package/dist/agent/managers/loopMetrics.js.map +1 -0
  81. package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
  82. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  83. package/dist/agent/managers/memoryAdvisor.js +56 -192
  84. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  85. package/dist/agent/managers/memoryGovernance.d.ts +24 -0
  86. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
  87. package/dist/agent/managers/memoryGovernance.js +46 -0
  88. package/dist/agent/managers/memoryGovernance.js.map +1 -0
  89. package/dist/agent/managers/memoryInspector.d.ts +59 -393
  90. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  91. package/dist/agent/managers/memoryInspector.js +92 -736
  92. package/dist/agent/managers/memoryInspector.js.map +1 -1
  93. package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
  94. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
  95. package/dist/agent/managers/roundSummaryGenerator.js +201 -0
  96. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
  97. package/dist/agent/managers/sessionArchiver.d.ts +19 -63
  98. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  99. package/dist/agent/managers/sessionArchiver.js +83 -157
  100. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  101. package/dist/agent/managers/sessionManager.d.ts +286 -57
  102. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  103. package/dist/agent/managers/sessionManager.js +846 -85
  104. package/dist/agent/managers/sessionManager.js.map +1 -1
  105. package/dist/agent/managers/sessionNamer.d.ts +35 -0
  106. package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
  107. package/dist/agent/managers/sessionNamer.js +104 -0
  108. package/dist/agent/managers/sessionNamer.js.map +1 -0
  109. package/dist/agent/managers/streamAccumulator.d.ts +20 -0
  110. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
  111. package/dist/agent/managers/streamAccumulator.js +15 -0
  112. package/dist/agent/managers/streamAccumulator.js.map +1 -0
  113. package/dist/agent/managers/textPolishManager.d.ts +8 -44
  114. package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
  115. package/dist/agent/managers/textPolishManager.js +12 -47
  116. package/dist/agent/managers/textPolishManager.js.map +1 -1
  117. package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
  118. package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
  119. package/dist/agent/managers/toolCallHelpers.js +161 -0
  120. package/dist/agent/managers/toolCallHelpers.js.map +1 -0
  121. package/dist/agent/managers/workProjection.d.ts +57 -87
  122. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  123. package/dist/agent/managers/workProjection.js +166 -246
  124. package/dist/agent/managers/workProjection.js.map +1 -1
  125. package/dist/agent/messageHistory.d.ts +134 -84
  126. package/dist/agent/messageHistory.d.ts.map +1 -1
  127. package/dist/agent/messageHistory.js +419 -133
  128. package/dist/agent/messageHistory.js.map +1 -1
  129. package/dist/agent/needsPlanning.d.ts +28 -0
  130. package/dist/agent/needsPlanning.d.ts.map +1 -0
  131. package/dist/agent/needsPlanning.js +68 -0
  132. package/dist/agent/needsPlanning.js.map +1 -0
  133. package/dist/agent/seed/index.d.ts +11 -0
  134. package/dist/agent/seed/index.d.ts.map +1 -0
  135. package/dist/agent/seed/index.js +10 -0
  136. package/dist/agent/seed/index.js.map +1 -0
  137. package/dist/agent/seed/orchestrator.d.ts +83 -0
  138. package/dist/agent/seed/orchestrator.d.ts.map +1 -0
  139. package/dist/agent/seed/orchestrator.js +260 -0
  140. package/dist/agent/seed/orchestrator.js.map +1 -0
  141. package/dist/agent/seed/prepare.d.ts +49 -0
  142. package/dist/agent/seed/prepare.d.ts.map +1 -0
  143. package/dist/agent/seed/prepare.js +107 -0
  144. package/dist/agent/seed/prepare.js.map +1 -0
  145. package/dist/agent/seed/types.d.ts +115 -0
  146. package/dist/agent/seed/types.d.ts.map +1 -0
  147. package/dist/agent/seed/types.js +15 -0
  148. package/dist/agent/seed/types.js.map +1 -0
  149. package/dist/agent/sessionStateMachine.d.ts +78 -0
  150. package/dist/agent/sessionStateMachine.d.ts.map +1 -0
  151. package/dist/agent/sessionStateMachine.js +182 -0
  152. package/dist/agent/sessionStateMachine.js.map +1 -0
  153. package/dist/agent/taskTableRenderer.d.ts +51 -0
  154. package/dist/agent/taskTableRenderer.d.ts.map +1 -0
  155. package/dist/agent/taskTableRenderer.js +115 -0
  156. package/dist/agent/taskTableRenderer.js.map +1 -0
  157. package/dist/agent/toolExecutor.d.ts +255 -9
  158. package/dist/agent/toolExecutor.d.ts.map +1 -1
  159. package/dist/agent/toolExecutor.js +956 -20
  160. package/dist/agent/toolExecutor.js.map +1 -1
  161. package/dist/agent/toolLedger.d.ts +120 -0
  162. package/dist/agent/toolLedger.d.ts.map +1 -0
  163. package/dist/agent/toolLedger.js +149 -0
  164. package/dist/agent/toolLedger.js.map +1 -0
  165. package/dist/agent/toolResultCache.d.ts +134 -0
  166. package/dist/agent/toolResultCache.d.ts.map +1 -0
  167. package/dist/agent/toolResultCache.js +243 -0
  168. package/dist/agent/toolResultCache.js.map +1 -0
  169. package/dist/agent/toolResultOffload.d.ts +59 -0
  170. package/dist/agent/toolResultOffload.d.ts.map +1 -0
  171. package/dist/agent/toolResultOffload.js +70 -0
  172. package/dist/agent/toolResultOffload.js.map +1 -0
  173. package/dist/agent/toolRunner.d.ts +59 -0
  174. package/dist/agent/toolRunner.d.ts.map +1 -0
  175. package/dist/agent/toolRunner.js +147 -0
  176. package/dist/agent/toolRunner.js.map +1 -0
  177. package/dist/agent/tracer.d.ts +99 -107
  178. package/dist/agent/tracer.d.ts.map +1 -1
  179. package/dist/agent/tracer.js +24 -69
  180. package/dist/agent/tracer.js.map +1 -1
  181. package/dist/agent/types.d.ts +512 -162
  182. package/dist/agent/types.d.ts.map +1 -1
  183. package/dist/agent/types.js +2 -51
  184. package/dist/agent/types.js.map +1 -1
  185. package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
  186. package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
  187. package/dist/code-exec/codeExecutionProvider.js +57 -0
  188. package/dist/code-exec/codeExecutionProvider.js.map +1 -0
  189. package/dist/code-exec/types.d.ts +37 -0
  190. package/dist/code-exec/types.d.ts.map +1 -0
  191. package/dist/code-exec/types.js +12 -0
  192. package/dist/code-exec/types.js.map +1 -0
  193. package/dist/config/expandEnvVars.d.ts +22 -0
  194. package/dist/config/expandEnvVars.d.ts.map +1 -0
  195. package/dist/config/expandEnvVars.js +38 -0
  196. package/dist/config/expandEnvVars.js.map +1 -0
  197. package/dist/config/loader.d.ts +59 -242
  198. package/dist/config/loader.d.ts.map +1 -1
  199. package/dist/config/loader.js +237 -194
  200. package/dist/config/loader.js.map +1 -1
  201. package/dist/index.d.ts +69 -74
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +93 -63
  204. package/dist/index.js.map +1 -1
  205. package/dist/llm/abortSignal.d.ts +2 -3
  206. package/dist/llm/abortSignal.d.ts.map +1 -1
  207. package/dist/llm/abortSignal.js +2 -3
  208. package/dist/llm/abortSignal.js.map +1 -1
  209. package/dist/llm/factory.d.ts +29 -25
  210. package/dist/llm/factory.d.ts.map +1 -1
  211. package/dist/llm/factory.js +34 -69
  212. package/dist/llm/factory.js.map +1 -1
  213. package/dist/llm/openaiCompatible.d.ts +25 -40
  214. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  215. package/dist/llm/openaiCompatible.js +181 -129
  216. package/dist/llm/openaiCompatible.js.map +1 -1
  217. package/dist/llm/provider.d.ts +29 -42
  218. package/dist/llm/provider.d.ts.map +1 -1
  219. package/dist/llm/provider.js +11 -10
  220. package/dist/llm/provider.js.map +1 -1
  221. package/dist/llm/types.d.ts +54 -11
  222. package/dist/llm/types.d.ts.map +1 -1
  223. package/dist/llm/types.js +0 -5
  224. package/dist/llm/types.js.map +1 -1
  225. package/dist/logging/logger.d.ts +8 -29
  226. package/dist/logging/logger.d.ts.map +1 -1
  227. package/dist/logging/logger.js +43 -233
  228. package/dist/logging/logger.js.map +1 -1
  229. package/dist/logging/loggerInterface.d.ts +9 -8
  230. package/dist/logging/loggerInterface.d.ts.map +1 -1
  231. package/dist/memory/gcService.d.ts +164 -0
  232. package/dist/memory/gcService.d.ts.map +1 -0
  233. package/dist/memory/gcService.js +215 -0
  234. package/dist/memory/gcService.js.map +1 -0
  235. package/dist/memory/governance.d.ts +17 -0
  236. package/dist/memory/governance.d.ts.map +1 -0
  237. package/dist/memory/governance.js +17 -0
  238. package/dist/memory/governance.js.map +1 -0
  239. package/dist/memory/inMemoryRoundStore.d.ts +124 -0
  240. package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
  241. package/dist/memory/inMemoryRoundStore.js +216 -0
  242. package/dist/memory/inMemoryRoundStore.js.map +1 -0
  243. package/dist/memory/inMemorySessionStore.d.ts +92 -0
  244. package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
  245. package/dist/memory/inMemorySessionStore.js +219 -0
  246. package/dist/memory/inMemorySessionStore.js.map +1 -0
  247. package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
  248. package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
  249. package/dist/memory/inMemorySessionViewLoader.js +183 -0
  250. package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
  251. package/dist/memory/inMemoryStorage.d.ts +26 -141
  252. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  253. package/dist/memory/inMemoryStorage.js +48 -187
  254. package/dist/memory/inMemoryStorage.js.map +1 -1
  255. package/dist/memory/keywordsTouch.d.ts +20 -0
  256. package/dist/memory/keywordsTouch.d.ts.map +1 -0
  257. package/dist/memory/keywordsTouch.js +25 -0
  258. package/dist/memory/keywordsTouch.js.map +1 -0
  259. package/dist/memory/lockManager.d.ts +7 -2
  260. package/dist/memory/lockManager.d.ts.map +1 -1
  261. package/dist/memory/lockManager.js +35 -11
  262. package/dist/memory/lockManager.js.map +1 -1
  263. package/dist/memory/projectManager.d.ts +30 -128
  264. package/dist/memory/projectManager.d.ts.map +1 -1
  265. package/dist/memory/projectManager.js +39 -171
  266. package/dist/memory/projectManager.js.map +1 -1
  267. package/dist/memory/projectRegistry.d.ts +22 -37
  268. package/dist/memory/projectRegistry.d.ts.map +1 -1
  269. package/dist/memory/projectRegistry.js +78 -85
  270. package/dist/memory/projectRegistry.js.map +1 -1
  271. package/dist/memory/roundStore.d.ts +629 -0
  272. package/dist/memory/roundStore.d.ts.map +1 -0
  273. package/dist/memory/roundStore.js +116 -0
  274. package/dist/memory/roundStore.js.map +1 -0
  275. package/dist/memory/sessionStore.d.ts +70 -61
  276. package/dist/memory/sessionStore.d.ts.map +1 -1
  277. package/dist/memory/sessionStore.js +23 -1
  278. package/dist/memory/sessionStore.js.map +1 -1
  279. package/dist/memory/sessionViewLoader.d.ts +141 -0
  280. package/dist/memory/sessionViewLoader.d.ts.map +1 -0
  281. package/dist/memory/sessionViewLoader.js +65 -0
  282. package/dist/memory/sessionViewLoader.js.map +1 -0
  283. package/dist/memory/sourceValidation.d.ts +18 -9
  284. package/dist/memory/sourceValidation.d.ts.map +1 -1
  285. package/dist/memory/sourceValidation.js +35 -29
  286. package/dist/memory/sourceValidation.js.map +1 -1
  287. package/dist/memory/storageInterface.d.ts +45 -126
  288. package/dist/memory/storageInterface.d.ts.map +1 -1
  289. package/dist/memory/types.d.ts +82 -168
  290. package/dist/memory/types.d.ts.map +1 -1
  291. package/dist/memory/types.js +116 -79
  292. package/dist/memory/types.js.map +1 -1
  293. package/dist/project-search/projectSearchProvider.d.ts +29 -0
  294. package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
  295. package/dist/project-search/projectSearchProvider.js +57 -0
  296. package/dist/project-search/projectSearchProvider.js.map +1 -0
  297. package/dist/project-search/terms.d.ts +14 -0
  298. package/dist/project-search/terms.d.ts.map +1 -0
  299. package/dist/project-search/terms.js +68 -0
  300. package/dist/project-search/terms.js.map +1 -0
  301. package/dist/project-search/types.d.ts +139 -0
  302. package/dist/project-search/types.d.ts.map +1 -0
  303. package/dist/project-search/types.js +8 -0
  304. package/dist/project-search/types.js.map +1 -0
  305. package/dist/role-pack/capabilityMap.d.ts +28 -0
  306. package/dist/role-pack/capabilityMap.d.ts.map +1 -0
  307. package/dist/role-pack/capabilityMap.js +56 -0
  308. package/dist/role-pack/capabilityMap.js.map +1 -0
  309. package/dist/role-pack/constants.d.ts +21 -0
  310. package/dist/role-pack/constants.d.ts.map +1 -0
  311. package/dist/role-pack/constants.js +21 -0
  312. package/dist/role-pack/constants.js.map +1 -0
  313. package/dist/role-pack/rolePackManager.d.ts +269 -0
  314. package/dist/role-pack/rolePackManager.d.ts.map +1 -0
  315. package/dist/role-pack/rolePackManager.js +1082 -0
  316. package/dist/role-pack/rolePackManager.js.map +1 -0
  317. package/dist/role-pack/strategyKeys.d.ts +100 -0
  318. package/dist/role-pack/strategyKeys.d.ts.map +1 -0
  319. package/dist/role-pack/strategyKeys.js +184 -0
  320. package/dist/role-pack/strategyKeys.js.map +1 -0
  321. package/dist/role-pack/strategyResolver.d.ts +109 -0
  322. package/dist/role-pack/strategyResolver.d.ts.map +1 -0
  323. package/dist/role-pack/strategyResolver.js +304 -0
  324. package/dist/role-pack/strategyResolver.js.map +1 -0
  325. package/dist/role-pack/types.d.ts +237 -0
  326. package/dist/role-pack/types.d.ts.map +1 -0
  327. package/dist/role-pack/types.js +8 -0
  328. package/dist/role-pack/types.js.map +1 -0
  329. package/dist/role-pack/validator.d.ts +38 -0
  330. package/dist/role-pack/validator.d.ts.map +1 -0
  331. package/dist/role-pack/validator.js +436 -0
  332. package/dist/role-pack/validator.js.map +1 -0
  333. package/dist/security/pathGuard.d.ts +69 -72
  334. package/dist/security/pathGuard.d.ts.map +1 -1
  335. package/dist/security/pathGuard.js +151 -131
  336. package/dist/security/pathGuard.js.map +1 -1
  337. package/dist/skill/skillLayer3.d.ts +91 -0
  338. package/dist/skill/skillLayer3.d.ts.map +1 -0
  339. package/dist/skill/skillLayer3.js +104 -0
  340. package/dist/skill/skillLayer3.js.map +1 -0
  341. package/dist/skill/skillManager.d.ts +127 -56
  342. package/dist/skill/skillManager.d.ts.map +1 -1
  343. package/dist/skill/skillManager.js +318 -163
  344. package/dist/skill/skillManager.js.map +1 -1
  345. package/dist/skill/skillScriptRunner.d.ts +97 -0
  346. package/dist/skill/skillScriptRunner.d.ts.map +1 -0
  347. package/dist/skill/skillScriptRunner.js +271 -0
  348. package/dist/skill/skillScriptRunner.js.map +1 -0
  349. package/dist/skill/types.d.ts +73 -17
  350. package/dist/skill/types.d.ts.map +1 -1
  351. package/dist/skill/types.js +5 -1
  352. package/dist/skill/types.js.map +1 -1
  353. package/dist/utils/array.d.ts +5 -6
  354. package/dist/utils/array.d.ts.map +1 -1
  355. package/dist/utils/array.js +6 -6
  356. package/dist/utils/array.js.map +1 -1
  357. package/dist/utils/atomicWrite.d.ts +8 -0
  358. package/dist/utils/atomicWrite.d.ts.map +1 -0
  359. package/dist/utils/atomicWrite.js +31 -0
  360. package/dist/utils/atomicWrite.js.map +1 -0
  361. package/dist/utils/backgroundTask.d.ts +38 -0
  362. package/dist/utils/backgroundTask.d.ts.map +1 -0
  363. package/dist/utils/backgroundTask.js +117 -0
  364. package/dist/utils/backgroundTask.js.map +1 -0
  365. package/dist/utils/configResourceManager.d.ts +79 -0
  366. package/dist/utils/configResourceManager.d.ts.map +1 -0
  367. package/dist/utils/configResourceManager.js +150 -0
  368. package/dist/utils/configResourceManager.js.map +1 -0
  369. package/dist/utils/errors.d.ts +48 -56
  370. package/dist/utils/errors.d.ts.map +1 -1
  371. package/dist/utils/errors.js +60 -58
  372. package/dist/utils/errors.js.map +1 -1
  373. package/dist/utils/eventEmitter.d.ts +141 -63
  374. package/dist/utils/eventEmitter.d.ts.map +1 -1
  375. package/dist/utils/eventEmitter.js +50 -35
  376. package/dist/utils/eventEmitter.js.map +1 -1
  377. package/dist/utils/fileSafe.d.ts +20 -0
  378. package/dist/utils/fileSafe.d.ts.map +1 -0
  379. package/dist/utils/fileSafe.js +56 -0
  380. package/dist/utils/fileSafe.js.map +1 -0
  381. package/dist/utils/frontmatter.d.ts +2 -3
  382. package/dist/utils/frontmatter.d.ts.map +1 -1
  383. package/dist/utils/frontmatter.js +6 -5
  384. package/dist/utils/frontmatter.js.map +1 -1
  385. package/dist/utils/hash.d.ts +12 -0
  386. package/dist/utils/hash.d.ts.map +1 -0
  387. package/dist/utils/hash.js +27 -0
  388. package/dist/utils/hash.js.map +1 -0
  389. package/dist/utils/http.d.ts +17 -0
  390. package/dist/utils/http.d.ts.map +1 -0
  391. package/dist/utils/http.js +29 -0
  392. package/dist/utils/http.js.map +1 -0
  393. package/dist/utils/json.d.ts +1 -1
  394. package/dist/utils/json.js +1 -1
  395. package/dist/utils/math.d.ts +34 -1
  396. package/dist/utils/math.d.ts.map +1 -1
  397. package/dist/utils/math.js +47 -14
  398. package/dist/utils/math.js.map +1 -1
  399. package/dist/utils/objects.d.ts +2 -3
  400. package/dist/utils/objects.d.ts.map +1 -1
  401. package/dist/utils/objects.js +2 -3
  402. package/dist/utils/objects.js.map +1 -1
  403. package/dist/utils/recallDefaults.d.ts +16 -0
  404. package/dist/utils/recallDefaults.d.ts.map +1 -0
  405. package/dist/utils/recallDefaults.js +16 -0
  406. package/dist/utils/recallDefaults.js.map +1 -0
  407. package/dist/utils/safeTimer.d.ts +8 -36
  408. package/dist/utils/safeTimer.d.ts.map +1 -1
  409. package/dist/utils/safeTimer.js +9 -37
  410. package/dist/utils/safeTimer.js.map +1 -1
  411. package/dist/utils/scanner.d.ts +97 -17
  412. package/dist/utils/scanner.d.ts.map +1 -1
  413. package/dist/utils/scanner.js +269 -47
  414. package/dist/utils/scanner.js.map +1 -1
  415. package/dist/utils/segmenter.d.ts +20 -29
  416. package/dist/utils/segmenter.d.ts.map +1 -1
  417. package/dist/utils/segmenter.js +230 -88
  418. package/dist/utils/segmenter.js.map +1 -1
  419. package/dist/utils/strings.d.ts +15 -32
  420. package/dist/utils/strings.d.ts.map +1 -1
  421. package/dist/utils/strings.js +25 -44
  422. package/dist/utils/strings.js.map +1 -1
  423. package/dist/utils/time.d.ts +37 -0
  424. package/dist/utils/time.d.ts.map +1 -1
  425. package/dist/utils/time.js +56 -0
  426. package/dist/utils/time.js.map +1 -1
  427. package/dist/utils/toError.d.ts +13 -1
  428. package/dist/utils/toError.d.ts.map +1 -1
  429. package/dist/utils/toError.js +18 -1
  430. package/dist/utils/toError.js.map +1 -1
  431. package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
  432. package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
  433. package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
  434. package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
  435. package/dist/web-fetch/types.d.ts +30 -0
  436. package/dist/web-fetch/types.d.ts.map +1 -0
  437. package/dist/web-fetch/types.js +7 -0
  438. package/dist/web-fetch/types.js.map +1 -0
  439. package/dist/web-fetch/webFetchProvider.d.ts +10 -0
  440. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
  441. package/dist/web-fetch/webFetchProvider.js +28 -0
  442. package/dist/web-fetch/webFetchProvider.js.map +1 -0
  443. package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
  444. package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
  445. package/dist/web-search/fetchWebSearchProvider.js +199 -0
  446. package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
  447. package/dist/web-search/types.d.ts +46 -0
  448. package/dist/web-search/types.d.ts.map +1 -0
  449. package/dist/web-search/types.js +2 -0
  450. package/dist/{persona → web-search}/types.js.map +1 -1
  451. package/dist/web-search/webSearchProvider.d.ts +10 -0
  452. package/dist/web-search/webSearchProvider.d.ts.map +1 -0
  453. package/dist/web-search/webSearchProvider.js +30 -0
  454. package/dist/web-search/webSearchProvider.js.map +1 -0
  455. package/docs/architecture/role-pack-authoring-guide.md +243 -0
  456. package/docs/architecture/role-pack-spec.md +767 -0
  457. package/docs/memora-api-reference.md +1175 -0
  458. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +843 -0
  459. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
  460. package/package.json +105 -83
  461. package/role-packs/README.md +41 -0
  462. package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
  463. package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
  464. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
  465. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
  466. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
  467. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
  468. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
  469. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
  470. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
  471. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
  472. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
  473. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
  474. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
  475. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
  476. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
  477. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
  478. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
  479. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
  480. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
  481. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
  482. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
  483. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
  484. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
  485. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +441 -0
  486. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
  487. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
  488. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
  489. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
  490. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
  491. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
  492. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
  493. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +48 -0
  494. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
  495. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
  496. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
  497. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
  498. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
  499. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
  500. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
  501. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
  502. package/dist/agent/guardrail.d.ts +0 -47
  503. package/dist/agent/guardrail.d.ts.map +0 -1
  504. package/dist/agent/guardrail.js +0 -51
  505. package/dist/agent/guardrail.js.map +0 -1
  506. package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
  507. package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
  508. package/dist/agent/managers/autoConfigRefiner.js +0 -150
  509. package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
  510. package/dist/agent/managers/configManager.d.ts +0 -125
  511. package/dist/agent/managers/configManager.d.ts.map +0 -1
  512. package/dist/agent/managers/configManager.js +0 -194
  513. package/dist/agent/managers/configManager.js.map +0 -1
  514. package/dist/agent/managers/insightExtractor.d.ts +0 -139
  515. package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
  516. package/dist/agent/managers/insightExtractor.js +0 -401
  517. package/dist/agent/managers/insightExtractor.js.map +0 -1
  518. package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -198
  519. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
  520. package/dist/agent/managers/memoryDecayScheduler.js +0 -349
  521. package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
  522. package/dist/agent/managers/relationBuilder.d.ts +0 -131
  523. package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
  524. package/dist/agent/managers/relationBuilder.js +0 -192
  525. package/dist/agent/managers/relationBuilder.js.map +0 -1
  526. package/dist/agent/personaMatcher.d.ts +0 -29
  527. package/dist/agent/personaMatcher.d.ts.map +0 -1
  528. package/dist/agent/personaMatcher.js +0 -60
  529. package/dist/agent/personaMatcher.js.map +0 -1
  530. package/dist/agent/userFactExtractor.d.ts +0 -25
  531. package/dist/agent/userFactExtractor.d.ts.map +0 -1
  532. package/dist/agent/userFactExtractor.js +0 -81
  533. package/dist/agent/userFactExtractor.js.map +0 -1
  534. package/dist/eval/evalRunner.d.ts +0 -94
  535. package/dist/eval/evalRunner.d.ts.map +0 -1
  536. package/dist/eval/evalRunner.js +0 -141
  537. package/dist/eval/evalRunner.js.map +0 -1
  538. package/dist/eval/evalTypes.d.ts +0 -148
  539. package/dist/eval/evalTypes.d.ts.map +0 -1
  540. package/dist/eval/evalTypes.js +0 -118
  541. package/dist/eval/evalTypes.js.map +0 -1
  542. package/dist/eval/scenarios.d.ts +0 -33
  543. package/dist/eval/scenarios.d.ts.map +0 -1
  544. package/dist/eval/scenarios.js +0 -109
  545. package/dist/eval/scenarios.js.map +0 -1
  546. package/dist/llm/embedding.d.ts +0 -67
  547. package/dist/llm/embedding.d.ts.map +0 -1
  548. package/dist/llm/embedding.js +0 -184
  549. package/dist/llm/embedding.js.map +0 -1
  550. package/dist/memory/hybridMerge.d.ts +0 -54
  551. package/dist/memory/hybridMerge.d.ts.map +0 -1
  552. package/dist/memory/hybridMerge.js +0 -36
  553. package/dist/memory/hybridMerge.js.map +0 -1
  554. package/dist/memory/inMemoryRelationStore.d.ts +0 -51
  555. package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
  556. package/dist/memory/inMemoryRelationStore.js +0 -65
  557. package/dist/memory/inMemoryRelationStore.js.map +0 -1
  558. package/dist/memory/loader.d.ts +0 -49
  559. package/dist/memory/loader.d.ts.map +0 -1
  560. package/dist/memory/loader.js +0 -93
  561. package/dist/memory/loader.js.map +0 -1
  562. package/dist/memory/recall.d.ts +0 -66
  563. package/dist/memory/recall.d.ts.map +0 -1
  564. package/dist/memory/recall.js +0 -142
  565. package/dist/memory/recall.js.map +0 -1
  566. package/dist/memory/relationStore.d.ts +0 -78
  567. package/dist/memory/relationStore.d.ts.map +0 -1
  568. package/dist/memory/relationStore.js +0 -2
  569. package/dist/memory/relationStore.js.map +0 -1
  570. package/dist/memory/store.d.ts +0 -50
  571. package/dist/memory/store.d.ts.map +0 -1
  572. package/dist/memory/store.js +0 -161
  573. package/dist/memory/store.js.map +0 -1
  574. package/dist/memory/userProfile.d.ts +0 -156
  575. package/dist/memory/userProfile.d.ts.map +0 -1
  576. package/dist/memory/userProfile.js +0 -320
  577. package/dist/memory/userProfile.js.map +0 -1
  578. package/dist/memory/vectorStore.d.ts +0 -185
  579. package/dist/memory/vectorStore.d.ts.map +0 -1
  580. package/dist/memory/vectorStore.js +0 -257
  581. package/dist/memory/vectorStore.js.map +0 -1
  582. package/dist/persona/personaManager.d.ts +0 -160
  583. package/dist/persona/personaManager.d.ts.map +0 -1
  584. package/dist/persona/personaManager.js +0 -414
  585. package/dist/persona/personaManager.js.map +0 -1
  586. package/dist/persona/types.d.ts +0 -32
  587. package/dist/persona/types.d.ts.map +0 -1
  588. package/dist/persona/types.js +0 -5
@@ -1,12 +1,16 @@
1
- /**
2
- * LLM Provider 抽象接口
3
- * 所有 LLM 实现(DeepSeek / 豆包 / OpenAI / Mock)必须实现此接口
4
- * 详见 ADR-003
5
- */
1
+ /** LLM Provider 抽象接口:所有 LLM 实现(DeepSeek/豆包/OpenAI/Mock)必须实现 */
6
2
  import type { LlmChunk } from '../llm/types.js';
7
3
  export interface Message {
8
4
  role: 'system' | 'user' | 'assistant' | 'tool';
9
5
  content: string;
6
+ /**
7
+ * 轮次 ID(可选):标识该消息归属的「问答轮次」。
8
+ * 由 loop 在写入 user/assistant/tool 消息时附上当前 currentRoundId,
9
+ * 作为替换式压缩(第一级 LRU)取 round-summary 的单一真理源——
10
+ * roundId 随消息携带,不依赖任何外部序列的尾部对齐,杜绝错位替换。
11
+ */
12
+ roundId?: string;
13
+ name?: string;
10
14
  toolCalls?: Array<{
11
15
  id: string;
12
16
  type: 'function';
@@ -30,11 +34,10 @@ export interface ChatOptions {
30
34
  };
31
35
  }>;
32
36
  /**
33
- * 结构化输出约束(OpenAI response_format 兼容协议)
34
- *
35
- * 当 Provider 支持 structured output 且工具定义标记 strict 时,
36
- * AgentLoop 自动生成 json_schema 约束,强制 LLM 输出合法 tool_call。
37
- * 不支持的 Provider 静默跳过,fallback 到纯文本 tool_call 模式。
37
+ * 结构化输出约束(OpenAI Function Calling 响应格式约束)。
38
+ * 注意:response_format 不能与 tools 同时使用(OpenAI 协议限制),故 AgentLoop 默认不生成它
39
+ * (见 loop.ts buildChatOptions 注释)——此处仅为调用方显式传入时的可选能力孔,不宣称任何
40
+ * 「fallback 到纯文本 tool_call」的静默降级(文本出口不是可调用通道)。
38
41
  */
39
42
  response_format?: {
40
43
  type: 'json_schema';
@@ -44,48 +47,32 @@ export interface ChatOptions {
44
47
  schema: Record<string, unknown>;
45
48
  };
46
49
  };
47
- /**
48
- * 强制不使用流式(预留字段,当前无消费者)
49
- *
50
- * openaiCompatible 始终以 stream:true 发起请求(chat() 返回 AsyncIterable)。
51
- * 本字段保留用于未来"非流式回退"场景(如低延迟短回复或 Provider 不支持 SSE 时)。
52
- * 保留在公共 API 中以维持 ChatOptions 契约稳定。
53
- */
54
- stream?: boolean;
55
- /**
56
- * 中止信号:用于取消正在进行的 LLM 请求
57
- *
58
- * AgentLoop 在用户取消对话时传入 AbortSignal,
59
- * Provider 应将 signal 传给底层 fetch/stream 读取,确保请求可被中断。
60
- */
50
+ /** 推理深度控制:'low'|'medium'|'high',Provider 不支持时静默忽略 */
51
+ reasoning_effort?: 'low' | 'medium' | 'high';
52
+ /** 中止信号:用户取消时传入,Provider 应传给底层 fetch/stream 以支持中断 */
61
53
  signal?: AbortSignal;
62
- /**
63
- * 请求超时(毫秒)。默认 120 秒。
64
- * 超时后抛出 networkError,由 callLlmWithRetry 决定是否重试。
65
- */
54
+ /** 请求超时(毫秒,默认 120s):超时抛 networkError,由 callLlmWithRetry 决定是否重试 */
66
55
  timeoutMs?: number;
67
56
  }
68
- /**
69
- * LLM Provider 抽象类
70
- * 实现类需实现 chat() 流式方法
71
- */
57
+ /** LLM Provider 抽象类:实现类需实现 chat() 流式方法 */
72
58
  export declare abstract class LlmProvider {
73
59
  abstract readonly name: string;
74
60
  /**
75
- * 是否支持结构化输出(response_format json_schema)
61
+ * 是否支持原生工具调用(OpenAI Function Calling 的 tools 协议)。
76
62
  *
77
- * 默认 false,子类可覆盖。用于非 tool_call 场景的结构化输出约束
78
- * (如归档摘要强制 JSON、配置建议提取等)。调用方在构造 ChatOptions
79
- * 时显式传入 response_format,Provider 应将其透传到请求 body。
63
+ * 与 supportsStructuredOutput 互斥(response_format 不能与 tools 同时使用,OpenAI 协议限制):
64
+ * - 支持 tools → loop 走原生工具通道(列工具 + 传 tools 参数)。
65
+ * - 支持 structured → loop 传 response_format(JSON mode 回落)。
66
+ * - 两者皆 false → 无工具能力,loop 收起工具清单并显式告知(可观测,不静默)。
80
67
  *
81
- * 注意:response_format 不能与 tools 同时使用(OpenAI 协议限制),
82
- * tool_calls 走独立的 SSE delta 流式协议,无需此约束。
68
+ * 默认 **true**(存量行为):云 LLM 绝大多数支持原生 FC(有工具集就传 tools,与历史一致)。
69
+ * 本地运行时(Ollama/LM Studio 等)是否支持原生 FC 无法从 baseUrl 推断,须在宿主配置时
70
+ * 显式置 false(互斥双能力位)。
83
71
  */
72
+ readonly supportsToolCalling: boolean;
73
+ /** 是否支持结构化输出(默认 false)。注意:response_format 不能与 tools 同时使用(OpenAI 协议限制) */
84
74
  readonly supportsStructuredOutput: boolean;
85
- /**
86
- * 流式对话
87
- * 返回 AsyncIterable,每项是一个增量块
88
- */
75
+ /** 流式对话:返回 AsyncIterable,每项是一个增量块 */
89
76
  abstract chat(messages: Message[], opts?: ChatOptions): AsyncIterable<LlmChunk>;
90
77
  }
91
78
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAEhB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/C,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACrC,CAAC;KACH,CAAC,CAAC;IACH;;;;;;OAMG;IACH,eAAe,CAAC,EAAE;QAChB,IAAI,EAAE,aAAa,CAAC;QACpB,WAAW,EAAE;YACX,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,OAAO,CAAC;YAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACjC,CAAC;KACH,CAAC;IACF;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,8BAAsB,WAAW;IAC/B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B;;;;;;;;;OASG;IACH,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAS;IAEnD;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC;CAChF"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/C,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACrC,CAAC;KACH,CAAC,CAAC;IACH;;;;;OAKG;IACH,eAAe,CAAC,EAAE;QAChB,IAAI,EAAE,aAAa,CAAC;QACpB,WAAW,EAAE;YACX,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,OAAO,CAAC;YAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACjC,CAAC;KACH,CAAC;IACF,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7C,qDAAqD;IACrD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0CAA0C;AAC1C,8BAAsB,WAAW;IAC/B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAQ;IAE7C,yEAAyE;IACzE,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAS;IAEnD,qCAAqC;IACrC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC;CAChF"}
@@ -1,18 +1,19 @@
1
- /**
2
- * LLM Provider 抽象类
3
- * 实现类需实现 chat() 流式方法
4
- */
1
+ /** LLM Provider 抽象类:实现类需实现 chat() 流式方法 */
5
2
  export class LlmProvider {
6
3
  /**
7
- * 是否支持结构化输出(response_format json_schema)
4
+ * 是否支持原生工具调用(OpenAI Function Calling 的 tools 协议)。
8
5
  *
9
- * 默认 false,子类可覆盖。用于非 tool_call 场景的结构化输出约束
10
- * (如归档摘要强制 JSON、配置建议提取等)。调用方在构造 ChatOptions
11
- * 时显式传入 response_format,Provider 应将其透传到请求 body。
6
+ * 与 supportsStructuredOutput 互斥(response_format 不能与 tools 同时使用,OpenAI 协议限制):
7
+ * - 支持 tools → loop 走原生工具通道(列工具 + 传 tools 参数)。
8
+ * - 支持 structured → loop 传 response_format(JSON mode 回落)。
9
+ * - 两者皆 false → 无工具能力,loop 收起工具清单并显式告知(可观测,不静默)。
12
10
  *
13
- * 注意:response_format 不能与 tools 同时使用(OpenAI 协议限制),
14
- * tool_calls 走独立的 SSE delta 流式协议,无需此约束。
11
+ * 默认 **true**(存量行为):云 LLM 绝大多数支持原生 FC(有工具集就传 tools,与历史一致)。
12
+ * 本地运行时(Ollama/LM Studio 等)是否支持原生 FC 无法从 baseUrl 推断,须在宿主配置时
13
+ * 显式置 false(互斥双能力位)。
15
14
  */
15
+ supportsToolCalling = true;
16
+ /** 是否支持结构化输出(默认 false)。注意:response_format 不能与 tools 同时使用(OpenAI 协议限制) */
16
17
  supportsStructuredOutput = false;
17
18
  }
18
19
  //# sourceMappingURL=provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAsEA;;;GAGG;AACH,MAAM,OAAgB,WAAW;IAG/B;;;;;;;;;OASG;IACM,wBAAwB,GAAY,KAAK,CAAC;CAOpD"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AA0DA,0CAA0C;AAC1C,MAAM,OAAgB,WAAW;IAG/B;;;;;;;;;;;OAWG;IACM,mBAAmB,GAAY,IAAI,CAAC;IAE7C,yEAAyE;IAChE,wBAAwB,GAAY,KAAK,CAAC;CAIpD"}
@@ -1,11 +1,5 @@
1
- /**
2
- * LLM 适配层类型定义
3
- *
4
- * 详见 ADR-003 · LLM 适配层使用 OpenAI Chat Completions 兼容协议
5
- */
6
- /**
7
- * 工具调用描述
8
- */
1
+ /** LLM 适配层类型定义(OpenAI Chat Completions 兼容协议) */
2
+ import type { LlmProvider } from '../llm/provider.js';
9
3
  export interface ToolCall {
10
4
  id: string;
11
5
  type: 'function';
@@ -14,12 +8,61 @@ export interface ToolCall {
14
8
  arguments: string;
15
9
  };
16
10
  }
17
- /**
18
- * LLM 响应块
19
- */
20
11
  export interface LlmChunk {
21
12
  content?: string;
22
13
  toolCalls?: ToolCall[];
23
14
  finishReason?: 'stop' | 'tool_calls' | 'length' | 'error';
15
+ /**
16
+ * 模型思考内容增量片段(对应协议 `delta.reasoning_content`,deepseek 等思考模型)。
17
+ * 与 content 同为增量语义(消费侧自行累积);仅供 UI 折叠展示,**不进正文/记忆**(CoT 防护)。
18
+ * 非思考模型恒 undefined,自然降级。命名用 thought 而非 reasoning/thinking:与多模型路由任务
19
+ * 类型 `TaskType='reasoning'` 语义分离,也避开 ProcessEvent 既有 `type:'thinking'` 相位事件。
20
+ */
21
+ thought?: string;
22
+ /**
23
+ * 流式工具意图预告:tool_call 的 name 在流式 delta 中**成形即上报**,
24
+ * 无需等到 finish_reason='tool_calls'。写文件等大参数工具的参数生成段可能长达数十秒,
25
+ * 此字段让 UI 提前渲染「准备中」工具行,消除事件真空期。瞬态展示轨,不落盘。
26
+ * 非 tool_calls 流 / 非 OpenAI 兼容 provider 恒 undefined,自然降级。
27
+ */
28
+ partialToolCall?: {
29
+ id: string;
30
+ name: string;
31
+ };
32
+ /** 实际 API 用量统计(仅在流结束时的最终 chunk 携带,部分 Provider 不支持) */
33
+ usage?: {
34
+ /** 输入 token 数(prompt_tokens) */
35
+ inputTokens: number;
36
+ /** 输出 token 数(completion_tokens) */
37
+ outputTokens: number;
38
+ /** 总 token 数(total_tokens) */
39
+ totalTokens?: number;
40
+ };
41
+ }
42
+ /** 单个 Provider 配置(providers 映射表的值);内核仅透传 provider 字段,不做路由决策 */
43
+ export interface ProviderEntryConfig {
44
+ /** 标识(仅用于日志,不影响路由) */
45
+ provider: string;
46
+ model: string;
47
+ /** API 基础 URL(可选——内核不做预设回退,缺失时工厂会报错) */
48
+ baseUrl?: string;
49
+ /** API 密钥(可选,从环境变量读取。本地 LLM 如 Ollama 可为空字符串) */
50
+ apiKey?: string;
51
+ /** temperature,未配置时回退到全局 llm.temperature */
52
+ temperature?: number;
53
+ /** 上下文窗口(token),未配置时回退到 memory.maxContextTokens */
54
+ contextWindow?: number;
55
+ /**
56
+ * 是否支持原生工具调用(OpenAI Function Calling tools 协议)。
57
+ * 本地运行时(Ollama/LM Studio 等)是否支持原生 FC 无法从 baseUrl 推断,搬到配置显式声明。
58
+ * 与 supportsStructuredOutput 互斥(response_format 不能与 tools 同用)。
59
+ */
60
+ supportsToolCalling?: boolean;
61
+ /** 是否支持结构化输出(response_format / JSON mode) */
62
+ supportsStructuredOutput?: boolean;
24
63
  }
64
+ /** LLM 任务类型:按任务复杂度路由到不同 Provider/模型(simple/reasoning/code/summary) */
65
+ export type TaskType = 'simple' | 'reasoning' | 'code' | 'summary';
66
+ /** Provider 路由选择器:按任务类型返回 Provider;不配置路由时所有任务类型复用同一 Provider */
67
+ export type ProviderRouter = (taskType: TaskType) => LlmProvider;
25
68
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC3D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC1D;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,eAAe,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,sDAAsD;IACtD,KAAK,CAAC,EAAE;QACN,gCAAgC;QAChC,WAAW,EAAE,MAAM,CAAC;QACpB,oCAAoC;QACpC,YAAY,EAAE,MAAM,CAAC;QACrB,8BAA8B;QAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAID,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IAClC,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,6CAA6C;IAC7C,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,sEAAsE;AACtE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAEnE,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,WAAW,CAAC"}
package/dist/llm/types.js CHANGED
@@ -1,7 +1,2 @@
1
- /**
2
- * LLM 适配层类型定义
3
- *
4
- * 详见 ADR-003 · LLM 适配层使用 OpenAI Chat Completions 兼容协议
5
- */
6
1
  export {};
7
2
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":""}
@@ -1,40 +1,19 @@
1
1
  /**
2
2
  * 结构化日志 — 全局单例 + 可替换 ILogger
3
- *
4
- * 内核零第三方依赖:pino 为可选 peerDependency,通过动态 import 加载。
5
- * 宿主可注入自定义 logger(setLogger),完全绕过 pino。
6
- *
7
- * 降级策略:
8
- * 1. pino 可用 → 双流输出(stderr + 文件日志)
9
- * 2. pino 不可用 → console 零依赖 fallback(仅 stderr)
10
- * 3. 宿主注入 → 优先使用宿主实现
11
- *
12
- * 使用方式:
13
- * import { logger } from '../logging/logger.js';
14
- * logger.info({ key: val }, 'message');
15
- *
16
- * 注入自定义 logger:
17
- * import { setLogger } from '../logging/logger.js';
18
- * setLogger(myCustomLogger);
3
+ * 零第三方依赖、零 fs 副作用:默认 console fallback(写 stderr);宿主经 setLogger() 注入自定义实现。
4
+ * 内核只持有日志「接口」职责——不加载任何三方日志库,不决定日志落盘位置(通道/落盘归宿主)。
19
5
  */
20
6
  import type { ILogger } from '../logging/loggerInterface.js';
21
7
  /**
22
- * 全局日志访问器
23
- *
24
- * 20+ 个内核模块统一通过此变量输出日志。
25
- * 首次访问任一方法时懒触发 pino 升级(确保 import 零 fs 副作用)。
26
- * 宿主注入自定义 logger 后,所有模块自动使用新实现。
8
+ * 全局日志访问器:20+ 内核模块统一经此输出;每个方法为对当前 `_logger` 的**普通委托闭包**,
9
+ * 宿主注入/复位后所有持有者自动切换到新实现(函数身份稳定,外部可将 `logger.info` 直接作回调传递)。
27
10
  */
28
11
  export declare const logger: ILogger;
29
12
  /**
30
- * 替换全局日志实现
31
- *
32
- * 宿主项目在 Agent 初始化前调用此函数注入自定义 logger。
33
- * 传入 undefined 则恢复为默认(pino 或 console fallback)。
34
- *
35
- * 注意:此函数修改全局状态。在单 Agent 模型下(ADR-011),
36
- * 同一进程只有一个 Agent 实例,不会冲突。若同一进程创建多个
37
- * Agent 实例并分别注入 logger,后者会覆盖前者——此时会输出警告。
13
+ * 替换全局日志实现:宿主在 Agent 初始化前调用注入自定义 logger;传入 undefined 恢复默认。
14
+ * 注入即成为内核**唯一**日志出口:同时桥接 utils 层(`loggerHolder`),
15
+ * 使 scanner / eventEmitter / rolePackManager 等 utils 侧模块也走注入实现(而非停留在 console fallback)。
16
+ * 修改全局状态:单 Agent 模型下不会冲突;若多处注入,后者覆盖前者并输出警告。
38
17
  */
39
18
  export declare function setLogger(newLogger: ILogger | undefined): void;
40
19
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,8BAA8B,CAAC;AAyQnE;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,EAAE,OAiBpB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAmB9D"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,8BAA8B,CAAC;AAoFnE;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,OAKpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAgB9D"}
@@ -1,33 +1,12 @@
1
- import { toError } from '../utils/toError.js';
2
- // 桥接 utils 层 loggerHolder:utils 运行时不依赖 logging/,
3
- // 由本模块在加载和 setLogger 时反向注入 logger 实例。
1
+ // 反向注入 utils 层 loggerHolder:utils 运行时不依赖 logging/,由本模块桥接 logger 实例
4
2
  import { setLogger as setUtilsLogger } from '../utils/loggerHolder.js';
5
- /**
6
- * 从 unknown 值提取错误消息(复用零依赖的 toError,避免类型断言)
7
- */
8
- function errMsg(err) {
9
- return toError(err).message;
10
- }
11
- /** 日志级别(从环境变量读取,默认 info) */
3
+ /** 日志级别(环境变量,默认 info) */
12
4
  const level = process.env['MEMORA_LOG_LEVEL'] ?? 'info';
13
- /** 敏感键模式(匹配时值被替换为 [REDACTED]) */
5
+ /** 敏感键名匹配(命中时值被替换为 [REDACTED]) */
14
6
  const SENSITIVE_KEY_PATTERN = /api[_-]?key|token|password|secret|authorization|credential/i;
15
7
  /**
16
- * pino redact 路径配置(与 console fallback 的 SENSITIVE_KEY_PATTERN 保持一致)
17
- *
18
- * 支持嵌套对象脱敏:`*.apiKey` 匹配任意层级的 apiKey 字段
19
- */
20
- const PINO_REDACT_PATHS = [
21
- 'apiKey', 'token', 'password', 'secret', 'authorization', 'credential',
22
- '*.apiKey', '*.token', '*.password', '*.secret',
23
- '*.authorization', '*.credential',
24
- '*.*.apiKey', '*.*.token', '*.*.password', '*.*.secret',
25
- ];
26
- /**
27
- * 对象脱敏:深拷贝对象并将敏感键的值替换为 [REDACTED]
28
- *
29
- * 仅用于 console fallback logger 的 JSON.stringify 路径,
30
- * 防止 API Key 等敏感数据泄漏到 stderr。
8
+ * 对象脱敏:深拷贝并将敏感键值替换为 [REDACTED]
9
+ * 单一脱敏实现:console fallback 输出对象前统一经此脱敏(任意嵌套层级 + 变体 + 大小写不敏感)。
31
10
  */
32
11
  function redactSensitiveKeys(obj) {
33
12
  const redacted = {};
@@ -44,11 +23,7 @@ function redactSensitiveKeys(obj) {
44
23
  }
45
24
  return redacted;
46
25
  }
47
- /** 是否生产环境 */
48
- const isProd = process.env['NODE_ENV'] === 'production';
49
- /** 是否启用文件日志 */
50
- const fileEnabled = process.env['MEMORA_LOG_FILE'] !== '0';
51
- /** 日志级别优先级(用于 console fallback 的级别过滤) */
26
+ /** 日志级别优先级(console fallback 级别过滤用) */
52
27
  const LEVEL_PRIORITY = {
53
28
  trace: 0,
54
29
  debug: 1,
@@ -62,238 +37,73 @@ const LEVEL_PRIORITY = {
62
37
  function shouldLog(targetLevel) {
63
38
  return (LEVEL_PRIORITY[targetLevel] ?? 2) >= (LEVEL_PRIORITY[level] ?? 2);
64
39
  }
65
- /**
66
- * Console 零依赖 fallback logger
67
- *
68
- * pino 不可用时使用。仅输出到 stderr,不写文件。
69
- * 满足 ILogger 接口,所有内核模块透明使用。
70
- */
40
+ /** Console 零依赖 fallback logger:仅 stderr,满足 ILogger 接口 */
71
41
  function createConsoleLogger() {
72
42
  return {
73
- info: (objOrMsg, msg) => {
74
- if (!shouldLog('info'))
75
- return;
76
- const text = typeof objOrMsg === 'string' ? objOrMsg : msg ?? '';
77
- if (typeof objOrMsg === 'object') {
78
- console.error(`[INFO] ${text}`, JSON.stringify(redactSensitiveKeys(objOrMsg)));
79
- }
80
- else {
81
- console.error(`[INFO] ${text}`);
82
- }
83
- },
84
- warn: (objOrMsg, msg) => {
85
- if (!shouldLog('warn'))
86
- return;
87
- const text = typeof objOrMsg === 'string' ? objOrMsg : msg ?? '';
88
- if (typeof objOrMsg === 'object') {
89
- console.error(`[WARN] ${text}`, JSON.stringify(redactSensitiveKeys(objOrMsg)));
90
- }
91
- else {
92
- console.error(`[WARN] ${text}`);
93
- }
94
- },
95
- error: (objOrMsg, msg) => {
96
- if (!shouldLog('error'))
97
- return;
98
- const text = typeof objOrMsg === 'string' ? objOrMsg : msg ?? '';
99
- if (typeof objOrMsg === 'object') {
100
- console.error(`[ERROR] ${text}`, JSON.stringify(redactSensitiveKeys(objOrMsg)));
101
- }
102
- else {
103
- console.error(`[ERROR] ${text}`);
104
- }
105
- },
106
- debug: (objOrMsg, msg) => {
107
- if (!shouldLog('debug'))
108
- return;
109
- const text = typeof objOrMsg === 'string' ? objOrMsg : msg ?? '';
110
- if (typeof objOrMsg === 'object') {
111
- console.error(`[DEBUG] ${text}`, JSON.stringify(redactSensitiveKeys(objOrMsg)));
112
- }
113
- else {
114
- console.error(`[DEBUG] ${text}`);
115
- }
116
- },
43
+ info: createConsoleLogFn('info'),
44
+ warn: createConsoleLogFn('warn'),
45
+ error: createConsoleLogFn('error'),
46
+ debug: createConsoleLogFn('debug'),
117
47
  };
118
48
  }
119
49
  /**
120
- * pino → ILogger 包装器
121
- *
122
- * pino 通过动态 import 加载,实例类型未知。
123
- * 包装器显式提取 4 个日志方法,避免 as unknown as ILogger 双重断言。
124
- *
125
- * @param pinoInst pino 实例(动态导入)
126
- * @returns ILogger 兼容对象
50
+ * 创建 console fallback 单级别日志方法
51
+ * 消除 4 处 info/warn/error/debug 方法同构实现;共享:shouldLog 过滤、文本提取、对象路径脱敏。
127
52
  */
128
- function wrapPinoAsLogger(pinoInst) {
129
- return {
130
- info: pinoInst.info.bind(pinoInst),
131
- warn: pinoInst.warn.bind(pinoInst),
132
- error: pinoInst.error.bind(pinoInst),
133
- debug: pinoInst.debug.bind(pinoInst),
134
- };
135
- }
136
- /**
137
- * 尝试创建 Pino logger
138
- *
139
- * pino 为可选 peerDependency,通过动态 import 加载。
140
- * 加载失败(宿主未安装 pino)则回退到 console logger。
141
- *
142
- * @returns Pino logger 实例,或 null(pino 不可用)
143
- */
144
- async function tryCreatePinoLogger() {
145
- try {
146
- const pino = (await import('pino')).default;
147
- const { resolve } = await import('node:path');
148
- const { mkdirSync, createWriteStream, statSync, truncateSync } = await import('node:fs');
149
- const { expandHome } = await import('../utils/path.js');
150
- const dataDir = process.env['MEMORA_DATA_DIR'] ?? '~/.memora';
151
- const resolvedDataDir = resolve(expandHome(dataDir));
152
- // pino.StreamEntry 类型在 pino 未安装时不可用,用内联类型
153
- const streams = [];
154
- // stderr 流(开发环境友好显示)
155
- if (!isProd) {
156
- streams.push({ level: 'info', stream: process.stderr });
157
- }
158
- // 文件流(结构化 JSON,方便后续分析)
159
- // 日志轮转保护——超过 10MB 时截断重写,防止长期运行生成巨大文件
160
- if (fileEnabled) {
161
- try {
162
- const logsDir = resolve(resolvedDataDir, 'logs');
163
- mkdirSync(logsDir, { recursive: true });
164
- const logFilePath = resolve(logsDir, 'memora.log');
165
- // 检查文件大小,超过 10MB 时截断
166
- const LOG_MAX_BYTES = 10 * 1024 * 1024; // 10MB
167
- try {
168
- const stat = statSync(logFilePath);
169
- if (stat.size > LOG_MAX_BYTES) {
170
- truncateSync(logFilePath, 0);
171
- process.stderr.write(`[memora] 日志文件超过 10MB,已截断:${logFilePath}\n`);
172
- }
173
- }
174
- catch (err) {
175
- // 文件不存在或无法 stat,正常——首次写入
176
- if (process.env['MEMORA_DEBUG'])
177
- process.stderr.write(`[memora] stat 日志文件失败:${errMsg(err)}\n`);
178
- }
179
- streams.push({
180
- level: 'info',
181
- stream: createWriteStream(logFilePath, { flags: 'a' }),
182
- });
183
- }
184
- catch (err) {
185
- process.stderr.write(`[memora] 日志文件创建失败:${errMsg(err)}\n`);
186
- }
53
+ function createConsoleLogFn(targetLevel) {
54
+ const prefix = `[${targetLevel.toUpperCase()}]`;
55
+ return (objOrMsg, msg) => {
56
+ if (!shouldLog(targetLevel))
57
+ return;
58
+ const text = typeof objOrMsg === 'string' ? objOrMsg : (msg ?? '');
59
+ if (typeof objOrMsg === 'object') {
60
+ // 对象路径:脱敏后 JSON 序列化,防敏感数据泄漏
61
+ console.error(`${prefix} ${text}`, JSON.stringify(redactSensitiveKeys(objOrMsg)));
187
62
  }
188
- if (streams.length === 0) {
189
- // 通过包装器适配 ILogger 接口,避免 as unknown as ILogger 双重断言
190
- // SEC-AUDIT: 配置 redact 防止敏感信息写入日志文件
191
- return wrapPinoAsLogger(pino({ level, redact: PINO_REDACT_PATHS }));
63
+ else {
64
+ console.error(`${prefix} ${text}`);
192
65
  }
193
- // 通过包装器适配 ILogger 接口
194
- // SEC-AUDIT: 配置 redact 防止敏感信息写入日志文件
195
- return wrapPinoAsLogger(pino({ level, redact: PINO_REDACT_PATHS }, pino.multistream(streams)));
196
- }
197
- catch (err) {
198
- // pino 未安装,回退到 console logger
199
- if (process.env['MEMORA_DEBUG'])
200
- process.stderr.write(`[memora] pino 加载失败:${errMsg(err)}\n`);
201
- return null;
202
- }
66
+ };
203
67
  }
204
68
  /**
205
- * 全局日志单例
206
- *
207
- * 初始化为 console fallback(同步可用,零 fs 副作用)。
208
- * 首次日志调用时懒触发 pino 升级(确保模块 import 零 fs 副作用)。
209
- * 宿主通过 setLogger() 注入后自动替换,并跳过 pino 升级。
69
+ * 全局日志单例:初始为 console fallback(同步可用,零 fs 副作用)。
70
+ * 宿主经 setLogger() 注入后替换;未注入时保持 console fallback。
210
71
  */
211
72
  let _logger = createConsoleLogger();
212
- /** 标记 _logger 是否已被宿主注入(用于 setLogger 覆盖检测 + pino 升级跳过) */
73
+ /** 是否已被宿主注入(setLogger 覆盖告警判定) */
213
74
  let _loggerInjected = false;
214
- /** pino 升级是否已启动(确保只触发一次,避免重复 fs 操作) */
215
- let _pinoUpgradeStarted = false;
216
- // 同步初始化 utils 层 logger 桥接(确保 utils 在 pino 异步加载前就有 console fallback)
75
+ // 同步初始化 utils 层 logger 桥接(确保 utils 始终持有日志实现,默认即 console fallback)
217
76
  setUtilsLogger(_logger);
218
77
  /**
219
- * 懒触发 pino 升级
220
- *
221
- * 在首次日志调用时触发,确保模块 import 零 fs 副作用。
222
- * - 宿主已注入 logger 时跳过升级(_loggerInjected 守卫)
223
- * - 升级启动后不再重复触发(_pinoUpgradeStarted 守卫)
224
- * - 竞态守卫:then 回调内再次检查 _loggerInjected,避免覆盖宿主在升级期间注入的 logger
225
- */
226
- function maybeUpgradeToPino() {
227
- if (_pinoUpgradeStarted || _loggerInjected)
228
- return;
229
- _pinoUpgradeStarted = true;
230
- void tryCreatePinoLogger().then((pinoLogger) => {
231
- // 守卫:升级期间宿主可能已通过 setLogger 注入自定义 logger
232
- if (_loggerInjected) {
233
- setUtilsLogger(_logger);
234
- return;
235
- }
236
- if (pinoLogger) {
237
- _logger = pinoLogger;
238
- _logger.info({ level, prod: isProd, fileEnabled }, 'logger 启动(pino)');
239
- }
240
- else {
241
- _logger.info({ level, prod: isProd }, 'logger 启动(console fallback,pino 未安装)');
242
- }
243
- // 桥接注入到 utils 层(utils 运行时不依赖 logging/)
244
- setUtilsLogger(_logger);
245
- });
246
- }
247
- /**
248
- * 全局日志访问器
249
- *
250
- * 20+ 个内核模块统一通过此变量输出日志。
251
- * 首次访问任一方法时懒触发 pino 升级(确保 import 零 fs 副作用)。
252
- * 宿主注入自定义 logger 后,所有模块自动使用新实现。
78
+ * 全局日志访问器:20+ 内核模块统一经此输出;每个方法为对当前 `_logger` 的**普通委托闭包**,
79
+ * 宿主注入/复位后所有持有者自动切换到新实现(函数身份稳定,外部可将 `logger.info` 直接作回调传递)。
253
80
  */
254
81
  export const logger = {
255
- get info() {
256
- maybeUpgradeToPino();
257
- return _logger.info.bind(_logger);
258
- },
259
- get warn() {
260
- maybeUpgradeToPino();
261
- return _logger.warn.bind(_logger);
262
- },
263
- get error() {
264
- maybeUpgradeToPino();
265
- return _logger.error.bind(_logger);
266
- },
267
- get debug() {
268
- maybeUpgradeToPino();
269
- return _logger.debug.bind(_logger);
270
- },
82
+ info: (...args) => _logger.info(...args),
83
+ warn: (...args) => _logger.warn(...args),
84
+ error: (...args) => _logger.error(...args),
85
+ debug: (...args) => _logger.debug(...args),
271
86
  };
272
87
  /**
273
- * 替换全局日志实现
274
- *
275
- * 宿主项目在 Agent 初始化前调用此函数注入自定义 logger。
276
- * 传入 undefined 则恢复为默认(pino 或 console fallback)。
277
- *
278
- * 注意:此函数修改全局状态。在单 Agent 模型下(ADR-011),
279
- * 同一进程只有一个 Agent 实例,不会冲突。若同一进程创建多个
280
- * Agent 实例并分别注入 logger,后者会覆盖前者——此时会输出警告。
88
+ * 替换全局日志实现:宿主在 Agent 初始化前调用注入自定义 logger;传入 undefined 恢复默认。
89
+ * 注入即成为内核**唯一**日志出口:同时桥接 utils 层(`loggerHolder`),
90
+ * 使 scanner / eventEmitter / rolePackManager 等 utils 侧模块也走注入实现(而非停留在 console fallback)。
91
+ * 修改全局状态:单 Agent 模型下不会冲突;若多处注入,后者覆盖前者并输出警告。
281
92
  */
282
93
  export function setLogger(newLogger) {
283
94
  if (newLogger) {
284
- // 检测覆盖:如果当前 logger 已被宿主注入,且新 logger 不是同一个,说明有多处注入
95
+ // 检测覆盖:当前已被宿主注入且新实例不同,说明有多处注入
285
96
  if (_loggerInjected && _logger !== newLogger) {
286
97
  _logger.warn('setLogger 覆盖了已有的自定义 logger(单 Agent 模型下不应出现此情况)');
287
98
  }
288
99
  _loggerInjected = true;
289
100
  _logger = newLogger;
101
+ // 注入即唯一出口:同步桥接 utils 层,否则 utils 侧仍持有旧 console fallback
102
+ setUtilsLogger(_logger);
290
103
  }
291
104
  else {
292
- // 恢复默认:同步恢复到 console fallback
293
- // pino 升级不主动触发——等下次日志调用时由 maybeUpgradeToPino() 懒触发
294
- // 这样 setLogger(undefined) 零 fs 副作用,与模块加载时一致
105
+ // 恢复默认:回到内置 console fallback,并重新桥接 utils 层
295
106
  _loggerInjected = false;
296
- _pinoUpgradeStarted = false; // 允许下次日志调用时重新触发升级
297
107
  _logger = createConsoleLogger();
298
108
  setUtilsLogger(_logger);
299
109
  }