@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
@@ -2,7 +2,7 @@
2
2
  * 纯逻辑 toError — 零依赖,浏览器 / Node.js 通用
3
3
  *
4
4
  * 将 catch 块中的 unknown 值安全转换为 Error 对象。
5
- * 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging(pino)依赖。
5
+ * 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging/ 模块。
6
6
  *
7
7
  * 转换规则(5 分支,与精灵 shared/toError.ts 行为对齐):
8
8
  * 1. Error 实例:原样返回
@@ -14,4 +14,16 @@
14
14
  * null/undefined 返回 '未知错误',比 'null'/'undefined' 更友好。
15
15
  */
16
16
  export declare function toError(err: unknown): Error;
17
+ /**
18
+ * 判断错误对象是否带指定 Node.js 错误码(如 ENOENT)
19
+ *
20
+ * 收口「catch 块判断 err.code」的同语义多实现:builtinToolHandlers 4 处与
21
+ * config/loader 1 处曾各自手写同一判定(typeof/code in/=== 三连)。node:fs 抛出的
22
+ * 错误为 Error & { code },IPC 序列化错误亦带 code 字段;非对象/null 安全返回 false。
23
+ *
24
+ * @param err catch 块捕获的 unknown 值
25
+ * @param code 目标错误码(如 'ENOENT')
26
+ * @returns 是否命中指定错误码
27
+ */
28
+ export declare function isNodeErrorCode(err: unknown, code: string): boolean;
17
29
  //# sourceMappingURL=toError.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toError.d.ts","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAwB3C"}
1
+ {"version":3,"file":"toError.d.ts","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAwB3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOnE"}
@@ -2,7 +2,7 @@
2
2
  * 纯逻辑 toError — 零依赖,浏览器 / Node.js 通用
3
3
  *
4
4
  * 将 catch 块中的 unknown 值安全转换为 Error 对象。
5
- * 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging(pino)依赖。
5
+ * 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging/ 模块。
6
6
  *
7
7
  * 转换规则(5 分支,与精灵 shared/toError.ts 行为对齐):
8
8
  * 1. Error 实例:原样返回
@@ -39,4 +39,21 @@ export function toError(err) {
39
39
  // 5. 基础类型(number/boolean/symbol/null/undefined)
40
40
  return new Error(String(err ?? '未知错误'));
41
41
  }
42
+ /**
43
+ * 判断错误对象是否带指定 Node.js 错误码(如 ENOENT)
44
+ *
45
+ * 收口「catch 块判断 err.code」的同语义多实现:builtinToolHandlers 4 处与
46
+ * config/loader 1 处曾各自手写同一判定(typeof/code in/=== 三连)。node:fs 抛出的
47
+ * 错误为 Error & { code },IPC 序列化错误亦带 code 字段;非对象/null 安全返回 false。
48
+ *
49
+ * @param err catch 块捕获的 unknown 值
50
+ * @param code 目标错误码(如 'ENOENT')
51
+ * @returns 是否命中指定错误码
52
+ */
53
+ export function isNodeErrorCode(err, code) {
54
+ return (err !== null &&
55
+ typeof err === 'object' &&
56
+ 'code' in err &&
57
+ err.code === code);
58
+ }
42
59
  //# sourceMappingURL=toError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toError.js","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,yBAAyB;IACzB,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC;IACrC,kBAAkB;IAClB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,4CAA4C;IAC5C,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAQ,GAA6B,CAAC,OAAO,KAAK,QAAQ,EAC1D,CAAC;QACD,OAAO,IAAI,KAAK,CAAE,GAA2B,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,0DAA0D;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;YAC7B,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"toError.js","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,yBAAyB;IACzB,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC;IACrC,kBAAkB;IAClB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,4CAA4C;IAC5C,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAQ,GAA6B,CAAC,OAAO,KAAK,QAAQ,EAC1D,CAAC;QACD,OAAO,IAAI,KAAK,CAAE,GAA2B,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,0DAA0D;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;YAC7B,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,IAAY;IACxD,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,MAAM,IAAI,GAAG;QACZ,GAAyB,CAAC,IAAI,KAAK,IAAI,CACzC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 基于 fetch 的默认网页抓取实现(FetchWebFetchProvider)
