illuma-agents 1.0.2

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 (437) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/common/enum.cjs +163 -0
  3. package/dist/cjs/common/enum.cjs.map +1 -0
  4. package/dist/cjs/events.cjs +143 -0
  5. package/dist/cjs/events.cjs.map +1 -0
  6. package/dist/cjs/graphs/Graph.cjs +581 -0
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -0
  8. package/dist/cjs/instrumentation.cjs +21 -0
  9. package/dist/cjs/instrumentation.cjs.map +1 -0
  10. package/dist/cjs/llm/anthropic/index.cjs +292 -0
  11. package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
  12. package/dist/cjs/llm/anthropic/types.cjs +50 -0
  13. package/dist/cjs/llm/anthropic/types.cjs.map +1 -0
  14. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +553 -0
  15. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -0
  16. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +218 -0
  17. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -0
  18. package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
  19. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
  20. package/dist/cjs/llm/fake.cjs +97 -0
  21. package/dist/cjs/llm/fake.cjs.map +1 -0
  22. package/dist/cjs/llm/google/index.cjs +147 -0
  23. package/dist/cjs/llm/google/index.cjs.map +1 -0
  24. package/dist/cjs/llm/google/utils/common.cjs +490 -0
  25. package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
  26. package/dist/cjs/llm/ollama/index.cjs +70 -0
  27. package/dist/cjs/llm/ollama/index.cjs.map +1 -0
  28. package/dist/cjs/llm/ollama/utils.cjs +158 -0
  29. package/dist/cjs/llm/ollama/utils.cjs.map +1 -0
  30. package/dist/cjs/llm/openai/index.cjs +613 -0
  31. package/dist/cjs/llm/openai/index.cjs.map +1 -0
  32. package/dist/cjs/llm/openai/utils/index.cjs +677 -0
  33. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
  34. package/dist/cjs/llm/openrouter/index.cjs +29 -0
  35. package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
  36. package/dist/cjs/llm/providers.cjs +47 -0
  37. package/dist/cjs/llm/providers.cjs.map +1 -0
  38. package/dist/cjs/llm/text.cjs +69 -0
  39. package/dist/cjs/llm/text.cjs.map +1 -0
  40. package/dist/cjs/llm/vertexai/index.cjs +330 -0
  41. package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
  42. package/dist/cjs/main.cjs +127 -0
  43. package/dist/cjs/main.cjs.map +1 -0
  44. package/dist/cjs/messages/core.cjs +359 -0
  45. package/dist/cjs/messages/core.cjs.map +1 -0
  46. package/dist/cjs/messages/format.cjs +455 -0
  47. package/dist/cjs/messages/format.cjs.map +1 -0
  48. package/dist/cjs/messages/ids.cjs +23 -0
  49. package/dist/cjs/messages/ids.cjs.map +1 -0
  50. package/dist/cjs/messages/prune.cjs +398 -0
  51. package/dist/cjs/messages/prune.cjs.map +1 -0
  52. package/dist/cjs/run.cjs +264 -0
  53. package/dist/cjs/run.cjs.map +1 -0
  54. package/dist/cjs/splitStream.cjs +210 -0
  55. package/dist/cjs/splitStream.cjs.map +1 -0
  56. package/dist/cjs/stream.cjs +504 -0
  57. package/dist/cjs/stream.cjs.map +1 -0
  58. package/dist/cjs/tools/CodeExecutor.cjs +192 -0
  59. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
  60. package/dist/cjs/tools/ToolNode.cjs +125 -0
  61. package/dist/cjs/tools/ToolNode.cjs.map +1 -0
  62. package/dist/cjs/tools/handlers.cjs +250 -0
  63. package/dist/cjs/tools/handlers.cjs.map +1 -0
  64. package/dist/cjs/tools/search/anthropic.cjs +40 -0
  65. package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
  66. package/dist/cjs/tools/search/content.cjs +140 -0
  67. package/dist/cjs/tools/search/content.cjs.map +1 -0
  68. package/dist/cjs/tools/search/firecrawl.cjs +179 -0
  69. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -0
  70. package/dist/cjs/tools/search/format.cjs +203 -0
  71. package/dist/cjs/tools/search/format.cjs.map +1 -0
  72. package/dist/cjs/tools/search/highlights.cjs +245 -0
  73. package/dist/cjs/tools/search/highlights.cjs.map +1 -0
  74. package/dist/cjs/tools/search/rerankers.cjs +174 -0
  75. package/dist/cjs/tools/search/rerankers.cjs.map +1 -0
  76. package/dist/cjs/tools/search/schema.cjs +70 -0
  77. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  78. package/dist/cjs/tools/search/search.cjs +561 -0
  79. package/dist/cjs/tools/search/search.cjs.map +1 -0
  80. package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
  81. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
  82. package/dist/cjs/tools/search/tool.cjs +331 -0
  83. package/dist/cjs/tools/search/tool.cjs.map +1 -0
  84. package/dist/cjs/tools/search/utils.cjs +66 -0
  85. package/dist/cjs/tools/search/utils.cjs.map +1 -0
  86. package/dist/cjs/utils/graph.cjs +16 -0
  87. package/dist/cjs/utils/graph.cjs.map +1 -0
  88. package/dist/cjs/utils/llm.cjs +28 -0
  89. package/dist/cjs/utils/llm.cjs.map +1 -0
  90. package/dist/cjs/utils/misc.cjs +56 -0
  91. package/dist/cjs/utils/misc.cjs.map +1 -0
  92. package/dist/cjs/utils/run.cjs +69 -0
  93. package/dist/cjs/utils/run.cjs.map +1 -0
  94. package/dist/cjs/utils/title.cjs +111 -0
  95. package/dist/cjs/utils/title.cjs.map +1 -0
  96. package/dist/cjs/utils/tokens.cjs +65 -0
  97. package/dist/cjs/utils/tokens.cjs.map +1 -0
  98. package/dist/esm/common/enum.mjs +163 -0
  99. package/dist/esm/common/enum.mjs.map +1 -0
  100. package/dist/esm/events.mjs +135 -0
  101. package/dist/esm/events.mjs.map +1 -0
  102. package/dist/esm/graphs/Graph.mjs +578 -0
  103. package/dist/esm/graphs/Graph.mjs.map +1 -0
  104. package/dist/esm/instrumentation.mjs +19 -0
  105. package/dist/esm/instrumentation.mjs.map +1 -0
  106. package/dist/esm/llm/anthropic/index.mjs +290 -0
  107. package/dist/esm/llm/anthropic/index.mjs.map +1 -0
  108. package/dist/esm/llm/anthropic/types.mjs +48 -0
  109. package/dist/esm/llm/anthropic/types.mjs.map +1 -0
  110. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +550 -0
  111. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -0
  112. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +216 -0
  113. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -0
  114. package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
  115. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
  116. package/dist/esm/llm/fake.mjs +94 -0
  117. package/dist/esm/llm/fake.mjs.map +1 -0
  118. package/dist/esm/llm/google/index.mjs +145 -0
  119. package/dist/esm/llm/google/index.mjs.map +1 -0
  120. package/dist/esm/llm/google/utils/common.mjs +484 -0
  121. package/dist/esm/llm/google/utils/common.mjs.map +1 -0
  122. package/dist/esm/llm/ollama/index.mjs +68 -0
  123. package/dist/esm/llm/ollama/index.mjs.map +1 -0
  124. package/dist/esm/llm/ollama/utils.mjs +155 -0
  125. package/dist/esm/llm/ollama/utils.mjs.map +1 -0
  126. package/dist/esm/llm/openai/index.mjs +604 -0
  127. package/dist/esm/llm/openai/index.mjs.map +1 -0
  128. package/dist/esm/llm/openai/utils/index.mjs +671 -0
  129. package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
  130. package/dist/esm/llm/openrouter/index.mjs +27 -0
  131. package/dist/esm/llm/openrouter/index.mjs.map +1 -0
  132. package/dist/esm/llm/providers.mjs +43 -0
  133. package/dist/esm/llm/providers.mjs.map +1 -0
  134. package/dist/esm/llm/text.mjs +67 -0
  135. package/dist/esm/llm/text.mjs.map +1 -0
  136. package/dist/esm/llm/vertexai/index.mjs +328 -0
  137. package/dist/esm/llm/vertexai/index.mjs.map +1 -0
  138. package/dist/esm/main.mjs +20 -0
  139. package/dist/esm/main.mjs.map +1 -0
  140. package/dist/esm/messages/core.mjs +351 -0
  141. package/dist/esm/messages/core.mjs.map +1 -0
  142. package/dist/esm/messages/format.mjs +447 -0
  143. package/dist/esm/messages/format.mjs.map +1 -0
  144. package/dist/esm/messages/ids.mjs +21 -0
  145. package/dist/esm/messages/ids.mjs.map +1 -0
  146. package/dist/esm/messages/prune.mjs +393 -0
  147. package/dist/esm/messages/prune.mjs.map +1 -0
  148. package/dist/esm/run.mjs +261 -0
  149. package/dist/esm/run.mjs.map +1 -0
  150. package/dist/esm/splitStream.mjs +207 -0
  151. package/dist/esm/splitStream.mjs.map +1 -0
  152. package/dist/esm/stream.mjs +500 -0
  153. package/dist/esm/stream.mjs.map +1 -0
  154. package/dist/esm/tools/CodeExecutor.mjs +188 -0
  155. package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
  156. package/dist/esm/tools/ToolNode.mjs +122 -0
  157. package/dist/esm/tools/ToolNode.mjs.map +1 -0
  158. package/dist/esm/tools/handlers.mjs +245 -0
  159. package/dist/esm/tools/handlers.mjs.map +1 -0
  160. package/dist/esm/tools/search/anthropic.mjs +37 -0
  161. package/dist/esm/tools/search/anthropic.mjs.map +1 -0
  162. package/dist/esm/tools/search/content.mjs +119 -0
  163. package/dist/esm/tools/search/content.mjs.map +1 -0
  164. package/dist/esm/tools/search/firecrawl.mjs +176 -0
  165. package/dist/esm/tools/search/firecrawl.mjs.map +1 -0
  166. package/dist/esm/tools/search/format.mjs +201 -0
  167. package/dist/esm/tools/search/format.mjs.map +1 -0
  168. package/dist/esm/tools/search/highlights.mjs +243 -0
  169. package/dist/esm/tools/search/highlights.mjs.map +1 -0
  170. package/dist/esm/tools/search/rerankers.mjs +168 -0
  171. package/dist/esm/tools/search/rerankers.mjs.map +1 -0
  172. package/dist/esm/tools/search/schema.mjs +61 -0
  173. package/dist/esm/tools/search/schema.mjs.map +1 -0
  174. package/dist/esm/tools/search/search.mjs +558 -0
  175. package/dist/esm/tools/search/search.mjs.map +1 -0
  176. package/dist/esm/tools/search/serper-scraper.mjs +129 -0
  177. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
  178. package/dist/esm/tools/search/tool.mjs +329 -0
  179. package/dist/esm/tools/search/tool.mjs.map +1 -0
  180. package/dist/esm/tools/search/utils.mjs +61 -0
  181. package/dist/esm/tools/search/utils.mjs.map +1 -0
  182. package/dist/esm/utils/graph.mjs +13 -0
  183. package/dist/esm/utils/graph.mjs.map +1 -0
  184. package/dist/esm/utils/llm.mjs +25 -0
  185. package/dist/esm/utils/llm.mjs.map +1 -0
  186. package/dist/esm/utils/misc.mjs +53 -0
  187. package/dist/esm/utils/misc.mjs.map +1 -0
  188. package/dist/esm/utils/run.mjs +66 -0
  189. package/dist/esm/utils/run.mjs.map +1 -0
  190. package/dist/esm/utils/title.mjs +108 -0
  191. package/dist/esm/utils/title.mjs.map +1 -0
  192. package/dist/esm/utils/tokens.mjs +62 -0
  193. package/dist/esm/utils/tokens.mjs.map +1 -0
  194. package/dist/types/common/enum.d.ts +128 -0
  195. package/dist/types/common/index.d.ts +1 -0
  196. package/dist/types/events.d.ts +29 -0
  197. package/dist/types/graphs/Graph.d.ts +122 -0
  198. package/dist/types/graphs/index.d.ts +1 -0
  199. package/dist/types/index.d.ts +13 -0
  200. package/dist/types/instrumentation.d.ts +1 -0
  201. package/dist/types/llm/anthropic/index.d.ts +39 -0
  202. package/dist/types/llm/anthropic/types.d.ts +37 -0
  203. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +14 -0
  204. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +14 -0
  205. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +22 -0
  206. package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
  207. package/dist/types/llm/fake.d.ts +31 -0
  208. package/dist/types/llm/google/index.d.ts +14 -0
  209. package/dist/types/llm/google/types.d.ts +32 -0
  210. package/dist/types/llm/google/utils/common.d.ts +19 -0
  211. package/dist/types/llm/google/utils/tools.d.ts +10 -0
  212. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
  213. package/dist/types/llm/ollama/index.d.ts +8 -0
  214. package/dist/types/llm/ollama/utils.d.ts +7 -0
  215. package/dist/types/llm/openai/index.d.ts +103 -0
  216. package/dist/types/llm/openai/types.d.ts +10 -0
  217. package/dist/types/llm/openai/utils/index.d.ts +20 -0
  218. package/dist/types/llm/openrouter/index.d.ts +12 -0
  219. package/dist/types/llm/providers.d.ts +5 -0
  220. package/dist/types/llm/text.d.ts +21 -0
  221. package/dist/types/llm/vertexai/index.d.ts +293 -0
  222. package/dist/types/messages/core.d.ts +14 -0
  223. package/dist/types/messages/format.d.ts +113 -0
  224. package/dist/types/messages/ids.d.ts +3 -0
  225. package/dist/types/messages/index.d.ts +4 -0
  226. package/dist/types/messages/prune.d.ts +51 -0
  227. package/dist/types/mockStream.d.ts +32 -0
  228. package/dist/types/prompts/collab.d.ts +1 -0
  229. package/dist/types/prompts/index.d.ts +2 -0
  230. package/dist/types/prompts/taskmanager.d.ts +41 -0
  231. package/dist/types/run.d.ts +30 -0
  232. package/dist/types/scripts/abort.d.ts +1 -0
  233. package/dist/types/scripts/ant_web_search.d.ts +1 -0
  234. package/dist/types/scripts/args.d.ts +7 -0
  235. package/dist/types/scripts/caching.d.ts +1 -0
  236. package/dist/types/scripts/cli.d.ts +1 -0
  237. package/dist/types/scripts/cli2.d.ts +1 -0
  238. package/dist/types/scripts/cli3.d.ts +1 -0
  239. package/dist/types/scripts/cli4.d.ts +1 -0
  240. package/dist/types/scripts/cli5.d.ts +1 -0
  241. package/dist/types/scripts/code_exec.d.ts +1 -0
  242. package/dist/types/scripts/code_exec_files.d.ts +1 -0
  243. package/dist/types/scripts/code_exec_simple.d.ts +1 -0
  244. package/dist/types/scripts/content.d.ts +1 -0
  245. package/dist/types/scripts/empty_input.d.ts +1 -0
  246. package/dist/types/scripts/image.d.ts +1 -0
  247. package/dist/types/scripts/memory.d.ts +1 -0
  248. package/dist/types/scripts/search.d.ts +1 -0
  249. package/dist/types/scripts/simple.d.ts +1 -0
  250. package/dist/types/scripts/stream.d.ts +1 -0
  251. package/dist/types/scripts/thinking.d.ts +1 -0
  252. package/dist/types/scripts/tools.d.ts +1 -0
  253. package/dist/types/specs/spec.utils.d.ts +1 -0
  254. package/dist/types/splitStream.d.ts +37 -0
  255. package/dist/types/stream.d.ts +14 -0
  256. package/dist/types/tools/CodeExecutor.d.ts +23 -0
  257. package/dist/types/tools/ToolNode.d.ts +22 -0
  258. package/dist/types/tools/example.d.ts +78 -0
  259. package/dist/types/tools/handlers.d.ts +19 -0
  260. package/dist/types/tools/search/anthropic.d.ts +16 -0
  261. package/dist/types/tools/search/content.d.ts +4 -0
  262. package/dist/types/tools/search/firecrawl.d.ts +54 -0
  263. package/dist/types/tools/search/format.d.ts +5 -0
  264. package/dist/types/tools/search/highlights.d.ts +13 -0
  265. package/dist/types/tools/search/index.d.ts +2 -0
  266. package/dist/types/tools/search/rerankers.d.ts +38 -0
  267. package/dist/types/tools/search/schema.d.ts +16 -0
  268. package/dist/types/tools/search/search.d.ts +8 -0
  269. package/dist/types/tools/search/serper-scraper.d.ts +59 -0
  270. package/dist/types/tools/search/test.d.ts +1 -0
  271. package/dist/types/tools/search/tool.d.ts +54 -0
  272. package/dist/types/tools/search/types.d.ts +591 -0
  273. package/dist/types/tools/search/utils.d.ts +10 -0
  274. package/dist/types/types/graph.d.ts +138 -0
  275. package/dist/types/types/index.d.ts +5 -0
  276. package/dist/types/types/llm.d.ts +102 -0
  277. package/dist/types/types/run.d.ts +74 -0
  278. package/dist/types/types/stream.d.ts +293 -0
  279. package/dist/types/types/tools.d.ts +61 -0
  280. package/dist/types/utils/graph.d.ts +2 -0
  281. package/dist/types/utils/index.d.ts +5 -0
  282. package/dist/types/utils/llm.d.ts +3 -0
  283. package/dist/types/utils/llmConfig.d.ts +3 -0
  284. package/dist/types/utils/logging.d.ts +1 -0
  285. package/dist/types/utils/misc.d.ts +7 -0
  286. package/dist/types/utils/run.d.ts +27 -0
  287. package/dist/types/utils/title.d.ts +4 -0
  288. package/dist/types/utils/tokens.d.ts +3 -0
  289. package/package.json +145 -0
  290. package/src/common/enum.ts +176 -0
  291. package/src/common/index.ts +2 -0
  292. package/src/events.ts +191 -0
  293. package/src/graphs/Graph.ts +846 -0
  294. package/src/graphs/index.ts +1 -0
  295. package/src/index.ts +24 -0
  296. package/src/instrumentation.ts +22 -0
  297. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  298. package/src/llm/anthropic/index.ts +413 -0
  299. package/src/llm/anthropic/llm.spec.ts +1442 -0
  300. package/src/llm/anthropic/types.ts +140 -0
  301. package/src/llm/anthropic/utils/message_inputs.ts +660 -0
  302. package/src/llm/anthropic/utils/message_outputs.ts +289 -0
  303. package/src/llm/anthropic/utils/output_parsers.ts +133 -0
  304. package/src/llm/anthropic/utils/tools.ts +29 -0
  305. package/src/llm/fake.ts +133 -0
  306. package/src/llm/google/index.ts +222 -0
  307. package/src/llm/google/types.ts +43 -0
  308. package/src/llm/google/utils/common.ts +660 -0
  309. package/src/llm/google/utils/tools.ts +160 -0
  310. package/src/llm/google/utils/zod_to_genai_parameters.ts +88 -0
  311. package/src/llm/ollama/index.ts +92 -0
  312. package/src/llm/ollama/utils.ts +193 -0
  313. package/src/llm/openai/index.ts +853 -0
  314. package/src/llm/openai/types.ts +24 -0
  315. package/src/llm/openai/utils/index.ts +918 -0
  316. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
  317. package/src/llm/openrouter/index.ts +60 -0
  318. package/src/llm/providers.ts +57 -0
  319. package/src/llm/text.ts +94 -0
  320. package/src/llm/vertexai/index.ts +360 -0
  321. package/src/messages/core.ts +463 -0
  322. package/src/messages/format.ts +625 -0
  323. package/src/messages/formatAgentMessages.test.ts +917 -0
  324. package/src/messages/formatAgentMessages.tools.test.ts +400 -0
  325. package/src/messages/formatMessage.test.ts +693 -0
  326. package/src/messages/ids.ts +26 -0
  327. package/src/messages/index.ts +4 -0
  328. package/src/messages/prune.ts +567 -0
  329. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -0
  330. package/src/mockStream.ts +99 -0
  331. package/src/prompts/collab.ts +6 -0
  332. package/src/prompts/index.ts +2 -0
  333. package/src/prompts/taskmanager.ts +61 -0
  334. package/src/proto/CollabGraph.ts +269 -0
  335. package/src/proto/TaskManager.ts +243 -0
  336. package/src/proto/collab.ts +200 -0
  337. package/src/proto/collab_design.ts +184 -0
  338. package/src/proto/collab_design_v2.ts +224 -0
  339. package/src/proto/collab_design_v3.ts +255 -0
  340. package/src/proto/collab_design_v4.ts +220 -0
  341. package/src/proto/collab_design_v5.ts +251 -0
  342. package/src/proto/collab_graph.ts +181 -0
  343. package/src/proto/collab_original.ts +123 -0
  344. package/src/proto/example.ts +93 -0
  345. package/src/proto/example_new.ts +68 -0
  346. package/src/proto/example_old.ts +201 -0
  347. package/src/proto/example_test.ts +152 -0
  348. package/src/proto/example_test_anthropic.ts +100 -0
  349. package/src/proto/log_stream.ts +202 -0
  350. package/src/proto/main_collab_community_event.ts +133 -0
  351. package/src/proto/main_collab_design_v2.ts +96 -0
  352. package/src/proto/main_collab_design_v4.ts +100 -0
  353. package/src/proto/main_collab_design_v5.ts +135 -0
  354. package/src/proto/main_collab_global_analysis.ts +122 -0
  355. package/src/proto/main_collab_hackathon_event.ts +153 -0
  356. package/src/proto/main_collab_space_mission.ts +153 -0
  357. package/src/proto/main_philosophy.ts +210 -0
  358. package/src/proto/original_script.ts +126 -0
  359. package/src/proto/standard.ts +100 -0
  360. package/src/proto/stream.ts +56 -0
  361. package/src/proto/tasks.ts +118 -0
  362. package/src/proto/tools/global_analysis_tools.ts +86 -0
  363. package/src/proto/tools/space_mission_tools.ts +60 -0
  364. package/src/proto/vertexai.ts +54 -0
  365. package/src/run.ts +381 -0
  366. package/src/scripts/abort.ts +138 -0
  367. package/src/scripts/ant_web_search.ts +158 -0
  368. package/src/scripts/args.ts +48 -0
  369. package/src/scripts/caching.ts +124 -0
  370. package/src/scripts/cli.ts +167 -0
  371. package/src/scripts/cli2.ts +125 -0
  372. package/src/scripts/cli3.ts +178 -0
  373. package/src/scripts/cli4.ts +184 -0
  374. package/src/scripts/cli5.ts +184 -0
  375. package/src/scripts/code_exec.ts +214 -0
  376. package/src/scripts/code_exec_files.ts +193 -0
  377. package/src/scripts/code_exec_simple.ts +129 -0
  378. package/src/scripts/content.ts +120 -0
  379. package/src/scripts/empty_input.ts +137 -0
  380. package/src/scripts/image.ts +178 -0
  381. package/src/scripts/memory.ts +97 -0
  382. package/src/scripts/search.ts +150 -0
  383. package/src/scripts/simple.ts +225 -0
  384. package/src/scripts/stream.ts +122 -0
  385. package/src/scripts/thinking.ts +150 -0
  386. package/src/scripts/tools.ts +155 -0
  387. package/src/specs/anthropic.simple.test.ts +317 -0
  388. package/src/specs/azure.simple.test.ts +316 -0
  389. package/src/specs/openai.simple.test.ts +316 -0
  390. package/src/specs/prune.test.ts +763 -0
  391. package/src/specs/reasoning.test.ts +165 -0
  392. package/src/specs/spec.utils.ts +3 -0
  393. package/src/specs/thinking-prune.test.ts +703 -0
  394. package/src/specs/token-distribution-edge-case.test.ts +316 -0
  395. package/src/specs/tool-error.test.ts +193 -0
  396. package/src/splitStream.test.ts +691 -0
  397. package/src/splitStream.ts +234 -0
  398. package/src/stream.test.ts +94 -0
  399. package/src/stream.ts +651 -0
  400. package/src/tools/CodeExecutor.ts +220 -0
  401. package/src/tools/ToolNode.ts +170 -0
  402. package/src/tools/example.ts +129 -0
  403. package/src/tools/handlers.ts +336 -0
  404. package/src/tools/search/anthropic.ts +51 -0
  405. package/src/tools/search/content.test.ts +173 -0
  406. package/src/tools/search/content.ts +147 -0
  407. package/src/tools/search/firecrawl.ts +210 -0
  408. package/src/tools/search/format.ts +250 -0
  409. package/src/tools/search/highlights.ts +320 -0
  410. package/src/tools/search/index.ts +2 -0
  411. package/src/tools/search/jina-reranker.test.ts +126 -0
  412. package/src/tools/search/output.md +2775 -0
  413. package/src/tools/search/rerankers.ts +242 -0
  414. package/src/tools/search/schema.ts +63 -0
  415. package/src/tools/search/search.ts +759 -0
  416. package/src/tools/search/serper-scraper.ts +155 -0
  417. package/src/tools/search/test.html +884 -0
  418. package/src/tools/search/test.md +643 -0
  419. package/src/tools/search/test.ts +159 -0
  420. package/src/tools/search/tool.ts +471 -0
  421. package/src/tools/search/types.ts +687 -0
  422. package/src/tools/search/utils.ts +79 -0
  423. package/src/types/graph.ts +185 -0
  424. package/src/types/index.ts +6 -0
  425. package/src/types/llm.ts +140 -0
  426. package/src/types/run.ts +89 -0
  427. package/src/types/stream.ts +400 -0
  428. package/src/types/tools.ts +80 -0
  429. package/src/utils/graph.ts +11 -0
  430. package/src/utils/index.ts +5 -0
  431. package/src/utils/llm.ts +27 -0
  432. package/src/utils/llmConfig.ts +183 -0
  433. package/src/utils/logging.ts +48 -0
  434. package/src/utils/misc.ts +57 -0
  435. package/src/utils/run.ts +101 -0
  436. package/src/utils/title.ts +165 -0
  437. package/src/utils/tokens.ts +70 -0
