@iflow-mcp/jakeliume-webpeel 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (547) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +313 -0
  3. package/dist/cache.d.ts +30 -0
  4. package/dist/cache.js +139 -0
  5. package/dist/cli/commands/auth.d.ts +5 -0
  6. package/dist/cli/commands/auth.js +411 -0
  7. package/dist/cli/commands/doctor.d.ts +37 -0
  8. package/dist/cli/commands/doctor.js +371 -0
  9. package/dist/cli/commands/fetch.d.ts +6 -0
  10. package/dist/cli/commands/fetch.js +1345 -0
  11. package/dist/cli/commands/guide.d.ts +2 -0
  12. package/dist/cli/commands/guide.js +183 -0
  13. package/dist/cli/commands/interact.d.ts +5 -0
  14. package/dist/cli/commands/interact.js +840 -0
  15. package/dist/cli/commands/jobs.d.ts +5 -0
  16. package/dist/cli/commands/jobs.js +997 -0
  17. package/dist/cli/commands/monitor.d.ts +12 -0
  18. package/dist/cli/commands/monitor.js +197 -0
  19. package/dist/cli/commands/observe.d.ts +12 -0
  20. package/dist/cli/commands/observe.js +158 -0
  21. package/dist/cli/commands/screenshot.d.ts +5 -0
  22. package/dist/cli/commands/screenshot.js +282 -0
  23. package/dist/cli/commands/search.d.ts +5 -0
  24. package/dist/cli/commands/search.js +1021 -0
  25. package/dist/cli/commands/setup.d.ts +13 -0
  26. package/dist/cli/commands/setup.js +244 -0
  27. package/dist/cli/commands/skill.d.ts +15 -0
  28. package/dist/cli/commands/skill.js +195 -0
  29. package/dist/cli/utils.d.ts +84 -0
  30. package/dist/cli/utils.js +806 -0
  31. package/dist/cli-auth.d.ts +75 -0
  32. package/dist/cli-auth.js +369 -0
  33. package/dist/cli.d.ts +17 -0
  34. package/dist/cli.js +99 -0
  35. package/dist/core/actions.d.ts +69 -0
  36. package/dist/core/actions.js +495 -0
  37. package/dist/core/agent.d.ts +98 -0
  38. package/dist/core/agent.js +558 -0
  39. package/dist/core/answer.d.ts +42 -0
  40. package/dist/core/answer.js +395 -0
  41. package/dist/core/application-tracker.d.ts +84 -0
  42. package/dist/core/application-tracker.js +184 -0
  43. package/dist/core/apply.d.ts +162 -0
  44. package/dist/core/apply.js +816 -0
  45. package/dist/core/auth-detection.d.ts +35 -0
  46. package/dist/core/auth-detection.js +358 -0
  47. package/dist/core/auto-extract.d.ts +82 -0
  48. package/dist/core/auto-extract.js +604 -0
  49. package/dist/core/auto-interact.d.ts +23 -0
  50. package/dist/core/auto-interact.js +246 -0
  51. package/dist/core/bm25-filter.d.ts +66 -0
  52. package/dist/core/bm25-filter.js +288 -0
  53. package/dist/core/branding.d.ts +54 -0
  54. package/dist/core/branding.js +234 -0
  55. package/dist/core/browser-fetch.d.ts +323 -0
  56. package/dist/core/browser-fetch.js +1600 -0
  57. package/dist/core/browser-pool.d.ts +91 -0
  58. package/dist/core/browser-pool.js +550 -0
  59. package/dist/core/budget.d.ts +42 -0
  60. package/dist/core/budget.js +324 -0
  61. package/dist/core/business-intel.d.ts +47 -0
  62. package/dist/core/business-intel.js +279 -0
  63. package/dist/core/cache.d.ts +13 -0
  64. package/dist/core/cache.js +121 -0
  65. package/dist/core/cf-worker-proxy.d.ts +32 -0
  66. package/dist/core/cf-worker-proxy.js +87 -0
  67. package/dist/core/challenge-detection.d.ts +26 -0
  68. package/dist/core/challenge-detection.js +468 -0
  69. package/dist/core/change-tracking.d.ts +75 -0
  70. package/dist/core/change-tracking.js +276 -0
  71. package/dist/core/chunker.d.ts +46 -0
  72. package/dist/core/chunker.js +249 -0
  73. package/dist/core/chunking.d.ts +42 -0
  74. package/dist/core/chunking.js +181 -0
  75. package/dist/core/circuit-breaker.d.ts +44 -0
  76. package/dist/core/circuit-breaker.js +85 -0
  77. package/dist/core/content-pruner.d.ts +47 -0
  78. package/dist/core/content-pruner.js +425 -0
  79. package/dist/core/cookie-cache.d.ts +60 -0
  80. package/dist/core/cookie-cache.js +163 -0
  81. package/dist/core/crawl-checkpoint.d.ts +54 -0
  82. package/dist/core/crawl-checkpoint.js +104 -0
  83. package/dist/core/crawler.d.ts +84 -0
  84. package/dist/core/crawler.js +349 -0
  85. package/dist/core/cross-verify.d.ts +27 -0
  86. package/dist/core/cross-verify.js +93 -0
  87. package/dist/core/deep-fetch.d.ts +74 -0
  88. package/dist/core/deep-fetch.js +405 -0
  89. package/dist/core/deep-research.d.ts +141 -0
  90. package/dist/core/deep-research.js +972 -0
  91. package/dist/core/design-analysis.d.ts +70 -0
  92. package/dist/core/design-analysis.js +490 -0
  93. package/dist/core/design-compare.d.ts +38 -0
  94. package/dist/core/design-compare.js +264 -0
  95. package/dist/core/diff.d.ts +61 -0
  96. package/dist/core/diff.js +289 -0
  97. package/dist/core/dns-cache.d.ts +20 -0
  98. package/dist/core/dns-cache.js +198 -0
  99. package/dist/core/documents.d.ts +23 -0
  100. package/dist/core/documents.js +123 -0
  101. package/dist/core/domain-memory.d.ts +66 -0
  102. package/dist/core/domain-memory.js +163 -0
  103. package/dist/core/domain-verify.d.ts +40 -0
  104. package/dist/core/domain-verify.js +379 -0
  105. package/dist/core/engine-ranker.d.ts +112 -0
  106. package/dist/core/engine-ranker.js +395 -0
  107. package/dist/core/extract-inline.d.ts +38 -0
  108. package/dist/core/extract-inline.js +215 -0
  109. package/dist/core/extract-listings.d.ts +38 -0
  110. package/dist/core/extract-listings.js +461 -0
  111. package/dist/core/extract.d.ts +9 -0
  112. package/dist/core/extract.js +139 -0
  113. package/dist/core/fetch-cache.d.ts +57 -0
  114. package/dist/core/fetch-cache.js +95 -0
  115. package/dist/core/fetcher.d.ts +13 -0
  116. package/dist/core/fetcher.js +12 -0
  117. package/dist/core/google-cache.d.ts +29 -0
  118. package/dist/core/google-cache.js +180 -0
  119. package/dist/core/google-serp-parser.d.ts +82 -0
  120. package/dist/core/google-serp-parser.js +287 -0
  121. package/dist/core/hotel-search.d.ts +122 -0
  122. package/dist/core/hotel-search.js +382 -0
  123. package/dist/core/http-fetch.d.ts +72 -0
  124. package/dist/core/http-fetch.js +820 -0
  125. package/dist/core/human.d.ts +175 -0
  126. package/dist/core/human.js +680 -0
  127. package/dist/core/image-caption.d.ts +44 -0
  128. package/dist/core/image-caption.js +271 -0
  129. package/dist/core/jobs.d.ts +75 -0
  130. package/dist/core/jobs.js +634 -0
  131. package/dist/core/json-ld.d.ts +15 -0
  132. package/dist/core/json-ld.js +617 -0
  133. package/dist/core/language-detect.d.ts +18 -0
  134. package/dist/core/language-detect.js +135 -0
  135. package/dist/core/links.d.ts +10 -0
  136. package/dist/core/links.js +44 -0
  137. package/dist/core/llm-extract.d.ts +71 -0
  138. package/dist/core/llm-extract.js +507 -0
  139. package/dist/core/llm-provider.d.ts +100 -0
  140. package/dist/core/llm-provider.js +702 -0
  141. package/dist/core/local-search.d.ts +60 -0
  142. package/dist/core/local-search.js +308 -0
  143. package/dist/core/logger.d.ts +28 -0
  144. package/dist/core/logger.js +104 -0
  145. package/dist/core/map.d.ts +33 -0
  146. package/dist/core/map.js +127 -0
  147. package/dist/core/markdown.d.ts +92 -0
  148. package/dist/core/markdown.js +809 -0
  149. package/dist/core/metadata.d.ts +34 -0
  150. package/dist/core/metadata.js +422 -0
  151. package/dist/core/observe.d.ts +113 -0
  152. package/dist/core/observe.js +395 -0
  153. package/dist/core/ocr.d.ts +12 -0
  154. package/dist/core/ocr.js +33 -0
  155. package/dist/core/paginate.d.ts +31 -0
  156. package/dist/core/paginate.js +106 -0
  157. package/dist/core/pdf.d.ts +8 -0
  158. package/dist/core/pdf.js +25 -0
  159. package/dist/core/peel-tls.d.ts +25 -0
  160. package/dist/core/peel-tls.js +220 -0
  161. package/dist/core/pipeline.d.ts +132 -0
  162. package/dist/core/pipeline.js +1666 -0
  163. package/dist/core/profiles.d.ts +61 -0
  164. package/dist/core/profiles.js +350 -0
  165. package/dist/core/prompt-guard.d.ts +30 -0
  166. package/dist/core/prompt-guard.js +119 -0
  167. package/dist/core/proxy-config.d.ts +90 -0
  168. package/dist/core/proxy-config.js +172 -0
  169. package/dist/core/quick-answer.d.ts +53 -0
  170. package/dist/core/quick-answer.js +833 -0
  171. package/dist/core/rate-governor.d.ts +80 -0
  172. package/dist/core/rate-governor.js +238 -0
  173. package/dist/core/readability.d.ts +57 -0
  174. package/dist/core/readability.js +533 -0
  175. package/dist/core/research.d.ts +66 -0
  176. package/dist/core/research.js +270 -0
  177. package/dist/core/retry.d.ts +60 -0
  178. package/dist/core/retry.js +119 -0
  179. package/dist/core/safe-browsing.d.ts +30 -0
  180. package/dist/core/safe-browsing.js +206 -0
  181. package/dist/core/schema-extraction.d.ts +66 -0
  182. package/dist/core/schema-extraction.js +352 -0
  183. package/dist/core/schema-postprocess.d.ts +32 -0
  184. package/dist/core/schema-postprocess.js +469 -0
  185. package/dist/core/schema-templates.d.ts +19 -0
  186. package/dist/core/schema-templates.js +143 -0
  187. package/dist/core/screenshot.d.ts +224 -0
  188. package/dist/core/screenshot.js +207 -0
  189. package/dist/core/search-engines.d.ts +25 -0
  190. package/dist/core/search-engines.js +182 -0
  191. package/dist/core/search-provider.d.ts +243 -0
  192. package/dist/core/search-provider.js +1629 -0
  193. package/dist/core/searxng-provider.d.ts +35 -0
  194. package/dist/core/searxng-provider.js +105 -0
  195. package/dist/core/selective-evidence.d.ts +151 -0
  196. package/dist/core/selective-evidence.js +389 -0
  197. package/dist/core/site-search.d.ts +44 -0
  198. package/dist/core/site-search.js +252 -0
  199. package/dist/core/sitemap.d.ts +23 -0
  200. package/dist/core/sitemap.js +105 -0
  201. package/dist/core/source-credibility.d.ts +29 -0
  202. package/dist/core/source-credibility.js +584 -0
  203. package/dist/core/source-scoring.d.ts +166 -0
  204. package/dist/core/source-scoring.js +396 -0
  205. package/dist/core/stemmer.d.ts +38 -0
  206. package/dist/core/stemmer.js +509 -0
  207. package/dist/core/strategies.d.ts +104 -0
  208. package/dist/core/strategies.js +1044 -0
  209. package/dist/core/strategy-hooks.d.ts +145 -0
  210. package/dist/core/strategy-hooks.js +74 -0
  211. package/dist/core/structured-extract.d.ts +43 -0
  212. package/dist/core/structured-extract.js +550 -0
  213. package/dist/core/summarize.d.ts +17 -0
  214. package/dist/core/summarize.js +78 -0
  215. package/dist/core/synonyms.d.ts +42 -0
  216. package/dist/core/synonyms.js +184 -0
  217. package/dist/core/system-monitor.d.ts +61 -0
  218. package/dist/core/system-monitor.js +133 -0
  219. package/dist/core/table-format.d.ts +30 -0
  220. package/dist/core/table-format.js +146 -0
  221. package/dist/core/threat-feeds.d.ts +23 -0
  222. package/dist/core/threat-feeds.js +104 -0
  223. package/dist/core/timing.d.ts +21 -0
  224. package/dist/core/timing.js +33 -0
  225. package/dist/core/transcript-export.d.ts +47 -0
  226. package/dist/core/transcript-export.js +107 -0
  227. package/dist/core/user-agents.d.ts +82 -0
  228. package/dist/core/user-agents.js +239 -0
  229. package/dist/core/vertical-search.d.ts +54 -0
  230. package/dist/core/vertical-search.js +158 -0
  231. package/dist/core/watch-manager.d.ts +175 -0
  232. package/dist/core/watch-manager.js +416 -0
  233. package/dist/core/watch.d.ts +101 -0
  234. package/dist/core/watch.js +389 -0
  235. package/dist/core/youtube.d.ts +130 -0
  236. package/dist/core/youtube.js +1175 -0
  237. package/dist/ee/challenge-re-export.d.ts +1 -0
  238. package/dist/ee/challenge-re-export.js +1 -0
  239. package/dist/ee/challenge-solver.d.ts +72 -0
  240. package/dist/ee/challenge-solver.js +720 -0
  241. package/dist/ee/domain-extractors.d.ts +8 -0
  242. package/dist/ee/domain-extractors.js +8 -0
  243. package/dist/ee/domain-intel.d.ts +16 -0
  244. package/dist/ee/domain-intel.js +133 -0
  245. package/dist/ee/extractors/allrecipes.d.ts +2 -0
  246. package/dist/ee/extractors/allrecipes.js +120 -0
  247. package/dist/ee/extractors/amazon.d.ts +2 -0
  248. package/dist/ee/extractors/amazon.js +78 -0
  249. package/dist/ee/extractors/arxiv.d.ts +2 -0
  250. package/dist/ee/extractors/arxiv.js +137 -0
  251. package/dist/ee/extractors/bestbuy.d.ts +2 -0
  252. package/dist/ee/extractors/bestbuy.js +78 -0
  253. package/dist/ee/extractors/carscom.d.ts +2 -0
  254. package/dist/ee/extractors/carscom.js +121 -0
  255. package/dist/ee/extractors/coingecko.d.ts +2 -0
  256. package/dist/ee/extractors/coingecko.js +134 -0
  257. package/dist/ee/extractors/craigslist.d.ts +2 -0
  258. package/dist/ee/extractors/craigslist.js +92 -0
  259. package/dist/ee/extractors/devto.d.ts +2 -0
  260. package/dist/ee/extractors/devto.js +135 -0
  261. package/dist/ee/extractors/ebay.d.ts +2 -0
  262. package/dist/ee/extractors/ebay.js +90 -0
  263. package/dist/ee/extractors/espn.d.ts +2 -0
  264. package/dist/ee/extractors/espn.js +260 -0
  265. package/dist/ee/extractors/etsy.d.ts +2 -0
  266. package/dist/ee/extractors/etsy.js +52 -0
  267. package/dist/ee/extractors/facebook.d.ts +2 -0
  268. package/dist/ee/extractors/facebook.js +46 -0
  269. package/dist/ee/extractors/github.d.ts +2 -0
  270. package/dist/ee/extractors/github.js +196 -0
  271. package/dist/ee/extractors/google-flights.d.ts +2 -0
  272. package/dist/ee/extractors/google-flights.js +176 -0
  273. package/dist/ee/extractors/hackernews.d.ts +2 -0
  274. package/dist/ee/extractors/hackernews.js +147 -0
  275. package/dist/ee/extractors/imdb.d.ts +2 -0
  276. package/dist/ee/extractors/imdb.js +172 -0
  277. package/dist/ee/extractors/index.d.ts +26 -0
  278. package/dist/ee/extractors/index.js +247 -0
  279. package/dist/ee/extractors/instagram.d.ts +2 -0
  280. package/dist/ee/extractors/instagram.js +102 -0
  281. package/dist/ee/extractors/kalshi.d.ts +2 -0
  282. package/dist/ee/extractors/kalshi.js +121 -0
  283. package/dist/ee/extractors/kayak-cars.d.ts +2 -0
  284. package/dist/ee/extractors/kayak-cars.js +270 -0
  285. package/dist/ee/extractors/linkedin.d.ts +2 -0
  286. package/dist/ee/extractors/linkedin.js +113 -0
  287. package/dist/ee/extractors/medium.d.ts +2 -0
  288. package/dist/ee/extractors/medium.js +130 -0
  289. package/dist/ee/extractors/news.d.ts +4 -0
  290. package/dist/ee/extractors/news.js +173 -0
  291. package/dist/ee/extractors/npm.d.ts +2 -0
  292. package/dist/ee/extractors/npm.js +86 -0
  293. package/dist/ee/extractors/pdf.d.ts +2 -0
  294. package/dist/ee/extractors/pdf.js +108 -0
  295. package/dist/ee/extractors/pinterest.d.ts +2 -0
  296. package/dist/ee/extractors/pinterest.js +34 -0
  297. package/dist/ee/extractors/polymarket.d.ts +2 -0
  298. package/dist/ee/extractors/polymarket.js +358 -0
  299. package/dist/ee/extractors/producthunt.d.ts +2 -0
  300. package/dist/ee/extractors/producthunt.js +88 -0
  301. package/dist/ee/extractors/pubmed.d.ts +2 -0
  302. package/dist/ee/extractors/pubmed.js +162 -0
  303. package/dist/ee/extractors/pypi.d.ts +2 -0
  304. package/dist/ee/extractors/pypi.js +80 -0
  305. package/dist/ee/extractors/reddit.d.ts +2 -0
  306. package/dist/ee/extractors/reddit.js +438 -0
  307. package/dist/ee/extractors/redfin.d.ts +2 -0
  308. package/dist/ee/extractors/redfin.js +156 -0
  309. package/dist/ee/extractors/semanticscholar.d.ts +2 -0
  310. package/dist/ee/extractors/semanticscholar.js +131 -0
  311. package/dist/ee/extractors/shared.d.ts +12 -0
  312. package/dist/ee/extractors/shared.js +76 -0
  313. package/dist/ee/extractors/soundcloud.d.ts +2 -0
  314. package/dist/ee/extractors/soundcloud.js +34 -0
  315. package/dist/ee/extractors/sportsbetting.d.ts +2 -0
  316. package/dist/ee/extractors/sportsbetting.js +37 -0
  317. package/dist/ee/extractors/spotify.d.ts +2 -0
  318. package/dist/ee/extractors/spotify.js +34 -0
  319. package/dist/ee/extractors/stackoverflow.d.ts +2 -0
  320. package/dist/ee/extractors/stackoverflow.js +61 -0
  321. package/dist/ee/extractors/substack.d.ts +2 -0
  322. package/dist/ee/extractors/substack.js +115 -0
  323. package/dist/ee/extractors/substackroot.d.ts +2 -0
  324. package/dist/ee/extractors/substackroot.js +46 -0
  325. package/dist/ee/extractors/tiktok.d.ts +2 -0
  326. package/dist/ee/extractors/tiktok.js +29 -0
  327. package/dist/ee/extractors/tradingview.d.ts +2 -0
  328. package/dist/ee/extractors/tradingview.js +182 -0
  329. package/dist/ee/extractors/twitch.d.ts +2 -0
  330. package/dist/ee/extractors/twitch.js +36 -0
  331. package/dist/ee/extractors/twitter.d.ts +2 -0
  332. package/dist/ee/extractors/twitter.js +327 -0
  333. package/dist/ee/extractors/types.d.ts +14 -0
  334. package/dist/ee/extractors/types.js +1 -0
  335. package/dist/ee/extractors/walmart.d.ts +2 -0
  336. package/dist/ee/extractors/walmart.js +50 -0
  337. package/dist/ee/extractors/weather.d.ts +2 -0
  338. package/dist/ee/extractors/weather.js +133 -0
  339. package/dist/ee/extractors/wikipedia.d.ts +4 -0
  340. package/dist/ee/extractors/wikipedia.js +235 -0
  341. package/dist/ee/extractors/yelp.d.ts +2 -0
  342. package/dist/ee/extractors/yelp.js +216 -0
  343. package/dist/ee/extractors/youtube.d.ts +2 -0
  344. package/dist/ee/extractors/youtube.js +189 -0
  345. package/dist/ee/extractors/zillow.d.ts +54 -0
  346. package/dist/ee/extractors/zillow.js +247 -0
  347. package/dist/ee/extractors-re-export.d.ts +1 -0
  348. package/dist/ee/extractors-re-export.js +1 -0
  349. package/dist/ee/premium-hooks.d.ts +20 -0
  350. package/dist/ee/premium-hooks.js +50 -0
  351. package/dist/ee/spa-detection.d.ts +2 -0
  352. package/dist/ee/spa-detection.js +2 -0
  353. package/dist/ee/stability.d.ts +4 -0
  354. package/dist/ee/stability.js +29 -0
  355. package/dist/ee/swr-cache.d.ts +14 -0
  356. package/dist/ee/swr-cache.js +34 -0
  357. package/dist/index.d.ts +143 -0
  358. package/dist/index.js +291 -0
  359. package/dist/integrations/index.d.ts +2 -0
  360. package/dist/integrations/index.js +2 -0
  361. package/dist/integrations/langchain.d.ts +64 -0
  362. package/dist/integrations/langchain.js +115 -0
  363. package/dist/integrations/llamaindex.d.ts +50 -0
  364. package/dist/integrations/llamaindex.js +91 -0
  365. package/dist/mcp/handlers/act.d.ts +5 -0
  366. package/dist/mcp/handlers/act.js +34 -0
  367. package/dist/mcp/handlers/definitions.d.ts +6 -0
  368. package/dist/mcp/handlers/definitions.js +395 -0
  369. package/dist/mcp/handlers/extract.d.ts +7 -0
  370. package/dist/mcp/handlers/extract.js +135 -0
  371. package/dist/mcp/handlers/fetch.d.ts +6 -0
  372. package/dist/mcp/handlers/fetch.js +98 -0
  373. package/dist/mcp/handlers/find.d.ts +5 -0
  374. package/dist/mcp/handlers/find.js +137 -0
  375. package/dist/mcp/handlers/index.d.ts +13 -0
  376. package/dist/mcp/handlers/index.js +63 -0
  377. package/dist/mcp/handlers/legacy.d.ts +25 -0
  378. package/dist/mcp/handlers/legacy.js +450 -0
  379. package/dist/mcp/handlers/meta.d.ts +6 -0
  380. package/dist/mcp/handlers/meta.js +40 -0
  381. package/dist/mcp/handlers/monitor.d.ts +5 -0
  382. package/dist/mcp/handlers/monitor.js +41 -0
  383. package/dist/mcp/handlers/observe.d.ts +8 -0
  384. package/dist/mcp/handlers/observe.js +37 -0
  385. package/dist/mcp/handlers/read.d.ts +6 -0
  386. package/dist/mcp/handlers/read.js +78 -0
  387. package/dist/mcp/handlers/see.d.ts +5 -0
  388. package/dist/mcp/handlers/see.js +75 -0
  389. package/dist/mcp/handlers/types.d.ts +29 -0
  390. package/dist/mcp/handlers/types.js +28 -0
  391. package/dist/mcp/server.d.ts +7 -0
  392. package/dist/mcp/server.js +108 -0
  393. package/dist/mcp/smart-router.d.ts +23 -0
  394. package/dist/mcp/smart-router.js +178 -0
  395. package/dist/server/app.d.ts +14 -0
  396. package/dist/server/app.js +632 -0
  397. package/dist/server/auth-store.d.ts +28 -0
  398. package/dist/server/auth-store.js +88 -0
  399. package/dist/server/bull-queues.d.ts +60 -0
  400. package/dist/server/bull-queues.js +90 -0
  401. package/dist/server/email-service.d.ts +55 -0
  402. package/dist/server/email-service.js +291 -0
  403. package/dist/server/job-queue.d.ts +100 -0
  404. package/dist/server/job-queue.js +145 -0
  405. package/dist/server/logger.d.ts +10 -0
  406. package/dist/server/logger.js +37 -0
  407. package/dist/server/middleware/audit-log.d.ts +14 -0
  408. package/dist/server/middleware/audit-log.js +73 -0
  409. package/dist/server/middleware/auth.d.ts +35 -0
  410. package/dist/server/middleware/auth.js +225 -0
  411. package/dist/server/middleware/rate-limit.d.ts +50 -0
  412. package/dist/server/middleware/rate-limit.js +270 -0
  413. package/dist/server/middleware/scope-guard.d.ts +25 -0
  414. package/dist/server/middleware/scope-guard.js +45 -0
  415. package/dist/server/middleware/url-validator.d.ts +15 -0
  416. package/dist/server/middleware/url-validator.js +201 -0
  417. package/dist/server/openapi.yaml +6418 -0
  418. package/dist/server/pg-auth-store.d.ts +146 -0
  419. package/dist/server/pg-auth-store.js +576 -0
  420. package/dist/server/pg-job-queue.d.ts +59 -0
  421. package/dist/server/pg-job-queue.js +375 -0
  422. package/dist/server/routes/activity.d.ts +6 -0
  423. package/dist/server/routes/activity.js +79 -0
  424. package/dist/server/routes/admin-active.d.ts +7 -0
  425. package/dist/server/routes/admin-active.js +120 -0
  426. package/dist/server/routes/admin-stats.d.ts +7 -0
  427. package/dist/server/routes/admin-stats.js +176 -0
  428. package/dist/server/routes/agent.d.ts +24 -0
  429. package/dist/server/routes/agent.js +480 -0
  430. package/dist/server/routes/answer.d.ts +5 -0
  431. package/dist/server/routes/answer.js +125 -0
  432. package/dist/server/routes/ask.d.ts +28 -0
  433. package/dist/server/routes/ask.js +295 -0
  434. package/dist/server/routes/batch.d.ts +6 -0
  435. package/dist/server/routes/batch.js +493 -0
  436. package/dist/server/routes/cache-warm.d.ts +25 -0
  437. package/dist/server/routes/cache-warm.js +212 -0
  438. package/dist/server/routes/cli-usage.d.ts +6 -0
  439. package/dist/server/routes/cli-usage.js +127 -0
  440. package/dist/server/routes/compat.d.ts +23 -0
  441. package/dist/server/routes/compat.js +652 -0
  442. package/dist/server/routes/crawl.d.ts +13 -0
  443. package/dist/server/routes/crawl.js +287 -0
  444. package/dist/server/routes/deep-fetch.d.ts +8 -0
  445. package/dist/server/routes/deep-fetch.js +57 -0
  446. package/dist/server/routes/deep-research.d.ts +11 -0
  447. package/dist/server/routes/deep-research.js +232 -0
  448. package/dist/server/routes/demo.d.ts +24 -0
  449. package/dist/server/routes/demo.js +517 -0
  450. package/dist/server/routes/do.d.ts +8 -0
  451. package/dist/server/routes/do.js +72 -0
  452. package/dist/server/routes/extract.d.ts +14 -0
  453. package/dist/server/routes/extract.js +325 -0
  454. package/dist/server/routes/feed.d.ts +15 -0
  455. package/dist/server/routes/feed.js +311 -0
  456. package/dist/server/routes/fetch-queue.d.ts +13 -0
  457. package/dist/server/routes/fetch-queue.js +357 -0
  458. package/dist/server/routes/fetch.d.ts +7 -0
  459. package/dist/server/routes/fetch.js +1274 -0
  460. package/dist/server/routes/go.d.ts +14 -0
  461. package/dist/server/routes/go.js +81 -0
  462. package/dist/server/routes/health.d.ts +11 -0
  463. package/dist/server/routes/health.js +141 -0
  464. package/dist/server/routes/jobs.d.ts +7 -0
  465. package/dist/server/routes/jobs.js +574 -0
  466. package/dist/server/routes/map.d.ts +11 -0
  467. package/dist/server/routes/map.js +116 -0
  468. package/dist/server/routes/mcp.d.ts +14 -0
  469. package/dist/server/routes/mcp.js +197 -0
  470. package/dist/server/routes/metrics.d.ts +37 -0
  471. package/dist/server/routes/metrics.js +149 -0
  472. package/dist/server/routes/oauth.d.ts +9 -0
  473. package/dist/server/routes/oauth.js +396 -0
  474. package/dist/server/routes/playground.d.ts +17 -0
  475. package/dist/server/routes/playground.js +283 -0
  476. package/dist/server/routes/reader.d.ts +18 -0
  477. package/dist/server/routes/reader.js +192 -0
  478. package/dist/server/routes/research.d.ts +14 -0
  479. package/dist/server/routes/research.js +482 -0
  480. package/dist/server/routes/screenshot.d.ts +22 -0
  481. package/dist/server/routes/screenshot.js +820 -0
  482. package/dist/server/routes/search.d.ts +6 -0
  483. package/dist/server/routes/search.js +874 -0
  484. package/dist/server/routes/session.d.ts +17 -0
  485. package/dist/server/routes/session.js +548 -0
  486. package/dist/server/routes/share.d.ts +18 -0
  487. package/dist/server/routes/share.js +462 -0
  488. package/dist/server/routes/smart-search/handlers/cars.d.ts +2 -0
  489. package/dist/server/routes/smart-search/handlers/cars.js +102 -0
  490. package/dist/server/routes/smart-search/handlers/flights.d.ts +2 -0
  491. package/dist/server/routes/smart-search/handlers/flights.js +72 -0
  492. package/dist/server/routes/smart-search/handlers/general.d.ts +13 -0
  493. package/dist/server/routes/smart-search/handlers/general.js +717 -0
  494. package/dist/server/routes/smart-search/handlers/hotels.d.ts +2 -0
  495. package/dist/server/routes/smart-search/handlers/hotels.js +88 -0
  496. package/dist/server/routes/smart-search/handlers/products.d.ts +2 -0
  497. package/dist/server/routes/smart-search/handlers/products.js +1309 -0
  498. package/dist/server/routes/smart-search/handlers/rental.d.ts +2 -0
  499. package/dist/server/routes/smart-search/handlers/rental.js +154 -0
  500. package/dist/server/routes/smart-search/handlers/restaurants.d.ts +2 -0
  501. package/dist/server/routes/smart-search/handlers/restaurants.js +225 -0
  502. package/dist/server/routes/smart-search/handlers/transit-verdict.d.ts +41 -0
  503. package/dist/server/routes/smart-search/handlers/transit-verdict.js +224 -0
  504. package/dist/server/routes/smart-search/index.d.ts +19 -0
  505. package/dist/server/routes/smart-search/index.js +546 -0
  506. package/dist/server/routes/smart-search/intent.d.ts +3 -0
  507. package/dist/server/routes/smart-search/intent.js +264 -0
  508. package/dist/server/routes/smart-search/llm.d.ts +16 -0
  509. package/dist/server/routes/smart-search/llm.js +70 -0
  510. package/dist/server/routes/smart-search/sources/reddit.d.ts +18 -0
  511. package/dist/server/routes/smart-search/sources/reddit.js +34 -0
  512. package/dist/server/routes/smart-search/sources/yelp.d.ts +25 -0
  513. package/dist/server/routes/smart-search/sources/yelp.js +171 -0
  514. package/dist/server/routes/smart-search/sources/youtube.d.ts +8 -0
  515. package/dist/server/routes/smart-search/sources/youtube.js +9 -0
  516. package/dist/server/routes/smart-search/types.d.ts +81 -0
  517. package/dist/server/routes/smart-search/types.js +1 -0
  518. package/dist/server/routes/smart-search/utils.d.ts +20 -0
  519. package/dist/server/routes/smart-search/utils.js +146 -0
  520. package/dist/server/routes/stats.d.ts +6 -0
  521. package/dist/server/routes/stats.js +71 -0
  522. package/dist/server/routes/stripe.d.ts +15 -0
  523. package/dist/server/routes/stripe.js +296 -0
  524. package/dist/server/routes/transcript-export.d.ts +10 -0
  525. package/dist/server/routes/transcript-export.js +178 -0
  526. package/dist/server/routes/usage.d.ts +9 -0
  527. package/dist/server/routes/usage.js +279 -0
  528. package/dist/server/routes/users.d.ts +8 -0
  529. package/dist/server/routes/users.js +1867 -0
  530. package/dist/server/routes/watch.d.ts +15 -0
  531. package/dist/server/routes/watch.js +309 -0
  532. package/dist/server/routes/webhooks.d.ts +26 -0
  533. package/dist/server/routes/webhooks.js +170 -0
  534. package/dist/server/routes/youtube.d.ts +6 -0
  535. package/dist/server/routes/youtube.js +130 -0
  536. package/dist/server/sentry.d.ts +14 -0
  537. package/dist/server/sentry.js +104 -0
  538. package/dist/server/types.d.ts +15 -0
  539. package/dist/server/types.js +7 -0
  540. package/dist/server/utils/response.d.ts +44 -0
  541. package/dist/server/utils/response.js +69 -0
  542. package/dist/server/utils/sse.d.ts +22 -0
  543. package/dist/server/utils/sse.js +38 -0
  544. package/dist/types.d.ts +552 -0
  545. package/dist/types.js +39 -0
  546. package/llms.txt +105 -0
  547. package/package.json +189 -0
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Community threat intelligence feeds — cached in-memory, refreshed every 6 hours.
3
+ *
4
+ * Sources (all free, no API key):
5
+ * - URLhaus (abuse.ch): ~150K active malware distribution URLs
6
+ * API: https://urlhaus-api.abuse.ch/v1/url/ (POST with url=<url>)
7
+ * - PhishTank: community-verified phishing URLs
8
+ * API: https://checkurl.phishtank.com/checkurl/ (POST with url=<url>&format=json)
9
+ * - OpenPhish: curated phishing feed
10
+ * Feed: https://openphish.com/feed.txt (plain text, one URL per line, ~5K URLs)
11
+ *
12
+ * Strategy:
13
+ * - On startup, fetch OpenPhish feed into a Set (small, fast lookup)
14
+ * - For URLhaus and PhishTank, do real-time API lookups with 2s timeout
15
+ * - Cache results for 1 hour to avoid hammering APIs
16
+ */
17
+ // Cache for URL lookups (avoid re-checking same URL)
18
+ const resultCache = new Map();
19
+ const CACHE_TTL = 3600_000; // 1 hour
20
+ // OpenPhish feed (loaded once, refreshed every 6h)
21
+ let openPhishSet = null;
22
+ let openPhishLastFetch = 0;
23
+ const OPENPHISH_REFRESH = 6 * 3600_000;
24
+ async function loadOpenPhishFeed() {
25
+ if (openPhishSet && Date.now() - openPhishLastFetch < OPENPHISH_REFRESH) {
26
+ return openPhishSet;
27
+ }
28
+ try {
29
+ const res = await fetch('https://openphish.com/feed.txt', {
30
+ signal: AbortSignal.timeout(5000),
31
+ });
32
+ if (res.ok) {
33
+ const text = await res.text();
34
+ openPhishSet = new Set(text.split('\n').filter(Boolean).map(u => u.trim().toLowerCase()));
35
+ openPhishLastFetch = Date.now();
36
+ }
37
+ }
38
+ catch { /* silent — feed optional */ }
39
+ return openPhishSet ?? new Set();
40
+ }
41
+ export async function checkThreatFeeds(url) {
42
+ // Check cache first
43
+ const normalizedUrl = url.toLowerCase();
44
+ const cached = resultCache.get(normalizedUrl);
45
+ if (cached && cached.expires > Date.now())
46
+ return cached.result;
47
+ const threats = [];
48
+ let details;
49
+ let source = 'none';
50
+ // 1. OpenPhish (local Set lookup — instant)
51
+ const phishSet = await loadOpenPhishFeed();
52
+ if (phishSet.has(normalizedUrl)) {
53
+ threats.push('OPENPHISH_PHISHING');
54
+ source = 'openphish';
55
+ }
56
+ // 2. URLhaus API (2s timeout)
57
+ try {
58
+ const res = await fetch('https://urlhaus-api.abuse.ch/v1/url/', {
59
+ method: 'POST',
60
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
61
+ body: `url=${encodeURIComponent(url)}`,
62
+ signal: AbortSignal.timeout(2000),
63
+ });
64
+ if (res.ok) {
65
+ const data = await res.json();
66
+ if (data.query_status === 'listed') {
67
+ threats.push('URLHAUS_MALWARE');
68
+ source = 'urlhaus';
69
+ details = `URLhaus: ${data.threat || 'malware'}, tags: ${(data.tags || []).join(', ') || 'none'}`;
70
+ }
71
+ }
72
+ }
73
+ catch { /* timeout or network error — skip silently */ }
74
+ // 3. PhishTank API (2s timeout) — only if not already flagged
75
+ if (threats.length === 0) {
76
+ try {
77
+ const res = await fetch('https://checkurl.phishtank.com/checkurl/', {
78
+ method: 'POST',
79
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
80
+ body: `url=${encodeURIComponent(url)}&format=json&app_key=`,
81
+ signal: AbortSignal.timeout(2000),
82
+ });
83
+ if (res.ok) {
84
+ const data = await res.json();
85
+ if (data.results?.in_database &&
86
+ data.results?.verified === 'yes' &&
87
+ data.results?.valid === 'yes') {
88
+ threats.push('PHISHTANK_PHISHING');
89
+ source = 'phishtank';
90
+ }
91
+ }
92
+ }
93
+ catch { /* timeout — skip */ }
94
+ }
95
+ const result = {
96
+ safe: threats.length === 0,
97
+ threats,
98
+ source,
99
+ details,
100
+ };
101
+ // Cache the result
102
+ resultCache.set(normalizedUrl, { result, expires: Date.now() + CACHE_TTL });
103
+ return result;
104
+ }
@@ -0,0 +1,21 @@
1
+ export interface PipelineTiming {
2
+ total: number;
3
+ fetch: number;
4
+ parse: number;
5
+ prune: number;
6
+ convert: number;
7
+ metadata: number;
8
+ readability?: number;
9
+ quickAnswer?: number;
10
+ domainExtract?: number;
11
+ budget?: number;
12
+ }
13
+ export declare class Timer {
14
+ private marks;
15
+ private durations;
16
+ private start;
17
+ constructor();
18
+ mark(name: string): void;
19
+ end(name: string): number;
20
+ toTiming(): PipelineTiming;
21
+ }
@@ -0,0 +1,33 @@
1
+ export class Timer {
2
+ marks = new Map();
3
+ durations = new Map();
4
+ start;
5
+ constructor() {
6
+ this.start = Date.now();
7
+ }
8
+ mark(name) {
9
+ this.marks.set(name, Date.now());
10
+ }
11
+ end(name) {
12
+ const markTime = this.marks.get(name);
13
+ if (!markTime)
14
+ return 0;
15
+ const duration = Date.now() - markTime;
16
+ this.durations.set(name, duration);
17
+ return duration;
18
+ }
19
+ toTiming() {
20
+ return {
21
+ total: Date.now() - this.start,
22
+ fetch: this.durations.get('fetch') ?? 0,
23
+ parse: this.durations.get('parse') ?? 0,
24
+ prune: this.durations.get('prune') ?? 0,
25
+ convert: this.durations.get('convert') ?? 0,
26
+ metadata: this.durations.get('metadata') ?? 0,
27
+ readability: this.durations.get('readability'),
28
+ quickAnswer: this.durations.get('quickAnswer'),
29
+ domainExtract: this.durations.get('domainExtract'),
30
+ budget: this.durations.get('budget'),
31
+ };
32
+ }
33
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Transcript export format converters.
3
+ *
4
+ * Converts YouTube transcript data into SRT, plain text, Markdown, or JSON
5
+ * so users can download transcripts in their preferred format.
6
+ */
7
+ import type { TranscriptSegment, YouTubeTranscript } from './youtube.js';
8
+ export type { TranscriptSegment, YouTubeTranscript as TranscriptResult };
9
+ /**
10
+ * Format seconds as an SRT timestamp: HH:MM:SS,mmm
11
+ *
12
+ * @example formatSRTTimestamp(3661.5) → "01:01:01,500"
13
+ */
14
+ export declare function formatSRTTimestamp(seconds: number): string;
15
+ /**
16
+ * Convert transcript segments to SRT subtitle format.
17
+ *
18
+ * SRT structure:
19
+ * ```
20
+ * 1
21
+ * 00:00:01,000 --> 00:00:04,500
22
+ * We're no strangers to love
23
+ *
24
+ * 2
25
+ * 00:00:04,500 --> 00:00:08,000
26
+ * You know the rules and so do I
27
+ * ```
28
+ */
29
+ export declare function toSRT(segments: TranscriptSegment[]): string;
30
+ /**
31
+ * Convert transcript segments to plain text.
32
+ * One line per segment, no timestamps.
33
+ */
34
+ export declare function toTXT(segments: TranscriptSegment[]): string;
35
+ /**
36
+ * Convert transcript to a clean Markdown document.
37
+ * Includes title, channel header, and timestamped transcript lines.
38
+ *
39
+ * @param title - Video title
40
+ * @param channel - Channel name
41
+ * @param segments - Transcript segments
42
+ */
43
+ export declare function toMarkdownDoc(title: string, channel: string, segments: TranscriptSegment[]): string;
44
+ /**
45
+ * Convert full transcript result to pretty-printed JSON.
46
+ */
47
+ export declare function toJSON(result: YouTubeTranscript): string;
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Transcript export format converters.
3
+ *
4
+ * Converts YouTube transcript data into SRT, plain text, Markdown, or JSON
5
+ * so users can download transcripts in their preferred format.
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Timestamp helpers
9
+ // ---------------------------------------------------------------------------
10
+ /**
11
+ * Format seconds as an SRT timestamp: HH:MM:SS,mmm
12
+ *
13
+ * @example formatSRTTimestamp(3661.5) → "01:01:01,500"
14
+ */
15
+ export function formatSRTTimestamp(seconds) {
16
+ const totalMs = Math.round(Math.max(0, seconds) * 1000);
17
+ const ms = totalMs % 1000;
18
+ const totalSec = Math.floor(totalMs / 1000);
19
+ const s = totalSec % 60;
20
+ const totalMin = Math.floor(totalSec / 60);
21
+ const m = totalMin % 60;
22
+ const h = Math.floor(totalMin / 60);
23
+ return (`${String(h).padStart(2, '0')}:` +
24
+ `${String(m).padStart(2, '0')}:` +
25
+ `${String(s).padStart(2, '0')},` +
26
+ `${String(ms).padStart(3, '0')}`);
27
+ }
28
+ /**
29
+ * Format seconds as a human-readable timestamp: M:SS or H:MM:SS
30
+ *
31
+ * @example formatReadableTimestamp(125.3) → "2:05"
32
+ */
33
+ function formatReadableTimestamp(seconds) {
34
+ const totalSec = Math.floor(Math.max(0, seconds));
35
+ const h = Math.floor(totalSec / 3600);
36
+ const m = Math.floor((totalSec % 3600) / 60);
37
+ const s = totalSec % 60;
38
+ if (h > 0) {
39
+ return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;
40
+ }
41
+ return `${m}:${String(s).padStart(2, '0')}`;
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Export functions
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * Convert transcript segments to SRT subtitle format.
48
+ *
49
+ * SRT structure:
50
+ * ```
51
+ * 1
52
+ * 00:00:01,000 --> 00:00:04,500
53
+ * We're no strangers to love
54
+ *
55
+ * 2
56
+ * 00:00:04,500 --> 00:00:08,000
57
+ * You know the rules and so do I
58
+ * ```
59
+ */
60
+ export function toSRT(segments) {
61
+ if (segments.length === 0)
62
+ return '';
63
+ return segments
64
+ .map((seg, i) => {
65
+ const start = formatSRTTimestamp(seg.start);
66
+ const end = formatSRTTimestamp(seg.start + Math.max(0, seg.duration));
67
+ return `${i + 1}\n${start} --> ${end}\n${seg.text}`;
68
+ })
69
+ .join('\n\n');
70
+ }
71
+ /**
72
+ * Convert transcript segments to plain text.
73
+ * One line per segment, no timestamps.
74
+ */
75
+ export function toTXT(segments) {
76
+ return segments.map((seg) => seg.text).join('\n');
77
+ }
78
+ /**
79
+ * Convert transcript to a clean Markdown document.
80
+ * Includes title, channel header, and timestamped transcript lines.
81
+ *
82
+ * @param title - Video title
83
+ * @param channel - Channel name
84
+ * @param segments - Transcript segments
85
+ */
86
+ export function toMarkdownDoc(title, channel, segments) {
87
+ const lines = [];
88
+ lines.push(`# ${title || 'Transcript'}`);
89
+ lines.push('');
90
+ if (channel) {
91
+ lines.push(`**Channel:** ${channel}`);
92
+ lines.push('');
93
+ }
94
+ lines.push('## Transcript');
95
+ lines.push('');
96
+ for (const seg of segments) {
97
+ const ts = formatReadableTimestamp(seg.start);
98
+ lines.push(`**[${ts}]** ${seg.text}`);
99
+ }
100
+ return lines.join('\n');
101
+ }
102
+ /**
103
+ * Convert full transcript result to pretty-printed JSON.
104
+ */
105
+ export function toJSON(result) {
106
+ return JSON.stringify(result, null, 2);
107
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Realistic User Agent Rotation for WebPeel
3
+ *
4
+ * Provides a curated list of real-world Chrome user agents (132-136 range)
5
+ * across Windows, macOS, and Linux platforms. Used when stealth mode is active
6
+ * and no custom UA is set — prevents the default "Chrome for Testing" UA which
7
+ * is an instant bot-detection signal.
8
+ *
9
+ * Also provides `getSecCHUA()` for generating correct Sec-CH-UA header values
10
+ * that match the selected user agent (version-accurate brand hints).
11
+ */
12
+ /**
13
+ * Full UA pool for HTTP-only requests (Chrome + Firefox + Safari + Edge + Mobile).
14
+ * NOT for browser contexts — use getRealisticUserAgent() there (Chrome-only).
15
+ */
16
+ export declare const HTTP_UAS: readonly string[];
17
+ /**
18
+ * Returns a realistic, recent Chrome user agent string.
19
+ * Randomly picks from a curated list of real-world UAs (Chrome 132-136 range).
20
+ *
21
+ * @param platform - Optionally restrict to a specific OS platform.
22
+ * When omitted, picks from all platforms (weighted: ~55% Windows, ~35% Mac, ~10% Linux).
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * // Random platform
27
+ * const ua = getRealisticUserAgent();
28
+ *
29
+ * // Force Windows UA (e.g. for LinkedIn, which is more common on Windows)
30
+ * const ua = getRealisticUserAgent('windows');
31
+ * ```
32
+ */
33
+ export declare function getRealisticUserAgent(platform?: 'windows' | 'mac' | 'linux'): string;
34
+ /**
35
+ * Returns a random UA from the full list (all platforms).
36
+ * Equivalent to `getRealisticUserAgent()` with no arguments.
37
+ */
38
+ export declare function getRandomUA(): string;
39
+ /**
40
+ * Returns a realistic user agent for HTTP-only (non-browser) requests.
41
+ * Unlike `getRealisticUserAgent()` which is Chrome-only for browser contexts,
42
+ * this function returns from a wider pool: Chrome, Firefox, Safari, Edge, and Mobile.
43
+ *
44
+ * Weight distribution (approximate):
45
+ * - Chrome Windows: ~30%
46
+ * - Chrome macOS: ~25%
47
+ * - Chrome Linux: ~10%
48
+ * - Firefox: ~15%
49
+ * - Safari: ~10%
50
+ * - Edge: ~5%
51
+ * - Mobile Chrome: ~5%
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const ua = getHttpUA(); // e.g. "Mozilla/5.0 ... Firefox/133.0"
56
+ * ```
57
+ */
58
+ export declare function getHttpUA(): string;
59
+ /**
60
+ * The full curated list of realistic user agents (Chrome-only, all platforms).
61
+ * Exported for inspection / testing.
62
+ */
63
+ export declare const REALISTIC_USER_AGENTS: readonly string[];
64
+ /**
65
+ * Get a Sec-CH-UA header value that matches the given user agent string.
66
+ *
67
+ * Extracts the Chrome major version from the UA string and returns a properly
68
+ * formatted `Sec-CH-UA` header value, e.g.:
69
+ * `"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="24"`
70
+ *
71
+ * Falls back to a sane Chrome 136 value when the UA doesn't contain a
72
+ * recognizable Chrome version.
73
+ *
74
+ * @param userAgent - Full user agent string (e.g. from getRealisticUserAgent())
75
+ */
76
+ export declare function getSecCHUA(userAgent: string): string;
77
+ /**
78
+ * Determine the Sec-CH-UA-Platform header value based on the user agent string.
79
+ *
80
+ * @param userAgent - Full user agent string
81
+ */
82
+ export declare function getSecCHUAPlatform(userAgent: string): string;
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Realistic User Agent Rotation for WebPeel
3
+ *
4
+ * Provides a curated list of real-world Chrome user agents (132-136 range)
5
+ * across Windows, macOS, and Linux platforms. Used when stealth mode is active
6
+ * and no custom UA is set — prevents the default "Chrome for Testing" UA which
7
+ * is an instant bot-detection signal.
8
+ *
9
+ * Also provides `getSecCHUA()` for generating correct Sec-CH-UA header values
10
+ * that match the selected user agent (version-accurate brand hints).
11
+ */
12
+ // ── Curated UA lists ──────────────────────────────────────────────────────────
13
+ const WINDOWS_UAS = [
14
+ // Chrome 132
15
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
16
+ // Chrome 133
17
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
18
+ // Chrome 134
19
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
20
+ // Chrome 135
21
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
22
+ // Chrome 136
23
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
24
+ ];
25
+ const MAC_UAS = [
26
+ // Chrome 132 macOS
27
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
28
+ // Chrome 133 macOS
29
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
30
+ // Chrome 134 macOS
31
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
32
+ // Chrome 135 macOS
33
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
34
+ // Chrome 136 macOS
35
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
36
+ ];
37
+ const LINUX_UAS = [
38
+ // Chrome 133 Linux
39
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
40
+ // Chrome 135 Linux
41
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
42
+ // Chrome 136 Linux
43
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',
44
+ ];
45
+ /** All Chrome UAs combined (fallback when no platform is specified) */
46
+ const ALL_UAS = [...WINDOWS_UAS, ...MAC_UAS, ...LINUX_UAS];
47
+ // ── Extended pools for non-Chrome browsers (HTTP-only use) ───────────────────
48
+ /** Firefox UAs — Windows, Mac, Linux */
49
+ const FIREFOX_UAS = [
50
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0',
51
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0',
52
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14.7; rv:133.0) Gecko/20100101 Firefox/133.0',
53
+ 'Mozilla/5.0 (X11; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0',
54
+ ];
55
+ /** Safari UAs — macOS */
56
+ const SAFARI_UAS = [
57
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_7_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Safari/605.1.15',
58
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 15_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15',
59
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15',
60
+ ];
61
+ /** Microsoft Edge UAs */
62
+ const EDGE_UAS = [
63
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',
64
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0',
65
+ ];
66
+ /** Mobile Chrome UAs */
67
+ const MOBILE_CHROME_UAS = [
68
+ 'Mozilla/5.0 (Linux; Android 14; SM-S928B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36',
69
+ 'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Mobile Safari/537.36',
70
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/131.0.6778.103 Mobile/15E148 Safari/604.1',
71
+ ];
72
+ /**
73
+ * Full UA pool for HTTP-only requests (Chrome + Firefox + Safari + Edge + Mobile).
74
+ * NOT for browser contexts — use getRealisticUserAgent() there (Chrome-only).
75
+ */
76
+ export const HTTP_UAS = [
77
+ ...ALL_UAS,
78
+ ...FIREFOX_UAS,
79
+ ...SAFARI_UAS,
80
+ ...EDGE_UAS,
81
+ ...MOBILE_CHROME_UAS,
82
+ ];
83
+ // ── Public API ────────────────────────────────────────────────────────────────
84
+ /**
85
+ * Returns a realistic, recent Chrome user agent string.
86
+ * Randomly picks from a curated list of real-world UAs (Chrome 132-136 range).
87
+ *
88
+ * @param platform - Optionally restrict to a specific OS platform.
89
+ * When omitted, picks from all platforms (weighted: ~55% Windows, ~35% Mac, ~10% Linux).
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * // Random platform
94
+ * const ua = getRealisticUserAgent();
95
+ *
96
+ * // Force Windows UA (e.g. for LinkedIn, which is more common on Windows)
97
+ * const ua = getRealisticUserAgent('windows');
98
+ * ```
99
+ */
100
+ export function getRealisticUserAgent(platform) {
101
+ let pool;
102
+ if (platform === 'windows') {
103
+ pool = WINDOWS_UAS;
104
+ }
105
+ else if (platform === 'mac') {
106
+ pool = MAC_UAS;
107
+ }
108
+ else if (platform === 'linux') {
109
+ pool = LINUX_UAS;
110
+ }
111
+ else {
112
+ // Weighted random: Windows ~55%, Mac ~35%, Linux ~10%
113
+ const roll = Math.random();
114
+ if (roll < 0.55) {
115
+ pool = WINDOWS_UAS;
116
+ }
117
+ else if (roll < 0.90) {
118
+ pool = MAC_UAS;
119
+ }
120
+ else {
121
+ pool = LINUX_UAS;
122
+ }
123
+ }
124
+ const idx = Math.floor(Math.random() * pool.length);
125
+ return pool[idx];
126
+ }
127
+ /**
128
+ * Returns a random UA from the full list (all platforms).
129
+ * Equivalent to `getRealisticUserAgent()` with no arguments.
130
+ */
131
+ export function getRandomUA() {
132
+ const idx = Math.floor(Math.random() * ALL_UAS.length);
133
+ return ALL_UAS[idx];
134
+ }
135
+ /**
136
+ * Returns a realistic user agent for HTTP-only (non-browser) requests.
137
+ * Unlike `getRealisticUserAgent()` which is Chrome-only for browser contexts,
138
+ * this function returns from a wider pool: Chrome, Firefox, Safari, Edge, and Mobile.
139
+ *
140
+ * Weight distribution (approximate):
141
+ * - Chrome Windows: ~30%
142
+ * - Chrome macOS: ~25%
143
+ * - Chrome Linux: ~10%
144
+ * - Firefox: ~15%
145
+ * - Safari: ~10%
146
+ * - Edge: ~5%
147
+ * - Mobile Chrome: ~5%
148
+ *
149
+ * @example
150
+ * ```ts
151
+ * const ua = getHttpUA(); // e.g. "Mozilla/5.0 ... Firefox/133.0"
152
+ * ```
153
+ */
154
+ export function getHttpUA() {
155
+ const roll = Math.random();
156
+ let pool;
157
+ if (roll < 0.30) {
158
+ pool = WINDOWS_UAS;
159
+ }
160
+ else if (roll < 0.55) {
161
+ pool = MAC_UAS;
162
+ }
163
+ else if (roll < 0.65) {
164
+ pool = LINUX_UAS;
165
+ }
166
+ else if (roll < 0.80) {
167
+ pool = FIREFOX_UAS;
168
+ }
169
+ else if (roll < 0.90) {
170
+ pool = SAFARI_UAS;
171
+ }
172
+ else if (roll < 0.95) {
173
+ pool = EDGE_UAS;
174
+ }
175
+ else {
176
+ pool = MOBILE_CHROME_UAS;
177
+ }
178
+ return pool[Math.floor(Math.random() * pool.length)];
179
+ }
180
+ /**
181
+ * The full curated list of realistic user agents (Chrome-only, all platforms).
182
+ * Exported for inspection / testing.
183
+ */
184
+ export const REALISTIC_USER_AGENTS = ALL_UAS;
185
+ // ── Sec-CH-UA header generation ───────────────────────────────────────────────
186
+ /**
187
+ * The "Not A Brand" token format varies by Chrome version.
188
+ *
189
+ * Chrome 132-133: `"Not_A Brand";v="8"`
190
+ * Chrome 134-135: `"Not)A;Brand";v="99"`
191
+ * Chrome 136+: `"Not.A/Brand";v="24"`
192
+ *
193
+ * This matches real Chrome behavior to avoid client-hint fingerprinting.
194
+ */
195
+ function getNotABrandToken(chromeVersion) {
196
+ if (chromeVersion >= 136) {
197
+ return '"Not.A/Brand";v="24"';
198
+ }
199
+ else if (chromeVersion >= 134) {
200
+ return '"Not)A;Brand";v="99"';
201
+ }
202
+ else {
203
+ return '"Not_A Brand";v="8"';
204
+ }
205
+ }
206
+ /**
207
+ * Get a Sec-CH-UA header value that matches the given user agent string.
208
+ *
209
+ * Extracts the Chrome major version from the UA string and returns a properly
210
+ * formatted `Sec-CH-UA` header value, e.g.:
211
+ * `"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="24"`
212
+ *
213
+ * Falls back to a sane Chrome 136 value when the UA doesn't contain a
214
+ * recognizable Chrome version.
215
+ *
216
+ * @param userAgent - Full user agent string (e.g. from getRealisticUserAgent())
217
+ */
218
+ export function getSecCHUA(userAgent) {
219
+ // Extract Chrome major version from UA string
220
+ // Matches patterns like: Chrome/136.0.0.0 or Chrome/132
221
+ const match = userAgent.match(/Chrome\/(\d+)/i);
222
+ const version = match ? parseInt(match[1], 10) : 136;
223
+ const notABrand = getNotABrandToken(version);
224
+ return `"Chromium";v="${version}", "Google Chrome";v="${version}", ${notABrand}`;
225
+ }
226
+ /**
227
+ * Determine the Sec-CH-UA-Platform header value based on the user agent string.
228
+ *
229
+ * @param userAgent - Full user agent string
230
+ */
231
+ export function getSecCHUAPlatform(userAgent) {
232
+ if (userAgent.includes('Windows'))
233
+ return '"Windows"';
234
+ if (userAgent.includes('Macintosh'))
235
+ return '"macOS"';
236
+ if (userAgent.includes('Linux'))
237
+ return '"Linux"';
238
+ return '"Unknown"';
239
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Vertical search — specialized endpoints for shopping, news, images, videos.
3
+ * Primary: SearXNG (reliable, structured JSON, no CAPTCHA issues from datacenter).
4
+ * Fallback: Google scraping via peel() (for shopping only).
5
+ */
6
+ export interface ShoppingResult {
7
+ title: string;
8
+ price?: string;
9
+ currency?: string;
10
+ store: string;
11
+ url: string;
12
+ imageUrl?: string;
13
+ rating?: number;
14
+ reviewCount?: number;
15
+ condition?: string;
16
+ }
17
+ export interface NewsResult {
18
+ title: string;
19
+ url: string;
20
+ source: string;
21
+ date?: string;
22
+ snippet?: string;
23
+ imageUrl?: string;
24
+ category?: string;
25
+ }
26
+ export interface ImageResult {
27
+ title: string;
28
+ url: string;
29
+ imageUrl: string;
30
+ width?: number;
31
+ height?: number;
32
+ source?: string;
33
+ }
34
+ export interface VideoResult {
35
+ title: string;
36
+ url: string;
37
+ platform: string;
38
+ duration?: string;
39
+ date?: string;
40
+ thumbnailUrl?: string;
41
+ channel?: string;
42
+ views?: string;
43
+ }
44
+ export interface VerticalSearchOptions {
45
+ query: string;
46
+ count?: number;
47
+ country?: string;
48
+ language?: string;
49
+ freshness?: string;
50
+ }
51
+ export declare function searchShopping(opts: VerticalSearchOptions): Promise<ShoppingResult[]>;
52
+ export declare function searchNews(opts: VerticalSearchOptions): Promise<NewsResult[]>;
53
+ export declare function searchImages(opts: VerticalSearchOptions): Promise<ImageResult[]>;
54
+ export declare function searchVideos(opts: VerticalSearchOptions): Promise<VideoResult[]>;