@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,389 @@
1
+ /**
2
+ * WebPeel Watch - Lightweight URL monitoring with assertions
3
+ *
4
+ * Polls a URL on a configurable interval, evaluates assertions against the
5
+ * response, detects content changes, and optionally fires a webhook on failure.
6
+ */
7
+ import { createHash, createHmac } from 'crypto';
8
+ import { fetch as undiciFetch } from 'undici';
9
+ // ─── Duration parsing ──────────────────────────────────────────────────────────
10
+ /**
11
+ * Parse a human-readable duration string into milliseconds.
12
+ *
13
+ * @example
14
+ * parseDuration("30s") // → 30 000
15
+ * parseDuration("5m") // → 300 000
16
+ * parseDuration("1h") // → 3 600 000
17
+ * parseDuration("500ms")// → 500
18
+ */
19
+ export function parseDuration(duration) {
20
+ const match = /^(\d+(?:\.\d+)?)(ms|s|m|h)?$/.exec(duration.trim());
21
+ if (!match) {
22
+ throw new Error(`Invalid duration: "${duration}". Use formats like 30s, 5m, 1h, 500ms.`);
23
+ }
24
+ const value = parseFloat(match[1]);
25
+ const unit = match[2] ?? 'ms';
26
+ switch (unit) {
27
+ case 'ms': return Math.round(value);
28
+ case 's': return Math.round(value * 1_000);
29
+ case 'm': return Math.round(value * 60_000);
30
+ case 'h': return Math.round(value * 3_600_000);
31
+ default: return Math.round(value);
32
+ }
33
+ }
34
+ // ─── Assertion parsing ─────────────────────────────────────────────────────────
35
+ /**
36
+ * Parse an assertion expression into an {@link Assertion} object.
37
+ *
38
+ * Supported formats:
39
+ * field=value — equality
40
+ * field!=value — inequality
41
+ * field>value — greater-than (numeric)
42
+ * field<value — less-than (numeric)
43
+ * field contains str — substring match
44
+ *
45
+ * @example
46
+ * parseAssertion("status=200") // HTTP status
47
+ * parseAssertion("body.status=healthy") // JSON field
48
+ * parseAssertion("version!=0.0.0")
49
+ */
50
+ export function parseAssertion(expr) {
51
+ // Order matters: try longer operators before shorter ones.
52
+ const match = /^(.+?)(!=|contains|=|>|<)(.*)$/s.exec(expr.trim());
53
+ if (!match) {
54
+ throw new Error(`Invalid assertion: "${expr}". ` +
55
+ `Examples: status=200, body.status=healthy, version!=0.0.0`);
56
+ }
57
+ const [, field, operator, value] = match;
58
+ return {
59
+ field: field.trim(),
60
+ operator: operator,
61
+ value: value.trim(),
62
+ };
63
+ }
64
+ // ─── Internal helpers ──────────────────────────────────────────────────────────
65
+ /**
66
+ * Retrieve a nested value from an object using dot-notation path.
67
+ *
68
+ * @example
69
+ * getNestedValue({ data: { status: "ok" } }, "data.status") // → "ok"
70
+ */
71
+ function getNestedValue(obj, path) {
72
+ if (!path)
73
+ return obj;
74
+ return path.split('.').reduce((curr, key) => {
75
+ if (curr === null || curr === undefined)
76
+ return undefined;
77
+ if (typeof curr !== 'object')
78
+ return undefined;
79
+ return curr[key];
80
+ }, obj);
81
+ }
82
+ /**
83
+ * Evaluate a single assertion against the fetched response data.
84
+ */
85
+ function evaluateAssertion(assertion, httpStatus, jsonBody, rawBody, headers) {
86
+ const { field, operator, value: expected } = assertion;
87
+ let actual;
88
+ if (field === 'httpStatus' || field === 'http_status') {
89
+ // Explicit HTTP status check — always returns the HTTP code.
90
+ actual = httpStatus;
91
+ }
92
+ else if (field === 'status') {
93
+ // Smart: prefer JSON body's "status" field when present, fall back to HTTP.
94
+ if (jsonBody !== null && typeof jsonBody === 'object' && !Array.isArray(jsonBody) &&
95
+ 'status' in jsonBody) {
96
+ actual = jsonBody.status;
97
+ }
98
+ else {
99
+ actual = httpStatus;
100
+ }
101
+ }
102
+ else if (field === 'body') {
103
+ actual = rawBody;
104
+ }
105
+ else if (/^headers?\./.test(field)) {
106
+ const headerName = field.replace(/^headers?\./, '').toLowerCase();
107
+ actual = headers[headerName] ?? '';
108
+ }
109
+ else if (jsonBody !== null) {
110
+ // Dot-notation lookup in JSON body.
111
+ actual = getNestedValue(jsonBody, field);
112
+ }
113
+ else {
114
+ // Fallback: treat raw body as the value.
115
+ actual = rawBody;
116
+ }
117
+ const actualStr = actual === undefined ? '' : String(actual);
118
+ let passed;
119
+ switch (operator) {
120
+ case '=':
121
+ passed = actualStr === expected;
122
+ break;
123
+ case '!=':
124
+ passed = actualStr !== expected;
125
+ break;
126
+ case '>':
127
+ passed = parseFloat(actualStr) > parseFloat(expected);
128
+ break;
129
+ case '<':
130
+ passed = parseFloat(actualStr) < parseFloat(expected);
131
+ break;
132
+ case 'contains':
133
+ passed = actualStr.includes(expected);
134
+ break;
135
+ default: passed = false;
136
+ }
137
+ return { field, expected, actual: actualStr, passed };
138
+ }
139
+ /** Fingerprint a string for change detection. */
140
+ function fingerprint(content) {
141
+ return createHash('sha256').update(content).digest('hex').slice(0, 16);
142
+ }
143
+ async function performCheck(url, options, previousFingerprint) {
144
+ const timestamp = new Date().toISOString();
145
+ const startTime = Date.now();
146
+ try {
147
+ let httpStatus = 200;
148
+ let rawBody = '';
149
+ let jsonBody = null;
150
+ let headers = {};
151
+ if (options.render) {
152
+ // Use peel() for browser-rendered pages.
153
+ const { peel } = await import('../index.js');
154
+ const peelResult = await peel(url, {
155
+ render: true,
156
+ timeout: options.timeout,
157
+ format: 'markdown',
158
+ });
159
+ rawBody = peelResult.content;
160
+ // peel() throws on non-2xx, so success → 200.
161
+ httpStatus = 200;
162
+ // Try to parse the content as JSON.
163
+ try {
164
+ jsonBody = JSON.parse(rawBody);
165
+ }
166
+ catch { /* not JSON */ }
167
+ }
168
+ else {
169
+ // Direct HTTP fetch for accurate status codes and minimal overhead.
170
+ const controller = new AbortController();
171
+ const timeoutId = setTimeout(() => controller.abort(), options.timeout);
172
+ try {
173
+ const response = await undiciFetch(url, {
174
+ signal: controller.signal,
175
+ headers: {
176
+ 'User-Agent': 'WebPeel-Watch/1.0 (+https://github.com/webpeel/webpeel)',
177
+ 'Accept': 'application/json, text/html, */*',
178
+ },
179
+ });
180
+ httpStatus = response.status;
181
+ rawBody = await response.text();
182
+ response.headers.forEach((value, key) => {
183
+ headers[key.toLowerCase()] = value;
184
+ });
185
+ // Try JSON parsing based on Content-Type, then fall back to heuristic.
186
+ const ct = response.headers.get('content-type') ?? '';
187
+ if (ct.includes('json') || rawBody.trimStart().startsWith('{') || rawBody.trimStart().startsWith('[')) {
188
+ try {
189
+ jsonBody = JSON.parse(rawBody);
190
+ }
191
+ catch { /* malformed JSON */ }
192
+ }
193
+ }
194
+ finally {
195
+ clearTimeout(timeoutId);
196
+ }
197
+ }
198
+ const elapsed = Date.now() - startTime;
199
+ const fp = fingerprint(rawBody);
200
+ const changed = previousFingerprint !== null && fp !== previousFingerprint;
201
+ const assertionResults = options.assertions.map(a => evaluateAssertion(a, httpStatus, jsonBody, rawBody, headers));
202
+ const allPassed = assertionResults.every(ar => ar.passed);
203
+ return {
204
+ result: {
205
+ timestamp, url, status: httpStatus, elapsed,
206
+ assertions: assertionResults, allPassed, changed,
207
+ },
208
+ contentFingerprint: fp,
209
+ };
210
+ }
211
+ catch (error) {
212
+ const elapsed = Date.now() - startTime;
213
+ const errMsg = error instanceof Error ? error.message : String(error);
214
+ const isTimeout = errMsg.toLowerCase().includes('abort') ||
215
+ errMsg.toLowerCase().includes('timeout');
216
+ const assertionResults = options.assertions.map(a => ({
217
+ field: a.field, expected: a.value, actual: '', passed: false,
218
+ }));
219
+ return {
220
+ result: {
221
+ timestamp, url,
222
+ status: isTimeout ? 408 : 0,
223
+ elapsed,
224
+ assertions: assertionResults,
225
+ allPassed: false,
226
+ changed: false,
227
+ error: errMsg,
228
+ },
229
+ contentFingerprint: '',
230
+ };
231
+ }
232
+ }
233
+ // ─── Webhook ───────────────────────────────────────────────────────────────────
234
+ /**
235
+ * Sign a webhook payload body with HMAC-SHA256.
236
+ *
237
+ * @param body - The raw JSON string that will be sent as the request body.
238
+ * @param secret - The signing secret shared between WebPeel and the recipient.
239
+ * @returns - Hex digest of the HMAC-SHA256 signature.
240
+ *
241
+ * Recipients verify delivery authenticity like this:
242
+ * const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
243
+ * if (receivedSignature !== `sha256=${expected}`) reject(); // tampered or wrong secret
244
+ */
245
+ function signWebhookBody(body, secret) {
246
+ return createHmac('sha256', secret).update(body).digest('hex');
247
+ }
248
+ async function sendWebhook(webhookUrl, payload, webhookSecret) {
249
+ try {
250
+ const bodyStr = JSON.stringify(payload);
251
+ const headers = {
252
+ 'Content-Type': 'application/json',
253
+ 'User-Agent': 'WebPeel-Watch/1.0',
254
+ };
255
+ // Sign the payload when a secret is available (per-watch secret or global fallback).
256
+ const secret = webhookSecret || process.env.WEBHOOK_SIGNING_SECRET;
257
+ if (secret) {
258
+ headers['X-WebPeel-Signature'] = `sha256=${signWebhookBody(bodyStr, secret)}`;
259
+ headers['X-WebPeel-Timestamp'] = String(Date.now());
260
+ }
261
+ await undiciFetch(webhookUrl, {
262
+ method: 'POST',
263
+ headers,
264
+ body: bodyStr,
265
+ signal: AbortSignal.timeout(5_000),
266
+ });
267
+ }
268
+ catch (err) {
269
+ // Webhook failures are non-fatal; log to stderr.
270
+ process.stderr.write(`[watch] Webhook delivery failed: ${err instanceof Error ? err.message : String(err)}\n`);
271
+ }
272
+ }
273
+ // ─── Human-readable formatting ────────────────────────────────────────────────
274
+ function formatResult(result) {
275
+ const time = result.timestamp.slice(11, 19); // HH:MM:SS
276
+ const icon = result.allPassed && !result.error ? '✓' : '✗';
277
+ let statusPart;
278
+ if (result.error) {
279
+ statusPart = `ERROR (${result.elapsed}ms): ${result.error.slice(0, 100)}`;
280
+ }
281
+ else {
282
+ statusPart = `${result.status} (${result.elapsed}ms)`;
283
+ }
284
+ const parts = [`[${time}] ${icon} ${result.url} — ${statusPart}`];
285
+ if (result.changed)
286
+ parts.push('content changed');
287
+ if (result.assertions.length > 0) {
288
+ const failures = result.assertions.filter(a => !a.passed);
289
+ if (failures.length === 0) {
290
+ parts.push('all assertions passed');
291
+ }
292
+ else {
293
+ parts.push(failures.map(f => `FAILED: ${f.field}=${f.expected} → actual: "${f.actual}"`).join(', '));
294
+ }
295
+ }
296
+ return parts.join(' — ');
297
+ }
298
+ // ─── Main watch loop ───────────────────────────────────────────────────────────
299
+ /**
300
+ * Monitor a URL on a recurring interval.
301
+ *
302
+ * Resolves when {@link WatchOptions.maxChecks} is reached (or never, until the
303
+ * process receives SIGINT/SIGTERM).
304
+ *
305
+ * @example
306
+ * ```typescript
307
+ * await watch({
308
+ * url: 'https://api.example.com/health',
309
+ * intervalMs: 60_000,
310
+ * assertions: [{ field: 'status', operator: '=', value: 'healthy' }],
311
+ * webhookUrl: 'https://hooks.example.com/alert',
312
+ * });
313
+ * ```
314
+ */
315
+ export async function watch(options) {
316
+ const { url, intervalMs, assertions = [], webhookUrl, webhookSecret, timeout = 10_000, maxChecks, render = false, json = false, silent = false, onCheck, } = options;
317
+ let checksCompleted = 0;
318
+ let previousFp = null;
319
+ let running = true;
320
+ // Graceful shutdown on Ctrl+C / SIGTERM.
321
+ const handleSignal = () => {
322
+ running = false;
323
+ if (!json && !silent) {
324
+ process.stderr.write('\n[watch] Stopped.\n');
325
+ }
326
+ };
327
+ process.once('SIGINT', handleSignal);
328
+ process.once('SIGTERM', handleSignal);
329
+ try {
330
+ while (running) {
331
+ if (maxChecks !== undefined && checksCompleted >= maxChecks)
332
+ break;
333
+ const { result, contentFingerprint } = await performCheck(url, { assertions, timeout, render }, previousFp);
334
+ // Update fingerprint for next iteration (empty string on error → keep previous).
335
+ if (contentFingerprint)
336
+ previousFp = contentFingerprint;
337
+ checksCompleted++;
338
+ // Invoke caller callback.
339
+ if (onCheck)
340
+ onCheck(result);
341
+ // Emit output.
342
+ const isBad = !result.allPassed || result.changed || !!result.error;
343
+ if (json) {
344
+ process.stdout.write(JSON.stringify(result) + '\n');
345
+ }
346
+ else if (!silent || isBad) {
347
+ process.stderr.write(formatResult(result) + '\n');
348
+ }
349
+ // Fire webhook on failure or change.
350
+ if (webhookUrl && isBad) {
351
+ const failures = result.assertions.filter(a => !a.passed);
352
+ const payload = {
353
+ event: failures.length > 0 ? 'assertion_failed' : 'content_changed',
354
+ url,
355
+ timestamp: result.timestamp,
356
+ ...(failures.length > 0 && {
357
+ failures: failures.map(f => ({
358
+ field: f.field,
359
+ expected: f.expected,
360
+ actual: f.actual,
361
+ })),
362
+ }),
363
+ check: result,
364
+ };
365
+ await sendWebhook(webhookUrl, payload, webhookSecret);
366
+ }
367
+ // Check stop condition again after callback/webhook (they may take time).
368
+ if (maxChecks !== undefined && checksCompleted >= maxChecks)
369
+ break;
370
+ if (!running)
371
+ break;
372
+ // Sleep until next interval, checking for shutdown every 100 ms.
373
+ await new Promise(resolve => {
374
+ let elapsed = 0;
375
+ const tick = setInterval(() => {
376
+ elapsed += 100;
377
+ if (!running || elapsed >= intervalMs) {
378
+ clearInterval(tick);
379
+ resolve();
380
+ }
381
+ }, 100);
382
+ });
383
+ }
384
+ }
385
+ finally {
386
+ process.removeListener('SIGINT', handleSignal);
387
+ process.removeListener('SIGTERM', handleSignal);
388
+ }
389
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * YouTube transcript extraction — no API key required.
3
+ *
4
+ * YouTube embeds caption/transcript data directly in the page HTML as JSON
5
+ * (inside ytInitialPlayerResponse). We parse that JSON, extract caption
6
+ * track URLs, fetch the timedtext XML, and return structured transcript data.
7
+ */
8
+ export interface TranscriptSegment {
9
+ /** Caption text (HTML entities decoded) */
10
+ text: string;
11
+ /** Start time in seconds */
12
+ start: number;
13
+ /** Duration in seconds */
14
+ duration: number;
15
+ }
16
+ export interface YouTubeTranscript {
17
+ videoId: string;
18
+ title: string;
19
+ channel: string;
20
+ /** Duration formatted as "MM:SS" or "HH:MM:SS" */
21
+ duration: string;
22
+ /** BCP-47 language code, e.g. "en" */
23
+ language: string;
24
+ /** Timestamped caption segments */
25
+ segments: TranscriptSegment[];
26
+ /** All segments joined as plain text */
27
+ fullText: string;
28
+ /** Language codes available for this video */
29
+ availableLanguages: string[];
30
+ /** Video description text */
31
+ description?: string;
32
+ /** Video publish date (ISO or human-readable) */
33
+ publishDate?: string;
34
+ /** Chapters parsed from description timestamp markers */
35
+ chapters?: {
36
+ time: string;
37
+ title: string;
38
+ }[];
39
+ /** Key points: first substantive sentence from each chapter / 2-min block */
40
+ keyPoints?: string[];
41
+ /** First ~200 words of transcript as a quick summary */
42
+ summary?: string;
43
+ /** Total word count of transcript */
44
+ wordCount?: number;
45
+ /** View count (numeric string) */
46
+ viewCount?: string;
47
+ /** Like count (numeric string, may be empty) */
48
+ likeCount?: string;
49
+ }
50
+ export interface YouTubeVideoInfo {
51
+ videoId: string;
52
+ title: string;
53
+ channel: string;
54
+ description: string;
55
+ /** Duration formatted as "MM:SS" or "HH:MM:SS" */
56
+ duration: string;
57
+ publishDate: string;
58
+ viewCount: string;
59
+ likeCount: string;
60
+ thumbnail: string;
61
+ }
62
+ /**
63
+ * Extract the video ID from any common YouTube URL format.
64
+ * Returns null if the URL is not a recognisable YouTube URL.
65
+ *
66
+ * Supported formats:
67
+ * https://www.youtube.com/watch?v=VIDEO_ID
68
+ * https://youtu.be/VIDEO_ID
69
+ * https://www.youtube.com/embed/VIDEO_ID
70
+ * https://m.youtube.com/watch?v=VIDEO_ID
71
+ * URLs with extra params (&t=120, &list=PLxxx, etc.)
72
+ */
73
+ export declare function parseYouTubeUrl(url: string): string | null;
74
+ /**
75
+ * Extract video metadata from YouTube page HTML.
76
+ * Parses ytInitialPlayerResponse JSON embedded in the page.
77
+ */
78
+ export declare function extractVideoInfo(html: string): YouTubeVideoInfo;
79
+ /**
80
+ * Parse chapter markers from a YouTube video description.
81
+ * Looks for lines like "0:00 Intro\n2:34 Main topic\n5:12 Conclusion"
82
+ */
83
+ export declare function parseChaptersFromDescription(description: string): {
84
+ time: string;
85
+ title: string;
86
+ }[];
87
+ /**
88
+ * Extract key points from transcript segments.
89
+ * Uses chapter timestamps when available; otherwise segments every 2 minutes.
90
+ * Returns the first substantive sentence (≥5 words) from each time block.
91
+ */
92
+ export declare function extractKeyPoints(segments: TranscriptSegment[], chapters: {
93
+ time: string;
94
+ title: string;
95
+ }[], durationSeconds: number): string[];
96
+ /**
97
+ * Extract a summary as the first ~200 words of the full transcript text.
98
+ */
99
+ export declare function extractSummary(fullText: string): string;
100
+ /**
101
+ * Fetch and return the transcript for a YouTube video.
102
+ *
103
+ * @param url - Any YouTube URL format
104
+ * @param options.language - Preferred language code (default: "en")
105
+ */
106
+ export declare function getYouTubeTranscript(url: string, options?: {
107
+ language?: string;
108
+ }): Promise<YouTubeTranscript>;
109
+ /**
110
+ * Extract the ytInitialPlayerResponse JSON object from page HTML.
111
+ */
112
+ export declare function extractPlayerResponse(html: string): Record<string, any> | null;
113
+ /**
114
+ * Parse YouTube caption XML into transcript segments.
115
+ *
116
+ * Format: <transcript><text start="0.5" dur="2.1">Hello &amp; world</text>...</transcript>
117
+ */
118
+ export declare function parseCaptionXml(xml: string): TranscriptSegment[];
119
+ /**
120
+ * Decode common HTML entities found in YouTube caption XML.
121
+ *
122
+ * Order of operations:
123
+ * 1. Strip real HTML tags (e.g. <font color="...">) — these appear literally in the XML
124
+ * 2. Decode all HTML entities (including &lt; → < which represents literal angle brackets)
125
+ */
126
+ export declare function decodeHtmlEntities(text: string): string;
127
+ /**
128
+ * Format seconds into MM:SS or HH:MM:SS.
129
+ */
130
+ export declare function formatDuration(seconds: number): string;