webpeel 0.19.4 → 0.20.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 (544) hide show
  1. package/README.md +2 -2
  2. package/dist/cache.d.ts +0 -1
  3. package/dist/cache.js +0 -1
  4. package/dist/cli/commands/auth.d.ts +5 -0
  5. package/dist/cli/commands/auth.js +476 -0
  6. package/dist/cli/commands/fetch.d.ts +6 -0
  7. package/dist/cli/commands/fetch.js +1015 -0
  8. package/dist/cli/commands/interact.d.ts +5 -0
  9. package/dist/cli/commands/interact.js +839 -0
  10. package/dist/cli/commands/jobs.d.ts +5 -0
  11. package/dist/cli/commands/jobs.js +997 -0
  12. package/dist/cli/commands/screenshot.d.ts +5 -0
  13. package/dist/cli/commands/screenshot.js +273 -0
  14. package/dist/cli/commands/search.d.ts +5 -0
  15. package/dist/cli/commands/search.js +524 -0
  16. package/dist/cli/utils.d.ts +84 -0
  17. package/dist/cli/utils.js +686 -0
  18. package/dist/cli-auth.d.ts +0 -1
  19. package/dist/cli-auth.js +0 -1
  20. package/dist/cli.d.ts +7 -6
  21. package/dist/cli.js +35 -4698
  22. package/dist/core/actions.d.ts +0 -1
  23. package/dist/core/actions.js +0 -1
  24. package/dist/core/agent.d.ts +0 -1
  25. package/dist/core/agent.js +9 -12
  26. package/dist/core/answer.d.ts +0 -1
  27. package/dist/core/answer.js +0 -1
  28. package/dist/core/application-tracker.d.ts +0 -1
  29. package/dist/core/application-tracker.js +0 -1
  30. package/dist/core/apply.d.ts +0 -1
  31. package/dist/core/apply.js +0 -1
  32. package/dist/core/auto-extract.d.ts +0 -1
  33. package/dist/core/auto-extract.js +0 -1
  34. package/dist/core/auto-interact.d.ts +0 -1
  35. package/dist/core/auto-interact.js +0 -1
  36. package/dist/core/bm25-filter.d.ts +0 -1
  37. package/dist/core/bm25-filter.js +0 -1
  38. package/dist/core/branding.d.ts +0 -1
  39. package/dist/core/branding.js +0 -1
  40. package/dist/core/browser-fetch.d.ts +0 -1
  41. package/dist/core/browser-fetch.js +17 -10
  42. package/dist/core/browser-pool.d.ts +0 -1
  43. package/dist/core/browser-pool.js +0 -1
  44. package/dist/core/budget.d.ts +0 -1
  45. package/dist/core/budget.js +0 -1
  46. package/dist/core/cache.d.ts +0 -1
  47. package/dist/core/cache.js +0 -1
  48. package/dist/core/cf-worker-proxy.d.ts +0 -1
  49. package/dist/core/cf-worker-proxy.js +0 -1
  50. package/dist/core/challenge-detection.d.ts +0 -1
  51. package/dist/core/challenge-detection.js +0 -1
  52. package/dist/core/change-tracking.d.ts +0 -1
  53. package/dist/core/change-tracking.js +0 -1
  54. package/dist/core/chunker.d.ts +0 -1
  55. package/dist/core/chunker.js +0 -1
  56. package/dist/core/chunking.d.ts +0 -1
  57. package/dist/core/chunking.js +0 -1
  58. package/dist/core/cloak-fetch.d.ts +0 -1
  59. package/dist/core/cloak-fetch.js +0 -1
  60. package/dist/core/content-pruner.d.ts +0 -1
  61. package/dist/core/content-pruner.js +0 -1
  62. package/dist/core/crawl-checkpoint.d.ts +0 -1
  63. package/dist/core/crawl-checkpoint.js +0 -1
  64. package/dist/core/crawler.d.ts +0 -1
  65. package/dist/core/crawler.js +6 -5
  66. package/dist/core/cycle-fetch.d.ts +0 -1
  67. package/dist/core/cycle-fetch.js +0 -1
  68. package/dist/core/deep-fetch.d.ts +0 -1
  69. package/dist/core/deep-fetch.js +0 -1
  70. package/dist/core/design-analysis.d.ts +0 -1
  71. package/dist/core/design-analysis.js +0 -1
  72. package/dist/core/design-compare.d.ts +0 -1
  73. package/dist/core/design-compare.js +0 -1
  74. package/dist/core/diff.d.ts +0 -1
  75. package/dist/core/diff.js +0 -1
  76. package/dist/core/dns-cache.d.ts +0 -1
  77. package/dist/core/dns-cache.js +0 -1
  78. package/dist/core/documents.d.ts +0 -1
  79. package/dist/core/documents.js +0 -1
  80. package/dist/core/domain-extractors.d.ts +0 -1
  81. package/dist/core/domain-extractors.js +0 -1
  82. package/dist/core/extract-inline.d.ts +0 -1
  83. package/dist/core/extract-inline.js +0 -1
  84. package/dist/core/extract-listings.d.ts +0 -1
  85. package/dist/core/extract-listings.js +0 -1
  86. package/dist/core/extract.d.ts +0 -1
  87. package/dist/core/extract.js +0 -1
  88. package/dist/core/fetcher.d.ts +0 -1
  89. package/dist/core/fetcher.js +0 -1
  90. package/dist/core/google-cache.d.ts +0 -1
  91. package/dist/core/google-cache.js +0 -1
  92. package/dist/core/hotel-search.d.ts +0 -1
  93. package/dist/core/hotel-search.js +0 -1
  94. package/dist/core/http-fetch.d.ts +0 -1
  95. package/dist/core/http-fetch.js +5 -7
  96. package/dist/core/human.d.ts +0 -1
  97. package/dist/core/human.js +0 -1
  98. package/dist/core/jobs.d.ts +0 -1
  99. package/dist/core/jobs.js +0 -1
  100. package/dist/core/json-ld.d.ts +0 -1
  101. package/dist/core/json-ld.js +0 -1
  102. package/dist/core/llm-extract.d.ts +0 -1
  103. package/dist/core/llm-extract.js +0 -1
  104. package/dist/core/logger.d.ts +17 -0
  105. package/dist/core/logger.js +44 -0
  106. package/dist/core/map.d.ts +0 -1
  107. package/dist/core/map.js +0 -1
  108. package/dist/core/markdown.d.ts +0 -1
  109. package/dist/core/markdown.js +0 -1
  110. package/dist/core/metadata.d.ts +0 -1
  111. package/dist/core/metadata.js +0 -1
  112. package/dist/core/paginate.d.ts +0 -1
  113. package/dist/core/paginate.js +0 -1
  114. package/dist/core/pdf.d.ts +0 -1
  115. package/dist/core/pdf.js +0 -1
  116. package/dist/core/peel-tls.d.ts +0 -1
  117. package/dist/core/peel-tls.js +0 -1
  118. package/dist/core/pipeline.d.ts +0 -1
  119. package/dist/core/pipeline.js +22 -25
  120. package/dist/core/profiles.d.ts +0 -1
  121. package/dist/core/profiles.js +0 -1
  122. package/dist/core/quick-answer.d.ts +0 -1
  123. package/dist/core/quick-answer.js +0 -1
  124. package/dist/core/rate-governor.d.ts +0 -1
  125. package/dist/core/rate-governor.js +0 -1
  126. package/dist/core/readability.d.ts +0 -1
  127. package/dist/core/readability.js +0 -1
  128. package/dist/core/research.d.ts +0 -1
  129. package/dist/core/research.js +0 -1
  130. package/dist/core/schema-extraction.d.ts +0 -1
  131. package/dist/core/schema-extraction.js +0 -1
  132. package/dist/core/schema-postprocess.d.ts +0 -1
  133. package/dist/core/schema-postprocess.js +0 -1
  134. package/dist/core/schema-templates.d.ts +0 -1
  135. package/dist/core/schema-templates.js +0 -1
  136. package/dist/core/screenshot.d.ts +0 -1
  137. package/dist/core/screenshot.js +0 -1
  138. package/dist/core/search-fallback.d.ts +0 -1
  139. package/dist/core/search-fallback.js +0 -1
  140. package/dist/core/search-provider.d.ts +0 -1
  141. package/dist/core/search-provider.js +18 -21
  142. package/dist/core/site-search.d.ts +0 -1
  143. package/dist/core/site-search.js +0 -1
  144. package/dist/core/sitemap.d.ts +0 -1
  145. package/dist/core/sitemap.js +0 -1
  146. package/dist/core/stealth-patches.d.ts +0 -1
  147. package/dist/core/stealth-patches.js +0 -1
  148. package/dist/core/stemmer.d.ts +0 -1
  149. package/dist/core/stemmer.js +0 -1
  150. package/dist/core/strategies.d.ts +6 -1
  151. package/dist/core/strategies.js +29 -41
  152. package/dist/core/strategy-hooks.d.ts +0 -1
  153. package/dist/core/strategy-hooks.js +0 -1
  154. package/dist/core/summarize.d.ts +0 -1
  155. package/dist/core/summarize.js +0 -1
  156. package/dist/core/synonyms.d.ts +0 -1
  157. package/dist/core/synonyms.js +0 -1
  158. package/dist/core/table-format.d.ts +0 -1
  159. package/dist/core/table-format.js +0 -1
  160. package/dist/core/timing.d.ts +0 -1
  161. package/dist/core/timing.js +0 -1
  162. package/dist/core/user-agents.d.ts +0 -1
  163. package/dist/core/user-agents.js +0 -1
  164. package/dist/core/watch-manager.d.ts +0 -1
  165. package/dist/core/watch-manager.js +0 -1
  166. package/dist/core/watch.d.ts +0 -1
  167. package/dist/core/watch.js +0 -1
  168. package/dist/core/youtube.d.ts +0 -1
  169. package/dist/core/youtube.js +0 -1
  170. package/dist/index.d.ts +8 -3
  171. package/dist/index.js +27 -3
  172. package/dist/integrations/index.d.ts +0 -1
  173. package/dist/integrations/index.js +0 -1
  174. package/dist/integrations/langchain.d.ts +0 -1
  175. package/dist/integrations/langchain.js +0 -1
  176. package/dist/integrations/llamaindex.d.ts +0 -1
  177. package/dist/integrations/llamaindex.js +0 -1
  178. package/dist/mcp/handlers/act.d.ts +5 -0
  179. package/dist/mcp/handlers/act.js +34 -0
  180. package/dist/mcp/handlers/definitions.d.ts +6 -0
  181. package/dist/mcp/handlers/definitions.js +266 -0
  182. package/dist/mcp/handlers/extract.d.ts +6 -0
  183. package/dist/mcp/handlers/extract.js +102 -0
  184. package/dist/mcp/handlers/fetch.d.ts +6 -0
  185. package/dist/mcp/handlers/fetch.js +98 -0
  186. package/dist/mcp/handlers/find.d.ts +5 -0
  187. package/dist/mcp/handlers/find.js +137 -0
  188. package/dist/mcp/handlers/index.d.ts +13 -0
  189. package/dist/mcp/handlers/index.js +61 -0
  190. package/dist/mcp/handlers/legacy.d.ts +25 -0
  191. package/dist/mcp/handlers/legacy.js +450 -0
  192. package/dist/mcp/handlers/meta.d.ts +6 -0
  193. package/dist/mcp/handlers/meta.js +31 -0
  194. package/dist/mcp/handlers/monitor.d.ts +5 -0
  195. package/dist/mcp/handlers/monitor.js +41 -0
  196. package/dist/mcp/handlers/read.d.ts +6 -0
  197. package/dist/mcp/handlers/read.js +63 -0
  198. package/dist/mcp/handlers/see.d.ts +5 -0
  199. package/dist/mcp/handlers/see.js +75 -0
  200. package/dist/mcp/handlers/types.d.ts +29 -0
  201. package/dist/mcp/handlers/types.js +28 -0
  202. package/dist/mcp/server.d.ts +3 -4
  203. package/dist/mcp/server.js +35 -1101
  204. package/dist/mcp/smart-router.d.ts +0 -1
  205. package/dist/mcp/smart-router.js +3 -1
  206. package/dist/types.d.ts +6 -1
  207. package/dist/types.js +0 -1
  208. package/package.json +3 -13
  209. package/dist/cache.d.ts.map +0 -1
  210. package/dist/cache.js.map +0 -1
  211. package/dist/cli-auth.d.ts.map +0 -1
  212. package/dist/cli-auth.js.map +0 -1
  213. package/dist/cli.bundle.cjs +0 -159248
  214. package/dist/cli.d.ts.map +0 -1
  215. package/dist/cli.js.map +0 -1
  216. package/dist/core/actions.d.ts.map +0 -1
  217. package/dist/core/actions.js.map +0 -1
  218. package/dist/core/agent.d.ts.map +0 -1
  219. package/dist/core/agent.js.map +0 -1
  220. package/dist/core/answer.d.ts.map +0 -1
  221. package/dist/core/answer.js.map +0 -1
  222. package/dist/core/application-tracker.d.ts.map +0 -1
  223. package/dist/core/application-tracker.js.map +0 -1
  224. package/dist/core/apply.d.ts.map +0 -1
  225. package/dist/core/apply.js.map +0 -1
  226. package/dist/core/auto-extract.d.ts.map +0 -1
  227. package/dist/core/auto-extract.js.map +0 -1
  228. package/dist/core/auto-interact.d.ts.map +0 -1
  229. package/dist/core/auto-interact.js.map +0 -1
  230. package/dist/core/bm25-filter.d.ts.map +0 -1
  231. package/dist/core/bm25-filter.js.map +0 -1
  232. package/dist/core/branding.d.ts.map +0 -1
  233. package/dist/core/branding.js.map +0 -1
  234. package/dist/core/browser-fetch.d.ts.map +0 -1
  235. package/dist/core/browser-fetch.js.map +0 -1
  236. package/dist/core/browser-pool.d.ts.map +0 -1
  237. package/dist/core/browser-pool.js.map +0 -1
  238. package/dist/core/budget.d.ts.map +0 -1
  239. package/dist/core/budget.js.map +0 -1
  240. package/dist/core/cache.d.ts.map +0 -1
  241. package/dist/core/cache.js.map +0 -1
  242. package/dist/core/cf-worker-proxy.d.ts.map +0 -1
  243. package/dist/core/cf-worker-proxy.js.map +0 -1
  244. package/dist/core/challenge-detection.d.ts.map +0 -1
  245. package/dist/core/challenge-detection.js.map +0 -1
  246. package/dist/core/change-tracking.d.ts.map +0 -1
  247. package/dist/core/change-tracking.js.map +0 -1
  248. package/dist/core/chunker.d.ts.map +0 -1
  249. package/dist/core/chunker.js.map +0 -1
  250. package/dist/core/chunking.d.ts.map +0 -1
  251. package/dist/core/chunking.js.map +0 -1
  252. package/dist/core/cloak-fetch.d.ts.map +0 -1
  253. package/dist/core/cloak-fetch.js.map +0 -1
  254. package/dist/core/content-pruner.d.ts.map +0 -1
  255. package/dist/core/content-pruner.js.map +0 -1
  256. package/dist/core/crawl-checkpoint.d.ts.map +0 -1
  257. package/dist/core/crawl-checkpoint.js.map +0 -1
  258. package/dist/core/crawler.d.ts.map +0 -1
  259. package/dist/core/crawler.js.map +0 -1
  260. package/dist/core/cycle-fetch.d.ts.map +0 -1
  261. package/dist/core/cycle-fetch.js.map +0 -1
  262. package/dist/core/deep-fetch.d.ts.map +0 -1
  263. package/dist/core/deep-fetch.js.map +0 -1
  264. package/dist/core/design-analysis.d.ts.map +0 -1
  265. package/dist/core/design-analysis.js.map +0 -1
  266. package/dist/core/design-compare.d.ts.map +0 -1
  267. package/dist/core/design-compare.js.map +0 -1
  268. package/dist/core/diff.d.ts.map +0 -1
  269. package/dist/core/diff.js.map +0 -1
  270. package/dist/core/dns-cache.d.ts.map +0 -1
  271. package/dist/core/dns-cache.js.map +0 -1
  272. package/dist/core/documents.d.ts.map +0 -1
  273. package/dist/core/documents.js.map +0 -1
  274. package/dist/core/domain-extractors.d.ts.map +0 -1
  275. package/dist/core/domain-extractors.js.map +0 -1
  276. package/dist/core/extract-inline.d.ts.map +0 -1
  277. package/dist/core/extract-inline.js.map +0 -1
  278. package/dist/core/extract-listings.d.ts.map +0 -1
  279. package/dist/core/extract-listings.js.map +0 -1
  280. package/dist/core/extract.d.ts.map +0 -1
  281. package/dist/core/extract.js.map +0 -1
  282. package/dist/core/fetcher.d.ts.map +0 -1
  283. package/dist/core/fetcher.js.map +0 -1
  284. package/dist/core/google-cache.d.ts.map +0 -1
  285. package/dist/core/google-cache.js.map +0 -1
  286. package/dist/core/hotel-search.d.ts.map +0 -1
  287. package/dist/core/hotel-search.js.map +0 -1
  288. package/dist/core/http-fetch.d.ts.map +0 -1
  289. package/dist/core/http-fetch.js.map +0 -1
  290. package/dist/core/human.d.ts.map +0 -1
  291. package/dist/core/human.js.map +0 -1
  292. package/dist/core/jobs.d.ts.map +0 -1
  293. package/dist/core/jobs.js.map +0 -1
  294. package/dist/core/json-ld.d.ts.map +0 -1
  295. package/dist/core/json-ld.js.map +0 -1
  296. package/dist/core/llm-extract.d.ts.map +0 -1
  297. package/dist/core/llm-extract.js.map +0 -1
  298. package/dist/core/map.d.ts.map +0 -1
  299. package/dist/core/map.js.map +0 -1
  300. package/dist/core/markdown.d.ts.map +0 -1
  301. package/dist/core/markdown.js.map +0 -1
  302. package/dist/core/metadata.d.ts.map +0 -1
  303. package/dist/core/metadata.js.map +0 -1
  304. package/dist/core/paginate.d.ts.map +0 -1
  305. package/dist/core/paginate.js.map +0 -1
  306. package/dist/core/pdf.d.ts.map +0 -1
  307. package/dist/core/pdf.js.map +0 -1
  308. package/dist/core/peel-tls.d.ts.map +0 -1
  309. package/dist/core/peel-tls.js.map +0 -1
  310. package/dist/core/pipeline.d.ts.map +0 -1
  311. package/dist/core/pipeline.js.map +0 -1
  312. package/dist/core/profiles.d.ts.map +0 -1
  313. package/dist/core/profiles.js.map +0 -1
  314. package/dist/core/quick-answer.d.ts.map +0 -1
  315. package/dist/core/quick-answer.js.map +0 -1
  316. package/dist/core/rate-governor.d.ts.map +0 -1
  317. package/dist/core/rate-governor.js.map +0 -1
  318. package/dist/core/readability.d.ts.map +0 -1
  319. package/dist/core/readability.js.map +0 -1
  320. package/dist/core/research.d.ts.map +0 -1
  321. package/dist/core/research.js.map +0 -1
  322. package/dist/core/schema-extraction.d.ts.map +0 -1
  323. package/dist/core/schema-extraction.js.map +0 -1
  324. package/dist/core/schema-postprocess.d.ts.map +0 -1
  325. package/dist/core/schema-postprocess.js.map +0 -1
  326. package/dist/core/schema-templates.d.ts.map +0 -1
  327. package/dist/core/schema-templates.js.map +0 -1
  328. package/dist/core/screenshot.d.ts.map +0 -1
  329. package/dist/core/screenshot.js.map +0 -1
  330. package/dist/core/search-fallback.d.ts.map +0 -1
  331. package/dist/core/search-fallback.js.map +0 -1
  332. package/dist/core/search-provider.d.ts.map +0 -1
  333. package/dist/core/search-provider.js.map +0 -1
  334. package/dist/core/site-search.d.ts.map +0 -1
  335. package/dist/core/site-search.js.map +0 -1
  336. package/dist/core/sitemap.d.ts.map +0 -1
  337. package/dist/core/sitemap.js.map +0 -1
  338. package/dist/core/stealth-patches.d.ts.map +0 -1
  339. package/dist/core/stealth-patches.js.map +0 -1
  340. package/dist/core/stemmer.d.ts.map +0 -1
  341. package/dist/core/stemmer.js.map +0 -1
  342. package/dist/core/strategies.d.ts.map +0 -1
  343. package/dist/core/strategies.js.map +0 -1
  344. package/dist/core/strategy-hooks.d.ts.map +0 -1
  345. package/dist/core/strategy-hooks.js.map +0 -1
  346. package/dist/core/summarize.d.ts.map +0 -1
  347. package/dist/core/summarize.js.map +0 -1
  348. package/dist/core/synonyms.d.ts.map +0 -1
  349. package/dist/core/synonyms.js.map +0 -1
  350. package/dist/core/table-format.d.ts.map +0 -1
  351. package/dist/core/table-format.js.map +0 -1
  352. package/dist/core/timing.d.ts.map +0 -1
  353. package/dist/core/timing.js.map +0 -1
  354. package/dist/core/user-agents.d.ts.map +0 -1
  355. package/dist/core/user-agents.js.map +0 -1
  356. package/dist/core/watch-manager.d.ts.map +0 -1
  357. package/dist/core/watch-manager.js.map +0 -1
  358. package/dist/core/watch.d.ts.map +0 -1
  359. package/dist/core/watch.js.map +0 -1
  360. package/dist/core/youtube.d.ts.map +0 -1
  361. package/dist/core/youtube.js.map +0 -1
  362. package/dist/index.d.ts.map +0 -1
  363. package/dist/index.js.map +0 -1
  364. package/dist/integrations/index.d.ts.map +0 -1
  365. package/dist/integrations/index.js.map +0 -1
  366. package/dist/integrations/langchain.d.ts.map +0 -1
  367. package/dist/integrations/langchain.js.map +0 -1
  368. package/dist/integrations/llamaindex.d.ts.map +0 -1
  369. package/dist/integrations/llamaindex.js.map +0 -1
  370. package/dist/mcp/server.d.ts.map +0 -1
  371. package/dist/mcp/server.js.map +0 -1
  372. package/dist/mcp/smart-router.d.ts.map +0 -1
  373. package/dist/mcp/smart-router.js.map +0 -1
  374. package/dist/server/app.d.ts +0 -15
  375. package/dist/server/app.d.ts.map +0 -1
  376. package/dist/server/app.js +0 -350
  377. package/dist/server/app.js.map +0 -1
  378. package/dist/server/auth-store.d.ts +0 -28
  379. package/dist/server/auth-store.d.ts.map +0 -1
  380. package/dist/server/auth-store.js +0 -89
  381. package/dist/server/auth-store.js.map +0 -1
  382. package/dist/server/email-service.d.ts +0 -22
  383. package/dist/server/email-service.d.ts.map +0 -1
  384. package/dist/server/email-service.js +0 -80
  385. package/dist/server/email-service.js.map +0 -1
  386. package/dist/server/job-queue.d.ts +0 -93
  387. package/dist/server/job-queue.d.ts.map +0 -1
  388. package/dist/server/job-queue.js +0 -146
  389. package/dist/server/job-queue.js.map +0 -1
  390. package/dist/server/logger.d.ts +0 -11
  391. package/dist/server/logger.d.ts.map +0 -1
  392. package/dist/server/logger.js +0 -38
  393. package/dist/server/logger.js.map +0 -1
  394. package/dist/server/middleware/auth.d.ts +0 -29
  395. package/dist/server/middleware/auth.d.ts.map +0 -1
  396. package/dist/server/middleware/auth.js +0 -222
  397. package/dist/server/middleware/auth.js.map +0 -1
  398. package/dist/server/middleware/rate-limit.d.ts +0 -25
  399. package/dist/server/middleware/rate-limit.d.ts.map +0 -1
  400. package/dist/server/middleware/rate-limit.js +0 -168
  401. package/dist/server/middleware/rate-limit.js.map +0 -1
  402. package/dist/server/middleware/url-validator.d.ts +0 -16
  403. package/dist/server/middleware/url-validator.d.ts.map +0 -1
  404. package/dist/server/middleware/url-validator.js +0 -187
  405. package/dist/server/middleware/url-validator.js.map +0 -1
  406. package/dist/server/openapi.yaml +0 -4944
  407. package/dist/server/pg-auth-store.d.ts +0 -133
  408. package/dist/server/pg-auth-store.d.ts.map +0 -1
  409. package/dist/server/pg-auth-store.js +0 -473
  410. package/dist/server/pg-auth-store.js.map +0 -1
  411. package/dist/server/pg-job-queue.d.ts +0 -60
  412. package/dist/server/pg-job-queue.d.ts.map +0 -1
  413. package/dist/server/pg-job-queue.js +0 -365
  414. package/dist/server/pg-job-queue.js.map +0 -1
  415. package/dist/server/premium/domain-intel.d.ts +0 -17
  416. package/dist/server/premium/domain-intel.d.ts.map +0 -1
  417. package/dist/server/premium/domain-intel.js +0 -134
  418. package/dist/server/premium/domain-intel.js.map +0 -1
  419. package/dist/server/premium/index.d.ts +0 -18
  420. package/dist/server/premium/index.d.ts.map +0 -1
  421. package/dist/server/premium/index.js +0 -36
  422. package/dist/server/premium/index.js.map +0 -1
  423. package/dist/server/premium/swr-cache.d.ts +0 -15
  424. package/dist/server/premium/swr-cache.d.ts.map +0 -1
  425. package/dist/server/premium/swr-cache.js +0 -35
  426. package/dist/server/premium/swr-cache.js.map +0 -1
  427. package/dist/server/routes/activity.d.ts +0 -7
  428. package/dist/server/routes/activity.d.ts.map +0 -1
  429. package/dist/server/routes/activity.js +0 -68
  430. package/dist/server/routes/activity.js.map +0 -1
  431. package/dist/server/routes/agent.d.ts +0 -16
  432. package/dist/server/routes/agent.d.ts.map +0 -1
  433. package/dist/server/routes/agent.js +0 -247
  434. package/dist/server/routes/agent.js.map +0 -1
  435. package/dist/server/routes/answer.d.ts +0 -6
  436. package/dist/server/routes/answer.d.ts.map +0 -1
  437. package/dist/server/routes/answer.js +0 -133
  438. package/dist/server/routes/answer.js.map +0 -1
  439. package/dist/server/routes/ask.d.ts +0 -23
  440. package/dist/server/routes/ask.d.ts.map +0 -1
  441. package/dist/server/routes/ask.js +0 -119
  442. package/dist/server/routes/ask.js.map +0 -1
  443. package/dist/server/routes/batch.d.ts +0 -7
  444. package/dist/server/routes/batch.d.ts.map +0 -1
  445. package/dist/server/routes/batch.js +0 -412
  446. package/dist/server/routes/batch.js.map +0 -1
  447. package/dist/server/routes/cli-usage.d.ts +0 -7
  448. package/dist/server/routes/cli-usage.d.ts.map +0 -1
  449. package/dist/server/routes/cli-usage.js +0 -121
  450. package/dist/server/routes/cli-usage.js.map +0 -1
  451. package/dist/server/routes/compat.d.ts +0 -24
  452. package/dist/server/routes/compat.d.ts.map +0 -1
  453. package/dist/server/routes/compat.js +0 -653
  454. package/dist/server/routes/compat.js.map +0 -1
  455. package/dist/server/routes/deep-fetch.d.ts +0 -9
  456. package/dist/server/routes/deep-fetch.d.ts.map +0 -1
  457. package/dist/server/routes/deep-fetch.js +0 -50
  458. package/dist/server/routes/deep-fetch.js.map +0 -1
  459. package/dist/server/routes/demo.d.ts +0 -25
  460. package/dist/server/routes/demo.d.ts.map +0 -1
  461. package/dist/server/routes/demo.js +0 -434
  462. package/dist/server/routes/demo.js.map +0 -1
  463. package/dist/server/routes/extract.d.ts +0 -9
  464. package/dist/server/routes/extract.d.ts.map +0 -1
  465. package/dist/server/routes/extract.js +0 -150
  466. package/dist/server/routes/extract.js.map +0 -1
  467. package/dist/server/routes/fetch.d.ts +0 -8
  468. package/dist/server/routes/fetch.d.ts.map +0 -1
  469. package/dist/server/routes/fetch.js +0 -988
  470. package/dist/server/routes/fetch.js.map +0 -1
  471. package/dist/server/routes/health.d.ts +0 -8
  472. package/dist/server/routes/health.d.ts.map +0 -1
  473. package/dist/server/routes/health.js +0 -20
  474. package/dist/server/routes/health.js.map +0 -1
  475. package/dist/server/routes/jobs.d.ts +0 -8
  476. package/dist/server/routes/jobs.d.ts.map +0 -1
  477. package/dist/server/routes/jobs.js +0 -487
  478. package/dist/server/routes/jobs.js.map +0 -1
  479. package/dist/server/routes/mcp.d.ts +0 -18
  480. package/dist/server/routes/mcp.d.ts.map +0 -1
  481. package/dist/server/routes/mcp.js +0 -1260
  482. package/dist/server/routes/mcp.js.map +0 -1
  483. package/dist/server/routes/oauth.d.ts +0 -10
  484. package/dist/server/routes/oauth.d.ts.map +0 -1
  485. package/dist/server/routes/oauth.js +0 -334
  486. package/dist/server/routes/oauth.js.map +0 -1
  487. package/dist/server/routes/quick-answer.d.ts +0 -9
  488. package/dist/server/routes/quick-answer.d.ts.map +0 -1
  489. package/dist/server/routes/quick-answer.js +0 -93
  490. package/dist/server/routes/quick-answer.js.map +0 -1
  491. package/dist/server/routes/screenshot.d.ts +0 -23
  492. package/dist/server/routes/screenshot.d.ts.map +0 -1
  493. package/dist/server/routes/screenshot.js +0 -819
  494. package/dist/server/routes/screenshot.js.map +0 -1
  495. package/dist/server/routes/search.d.ts +0 -7
  496. package/dist/server/routes/search.d.ts.map +0 -1
  497. package/dist/server/routes/search.js +0 -312
  498. package/dist/server/routes/search.js.map +0 -1
  499. package/dist/server/routes/session.d.ts +0 -16
  500. package/dist/server/routes/session.d.ts.map +0 -1
  501. package/dist/server/routes/session.js +0 -278
  502. package/dist/server/routes/session.js.map +0 -1
  503. package/dist/server/routes/stats.d.ts +0 -7
  504. package/dist/server/routes/stats.d.ts.map +0 -1
  505. package/dist/server/routes/stats.js +0 -65
  506. package/dist/server/routes/stats.js.map +0 -1
  507. package/dist/server/routes/stripe.d.ts +0 -16
  508. package/dist/server/routes/stripe.d.ts.map +0 -1
  509. package/dist/server/routes/stripe.js +0 -283
  510. package/dist/server/routes/stripe.js.map +0 -1
  511. package/dist/server/routes/users.d.ts +0 -9
  512. package/dist/server/routes/users.d.ts.map +0 -1
  513. package/dist/server/routes/users.js +0 -1211
  514. package/dist/server/routes/users.js.map +0 -1
  515. package/dist/server/routes/watch.d.ts +0 -16
  516. package/dist/server/routes/watch.d.ts.map +0 -1
  517. package/dist/server/routes/watch.js +0 -257
  518. package/dist/server/routes/watch.js.map +0 -1
  519. package/dist/server/routes/webhooks.d.ts +0 -16
  520. package/dist/server/routes/webhooks.d.ts.map +0 -1
  521. package/dist/server/routes/webhooks.js +0 -74
  522. package/dist/server/routes/webhooks.js.map +0 -1
  523. package/dist/server/routes/youtube.d.ts +0 -7
  524. package/dist/server/routes/youtube.d.ts.map +0 -1
  525. package/dist/server/routes/youtube.js +0 -93
  526. package/dist/server/routes/youtube.js.map +0 -1
  527. package/dist/server/sentry.d.ts +0 -14
  528. package/dist/server/sentry.d.ts.map +0 -1
  529. package/dist/server/sentry.js +0 -39
  530. package/dist/server/sentry.js.map +0 -1
  531. package/dist/server/types.d.ts +0 -16
  532. package/dist/server/types.d.ts.map +0 -1
  533. package/dist/server/types.js +0 -8
  534. package/dist/server/types.js.map +0 -1
  535. package/dist/server/utils/response.d.ts +0 -45
  536. package/dist/server/utils/response.d.ts.map +0 -1
  537. package/dist/server/utils/response.js +0 -70
  538. package/dist/server/utils/response.js.map +0 -1
  539. package/dist/server/utils/sse.d.ts +0 -23
  540. package/dist/server/utils/sse.d.ts.map +0 -1
  541. package/dist/server/utils/sse.js +0 -39
  542. package/dist/server/utils/sse.js.map +0 -1
  543. package/dist/types.d.ts.map +0 -1
  544. package/dist/types.js.map +0 -1
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Legacy tool handlers — backward-compatible implementations for all
3
+ * pre-consolidated tool names. Each handler delegates to the appropriate
4
+ * core module or consolidated handler.
5
+ */
6
+ import { peel, peelBatch } from '../../index.js';
7
+ import { getBestSearchProvider } from '../../core/search-provider.js';
8
+ import { quickAnswer } from '../../core/quick-answer.js';
9
+ import { answerQuestion } from '../../core/answer.js';
10
+ import { runAgent } from '../../core/agent.js';
11
+ import { textResult, safeStringify, timeout } from './types.js';
12
+ import { handleExtract } from './extract.js';
13
+ import { handleMonitor } from './monitor.js';
14
+ import { handleFind } from './find.js';
15
+ // ── webpeel_youtube ──────────────────────────────────────────────────────────
16
+ export const handleYoutube = async (args, _ctx) => {
17
+ const { getYouTubeTranscript } = await import('../../core/youtube.js');
18
+ const url = args['url'];
19
+ if (!url || typeof url !== 'string')
20
+ throw new Error('url is required');
21
+ const language = args['language'] || 'en';
22
+ const transcript = await Promise.race([
23
+ getYouTubeTranscript(url, { language }),
24
+ timeout(60000, 'YouTube transcript'),
25
+ ]);
26
+ return textResult(safeStringify(transcript));
27
+ };
28
+ // ── webpeel_screenshot ───────────────────────────────────────────────────────
29
+ export const handleScreenshot = async (args, _ctx) => {
30
+ const { takeScreenshot } = await import('../../core/screenshot.js');
31
+ const { url, fullPage, width, height, format, quality, waitFor, stealth, actions, } = args;
32
+ if (!url)
33
+ throw new Error('url is required');
34
+ const result = await Promise.race([
35
+ takeScreenshot(url, {
36
+ fullPage: fullPage || false,
37
+ width,
38
+ height,
39
+ format: format || 'png',
40
+ quality,
41
+ waitFor,
42
+ stealth: stealth || false,
43
+ actions,
44
+ }),
45
+ timeout(60000, 'Screenshot'),
46
+ ]);
47
+ return textResult(safeStringify({
48
+ url: result.url,
49
+ format: result.format,
50
+ contentType: result.contentType,
51
+ screenshot: result.screenshot,
52
+ }));
53
+ };
54
+ // ── webpeel_search ───────────────────────────────────────────────────────────
55
+ export const handleSearch = async (args, ctx) => {
56
+ return handleFind({ ...args, depth: 'quick' }, ctx);
57
+ };
58
+ // ── webpeel_research ─────────────────────────────────────────────────────────
59
+ export const handleResearch = async (args, _ctx) => {
60
+ const { query, maxSources, maxDepth, llmApiKey, llmModel, llmBaseUrl, outputFormat, timeout: resTimeout, } = args;
61
+ if (!query)
62
+ throw new Error('query is required');
63
+ const { research } = await import('../../core/research.js');
64
+ const result = await Promise.race([
65
+ research({
66
+ query,
67
+ maxSources: maxSources ?? 5,
68
+ maxDepth: maxDepth ?? 1,
69
+ apiKey: llmApiKey,
70
+ model: llmModel,
71
+ baseUrl: llmBaseUrl,
72
+ outputFormat: outputFormat ?? 'report',
73
+ timeout: resTimeout ?? 60000,
74
+ }),
75
+ timeout(180000, 'Research'),
76
+ ]);
77
+ return textResult(safeStringify({
78
+ report: result.report,
79
+ sources: result.sources,
80
+ totalSourcesFound: result.totalSourcesFound,
81
+ sourcesConsulted: result.sourcesConsulted,
82
+ elapsed: result.elapsed,
83
+ tokensUsed: result.tokensUsed,
84
+ cost: result.cost,
85
+ }));
86
+ };
87
+ // ── webpeel_crawl ────────────────────────────────────────────────────────────
88
+ export const handleCrawl = async (args, _ctx) => {
89
+ const { crawl } = await import('../../core/crawler.js');
90
+ const { url, maxPages, maxDepth, allowedDomains, excludePatterns, respectRobotsTxt, rateLimitMs, sitemapFirst, render, stealth, } = args;
91
+ if (!url)
92
+ throw new Error('url is required');
93
+ const results = await Promise.race([
94
+ crawl(url, {
95
+ maxPages,
96
+ maxDepth,
97
+ allowedDomains,
98
+ excludePatterns,
99
+ respectRobotsTxt,
100
+ rateLimitMs,
101
+ sitemapFirst,
102
+ render,
103
+ stealth,
104
+ }),
105
+ timeout(600000, 'Crawl'),
106
+ ]);
107
+ return textResult(safeStringify(results));
108
+ };
109
+ // ── webpeel_map ──────────────────────────────────────────────────────────────
110
+ export const handleMap = async (args, _ctx) => {
111
+ const { mapDomain } = await import('../../core/map.js');
112
+ const { url, maxUrls, includePatterns, excludePatterns } = args;
113
+ if (!url)
114
+ throw new Error('url is required');
115
+ const results = await Promise.race([
116
+ mapDomain(url, { maxUrls, includePatterns, excludePatterns }),
117
+ timeout(600000, 'Map'),
118
+ ]);
119
+ return textResult(safeStringify(results));
120
+ };
121
+ // ── webpeel_batch ────────────────────────────────────────────────────────────
122
+ export const handleBatch = async (args, _ctx) => {
123
+ const { urls, concurrency, render, format, selector } = args;
124
+ if (!urls || !Array.isArray(urls))
125
+ throw new Error('urls must be an array');
126
+ if (urls.length === 0)
127
+ throw new Error('urls cannot be empty');
128
+ if (urls.length > 50)
129
+ throw new Error('Too many URLs (max 50)');
130
+ const options = {
131
+ concurrency: concurrency || 3,
132
+ render: render || false,
133
+ format: format || 'markdown',
134
+ selector,
135
+ };
136
+ const results = await Promise.race([
137
+ peelBatch(urls, options),
138
+ timeout(300000, 'Batch'),
139
+ ]);
140
+ return textResult(safeStringify(results));
141
+ };
142
+ // ── webpeel_deep_fetch ───────────────────────────────────────────────────────
143
+ export const handleDeepFetch = async (args, ctx) => {
144
+ const { query, count: countArg, format: formatArg } = args;
145
+ if (!query)
146
+ throw new Error('query is required');
147
+ return handleFind({ query, depth: 'deep', limit: Math.min(Math.max(countArg ?? 5, 1), 10), format: formatArg }, ctx);
148
+ };
149
+ // ── webpeel_summarize ────────────────────────────────────────────────────────
150
+ export const handleSummarize = async (args, _ctx) => {
151
+ const { url, llmApiKey, prompt, llmModel, llmBaseUrl, render } = args;
152
+ if (!url)
153
+ throw new Error('url is required');
154
+ if (!llmApiKey)
155
+ throw new Error('llmApiKey is required');
156
+ const options = {
157
+ render: render || false,
158
+ extract: {
159
+ prompt: prompt || 'Summarize this webpage in 2-3 sentences.',
160
+ llmApiKey,
161
+ llmModel: llmModel || 'gpt-4o-mini',
162
+ llmBaseUrl: llmBaseUrl || 'https://api.openai.com/v1',
163
+ },
164
+ };
165
+ const result = await Promise.race([
166
+ peel(url, options),
167
+ timeout(60000, 'Summarize'),
168
+ ]);
169
+ return textResult(safeStringify({ url: result.url, title: result.title, summary: result.extracted }));
170
+ };
171
+ // ── webpeel_answer ───────────────────────────────────────────────────────────
172
+ export const handleAnswer = async (args, _ctx) => {
173
+ const { question: q, searchProvider: sp, searchApiKey: sak, llmProvider: lp, llmApiKey: lak, llmModel: lm, maxSources: ms, } = args;
174
+ if (!q)
175
+ throw new Error('question is required');
176
+ if (!lp)
177
+ throw new Error('llmProvider is required');
178
+ if (!lak)
179
+ throw new Error('llmApiKey is required');
180
+ const validLlm = ['openai', 'anthropic', 'google'];
181
+ if (!validLlm.includes(lp))
182
+ throw new Error('Invalid llmProvider');
183
+ const validSp = ['duckduckgo', 'brave', 'stealth', 'google'];
184
+ const resolvedSp = (sp && validSp.includes(sp) ? sp : 'duckduckgo');
185
+ const result = await Promise.race([
186
+ answerQuestion({
187
+ question: q,
188
+ searchProvider: resolvedSp,
189
+ searchApiKey: sak,
190
+ llmProvider: lp,
191
+ llmApiKey: lak,
192
+ llmModel: lm,
193
+ maxSources: Math.min(Math.max(ms ?? 5, 1), 10),
194
+ stream: false,
195
+ }),
196
+ timeout(180000, 'Answer'),
197
+ ]);
198
+ return textResult(safeStringify(result));
199
+ };
200
+ // ── webpeel_quick_answer ─────────────────────────────────────────────────────
201
+ export const handleQuickAnswer = async (args, _ctx) => {
202
+ const { url, question: q, maxPassages: mpArg, render } = args;
203
+ if (!url)
204
+ throw new Error('url is required');
205
+ if (!q)
206
+ throw new Error('question is required');
207
+ const maxPassages = typeof mpArg === 'number' ? Math.min(Math.max(mpArg, 1), 10) : 3;
208
+ const peelResult = await Promise.race([
209
+ peel(url, { render: render || false, format: 'markdown', budget: 8000 }),
210
+ timeout(60000, 'Quick answer fetch'),
211
+ ]);
212
+ const qa = quickAnswer({
213
+ question: q,
214
+ content: peelResult.content || '',
215
+ url: peelResult.url || url,
216
+ maxPassages,
217
+ });
218
+ return textResult(safeStringify({
219
+ url: peelResult.url || url,
220
+ title: peelResult.title,
221
+ question: qa.question,
222
+ answer: qa.answer,
223
+ confidence: qa.confidence,
224
+ passages: qa.passages,
225
+ method: qa.method,
226
+ }));
227
+ };
228
+ // ── webpeel_brand ────────────────────────────────────────────────────────────
229
+ export const handleBrand = async (args, ctx) => {
230
+ return handleExtract({ ...args, _brand: true }, ctx);
231
+ };
232
+ // ── webpeel_change_track ─────────────────────────────────────────────────────
233
+ export const handleChangeTrack = async (args, ctx) => {
234
+ return handleMonitor(args, ctx);
235
+ };
236
+ // ── webpeel_watch ────────────────────────────────────────────────────────────
237
+ export const handleWatch = async (args, ctx) => {
238
+ const action = args['action'];
239
+ const pool = ctx?.pool;
240
+ // If pool is available (HTTP route), use WatchManager
241
+ if (pool) {
242
+ const { WatchManager } = await import('../../core/watch-manager.js');
243
+ const wm = new WatchManager(pool);
244
+ const accountId = ctx?.accountId || 'anonymous';
245
+ if (action === 'create') {
246
+ const watch = await wm.create(accountId, args['url'], {
247
+ webhookUrl: args['webhookUrl'],
248
+ checkIntervalMinutes: args['intervalMinutes'] || 60,
249
+ selector: args['selector'],
250
+ });
251
+ return textResult(safeStringify(watch));
252
+ }
253
+ if (action === 'list') {
254
+ const watches = await wm.list(accountId);
255
+ return textResult(safeStringify(watches));
256
+ }
257
+ if (action === 'check') {
258
+ const result = await wm.check(args['id']);
259
+ return textResult(safeStringify(result));
260
+ }
261
+ if (action === 'delete') {
262
+ await wm.delete(args['id']);
263
+ return textResult(safeStringify({ success: true }));
264
+ }
265
+ return textResult(safeStringify({ error: `Unknown watch action: ${action}` }));
266
+ }
267
+ // Standalone fallback (no pool)
268
+ if (!action || action === 'list' || action === 'check' || action === 'delete') {
269
+ return textResult(safeStringify({
270
+ message: 'URL watching requires the hosted API (api.webpeel.dev). ' +
271
+ 'Use webpeel_monitor for one-time change detection.',
272
+ }));
273
+ }
274
+ if (action === 'create') {
275
+ return handleMonitor({
276
+ url: args['url'],
277
+ webhook: args['webhookUrl'],
278
+ }, ctx);
279
+ }
280
+ return textResult(safeStringify({
281
+ message: 'URL watching requires the hosted API (api.webpeel.dev).',
282
+ }));
283
+ };
284
+ // ── webpeel_hotels ───────────────────────────────────────────────────────────
285
+ export const handleHotels = async (args, _ctx) => {
286
+ const { searchHotels, parseDate, addDays } = await import('../../core/hotel-search.js');
287
+ const destination = args['destination'];
288
+ if (!destination) {
289
+ return textResult(safeStringify({ error: 'Missing destination' }));
290
+ }
291
+ const checkin = args['checkin']
292
+ ? parseDate(args['checkin'])
293
+ : parseDate('tomorrow');
294
+ const checkout = args['checkout']
295
+ ? parseDate(args['checkout'])
296
+ : addDays(checkin, 1);
297
+ const sort = (['price', 'rating', 'value'].includes(args['sort'])
298
+ ? args['sort']
299
+ : 'price');
300
+ const limit = Math.max(1, Math.min(50, args['limit'] || 20));
301
+ const result = await searchHotels({ destination, checkin, checkout, sort, limit, stealth: true });
302
+ return textResult(safeStringify({
303
+ destination,
304
+ checkin,
305
+ checkout,
306
+ sources: result.sources,
307
+ count: result.results.length,
308
+ results: result.results.slice(0, limit),
309
+ }));
310
+ };
311
+ // ── webpeel_design_analysis ──────────────────────────────────────────────────
312
+ export const handleDesignAnalysis = async (args, _ctx) => {
313
+ const { takeDesignAnalysis } = await import('../../core/screenshot.js');
314
+ const url = args['url'];
315
+ if (!url || typeof url !== 'string')
316
+ throw new Error('url is required');
317
+ if (url.length > 2048)
318
+ throw new Error('URL too long (max 2048 characters)');
319
+ const result = await Promise.race([
320
+ takeDesignAnalysis(url, {}),
321
+ timeout(90000, 'Design analysis'),
322
+ ]);
323
+ return textResult(safeStringify({ url: result.url, analysis: result.analysis }));
324
+ };
325
+ // ── webpeel_design_compare ───────────────────────────────────────────────────
326
+ export const handleDesignCompare = async (args, _ctx) => {
327
+ const { takeDesignComparison } = await import('../../core/screenshot.js');
328
+ const url1 = args['url1'];
329
+ const url2 = args['url2'];
330
+ if (!url1 || typeof url1 !== 'string')
331
+ throw new Error('url1 is required');
332
+ if (!url2 || typeof url2 !== 'string')
333
+ throw new Error('url2 is required');
334
+ if (url1.length > 2048)
335
+ throw new Error('url1 too long');
336
+ if (url2.length > 2048)
337
+ throw new Error('url2 too long');
338
+ if (url1 === url2)
339
+ throw new Error('url1 and url2 must be different URLs');
340
+ const result = await Promise.race([
341
+ takeDesignComparison(url1, url2, {}),
342
+ timeout(120000, 'Design comparison'),
343
+ ]);
344
+ return textResult(safeStringify({
345
+ subjectUrl: result.subjectUrl,
346
+ referenceUrl: result.referenceUrl,
347
+ score: result.comparison.score,
348
+ summary: result.comparison.summary,
349
+ gaps: result.comparison.gaps,
350
+ subjectAnalysis: result.comparison.subjectAnalysis,
351
+ referenceAnalysis: result.comparison.referenceAnalysis,
352
+ }));
353
+ };
354
+ // ── webpeel_auto_extract ─────────────────────────────────────────────────────
355
+ export const handleAutoExtract = async (args, ctx) => {
356
+ return handleExtract(args, ctx);
357
+ };
358
+ // ── webpeel_agent / agent ────────────────────────────────────────────────────
359
+ export const handleAgent = async (args, _ctx) => {
360
+ const llmApiKey = args['llmApiKey'];
361
+ // LLM mode — delegate to runAgent
362
+ if (llmApiKey) {
363
+ const prompt = args['prompt'];
364
+ if (!prompt)
365
+ throw new Error('prompt is required');
366
+ const result = await Promise.race([
367
+ runAgent({
368
+ prompt,
369
+ llmApiKey,
370
+ llmModel: args['llmModel'],
371
+ depth: (args['depth'] || 'basic'),
372
+ topic: (args['topic'] || 'general'),
373
+ urls: args['urls'],
374
+ maxSources: args['maxSources'] || args['maxResults'] || undefined,
375
+ outputSchema: args['outputSchema'],
376
+ }),
377
+ timeout(180000, 'Agent'),
378
+ ]);
379
+ return textResult(safeStringify(result));
380
+ }
381
+ // LLM-free mode — search + fetch + BM25 extraction
382
+ const urlsArg = args['urls'] || [];
383
+ const searchArg = args['search'];
384
+ if (urlsArg.length === 0 && !searchArg) {
385
+ return textResult(safeStringify({
386
+ message: 'This tool has been deprecated. Use the webpeel tool instead.',
387
+ }));
388
+ }
389
+ const promptArg = args['prompt'];
390
+ const schema = args['schema'];
391
+ const budgetArg = args['budget'] || 4000;
392
+ const maxResults = Math.min(args['maxResults'] || 5, 20);
393
+ const targetUrls = [...urlsArg];
394
+ if (searchArg) {
395
+ try {
396
+ const { provider, apiKey } = getBestSearchProvider();
397
+ const searchResults = await provider.searchWeb(searchArg, {
398
+ count: Math.max(maxResults, 5),
399
+ apiKey,
400
+ });
401
+ for (const r of searchResults) {
402
+ if (!targetUrls.includes(r.url))
403
+ targetUrls.push(r.url);
404
+ }
405
+ }
406
+ catch { /* continue with provided URLs */ }
407
+ }
408
+ const urlsToFetch = targetUrls.slice(0, maxResults);
409
+ const agentResults = [];
410
+ await Promise.all(urlsToFetch.map(async (u) => {
411
+ try {
412
+ const page = (await peel(u, { budget: budgetArg, format: 'markdown' }));
413
+ const content = page.content || '';
414
+ const title = page.title || u;
415
+ let extracted = null;
416
+ let confidence = 0;
417
+ if (schema && Object.keys(schema).length > 0) {
418
+ extracted = {};
419
+ let total = 0;
420
+ for (const [field] of Object.entries(schema)) {
421
+ const question = promptArg
422
+ ? `${promptArg} — specifically: what is the ${field}?`
423
+ : `What is the ${field}?`;
424
+ const qa = quickAnswer({ question, content, maxPassages: 1, url: u });
425
+ extracted[field] = qa.answer || '';
426
+ total += qa.confidence;
427
+ }
428
+ if ('source' in schema)
429
+ extracted['source'] = u;
430
+ confidence = Object.keys(schema).length > 0 ? total / Object.keys(schema).length : 0;
431
+ }
432
+ else if (promptArg) {
433
+ const qa = quickAnswer({ question: promptArg, content, maxPassages: 3, url: u });
434
+ confidence = qa.confidence;
435
+ }
436
+ agentResults.push({
437
+ url: u,
438
+ title,
439
+ extracted,
440
+ content: content.slice(0, 500) + (content.length > 500 ? '…' : ''),
441
+ confidence,
442
+ });
443
+ }
444
+ catch { /* skip failed URLs */ }
445
+ }));
446
+ return textResult(safeStringify({
447
+ success: true,
448
+ data: { results: agentResults, totalSources: agentResults.length },
449
+ }));
450
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * handleMeta — the 'webpeel' meta tool.
3
+ * Parses plain-language intent and routes to the appropriate handler.
4
+ */
5
+ import type { McpHandler } from './types.js';
6
+ export declare const handleMeta: McpHandler;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * handleMeta — the 'webpeel' meta tool.
3
+ * Parses plain-language intent and routes to the appropriate handler.
4
+ */
5
+ import { parseIntent } from '../smart-router.js';
6
+ import { handleRead } from './read.js';
7
+ import { handleSee } from './see.js';
8
+ import { handleFind } from './find.js';
9
+ import { handleExtract } from './extract.js';
10
+ import { handleMonitor } from './monitor.js';
11
+ import { handleAct } from './act.js';
12
+ export const handleMeta = async (args, ctx) => {
13
+ const task = args['task'];
14
+ if (!task || typeof task !== 'string')
15
+ throw new Error('task is required');
16
+ const parsed = parseIntent(task);
17
+ const routedArgs = { ...parsed.params };
18
+ if (parsed.url)
19
+ routedArgs['url'] = parsed.url;
20
+ if (parsed.query)
21
+ routedArgs['query'] = parsed.query;
22
+ switch (parsed.intent) {
23
+ case 'read': return handleRead(routedArgs, ctx);
24
+ case 'see': return handleSee(routedArgs, ctx);
25
+ case 'find': return handleFind(routedArgs, ctx);
26
+ case 'extract': return handleExtract(routedArgs, ctx);
27
+ case 'monitor': return handleMonitor(routedArgs, ctx);
28
+ case 'act': return handleAct(routedArgs, ctx);
29
+ default: return handleRead(routedArgs, ctx);
30
+ }
31
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * handleMonitor — watch a URL for changes, with optional webhook.
3
+ */
4
+ import { type McpHandler } from './types.js';
5
+ export declare const handleMonitor: McpHandler;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * handleMonitor — watch a URL for changes, with optional webhook.
3
+ */
4
+ import { peel } from '../../index.js';
5
+ import { textResult, safeStringify, timeout } from './types.js';
6
+ export const handleMonitor = async (args, _ctx) => {
7
+ const url = args['url'];
8
+ if (!url || typeof url !== 'string')
9
+ throw new Error('url is required');
10
+ if (url.length > 2048)
11
+ throw new Error('URL too long (max 2048 characters)');
12
+ const webhook = args['webhook'];
13
+ const selector = args['selector'];
14
+ const render = args['render'] || false;
15
+ if (webhook) {
16
+ // Webhook-based persistent monitoring requires hosted API
17
+ return textResult(safeStringify({
18
+ message: 'Persistent webhook monitoring requires the hosted API (api.webpeel.dev). ' +
19
+ 'Use webpeel_monitor without webhook= for one-time change detection.',
20
+ url,
21
+ webhook,
22
+ }));
23
+ }
24
+ // One-time change snapshot (change_track logic)
25
+ const options = {
26
+ render: render || false,
27
+ ...(selector ? { selector } : {}),
28
+ };
29
+ const result = await Promise.race([
30
+ peel(url, options),
31
+ timeout(60000, 'Monitor'),
32
+ ]);
33
+ return textResult(safeStringify({
34
+ url: result.url,
35
+ title: result.title,
36
+ fingerprint: result.fingerprint,
37
+ tokens: result.tokens,
38
+ contentType: result.contentType,
39
+ lastChecked: new Date().toISOString(),
40
+ }));
41
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * handleRead — fetch any URL as clean markdown.
3
+ * Auto-detects YouTube URLs and extracts transcripts.
4
+ */
5
+ import { type McpHandler } from './types.js';
6
+ export declare const handleRead: McpHandler;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * handleRead — fetch any URL as clean markdown.
3
+ * Auto-detects YouTube URLs and extracts transcripts.
4
+ */
5
+ import { peel } from '../../index.js';
6
+ import { textResult, safeStringify, timeout } from './types.js';
7
+ function isYouTubeUrl(url) {
8
+ return /(?:youtube\.com|youtu\.be)/i.test(url);
9
+ }
10
+ export const handleRead = async (args, _ctx) => {
11
+ const url = args['url'];
12
+ if (!url || typeof url !== 'string')
13
+ throw new Error('url is required');
14
+ if (url.length > 2048)
15
+ throw new Error('URL too long (max 2048 characters)');
16
+ const format = args['format'] || 'markdown';
17
+ const render = args['render'] || false;
18
+ const question = args['question'];
19
+ const summary = args['summary'] || false;
20
+ const budgetArg = args['budget'];
21
+ const readable = args['readable'] || false;
22
+ // YouTube auto-detection
23
+ if (isYouTubeUrl(url)) {
24
+ const { getYouTubeTranscript } = await import('../../core/youtube.js');
25
+ const language = args['language'] || 'en';
26
+ const transcript = await Promise.race([
27
+ getYouTubeTranscript(url, { language }),
28
+ timeout(60000, 'YouTube transcript'),
29
+ ]);
30
+ return textResult(safeStringify(transcript));
31
+ }
32
+ // Build summary extraction options if requested
33
+ const extractOpts = summary
34
+ ? { prompt: 'Summarize this webpage in 2-3 concise sentences.' }
35
+ : undefined;
36
+ const options = {
37
+ render,
38
+ format: format,
39
+ question,
40
+ budget: budgetArg ?? 4000,
41
+ readable,
42
+ ...(extractOpts ? { extract: extractOpts } : {}),
43
+ };
44
+ const result = await Promise.race([
45
+ peel(url, options),
46
+ timeout(60000, 'MCP read'),
47
+ ]);
48
+ const out = {
49
+ url: result.url || url,
50
+ title: result.title || '',
51
+ tokens: result.tokens || 0,
52
+ content: result.content,
53
+ };
54
+ if (result.metadata)
55
+ out['metadata'] = result.metadata;
56
+ if (result.quickAnswer)
57
+ out['quickAnswer'] = result.quickAnswer;
58
+ if (result.extracted)
59
+ out['extracted'] = result.extracted;
60
+ if (result.images)
61
+ out['images'] = result.images;
62
+ return textResult(safeStringify(out));
63
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * handleSee — take a screenshot, optionally with design analysis or comparison.
3
+ */
4
+ import { type McpHandler } from './types.js';
5
+ export declare const handleSee: McpHandler;