3
+ * 使用 Node.js 18+ 内置 fetch,零依赖。仅用于"开箱即用"场景,
4
+ * 生产环境建议宿主实现 IFetchProvider 用专用抓取服务(渲染 / 代理 / 限流)。
5
+ */
6
+ import type { FetchedPage, FetchOptions, IFetchProvider } from '../web-fetch/types.js';
7
+ /** 默认网页抓取实现:Node 内置 fetch + 正文清洗 + 截断 */
8
+ export declare class FetchWebFetchProvider implements IFetchProvider {
9
+ /**
10
+ * 抓取 URL:带超时控制(共享 fetchWithTimeout),返回清洗后的正文纯文本。
11
+ */
12
+ fetch(url: string, options?: FetchOptions): Promise<FetchedPage>;
13
+ }
14
+ //# sourceMappingURL=fetchWebFetchProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWebFetchProvider.d.ts","sourceRoot":"","sources":["../../src/web-fetch/fetchWebFetchProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAoDtF,yCAAyC;AACzC,qBAAa,qBAAsB,YAAW,cAAc;IAC1D;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;CAiBvE"}
@@ -0,0 +1,69 @@
1
+ import { BROWSER_UA, fetchWithTimeout } from '../utils/http.js';
2
+ /** 单次请求超时(ms):抓取通常 1-3s 返回,10s 覆盖慢网络且不至于拖死主循环 */
3
+ const REQUEST_TIMEOUT_MS = 10_000;
4
+ /** 默认正文截断上限(字符) */
5
+ const DEFAULT_MAX_CHARS = 8_000;
6
+ /** 原始 HTML 可接受上限(字符):防超大页面占满内存,超限直接截断再清洗 */
7
+ const MAX_RAW_CHARS = 50_000;
8
+ /**
9
+ * HTML → 正文纯文本:去 script/style/head + 去标签 + 解实体 + 去控制字符 + 压缩空白 + 截断。
10
+ * 用正则而非 DOM 解析,避免引入 jsdom 依赖(对齐 fetchWebSearchProvider 的零依赖思路)。
11
+ *
12
+ * @param html 原始 HTML
13
+ * @param maxChars 正文截断上限
14
+ * @returns 清洗后的纯文本
15
+ */
16
+ function stripHtmlToText(html, maxChars) {
17
+ const text = html
18
+ // 先剔除脚本/样式/头部(正文无关且含特殊字符)
19
+ .replace(/<script[\s\S]*?<\/script>/gi, ' ')
20
+ .replace(/<style[\s\S]*?<\/style>/gi, ' ')
21
+ .replace(/<head[\s\S]*?<\/head>/gi, ' ')
22
+ // 再剔除剩余标签
23
+ .replace(/<[^>]+>/g, ' ')
24
+ // 解码常见 HTML 实体
25
+ .replace(/&nbsp;/gi, ' ')
26
+ .replace(/&amp;/gi, '&')
27
+ .replace(/&lt;/gi, '<')
28
+ .replace(/&gt;/gi, '>')
29
+ .replace(/&quot;/gi, '"')
30
+ .replace(/&#39;/gi, "'")
31
+ // 去控制字符(防转义/终端注入,对齐 toolExecutor.sanitizeExternalText 语义)
32
+ .replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, '')
33
+ // 压缩空白:行内空格折叠 + 多空行归一
34
+ .replace(/[ \t]+/g, ' ')
35
+ .replace(/\n{3,}/g, '\n\n')
36
+ .trim();
37
+ return text.length > maxChars ? `${text.slice(0, maxChars)}…` : text;
38
+ }
39
+ /**
40
+ * 从 <title> 提取页面标题(清洗后截断)
41
+ */
42
+ function extractTitle(html) {
43
+ const match = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(html);
44
+ return match ? stripHtmlToText(match[1], 200) : '';
45
+ }
46
+ /** 默认网页抓取实现:Node 内置 fetch + 正文清洗 + 截断 */
47
+ export class FetchWebFetchProvider {
48
+ /**
49
+ * 抓取 URL:带超时控制(共享 fetchWithTimeout),返回清洗后的正文纯文本。
50
+ */
51
+ async fetch(url, options) {
52
+ const maxChars = options?.maxChars ?? DEFAULT_MAX_CHARS;
53
+ const response = await fetchWithTimeout(url, REQUEST_TIMEOUT_MS, BROWSER_UA);
54
+ if (!response.ok) {
55
+ throw new Error(`HTTP ${response.status} ${response.statusText}`);
56
+ }
57
+ const contentType = response.headers.get('content-type') ?? '';
58
+ const raw = await response.text();
59
+ // 超限原始响应直接截断再清洗,防超大页面拖慢/占满内存
60
+ const content = stripHtmlToText(raw.slice(0, MAX_RAW_CHARS), maxChars);
61
+ return {
62
+ url: response.url || url,
63
+ title: extractTitle(raw),
64
+ content,
65
+ contentType,
66
+ };
67
+ }
68
+ }
69
+ //# sourceMappingURL=fetchWebFetchProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWebFetchProvider.js","sourceRoot":"","sources":["../../src/web-fetch/fetchWebFetchProvider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,iDAAiD;AACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,mBAAmB;AACnB,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEhC,4CAA4C;AAC5C,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,QAAgB;IACrD,MAAM,IAAI,GAAG,IAAI;QACf,0BAA0B;SACzB,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC;QACxC,UAAU;SACT,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;QACzB,eAAe;SACd,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;QACxB,0DAA0D;SACzD,OAAO,CAAC,iDAAiD,EAAE,EAAE,CAAC;QAC/D,sBAAsB;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;IACV,OAAO,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,KAAK,GAAG,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,yCAAyC;AACzC,MAAM,OAAO,qBAAqB;IAChC;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,OAAsB;QAC7C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClC,6BAA6B;QAC7B,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvE,OAAO;YACL,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG;YACxB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;YACxB,OAAO;YACP,WAAW;SACZ,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 网页抓取提供者接口定义:让 memora 内核具备可注入的网页正文抓取能力。
3
+ * 宿主实现 IFetchProvider 注入自定义抓取实现(接口注入,遵循 IWebSearchProvider 模式;零依赖)。
4
+ * 与 web_search 成对构成「搜索→抓取」闭环:web_search 给出候选 URL,web_fetch 读正文。
5
+ */
6
+ /** 抓取到的网页内容 */
7
+ export interface FetchedPage {
8
+ /** 页面 URL(若发生重定向则返回实际地址) */
9
+ url: string;
10
+ /** 页面标题(无标题时为空串) */
11
+ title: string;
12
+ /** 清洗后的正文纯文本 */
13
+ content: string;
14
+ /** 内容类型(如 "text/html"、"application/pdf"),无法识别时为空串 */
15
+ contentType?: string;
16
+ }
17
+ /** 抓取选项 */
18
+ export interface FetchOptions {
19
+ /** 返回正文最大字符数(默认 8000) */
20
+ maxChars?: number;
21
+ }
22
+ /**
23
+ * 网页抓取提供者接口:宿主实现并注入 AgentOptions.fetchProvider 提供抓取能力;
24
+ * 未注入时 Agent 不会暴露 web_fetch 工具给 LLM。
25
+ */
26
+ export interface IFetchProvider {
27
+ /** 抓取 URL 并返回清洗后的正文纯文本 */
28
+ fetch(url: string, options?: FetchOptions): Promise<FetchedPage>;
29
+ }
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web-fetch/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAClE"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 网页抓取提供者接口定义:让 memora 内核具备可注入的网页正文抓取能力。
3
+ * 宿主实现 IFetchProvider 注入自定义抓取实现(接口注入,遵循 IWebSearchProvider 模式;零依赖)。
4
+ * 与 web_search 成对构成「搜索→抓取」闭环:web_search 给出候选 URL,web_fetch 读正文。
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/web-fetch/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 网页抓取集成入口:提供带超时保护的加载包装,组合默认实现或宿主自定义实现。
3
+ * 抓取失败时降级返回友好错误信息,不中断对话流程(30s 超时防卡死 Agent 主循环)。
4
+ */
5
+ import type { FetchedPage, FetchOptions, IFetchProvider } from '../web-fetch/types.js';
6
+ /**
7
+ * 带超时和错误处理的抓取包装:超时或失败时不抛异常,返回降级提示页。
8
+ */
9
+ export declare function safeFetch(provider: IFetchProvider, url: string, options?: FetchOptions): Promise<FetchedPage>;
10
+ //# sourceMappingURL=webFetchProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webFetchProvider.d.ts","sourceRoot":"","sources":["../../src/web-fetch/webFetchProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtF;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC,CAoBtB"}
@@ -0,0 +1,28 @@
1
+ /** 网页抓取超时时间(毫秒) */
2
+ const FETCH_TIMEOUT_MS = 30_000;
3
+ /**
4
+ * 带超时和错误处理的抓取包装:超时或失败时不抛异常,返回降级提示页。
5
+ */
6
+ export async function safeFetch(provider, url, options) {
7
+ let timer;
8
+ const timeoutPromise = new Promise((_, reject) => {
9
+ timer = setTimeout(() => reject(new Error('网页抓取超时(30s)')), FETCH_TIMEOUT_MS);
10
+ });
11
+ try {
12
+ return await Promise.race([provider.fetch(url, options), timeoutPromise]);
13
+ }
14
+ catch (err) {
15
+ // 抓取失败不抛异常,返回降级提示页
16
+ const message = err instanceof Error ? err.message : String(err);
17
+ return {
18
+ url,
19
+ title: '网页抓取暂不可用',
20
+ content: `抓取失败:${message}。请稍后重试,或检查网络连接。`,
21
+ };
22
+ }
23
+ finally {
24
+ // 成功/失败均清理超时定时器,防残留定时器拖住进程
25
+ clearTimeout(timer);
26
+ }
27
+ }
28
+ //# sourceMappingURL=webFetchProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webFetchProvider.js","sourceRoot":"","sources":["../../src/web-fetch/webFetchProvider.ts"],"names":[],"mappings":"AAMA,mBAAmB;AACnB,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAwB,EACxB,GAAW,EACX,OAAsB;IAEtB,IAAI,KAAgD,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAc,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC5D,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mBAAmB;QACnB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,GAAG;YACH,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,QAAQ,OAAO,iBAAiB;SAC1C,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,2BAA2B;QAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 基于 fetch 的默认网络搜索实现(FetchWebSearchProvider)
3
+ * 多后端降级链:Bing(国内可达,首选)→ DuckDuckGo(备用),各端点独立超时,失败/空结果时降级到下一端点。
4
+ * 使用 Node.js 18+ 内置 fetch,零依赖。仅用于"开箱即用"场景,生产环境建议宿主实现 IWebSearchProvider 用专用搜索 API。
5
+ */
6
+ import type { IWebSearchProvider, SearchResult, WebSearchOptions, SearchEndpoint } from '../web-search/types.js';
7
+ /** 可切换的内置搜索引擎名(宿主设置 memora.searchEngine 对应枚举) */
8
+ export type SearchEngineName = 'bing' | 'duckduckgo' | 'baidu' | 'sogou';
9
+ /**
10
+ * 构建搜索端点降级链:入参为「内核预设名(SearchEngineName)| 宿主自定义 SearchEndpoint」混排,
11
+ * 按给定顺序组装;宿主传入的自定义端点优先生效,未知预设名忽略。
12
+ * 全部无效 / 空列表回退默认链(Bing→DuckDuckGo),保证零配置也开箱可用。
13
+ * 主推宿主接入:生产环境建议宿主自建 SearchEndpoint[](自带 URL+解析)注入,内核预设仅作保底。
14
+ */
15
+ export declare function buildSearchEndpoints(items: readonly (SearchEngineName | SearchEndpoint)[]): readonly SearchEndpoint[];
16
+ /** 默认搜索实现:多后端降级链(Bing → DuckDuckGo),每端点独立超时。生产建议宿主自定义 IWebSearchProvider */
17
+ export declare class FetchWebSearchProvider implements IWebSearchProvider {
18
+ /** 端点降级链(可注入替换,测试与宿主定制用) */
19
+ private readonly endpoints;
20
+ constructor(endpoints?: readonly SearchEndpoint[]);
21
+ /**
22
+ * 搜索互联网,返回结构化结果。依次尝试各端点,非空结果即成功;
23
+ * 若某个端点成功响应但无命中视为"无结果",全部失败(网络/HTTP 错误)时抛聚合错误,由 safeSearch 降级。
24
+ */
25
+ search(query: string, options?: WebSearchOptions): Promise<SearchResult[]>;
26
+ }
27
+ //# sourceMappingURL=fetchWebSearchProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWebSearchProvider.d.ts","sourceRoot":"","sources":["../../src/web-search/fetchWebSearchProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAyH/B,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAoCzE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,CAAC,gBAAgB,GAAG,cAAc,CAAC,EAAE,GACpD,SAAS,cAAc,EAAE,CAO3B;AAED,4EAA4E;AAC5E,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,4BAA4B;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;gBAE1C,SAAS,GAAE,SAAS,cAAc,EAAsB;IAIpE;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAuCjF"}
@@ -0,0 +1,199 @@
1
+ import { BROWSER_UA, fetchWithTimeout } from '../utils/http.js';
2
+ /** 单端点请求超时(ms):Bing 通常 1-2s 返回,10s 覆盖慢网络且不至于拖死主循环 */
3
+ const ENDPOINT_TIMEOUT_MS = 10_000;
4
+ /**
5
+ * 从 Bing 结果页 HTML 提取结果:标题+链接在 <h2><a>,摘要在 <p class="b_lineclamp*">。
6
+ * 用正则而非 DOM 解析,避免引入 jsdom 依赖。
7
+ */
8
+ function parseBingHtml(html, limit) {
9
+ const results = [];
10
+ const titleRegex = /<h2[^>]*><a[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a><\/h2>/g;
11
+ const snippetRegex = /<p[^>]*class="b_lineclamp[^"]*"[^>]*>([\s\S]*?)<\/p>/g;
12
+ const titles = [];
13
+ let match;
14
+ while ((match = titleRegex.exec(html)) !== null && titles.length < limit) {
15
+ const url = match[1].replace(/&amp;/g, '&').trim();
16
+ const title = match[2].replace(/<[^>]*>/g, '').trim();
17
+ if (title && url) {
18
+ titles.push({ url, title });
19
+ }
20
+ }
21
+ const snippets = [];
22
+ while ((match = snippetRegex.exec(html)) !== null && snippets.length < limit) {
23
+ const snippet = match[1].replace(/<[^>]*>/g, '').trim();
24
+ if (snippet)
25
+ snippets.push(snippet);
26
+ }
27
+ for (let i = 0; i < Math.min(titles.length, limit); i++) {
28
+ results.push({
29
+ title: titles[i].title,
30
+ url: titles[i].url,
31
+ snippet: snippets[i] ?? '',
32
+ });
33
+ }
34
+ return results;
35
+ }
36
+ /**
37
+ * 从 DuckDuckGo HTML 响应提取结果:标题/链接在 <a class="result__a">,摘要在 <a class="result__snippet">。
38
+ */
39
+ function parseDuckDuckGoHtml(html, limit) {
40
+ const results = [];
41
+ const resultRegex = /<a[^>]*class="result__a"[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/g;
42
+ const snippetRegex = /<a[^>]*class="result__snippet"[^>]*>([\s\S]*?)<\/a>/g;
43
+ const titles = [];
44
+ let match;
45
+ while ((match = resultRegex.exec(html)) !== null && titles.length < limit) {
46
+ const url = match[1].replace(/\/\/duckduckgo\.com\/l\/\?uddg=/, ''); // 解码跳转链接(两条 URL 前缀指向同一处)
47
+ const title = match[2].replace(/<[^>]*>/g, '').trim();
48
+ if (title && url) {
49
+ titles.push({
50
+ url: decodeURIComponent(url),
51
+ title,
52
+ });
53
+ }
54
+ }
55
+ const snippets = [];
56
+ while ((match = snippetRegex.exec(html)) !== null && snippets.length < limit) {
57
+ const snippet = match[1].replace(/<[^>]*>/g, '').trim();
58
+ if (snippet)
59
+ snippets.push(snippet);
60
+ }
61
+ for (let i = 0; i < Math.min(titles.length, limit); i++) {
62
+ results.push({
63
+ title: titles[i].title,
64
+ url: titles[i].url,
65
+ snippet: snippets[i] ?? '',
66
+ });
67
+ }
68
+ return results;
69
+ }
70
+ /**
71
+ * 百度搜索结果页 HTML 解析(中文场景命中质量通常优于 Bing 抓取)。
72
+ * 结构:结果条目 h3[class*=c-title] 内 <a href>,摘要取紧随的 content-right / c-abstract 块。
73
+ * 反爬时页面无结果结构 → 返回空数组,由降级链自动切换下一点端。
74
+ */
75
+ function parseBaiduHtml(html, limit) {
76
+ const results = [];
77
+ const itemRegex = /<h3[^>]*>[\s\S]*?<a[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<\/h3>/gi;
78
+ let match;
79
+ while ((match = itemRegex.exec(html)) !== null && results.length < limit) {
80
+ const url = match[1].replace(/&amp;/g, '&').trim();
81
+ const title = match[2].replace(/<[^>]*>/g, '').trim();
82
+ if (!url || !title)
83
+ continue;
84
+ // 摘要:标题块之后 800 字符范围内取首个内容摘要块(新版 content-right / 旧版 c-abstract)
85
+ const after = html.slice(match.index + match[0].length, match.index + match[0].length + 800);
86
+ const snipMatch = /(?:content-right|c-abstract)[^>]*>([\s\S]*?)<\/span>/i.exec(after);
87
+ const snippet = snipMatch?.[1]?.replace(/<[^>]*>/g, '').trim() ?? '';
88
+ results.push({ title, url, snippet });
89
+ }
90
+ return results;
91
+ }
92
+ /**
93
+ * 搜狗搜索结果页 HTML 解析。结构:div.vrwrap > h3.vr-title > a[href],摘要 .str_info / .space-txt。
94
+ */
95
+ function parseSogouHtml(html, limit) {
96
+ const results = [];
97
+ const itemRegex = /<h3[^>]*>[\s\S]*?<a[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<\/h3>/gi;
98
+ let match;
99
+ while ((match = itemRegex.exec(html)) !== null && results.length < limit) {
100
+ const url = match[1].replace(/&amp;/g, '&').trim();
101
+ const title = match[2].replace(/<[^>]*>/g, '').trim();
102
+ if (!url || !title)
103
+ continue;
104
+ const after = html.slice(match.index + match[0].length, match.index + match[0].length + 800);
105
+ const snipMatch = /(?:str_info|space-txt)[^>]*>([\s\S]*?)<\/(?:div|p)>/i.exec(after);
106
+ const snippet = snipMatch?.[1]?.replace(/<[^>]*>/g, '').trim() ?? '';
107
+ results.push({ title, url, snippet });
108
+ }
109
+ return results;
110
+ }
111
+ /**
112
+ * 内置端点注册表(零配置保底基线,非真理源):端点名 → 定义。
113
+ * FetchWebSearchProvider 默认链与 buildSearchEndpoints 的预设名均取自此处;
114
+ * 宿主可传入自定义 SearchEndpoint 覆盖/扩展,无需改这里。
115
+ */
116
+ const SEARCH_ENDPOINT_REGISTRY = {
117
+ bing: {
118
+ name: 'Bing',
119
+ buildUrl: (query) => `https://www.bing.com/search?q=${encodeURIComponent(query)}`,
120
+ parse: parseBingHtml,
121
+ },
122
+ duckduckgo: {
123
+ name: 'DuckDuckGo',
124
+ buildUrl: (query) => `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`,
125
+ parse: parseDuckDuckGoHtml,
126
+ },
127
+ baidu: {
128
+ name: 'Baidu',
129
+ buildUrl: (query) => `https://www.baidu.com/s?wd=${encodeURIComponent(query)}`,
130
+ parse: parseBaiduHtml,
131
+ },
132
+ sogou: {
133
+ name: 'Sogou',
134
+ buildUrl: (query) => `https://www.sogou.com/web?query=${encodeURIComponent(query)}`,
135
+ parse: parseSogouHtml,
136
+ },
137
+ };
138
+ /** 默认端点降级链:Bing(国内可达)→ DuckDuckGo(备用) */
139
+ const DEFAULT_ENDPOINTS = [
140
+ SEARCH_ENDPOINT_REGISTRY.bing,
141
+ SEARCH_ENDPOINT_REGISTRY.duckduckgo,
142
+ ];
143
+ /**
144
+ * 构建搜索端点降级链:入参为「内核预设名(SearchEngineName)| 宿主自定义 SearchEndpoint」混排,
145
+ * 按给定顺序组装;宿主传入的自定义端点优先生效,未知预设名忽略。
146
+ * 全部无效 / 空列表回退默认链(Bing→DuckDuckGo),保证零配置也开箱可用。
147
+ * 主推宿主接入:生产环境建议宿主自建 SearchEndpoint[](自带 URL+解析)注入,内核预设仅作保底。
148
+ */
149
+ export function buildSearchEndpoints(items) {
150
+ const picked = items
151
+ .map((item) => typeof item === 'string' ? SEARCH_ENDPOINT_REGISTRY[item] : item)
152
+ .filter((e) => e !== undefined && e !== null);
153
+ return picked.length > 0 ? picked : DEFAULT_ENDPOINTS;
154
+ }
155
+ /** 默认搜索实现:多后端降级链(Bing → DuckDuckGo),每端点独立超时。生产建议宿主自定义 IWebSearchProvider */
156
+ export class FetchWebSearchProvider {
157
+ /** 端点降级链(可注入替换,测试与宿主定制用) */
158
+ endpoints;
159
+ constructor(endpoints = DEFAULT_ENDPOINTS) {
160
+ this.endpoints = endpoints;
161
+ }
162
+ /**
163
+ * 搜索互联网,返回结构化结果。依次尝试各端点,非空结果即成功;
164
+ * 若某个端点成功响应但无命中视为"无结果",全部失败(网络/HTTP 错误)时抛聚合错误,由 safeSearch 降级。
165
+ */
166
+ async search(query, options) {
167
+ const limit = options?.limit ?? 5;
168
+ const errors = [];
169
+ // 是否有端点成功响应(HTTP ok)——区分「无命中」与「全部失败」
170
+ let anyOk = false;
171
+ for (const endpoint of this.endpoints) {
172
+ try {
173
+ const response = await fetchWithTimeout(endpoint.buildUrl(query), ENDPOINT_TIMEOUT_MS, BROWSER_UA);
174
+ if (!response.ok) {
175
+ errors.push(`${endpoint.name}: HTTP ${response.status} ${response.statusText}`);
176
+ continue;
177
+ }
178
+ anyOk = true;
179
+ const html = await response.text();
180
+ const results = endpoint.parse(html, limit);
181
+ // 空结果(该端点无命中)继续尝试下一端点
182
+ if (results.length > 0) {
183
+ // 打标实际服务的后端名称,供降级透出:同批次结果来自同一端点
184
+ return results.map((r) => ({ ...r, endpoint: endpoint.name }));
185
+ }
186
+ }
187
+ catch (err) {
188
+ errors.push(`${endpoint.name}: ${err instanceof Error ? err.message : String(err)}`);
189
+ }
190
+ }
191
+ // 至少一个端点成功响应但均无命中 → 搜索成功、无结果(非失败,safeSearch 不降级提示)
192
+ if (anyOk) {
193
+ return [];
194
+ }
195
+ // 全部失败 → 抛聚合错误,由 safeSearch 降级为友好提示
196
+ throw new Error(`所有搜索端点均失败:${errors.join(';')}`);
197
+ }
198
+ }
199
+ //# sourceMappingURL=fetchWebSearchProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchWebSearchProvider.js","sourceRoot":"","sources":["../../src/web-search/fetchWebSearchProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 网络搜索提供者接口定义:让 memora 内核具备可注入的网络搜索能力。
3
+ * 宿主实现 IWebSearchProvider 注入自定义搜索引擎(接口注入,遵循 LlmProvider 模式;零依赖)。
4
+ */
5
+ /** 单条搜索结果 */
6
+ export interface SearchResult {
7
+ /** 搜索结果标题 */
8
+ title: string;
9
+ /** 搜索结果链接 */
10
+ url: string;
11
+ /** 搜索结果摘要 */
12
+ snippet: string;
13
+ /**
14
+ * 实际服务的搜索后端名称(如 'Bing' / 'DuckDuckGo')。
15
+ * 降级发生时由 FetchWebSearchProvider 打标,供宿主/工具结果透出「已降级」提示;
16
+ * 可选:自定义 IWebSearchProvider 可不填(向后兼容,现有调用方忽略此字段)。
17
+ */
18
+ endpoint?: string;
19
+ }
20
+ /** 搜索选项 */
21
+ export interface WebSearchOptions {
22
+ /** 返回结果数量上限(默认 5) */
23
+ limit?: number;
24
+ }
25
+ /**
26
+ * 搜索端点契约:名称 + URL 构造 + HTML 解析。
27
+ * 宿主可构造自己的 SearchEndpoint 注入 FetchWebSearchProvider / buildSearchEndpoints,
28
+ * 内核内置 SEARCH_ENDPOINT_REGISTRY 仅作零配置保底基线(非真理源)。
29
+ */
30
+ export interface SearchEndpoint {
31
+ /** 端点名称(降级打标 / 结果透出用) */
32
+ name: string;
33
+ /** 由查询构造请求 URL */
34
+ buildUrl(query: string): string;
35
+ /** 从结果页 HTML 解析出结构化结果 */
36
+ parse(html: string, limit: number): SearchResult[];
37
+ }
38
+ /**
39
+ * 网络搜索提供者接口:宿主实现并注入 AgentOptions.webSearchProvider 提供搜索能力;
40
+ * 未注入时 Agent 不会暴露 web_search 工具给 LLM。
41
+ */
42
+ export interface IWebSearchProvider {
43
+ /** 搜索互联网,返回结构化结果列表 */
44
+ search(query: string, options?: WebSearchOptions): Promise<SearchResult[]>;
45
+ }
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web-search/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,yBAAyB;IACzB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CACpD;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CAC5E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/persona/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/web-search/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 网络搜索集成入口:提供带超时保护的加载包装,组合默认实现或宿主自定义实现。
3
+ * 搜索失败时降级返回友好错误信息,不中断对话流程(30s 超时防卡死 Agent 主循环)。
4
+ */
5
+ import type { IWebSearchProvider, SearchResult, WebSearchOptions } from '../web-search/types.js';
6
+ /**
7
+ * 带超时和错误处理的搜索包装:超时或失败时不抛异常,返回降级提示信息。
8
+ */
9
+ export declare function safeSearch(provider: IWebSearchProvider, query: string, options?: WebSearchOptions): Promise<SearchResult[]>;
10
+ //# sourceMappingURL=webSearchProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webSearchProvider.d.ts","sourceRoot":"","sources":["../../src/web-search/webSearchProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKhG;;GAEG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB"}
@@ -0,0 +1,30 @@
1
+ /** 网络搜索超时时间(毫秒) */
2
+ const SEARCH_TIMEOUT_MS = 30_000;
3
+ /**
4
+ * 带超时和错误处理的搜索包装:超时或失败时不抛异常,返回降级提示信息。
5
+ */
6
+ export async function safeSearch(provider, query, options) {
7
+ let timer;
8
+ const timeoutPromise = new Promise((_, reject) => {
9
+ timer = setTimeout(() => reject(new Error('网络搜索超时(30s)')), SEARCH_TIMEOUT_MS);
10
+ });
11
+ try {
12
+ return await Promise.race([provider.search(query, options), timeoutPromise]);
13
+ }
14
+ catch (err) {
15
+ // 搜索失败不抛异常,返回降级提示
16
+ const message = err instanceof Error ? err.message : String(err);
17
+ return [
18
+ {
19
+ title: '网络搜索暂不可用',
20
+ url: '',
21
+ snippet: `搜索失败:${message}。请稍后重试,或检查网络连接。`,
22
+ },
23
+ ];
24
+ }
25
+ finally {
26
+ // 成功/失败均清理超时定时器,防残留定时器拖住进程
27
+ clearTimeout(timer);
28
+ }
29
+ }
30
+ //# sourceMappingURL=webSearchProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webSearchProvider.js","sourceRoot":"","sources":["../../src/web-search/webSearchProvider.ts"],"names":[],"mappings":"AAMA,mBAAmB;AACnB,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA4B,EAC5B,KAAa,EACb,OAA0B;IAE1B,IAAI,KAAgD,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/D,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kBAAkB;QAClB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL;gBACE,KAAK,EAAE,UAAU;gBACjB,GAAG,EAAE,EAAE;gBACP,OAAO,EAAE,QAAQ,OAAO,iBAAiB;aAC1C;SACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,2BAA2B;QAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}