@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.
- package/LICENSE +15 -0
- package/README.md +313 -0
- package/dist/cache.d.ts +30 -0
- package/dist/cache.js +139 -0
- package/dist/cli/commands/auth.d.ts +5 -0
- package/dist/cli/commands/auth.js +411 -0
- package/dist/cli/commands/doctor.d.ts +37 -0
- package/dist/cli/commands/doctor.js +371 -0
- package/dist/cli/commands/fetch.d.ts +6 -0
- package/dist/cli/commands/fetch.js +1345 -0
- package/dist/cli/commands/guide.d.ts +2 -0
- package/dist/cli/commands/guide.js +183 -0
- package/dist/cli/commands/interact.d.ts +5 -0
- package/dist/cli/commands/interact.js +840 -0
- package/dist/cli/commands/jobs.d.ts +5 -0
- package/dist/cli/commands/jobs.js +997 -0
- package/dist/cli/commands/monitor.d.ts +12 -0
- package/dist/cli/commands/monitor.js +197 -0
- package/dist/cli/commands/observe.d.ts +12 -0
- package/dist/cli/commands/observe.js +158 -0
- package/dist/cli/commands/screenshot.d.ts +5 -0
- package/dist/cli/commands/screenshot.js +282 -0
- package/dist/cli/commands/search.d.ts +5 -0
- package/dist/cli/commands/search.js +1021 -0
- package/dist/cli/commands/setup.d.ts +13 -0
- package/dist/cli/commands/setup.js +244 -0
- package/dist/cli/commands/skill.d.ts +15 -0
- package/dist/cli/commands/skill.js +195 -0
- package/dist/cli/utils.d.ts +84 -0
- package/dist/cli/utils.js +806 -0
- package/dist/cli-auth.d.ts +75 -0
- package/dist/cli-auth.js +369 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.js +99 -0
- package/dist/core/actions.d.ts +69 -0
- package/dist/core/actions.js +495 -0
- package/dist/core/agent.d.ts +98 -0
- package/dist/core/agent.js +558 -0
- package/dist/core/answer.d.ts +42 -0
- package/dist/core/answer.js +395 -0
- package/dist/core/application-tracker.d.ts +84 -0
- package/dist/core/application-tracker.js +184 -0
- package/dist/core/apply.d.ts +162 -0
- package/dist/core/apply.js +816 -0
- package/dist/core/auth-detection.d.ts +35 -0
- package/dist/core/auth-detection.js +358 -0
- package/dist/core/auto-extract.d.ts +82 -0
- package/dist/core/auto-extract.js +604 -0
- package/dist/core/auto-interact.d.ts +23 -0
- package/dist/core/auto-interact.js +246 -0
- package/dist/core/bm25-filter.d.ts +66 -0
- package/dist/core/bm25-filter.js +288 -0
- package/dist/core/branding.d.ts +54 -0
- package/dist/core/branding.js +234 -0
- package/dist/core/browser-fetch.d.ts +323 -0
- package/dist/core/browser-fetch.js +1600 -0
- package/dist/core/browser-pool.d.ts +91 -0
- package/dist/core/browser-pool.js +550 -0
- package/dist/core/budget.d.ts +42 -0
- package/dist/core/budget.js +324 -0
- package/dist/core/business-intel.d.ts +47 -0
- package/dist/core/business-intel.js +279 -0
- package/dist/core/cache.d.ts +13 -0
- package/dist/core/cache.js +121 -0
- package/dist/core/cf-worker-proxy.d.ts +32 -0
- package/dist/core/cf-worker-proxy.js +87 -0
- package/dist/core/challenge-detection.d.ts +26 -0
- package/dist/core/challenge-detection.js +468 -0
- package/dist/core/change-tracking.d.ts +75 -0
- package/dist/core/change-tracking.js +276 -0
- package/dist/core/chunker.d.ts +46 -0
- package/dist/core/chunker.js +249 -0
- package/dist/core/chunking.d.ts +42 -0
- package/dist/core/chunking.js +181 -0
- package/dist/core/circuit-breaker.d.ts +44 -0
- package/dist/core/circuit-breaker.js +85 -0
- package/dist/core/content-pruner.d.ts +47 -0
- package/dist/core/content-pruner.js +425 -0
- package/dist/core/cookie-cache.d.ts +60 -0
- package/dist/core/cookie-cache.js +163 -0
- package/dist/core/crawl-checkpoint.d.ts +54 -0
- package/dist/core/crawl-checkpoint.js +104 -0
- package/dist/core/crawler.d.ts +84 -0
- package/dist/core/crawler.js +349 -0
- package/dist/core/cross-verify.d.ts +27 -0
- package/dist/core/cross-verify.js +93 -0
- package/dist/core/deep-fetch.d.ts +74 -0
- package/dist/core/deep-fetch.js +405 -0
- package/dist/core/deep-research.d.ts +141 -0
- package/dist/core/deep-research.js +972 -0
- package/dist/core/design-analysis.d.ts +70 -0
- package/dist/core/design-analysis.js +490 -0
- package/dist/core/design-compare.d.ts +38 -0
- package/dist/core/design-compare.js +264 -0
- package/dist/core/diff.d.ts +61 -0
- package/dist/core/diff.js +289 -0
- package/dist/core/dns-cache.d.ts +20 -0
- package/dist/core/dns-cache.js +198 -0
- package/dist/core/documents.d.ts +23 -0
- package/dist/core/documents.js +123 -0
- package/dist/core/domain-memory.d.ts +66 -0
- package/dist/core/domain-memory.js +163 -0
- package/dist/core/domain-verify.d.ts +40 -0
- package/dist/core/domain-verify.js +379 -0
- package/dist/core/engine-ranker.d.ts +112 -0
- package/dist/core/engine-ranker.js +395 -0
- package/dist/core/extract-inline.d.ts +38 -0
- package/dist/core/extract-inline.js +215 -0
- package/dist/core/extract-listings.d.ts +38 -0
- package/dist/core/extract-listings.js +461 -0
- package/dist/core/extract.d.ts +9 -0
- package/dist/core/extract.js +139 -0
- package/dist/core/fetch-cache.d.ts +57 -0
- package/dist/core/fetch-cache.js +95 -0
- package/dist/core/fetcher.d.ts +13 -0
- package/dist/core/fetcher.js +12 -0
- package/dist/core/google-cache.d.ts +29 -0
- package/dist/core/google-cache.js +180 -0
- package/dist/core/google-serp-parser.d.ts +82 -0
- package/dist/core/google-serp-parser.js +287 -0
- package/dist/core/hotel-search.d.ts +122 -0
- package/dist/core/hotel-search.js +382 -0
- package/dist/core/http-fetch.d.ts +72 -0
- package/dist/core/http-fetch.js +820 -0
- package/dist/core/human.d.ts +175 -0
- package/dist/core/human.js +680 -0
- package/dist/core/image-caption.d.ts +44 -0
- package/dist/core/image-caption.js +271 -0
- package/dist/core/jobs.d.ts +75 -0
- package/dist/core/jobs.js +634 -0
- package/dist/core/json-ld.d.ts +15 -0
- package/dist/core/json-ld.js +617 -0
- package/dist/core/language-detect.d.ts +18 -0
- package/dist/core/language-detect.js +135 -0
- package/dist/core/links.d.ts +10 -0
- package/dist/core/links.js +44 -0
- package/dist/core/llm-extract.d.ts +71 -0
- package/dist/core/llm-extract.js +507 -0
- package/dist/core/llm-provider.d.ts +100 -0
- package/dist/core/llm-provider.js +702 -0
- package/dist/core/local-search.d.ts +60 -0
- package/dist/core/local-search.js +308 -0
- package/dist/core/logger.d.ts +28 -0
- package/dist/core/logger.js +104 -0
- package/dist/core/map.d.ts +33 -0
- package/dist/core/map.js +127 -0
- package/dist/core/markdown.d.ts +92 -0
- package/dist/core/markdown.js +809 -0
- package/dist/core/metadata.d.ts +34 -0
- package/dist/core/metadata.js +422 -0
- package/dist/core/observe.d.ts +113 -0
- package/dist/core/observe.js +395 -0
- package/dist/core/ocr.d.ts +12 -0
- package/dist/core/ocr.js +33 -0
- package/dist/core/paginate.d.ts +31 -0
- package/dist/core/paginate.js +106 -0
- package/dist/core/pdf.d.ts +8 -0
- package/dist/core/pdf.js +25 -0
- package/dist/core/peel-tls.d.ts +25 -0
- package/dist/core/peel-tls.js +220 -0
- package/dist/core/pipeline.d.ts +132 -0
- package/dist/core/pipeline.js +1666 -0
- package/dist/core/profiles.d.ts +61 -0
- package/dist/core/profiles.js +350 -0
- package/dist/core/prompt-guard.d.ts +30 -0
- package/dist/core/prompt-guard.js +119 -0
- package/dist/core/proxy-config.d.ts +90 -0
- package/dist/core/proxy-config.js +172 -0
- package/dist/core/quick-answer.d.ts +53 -0
- package/dist/core/quick-answer.js +833 -0
- package/dist/core/rate-governor.d.ts +80 -0
- package/dist/core/rate-governor.js +238 -0
- package/dist/core/readability.d.ts +57 -0
- package/dist/core/readability.js +533 -0
- package/dist/core/research.d.ts +66 -0
- package/dist/core/research.js +270 -0
- package/dist/core/retry.d.ts +60 -0
- package/dist/core/retry.js +119 -0
- package/dist/core/safe-browsing.d.ts +30 -0
- package/dist/core/safe-browsing.js +206 -0
- package/dist/core/schema-extraction.d.ts +66 -0
- package/dist/core/schema-extraction.js +352 -0
- package/dist/core/schema-postprocess.d.ts +32 -0
- package/dist/core/schema-postprocess.js +469 -0
- package/dist/core/schema-templates.d.ts +19 -0
- package/dist/core/schema-templates.js +143 -0
- package/dist/core/screenshot.d.ts +224 -0
- package/dist/core/screenshot.js +207 -0
- package/dist/core/search-engines.d.ts +25 -0
- package/dist/core/search-engines.js +182 -0
- package/dist/core/search-provider.d.ts +243 -0
- package/dist/core/search-provider.js +1629 -0
- package/dist/core/searxng-provider.d.ts +35 -0
- package/dist/core/searxng-provider.js +105 -0
- package/dist/core/selective-evidence.d.ts +151 -0
- package/dist/core/selective-evidence.js +389 -0
- package/dist/core/site-search.d.ts +44 -0
- package/dist/core/site-search.js +252 -0
- package/dist/core/sitemap.d.ts +23 -0
- package/dist/core/sitemap.js +105 -0
- package/dist/core/source-credibility.d.ts +29 -0
- package/dist/core/source-credibility.js +584 -0
- package/dist/core/source-scoring.d.ts +166 -0
- package/dist/core/source-scoring.js +396 -0
- package/dist/core/stemmer.d.ts +38 -0
- package/dist/core/stemmer.js +509 -0
- package/dist/core/strategies.d.ts +104 -0
- package/dist/core/strategies.js +1044 -0
- package/dist/core/strategy-hooks.d.ts +145 -0
- package/dist/core/strategy-hooks.js +74 -0
- package/dist/core/structured-extract.d.ts +43 -0
- package/dist/core/structured-extract.js +550 -0
- package/dist/core/summarize.d.ts +17 -0
- package/dist/core/summarize.js +78 -0
- package/dist/core/synonyms.d.ts +42 -0
- package/dist/core/synonyms.js +184 -0
- package/dist/core/system-monitor.d.ts +61 -0
- package/dist/core/system-monitor.js +133 -0
- package/dist/core/table-format.d.ts +30 -0
- package/dist/core/table-format.js +146 -0
- package/dist/core/threat-feeds.d.ts +23 -0
- package/dist/core/threat-feeds.js +104 -0
- package/dist/core/timing.d.ts +21 -0
- package/dist/core/timing.js +33 -0
- package/dist/core/transcript-export.d.ts +47 -0
- package/dist/core/transcript-export.js +107 -0
- package/dist/core/user-agents.d.ts +82 -0
- package/dist/core/user-agents.js +239 -0
- package/dist/core/vertical-search.d.ts +54 -0
- package/dist/core/vertical-search.js +158 -0
- package/dist/core/watch-manager.d.ts +175 -0
- package/dist/core/watch-manager.js +416 -0
- package/dist/core/watch.d.ts +101 -0
- package/dist/core/watch.js +389 -0
- package/dist/core/youtube.d.ts +130 -0
- package/dist/core/youtube.js +1175 -0
- package/dist/ee/challenge-re-export.d.ts +1 -0
- package/dist/ee/challenge-re-export.js +1 -0
- package/dist/ee/challenge-solver.d.ts +72 -0
- package/dist/ee/challenge-solver.js +720 -0
- package/dist/ee/domain-extractors.d.ts +8 -0
- package/dist/ee/domain-extractors.js +8 -0
- package/dist/ee/domain-intel.d.ts +16 -0
- package/dist/ee/domain-intel.js +133 -0
- package/dist/ee/extractors/allrecipes.d.ts +2 -0
- package/dist/ee/extractors/allrecipes.js +120 -0
- package/dist/ee/extractors/amazon.d.ts +2 -0
- package/dist/ee/extractors/amazon.js +78 -0
- package/dist/ee/extractors/arxiv.d.ts +2 -0
- package/dist/ee/extractors/arxiv.js +137 -0
- package/dist/ee/extractors/bestbuy.d.ts +2 -0
- package/dist/ee/extractors/bestbuy.js +78 -0
- package/dist/ee/extractors/carscom.d.ts +2 -0
- package/dist/ee/extractors/carscom.js +121 -0
- package/dist/ee/extractors/coingecko.d.ts +2 -0
- package/dist/ee/extractors/coingecko.js +134 -0
- package/dist/ee/extractors/craigslist.d.ts +2 -0
- package/dist/ee/extractors/craigslist.js +92 -0
- package/dist/ee/extractors/devto.d.ts +2 -0
- package/dist/ee/extractors/devto.js +135 -0
- package/dist/ee/extractors/ebay.d.ts +2 -0
- package/dist/ee/extractors/ebay.js +90 -0
- package/dist/ee/extractors/espn.d.ts +2 -0
- package/dist/ee/extractors/espn.js +260 -0
- package/dist/ee/extractors/etsy.d.ts +2 -0
- package/dist/ee/extractors/etsy.js +52 -0
- package/dist/ee/extractors/facebook.d.ts +2 -0
- package/dist/ee/extractors/facebook.js +46 -0
- package/dist/ee/extractors/github.d.ts +2 -0
- package/dist/ee/extractors/github.js +196 -0
- package/dist/ee/extractors/google-flights.d.ts +2 -0
- package/dist/ee/extractors/google-flights.js +176 -0
- package/dist/ee/extractors/hackernews.d.ts +2 -0
- package/dist/ee/extractors/hackernews.js +147 -0
- package/dist/ee/extractors/imdb.d.ts +2 -0
- package/dist/ee/extractors/imdb.js +172 -0
- package/dist/ee/extractors/index.d.ts +26 -0
- package/dist/ee/extractors/index.js +247 -0
- package/dist/ee/extractors/instagram.d.ts +2 -0
- package/dist/ee/extractors/instagram.js +102 -0
- package/dist/ee/extractors/kalshi.d.ts +2 -0
- package/dist/ee/extractors/kalshi.js +121 -0
- package/dist/ee/extractors/kayak-cars.d.ts +2 -0
- package/dist/ee/extractors/kayak-cars.js +270 -0
- package/dist/ee/extractors/linkedin.d.ts +2 -0
- package/dist/ee/extractors/linkedin.js +113 -0
- package/dist/ee/extractors/medium.d.ts +2 -0
- package/dist/ee/extractors/medium.js +130 -0
- package/dist/ee/extractors/news.d.ts +4 -0
- package/dist/ee/extractors/news.js +173 -0
- package/dist/ee/extractors/npm.d.ts +2 -0
- package/dist/ee/extractors/npm.js +86 -0
- package/dist/ee/extractors/pdf.d.ts +2 -0
- package/dist/ee/extractors/pdf.js +108 -0
- package/dist/ee/extractors/pinterest.d.ts +2 -0
- package/dist/ee/extractors/pinterest.js +34 -0
- package/dist/ee/extractors/polymarket.d.ts +2 -0
- package/dist/ee/extractors/polymarket.js +358 -0
- package/dist/ee/extractors/producthunt.d.ts +2 -0
- package/dist/ee/extractors/producthunt.js +88 -0
- package/dist/ee/extractors/pubmed.d.ts +2 -0
- package/dist/ee/extractors/pubmed.js +162 -0
- package/dist/ee/extractors/pypi.d.ts +2 -0
- package/dist/ee/extractors/pypi.js +80 -0
- package/dist/ee/extractors/reddit.d.ts +2 -0
- package/dist/ee/extractors/reddit.js +438 -0
- package/dist/ee/extractors/redfin.d.ts +2 -0
- package/dist/ee/extractors/redfin.js +156 -0
- package/dist/ee/extractors/semanticscholar.d.ts +2 -0
- package/dist/ee/extractors/semanticscholar.js +131 -0
- package/dist/ee/extractors/shared.d.ts +12 -0
- package/dist/ee/extractors/shared.js +76 -0
- package/dist/ee/extractors/soundcloud.d.ts +2 -0
- package/dist/ee/extractors/soundcloud.js +34 -0
- package/dist/ee/extractors/sportsbetting.d.ts +2 -0
- package/dist/ee/extractors/sportsbetting.js +37 -0
- package/dist/ee/extractors/spotify.d.ts +2 -0
- package/dist/ee/extractors/spotify.js +34 -0
- package/dist/ee/extractors/stackoverflow.d.ts +2 -0
- package/dist/ee/extractors/stackoverflow.js +61 -0
- package/dist/ee/extractors/substack.d.ts +2 -0
- package/dist/ee/extractors/substack.js +115 -0
- package/dist/ee/extractors/substackroot.d.ts +2 -0
- package/dist/ee/extractors/substackroot.js +46 -0
- package/dist/ee/extractors/tiktok.d.ts +2 -0
- package/dist/ee/extractors/tiktok.js +29 -0
- package/dist/ee/extractors/tradingview.d.ts +2 -0
- package/dist/ee/extractors/tradingview.js +182 -0
- package/dist/ee/extractors/twitch.d.ts +2 -0
- package/dist/ee/extractors/twitch.js +36 -0
- package/dist/ee/extractors/twitter.d.ts +2 -0
- package/dist/ee/extractors/twitter.js +327 -0
- package/dist/ee/extractors/types.d.ts +14 -0
- package/dist/ee/extractors/types.js +1 -0
- package/dist/ee/extractors/walmart.d.ts +2 -0
- package/dist/ee/extractors/walmart.js +50 -0
- package/dist/ee/extractors/weather.d.ts +2 -0
- package/dist/ee/extractors/weather.js +133 -0
- package/dist/ee/extractors/wikipedia.d.ts +4 -0
- package/dist/ee/extractors/wikipedia.js +235 -0
- package/dist/ee/extractors/yelp.d.ts +2 -0
- package/dist/ee/extractors/yelp.js +216 -0
- package/dist/ee/extractors/youtube.d.ts +2 -0
- package/dist/ee/extractors/youtube.js +189 -0
- package/dist/ee/extractors/zillow.d.ts +54 -0
- package/dist/ee/extractors/zillow.js +247 -0
- package/dist/ee/extractors-re-export.d.ts +1 -0
- package/dist/ee/extractors-re-export.js +1 -0
- package/dist/ee/premium-hooks.d.ts +20 -0
- package/dist/ee/premium-hooks.js +50 -0
- package/dist/ee/spa-detection.d.ts +2 -0
- package/dist/ee/spa-detection.js +2 -0
- package/dist/ee/stability.d.ts +4 -0
- package/dist/ee/stability.js +29 -0
- package/dist/ee/swr-cache.d.ts +14 -0
- package/dist/ee/swr-cache.js +34 -0
- package/dist/index.d.ts +143 -0
- package/dist/index.js +291 -0
- package/dist/integrations/index.d.ts +2 -0
- package/dist/integrations/index.js +2 -0
- package/dist/integrations/langchain.d.ts +64 -0
- package/dist/integrations/langchain.js +115 -0
- package/dist/integrations/llamaindex.d.ts +50 -0
- package/dist/integrations/llamaindex.js +91 -0
- package/dist/mcp/handlers/act.d.ts +5 -0
- package/dist/mcp/handlers/act.js +34 -0
- package/dist/mcp/handlers/definitions.d.ts +6 -0
- package/dist/mcp/handlers/definitions.js +395 -0
- package/dist/mcp/handlers/extract.d.ts +7 -0
- package/dist/mcp/handlers/extract.js +135 -0
- package/dist/mcp/handlers/fetch.d.ts +6 -0
- package/dist/mcp/handlers/fetch.js +98 -0
- package/dist/mcp/handlers/find.d.ts +5 -0
- package/dist/mcp/handlers/find.js +137 -0
- package/dist/mcp/handlers/index.d.ts +13 -0
- package/dist/mcp/handlers/index.js +63 -0
- package/dist/mcp/handlers/legacy.d.ts +25 -0
- package/dist/mcp/handlers/legacy.js +450 -0
- package/dist/mcp/handlers/meta.d.ts +6 -0
- package/dist/mcp/handlers/meta.js +40 -0
- package/dist/mcp/handlers/monitor.d.ts +5 -0
- package/dist/mcp/handlers/monitor.js +41 -0
- package/dist/mcp/handlers/observe.d.ts +8 -0
- package/dist/mcp/handlers/observe.js +37 -0
- package/dist/mcp/handlers/read.d.ts +6 -0
- package/dist/mcp/handlers/read.js +78 -0
- package/dist/mcp/handlers/see.d.ts +5 -0
- package/dist/mcp/handlers/see.js +75 -0
- package/dist/mcp/handlers/types.d.ts +29 -0
- package/dist/mcp/handlers/types.js +28 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.js +108 -0
- package/dist/mcp/smart-router.d.ts +23 -0
- package/dist/mcp/smart-router.js +178 -0
- package/dist/server/app.d.ts +14 -0
- package/dist/server/app.js +632 -0
- package/dist/server/auth-store.d.ts +28 -0
- package/dist/server/auth-store.js +88 -0
- package/dist/server/bull-queues.d.ts +60 -0
- package/dist/server/bull-queues.js +90 -0
- package/dist/server/email-service.d.ts +55 -0
- package/dist/server/email-service.js +291 -0
- package/dist/server/job-queue.d.ts +100 -0
- package/dist/server/job-queue.js +145 -0
- package/dist/server/logger.d.ts +10 -0
- package/dist/server/logger.js +37 -0
- package/dist/server/middleware/audit-log.d.ts +14 -0
- package/dist/server/middleware/audit-log.js +73 -0
- package/dist/server/middleware/auth.d.ts +35 -0
- package/dist/server/middleware/auth.js +225 -0
- package/dist/server/middleware/rate-limit.d.ts +50 -0
- package/dist/server/middleware/rate-limit.js +270 -0
- package/dist/server/middleware/scope-guard.d.ts +25 -0
- package/dist/server/middleware/scope-guard.js +45 -0
- package/dist/server/middleware/url-validator.d.ts +15 -0
- package/dist/server/middleware/url-validator.js +201 -0
- package/dist/server/openapi.yaml +6418 -0
- package/dist/server/pg-auth-store.d.ts +146 -0
- package/dist/server/pg-auth-store.js +576 -0
- package/dist/server/pg-job-queue.d.ts +59 -0
- package/dist/server/pg-job-queue.js +375 -0
- package/dist/server/routes/activity.d.ts +6 -0
- package/dist/server/routes/activity.js +79 -0
- package/dist/server/routes/admin-active.d.ts +7 -0
- package/dist/server/routes/admin-active.js +120 -0
- package/dist/server/routes/admin-stats.d.ts +7 -0
- package/dist/server/routes/admin-stats.js +176 -0
- package/dist/server/routes/agent.d.ts +24 -0
- package/dist/server/routes/agent.js +480 -0
- package/dist/server/routes/answer.d.ts +5 -0
- package/dist/server/routes/answer.js +125 -0
- package/dist/server/routes/ask.d.ts +28 -0
- package/dist/server/routes/ask.js +295 -0
- package/dist/server/routes/batch.d.ts +6 -0
- package/dist/server/routes/batch.js +493 -0
- package/dist/server/routes/cache-warm.d.ts +25 -0
- package/dist/server/routes/cache-warm.js +212 -0
- package/dist/server/routes/cli-usage.d.ts +6 -0
- package/dist/server/routes/cli-usage.js +127 -0
- package/dist/server/routes/compat.d.ts +23 -0
- package/dist/server/routes/compat.js +652 -0
- package/dist/server/routes/crawl.d.ts +13 -0
- package/dist/server/routes/crawl.js +287 -0
- package/dist/server/routes/deep-fetch.d.ts +8 -0
- package/dist/server/routes/deep-fetch.js +57 -0
- package/dist/server/routes/deep-research.d.ts +11 -0
- package/dist/server/routes/deep-research.js +232 -0
- package/dist/server/routes/demo.d.ts +24 -0
- package/dist/server/routes/demo.js +517 -0
- package/dist/server/routes/do.d.ts +8 -0
- package/dist/server/routes/do.js +72 -0
- package/dist/server/routes/extract.d.ts +14 -0
- package/dist/server/routes/extract.js +325 -0
- package/dist/server/routes/feed.d.ts +15 -0
- package/dist/server/routes/feed.js +311 -0
- package/dist/server/routes/fetch-queue.d.ts +13 -0
- package/dist/server/routes/fetch-queue.js +357 -0
- package/dist/server/routes/fetch.d.ts +7 -0
- package/dist/server/routes/fetch.js +1274 -0
- package/dist/server/routes/go.d.ts +14 -0
- package/dist/server/routes/go.js +81 -0
- package/dist/server/routes/health.d.ts +11 -0
- package/dist/server/routes/health.js +141 -0
- package/dist/server/routes/jobs.d.ts +7 -0
- package/dist/server/routes/jobs.js +574 -0
- package/dist/server/routes/map.d.ts +11 -0
- package/dist/server/routes/map.js +116 -0
- package/dist/server/routes/mcp.d.ts +14 -0
- package/dist/server/routes/mcp.js +197 -0
- package/dist/server/routes/metrics.d.ts +37 -0
- package/dist/server/routes/metrics.js +149 -0
- package/dist/server/routes/oauth.d.ts +9 -0
- package/dist/server/routes/oauth.js +396 -0
- package/dist/server/routes/playground.d.ts +17 -0
- package/dist/server/routes/playground.js +283 -0
- package/dist/server/routes/reader.d.ts +18 -0
- package/dist/server/routes/reader.js +192 -0
- package/dist/server/routes/research.d.ts +14 -0
- package/dist/server/routes/research.js +482 -0
- package/dist/server/routes/screenshot.d.ts +22 -0
- package/dist/server/routes/screenshot.js +820 -0
- package/dist/server/routes/search.d.ts +6 -0
- package/dist/server/routes/search.js +874 -0
- package/dist/server/routes/session.d.ts +17 -0
- package/dist/server/routes/session.js +548 -0
- package/dist/server/routes/share.d.ts +18 -0
- package/dist/server/routes/share.js +462 -0
- package/dist/server/routes/smart-search/handlers/cars.d.ts +2 -0
- package/dist/server/routes/smart-search/handlers/cars.js +102 -0
- package/dist/server/routes/smart-search/handlers/flights.d.ts +2 -0
- package/dist/server/routes/smart-search/handlers/flights.js +72 -0
- package/dist/server/routes/smart-search/handlers/general.d.ts +13 -0
- package/dist/server/routes/smart-search/handlers/general.js +717 -0
- package/dist/server/routes/smart-search/handlers/hotels.d.ts +2 -0
- package/dist/server/routes/smart-search/handlers/hotels.js +88 -0
- package/dist/server/routes/smart-search/handlers/products.d.ts +2 -0
- package/dist/server/routes/smart-search/handlers/products.js +1309 -0
- package/dist/server/routes/smart-search/handlers/rental.d.ts +2 -0
- package/dist/server/routes/smart-search/handlers/rental.js +154 -0
- package/dist/server/routes/smart-search/handlers/restaurants.d.ts +2 -0
- package/dist/server/routes/smart-search/handlers/restaurants.js +225 -0
- package/dist/server/routes/smart-search/handlers/transit-verdict.d.ts +41 -0
- package/dist/server/routes/smart-search/handlers/transit-verdict.js +224 -0
- package/dist/server/routes/smart-search/index.d.ts +19 -0
- package/dist/server/routes/smart-search/index.js +546 -0
- package/dist/server/routes/smart-search/intent.d.ts +3 -0
- package/dist/server/routes/smart-search/intent.js +264 -0
- package/dist/server/routes/smart-search/llm.d.ts +16 -0
- package/dist/server/routes/smart-search/llm.js +70 -0
- package/dist/server/routes/smart-search/sources/reddit.d.ts +18 -0
- package/dist/server/routes/smart-search/sources/reddit.js +34 -0
- package/dist/server/routes/smart-search/sources/yelp.d.ts +25 -0
- package/dist/server/routes/smart-search/sources/yelp.js +171 -0
- package/dist/server/routes/smart-search/sources/youtube.d.ts +8 -0
- package/dist/server/routes/smart-search/sources/youtube.js +9 -0
- package/dist/server/routes/smart-search/types.d.ts +81 -0
- package/dist/server/routes/smart-search/types.js +1 -0
- package/dist/server/routes/smart-search/utils.d.ts +20 -0
- package/dist/server/routes/smart-search/utils.js +146 -0
- package/dist/server/routes/stats.d.ts +6 -0
- package/dist/server/routes/stats.js +71 -0
- package/dist/server/routes/stripe.d.ts +15 -0
- package/dist/server/routes/stripe.js +296 -0
- package/dist/server/routes/transcript-export.d.ts +10 -0
- package/dist/server/routes/transcript-export.js +178 -0
- package/dist/server/routes/usage.d.ts +9 -0
- package/dist/server/routes/usage.js +279 -0
- package/dist/server/routes/users.d.ts +8 -0
- package/dist/server/routes/users.js +1867 -0
- package/dist/server/routes/watch.d.ts +15 -0
- package/dist/server/routes/watch.js +309 -0
- package/dist/server/routes/webhooks.d.ts +26 -0
- package/dist/server/routes/webhooks.js +170 -0
- package/dist/server/routes/youtube.d.ts +6 -0
- package/dist/server/routes/youtube.js +130 -0
- package/dist/server/sentry.d.ts +14 -0
- package/dist/server/sentry.js +104 -0
- package/dist/server/types.d.ts +15 -0
- package/dist/server/types.js +7 -0
- package/dist/server/utils/response.d.ts +44 -0
- package/dist/server/utils/response.js +69 -0
- package/dist/server/utils/sse.d.ts +22 -0
- package/dist/server/utils/sse.js +38 -0
- package/dist/types.d.ts +552 -0
- package/dist/types.js +39 -0
- package/llms.txt +105 -0
- package/package.json +189 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* handleSee — take a screenshot, optionally with design analysis or comparison.
|
|
3
|
+
*/
|
|
4
|
+
import { textResult, safeStringify, timeout } from './types.js';
|
|
5
|
+
export const handleSee = async (args, _ctx) => {
|
|
6
|
+
const url = args['url'];
|
|
7
|
+
if (!url || typeof url !== 'string')
|
|
8
|
+
throw new Error('url is required');
|
|
9
|
+
if (url.length > 2048)
|
|
10
|
+
throw new Error('URL too long (max 2048 characters)');
|
|
11
|
+
const mode = args['mode'] || 'screenshot';
|
|
12
|
+
const compareUrl = args['compare_url'];
|
|
13
|
+
const fullPage = args['full_page'] || false;
|
|
14
|
+
const viewportArg = args['viewport'];
|
|
15
|
+
// Resolve viewport dimensions
|
|
16
|
+
let width = 1280;
|
|
17
|
+
let height = 720;
|
|
18
|
+
if (viewportArg && typeof viewportArg === 'object' && !Array.isArray(viewportArg)) {
|
|
19
|
+
const vp = viewportArg;
|
|
20
|
+
width = vp.width ?? 1280;
|
|
21
|
+
height = vp.height ?? 720;
|
|
22
|
+
}
|
|
23
|
+
else if (viewportArg === 'mobile') {
|
|
24
|
+
width = 390;
|
|
25
|
+
height = 844;
|
|
26
|
+
}
|
|
27
|
+
else if (viewportArg === 'tablet') {
|
|
28
|
+
width = 768;
|
|
29
|
+
height = 1024;
|
|
30
|
+
}
|
|
31
|
+
// Secondary object check (handles smart router viewport object)
|
|
32
|
+
if (args['viewport'] && typeof args['viewport'] === 'object') {
|
|
33
|
+
const vp = args['viewport'];
|
|
34
|
+
if (vp.width)
|
|
35
|
+
width = vp.width;
|
|
36
|
+
if (vp.height)
|
|
37
|
+
height = vp.height;
|
|
38
|
+
}
|
|
39
|
+
if (mode === 'design') {
|
|
40
|
+
const { browserDesignAnalysis } = await import('../../core/fetcher.js');
|
|
41
|
+
const result = await Promise.race([
|
|
42
|
+
browserDesignAnalysis(url, { width, height }),
|
|
43
|
+
timeout(90000, 'Design analysis'),
|
|
44
|
+
]);
|
|
45
|
+
return textResult(safeStringify({ url: result.finalUrl, mode: 'design', analysis: result.analysis }));
|
|
46
|
+
}
|
|
47
|
+
if (mode === 'compare' && compareUrl) {
|
|
48
|
+
const { browserDiff } = await import('../../core/fetcher.js');
|
|
49
|
+
const diff = await Promise.race([
|
|
50
|
+
browserDiff(url, compareUrl, { width, height, fullPage }),
|
|
51
|
+
timeout(90000, 'Design compare'),
|
|
52
|
+
]);
|
|
53
|
+
return textResult(safeStringify({
|
|
54
|
+
url,
|
|
55
|
+
compare_url: compareUrl,
|
|
56
|
+
mode: 'compare',
|
|
57
|
+
diffPixels: diff.diffPixels,
|
|
58
|
+
totalPixels: diff.totalPixels,
|
|
59
|
+
diffPercent: diff.diffPercent,
|
|
60
|
+
screenshot: diff.diffBuffer.toString('base64'),
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
// Default: screenshot
|
|
64
|
+
const { takeScreenshot } = await import('../../core/screenshot.js');
|
|
65
|
+
const result = await Promise.race([
|
|
66
|
+
takeScreenshot(url, { fullPage, width, height, format: 'png' }),
|
|
67
|
+
timeout(60000, 'Screenshot'),
|
|
68
|
+
]);
|
|
69
|
+
return textResult(safeStringify({
|
|
70
|
+
url: result.url,
|
|
71
|
+
mode: 'screenshot',
|
|
72
|
+
screenshot: result.screenshot,
|
|
73
|
+
format: result.format,
|
|
74
|
+
}));
|
|
75
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for MCP handlers.
|
|
3
|
+
* Both the standalone MCP server and HTTP MCP route import from here.
|
|
4
|
+
*/
|
|
5
|
+
export interface McpToolResult {
|
|
6
|
+
content: Array<{
|
|
7
|
+
type: 'text';
|
|
8
|
+
text: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'image';
|
|
11
|
+
data: string;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
}>;
|
|
14
|
+
isError?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface McpContext {
|
|
17
|
+
accountId?: string;
|
|
18
|
+
/** pg.Pool passed by the HTTP route for webpeel_watch */
|
|
19
|
+
pool?: unknown;
|
|
20
|
+
}
|
|
21
|
+
export type McpHandler = (args: Record<string, unknown>, ctx?: McpContext) => Promise<McpToolResult>;
|
|
22
|
+
/** Wrap a JSON-serialized string in a text content block. */
|
|
23
|
+
export declare function textResult(text: string): McpToolResult;
|
|
24
|
+
/** Wrap an error message in a text content block with isError=true. */
|
|
25
|
+
export declare function errorResult(message: string): McpToolResult;
|
|
26
|
+
/** Safely JSON-stringify any value; falls back to String() on error. */
|
|
27
|
+
export declare function safeStringify(obj: unknown): string;
|
|
28
|
+
/** Generic timeout promise. */
|
|
29
|
+
export declare function timeout<T>(ms: number, label: string): Promise<T>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for MCP handlers.
|
|
3
|
+
* Both the standalone MCP server and HTTP MCP route import from here.
|
|
4
|
+
*/
|
|
5
|
+
/** Wrap a JSON-serialized string in a text content block. */
|
|
6
|
+
export function textResult(text) {
|
|
7
|
+
return { content: [{ type: 'text', text }] };
|
|
8
|
+
}
|
|
9
|
+
/** Wrap an error message in a text content block with isError=true. */
|
|
10
|
+
export function errorResult(message) {
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: 'text', text: JSON.stringify({ error: message }) }],
|
|
13
|
+
isError: true,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Safely JSON-stringify any value; falls back to String() on error. */
|
|
17
|
+
export function safeStringify(obj) {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.stringify(obj, null, 2);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return String(obj);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Generic timeout promise. */
|
|
26
|
+
export function timeout(ms, label) {
|
|
27
|
+
return new Promise((_, reject) => setTimeout(() => reject(new Error(`${label} timed out after ${ms / 1000}s`)), ms));
|
|
28
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server for WebPeel — stdio transport.
|
|
4
|
+
* Thin wrapper: imports from the shared handler registry in ./handlers/.
|
|
5
|
+
* All tool logic lives in src/mcp/handlers/*.ts.
|
|
6
|
+
*/
|
|
7
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
10
|
+
import { readFileSync } from 'fs';
|
|
11
|
+
import { join, dirname } from 'path';
|
|
12
|
+
import { fileURLToPath } from 'url';
|
|
13
|
+
import { getHandler } from './handlers/index.js';
|
|
14
|
+
import { toolDefinitions } from './handlers/definitions.js';
|
|
15
|
+
// Read version from package.json
|
|
16
|
+
let pkgVersion = '0.3.1';
|
|
17
|
+
try {
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = dirname(__filename);
|
|
20
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf-8'));
|
|
21
|
+
pkgVersion = pkg.version;
|
|
22
|
+
}
|
|
23
|
+
catch { /* fallback */ }
|
|
24
|
+
// ── Server setup ───────────────────────────────────────────────────────────
|
|
25
|
+
const server = new Server({ name: 'webpeel', version: pkgVersion }, { capabilities: { tools: {} } });
|
|
26
|
+
// ── tools/list — return the 7 public tool definitions ─────────────────────
|
|
27
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
28
|
+
tools: toolDefinitions,
|
|
29
|
+
}));
|
|
30
|
+
// ── tools/call — dispatch to shared handler registry ──────────────────────
|
|
31
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
32
|
+
const { name, arguments: rawArgs } = request.params;
|
|
33
|
+
const args = (rawArgs || {});
|
|
34
|
+
try {
|
|
35
|
+
const handler = getHandler(name);
|
|
36
|
+
if (!handler)
|
|
37
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
38
|
+
// Standalone has no accountId / pool context
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
return (await handler(args));
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const err = error;
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: 'text',
|
|
48
|
+
text: JSON.stringify({
|
|
49
|
+
error: err.name || 'Error',
|
|
50
|
+
message: err.message || 'Unknown error',
|
|
51
|
+
}),
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
isError: true,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// ── Main — stdio or HTTP mode ──────────────────────────────────────────────
|
|
59
|
+
async function main() {
|
|
60
|
+
const isHttpMode = process.env['MCP_HTTP_MODE'] === 'true' ||
|
|
61
|
+
process.env['HTTP_STREAMABLE_SERVER'] === 'true';
|
|
62
|
+
if (isHttpMode) {
|
|
63
|
+
const { StreamableHTTPServerTransport } = await import('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
64
|
+
const express = await import('express');
|
|
65
|
+
const httpApp = express.default();
|
|
66
|
+
httpApp.use(express.default.json({ limit: '1mb' }));
|
|
67
|
+
httpApp.post('/v2/mcp', async (req, res) => {
|
|
68
|
+
const r = req;
|
|
69
|
+
const s = res;
|
|
70
|
+
try {
|
|
71
|
+
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
72
|
+
await server.connect(transport);
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
74
|
+
await transport.handleRequest(r, s, r.body);
|
|
75
|
+
transport.close().catch(() => { });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
if (!s.headersSent) {
|
|
79
|
+
s.status(500).json({
|
|
80
|
+
jsonrpc: '2.0',
|
|
81
|
+
error: { code: -32603, message: 'Internal error' },
|
|
82
|
+
id: null,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
httpApp.get('/v2/mcp', (_req, res) => {
|
|
88
|
+
res.status(405).json({
|
|
89
|
+
jsonrpc: '2.0',
|
|
90
|
+
error: { code: -32000, message: 'Use POST to send MCP messages.' },
|
|
91
|
+
id: null,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
const port = parseInt(process.env['MCP_PORT'] || '3100', 10);
|
|
95
|
+
httpApp.listen(port, () => {
|
|
96
|
+
process.stderr.write(`WebPeel MCP server (HTTP) listening on port ${port}\n`);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const transport = new StdioServerTransport();
|
|
101
|
+
await server.connect(transport);
|
|
102
|
+
process.stderr.write('WebPeel MCP server running on stdio\n');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
main().catch((error) => {
|
|
106
|
+
process.stderr.write(`Fatal error: ${error}\n`);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Router — Natural language intent parser for WebPeel.
|
|
3
|
+
* Rule-based keyword matching. No LLM required.
|
|
4
|
+
*/
|
|
5
|
+
export interface ParsedIntent {
|
|
6
|
+
intent: 'read' | 'see' | 'find' | 'extract' | 'monitor' | 'act';
|
|
7
|
+
url?: string;
|
|
8
|
+
query?: string;
|
|
9
|
+
params: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
/** Extract the first URL from a task string (http/https or domain-like). */
|
|
12
|
+
export declare function extractUrl(task: string): string | undefined;
|
|
13
|
+
/** Extract all URLs from a task string. */
|
|
14
|
+
export declare function extractAllUrls(task: string): string[];
|
|
15
|
+
/** Detect the primary intent from a task string. */
|
|
16
|
+
export declare function detectIntent(task: string): ParsedIntent['intent'];
|
|
17
|
+
/**
|
|
18
|
+
* Parse a natural language task string into a structured intent.
|
|
19
|
+
*
|
|
20
|
+
* @param task - Plain English description of what you want to do.
|
|
21
|
+
* @returns ParsedIntent with intent, optional url, optional query, and params.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseIntent(task: string): ParsedIntent;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Router — Natural language intent parser for WebPeel.
|
|
3
|
+
* Rule-based keyword matching. No LLM required.
|
|
4
|
+
*/
|
|
5
|
+
// Multi-word phrases must be checked before single-word keywords to avoid false matches
|
|
6
|
+
const MULTI_WORD_PATTERNS = [
|
|
7
|
+
{ intent: 'act', pattern: /\bsign[\s-]up\b/ },
|
|
8
|
+
{ intent: 'find', pattern: /\blook\s+up\b/ },
|
|
9
|
+
{ intent: 'extract', pattern: /\bget\s+data\b/ },
|
|
10
|
+
{ intent: 'read', pattern: /\bwhat\s+does\b/ },
|
|
11
|
+
// Question-as-search: "what is X", "how much does Y cost", "who is Z", etc.
|
|
12
|
+
// Must come AFTER "what does" (read) so that pattern takes priority.
|
|
13
|
+
{ intent: 'find', pattern: /^\s*(?:what\s+(?:is|are|was|were|can|will|would|could|should)|how\s+(?:much|many|do|does|did|to|can|are|is)|who\s+(?:is|are|was)|when\s+(?:is|was|does|do)|where\s+(?:is|can|do|are)|why\s+(?:is|does|do|can)|which\s+(?:is|are))\b/i },
|
|
14
|
+
];
|
|
15
|
+
// Single-word keywords in descending priority order
|
|
16
|
+
// act > monitor > extract > see > find > read
|
|
17
|
+
const KEYWORD_INTENTS = [
|
|
18
|
+
{
|
|
19
|
+
intent: 'act',
|
|
20
|
+
keywords: ['click', 'fill', 'submit', 'navigate', 'type', 'login', 'interact', 'press', 'select'],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
intent: 'monitor',
|
|
24
|
+
keywords: ['watch', 'monitor', 'track', 'alert', 'notify', 'change', 'diff'],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
intent: 'extract',
|
|
28
|
+
keywords: ['extract', 'scrape', 'pull', 'fields', 'schema', 'price', 'structured', 'brand', 'logo', 'colors'],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
intent: 'see',
|
|
32
|
+
keywords: ['screenshot', 'see', 'show', 'look', 'visual', 'image', 'capture', 'design', 'compare'],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
intent: 'find',
|
|
36
|
+
keywords: ['find', 'search', 'google', 'research', 'discover', 'map', 'sitemap'],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
intent: 'read',
|
|
40
|
+
keywords: ['read', 'fetch', 'get', 'content', 'text', 'markdown', 'summarize', 'summary', 'answer', 'question'],
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
// TLD pattern used for domain detection
|
|
44
|
+
const KNOWN_TLDS = 'com|org|net|io|co|dev|ai|app|info|uk|de|fr|jp|cn|us|edu|gov|me|tv|cc|ly|gg|sh|tech|online|site|xyz|store|cloud|api|blog|news';
|
|
45
|
+
const DOMAIN_RE = new RegExp(`\\b(?:[a-zA-Z0-9-]+\\.)+(?:${KNOWN_TLDS})\\b(?:\\/[^\\s"'<>)]*)?`, 'i');
|
|
46
|
+
const DOMAIN_RE_GLOBAL = new RegExp(`\\b(?:[a-zA-Z0-9-]+\\.)+(?:${KNOWN_TLDS})\\b(?:\\/[^\\s"'<>)]*)?`, 'gi');
|
|
47
|
+
/** Strip trailing punctuation from a URL string. */
|
|
48
|
+
function stripTrailing(url) {
|
|
49
|
+
return url.replace(/[.,;:!?]+$/, '');
|
|
50
|
+
}
|
|
51
|
+
/** Extract the first URL from a task string (http/https or domain-like). */
|
|
52
|
+
export function extractUrl(task) {
|
|
53
|
+
// Prefer explicit http/https URLs
|
|
54
|
+
const httpMatch = task.match(/https?:\/\/[^\s"'<>)]+/);
|
|
55
|
+
if (httpMatch)
|
|
56
|
+
return stripTrailing(httpMatch[0]);
|
|
57
|
+
// Fall back to domain-like patterns
|
|
58
|
+
const domainMatch = task.match(DOMAIN_RE);
|
|
59
|
+
if (domainMatch)
|
|
60
|
+
return stripTrailing(`https://${domainMatch[0]}`);
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
/** Extract all URLs from a task string. */
|
|
64
|
+
export function extractAllUrls(task) {
|
|
65
|
+
const urls = [];
|
|
66
|
+
const httpMatches = task.match(/https?:\/\/[^\s"'<>)]+/g);
|
|
67
|
+
if (httpMatches) {
|
|
68
|
+
// If explicit URLs found, don't also add domain-only matches
|
|
69
|
+
return httpMatches.map(stripTrailing);
|
|
70
|
+
}
|
|
71
|
+
let m;
|
|
72
|
+
DOMAIN_RE_GLOBAL.lastIndex = 0;
|
|
73
|
+
while ((m = DOMAIN_RE_GLOBAL.exec(task)) !== null) {
|
|
74
|
+
urls.push(stripTrailing(`https://${m[0]}`));
|
|
75
|
+
}
|
|
76
|
+
return urls;
|
|
77
|
+
}
|
|
78
|
+
/** For find intent: strip the URL and intent verbs, returning the bare query. */
|
|
79
|
+
function extractFindQuery(task, url) {
|
|
80
|
+
let q = task;
|
|
81
|
+
// Remove http/https URL
|
|
82
|
+
if (url?.startsWith('http')) {
|
|
83
|
+
q = q.replace(url, '');
|
|
84
|
+
}
|
|
85
|
+
else if (url) {
|
|
86
|
+
// Remove the raw domain portion
|
|
87
|
+
const raw = url.replace(/^https?:\/\//, '');
|
|
88
|
+
q = q.replace(new RegExp(raw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'), '');
|
|
89
|
+
}
|
|
90
|
+
// Remove domain-like patterns that didn't become the primary URL
|
|
91
|
+
q = q.replace(DOMAIN_RE_GLOBAL, '');
|
|
92
|
+
// Remove intent verbs and stop words
|
|
93
|
+
q = q
|
|
94
|
+
.replace(/\b(find|search\s+(?:for\s+|the\s+)?|google|look\s+up|research|discover|map|sitemap|for)\b/gi, '')
|
|
95
|
+
.replace(/\s{2,}/g, ' ')
|
|
96
|
+
.trim();
|
|
97
|
+
return q || undefined;
|
|
98
|
+
}
|
|
99
|
+
/** Extract viewport, format, and other params from natural language. */
|
|
100
|
+
function extractParams(task) {
|
|
101
|
+
const params = {};
|
|
102
|
+
const lower = task.toLowerCase();
|
|
103
|
+
if (/\bon\s+mobile\b/.test(lower)) {
|
|
104
|
+
params['viewport'] = { width: 390, height: 844 };
|
|
105
|
+
}
|
|
106
|
+
else if (/\bon\s+tablet\b/.test(lower)) {
|
|
107
|
+
params['viewport'] = { width: 768, height: 1024 };
|
|
108
|
+
}
|
|
109
|
+
if (/\bfull[\s-]?page\b/.test(lower)) {
|
|
110
|
+
params['fullPage'] = true;
|
|
111
|
+
}
|
|
112
|
+
if (/\bas\s+json\b/.test(lower) || /\bstructured\b/.test(lower)) {
|
|
113
|
+
params['format'] = 'json';
|
|
114
|
+
}
|
|
115
|
+
if (/\bsummar(?:y|ize|izing)\b/.test(lower)) {
|
|
116
|
+
params['summary'] = true;
|
|
117
|
+
}
|
|
118
|
+
return params;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Strip all URLs from a string so they don't pollute keyword detection.
|
|
122
|
+
* e.g. "https://youtube.com/watch?v=abc" → "" (removes "watch" from the URL)
|
|
123
|
+
*/
|
|
124
|
+
function stripUrlsForKeywordCheck(task) {
|
|
125
|
+
// Remove http/https URLs first
|
|
126
|
+
let stripped = task.replace(/https?:\/\/[^\s"'<>)]+/gi, ' ');
|
|
127
|
+
// Remove bare domain-like patterns
|
|
128
|
+
stripped = stripped.replace(DOMAIN_RE_GLOBAL, ' ');
|
|
129
|
+
return stripped;
|
|
130
|
+
}
|
|
131
|
+
/** Detect the primary intent from a task string. */
|
|
132
|
+
export function detectIntent(task) {
|
|
133
|
+
const lower = task.toLowerCase();
|
|
134
|
+
// Strip URLs so that URL paths (e.g. "/watch") don't trigger wrong intents
|
|
135
|
+
const keywordTarget = stripUrlsForKeywordCheck(lower);
|
|
136
|
+
// Multi-word patterns take priority (checked against URL-stripped version)
|
|
137
|
+
for (const { intent, pattern } of MULTI_WORD_PATTERNS) {
|
|
138
|
+
if (pattern.test(keywordTarget))
|
|
139
|
+
return intent;
|
|
140
|
+
}
|
|
141
|
+
// Single-word keywords in priority order
|
|
142
|
+
for (const { intent, keywords } of KEYWORD_INTENTS) {
|
|
143
|
+
if (keywords.some((kw) => keywordTarget.includes(kw)))
|
|
144
|
+
return intent;
|
|
145
|
+
}
|
|
146
|
+
// Default: bare URL (or no recognized verb) → read
|
|
147
|
+
return 'read';
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Parse a natural language task string into a structured intent.
|
|
151
|
+
*
|
|
152
|
+
* @param task - Plain English description of what you want to do.
|
|
153
|
+
* @returns ParsedIntent with intent, optional url, optional query, and params.
|
|
154
|
+
*/
|
|
155
|
+
export function parseIntent(task) {
|
|
156
|
+
const intent = detectIntent(task);
|
|
157
|
+
const url = extractUrl(task);
|
|
158
|
+
const params = extractParams(task);
|
|
159
|
+
// Enrich 'see' intent with mode and compare_url
|
|
160
|
+
if (intent === 'see') {
|
|
161
|
+
const lower = task.toLowerCase();
|
|
162
|
+
if (/\bcompare\b/.test(lower)) {
|
|
163
|
+
params['mode'] = 'compare';
|
|
164
|
+
const all = extractAllUrls(task);
|
|
165
|
+
if (all.length >= 2)
|
|
166
|
+
params['compare_url'] = all[1];
|
|
167
|
+
}
|
|
168
|
+
else if (/\bdesign\b/.test(lower) || /\bdesign[\s-]?analysis\b/.test(lower)) {
|
|
169
|
+
params['mode'] = 'design';
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Extract query for find intent
|
|
173
|
+
let query;
|
|
174
|
+
if (intent === 'find') {
|
|
175
|
+
query = extractFindQuery(task, url);
|
|
176
|
+
}
|
|
177
|
+
return { intent, url, query, params };
|
|
178
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebPeel API Server
|
|
3
|
+
* Express-based REST API for hosted deployments
|
|
4
|
+
*/
|
|
5
|
+
import { Express } from 'express';
|
|
6
|
+
import './types.js';
|
|
7
|
+
export interface ServerConfig {
|
|
8
|
+
port?: number;
|
|
9
|
+
corsOrigins?: string[];
|
|
10
|
+
rateLimitWindowMs?: number;
|
|
11
|
+
usePostgres?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function createApp(config?: ServerConfig): Express;
|
|
14
|
+
export declare function startServer(config?: ServerConfig): void;
|