@@ -0,0 +1,132 @@
1
+ 'use strict';
2
+
3
+ var axios = require('axios');
4
+ var utils = require('./utils.cjs');
5
+
6
+ /**
7
+ * Serper scraper implementation
8
+ * Uses the Serper Scrape API (https://scrape.serper.dev) to scrape web pages
9
+ *
10
+ * Features:
11
+ * - Simple API with single endpoint
12
+ * - Returns both text and markdown content
13
+ * - Includes metadata from scraped pages
14
+ * - Credits-based pricing model
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const scraper = createSerperScraper({
19
+ * apiKey: 'your-serper-api-key',
20
+ * includeMarkdown: true,
21
+ * timeout: 10000
22
+ * });
23
+ *
24
+ * const [url, response] = await scraper.scrapeUrl('https://example.com');
25
+ * if (response.success) {
26
+ * const [content] = scraper.extractContent(response);
27
+ * console.log(content);
28
+ * }
29
+ * ```
30
+ */
31
+ class SerperScraper {
32
+ apiKey;
33
+ apiUrl;
34
+ timeout;
35
+ logger;
36
+ includeMarkdown;
37
+ constructor(config = {}) {
38
+ this.apiKey = config.apiKey ?? process.env.SERPER_API_KEY ?? '';
39
+ this.apiUrl =
40
+ config.apiUrl ??
41
+ process.env.SERPER_SCRAPE_URL ??
42
+ 'https://scrape.serper.dev';
43
+ this.timeout = config.timeout ?? 7500;
44
+ this.includeMarkdown = config.includeMarkdown ?? true;
45
+ this.logger = config.logger || utils.createDefaultLogger();
46
+ if (!this.apiKey) {
47
+ this.logger.warn('SERPER_API_KEY is not set. Scraping will not work.');
48
+ }
49
+ this.logger.debug(`Serper scraper initialized with API URL: ${this.apiUrl}`);
50
+ }
51
+ /**
52
+ * Scrape a single URL
53
+ * @param url URL to scrape
54
+ * @param options Scrape options
55
+ * @returns Scrape response
56
+ */
57
+ async scrapeUrl(url, options = {}) {
58
+ if (!this.apiKey) {
59
+ return [
60
+ url,
61
+ {
62
+ success: false,
63
+ error: 'SERPER_API_KEY is not set',
64
+ },
65
+ ];
66
+ }
67
+ try {
68
+ const payload = {
69
+ url,
70
+ includeMarkdown: options.includeMarkdown ?? this.includeMarkdown,
71
+ };
72
+ const response = await axios.post(this.apiUrl, payload, {
73
+ headers: {
74
+ 'X-API-KEY': this.apiKey,
75
+ 'Content-Type': 'application/json',
76
+ },
77
+ timeout: options.timeout ?? this.timeout,
78
+ });
79
+ return [url, { success: true, data: response.data }];
80
+ }
81
+ catch (error) {
82
+ const errorMessage = error instanceof Error ? error.message : String(error);
83
+ return [
84
+ url,
85
+ {
86
+ success: false,
87
+ error: `Serper Scrape API request failed: ${errorMessage}`,
88
+ },
89
+ ];
90
+ }
91
+ }
92
+ /**
93
+ * Extract content from scrape response
94
+ * @param response Scrape response
95
+ * @returns Extracted content or empty string if not available
96
+ */
97
+ extractContent(response) {
98
+ if (!response.success || !response.data) {
99
+ return ['', undefined];
100
+ }
101
+ if (response.data.markdown != null) {
102
+ return [response.data.markdown, undefined];
103
+ }
104
+ if (response.data.text != null) {
105
+ return [response.data.text, undefined];
106
+ }
107
+ return ['', undefined];
108
+ }
109
+ /**
110
+ * Extract metadata from scrape response
111
+ * @param response Scrape response
112
+ * @returns Metadata object
113
+ */
114
+ extractMetadata(response) {
115
+ if (!response.success || !response.data || !response.data.metadata) {
116
+ return {};
117
+ }
118
+ return response.data.metadata;
119
+ }
120
+ }
121
+ /**
122
+ * Create a Serper scraper instance
123
+ * @param config Scraper configuration
124
+ * @returns Serper scraper instance
125
+ */
126
+ const createSerperScraper = (config = {}) => {
127
+ return new SerperScraper(config);
128
+ };
129
+
130
+ exports.SerperScraper = SerperScraper;
131
+ exports.createSerperScraper = createSerperScraper;
132
+ //# sourceMappingURL=serper-scraper.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serper-scraper.cjs","sources":["../../../../src/tools/search/serper-scraper.ts"],"sourcesContent":["import axios from 'axios';\r\nimport type * as t from './types';\r\nimport { createDefaultLogger } from './utils';\r\n\r\n/**\r\n * Serper scraper implementation\r\n * Uses the Serper Scrape API (https://scrape.serper.dev) to scrape web pages\r\n *\r\n * Features:\r\n * - Simple API with single endpoint\r\n * - Returns both text and markdown content\r\n * - Includes metadata from scraped pages\r\n * - Credits-based pricing model\r\n *\r\n * @example\r\n * ```typescript\r\n * const scraper = createSerperScraper({\r\n * apiKey: 'your-serper-api-key',\r\n * includeMarkdown: true,\r\n * timeout: 10000\r\n * });\r\n *\r\n * const [url, response] = await scraper.scrapeUrl('https://example.com');\r\n * if (response.success) {\r\n * const [content] = scraper.extractContent(response);\r\n * console.log(content);\r\n * }\r\n * ```\r\n */\r\nexport class SerperScraper implements t.BaseScraper {\r\n private apiKey: string;\r\n private apiUrl: string;\r\n private timeout: number;\r\n private logger: t.Logger;\r\n private includeMarkdown: boolean;\r\n\r\n constructor(config: t.SerperScraperConfig = {}) {\r\n this.apiKey = config.apiKey ?? process.env.SERPER_API_KEY ?? '';\r\n\r\n this.apiUrl =\r\n config.apiUrl ??\r\n process.env.SERPER_SCRAPE_URL ??\r\n 'https://scrape.serper.dev';\r\n\r\n this.timeout = config.timeout ?? 7500;\r\n this.includeMarkdown = config.includeMarkdown ?? true;\r\n\r\n this.logger = config.logger || createDefaultLogger();\r\n\r\n if (!this.apiKey) {\r\n this.logger.warn('SERPER_API_KEY is not set. Scraping will not work.');\r\n }\r\n\r\n this.logger.debug(\r\n `Serper scraper initialized with API URL: ${this.apiUrl}`\r\n );\r\n }\r\n\r\n /**\r\n * Scrape a single URL\r\n * @param url URL to scrape\r\n * @param options Scrape options\r\n * @returns Scrape response\r\n */\r\n async scrapeUrl(\r\n url: string,\r\n options: t.SerperScrapeOptions = {}\r\n ): Promise<[string, t.SerperScrapeResponse]> {\r\n if (!this.apiKey) {\r\n return [\r\n url,\r\n {\r\n success: false,\r\n error: 'SERPER_API_KEY is not set',\r\n },\r\n ];\r\n }\r\n\r\n try {\r\n const payload = {\r\n url,\r\n includeMarkdown: options.includeMarkdown ?? this.includeMarkdown,\r\n };\r\n\r\n const response = await axios.post(this.apiUrl, payload, {\r\n headers: {\r\n 'X-API-KEY': this.apiKey,\r\n 'Content-Type': 'application/json',\r\n },\r\n timeout: options.timeout ?? this.timeout,\r\n });\r\n\r\n return [url, { success: true, data: response.data }];\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error);\r\n return [\r\n url,\r\n {\r\n success: false,\r\n error: `Serper Scrape API request failed: ${errorMessage}`,\r\n },\r\n ];\r\n }\r\n }\r\n\r\n /**\r\n * Extract content from scrape response\r\n * @param response Scrape response\r\n * @returns Extracted content or empty string if not available\r\n */\r\n extractContent(\r\n response: t.SerperScrapeResponse\r\n ): [string, undefined | t.References] {\r\n if (!response.success || !response.data) {\r\n return ['', undefined];\r\n }\r\n\r\n if (response.data.markdown != null) {\r\n return [response.data.markdown, undefined];\r\n }\r\n\r\n if (response.data.text != null) {\r\n return [response.data.text, undefined];\r\n }\r\n\r\n return ['', undefined];\r\n }\r\n\r\n /**\r\n * Extract metadata from scrape response\r\n * @param response Scrape response\r\n * @returns Metadata object\r\n */\r\n extractMetadata(\r\n response: t.SerperScrapeResponse\r\n ): Record<string, string | number | boolean | null | undefined> {\r\n if (!response.success || !response.data || !response.data.metadata) {\r\n return {};\r\n }\r\n\r\n return response.data.metadata;\r\n }\r\n}\r\n\r\n/**\r\n * Create a Serper scraper instance\r\n * @param config Scraper configuration\r\n * @returns Serper scraper instance\r\n */\r\nexport const createSerperScraper = (\r\n config: t.SerperScraperConfig = {}\r\n): SerperScraper => {\r\n return new SerperScraper(config);\r\n};\r\n"],"names":["createDefaultLogger"],"mappings":"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"}
@@ -0,0 +1,331 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+ var tools = require('@langchain/core/tools');
5
+ var schema = require('./schema.cjs');
6
+ var search = require('./search.cjs');
7
+ var serperScraper = require('./serper-scraper.cjs');
8
+ var firecrawl = require('./firecrawl.cjs');
9
+ var highlights = require('./highlights.cjs');
10
+ var format = require('./format.cjs');
11
+ var utils = require('./utils.cjs');
12
+ var rerankers = require('./rerankers.cjs');
13
+ var _enum = require('../../common/enum.cjs');
14
+
15
+ /**
16
+ * Executes parallel searches and merges the results
17
+ */
18
+ async function executeParallelSearches({ searchAPI, query, date, country, safeSearch, images, videos, news, logger, }) {
19
+ // Prepare all search tasks to run in parallel
20
+ const searchTasks = [
21
+ // Main search
22
+ searchAPI.getSources({
23
+ query,
24
+ date,
25
+ country,
26
+ safeSearch,
27
+ }),
28
+ ];
29
+ if (images) {
30
+ searchTasks.push(searchAPI
31
+ .getSources({
32
+ query,
33
+ date,
34
+ country,
35
+ safeSearch,
36
+ type: 'images',
37
+ })
38
+ .catch((error) => {
39
+ logger.error('Error fetching images:', error);
40
+ return {
41
+ success: false,
42
+ error: `Images search failed: ${error instanceof Error ? error.message : String(error)}`,
43
+ };
44
+ }));
45
+ }
46
+ if (videos) {
47
+ searchTasks.push(searchAPI
48
+ .getSources({
49
+ query,
50
+ date,
51
+ country,
52
+ safeSearch,
53
+ type: 'videos',
54
+ })
55
+ .catch((error) => {
56
+ logger.error('Error fetching videos:', error);
57
+ return {
58
+ success: false,
59
+ error: `Videos search failed: ${error instanceof Error ? error.message : String(error)}`,
60
+ };
61
+ }));
62
+ }
63
+ if (news) {
64
+ searchTasks.push(searchAPI
65
+ .getSources({
66
+ query,
67
+ date,
68
+ country,
69
+ safeSearch,
70
+ type: 'news',
71
+ })
72
+ .catch((error) => {
73
+ logger.error('Error fetching news:', error);
74
+ return {
75
+ success: false,
76
+ error: `News search failed: ${error instanceof Error ? error.message : String(error)}`,
77
+ };
78
+ }));
79
+ }
80
+ // Run all searches in parallel
81
+ const results = await Promise.all(searchTasks);
82
+ // Get the main search result (first result)
83
+ const mainResult = results[0];
84
+ if (!mainResult.success) {
85
+ throw new Error(mainResult.error ?? 'Search failed');
86
+ }
87
+ // Merge additional results with the main results
88
+ const mergedResults = { ...mainResult.data };
89
+ // Convert existing news to topStories if present
90
+ if (mergedResults.news !== undefined && mergedResults.news.length > 0) {
91
+ const existingNewsAsTopStories = mergedResults.news
92
+ .filter((newsItem) => newsItem.link !== undefined && newsItem.link !== '')
93
+ .map((newsItem) => ({
94
+ title: newsItem.title ?? '',
95
+ link: newsItem.link ?? '',
96
+ source: newsItem.source ?? '',
97
+ date: newsItem.date ?? '',
98
+ imageUrl: newsItem.imageUrl ?? '',
99
+ processed: false,
100
+ }));
101
+ mergedResults.topStories = [
102
+ ...(mergedResults.topStories ?? []),
103
+ ...existingNewsAsTopStories,
104
+ ];
105
+ delete mergedResults.news;
106
+ }
107
+ results.slice(1).forEach((result) => {
108
+ if (result.success && result.data !== undefined) {
109
+ if (result.data.images !== undefined && result.data.images.length > 0) {
110
+ mergedResults.images = [
111
+ ...(mergedResults.images ?? []),
112
+ ...result.data.images,
113
+ ];
114
+ }
115
+ if (result.data.videos !== undefined && result.data.videos.length > 0) {
116
+ mergedResults.videos = [
117
+ ...(mergedResults.videos ?? []),
118
+ ...result.data.videos,
119
+ ];
120
+ }
121
+ if (result.data.news !== undefined && result.data.news.length > 0) {
122
+ const newsAsTopStories = result.data.news.map((newsItem) => ({
123
+ ...newsItem,
124
+ link: newsItem.link ?? '',
125
+ }));
126
+ mergedResults.topStories = [
127
+ ...(mergedResults.topStories ?? []),
128
+ ...newsAsTopStories,
129
+ ];
130
+ }
131
+ }
132
+ });
133
+ return { success: true, data: mergedResults };
134
+ }
135
+ function createSearchProcessor({ searchAPI, safeSearch, sourceProcessor, onGetHighlights, logger, }) {
136
+ return async function ({ query, date, country, proMode = true, maxSources = 5, onSearchResults, images = false, videos = false, news = false, }) {
137
+ try {
138
+ // Execute parallel searches and merge results
139
+ const searchResult = await executeParallelSearches({
140
+ searchAPI,
141
+ query,
142
+ date,
143
+ country,
144
+ safeSearch,
145
+ images,
146
+ videos,
147
+ news,
148
+ logger,
149
+ });
150
+ onSearchResults?.(searchResult);
151
+ const processedSources = await sourceProcessor.processSources({
152
+ query,
153
+ news,
154
+ result: searchResult,
155
+ proMode,
156
+ onGetHighlights,
157
+ numElements: maxSources,
158
+ });
159
+ return highlights.expandHighlights(processedSources);
160
+ }
161
+ catch (error) {
162
+ logger.error('Error in search:', error);
163
+ return {
164
+ organic: [],
165
+ topStories: [],
166
+ images: [],
167
+ videos: [],
168
+ news: [],
169
+ relatedSearches: [],
170
+ error: error instanceof Error ? error.message : String(error),
171
+ };
172
+ }
173
+ };
174
+ }
175
+ function createOnSearchResults({ runnableConfig, onSearchResults, }) {
176
+ return function (results) {
177
+ if (!onSearchResults) {
178
+ return;
179
+ }
180
+ onSearchResults(results, runnableConfig);
181
+ };
182
+ }
183
+ function createTool({ schema, search, onSearchResults: _onSearchResults, }) {
184
+ return tools.tool(async (params, runnableConfig) => {
185
+ const { query, date, country: _c, images, videos, news } = params;
186
+ const country = typeof _c === 'string' && _c ? _c : undefined;
187
+ const searchResult = await search({
188
+ query,
189
+ date,
190
+ country,
191
+ images,
192
+ videos,
193
+ news,
194
+ onSearchResults: createOnSearchResults({
195
+ runnableConfig,
196
+ onSearchResults: _onSearchResults,
197
+ }),
198
+ });
199
+ const turn = runnableConfig.toolCall?.turn ?? 0;
200
+ const { output, references } = format.formatResultsForLLM(turn, searchResult);
201
+ const data = { turn, ...searchResult, references };
202
+ return [output, { [_enum.Constants.WEB_SEARCH]: data }];
203
+ }, {
204
+ name: _enum.Constants.WEB_SEARCH,
205
+ description: `Real-time search. Results have required citation anchors.
206
+
207
+ Note: Use ONCE per reply unless instructed otherwise.
208
+
209
+ Anchors:
210
+ - \\ue202turnXtypeY
211
+ - X = turn idx, type = 'search' | 'news' | 'image' | 'ref', Y = item idx
212
+
213
+ Special Markers:
214
+ - \\ue203...\\ue204 — highlight start/end of cited text (for Standalone or Group citations)
215
+ - \\ue200...\\ue201 — group block (e.g. \\ue200\\ue202turn0search1\\ue202turn0news2\\ue201)
216
+
217
+ **CITE EVERY NON-OBVIOUS FACT/QUOTE:**
218
+ Use anchor marker(s) immediately after the statement:
219
+ - Standalone: "Pure functions produce same output. \\ue202turn0search0"
220
+ - Standalone (multiple): "Today's News \\ue202turn0search0\\ue202turn0news0"
221
+ - Highlight: "\\ue203Highlight text.\\ue204\\ue202turn0news1"
222
+ - Group: "Sources. \\ue200\\ue202turn0search0\\ue202turn0news1\\ue201"
223
+ - Group Highlight: "\\ue203Highlight for group.\\ue204 \\ue200\\ue202turn0search0\\ue202turn0news1\\ue201"
224
+ - Image: "See photo \\ue202turn0image0."
225
+
226
+ **NEVER use markdown links, [1], or footnotes. CITE ONLY with anchors provided.**
227
+ `.trim(),
228
+ schema: schema,
229
+ responseFormat: _enum.Constants.CONTENT_AND_ARTIFACT,
230
+ });
231
+ }
232
+ /**
233
+ * Creates a search tool with a schema that dynamically includes the country field
234
+ * only when the searchProvider is 'serper'.
235
+ *
236
+ * Supports multiple scraper providers:
237
+ * - Firecrawl (default): Full-featured web scraping with multiple formats
238
+ * - Serper: Lightweight scraping using Serper's scrape API
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * // Using Firecrawl scraper (default)
243
+ * const searchTool = createSearchTool({
244
+ * searchProvider: 'serper',
245
+ * scraperProvider: 'firecrawl',
246
+ * firecrawlApiKey: 'your-firecrawl-key'
247
+ * });
248
+ *
249
+ * // Using Serper scraper
250
+ * const searchTool = createSearchTool({
251
+ * searchProvider: 'serper',
252
+ * scraperProvider: 'serper',
253
+ * serperApiKey: 'your-serper-key'
254
+ * });
255
+ * ```
256
+ *
257
+ * @param config - The search tool configuration
258
+ * @returns A DynamicStructuredTool with a schema that depends on the searchProvider
259
+ */
260
+ const createSearchTool = (config = {}) => {
261
+ const { searchProvider = 'serper', serperApiKey, searxngInstanceUrl, searxngApiKey, rerankerType = 'cohere', topResults = 5, strategies = ['no_extraction'], filterContent = true, safeSearch = 1, scraperProvider = 'firecrawl', firecrawlApiKey, firecrawlApiUrl, firecrawlVersion, firecrawlOptions, serperScraperOptions, scraperTimeout, jinaApiKey, jinaApiUrl, cohereApiKey, onSearchResults: _onSearchResults, onGetHighlights, } = config;
262
+ const logger = config.logger || utils.createDefaultLogger();
263
+ const schemaObject = {
264
+ query: schema.querySchema,
265
+ date: schema.dateSchema,
266
+ images: schema.imagesSchema,
267
+ videos: schema.videosSchema,
268
+ news: schema.newsSchema,
269
+ };
270
+ if (searchProvider === 'serper') {
271
+ schemaObject.country = schema.countrySchema;
272
+ }
273
+ const toolSchema = zod.z.object(schemaObject);
274
+ const searchAPI = search.createSearchAPI({
275
+ searchProvider,
276
+ serperApiKey,
277
+ searxngInstanceUrl,
278
+ searxngApiKey,
279
+ });
280
+ /** Create scraper based on scraperProvider */
281
+ let scraperInstance;
282
+ if (scraperProvider === 'serper') {
283
+ scraperInstance = serperScraper.createSerperScraper({
284
+ ...serperScraperOptions,
285
+ apiKey: serperApiKey,
286
+ timeout: scraperTimeout ?? serperScraperOptions?.timeout,
287
+ logger,
288
+ });
289
+ }
290
+ else {
291
+ scraperInstance = firecrawl.createFirecrawlScraper({
292
+ ...firecrawlOptions,
293
+ apiKey: firecrawlApiKey ?? process.env.FIRECRAWL_API_KEY,
294
+ apiUrl: firecrawlApiUrl,
295
+ version: firecrawlVersion,
296
+ timeout: scraperTimeout ?? firecrawlOptions?.timeout,
297
+ formats: firecrawlOptions?.formats ?? ['markdown', 'rawHtml'],
298
+ logger,
299
+ });
300
+ }
301
+ const selectedReranker = rerankers.createReranker({
302
+ rerankerType,
303
+ jinaApiKey,
304
+ jinaApiUrl,
305
+ cohereApiKey,
306
+ logger,
307
+ });
308
+ if (!selectedReranker) {
309
+ logger.warn('No reranker selected. Using default ranking.');
310
+ }
311
+ const sourceProcessor = search.createSourceProcessor({
312
+ reranker: selectedReranker,
313
+ topResults,
314
+ logger,
315
+ }, scraperInstance);
316
+ const search$1 = createSearchProcessor({
317
+ searchAPI,
318
+ safeSearch,
319
+ sourceProcessor,
320
+ onGetHighlights,
321
+ logger,
322
+ });
323
+ return createTool({
324
+ search: search$1,
325
+ schema: toolSchema,
326
+ onSearchResults: _onSearchResults,
327
+ });
328
+ };
329
+
330
+ exports.createSearchTool = createSearchTool;
331
+ //# sourceMappingURL=tool.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.cjs","sources":["../../../../src/tools/search/tool.ts"],"sourcesContent":["import { z } from 'zod';\r\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\r\nimport type { RunnableConfig } from '@langchain/core/runnables';\r\nimport type * as t from './types';\r\nimport {\r\n DATE_RANGE,\r\n querySchema,\r\n dateSchema,\r\n countrySchema,\r\n imagesSchema,\r\n videosSchema,\r\n newsSchema,\r\n} from './schema';\r\nimport { createSearchAPI, createSourceProcessor } from './search';\r\nimport { createSerperScraper } from './serper-scraper';\r\nimport { createFirecrawlScraper } from './firecrawl';\r\nimport { expandHighlights } from './highlights';\r\nimport { formatResultsForLLM } from './format';\r\nimport { createDefaultLogger } from './utils';\r\nimport { createReranker } from './rerankers';\r\nimport { Constants } from '@/common';\r\n\r\n/**\r\n * Executes parallel searches and merges the results\r\n */\r\nasync function executeParallelSearches({\r\n searchAPI,\r\n query,\r\n date,\r\n country,\r\n safeSearch,\r\n images,\r\n videos,\r\n news,\r\n logger,\r\n}: {\r\n searchAPI: ReturnType<typeof createSearchAPI>;\r\n query: string;\r\n date?: DATE_RANGE;\r\n country?: string;\r\n safeSearch: t.SearchToolConfig['safeSearch'];\r\n images: boolean;\r\n videos: boolean;\r\n news: boolean;\r\n logger: t.Logger;\r\n}): Promise<t.SearchResult> {\r\n // Prepare all search tasks to run in parallel\r\n const searchTasks: Promise<t.SearchResult>[] = [\r\n // Main search\r\n searchAPI.getSources({\r\n query,\r\n date,\r\n country,\r\n safeSearch,\r\n }),\r\n ];\r\n\r\n if (images) {\r\n searchTasks.push(\r\n searchAPI\r\n .getSources({\r\n query,\r\n date,\r\n country,\r\n safeSearch,\r\n type: 'images',\r\n })\r\n .catch((error) => {\r\n logger.error('Error fetching images:', error);\r\n return {\r\n success: false,\r\n error: `Images search failed: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n })\r\n );\r\n }\r\n if (videos) {\r\n searchTasks.push(\r\n searchAPI\r\n .getSources({\r\n query,\r\n date,\r\n country,\r\n safeSearch,\r\n type: 'videos',\r\n })\r\n .catch((error) => {\r\n logger.error('Error fetching videos:', error);\r\n return {\r\n success: false,\r\n error: `Videos search failed: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n })\r\n );\r\n }\r\n if (news) {\r\n searchTasks.push(\r\n searchAPI\r\n .getSources({\r\n query,\r\n date,\r\n country,\r\n safeSearch,\r\n type: 'news',\r\n })\r\n .catch((error) => {\r\n logger.error('Error fetching news:', error);\r\n return {\r\n success: false,\r\n error: `News search failed: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n })\r\n );\r\n }\r\n\r\n // Run all searches in parallel\r\n const results = await Promise.all(searchTasks);\r\n\r\n // Get the main search result (first result)\r\n const mainResult = results[0];\r\n if (!mainResult.success) {\r\n throw new Error(mainResult.error ?? 'Search failed');\r\n }\r\n\r\n // Merge additional results with the main results\r\n const mergedResults = { ...mainResult.data };\r\n\r\n // Convert existing news to topStories if present\r\n if (mergedResults.news !== undefined && mergedResults.news.length > 0) {\r\n const existingNewsAsTopStories = mergedResults.news\r\n .filter((newsItem) => newsItem.link !== undefined && newsItem.link !== '')\r\n .map((newsItem) => ({\r\n title: newsItem.title ?? '',\r\n link: newsItem.link ?? '',\r\n source: newsItem.source ?? '',\r\n date: newsItem.date ?? '',\r\n imageUrl: newsItem.imageUrl ?? '',\r\n processed: false,\r\n }));\r\n mergedResults.topStories = [\r\n ...(mergedResults.topStories ?? []),\r\n ...existingNewsAsTopStories,\r\n ];\r\n delete mergedResults.news;\r\n }\r\n\r\n results.slice(1).forEach((result) => {\r\n if (result.success && result.data !== undefined) {\r\n if (result.data.images !== undefined && result.data.images.length > 0) {\r\n mergedResults.images = [\r\n ...(mergedResults.images ?? []),\r\n ...result.data.images,\r\n ];\r\n }\r\n if (result.data.videos !== undefined && result.data.videos.length > 0) {\r\n mergedResults.videos = [\r\n ...(mergedResults.videos ?? []),\r\n ...result.data.videos,\r\n ];\r\n }\r\n if (result.data.news !== undefined && result.data.news.length > 0) {\r\n const newsAsTopStories = result.data.news.map((newsItem) => ({\r\n ...newsItem,\r\n link: newsItem.link ?? '',\r\n }));\r\n mergedResults.topStories = [\r\n ...(mergedResults.topStories ?? []),\r\n ...newsAsTopStories,\r\n ];\r\n }\r\n }\r\n });\r\n\r\n return { success: true, data: mergedResults };\r\n}\r\n\r\nfunction createSearchProcessor({\r\n searchAPI,\r\n safeSearch,\r\n sourceProcessor,\r\n onGetHighlights,\r\n logger,\r\n}: {\r\n safeSearch: t.SearchToolConfig['safeSearch'];\r\n searchAPI: ReturnType<typeof createSearchAPI>;\r\n sourceProcessor: ReturnType<typeof createSourceProcessor>;\r\n onGetHighlights: t.SearchToolConfig['onGetHighlights'];\r\n logger: t.Logger;\r\n}) {\r\n return async function ({\r\n query,\r\n date,\r\n country,\r\n proMode = true,\r\n maxSources = 5,\r\n onSearchResults,\r\n images = false,\r\n videos = false,\r\n news = false,\r\n }: {\r\n query: string;\r\n country?: string;\r\n date?: DATE_RANGE;\r\n proMode?: boolean;\r\n maxSources?: number;\r\n onSearchResults: t.SearchToolConfig['onSearchResults'];\r\n images?: boolean;\r\n videos?: boolean;\r\n news?: boolean;\r\n }): Promise<t.SearchResultData> {\r\n try {\r\n // Execute parallel searches and merge results\r\n const searchResult = await executeParallelSearches({\r\n searchAPI,\r\n query,\r\n date,\r\n country,\r\n safeSearch,\r\n images,\r\n videos,\r\n news,\r\n logger,\r\n });\r\n\r\n onSearchResults?.(searchResult);\r\n\r\n const processedSources = await sourceProcessor.processSources({\r\n query,\r\n news,\r\n result: searchResult,\r\n proMode,\r\n onGetHighlights,\r\n numElements: maxSources,\r\n });\r\n\r\n return expandHighlights(processedSources);\r\n } catch (error) {\r\n logger.error('Error in search:', error);\r\n return {\r\n organic: [],\r\n topStories: [],\r\n images: [],\r\n videos: [],\r\n news: [],\r\n relatedSearches: [],\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n };\r\n}\r\n\r\nfunction createOnSearchResults({\r\n runnableConfig,\r\n onSearchResults,\r\n}: {\r\n runnableConfig: RunnableConfig;\r\n onSearchResults: t.SearchToolConfig['onSearchResults'];\r\n}) {\r\n return function (results: t.SearchResult): void {\r\n if (!onSearchResults) {\r\n return;\r\n }\r\n onSearchResults(results, runnableConfig);\r\n };\r\n}\r\n\r\nfunction createTool({\r\n schema,\r\n search,\r\n onSearchResults: _onSearchResults,\r\n}: {\r\n schema: t.SearchToolSchema;\r\n search: ReturnType<typeof createSearchProcessor>;\r\n onSearchResults: t.SearchToolConfig['onSearchResults'];\r\n}): DynamicStructuredTool<typeof schema> {\r\n return tool<typeof schema>(\r\n async (params, runnableConfig) => {\r\n const { query, date, country: _c, images, videos, news } = params;\r\n const country = typeof _c === 'string' && _c ? _c : undefined;\r\n const searchResult = await search({\r\n query,\r\n date,\r\n country,\r\n images,\r\n videos,\r\n news,\r\n onSearchResults: createOnSearchResults({\r\n runnableConfig,\r\n onSearchResults: _onSearchResults,\r\n }),\r\n });\r\n const turn = runnableConfig.toolCall?.turn ?? 0;\r\n const { output, references } = formatResultsForLLM(turn, searchResult);\r\n const data: t.SearchResultData = { turn, ...searchResult, references };\r\n return [output, { [Constants.WEB_SEARCH]: data }];\r\n },\r\n {\r\n name: Constants.WEB_SEARCH,\r\n description: `Real-time search. Results have required citation anchors.\r\n\r\nNote: Use ONCE per reply unless instructed otherwise.\r\n\r\nAnchors:\r\n- \\\\ue202turnXtypeY\r\n- X = turn idx, type = 'search' | 'news' | 'image' | 'ref', Y = item idx\r\n\r\nSpecial Markers:\r\n- \\\\ue203...\\\\ue204 — highlight start/end of cited text (for Standalone or Group citations)\r\n- \\\\ue200...\\\\ue201 — group block (e.g. \\\\ue200\\\\ue202turn0search1\\\\ue202turn0news2\\\\ue201)\r\n\r\n**CITE EVERY NON-OBVIOUS FACT/QUOTE:**\r\nUse anchor marker(s) immediately after the statement:\r\n- Standalone: \"Pure functions produce same output. \\\\ue202turn0search0\"\r\n- Standalone (multiple): \"Today's News \\\\ue202turn0search0\\\\ue202turn0news0\"\r\n- Highlight: \"\\\\ue203Highlight text.\\\\ue204\\\\ue202turn0news1\"\r\n- Group: \"Sources. \\\\ue200\\\\ue202turn0search0\\\\ue202turn0news1\\\\ue201\"\r\n- Group Highlight: \"\\\\ue203Highlight for group.\\\\ue204 \\\\ue200\\\\ue202turn0search0\\\\ue202turn0news1\\\\ue201\"\r\n- Image: \"See photo \\\\ue202turn0image0.\"\r\n\r\n**NEVER use markdown links, [1], or footnotes. CITE ONLY with anchors provided.**\r\n`.trim(),\r\n schema: schema,\r\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Creates a search tool with a schema that dynamically includes the country field\r\n * only when the searchProvider is 'serper'.\r\n *\r\n * Supports multiple scraper providers:\r\n * - Firecrawl (default): Full-featured web scraping with multiple formats\r\n * - Serper: Lightweight scraping using Serper's scrape API\r\n *\r\n * @example\r\n * ```typescript\r\n * // Using Firecrawl scraper (default)\r\n * const searchTool = createSearchTool({\r\n * searchProvider: 'serper',\r\n * scraperProvider: 'firecrawl',\r\n * firecrawlApiKey: 'your-firecrawl-key'\r\n * });\r\n *\r\n * // Using Serper scraper\r\n * const searchTool = createSearchTool({\r\n * searchProvider: 'serper',\r\n * scraperProvider: 'serper',\r\n * serperApiKey: 'your-serper-key'\r\n * });\r\n * ```\r\n *\r\n * @param config - The search tool configuration\r\n * @returns A DynamicStructuredTool with a schema that depends on the searchProvider\r\n */\r\nexport const createSearchTool = (\r\n config: t.SearchToolConfig = {}\r\n): DynamicStructuredTool<typeof toolSchema> => {\r\n const {\r\n searchProvider = 'serper',\r\n serperApiKey,\r\n searxngInstanceUrl,\r\n searxngApiKey,\r\n rerankerType = 'cohere',\r\n topResults = 5,\r\n strategies = ['no_extraction'],\r\n filterContent = true,\r\n safeSearch = 1,\r\n scraperProvider = 'firecrawl',\r\n firecrawlApiKey,\r\n firecrawlApiUrl,\r\n firecrawlVersion,\r\n firecrawlOptions,\r\n serperScraperOptions,\r\n scraperTimeout,\r\n jinaApiKey,\r\n jinaApiUrl,\r\n cohereApiKey,\r\n onSearchResults: _onSearchResults,\r\n onGetHighlights,\r\n } = config;\r\n\r\n const logger = config.logger || createDefaultLogger();\r\n\r\n const schemaObject: {\r\n query: z.ZodString;\r\n date: z.ZodOptional<z.ZodNativeEnum<typeof DATE_RANGE>>;\r\n country?: z.ZodOptional<z.ZodString>;\r\n images: z.ZodOptional<z.ZodBoolean>;\r\n videos: z.ZodOptional<z.ZodBoolean>;\r\n news: z.ZodOptional<z.ZodBoolean>;\r\n } = {\r\n query: querySchema,\r\n date: dateSchema,\r\n images: imagesSchema,\r\n videos: videosSchema,\r\n news: newsSchema,\r\n };\r\n\r\n if (searchProvider === 'serper') {\r\n schemaObject.country = countrySchema;\r\n }\r\n\r\n const toolSchema = z.object(schemaObject);\r\n\r\n const searchAPI = createSearchAPI({\r\n searchProvider,\r\n serperApiKey,\r\n searxngInstanceUrl,\r\n searxngApiKey,\r\n });\r\n\r\n /** Create scraper based on scraperProvider */\r\n let scraperInstance: t.BaseScraper;\r\n\r\n if (scraperProvider === 'serper') {\r\n scraperInstance = createSerperScraper({\r\n ...serperScraperOptions,\r\n apiKey: serperApiKey,\r\n timeout: scraperTimeout ?? serperScraperOptions?.timeout,\r\n logger,\r\n });\r\n } else {\r\n scraperInstance = createFirecrawlScraper({\r\n ...firecrawlOptions,\r\n apiKey: firecrawlApiKey ?? process.env.FIRECRAWL_API_KEY,\r\n apiUrl: firecrawlApiUrl,\r\n version: firecrawlVersion,\r\n timeout: scraperTimeout ?? firecrawlOptions?.timeout,\r\n formats: firecrawlOptions?.formats ?? ['markdown', 'rawHtml'],\r\n logger,\r\n });\r\n }\r\n\r\n const selectedReranker = createReranker({\r\n rerankerType,\r\n jinaApiKey,\r\n jinaApiUrl,\r\n cohereApiKey,\r\n logger,\r\n });\r\n\r\n if (!selectedReranker) {\r\n logger.warn('No reranker selected. Using default ranking.');\r\n }\r\n\r\n const sourceProcessor = createSourceProcessor(\r\n {\r\n reranker: selectedReranker,\r\n topResults,\r\n strategies,\r\n filterContent,\r\n logger,\r\n },\r\n scraperInstance\r\n );\r\n\r\n const search = createSearchProcessor({\r\n searchAPI,\r\n safeSearch,\r\n sourceProcessor,\r\n onGetHighlights,\r\n logger,\r\n });\r\n\r\n return createTool({\r\n search,\r\n schema: toolSchema,\r\n onSearchResults: _onSearchResults,\r\n });\r\n};\r\n"],"names":["expandHighlights","tool","formatResultsForLLM","Constants","createDefaultLogger","querySchema","dateSchema","imagesSchema","videosSchema","newsSchema","countrySchema","z","createSearchAPI","createSerperScraper","createFirecrawlScraper","createReranker","createSourceProcessor","search"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ 'use strict';
2
+
3
+ /* eslint-disable no-console */
4
+ /**
5
+ * Singleton instance of the default logger
6
+ */
7
+ let defaultLoggerInstance = null;
8
+ /**
9
+ * Creates a default logger that maps to console methods
10
+ * Uses a singleton pattern to avoid creating multiple instances
11
+ * @returns A default logger that implements the Logger interface
12
+ */
13
+ const createDefaultLogger = () => {
14
+ if (!defaultLoggerInstance) {
15
+ defaultLoggerInstance = {
16
+ error: console.error,
17
+ warn: console.warn,
18
+ info: console.info,
19
+ debug: console.debug,
20
+ };
21
+ }
22
+ return defaultLoggerInstance;
23
+ };
24
+ const fileExtRegex = /\.(pdf|jpe?g|png|gif|svg|webp|bmp|ico|tiff?|avif|heic|doc[xm]?|xls[xm]?|ppt[xm]?|zip|rar|mp[34]|mov|avi|wav)(?:\?.*)?$/i;
25
+ const getDomainName = (link, metadata, logger) => {
26
+ try {
27
+ const url = metadata?.sourceURL ?? metadata?.url ?? (link || '');
28
+ const domain = new URL(url).hostname.replace(/^www\./, '');
29
+ if (domain) {
30
+ return domain;
31
+ }
32
+ }
33
+ catch (e) {
34
+ // URL parsing failed
35
+ if (logger) {
36
+ logger.error('Error parsing URL:', e);
37
+ }
38
+ else {
39
+ console.error('Error parsing URL:', e);
40
+ }
41
+ }
42
+ return;
43
+ };
44
+ function getAttribution(link, metadata, logger) {
45
+ if (!metadata)
46
+ return getDomainName(link, metadata, logger);
47
+ const twitterSite = metadata['twitter:site'];
48
+ const twitterSiteFormatted = typeof twitterSite === 'string' ? twitterSite.replace(/^@/, '') : undefined;
49
+ const possibleAttributions = [
50
+ metadata.ogSiteName,
51
+ metadata['og:site_name'],
52
+ metadata.title?.split('|').pop()?.trim(),
53
+ twitterSiteFormatted,
54
+ ];
55
+ const attribution = possibleAttributions.find((attr) => attr != null && typeof attr === 'string' && attr.trim() !== '');
56
+ if (attribution != null) {
57
+ return attribution;
58
+ }
59
+ return getDomainName(link, metadata, logger);
60
+ }
61
+
62
+ exports.createDefaultLogger = createDefaultLogger;
63
+ exports.fileExtRegex = fileExtRegex;
64
+ exports.getAttribution = getAttribution;
65
+ exports.getDomainName = getDomainName;
66
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.cjs","sources":["../../../../src/tools/search/utils.ts"],"sourcesContent":["/* eslint-disable no-console */\r\n\r\nimport type * as t from './types';\r\n\r\n/**\r\n * Singleton instance of the default logger\r\n */\r\nlet defaultLoggerInstance: t.Logger | null = null;\r\n\r\n/**\r\n * Creates a default logger that maps to console methods\r\n * Uses a singleton pattern to avoid creating multiple instances\r\n * @returns A default logger that implements the Logger interface\r\n */\r\nexport const createDefaultLogger = (): t.Logger => {\r\n if (!defaultLoggerInstance) {\r\n defaultLoggerInstance = {\r\n error: console.error,\r\n warn: console.warn,\r\n info: console.info,\r\n debug: console.debug,\r\n } as t.Logger;\r\n }\r\n return defaultLoggerInstance;\r\n};\r\n\r\nexport const fileExtRegex =\r\n /\\.(pdf|jpe?g|png|gif|svg|webp|bmp|ico|tiff?|avif|heic|doc[xm]?|xls[xm]?|ppt[xm]?|zip|rar|mp[34]|mov|avi|wav)(?:\\?.*)?$/i;\r\n\r\nexport const getDomainName = (\r\n link: string,\r\n metadata?: t.ScrapeMetadata,\r\n logger?: t.Logger\r\n): string | undefined => {\r\n try {\r\n const url = metadata?.sourceURL ?? metadata?.url ?? (link || '');\r\n const domain = new URL(url).hostname.replace(/^www\\./, '');\r\n if (domain) {\r\n return domain;\r\n }\r\n } catch (e) {\r\n // URL parsing failed\r\n if (logger) {\r\n logger.error('Error parsing URL:', e);\r\n } else {\r\n console.error('Error parsing URL:', e);\r\n }\r\n }\r\n\r\n return;\r\n};\r\n\r\nexport function getAttribution(\r\n link: string,\r\n metadata?: t.ScrapeMetadata,\r\n logger?: t.Logger\r\n): string | undefined {\r\n if (!metadata) return getDomainName(link, metadata, logger);\r\n\r\n const twitterSite = metadata['twitter:site'];\r\n const twitterSiteFormatted =\r\n typeof twitterSite === 'string' ? twitterSite.replace(/^@/, '') : undefined;\r\n\r\n const possibleAttributions = [\r\n metadata.ogSiteName,\r\n metadata['og:site_name'],\r\n metadata.title?.split('|').pop()?.trim(),\r\n twitterSiteFormatted,\r\n ];\r\n\r\n const attribution = possibleAttributions.find(\r\n (attr) => attr != null && typeof attr === 'string' && attr.trim() !== ''\r\n );\r\n if (attribution != null) {\r\n return attribution;\r\n }\r\n\r\n return getDomainName(link, metadata, logger);\r\n}\r\n"],"names":[],"mappings":";;AAAA;AAIA;;AAEG;AACH,IAAI,qBAAqB,GAAoB,IAAI;AAEjD;;;;AAIG;AACI,MAAM,mBAAmB,GAAG,MAAe;IAChD,IAAI,CAAC,qBAAqB,EAAE;AAC1B,QAAA,qBAAqB,GAAG;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;SACT;;AAEf,IAAA,OAAO,qBAAqB;AAC9B;AAEO,MAAM,YAAY,GACvB;AAEW,MAAA,aAAa,GAAG,CAC3B,IAAY,EACZ,QAA2B,EAC3B,MAAiB,KACK;AACtB,IAAA,IAAI;AACF,QAAA,MAAM,GAAG,GAAG,QAAQ,EAAE,SAAS,IAAI,QAAQ,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;AAChE,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC1D,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;;;IAEf,OAAO,CAAC,EAAE;;QAEV,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC;;aAChC;AACL,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC;;;IAI1C;AACF;SAEgB,cAAc,CAC5B,IAAY,EACZ,QAA2B,EAC3B,MAAiB,EAAA;AAEjB,IAAA,IAAI,CAAC,QAAQ;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;AAE3D,IAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC;IAC5C,MAAM,oBAAoB,GACxB,OAAO,WAAW,KAAK,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,SAAS;AAE7E,IAAA,MAAM,oBAAoB,GAAG;AAC3B,QAAA,QAAQ,CAAC,UAAU;QACnB,QAAQ,CAAC,cAAc,CAAC;AACxB,QAAA,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE;QACxC,oBAAoB;KACrB;IAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAC3C,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CACzE;AACD,IAAA,IAAI,WAAW,IAAI,IAAI,EAAE;AACvB,QAAA,OAAO,WAAW;;IAGpB,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;AAC9C;;;;;;;"}
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const resetIfNotEmpty = (value, resetValue) => {
4
+ if (Array.isArray(value)) {
5
+ return value.length > 0 ? resetValue : value;
6
+ }
7
+ if (value instanceof Set || value instanceof Map) {
8
+ return value.size > 0 ? resetValue : value;
9
+ }
10
+ return value !== undefined ? resetValue : value;
11
+ };
12
+ const joinKeys = (args) => args.join('_');
13
+
14
+ exports.joinKeys = joinKeys;
15
+ exports.resetIfNotEmpty = resetIfNotEmpty;
16
+ //# sourceMappingURL=graph.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.cjs","sources":["../../../src/utils/graph.ts"],"sourcesContent":["export const resetIfNotEmpty = <T>(value: T, resetValue: T): T => {\r\n if (Array.isArray(value)) {\r\n return value.length > 0 ? resetValue : value;\r\n }\r\n if (value instanceof Set || value instanceof Map) {\r\n return value.size > 0 ? resetValue : value;\r\n }\r\n return value !== undefined ? resetValue : value;\r\n};\r\n\r\nexport const joinKeys = (args: (string | number | undefined)[]): string => args.join('_');"],"names":[],"mappings":";;MAAa,eAAe,GAAG,CAAI,KAAQ,EAAE,UAAa,KAAO;AAC/D,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,GAAG,KAAK;;IAE9C,IAAI,KAAK,YAAY,GAAG,IAAI,KAAK,YAAY,GAAG,EAAE;AAChD,QAAA,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,UAAU,GAAG,KAAK;;IAE5C,OAAO,KAAK,KAAK,SAAS,GAAG,UAAU,GAAG,KAAK;AACjD;AAEO,MAAM,QAAQ,GAAG,CAAC,IAAqC,KAAa,IAAI,CAAC,IAAI,CAAC,GAAG;;;;;"}
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var _enum = require('../common/enum.cjs');
4
+
5
+ // src/utils/llm.ts
6
+ function isOpenAILike(provider) {
7
+ if (provider == null) {
8
+ return false;
9
+ }
10
+ return [
11
+ _enum.Providers.OPENAI,
12
+ _enum.Providers.AZURE,
13
+ _enum.Providers.OPENROUTER,
14
+ _enum.Providers.XAI,
15
+ _enum.Providers.DEEPSEEK,
16
+ _enum.Providers.OLLAMA,
17
+ ].includes(provider);
18
+ }
19
+ function isGoogleLike(provider) {
20
+ if (provider == null) {
21
+ return false;
22
+ }
23
+ return [_enum.Providers.GOOGLE, _enum.Providers.VERTEXAI].includes(provider);
24
+ }
25
+
26
+ exports.isGoogleLike = isGoogleLike;
27
+ exports.isOpenAILike = isOpenAILike;
28
+ //# sourceMappingURL=llm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.cjs","sources":["../../../src/utils/llm.ts"],"sourcesContent":["// src/utils/llm.ts\r\nimport { Providers } from '@/common';\r\n\r\nexport function isOpenAILike(provider?: string | Providers): boolean {\r\n if (provider == null) {\r\n return false;\r\n }\r\n return (\r\n [\r\n Providers.OPENAI,\r\n Providers.AZURE,\r\n Providers.OPENROUTER,\r\n Providers.XAI,\r\n Providers.DEEPSEEK,\r\n Providers.OLLAMA,\r\n ] as string[]\r\n ).includes(provider);\r\n}\r\n\r\nexport function isGoogleLike(provider?: string | Providers): boolean {\r\n if (provider == null) {\r\n return false;\r\n }\r\n return ([Providers.GOOGLE, Providers.VERTEXAI] as string[]).includes(\r\n provider\r\n );\r\n}\r\n"],"names":["Providers"],"mappings":";;;;AAAA;AAGM,SAAU,YAAY,CAAC,QAA6B,EAAA;AACxD,IAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,QAAA,OAAO,KAAK;;IAEd,OACE;AACE,QAAAA,eAAS,CAAC,MAAM;AAChB,QAAAA,eAAS,CAAC,KAAK;AACf,QAAAA,eAAS,CAAC,UAAU;AACpB,QAAAA,eAAS,CAAC,GAAG;AACb,QAAAA,eAAS,CAAC,QAAQ;AAClB,QAAAA,eAAS,CAAC,MAAM;AAEnB,KAAA,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACtB;AAEM,SAAU,YAAY,CAAC,QAA6B,EAAA;AACxD,IAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,QAAA,OAAO,KAAK;;AAEd,IAAA,OAAQ,CAACA,eAAS,CAAC,MAAM,EAAEA,eAAS,CAAC,QAAQ,CAAc,CAAC,QAAQ,CAClE,QAAQ,CACT;AACH;;;;;"}