@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,224 @@
1
+ /**
2
+ * Screenshot helper (Playwright)
3
+ *
4
+ * Returns a base64-encoded screenshot for a given URL.
5
+ */
6
+ import type { PageAction } from '../types.js';
7
+ export type ScreenshotFormat = 'png' | 'jpeg';
8
+ export interface ScreenshotOptions {
9
+ fullPage?: boolean;
10
+ width?: number;
11
+ height?: number;
12
+ /** png | jpeg | jpg (jpg is treated as jpeg) */
13
+ format?: 'png' | 'jpeg' | 'jpg';
14
+ /** JPEG quality (1-100). Ignored for PNG. */
15
+ quality?: number;
16
+ /** Wait in ms after page load (domcontentloaded) */
17
+ waitFor?: number;
18
+ timeout?: number;
19
+ userAgent?: string;
20
+ headers?: Record<string, string>;
21
+ cookies?: string[];
22
+ stealth?: boolean;
23
+ actions?: PageAction[];
24
+ scrollThrough?: boolean;
25
+ selector?: string;
26
+ }
27
+ export interface ScreenshotResult {
28
+ url: string;
29
+ format: ScreenshotFormat;
30
+ contentType: string;
31
+ /** Base64-encoded image bytes (no data: prefix) */
32
+ screenshot: string;
33
+ }
34
+ export declare function takeScreenshot(url: string, options?: ScreenshotOptions): Promise<ScreenshotResult>;
35
+ export interface FilmstripOptions {
36
+ frames?: number;
37
+ width?: number;
38
+ height?: number;
39
+ /** png | jpeg | jpg (jpg is treated as jpeg) */
40
+ format?: 'png' | 'jpeg' | 'jpg';
41
+ quality?: number;
42
+ waitFor?: number;
43
+ timeout?: number;
44
+ userAgent?: string;
45
+ headers?: Record<string, string>;
46
+ cookies?: string[];
47
+ stealth?: boolean;
48
+ }
49
+ export interface FilmstripResult {
50
+ url: string;
51
+ format: ScreenshotFormat;
52
+ contentType: string;
53
+ /** Array of base64-encoded screenshots (no data: prefix) */
54
+ frames: string[];
55
+ frameCount: number;
56
+ }
57
+ export declare function takeFilmstrip(url: string, options?: FilmstripOptions): Promise<FilmstripResult>;
58
+ export interface ScreenshotDiffOptions {
59
+ width?: number;
60
+ height?: number;
61
+ fullPage?: boolean;
62
+ threshold?: number;
63
+ format?: 'png' | 'jpeg' | 'jpg';
64
+ quality?: number;
65
+ stealth?: boolean;
66
+ waitFor?: number;
67
+ timeout?: number;
68
+ }
69
+ export interface ScreenshotDiffResult {
70
+ diff: string;
71
+ diffPixels: number;
72
+ totalPixels: number;
73
+ diffPercent: number;
74
+ dimensions: {
75
+ width: number;
76
+ height: number;
77
+ };
78
+ }
79
+ export declare function takeScreenshotDiff(url1: string, url2: string, options?: ScreenshotDiffOptions): Promise<ScreenshotDiffResult>;
80
+ export type { DesignAuditResult, DesignAnalysis, EffectInstance } from './fetcher.js';
81
+ import type { DesignAnalysis } from './fetcher.js';
82
+ import { type DesignComparison } from './design-compare.js';
83
+ export type { DesignComparison, DesignGap } from './design-compare.js';
84
+ export interface AuditOptions {
85
+ width?: number;
86
+ height?: number;
87
+ format?: 'png' | 'jpeg' | 'jpg';
88
+ quality?: number;
89
+ selector?: string;
90
+ waitFor?: number;
91
+ timeout?: number;
92
+ userAgent?: string;
93
+ headers?: Record<string, string>;
94
+ cookies?: string[];
95
+ stealth?: boolean;
96
+ scrollThrough?: boolean;
97
+ }
98
+ export interface AuditSection {
99
+ index: number;
100
+ tag: string;
101
+ id: string;
102
+ className: string;
103
+ top: number;
104
+ height: number;
105
+ screenshot: string;
106
+ }
107
+ export interface AuditResult {
108
+ url: string;
109
+ format: ScreenshotFormat;
110
+ sections: AuditSection[];
111
+ }
112
+ export declare function takeAuditScreenshots(url: string, options?: AuditOptions): Promise<AuditResult>;
113
+ export interface AnimationCaptureOptions {
114
+ frames?: number;
115
+ intervalMs?: number;
116
+ scrollTo?: number;
117
+ selector?: string;
118
+ width?: number;
119
+ height?: number;
120
+ format?: 'png' | 'jpeg' | 'jpg';
121
+ quality?: number;
122
+ waitFor?: number;
123
+ timeout?: number;
124
+ userAgent?: string;
125
+ headers?: Record<string, string>;
126
+ cookies?: string[];
127
+ stealth?: boolean;
128
+ }
129
+ export interface AnimationFrame {
130
+ index: number;
131
+ timestampMs: number;
132
+ screenshot: string;
133
+ }
134
+ export interface AnimationCaptureResult {
135
+ url: string;
136
+ format: ScreenshotFormat;
137
+ frames: AnimationFrame[];
138
+ frameCount: number;
139
+ }
140
+ export declare function takeAnimationCapture(url: string, options?: AnimationCaptureOptions): Promise<AnimationCaptureResult>;
141
+ export interface ViewportSpec {
142
+ width: number;
143
+ height: number;
144
+ label?: string;
145
+ }
146
+ export interface ViewportsBatchOptions {
147
+ viewports: ViewportSpec[];
148
+ fullPage?: boolean;
149
+ format?: 'png' | 'jpeg' | 'jpg';
150
+ quality?: number;
151
+ waitFor?: number;
152
+ timeout?: number;
153
+ userAgent?: string;
154
+ headers?: Record<string, string>;
155
+ cookies?: string[];
156
+ stealth?: boolean;
157
+ scrollThrough?: boolean;
158
+ }
159
+ export interface ViewportResult {
160
+ width: number;
161
+ height: number;
162
+ label: string;
163
+ screenshot: string;
164
+ }
165
+ export interface ViewportsBatchResult {
166
+ url: string;
167
+ format: ScreenshotFormat;
168
+ viewports: ViewportResult[];
169
+ }
170
+ export declare function takeViewportsBatch(url: string, options: ViewportsBatchOptions): Promise<ViewportsBatchResult>;
171
+ export interface DesignAuditOptions {
172
+ rules?: {
173
+ spacingGrid?: number;
174
+ minTouchTarget?: number;
175
+ minContrast?: number;
176
+ };
177
+ selector?: string;
178
+ width?: number;
179
+ height?: number;
180
+ waitFor?: number;
181
+ timeout?: number;
182
+ userAgent?: string;
183
+ headers?: Record<string, string>;
184
+ cookies?: string[];
185
+ stealth?: boolean;
186
+ }
187
+ export interface DesignAuditSummaryResult {
188
+ url: string;
189
+ audit: import('./fetcher.js').DesignAuditResult;
190
+ }
191
+ export declare function takeDesignAudit(url: string, options?: DesignAuditOptions): Promise<DesignAuditSummaryResult>;
192
+ export interface DesignAnalysisOptions {
193
+ selector?: string;
194
+ width?: number;
195
+ height?: number;
196
+ waitFor?: number;
197
+ timeout?: number;
198
+ userAgent?: string;
199
+ headers?: Record<string, string>;
200
+ cookies?: string[];
201
+ stealth?: boolean;
202
+ }
203
+ export interface DesignAnalysisSummaryResult {
204
+ url: string;
205
+ analysis: DesignAnalysis;
206
+ }
207
+ export declare function takeDesignAnalysis(url: string, options?: DesignAnalysisOptions): Promise<DesignAnalysisSummaryResult>;
208
+ export interface DesignCompareOptions {
209
+ width?: number;
210
+ height?: number;
211
+ waitFor?: number;
212
+ timeout?: number;
213
+ stealth?: boolean;
214
+ }
215
+ export interface DesignComparisonResult {
216
+ subjectUrl: string;
217
+ referenceUrl: string;
218
+ comparison: DesignComparison;
219
+ }
220
+ /**
221
+ * Compare the design of two URLs by extracting design tokens from each in
222
+ * parallel and diffing the result into a structured DesignComparison.
223
+ */
224
+ export declare function takeDesignComparison(subjectUrl: string, referenceUrl: string, options?: DesignCompareOptions): Promise<DesignComparisonResult>;
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Screenshot helper (Playwright)
3
+ *
4
+ * Returns a base64-encoded screenshot for a given URL.
5
+ */
6
+ import { browserScreenshot, browserFilmstrip, browserDiff } from './fetcher.js';
7
+ export async function takeScreenshot(url, options = {}) {
8
+ const format = (options.format === 'jpg' ? 'jpeg' : (options.format || 'png'));
9
+ const { buffer, finalUrl } = await browserScreenshot(url, {
10
+ fullPage: options.fullPage || false,
11
+ width: options.width,
12
+ height: options.height,
13
+ format,
14
+ quality: options.quality,
15
+ waitMs: options.waitFor,
16
+ timeoutMs: options.timeout,
17
+ userAgent: options.userAgent,
18
+ headers: options.headers,
19
+ cookies: options.cookies,
20
+ stealth: options.stealth,
21
+ actions: options.actions,
22
+ scrollThrough: options.scrollThrough,
23
+ selector: options.selector,
24
+ });
25
+ return {
26
+ url: finalUrl,
27
+ format,
28
+ contentType: format === 'png' ? 'image/png' : 'image/jpeg',
29
+ screenshot: buffer.toString('base64'),
30
+ };
31
+ }
32
+ export async function takeFilmstrip(url, options = {}) {
33
+ const format = (options.format === 'jpg' ? 'jpeg' : (options.format || 'png'));
34
+ const { frames, finalUrl } = await browserFilmstrip(url, {
35
+ frames: options.frames,
36
+ width: options.width,
37
+ height: options.height,
38
+ format,
39
+ quality: options.quality,
40
+ waitMs: options.waitFor,
41
+ timeoutMs: options.timeout,
42
+ userAgent: options.userAgent,
43
+ headers: options.headers,
44
+ cookies: options.cookies,
45
+ stealth: options.stealth,
46
+ });
47
+ return {
48
+ url: finalUrl,
49
+ format,
50
+ contentType: format === 'png' ? 'image/png' : 'image/jpeg',
51
+ frames: frames.map(f => f.toString('base64')),
52
+ frameCount: frames.length,
53
+ };
54
+ }
55
+ export async function takeScreenshotDiff(url1, url2, options = {}) {
56
+ const { diffBuffer, diffPixels, totalPixels, diffPercent, dimensions } = await browserDiff(url1, url2, {
57
+ width: options.width,
58
+ height: options.height,
59
+ fullPage: options.fullPage,
60
+ threshold: options.threshold,
61
+ stealth: options.stealth,
62
+ waitMs: options.waitFor,
63
+ timeoutMs: options.timeout,
64
+ });
65
+ return {
66
+ diff: diffBuffer.toString('base64'),
67
+ diffPixels,
68
+ totalPixels,
69
+ diffPercent,
70
+ dimensions,
71
+ };
72
+ }
73
+ // ── Audit ─────────────────────────────────────────────────────────────────────
74
+ import { browserAudit, browserAnimationCapture, browserViewports, browserDesignAudit, browserDesignAnalysis } from './fetcher.js';
75
+ import { buildDesignComparison } from './design-compare.js';
76
+ export async function takeAuditScreenshots(url, options = {}) {
77
+ const format = (options.format === 'jpg' ? 'jpeg' : (options.format || 'jpeg'));
78
+ const { frames, finalUrl } = await browserAudit(url, {
79
+ width: options.width,
80
+ height: options.height,
81
+ format,
82
+ quality: options.quality,
83
+ selector: options.selector,
84
+ waitMs: options.waitFor,
85
+ timeoutMs: options.timeout,
86
+ userAgent: options.userAgent,
87
+ headers: options.headers,
88
+ cookies: options.cookies,
89
+ stealth: options.stealth,
90
+ scrollThrough: options.scrollThrough,
91
+ });
92
+ return {
93
+ url: finalUrl,
94
+ format,
95
+ sections: frames.map(f => ({
96
+ index: f.index,
97
+ tag: f.tag,
98
+ id: f.id,
99
+ className: f.className,
100
+ top: f.top,
101
+ height: f.height,
102
+ screenshot: f.buffer.toString('base64'),
103
+ })),
104
+ };
105
+ }
106
+ export async function takeAnimationCapture(url, options = {}) {
107
+ const format = (options.format === 'jpg' ? 'jpeg' : (options.format || 'jpeg'));
108
+ const { frames, finalUrl } = await browserAnimationCapture(url, {
109
+ frames: options.frames,
110
+ intervalMs: options.intervalMs,
111
+ scrollTo: options.scrollTo,
112
+ selector: options.selector,
113
+ width: options.width,
114
+ height: options.height,
115
+ format,
116
+ quality: options.quality,
117
+ waitMs: options.waitFor,
118
+ timeoutMs: options.timeout,
119
+ userAgent: options.userAgent,
120
+ headers: options.headers,
121
+ cookies: options.cookies,
122
+ stealth: options.stealth,
123
+ });
124
+ return {
125
+ url: finalUrl,
126
+ format,
127
+ frames: frames.map(f => ({
128
+ index: f.index,
129
+ timestampMs: f.timestampMs,
130
+ screenshot: f.buffer.toString('base64'),
131
+ })),
132
+ frameCount: frames.length,
133
+ };
134
+ }
135
+ export async function takeViewportsBatch(url, options) {
136
+ const format = (options.format === 'jpg' ? 'jpeg' : (options.format || 'jpeg'));
137
+ const { frames, finalUrl } = await browserViewports(url, {
138
+ viewports: options.viewports,
139
+ fullPage: options.fullPage,
140
+ format,
141
+ quality: options.quality,
142
+ waitMs: options.waitFor,
143
+ timeoutMs: options.timeout,
144
+ userAgent: options.userAgent,
145
+ headers: options.headers,
146
+ cookies: options.cookies,
147
+ stealth: options.stealth,
148
+ scrollThrough: options.scrollThrough,
149
+ });
150
+ return {
151
+ url: finalUrl,
152
+ format,
153
+ viewports: frames.map(f => ({
154
+ width: f.width,
155
+ height: f.height,
156
+ label: f.label,
157
+ screenshot: f.buffer.toString('base64'),
158
+ })),
159
+ };
160
+ }
161
+ export async function takeDesignAudit(url, options = {}) {
162
+ const { audit, finalUrl } = await browserDesignAudit(url, {
163
+ rules: options.rules,
164
+ selector: options.selector,
165
+ width: options.width,
166
+ height: options.height,
167
+ waitMs: options.waitFor,
168
+ timeoutMs: options.timeout,
169
+ userAgent: options.userAgent,
170
+ headers: options.headers,
171
+ cookies: options.cookies,
172
+ stealth: options.stealth,
173
+ });
174
+ return { url: finalUrl, audit };
175
+ }
176
+ export async function takeDesignAnalysis(url, options = {}) {
177
+ const { analysis, finalUrl } = await browserDesignAnalysis(url, {
178
+ selector: options.selector,
179
+ width: options.width,
180
+ height: options.height,
181
+ waitMs: options.waitFor,
182
+ timeoutMs: options.timeout,
183
+ userAgent: options.userAgent,
184
+ headers: options.headers,
185
+ cookies: options.cookies,
186
+ stealth: options.stealth,
187
+ });
188
+ return { url: finalUrl, analysis };
189
+ }
190
+ /**
191
+ * Compare the design of two URLs by extracting design tokens from each in
192
+ * parallel and diffing the result into a structured DesignComparison.
193
+ */
194
+ export async function takeDesignComparison(subjectUrl, referenceUrl, options = {}) {
195
+ const { width = 1440, height = 900, waitFor, timeout = 60000, stealth, } = options;
196
+ const browserOpts = { width, height, waitMs: waitFor, timeoutMs: timeout, stealth };
197
+ const [subjectResult, referenceResult] = await Promise.all([
198
+ browserDesignAnalysis(subjectUrl, browserOpts),
199
+ browserDesignAnalysis(referenceUrl, browserOpts),
200
+ ]);
201
+ const comparison = buildDesignComparison(subjectResult.finalUrl, referenceResult.finalUrl, subjectResult.analysis, referenceResult.analysis);
202
+ return {
203
+ subjectUrl: subjectResult.finalUrl,
204
+ referenceUrl: referenceResult.finalUrl,
205
+ comparison,
206
+ };
207
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Additional search engine providers: Baidu, Yandex
3
+ * HTTP-only scraping with cheerio — no browser, no API key required.
4
+ */
5
+ import type { WebSearchResult, WebSearchOptions, SearchProvider, SearchProviderId } from './search-provider.js';
6
+ export declare class BaiduSearchProvider implements SearchProvider {
7
+ readonly id: SearchProviderId;
8
+ readonly requiresApiKey = false;
9
+ searchWeb(query: string, options: WebSearchOptions): Promise<WebSearchResult[]>;
10
+ }
11
+ export declare class NaverSearchProvider implements SearchProvider {
12
+ readonly id: SearchProviderId;
13
+ readonly requiresApiKey = false;
14
+ searchWeb(query: string, options: WebSearchOptions): Promise<WebSearchResult[]>;
15
+ }
16
+ export declare class YahooJapanSearchProvider implements SearchProvider {
17
+ readonly id: SearchProviderId;
18
+ readonly requiresApiKey = false;
19
+ searchWeb(query: string, options: WebSearchOptions): Promise<WebSearchResult[]>;
20
+ }
21
+ export declare class YandexSearchProvider implements SearchProvider {
22
+ readonly id: SearchProviderId;
23
+ readonly requiresApiKey = false;
24
+ searchWeb(query: string, options: WebSearchOptions): Promise<WebSearchResult[]>;
25
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Additional search engine providers: Baidu, Yandex
3
+ * HTTP-only scraping with cheerio — no browser, no API key required.
4
+ */
5
+ import { load } from 'cheerio';
6
+ import { simpleFetch } from './fetcher.js';
7
+ // ── Baidu Search ──────────────────────────────────────────────────────────
8
+ export class BaiduSearchProvider {
9
+ id = 'baidu';
10
+ requiresApiKey = false;
11
+ async searchWeb(query, options) {
12
+ const { count = 10 } = options;
13
+ // Baidu search URL
14
+ const params = new URLSearchParams({
15
+ wd: query,
16
+ rn: String(Math.min(count, 50)),
17
+ ie: 'utf-8',
18
+ });
19
+ const url = `https://www.baidu.com/s?${params}`;
20
+ try {
21
+ const response = await simpleFetch(url, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 15000);
22
+ if (!response.html)
23
+ return [];
24
+ const $ = load(response.html);
25
+ const results = [];
26
+ const seen = new Set();
27
+ // Baidu result selectors: .result or .c-container
28
+ $('.result, .c-container').each((_, elem) => {
29
+ const el = $(elem);
30
+ const linkEl = el.find('h3 a, .t a').first();
31
+ const title = linkEl.text().trim();
32
+ // Baidu uses redirect URLs — get the data-url or mu attribute for real URL
33
+ const href = el.attr('mu') || linkEl.attr('href') || '';
34
+ const snippet = el.find('.c-abstract, .c-span-last, .content-right_8Zs40').first().text().trim();
35
+ if (title && href && !seen.has(href)) {
36
+ seen.add(href);
37
+ results.push({ title, url: href, snippet });
38
+ }
39
+ });
40
+ return results.slice(0, count);
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ }
47
+ // ── Naver Search (Korea) ──────────────────────────────────────────────────
48
+ export class NaverSearchProvider {
49
+ id = 'naver';
50
+ requiresApiKey = false;
51
+ async searchWeb(query, options) {
52
+ const { count = 10 } = options;
53
+ const params = new URLSearchParams({
54
+ query: query,
55
+ where: 'web',
56
+ });
57
+ const url = `https://search.naver.com/search.naver?${params}`;
58
+ try {
59
+ // Naver is heavily JS-rendered — use peel with render for full content
60
+ const { peel } = await import('../index.js');
61
+ const result = await peel(url, { render: true, format: 'html', wait: 2000, timeout: 15000 });
62
+ const html = result.content || '';
63
+ if (!html)
64
+ return [];
65
+ const $ = load(html);
66
+ const results = [];
67
+ const seen = new Set();
68
+ // Naver uses .type-web class for web results, titles in *-title-text classes
69
+ $('.type-web').each((_, elem) => {
70
+ const el = $(elem);
71
+ const parent = el.closest('li, section, [class*=item]').length ? el.closest('li, section, [class*=item]') : el.parent();
72
+ const title = parent.find('[class*="title-text"], [class*="Title"]').first().text().trim();
73
+ const href = parent.find('a[href^="http"]').first().attr('href') || '';
74
+ const snippet = parent.find('[class*="text-type-body"], [class*="desc"]').first().text().trim();
75
+ if (title && href && !href.includes('naver.com/search') && !seen.has(href)) {
76
+ seen.add(href);
77
+ results.push({ title, url: href, snippet });
78
+ }
79
+ });
80
+ // Fallback: try generic link extraction if .type-web yielded nothing
81
+ if (results.length === 0) {
82
+ $('a[href^="http"]').each((_, elem) => {
83
+ const el = $(elem);
84
+ const href = el.attr('href') || '';
85
+ const title = el.text().trim();
86
+ if (title.length > 5 && title.length < 200 && href && !href.includes('naver.com') && !seen.has(href)) {
87
+ seen.add(href);
88
+ results.push({ title, url: href, snippet: '' });
89
+ }
90
+ });
91
+ }
92
+ return results.slice(0, count);
93
+ }
94
+ catch {
95
+ return [];
96
+ }
97
+ }
98
+ }
99
+ // ── Yahoo Japan Search ────────────────────────────────────────────────────
100
+ export class YahooJapanSearchProvider {
101
+ id = 'yahoo_japan';
102
+ requiresApiKey = false;
103
+ async searchWeb(query, options) {
104
+ const { count = 10 } = options;
105
+ const params = new URLSearchParams({
106
+ p: query,
107
+ n: String(Math.min(count, 50)),
108
+ ei: 'UTF-8',
109
+ });
110
+ const url = `https://search.yahoo.co.jp/search?${params}`;
111
+ try {
112
+ const response = await simpleFetch(url, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', 15000);
113
+ if (!response.html)
114
+ return [];
115
+ const $ = load(response.html);
116
+ const results = [];
117
+ // Yahoo Japan result selectors (2026 layout uses sw-Card components)
118
+ const seen = new Set();
119
+ $('.sw-Card__title, .algo, .dd').each((_, elem) => {
120
+ const el = $(elem);
121
+ // Walk up to the card container to find the link and snippet
122
+ const card = el.closest('[class*="sw-Card"], .algo, .dd, li').length
123
+ ? el.closest('[class*="sw-Card"], .algo, .dd, li')
124
+ : el.parent();
125
+ const title = el.find('.sw-Card__titleMain, h3, a').first().text().trim() || el.text().trim();
126
+ const href = card.find('a[href^="http"]').first().attr('href') || '';
127
+ const snippet = card.find('.sw-Card__description, .sw-Card__floatText, p').first().text().trim();
128
+ // Filter Yahoo internal links
129
+ if (title && title.length > 3 && href && !href.includes('yahoo.co.jp/search') && !href.includes('cache.yahoofs') && !seen.has(href)) {
130
+ seen.add(href);
131
+ results.push({ title, url: href, snippet });
132
+ }
133
+ });
134
+ return results.slice(0, count);
135
+ }
136
+ catch {
137
+ return [];
138
+ }
139
+ }
140
+ }
141
+ // ── Yandex Search ──────────────────────────────────────────────────────────
142
+ export class YandexSearchProvider {
143
+ id = 'yandex';
144
+ requiresApiKey = false;
145
+ async searchWeb(query, options) {
146
+ const { count = 10 } = options;
147
+ const params = new URLSearchParams({
148
+ text: query,
149
+ numdoc: String(Math.min(count, 50)),
150
+ lr: '84', // Default to US region; can be overridden
151
+ });
152
+ // Use Yandex HTML search
153
+ const url = `https://yandex.com/search/?${params}`;
154
+ try {
155
+ const response = await simpleFetch(url, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 15000);
156
+ if (!response.html)
157
+ return [];
158
+ const $ = load(response.html);
159
+ const results = [];
160
+ const seen = new Set();
161
+ // Yandex result selectors
162
+ $('.serp-item, .organic').each((_, elem) => {
163
+ const el = $(elem);
164
+ const linkEl = el.find('.organic__url, .link, a[href]').first();
165
+ const title = el.find('.organic__title, .OrganicTitle-LinkText, h2').first().text().trim();
166
+ const href = linkEl.attr('href') || '';
167
+ const snippet = el.find('.organic__text, .OrganicText, .text-container').first().text().trim();
168
+ // Filter internal Yandex links
169
+ if (title && href && !href.includes('yandex.') && !seen.has(href)) {
170
+ seen.add(href);
171
+ // Normalize URL (Yandex sometimes uses relative paths)
172
+ const fullUrl = href.startsWith('http') ? href : `https://${href}`;
173
+ results.push({ title, url: fullUrl, snippet });
174
+ }
175
+ });
176
+ return results.slice(0, count);
177
+ }
178
+ catch {
179
+ return [];
180
+ }
181
+ }
182
+ }