@illuma-ai/agents 1.5.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/README.md +0 -62
  2. package/dist/cjs/agents/AgentContext.cjs +160 -259
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/enum.cjs +12 -12
  5. package/dist/cjs/common/enum.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +30 -13
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  10. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +1 -1
  11. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
  12. package/dist/cjs/hooks/HookRegistry.cjs +1 -1
  13. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  14. package/dist/cjs/hooks/matchers.cjs +2 -2
  15. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  16. package/dist/cjs/hooks/types.cjs +1 -1
  17. package/dist/cjs/hooks/types.cjs.map +1 -1
  18. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +1 -5
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  20. package/dist/cjs/llm/bedrock/index.cjs +33 -61
  21. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  22. package/dist/cjs/llm/openai/index.cjs +1 -1
  23. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  24. package/dist/cjs/llm/openai/utils/index.cjs +10 -27
  25. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  26. package/dist/cjs/main.cjs +3 -84
  27. package/dist/cjs/main.cjs.map +1 -1
  28. package/dist/cjs/memory/citations.cjs +4 -4
  29. package/dist/cjs/memory/citations.cjs.map +1 -1
  30. package/dist/cjs/memory/constants.cjs +17 -17
  31. package/dist/cjs/memory/constants.cjs.map +1 -1
  32. package/dist/cjs/memory/mmr.cjs +1 -1
  33. package/dist/cjs/memory/mmr.cjs.map +1 -1
  34. package/dist/cjs/memory/paths.cjs +1 -1
  35. package/dist/cjs/memory/paths.cjs.map +1 -1
  36. package/dist/cjs/memory/recallTracking.cjs +3 -3
  37. package/dist/cjs/memory/recallTracking.cjs.map +1 -1
  38. package/dist/cjs/memory/temporalDecay.cjs +2 -2
  39. package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
  40. package/dist/cjs/messages/cache.cjs +0 -89
  41. package/dist/cjs/messages/cache.cjs.map +1 -1
  42. package/dist/cjs/messages/format.cjs +13 -71
  43. package/dist/cjs/messages/format.cjs.map +1 -1
  44. package/dist/cjs/tools/BashExecutor.cjs +11 -21
  45. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  46. package/dist/cjs/tools/CodeExecutor.cjs +13 -41
  47. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  48. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +11 -16
  49. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  50. package/dist/cjs/tools/ToolNode.cjs +78 -13
  51. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  52. package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
  53. package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
  54. package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
  55. package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
  56. package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
  57. package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
  58. package/dist/cjs/tools/memory/shared.cjs +1 -1
  59. package/dist/cjs/tools/memory/shared.cjs.map +1 -1
  60. package/dist/cjs/tools/search/search.cjs +3 -11
  61. package/dist/cjs/tools/search/search.cjs.map +1 -1
  62. package/dist/cjs/tools/search/tool.cjs +4 -28
  63. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  64. package/dist/cjs/tools/search/utils.cjs +3 -10
  65. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  66. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +48 -0
  67. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  68. package/dist/cjs/types/graph.cjs.map +1 -1
  69. package/dist/esm/agents/AgentContext.mjs +160 -259
  70. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  71. package/dist/esm/common/enum.mjs +12 -12
  72. package/dist/esm/common/enum.mjs.map +1 -1
  73. package/dist/esm/graphs/Graph.mjs +30 -13
  74. package/dist/esm/graphs/Graph.mjs.map +1 -1
  75. package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
  76. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  77. package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
  78. package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
  79. package/dist/esm/hooks/HookRegistry.mjs +1 -1
  80. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  81. package/dist/esm/hooks/matchers.mjs +2 -2
  82. package/dist/esm/hooks/matchers.mjs.map +1 -1
  83. package/dist/esm/hooks/types.mjs +1 -1
  84. package/dist/esm/hooks/types.mjs.map +1 -1
  85. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +1 -5
  86. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  87. package/dist/esm/llm/bedrock/index.mjs +34 -61
  88. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  89. package/dist/esm/llm/openai/index.mjs +1 -1
  90. package/dist/esm/llm/openai/index.mjs.map +1 -1
  91. package/dist/esm/llm/openai/utils/index.mjs +10 -27
  92. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  93. package/dist/esm/main.mjs +1 -5
  94. package/dist/esm/main.mjs.map +1 -1
  95. package/dist/esm/memory/citations.mjs +4 -4
  96. package/dist/esm/memory/citations.mjs.map +1 -1
  97. package/dist/esm/memory/constants.mjs +17 -17
  98. package/dist/esm/memory/constants.mjs.map +1 -1
  99. package/dist/esm/memory/mmr.mjs +1 -1
  100. package/dist/esm/memory/mmr.mjs.map +1 -1
  101. package/dist/esm/memory/paths.mjs +1 -1
  102. package/dist/esm/memory/paths.mjs.map +1 -1
  103. package/dist/esm/memory/recallTracking.mjs +3 -3
  104. package/dist/esm/memory/recallTracking.mjs.map +1 -1
  105. package/dist/esm/memory/temporalDecay.mjs +2 -2
  106. package/dist/esm/memory/temporalDecay.mjs.map +1 -1
  107. package/dist/esm/messages/cache.mjs +0 -89
  108. package/dist/esm/messages/cache.mjs.map +1 -1
  109. package/dist/esm/messages/format.mjs +13 -71
  110. package/dist/esm/messages/format.mjs.map +1 -1
  111. package/dist/esm/tools/BashExecutor.mjs +12 -22
  112. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  113. package/dist/esm/tools/CodeExecutor.mjs +14 -41
  114. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  115. package/dist/esm/tools/ProgrammaticToolCalling.mjs +12 -17
  116. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  117. package/dist/esm/tools/ToolNode.mjs +78 -13
  118. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  119. package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
  120. package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
  121. package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
  122. package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
  123. package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
  124. package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
  125. package/dist/esm/tools/memory/shared.mjs +1 -1
  126. package/dist/esm/tools/memory/shared.mjs.map +1 -1
  127. package/dist/esm/tools/search/search.mjs +3 -11
  128. package/dist/esm/tools/search/search.mjs.map +1 -1
  129. package/dist/esm/tools/search/tool.mjs +4 -28
  130. package/dist/esm/tools/search/tool.mjs.map +1 -1
  131. package/dist/esm/tools/search/utils.mjs +3 -10
  132. package/dist/esm/tools/search/utils.mjs.map +1 -1
  133. package/dist/esm/tools/subagent/SubagentExecutor.mjs +48 -0
  134. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  135. package/dist/esm/types/graph.mjs.map +1 -1
  136. package/dist/types/agents/AgentContext.d.ts +25 -95
  137. package/dist/types/common/enum.d.ts +12 -12
  138. package/dist/types/graphs/Graph.d.ts +2 -2
  139. package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
  140. package/dist/types/hooks/HookRegistry.d.ts +1 -1
  141. package/dist/types/hooks/matchers.d.ts +2 -2
  142. package/dist/types/hooks/types.d.ts +1 -1
  143. package/dist/types/index.d.ts +0 -1
  144. package/dist/types/llm/bedrock/index.d.ts +1 -54
  145. package/dist/types/llm/openai/index.d.ts +1 -1
  146. package/dist/types/memory/citations.d.ts +4 -4
  147. package/dist/types/memory/constants.d.ts +17 -17
  148. package/dist/types/memory/mmr.d.ts +3 -3
  149. package/dist/types/memory/paths.d.ts +1 -1
  150. package/dist/types/memory/temporalDecay.d.ts +2 -2
  151. package/dist/types/memory/types.d.ts +3 -3
  152. package/dist/types/messages/format.d.ts +2 -5
  153. package/dist/types/tools/CodeExecutor.d.ts +0 -6
  154. package/dist/types/tools/ToolNode.d.ts +3 -3
  155. package/dist/types/tools/memory/shared.d.ts +1 -1
  156. package/dist/types/tools/search/test.d.ts +1 -0
  157. package/dist/types/tools/search/types.d.ts +5 -99
  158. package/dist/types/tools/search/utils.d.ts +2 -2
  159. package/dist/types/tools/subagent/SubagentExecutor.d.ts +29 -0
  160. package/dist/types/types/graph.d.ts +30 -34
  161. package/dist/types/types/index.d.ts +0 -1
  162. package/dist/types/types/messages.d.ts +1 -1
  163. package/dist/types/types/run.d.ts +1 -3
  164. package/dist/types/types/tools.d.ts +5 -14
  165. package/package.json +1 -61
  166. package/src/agents/AgentContext.test.ts +176 -0
  167. package/src/agents/AgentContext.ts +179 -305
  168. package/src/agents/__tests__/AgentContext.test.ts +0 -632
  169. package/src/common/__tests__/enum.test.ts +1 -1
  170. package/src/common/enum.ts +12 -12
  171. package/src/graphs/Graph.ts +32 -13
  172. package/src/graphs/MultiAgentGraph.ts +1 -1
  173. package/src/graphs/gapFeatures.test.ts +1 -1
  174. package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
  175. package/src/graphs/phases/memoryFlushPhase.ts +2 -2
  176. package/src/hooks/HookRegistry.ts +1 -1
  177. package/src/hooks/index.ts +1 -1
  178. package/src/hooks/matchers.ts +2 -2
  179. package/src/hooks/types.ts +1 -1
  180. package/src/index.ts +0 -6
  181. package/src/llm/anthropic/utils/message_inputs.ts +1 -10
  182. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +18 -166
  183. package/src/llm/bedrock/index.ts +41 -116
  184. package/src/llm/openai/index.ts +2 -2
  185. package/src/llm/openai/utils/index.ts +14 -31
  186. package/src/memory/citations.ts +4 -4
  187. package/src/memory/constants.ts +17 -17
  188. package/src/memory/mmr.ts +3 -3
  189. package/src/memory/paths.ts +1 -1
  190. package/src/memory/recallTracking.ts +3 -3
  191. package/src/memory/temporalDecay.ts +2 -2
  192. package/src/memory/types.ts +3 -3
  193. package/src/messages/cache.test.ts +24 -62
  194. package/src/messages/cache.ts +0 -112
  195. package/src/messages/ensureThinkingBlock.test.ts +1 -1
  196. package/src/messages/format.ts +13 -92
  197. package/src/messages/formatAgentMessages.test.ts +1 -1
  198. package/src/scripts/subagent-configurable-inheritance.ts +263 -0
  199. package/src/scripts/subagent-event-driven-debug.ts +2 -2
  200. package/src/specs/anthropic.simple.test.ts +0 -61
  201. package/src/specs/prune.orphans.test.ts +1 -1
  202. package/src/tools/BashExecutor.ts +13 -37
  203. package/src/tools/CodeExecutor.ts +14 -59
  204. package/src/tools/ProgrammaticToolCalling.ts +14 -29
  205. package/src/tools/ToolNode.ts +75 -14
  206. package/src/tools/__tests__/CodeExecutor.test.ts +3 -3
  207. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -60
  208. package/src/tools/__tests__/SubagentExecutor.test.ts +157 -0
  209. package/src/tools/memory/memoryAppendTool.ts +1 -1
  210. package/src/tools/memory/memoryGetTool.ts +2 -2
  211. package/src/tools/memory/memorySearchTool.ts +3 -3
  212. package/src/tools/memory/shared.ts +1 -1
  213. package/src/tools/search/output.md +2775 -0
  214. package/src/tools/search/search.ts +2 -12
  215. package/src/tools/search/test.html +884 -0
  216. package/src/tools/search/test.md +643 -0
  217. package/src/tools/search/test.ts +159 -0
  218. package/src/tools/search/tool.ts +2 -36
  219. package/src/tools/search/types.ts +8 -133
  220. package/src/tools/search/utils.ts +5 -13
  221. package/src/tools/subagent/SubagentExecutor.ts +78 -0
  222. package/src/types/graph.ts +27 -34
  223. package/src/types/index.ts +0 -1
  224. package/src/types/messages.ts +1 -1
  225. package/src/types/run.ts +1 -3
  226. package/src/types/tools.ts +5 -14
  227. package/dist/cjs/langchain/google-common.cjs +0 -3
  228. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  229. package/dist/cjs/langchain/index.cjs +0 -86
  230. package/dist/cjs/langchain/index.cjs.map +0 -1
  231. package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
  232. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  233. package/dist/cjs/langchain/messages/tool.cjs +0 -3
  234. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  235. package/dist/cjs/langchain/messages.cjs +0 -51
  236. package/dist/cjs/langchain/messages.cjs.map +0 -1
  237. package/dist/cjs/langchain/openai.cjs +0 -3
  238. package/dist/cjs/langchain/openai.cjs.map +0 -1
  239. package/dist/cjs/langchain/prompts.cjs +0 -11
  240. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  241. package/dist/cjs/langchain/runnables.cjs +0 -19
  242. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  243. package/dist/cjs/langchain/tools.cjs +0 -23
  244. package/dist/cjs/langchain/tools.cjs.map +0 -1
  245. package/dist/cjs/langchain/utils/env.cjs +0 -11
  246. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  247. package/dist/cjs/llm/bedrock/cacheSupport.cjs +0 -55
  248. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +0 -1
  249. package/dist/cjs/tools/search/tavily-scraper.cjs +0 -189
  250. package/dist/cjs/tools/search/tavily-scraper.cjs.map +0 -1
  251. package/dist/cjs/tools/search/tavily-search.cjs +0 -372
  252. package/dist/cjs/tools/search/tavily-search.cjs.map +0 -1
  253. package/dist/cjs/types/agent-cache.cjs +0 -54
  254. package/dist/cjs/types/agent-cache.cjs.map +0 -1
  255. package/dist/esm/langchain/google-common.mjs +0 -2
  256. package/dist/esm/langchain/google-common.mjs.map +0 -1
  257. package/dist/esm/langchain/index.mjs +0 -5
  258. package/dist/esm/langchain/index.mjs.map +0 -1
  259. package/dist/esm/langchain/language_models/chat_models.mjs +0 -2
  260. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  261. package/dist/esm/langchain/messages/tool.mjs +0 -2
  262. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  263. package/dist/esm/langchain/messages.mjs +0 -2
  264. package/dist/esm/langchain/messages.mjs.map +0 -1
  265. package/dist/esm/langchain/openai.mjs +0 -2
  266. package/dist/esm/langchain/openai.mjs.map +0 -1
  267. package/dist/esm/langchain/prompts.mjs +0 -2
  268. package/dist/esm/langchain/prompts.mjs.map +0 -1
  269. package/dist/esm/langchain/runnables.mjs +0 -2
  270. package/dist/esm/langchain/runnables.mjs.map +0 -1
  271. package/dist/esm/langchain/tools.mjs +0 -2
  272. package/dist/esm/langchain/tools.mjs.map +0 -1
  273. package/dist/esm/langchain/utils/env.mjs +0 -2
  274. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  275. package/dist/esm/llm/bedrock/cacheSupport.mjs +0 -52
  276. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +0 -1
  277. package/dist/esm/tools/search/tavily-scraper.mjs +0 -186
  278. package/dist/esm/tools/search/tavily-scraper.mjs.map +0 -1
  279. package/dist/esm/tools/search/tavily-search.mjs +0 -370
  280. package/dist/esm/tools/search/tavily-search.mjs.map +0 -1
  281. package/dist/esm/types/agent-cache.mjs +0 -52
  282. package/dist/esm/types/agent-cache.mjs.map +0 -1
  283. package/dist/types/langchain/google-common.d.ts +0 -1
  284. package/dist/types/langchain/index.d.ts +0 -8
  285. package/dist/types/langchain/language_models/chat_models.d.ts +0 -1
  286. package/dist/types/langchain/messages/tool.d.ts +0 -1
  287. package/dist/types/langchain/messages.d.ts +0 -2
  288. package/dist/types/langchain/openai.d.ts +0 -1
  289. package/dist/types/langchain/prompts.d.ts +0 -1
  290. package/dist/types/langchain/runnables.d.ts +0 -2
  291. package/dist/types/langchain/tools.d.ts +0 -2
  292. package/dist/types/langchain/utils/env.d.ts +0 -1
  293. package/dist/types/llm/bedrock/cacheSupport.d.ts +0 -35
  294. package/dist/types/tools/search/tavily-scraper.d.ts +0 -19
  295. package/dist/types/tools/search/tavily-search.d.ts +0 -4
  296. package/dist/types/tools/subagent/types.d.ts +0 -84
  297. package/dist/types/types/agent-cache.d.ts +0 -71
  298. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +0 -259
  299. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +0 -266
  300. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +0 -342
  301. package/src/langchain/google-common.ts +0 -1
  302. package/src/langchain/index.ts +0 -8
  303. package/src/langchain/language_models/chat_models.ts +0 -1
  304. package/src/langchain/messages/tool.ts +0 -5
  305. package/src/langchain/messages.ts +0 -21
  306. package/src/langchain/openai.ts +0 -1
  307. package/src/langchain/prompts.ts +0 -1
  308. package/src/langchain/runnables.ts +0 -7
  309. package/src/langchain/tools.ts +0 -8
  310. package/src/langchain/utils/env.ts +0 -1
  311. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +0 -436
  312. package/src/llm/bedrock/cacheSupport.test.ts +0 -99
  313. package/src/llm/bedrock/cacheSupport.ts +0 -53
  314. package/src/tools/search/tavily-scraper.ts +0 -235
  315. package/src/tools/search/tavily-search.ts +0 -424
  316. package/src/tools/search/tavily.test.ts +0 -965
  317. package/src/tools/subagent/types.test.ts +0 -70
  318. package/src/tools/subagent/types.ts +0 -115
  319. package/src/types/agent-cache.ts +0 -74
