@zooique/memora 2.0.3 → 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 -272
  3. package/README.md +303 -260
  4. package/config.example.json +43 -0
  5. package/dist/agent/agent.d.ts +376 -408
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +1166 -926
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +105 -43
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +543 -75
  12. package/dist/agent/assembler.js.map +1 -1
  13. package/dist/agent/budget.d.ts +131 -0
  14. package/dist/agent/budget.d.ts.map +1 -0
  15. package/dist/agent/budget.js +128 -0
  16. package/dist/agent/budget.js.map +1 -0
  17. package/dist/agent/builtinToolHandlers.d.ts +225 -38
  18. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  19. package/dist/agent/builtinToolHandlers.js +748 -132
  20. package/dist/agent/builtinToolHandlers.js.map +1 -1
  21. package/dist/agent/builtinTools.d.ts +198 -7
  22. package/dist/agent/builtinTools.d.ts.map +1 -1
  23. package/dist/agent/builtinTools.js +646 -14
  24. package/dist/agent/builtinTools.js.map +1 -1
  25. package/dist/agent/compaction.d.ts +93 -0
  26. package/dist/agent/compaction.d.ts.map +1 -0
  27. package/dist/agent/compaction.js +192 -0
  28. package/dist/agent/compaction.js.map +1 -0
  29. package/dist/agent/constants.d.ts +137 -20
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +152 -20
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +119 -77
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +192 -135
  36. package/dist/agent/contextManager.js.map +1 -1
  37. package/dist/agent/contextPreparer.d.ts +78 -0
  38. package/dist/agent/contextPreparer.d.ts.map +1 -0
  39. package/dist/agent/contextPreparer.js +128 -0
  40. package/dist/agent/contextPreparer.js.map +1 -0
  41. package/dist/agent/duplicateInterceptor.d.ts +67 -0
  42. package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
  43. package/dist/agent/duplicateInterceptor.js +82 -0
  44. package/dist/agent/duplicateInterceptor.js.map +1 -0
  45. package/dist/agent/guardRail.d.ts +166 -0
  46. package/dist/agent/guardRail.d.ts.map +1 -0
  47. package/dist/agent/guardRail.js +333 -0
  48. package/dist/agent/guardRail.js.map +1 -0
  49. package/dist/agent/loop.d.ts +716 -295
  50. package/dist/agent/loop.d.ts.map +1 -1
  51. package/dist/agent/loop.js +2178 -664
  52. package/dist/agent/loop.js.map +1 -1
  53. package/dist/agent/managers/archiveCoordinator.d.ts +14 -171
  54. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  55. package/dist/agent/managers/archiveCoordinator.js +19 -287
  56. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  57. package/dist/agent/managers/chatLockManager.d.ts +20 -88
  58. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  59. package/dist/agent/managers/chatLockManager.js +31 -103
  60. package/dist/agent/managers/chatLockManager.js.map +1 -1
  61. package/dist/agent/managers/dedupManager.d.ts +31 -115
  62. package/dist/agent/managers/dedupManager.d.ts.map +1 -1
  63. package/dist/agent/managers/dedupManager.js +48 -136
  64. package/dist/agent/managers/dedupManager.js.map +1 -1
  65. package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
  66. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
  67. package/dist/agent/managers/goalConsistencyChecker.js +178 -0
  68. package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
  69. package/dist/agent/managers/llmCaller.d.ts +124 -0
  70. package/dist/agent/managers/llmCaller.d.ts.map +1 -0
  71. package/dist/agent/managers/llmCaller.js +417 -0
  72. package/dist/agent/managers/llmCaller.js.map +1 -0
  73. package/dist/agent/managers/llmJudgeHelper.d.ts +8 -25
  74. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -1
  75. package/dist/agent/managers/llmJudgeHelper.js +7 -24
  76. package/dist/agent/managers/llmJudgeHelper.js.map +1 -1
  77. package/dist/agent/managers/loopMetrics.d.ts +58 -0
  78. package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
  79. package/dist/agent/managers/loopMetrics.js +68 -0
  80. package/dist/agent/managers/loopMetrics.js.map +1 -0
  81. package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
  82. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  83. package/dist/agent/managers/memoryAdvisor.js +85 -207
  84. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  85. package/dist/agent/managers/memoryGovernance.d.ts +10 -42
  86. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -1
  87. package/dist/agent/managers/memoryGovernance.js +19 -36
  88. package/dist/agent/managers/memoryGovernance.js.map +1 -1
  89. package/dist/agent/managers/memoryInspector.d.ts +59 -268
  90. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  91. package/dist/agent/managers/memoryInspector.js +91 -442
  92. package/dist/agent/managers/memoryInspector.js.map +1 -1
  93. package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
  94. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
  95. package/dist/agent/managers/roundSummaryGenerator.js +201 -0
  96. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
  97. package/dist/agent/managers/sessionArchiver.d.ts +19 -68
  98. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  99. package/dist/agent/managers/sessionArchiver.js +76 -147
  100. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  101. package/dist/agent/managers/sessionManager.d.ts +286 -57
  102. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  103. package/dist/agent/managers/sessionManager.js +846 -85
  104. package/dist/agent/managers/sessionManager.js.map +1 -1
  105. package/dist/agent/managers/sessionNamer.d.ts +35 -0
  106. package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
  107. package/dist/agent/managers/sessionNamer.js +104 -0
  108. package/dist/agent/managers/sessionNamer.js.map +1 -0
  109. package/dist/agent/managers/streamAccumulator.d.ts +8 -33
  110. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -1
  111. package/dist/agent/managers/streamAccumulator.js +4 -29
  112. package/dist/agent/managers/streamAccumulator.js.map +1 -1
  113. package/dist/agent/managers/textPolishManager.d.ts +8 -44
  114. package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
  115. package/dist/agent/managers/textPolishManager.js +9 -41
  116. package/dist/agent/managers/textPolishManager.js.map +1 -1
  117. package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
  118. package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
  119. package/dist/agent/managers/toolCallHelpers.js +161 -0
  120. package/dist/agent/managers/toolCallHelpers.js.map +1 -0
  121. package/dist/agent/managers/workProjection.d.ts +55 -100
  122. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  123. package/dist/agent/managers/workProjection.js +164 -268
  124. package/dist/agent/managers/workProjection.js.map +1 -1
  125. package/dist/agent/messageHistory.d.ts +134 -84
  126. package/dist/agent/messageHistory.d.ts.map +1 -1
  127. package/dist/agent/messageHistory.js +419 -133
  128. package/dist/agent/messageHistory.js.map +1 -1
  129. package/dist/agent/needsPlanning.d.ts +28 -0
  130. package/dist/agent/needsPlanning.d.ts.map +1 -0
  131. package/dist/agent/needsPlanning.js +68 -0
  132. package/dist/agent/needsPlanning.js.map +1 -0
  133. package/dist/agent/seed/index.d.ts +11 -0
  134. package/dist/agent/seed/index.d.ts.map +1 -0
  135. package/dist/agent/seed/index.js +10 -0
  136. package/dist/agent/seed/index.js.map +1 -0
  137. package/dist/agent/seed/orchestrator.d.ts +83 -0
  138. package/dist/agent/seed/orchestrator.d.ts.map +1 -0
  139. package/dist/agent/seed/orchestrator.js +260 -0
  140. package/dist/agent/seed/orchestrator.js.map +1 -0
  141. package/dist/agent/seed/prepare.d.ts +49 -0
  142. package/dist/agent/seed/prepare.d.ts.map +1 -0
  143. package/dist/agent/seed/prepare.js +107 -0
  144. package/dist/agent/seed/prepare.js.map +1 -0
  145. package/dist/agent/seed/types.d.ts +115 -0
  146. package/dist/agent/seed/types.d.ts.map +1 -0
  147. package/dist/agent/seed/types.js +15 -0
  148. package/dist/agent/seed/types.js.map +1 -0
  149. package/dist/agent/sessionStateMachine.d.ts +78 -0
  150. package/dist/agent/sessionStateMachine.d.ts.map +1 -0
  151. package/dist/agent/sessionStateMachine.js +182 -0
  152. package/dist/agent/sessionStateMachine.js.map +1 -0
  153. package/dist/agent/taskTableRenderer.d.ts +51 -0
  154. package/dist/agent/taskTableRenderer.d.ts.map +1 -0
  155. package/dist/agent/taskTableRenderer.js +115 -0
  156. package/dist/agent/taskTableRenderer.js.map +1 -0
  157. package/dist/agent/toolExecutor.d.ts +236 -10
  158. package/dist/agent/toolExecutor.d.ts.map +1 -1
  159. package/dist/agent/toolExecutor.js +932 -21
  160. package/dist/agent/toolExecutor.js.map +1 -1
  161. package/dist/agent/toolLedger.d.ts +120 -0
  162. package/dist/agent/toolLedger.d.ts.map +1 -0
  163. package/dist/agent/toolLedger.js +149 -0
  164. package/dist/agent/toolLedger.js.map +1 -0
  165. package/dist/agent/toolResultCache.d.ts +134 -0
  166. package/dist/agent/toolResultCache.d.ts.map +1 -0
  167. package/dist/agent/toolResultCache.js +243 -0
  168. package/dist/agent/toolResultCache.js.map +1 -0
  169. package/dist/agent/toolResultOffload.d.ts +59 -0
  170. package/dist/agent/toolResultOffload.d.ts.map +1 -0
  171. package/dist/agent/toolResultOffload.js +70 -0
  172. package/dist/agent/toolResultOffload.js.map +1 -0
  173. package/dist/agent/toolRunner.d.ts +59 -0
  174. package/dist/agent/toolRunner.d.ts.map +1 -0
  175. package/dist/agent/toolRunner.js +147 -0
  176. package/dist/agent/toolRunner.js.map +1 -0
  177. package/dist/agent/tracer.d.ts +99 -107
  178. package/dist/agent/tracer.d.ts.map +1 -1
  179. package/dist/agent/tracer.js +24 -69
  180. package/dist/agent/tracer.js.map +1 -1
  181. package/dist/agent/types.d.ts +510 -169
  182. package/dist/agent/types.d.ts.map +1 -1
  183. package/dist/agent/types.js +2 -51
  184. package/dist/agent/types.js.map +1 -1
  185. package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
  186. package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
  187. package/dist/code-exec/codeExecutionProvider.js +57 -0
  188. package/dist/code-exec/codeExecutionProvider.js.map +1 -0
  189. package/dist/code-exec/types.d.ts +37 -0
  190. package/dist/code-exec/types.d.ts.map +1 -0
  191. package/dist/code-exec/types.js +12 -0
  192. package/dist/code-exec/types.js.map +1 -0
  193. package/dist/config/expandEnvVars.d.ts +22 -0
  194. package/dist/config/expandEnvVars.d.ts.map +1 -0
  195. package/dist/config/expandEnvVars.js +38 -0
  196. package/dist/config/expandEnvVars.js.map +1 -0
  197. package/dist/config/loader.d.ts +27 -98
  198. package/dist/config/loader.d.ts.map +1 -1
  199. package/dist/config/loader.js +110 -223
  200. package/dist/config/loader.js.map +1 -1
  201. package/dist/index.d.ts +67 -77
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +90 -69
  204. package/dist/index.js.map +1 -1
  205. package/dist/llm/abortSignal.d.ts +2 -3
  206. package/dist/llm/abortSignal.d.ts.map +1 -1
  207. package/dist/llm/abortSignal.js +2 -3
  208. package/dist/llm/abortSignal.js.map +1 -1
  209. package/dist/llm/factory.d.ts +22 -32
  210. package/dist/llm/factory.d.ts.map +1 -1
  211. package/dist/llm/factory.js +29 -46
  212. package/dist/llm/factory.js.map +1 -1
  213. package/dist/llm/openaiCompatible.d.ts +25 -40
  214. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  215. package/dist/llm/openaiCompatible.js +179 -120
  216. package/dist/llm/openaiCompatible.js.map +1 -1
  217. package/dist/llm/provider.d.ts +29 -42
  218. package/dist/llm/provider.d.ts.map +1 -1
  219. package/dist/llm/provider.js +11 -10
  220. package/dist/llm/provider.js.map +1 -1
  221. package/dist/llm/types.d.ts +54 -11
  222. package/dist/llm/types.d.ts.map +1 -1
  223. package/dist/llm/types.js +0 -5
  224. package/dist/llm/types.js.map +1 -1
  225. package/dist/logging/logger.d.ts +8 -31
  226. package/dist/logging/logger.d.ts.map +1 -1
  227. package/dist/logging/logger.js +28 -215
  228. package/dist/logging/logger.js.map +1 -1
  229. package/dist/logging/loggerInterface.d.ts +9 -8
  230. package/dist/logging/loggerInterface.d.ts.map +1 -1
  231. package/dist/memory/gcService.d.ts +164 -0
  232. package/dist/memory/gcService.d.ts.map +1 -0
  233. package/dist/memory/gcService.js +215 -0
  234. package/dist/memory/gcService.js.map +1 -0
  235. package/dist/memory/governance.d.ts +11 -44
  236. package/dist/memory/governance.d.ts.map +1 -1
  237. package/dist/memory/governance.js +11 -64
  238. package/dist/memory/governance.js.map +1 -1
  239. package/dist/memory/inMemoryRoundStore.d.ts +124 -0
  240. package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
  241. package/dist/memory/inMemoryRoundStore.js +216 -0
  242. package/dist/memory/inMemoryRoundStore.js.map +1 -0
  243. package/dist/memory/inMemorySessionStore.d.ts +92 -0
  244. package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
  245. package/dist/memory/inMemorySessionStore.js +219 -0
  246. package/dist/memory/inMemorySessionStore.js.map +1 -0
  247. package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
  248. package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
  249. package/dist/memory/inMemorySessionViewLoader.js +183 -0
  250. package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
  251. package/dist/memory/inMemoryStorage.d.ts +25 -175
  252. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  253. package/dist/memory/inMemoryStorage.js +32 -221
  254. package/dist/memory/inMemoryStorage.js.map +1 -1
  255. package/dist/memory/keywordsTouch.d.ts +20 -0
  256. package/dist/memory/keywordsTouch.d.ts.map +1 -0
  257. package/dist/memory/keywordsTouch.js +25 -0
  258. package/dist/memory/keywordsTouch.js.map +1 -0
  259. package/dist/memory/lockManager.d.ts +2 -2
  260. package/dist/memory/lockManager.d.ts.map +1 -1
  261. package/dist/memory/lockManager.js +6 -8
  262. package/dist/memory/lockManager.js.map +1 -1
  263. package/dist/memory/projectManager.d.ts +30 -129
  264. package/dist/memory/projectManager.d.ts.map +1 -1
  265. package/dist/memory/projectManager.js +39 -189
  266. package/dist/memory/projectManager.js.map +1 -1
  267. package/dist/memory/projectRegistry.d.ts +14 -62
  268. package/dist/memory/projectRegistry.d.ts.map +1 -1
  269. package/dist/memory/projectRegistry.js +27 -111
  270. package/dist/memory/projectRegistry.js.map +1 -1
  271. package/dist/memory/roundStore.d.ts +629 -0
  272. package/dist/memory/roundStore.d.ts.map +1 -0
  273. package/dist/memory/roundStore.js +116 -0
  274. package/dist/memory/roundStore.js.map +1 -0
  275. package/dist/memory/sessionStore.d.ts +70 -61
  276. package/dist/memory/sessionStore.d.ts.map +1 -1
  277. package/dist/memory/sessionStore.js +23 -1
  278. package/dist/memory/sessionStore.js.map +1 -1
  279. package/dist/memory/sessionViewLoader.d.ts +141 -0
  280. package/dist/memory/sessionViewLoader.d.ts.map +1 -0
  281. package/dist/memory/sessionViewLoader.js +65 -0
  282. package/dist/memory/sessionViewLoader.js.map +1 -0
  283. package/dist/memory/sourceValidation.d.ts +10 -12
  284. package/dist/memory/sourceValidation.d.ts.map +1 -1
  285. package/dist/memory/sourceValidation.js +16 -32
  286. package/dist/memory/sourceValidation.js.map +1 -1
  287. package/dist/memory/storageInterface.d.ts +44 -150
  288. package/dist/memory/storageInterface.d.ts.map +1 -1
  289. package/dist/memory/types.d.ts +65 -164
  290. package/dist/memory/types.d.ts.map +1 -1
  291. package/dist/memory/types.js +81 -83
  292. package/dist/memory/types.js.map +1 -1
  293. package/dist/project-search/projectSearchProvider.d.ts +29 -0
  294. package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
  295. package/dist/project-search/projectSearchProvider.js +57 -0
  296. package/dist/project-search/projectSearchProvider.js.map +1 -0
  297. package/dist/project-search/terms.d.ts +14 -0
  298. package/dist/project-search/terms.d.ts.map +1 -0
  299. package/dist/project-search/terms.js +68 -0
  300. package/dist/project-search/terms.js.map +1 -0
  301. package/dist/project-search/types.d.ts +139 -0
  302. package/dist/project-search/types.d.ts.map +1 -0
  303. package/dist/project-search/types.js +8 -0
  304. package/dist/project-search/types.js.map +1 -0
  305. package/dist/role-pack/capabilityMap.d.ts +28 -0
  306. package/dist/role-pack/capabilityMap.d.ts.map +1 -0
  307. package/dist/role-pack/capabilityMap.js +56 -0
  308. package/dist/role-pack/capabilityMap.js.map +1 -0
  309. package/dist/role-pack/constants.d.ts +21 -0
  310. package/dist/role-pack/constants.d.ts.map +1 -0
  311. package/dist/role-pack/constants.js +21 -0
  312. package/dist/role-pack/constants.js.map +1 -0
  313. package/dist/role-pack/rolePackManager.d.ts +269 -0
  314. package/dist/role-pack/rolePackManager.d.ts.map +1 -0
  315. package/dist/role-pack/rolePackManager.js +1082 -0
  316. package/dist/role-pack/rolePackManager.js.map +1 -0
  317. package/dist/role-pack/strategyKeys.d.ts +100 -0
  318. package/dist/role-pack/strategyKeys.d.ts.map +1 -0
  319. package/dist/role-pack/strategyKeys.js +184 -0
  320. package/dist/role-pack/strategyKeys.js.map +1 -0
  321. package/dist/role-pack/strategyResolver.d.ts +109 -0
  322. package/dist/role-pack/strategyResolver.d.ts.map +1 -0
  323. package/dist/role-pack/strategyResolver.js +304 -0
  324. package/dist/role-pack/strategyResolver.js.map +1 -0
  325. package/dist/role-pack/types.d.ts +237 -0
  326. package/dist/role-pack/types.d.ts.map +1 -0
  327. package/dist/role-pack/types.js +8 -0
  328. package/dist/role-pack/types.js.map +1 -0
  329. package/dist/role-pack/validator.d.ts +38 -0
  330. package/dist/role-pack/validator.d.ts.map +1 -0
  331. package/dist/role-pack/validator.js +436 -0
  332. package/dist/role-pack/validator.js.map +1 -0
  333. package/dist/security/pathGuard.d.ts +69 -72
  334. package/dist/security/pathGuard.d.ts.map +1 -1
  335. package/dist/security/pathGuard.js +151 -131
  336. package/dist/security/pathGuard.js.map +1 -1
  337. package/dist/skill/skillLayer3.d.ts +91 -0
  338. package/dist/skill/skillLayer3.d.ts.map +1 -0
  339. package/dist/skill/skillLayer3.js +104 -0
  340. package/dist/skill/skillLayer3.js.map +1 -0
  341. package/dist/skill/skillManager.d.ts +136 -19
  342. package/dist/skill/skillManager.d.ts.map +1 -1
  343. package/dist/skill/skillManager.js +312 -61
  344. package/dist/skill/skillManager.js.map +1 -1
  345. package/dist/skill/skillScriptRunner.d.ts +97 -0
  346. package/dist/skill/skillScriptRunner.d.ts.map +1 -0
  347. package/dist/skill/skillScriptRunner.js +271 -0
  348. package/dist/skill/skillScriptRunner.js.map +1 -0
  349. package/dist/skill/types.d.ts +73 -16
  350. package/dist/skill/types.d.ts.map +1 -1
  351. package/dist/skill/types.js +5 -1
  352. package/dist/skill/types.js.map +1 -1
  353. package/dist/utils/array.d.ts +5 -6
  354. package/dist/utils/array.d.ts.map +1 -1
  355. package/dist/utils/array.js +6 -6
  356. package/dist/utils/array.js.map +1 -1
  357. package/dist/utils/atomicWrite.d.ts +8 -0
  358. package/dist/utils/atomicWrite.d.ts.map +1 -0
  359. package/dist/utils/atomicWrite.js +31 -0
  360. package/dist/utils/atomicWrite.js.map +1 -0
  361. package/dist/utils/backgroundTask.d.ts +38 -0
  362. package/dist/utils/backgroundTask.d.ts.map +1 -0
  363. package/dist/utils/backgroundTask.js +117 -0
  364. package/dist/utils/backgroundTask.js.map +1 -0
  365. package/dist/utils/configResourceManager.d.ts +40 -72
  366. package/dist/utils/configResourceManager.d.ts.map +1 -1
  367. package/dist/utils/configResourceManager.js +78 -76
  368. package/dist/utils/configResourceManager.js.map +1 -1
  369. package/dist/utils/errors.d.ts +44 -69
  370. package/dist/utils/errors.d.ts.map +1 -1
  371. package/dist/utils/errors.js +54 -71
  372. package/dist/utils/errors.js.map +1 -1
  373. package/dist/utils/eventEmitter.d.ts +104 -103
  374. package/dist/utils/eventEmitter.d.ts.map +1 -1
  375. package/dist/utils/eventEmitter.js +37 -45
  376. package/dist/utils/eventEmitter.js.map +1 -1
  377. package/dist/utils/fileSafe.d.ts +20 -0
  378. package/dist/utils/fileSafe.d.ts.map +1 -0
  379. package/dist/utils/fileSafe.js +56 -0
  380. package/dist/utils/fileSafe.js.map +1 -0
  381. package/dist/utils/frontmatter.d.ts +2 -3
  382. package/dist/utils/frontmatter.d.ts.map +1 -1
  383. package/dist/utils/frontmatter.js +2 -3
  384. package/dist/utils/frontmatter.js.map +1 -1
  385. package/dist/utils/hash.d.ts +12 -0
  386. package/dist/utils/hash.d.ts.map +1 -0
  387. package/dist/utils/hash.js +27 -0
  388. package/dist/utils/hash.js.map +1 -0
  389. package/dist/utils/http.d.ts +17 -0
  390. package/dist/utils/http.d.ts.map +1 -0
  391. package/dist/utils/http.js +29 -0
  392. package/dist/utils/http.js.map +1 -0
  393. package/dist/utils/json.d.ts +1 -1
  394. package/dist/utils/json.js +1 -1
  395. package/dist/utils/math.d.ts +25 -3
  396. package/dist/utils/math.d.ts.map +1 -1
  397. package/dist/utils/math.js +32 -16
  398. package/dist/utils/math.js.map +1 -1
  399. package/dist/utils/objects.d.ts +2 -3
  400. package/dist/utils/objects.d.ts.map +1 -1
  401. package/dist/utils/objects.js +2 -3
  402. package/dist/utils/objects.js.map +1 -1
  403. package/dist/utils/recallDefaults.d.ts +16 -0
  404. package/dist/utils/recallDefaults.d.ts.map +1 -0
  405. package/dist/utils/recallDefaults.js +16 -0
  406. package/dist/utils/recallDefaults.js.map +1 -0
  407. package/dist/utils/safeTimer.d.ts +8 -36
  408. package/dist/utils/safeTimer.d.ts.map +1 -1
  409. package/dist/utils/safeTimer.js +9 -37
  410. package/dist/utils/safeTimer.js.map +1 -1
  411. package/dist/utils/scanner.d.ts +97 -17
  412. package/dist/utils/scanner.d.ts.map +1 -1
  413. package/dist/utils/scanner.js +269 -47
  414. package/dist/utils/scanner.js.map +1 -1
  415. package/dist/utils/segmenter.d.ts +20 -19
  416. package/dist/utils/segmenter.d.ts.map +1 -1
  417. package/dist/utils/segmenter.js +230 -97
  418. package/dist/utils/segmenter.js.map +1 -1
  419. package/dist/utils/strings.d.ts +15 -32
  420. package/dist/utils/strings.d.ts.map +1 -1
  421. package/dist/utils/strings.js +25 -44
  422. package/dist/utils/strings.js.map +1 -1
  423. package/dist/utils/time.d.ts +37 -0
  424. package/dist/utils/time.d.ts.map +1 -1
  425. package/dist/utils/time.js +56 -0
  426. package/dist/utils/time.js.map +1 -1
  427. package/dist/utils/toError.d.ts +13 -1
  428. package/dist/utils/toError.d.ts.map +1 -1
  429. package/dist/utils/toError.js +18 -1
  430. package/dist/utils/toError.js.map +1 -1
  431. package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
  432. package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
  433. package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
  434. package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
  435. package/dist/web-fetch/types.d.ts +30 -0
  436. package/dist/web-fetch/types.d.ts.map +1 -0
  437. package/dist/web-fetch/types.js +7 -0
  438. package/dist/web-fetch/types.js.map +1 -0
  439. package/dist/web-fetch/webFetchProvider.d.ts +10 -0
  440. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
  441. package/dist/web-fetch/webFetchProvider.js +28 -0
  442. package/dist/web-fetch/webFetchProvider.js.map +1 -0
  443. package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
  444. package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
  445. package/dist/web-search/fetchWebSearchProvider.js +199 -0
  446. package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
  447. package/dist/web-search/types.d.ts +46 -0
  448. package/dist/web-search/types.d.ts.map +1 -0
  449. package/dist/web-search/types.js +2 -0
  450. package/dist/{persona → web-search}/types.js.map +1 -1
  451. package/dist/web-search/webSearchProvider.d.ts +10 -0
  452. package/dist/web-search/webSearchProvider.d.ts.map +1 -0
  453. package/dist/web-search/webSearchProvider.js +30 -0
  454. package/dist/web-search/webSearchProvider.js.map +1 -0
  455. package/docs/architecture/role-pack-authoring-guide.md +243 -0
  456. package/docs/architecture/role-pack-spec.md +767 -0
  457. package/docs/memora-api-reference.md +416 -476
  458. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +841 -806
  459. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
  460. package/package.json +105 -100
  461. package/role-packs/README.md +41 -0
  462. package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
  463. package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
  464. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
  465. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
  466. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
  467. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
  468. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
  469. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
  470. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
  471. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
  472. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
  473. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
  474. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
  475. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
  476. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
  477. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
  478. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
  479. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
  480. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
  481. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
  482. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
  483. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
  484. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
  485. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +441 -0
  486. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
  487. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
  488. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
  489. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
  490. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
  491. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
  492. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
  493. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +48 -0
  494. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
  495. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
  496. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
  497. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
  498. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
  499. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
  500. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
  501. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
  502. package/dist/agent/guardrail.d.ts +0 -49
  503. package/dist/agent/guardrail.d.ts.map +0 -1
  504. package/dist/agent/guardrail.js +0 -59
  505. package/dist/agent/guardrail.js.map +0 -1
  506. package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
  507. package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
  508. package/dist/agent/managers/autoConfigRefiner.js +0 -146
  509. package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
  510. package/dist/agent/managers/configManager.d.ts +0 -209
  511. package/dist/agent/managers/configManager.d.ts.map +0 -1
  512. package/dist/agent/managers/configManager.js +0 -331
  513. package/dist/agent/managers/configManager.js.map +0 -1
  514. package/dist/agent/managers/insightExtractor.d.ts +0 -139
  515. package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
  516. package/dist/agent/managers/insightExtractor.js +0 -401
  517. package/dist/agent/managers/insightExtractor.js.map +0 -1
  518. package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -239
  519. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
  520. package/dist/agent/managers/memoryDecayScheduler.js +0 -413
  521. package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
  522. package/dist/agent/managers/relationBuilder.d.ts +0 -131
  523. package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
  524. package/dist/agent/managers/relationBuilder.js +0 -192
  525. package/dist/agent/managers/relationBuilder.js.map +0 -1
  526. package/dist/agent/personaMatcher.d.ts +0 -29
  527. package/dist/agent/personaMatcher.d.ts.map +0 -1
  528. package/dist/agent/personaMatcher.js +0 -60
  529. package/dist/agent/personaMatcher.js.map +0 -1
  530. package/dist/agent/userFactExtractor.d.ts +0 -25
  531. package/dist/agent/userFactExtractor.d.ts.map +0 -1
  532. package/dist/agent/userFactExtractor.js +0 -88
  533. package/dist/agent/userFactExtractor.js.map +0 -1
  534. package/dist/eval/evalRunner.d.ts +0 -94
  535. package/dist/eval/evalRunner.d.ts.map +0 -1
  536. package/dist/eval/evalRunner.js +0 -141
  537. package/dist/eval/evalRunner.js.map +0 -1
  538. package/dist/eval/evalTypes.d.ts +0 -148
  539. package/dist/eval/evalTypes.d.ts.map +0 -1
  540. package/dist/eval/evalTypes.js +0 -118
  541. package/dist/eval/evalTypes.js.map +0 -1
  542. package/dist/eval/scenarios.d.ts +0 -33
  543. package/dist/eval/scenarios.d.ts.map +0 -1
  544. package/dist/eval/scenarios.js +0 -109
  545. package/dist/eval/scenarios.js.map +0 -1
  546. package/dist/llm/embedding.d.ts +0 -79
  547. package/dist/llm/embedding.d.ts.map +0 -1
  548. package/dist/llm/embedding.js +0 -184
  549. package/dist/llm/embedding.js.map +0 -1
  550. package/dist/memory/hybridMerge.d.ts +0 -50
  551. package/dist/memory/hybridMerge.d.ts.map +0 -1
  552. package/dist/memory/hybridMerge.js +0 -51
  553. package/dist/memory/hybridMerge.js.map +0 -1
  554. package/dist/memory/inMemoryRelationStore.d.ts +0 -58
  555. package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
  556. package/dist/memory/inMemoryRelationStore.js +0 -80
  557. package/dist/memory/inMemoryRelationStore.js.map +0 -1
  558. package/dist/memory/loader.d.ts +0 -51
  559. package/dist/memory/loader.d.ts.map +0 -1
  560. package/dist/memory/loader.js +0 -100
  561. package/dist/memory/loader.js.map +0 -1
  562. package/dist/memory/recall.d.ts +0 -82
  563. package/dist/memory/recall.d.ts.map +0 -1
  564. package/dist/memory/recall.js +0 -157
  565. package/dist/memory/recall.js.map +0 -1
  566. package/dist/memory/relationStore.d.ts +0 -95
  567. package/dist/memory/relationStore.d.ts.map +0 -1
  568. package/dist/memory/relationStore.js +0 -2
  569. package/dist/memory/relationStore.js.map +0 -1
  570. package/dist/memory/store.d.ts +0 -71
  571. package/dist/memory/store.d.ts.map +0 -1
  572. package/dist/memory/store.js +0 -199
  573. package/dist/memory/store.js.map +0 -1
  574. package/dist/memory/userProfile.d.ts +0 -180
  575. package/dist/memory/userProfile.d.ts.map +0 -1
  576. package/dist/memory/userProfile.js +0 -381
  577. package/dist/memory/userProfile.js.map +0 -1
  578. package/dist/memory/vectorStore.d.ts +0 -179
  579. package/dist/memory/vectorStore.d.ts.map +0 -1
  580. package/dist/memory/vectorStore.js +0 -284
  581. package/dist/memory/vectorStore.js.map +0 -1
  582. package/dist/persona/personaManager.d.ts +0 -109
  583. package/dist/persona/personaManager.d.ts.map +0 -1
  584. package/dist/persona/personaManager.js +0 -315
  585. package/dist/persona/personaManager.js.map +0 -1
  586. package/dist/persona/types.d.ts +0 -32
  587. package/dist/persona/types.d.ts.map +0 -1
  588. package/dist/persona/types.js +0 -5
@@ -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"}