@@ -0,0 +1,159 @@
1
+ /* eslint-disable no-console */
2
+ // processWikipedia.ts
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { processContent } from './content';
6
+
7
+ /**
8
+ * Process a Wikipedia article (HTML and Markdown) and create a referenced version
9
+ */
10
+ async function processWikipediaArticle(): Promise<void> {
11
+ try {
12
+ console.log('Starting Wikipedia article processing...');
13
+
14
+ // Define file paths - adapt these to your specific file locations
15
+ const htmlPath = path.resolve('./test.html');
16
+ const markdownPath = path.resolve('./test.md');
17
+ const outputPath = path.resolve('./output.md');
18
+
19
+ // Check if input files exist
20
+ if (!fs.existsSync(htmlPath)) {
21
+ throw new Error(`Wikipedia HTML file not found at ${htmlPath}`);
22
+ }
23
+
24
+ if (!fs.existsSync(markdownPath)) {
25
+ throw new Error(`Wikipedia Markdown file not found at ${markdownPath}`);
26
+ }
27
+
28
+ console.log('Reading Wikipedia article files...');
29
+ const html = fs.readFileSync(htmlPath, 'utf-8');
30
+ const markdown = fs.readFileSync(markdownPath, 'utf-8');
31
+
32
+ // Extract article title for logging
33
+ const titleMatch = /<h1[^>]*>([^<]+)<\/h1>/i.exec(html);
34
+ const articleTitle = titleMatch
35
+ ? titleMatch[1].trim()
36
+ : 'Wikipedia article';
37
+
38
+ console.log(`Processing "${articleTitle}"...`);
39
+
40
+ // Measure processing time
41
+ const startTime = process.hrtime();
42
+
43
+ // Process content
44
+ const result = processContent(html, markdown);
45
+
46
+ // Calculate processing time
47
+ const elapsed = process.hrtime(startTime);
48
+ const timeInMs = elapsed[0] * 1000 + elapsed[1] / 1000000;
49
+
50
+ // Generate reference appendix
51
+ const appendix = generateReferenceAppendix(result);
52
+
53
+ // Create complete output with the processed content and appendix
54
+ const completeOutput = result.markdown + appendix;
55
+
56
+ // Write to output file
57
+ fs.writeFileSync(outputPath, completeOutput);
58
+
59
+ // Print processing statistics
60
+ console.log('\nWikipedia article processing complete! ✓');
61
+ console.log('-'.repeat(60));
62
+ console.log(`Article: ${articleTitle}`);
63
+ console.log(`Processing time: ${timeInMs.toFixed(2)}ms`);
64
+ console.log('Media references replaced:');
65
+ console.log(` - Links: ${result.links.length}`);
66
+ console.log(` - Images: ${result.images.length}`);
67
+ console.log(` - Videos: ${result.videos.length}`);
68
+ console.log(
69
+ ` - Total: ${result.links.length + result.images.length + result.videos.length}`
70
+ );
71
+ console.log(`Output saved to: ${outputPath}`);
72
+ console.log('-'.repeat(60));
73
+
74
+ // Print sample of the transformation
75
+ const sampleLines = result.markdown.split('\n').slice(0, 10).join('\n');
76
+ console.log('\nSample of transformed content:');
77
+ console.log('-'.repeat(30));
78
+ console.log(sampleLines);
79
+ console.log('-'.repeat(30));
80
+ console.log('... (continued in output file)');
81
+ } catch (error) {
82
+ console.error('Error processing Wikipedia article:', error);
83
+ process.exit(1);
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Generate a comprehensive reference appendix with all media links
89
+ */
90
+ function generateReferenceAppendix(result: {
91
+ links: Array<{ originalUrl: string; title?: string; text?: string }>;
92
+ images: Array<{ originalUrl: string; title?: string }>;
93
+ videos: Array<{ originalUrl: string; title?: string }>;
94
+ }): string {
95
+ let appendix = '\n\n' + '---'.repeat(10) + '\n\n';
96
+ appendix += '# References\n\n';
97
+
98
+ if (result.links.length > 0) {
99
+ appendix += '## Links\n\n';
100
+ result.links.forEach((link, index) => {
101
+ // Clean and format text for display
102
+ let displayText = '';
103
+ if (link.text != null && link.text.trim()) {
104
+ // Limit length for very long link text
105
+ let cleanText = link.text.trim();
106
+ if (cleanText.length > 50) {
107
+ cleanText = cleanText.substring(0, 47) + '...';
108
+ }
109
+ displayText = ` - "${cleanText}"`;
110
+ }
111
+
112
+ appendix += `**link#${index + 1}**: ${link.originalUrl}${displayText}\n\n`;
113
+ });
114
+ }
115
+
116
+ if (result.images.length > 0) {
117
+ appendix += '## Images\n\n';
118
+ result.images.forEach((image, index) => {
119
+ const displayTitle =
120
+ image.title != null && image.title.trim()
121
+ ? ` - ${image.title.trim()}`
122
+ : '';
123
+ appendix += `**image#${index + 1}**: ${image.originalUrl}${displayTitle}\n\n`;
124
+ });
125
+ }
126
+
127
+ if (result.videos.length > 0) {
128
+ appendix += '## Videos\n\n';
129
+ result.videos.forEach((video, index) => {
130
+ const displayTitle =
131
+ video.title != null && video.title.trim()
132
+ ? ` - ${video.title.trim()}`
133
+ : '';
134
+ appendix += `**video#${index + 1}**: ${video.originalUrl}${displayTitle}\n\n`;
135
+ });
136
+ }
137
+
138
+ // Add a category breakdown to show what types of links were found
139
+ const totalRefs =
140
+ result.links.length + result.images.length + result.videos.length;
141
+
142
+ appendix += '## Summary\n\n';
143
+ appendix += `Total references: **${totalRefs}**\n\n`;
144
+ appendix += `- Links: ${result.links.length}\n`;
145
+ appendix += `- Images: ${result.images.length}\n`;
146
+ appendix += `- Videos: ${result.videos.length}\n`;
147
+
148
+ return appendix;
149
+ }
150
+
151
+ // Using async IIFE to allow for better error handling
152
+ (async (): Promise<void> => {
153
+ try {
154
+ await processWikipediaArticle();
155
+ } catch (error) {
156
+ console.error('Unhandled error:', error);
157
+ process.exit(1);
158
+ }
159
+ })();
@@ -12,7 +12,6 @@ import {
12
12
  } from './schema';
13
13
  import { createSearchAPI, createSourceProcessor } from './search';
14
14
  import { createSerperScraper } from './serper-scraper';
15
- import { createTavilyScraper } from './tavily-scraper';
16
15
  import { createFirecrawlScraper } from './firecrawl';
17
16
  import { expandHighlights } from './highlights';
18
17
  import { formatResultsForLLM } from './format';
@@ -310,16 +309,12 @@ async function executeParallelSearches({
310
309
  function createSearchProcessor({
311
310
  searchAPI,
312
311
  safeSearch,
313
- supportsVideos,
314
312
  sourceProcessor,
315
313
  scraper,
316
314
  onGetHighlights,
317
315
  logger,
318
316
  }: {
319
317
  safeSearch: t.SearchToolConfig['safeSearch'];
320
- /* Tavily search API does not return videos. Other providers (Serper)
321
- * do — this flag short-circuits the videos request when unsupported. */
322
- supportsVideos: boolean;
323
318
  searchAPI: ReturnType<typeof createSearchAPI>;
324
319
  sourceProcessor: ReturnType<typeof createSourceProcessor>;
325
320
  scraper: t.BaseScraper;
@@ -371,7 +366,7 @@ function createSearchProcessor({
371
366
  country,
372
367
  safeSearch,
373
368
  images,
374
- videos: supportsVideos && videos,
369
+ videos,
375
370
  news,
376
371
  logger,
377
372
  });
@@ -554,10 +549,6 @@ export const createSearchTool = (
554
549
  serperApiKey,
555
550
  searxngInstanceUrl,
556
551
  searxngApiKey,
557
- tavilyApiKey,
558
- tavilySearchUrl,
559
- tavilyExtractUrl,
560
- tavilySearchOptions,
561
552
  domainBlocklist,
562
553
  countryBlocklist,
563
554
  rerankerType = 'cohere',
@@ -571,7 +562,6 @@ export const createSearchTool = (
571
562
  firecrawlVersion,
572
563
  firecrawlOptions,
573
564
  serperScraperOptions,
574
- tavilyScraperOptions,
575
565
  scraperTimeout,
576
566
  jinaApiKey,
577
567
  jinaApiUrl,
@@ -581,15 +571,6 @@ export const createSearchTool = (
581
571
  } = config;
582
572
 
583
573
  const logger = config.logger || createDefaultLogger();
584
- /* Tavily search API exposes a `safe_search` boolean derived from the
585
- * tool's existing safeSearch level (0 = off, ≥1 = on). Bridge the two. */
586
- const effectiveTavilySearchOptions =
587
- searchProvider === 'tavily' && config.safeSearch != null
588
- ? {
589
- ...tavilySearchOptions,
590
- safeSearch: config.safeSearch !== 0,
591
- }
592
- : tavilySearchOptions;
593
574
 
594
575
  const schemaProperties: Record<string, unknown> = {
595
576
  query: querySchema,
@@ -599,7 +580,7 @@ export const createSearchTool = (
599
580
  news: newsSchema,
600
581
  };
601
582
 
602
- if (searchProvider === 'serper' || searchProvider === 'tavily') {
583
+ if (searchProvider === 'serper') {
603
584
  schemaProperties.country = countrySchema;
604
585
  }
605
586
 
@@ -614,9 +595,6 @@ export const createSearchTool = (
614
595
  serperApiKey,
615
596
  searxngInstanceUrl,
616
597
  searxngApiKey,
617
- tavilyApiKey,
618
- tavilySearchUrl,
619
- tavilySearchOptions: effectiveTavilySearchOptions,
620
598
  domainBlocklist,
621
599
  countryBlocklist,
622
600
  });
@@ -631,17 +609,6 @@ export const createSearchTool = (
631
609
  timeout: scraperTimeout ?? serperScraperOptions?.timeout,
632
610
  logger,
633
611
  });
634
- } else if (scraperProvider === 'tavily') {
635
- scraperInstance = createTavilyScraper({
636
- ...tavilyScraperOptions,
637
- apiKey:
638
- tavilyScraperOptions?.apiKey ??
639
- tavilyApiKey ??
640
- process.env.TAVILY_API_KEY,
641
- apiUrl: tavilyScraperOptions?.apiUrl ?? tavilyExtractUrl,
642
- timeout: scraperTimeout ?? tavilyScraperOptions?.timeout,
643
- logger,
644
- });
645
612
  } else {
646
613
  scraperInstance = createFirecrawlScraper({
647
614
  ...firecrawlOptions,
@@ -680,7 +647,6 @@ export const createSearchTool = (
680
647
  const search = createSearchProcessor({
681
648
  searchAPI,
682
649
  safeSearch,
683
- supportsVideos: searchProvider !== 'tavily',
684
650
  sourceProcessor,
685
651
  scraper: scraperInstance,
686
652
  onGetHighlights,
@@ -3,8 +3,8 @@ import type { RunnableConfig } from '@langchain/core/runnables';
3
3
  import type { BaseReranker } from './rerankers';
4
4
  import { DATE_RANGE } from './schema';
5
5
 
6
- export type SearchProvider = 'serper' | 'searxng' | 'tavily';
7
- export type ScraperProvider = 'firecrawl' | 'serper' | 'tavily';
6
+ export type SearchProvider = 'serper' | 'searxng';
7
+ export type ScraperProvider = 'firecrawl' | 'serper';
8
8
  export type RerankerType = 'infinity' | 'jina' | 'cohere' | 'none';
9
9
 
10
10
  export interface Highlight {
@@ -62,59 +62,11 @@ export interface Source {
62
62
  date?: string;
63
63
  }
64
64
 
65
- export type TavilyTimeRange = 'day' | 'week' | 'month' | 'year';
66
- export type TavilyTimeRangeInput =
67
- | TavilyTimeRange
68
- | 'h'
69
- | 'd'
70
- | 'w'
71
- | 'm'
72
- | 'y';
73
-
74
- export interface TavilySearchOptions {
75
- searchDepth?: 'basic' | 'advanced' | 'fast' | 'ultra-fast';
76
- maxResults?: number;
77
- includeImages?: boolean;
78
- includeAnswer?: boolean | 'basic' | 'advanced';
79
- includeRawContent?: boolean | 'markdown' | 'text';
80
- includeDomains?: string[];
81
- excludeDomains?: string[];
82
- topic?: 'general' | 'news' | 'finance';
83
- timeRange?: TavilyTimeRangeInput;
84
- includeImageDescriptions?: boolean;
85
- includeFavicon?: boolean;
86
- chunksPerSource?: number;
87
- safeSearch?: boolean;
88
- timeout?: number;
89
- }
90
-
91
- export interface TavilySearchPayload {
92
- query: string;
93
- search_depth: NonNullable<TavilySearchOptions['searchDepth']>;
94
- topic: NonNullable<TavilySearchOptions['topic']>;
95
- max_results: number;
96
- safe_search?: boolean;
97
- time_range?: TavilyTimeRange;
98
- country?: string;
99
- include_images?: boolean;
100
- include_answer?: NonNullable<TavilySearchOptions['includeAnswer']>;
101
- include_raw_content?: NonNullable<TavilySearchOptions['includeRawContent']>;
102
- include_domains?: string[];
103
- exclude_domains?: string[];
104
- include_image_descriptions?: boolean;
105
- include_favicon?: boolean;
106
- chunks_per_source?: number;
107
- }
108
-
109
65
  export interface SearchConfig {
110
66
  searchProvider?: SearchProvider;
111
67
  serperApiKey?: string;
112
68
  searxngInstanceUrl?: string;
113
69
  searxngApiKey?: string;
114
- tavilyApiKey?: string;
115
- tavilySearchUrl?: string;
116
- tavilyExtractUrl?: string;
117
- tavilySearchOptions?: TavilySearchOptions;
118
70
  /** Domains to exclude from search results (e.g., 'reddit.com', 'twitter.com').
119
71
  * Appended as -site: operators to the search query. */
120
72
  domainBlocklist?: string[];
@@ -160,17 +112,6 @@ export interface SerperScraperConfig {
160
112
  includeMarkdown?: boolean;
161
113
  }
162
114
 
163
- export interface TavilyScraperConfig {
164
- apiKey?: string;
165
- apiUrl?: string;
166
- timeout?: number;
167
- logger?: Logger;
168
- extractDepth?: 'basic' | 'advanced';
169
- includeImages?: boolean;
170
- includeFavicon?: boolean;
171
- format?: 'markdown' | 'text';
172
- }
173
-
174
115
  export interface ScraperContentResult {
175
116
  content: string;
176
117
  }
@@ -219,7 +160,6 @@ export interface SearchToolConfig
219
160
  extends SearchConfig,
220
161
  ProcessSourcesConfig,
221
162
  FirecrawlConfig {
222
- tavilyScraperOptions?: TavilyScraperConfig;
223
163
  logger?: Logger;
224
164
  safeSearch?: SafeSearchLevel;
225
165
  jinaApiKey?: string;
@@ -247,27 +187,20 @@ export type UsedReferences = {
247
187
  reference: MediaReference;
248
188
  }[];
249
189
 
250
- export type AnyScraperResponse =
251
- | FirecrawlScrapeResponse
252
- | SerperScrapeResponse
253
- | TavilyScrapeResponse;
254
-
255
190
  /** Base Scraper Interface */
256
191
  export interface BaseScraper {
257
192
  scrapeUrl(
258
193
  url: string,
259
194
  options?: unknown
260
- ): Promise<[string, AnyScraperResponse]>;
261
- scrapeUrls?(
262
- urls: string[],
263
- options?: unknown
264
- ): Promise<Array<[string, AnyScraperResponse]>>;
195
+ ): Promise<[string, FirecrawlScrapeResponse | SerperScrapeResponse]>;
265
196
  extractContent(
266
- response: AnyScraperResponse
197
+ response: FirecrawlScrapeResponse | SerperScrapeResponse
267
198
  ): [string, undefined | References];
268
199
  extractMetadata(
269
- response: AnyScraperResponse
270
- ): ScrapeMetadata | GenericScrapeMetadata;
200
+ response: FirecrawlScrapeResponse | SerperScrapeResponse
201
+ ):
202
+ | ScrapeMetadata
203
+ | Record<string, string | number | boolean | null | undefined>;
271
204
  }
272
205
 
273
206
  /** Firecrawl */
@@ -281,25 +214,6 @@ export type SerperScrapeOptions = Omit<
281
214
  'apiKey' | 'apiUrl' | 'logger'
282
215
  >;
283
216
 
284
- export type TavilyScrapeOptions = Omit<
285
- TavilyScraperConfig,
286
- 'apiKey' | 'apiUrl' | 'logger'
287
- >;
288
-
289
- export interface TavilyExtractPayload {
290
- urls: string[];
291
- extract_depth: NonNullable<TavilyScraperConfig['extractDepth']>;
292
- include_images: boolean;
293
- include_favicon?: boolean;
294
- format?: NonNullable<TavilyScraperConfig['format']>;
295
- timeout?: number;
296
- }
297
-
298
- export type GenericScrapeMetadata = Record<
299
- string,
300
- string | number | boolean | null | undefined
301
- >;
302
-
303
217
  export interface ScrapeMetadata {
304
218
  // Core source information
305
219
  sourceURL?: string;
@@ -386,45 +300,6 @@ export interface SerperScrapeResponse {
386
300
  error?: string;
387
301
  }
388
302
 
389
- export interface TavilyScrapeResponse {
390
- success: boolean;
391
- data?: {
392
- rawContent?: string;
393
- images?: string[];
394
- favicon?: string;
395
- };
396
- error?: string;
397
- }
398
-
399
- export interface TavilySearchResult {
400
- title?: string;
401
- url?: string;
402
- content?: string;
403
- score?: number;
404
- published_date?: string;
405
- }
406
-
407
- export type TavilyImageResult =
408
- | string
409
- | {
410
- url?: string;
411
- description?: string;
412
- };
413
-
414
- export interface TavilySearchResponse {
415
- answer?: string;
416
- images?: TavilyImageResult[];
417
- results?: TavilySearchResult[];
418
- }
419
-
420
- export interface TavilyExtractResult {
421
- url: string;
422
- raw_content?: string;
423
- images?: string[];
424
- favicon?: string;
425
- error?: string;
426
- }
427
-
428
303
  export interface FirecrawlScraperConfig {
429
304
  apiKey?: string;
430
305
  apiUrl?: string;
@@ -29,18 +29,11 @@ export const fileExtRegex =
29
29
 
30
30
  export const getDomainName = (
31
31
  link: string,
32
- metadata?: t.ScrapeMetadata | t.GenericScrapeMetadata,
32
+ metadata?: t.ScrapeMetadata,
33
33
  logger?: t.Logger
34
34
  ): string | undefined => {
35
35
  try {
36
- const sourceUrl = metadata?.sourceURL;
37
- const metadataUrl = metadata?.url;
38
- const url =
39
- typeof sourceUrl === 'string'
40
- ? sourceUrl
41
- : typeof metadataUrl === 'string'
42
- ? metadataUrl
43
- : link || '';
36
+ const url = metadata?.sourceURL ?? metadata?.url ?? (link || '');
44
37
  const domain = new URL(url).hostname.replace(/^www\./, '');
45
38
  if (domain) {
46
39
  return domain;
@@ -59,7 +52,7 @@ export const getDomainName = (
59
52
 
60
53
  export function getAttribution(
61
54
  link: string,
62
- metadata?: t.ScrapeMetadata | t.GenericScrapeMetadata,
55
+ metadata?: t.ScrapeMetadata,
63
56
  logger?: t.Logger
64
57
  ): string | undefined {
65
58
  if (!metadata) return getDomainName(link, metadata, logger);
@@ -67,17 +60,16 @@ export function getAttribution(
67
60
  const twitterSite = metadata['twitter:site'];
68
61
  const twitterSiteFormatted =
69
62
  typeof twitterSite === 'string' ? twitterSite.replace(/^@/, '') : undefined;
70
- const title = metadata.title;
71
63
 
72
64
  const possibleAttributions = [
73
65
  metadata.ogSiteName,
74
66
  metadata['og:site_name'],
75
- typeof title === 'string' ? title.split('|').pop()?.trim() : undefined,
67
+ metadata.title?.split('|').pop()?.trim(),
76
68
  twitterSiteFormatted,
77
69
  ];
78
70
 
79
71
  const attribution = possibleAttributions.find(
80
- (attr): attr is string => typeof attr === 'string' && attr.trim() !== ''
72
+ (attr) => attr != null && typeof attr === 'string' && attr.trim() !== ''
81
73
  );
82
74
  if (attribution != null) {
83
75
  return attribution;
@@ -40,6 +40,35 @@ export type SubagentExecuteParams = {
40
40
  * without relying on event ordering heuristics.
41
41
  */
42
42
  parentToolCallId?: string;
43
+ /**
44
+ * Snapshot of the parent invocation's `config.configurable` at the
45
+ * spawn-tool call site. Inherited verbatim into the child workflow's
46
+ * `configurable` so host-set fields (`requestBody`, `user`,
47
+ * `userMCPAuthMap`, etc.) propagate — fixing MCP body-placeholder
48
+ * substitution and per-user lookups for subagent tool calls.
49
+ *
50
+ * Inheritance details (verified empirically against LangGraph):
51
+ * - host-set keys propagate as-is into the child's tool dispatches;
52
+ * - `thread_id` propagates (with `childRunId` as a fallback when
53
+ * parent did not supply one) — matches the "subagent is part of
54
+ * the same conversation" mental model and aligns with the
55
+ * `sessionId: this.parentRunId` convention this executor already
56
+ * uses for `SubagentStart` / `SubagentStop` hooks;
57
+ * - `parent_run_id` propagates when the host put it on parent's
58
+ * configurable;
59
+ * - `run_id` is *overwritten by the LangGraph runtime* at child
60
+ * invoke time regardless of what we forward — child's tool
61
+ * dispatches see the child graph's runtime runId in
62
+ * `configurable.run_id`, not the parent's. Hosts that need
63
+ * parent-scoped run identity for downstream consumers should
64
+ * plumb it via a host-defined key (e.g. `requestBody.messageId`),
65
+ * not `run_id`.
66
+ *
67
+ * A future revision will likely make this inheritance configurable
68
+ * per spawn type — background / async subagents may want isolation
69
+ * rather than sharing parent's host context.
70
+ */
71
+ parentConfigurable?: Record<string, unknown>;
43
72
  };
44
73
 
45
74
  export type SubagentExecuteResult = {
@@ -246,6 +275,52 @@ export class SubagentExecutor {
246
275
  * nested trace pollution).
247
276
  */
248
277
  const callbacks: Callbacks = forwarder ? [forwarder] : [];
278
+ /**
279
+ * Inherit the parent's `configurable` verbatim — host-set fields
280
+ * (`requestBody`, `user`, `userMCPAuthMap`, etc.) AND the run-
281
+ * identity fields (`run_id`, `parent_run_id`, `thread_id`) all
282
+ * propagate.
283
+ *
284
+ * Run-identity propagation is intentional and matches the
285
+ * convention this executor itself already uses for `SubagentStart`
286
+ * / `SubagentStop` hooks (`sessionId: this.parentRunId`): the
287
+ * subagent runs under the parent's session scope, not its own.
288
+ * Forwarding `run_id` / `parent_run_id` / `thread_id` makes
289
+ * `ToolNode`'s hook lookups (`hasHookFor(eventName, runId)`),
290
+ * `ToolOutputReferenceRegistry` keying, and trace lineage all
291
+ * resolve to the parent's session for tools dispatched from the
292
+ * subagent — so `PreToolUse` / `PostToolUse` hooks the host
293
+ * registered against the parent's run fire for subagent tool
294
+ * calls too. "Same run" matches the user-perceptual mental model.
295
+ *
296
+ * `thread_id` falls back to `childRunId` only when the parent
297
+ * didn't supply one (legacy behavior preserved for hosts that
298
+ * never set thread_id).
299
+ *
300
+ * NOTE: a future revision will likely make this configurable per
301
+ * spawn type — e.g. a background / async subagent that runs after
302
+ * the parent's run completes wants isolation, not inheritance.
303
+ * For now the inheritance path matches LibreChat's primary use
304
+ * case (synchronous subagents within a single user turn).
305
+ */
306
+ const inheritedConfigurable: Record<string, unknown> =
307
+ params.parentConfigurable ?? {};
308
+ /**
309
+ * Surface the parent's `subagent` tool_call.id to the child's run
310
+ * metadata so host-side artifact handlers (e.g. ranger's
311
+ * `resolveUiToolCallId`) can re-key child-emitted attachments to
312
+ * the parent's bubble. Without this, files produced by tools
313
+ * inside a subagent (execute_code .docx, image_gen, etc.) get
314
+ * attached to the child's inner tool_call_id — which the parent
315
+ * message has no record of — and orphan in the chat UI.
316
+ */
317
+ const inheritedMetadata: Record<string, unknown> = {
318
+ ...((inheritedConfigurable as { metadata?: Record<string, unknown> })
319
+ .metadata ?? {}),
320
+ parentToolCallId,
321
+ subagentAgentId: childAgentId,
322
+ subagentType,
323
+ };
249
324
  result = await workflow.invoke(
250
325
  { messages: [new HumanMessage(description)] },
251
326
  {
@@ -255,7 +330,10 @@ export class SubagentExecutor {
255
330
  runName: `subagent:${subagentType}`,
256
331
  configurable: {
257
332
  thread_id: childRunId,
333
+ ...inheritedConfigurable,
334
+ parentToolCallId,
258
335
  },
336
+ metadata: inheritedMetadata,
259
337
  }
260
338
  );
261
339
  } catch (error) {